Date: Sat, 13 Jan 2007 21:03:10 GMT From: Marko Zec <zec@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 112878 for review Message-ID: <200701132103.l0DL3Aue037111@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=112878 Change 112878 by zec@zec_tpx32 on 2007/01/13 21:03:01 Provide an instance-detach method for ipfw. This allows ipfw to be correctly kldunloaded regardless of the number of active vnets, and should be called on vnet destroy events in the future. Affected files ... .. //depot/projects/vimage/src/sys/netinet/ip_fw2.c#6 edit Differences ... ==== //depot/projects/vimage/src/sys/netinet/ip_fw2.c#6 (text+ko) ==== @@ -115,6 +115,7 @@ #include <security/mac/mac_framework.h> static int vnet_ipfw_iattach(void); +static int vnet_ipfw_idetach(void); #ifdef VIMAGE static struct vnet_modinfo vnet_ipfw_modinfo = { @@ -123,7 +124,7 @@ .name = "ipfw", .symmap = NULL, .i_attach = vnet_ipfw_iattach, - .i_detach = NULL, + .i_detach = vnet_ipfw_idetach, }; #endif @@ -5064,17 +5065,14 @@ return (0); } -void -ipfw_destroy(void) +static int vnet_ipfw_idetach(void) { - INIT_VNET_IPFW(curvnetb); /* XXX */ + INIT_VNET_IPFW(curvnetb); struct ip_fw *reap; #ifdef IPFIREWALL_NAT struct cfg_nat *ptr, *ptr_temp; #endif - ip_fw_chk_ptr = NULL; - ip_fw_ctl_ptr = NULL; callout_drain(&V_ipfw_timeout); IPFW_WLOCK(&V_layer3_chain); flush_tables(&V_layer3_chain); @@ -5085,7 +5083,6 @@ LibAliasUninit(ptr->lib); free(ptr, M_IPFW); } - EVENTHANDLER_DEREGISTER(ifaddr_event, ifaddr_event_tag); #endif V_layer3_chain.reap = NULL; free_chain(&V_layer3_chain, 1 /* kill default rule */); @@ -5093,9 +5090,33 @@ IPFW_WUNLOCK(&V_layer3_chain); if (reap != NULL) reap_rules(reap); + IPFW_LOCK_DESTROY(&V_layer3_chain); + +#ifdef VIMAGE + curvnetb->mod_data[vnet_ipfw_modinfo.id] = NULL; + free(vnet_ipfw, M_IPFW); +#endif + + return 0; +} + +void +ipfw_destroy(void) +{ + ip_fw_chk_ptr = NULL; + ip_fw_ctl_ptr = NULL; + +#ifdef VIMAGE + vnet_mod_deregister(&vnet_ipfw_modinfo); +#else + vnet_ipfw_idetach(); +#endif + +#ifdef IPFIREWALL_NAT + EVENTHANDLER_DEREGISTER(ifaddr_event, ifaddr_event_tag); +#endif IPFW_DYN_LOCK_DESTROY(); uma_zdestroy(ipfw_dyn_rule_zone); - IPFW_LOCK_DESTROY(&V_layer3_chain); #ifdef INET6 /* Free IPv6 fw sysctl tree. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200701132103.l0DL3Aue037111>