svn commit: r186488 - head/sys/netgraph

Julian Elischer julian at FreeBSD.org
Thu Dec 25 09:02:55 UTC 2008


Author: julian
Date: Thu Dec 25 09:02:55 2008
New Revision: 186488
URL: http://svn.freebsd.org/changeset/base/186488

Log:
  shave about 7% off the overhead of ng_ether by using per-hook
  receive data methods.

Modified:
  head/sys/netgraph/ng_ether.c

Modified: head/sys/netgraph/ng_ether.c
==============================================================================
--- head/sys/netgraph/ng_ether.c	Thu Dec 25 08:48:08 2008	(r186487)
+++ head/sys/netgraph/ng_ether.c	Thu Dec 25 09:02:55 2008	(r186488)
@@ -102,8 +102,8 @@ static void	ng_ether_detach(struct ifnet
 static void	ng_ether_link_state(struct ifnet *ifp, int state); 
 
 /* Other functions */
-static int	ng_ether_rcv_lower(node_p node, struct mbuf *m);
-static int	ng_ether_rcv_upper(node_p node, struct mbuf *m);
+static int	ng_ether_rcv_lower(hook_p node, item_p item);
+static int	ng_ether_rcv_upper(hook_p node, item_p item);
 
 /* Netgraph node methods */
 static ng_constructor_t	ng_ether_constructor;
@@ -389,13 +389,16 @@ ng_ether_newhook(node_p node, hook_p hoo
 		name = NG_ETHER_HOOK_LOWER;
 
 	/* Which hook? */
-	if (strcmp(name, NG_ETHER_HOOK_UPPER) == 0)
+	if (strcmp(name, NG_ETHER_HOOK_UPPER) == 0) {
 		hookptr = &priv->upper;
-	else if (strcmp(name, NG_ETHER_HOOK_LOWER) == 0)
+		NG_HOOK_SET_RCVDATA(hook, ng_ether_rcv_upper);
+	} else if (strcmp(name, NG_ETHER_HOOK_LOWER) == 0) {
 		hookptr = &priv->lower;
-	else if (strcmp(name, NG_ETHER_HOOK_ORPHAN) == 0)
+		NG_HOOK_SET_RCVDATA(hook, ng_ether_rcv_lower);
+	} else if (strcmp(name, NG_ETHER_HOOK_ORPHAN) == 0) {
 		hookptr = &priv->orphan;
-	else
+		NG_HOOK_SET_RCVDATA(hook, ng_ether_rcv_lower);
+	} else
 		return (EINVAL);
 
 	/* Check if already connected (shouldn't be, but doesn't hurt) */
@@ -571,21 +574,13 @@ ng_ether_rcvmsg(node_p node, item_p item
 
 /*
  * Receive data on a hook.
+ * Since we use per-hook recveive methods this should never be called.
  */
 static int
 ng_ether_rcvdata(hook_p hook, item_p item)
 {
-	const node_p node = NG_HOOK_NODE(hook);
-	const priv_p priv = NG_NODE_PRIVATE(node);
-	struct mbuf *m;
-
-	NGI_GET_M(item, m);
 	NG_FREE_ITEM(item);
 
-	if (hook == priv->lower || hook == priv->orphan)
-		return ng_ether_rcv_lower(node, m);
-	if (hook == priv->upper)
-		return ng_ether_rcv_upper(node, m);
 	panic("%s: weird hook", __func__);
 #ifdef RESTARTABLE_PANICS /* so we don't get an error msg in LINT */
 	return (0);
@@ -596,12 +591,18 @@ ng_ether_rcvdata(hook_p hook, item_p ite
  * Handle an mbuf received on the "lower" or "orphan" hook.
  */
 static int
-ng_ether_rcv_lower(node_p node, struct mbuf *m)
+ng_ether_rcv_lower(hook_p hook, item_p item)
 {
+	struct mbuf *m;
+	const node_p node = NG_HOOK_NODE(hook);
 	const priv_p priv = NG_NODE_PRIVATE(node);
  	struct ifnet *const ifp = priv->ifp;
 
+	NGI_GET_M(item, m);
+	NG_FREE_ITEM(item);
+
 	/* Check whether interface is ready for packets */
+
 	if (!((ifp->if_flags & IFF_UP) &&
 	    (ifp->if_drv_flags & IFF_DRV_RUNNING))) {
 		NG_FREE_M(m);
@@ -639,11 +640,16 @@ ng_ether_rcv_lower(node_p node, struct m
  * Handle an mbuf received on the "upper" hook.
  */
 static int
-ng_ether_rcv_upper(node_p node, struct mbuf *m)
+ng_ether_rcv_upper(hook_p hook, item_p item)
 {
+	struct mbuf *m;
+	const node_p node = NG_HOOK_NODE(hook);
 	const priv_p priv = NG_NODE_PRIVATE(node);
 	struct ifnet *ifp = priv->ifp;
 
+	NGI_GET_M(item, m);
+	NG_FREE_ITEM(item);
+
 	/* Check length and pull off header */
 	if (m->m_pkthdr.len < sizeof(struct ether_header)) {
 		NG_FREE_M(m);


More information about the svn-src-all mailing list