From owner-p4-projects@FreeBSD.ORG Sat Jan 13 21:03:11 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EABC216A415; Sat, 13 Jan 2007 21:03:10 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id B7A4316A403 for ; Sat, 13 Jan 2007 21:03:10 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id A80F913C457 for ; Sat, 13 Jan 2007 21:03:10 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l0DL3Ab2037114 for ; Sat, 13 Jan 2007 21:03:10 GMT (envelope-from zec@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l0DL3Aue037111 for perforce@freebsd.org; Sat, 13 Jan 2007 21:03:10 GMT (envelope-from zec@FreeBSD.org) Date: Sat, 13 Jan 2007 21:03:10 GMT Message-Id: <200701132103.l0DL3Aue037111@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zec@FreeBSD.org using -f From: Marko Zec To: Perforce Change Reviews Cc: Subject: PERFORCE change 112878 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 13 Jan 2007 21:03:11 -0000 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 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. */