Author: zec
Date: Sun May 16 14:51:36 2010
New Revision: 208145
URL: http://svn.freebsd.org/changeset/base/208145

Log:
  MFC r207680:
  
    Add an optional "persistent" flag to ng_hub and ng_bridge, which if set,
    disables automatic node shutdown when the last hook gets disconnected.
  
    Reviewed by:  julian

Modified:
  stable/8/share/man/man4/ng_bridge.4
  stable/8/share/man/man4/ng_hub.4
  stable/8/sys/netgraph/ng_bridge.c
  stable/8/sys/netgraph/ng_bridge.h
  stable/8/sys/netgraph/ng_hub.c
  stable/8/sys/netgraph/ng_hub.h
Directory Properties:
  stable/8/share/man/man4/   (props changed)
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/geom/sched/   (props changed)

Modified: stable/8/share/man/man4/ng_bridge.4
==============================================================================
--- stable/8/share/man/man4/ng_bridge.4 Sun May 16 14:31:53 2010        
(r208144)
+++ stable/8/share/man/man4/ng_bridge.4 Sun May 16 14:51:36 2010        
(r208145)
@@ -34,7 +34,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd August 31, 2000
+.Dd May 5, 2010
 .Dt NG_BRIDGE 4
 .Os
 .Sh NAME
@@ -181,11 +181,17 @@ but also atomically clears the statistic
 .It Dv NGM_BRIDGE_GET_TABLE
 Returns the current host mapping table used to direct packets, in a
 .Dv "struct ng_bridge_host_ary" .
+.It Dv NGM_BRIDGE_SET_PERSISTENT
+This command sets the persistent flag on the node, and takes no arguments.
 .El
 .Sh SHUTDOWN
 This node shuts down upon receipt of a
 .Dv NGM_SHUTDOWN
-control message, or when all hooks have been disconnected.
+control message, or when all hooks have been disconnected.  Setting the
+persistent flag via a
+.Dv NGM_BRIDGE_SET_PERSISTENT
+control message disables automatic node shutdown when the last hook gets
+disconnected.
 .Sh FILES
 .Bl -tag -width XXXXXXXX -compact
 .It Pa /usr/share/examples/netgraph/ether.bridge

Modified: stable/8/share/man/man4/ng_hub.4
==============================================================================
--- stable/8/share/man/man4/ng_hub.4    Sun May 16 14:31:53 2010        
(r208144)
+++ stable/8/share/man/man4/ng_hub.4    Sun May 16 14:51:36 2010        
(r208145)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd April 17, 2004
+.Dd May 5, 2010
 .Dt NG_HUB 4
 .Os
 .Sh NAME
@@ -45,11 +45,20 @@ A
 node accepts any request to connect, regardless of the hook name,
 as long as the name is unique.
 .Sh CONTROL MESSAGES
-This node type supports only the generic control messages.
+This node type supports the generic control messages, plus the
+following:
+.Bl -tag -width foo
+.It Dv NGM_HUB_SET_PERSISTENT
+This command sets the persistent flag on the node, and takes no arguments.
+.El
 .Sh SHUTDOWN
 This node shuts down upon receipt of a
 .Dv NGM_SHUTDOWN
-control message, or when all hooks have been disconnected.
+control message, or when all hooks have been disconnected.  Setting the
+persistent flag via a
+.Dv NGM_HUB_SET_PERSISTENT
+control message disables automatic node shutdown when the last hook gets
+disconnected.
 .Sh SEE ALSO
 .Xr netgraph 4 ,
 .Xr ng_bridge 4 ,

Modified: stable/8/sys/netgraph/ng_bridge.c
==============================================================================
--- stable/8/sys/netgraph/ng_bridge.c   Sun May 16 14:31:53 2010        
(r208144)
+++ stable/8/sys/netgraph/ng_bridge.c   Sun May 16 14:51:36 2010        
(r208145)
@@ -83,7 +83,7 @@
 #include <netgraph/ng_bridge.h>
 
 #ifdef NG_SEPARATE_MALLOC
-MALLOC_DEFINE(M_NETGRAPH_BRIDGE, "netgraph_bridge", "netgraph bridge node ");
+MALLOC_DEFINE(M_NETGRAPH_BRIDGE, "netgraph_bridge", "netgraph bridge node");
 #else
 #define M_NETGRAPH_BRIDGE M_NETGRAPH
 #endif
@@ -105,6 +105,7 @@ struct ng_bridge_private {
        u_int                   numBuckets;     /* num buckets in table */
        u_int                   hashMask;       /* numBuckets - 1 */
        int                     numLinks;       /* num connected links */
+       int                     persistent;     /* can exist w/o hooks */
        struct callout          timer;          /* one second periodic timer */
 };
 typedef struct ng_bridge_private *priv_p;
@@ -270,6 +271,13 @@ static const struct ng_cmdlist ng_bridge
          NULL,
          &ng_bridge_host_ary_type
        },
+       {
+         NGM_BRIDGE_COOKIE,
+         NGM_BRIDGE_SET_PERSISTENT,
+         "setpersistent",
+         NULL,
+         NULL
+       },
        { 0 }
 };
 
@@ -494,6 +502,11 @@ ng_bridge_rcvmsg(node_p node, item_p ite
                        }
                        break;
                    }
+               case NGM_BRIDGE_SET_PERSISTENT:
+                   {
+                       priv->persistent = 1;
+                       break;
+                   }
                default:
                        error = EINVAL;
                        break;
@@ -799,7 +812,8 @@ ng_bridge_disconnect(hook_p hook)
 
        /* If no more hooks, go away */
        if ((NG_NODE_NUMHOOKS(NG_HOOK_NODE(hook)) == 0)
-       && (NG_NODE_IS_VALID(NG_HOOK_NODE(hook)))) {
+           && (NG_NODE_IS_VALID(NG_HOOK_NODE(hook)))
+           && !priv->persistent) {
                ng_rmnode_self(NG_HOOK_NODE(hook));
        }
        return (0);

Modified: stable/8/sys/netgraph/ng_bridge.h
==============================================================================
--- stable/8/sys/netgraph/ng_bridge.h   Sun May 16 14:31:53 2010        
(r208144)
+++ stable/8/sys/netgraph/ng_bridge.h   Sun May 16 14:51:36 2010        
(r208145)
@@ -149,6 +149,7 @@ enum {
        NGM_BRIDGE_CLR_STATS,           /* clear link stats */
        NGM_BRIDGE_GETCLR_STATS,        /* atomically get & clear link stats */
        NGM_BRIDGE_GET_TABLE,           /* get link table */
+       NGM_BRIDGE_SET_PERSISTENT,      /* set persistent mode */
 };
 
 #endif /* _NETGRAPH_NG_BRIDGE_H_ */

Modified: stable/8/sys/netgraph/ng_hub.c
==============================================================================
--- stable/8/sys/netgraph/ng_hub.c      Sun May 16 14:31:53 2010        
(r208144)
+++ stable/8/sys/netgraph/ng_hub.c      Sun May 16 14:51:36 2010        
(r208145)
@@ -36,16 +36,46 @@
 #include <netgraph/ng_hub.h>
 #include <netgraph/netgraph.h>
 
+#ifdef NG_SEPARATE_MALLOC
+MALLOC_DEFINE(M_NETGRAPH_HUB, "netgraph_hub", "netgraph hub node");
+#else
+#define M_NETGRAPH_HUB M_NETGRAPH
+#endif
+
+/* Per-node private data */
+struct ng_hub_private {
+       int             persistent;     /* can exist w/o hooks */
+};
+typedef struct ng_hub_private *priv_p;
+
+/* Netgraph node methods */
 static ng_constructor_t        ng_hub_constructor;
+static ng_rcvmsg_t     ng_hub_rcvmsg;
+static ng_shutdown_t   ng_hub_shutdown;
 static ng_rcvdata_t    ng_hub_rcvdata;
 static ng_disconnect_t ng_hub_disconnect;
 
+/* List of commands and how to convert arguments to/from ASCII */
+static const struct ng_cmdlist ng_hub_cmdlist[] = {
+       {
+               NGM_HUB_COOKIE,
+               NGM_HUB_SET_PERSISTENT,
+               "setpersistent",
+               NULL,
+               NULL
+       },
+       { 0 }
+};
+
 static struct ng_type ng_hub_typestruct = {
        .version =      NG_ABI_VERSION,
        .name =         NG_HUB_NODE_TYPE,
        .constructor =  ng_hub_constructor,
+       .rcvmsg =       ng_hub_rcvmsg,
+       .shutdown =     ng_hub_shutdown,
        .rcvdata =      ng_hub_rcvdata,
        .disconnect =   ng_hub_disconnect,
+       .cmdlist =      ng_hub_cmdlist,
 };
 NETGRAPH_INIT(hub, &ng_hub_typestruct);
 
@@ -53,10 +83,39 @@ NETGRAPH_INIT(hub, &ng_hub_typestruct);
 static int
 ng_hub_constructor(node_p node)
 {
+       priv_p priv;
+
+       /* Allocate and initialize private info */
+       priv = malloc(sizeof(*priv), M_NETGRAPH_HUB, M_NOWAIT | M_ZERO);
+       if (priv == NULL)
+               return (ENOMEM);
 
+       NG_NODE_SET_PRIVATE(node, priv);
        return (0);
 }
 
+/*
+ * Receive a control message
+ */
+static int
+ng_hub_rcvmsg(node_p node, item_p item, hook_p lasthook)
+{
+       const priv_p priv = NG_NODE_PRIVATE(node);
+       int error = 0;
+       struct ng_mesg *msg;
+
+       NGI_GET_MSG(item, msg);
+       if (msg->header.typecookie == NGM_HUB_COOKIE &&
+           msg->header.cmd == NGM_HUB_SET_PERSISTENT) {
+               priv->persistent = 1;
+       } else {
+               error = EINVAL;
+       }
+
+       NG_FREE_MSG(msg);
+       return (error);
+}
+
 static int
 ng_hub_rcvdata(hook_p hook, item_p item)
 {
@@ -89,12 +148,25 @@ ng_hub_rcvdata(hook_p hook, item_p item)
        return (error);
 }
 
+/*
+ * Shutdown node
+ */
+static int
+ng_hub_shutdown(node_p node)
+{
+       const priv_p priv = NG_NODE_PRIVATE(node);
+
+       free(priv, M_NETGRAPH_HUB);
+       return (0);
+}
+
 static int
 ng_hub_disconnect(hook_p hook)
 {
+       const priv_p priv = NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
 
        if (NG_NODE_NUMHOOKS(NG_HOOK_NODE(hook)) == 0 &&
-           NG_NODE_IS_VALID(NG_HOOK_NODE(hook)))
+           NG_NODE_IS_VALID(NG_HOOK_NODE(hook)) && !priv->persistent)
                ng_rmnode_self(NG_HOOK_NODE(hook));
        return (0);
 }

Modified: stable/8/sys/netgraph/ng_hub.h
==============================================================================
--- stable/8/sys/netgraph/ng_hub.h      Sun May 16 14:31:53 2010        
(r208144)
+++ stable/8/sys/netgraph/ng_hub.h      Sun May 16 14:51:36 2010        
(r208145)
@@ -33,4 +33,9 @@
 #define        NG_HUB_NODE_TYPE        "hub"
 #define        NGM_HUB_COOKIE          1082189597
 
+/* Netgraph control messages */
+enum {
+       NGM_HUB_SET_PERSISTENT = 1,     /* set persistent mode */
+};
+
 #endif /* _NETGRAPH_NG_HUB_H_ */
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to