diff options
Diffstat (limited to 'src/dhcpv6-ia.c')
-rw-r--r-- | src/dhcpv6-ia.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c index e8255b5..af0b367 100644 --- a/src/dhcpv6-ia.c +++ b/src/dhcpv6-ia.c @@ -453,12 +453,26 @@ void dhcpv6_ia_write_statefile(void) } } -static void __apply_lease(struct dhcp_assignment *a, +static void __apply_lease_na(struct dhcp_assignment *a, struct odhcpd_ipaddr *addrs, ssize_t addr_len, bool add) { - if (a->flags & OAF_DHCPV6_NA) - return; + for (ssize_t i = 0; i < addr_len; ++i) { + struct in6_addr addr; + /* if (ADDR_MATCH_PIO_FILTER(&addrs[i], a->iface)) */ + /* continue; */ + + addr = addrs[i].addr.in6; + addr.s6_addr32[2] = htonl(a->assigned_host_id >> 32); + addr.s6_addr32[3] = htonl(a->assigned_host_id & UINT32_MAX); + dns_update_rr(a->hostname, AF_INET6, &addr); + } + dns_update_finish(); +} + +static void __apply_lease_pd(struct dhcp_assignment *a, + struct odhcpd_ipaddr *addrs, ssize_t addr_len, bool add) +{ for (ssize_t i = 0; i < addr_len; ++i) { struct in6_addr prefix; @@ -479,7 +493,10 @@ static void apply_lease(struct dhcp_assignment *a, bool add) struct odhcpd_ipaddr *addrs = (a->managed) ? a->managed : iface->addr6; ssize_t addrlen = (a->managed) ? a->managed_size : (ssize_t)iface->addr6_len; - __apply_lease(a, addrs, addrlen, add); + if (a->flags & OAF_DHCPV6_NA) + __apply_lease_na(a, addrs, addrlen, add); + else + __apply_lease_pd(a, addrs, addrlen, add); } /* Set border assignment size based on the IPv6 address prefixes */ @@ -774,7 +791,7 @@ static void handle_addrlist_change(struct netevent_handler_info *info) list_for_each_entry(c, &iface->ia_assignments, head) { if ((c->flags & OAF_DHCPV6_PD) && !(iface->ra_flags & ND_RA_FLAG_MANAGED) && (c->flags & OAF_BOUND)) - __apply_lease(c, info->addrs_old.addrs, + __apply_lease_pd(c, info->addrs_old.addrs, info->addrs_old.len, false); } |