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))