NetBSD Problem Report #1053
From gnats Tue May 16 02:47:36 1995
Received: from uran.informatik.uni-bonn.de (uran.informatik.uni-bonn.de [131.220.8.49]) by sun-lamp.cs.berkeley.edu (8.6.10/8.6.10) with ESMTP id CAA10885 for <gnats-bugs@sun-lamp.cs.berkeley.edu>; Tue, 16 May 1995 02:47:22 -0700
Message-Id: <199505152005.WAA00360@beverly.rhein.de>
Date: Mon, 15 May 1995 22:05:23 +0200
From: Ignatios Souvatzis <is@beverly.rhein.de>
Reply-To: is@netbsd.org
To: gnats-bugs@sun-lamp.cs.berkeley.edu
Subject: ARCnet support additions for libpcap/tcpdump
X-Send-Pr-Version: 3.2
>Number: 1053
>Category: misc
>Synopsis: ARCnet support additions for libpcap/tcpdump
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: is
>State: closed
>Class: change-request
>Submitter-Id: net
>Arrival-Date: Tue May 16 02:50:03 +0000 1995
>Closed-Date: Fri Apr 04 19:42:14 +0000 2003
>Last-Modified: Fri Apr 04 19:42:14 +0000 2003
>Originator: Ignatios Souvatzis
>Release: 1.0A
>Organization:
" private Internet site"
>Environment:
System: NetBSD beverly 1.0A NetBSD 1.0A (BEVERLY) #120: Tue May 9 13:55:13 MET DST 1995 is@beverly:/usr/src/sys/arch/amiga/compile/BEVERLY amiga
>Description:
tcpdump/libpcap don't support DLT_ARCNET devices.
>How-To-Repeat:
On a system with ARCnet primary interface, try
tcpdump.
On a system with multiple interfaces, one of which is ARCnet, try
tcpdump -i bah0
>Fix:
I developed the following set of diffs. They are supposed to work (and tested
with) RFC1051 IP over ARCnet and should work with RFC1051 ARP over ARCnet,
too, but won't work for RFC1201-style encapsulations (e.g., new IP/ARP/RARP
over ARCnet or IPX). These require bigger changes, at least special code, as
most of tcpdump/libpcap assumes every protocol has only one encapsulation and
all encapsulations have same length.
I might implement those later, when I need to debug the RFC1201 code for the
kernel I didn't write yet.
- Ignatios Souvatzis
diff -u usr.sbin/tcpdump.bak/Makefile usr.sbin/tcpdump/Makefile
--- usr.sbin/tcpdump.bak/Makefile Thu May 11 16:05:20 1995
+++ usr.sbin/tcpdump/Makefile Fri May 12 22:49:49 1995
@@ -30,7 +30,8 @@
DPADD+= ${LIBL} ${LIBPCAP}
SRCS= tcpdump.c addrtoname.c \
- print-ether.c print-ip.c print-arp.c print-tcp.c print-udp.c \
+ print-arc.c print-ether.c \
+ print-ip.c print-arp.c print-tcp.c print-udp.c \
print-atalk.c print-domain.c print-tftp.c print-bootp.c print-nfs.c \
print-icmp.c print-sl.c print-ppp.c print-rip.c \
print-snmp.c print-ntp.c print-null.c print-egp.c print-ospf.c \
diff -u usr.sbin/tcpdump.bak/addrtoname.c usr.sbin/tcpdump/addrtoname.c
--- usr.sbin/tcpdump.bak/addrtoname.c Thu May 11 16:05:39 1995
+++ usr.sbin/tcpdump/addrtoname.c Sat May 13 22:57:03 1995
@@ -35,6 +35,7 @@
#include <net/if.h>
#include <netinet/in.h>
+#include <netinet/if_arc.h>
#include <netinet/if_ether.h>
#include <arpa/inet.h>
@@ -101,6 +102,15 @@
struct protoidmem protoidtable[HASHNAMESIZE];
+struct arcnamemem {
+ u_char addr;
+ char *name;
+ struct arcnamemem *nxt;
+};
+
+struct arcnamemem arcnametable[HASHNAMESIZE];
+struct arcnamemem arcprototable[HASHNAMESIZE];
+
/*
* A faster replacement for inet_ntoa().
*/
@@ -246,6 +256,42 @@
static char hex[] = "0123456789abcdef";
+char *
+arcaddr_string(ap)
+ register u_char ap;
+{
+ register struct anamemem *tp;
+ register char *cp;
+
+ cp = (char *)malloc(sizeof("00"));
+
+ cp[0] = hex[ap >> 4];
+ cp[1] = hex[ap & 0xf];
+ cp[2] = 0;
+
+ return (cp);
+}
+
+char *
+arcproto_string(port)
+ u_char port;
+{
+ register char *cp0, *cp;
+ register struct arcnamemem *tp;
+
+ for (tp = &arcprototable[port & (HASHNAMESIZE-1)];
+ tp->nxt; tp = tp->nxt)
+ if (tp->addr == port)
+ return (tp->name);
+
+ cp0 = cp = (char *)malloc(sizeof("00"));
+
+ *cp++ = hex[port >> 4 & 0xf];
+ *cp++ = hex[port & 0xf];
+ *cp++ = '\0';
+
+ return (cp0);
+}
/* Find the hash node that corresponds the ether address 'ep'. */
@@ -539,6 +585,38 @@
endservent();
}
+struct arcproto {
+ char *s;
+ u_short p;
+} arcproto_db[] = {
+ {"oldip", 240},
+ {"oldarp", 241},
+ {"ip", 212},
+ {"arp", 213},
+ {"rarp", 214},
+ {"atalk", 221},
+ {"banian", 247},
+ {"ipx", 250},
+ {NULL, 0}
+};
+
+static void
+init_arcprotoarray(void)
+{
+ register int i;
+ register struct arcnamemem *table;
+
+ for (i=0; arcproto_db[i].s; ++i) {
+ int j = arcproto_db[i].p & (HASHNAMESIZE-1);
+ table = &arcprototable[j];
+ while (table->name)
+ table = table->nxt;
+ table->name = arcproto_db[i].s;
+ table->addr = arcproto_db[i].p;
+ table->nxt = (struct arcnamemem *)calloc(1, sizeof(*table));
+ }
+}
+
/*XXX from libbpfc.a */
extern struct eproto {
char *s;
@@ -696,6 +774,7 @@
*/
return;
+ init_arcprotoarray();
init_etherarray();
init_servarray();
init_eprotoarray();
diff -u usr.sbin/tcpdump.bak/interface.h usr.sbin/tcpdump/interface.h
--- usr.sbin/tcpdump.bak/interface.h Thu May 11 16:06:49 1995
+++ usr.sbin/tcpdump/interface.h Fri May 12 22:58:26 1995
@@ -101,6 +101,8 @@
extern void ether_if_print(u_char *, const struct pcap_pkthdr *,
const u_char *);
+extern void arc_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 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 *);
@@ -119,6 +121,7 @@
extern void bootp_print(const u_char *, int, u_short, u_short);
extern void decnet_print(const u_char *, int, int);
extern void egp_print(const u_char *, int, const u_char *);
+extern int arc_encap_print(u_short, const u_char *, int, int);
extern int ether_encap_print(u_short, const u_char *, int, int);
extern void ipx_print(const u_char *, int length);
extern void isoclns_print(const u_char *, int, int,
diff -u usr.sbin/tcpdump.bak/os.h usr.sbin/tcpdump/os.h
--- usr.sbin/tcpdump.bak/os.h Thu May 11 16:07:27 1995
+++ usr.sbin/tcpdump/os.h Fri May 12 23:02:11 1995
@@ -34,6 +34,9 @@
#define THA(ap) ((ap)->arp_tha)
#define TPA(ap) ((ap)->arp_tpa)
+#define ADST(ap) ((ap)->arc_dhost)
+#define ASRC(ap) ((ap)->arc_shost)
+
#define EDST(ep) ((ep)->ether_dhost)
#define ESRC(ep) ((ep)->ether_shost)
diff -u usr.sbin/tcpdump.bak/tcpdump.c usr.sbin/tcpdump/tcpdump.c
--- usr.sbin/tcpdump.bak/tcpdump.c Thu May 11 16:10:32 1995
+++ usr.sbin/tcpdump/tcpdump.c Fri May 12 11:09:09 1995
@@ -84,6 +84,7 @@
static struct printer printers[] = {
{ ether_if_print, DLT_EN10MB },
+ { arc_if_print, DLT_ARCNET },
{ sl_if_print, DLT_SLIP },
{ ppp_if_print, DLT_PPP },
{ fddi_if_print, DLT_FDDI },
diff -u lib/libpcap.old/gencode.c lib/libpcap/gencode.c
--- lib/libpcap.old/gencode.c Thu May 11 16:32:19 1995
+++ lib/libpcap/gencode.c Sun May 14 00:19:59 1995
@@ -34,6 +34,7 @@
#include <netinet/in.h>
#include <netinet/if_ether.h>
+#include <netinet/if_arc.h>
#include <memory.h>
#include <pcap.h>
@@ -444,6 +445,7 @@
* is set to -1 for no encapsulation, in which case, IP is assumed.
*/
static u_int off_linktype;
+static u_int size_linktype;
static u_int off_nl;
static int linktype;
#ifdef FDDI
@@ -456,8 +458,15 @@
{
linktype = type;
+ size_linktype = 2; /* for most sane protocols, but... */
switch (type) {
+ case DLT_ARCNET:
+ off_linktype = 2;
+ size_linktype = 1;
+ off_nl = 3;
+ return;
+
case DLT_EN10MB:
off_linktype = 12;
off_nl = 14;
@@ -545,8 +554,22 @@
if (proto == ETHERTYPE_IP)
proto = 0x0021; /* XXX - need ppp.h defs */
break;
+
+ case DLT_ARCNET:
+ switch(proto) { /*
+ * XXX - needs more work;
+ * especially for RFC1201
+ */
+ case ETHERTYPE_IP:
+ proto = ARCTYPE_IP_OLD;
+ break;
+ case ETHERTYPE_ARP:
+ proto = ARCTYPE_IP_OLD;
+ break;
+ }
+ break;
}
- return gen_cmp(off_linktype, BPF_H, (long)proto);
+ return gen_cmp(off_linktype, size_linktype, (long)proto);
}
static struct block *
@@ -592,6 +615,39 @@
}
static struct block *
+gen_ahostop(aaddr, dir)
+ u_char *aaddr;
+ int dir;
+{
+ struct block *b0, *b1;
+
+ switch (dir) {
+
+ case Q_SRC:
+ return gen_bcmp(0, 1, aaddr);
+
+ case Q_DST:
+ return gen_bcmp(1, 1, aaddr);
+
+ case Q_AND:
+ b0 = gen_ahostop(aaddr, Q_SRC);
+ b1 = gen_ahostop(aaddr, Q_DST);
+ gen_and(b0, b1);
+ return b1;
+
+ case Q_DEFAULT:
+ case Q_OR:
+ b0 = gen_ahostop(aaddr, Q_SRC);
+ b1 = gen_ahostop(aaddr, Q_DST);
+ gen_or(b0, b1);
+ return b1;
+ }
+ abort();
+ /* NOTREACHED */
+}
+
+
+static struct block *
gen_ehostop(eaddr, dir)
u_char *eaddr;
int dir;
@@ -821,12 +877,17 @@
case Q_RARP:
if (linktype == DLT_EN10MB)
b0 = gen_ehostop(eaddr, Q_OR);
+
+ else if (linktype == DLT_ARCNET)
+ b0 = gen_ahostop(eaddr, Q_OR);
#ifdef FDDI
else if (linktype == DLT_FDDI)
b0 = gen_fhostop(eaddr, Q_OR);
#endif
+
else
- bpf_error("'gateway' supported only on ethernet or FDDI");
+ bpf_error("'gateway' supported only on ethernet, \
+arcnet or FDDI");
b1 = gen_host(**alist++, 0xffffffffL, proto, Q_OR);
while (*alist) {
@@ -1149,6 +1210,14 @@
case Q_HOST:
if (proto == Q_LINK) {
switch (linktype) {
+#if 0 /* no /etc/arcs yet */
+ case DLT_ARCNET:
+ eaddr = pcap_arc_hostton(name);
+ if (eaddr == NULL)
+ bpf_error("unknown arc host '%s'",
+ name);
+ return gen_ahostop(eaddr, dir);
+#endif
case DLT_EN10MB:
eaddr = pcap_ether_hostton(name);
if (eaddr == NULL)
@@ -1163,7 +1232,7 @@
return gen_fhostop(eaddr, dir);
#endif
default:
- bpf_error("only ethernet/FDDI supports link-level host name");
+ bpf_error("only ether-,arcnet and FDDI support link-level host name");
break;
}
} else if (proto == Q_DECNET) {
@@ -1292,6 +1361,8 @@
struct qual q;
{
if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) {
+ if (linktype == DLT_ARCNET)
+ return gen_ahostop(eaddr, (int)q.dir);
if (linktype == DLT_EN10MB)
return gen_ehostop(eaddr, (int)q.dir);
#ifdef FDDI
@@ -1667,11 +1738,15 @@
u_long hostmask;
struct block *b0, *b1, *b2;
static u_char ebroadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ static u_char abroadcast[] = { 0x0 };
switch (proto) {
case Q_DEFAULT:
case Q_LINK:
+ if (linktype == DLT_ARCNET)
+ return gen_ahostop(abroadcast, Q_DST);
+
if (linktype == DLT_EN10MB)
return gen_ehostop(ebroadcast, Q_DST);
#ifdef FDDI
diff -u lib/libpcap.old/grammar.y lib/libpcap/grammar.y
--- lib/libpcap.old/grammar.y Thu May 11 16:33:24 1995
+++ lib/libpcap/grammar.y Sat May 13 23:54:57 1995
@@ -98,11 +98,12 @@
%token NUM INBOUND OUTBOUND
%token LINK
%token GEQ LEQ NEQ
-%token ID EID HID
+%token ID AID EID HID
%token LSH RSH
%token LEN
%type <s> ID
+%type <e> AID
%type <e> EID
%type <h> HID
%type NUM
@@ -157,6 +158,7 @@
}
}
| EID { $$.b = gen_ecode($1, $$.q = $<blk>0.q); }
+ | AID { $$.b = gen_ecode($1, $$.q = $<blk>0.q); }
| not id { gen_not($2.b); $$ = $2; }
;
not: '!' { $$ = $<blk>0; }
diff -u lib/libpcap.old/nametoaddr.c lib/libpcap/nametoaddr.c
--- lib/libpcap.old/nametoaddr.c Thu May 11 16:33:35 1995
+++ lib/libpcap/nametoaddr.c Sun May 14 00:16:22 1995
@@ -263,6 +263,26 @@
return(addr);
}
+u_char *
+pcap_arc_aton(const char *s)
+{
+ register u_char *ep;
+ register u_int d;
+
+ ep = (u_char *)malloc(1);
+
+ if (*s)
+ ++s;
+
+ d = xdtoi(*s++);
+ if (isxdigit(*s)) {
+ d <<= 4;
+ d |= xdtoi(*s);
+ }
+ *ep = d;
+ return (ep);
+}
+
/*
* Convert 's' which has the form "xx:xx:xx:xx:xx:xx" into a new
* ethernet address. Assumes 's' is well formed.
diff -u lib/libpcap.old/pcap-namedb.h lib/libpcap/pcap-namedb.h
--- lib/libpcap.old/pcap-namedb.h Thu May 11 16:34:52 1995
+++ lib/libpcap/pcap-namedb.h Sun May 14 00:17:52 1995
@@ -56,6 +56,8 @@
u_char *pcap_ether_hostton(const char*);
u_char *pcap_ether_aton(const char *);
+u_char *pcap_arc_aton(const char *);
+
u_long **pcap_nametoaddr(const char *);
u_long pcap_nametonetaddr(const char *);
diff -u lib/libpcap.old/scanner.l lib/libpcap/scanner.l
--- lib/libpcap.old/scanner.l Thu May 11 16:36:06 1995
+++ lib/libpcap/scanner.l Sat May 13 23:52:28 1995
@@ -81,6 +81,7 @@
src return SRC;
link|ether|ppp|slip return LINK;
+arc return LINK;
fddi return LINK;
arp return ARP;
rarp return RARP;
@@ -129,6 +130,8 @@
}
{B}:{B}:{B}:{B}:{B}:{B} { yylval.e = pcap_ether_aton((char *)yytext);
return EID; }
+:{B} { yylval.e = pcap_arc_aton((char *)yytext);
+ return AID; }
{B}:+({B}:+)+ { bpf_error("bogus ethernet address %s", yytext); }
[A-Za-z][-_.A-Za-z0-9]* { yylval.s = sdup((char *)yytext); return ID; }
"\\"[^ !()\n\t]+ { yylval.s = sdup((char *)yytext + 1); return ID; }
>Release-Note:
>Audit-Trail:
From: Jason Thorpe <thorpej@nas.nasa.gov>
To: gnats-bugs@gnats.netbsd.org
Cc: Subject: Re: misc/1053
Date: Sat, 30 Dec 1995 11:23:04 -0800
It would definitely be worth submitting these to the maintainters of
libpcap and tcpdump. I believe Steve McCanne <mccanne@ee.lbl.gov> is the
correct point-of-contact.
--------------------------------------------------------------------------
Jason R. Thorpe thorpej@nas.nasa.gov
NASA Ames Research Center Home: 408.866.1912
NAS: M/S 258-6 Work: 415.604.0935
Moffett Field, CA 94035 Pager: 415.428.6939
Responsible-Changed-From-To: misc-bug-people->is
Responsible-Changed-By: is
Responsible-Changed-When: Tue Mar 18 12:19:03 PST 1997
Responsible-Changed-Why:
Needs major rethink, probably, after the libpcap/tcpdump split and the
ARP over non-Ethernet implementation.
State-Changed-From-To: open->suspended
State-Changed-By: is
State-Changed-When: Fri Aug 15 09:39:08 PDT 1997
State-Changed-Why:
As pointed out above, needs major rework.
State-Changed-From-To: suspended->analyzed
State-Changed-By: is
State-Changed-When: Sun Oct 17 08:18:27 PDT 1999
State-Changed-Why:
Printing support is in the -current tree now.
(Most of) matching support needs a bitof thought about how to do variable
length link-level headers in libpcap matching code.
State-Changed-From-To: analyzed->feedback
State-Changed-By: darcy
State-Changed-When: Sun Feb 16 15:29:25 PST 2003
State-Changed-Why:
Would Ignatios or Luke like to contact the libpcap and tcpdump people or
is there something we can do on our end?
From: "Perry E. Metzger" <perry@piermont.com>
To: is@netbsd.org, itojun@itojun.org
Cc: gnats-bugs@gnats.netbsd.org, perry@piermont.com
Subject: Re: misc/1053
Date: 03 Apr 2003 21:02:14 -0500
>Synopsis: ARCnet support additions for libpcap/tcpdump
This is now eight years old.
Might I propose that the patches be cleaned up, submitted to
tcpdump.org, and that the PR be closed?
I would do this personally but I own no ARCnet equipment.
If I don't get any feedback from anyone soon I'm going to close the
PR, which would be sad.
Perry
[The followoing manually moved in by perry...]
From: itojun@iijlab.net
To: "Perry E. Metzger" <perry@piermont.com>
Cc: is@netbsd.org, gnats-bugs@gnats.netbsd.org
Subject: Re: PR misc/1053
>This is now eight years old.
>
>Might I propose that the patches be cleaned up, submitted to
>tcpdump.org, and that the PR be closed?
that seem to be fine way of dealing with it. if i remember correctly
the patch has some conflict with existing libpcap syntax.
itojun
State-Changed-From-To: feedback->closed
State-Changed-By: is
State-Changed-When: Fri Apr 4 11:37:41 PST 2003
State-Changed-Why:
Anything thats in here is in the tree (modernized to match the
tcpdump/libpcap split).
The difference is that level 3 matching is only possible for PHDS using
protocols at the moment. (While the patches only allow it for non-PHDS,
that is the old IP and ARP packets).
Code to allow matching for both is not in the PR, so we won't lose anything
significant by closing this.
I never had the time to restructure all of pcap to allow for variable
link level headers... apparently (see e.g. FDDI) noboy else bothered,
eithehr.
>Unformatted:
Ignatios Souvatzis
(Contact us)
$NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007
The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.