Instead of checking for ifnet_addrs[ifp->index - 1] == NULL to detect
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Sat, 4 Jun 2005 14:41:57 +0000 (14:41 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Sat, 4 Jun 2005 14:41:57 +0000 (14:41 +0000)
running from if_detach, introduce in_ifdetach and call that after the
address list has been processed. This reduces the differences between
IPv4 and IPv6 stack.

sys/net/if.c
sys/netinet/in.c
sys/netinet/in_var.h

index 741eab3..1175de6 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)if.c        8.3 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/net/if.c,v 1.185 2004/03/13 02:35:03 brooks Exp $
- * $DragonFly: src/sys/net/if.c,v 1.37 2005/06/03 23:23:03 joerg Exp $
+ * $DragonFly: src/sys/net/if.c,v 1.38 2005/06/04 14:41:57 joerg Exp $
  */
 
 #include "opt_compat.h"
@@ -364,6 +364,13 @@ if_detach(struct ifnet *ifp)
                IFAFREE(ifa);
        }
 
+#ifdef INET
+       /*
+        * Remove all IPv4 kernel structures related to ifp.
+        */
+       in_ifdetach(ifp);
+#endif
+
 #ifdef INET6
        /*
         * Remove all IPv6 kernel structs related to ifp.  This should be done
index 564262d..37a9940 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)in.c        8.4 (Berkeley) 1/9/95
  * $FreeBSD: src/sys/netinet/in.c,v 1.44.2.14 2002/11/08 00:45:50 suz Exp $
- * $DragonFly: src/sys/netinet/in.c,v 1.15 2005/06/02 23:52:42 dillon Exp $
+ * $DragonFly: src/sys/netinet/in.c,v 1.16 2005/06/04 14:41:57 joerg Exp $
  */
 
 #include "opt_bootp.h"
@@ -435,14 +435,6 @@ in_control(so, cmd, data, ifp, td)
                 * a routing process they will come back.
                 */
                in_ifadown(&ia->ia_ifa, 1);
-               /*
-                * XXX horrible hack to detect that we are being called
-                * from if_detach()
-                */
-               if (!ifnet_addrs[ifp->if_index - 1]) {
-                       in_pcbpurgeif0(LIST_FIRST(&ripcbinfo.pcblisthead), ifp);
-                       in_pcbpurgeif0(LIST_FIRST(&udbinfo.pcblisthead), ifp);
-               }
                EVENTHANDLER_INVOKE(ifaddr_event, ifp);
                error = 0;
                break;
@@ -904,3 +896,10 @@ in_delmulti(inm)
                igmp_leavegroup(&my_inm);
        crit_exit();
 }
+
+void
+in_ifdetach(struct ifnet *ifp)
+{
+       in_pcbpurgeif0(LIST_FIRST(&ripcbinfo.pcblisthead), ifp);
+       in_pcbpurgeif0(LIST_FIRST(&udbinfo.pcblisthead), ifp);
+}
index d1c51ad..9b12046 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)in_var.h    8.2 (Berkeley) 1/9/95
  * $FreeBSD: src/sys/netinet/in_var.h,v 1.33.2.3 2001/12/14 20:09:34 jlemon Exp $
- * $DragonFly: src/sys/netinet/in_var.h,v 1.8 2004/12/21 02:54:15 hsu Exp $
+ * $DragonFly: src/sys/netinet/in_var.h,v 1.9 2005/06/04 14:41:57 joerg Exp $
  */
 
 #ifndef _NETINET_IN_VAR_H_
@@ -225,6 +225,7 @@ do { \
 struct route;
 struct netmsg;
 
+void   in_ifdetach(struct ifnet *ifp);
 struct in_multi *in_addmulti (struct in_addr *, struct ifnet *);
 void   in_delmulti (struct in_multi *);
 int    in_control (struct socket *, u_long, caddr_t, struct ifnet *,