mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
Follow-up commit on integrated BIRD
Use net_addr for interface address prefixes, support net_addr in configuration parser.
This commit is contained in:
@@ -38,7 +38,7 @@ struct radv_opt_prefix
|
||||
u32 valid_lifetime;
|
||||
u32 preferred_lifetime;
|
||||
u32 reserved;
|
||||
ip_addr prefix;
|
||||
ip6_addr prefix;
|
||||
};
|
||||
|
||||
#define OPT_PX_ONLINK 0x80
|
||||
@@ -58,7 +58,7 @@ struct radv_opt_rdnss
|
||||
u8 length;
|
||||
u16 reserved;
|
||||
u32 lifetime;
|
||||
ip_addr servers[];
|
||||
ip6_addr servers[];
|
||||
};
|
||||
|
||||
struct radv_opt_dnssl
|
||||
@@ -90,11 +90,11 @@ radv_prefix_match(struct radv_iface *ifa, struct ifa *a)
|
||||
return NULL;
|
||||
|
||||
WALK_LIST(pc, ifa->cf->pref_list)
|
||||
if ((a->pxlen >= pc->pxlen) && ipa_in_net(a->prefix, pc->prefix, pc->pxlen))
|
||||
if (net_in_netX(&a->prefix, (net_addr *) &pc->prefix))
|
||||
return pc;
|
||||
|
||||
WALK_LIST(pc, cf->pref_list)
|
||||
if ((a->pxlen >= pc->pxlen) && ipa_in_net(a->prefix, pc->prefix, pc->pxlen))
|
||||
if (net_in_netX(&a->prefix, (net_addr *) &pc->prefix))
|
||||
return pc;
|
||||
|
||||
return &default_prefix;
|
||||
@@ -109,7 +109,7 @@ radv_prepare_rdnss(struct radv_iface *ifa, list *rdnss_list, char **buf, char *b
|
||||
{
|
||||
struct radv_rdnss_config *rcf_base = rcf;
|
||||
struct radv_opt_rdnss *op = (void *) *buf;
|
||||
int max_i = (bufend - *buf - sizeof(struct radv_opt_rdnss)) / sizeof(ip_addr);
|
||||
int max_i = (bufend - *buf - sizeof(struct radv_opt_rdnss)) / sizeof(ip6_addr);
|
||||
int i = 0;
|
||||
|
||||
if (max_i < 1)
|
||||
@@ -123,20 +123,19 @@ radv_prepare_rdnss(struct radv_iface *ifa, list *rdnss_list, char **buf, char *b
|
||||
else
|
||||
op->lifetime = htonl(rcf->lifetime);
|
||||
|
||||
while(NODE_VALID(rcf) &&
|
||||
while(NODE_VALID(rcf) &&
|
||||
(rcf->lifetime == rcf_base->lifetime) &&
|
||||
(rcf->lifetime_mult == rcf_base->lifetime_mult))
|
||||
{
|
||||
if (i >= max_i)
|
||||
goto too_much;
|
||||
|
||||
op->servers[i] = rcf->server;
|
||||
ipa_hton(op->servers[i]);
|
||||
op->servers[i] = ip6_hton(rcf->server);
|
||||
i++;
|
||||
|
||||
rcf = NODE_NEXT(rcf);
|
||||
}
|
||||
|
||||
|
||||
op->length = 1+2*i;
|
||||
*buf += 8 * op->length;
|
||||
}
|
||||
@@ -273,6 +272,9 @@ radv_prepare_ra(struct radv_iface *ifa)
|
||||
struct ifa *addr;
|
||||
WALK_LIST(addr, ifa->iface->addrs)
|
||||
{
|
||||
if (addr->prefix.type != NET_IP6)
|
||||
continue;
|
||||
|
||||
struct radv_prefix_config *pc;
|
||||
pc = radv_prefix_match(ifa, addr);
|
||||
|
||||
@@ -288,7 +290,7 @@ radv_prepare_ra(struct radv_iface *ifa)
|
||||
struct radv_opt_prefix *op = (void *) buf;
|
||||
op->type = OPT_PREFIX;
|
||||
op->length = 4;
|
||||
op->pxlen = addr->pxlen;
|
||||
op->pxlen = net6_pxlen(&addr->prefix);
|
||||
op->flags = (pc->onlink ? OPT_PX_ONLINK : 0) |
|
||||
(pc->autonomous ? OPT_PX_AUTONOMOUS : 0);
|
||||
op->valid_lifetime = (ra->active || !pc->valid_lifetime_sensitive) ?
|
||||
@@ -296,8 +298,7 @@ radv_prepare_ra(struct radv_iface *ifa)
|
||||
op->preferred_lifetime = (ra->active || !pc->preferred_lifetime_sensitive) ?
|
||||
htonl(pc->preferred_lifetime) : 0;
|
||||
op->reserved = 0;
|
||||
op->prefix = addr->prefix;
|
||||
ipa_hton(op->prefix);
|
||||
op->prefix = ip6_hton(net6_prefix(&addr->prefix));
|
||||
buf += sizeof(*op);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user