From owner-p4-projects@FreeBSD.ORG Fri Aug 3 22:15:41 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6064516A46D; Fri, 3 Aug 2007 22:15:41 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0032416A421 for ; Fri, 3 Aug 2007 22:15:40 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id F06BA13C4A3 for ; Fri, 3 Aug 2007 22:15:40 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l73MFex1082602 for ; Fri, 3 Aug 2007 22:15:40 GMT (envelope-from zec@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l73MFe7Q082599 for perforce@freebsd.org; Fri, 3 Aug 2007 22:15:40 GMT (envelope-from zec@FreeBSD.org) Date: Fri, 3 Aug 2007 22:15:40 GMT Message-Id: <200708032215.l73MFe7Q082599@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 124616 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: Fri, 03 Aug 2007 22:15:41 -0000 http://perforce.freebsd.org/chv.cgi?CH=124616 Change 124616 by zec@zec_tpx32 on 2007/08/03 22:15:17 Promote ng_iface and ng_eiface to vnet modules, in order to ensure they become registered only after netgraph vnet module. In both ng_iface and ng_eiface, during vnet cleanup destroy all per-vnet instances of iface / eiface netgraph nodes. Add a missing VNET_MOD_NG_ETHER definition to sys/vimage.h which should have been already submited along the changes to ng_ether. Affected files ... .. //depot/projects/vimage/src/sys/netgraph/ng_eiface.c#6 edit .. //depot/projects/vimage/src/sys/netgraph/ng_iface.c#3 edit .. //depot/projects/vimage/src/sys/sys/vimage.h#31 edit Differences ... ==== //depot/projects/vimage/src/sys/netgraph/ng_eiface.c#6 (text+ko) ==== @@ -45,7 +45,9 @@ #include #include #include +#include +#include #include #include #include @@ -114,8 +116,16 @@ }; NETGRAPH_INIT(eiface, &typestruct); +static vnet_attach_fn ng_eiface_iattach; +static vnet_detach_fn ng_eiface_idetach; + +#ifndef VIMAGE static struct unrhdr *ng_eiface_unit; +#endif +VNET_MOD_DECLARE_STATELESS(NG_EIFACE, ng_eiface, ng_eiface_iattach, + ng_eiface_idetach, NETGRAPH) + /************************************************************************ INTERFACE STUFF ************************************************************************/ @@ -335,6 +345,7 @@ static int ng_eiface_constructor(node_p node) { + INIT_VNET_NETGRAPH(curvnet); struct ifnet *ifp; priv_p priv; u_char eaddr[6] = {0,0,0,0,0,0}; @@ -354,7 +365,7 @@ ifp->if_softc = priv; /* Get an interface unit number */ - priv->unit = alloc_unr(ng_eiface_unit); + priv->unit = alloc_unr(V_ng_eiface_unit); /* Link together node and private info */ NG_NODE_SET_PRIVATE(node, priv); @@ -446,8 +457,6 @@ caddr_t ptr; int buflen; -#define SA_SIZE(s) ((s)->sa_lensa_len) - /* Determine size of response and allocate it */ buflen = 0; TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) @@ -545,6 +554,7 @@ static int ng_eiface_rmnode(node_p node) { + INIT_VNET_NETGRAPH(curvnet); const priv_p priv = NG_NODE_PRIVATE(node); struct ifnet *const ifp = priv->ifp; @@ -552,7 +562,7 @@ ether_ifdetach(ifp); if_free(ifp); CURVNET_RESTORE(); - free_unr(ng_eiface_unit, priv->unit); + free_unr(V_ng_eiface_unit, priv->unit); FREE(priv, M_NETGRAPH); NG_NODE_SET_PRIVATE(node, NULL); NG_NODE_UNREF(node); @@ -581,10 +591,18 @@ switch (event) { case MOD_LOAD: - ng_eiface_unit = new_unrhdr(0, 0xffff, NULL); +#ifdef VIMAGE + vnet_mod_register(&vnet_ng_eiface_modinfo); +#else + ng_eiface_iattach(NULL); +#endif break; case MOD_UNLOAD: - delete_unrhdr(ng_eiface_unit); +#ifdef VIMAGE + vnet_mod_deregister(&vnet_ng_eiface_modinfo); +#else + ng_eiface_idetach(NULL); +#endif break; default: error = EOPNOTSUPP; @@ -592,3 +610,32 @@ } return (error); } + +static int ng_eiface_iattach(const void *unused) +{ + INIT_VNET_NETGRAPH(curvnet); + + V_ng_eiface_unit = new_unrhdr(0, 0xffff, NULL); + + return 0; +} + +static int ng_eiface_idetach(const void *unused) +{ + INIT_VNET_NETGRAPH(curvnet); +#ifdef VIMAGE + node_p node; + + do { + LIST_FOREACH(node, &V_ng_nodelist, nd_nodes) + if (node->nd_type == &typestruct) + break; + if (node != NULL) + ng_rmnode_self(node); + } while (node != NULL); +#endif + + delete_unrhdr(V_ng_eiface_unit); + + return 0; +} ==== //depot/projects/vimage/src/sys/netgraph/ng_iface.c#3 (text+ko) ==== @@ -79,6 +79,7 @@ #include +#include #include #include #include @@ -209,7 +210,15 @@ }; NETGRAPH_INIT(iface, &typestruct); +static vnet_attach_fn ng_iface_iattach; +static vnet_detach_fn ng_iface_idetach; + +#ifndef VIMAGE static struct unrhdr *ng_iface_unit; +#endif + +VNET_MOD_DECLARE_STATELESS(NG_IFACE, ng_iface, ng_iface_iattach, + ng_iface_idetach, NETGRAPH) /************************************************************************ HELPER STUFF @@ -507,6 +516,7 @@ static int ng_iface_constructor(node_p node) { + INIT_VNET_NETGRAPH(curvnet); struct ifnet *ifp; priv_p priv; @@ -525,7 +535,7 @@ priv->ifp = ifp; /* Get an interface unit number */ - priv->unit = alloc_unr(ng_iface_unit); + priv->unit = alloc_unr(V_ng_iface_unit); /* Link together node and private info */ NG_NODE_SET_PRIVATE(node, priv); @@ -766,6 +776,7 @@ static int ng_iface_shutdown(node_p node) { + INIT_VNET_NETGRAPH(curvnet); const priv_p priv = NG_NODE_PRIVATE(node); CURVNET_SET_QUIET(priv->ifp->if_vnet); @@ -774,7 +785,7 @@ if_free(priv->ifp); CURVNET_RESTORE(); priv->ifp = NULL; - free_unr(ng_iface_unit, priv->unit); + free_unr(V_ng_iface_unit, priv->unit); FREE(priv, M_NETGRAPH_IFACE); NG_NODE_SET_PRIVATE(node, NULL); NG_NODE_UNREF(node); @@ -807,10 +818,18 @@ switch (event) { case MOD_LOAD: - ng_iface_unit = new_unrhdr(0, 0xffff, NULL); +#ifdef VIMAGE + vnet_mod_register(&vnet_ng_iface_modinfo); +#else + ng_iface_iattach(NULL); +#endif break; case MOD_UNLOAD: - delete_unrhdr(ng_iface_unit); +#ifdef VIMAGE + vnet_mod_deregister(&vnet_ng_iface_modinfo); +#else + ng_iface_idetach(NULL); +#endif break; default: error = EOPNOTSUPP; @@ -818,3 +837,32 @@ } return (error); } + +static int ng_iface_iattach(const void *unused) +{ + INIT_VNET_NETGRAPH(curvnet); + + V_ng_iface_unit = new_unrhdr(0, 0xffff, NULL); + + return 0; +} + +static int ng_iface_idetach(const void *unused) +{ + INIT_VNET_NETGRAPH(curvnet); +#ifdef VIMAGE + node_p node; + + do { + LIST_FOREACH(node, &V_ng_nodelist, nd_nodes) + if (node->nd_type == &typestruct) + break; + if (node != NULL) + ng_rmnode_self(node); + } while (node != NULL); +#endif + + delete_unrhdr(V_ng_iface_unit); + + return 0; +} ==== //depot/projects/vimage/src/sys/sys/vimage.h#31 (text+ko) ==== @@ -79,6 +79,8 @@ #define VNET_MOD_ALTQ 8 #define VNET_MOD_IPX 9 #define VNET_MOD_ATALK 10 + +#define VNET_MOD_NG_ETHER 20 #define VNET_MOD_NG_IFACE 21 #define VNET_MOD_NG_EIFACE 22 #define VNET_MOD_ESP 23