summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2009-02-01 17:13:32 +0000
committerRoy Marples <roy@marples.name>2009-02-01 17:13:32 +0000
commit47f21f590d8d8456303cf0a076bf7c018f91c404 (patch)
treeb8c710efc71b80a37f94d145fd755823f9022c5a
parent5cab8fe71bec68b59d93e423a48805dd33924a1b (diff)
downloaddhcpcd-4.0.10.tar.xz
RFC2131 implies that we should only ARP check after an offer.dhcpcd-4.0.10
-rw-r--r--client.c58
1 files changed, 22 insertions, 36 deletions
diff --git a/client.c b/client.c
index 0d242e87..8b511c36 100644
--- a/client.c
+++ b/client.c
@@ -495,16 +495,6 @@ client_setup(struct if_state *state, const struct options *options)
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 @@ handle_timeout(struct if_state *state, const struct options *options)
} 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 @@ handle_dhcp(struct if_state *state, struct dhcp_message **dhcpp,
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 @@ handle_dhcp(struct if_state *state, struct dhcp_message **dhcpp,
logger(LOG_ERR, "wrong state %d", state->state);
}
- do_socket(state, SOCKET_CLOSED);
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);
r = bind_dhcp(state, options);
if (!(state->options & DHCPCD_ARP)) {
if (!(state->options & DHCPCD_INFORM))