changeset 4579:e48ad224ab66 draft

IPv4LL: Work once more on NetBSD
author Roy Marples <roy@marples.name>
date Wed, 24 Jul 2019 19:12:24 +0100
parents 5ab00b922cab
children bf5311ae01d5
files src/ipv4ll.c
diffstat 1 files changed, 9 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/ipv4ll.c	Wed Jul 24 16:06:51 2019 +0100
+++ b/src/ipv4ll.c	Wed Jul 24 19:12:24 2019 +0100
@@ -298,7 +298,7 @@
 	state = IPV4LL_STATE(ifp);
 	assert(state != NULL);
 	assert(state->arp == astate);
-	ipv4ll_not_found_arp(astate);
+	ipv4ll_not_found(ifp);
 }
 
 static void
@@ -552,19 +552,24 @@
 
 	ifp = ia->iface;
 	state = IPV4LL_STATE(ifp);
-	if (state == NULL || state->addr == NULL ||
-	    !IN_ARE_ADDR_EQUAL(&state->addr->addr, &ia->addr))
+	if (state == NULL)
 		return;
 
-	if (cmd == RTM_DELADDR) {
+	if (cmd == RTM_DELADDR &&
+	    state->addr != NULL &&
+	    IN_ARE_ADDR_EQUAL(&state->addr->addr, &ia->addr))
+	{
 		loginfox("%s: pid %d deleted IP address %s",
 		    ifp->name, pid, ia->saddr);
 		ipv4ll_defend_failed(ifp);
+		return;
 	}
 
 #ifdef IN_IFF_DUPLICATED
 	if (cmd != RTM_NEWADDR)
 		return;
+	if (!IN_ARE_ADDR_EQUAL(&state->pickedaddr, &ia->addr))
+		return;
 	if (!(ia->addr_flags & IN_IFF_NOTUSEABLE))
 		ipv4ll_not_found(ifp);
 	else if (ia->addr_flags & IN_IFF_DUPLICATED) {