From 57a250cc8cb02cc97db0f58515ca37f468fc15b6 Mon Sep 17 00:00:00 2001 From: is Date: Mon, 25 Oct 1999 16:39:37 +0000 Subject: [PATCH] Add code to do link level address matching for ARCnet interfaces. ARCnet link level addresses are encoded as :HH (``:'' followed by a byte encoded in hexadecimal notation). --- lib/libpcap/gencode.c | 58 +++++++++++++++++++++++++++++++++++++++++-- lib/libpcap/gencode.h | 3 ++- lib/libpcap/grammar.y | 8 +++--- lib/libpcap/scanner.l | 6 +++-- 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/lib/libpcap/gencode.c b/lib/libpcap/gencode.c index 7cb0d7ab8c7d..895ad00cc61a 100644 --- a/lib/libpcap/gencode.c +++ b/lib/libpcap/gencode.c @@ -1,4 +1,4 @@ -/* $NetBSD: gencode.c,v 1.19 1999/10/18 19:44:12 is Exp $ */ +/* $NetBSD: gencode.c,v 1.20 1999/10/25 16:39:37 is Exp $ */ /* * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 @@ -26,7 +26,7 @@ static const char rcsid[] = "@(#) Header: gencode.c,v 1.93 97/06/12 14:22:47 leres Exp (LBL)"; #else -__RCSID("$NetBSD: gencode.c,v 1.19 1999/10/18 19:44:12 is Exp $"); +__RCSID("$NetBSD: gencode.c,v 1.20 1999/10/25 16:39:37 is Exp $"); #endif #endif @@ -155,6 +155,7 @@ static struct block *gen_hostop(bpf_u_int32, bpf_u_int32, int, int, u_int, u_int #ifdef INET6 static struct block *gen_hostop6(struct in6_addr *, struct in6_addr *, int, int, u_int, u_int); #endif +static struct block *gen_ahostop(const u_char *, int); static struct block *gen_ehostop(const u_char *, int); static struct block *gen_fhostop(const u_char *, int); static struct block *gen_dnhostop(bpf_u_int32, int, u_int); @@ -2711,6 +2712,8 @@ gen_byteop(op, idx, val) return b; } +static u_char abroadcast[] = { 0x0 }; + struct block * gen_broadcast(proto) int proto; @@ -2723,6 +2726,8 @@ gen_broadcast(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); if (linktype == DLT_FDDI) @@ -2754,6 +2759,10 @@ gen_multicast(proto) case Q_DEFAULT: case Q_LINK: + if (linktype == DLT_ARCNET) + /* all ARCnet multicasts use the same address */ + return gen_ahostop(abroadcast, Q_DST); + if (linktype == DLT_EN10MB) { /* ether[0] & 1 != 0 */ s = new_stmt(BPF_LD|BPF_B|BPF_ABS); @@ -2828,3 +2837,48 @@ gen_inbound(dir) dir); return (b0); } + +struct block * +gen_acode(eaddr, q) + register const u_char *eaddr; + 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); + } + bpf_error("ARCnet address used in non-arc expression"); + /* NOTREACHED */ +} + +static struct block * +gen_ahostop(eaddr, dir) + register const u_char *eaddr; + register int dir; +{ + register struct block *b0, *b1; + + switch (dir) { + /* src comes first, different from Ethernet */ + case Q_SRC: + return gen_bcmp(0, 1, eaddr); + + case Q_DST: + return gen_bcmp(1, 1, eaddr); + + case Q_AND: + b0 = gen_ahostop(eaddr, Q_SRC); + b1 = gen_ahostop(eaddr, Q_DST); + gen_and(b0, b1); + return b1; + + case Q_DEFAULT: + case Q_OR: + b0 = gen_ahostop(eaddr, Q_SRC); + b1 = gen_ahostop(eaddr, Q_DST); + gen_or(b0, b1); + return b1; + } + abort(); + /* NOTREACHED */ +} diff --git a/lib/libpcap/gencode.h b/lib/libpcap/gencode.h index 0193733a35e9..32e01b0deb08 100644 --- a/lib/libpcap/gencode.h +++ b/lib/libpcap/gencode.h @@ -1,4 +1,4 @@ -/* $NetBSD: gencode.h,v 1.7 1999/07/02 16:03:41 simonb Exp $ */ +/* $NetBSD: gencode.h,v 1.8 1999/10/25 16:39:37 is Exp $ */ /* * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996 @@ -166,6 +166,7 @@ struct stmt *gen_joinsp __P((struct stmt **, int)); struct block *gen_protochain __P((int, int, int)); struct block *gen_scode(const char *, struct qual); struct block *gen_ecode(const u_char *, struct qual); +struct block *gen_acode(const u_char *, struct qual); struct block *gen_mcode(const char *, const char *, int, struct qual); #ifdef INET6 struct block *gen_mcode6(const char *, const char *, int, struct qual); diff --git a/lib/libpcap/grammar.y b/lib/libpcap/grammar.y index efc247151861..d5aae95bf664 100644 --- a/lib/libpcap/grammar.y +++ b/lib/libpcap/grammar.y @@ -1,5 +1,5 @@ %{ -/* $NetBSD: grammar.y,v 1.6 1999/07/02 10:05:22 itojun Exp $ */ +/* $NetBSD: grammar.y,v 1.7 1999/10/25 16:39:37 is Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996 @@ -28,7 +28,7 @@ static const char rcsid[] = "@(#) Header: grammar.y,v 1.56 96/11/02 21:54:55 leres Exp (LBL)"; #else -__RCSID("$NetBSD: grammar.y,v 1.6 1999/07/02 10:05:22 itojun Exp $"); +__RCSID("$NetBSD: grammar.y,v 1.7 1999/10/25 16:39:37 is Exp $"); #endif #endif @@ -120,13 +120,14 @@ pcap_parse() %token NUM INBOUND OUTBOUND %token LINK %token GEQ LEQ NEQ -%token ID EID HID HID6 +%token ID EID HID HID6 AID %token LSH RSH %token LEN %token IPV6 ICMPV6 AH ESP %type ID %type EID +%type AID %type HID HID6 %type NUM @@ -198,6 +199,7 @@ nid: ID { $$.b = gen_scode($1, $$.q = $0.q); } #endif /*INET6*/ } | EID { $$.b = gen_ecode($1, $$.q = $0.q); } + | AID { $$.b = gen_acode($1, $$.q = $0.q); } | not id { gen_not($2.b); $$ = $2; } ; not: '!' { $$ = $0; } diff --git a/lib/libpcap/scanner.l b/lib/libpcap/scanner.l index ae51309e6518..e2b1d144e794 100644 --- a/lib/libpcap/scanner.l +++ b/lib/libpcap/scanner.l @@ -1,5 +1,5 @@ %{ -/* $NetBSD: scanner.l,v 1.8 1999/07/05 20:01:09 mjacob Exp $ */ +/* $NetBSD: scanner.l,v 1.9 1999/10/25 16:39:37 is Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 @@ -28,7 +28,7 @@ static const char rcsid[] = "@(#) Header: scanner.l,v 1.56 97/07/21 13:31:50 leres Exp (LBL)"; #else -__RCSID("$NetBSD: scanner.l,v 1.8 1999/07/05 20:01:09 mjacob Exp $"); +__RCSID("$NetBSD: scanner.l,v 1.9 1999/10/25 16:39:37 is Exp $"); #endif #endif @@ -151,6 +151,8 @@ outbound return OUTBOUND; "==" return '='; "<<" return LSH; ">>" return RSH; +:{B} { yylval.e = pcap_ether_aton(((char *)yytext)+1); + return AID; } {N} { yylval.i = stoi((char *)yytext); return NUM; } ({N}\.{N})|({N}\.{N}\.{N})|({N}\.{N}\.{N}\.{N}) { yylval.s = sdup((char *)yytext); return HID; }