radv
struct radv *radv;
LIST_ENTRY(radv) entries;
if ((radv = calloc(1, sizeof(*radv))) == NULL)
LIST_INIT(&radv->prefixes);
LIST_INIT(&radv->rdns_servers);
radv->min_lifetime = UINT32_MAX;
memcpy(&radv->from, &ra->from, sizeof(ra->from));
if (clock_gettime(CLOCK_REALTIME, &radv->when))
if (clock_gettime(CLOCK_MONOTONIC, &radv->uptime))
radv->curhoplimit = nd_ra->nd_ra_curhoplimit;
radv->managed = nd_ra->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED;
radv->other = nd_ra->nd_ra_flags_reserved & ND_RA_FLAG_OTHER;
radv->rpref=HIGH;
radv->rpref=LOW;
radv->rpref=MEDIUM;
radv->router_lifetime = ntohs(nd_ra->nd_ra_router_lifetime);
if (radv->router_lifetime != 0)
radv->min_lifetime = radv->router_lifetime;
radv->reachable_time = ntohl(nd_ra->nd_ra_reachable);
radv->retrans_time = ntohl(nd_ra->nd_ra_retransmit);
if (radv->min_lifetime > prefix->pltime)
radv->min_lifetime = prefix->pltime;
LIST_INSERT_HEAD(&radv->prefixes, prefix, entries);
radv->rdns_lifetime = ntohl(
if (radv->min_lifetime > radv->rdns_lifetime)
radv->min_lifetime = radv->rdns_lifetime;
LIST_INSERT_HEAD(&radv->rdns_servers, rdns,
radv->mtu = ntohl(mtu->nd_opt_mtu_mtu);
if (radv->mtu < IPV6_MMTU) {
radv->mtu = 0;
update_iface_ra(iface, radv);
free_ra(radv);
void update_iface_ra(struct slaacd_iface *iface, struct radv *ra)
struct radv *old_ra;
update_iface_ra_dfr(struct slaacd_iface *iface, struct radv *ra)
update_iface_ra_prefix(struct slaacd_iface *iface, struct radv *ra,
update_iface_ra_rdns(struct slaacd_iface *iface, struct radv *ra)
gen_address_proposal(struct slaacd_iface *iface, struct radv *ra, struct
gen_dfr_proposal(struct slaacd_iface *iface, struct radv *ra)
LIST_HEAD(, radv) radvs;
gen_rdns_proposal(struct slaacd_iface *iface, struct radv *ra)
struct radv *ra = NULL;
void free_ra(struct radv *);
struct radv*
struct radv *ra;
find_prefix(struct radv *ra, struct in6_addr *prefix, uint8_t prefix_len)
radv *, struct radv_prefix *, int);
merge_dad_couters(struct radv *old_ra, struct radv *new_ra)
radv *);
struct radv *);
radv *);
void update_iface_ra(struct slaacd_iface *, struct radv *);
struct radv *);
struct radv *, struct radv_prefix *prefix);
struct radv *find_ra(struct slaacd_iface *, struct sockaddr_in6 *);
struct radv_prefix *find_prefix(struct radv *, struct in6_addr *, uint8_t);
void merge_dad_couters(struct radv *, struct radv *);
struct radv *ra;
struct radv *ra;
free_ra(struct radv *ra)