Date: Sat, 11 Jul 1998 08:41:33 +1000 (EST) From: peter.jeremyp@alcatel.com.au To: FreeBSD-gnats-submit@FreeBSD.ORG Subject: bin/7241: tcpdump does not work with parallel line IP Message-ID: <199807102241.IAA15036@vk2pj.alcatel.com.au>
index | next in thread | raw e-mail
>Number: 7241
>Category: bin
>Synopsis: tcpdump does not work with parallel line IP
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Jul 10 15:50:01 PDT 1998
>Last-Modified:
>Originator: Peter Jeremy
>Organization:
>Release: FreeBSD 2.2.5-RELEASE i386
>Environment:
Two FreeBSD 2.2.5-RELEASE machines connected via parallel IP. There
are no changes in 2.2.6-RELEASE so the same problem presumably occurs.
>Description:
The tcpdump supplied with 2.2.5-RELEASE (and 2.2.6-RELEASE) cannot
handle parallel IP. The problem is that the LP code defines itself as
DLT_NULL, which assumes a 4-byte header, although the LP interface
uses a 2-byte header. Also, the m_len field in the mbuf passed to the
bpfilter has been zeroed during the transmit prcess (3rd patch block
in lpt.c below). The solution is to define a new interface protocol
type `DLT_LPIP' which has the correct characteristics.
>How-To-Repeat:
Run tcpdump on an lp interface. The decode will be corrupted.
>Fix:
The following patch defines a new DLT_LPIP type and modifies the lp
interface to use it. This patch should apply to either 2.2.6-RELEASE
or 2.2.5-RELEASE. In the latter case, the last patch (to the tcpdump
Makefile) will have 1 fuzz line. There may be offset lines with the
lpt.c patch due to (unrelated) changed to fix the spl() problem
previously corrected (kern/6099, i386/5698).
Note that this patch includes changes to contrib software. I'm not
certain of the correct procedure to apply FreeBSD changes to contrib
software, so the following may need massaging. A copy of these
patches have been forwarded to the tcpdump maintainer.
diff -ur 2.2.6/contrib/libpcap/bpf/net/bpf.h 2.2.5/contrib/libpcap/bpf/net/bpf.h
--- 2.2.6/contrib/libpcap/bpf/net/bpf.h Tue Aug 20 06:36:33 1996
+++ 2.2.5/contrib/libpcap/bpf/net/bpf.h Sun Jan 18 09:55:53 1998
@@ -165,6 +165,7 @@
#define DLT_PPP 9 /* Point-to-point Protocol */
#define DLT_FDDI 10 /* FDDI */
#define DLT_ATM_RFC1483 11 /* LLC/SNAP encapsulated atm */
+#define DLT_LPIP 12 /* Parallel port TCP/IP */
/*
* The instruction encondings.
diff -ur 2.2.6/contrib/libpcap/gencode.c 2.2.5/contrib/libpcap/gencode.c
--- 2.2.6/contrib/libpcap/gencode.c Mon Dec 23 02:03:05 1996
+++ 2.2.5/contrib/libpcap/gencode.c Sun Jan 18 09:55:53 1998
@@ -513,6 +513,11 @@
off_linktype = 6;
off_nl = 8;
return;
+
+ case DLT_LPIP:
+ off_linktype = 0;
+ off_nl = 2;
+ return;
}
bpf_error("unknown data link type 0x%x", linktype);
/* NOTREACHED */
@@ -562,6 +567,7 @@
break;
case DLT_NULL:
+ case DLT_LPIP:
/* XXX */
if (proto == ETHERTYPE_IP)
return (gen_cmp(0, BPF_W, (bpf_int32)htonl(AF_INET)));
diff -ur 2.2.6/contrib/tcpdump/Makefile.in 2.2.5/contrib/tcpdump/Makefile.in
--- 2.2.6/contrib/tcpdump/Makefile.in Tue Aug 20 06:34:03 1996
+++ 2.2.5/contrib/tcpdump/Makefile.in Sun Jan 18 09:55:53 1998
@@ -62,7 +62,7 @@
print-sl.c print-ppp.c print-rip.c print-snmp.c \
print-ntp.c print-null.c print-egp.c print-ospf.c \
print-fddi.c print-llc.c print-sunrpc.c print-wb.c \
- print-decnet.c print-isoclns.c print-ipx.c \
+ print-decnet.c print-isoclns.c print-lpip.c print-ipx.c \
print-atm.c print-dvmrp.c print-pim.c print-krb.c \
util.c machdep.c bpf_dump.c parsenfsfh.c
LOCALSRC =
diff -ur 2.2.6/contrib/tcpdump/interface.h 2.2.5/contrib/tcpdump/interface.h
--- 2.2.6/contrib/tcpdump/interface.h Wed Mar 4 18:57:52 1998
+++ 2.2.5/contrib/tcpdump/interface.h Sun Jan 18 09:55:53 1998
@@ -112,6 +103,7 @@
extern void ether_if_print(u_char *, const struct pcap_pkthdr *,
const u_char *);
extern void fddi_if_print(u_char *, const struct pcap_pkthdr *, const u_char*);
+extern void lpip_if_print(u_char *, const struct pcap_pkthdr *, const u_char*);
extern void null_if_print(u_char *, const struct pcap_pkthdr *, const u_char*);
extern void ppp_if_print(u_char *, const struct pcap_pkthdr *, const u_char *);
extern void sl_if_print(u_char *, const struct pcap_pkthdr *, const u_char *);
diff -u /dev/null 2.2.5/contrib/tcpdump/print-lpip.c
--- /dev/null Thu Jul 9 02:05:45 1998
+++ 2.2.5/contrib/tcpdump/print-lpip.c Sun Jun 29 14:25:25 1997
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 1991, 1993, 1994, 1995, 1996
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code distributions
+ * retain the above copyright notice and this paragraph in its entirety, (2)
+ * distributions including binary code include the above copyright notice and
+ * this paragraph in its entirety in the documentation or other materials
+ * provided with the distribution, and (3) all advertising materials mentioning
+ * features or use of this software display the following acknowledgement:
+ * ``This product includes software developed by the University of California,
+ * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
+ * the University nor the names of its contributors may be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+static char rcsid[] =
+ "@(#)$Header: print-lpip.c,v 1.1";
+#endif
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+
+#if __STDC__
+struct mbuf;
+struct rtentry;
+#endif
+#include <net/if.h>
+
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/if_ether.h>
+#include <netinet/ip_var.h>
+#include <netinet/udp.h>
+#include <netinet/udp_var.h>
+#include <netinet/tcp.h>
+#include <netinet/tcpip.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "interface.h"
+#include "addrtoname.h"
+#include "pcap.h"
+
+#define LPIP_HDRLEN 2
+
+static void
+lpip_print(const u_char *p, const struct ip *ip, u_int length)
+{
+ u_int family;
+
+ memcpy((char *)&family, (char *)p, sizeof(family));
+
+ if (nflag) {
+ /* XXX just dump the header */
+ return;
+ }
+ switch (family) {
+
+ case AF_INET:
+ printf("ip: ");
+ break;
+
+ case AF_NS:
+ printf("ns: ");
+ break;
+
+ default:
+ printf("AF %d: ", family);
+ break;
+ }
+}
+
+void
+lpip_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
+{
+ u_int length = h->len;
+ u_int caplen = h->caplen;
+ const struct ip *ip;
+
+ if (length < LPIP_HDRLEN || caplen < LPIP_HDRLEN)
+ return;
+
+ ts_print(&h->ts);
+
+ /*
+ * Some printers want to get back at the link level addresses,
+ * and/or check that they're not walking off the end of the packet.
+ * Rather than pass them all the way down, we set these globals.
+ */
+ packetp = p;
+ snapend = p + caplen;
+
+ length -= LPIP_HDRLEN;
+
+ ip = (struct ip *)(p + LPIP_HDRLEN);
+
+ if (eflag)
+ lpip_print(p, ip, length);
+
+ ip_print((const u_char *)ip, length);
+
+ if (xflag)
+ default_print((const u_char *)ip, caplen - LPIP_HDRLEN);
+ putchar('\n');
+}
+
diff -ur 2.2.6/contrib/tcpdump/tcpdump.c 2.2.5/contrib/tcpdump/tcpdump.c
--- 2.2.6/contrib/tcpdump/tcpdump.c Tue Aug 20 06:34:12 1996
+++ 2.2.5/contrib/tcpdump/tcpdump.c Sun Jan 18 09:55:53 1998
@@ -97,6 +97,7 @@
{ ppp_if_print, DLT_PPP },
{ fddi_if_print, DLT_FDDI },
{ null_if_print, DLT_NULL },
+ { lpip_if_print, DLT_LPIP },
{ atm_if_print, DLT_ATM_RFC1483 },
{ NULL, 0 },
};
diff -ur 2.2.6/sys/i386/isa/lpt.c 2.2.5/sys/i386/isa/lpt.c
--- 2.2.6/sys/i386/isa/lpt.c Sat Feb 28 15:18:12 1998
+++ 2.2.5/sys/i386/isa/lpt.c Fri Mar 27 19:08:19 1998
@@ -871,7 +882,7 @@
printf("lp%d: TCP/IP capable interface\n", unit);
#if NBPFILTER > 0
- bpfattach(ifp, DLT_NULL, LPIPHDRLEN);
+ bpfattach(ifp, DLT_LPIP, LPIPHDRLEN);
#endif
}
/*
@@ -1139,6 +1153,7 @@
}
#if NBPFILTER > 0
if (sc->sc_if.if_bpf) {
+ lprintf("r");
bpf_tap(&sc->sc_if, sc->sc_ifbuf, len);
}
#endif
@@ -1308,7 +1323,8 @@
mm = m;
do {
cp = mtod(mm,u_char *);
- while (mm->m_len--)
+ i = mm->m_len;
+ while (i--)
if (lpoutbyte(*cp++, LPMAXSPIN2, lpt_data_port, lpt_stat_port))
goto end;
} while ((mm = mm->m_next));
@@ -1341,6 +1357,7 @@
m0.m_len = 2;
m0.m_data = (char *)&hdr;
+ lprintf("t");
bpf_mtap(ifp, &m0);
}
#endif
diff -ur 2.2.6/sys/net/bpf.c 2.2.5/sys/net/bpf.c
--- 2.2.6/sys/net/bpf.c Sat Oct 4 09:57:03 1997
+++ 2.2.5/sys/net/bpf.c Sat Jan 17 19:26:16 1998
@@ -170,7 +170,9 @@
*/
switch (linktype) {
+ case DLT_NULL:
case DLT_SLIP:
+ case DLT_LPIP:
sockp->sa_family = AF_INET;
hlen = 0;
break;
@@ -190,11 +192,6 @@
/* XXX 4(FORMAC)+6(dst)+6(src)+3(LLC)+5(SNAP) */
hlen = 24;
#endif
- break;
-
- case DLT_NULL:
- sockp->sa_family = AF_UNSPEC;
- hlen = 0;
break;
default:
diff -ur 2.2.6/sys/net/bpf.h 2.2.5/sys/net/bpf.h
--- 2.2.6/sys/net/bpf.h Tue Aug 20 06:28:25 1996
+++ 2.2.5/sys/net/bpf.h Sat Jan 17 19:26:17 1998
@@ -146,6 +146,7 @@
#define DLT_PPP 9 /* Point-to-point Protocol */
#define DLT_FDDI 10 /* FDDI */
#define DLT_ATM_RFC1483 11 /* LLC/SNAP encapsulated atm */
+#define DLT_LPIP 12 /* Parallel port TCP/IP */
/*
* The instruction encodings.
diff -ur 2.2.6/usr.sbin/tcpdump/tcpdump/Makefile 2.2.5/usr.sbin/tcpdump/tcpdump/Makefile
--- 2.2.6/usr.sbin/tcpdump/tcpdump/Makefile Thu Jan 1 08:51:55 1998
+++ 2.2.5/usr.sbin/tcpdump/tcpdump/Makefile Sun Jan 18 09:55:54 1998
@@ -13,8 +13,8 @@
print-sl.c print-ppp.c print-rip.c print-snmp.c \
print-ntp.c print-null.c print-egp.c print-ospf.c \
print-fddi.c print-llc.c print-sunrpc.c print-wb.c \
- print-decnet.c print-isoclns.c print-ipx.c \
+ print-decnet.c print-isoclns.c print-ipx.c print-lpip.c \
print-atm.c print-fr.c print-dvmrp.c print-pim.c print-krb.c \
util.c machdep.c bpf_dump.c parsenfsfh.c
CLEANFILES+= version.c
DPADD+= ${LIBL} ${LIBPCAP}
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199807102241.IAA15036>
