]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
IPv4LL: Fix DAD failure on NetBSD
authorRoy Marples <roy@marples.name>
Tue, 1 Oct 2019 18:09:34 +0000 (19:09 +0100)
committerRoy Marples <roy@marples.name>
Tue, 1 Oct 2019 18:09:34 +0000 (19:09 +0100)
src/ipv4ll.c

index f893718918a027a9026a53d626462d34861c21f3..2524a02f59e5e65569bcd9529cfd4b6bc1d5d3f5 100644 (file)
@@ -261,10 +261,12 @@ ipv4ll_found(struct interface *ifp)
 {
        struct ipv4ll_state *state = IPV4LL_STATE(ifp);
 
-       arp_cancel(state->arp);
+       if (state->arp != NULL)
+               arp_cancel(state->arp);
        if (++state->conflicts == MAX_CONFLICTS)
                logerrx("%s: failed to acquire an IPv4LL address",
                    ifp->name);
+       state->pickedaddr.s_addr = INADDR_ANY;
        eloop_timeout_add_sec(ifp->ctx->eloop,
            state->conflicts >= MAX_CONFLICTS ?
            RATE_LIMIT_INTERVAL : PROBE_WAIT,
@@ -308,7 +310,6 @@ ipv4ll_found_arp(struct arp_state *astate, __unused const struct arp_msg *amsg)
        struct ipv4ll_state *state = IPV4LL_STATE(ifp);
 
        assert(state->arp == astate);
-       state->pickedaddr.s_addr = INADDR_ANY;
        ipv4ll_found(ifp);
 }
 
@@ -575,7 +576,7 @@ ipv4ll_handleifa(int cmd, struct ipv4_addr *ia, pid_t pid)
                ipv4ll_not_found(ifp);
        else if (ia->addr_flags & IN_IFF_DUPLICATED) {
                logerrx("%s: DAD detected %s", ifp->name, ia->saddr);
-               ipv4_deladdr(state->addr, 1);
+               ipv4_deladdr(ia, 1);
                ipv4ll_found(ifp);
        }
 #endif