X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fdhcpv6-ia.c;h=fe4713004e5a964469fa85e25894cbf6652064a9;hp=25c11d756ff29a4fa05ca0f8c755ce18b359edb0;hb=52bca1137bbd954e8a905a22f637c6565e14ac35;hpb=da2657472b642a266c8a80763a51868e2af6b050 diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c index 25c11d7..fe47130 100644 --- a/src/dhcpv6-ia.c +++ b/src/dhcpv6-ia.c @@ -258,6 +258,8 @@ void dhcpv6_write_statefile(void) for (size_t i = 0; i < addrlen; ++i) { if (addrs[i].prefix > 96) continue; + if (c->valid_until <= now) + continue; addr = addrs[i].addr; if (c->length == 128) @@ -718,8 +720,14 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status, datalen += sizeof(stat); } else { if (a) { - uint32_t pref = 3600; - uint32_t valid = 3600; + uint32_t leasetime = iface->dhcpv4_leasetime; + if (leasetime == 0) + leasetime = 3600; + else if (leasetime < 60) + leasetime = 60; + + uint32_t pref = leasetime; + uint32_t valid = leasetime; 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; @@ -1184,6 +1192,8 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface, } } else if (hdr->msg_type == DHCPV6_MSG_CONFIRM && ia_addr_present) { // Send NOTONLINK for CONFIRM with addr present so that clients restart connection + status = DHCPV6_STATUS_NOTONLINK; + ia_response_len = append_reply(buf, buflen, status, ia, a, iface, true); notonlink = true; }