diff --git a/dhcp.c b/dhcp.c index 8a61a0f..81c2a72 100644 --- a/dhcp.c +++ b/dhcp.c @@ -915,6 +915,9 @@ make_message(struct dhcp_message **message, p += len; } + if (type == DHCP_DISCOVER && ifo->options & DHCPCD_REQUEST) + PUTADDR(DHO_IPADDRESS, ifo->req_addr); + if (type == DHCP_DISCOVER || type == DHCP_INFORM || type == DHCP_REQUEST) diff --git a/dhcpcd.c b/dhcpcd.c index 80bdd94..704cbb5 100644 --- a/dhcpcd.c +++ b/dhcpcd.c @@ -1107,9 +1107,6 @@ start_interface(void *arg) return; } - /* We don't want to read the old lease if we NAK an old test */ - nolease = iface->state->offer && options & DHCPCD_TEST; - iface->start_uptime = uptime(); free(iface->state->offer); iface->state->offer = NULL; @@ -1134,21 +1131,9 @@ start_interface(void *arg) delete_timeout(NULL, iface); return; } - if (ifo->req_addr.s_addr) { - iface->state->offer = - dhcp_message_new(&ifo->req_addr, &ifo->req_mask); - if (ifo->options & DHCPCD_REQUEST) - ifo->req_addr.s_addr = 0; - else { - iface->state->reason = "STATIC"; - iface->state->new = iface->state->offer; - iface->state->offer = NULL; - get_lease(&iface->state->lease, iface->state->new); - configure(iface); - start_inform(iface); - return; - } - } else if (!nolease) + /* We don't want to read the old lease if we NAK an old test */ + nolease = iface->state->offer && options & DHCPCD_TEST; + if (!nolease) iface->state->offer = read_lease(iface); if (iface->state->offer) { get_lease(&iface->state->lease, iface->state->offer); @@ -1207,6 +1192,10 @@ init_state(struct interface *iface, int argc, char **argv) configure_interface(iface, argc, argv); if (!(options & DHCPCD_TEST)) run_script(iface); + /* We need to drop the leasefile so that start_interface + * doesn't load it. */ + if (ifs->options->options & DHCPCD_REQUEST) + unlink(iface->leasefile); if (ifs->options->options & DHCPCD_LINK) { switch (carrier_status(iface)) { diff --git a/if-options.c b/if-options.c index 3367b41..88b43d7 100644 --- a/if-options.c +++ b/if-options.c @@ -420,14 +420,12 @@ parse_option(struct if_options *ifo, int opt, const char *arg) ifo->options |= DHCPCD_QUIET; break; case 'r': - ifo->options |= DHCPCD_REQUEST; if (parse_addr(&ifo->req_addr, NULL, arg) != 0) return -1; + ifo->options |= DHCPCD_REQUEST; ifo->req_mask.s_addr = 0; break; case 's': - ifo->options |= DHCPCD_INFORM | DHCPCD_PERSISTENT; - ifo->options &= ~(DHCPCD_ARP | DHCPCD_STATIC); if (arg && *arg != '\0') { if (parse_addr(&ifo->req_addr, &ifo->req_mask, arg) != 0) @@ -436,6 +434,8 @@ parse_option(struct if_options *ifo, int opt, const char *arg) ifo->req_addr.s_addr = 0; ifo->req_mask.s_addr = 0; } + ifo->options |= DHCPCD_INFORM | DHCPCD_PERSISTENT; + ifo->options &= ~(DHCPCD_ARP | DHCPCD_STATIC); break; case 't': ifo->timeout = atoint(arg);