diff options
| author | Roy Marples <roy@marples.name> | 2020-09-01 11:56:53 +0100 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2020-09-01 11:56:53 +0100 |
| commit | b581e67fe7065d45756ce0a54697ac9913767d75 (patch) | |
| tree | b4c789ee71bf7845e232571013910bc098075d75 | |
| parent | 420382171230e4a6bde8e8907632376bacc055ba (diff) | |
| download | dhcpcd-b581e67fe7065d45756ce0a54697ac9913767d75.tar.xz | |
DHCP: Don't set address lifetimes when extending leases
Otherwise the kernel WILL remove them.
dhcpcd already manages address removal when needed because
some OS's do not support address lifetimes even for IPv6.
While here apply the same logic to IPv6.
| -rw-r--r-- | src/ipv4.c | 11 | ||||
| -rw-r--r-- | src/ipv6.c | 8 |
2 files changed, 18 insertions, 1 deletions
@@ -711,9 +711,18 @@ ipv4_daddaddr(struct interface *ifp, const struct dhcp_lease *lease) { struct dhcp_state *state; struct ipv4_addr *ia; + uint32_t vltime, pltime; + + if (ifp->options->options & DHCPCD_LASTLEASE_EXTEND) { + /* We don't want the kernel to expire the address. */ + vltime = pltime = DHCP_INFINITE_LIFETIME; + } else { + vltime = lease->leasetime; + pltime = lease->rebindtime; + } ia = ipv4_addaddr(ifp, &lease->addr, &lease->mask, &lease->brd, - lease->leasetime, lease->rebindtime); + vltime, pltime); if (ia == NULL) return -1; @@ -679,6 +679,14 @@ ipv6_addaddr1(struct ipv6_addr *ia, const struct timespec *now) /* Adjust plftime and vltime based on acquired time */ pltime = ia->prefix_pltime; vltime = ia->prefix_vltime; + + if (ifp->options->options & DHCPCD_LASTLEASE_EXTEND) { + /* We don't want the kernel to expire the address. + * The saved times will be re-applied to the ia + * before exiting this function. */ + ia->prefix_vltime = ia->prefix_pltime = ND6_INFINITE_LIFETIME; + } + if (timespecisset(&ia->acquired) && (ia->prefix_pltime != ND6_INFINITE_LIFETIME || ia->prefix_vltime != ND6_INFINITE_LIFETIME)) |
