if (lease->addr.s_addr && lease->cookie == htonl(MAGIC_COOKIE)) {
if (type == DHCP_DECLINE ||
- type == DHCP_DISCOVER ||
(type == DHCP_REQUEST &&
lease->addr.s_addr != iface->addr.s_addr))
{
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)
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;
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);
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)) {
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)
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);