X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fdhcpv6-ia.c;h=b21b39e1007fca8ada8663689d8019e43b33cbc1;hb=a408b9648f04962113ee6bf3d4a2dbddc9b0394e;hp=be6a2452fc88a92d90c3b554f6baf542ecb3a1f1;hpb=bd3ce421748085ef54959a64e39e1f7c1ba4be0e;p=project%2Fodhcpd.git diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c index be6a245..b21b39e 100644 --- a/src/dhcpv6-ia.c +++ b/src/dhcpv6-ia.c @@ -810,6 +810,9 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status, n.addr.s6_addr32[3] = htonl(a->assigned); size_t entrlen = sizeof(n) - 4; + if (!a->accept_reconf && iface->managed < RELAYD_MANAGED_NO_AFLAG) + n.preferred = htonl(1); + #ifdef DHCPV6_OPT_PREFIX_CLASS if (iface->ia_addr[i].has_class) { entrlen += sizeof(pclass); @@ -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",