# HG changeset patch # User Roy Marples # Date 1233508412 0 # Node ID f942a41725783706c70969cd6f6e0c5b214a4efb # Parent fa21fa5c4d463068142e9be7494892ae5998d288 RFC2131 implies that we should only ARP check after an offer. diff -r fa21fa5c4d46 -r f942a4172578 client.c --- a/client.c Sat Jan 31 12:33:43 2009 +0000 +++ b/client.c Sun Feb 01 17:13:32 2009 +0000 @@ -495,16 +495,6 @@ lease->net.s_addr = options->request_netmask.s_addr; } - if (options->options & DHCPCD_REQUEST && - state->options & DHCPCD_ARP && - !state->offer) - { - state->offer = xzalloc(sizeof(*state->offer)); - state->offer->yiaddr = options->request_address.s_addr; - state->state = STATE_PROBING; - state->xid = arc4random(); - } - /* If INFORMing, ensure the interface has the address */ if (state->options & DHCPCD_INFORM && has_address(iface->name, &lease->addr, &lease->net) < 1) @@ -1183,16 +1173,11 @@ } else { /* We've waited for ANNOUNCE_WAIT after the final probe * so the address is now ours */ - if (state->lease.frominfo || - IN_LINKLOCAL(htonl(state->offer->yiaddr))) - { - i = bind_dhcp(state, options); - state->state = STATE_ANNOUNCING; - state->timeout.tv_sec = ANNOUNCE_INTERVAL; - state->timeout.tv_usec = 0; - return i; - } - state->state = STATE_REQUESTING; + i = bind_dhcp(state, options); + state->state = STATE_ANNOUNCING; + state->timeout.tv_sec = ANNOUNCE_INTERVAL; + state->timeout.tv_usec = 0; + return i; } break; case STATE_ANNOUNCING: @@ -1461,21 +1446,6 @@ state->offer = dhcp; *dhcpp = NULL; timerclear(&state->timeout); - if (state->options & DHCPCD_ARP && - iface->addr.s_addr != state->offer->yiaddr) - { - /* If the interface already has the address configured - * then we can't ARP for duplicate detection. */ - addr.s_addr = state->offer->yiaddr; - if (!has_address(iface->name, &addr, NULL)) { - state->state = STATE_PROBING; - state->claims = 0; - state->probes = 0; - state->conflicts = 0; - timerclear(&state->stop); - return 1; - } - } state->state = STATE_REQUESTING; return 1; } @@ -1509,8 +1479,24 @@ logger(LOG_ERR, "wrong state %d", state->state); } + lease->frominfo = 0; + if (state->options & DHCPCD_ARP && + iface->addr.s_addr != state->offer->yiaddr) + { + /* If the interface already has the address configured + * then we can't ARP for duplicate detection. */ + addr.s_addr = state->offer->yiaddr; + if (!has_address(iface->name, &addr, NULL)) { + state->state = STATE_PROBING; + state->claims = 0; + state->probes = 0; + state->conflicts = 0; + timerclear(&state->stop); + return 1; + } + } + do_socket(state, SOCKET_CLOSED); - lease->frominfo = 0; r = bind_dhcp(state, options); if (!(state->options & DHCPCD_ARP)) { if (!(state->options & DHCPCD_INFORM))