Make all network interrupt service routines MPSAFE part 1/3.
[dragonfly.git] / sys / netgraph / ether / ng_ether.c
index 4ae887b..15d37ab 100644 (file)
@@ -38,7 +38,7 @@
  *         Julian Elischer <julian@freebsd.org>
  *
  * $FreeBSD: src/sys/netgraph/ng_ether.c,v 1.2.2.13 2002/07/02 20:10:25 archie Exp $
- * $DragonFly: src/sys/netgraph/ether/ng_ether.c,v 1.7 2005/06/02 22:11:45 swildner Exp $
+ * $DragonFly: src/sys/netgraph/ether/ng_ether.c,v 1.8 2005/11/28 17:13:46 dillon Exp $
  */
 
 /*
@@ -576,6 +576,7 @@ ng_ether_rcv_lower(node_p node, struct mbuf *m, meta_p meta)
 {
        const priv_p priv = node->private;
        struct ifnet *const ifp = priv->ifp;
+       int error;
 
        /* Discard meta info */
        NG_FREE_META(meta);
@@ -610,7 +611,11 @@ ng_ether_rcv_lower(node_p node, struct mbuf *m, meta_p meta)
        }
 
        /* Send it on its way */
-       return ether_output_frame(ifp, m);
+       lwkt_serialize_enter(ifp->if_serializer);
+       error = ether_output_frame(ifp, m);
+       lwkt_serialize_exit(ifp->if_serializer);
+
+       return (error);
 }
 
 /*
@@ -639,7 +644,9 @@ ng_ether_rcv_upper(node_p node, struct mbuf *m, meta_p meta)
        m->m_pkthdr.rcvif = priv->ifp;
 
        /* Route packet back in */
+       lwkt_serialize_enter(priv->ifp->if_serializer);
        ether_demux(priv->ifp, eh, m);
+       lwkt_serialize_exit(priv->ifp->if_serializer);
        return (0);
 }