Date: 08 Feb 1999 02:40:39 +0100 From: Dag-Erling Smorgrav <des@flood.ping.uio.no> To: Bill Fenner <fenner@parc.xerox.com> Cc: hackers@FreeBSD.ORG, nsouch@FreeBSD.ORG, wpaul@FreeBSD.ORG, jkh@FreeBSD.ORG Subject: Re: Regarding tcpdump and plip Message-ID: <xzp90e9brl4.fsf@flood.ping.uio.no> In-Reply-To: Bill Fenner's message of "Sun, 7 Feb 1999 16:02:10 PST" References: <99Feb7.160220pst.177534@crevenia.parc.xerox.com>
next in thread | previous in thread | raw e-mail | index | archive | help
[cc:ed to jkh because of the last two paragraphs]
Bill Fenner <fenner@parc.xerox.com> writes:
> Ugh. Can you tell what mode the device is going to be in when you
> bpf_attach()? (Presumably not). I guess bpf might end up needing
> a mechanism to change what you told it in bpf_attach(). I wonder what
> happens if someone's got a bpf open on the device when that happens;
> probably nothing good...
No, I just throw away the fake Ethernet header and put a DLT_NULL
header on instead. It's much simpler, and no useful information is
lost since the fake Ethernet header in the incoming packet is blank
except for the type field, which we reproduce (or rather, translate to
AF_INET) in the DLT_NULL header.
Whoever originally added bpf support to the lpt driver must have been
smoking some really strong stuff. Not only does the current code
produce invalid (and therefore useless) bpf packets, but in Crynwr
mode it doesn't pass incoming packets to bpf at all!
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). The second patch is equivalent to the one
committed to lpt.c last February (simplified port probe). It's been in
lpt.c long enough to be considered stable, and I'd like to MFC it (and
the first patch as well if it turns out OK - it can't possibly make
matters worse than they already are)
I'd really, *really* like to rip out the lpt driver, since its
functionality is completely duplicated by the nlpt and lpip drivers,
which seem pretty stable now. Keeping the lpt driver will only result
in slowing down ppbus development. I don't think ppbus + nlpt + plip
is significantly larger than lpt, so size is not an argument. And if
we ever want to rip out lpt, we have to rip it out *now* before 3.1 is
released, or we'll have a hard time doing it before 4.0 goes -STABLE
in a year or two.
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 00:25:46
@@ -123,7 +123,7 @@
#define CLPIP_SHAKE 0x80 /* This bit toggles between nibble reception */
#define MLPIPHDRLEN CLPIPHDRLEN
-#define LPIPHDRLEN 2 /* We send 0x08, 0x00 in front of packet */
+#define LPIPHDRLEN 4 /* We send AF_INET in front of packet */
#define LPIP_SHAKE 0x40 /* This bit toggles between nibble reception */
#if !defined(MLPIPHDRLEN) || LPIPHDRLEN > MLPIPHDRLEN
#define MLPIPHDRLEN LPIPHDRLEN
@@ -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 = LPIPHDRLEN;
+ 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;
@@ -734,23 +757,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?xzp90e9brl4.fsf>
