From 64eedb0310efb0ac8456dd7ad217d0bb521fb0fe Mon Sep 17 00:00:00 2001 From: rwatson Date: Sun, 18 Sep 2005 17:36:28 +0000 Subject: Take a first cut at cleaning up ifnet removal and multicast socket panics, which occur when stale ifnet pointers are left in struct moptions hung off of inpcbs: - Add in_ifdetach(), which matches in6_ifdetach(), and allows the protocol to perform early tear-down on the interface early in if_detach(). - Annotate that if_detach() needs careful consideration. - Remove calls to in_pcbpurgeif0() in the handling of SIOCDIFADDR -- this is not the place to detect interface removal! This also removes what is basically a nasty (and now unnecessary) hack. - Invoke in_pcbpurgeif0() from in_ifdetach(), in both raw and UDP IPv4 sockets. It is now possible to run the msocket_ifnet_remove regression test using HEAD without panicking. MFC after: 3 days --- sys/netinet/in.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'sys/netinet/in.c') diff --git a/sys/netinet/in.c b/sys/netinet/in.c index c5d148a..2eb5e94 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -459,14 +459,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 (ifaddr_byindex(ifp->if_index) == NULL) { - in_pcbpurgeif0(&ripcbinfo, ifp); - in_pcbpurgeif0(&udbinfo, ifp); - } EVENTHANDLER_INVOKE(ifaddr_event, ifp); error = 0; break; @@ -1046,3 +1038,15 @@ in_delmulti(inm) igmp_leavegroup(&my_inm); IN_MULTI_UNLOCK(); } + +/* + * On interface removal, clean up IPv4 data structures hung off of the ifnet. + */ +void +in_ifdetach(ifp) + struct ifnet *ifp; +{ + + in_pcbpurgeif0(&ripcbinfo, ifp); + in_pcbpurgeif0(&udbinfo, ifp); +} -- cgit v1.1