Commit 3ac5d1ce authored by Michal 'vorner' Vaner's avatar Michal 'vorner' Vaner Committed by Ondrej Zajicek (work)
Browse files

RAdv: Extract prefix option preparation

Put the prefix option preparation into a separate function. We're going
to reuse that bit of code.
parent e7ed9ecb
Loading
Loading
Loading
Loading
+33 −21
Original line number Diff line number Diff line
@@ -235,6 +235,36 @@ radv_prepare_dnssl(struct radv_iface *ifa, list *dnssl_list, char **buf, char *b
  return -1;
}

static int
radv_prepare_prefix(struct radv_iface *ifa, struct radv_prefix_config *pc,
  struct ifa *addr, char **buf, char *bufend)
{
  struct radv_opt_prefix *op = (void *) *buf;

  if (*buf + sizeof(*op) > bufend)
  {
    log(L_WARN "%s: Too many prefixes on interface %s", ifa->ra->p.name,
      ifa->iface->name);
    return -1;
  }

  op->type = OPT_PREFIX;
  op->length = 4;
  op->pxlen = addr->pxlen;
  op->flags = (pc->onlink ? OPT_PX_ONLINK : 0) |
    (pc->autonomous ? OPT_PX_AUTONOMOUS : 0);
  op->valid_lifetime = (ifa->ra->active || !pc->valid_lifetime_sensitive) ?
    htonl(pc->valid_lifetime) : 0;
  op->preferred_lifetime = (ifa->ra->active || !pc->preferred_lifetime_sensitive) ?
    htonl(pc->preferred_lifetime) : 0;
  op->reserved = 0;
  op->prefix = addr->prefix;
  ipa_hton(op->prefix);
  *buf += sizeof(*op);

  return 0;
}

static void
radv_prepare_ra(struct radv_iface *ifa)
{
@@ -279,28 +309,10 @@ radv_prepare_ra(struct radv_iface *ifa)
    if (!pc || pc->skip)
      continue;

    if (buf + sizeof(struct radv_opt_prefix) > bufend)
    {
      log(L_WARN "%s: Too many prefixes on interface %s", p->p.name, ifa->iface->name);
    if (radv_prepare_prefix(ifa, pc, addr, &buf, bufend) < 0)
      goto done;
  }

    struct radv_opt_prefix *op = (void *) buf;
    op->type = OPT_PREFIX;
    op->length = 4;
    op->pxlen = addr->pxlen;
    op->flags = (pc->onlink ? OPT_PX_ONLINK : 0) |
      (pc->autonomous ? OPT_PX_AUTONOMOUS : 0);
    op->valid_lifetime = (p->active || !pc->valid_lifetime_sensitive) ?
      htonl(pc->valid_lifetime) : 0;
    op->preferred_lifetime = (p->active || !pc->preferred_lifetime_sensitive) ?
      htonl(pc->preferred_lifetime) : 0;
    op->reserved = 0;
    op->prefix = addr->prefix;
    ipa_hton(op->prefix);
    buf += sizeof(*op);
  }

  if (! ic->rdnss_local)
    if (radv_prepare_rdnss(ifa, &cf->rdnss_list, &buf, bufend) < 0)
      goto done;