Calling in{6,}_purgeaddr() is not enough to remove an address from
authormpi <mpi@openbsd.org>
Thu, 26 Jun 2014 13:08:25 +0000 (13:08 +0000)
committermpi <mpi@openbsd.org>
Thu, 26 Jun 2014 13:08:25 +0000 (13:08 +0000)
an interface.  Two other operations are performed when issuing a
SIOCDIFADDR{_IN6,} ioctl: call the address hook and the per-driver
ioctl function.

Since carp(4) relies on an address hook to recalculate its hash, make
sure to call this hook when IFXF_NOINET6 is set or when the rdomain is
changed.

ok henning@, mikeb@

sys/net/if.c
sys/netinet/in.c
sys/netinet6/in6_ifattach.c

index f73f8d2..3169e06 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: if.c,v 1.291 2014/06/23 18:51:15 henning Exp $        */
+/*     $OpenBSD: if.c,v 1.292 2014/06/26 13:08:25 mpi Exp $    */
 /*     $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $  */
 
 /*
@@ -2361,6 +2361,7 @@ ifnewlladdr(struct ifnet *ifp)
                ifa = &in6ifa_ifpforlinklocal(ifp, 0)->ia_ifa;
                if (ifa) {
                        in6_purgeaddr(ifa);
+                       dohooks(ifp->if_addrhooks, 0);
                        in6_ifattach_linklocal(ifp, NULL);
                        if (in6if_do_dad(ifp)) {
                                ifa = &in6ifa_ifpforlinklocal(ifp, 0)->ia_ifa;
index 74403a8..425b408 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: in.c,v 1.98 2014/06/16 19:47:21 mpi Exp $     */
+/*     $OpenBSD: in.c,v 1.99 2014/06/26 13:08:25 mpi Exp $     */
 /*     $NetBSD: in.c,v 1.26 1996/02/13 23:41:39 christos Exp $ */
 
 /*
@@ -1079,5 +1079,6 @@ in_ifdetach(struct ifnet *ifp)
                if (ifa->ifa_addr->sa_family != AF_INET)
                        continue;
                in_purgeaddr(ifa);
+               dohooks(ifp->if_addrhooks, 0);
        }
 }
index fe3e0a3..37059e1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: in6_ifattach.c,v 1.70 2014/06/03 13:32:24 mpi Exp $   */
+/*     $OpenBSD: in6_ifattach.c,v 1.71 2014/06/26 13:08:25 mpi Exp $   */
 /*     $KAME: in6_ifattach.c,v 1.124 2001/07/18 08:32:51 jinmei Exp $  */
 
 /*
@@ -648,6 +648,7 @@ in6_ifdetach(struct ifnet *ifp)
                if (ifa->ifa_addr->sa_family != AF_INET6)
                        continue;
                in6_purgeaddr(ifa);
+               dohooks(ifp->if_addrhooks, 0);
        }
 
        /*