sd-icmp6-nd: Add support for fetching the latest expired prefix

Keep the expired prefix for the duration of the prefix expiration event
and remove it afterwards.
This commit is contained in:
Patrik Flykt
2015-01-27 09:35:24 +02:00
parent 99af546d0e
commit bd1957e906
2 changed files with 22 additions and 0 deletions
+20
View File
@@ -65,6 +65,7 @@ struct sd_icmp6_nd {
int index;
struct ether_addr mac_addr;
uint32_t mtu;
ICMP6Prefix *expired_prefix;
LIST_HEAD(ICMP6Prefix, prefixes);
int fd;
sd_event_source *recv;
@@ -266,8 +267,11 @@ static int icmp6_ra_prefix_timeout(sd_event_source *s, uint64_t usec,
LIST_REMOVE(prefixes, nd->prefixes, prefix);
nd->expired_prefix = prefix;
icmp6_nd_notify(nd,
ICMP6_EVENT_ROUTER_ADVERTISMENT_PREFIX_EXPIRED);
nd->expired_prefix = NULL;
prefix = icmp6_prefix_unref(prefix);
break;
@@ -372,6 +376,22 @@ int sd_icmp6_ra_get_prefixlen(sd_icmp6_nd *nd, const struct in6_addr *addr,
return 0;
}
int sd_icmp6_ra_get_expired_prefix(sd_icmp6_nd *nd, struct in6_addr **addr,
uint8_t *prefixlen)
{
assert_return(nd, -EINVAL);
assert_return(addr, -EINVAL);
assert_return(prefixlen, -EINVAL);
if (!nd->expired_prefix)
return -EADDRNOTAVAIL;
*addr = &nd->expired_prefix->addr;
*prefixlen = nd->expired_prefix->len;
return 0;
}
static int icmp6_ra_prefix_update(sd_icmp6_nd *nd, ssize_t len,
const struct nd_opt_prefix_info *prefix_opt) {
int r;
+2
View File
@@ -58,6 +58,8 @@ int sd_icmp6_prefix_match(struct in6_addr *prefix, uint8_t prefixlen,
int sd_icmp6_ra_get_mtu(sd_icmp6_nd *nd, uint32_t *mtu);
int sd_icmp6_ra_get_prefixlen(sd_icmp6_nd *nd, const struct in6_addr *addr,
uint8_t *prefixlen);
int sd_icmp6_ra_get_expired_prefix(sd_icmp6_nd *nd, struct in6_addr **addr,
uint8_t *prefixlen);
int sd_icmp6_nd_stop(sd_icmp6_nd *nd);
int sd_icmp6_router_solicitation_start(sd_icmp6_nd *nd);