summaryrefslogtreecommitdiffstats
path: root/sys/dev/ppbus/if_plip.c
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>1999-02-08 14:12:38 +0000
committerdes <des@FreeBSD.org>1999-02-08 14:12:38 +0000
commitb25b4061cd1238f1bdef9f738b481e9e2a5542e6 (patch)
tree3dc432e3a4e6011a0c39b4d536fbef32153464a6 /sys/dev/ppbus/if_plip.c
parente96a20a328e66d47d7df867d1ec17071d1bde3ec (diff)
downloadFreeBSD-src-b25b4061cd1238f1bdef9f738b481e9e2a5542e6.zip
FreeBSD-src-b25b4061cd1238f1bdef9f738b481e9e2a5542e6.tar.gz
Generate correct DLT_NULL headers before passing packets to bpf.
Do not modify m_len before passing mbuf chains to bpf. Don't forget to pass packets to bpf when running in Crynwr mode (LINK0). Partially based on a patch by Bill Fenner <fenner@freebsd.org>. PR: bin/7241
Diffstat (limited to 'sys/dev/ppbus/if_plip.c')
-rw-r--r--sys/dev/ppbus/if_plip.c73
1 files changed, 43 insertions, 30 deletions
diff --git a/sys/dev/ppbus/if_plip.c b/sys/dev/ppbus/if_plip.c
index 886158c..b9e767e 100644
--- a/sys/dev/ppbus/if_plip.c
+++ b/sys/dev/ppbus/if_plip.c
@@ -24,7 +24,7 @@
* SUCH DAMAGE.
*
* From Id: lpt.c,v 1.55.2.1 1996/11/12 09:08:38 phk Exp
- * $Id: if_plip.c,v 1.8 1999/01/23 17:07:49 nsouch Exp $
+ * $Id: if_plip.c,v 1.9 1999/01/30 15:35:39 nsouch Exp $
*/
/*
@@ -256,7 +256,7 @@ lpattach (struct ppb_device *dev)
if_attach(ifp);
#if NBPFILTER > 0
- bpfattach(ifp, DLT_NULL, LPIPHDRLEN);
+ bpfattach(ifp, DLT_NULL, sizeof(u_int32_t));
#endif
return (1);
@@ -445,6 +445,26 @@ clpinbyte (int spin, struct ppb_device *dev)
return (ctrecvl[cl] | ctrecvh[c]);
}
+#if NBPFILTER > 0
+static void
+lptap(struct ifnet *ifp, struct mbuf *m)
+{
+ /*
+ * Send a packet through bpf. We need to prepend the address family
+ * as a four byte field. Cons up a dummy header to pacify bpf. This
+ * is safe because bpf will only read from the mbuf (i.e., it won't
+ * try to free it or keep a pointer to it).
+ */
+ u_int32_t af = AF_INET;
+ struct mbuf m0;
+
+ m0.m_next = m;
+ m0.m_len = sizeof(u_int32_t);
+ m0.m_data = (char *)&af;
+ bpf_mtap(ifp, &m0);
+}
+#endif
+
static void
lpintr (int unit)
{
@@ -504,6 +524,10 @@ lpintr (int unit)
sc->sc_if.if_ibytes += len;
top = m_devget(sc->sc_ifbuf + CLPIPHDRLEN, len, 0, &sc->sc_if, 0);
if (top) {
+#if NBPFILTER > 0
+ if (sc->sc_if.if_bpf)
+ lptap(&sc->sc_if, top);
+#endif
IF_ENQUEUE(&ipintrq, top);
schednetisr(NETISR_IP);
}
@@ -548,18 +572,17 @@ lpintr (int unit)
IF_DROP(&ipintrq);
goto done;
}
-#if NBPFILTER > 0
- if (sc->sc_if.if_bpf) {
- bpf_tap(&sc->sc_if, sc->sc_ifbuf, len);
- }
-#endif
len -= LPIPHDRLEN;
sc->sc_if.if_ipackets++;
sc->sc_if.if_ibytes += len;
top = m_devget(sc->sc_ifbuf + LPIPHDRLEN, len, 0, &sc->sc_if, 0);
if (top) {
- IF_ENQUEUE(&ipintrq, top);
- schednetisr(NETISR_IP);
+#if NBPFILTER > 0
+ if (sc->sc_if.if_bpf)
+ lptap(&sc->sc_if, top);
+#endif
+ IF_ENQUEUE(&ipintrq, top);
+ schednetisr(NETISR_IP);
}
}
goto done;
@@ -610,8 +633,7 @@ lpoutput (struct ifnet *ifp, struct mbuf *m,
u_char *cp = "\0\0";
u_char chksum = 0;
int count = 0;
- int i;
- int spin;
+ int i, len, spin;
/* We need a sensible value if we abort */
cp++;
@@ -668,7 +690,8 @@ lpoutput (struct ifnet *ifp, struct mbuf *m,
mm = m;
do {
cp = mtod(mm, u_char *);
- while (mm->m_len--) {
+ len = mm->m_len;
+ while (len--) {
chksum += *cp;
if (clpoutbyte(*cp++, LPMAXSPIN2, &sc->lp_dev))
goto nend;
@@ -691,6 +714,10 @@ lpoutput (struct ifnet *ifp, struct mbuf *m,
} else {
ifp->if_opackets++;
ifp->if_obytes += m->m_pkthdr.len;
+#if NBPFILTER > 0
+ if (ifp->if_bpf)
+ lptap(ifp, m);
+#endif
}
m_freem(m);
@@ -716,7 +743,8 @@ lpoutput (struct ifnet *ifp, struct mbuf *m,
mm = m;
do {
cp = mtod(mm,u_char *);
- while (mm->m_len--)
+ len = mm->m_len;
+ while (len--)
if (lpoutbyte(*cp++, LPMAXSPIN2, &sc->lp_dev))
goto end;
} while ((mm = mm->m_next));
@@ -734,23 +762,8 @@ lpoutput (struct ifnet *ifp, struct mbuf *m,
ifp->if_opackets++;
ifp->if_obytes += m->m_pkthdr.len;
#if NBPFILTER > 0
- if (ifp->if_bpf) {
- /*
- * We need to prepend the packet type as
- * a two byte field. Cons up a dummy header
- * to pacify bpf. This is safe because bpf
- * will only read from the mbuf (i.e., it won't
- * try to free it or keep a pointer to it).
- */
- struct mbuf m0;
- u_short hdr = 0x800;
-
- m0.m_next = m;
- m0.m_len = 2;
- m0.m_data = (char *)&hdr;
-
- bpf_mtap(ifp, &m0);
- }
+ if (ifp->if_bpf)
+ lptap(ifp, m);
#endif
}
OpenPOWER on IntegriCloud