Date: 08 Feb 1999 04:53:19 +0100 From: Dag-Erling Smorgrav <des@flood.ping.uio.no> To: Dag-Erling Smorgrav <des@flood.ping.uio.no> Cc: Bill Fenner <fenner@parc.xerox.com>, hackers@FreeBSD.ORG, nsouch@FreeBSD.ORG, wpaul@FreeBSD.ORG, jkh@FreeBSD.ORG, peter.jeremy@auss2.alcatel.com.au Subject: Re: Regarding tcpdump and plip Message-ID: <xzpsoch1rgw.fsf@flood.ping.uio.no> In-Reply-To: Dag-Erling Smorgrav's message of "08 Feb 1999 02:40:39 %2B0100" References: <99Feb7.160220pst.177534@crevenia.parc.xerox.com> <xzp90e9brl4.fsf@flood.ping.uio.no>
next in thread | previous in thread | raw e-mail | index | archive | help
Dag-Erling Smorgrav <des@flood.ping.uio.no> writes:
> The first of the two attached patches (hopefully) fixes the bpf
> problem. It compiles and links, but I haven't tested it yet (waiting
> for make world to complete).
Well, it's 5 am over here and I finally got it licked :) It was a
little hairier than I thought because a) I can't just barge in and set
LPIPHDRLEN to 4, because it's used by non-bpf-related stuff, and b)
the transmit loop in lpoutput() modified the m_len field in each mbuf
along the chain *before* passing it on to bpf; the result was a lot of
empty packets (all outgoing packets would show up blank in bpf output)
Patches are attached. I'll commit them after I get some sleep :)
DES
--
Dag-Erling Smorgrav - des@flood.ping.uio.no
Index: if_plip.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ppbus/if_plip.c,v
retrieving revision 1.9
diff -u -r1.9 if_plip.c
--- if_plip.c 1999/01/30 15:35:39 1.9
+++ if_plip.c 1999/02/08 03:32:23
@@ -256,7 +256,7 @@
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 @@
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 *)⁡
+ bpf_mtap(ifp, &m0);
+}
+#endif
+
static void
lpintr (int unit)
{
@@ -504,6 +524,10 @@
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 @@
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 @@
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 @@
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 @@
} 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 @@
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 @@
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
}
Index: nlpt.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/ppbus/nlpt.c,v
retrieving revision 1.13
diff -u -r1.13 nlpt.c
--- nlpt.c 1999/01/27 20:09:19 1.13
+++ nlpt.c 1999/02/08 00:52:13
@@ -221,6 +221,9 @@
}
/*
+ * Probe simplified by replacing multiple loops with a hardcoded
+ * test pattern - 1999/02/08 des@freebsd.org
+ *
* New lpt port probe Geoff Rehmet - Rhodes University - 14/2/94
* Based partially on Rod Grimes' printer probe
*
@@ -267,38 +270,29 @@
static int
nlpt_detect(struct lpt_data *sc)
{
- int status;
- u_char data;
- u_char mask;
- int i, error;
+ static u_char testbyte[18] = {
+ 0x55, /* alternating zeros */
+ 0xaa, /* alternating ones */
+ 0xfe, 0xfd, 0xfb, 0xf7,
+ 0xef, 0xdf, 0xbf, 0x7f, /* walking zero */
+ 0x01, 0x02, 0x04, 0x08,
+ 0x10, 0x20, 0x40, 0x80 /* walking one */
+ };
+ int i, error, status;
status = 1; /* assume success */
if ((error = lpt_request_ppbus(sc, PPB_DONTWAIT))) {
printf(LPT_NAME ": cannot alloc ppbus (%d)!\n", error);
- status = 0 ; goto end_probe ;
- }
-
- mask = 0xff;
- data = 0x55; /* Alternating zeros */
- if (!nlpt_port_test(sc, data, mask))
- { status = 0 ; goto end_probe ; }
-
- data = 0xaa; /* Alternating ones */
- if (!nlpt_port_test(sc, data, mask))
- { status = 0 ; goto end_probe ; }
-
- for (i = 0; i < 8; i++) { /* Walking zero */
- data = ~(1 << i);
- if (!nlpt_port_test(sc, data, mask))
- { status = 0 ; goto end_probe ; }
+ status = 0;
+ goto end_probe;
}
- for (i = 0; i < 8; i++) { /* Walking one */
- data = (1 << i);
- if (!nlpt_port_test(sc, data, mask))
- { status = 0 ; goto end_probe ; }
- }
+ for (i = 0; i < 18 && status; i++)
+ if (!nlpt_port_test(sc, testbyte[i], 0xff)) {
+ status = 0;
+ goto end_probe;
+ }
end_probe:
/* write 0's to control and data ports */
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?xzpsoch1rgw.fsf>
