X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fdhcpv6-ia.c;h=6ece528bd6e71fd6e1ca3a946d2371508f3ccdae;hp=be6a2452fc88a92d90c3b554f6baf542ecb3a1f1;hb=a5ebe69d1bc387937bc5448534751123833585fd;hpb=bd3ce421748085ef54959a64e39e1f7c1ba4be0e diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c index be6a245..6ece528 100644 --- a/src/dhcpv6-ia.c +++ b/src/dhcpv6-ia.c @@ -800,6 +800,9 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status, #endif datalen += entrlen + 4; } else { + if (!a->accept_reconf && iface->managed < RELAYD_MANAGED_NO_AFLAG) + prefix_pref = 1; + struct dhcpv6_ia_addr n = { .type = htons(DHCPV6_OPT_IA_ADDR), .len = htons(sizeof(n) - 4), @@ -977,25 +980,28 @@ static void dhcpv6_log(uint8_t msgtype, struct interface *iface, time_t now, break; } - struct odhcpd_ipaddr *addrs = (a->managed) ? a->managed : iface->ia_addr; - size_t addrlen = (a->managed) ? (size_t)a->managed_size : iface->ia_addr_len; char leasebuf[256] = ""; - size_t lbsize = 0; - char addrbuf[INET6_ADDRSTRLEN]; - for (size_t i = 0; i < addrlen; ++i) { - if (addrs[i].prefix > 96 || addrs[i].preferred <= now) - continue; + if (a) { + struct odhcpd_ipaddr *addrs = (a->managed) ? a->managed : iface->ia_addr; + size_t addrlen = (a->managed) ? (size_t)a->managed_size : iface->ia_addr_len; + size_t lbsize = 0; + char addrbuf[INET6_ADDRSTRLEN]; - struct in6_addr addr = addrs[i].addr; - int prefix = a->managed ? addrs[i].prefix : a->length; - if (prefix == 128) - addr.s6_addr32[3] = htonl(a->assigned); - else - addr.s6_addr32[1] |= htonl(a->assigned); + for (size_t i = 0; i < addrlen; ++i) { + if (addrs[i].prefix > 96 || addrs[i].preferred <= (uint32_t)now) + continue; + + struct in6_addr addr = addrs[i].addr; + int prefix = a->managed ? addrs[i].prefix : a->length; + if (prefix == 128) + addr.s6_addr32[3] = htonl(a->assigned); + else + addr.s6_addr32[1] |= htonl(a->assigned); - inet_ntop(AF_INET6, &addr, addrbuf, sizeof(addrbuf)); - lbsize += snprintf(leasebuf + lbsize, sizeof(leasebuf) - lbsize, "%s/%d ", addrbuf, prefix); + inet_ntop(AF_INET6, &addr, addrbuf, sizeof(addrbuf)); + lbsize += snprintf(leasebuf + lbsize, sizeof(leasebuf) - lbsize, "%s/%d ", addrbuf, prefix); + } } syslog(LOG_WARNING, "DHCPV6 %s %s from %s on %s: %s %s", type, (is_pd) ? "IA_PD" : "IA_NA",