Mercurial > hg > dhcpcd
changeset 1203:f942a4172578 draft dhcpcd-4.0.10
RFC2131 implies that we should only ARP check after an offer.
| author | Roy Marples <roy@marples.name> |
|---|---|
| date | Sun, 01 Feb 2009 17:13:32 +0000 |
| parents | fa21fa5c4d46 |
| children | c1dc02273e9c |
| files | client.c |
| diffstat | 1 files changed, 22 insertions(+), 36 deletions(-) [+] |
line wrap: on
line diff
--- 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))
