diff options
author | sam <sam@FreeBSD.org> | 2002-11-14 23:44:37 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2002-11-14 23:44:37 +0000 |
commit | 9b89a917e54c5aed500aacf63bc34298eff1f049 (patch) | |
tree | 94594aa1f44b1e4c96f1a3919f466a780886e13f | |
parent | 5852b81f42f17cad7b33e793f254c3d809f49eac (diff) | |
download | FreeBSD-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.c | 30 | ||||
-rw-r--r-- | sys/netgraph/ng_ether.c | 86 | ||||
-rw-r--r-- | sys/netgraph/ng_iface.c | 2 |
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); } } |