summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2002-11-14 23:44:37 +0000
committersam <sam@FreeBSD.org>2002-11-14 23:44:37 +0000
commit9b89a917e54c5aed500aacf63bc34298eff1f049 (patch)
tree94594aa1f44b1e4c96f1a3919f466a780886e13f
parent5852b81f42f17cad7b33e793f254c3d809f49eac (diff)
downloadFreeBSD-src-9b89a917e54c5aed500aacf63bc34298eff1f049.zip
FreeBSD-src-9b89a917e54c5aed500aacf63bc34298eff1f049.tar.gz
o track changes to ethernet input packet handling
o track changes to bpf o track changes to make ng hooks more private Reviewed by: many Approved by: re
-rw-r--r--sys/netgraph/ng_eiface.c30
-rw-r--r--sys/netgraph/ng_ether.c86
-rw-r--r--sys/netgraph/ng_iface.c2
3 files changed, 22 insertions, 96 deletions
diff --git a/sys/netgraph/ng_eiface.c b/sys/netgraph/ng_eiface.c
index d9fdc51..7588c92 100644
--- a/sys/netgraph/ng_eiface.c
+++ b/sys/netgraph/ng_eiface.c
@@ -325,8 +325,7 @@ ng_eiface_start2(node_p node, hook_p hook, void *arg1, int arg2)
* Pass packet to bpf if there is a listener.
* XXX is this safe? locking?
*/
- if (ifp->if_bpf)
- bpf_mtap(ifp, m);
+ BPF_MTAP(ifp, m);
/* Copy length before the mbuf gets invalidated */
len = m->m_pkthdr.len;
@@ -458,7 +457,7 @@ ng_eiface_constructor(node_p node)
*/
/* Attach the interface */
- ether_ifattach(ifp, ETHER_BPF_SUPPORTED);
+ ether_ifattach(ifp, priv->arpcom.ac_enaddr);
/* Done */
return (0);
@@ -602,9 +601,6 @@ ng_eiface_rcvdata(hook_p hook, item_p item)
{
priv_p priv = NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
struct ifnet *const ifp = priv->ifp;
- int s, error = 0;
- struct ether_header *eh;
- u_short ether_type;
struct mbuf *m;
NGI_GET_M(item, m);
@@ -626,26 +622,10 @@ ng_eiface_rcvdata(hook_p hook, item_p item)
/* Update interface stats */
ifp->if_ipackets++;
- eh = mtod(m, struct ether_header *);
- ether_type = ntohs(eh->ether_type);
-
- s = splimp();
- m->m_pkthdr.len -= sizeof(*eh);
- m->m_len -= sizeof(*eh);
- if (m->m_len) {
- m->m_data += sizeof(*eh);
- } else {
- if (ether_type == ETHERTYPE_ARP) {
- m->m_len = m->m_next->m_len;
- m->m_data = m->m_next->m_data;
- }
- }
- splx(s);
-
- ether_input(ifp, eh, m);
+ (*ifp->if_input)(ifp, m);
/* Done */
- return (error);
+ return (0);
}
/*
@@ -657,7 +637,7 @@ ng_eiface_rmnode(node_p node)
priv_p priv = NG_NODE_PRIVATE(node);
struct ifnet *const ifp = priv->ifp;
- ether_ifdetach(ifp, ETHER_BPF_SUPPORTED);
+ ether_ifdetach(ifp);
ng_eiface_free_unit(priv->unit);
FREE(priv, M_NETGRAPH);
NG_NODE_SET_PRIVATE(node, NULL);
diff --git a/sys/netgraph/ng_ether.c b/sys/netgraph/ng_ether.c
index 1804b87..da2012f 100644
--- a/sys/netgraph/ng_ether.c
+++ b/sys/netgraph/ng_ether.c
@@ -80,20 +80,22 @@ struct private {
};
typedef struct private *priv_p;
+/* Hook pointers used by if_ethersubr.c to callback to netgraph */
+extern void (*ng_ether_input_p)(struct ifnet *ifp, struct mbuf **mp);
+extern void (*ng_ether_input_orphan_p)(struct ifnet *ifp, struct mbuf *m);
+extern int (*ng_ether_output_p)(struct ifnet *ifp, struct mbuf **mp);
+extern void (*ng_ether_attach_p)(struct ifnet *ifp);
+extern void (*ng_ether_detach_p)(struct ifnet *ifp);
+
/* Functional hooks called from if_ethersubr.c */
-static void ng_ether_input(struct ifnet *ifp,
- struct mbuf **mp, struct ether_header *eh);
-static void ng_ether_input_orphan(struct ifnet *ifp,
- struct mbuf *m, struct ether_header *eh);
+static void ng_ether_input(struct ifnet *ifp, struct mbuf **mp);
+static void ng_ether_input_orphan(struct ifnet *ifp, struct mbuf *m);
static int ng_ether_output(struct ifnet *ifp, struct mbuf **mp);
static void ng_ether_attach(struct ifnet *ifp);
static void ng_ether_detach(struct ifnet *ifp);
/* Other functions */
-static void ng_ether_input2(node_p node,
- struct mbuf **mp, struct ether_header *eh);
-static int ng_ether_glueback_header(struct mbuf **mp,
- struct ether_header *eh);
+static void ng_ether_input2(node_p node, struct mbuf **mp);
static int ng_ether_rcv_lower(node_p node, struct mbuf *m, meta_p meta);
static int ng_ether_rcv_upper(node_p node, struct mbuf *m, meta_p meta);
@@ -209,8 +211,7 @@ NETGRAPH_INIT(ether, &ng_ether_typestruct);
* NOTE: this function will get called at splimp()
*/
static void
-ng_ether_input(struct ifnet *ifp,
- struct mbuf **mp, struct ether_header *eh)
+ng_ether_input(struct ifnet *ifp, struct mbuf **mp)
{
const node_p node = IFP2NG(ifp);
const priv_p priv = NG_NODE_PRIVATE(node);
@@ -218,7 +219,7 @@ ng_ether_input(struct ifnet *ifp,
/* If "lower" hook not connected, let packet continue */
if (priv->lower == NULL || priv->lowerOrphan)
return;
- ng_ether_input2(node, mp, eh);
+ ng_ether_input2(node, mp);
}
/*
@@ -228,8 +229,7 @@ ng_ether_input(struct ifnet *ifp,
* NOTE: this function will get called at splimp()
*/
static void
-ng_ether_input_orphan(struct ifnet *ifp,
- struct mbuf *m, struct ether_header *eh)
+ng_ether_input_orphan(struct ifnet *ifp, struct mbuf *m)
{
const node_p node = IFP2NG(ifp);
const priv_p priv = NG_NODE_PRIVATE(node);
@@ -239,7 +239,7 @@ ng_ether_input_orphan(struct ifnet *ifp,
m_freem(m);
return;
}
- ng_ether_input2(node, &m, eh);
+ ng_ether_input2(node, &m);
if (m != NULL)
m_freem(m);
}
@@ -252,15 +252,11 @@ ng_ether_input_orphan(struct ifnet *ifp,
* NOTE: this function will get called at splimp()
*/
static void
-ng_ether_input2(node_p node, struct mbuf **mp, struct ether_header *eh)
+ng_ether_input2(node_p node, struct mbuf **mp)
{
const priv_p priv = NG_NODE_PRIVATE(node);
int error;
- /* Glue Ethernet header back on */
- if ((error = ng_ether_glueback_header(mp, eh)) != 0)
- return;
-
/* Send out lower/orphan hook */
NG_SEND_DATA_ONLY(error, priv->lower, *mp);
*mp = NULL;
@@ -350,44 +346,6 @@ ng_ether_detach(struct ifnet *ifp)
ng_rmnode_self(node); /* remove all netgraph parts */
}
-/*
- * Optimization for gluing the Ethernet header back onto
- * the front of an incoming packet.
- */
-static int
-ng_ether_glueback_header(struct mbuf **mp, struct ether_header *eh)
-{
- struct mbuf *m = *mp;
- int error = 0;
-
- /*
- * Optimize for the case where the header is already in place
- * at the front of the mbuf. This is actually quite likely
- * because many Ethernet drivers generate packets this way.
- */
- if (eh == mtod(m, struct ether_header *) - 1) {
- m->m_len += sizeof(*eh);
- m->m_data -= sizeof(*eh);
- m->m_pkthdr.len += sizeof(*eh);
- goto done;
- }
-
- /* Prepend the header back onto the front of the mbuf */
- M_PREPEND(m, sizeof(*eh), M_DONTWAIT);
- if (m == NULL) {
- error = ENOBUFS;
- goto done;
- }
-
- /* Copy header into front of mbuf */
- bcopy(eh, mtod(m, void *), sizeof(*eh));
-
-done:
- /* Done */
- *mp = m;
- return error;
-}
-
/******************************************************************
NETGRAPH NODE METHODS
******************************************************************/
@@ -635,26 +593,14 @@ static int
ng_ether_rcv_upper(node_p node, struct mbuf *m, meta_p meta)
{
const priv_p priv = NG_NODE_PRIVATE(node);
- struct ether_header *eh;
/* Discard meta info */
NG_FREE_META(meta);
- /* Check length and pull off header */
- if (m->m_pkthdr.len < sizeof(*eh)) {
- NG_FREE_M(m);
- return (EINVAL);
- }
- if (m->m_len < sizeof(*eh) && (m = m_pullup(m, sizeof(*eh))) == NULL)
- return (ENOBUFS);
- eh = mtod(m, struct ether_header *);
- m->m_data += sizeof(*eh);
- m->m_len -= sizeof(*eh);
- m->m_pkthdr.len -= sizeof(*eh);
m->m_pkthdr.rcvif = priv->ifp;
/* Route packet back in */
- ether_demux(priv->ifp, eh, m);
+ ether_demux(priv->ifp, m);
return (0);
}
diff --git a/sys/netgraph/ng_iface.c b/sys/netgraph/ng_iface.c
index 5deac9e..4068f25 100644
--- a/sys/netgraph/ng_iface.c
+++ b/sys/netgraph/ng_iface.c
@@ -490,7 +490,7 @@ ng_iface_bpftap(struct ifnet *ifp, struct mbuf *m, sa_family_t family)
m0.m_next = m;
m0.m_len = sizeof(family4);
m0.m_data = (char *)&family4;
- bpf_mtap(ifp, &m0);
+ BPF_MTAP(ifp, &m0);
}
}
OpenPOWER on IntegriCloud