# HG changeset patch # User Roy Marples # Date 1606137740 0 # Node ID bcca2ff28a6448bd6311589ac008439258f804d0 # Parent c9182c3618e66c481b4922b8b0595fe2c96d3a1d DHCP: Only listen to the address if we successfully added it Fixes an issue on Linux where the headers advertise something newer than what the kernel actually provides. diff -r c9182c3618e6 -r bcca2ff28a64 src/dhcp.c --- a/src/dhcp.c Sat Nov 21 12:01:21 2020 +0000 +++ b/src/dhcp.c Mon Nov 23 13:22:20 2020 +0000 @@ -2364,13 +2364,14 @@ return; } + /* Add the address */ + if (ipv4_applyaddr(ifp) == NULL) + return; + /* Close the BPF filter as we can now receive DHCP messages * on a UDP socket. */ dhcp_closebpf(ifp); - /* Add the address */ - ipv4_applyaddr(ifp); - openudp: /* If not in master mode, open an address specific socket. */ if (ctx->options & DHCPCD_MASTER || diff -r c9182c3618e6 -r bcca2ff28a64 src/ipv4.c --- a/src/ipv4.c Sat Nov 21 12:01:21 2020 +0000 +++ b/src/ipv4.c Mon Nov 23 13:22:20 2020 +0000 @@ -728,7 +728,7 @@ return 0; } -void +struct ipv4_addr * ipv4_applyaddr(void *arg) { struct interface *ifp = arg; @@ -738,7 +738,7 @@ struct ipv4_addr *ia; if (state == NULL) - return; + return NULL; lease = &state->lease; if (state->new == NULL) { @@ -757,7 +757,7 @@ script_runreason(ifp, state->reason); } else rt_build(ifp->ctx, AF_INET); - return; + return NULL; } ia = ipv4_iffindaddr(ifp, &lease->addr, NULL); @@ -783,22 +783,22 @@ #endif #ifndef IP_LIFETIME if (ipv4_daddaddr(ifp, lease) == -1 && errno != EEXIST) - return; + return NULL; #endif } #ifdef IP_LIFETIME if (ipv4_daddaddr(ifp, lease) == -1 && errno != EEXIST) - return; + return NULL; #endif ia = ipv4_iffindaddr(ifp, &lease->addr, NULL); if (ia == NULL) { logerrx("%s: added address vanished", ifp->name); - return; + return NULL; } #if defined(ARP) && defined(IN_IFF_NOTUSEABLE) if (ia->addr_flags & IN_IFF_NOTUSEABLE) - return; + return NULL; #endif /* Delete the old address if different */ @@ -820,6 +820,7 @@ script_runreason(ifp, state->reason); dhcpcd_daemonise(ifp->ctx); } + return ia; } void diff -r c9182c3618e6 -r bcca2ff28a64 src/ipv4.h --- a/src/ipv4.h Sat Nov 21 12:01:21 2020 +0000 +++ b/src/ipv4.h Mon Nov 23 13:22:20 2020 +0000 @@ -135,7 +135,7 @@ struct ipv4_addr *ipv4_addaddr(struct interface *, const struct in_addr *, const struct in_addr *, const struct in_addr *, uint32_t, uint32_t); -void ipv4_applyaddr(void *); +struct ipv4_addr *ipv4_applyaddr(void *); struct ipv4_addr *ipv4_iffindaddr(struct interface *, const struct in_addr *, const struct in_addr *);