xref: /freebsd/contrib/libpcap/gencode.c (revision 8cdcfdf3ab38f4de1d219131feaacc1d036e02d4)
1 /*#define CHASE_CHAIN*/
2 /*
3  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
4  *	The Regents of the University of California.  All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that: (1) source code distributions
8  * retain the above copyright notice and this paragraph in its entirety, (2)
9  * distributions including binary code include the above copyright notice and
10  * this paragraph in its entirety in the documentation or other materials
11  * provided with the distribution, and (3) all advertising materials mentioning
12  * features or use of this software display the following acknowledgement:
13  * ``This product includes software developed by the University of California,
14  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
15  * the University nor the names of its contributors may be used to endorse
16  * or promote products derived from this software without specific prior
17  * written permission.
18  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21  *
22  * $FreeBSD$
23  */
24 #ifndef lint
25 static const char rcsid[] _U_ =
26     "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.221 2005/03/27 22:10:23 guy Exp $ (LBL)";
27 #endif
28 
29 #ifdef HAVE_CONFIG_H
30 #include "config.h"
31 #endif
32 
33 #ifdef WIN32
34 #include <pcap-stdinc.h>
35 #else /* WIN32 */
36 #include <sys/types.h>
37 #include <sys/socket.h>
38 #endif /* WIN32 */
39 
40 /*
41  * XXX - why was this included even on UNIX?
42  */
43 #ifdef __MINGW32__
44 #include "IP6_misc.h"
45 #endif
46 
47 #ifndef WIN32
48 
49 #ifdef __NetBSD__
50 #include <sys/param.h>
51 #endif
52 
53 #include <netinet/in.h>
54 
55 #endif /* WIN32 */
56 
57 #include <stdlib.h>
58 #include <string.h>
59 #include <memory.h>
60 #include <setjmp.h>
61 #include <stdarg.h>
62 
63 #ifdef MSDOS
64 #include "pcap-dos.h"
65 #endif
66 
67 #include "pcap-int.h"
68 
69 #include "ethertype.h"
70 #include "nlpid.h"
71 #include "llc.h"
72 #include "gencode.h"
73 #include "atmuni31.h"
74 #include "sunatmpos.h"
75 #include "ppp.h"
76 #include "sll.h"
77 #include "arcnet.h"
78 #include "pf.h"
79 #ifndef offsetof
80 #define offsetof(s, e) ((size_t)&((s *)0)->e)
81 #endif
82 #ifdef INET6
83 #ifndef WIN32
84 #include <netdb.h>	/* for "struct addrinfo" */
85 #endif /* WIN32 */
86 #endif /*INET6*/
87 #include <pcap-namedb.h>
88 
89 #undef ETHERMTU
90 #define ETHERMTU	1500
91 
92 #ifndef IPPROTO_SCTP
93 #define IPPROTO_SCTP 132
94 #endif
95 
96 #ifdef HAVE_OS_PROTO_H
97 #include "os-proto.h"
98 #endif
99 
100 #define JMP(c) ((c)|BPF_JMP|BPF_K)
101 
102 /* Locals */
103 static jmp_buf top_ctx;
104 static pcap_t *bpf_pcap;
105 
106 /* Hack for updating VLAN, MPLS offsets. */
107 static u_int	orig_linktype = -1U, orig_nl = -1U, orig_nl_nosnap = -1U;
108 
109 /* XXX */
110 #ifdef PCAP_FDDIPAD
111 static int	pcap_fddipad;
112 #endif
113 
114 /* VARARGS */
115 void
116 bpf_error(const char *fmt, ...)
117 
118 {
119 	va_list ap;
120 
121 	va_start(ap, fmt);
122 	if (bpf_pcap != NULL)
123 		(void)vsnprintf(pcap_geterr(bpf_pcap), PCAP_ERRBUF_SIZE,
124 		    fmt, ap);
125 	va_end(ap);
126 	longjmp(top_ctx, 1);
127 	/* NOTREACHED */
128 }
129 
130 static void init_linktype(pcap_t *);
131 
132 static int alloc_reg(void);
133 static void free_reg(int);
134 
135 static struct block *root;
136 
137 /*
138  * We divy out chunks of memory rather than call malloc each time so
139  * we don't have to worry about leaking memory.  It's probably
140  * not a big deal if all this memory was wasted but if this ever
141  * goes into a library that would probably not be a good idea.
142  *
143  * XXX - this *is* in a library....
144  */
145 #define NCHUNKS 16
146 #define CHUNK0SIZE 1024
147 struct chunk {
148 	u_int n_left;
149 	void *m;
150 };
151 
152 static struct chunk chunks[NCHUNKS];
153 static int cur_chunk;
154 
155 static void *newchunk(u_int);
156 static void freechunks(void);
157 static inline struct block *new_block(int);
158 static inline struct slist *new_stmt(int);
159 static struct block *gen_retblk(int);
160 static inline void syntax(void);
161 
162 static void backpatch(struct block *, struct block *);
163 static void merge(struct block *, struct block *);
164 static struct block *gen_cmp(u_int, u_int, bpf_int32);
165 static struct block *gen_cmp_gt(u_int, u_int, bpf_int32);
166 static struct block *gen_mcmp(u_int, u_int, bpf_int32, bpf_u_int32);
167 static struct block *gen_bcmp(u_int, u_int, const u_char *);
168 static struct block *gen_ncmp(bpf_u_int32, bpf_u_int32, bpf_u_int32,
169     bpf_u_int32, bpf_u_int32, int);
170 static struct block *gen_uncond(int);
171 static inline struct block *gen_true(void);
172 static inline struct block *gen_false(void);
173 static struct block *gen_ether_linktype(int);
174 static struct block *gen_linux_sll_linktype(int);
175 static struct block *gen_linktype(int);
176 static struct block *gen_snap(bpf_u_int32, bpf_u_int32, u_int);
177 static struct block *gen_llc(int);
178 static struct block *gen_hostop(bpf_u_int32, bpf_u_int32, int, int, u_int, u_int);
179 #ifdef INET6
180 static struct block *gen_hostop6(struct in6_addr *, struct in6_addr *, int, int, u_int, u_int);
181 #endif
182 static struct block *gen_ahostop(const u_char *, int);
183 static struct block *gen_ehostop(const u_char *, int);
184 static struct block *gen_fhostop(const u_char *, int);
185 static struct block *gen_thostop(const u_char *, int);
186 static struct block *gen_wlanhostop(const u_char *, int);
187 static struct block *gen_ipfchostop(const u_char *, int);
188 static struct block *gen_dnhostop(bpf_u_int32, int, u_int);
189 static struct block *gen_host(bpf_u_int32, bpf_u_int32, int, int);
190 #ifdef INET6
191 static struct block *gen_host6(struct in6_addr *, struct in6_addr *, int, int);
192 #endif
193 #ifndef INET6
194 static struct block *gen_gateway(const u_char *, bpf_u_int32 **, int, int);
195 #endif
196 static struct block *gen_ipfrag(void);
197 static struct block *gen_portatom(int, bpf_int32);
198 #ifdef INET6
199 static struct block *gen_portatom6(int, bpf_int32);
200 #endif
201 struct block *gen_portop(int, int, int);
202 static struct block *gen_port(int, int, int);
203 #ifdef INET6
204 struct block *gen_portop6(int, int, int);
205 static struct block *gen_port6(int, int, int);
206 #endif
207 static int lookup_proto(const char *, int);
208 static struct block *gen_protochain(int, int, int);
209 static struct block *gen_proto(int, int, int);
210 static struct slist *xfer_to_x(struct arth *);
211 static struct slist *xfer_to_a(struct arth *);
212 static struct block *gen_mac_multicast(int);
213 static struct block *gen_len(int, int);
214 
215 static struct block *gen_msg_abbrev(int type);
216 
217 static void *
218 newchunk(n)
219 	u_int n;
220 {
221 	struct chunk *cp;
222 	int k;
223 	size_t size;
224 
225 #ifndef __NetBSD__
226 	/* XXX Round up to nearest long. */
227 	n = (n + sizeof(long) - 1) & ~(sizeof(long) - 1);
228 #else
229 	/* XXX Round up to structure boundary. */
230 	n = ALIGN(n);
231 #endif
232 
233 	cp = &chunks[cur_chunk];
234 	if (n > cp->n_left) {
235 		++cp, k = ++cur_chunk;
236 		if (k >= NCHUNKS)
237 			bpf_error("out of memory");
238 		size = CHUNK0SIZE << k;
239 		cp->m = (void *)malloc(size);
240 		if (cp->m == NULL)
241 			bpf_error("out of memory");
242 		memset((char *)cp->m, 0, size);
243 		cp->n_left = size;
244 		if (n > size)
245 			bpf_error("out of memory");
246 	}
247 	cp->n_left -= n;
248 	return (void *)((char *)cp->m + cp->n_left);
249 }
250 
251 static void
252 freechunks()
253 {
254 	int i;
255 
256 	cur_chunk = 0;
257 	for (i = 0; i < NCHUNKS; ++i)
258 		if (chunks[i].m != NULL) {
259 			free(chunks[i].m);
260 			chunks[i].m = NULL;
261 		}
262 }
263 
264 /*
265  * A strdup whose allocations are freed after code generation is over.
266  */
267 char *
268 sdup(s)
269 	register const char *s;
270 {
271 	int n = strlen(s) + 1;
272 	char *cp = newchunk(n);
273 
274 	strlcpy(cp, s, n);
275 	return (cp);
276 }
277 
278 static inline struct block *
279 new_block(code)
280 	int code;
281 {
282 	struct block *p;
283 
284 	p = (struct block *)newchunk(sizeof(*p));
285 	p->s.code = code;
286 	p->head = p;
287 
288 	return p;
289 }
290 
291 static inline struct slist *
292 new_stmt(code)
293 	int code;
294 {
295 	struct slist *p;
296 
297 	p = (struct slist *)newchunk(sizeof(*p));
298 	p->s.code = code;
299 
300 	return p;
301 }
302 
303 static struct block *
304 gen_retblk(v)
305 	int v;
306 {
307 	struct block *b = new_block(BPF_RET|BPF_K);
308 
309 	b->s.k = v;
310 	return b;
311 }
312 
313 static inline void
314 syntax()
315 {
316 	bpf_error("syntax error in filter expression");
317 }
318 
319 static bpf_u_int32 netmask;
320 static int snaplen;
321 int no_optimize;
322 
323 int
324 pcap_compile(pcap_t *p, struct bpf_program *program,
325 	     char *buf, int optimize, bpf_u_int32 mask)
326 {
327 	extern int n_errors;
328 	int len;
329 
330 	no_optimize = 0;
331 	n_errors = 0;
332 	root = NULL;
333 	bpf_pcap = p;
334 	if (setjmp(top_ctx)) {
335 		lex_cleanup();
336 		freechunks();
337 		return (-1);
338 	}
339 
340 	netmask = mask;
341 
342 	snaplen = pcap_snapshot(p);
343 	if (snaplen == 0) {
344 		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
345 			 "snaplen of 0 rejects all packets");
346 		return -1;
347 	}
348 
349 	lex_init(buf ? buf : "");
350 	init_linktype(p);
351 	(void)pcap_parse();
352 
353 	if (n_errors)
354 		syntax();
355 
356 	if (root == NULL)
357 		root = gen_retblk(snaplen);
358 
359 	if (optimize && !no_optimize) {
360 		bpf_optimize(&root);
361 		if (root == NULL ||
362 		    (root->s.code == (BPF_RET|BPF_K) && root->s.k == 0))
363 			bpf_error("expression rejects all packets");
364 	}
365 	program->bf_insns = icode_to_fcode(root, &len);
366 	program->bf_len = len;
367 
368 	lex_cleanup();
369 	freechunks();
370 	return (0);
371 }
372 
373 /*
374  * entry point for using the compiler with no pcap open
375  * pass in all the stuff that is needed explicitly instead.
376  */
377 int
378 pcap_compile_nopcap(int snaplen_arg, int linktype_arg,
379 		    struct bpf_program *program,
380 	     char *buf, int optimize, bpf_u_int32 mask)
381 {
382 	pcap_t *p;
383 	int ret;
384 
385 	p = pcap_open_dead(linktype_arg, snaplen_arg);
386 	if (p == NULL)
387 		return (-1);
388 	ret = pcap_compile(p, program, buf, optimize, mask);
389 	pcap_close(p);
390 	return (ret);
391 }
392 
393 /*
394  * Clean up a "struct bpf_program" by freeing all the memory allocated
395  * in it.
396  */
397 void
398 pcap_freecode(struct bpf_program *program)
399 {
400 	program->bf_len = 0;
401 	if (program->bf_insns != NULL) {
402 		free((char *)program->bf_insns);
403 		program->bf_insns = NULL;
404 	}
405 }
406 
407 /*
408  * Backpatch the blocks in 'list' to 'target'.  The 'sense' field indicates
409  * which of the jt and jf fields has been resolved and which is a pointer
410  * back to another unresolved block (or nil).  At least one of the fields
411  * in each block is already resolved.
412  */
413 static void
414 backpatch(list, target)
415 	struct block *list, *target;
416 {
417 	struct block *next;
418 
419 	while (list) {
420 		if (!list->sense) {
421 			next = JT(list);
422 			JT(list) = target;
423 		} else {
424 			next = JF(list);
425 			JF(list) = target;
426 		}
427 		list = next;
428 	}
429 }
430 
431 /*
432  * Merge the lists in b0 and b1, using the 'sense' field to indicate
433  * which of jt and jf is the link.
434  */
435 static void
436 merge(b0, b1)
437 	struct block *b0, *b1;
438 {
439 	register struct block **p = &b0;
440 
441 	/* Find end of list. */
442 	while (*p)
443 		p = !((*p)->sense) ? &JT(*p) : &JF(*p);
444 
445 	/* Concatenate the lists. */
446 	*p = b1;
447 }
448 
449 void
450 finish_parse(p)
451 	struct block *p;
452 {
453 	backpatch(p, gen_retblk(snaplen));
454 	p->sense = !p->sense;
455 	backpatch(p, gen_retblk(0));
456 	root = p->head;
457 }
458 
459 void
460 gen_and(b0, b1)
461 	struct block *b0, *b1;
462 {
463 	backpatch(b0, b1->head);
464 	b0->sense = !b0->sense;
465 	b1->sense = !b1->sense;
466 	merge(b1, b0);
467 	b1->sense = !b1->sense;
468 	b1->head = b0->head;
469 }
470 
471 void
472 gen_or(b0, b1)
473 	struct block *b0, *b1;
474 {
475 	b0->sense = !b0->sense;
476 	backpatch(b0, b1->head);
477 	b0->sense = !b0->sense;
478 	merge(b1, b0);
479 	b1->head = b0->head;
480 }
481 
482 void
483 gen_not(b)
484 	struct block *b;
485 {
486 	b->sense = !b->sense;
487 }
488 
489 static struct block *
490 gen_cmp(offset, size, v)
491 	u_int offset, size;
492 	bpf_int32 v;
493 {
494 	struct slist *s;
495 	struct block *b;
496 
497 	s = new_stmt(BPF_LD|BPF_ABS|size);
498 	s->s.k = offset;
499 
500 	b = new_block(JMP(BPF_JEQ));
501 	b->stmts = s;
502 	b->s.k = v;
503 
504 	return b;
505 }
506 
507 static struct block *
508 gen_cmp_gt(offset, size, v)
509 	u_int offset, size;
510 	bpf_int32 v;
511 {
512 	struct slist *s;
513 	struct block *b;
514 
515 	s = new_stmt(BPF_LD|BPF_ABS|size);
516 	s->s.k = offset;
517 
518 	b = new_block(JMP(BPF_JGT));
519 	b->stmts = s;
520 	b->s.k = v;
521 
522 	return b;
523 }
524 
525 static struct block *
526 gen_mcmp(offset, size, v, mask)
527 	u_int offset, size;
528 	bpf_int32 v;
529 	bpf_u_int32 mask;
530 {
531 	struct block *b = gen_cmp(offset, size, v);
532 	struct slist *s;
533 
534 	if (mask != 0xffffffff) {
535 		s = new_stmt(BPF_ALU|BPF_AND|BPF_K);
536 		s->s.k = mask;
537 		b->stmts->next = s;
538 	}
539 	return b;
540 }
541 
542 static struct block *
543 gen_bcmp(offset, size, v)
544 	register u_int offset, size;
545 	register const u_char *v;
546 {
547 	register struct block *b, *tmp;
548 
549 	b = NULL;
550 	while (size >= 4) {
551 		register const u_char *p = &v[size - 4];
552 		bpf_int32 w = ((bpf_int32)p[0] << 24) |
553 		    ((bpf_int32)p[1] << 16) | ((bpf_int32)p[2] << 8) | p[3];
554 
555 		tmp = gen_cmp(offset + size - 4, BPF_W, w);
556 		if (b != NULL)
557 			gen_and(b, tmp);
558 		b = tmp;
559 		size -= 4;
560 	}
561 	while (size >= 2) {
562 		register const u_char *p = &v[size - 2];
563 		bpf_int32 w = ((bpf_int32)p[0] << 8) | p[1];
564 
565 		tmp = gen_cmp(offset + size - 2, BPF_H, w);
566 		if (b != NULL)
567 			gen_and(b, tmp);
568 		b = tmp;
569 		size -= 2;
570 	}
571 	if (size > 0) {
572 		tmp = gen_cmp(offset, BPF_B, (bpf_int32)v[0]);
573 		if (b != NULL)
574 			gen_and(b, tmp);
575 		b = tmp;
576 	}
577 	return b;
578 }
579 
580 static struct block *
581 gen_ncmp(datasize, offset, mask, jtype, jvalue, reverse)
582 	bpf_u_int32 datasize, offset, mask, jtype, jvalue;
583 	int reverse;
584 {
585 	struct slist *s;
586 	struct block *b;
587 
588 	s = new_stmt(BPF_LD|datasize|BPF_ABS);
589 	s->s.k = offset;
590 
591 	if (mask != 0xffffffff) {
592 		s->next = new_stmt(BPF_ALU|BPF_AND|BPF_K);
593 		s->next->s.k = mask;
594 	}
595 
596 	b = new_block(JMP(jtype));
597 	b->stmts = s;
598 	b->s.k = jvalue;
599 	if (reverse && (jtype == BPF_JGT || jtype == BPF_JGE))
600 		gen_not(b);
601 	return b;
602 }
603 
604 /*
605  * Various code constructs need to know the layout of the data link
606  * layer.  These variables give the necessary offsets.
607  */
608 
609 /*
610  * This is the offset of the beginning of the MAC-layer header.
611  * It's usually 0, except for ATM LANE.
612  */
613 static u_int off_mac;
614 
615 /*
616  * "off_linktype" is the offset to information in the link-layer header
617  * giving the packet type.
618  *
619  * For Ethernet, it's the offset of the Ethernet type field.
620  *
621  * For link-layer types that always use 802.2 headers, it's the
622  * offset of the LLC header.
623  *
624  * For PPP, it's the offset of the PPP type field.
625  *
626  * For Cisco HDLC, it's the offset of the CHDLC type field.
627  *
628  * For BSD loopback, it's the offset of the AF_ value.
629  *
630  * For Linux cooked sockets, it's the offset of the type field.
631  *
632  * It's set to -1 for no encapsulation, in which case, IP is assumed.
633  */
634 static u_int off_linktype;
635 
636 /*
637  * TRUE if the link layer includes an ATM pseudo-header.
638  */
639 static int is_atm = 0;
640 
641 /*
642  * TRUE if "lane" appeared in the filter; it causes us to generate
643  * code that assumes LANE rather than LLC-encapsulated traffic in SunATM.
644  */
645 static int is_lane = 0;
646 
647 /*
648  * These are offsets for the ATM pseudo-header.
649  */
650 static u_int off_vpi;
651 static u_int off_vci;
652 static u_int off_proto;
653 
654 /*
655  * This is the offset of the first byte after the ATM pseudo_header,
656  * or -1 if there is no ATM pseudo-header.
657  */
658 static u_int off_payload;
659 
660 /*
661  * These are offsets to the beginning of the network-layer header.
662  *
663  * If the link layer never uses 802.2 LLC:
664  *
665  *	"off_nl" and "off_nl_nosnap" are the same.
666  *
667  * If the link layer always uses 802.2 LLC:
668  *
669  *	"off_nl" is the offset if there's a SNAP header following
670  *	the 802.2 header;
671  *
672  *	"off_nl_nosnap" is the offset if there's no SNAP header.
673  *
674  * If the link layer is Ethernet:
675  *
676  *	"off_nl" is the offset if the packet is an Ethernet II packet
677  *	(we assume no 802.3+802.2+SNAP);
678  *
679  *	"off_nl_nosnap" is the offset if the packet is an 802.3 packet
680  *	with an 802.2 header following it.
681  */
682 static u_int off_nl;
683 static u_int off_nl_nosnap;
684 
685 static int linktype;
686 
687 static void
688 init_linktype(p)
689 	pcap_t *p;
690 {
691 	linktype = pcap_datalink(p);
692 #ifdef PCAP_FDDIPAD
693 	pcap_fddipad = p->fddipad;
694 #endif
695 
696 	/*
697 	 * Assume it's not raw ATM with a pseudo-header, for now.
698 	 */
699 	off_mac = 0;
700 	is_atm = 0;
701 	is_lane = 0;
702 	off_vpi = -1;
703 	off_vci = -1;
704 	off_proto = -1;
705 	off_payload = -1;
706 
707 	orig_linktype = -1;
708 	orig_nl = -1;
709 	orig_nl_nosnap = -1;
710 
711 	switch (linktype) {
712 
713 	case DLT_ARCNET:
714 		off_linktype = 2;
715 		off_nl = 6;		/* XXX in reality, variable! */
716 		off_nl_nosnap = 6;	/* no 802.2 LLC */
717 		return;
718 
719 	case DLT_ARCNET_LINUX:
720 		off_linktype = 4;
721 		off_nl = 8;		/* XXX in reality, variable! */
722 		off_nl_nosnap = 8;	/* no 802.2 LLC */
723 		return;
724 
725 	case DLT_EN10MB:
726 		off_linktype = 12;
727 		off_nl = 14;		/* Ethernet II */
728 		off_nl_nosnap = 17;	/* 802.3+802.2 */
729 		return;
730 
731 	case DLT_SLIP:
732 		/*
733 		 * SLIP doesn't have a link level type.  The 16 byte
734 		 * header is hacked into our SLIP driver.
735 		 */
736 		off_linktype = -1;
737 		off_nl = 16;
738 		off_nl_nosnap = 16;	/* no 802.2 LLC */
739 		return;
740 
741 	case DLT_SLIP_BSDOS:
742 		/* XXX this may be the same as the DLT_PPP_BSDOS case */
743 		off_linktype = -1;
744 		/* XXX end */
745 		off_nl = 24;
746 		off_nl_nosnap = 24;	/* no 802.2 LLC */
747 		return;
748 
749 	case DLT_NULL:
750 	case DLT_LOOP:
751 		off_linktype = 0;
752 		off_nl = 4;
753 		off_nl_nosnap = 4;	/* no 802.2 LLC */
754 		return;
755 
756 	case DLT_ENC:
757 		off_linktype = 0;
758 		off_nl = 12;
759 		off_nl_nosnap = 12;	/* no 802.2 LLC */
760 		return;
761 
762 	case DLT_PPP:
763 	case DLT_PPP_PPPD:
764 	case DLT_C_HDLC:		/* BSD/OS Cisco HDLC */
765 	case DLT_PPP_SERIAL:		/* NetBSD sync/async serial PPP */
766 		off_linktype = 2;
767 		off_nl = 4;
768 		off_nl_nosnap = 4;	/* no 802.2 LLC */
769 		return;
770 
771 	case DLT_PPP_ETHER:
772 		/*
773 		 * This does no include the Ethernet header, and
774 		 * only covers session state.
775 		 */
776 		off_linktype = 6;
777 		off_nl = 8;
778 		off_nl_nosnap = 8;	/* no 802.2 LLC */
779 		return;
780 
781 	case DLT_PPP_BSDOS:
782 		off_linktype = 5;
783 		off_nl = 24;
784 		off_nl_nosnap = 24;	/* no 802.2 LLC */
785 		return;
786 
787 	case DLT_FDDI:
788 		/*
789 		 * FDDI doesn't really have a link-level type field.
790 		 * We set "off_linktype" to the offset of the LLC header.
791 		 *
792 		 * To check for Ethernet types, we assume that SSAP = SNAP
793 		 * is being used and pick out the encapsulated Ethernet type.
794 		 * XXX - should we generate code to check for SNAP?
795 		 */
796 		off_linktype = 13;
797 #ifdef PCAP_FDDIPAD
798 		off_linktype += pcap_fddipad;
799 #endif
800 		off_nl = 21;		/* FDDI+802.2+SNAP */
801 		off_nl_nosnap = 16;	/* FDDI+802.2 */
802 #ifdef PCAP_FDDIPAD
803 		off_nl += pcap_fddipad;
804 		off_nl_nosnap += pcap_fddipad;
805 #endif
806 		return;
807 
808 	case DLT_IEEE802:
809 		/*
810 		 * Token Ring doesn't really have a link-level type field.
811 		 * We set "off_linktype" to the offset of the LLC header.
812 		 *
813 		 * To check for Ethernet types, we assume that SSAP = SNAP
814 		 * is being used and pick out the encapsulated Ethernet type.
815 		 * XXX - should we generate code to check for SNAP?
816 		 *
817 		 * XXX - the header is actually variable-length.
818 		 * Some various Linux patched versions gave 38
819 		 * as "off_linktype" and 40 as "off_nl"; however,
820 		 * if a token ring packet has *no* routing
821 		 * information, i.e. is not source-routed, the correct
822 		 * values are 20 and 22, as they are in the vanilla code.
823 		 *
824 		 * A packet is source-routed iff the uppermost bit
825 		 * of the first byte of the source address, at an
826 		 * offset of 8, has the uppermost bit set.  If the
827 		 * packet is source-routed, the total number of bytes
828 		 * of routing information is 2 plus bits 0x1F00 of
829 		 * the 16-bit value at an offset of 14 (shifted right
830 		 * 8 - figure out which byte that is).
831 		 */
832 		off_linktype = 14;
833 		off_nl = 22;		/* Token Ring+802.2+SNAP */
834 		off_nl_nosnap = 17;	/* Token Ring+802.2 */
835 		return;
836 
837 	case DLT_IEEE802_11:
838 		/*
839 		 * 802.11 doesn't really have a link-level type field.
840 		 * We set "off_linktype" to the offset of the LLC header.
841 		 *
842 		 * To check for Ethernet types, we assume that SSAP = SNAP
843 		 * is being used and pick out the encapsulated Ethernet type.
844 		 * XXX - should we generate code to check for SNAP?
845 		 *
846 		 * XXX - the header is actually variable-length.  We
847 		 * assume a 24-byte link-layer header, as appears in
848 		 * data frames in networks with no bridges.  If the
849 		 * fromds and tods 802.11 header bits are both set,
850 		 * it's actually supposed to be 30 bytes.
851 		 */
852 		off_linktype = 24;
853 		off_nl = 32;		/* 802.11+802.2+SNAP */
854 		off_nl_nosnap = 27;	/* 802.11+802.2 */
855 		return;
856 
857 	case DLT_PRISM_HEADER:
858 		/*
859 		 * Same as 802.11, but with an additional header before
860 		 * the 802.11 header, containing a bunch of additional
861 		 * information including radio-level information.
862 		 *
863 		 * The header is 144 bytes long.
864 		 *
865 		 * XXX - same variable-length header problem; at least
866 		 * the Prism header is fixed-length.
867 		 */
868 		off_linktype = 144+24;
869 		off_nl = 144+32;	/* Prism+802.11+802.2+SNAP */
870 		off_nl_nosnap = 144+27;	/* Prism+802.11+802.2 */
871 		return;
872 
873 	case DLT_IEEE802_11_RADIO_AVS:
874 		/*
875 		 * Same as 802.11, but with an additional header before
876 		 * the 802.11 header, containing a bunch of additional
877 		 * information including radio-level information.
878 		 *
879 		 * The header is 64 bytes long, at least in its
880 		 * current incarnation.
881 		 *
882 		 * XXX - same variable-length header problem, only
883 		 * more so; this header is also variable-length,
884 		 * with the length being the 32-bit big-endian
885 		 * number at an offset of 4 from the beginning
886 		 * of the radio header.
887 		 */
888 		off_linktype = 64+24;
889 		off_nl = 64+32;		/* Radio+802.11+802.2+SNAP */
890 		off_nl_nosnap = 64+27;	/* Radio+802.11+802.2 */
891 		return;
892 
893 	case DLT_IEEE802_11_RADIO:
894 		/*
895 		 * Same as 802.11, but with an additional header before
896 		 * the 802.11 header, containing a bunch of additional
897 		 * information including radio-level information.
898 		 *
899 		 * XXX - same variable-length header problem, only
900 		 * even *more* so; this header is also variable-length,
901 		 * with the length being the 16-bit number at an offset
902 		 * of 2 from the beginning of the radio header, and it's
903 		 * device-dependent (different devices might supply
904 		 * different amounts of information), so we can't even
905 		 * assume a fixed length for the current version of the
906 		 * header.
907 		 *
908 		 * Therefore, currently, only raw "link[N:M]" filtering is
909 		 * supported.
910 		 */
911 		off_linktype = -1;
912 		off_nl = -1;
913 		off_nl_nosnap = -1;
914 		return;
915 
916 	case DLT_ATM_RFC1483:
917 	case DLT_ATM_CLIP:	/* Linux ATM defines this */
918 		/*
919 		 * assume routed, non-ISO PDUs
920 		 * (i.e., LLC = 0xAA-AA-03, OUT = 0x00-00-00)
921 		 */
922 		off_linktype = 0;
923 		off_nl = 8;		/* 802.2+SNAP */
924 		off_nl_nosnap = 3;	/* 802.2 */
925 		return;
926 
927 	case DLT_SUNATM:
928 		/*
929 		 * Full Frontal ATM; you get AALn PDUs with an ATM
930 		 * pseudo-header.
931 		 */
932 		is_atm = 1;
933 		off_vpi = SUNATM_VPI_POS;
934 		off_vci = SUNATM_VCI_POS;
935 		off_proto = PROTO_POS;
936 		off_mac = -1;	/* LLC-encapsulated, so no MAC-layer header */
937 		off_payload = SUNATM_PKT_BEGIN_POS;
938 		off_linktype = off_payload;
939 		off_nl = off_payload+8;		/* 802.2+SNAP */
940 		off_nl_nosnap = off_payload+3;	/* 802.2 */
941 		return;
942 
943 	case DLT_RAW:
944 		off_linktype = -1;
945 		off_nl = 0;
946 		off_nl_nosnap = 0;	/* no 802.2 LLC */
947 		return;
948 
949 	case DLT_LINUX_SLL:	/* fake header for Linux cooked socket */
950 		off_linktype = 14;
951 		off_nl = 16;
952 		off_nl_nosnap = 16;	/* no 802.2 LLC */
953 		return;
954 
955 	case DLT_LTALK:
956 		/*
957 		 * LocalTalk does have a 1-byte type field in the LLAP header,
958 		 * but really it just indicates whether there is a "short" or
959 		 * "long" DDP packet following.
960 		 */
961 		off_linktype = -1;
962 		off_nl = 0;
963 		off_nl_nosnap = 0;	/* no 802.2 LLC */
964 		return;
965 
966 	case DLT_IP_OVER_FC:
967 		/*
968 		 * RFC 2625 IP-over-Fibre-Channel doesn't really have a
969 		 * link-level type field.  We set "off_linktype" to the
970 		 * offset of the LLC header.
971 		 *
972 		 * To check for Ethernet types, we assume that SSAP = SNAP
973 		 * is being used and pick out the encapsulated Ethernet type.
974 		 * XXX - should we generate code to check for SNAP? RFC
975 		 * 2625 says SNAP should be used.
976 		 */
977 		off_linktype = 16;
978 		off_nl = 24;		/* IPFC+802.2+SNAP */
979 		off_nl_nosnap = 19;	/* IPFC+802.2 */
980 		return;
981 
982 	case DLT_FRELAY:
983 		/*
984 		 * XXX - we should set this to handle SNAP-encapsulated
985 		 * frames (NLPID of 0x80).
986 		 */
987 		off_linktype = -1;
988 		off_nl = 0;
989 		off_nl_nosnap = 0;	/* no 802.2 LLC */
990 		return;
991 
992 	case DLT_APPLE_IP_OVER_IEEE1394:
993 		off_linktype = 16;
994 		off_nl = 18;
995 		off_nl_nosnap = 0;	/* no 802.2 LLC */
996 		return;
997 
998 	case DLT_LINUX_IRDA:
999 		/*
1000 		 * Currently, only raw "link[N:M]" filtering is supported.
1001 		 */
1002 		off_linktype = -1;
1003 		off_nl = -1;
1004 		off_nl_nosnap = -1;
1005 		return;
1006 
1007 	case DLT_DOCSIS:
1008 		/*
1009 		 * Currently, only raw "link[N:M]" filtering is supported.
1010 		 */
1011 		off_linktype = -1;
1012 		off_nl = -1;
1013 		off_nl_nosnap = -1;
1014 		return;
1015 
1016 	case DLT_SYMANTEC_FIREWALL:
1017 		off_linktype = 6;
1018 		off_nl = 44;		/* Ethernet II */
1019 		off_nl_nosnap = 44;	/* XXX - what does it do with 802.3 packets? */
1020 		return;
1021 
1022 	case DLT_PFLOG:
1023 		off_linktype = 0;
1024 		/* XXX read from header? */
1025 		off_nl = PFLOG_HDRLEN;
1026 		off_nl_nosnap = PFLOG_HDRLEN;
1027 		return;
1028 
1029         case DLT_JUNIPER_MLFR:
1030         case DLT_JUNIPER_MLPPP:
1031                 off_linktype = 4;
1032 		off_nl = 4;
1033 		off_nl_nosnap = -1;
1034                 return;
1035 
1036 	case DLT_JUNIPER_ATM1:
1037 		off_linktype = 4; /* in reality variable between 4-8 */
1038 		off_nl = 4;
1039 		off_nl_nosnap = 14;
1040 		return;
1041 
1042 	case DLT_JUNIPER_ATM2:
1043 		off_linktype = 8; /* in reality variable between 8-12 */
1044 		off_nl = 8;
1045 		off_nl_nosnap = 18;
1046 		return;
1047 
1048 #ifdef DLT_PFSYNC
1049 	case DLT_PFSYNC:
1050 		off_linktype = -1;
1051 		off_nl = 4;
1052 		off_nl_nosnap = 4;
1053 		return;
1054 #endif
1055 	}
1056 	bpf_error("unknown data link type %d", linktype);
1057 	/* NOTREACHED */
1058 }
1059 
1060 static struct block *
1061 gen_uncond(rsense)
1062 	int rsense;
1063 {
1064 	struct block *b;
1065 	struct slist *s;
1066 
1067 	s = new_stmt(BPF_LD|BPF_IMM);
1068 	s->s.k = !rsense;
1069 	b = new_block(JMP(BPF_JEQ));
1070 	b->stmts = s;
1071 
1072 	return b;
1073 }
1074 
1075 static inline struct block *
1076 gen_true()
1077 {
1078 	return gen_uncond(1);
1079 }
1080 
1081 static inline struct block *
1082 gen_false()
1083 {
1084 	return gen_uncond(0);
1085 }
1086 
1087 /*
1088  * Byte-swap a 32-bit number.
1089  * ("htonl()" or "ntohl()" won't work - we want to byte-swap even on
1090  * big-endian platforms.)
1091  */
1092 #define	SWAPLONG(y) \
1093 ((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff))
1094 
1095 static struct block *
1096 gen_ether_linktype(proto)
1097 	register int proto;
1098 {
1099 	struct block *b0, *b1;
1100 
1101 	switch (proto) {
1102 
1103 	case LLCSAP_ISONS:
1104 		/*
1105 		 * OSI protocols always use 802.2 encapsulation.
1106 		 * XXX - should we check both the DSAP and the
1107 		 * SSAP, like this, or should we check just the
1108 		 * DSAP?
1109 		 */
1110 		b0 = gen_cmp_gt(off_linktype, BPF_H, ETHERMTU);
1111 		gen_not(b0);
1112 		b1 = gen_cmp(off_linktype + 2, BPF_H, (bpf_int32)
1113 			     ((LLCSAP_ISONS << 8) | LLCSAP_ISONS));
1114 		gen_and(b0, b1);
1115 		return b1;
1116 
1117 	case LLCSAP_IP:
1118 		b0 = gen_cmp_gt(off_linktype, BPF_H, ETHERMTU);
1119 		gen_not(b0);
1120 		b1 = gen_cmp(off_linktype + 2, BPF_H, (bpf_int32)
1121 			     ((LLCSAP_IP << 8) | LLCSAP_IP));
1122 		gen_and(b0, b1);
1123 		return b1;
1124 
1125 	case LLCSAP_NETBEUI:
1126 		/*
1127 		 * NetBEUI always uses 802.2 encapsulation.
1128 		 * XXX - should we check both the DSAP and the
1129 		 * SSAP, like this, or should we check just the
1130 		 * DSAP?
1131 		 */
1132 		b0 = gen_cmp_gt(off_linktype, BPF_H, ETHERMTU);
1133 		gen_not(b0);
1134 		b1 = gen_cmp(off_linktype + 2, BPF_H, (bpf_int32)
1135 			     ((LLCSAP_NETBEUI << 8) | LLCSAP_NETBEUI));
1136 		gen_and(b0, b1);
1137 		return b1;
1138 
1139 	case LLCSAP_IPX:
1140 		/*
1141 		 * Check for;
1142 		 *
1143 		 *	Ethernet_II frames, which are Ethernet
1144 		 *	frames with a frame type of ETHERTYPE_IPX;
1145 		 *
1146 		 *	Ethernet_802.3 frames, which are 802.3
1147 		 *	frames (i.e., the type/length field is
1148 		 *	a length field, <= ETHERMTU, rather than
1149 		 *	a type field) with the first two bytes
1150 		 *	after the Ethernet/802.3 header being
1151 		 *	0xFFFF;
1152 		 *
1153 		 *	Ethernet_802.2 frames, which are 802.3
1154 		 *	frames with an 802.2 LLC header and
1155 		 *	with the IPX LSAP as the DSAP in the LLC
1156 		 *	header;
1157 		 *
1158 		 *	Ethernet_SNAP frames, which are 802.3
1159 		 *	frames with an LLC header and a SNAP
1160 		 *	header and with an OUI of 0x000000
1161 		 *	(encapsulated Ethernet) and a protocol
1162 		 *	ID of ETHERTYPE_IPX in the SNAP header.
1163 		 *
1164 		 * XXX - should we generate the same code both
1165 		 * for tests for LLCSAP_IPX and for ETHERTYPE_IPX?
1166 		 */
1167 
1168 		/*
1169 		 * This generates code to check both for the
1170 		 * IPX LSAP (Ethernet_802.2) and for Ethernet_802.3.
1171 		 */
1172 		b0 = gen_cmp(off_linktype + 2, BPF_B, (bpf_int32)LLCSAP_IPX);
1173 		b1 = gen_cmp(off_linktype + 2, BPF_H, (bpf_int32)0xFFFF);
1174 		gen_or(b0, b1);
1175 
1176 		/*
1177 		 * Now we add code to check for SNAP frames with
1178 		 * ETHERTYPE_IPX, i.e. Ethernet_SNAP.
1179 		 */
1180 		b0 = gen_snap(0x000000, ETHERTYPE_IPX, 14);
1181 		gen_or(b0, b1);
1182 
1183 		/*
1184 		 * Now we generate code to check for 802.3
1185 		 * frames in general.
1186 		 */
1187 		b0 = gen_cmp_gt(off_linktype, BPF_H, ETHERMTU);
1188 		gen_not(b0);
1189 
1190 		/*
1191 		 * Now add the check for 802.3 frames before the
1192 		 * check for Ethernet_802.2 and Ethernet_802.3,
1193 		 * as those checks should only be done on 802.3
1194 		 * frames, not on Ethernet frames.
1195 		 */
1196 		gen_and(b0, b1);
1197 
1198 		/*
1199 		 * Now add the check for Ethernet_II frames, and
1200 		 * do that before checking for the other frame
1201 		 * types.
1202 		 */
1203 		b0 = gen_cmp(off_linktype, BPF_H, (bpf_int32)ETHERTYPE_IPX);
1204 		gen_or(b0, b1);
1205 		return b1;
1206 
1207 	case ETHERTYPE_ATALK:
1208 	case ETHERTYPE_AARP:
1209 		/*
1210 		 * EtherTalk (AppleTalk protocols on Ethernet link
1211 		 * layer) may use 802.2 encapsulation.
1212 		 */
1213 
1214 		/*
1215 		 * Check for 802.2 encapsulation (EtherTalk phase 2?);
1216 		 * we check for an Ethernet type field less than
1217 		 * 1500, which means it's an 802.3 length field.
1218 		 */
1219 		b0 = gen_cmp_gt(off_linktype, BPF_H, ETHERMTU);
1220 		gen_not(b0);
1221 
1222 		/*
1223 		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
1224 		 * SNAP packets with an organization code of
1225 		 * 0x080007 (Apple, for Appletalk) and a protocol
1226 		 * type of ETHERTYPE_ATALK (Appletalk).
1227 		 *
1228 		 * 802.2-encapsulated ETHERTYPE_AARP packets are
1229 		 * SNAP packets with an organization code of
1230 		 * 0x000000 (encapsulated Ethernet) and a protocol
1231 		 * type of ETHERTYPE_AARP (Appletalk ARP).
1232 		 */
1233 		if (proto == ETHERTYPE_ATALK)
1234 			b1 = gen_snap(0x080007, ETHERTYPE_ATALK, 14);
1235 		else	/* proto == ETHERTYPE_AARP */
1236 			b1 = gen_snap(0x000000, ETHERTYPE_AARP, 14);
1237 		gen_and(b0, b1);
1238 
1239 		/*
1240 		 * Check for Ethernet encapsulation (Ethertalk
1241 		 * phase 1?); we just check for the Ethernet
1242 		 * protocol type.
1243 		 */
1244 		b0 = gen_cmp(off_linktype, BPF_H, (bpf_int32)proto);
1245 
1246 		gen_or(b0, b1);
1247 		return b1;
1248 
1249 	default:
1250 		if (proto <= ETHERMTU) {
1251 			/*
1252 			 * This is an LLC SAP value, so the frames
1253 			 * that match would be 802.2 frames.
1254 			 * Check that the frame is an 802.2 frame
1255 			 * (i.e., that the length/type field is
1256 			 * a length field, <= ETHERMTU) and
1257 			 * then check the DSAP.
1258 			 */
1259 			b0 = gen_cmp_gt(off_linktype, BPF_H, ETHERMTU);
1260 			gen_not(b0);
1261 			b1 = gen_cmp(off_linktype + 2, BPF_B, (bpf_int32)proto);
1262 			gen_and(b0, b1);
1263 			return b1;
1264 		} else {
1265 			/*
1266 			 * This is an Ethernet type, so compare
1267 			 * the length/type field with it (if
1268 			 * the frame is an 802.2 frame, the length
1269 			 * field will be <= ETHERMTU, and, as
1270 			 * "proto" is > ETHERMTU, this test
1271 			 * will fail and the frame won't match,
1272 			 * which is what we want).
1273 			 */
1274 			return gen_cmp(off_linktype, BPF_H, (bpf_int32)proto);
1275 		}
1276 	}
1277 }
1278 
1279 static struct block *
1280 gen_linux_sll_linktype(proto)
1281 	register int proto;
1282 {
1283 	struct block *b0, *b1;
1284 
1285 	switch (proto) {
1286 
1287 	case LLCSAP_IP:
1288 		b0 = gen_cmp(off_linktype, BPF_H, LINUX_SLL_P_802_2);
1289 		b1 = gen_cmp(off_linktype + 2, BPF_H, (bpf_int32)
1290 			     ((LLCSAP_IP << 8) | LLCSAP_IP));
1291 		gen_and(b0, b1);
1292 		return b1;
1293 
1294 	case LLCSAP_ISONS:
1295 		/*
1296 		 * OSI protocols always use 802.2 encapsulation.
1297 		 * XXX - should we check both the DSAP and the
1298 		 * SSAP, like this, or should we check just the
1299 		 * DSAP?
1300 		 */
1301 		b0 = gen_cmp(off_linktype, BPF_H, LINUX_SLL_P_802_2);
1302 		b1 = gen_cmp(off_linktype + 2, BPF_H, (bpf_int32)
1303 			     ((LLCSAP_ISONS << 8) | LLCSAP_ISONS));
1304 		gen_and(b0, b1);
1305 		return b1;
1306 
1307 	case LLCSAP_NETBEUI:
1308 		/*
1309 		 * NetBEUI always uses 802.2 encapsulation.
1310 		 * XXX - should we check both the DSAP and the
1311 		 * LSAP, like this, or should we check just the
1312 		 * DSAP?
1313 		 */
1314 		b0 = gen_cmp(off_linktype, BPF_H, LINUX_SLL_P_802_2);
1315 		b1 = gen_cmp(off_linktype + 2, BPF_H, (bpf_int32)
1316 			     ((LLCSAP_NETBEUI << 8) | LLCSAP_NETBEUI));
1317 		gen_and(b0, b1);
1318 		return b1;
1319 
1320 	case LLCSAP_IPX:
1321 		/*
1322 		 *	Ethernet_II frames, which are Ethernet
1323 		 *	frames with a frame type of ETHERTYPE_IPX;
1324 		 *
1325 		 *	Ethernet_802.3 frames, which have a frame
1326 		 *	type of LINUX_SLL_P_802_3;
1327 		 *
1328 		 *	Ethernet_802.2 frames, which are 802.3
1329 		 *	frames with an 802.2 LLC header (i.e, have
1330 		 *	a frame type of LINUX_SLL_P_802_2) and
1331 		 *	with the IPX LSAP as the DSAP in the LLC
1332 		 *	header;
1333 		 *
1334 		 *	Ethernet_SNAP frames, which are 802.3
1335 		 *	frames with an LLC header and a SNAP
1336 		 *	header and with an OUI of 0x000000
1337 		 *	(encapsulated Ethernet) and a protocol
1338 		 *	ID of ETHERTYPE_IPX in the SNAP header.
1339 		 *
1340 		 * First, do the checks on LINUX_SLL_P_802_2
1341 		 * frames; generate the check for either
1342 		 * Ethernet_802.2 or Ethernet_SNAP frames, and
1343 		 * then put a check for LINUX_SLL_P_802_2 frames
1344 		 * before it.
1345 		 */
1346 		b0 = gen_cmp(off_linktype + 2, BPF_B,
1347 		    (bpf_int32)LLCSAP_IPX);
1348 		b1 = gen_snap(0x000000, ETHERTYPE_IPX,
1349 		    off_linktype + 2);
1350 		gen_or(b0, b1);
1351 		b0 = gen_cmp(off_linktype, BPF_H, LINUX_SLL_P_802_2);
1352 		gen_and(b0, b1);
1353 
1354 		/*
1355 		 * Now check for 802.3 frames and OR that with
1356 		 * the previous test.
1357 		 */
1358 		b0 = gen_cmp(off_linktype, BPF_H, LINUX_SLL_P_802_3);
1359 		gen_or(b0, b1);
1360 
1361 		/*
1362 		 * Now add the check for Ethernet_II frames, and
1363 		 * do that before checking for the other frame
1364 		 * types.
1365 		 */
1366 		b0 = gen_cmp(off_linktype, BPF_H,
1367 		    (bpf_int32)ETHERTYPE_IPX);
1368 		gen_or(b0, b1);
1369 		return b1;
1370 
1371 	case ETHERTYPE_ATALK:
1372 	case ETHERTYPE_AARP:
1373 		/*
1374 		 * EtherTalk (AppleTalk protocols on Ethernet link
1375 		 * layer) may use 802.2 encapsulation.
1376 		 */
1377 
1378 		/*
1379 		 * Check for 802.2 encapsulation (EtherTalk phase 2?);
1380 		 * we check for the 802.2 protocol type in the
1381 		 * "Ethernet type" field.
1382 		 */
1383 		b0 = gen_cmp(off_linktype, BPF_H, LINUX_SLL_P_802_2);
1384 
1385 		/*
1386 		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
1387 		 * SNAP packets with an organization code of
1388 		 * 0x080007 (Apple, for Appletalk) and a protocol
1389 		 * type of ETHERTYPE_ATALK (Appletalk).
1390 		 *
1391 		 * 802.2-encapsulated ETHERTYPE_AARP packets are
1392 		 * SNAP packets with an organization code of
1393 		 * 0x000000 (encapsulated Ethernet) and a protocol
1394 		 * type of ETHERTYPE_AARP (Appletalk ARP).
1395 		 */
1396 		if (proto == ETHERTYPE_ATALK)
1397 			b1 = gen_snap(0x080007, ETHERTYPE_ATALK,
1398 			    off_linktype + 2);
1399 		else	/* proto == ETHERTYPE_AARP */
1400 			b1 = gen_snap(0x000000, ETHERTYPE_AARP,
1401 			    off_linktype + 2);
1402 		gen_and(b0, b1);
1403 
1404 		/*
1405 		 * Check for Ethernet encapsulation (Ethertalk
1406 		 * phase 1?); we just check for the Ethernet
1407 		 * protocol type.
1408 		 */
1409 		b0 = gen_cmp(off_linktype, BPF_H, (bpf_int32)proto);
1410 
1411 		gen_or(b0, b1);
1412 		return b1;
1413 
1414 	default:
1415 		if (proto <= ETHERMTU) {
1416 			/*
1417 			 * This is an LLC SAP value, so the frames
1418 			 * that match would be 802.2 frames.
1419 			 * Check for the 802.2 protocol type
1420 			 * in the "Ethernet type" field, and
1421 			 * then check the DSAP.
1422 			 */
1423 			b0 = gen_cmp(off_linktype, BPF_H,
1424 			    LINUX_SLL_P_802_2);
1425 			b1 = gen_cmp(off_linktype + 2, BPF_B,
1426 			     (bpf_int32)proto);
1427 			gen_and(b0, b1);
1428 			return b1;
1429 		} else {
1430 			/*
1431 			 * This is an Ethernet type, so compare
1432 			 * the length/type field with it (if
1433 			 * the frame is an 802.2 frame, the length
1434 			 * field will be <= ETHERMTU, and, as
1435 			 * "proto" is > ETHERMTU, this test
1436 			 * will fail and the frame won't match,
1437 			 * which is what we want).
1438 			 */
1439 			return gen_cmp(off_linktype, BPF_H,
1440 			    (bpf_int32)proto);
1441 		}
1442 	}
1443 }
1444 
1445 static struct block *
1446 gen_linktype(proto)
1447 	register int proto;
1448 {
1449 	struct block *b0, *b1, *b2;
1450 
1451 	switch (linktype) {
1452 
1453 	case DLT_EN10MB:
1454 		return gen_ether_linktype(proto);
1455 		/*NOTREACHED*/
1456 		break;
1457 
1458 	case DLT_C_HDLC:
1459 		switch (proto) {
1460 
1461 		case LLCSAP_ISONS:
1462 			proto = (proto << 8 | LLCSAP_ISONS);
1463 			/* fall through */
1464 
1465 		default:
1466 			return gen_cmp(off_linktype, BPF_H, (bpf_int32)proto);
1467 			/*NOTREACHED*/
1468 			break;
1469 		}
1470 		break;
1471 
1472 	case DLT_IEEE802_11:
1473 	case DLT_PRISM_HEADER:
1474 	case DLT_IEEE802_11_RADIO:
1475 	case DLT_FDDI:
1476 	case DLT_IEEE802:
1477 	case DLT_ATM_RFC1483:
1478 	case DLT_ATM_CLIP:
1479 	case DLT_IP_OVER_FC:
1480 		return gen_llc(proto);
1481 		/*NOTREACHED*/
1482 		break;
1483 
1484 	case DLT_SUNATM:
1485 		/*
1486 		 * If "is_lane" is set, check for a LANE-encapsulated
1487 		 * version of this protocol, otherwise check for an
1488 		 * LLC-encapsulated version of this protocol.
1489 		 *
1490 		 * We assume LANE means Ethernet, not Token Ring.
1491 		 */
1492 		if (is_lane) {
1493 			/*
1494 			 * Check that the packet doesn't begin with an
1495 			 * LE Control marker.  (We've already generated
1496 			 * a test for LANE.)
1497 			 */
1498 			b0 = gen_cmp(SUNATM_PKT_BEGIN_POS, BPF_H, 0xFF00);
1499 			gen_not(b0);
1500 
1501 			/*
1502 			 * Now generate an Ethernet test.
1503 			 */
1504 			b1 = gen_ether_linktype(proto);
1505 			gen_and(b0, b1);
1506 			return b1;
1507 		} else {
1508 			/*
1509 			 * Check for LLC encapsulation and then check the
1510 			 * protocol.
1511 			 */
1512 			b0 = gen_atmfield_code(A_PROTOTYPE, PT_LLC, BPF_JEQ, 0);
1513 			b1 = gen_llc(proto);
1514 			gen_and(b0, b1);
1515 			return b1;
1516 		}
1517 
1518 	case DLT_LINUX_SLL:
1519 		return gen_linux_sll_linktype(proto);
1520 		/*NOTREACHED*/
1521 		break;
1522 
1523 	case DLT_SLIP:
1524 	case DLT_SLIP_BSDOS:
1525 	case DLT_RAW:
1526 		/*
1527 		 * These types don't provide any type field; packets
1528 		 * are always IP.
1529 		 *
1530 		 * XXX - for IPv4, check for a version number of 4, and,
1531 		 * for IPv6, check for a version number of 6?
1532 		 */
1533 		switch (proto) {
1534 
1535 		case ETHERTYPE_IP:
1536 #ifdef INET6
1537 		case ETHERTYPE_IPV6:
1538 #endif
1539 			return gen_true();		/* always true */
1540 
1541 		default:
1542 			return gen_false();		/* always false */
1543 		}
1544 		/*NOTREACHED*/
1545 		break;
1546 
1547 	case DLT_PPP:
1548 	case DLT_PPP_PPPD:
1549 	case DLT_PPP_SERIAL:
1550 	case DLT_PPP_ETHER:
1551 		/*
1552 		 * We use Ethernet protocol types inside libpcap;
1553 		 * map them to the corresponding PPP protocol types.
1554 		 */
1555 		switch (proto) {
1556 
1557 		case ETHERTYPE_IP:
1558 			proto = PPP_IP;
1559 			break;
1560 
1561 #ifdef INET6
1562 		case ETHERTYPE_IPV6:
1563 			proto = PPP_IPV6;
1564 			break;
1565 #endif
1566 
1567 		case ETHERTYPE_DN:
1568 			proto = PPP_DECNET;
1569 			break;
1570 
1571 		case ETHERTYPE_ATALK:
1572 			proto = PPP_APPLE;
1573 			break;
1574 
1575 		case ETHERTYPE_NS:
1576 			proto = PPP_NS;
1577 			break;
1578 
1579 		case LLCSAP_ISONS:
1580 			proto = PPP_OSI;
1581 			break;
1582 
1583 		case LLCSAP_8021D:
1584 			/*
1585 			 * I'm assuming the "Bridging PDU"s that go
1586 			 * over PPP are Spanning Tree Protocol
1587 			 * Bridging PDUs.
1588 			 */
1589 			proto = PPP_BRPDU;
1590 			break;
1591 
1592 		case LLCSAP_IPX:
1593 			proto = PPP_IPX;
1594 			break;
1595 		}
1596 		break;
1597 
1598 	case DLT_PPP_BSDOS:
1599 		/*
1600 		 * We use Ethernet protocol types inside libpcap;
1601 		 * map them to the corresponding PPP protocol types.
1602 		 */
1603 		switch (proto) {
1604 
1605 		case ETHERTYPE_IP:
1606 			b0 = gen_cmp(off_linktype, BPF_H, PPP_IP);
1607 			b1 = gen_cmp(off_linktype, BPF_H, PPP_VJC);
1608 			gen_or(b0, b1);
1609 			b0 = gen_cmp(off_linktype, BPF_H, PPP_VJNC);
1610 			gen_or(b1, b0);
1611 			return b0;
1612 
1613 #ifdef INET6
1614 		case ETHERTYPE_IPV6:
1615 			proto = PPP_IPV6;
1616 			/* more to go? */
1617 			break;
1618 #endif
1619 
1620 		case ETHERTYPE_DN:
1621 			proto = PPP_DECNET;
1622 			break;
1623 
1624 		case ETHERTYPE_ATALK:
1625 			proto = PPP_APPLE;
1626 			break;
1627 
1628 		case ETHERTYPE_NS:
1629 			proto = PPP_NS;
1630 			break;
1631 
1632 		case LLCSAP_ISONS:
1633 			proto = PPP_OSI;
1634 			break;
1635 
1636 		case LLCSAP_8021D:
1637 			/*
1638 			 * I'm assuming the "Bridging PDU"s that go
1639 			 * over PPP are Spanning Tree Protocol
1640 			 * Bridging PDUs.
1641 			 */
1642 			proto = PPP_BRPDU;
1643 			break;
1644 
1645 		case LLCSAP_IPX:
1646 			proto = PPP_IPX;
1647 			break;
1648 		}
1649 		break;
1650 
1651 	case DLT_NULL:
1652 	case DLT_LOOP:
1653 	case DLT_ENC:
1654 		/*
1655 		 * For DLT_NULL, the link-layer header is a 32-bit
1656 		 * word containing an AF_ value in *host* byte order,
1657 		 * and for DLT_ENC, the link-layer header begins
1658 		 * with a 32-bit work containing an AF_ value in
1659 		 * host byte order.
1660 		 *
1661 		 * In addition, if we're reading a saved capture file,
1662 		 * the host byte order in the capture may not be the
1663 		 * same as the host byte order on this machine.
1664 		 *
1665 		 * For DLT_LOOP, the link-layer header is a 32-bit
1666 		 * word containing an AF_ value in *network* byte order.
1667 		 *
1668 		 * XXX - AF_ values may, unfortunately, be platform-
1669 		 * dependent; for example, FreeBSD's AF_INET6 is 24
1670 		 * whilst NetBSD's and OpenBSD's is 26.
1671 		 *
1672 		 * This means that, when reading a capture file, just
1673 		 * checking for our AF_INET6 value won't work if the
1674 		 * capture file came from another OS.
1675 		 */
1676 		switch (proto) {
1677 
1678 		case ETHERTYPE_IP:
1679 			proto = AF_INET;
1680 			break;
1681 
1682 #ifdef INET6
1683 		case ETHERTYPE_IPV6:
1684 			proto = AF_INET6;
1685 			break;
1686 #endif
1687 
1688 		default:
1689 			/*
1690 			 * Not a type on which we support filtering.
1691 			 * XXX - support those that have AF_ values
1692 			 * #defined on this platform, at least?
1693 			 */
1694 			return gen_false();
1695 		}
1696 
1697 		if (linktype == DLT_NULL || linktype == DLT_ENC) {
1698 			/*
1699 			 * The AF_ value is in host byte order, but
1700 			 * the BPF interpreter will convert it to
1701 			 * network byte order.
1702 			 *
1703 			 * If this is a save file, and it's from a
1704 			 * machine with the opposite byte order to
1705 			 * ours, we byte-swap the AF_ value.
1706 			 *
1707 			 * Then we run it through "htonl()", and
1708 			 * generate code to compare against the result.
1709 			 */
1710 			if (bpf_pcap->sf.rfile != NULL &&
1711 			    bpf_pcap->sf.swapped)
1712 				proto = SWAPLONG(proto);
1713 			proto = htonl(proto);
1714 		}
1715 		return (gen_cmp(0, BPF_W, (bpf_int32)proto));
1716 
1717 	case DLT_PFLOG:
1718 		/*
1719 		 * af field is host byte order in contrast to the rest of
1720 		 * the packet.
1721 		 */
1722 		if (proto == ETHERTYPE_IP)
1723 			return (gen_cmp(offsetof(struct pfloghdr, af), BPF_B,
1724 			    (bpf_int32)AF_INET));
1725 #ifdef INET6
1726 		else if (proto == ETHERTYPE_IPV6)
1727 			return (gen_cmp(offsetof(struct pfloghdr, af), BPF_B,
1728 			    (bpf_int32)AF_INET6));
1729 #endif /* INET6 */
1730 		else
1731 			return gen_false();
1732 		/*NOTREACHED*/
1733 		break;
1734 
1735 	case DLT_ARCNET:
1736 	case DLT_ARCNET_LINUX:
1737 		/*
1738 		 * XXX should we check for first fragment if the protocol
1739 		 * uses PHDS?
1740 		 */
1741 		switch (proto) {
1742 
1743 		default:
1744 			return gen_false();
1745 
1746 #ifdef INET6
1747 		case ETHERTYPE_IPV6:
1748 			return (gen_cmp(off_linktype, BPF_B,
1749 				(bpf_int32)ARCTYPE_INET6));
1750 #endif /* INET6 */
1751 
1752 		case ETHERTYPE_IP:
1753 			b0 = gen_cmp(off_linktype, BPF_B,
1754 				     (bpf_int32)ARCTYPE_IP);
1755 			b1 = gen_cmp(off_linktype, BPF_B,
1756 				     (bpf_int32)ARCTYPE_IP_OLD);
1757 			gen_or(b0, b1);
1758 			return (b1);
1759 
1760 		case ETHERTYPE_ARP:
1761 			b0 = gen_cmp(off_linktype, BPF_B,
1762 				     (bpf_int32)ARCTYPE_ARP);
1763 			b1 = gen_cmp(off_linktype, BPF_B,
1764 				     (bpf_int32)ARCTYPE_ARP_OLD);
1765 			gen_or(b0, b1);
1766 			return (b1);
1767 
1768 		case ETHERTYPE_REVARP:
1769 			return (gen_cmp(off_linktype, BPF_B,
1770 					(bpf_int32)ARCTYPE_REVARP));
1771 
1772 		case ETHERTYPE_ATALK:
1773 			return (gen_cmp(off_linktype, BPF_B,
1774 					(bpf_int32)ARCTYPE_ATALK));
1775 		}
1776 		/*NOTREACHED*/
1777 		break;
1778 
1779 	case DLT_LTALK:
1780 		switch (proto) {
1781 		case ETHERTYPE_ATALK:
1782 			return gen_true();
1783 		default:
1784 			return gen_false();
1785 		}
1786 		/*NOTREACHED*/
1787 		break;
1788 
1789 	case DLT_FRELAY:
1790 		/*
1791 		 * XXX - assumes a 2-byte Frame Relay header with
1792 		 * DLCI and flags.  What if the address is longer?
1793 		 */
1794 		switch (proto) {
1795 
1796 		case ETHERTYPE_IP:
1797 			/*
1798 			 * Check for the special NLPID for IP.
1799 			 */
1800 			return gen_cmp(2, BPF_H, (0x03<<8) | 0xcc);
1801 
1802 #ifdef INET6
1803 		case ETHERTYPE_IPV6:
1804 			/*
1805 			 * Check for the special NLPID for IPv6.
1806 			 */
1807 			return gen_cmp(2, BPF_H, (0x03<<8) | 0x8e);
1808 #endif
1809 
1810 		case LLCSAP_ISONS:
1811 			/*
1812 			 * Check for several OSI protocols.
1813 			 *
1814 			 * Frame Relay packets typically have an OSI
1815 			 * NLPID at the beginning; we check for each
1816 			 * of them.
1817 			 *
1818 			 * What we check for is the NLPID and a frame
1819 			 * control field of UI, i.e. 0x03 followed
1820 			 * by the NLPID.
1821 			 */
1822 			b0 = gen_cmp(2, BPF_H, (0x03<<8) | ISO8473_CLNP);
1823 			b1 = gen_cmp(2, BPF_H, (0x03<<8) | ISO9542_ESIS);
1824 			b2 = gen_cmp(2, BPF_H, (0x03<<8) | ISO10589_ISIS);
1825 			gen_or(b1, b2);
1826 			gen_or(b0, b2);
1827 			return b2;
1828 
1829 		default:
1830 			return gen_false();
1831 		}
1832 		/*NOTREACHED*/
1833 		break;
1834 
1835         case DLT_JUNIPER_MLFR:
1836         case DLT_JUNIPER_MLPPP:
1837 	case DLT_JUNIPER_ATM1:
1838 	case DLT_JUNIPER_ATM2:
1839 		/* just lets verify the magic number for now -
1840 		 * on ATM we may have up to 6 different encapsulations on the wire
1841 		 * and need a lot of heuristics to figure out that the payload
1842 		 * might be;
1843 		 *
1844 		 * FIXME encapsulation specific BPF_ filters
1845 		 */
1846 		return gen_mcmp(0, BPF_W, 0x4d474300, 0xffffff00); /* compare the magic number */
1847 
1848 	case DLT_LINUX_IRDA:
1849 		bpf_error("IrDA link-layer type filtering not implemented");
1850 
1851 	case DLT_DOCSIS:
1852 		bpf_error("DOCSIS link-layer type filtering not implemented");
1853 	}
1854 
1855 	/*
1856 	 * All the types that have no encapsulation should either be
1857 	 * handled as DLT_SLIP, DLT_SLIP_BSDOS, and DLT_RAW are, if
1858 	 * all packets are IP packets, or should be handled in some
1859 	 * special case, if none of them are (if some are and some
1860 	 * aren't, the lack of encapsulation is a problem, as we'd
1861 	 * have to find some other way of determining the packet type).
1862 	 *
1863 	 * Therefore, if "off_linktype" is -1, there's an error.
1864 	 */
1865 	if (off_linktype == (u_int)-1)
1866 		abort();
1867 
1868 	/*
1869 	 * Any type not handled above should always have an Ethernet
1870 	 * type at an offset of "off_linktype".  (PPP is partially
1871 	 * handled above - the protocol type is mapped from the
1872 	 * Ethernet and LLC types we use internally to the corresponding
1873 	 * PPP type - but the PPP type is always specified by a value
1874 	 * at "off_linktype", so we don't have to do the code generation
1875 	 * above.)
1876 	 */
1877 	return gen_cmp(off_linktype, BPF_H, (bpf_int32)proto);
1878 }
1879 
1880 /*
1881  * Check for an LLC SNAP packet with a given organization code and
1882  * protocol type; we check the entire contents of the 802.2 LLC and
1883  * snap headers, checking for DSAP and SSAP of SNAP and a control
1884  * field of 0x03 in the LLC header, and for the specified organization
1885  * code and protocol type in the SNAP header.
1886  */
1887 static struct block *
1888 gen_snap(orgcode, ptype, offset)
1889 	bpf_u_int32 orgcode;
1890 	bpf_u_int32 ptype;
1891 	u_int offset;
1892 {
1893 	u_char snapblock[8];
1894 
1895 	snapblock[0] = LLCSAP_SNAP;	/* DSAP = SNAP */
1896 	snapblock[1] = LLCSAP_SNAP;	/* SSAP = SNAP */
1897 	snapblock[2] = 0x03;		/* control = UI */
1898 	snapblock[3] = (orgcode >> 16);	/* upper 8 bits of organization code */
1899 	snapblock[4] = (orgcode >> 8);	/* middle 8 bits of organization code */
1900 	snapblock[5] = (orgcode >> 0);	/* lower 8 bits of organization code */
1901 	snapblock[6] = (ptype >> 8);	/* upper 8 bits of protocol type */
1902 	snapblock[7] = (ptype >> 0);	/* lower 8 bits of protocol type */
1903 	return gen_bcmp(offset, 8, snapblock);
1904 }
1905 
1906 /*
1907  * Check for a given protocol value assuming an 802.2 LLC header.
1908  */
1909 static struct block *
1910 gen_llc(proto)
1911 	int proto;
1912 {
1913 	/*
1914 	 * XXX - handle token-ring variable-length header.
1915 	 */
1916 	switch (proto) {
1917 
1918 	case LLCSAP_IP:
1919 		return gen_cmp(off_linktype, BPF_H, (long)
1920 			     ((LLCSAP_IP << 8) | LLCSAP_IP));
1921 
1922 	case LLCSAP_ISONS:
1923 		return gen_cmp(off_linktype, BPF_H, (long)
1924 			     ((LLCSAP_ISONS << 8) | LLCSAP_ISONS));
1925 
1926 	case LLCSAP_NETBEUI:
1927 		return gen_cmp(off_linktype, BPF_H, (long)
1928 			     ((LLCSAP_NETBEUI << 8) | LLCSAP_NETBEUI));
1929 
1930 	case LLCSAP_IPX:
1931 		/*
1932 		 * XXX - are there ever SNAP frames for IPX on
1933 		 * non-Ethernet 802.x networks?
1934 		 */
1935 		return gen_cmp(off_linktype, BPF_B, (bpf_int32)LLCSAP_IPX);
1936 
1937 	case ETHERTYPE_ATALK:
1938 		/*
1939 		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
1940 		 * SNAP packets with an organization code of
1941 		 * 0x080007 (Apple, for Appletalk) and a protocol
1942 		 * type of ETHERTYPE_ATALK (Appletalk).
1943 		 *
1944 		 * XXX - check for an organization code of
1945 		 * encapsulated Ethernet as well?
1946 		 */
1947 		return gen_snap(0x080007, ETHERTYPE_ATALK, off_linktype);
1948 
1949 	default:
1950 		/*
1951 		 * XXX - we don't have to check for IPX 802.3
1952 		 * here, but should we check for the IPX Ethertype?
1953 		 */
1954 		if (proto <= ETHERMTU) {
1955 			/*
1956 			 * This is an LLC SAP value, so check
1957 			 * the DSAP.
1958 			 */
1959 			return gen_cmp(off_linktype, BPF_B, (bpf_int32)proto);
1960 		} else {
1961 			/*
1962 			 * This is an Ethernet type; we assume that it's
1963 			 * unlikely that it'll appear in the right place
1964 			 * at random, and therefore check only the
1965 			 * location that would hold the Ethernet type
1966 			 * in a SNAP frame with an organization code of
1967 			 * 0x000000 (encapsulated Ethernet).
1968 			 *
1969 			 * XXX - if we were to check for the SNAP DSAP and
1970 			 * LSAP, as per XXX, and were also to check for an
1971 			 * organization code of 0x000000 (encapsulated
1972 			 * Ethernet), we'd do
1973 			 *
1974 			 *	return gen_snap(0x000000, proto,
1975 			 *	    off_linktype);
1976 			 *
1977 			 * here; for now, we don't, as per the above.
1978 			 * I don't know whether it's worth the extra CPU
1979 			 * time to do the right check or not.
1980 			 */
1981 			return gen_cmp(off_linktype+6, BPF_H, (bpf_int32)proto);
1982 		}
1983 	}
1984 }
1985 
1986 static struct block *
1987 gen_hostop(addr, mask, dir, proto, src_off, dst_off)
1988 	bpf_u_int32 addr;
1989 	bpf_u_int32 mask;
1990 	int dir, proto;
1991 	u_int src_off, dst_off;
1992 {
1993 	struct block *b0, *b1;
1994 	u_int offset;
1995 
1996 	switch (dir) {
1997 
1998 	case Q_SRC:
1999 		offset = src_off;
2000 		break;
2001 
2002 	case Q_DST:
2003 		offset = dst_off;
2004 		break;
2005 
2006 	case Q_AND:
2007 		b0 = gen_hostop(addr, mask, Q_SRC, proto, src_off, dst_off);
2008 		b1 = gen_hostop(addr, mask, Q_DST, proto, src_off, dst_off);
2009 		gen_and(b0, b1);
2010 		return b1;
2011 
2012 	case Q_OR:
2013 	case Q_DEFAULT:
2014 		b0 = gen_hostop(addr, mask, Q_SRC, proto, src_off, dst_off);
2015 		b1 = gen_hostop(addr, mask, Q_DST, proto, src_off, dst_off);
2016 		gen_or(b0, b1);
2017 		return b1;
2018 
2019 	default:
2020 		abort();
2021 	}
2022 	b0 = gen_linktype(proto);
2023 	b1 = gen_mcmp(offset, BPF_W, (bpf_int32)addr, mask);
2024 	gen_and(b0, b1);
2025 	return b1;
2026 }
2027 
2028 #ifdef INET6
2029 static struct block *
2030 gen_hostop6(addr, mask, dir, proto, src_off, dst_off)
2031 	struct in6_addr *addr;
2032 	struct in6_addr *mask;
2033 	int dir, proto;
2034 	u_int src_off, dst_off;
2035 {
2036 	struct block *b0, *b1;
2037 	u_int offset;
2038 	u_int32_t *a, *m;
2039 
2040 	switch (dir) {
2041 
2042 	case Q_SRC:
2043 		offset = src_off;
2044 		break;
2045 
2046 	case Q_DST:
2047 		offset = dst_off;
2048 		break;
2049 
2050 	case Q_AND:
2051 		b0 = gen_hostop6(addr, mask, Q_SRC, proto, src_off, dst_off);
2052 		b1 = gen_hostop6(addr, mask, Q_DST, proto, src_off, dst_off);
2053 		gen_and(b0, b1);
2054 		return b1;
2055 
2056 	case Q_OR:
2057 	case Q_DEFAULT:
2058 		b0 = gen_hostop6(addr, mask, Q_SRC, proto, src_off, dst_off);
2059 		b1 = gen_hostop6(addr, mask, Q_DST, proto, src_off, dst_off);
2060 		gen_or(b0, b1);
2061 		return b1;
2062 
2063 	default:
2064 		abort();
2065 	}
2066 	/* this order is important */
2067 	a = (u_int32_t *)addr;
2068 	m = (u_int32_t *)mask;
2069 	b1 = gen_mcmp(offset + 12, BPF_W, ntohl(a[3]), ntohl(m[3]));
2070 	b0 = gen_mcmp(offset + 8, BPF_W, ntohl(a[2]), ntohl(m[2]));
2071 	gen_and(b0, b1);
2072 	b0 = gen_mcmp(offset + 4, BPF_W, ntohl(a[1]), ntohl(m[1]));
2073 	gen_and(b0, b1);
2074 	b0 = gen_mcmp(offset + 0, BPF_W, ntohl(a[0]), ntohl(m[0]));
2075 	gen_and(b0, b1);
2076 	b0 = gen_linktype(proto);
2077 	gen_and(b0, b1);
2078 	return b1;
2079 }
2080 #endif /*INET6*/
2081 
2082 static struct block *
2083 gen_ehostop(eaddr, dir)
2084 	register const u_char *eaddr;
2085 	register int dir;
2086 {
2087 	register struct block *b0, *b1;
2088 
2089 	switch (dir) {
2090 	case Q_SRC:
2091 		return gen_bcmp(off_mac + 6, 6, eaddr);
2092 
2093 	case Q_DST:
2094 		return gen_bcmp(off_mac + 0, 6, eaddr);
2095 
2096 	case Q_AND:
2097 		b0 = gen_ehostop(eaddr, Q_SRC);
2098 		b1 = gen_ehostop(eaddr, Q_DST);
2099 		gen_and(b0, b1);
2100 		return b1;
2101 
2102 	case Q_DEFAULT:
2103 	case Q_OR:
2104 		b0 = gen_ehostop(eaddr, Q_SRC);
2105 		b1 = gen_ehostop(eaddr, Q_DST);
2106 		gen_or(b0, b1);
2107 		return b1;
2108 	}
2109 	abort();
2110 	/* NOTREACHED */
2111 }
2112 
2113 /*
2114  * Like gen_ehostop, but for DLT_FDDI
2115  */
2116 static struct block *
2117 gen_fhostop(eaddr, dir)
2118 	register const u_char *eaddr;
2119 	register int dir;
2120 {
2121 	struct block *b0, *b1;
2122 
2123 	switch (dir) {
2124 	case Q_SRC:
2125 #ifdef PCAP_FDDIPAD
2126 		return gen_bcmp(6 + 1 + pcap_fddipad, 6, eaddr);
2127 #else
2128 		return gen_bcmp(6 + 1, 6, eaddr);
2129 #endif
2130 
2131 	case Q_DST:
2132 #ifdef PCAP_FDDIPAD
2133 		return gen_bcmp(0 + 1 + pcap_fddipad, 6, eaddr);
2134 #else
2135 		return gen_bcmp(0 + 1, 6, eaddr);
2136 #endif
2137 
2138 	case Q_AND:
2139 		b0 = gen_fhostop(eaddr, Q_SRC);
2140 		b1 = gen_fhostop(eaddr, Q_DST);
2141 		gen_and(b0, b1);
2142 		return b1;
2143 
2144 	case Q_DEFAULT:
2145 	case Q_OR:
2146 		b0 = gen_fhostop(eaddr, Q_SRC);
2147 		b1 = gen_fhostop(eaddr, Q_DST);
2148 		gen_or(b0, b1);
2149 		return b1;
2150 	}
2151 	abort();
2152 	/* NOTREACHED */
2153 }
2154 
2155 /*
2156  * Like gen_ehostop, but for DLT_IEEE802 (Token Ring)
2157  */
2158 static struct block *
2159 gen_thostop(eaddr, dir)
2160 	register const u_char *eaddr;
2161 	register int dir;
2162 {
2163 	register struct block *b0, *b1;
2164 
2165 	switch (dir) {
2166 	case Q_SRC:
2167 		return gen_bcmp(8, 6, eaddr);
2168 
2169 	case Q_DST:
2170 		return gen_bcmp(2, 6, eaddr);
2171 
2172 	case Q_AND:
2173 		b0 = gen_thostop(eaddr, Q_SRC);
2174 		b1 = gen_thostop(eaddr, Q_DST);
2175 		gen_and(b0, b1);
2176 		return b1;
2177 
2178 	case Q_DEFAULT:
2179 	case Q_OR:
2180 		b0 = gen_thostop(eaddr, Q_SRC);
2181 		b1 = gen_thostop(eaddr, Q_DST);
2182 		gen_or(b0, b1);
2183 		return b1;
2184 	}
2185 	abort();
2186 	/* NOTREACHED */
2187 }
2188 
2189 /*
2190  * Like gen_ehostop, but for DLT_IEEE802_11 (802.11 wireless LAN)
2191  */
2192 static struct block *
2193 gen_wlanhostop(eaddr, dir)
2194 	register const u_char *eaddr;
2195 	register int dir;
2196 {
2197 	register struct block *b0, *b1, *b2;
2198 	register struct slist *s;
2199 
2200 	switch (dir) {
2201 	case Q_SRC:
2202 		/*
2203 		 * Oh, yuk.
2204 		 *
2205 		 *	For control frames, there is no SA.
2206 		 *
2207 		 *	For management frames, SA is at an
2208 		 *	offset of 10 from the beginning of
2209 		 *	the packet.
2210 		 *
2211 		 *	For data frames, SA is at an offset
2212 		 *	of 10 from the beginning of the packet
2213 		 *	if From DS is clear, at an offset of
2214 		 *	16 from the beginning of the packet
2215 		 *	if From DS is set and To DS is clear,
2216 		 *	and an offset of 24 from the beginning
2217 		 *	of the packet if From DS is set and To DS
2218 		 *	is set.
2219 		 */
2220 
2221 		/*
2222 		 * Generate the tests to be done for data frames
2223 		 * with From DS set.
2224 		 *
2225 		 * First, check for To DS set, i.e. check "link[1] & 0x01".
2226 		 */
2227 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2228 		s->s.k = 1;
2229 		b1 = new_block(JMP(BPF_JSET));
2230 		b1->s.k = 0x01;	/* To DS */
2231 		b1->stmts = s;
2232 
2233 		/*
2234 		 * If To DS is set, the SA is at 24.
2235 		 */
2236 		b0 = gen_bcmp(24, 6, eaddr);
2237 		gen_and(b1, b0);
2238 
2239 		/*
2240 		 * Now, check for To DS not set, i.e. check
2241 		 * "!(link[1] & 0x01)".
2242 		 */
2243 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2244 		s->s.k = 1;
2245 		b2 = new_block(JMP(BPF_JSET));
2246 		b2->s.k = 0x01;	/* To DS */
2247 		b2->stmts = s;
2248 		gen_not(b2);
2249 
2250 		/*
2251 		 * If To DS is not set, the SA is at 16.
2252 		 */
2253 		b1 = gen_bcmp(16, 6, eaddr);
2254 		gen_and(b2, b1);
2255 
2256 		/*
2257 		 * Now OR together the last two checks.  That gives
2258 		 * the complete set of checks for data frames with
2259 		 * From DS set.
2260 		 */
2261 		gen_or(b1, b0);
2262 
2263 		/*
2264 		 * Now check for From DS being set, and AND that with
2265 		 * the ORed-together checks.
2266 		 */
2267 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2268 		s->s.k = 1;
2269 		b1 = new_block(JMP(BPF_JSET));
2270 		b1->s.k = 0x02;	/* From DS */
2271 		b1->stmts = s;
2272 		gen_and(b1, b0);
2273 
2274 		/*
2275 		 * Now check for data frames with From DS not set.
2276 		 */
2277 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2278 		s->s.k = 1;
2279 		b2 = new_block(JMP(BPF_JSET));
2280 		b2->s.k = 0x02;	/* From DS */
2281 		b2->stmts = s;
2282 		gen_not(b2);
2283 
2284 		/*
2285 		 * If From DS isn't set, the SA is at 10.
2286 		 */
2287 		b1 = gen_bcmp(10, 6, eaddr);
2288 		gen_and(b2, b1);
2289 
2290 		/*
2291 		 * Now OR together the checks for data frames with
2292 		 * From DS not set and for data frames with From DS
2293 		 * set; that gives the checks done for data frames.
2294 		 */
2295 		gen_or(b1, b0);
2296 
2297 		/*
2298 		 * Now check for a data frame.
2299 		 * I.e, check "link[0] & 0x08".
2300 		 */
2301 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2302 		s->s.k = 0;
2303 		b1 = new_block(JMP(BPF_JSET));
2304 		b1->s.k = 0x08;
2305 		b1->stmts = s;
2306 
2307 		/*
2308 		 * AND that with the checks done for data frames.
2309 		 */
2310 		gen_and(b1, b0);
2311 
2312 		/*
2313 		 * If the high-order bit of the type value is 0, this
2314 		 * is a management frame.
2315 		 * I.e, check "!(link[0] & 0x08)".
2316 		 */
2317 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2318 		s->s.k = 0;
2319 		b2 = new_block(JMP(BPF_JSET));
2320 		b2->s.k = 0x08;
2321 		b2->stmts = s;
2322 		gen_not(b2);
2323 
2324 		/*
2325 		 * For management frames, the SA is at 10.
2326 		 */
2327 		b1 = gen_bcmp(10, 6, eaddr);
2328 		gen_and(b2, b1);
2329 
2330 		/*
2331 		 * OR that with the checks done for data frames.
2332 		 * That gives the checks done for management and
2333 		 * data frames.
2334 		 */
2335 		gen_or(b1, b0);
2336 
2337 		/*
2338 		 * If the low-order bit of the type value is 1,
2339 		 * this is either a control frame or a frame
2340 		 * with a reserved type, and thus not a
2341 		 * frame with an SA.
2342 		 *
2343 		 * I.e., check "!(link[0] & 0x04)".
2344 		 */
2345 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2346 		s->s.k = 0;
2347 		b1 = new_block(JMP(BPF_JSET));
2348 		b1->s.k = 0x04;
2349 		b1->stmts = s;
2350 		gen_not(b1);
2351 
2352 		/*
2353 		 * AND that with the checks for data and management
2354 		 * frames.
2355 		 */
2356 		gen_and(b1, b0);
2357 		return b0;
2358 
2359 	case Q_DST:
2360 		/*
2361 		 * Oh, yuk.
2362 		 *
2363 		 *	For control frames, there is no DA.
2364 		 *
2365 		 *	For management frames, DA is at an
2366 		 *	offset of 4 from the beginning of
2367 		 *	the packet.
2368 		 *
2369 		 *	For data frames, DA is at an offset
2370 		 *	of 4 from the beginning of the packet
2371 		 *	if To DS is clear and at an offset of
2372 		 *	16 from the beginning of the packet
2373 		 *	if To DS is set.
2374 		 */
2375 
2376 		/*
2377 		 * Generate the tests to be done for data frames.
2378 		 *
2379 		 * First, check for To DS set, i.e. "link[1] & 0x01".
2380 		 */
2381 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2382 		s->s.k = 1;
2383 		b1 = new_block(JMP(BPF_JSET));
2384 		b1->s.k = 0x01;	/* To DS */
2385 		b1->stmts = s;
2386 
2387 		/*
2388 		 * If To DS is set, the DA is at 16.
2389 		 */
2390 		b0 = gen_bcmp(16, 6, eaddr);
2391 		gen_and(b1, b0);
2392 
2393 		/*
2394 		 * Now, check for To DS not set, i.e. check
2395 		 * "!(link[1] & 0x01)".
2396 		 */
2397 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2398 		s->s.k = 1;
2399 		b2 = new_block(JMP(BPF_JSET));
2400 		b2->s.k = 0x01;	/* To DS */
2401 		b2->stmts = s;
2402 		gen_not(b2);
2403 
2404 		/*
2405 		 * If To DS is not set, the DA is at 4.
2406 		 */
2407 		b1 = gen_bcmp(4, 6, eaddr);
2408 		gen_and(b2, b1);
2409 
2410 		/*
2411 		 * Now OR together the last two checks.  That gives
2412 		 * the complete set of checks for data frames.
2413 		 */
2414 		gen_or(b1, b0);
2415 
2416 		/*
2417 		 * Now check for a data frame.
2418 		 * I.e, check "link[0] & 0x08".
2419 		 */
2420 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2421 		s->s.k = 0;
2422 		b1 = new_block(JMP(BPF_JSET));
2423 		b1->s.k = 0x08;
2424 		b1->stmts = s;
2425 
2426 		/*
2427 		 * AND that with the checks done for data frames.
2428 		 */
2429 		gen_and(b1, b0);
2430 
2431 		/*
2432 		 * If the high-order bit of the type value is 0, this
2433 		 * is a management frame.
2434 		 * I.e, check "!(link[0] & 0x08)".
2435 		 */
2436 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2437 		s->s.k = 0;
2438 		b2 = new_block(JMP(BPF_JSET));
2439 		b2->s.k = 0x08;
2440 		b2->stmts = s;
2441 		gen_not(b2);
2442 
2443 		/*
2444 		 * For management frames, the DA is at 4.
2445 		 */
2446 		b1 = gen_bcmp(4, 6, eaddr);
2447 		gen_and(b2, b1);
2448 
2449 		/*
2450 		 * OR that with the checks done for data frames.
2451 		 * That gives the checks done for management and
2452 		 * data frames.
2453 		 */
2454 		gen_or(b1, b0);
2455 
2456 		/*
2457 		 * If the low-order bit of the type value is 1,
2458 		 * this is either a control frame or a frame
2459 		 * with a reserved type, and thus not a
2460 		 * frame with an SA.
2461 		 *
2462 		 * I.e., check "!(link[0] & 0x04)".
2463 		 */
2464 		s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2465 		s->s.k = 0;
2466 		b1 = new_block(JMP(BPF_JSET));
2467 		b1->s.k = 0x04;
2468 		b1->stmts = s;
2469 		gen_not(b1);
2470 
2471 		/*
2472 		 * AND that with the checks for data and management
2473 		 * frames.
2474 		 */
2475 		gen_and(b1, b0);
2476 		return b0;
2477 
2478 	case Q_AND:
2479 		b0 = gen_wlanhostop(eaddr, Q_SRC);
2480 		b1 = gen_wlanhostop(eaddr, Q_DST);
2481 		gen_and(b0, b1);
2482 		return b1;
2483 
2484 	case Q_DEFAULT:
2485 	case Q_OR:
2486 		b0 = gen_wlanhostop(eaddr, Q_SRC);
2487 		b1 = gen_wlanhostop(eaddr, Q_DST);
2488 		gen_or(b0, b1);
2489 		return b1;
2490 	}
2491 	abort();
2492 	/* NOTREACHED */
2493 }
2494 
2495 /*
2496  * Like gen_ehostop, but for RFC 2625 IP-over-Fibre-Channel.
2497  * (We assume that the addresses are IEEE 48-bit MAC addresses,
2498  * as the RFC states.)
2499  */
2500 static struct block *
2501 gen_ipfchostop(eaddr, dir)
2502 	register const u_char *eaddr;
2503 	register int dir;
2504 {
2505 	register struct block *b0, *b1;
2506 
2507 	switch (dir) {
2508 	case Q_SRC:
2509 		return gen_bcmp(10, 6, eaddr);
2510 
2511 	case Q_DST:
2512 		return gen_bcmp(2, 6, eaddr);
2513 
2514 	case Q_AND:
2515 		b0 = gen_ipfchostop(eaddr, Q_SRC);
2516 		b1 = gen_ipfchostop(eaddr, Q_DST);
2517 		gen_and(b0, b1);
2518 		return b1;
2519 
2520 	case Q_DEFAULT:
2521 	case Q_OR:
2522 		b0 = gen_ipfchostop(eaddr, Q_SRC);
2523 		b1 = gen_ipfchostop(eaddr, Q_DST);
2524 		gen_or(b0, b1);
2525 		return b1;
2526 	}
2527 	abort();
2528 	/* NOTREACHED */
2529 }
2530 
2531 /*
2532  * This is quite tricky because there may be pad bytes in front of the
2533  * DECNET header, and then there are two possible data packet formats that
2534  * carry both src and dst addresses, plus 5 packet types in a format that
2535  * carries only the src node, plus 2 types that use a different format and
2536  * also carry just the src node.
2537  *
2538  * Yuck.
2539  *
2540  * Instead of doing those all right, we just look for data packets with
2541  * 0 or 1 bytes of padding.  If you want to look at other packets, that
2542  * will require a lot more hacking.
2543  *
2544  * To add support for filtering on DECNET "areas" (network numbers)
2545  * one would want to add a "mask" argument to this routine.  That would
2546  * make the filter even more inefficient, although one could be clever
2547  * and not generate masking instructions if the mask is 0xFFFF.
2548  */
2549 static struct block *
2550 gen_dnhostop(addr, dir, base_off)
2551 	bpf_u_int32 addr;
2552 	int dir;
2553 	u_int base_off;
2554 {
2555 	struct block *b0, *b1, *b2, *tmp;
2556 	u_int offset_lh;	/* offset if long header is received */
2557 	u_int offset_sh;	/* offset if short header is received */
2558 
2559 	switch (dir) {
2560 
2561 	case Q_DST:
2562 		offset_sh = 1;	/* follows flags */
2563 		offset_lh = 7;	/* flgs,darea,dsubarea,HIORD */
2564 		break;
2565 
2566 	case Q_SRC:
2567 		offset_sh = 3;	/* follows flags, dstnode */
2568 		offset_lh = 15;	/* flgs,darea,dsubarea,did,sarea,ssub,HIORD */
2569 		break;
2570 
2571 	case Q_AND:
2572 		/* Inefficient because we do our Calvinball dance twice */
2573 		b0 = gen_dnhostop(addr, Q_SRC, base_off);
2574 		b1 = gen_dnhostop(addr, Q_DST, base_off);
2575 		gen_and(b0, b1);
2576 		return b1;
2577 
2578 	case Q_OR:
2579 	case Q_DEFAULT:
2580 		/* Inefficient because we do our Calvinball dance twice */
2581 		b0 = gen_dnhostop(addr, Q_SRC, base_off);
2582 		b1 = gen_dnhostop(addr, Q_DST, base_off);
2583 		gen_or(b0, b1);
2584 		return b1;
2585 
2586 	case Q_ISO:
2587 		bpf_error("ISO host filtering not implemented");
2588 
2589 	default:
2590 		abort();
2591 	}
2592 	b0 = gen_linktype(ETHERTYPE_DN);
2593 	/* Check for pad = 1, long header case */
2594 	tmp = gen_mcmp(base_off + 2, BPF_H,
2595 	    (bpf_int32)ntohs(0x0681), (bpf_int32)ntohs(0x07FF));
2596 	b1 = gen_cmp(base_off + 2 + 1 + offset_lh,
2597 	    BPF_H, (bpf_int32)ntohs(addr));
2598 	gen_and(tmp, b1);
2599 	/* Check for pad = 0, long header case */
2600 	tmp = gen_mcmp(base_off + 2, BPF_B, (bpf_int32)0x06, (bpf_int32)0x7);
2601 	b2 = gen_cmp(base_off + 2 + offset_lh, BPF_H, (bpf_int32)ntohs(addr));
2602 	gen_and(tmp, b2);
2603 	gen_or(b2, b1);
2604 	/* Check for pad = 1, short header case */
2605 	tmp = gen_mcmp(base_off + 2, BPF_H,
2606 	    (bpf_int32)ntohs(0x0281), (bpf_int32)ntohs(0x07FF));
2607 	b2 = gen_cmp(base_off + 2 + 1 + offset_sh,
2608 	    BPF_H, (bpf_int32)ntohs(addr));
2609 	gen_and(tmp, b2);
2610 	gen_or(b2, b1);
2611 	/* Check for pad = 0, short header case */
2612 	tmp = gen_mcmp(base_off + 2, BPF_B, (bpf_int32)0x02, (bpf_int32)0x7);
2613 	b2 = gen_cmp(base_off + 2 + offset_sh, BPF_H, (bpf_int32)ntohs(addr));
2614 	gen_and(tmp, b2);
2615 	gen_or(b2, b1);
2616 
2617 	/* Combine with test for linktype */
2618 	gen_and(b0, b1);
2619 	return b1;
2620 }
2621 
2622 static struct block *
2623 gen_host(addr, mask, proto, dir)
2624 	bpf_u_int32 addr;
2625 	bpf_u_int32 mask;
2626 	int proto;
2627 	int dir;
2628 {
2629 	struct block *b0, *b1;
2630 
2631 	switch (proto) {
2632 
2633 	case Q_DEFAULT:
2634 		b0 = gen_host(addr, mask, Q_IP, dir);
2635 		if (off_linktype != (u_int)-1) {
2636 		    b1 = gen_host(addr, mask, Q_ARP, dir);
2637 		    gen_or(b0, b1);
2638 		    b0 = gen_host(addr, mask, Q_RARP, dir);
2639 		    gen_or(b1, b0);
2640 		}
2641 		return b0;
2642 
2643 	case Q_IP:
2644 		return gen_hostop(addr, mask, dir, ETHERTYPE_IP,
2645 				  off_nl + 12, off_nl + 16);
2646 
2647 	case Q_RARP:
2648 		return gen_hostop(addr, mask, dir, ETHERTYPE_REVARP,
2649 				  off_nl + 14, off_nl + 24);
2650 
2651 	case Q_ARP:
2652 		return gen_hostop(addr, mask, dir, ETHERTYPE_ARP,
2653 				  off_nl + 14, off_nl + 24);
2654 
2655 	case Q_TCP:
2656 		bpf_error("'tcp' modifier applied to host");
2657 
2658 	case Q_SCTP:
2659 		bpf_error("'sctp' modifier applied to host");
2660 
2661 	case Q_UDP:
2662 		bpf_error("'udp' modifier applied to host");
2663 
2664 	case Q_ICMP:
2665 		bpf_error("'icmp' modifier applied to host");
2666 
2667 	case Q_IGMP:
2668 		bpf_error("'igmp' modifier applied to host");
2669 
2670 	case Q_IGRP:
2671 		bpf_error("'igrp' modifier applied to host");
2672 
2673 	case Q_PIM:
2674 		bpf_error("'pim' modifier applied to host");
2675 
2676 	case Q_VRRP:
2677 		bpf_error("'vrrp' modifier applied to host");
2678 
2679 	case Q_ATALK:
2680 		bpf_error("ATALK host filtering not implemented");
2681 
2682 	case Q_AARP:
2683 		bpf_error("AARP host filtering not implemented");
2684 
2685 	case Q_DECNET:
2686 		return gen_dnhostop(addr, dir, off_nl);
2687 
2688 	case Q_SCA:
2689 		bpf_error("SCA host filtering not implemented");
2690 
2691 	case Q_LAT:
2692 		bpf_error("LAT host filtering not implemented");
2693 
2694 	case Q_MOPDL:
2695 		bpf_error("MOPDL host filtering not implemented");
2696 
2697 	case Q_MOPRC:
2698 		bpf_error("MOPRC host filtering not implemented");
2699 
2700 #ifdef INET6
2701 	case Q_IPV6:
2702 		bpf_error("'ip6' modifier applied to ip host");
2703 
2704 	case Q_ICMPV6:
2705 		bpf_error("'icmp6' modifier applied to host");
2706 #endif /* INET6 */
2707 
2708 	case Q_AH:
2709 		bpf_error("'ah' modifier applied to host");
2710 
2711 	case Q_ESP:
2712 		bpf_error("'esp' modifier applied to host");
2713 
2714 	case Q_ISO:
2715 		bpf_error("ISO host filtering not implemented");
2716 
2717 	case Q_ESIS:
2718 		bpf_error("'esis' modifier applied to host");
2719 
2720 	case Q_ISIS:
2721 		bpf_error("'isis' modifier applied to host");
2722 
2723 	case Q_CLNP:
2724 		bpf_error("'clnp' modifier applied to host");
2725 
2726 	case Q_STP:
2727 		bpf_error("'stp' modifier applied to host");
2728 
2729 	case Q_IPX:
2730 		bpf_error("IPX host filtering not implemented");
2731 
2732 	case Q_NETBEUI:
2733 		bpf_error("'netbeui' modifier applied to host");
2734 
2735 	default:
2736 		abort();
2737 	}
2738 	/* NOTREACHED */
2739 }
2740 
2741 #ifdef INET6
2742 static struct block *
2743 gen_host6(addr, mask, proto, dir)
2744 	struct in6_addr *addr;
2745 	struct in6_addr *mask;
2746 	int proto;
2747 	int dir;
2748 {
2749 	switch (proto) {
2750 
2751 	case Q_DEFAULT:
2752 		return gen_host6(addr, mask, Q_IPV6, dir);
2753 
2754 	case Q_IP:
2755 		bpf_error("'ip' modifier applied to ip6 host");
2756 
2757 	case Q_RARP:
2758 		bpf_error("'rarp' modifier applied to ip6 host");
2759 
2760 	case Q_ARP:
2761 		bpf_error("'arp' modifier applied to ip6 host");
2762 
2763 	case Q_SCTP:
2764 		bpf_error("'sctp' modifier applied to host");
2765 
2766 	case Q_TCP:
2767 		bpf_error("'tcp' modifier applied to host");
2768 
2769 	case Q_UDP:
2770 		bpf_error("'udp' modifier applied to host");
2771 
2772 	case Q_ICMP:
2773 		bpf_error("'icmp' modifier applied to host");
2774 
2775 	case Q_IGMP:
2776 		bpf_error("'igmp' modifier applied to host");
2777 
2778 	case Q_IGRP:
2779 		bpf_error("'igrp' modifier applied to host");
2780 
2781 	case Q_PIM:
2782 		bpf_error("'pim' modifier applied to host");
2783 
2784 	case Q_VRRP:
2785 		bpf_error("'vrrp' modifier applied to host");
2786 
2787 	case Q_ATALK:
2788 		bpf_error("ATALK host filtering not implemented");
2789 
2790 	case Q_AARP:
2791 		bpf_error("AARP host filtering not implemented");
2792 
2793 	case Q_DECNET:
2794 		bpf_error("'decnet' modifier applied to ip6 host");
2795 
2796 	case Q_SCA:
2797 		bpf_error("SCA host filtering not implemented");
2798 
2799 	case Q_LAT:
2800 		bpf_error("LAT host filtering not implemented");
2801 
2802 	case Q_MOPDL:
2803 		bpf_error("MOPDL host filtering not implemented");
2804 
2805 	case Q_MOPRC:
2806 		bpf_error("MOPRC host filtering not implemented");
2807 
2808 	case Q_IPV6:
2809 		return gen_hostop6(addr, mask, dir, ETHERTYPE_IPV6,
2810 				  off_nl + 8, off_nl + 24);
2811 
2812 	case Q_ICMPV6:
2813 		bpf_error("'icmp6' modifier applied to host");
2814 
2815 	case Q_AH:
2816 		bpf_error("'ah' modifier applied to host");
2817 
2818 	case Q_ESP:
2819 		bpf_error("'esp' modifier applied to host");
2820 
2821 	case Q_ISO:
2822 		bpf_error("ISO host filtering not implemented");
2823 
2824 	case Q_ESIS:
2825 		bpf_error("'esis' modifier applied to host");
2826 
2827 	case Q_ISIS:
2828 		bpf_error("'isis' modifier applied to host");
2829 
2830 	case Q_CLNP:
2831 		bpf_error("'clnp' modifier applied to host");
2832 
2833 	case Q_STP:
2834 		bpf_error("'stp' modifier applied to host");
2835 
2836 	case Q_IPX:
2837 		bpf_error("IPX host filtering not implemented");
2838 
2839 	case Q_NETBEUI:
2840 		bpf_error("'netbeui' modifier applied to host");
2841 
2842 	default:
2843 		abort();
2844 	}
2845 	/* NOTREACHED */
2846 }
2847 #endif /*INET6*/
2848 
2849 #ifndef INET6
2850 static struct block *
2851 gen_gateway(eaddr, alist, proto, dir)
2852 	const u_char *eaddr;
2853 	bpf_u_int32 **alist;
2854 	int proto;
2855 	int dir;
2856 {
2857 	struct block *b0, *b1, *tmp;
2858 
2859 	if (dir != 0)
2860 		bpf_error("direction applied to 'gateway'");
2861 
2862 	switch (proto) {
2863 	case Q_DEFAULT:
2864 	case Q_IP:
2865 	case Q_ARP:
2866 	case Q_RARP:
2867 		if (linktype == DLT_EN10MB)
2868 			b0 = gen_ehostop(eaddr, Q_OR);
2869 		else if (linktype == DLT_FDDI)
2870 			b0 = gen_fhostop(eaddr, Q_OR);
2871 		else if (linktype == DLT_IEEE802)
2872 			b0 = gen_thostop(eaddr, Q_OR);
2873 		else if (linktype == DLT_IEEE802_11)
2874 			b0 = gen_wlanhostop(eaddr, Q_OR);
2875 		else if (linktype == DLT_SUNATM && is_lane) {
2876 			/*
2877 			 * Check that the packet doesn't begin with an
2878 			 * LE Control marker.  (We've already generated
2879 			 * a test for LANE.)
2880 			 */
2881 			b1 = gen_cmp(SUNATM_PKT_BEGIN_POS, BPF_H, 0xFF00);
2882 			gen_not(b1);
2883 
2884 			/*
2885 			 * Now check the MAC address.
2886 			 */
2887 			b0 = gen_ehostop(eaddr, Q_OR);
2888 			gen_and(b1, b0);
2889 		} else if (linktype == DLT_IP_OVER_FC)
2890 			b0 = gen_ipfchostop(eaddr, Q_OR);
2891 		else
2892 			bpf_error(
2893 			    "'gateway' supported only on ethernet/FDDI/token ring/802.11/Fibre Channel");
2894 
2895 		b1 = gen_host(**alist++, 0xffffffff, proto, Q_OR);
2896 		while (*alist) {
2897 			tmp = gen_host(**alist++, 0xffffffff, proto, Q_OR);
2898 			gen_or(b1, tmp);
2899 			b1 = tmp;
2900 		}
2901 		gen_not(b1);
2902 		gen_and(b0, b1);
2903 		return b1;
2904 	}
2905 	bpf_error("illegal modifier of 'gateway'");
2906 	/* NOTREACHED */
2907 }
2908 #endif
2909 
2910 struct block *
2911 gen_proto_abbrev(proto)
2912 	int proto;
2913 {
2914 	struct block *b0;
2915 	struct block *b1;
2916 
2917 	switch (proto) {
2918 
2919 	case Q_SCTP:
2920 		b1 = gen_proto(IPPROTO_SCTP, Q_IP, Q_DEFAULT);
2921 #ifdef INET6
2922 		b0 = gen_proto(IPPROTO_SCTP, Q_IPV6, Q_DEFAULT);
2923 		gen_or(b0, b1);
2924 #endif
2925 		break;
2926 
2927 	case Q_TCP:
2928 		b1 = gen_proto(IPPROTO_TCP, Q_IP, Q_DEFAULT);
2929 #ifdef INET6
2930 		b0 = gen_proto(IPPROTO_TCP, Q_IPV6, Q_DEFAULT);
2931 		gen_or(b0, b1);
2932 #endif
2933 		break;
2934 
2935 	case Q_UDP:
2936 		b1 = gen_proto(IPPROTO_UDP, Q_IP, Q_DEFAULT);
2937 #ifdef INET6
2938 		b0 = gen_proto(IPPROTO_UDP, Q_IPV6, Q_DEFAULT);
2939 		gen_or(b0, b1);
2940 #endif
2941 		break;
2942 
2943 	case Q_ICMP:
2944 		b1 = gen_proto(IPPROTO_ICMP, Q_IP, Q_DEFAULT);
2945 		break;
2946 
2947 #ifndef	IPPROTO_IGMP
2948 #define	IPPROTO_IGMP	2
2949 #endif
2950 
2951 	case Q_IGMP:
2952 		b1 = gen_proto(IPPROTO_IGMP, Q_IP, Q_DEFAULT);
2953 		break;
2954 
2955 #ifndef	IPPROTO_IGRP
2956 #define	IPPROTO_IGRP	9
2957 #endif
2958 	case Q_IGRP:
2959 		b1 = gen_proto(IPPROTO_IGRP, Q_IP, Q_DEFAULT);
2960 		break;
2961 
2962 #ifndef IPPROTO_PIM
2963 #define IPPROTO_PIM	103
2964 #endif
2965 
2966 	case Q_PIM:
2967 		b1 = gen_proto(IPPROTO_PIM, Q_IP, Q_DEFAULT);
2968 #ifdef INET6
2969 		b0 = gen_proto(IPPROTO_PIM, Q_IPV6, Q_DEFAULT);
2970 		gen_or(b0, b1);
2971 #endif
2972 		break;
2973 
2974 #ifndef IPPROTO_VRRP
2975 #define IPPROTO_VRRP	112
2976 #endif
2977 
2978 	case Q_VRRP:
2979 		b1 = gen_proto(IPPROTO_VRRP, Q_IP, Q_DEFAULT);
2980 		break;
2981 
2982 	case Q_IP:
2983 		b1 =  gen_linktype(ETHERTYPE_IP);
2984 		break;
2985 
2986 	case Q_ARP:
2987 		b1 =  gen_linktype(ETHERTYPE_ARP);
2988 		break;
2989 
2990 	case Q_RARP:
2991 		b1 =  gen_linktype(ETHERTYPE_REVARP);
2992 		break;
2993 
2994 	case Q_LINK:
2995 		bpf_error("link layer applied in wrong context");
2996 
2997 	case Q_ATALK:
2998 		b1 =  gen_linktype(ETHERTYPE_ATALK);
2999 		break;
3000 
3001 	case Q_AARP:
3002 		b1 =  gen_linktype(ETHERTYPE_AARP);
3003 		break;
3004 
3005 	case Q_DECNET:
3006 		b1 =  gen_linktype(ETHERTYPE_DN);
3007 		break;
3008 
3009 	case Q_SCA:
3010 		b1 =  gen_linktype(ETHERTYPE_SCA);
3011 		break;
3012 
3013 	case Q_LAT:
3014 		b1 =  gen_linktype(ETHERTYPE_LAT);
3015 		break;
3016 
3017 	case Q_MOPDL:
3018 		b1 =  gen_linktype(ETHERTYPE_MOPDL);
3019 		break;
3020 
3021 	case Q_MOPRC:
3022 		b1 =  gen_linktype(ETHERTYPE_MOPRC);
3023 		break;
3024 
3025 #ifdef INET6
3026 	case Q_IPV6:
3027 		b1 = gen_linktype(ETHERTYPE_IPV6);
3028 		break;
3029 
3030 #ifndef IPPROTO_ICMPV6
3031 #define IPPROTO_ICMPV6	58
3032 #endif
3033 	case Q_ICMPV6:
3034 		b1 = gen_proto(IPPROTO_ICMPV6, Q_IPV6, Q_DEFAULT);
3035 		break;
3036 #endif /* INET6 */
3037 
3038 #ifndef IPPROTO_AH
3039 #define IPPROTO_AH	51
3040 #endif
3041 	case Q_AH:
3042 		b1 = gen_proto(IPPROTO_AH, Q_IP, Q_DEFAULT);
3043 #ifdef INET6
3044 		b0 = gen_proto(IPPROTO_AH, Q_IPV6, Q_DEFAULT);
3045 		gen_or(b0, b1);
3046 #endif
3047 		break;
3048 
3049 #ifndef IPPROTO_ESP
3050 #define IPPROTO_ESP	50
3051 #endif
3052 	case Q_ESP:
3053 		b1 = gen_proto(IPPROTO_ESP, Q_IP, Q_DEFAULT);
3054 #ifdef INET6
3055 		b0 = gen_proto(IPPROTO_ESP, Q_IPV6, Q_DEFAULT);
3056 		gen_or(b0, b1);
3057 #endif
3058 		break;
3059 
3060 	case Q_ISO:
3061 		b1 = gen_linktype(LLCSAP_ISONS);
3062 		break;
3063 
3064 	case Q_ESIS:
3065 		b1 = gen_proto(ISO9542_ESIS, Q_ISO, Q_DEFAULT);
3066 		break;
3067 
3068 	case Q_ISIS:
3069 		b1 = gen_proto(ISO10589_ISIS, Q_ISO, Q_DEFAULT);
3070 		break;
3071 
3072 	case Q_ISIS_L1: /* all IS-IS Level1 PDU-Types */
3073 		b0 = gen_proto(ISIS_L1_LAN_IIH, Q_ISIS, Q_DEFAULT);
3074 		b1 = gen_proto(ISIS_PTP_IIH, Q_ISIS, Q_DEFAULT); /* FIXME extract the circuit-type bits */
3075 		gen_or(b0, b1);
3076 		b0 = gen_proto(ISIS_L1_LSP, Q_ISIS, Q_DEFAULT);
3077 		gen_or(b0, b1);
3078 		b0 = gen_proto(ISIS_L1_CSNP, Q_ISIS, Q_DEFAULT);
3079 		gen_or(b0, b1);
3080 		b0 = gen_proto(ISIS_L1_PSNP, Q_ISIS, Q_DEFAULT);
3081 		gen_or(b0, b1);
3082 		break;
3083 
3084 	case Q_ISIS_L2: /* all IS-IS Level2 PDU-Types */
3085 		b0 = gen_proto(ISIS_L2_LAN_IIH, Q_ISIS, Q_DEFAULT);
3086 		b1 = gen_proto(ISIS_PTP_IIH, Q_ISIS, Q_DEFAULT); /* FIXME extract the circuit-type bits */
3087 		gen_or(b0, b1);
3088 		b0 = gen_proto(ISIS_L2_LSP, Q_ISIS, Q_DEFAULT);
3089 		gen_or(b0, b1);
3090 		b0 = gen_proto(ISIS_L2_CSNP, Q_ISIS, Q_DEFAULT);
3091 		gen_or(b0, b1);
3092 		b0 = gen_proto(ISIS_L2_PSNP, Q_ISIS, Q_DEFAULT);
3093 		gen_or(b0, b1);
3094 		break;
3095 
3096 	case Q_ISIS_IIH: /* all IS-IS Hello PDU-Types */
3097 		b0 = gen_proto(ISIS_L1_LAN_IIH, Q_ISIS, Q_DEFAULT);
3098 		b1 = gen_proto(ISIS_L2_LAN_IIH, Q_ISIS, Q_DEFAULT);
3099 		gen_or(b0, b1);
3100 		b0 = gen_proto(ISIS_PTP_IIH, Q_ISIS, Q_DEFAULT);
3101 		gen_or(b0, b1);
3102 		break;
3103 
3104 	case Q_ISIS_LSP:
3105 		b0 = gen_proto(ISIS_L1_LSP, Q_ISIS, Q_DEFAULT);
3106 		b1 = gen_proto(ISIS_L2_LSP, Q_ISIS, Q_DEFAULT);
3107 		gen_or(b0, b1);
3108 		break;
3109 
3110 	case Q_ISIS_SNP:
3111 		b0 = gen_proto(ISIS_L1_CSNP, Q_ISIS, Q_DEFAULT);
3112 		b1 = gen_proto(ISIS_L2_CSNP, Q_ISIS, Q_DEFAULT);
3113 		gen_or(b0, b1);
3114 		b0 = gen_proto(ISIS_L1_PSNP, Q_ISIS, Q_DEFAULT);
3115 		gen_or(b0, b1);
3116 		b0 = gen_proto(ISIS_L2_PSNP, Q_ISIS, Q_DEFAULT);
3117 		gen_or(b0, b1);
3118 		break;
3119 
3120 	case Q_ISIS_CSNP:
3121 		b0 = gen_proto(ISIS_L1_CSNP, Q_ISIS, Q_DEFAULT);
3122 		b1 = gen_proto(ISIS_L2_CSNP, Q_ISIS, Q_DEFAULT);
3123 		gen_or(b0, b1);
3124 		break;
3125 
3126 	case Q_ISIS_PSNP:
3127 		b0 = gen_proto(ISIS_L1_PSNP, Q_ISIS, Q_DEFAULT);
3128 		b1 = gen_proto(ISIS_L2_PSNP, Q_ISIS, Q_DEFAULT);
3129 		gen_or(b0, b1);
3130 		break;
3131 
3132 	case Q_CLNP:
3133 		b1 = gen_proto(ISO8473_CLNP, Q_ISO, Q_DEFAULT);
3134 		break;
3135 
3136 	case Q_STP:
3137 		b1 = gen_linktype(LLCSAP_8021D);
3138 		break;
3139 
3140 	case Q_IPX:
3141 		b1 = gen_linktype(LLCSAP_IPX);
3142 		break;
3143 
3144 	case Q_NETBEUI:
3145 		b1 = gen_linktype(LLCSAP_NETBEUI);
3146 		break;
3147 
3148 	default:
3149 		abort();
3150 	}
3151 	return b1;
3152 }
3153 
3154 static struct block *
3155 gen_ipfrag()
3156 {
3157 	struct slist *s;
3158 	struct block *b;
3159 
3160 	/* not ip frag */
3161 	s = new_stmt(BPF_LD|BPF_H|BPF_ABS);
3162 	s->s.k = off_nl + 6;
3163 	b = new_block(JMP(BPF_JSET));
3164 	b->s.k = 0x1fff;
3165 	b->stmts = s;
3166 	gen_not(b);
3167 
3168 	return b;
3169 }
3170 
3171 static struct block *
3172 gen_portatom(off, v)
3173 	int off;
3174 	bpf_int32 v;
3175 {
3176 	struct slist *s;
3177 	struct block *b;
3178 
3179 	s = new_stmt(BPF_LDX|BPF_MSH|BPF_B);
3180 	s->s.k = off_nl;
3181 
3182 	s->next = new_stmt(BPF_LD|BPF_IND|BPF_H);
3183 	s->next->s.k = off_nl + off;
3184 
3185 	b = new_block(JMP(BPF_JEQ));
3186 	b->stmts = s;
3187 	b->s.k = v;
3188 
3189 	return b;
3190 }
3191 
3192 #ifdef INET6
3193 static struct block *
3194 gen_portatom6(off, v)
3195 	int off;
3196 	bpf_int32 v;
3197 {
3198 	return gen_cmp(off_nl + 40 + off, BPF_H, v);
3199 }
3200 #endif/*INET6*/
3201 
3202 struct block *
3203 gen_portop(port, proto, dir)
3204 	int port, proto, dir;
3205 {
3206 	struct block *b0, *b1, *tmp;
3207 
3208 	/* ip proto 'proto' */
3209 	tmp = gen_cmp(off_nl + 9, BPF_B, (bpf_int32)proto);
3210 	b0 = gen_ipfrag();
3211 	gen_and(tmp, b0);
3212 
3213 	switch (dir) {
3214 	case Q_SRC:
3215 		b1 = gen_portatom(0, (bpf_int32)port);
3216 		break;
3217 
3218 	case Q_DST:
3219 		b1 = gen_portatom(2, (bpf_int32)port);
3220 		break;
3221 
3222 	case Q_OR:
3223 	case Q_DEFAULT:
3224 		tmp = gen_portatom(0, (bpf_int32)port);
3225 		b1 = gen_portatom(2, (bpf_int32)port);
3226 		gen_or(tmp, b1);
3227 		break;
3228 
3229 	case Q_AND:
3230 		tmp = gen_portatom(0, (bpf_int32)port);
3231 		b1 = gen_portatom(2, (bpf_int32)port);
3232 		gen_and(tmp, b1);
3233 		break;
3234 
3235 	default:
3236 		abort();
3237 	}
3238 	gen_and(b0, b1);
3239 
3240 	return b1;
3241 }
3242 
3243 static struct block *
3244 gen_port(port, ip_proto, dir)
3245 	int port;
3246 	int ip_proto;
3247 	int dir;
3248 {
3249 	struct block *b0, *b1, *tmp;
3250 
3251 	/*
3252 	 * ether proto ip
3253 	 *
3254 	 * For FDDI, RFC 1188 says that SNAP encapsulation is used,
3255 	 * not LLC encapsulation with LLCSAP_IP.
3256 	 *
3257 	 * For IEEE 802 networks - which includes 802.5 token ring
3258 	 * (which is what DLT_IEEE802 means) and 802.11 - RFC 1042
3259 	 * says that SNAP encapsulation is used, not LLC encapsulation
3260 	 * with LLCSAP_IP.
3261 	 *
3262 	 * For LLC-encapsulated ATM/"Classical IP", RFC 1483 and
3263 	 * RFC 2225 say that SNAP encapsulation is used, not LLC
3264 	 * encapsulation with LLCSAP_IP.
3265 	 *
3266 	 * So we always check for ETHERTYPE_IP.
3267 	 */
3268 	b0 =  gen_linktype(ETHERTYPE_IP);
3269 
3270 	switch (ip_proto) {
3271 	case IPPROTO_UDP:
3272 	case IPPROTO_TCP:
3273 	case IPPROTO_SCTP:
3274 		b1 = gen_portop(port, ip_proto, dir);
3275 		break;
3276 
3277 	case PROTO_UNDEF:
3278 		tmp = gen_portop(port, IPPROTO_TCP, dir);
3279 		b1 = gen_portop(port, IPPROTO_UDP, dir);
3280 		gen_or(tmp, b1);
3281 		tmp = gen_portop(port, IPPROTO_SCTP, dir);
3282 		gen_or(tmp, b1);
3283 		break;
3284 
3285 	default:
3286 		abort();
3287 	}
3288 	gen_and(b0, b1);
3289 	return b1;
3290 }
3291 
3292 #ifdef INET6
3293 struct block *
3294 gen_portop6(port, proto, dir)
3295 	int port, proto, dir;
3296 {
3297 	struct block *b0, *b1, *tmp;
3298 
3299 	/* ip proto 'proto' */
3300 	b0 = gen_cmp(off_nl + 6, BPF_B, (bpf_int32)proto);
3301 
3302 	switch (dir) {
3303 	case Q_SRC:
3304 		b1 = gen_portatom6(0, (bpf_int32)port);
3305 		break;
3306 
3307 	case Q_DST:
3308 		b1 = gen_portatom6(2, (bpf_int32)port);
3309 		break;
3310 
3311 	case Q_OR:
3312 	case Q_DEFAULT:
3313 		tmp = gen_portatom6(0, (bpf_int32)port);
3314 		b1 = gen_portatom6(2, (bpf_int32)port);
3315 		gen_or(tmp, b1);
3316 		break;
3317 
3318 	case Q_AND:
3319 		tmp = gen_portatom6(0, (bpf_int32)port);
3320 		b1 = gen_portatom6(2, (bpf_int32)port);
3321 		gen_and(tmp, b1);
3322 		break;
3323 
3324 	default:
3325 		abort();
3326 	}
3327 	gen_and(b0, b1);
3328 
3329 	return b1;
3330 }
3331 
3332 static struct block *
3333 gen_port6(port, ip_proto, dir)
3334 	int port;
3335 	int ip_proto;
3336 	int dir;
3337 {
3338 	struct block *b0, *b1, *tmp;
3339 
3340 	/* ether proto ip */
3341 	b0 =  gen_linktype(ETHERTYPE_IPV6);
3342 
3343 	switch (ip_proto) {
3344 	case IPPROTO_UDP:
3345 	case IPPROTO_TCP:
3346 	case IPPROTO_SCTP:
3347 		b1 = gen_portop6(port, ip_proto, dir);
3348 		break;
3349 
3350 	case PROTO_UNDEF:
3351 		tmp = gen_portop6(port, IPPROTO_TCP, dir);
3352 		b1 = gen_portop6(port, IPPROTO_UDP, dir);
3353 		gen_or(tmp, b1);
3354 		tmp = gen_portop6(port, IPPROTO_SCTP, dir);
3355 		gen_or(tmp, b1);
3356 		break;
3357 
3358 	default:
3359 		abort();
3360 	}
3361 	gen_and(b0, b1);
3362 	return b1;
3363 }
3364 #endif /* INET6 */
3365 
3366 static int
3367 lookup_proto(name, proto)
3368 	register const char *name;
3369 	register int proto;
3370 {
3371 	register int v;
3372 
3373 	switch (proto) {
3374 
3375 	case Q_DEFAULT:
3376 	case Q_IP:
3377 	case Q_IPV6:
3378 		v = pcap_nametoproto(name);
3379 		if (v == PROTO_UNDEF)
3380 			bpf_error("unknown ip proto '%s'", name);
3381 		break;
3382 
3383 	case Q_LINK:
3384 		/* XXX should look up h/w protocol type based on linktype */
3385 		v = pcap_nametoeproto(name);
3386 		if (v == PROTO_UNDEF) {
3387 			v = pcap_nametollc(name);
3388 			if (v == PROTO_UNDEF)
3389 				bpf_error("unknown ether proto '%s'", name);
3390 		}
3391 		break;
3392 
3393 	case Q_ISO:
3394 		if (strcmp(name, "esis") == 0)
3395 			v = ISO9542_ESIS;
3396 		else if (strcmp(name, "isis") == 0)
3397 			v = ISO10589_ISIS;
3398 		else if (strcmp(name, "clnp") == 0)
3399 			v = ISO8473_CLNP;
3400 		else
3401 			bpf_error("unknown osi proto '%s'", name);
3402 		break;
3403 
3404 	default:
3405 		v = PROTO_UNDEF;
3406 		break;
3407 	}
3408 	return v;
3409 }
3410 
3411 #if 0
3412 struct stmt *
3413 gen_joinsp(s, n)
3414 	struct stmt **s;
3415 	int n;
3416 {
3417 	return NULL;
3418 }
3419 #endif
3420 
3421 static struct block *
3422 gen_protochain(v, proto, dir)
3423 	int v;
3424 	int proto;
3425 	int dir;
3426 {
3427 #ifdef NO_PROTOCHAIN
3428 	return gen_proto(v, proto, dir);
3429 #else
3430 	struct block *b0, *b;
3431 	struct slist *s[100];
3432 	int fix2, fix3, fix4, fix5;
3433 	int ahcheck, again, end;
3434 	int i, max;
3435 	int reg2 = alloc_reg();
3436 
3437 	memset(s, 0, sizeof(s));
3438 	fix2 = fix3 = fix4 = fix5 = 0;
3439 
3440 	switch (proto) {
3441 	case Q_IP:
3442 	case Q_IPV6:
3443 		break;
3444 	case Q_DEFAULT:
3445 		b0 = gen_protochain(v, Q_IP, dir);
3446 		b = gen_protochain(v, Q_IPV6, dir);
3447 		gen_or(b0, b);
3448 		return b;
3449 	default:
3450 		bpf_error("bad protocol applied for 'protochain'");
3451 		/*NOTREACHED*/
3452 	}
3453 
3454 	no_optimize = 1; /*this code is not compatible with optimzer yet */
3455 
3456 	/*
3457 	 * s[0] is a dummy entry to protect other BPF insn from damaged
3458 	 * by s[fix] = foo with uninitialized variable "fix".  It is somewhat
3459 	 * hard to find interdependency made by jump table fixup.
3460 	 */
3461 	i = 0;
3462 	s[i] = new_stmt(0);	/*dummy*/
3463 	i++;
3464 
3465 	switch (proto) {
3466 	case Q_IP:
3467 		b0 = gen_linktype(ETHERTYPE_IP);
3468 
3469 		/* A = ip->ip_p */
3470 		s[i] = new_stmt(BPF_LD|BPF_ABS|BPF_B);
3471 		s[i]->s.k = off_nl + 9;
3472 		i++;
3473 		/* X = ip->ip_hl << 2 */
3474 		s[i] = new_stmt(BPF_LDX|BPF_MSH|BPF_B);
3475 		s[i]->s.k = off_nl;
3476 		i++;
3477 		break;
3478 #ifdef INET6
3479 	case Q_IPV6:
3480 		b0 = gen_linktype(ETHERTYPE_IPV6);
3481 
3482 		/* A = ip6->ip_nxt */
3483 		s[i] = new_stmt(BPF_LD|BPF_ABS|BPF_B);
3484 		s[i]->s.k = off_nl + 6;
3485 		i++;
3486 		/* X = sizeof(struct ip6_hdr) */
3487 		s[i] = new_stmt(BPF_LDX|BPF_IMM);
3488 		s[i]->s.k = 40;
3489 		i++;
3490 		break;
3491 #endif
3492 	default:
3493 		bpf_error("unsupported proto to gen_protochain");
3494 		/*NOTREACHED*/
3495 	}
3496 
3497 	/* again: if (A == v) goto end; else fall through; */
3498 	again = i;
3499 	s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
3500 	s[i]->s.k = v;
3501 	s[i]->s.jt = NULL;		/*later*/
3502 	s[i]->s.jf = NULL;		/*update in next stmt*/
3503 	fix5 = i;
3504 	i++;
3505 
3506 #ifndef IPPROTO_NONE
3507 #define IPPROTO_NONE	59
3508 #endif
3509 	/* if (A == IPPROTO_NONE) goto end */
3510 	s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
3511 	s[i]->s.jt = NULL;	/*later*/
3512 	s[i]->s.jf = NULL;	/*update in next stmt*/
3513 	s[i]->s.k = IPPROTO_NONE;
3514 	s[fix5]->s.jf = s[i];
3515 	fix2 = i;
3516 	i++;
3517 
3518 #ifdef INET6
3519 	if (proto == Q_IPV6) {
3520 		int v6start, v6end, v6advance, j;
3521 
3522 		v6start = i;
3523 		/* if (A == IPPROTO_HOPOPTS) goto v6advance */
3524 		s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
3525 		s[i]->s.jt = NULL;	/*later*/
3526 		s[i]->s.jf = NULL;	/*update in next stmt*/
3527 		s[i]->s.k = IPPROTO_HOPOPTS;
3528 		s[fix2]->s.jf = s[i];
3529 		i++;
3530 		/* if (A == IPPROTO_DSTOPTS) goto v6advance */
3531 		s[i - 1]->s.jf = s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
3532 		s[i]->s.jt = NULL;	/*later*/
3533 		s[i]->s.jf = NULL;	/*update in next stmt*/
3534 		s[i]->s.k = IPPROTO_DSTOPTS;
3535 		i++;
3536 		/* if (A == IPPROTO_ROUTING) goto v6advance */
3537 		s[i - 1]->s.jf = s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
3538 		s[i]->s.jt = NULL;	/*later*/
3539 		s[i]->s.jf = NULL;	/*update in next stmt*/
3540 		s[i]->s.k = IPPROTO_ROUTING;
3541 		i++;
3542 		/* if (A == IPPROTO_FRAGMENT) goto v6advance; else goto ahcheck; */
3543 		s[i - 1]->s.jf = s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
3544 		s[i]->s.jt = NULL;	/*later*/
3545 		s[i]->s.jf = NULL;	/*later*/
3546 		s[i]->s.k = IPPROTO_FRAGMENT;
3547 		fix3 = i;
3548 		v6end = i;
3549 		i++;
3550 
3551 		/* v6advance: */
3552 		v6advance = i;
3553 
3554 		/*
3555 		 * in short,
3556 		 * A = P[X];
3557 		 * X = X + (P[X + 1] + 1) * 8;
3558 		 */
3559 		/* A = X */
3560 		s[i] = new_stmt(BPF_MISC|BPF_TXA);
3561 		i++;
3562 		/* A = P[X + packet head] */
3563 		s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
3564 		s[i]->s.k = off_nl;
3565 		i++;
3566 		/* MEM[reg2] = A */
3567 		s[i] = new_stmt(BPF_ST);
3568 		s[i]->s.k = reg2;
3569 		i++;
3570 		/* A = X */
3571 		s[i] = new_stmt(BPF_MISC|BPF_TXA);
3572 		i++;
3573 		/* A += 1 */
3574 		s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
3575 		s[i]->s.k = 1;
3576 		i++;
3577 		/* X = A */
3578 		s[i] = new_stmt(BPF_MISC|BPF_TAX);
3579 		i++;
3580 		/* A = P[X + packet head]; */
3581 		s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
3582 		s[i]->s.k = off_nl;
3583 		i++;
3584 		/* A += 1 */
3585 		s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
3586 		s[i]->s.k = 1;
3587 		i++;
3588 		/* A *= 8 */
3589 		s[i] = new_stmt(BPF_ALU|BPF_MUL|BPF_K);
3590 		s[i]->s.k = 8;
3591 		i++;
3592 		/* X = A; */
3593 		s[i] = new_stmt(BPF_MISC|BPF_TAX);
3594 		i++;
3595 		/* A = MEM[reg2] */
3596 		s[i] = new_stmt(BPF_LD|BPF_MEM);
3597 		s[i]->s.k = reg2;
3598 		i++;
3599 
3600 		/* goto again; (must use BPF_JA for backward jump) */
3601 		s[i] = new_stmt(BPF_JMP|BPF_JA);
3602 		s[i]->s.k = again - i - 1;
3603 		s[i - 1]->s.jf = s[i];
3604 		i++;
3605 
3606 		/* fixup */
3607 		for (j = v6start; j <= v6end; j++)
3608 			s[j]->s.jt = s[v6advance];
3609 	} else
3610 #endif
3611 	{
3612 		/* nop */
3613 		s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
3614 		s[i]->s.k = 0;
3615 		s[fix2]->s.jf = s[i];
3616 		i++;
3617 	}
3618 
3619 	/* ahcheck: */
3620 	ahcheck = i;
3621 	/* if (A == IPPROTO_AH) then fall through; else goto end; */
3622 	s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
3623 	s[i]->s.jt = NULL;	/*later*/
3624 	s[i]->s.jf = NULL;	/*later*/
3625 	s[i]->s.k = IPPROTO_AH;
3626 	if (fix3)
3627 		s[fix3]->s.jf = s[ahcheck];
3628 	fix4 = i;
3629 	i++;
3630 
3631 	/*
3632 	 * in short,
3633 	 * A = P[X];
3634 	 * X = X + (P[X + 1] + 2) * 4;
3635 	 */
3636 	/* A = X */
3637 	s[i - 1]->s.jt = s[i] = new_stmt(BPF_MISC|BPF_TXA);
3638 	i++;
3639 	/* A = P[X + packet head]; */
3640 	s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
3641 	s[i]->s.k = off_nl;
3642 	i++;
3643 	/* MEM[reg2] = A */
3644 	s[i] = new_stmt(BPF_ST);
3645 	s[i]->s.k = reg2;
3646 	i++;
3647 	/* A = X */
3648 	s[i - 1]->s.jt = s[i] = new_stmt(BPF_MISC|BPF_TXA);
3649 	i++;
3650 	/* A += 1 */
3651 	s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
3652 	s[i]->s.k = 1;
3653 	i++;
3654 	/* X = A */
3655 	s[i] = new_stmt(BPF_MISC|BPF_TAX);
3656 	i++;
3657 	/* A = P[X + packet head] */
3658 	s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
3659 	s[i]->s.k = off_nl;
3660 	i++;
3661 	/* A += 2 */
3662 	s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
3663 	s[i]->s.k = 2;
3664 	i++;
3665 	/* A *= 4 */
3666 	s[i] = new_stmt(BPF_ALU|BPF_MUL|BPF_K);
3667 	s[i]->s.k = 4;
3668 	i++;
3669 	/* X = A; */
3670 	s[i] = new_stmt(BPF_MISC|BPF_TAX);
3671 	i++;
3672 	/* A = MEM[reg2] */
3673 	s[i] = new_stmt(BPF_LD|BPF_MEM);
3674 	s[i]->s.k = reg2;
3675 	i++;
3676 
3677 	/* goto again; (must use BPF_JA for backward jump) */
3678 	s[i] = new_stmt(BPF_JMP|BPF_JA);
3679 	s[i]->s.k = again - i - 1;
3680 	i++;
3681 
3682 	/* end: nop */
3683 	end = i;
3684 	s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
3685 	s[i]->s.k = 0;
3686 	s[fix2]->s.jt = s[end];
3687 	s[fix4]->s.jf = s[end];
3688 	s[fix5]->s.jt = s[end];
3689 	i++;
3690 
3691 	/*
3692 	 * make slist chain
3693 	 */
3694 	max = i;
3695 	for (i = 0; i < max - 1; i++)
3696 		s[i]->next = s[i + 1];
3697 	s[max - 1]->next = NULL;
3698 
3699 	/*
3700 	 * emit final check
3701 	 */
3702 	b = new_block(JMP(BPF_JEQ));
3703 	b->stmts = s[1];	/*remember, s[0] is dummy*/
3704 	b->s.k = v;
3705 
3706 	free_reg(reg2);
3707 
3708 	gen_and(b0, b);
3709 	return b;
3710 #endif
3711 }
3712 
3713 static struct block *
3714 gen_proto(v, proto, dir)
3715 	int v;
3716 	int proto;
3717 	int dir;
3718 {
3719 	struct block *b0, *b1;
3720 
3721 	if (dir != Q_DEFAULT)
3722 		bpf_error("direction applied to 'proto'");
3723 
3724 	switch (proto) {
3725 	case Q_DEFAULT:
3726 #ifdef INET6
3727 		b0 = gen_proto(v, Q_IP, dir);
3728 		b1 = gen_proto(v, Q_IPV6, dir);
3729 		gen_or(b0, b1);
3730 		return b1;
3731 #else
3732 		/*FALLTHROUGH*/
3733 #endif
3734 	case Q_IP:
3735 		/*
3736 		 * For FDDI, RFC 1188 says that SNAP encapsulation is used,
3737 		 * not LLC encapsulation with LLCSAP_IP.
3738 		 *
3739 		 * For IEEE 802 networks - which includes 802.5 token ring
3740 		 * (which is what DLT_IEEE802 means) and 802.11 - RFC 1042
3741 		 * says that SNAP encapsulation is used, not LLC encapsulation
3742 		 * with LLCSAP_IP.
3743 		 *
3744 		 * For LLC-encapsulated ATM/"Classical IP", RFC 1483 and
3745 		 * RFC 2225 say that SNAP encapsulation is used, not LLC
3746 		 * encapsulation with LLCSAP_IP.
3747 		 *
3748 		 * So we always check for ETHERTYPE_IP.
3749 		 */
3750 		b0 = gen_linktype(ETHERTYPE_IP);
3751 #ifndef CHASE_CHAIN
3752 		b1 = gen_cmp(off_nl + 9, BPF_B, (bpf_int32)v);
3753 #else
3754 		b1 = gen_protochain(v, Q_IP);
3755 #endif
3756 		gen_and(b0, b1);
3757 		return b1;
3758 
3759 	case Q_ISO:
3760 		switch (linktype) {
3761 
3762 		case DLT_FRELAY:
3763 			/*
3764 			 * Frame Relay packets typically have an OSI
3765 			 * NLPID at the beginning; "gen_linktype(LLCSAP_ISONS)"
3766 			 * generates code to check for all the OSI
3767 			 * NLPIDs, so calling it and then adding a check
3768 			 * for the particular NLPID for which we're
3769 			 * looking is bogus, as we can just check for
3770 			 * the NLPID.
3771 			 *
3772 			 * What we check for is the NLPID and a frame
3773 			 * control field value of UI, i.e. 0x03 followed
3774 			 * by the NLPID.
3775 			 *
3776 			 * XXX - assumes a 2-byte Frame Relay header with
3777 			 * DLCI and flags.  What if the address is longer?
3778 			 *
3779 			 * XXX - what about SNAP-encapsulated frames?
3780 			 */
3781 			return gen_cmp(2, BPF_H, (0x03<<8) | v);
3782 			/*NOTREACHED*/
3783 			break;
3784 
3785 		case DLT_C_HDLC:
3786 			/*
3787 			 * Cisco uses an Ethertype lookalike - for OSI,
3788 			 * it's 0xfefe.
3789 			 */
3790 			b0 = gen_linktype(LLCSAP_ISONS<<8 | LLCSAP_ISONS);
3791 			/* OSI in C-HDLC is stuffed with a fudge byte */
3792 			b1 = gen_cmp(off_nl_nosnap+1, BPF_B, (long)v);
3793 			gen_and(b0, b1);
3794 			return b1;
3795 
3796 		default:
3797 			b0 = gen_linktype(LLCSAP_ISONS);
3798 			b1 = gen_cmp(off_nl_nosnap, BPF_B, (long)v);
3799 			gen_and(b0, b1);
3800 			return b1;
3801 		}
3802 
3803 	case Q_ISIS:
3804 		b0 = gen_proto(ISO10589_ISIS, Q_ISO, Q_DEFAULT);
3805 		/*
3806 		 * 4 is the offset of the PDU type relative to the IS-IS
3807 		 * header.
3808 		 */
3809 		b1 = gen_cmp(off_nl_nosnap+4, BPF_B, (long)v);
3810 		gen_and(b0, b1);
3811 		return b1;
3812 
3813 	case Q_ARP:
3814 		bpf_error("arp does not encapsulate another protocol");
3815 		/* NOTREACHED */
3816 
3817 	case Q_RARP:
3818 		bpf_error("rarp does not encapsulate another protocol");
3819 		/* NOTREACHED */
3820 
3821 	case Q_ATALK:
3822 		bpf_error("atalk encapsulation is not specifiable");
3823 		/* NOTREACHED */
3824 
3825 	case Q_DECNET:
3826 		bpf_error("decnet encapsulation is not specifiable");
3827 		/* NOTREACHED */
3828 
3829 	case Q_SCA:
3830 		bpf_error("sca does not encapsulate another protocol");
3831 		/* NOTREACHED */
3832 
3833 	case Q_LAT:
3834 		bpf_error("lat does not encapsulate another protocol");
3835 		/* NOTREACHED */
3836 
3837 	case Q_MOPRC:
3838 		bpf_error("moprc does not encapsulate another protocol");
3839 		/* NOTREACHED */
3840 
3841 	case Q_MOPDL:
3842 		bpf_error("mopdl does not encapsulate another protocol");
3843 		/* NOTREACHED */
3844 
3845 	case Q_LINK:
3846 		return gen_linktype(v);
3847 
3848 	case Q_UDP:
3849 		bpf_error("'udp proto' is bogus");
3850 		/* NOTREACHED */
3851 
3852 	case Q_TCP:
3853 		bpf_error("'tcp proto' is bogus");
3854 		/* NOTREACHED */
3855 
3856 	case Q_SCTP:
3857 		bpf_error("'sctp proto' is bogus");
3858 		/* NOTREACHED */
3859 
3860 	case Q_ICMP:
3861 		bpf_error("'icmp proto' is bogus");
3862 		/* NOTREACHED */
3863 
3864 	case Q_IGMP:
3865 		bpf_error("'igmp proto' is bogus");
3866 		/* NOTREACHED */
3867 
3868 	case Q_IGRP:
3869 		bpf_error("'igrp proto' is bogus");
3870 		/* NOTREACHED */
3871 
3872 	case Q_PIM:
3873 		bpf_error("'pim proto' is bogus");
3874 		/* NOTREACHED */
3875 
3876 	case Q_VRRP:
3877 		bpf_error("'vrrp proto' is bogus");
3878 		/* NOTREACHED */
3879 
3880 #ifdef INET6
3881 	case Q_IPV6:
3882 		b0 = gen_linktype(ETHERTYPE_IPV6);
3883 #ifndef CHASE_CHAIN
3884 		b1 = gen_cmp(off_nl + 6, BPF_B, (bpf_int32)v);
3885 #else
3886 		b1 = gen_protochain(v, Q_IPV6);
3887 #endif
3888 		gen_and(b0, b1);
3889 		return b1;
3890 
3891 	case Q_ICMPV6:
3892 		bpf_error("'icmp6 proto' is bogus");
3893 #endif /* INET6 */
3894 
3895 	case Q_AH:
3896 		bpf_error("'ah proto' is bogus");
3897 
3898 	case Q_ESP:
3899 		bpf_error("'ah proto' is bogus");
3900 
3901 	case Q_STP:
3902 		bpf_error("'stp proto' is bogus");
3903 
3904 	case Q_IPX:
3905 		bpf_error("'ipx proto' is bogus");
3906 
3907 	case Q_NETBEUI:
3908 		bpf_error("'netbeui proto' is bogus");
3909 
3910 	default:
3911 		abort();
3912 		/* NOTREACHED */
3913 	}
3914 	/* NOTREACHED */
3915 }
3916 
3917 struct block *
3918 gen_scode(name, q)
3919 	register const char *name;
3920 	struct qual q;
3921 {
3922 	int proto = q.proto;
3923 	int dir = q.dir;
3924 	int tproto;
3925 	u_char *eaddr;
3926 	bpf_u_int32 mask, addr;
3927 #ifndef INET6
3928 	bpf_u_int32 **alist;
3929 #else
3930 	int tproto6;
3931 	struct sockaddr_in *sin;
3932 	struct sockaddr_in6 *sin6;
3933 	struct addrinfo *res, *res0;
3934 	struct in6_addr mask128;
3935 #endif /*INET6*/
3936 	struct block *b, *tmp;
3937 	int port, real_proto;
3938 
3939 	switch (q.addr) {
3940 
3941 	case Q_NET:
3942 		addr = pcap_nametonetaddr(name);
3943 		if (addr == 0)
3944 			bpf_error("unknown network '%s'", name);
3945 		/* Left justify network addr and calculate its network mask */
3946 		mask = 0xffffffff;
3947 		while (addr && (addr & 0xff000000) == 0) {
3948 			addr <<= 8;
3949 			mask <<= 8;
3950 		}
3951 		return gen_host(addr, mask, proto, dir);
3952 
3953 	case Q_DEFAULT:
3954 	case Q_HOST:
3955 		if (proto == Q_LINK) {
3956 			switch (linktype) {
3957 
3958 			case DLT_EN10MB:
3959 				eaddr = pcap_ether_hostton(name);
3960 				if (eaddr == NULL)
3961 					bpf_error(
3962 					    "unknown ether host '%s'", name);
3963 				b = gen_ehostop(eaddr, dir);
3964 				free(eaddr);
3965 				return b;
3966 
3967 			case DLT_FDDI:
3968 				eaddr = pcap_ether_hostton(name);
3969 				if (eaddr == NULL)
3970 					bpf_error(
3971 					    "unknown FDDI host '%s'", name);
3972 				b = gen_fhostop(eaddr, dir);
3973 				free(eaddr);
3974 				return b;
3975 
3976 			case DLT_IEEE802:
3977 				eaddr = pcap_ether_hostton(name);
3978 				if (eaddr == NULL)
3979 					bpf_error(
3980 					    "unknown token ring host '%s'", name);
3981 				b = gen_thostop(eaddr, dir);
3982 				free(eaddr);
3983 				return b;
3984 
3985 			case DLT_IEEE802_11:
3986 				eaddr = pcap_ether_hostton(name);
3987 				if (eaddr == NULL)
3988 					bpf_error(
3989 					    "unknown 802.11 host '%s'", name);
3990 				b = gen_wlanhostop(eaddr, dir);
3991 				free(eaddr);
3992 				return b;
3993 
3994 			case DLT_IP_OVER_FC:
3995 				eaddr = pcap_ether_hostton(name);
3996 				if (eaddr == NULL)
3997 					bpf_error(
3998 					    "unknown Fibre Channel host '%s'", name);
3999 				b = gen_ipfchostop(eaddr, dir);
4000 				free(eaddr);
4001 				return b;
4002 
4003 			case DLT_SUNATM:
4004 				if (!is_lane)
4005 					break;
4006 
4007 				/*
4008 				 * Check that the packet doesn't begin
4009 				 * with an LE Control marker.  (We've
4010 				 * already generated a test for LANE.)
4011 				 */
4012 				tmp = gen_cmp(SUNATM_PKT_BEGIN_POS, BPF_H,
4013 				    0xFF00);
4014 				gen_not(tmp);
4015 
4016 				eaddr = pcap_ether_hostton(name);
4017 				if (eaddr == NULL)
4018 					bpf_error(
4019 					    "unknown ether host '%s'", name);
4020 				b = gen_ehostop(eaddr, dir);
4021 				gen_and(tmp, b);
4022 				free(eaddr);
4023 				return b;
4024 			}
4025 
4026 			bpf_error("only ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel supports link-level host name");
4027 		} else if (proto == Q_DECNET) {
4028 			unsigned short dn_addr = __pcap_nametodnaddr(name);
4029 			/*
4030 			 * I don't think DECNET hosts can be multihomed, so
4031 			 * there is no need to build up a list of addresses
4032 			 */
4033 			return (gen_host(dn_addr, 0, proto, dir));
4034 		} else {
4035 #ifndef INET6
4036 			alist = pcap_nametoaddr(name);
4037 			if (alist == NULL || *alist == NULL)
4038 				bpf_error("unknown host '%s'", name);
4039 			tproto = proto;
4040 			if (off_linktype == (u_int)-1 && tproto == Q_DEFAULT)
4041 				tproto = Q_IP;
4042 			b = gen_host(**alist++, 0xffffffff, tproto, dir);
4043 			while (*alist) {
4044 				tmp = gen_host(**alist++, 0xffffffff,
4045 					       tproto, dir);
4046 				gen_or(b, tmp);
4047 				b = tmp;
4048 			}
4049 			return b;
4050 #else
4051 			memset(&mask128, 0xff, sizeof(mask128));
4052 			res0 = res = pcap_nametoaddrinfo(name);
4053 			if (res == NULL)
4054 				bpf_error("unknown host '%s'", name);
4055 			b = tmp = NULL;
4056 			tproto = tproto6 = proto;
4057 			if (off_linktype == -1 && tproto == Q_DEFAULT) {
4058 				tproto = Q_IP;
4059 				tproto6 = Q_IPV6;
4060 			}
4061 			for (res = res0; res; res = res->ai_next) {
4062 				switch (res->ai_family) {
4063 				case AF_INET:
4064 					if (tproto == Q_IPV6)
4065 						continue;
4066 
4067 					sin = (struct sockaddr_in *)
4068 						res->ai_addr;
4069 					tmp = gen_host(ntohl(sin->sin_addr.s_addr),
4070 						0xffffffff, tproto, dir);
4071 					break;
4072 				case AF_INET6:
4073 					if (tproto6 == Q_IP)
4074 						continue;
4075 
4076 					sin6 = (struct sockaddr_in6 *)
4077 						res->ai_addr;
4078 					tmp = gen_host6(&sin6->sin6_addr,
4079 						&mask128, tproto6, dir);
4080 					break;
4081 				default:
4082 					continue;
4083 				}
4084 				if (b)
4085 					gen_or(b, tmp);
4086 				b = tmp;
4087 			}
4088 			freeaddrinfo(res0);
4089 			if (b == NULL) {
4090 				bpf_error("unknown host '%s'%s", name,
4091 				    (proto == Q_DEFAULT)
4092 					? ""
4093 					: " for specified address family");
4094 			}
4095 			return b;
4096 #endif /*INET6*/
4097 		}
4098 
4099 	case Q_PORT:
4100 		if (proto != Q_DEFAULT &&
4101 		    proto != Q_UDP && proto != Q_TCP && proto != Q_SCTP)
4102 			bpf_error("illegal qualifier of 'port'");
4103 		if (pcap_nametoport(name, &port, &real_proto) == 0)
4104 			bpf_error("unknown port '%s'", name);
4105 		if (proto == Q_UDP) {
4106 			if (real_proto == IPPROTO_TCP)
4107 				bpf_error("port '%s' is tcp", name);
4108 			else if (real_proto == IPPROTO_SCTP)
4109 				bpf_error("port '%s' is sctp", name);
4110 			else
4111 				/* override PROTO_UNDEF */
4112 				real_proto = IPPROTO_UDP;
4113 		}
4114 		if (proto == Q_TCP) {
4115 			if (real_proto == IPPROTO_UDP)
4116 				bpf_error("port '%s' is udp", name);
4117 
4118 			else if (real_proto == IPPROTO_SCTP)
4119 				bpf_error("port '%s' is sctp", name);
4120 			else
4121 				/* override PROTO_UNDEF */
4122 				real_proto = IPPROTO_TCP;
4123 		}
4124 		if (proto == Q_SCTP) {
4125 			if (real_proto == IPPROTO_UDP)
4126 				bpf_error("port '%s' is udp", name);
4127 
4128 			else if (real_proto == IPPROTO_TCP)
4129 				bpf_error("port '%s' is tcp", name);
4130 			else
4131 				/* override PROTO_UNDEF */
4132 				real_proto = IPPROTO_SCTP;
4133 		}
4134 #ifndef INET6
4135 		return gen_port(port, real_proto, dir);
4136 #else
4137 	    {
4138 		struct block *b;
4139 		b = gen_port(port, real_proto, dir);
4140 		gen_or(gen_port6(port, real_proto, dir), b);
4141 		return b;
4142 	    }
4143 #endif /* INET6 */
4144 
4145 	case Q_GATEWAY:
4146 #ifndef INET6
4147 		eaddr = pcap_ether_hostton(name);
4148 		if (eaddr == NULL)
4149 			bpf_error("unknown ether host: %s", name);
4150 
4151 		alist = pcap_nametoaddr(name);
4152 		if (alist == NULL || *alist == NULL)
4153 			bpf_error("unknown host '%s'", name);
4154 		b = gen_gateway(eaddr, alist, proto, dir);
4155 		free(eaddr);
4156 		return b;
4157 #else
4158 		bpf_error("'gateway' not supported in this configuration");
4159 #endif /*INET6*/
4160 
4161 	case Q_PROTO:
4162 		real_proto = lookup_proto(name, proto);
4163 		if (real_proto >= 0)
4164 			return gen_proto(real_proto, proto, dir);
4165 		else
4166 			bpf_error("unknown protocol: %s", name);
4167 
4168 	case Q_PROTOCHAIN:
4169 		real_proto = lookup_proto(name, proto);
4170 		if (real_proto >= 0)
4171 			return gen_protochain(real_proto, proto, dir);
4172 		else
4173 			bpf_error("unknown protocol: %s", name);
4174 
4175 
4176 	case Q_UNDEF:
4177 		syntax();
4178 		/* NOTREACHED */
4179 	}
4180 	abort();
4181 	/* NOTREACHED */
4182 }
4183 
4184 struct block *
4185 gen_mcode(s1, s2, masklen, q)
4186 	register const char *s1, *s2;
4187 	register int masklen;
4188 	struct qual q;
4189 {
4190 	register int nlen, mlen;
4191 	bpf_u_int32 n, m;
4192 
4193 	nlen = __pcap_atoin(s1, &n);
4194 	/* Promote short ipaddr */
4195 	n <<= 32 - nlen;
4196 
4197 	if (s2 != NULL) {
4198 		mlen = __pcap_atoin(s2, &m);
4199 		/* Promote short ipaddr */
4200 		m <<= 32 - mlen;
4201 		if ((n & ~m) != 0)
4202 			bpf_error("non-network bits set in \"%s mask %s\"",
4203 			    s1, s2);
4204 	} else {
4205 		/* Convert mask len to mask */
4206 		if (masklen > 32)
4207 			bpf_error("mask length must be <= 32");
4208 		m = 0xffffffff << (32 - masklen);
4209 		if ((n & ~m) != 0)
4210 			bpf_error("non-network bits set in \"%s/%d\"",
4211 			    s1, masklen);
4212 	}
4213 
4214 	switch (q.addr) {
4215 
4216 	case Q_NET:
4217 		return gen_host(n, m, q.proto, q.dir);
4218 
4219 	default:
4220 		bpf_error("Mask syntax for networks only");
4221 		/* NOTREACHED */
4222 	}
4223 	/* NOTREACHED */
4224 }
4225 
4226 struct block *
4227 gen_ncode(s, v, q)
4228 	register const char *s;
4229 	bpf_u_int32 v;
4230 	struct qual q;
4231 {
4232 	bpf_u_int32 mask;
4233 	int proto = q.proto;
4234 	int dir = q.dir;
4235 	register int vlen;
4236 
4237 	if (s == NULL)
4238 		vlen = 32;
4239 	else if (q.proto == Q_DECNET)
4240 		vlen = __pcap_atodn(s, &v);
4241 	else
4242 		vlen = __pcap_atoin(s, &v);
4243 
4244 	switch (q.addr) {
4245 
4246 	case Q_DEFAULT:
4247 	case Q_HOST:
4248 	case Q_NET:
4249 		if (proto == Q_DECNET)
4250 			return gen_host(v, 0, proto, dir);
4251 		else if (proto == Q_LINK) {
4252 			bpf_error("illegal link layer address");
4253 		} else {
4254 			mask = 0xffffffff;
4255 			if (s == NULL && q.addr == Q_NET) {
4256 				/* Promote short net number */
4257 				while (v && (v & 0xff000000) == 0) {
4258 					v <<= 8;
4259 					mask <<= 8;
4260 				}
4261 			} else {
4262 				/* Promote short ipaddr */
4263 				v <<= 32 - vlen;
4264 				mask <<= 32 - vlen;
4265 			}
4266 			return gen_host(v, mask, proto, dir);
4267 		}
4268 
4269 	case Q_PORT:
4270 		if (proto == Q_UDP)
4271 			proto = IPPROTO_UDP;
4272 		else if (proto == Q_TCP)
4273 			proto = IPPROTO_TCP;
4274 		else if (proto == Q_SCTP)
4275 			proto = IPPROTO_SCTP;
4276 		else if (proto == Q_DEFAULT)
4277 			proto = PROTO_UNDEF;
4278 		else
4279 			bpf_error("illegal qualifier of 'port'");
4280 
4281 #ifndef INET6
4282 		return gen_port((int)v, proto, dir);
4283 #else
4284 	    {
4285 		struct block *b;
4286 		b = gen_port((int)v, proto, dir);
4287 		gen_or(gen_port6((int)v, proto, dir), b);
4288 		return b;
4289 	    }
4290 #endif /* INET6 */
4291 
4292 	case Q_GATEWAY:
4293 		bpf_error("'gateway' requires a name");
4294 		/* NOTREACHED */
4295 
4296 	case Q_PROTO:
4297 		return gen_proto((int)v, proto, dir);
4298 
4299 	case Q_PROTOCHAIN:
4300 		return gen_protochain((int)v, proto, dir);
4301 
4302 	case Q_UNDEF:
4303 		syntax();
4304 		/* NOTREACHED */
4305 
4306 	default:
4307 		abort();
4308 		/* NOTREACHED */
4309 	}
4310 	/* NOTREACHED */
4311 }
4312 
4313 #ifdef INET6
4314 struct block *
4315 gen_mcode6(s1, s2, masklen, q)
4316 	register const char *s1, *s2;
4317 	register int masklen;
4318 	struct qual q;
4319 {
4320 	struct addrinfo *res;
4321 	struct in6_addr *addr;
4322 	struct in6_addr mask;
4323 	struct block *b;
4324 	u_int32_t *a, *m;
4325 
4326 	if (s2)
4327 		bpf_error("no mask %s supported", s2);
4328 
4329 	res = pcap_nametoaddrinfo(s1);
4330 	if (!res)
4331 		bpf_error("invalid ip6 address %s", s1);
4332 	if (res->ai_next)
4333 		bpf_error("%s resolved to multiple address", s1);
4334 	addr = &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr;
4335 
4336 	if (sizeof(mask) * 8 < masklen)
4337 		bpf_error("mask length must be <= %u", (unsigned int)(sizeof(mask) * 8));
4338 	memset(&mask, 0, sizeof(mask));
4339 	memset(&mask, 0xff, masklen / 8);
4340 	if (masklen % 8) {
4341 		mask.s6_addr[masklen / 8] =
4342 			(0xff << (8 - masklen % 8)) & 0xff;
4343 	}
4344 
4345 	a = (u_int32_t *)addr;
4346 	m = (u_int32_t *)&mask;
4347 	if ((a[0] & ~m[0]) || (a[1] & ~m[1])
4348 	 || (a[2] & ~m[2]) || (a[3] & ~m[3])) {
4349 		bpf_error("non-network bits set in \"%s/%d\"", s1, masklen);
4350 	}
4351 
4352 	switch (q.addr) {
4353 
4354 	case Q_DEFAULT:
4355 	case Q_HOST:
4356 		if (masklen != 128)
4357 			bpf_error("Mask syntax for networks only");
4358 		/* FALLTHROUGH */
4359 
4360 	case Q_NET:
4361 		b = gen_host6(addr, &mask, q.proto, q.dir);
4362 		freeaddrinfo(res);
4363 		return b;
4364 
4365 	default:
4366 		bpf_error("invalid qualifier against IPv6 address");
4367 		/* NOTREACHED */
4368 	}
4369 }
4370 #endif /*INET6*/
4371 
4372 struct block *
4373 gen_ecode(eaddr, q)
4374 	register const u_char *eaddr;
4375 	struct qual q;
4376 {
4377 	struct block *b, *tmp;
4378 
4379 	if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) {
4380 		if (linktype == DLT_EN10MB)
4381 			return gen_ehostop(eaddr, (int)q.dir);
4382 		if (linktype == DLT_FDDI)
4383 			return gen_fhostop(eaddr, (int)q.dir);
4384 		if (linktype == DLT_IEEE802)
4385 			return gen_thostop(eaddr, (int)q.dir);
4386 		if (linktype == DLT_IEEE802_11)
4387 			return gen_wlanhostop(eaddr, (int)q.dir);
4388 		if (linktype == DLT_SUNATM && is_lane) {
4389 			/*
4390 			 * Check that the packet doesn't begin with an
4391 			 * LE Control marker.  (We've already generated
4392 			 * a test for LANE.)
4393 			 */
4394 			tmp = gen_cmp(SUNATM_PKT_BEGIN_POS, BPF_H, 0xFF00);
4395 			gen_not(tmp);
4396 
4397 			/*
4398 			 * Now check the MAC address.
4399 			 */
4400 			b = gen_ehostop(eaddr, (int)q.dir);
4401 			gen_and(tmp, b);
4402 			return b;
4403 		}
4404 		if (linktype == DLT_IP_OVER_FC)
4405 			return gen_ipfchostop(eaddr, (int)q.dir);
4406 		bpf_error("ethernet addresses supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
4407 	}
4408 	bpf_error("ethernet address used in non-ether expression");
4409 	/* NOTREACHED */
4410 }
4411 
4412 void
4413 sappend(s0, s1)
4414 	struct slist *s0, *s1;
4415 {
4416 	/*
4417 	 * This is definitely not the best way to do this, but the
4418 	 * lists will rarely get long.
4419 	 */
4420 	while (s0->next)
4421 		s0 = s0->next;
4422 	s0->next = s1;
4423 }
4424 
4425 static struct slist *
4426 xfer_to_x(a)
4427 	struct arth *a;
4428 {
4429 	struct slist *s;
4430 
4431 	s = new_stmt(BPF_LDX|BPF_MEM);
4432 	s->s.k = a->regno;
4433 	return s;
4434 }
4435 
4436 static struct slist *
4437 xfer_to_a(a)
4438 	struct arth *a;
4439 {
4440 	struct slist *s;
4441 
4442 	s = new_stmt(BPF_LD|BPF_MEM);
4443 	s->s.k = a->regno;
4444 	return s;
4445 }
4446 
4447 struct arth *
4448 gen_load(proto, index, size)
4449 	int proto;
4450 	struct arth *index;
4451 	int size;
4452 {
4453 	struct slist *s, *tmp;
4454 	struct block *b;
4455 	int regno = alloc_reg();
4456 
4457 	free_reg(index->regno);
4458 	switch (size) {
4459 
4460 	default:
4461 		bpf_error("data size must be 1, 2, or 4");
4462 
4463 	case 1:
4464 		size = BPF_B;
4465 		break;
4466 
4467 	case 2:
4468 		size = BPF_H;
4469 		break;
4470 
4471 	case 4:
4472 		size = BPF_W;
4473 		break;
4474 	}
4475 	switch (proto) {
4476 	default:
4477 		bpf_error("unsupported index operation");
4478 
4479 	case Q_LINK:
4480 		/*
4481 		 * XXX - what about ATM LANE?  Should the index be
4482 		 * relative to the beginning of the AAL5 frame, so
4483 		 * that 0 refers to the beginning of the LE Control
4484 		 * field, or relative to the beginning of the LAN
4485 		 * frame, so that 0 refers, for Ethernet LANE, to
4486 		 * the beginning of the destination address?
4487 		 */
4488 		s = xfer_to_x(index);
4489 		tmp = new_stmt(BPF_LD|BPF_IND|size);
4490 		sappend(s, tmp);
4491 		sappend(index->s, s);
4492 		break;
4493 
4494 	case Q_IP:
4495 	case Q_ARP:
4496 	case Q_RARP:
4497 	case Q_ATALK:
4498 	case Q_DECNET:
4499 	case Q_SCA:
4500 	case Q_LAT:
4501 	case Q_MOPRC:
4502 	case Q_MOPDL:
4503 #ifdef INET6
4504 	case Q_IPV6:
4505 #endif
4506 		/* XXX Note that we assume a fixed link header here. */
4507 		s = xfer_to_x(index);
4508 		tmp = new_stmt(BPF_LD|BPF_IND|size);
4509 		tmp->s.k = off_nl;
4510 		sappend(s, tmp);
4511 		sappend(index->s, s);
4512 
4513 		b = gen_proto_abbrev(proto);
4514 		if (index->b)
4515 			gen_and(index->b, b);
4516 		index->b = b;
4517 		break;
4518 
4519 	case Q_SCTP:
4520 	case Q_TCP:
4521 	case Q_UDP:
4522 	case Q_ICMP:
4523 	case Q_IGMP:
4524 	case Q_IGRP:
4525 	case Q_PIM:
4526 	case Q_VRRP:
4527 		s = new_stmt(BPF_LDX|BPF_MSH|BPF_B);
4528 		s->s.k = off_nl;
4529 		sappend(s, xfer_to_a(index));
4530 		sappend(s, new_stmt(BPF_ALU|BPF_ADD|BPF_X));
4531 		sappend(s, new_stmt(BPF_MISC|BPF_TAX));
4532 		sappend(s, tmp = new_stmt(BPF_LD|BPF_IND|size));
4533 		tmp->s.k = off_nl;
4534 		sappend(index->s, s);
4535 
4536 		gen_and(gen_proto_abbrev(proto), b = gen_ipfrag());
4537 		if (index->b)
4538 			gen_and(index->b, b);
4539 #ifdef INET6
4540 		gen_and(gen_proto_abbrev(Q_IP), b);
4541 #endif
4542 		index->b = b;
4543 		break;
4544 #ifdef INET6
4545 	case Q_ICMPV6:
4546 		bpf_error("IPv6 upper-layer protocol is not supported by proto[x]");
4547 		/*NOTREACHED*/
4548 #endif
4549 	}
4550 	index->regno = regno;
4551 	s = new_stmt(BPF_ST);
4552 	s->s.k = regno;
4553 	sappend(index->s, s);
4554 
4555 	return index;
4556 }
4557 
4558 struct block *
4559 gen_relation(code, a0, a1, reversed)
4560 	int code;
4561 	struct arth *a0, *a1;
4562 	int reversed;
4563 {
4564 	struct slist *s0, *s1, *s2;
4565 	struct block *b, *tmp;
4566 
4567 	s0 = xfer_to_x(a1);
4568 	s1 = xfer_to_a(a0);
4569 	if (code == BPF_JEQ) {
4570 		s2 = new_stmt(BPF_ALU|BPF_SUB|BPF_X);
4571 		b = new_block(JMP(code));
4572 		sappend(s1, s2);
4573 	}
4574 	else
4575 		b = new_block(BPF_JMP|code|BPF_X);
4576 	if (reversed)
4577 		gen_not(b);
4578 
4579 	sappend(s0, s1);
4580 	sappend(a1->s, s0);
4581 	sappend(a0->s, a1->s);
4582 
4583 	b->stmts = a0->s;
4584 
4585 	free_reg(a0->regno);
4586 	free_reg(a1->regno);
4587 
4588 	/* 'and' together protocol checks */
4589 	if (a0->b) {
4590 		if (a1->b) {
4591 			gen_and(a0->b, tmp = a1->b);
4592 		}
4593 		else
4594 			tmp = a0->b;
4595 	} else
4596 		tmp = a1->b;
4597 
4598 	if (tmp)
4599 		gen_and(tmp, b);
4600 
4601 	return b;
4602 }
4603 
4604 struct arth *
4605 gen_loadlen()
4606 {
4607 	int regno = alloc_reg();
4608 	struct arth *a = (struct arth *)newchunk(sizeof(*a));
4609 	struct slist *s;
4610 
4611 	s = new_stmt(BPF_LD|BPF_LEN);
4612 	s->next = new_stmt(BPF_ST);
4613 	s->next->s.k = regno;
4614 	a->s = s;
4615 	a->regno = regno;
4616 
4617 	return a;
4618 }
4619 
4620 struct arth *
4621 gen_loadi(val)
4622 	int val;
4623 {
4624 	struct arth *a;
4625 	struct slist *s;
4626 	int reg;
4627 
4628 	a = (struct arth *)newchunk(sizeof(*a));
4629 
4630 	reg = alloc_reg();
4631 
4632 	s = new_stmt(BPF_LD|BPF_IMM);
4633 	s->s.k = val;
4634 	s->next = new_stmt(BPF_ST);
4635 	s->next->s.k = reg;
4636 	a->s = s;
4637 	a->regno = reg;
4638 
4639 	return a;
4640 }
4641 
4642 struct arth *
4643 gen_neg(a)
4644 	struct arth *a;
4645 {
4646 	struct slist *s;
4647 
4648 	s = xfer_to_a(a);
4649 	sappend(a->s, s);
4650 	s = new_stmt(BPF_ALU|BPF_NEG);
4651 	s->s.k = 0;
4652 	sappend(a->s, s);
4653 	s = new_stmt(BPF_ST);
4654 	s->s.k = a->regno;
4655 	sappend(a->s, s);
4656 
4657 	return a;
4658 }
4659 
4660 struct arth *
4661 gen_arth(code, a0, a1)
4662 	int code;
4663 	struct arth *a0, *a1;
4664 {
4665 	struct slist *s0, *s1, *s2;
4666 
4667 	s0 = xfer_to_x(a1);
4668 	s1 = xfer_to_a(a0);
4669 	s2 = new_stmt(BPF_ALU|BPF_X|code);
4670 
4671 	sappend(s1, s2);
4672 	sappend(s0, s1);
4673 	sappend(a1->s, s0);
4674 	sappend(a0->s, a1->s);
4675 
4676 	free_reg(a0->regno);
4677 	free_reg(a1->regno);
4678 
4679 	s0 = new_stmt(BPF_ST);
4680 	a0->regno = s0->s.k = alloc_reg();
4681 	sappend(a0->s, s0);
4682 
4683 	return a0;
4684 }
4685 
4686 /*
4687  * Here we handle simple allocation of the scratch registers.
4688  * If too many registers are alloc'd, the allocator punts.
4689  */
4690 static int regused[BPF_MEMWORDS];
4691 static int curreg;
4692 
4693 /*
4694  * Return the next free register.
4695  */
4696 static int
4697 alloc_reg()
4698 {
4699 	int n = BPF_MEMWORDS;
4700 
4701 	while (--n >= 0) {
4702 		if (regused[curreg])
4703 			curreg = (curreg + 1) % BPF_MEMWORDS;
4704 		else {
4705 			regused[curreg] = 1;
4706 			return curreg;
4707 		}
4708 	}
4709 	bpf_error("too many registers needed to evaluate expression");
4710 	/* NOTREACHED */
4711 }
4712 
4713 /*
4714  * Return a register to the table so it can
4715  * be used later.
4716  */
4717 static void
4718 free_reg(n)
4719 	int n;
4720 {
4721 	regused[n] = 0;
4722 }
4723 
4724 static struct block *
4725 gen_len(jmp, n)
4726 	int jmp, n;
4727 {
4728 	struct slist *s;
4729 	struct block *b;
4730 
4731 	s = new_stmt(BPF_LD|BPF_LEN);
4732 	b = new_block(JMP(jmp));
4733 	b->stmts = s;
4734 	b->s.k = n;
4735 
4736 	return b;
4737 }
4738 
4739 struct block *
4740 gen_greater(n)
4741 	int n;
4742 {
4743 	return gen_len(BPF_JGE, n);
4744 }
4745 
4746 /*
4747  * Actually, this is less than or equal.
4748  */
4749 struct block *
4750 gen_less(n)
4751 	int n;
4752 {
4753 	struct block *b;
4754 
4755 	b = gen_len(BPF_JGT, n);
4756 	gen_not(b);
4757 
4758 	return b;
4759 }
4760 
4761 struct block *
4762 gen_byteop(op, idx, val)
4763 	int op, idx, val;
4764 {
4765 	struct block *b;
4766 	struct slist *s;
4767 
4768 	switch (op) {
4769 	default:
4770 		abort();
4771 
4772 	case '=':
4773 		return gen_cmp((u_int)idx, BPF_B, (bpf_int32)val);
4774 
4775 	case '<':
4776 		b = gen_cmp((u_int)idx, BPF_B, (bpf_int32)val);
4777 		b->s.code = JMP(BPF_JGE);
4778 		gen_not(b);
4779 		return b;
4780 
4781 	case '>':
4782 		b = gen_cmp((u_int)idx, BPF_B, (bpf_int32)val);
4783 		b->s.code = JMP(BPF_JGT);
4784 		return b;
4785 
4786 	case '|':
4787 		s = new_stmt(BPF_ALU|BPF_OR|BPF_K);
4788 		break;
4789 
4790 	case '&':
4791 		s = new_stmt(BPF_ALU|BPF_AND|BPF_K);
4792 		break;
4793 	}
4794 	s->s.k = val;
4795 	b = new_block(JMP(BPF_JEQ));
4796 	b->stmts = s;
4797 	gen_not(b);
4798 
4799 	return b;
4800 }
4801 
4802 static u_char abroadcast[] = { 0x0 };
4803 
4804 struct block *
4805 gen_broadcast(proto)
4806 	int proto;
4807 {
4808 	bpf_u_int32 hostmask;
4809 	struct block *b0, *b1, *b2;
4810 	static u_char ebroadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4811 
4812 	switch (proto) {
4813 
4814 	case Q_DEFAULT:
4815 	case Q_LINK:
4816 		if (linktype == DLT_ARCNET || linktype == DLT_ARCNET_LINUX)
4817 			return gen_ahostop(abroadcast, Q_DST);
4818 		if (linktype == DLT_EN10MB)
4819 			return gen_ehostop(ebroadcast, Q_DST);
4820 		if (linktype == DLT_FDDI)
4821 			return gen_fhostop(ebroadcast, Q_DST);
4822 		if (linktype == DLT_IEEE802)
4823 			return gen_thostop(ebroadcast, Q_DST);
4824 		if (linktype == DLT_IEEE802_11)
4825 			return gen_wlanhostop(ebroadcast, Q_DST);
4826 		if (linktype == DLT_IP_OVER_FC)
4827 			return gen_ipfchostop(ebroadcast, Q_DST);
4828 		if (linktype == DLT_SUNATM && is_lane) {
4829 			/*
4830 			 * Check that the packet doesn't begin with an
4831 			 * LE Control marker.  (We've already generated
4832 			 * a test for LANE.)
4833 			 */
4834 			b1 = gen_cmp(SUNATM_PKT_BEGIN_POS, BPF_H, 0xFF00);
4835 			gen_not(b1);
4836 
4837 			/*
4838 			 * Now check the MAC address.
4839 			 */
4840 			b0 = gen_ehostop(ebroadcast, Q_DST);
4841 			gen_and(b1, b0);
4842 			return b0;
4843 		}
4844 		bpf_error("not a broadcast link");
4845 		break;
4846 
4847 	case Q_IP:
4848 		b0 = gen_linktype(ETHERTYPE_IP);
4849 		hostmask = ~netmask;
4850 		b1 = gen_mcmp(off_nl + 16, BPF_W, (bpf_int32)0, hostmask);
4851 		b2 = gen_mcmp(off_nl + 16, BPF_W,
4852 			      (bpf_int32)(~0 & hostmask), hostmask);
4853 		gen_or(b1, b2);
4854 		gen_and(b0, b2);
4855 		return b2;
4856 	}
4857 	bpf_error("only link-layer/IP broadcast filters supported");
4858 	/* NOTREACHED */
4859 }
4860 
4861 /*
4862  * Generate code to test the low-order bit of a MAC address (that's
4863  * the bottom bit of the *first* byte).
4864  */
4865 static struct block *
4866 gen_mac_multicast(offset)
4867 	int offset;
4868 {
4869 	register struct block *b0;
4870 	register struct slist *s;
4871 
4872 	/* link[offset] & 1 != 0 */
4873 	s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
4874 	s->s.k = offset;
4875 	b0 = new_block(JMP(BPF_JSET));
4876 	b0->s.k = 1;
4877 	b0->stmts = s;
4878 	return b0;
4879 }
4880 
4881 struct block *
4882 gen_multicast(proto)
4883 	int proto;
4884 {
4885 	register struct block *b0, *b1, *b2;
4886 	register struct slist *s;
4887 
4888 	switch (proto) {
4889 
4890 	case Q_DEFAULT:
4891 	case Q_LINK:
4892 		if (linktype == DLT_ARCNET || linktype == DLT_ARCNET_LINUX)
4893 			/* all ARCnet multicasts use the same address */
4894 			return gen_ahostop(abroadcast, Q_DST);
4895 
4896 		if (linktype == DLT_EN10MB) {
4897 			/* ether[0] & 1 != 0 */
4898 			return gen_mac_multicast(0);
4899 		}
4900 
4901 		if (linktype == DLT_FDDI) {
4902 			/*
4903 			 * XXX TEST THIS: MIGHT NOT PORT PROPERLY XXX
4904 			 *
4905 			 * XXX - was that referring to bit-order issues?
4906 			 */
4907 			/* fddi[1] & 1 != 0 */
4908 			return gen_mac_multicast(1);
4909 		}
4910 
4911 		if (linktype == DLT_IEEE802) {
4912 			/* tr[2] & 1 != 0 */
4913 			return gen_mac_multicast(2);
4914 		}
4915 
4916 		if (linktype == DLT_IEEE802_11) {
4917 			/*
4918 			 * Oh, yuk.
4919 			 *
4920 			 *	For control frames, there is no DA.
4921 			 *
4922 			 *	For management frames, DA is at an
4923 			 *	offset of 4 from the beginning of
4924 			 *	the packet.
4925 			 *
4926 			 *	For data frames, DA is at an offset
4927 			 *	of 4 from the beginning of the packet
4928 			 *	if To DS is clear and at an offset of
4929 			 *	16 from the beginning of the packet
4930 			 *	if To DS is set.
4931 			 */
4932 
4933 			/*
4934 			 * Generate the tests to be done for data frames.
4935 			 *
4936 			 * First, check for To DS set, i.e. "link[1] & 0x01".
4937 			 */
4938 			s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
4939 			s->s.k = 1;
4940 			b1 = new_block(JMP(BPF_JSET));
4941 			b1->s.k = 0x01;	/* To DS */
4942 			b1->stmts = s;
4943 
4944 			/*
4945 			 * If To DS is set, the DA is at 16.
4946 			 */
4947 			b0 = gen_mac_multicast(16);
4948 			gen_and(b1, b0);
4949 
4950 			/*
4951 			 * Now, check for To DS not set, i.e. check
4952 			 * "!(link[1] & 0x01)".
4953 			 */
4954 			s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
4955 			s->s.k = 1;
4956 			b2 = new_block(JMP(BPF_JSET));
4957 			b2->s.k = 0x01;	/* To DS */
4958 			b2->stmts = s;
4959 			gen_not(b2);
4960 
4961 			/*
4962 			 * If To DS is not set, the DA is at 4.
4963 			 */
4964 			b1 = gen_mac_multicast(4);
4965 			gen_and(b2, b1);
4966 
4967 			/*
4968 			 * Now OR together the last two checks.  That gives
4969 			 * the complete set of checks for data frames.
4970 			 */
4971 			gen_or(b1, b0);
4972 
4973 			/*
4974 			 * Now check for a data frame.
4975 			 * I.e, check "link[0] & 0x08".
4976 			 */
4977 			s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
4978 			s->s.k = 0;
4979 			b1 = new_block(JMP(BPF_JSET));
4980 			b1->s.k = 0x08;
4981 			b1->stmts = s;
4982 
4983 			/*
4984 			 * AND that with the checks done for data frames.
4985 			 */
4986 			gen_and(b1, b0);
4987 
4988 			/*
4989 			 * If the high-order bit of the type value is 0, this
4990 			 * is a management frame.
4991 			 * I.e, check "!(link[0] & 0x08)".
4992 			 */
4993 			s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
4994 			s->s.k = 0;
4995 			b2 = new_block(JMP(BPF_JSET));
4996 			b2->s.k = 0x08;
4997 			b2->stmts = s;
4998 			gen_not(b2);
4999 
5000 			/*
5001 			 * For management frames, the DA is at 4.
5002 			 */
5003 			b1 = gen_mac_multicast(4);
5004 			gen_and(b2, b1);
5005 
5006 			/*
5007 			 * OR that with the checks done for data frames.
5008 			 * That gives the checks done for management and
5009 			 * data frames.
5010 			 */
5011 			gen_or(b1, b0);
5012 
5013 			/*
5014 			 * If the low-order bit of the type value is 1,
5015 			 * this is either a control frame or a frame
5016 			 * with a reserved type, and thus not a
5017 			 * frame with an SA.
5018 			 *
5019 			 * I.e., check "!(link[0] & 0x04)".
5020 			 */
5021 			s = new_stmt(BPF_LD|BPF_B|BPF_ABS);
5022 			s->s.k = 0;
5023 			b1 = new_block(JMP(BPF_JSET));
5024 			b1->s.k = 0x04;
5025 			b1->stmts = s;
5026 			gen_not(b1);
5027 
5028 			/*
5029 			 * AND that with the checks for data and management
5030 			 * frames.
5031 			 */
5032 			gen_and(b1, b0);
5033 			return b0;
5034 		}
5035 
5036 		if (linktype == DLT_IP_OVER_FC) {
5037 			b0 = gen_mac_multicast(2);
5038 			return b0;
5039 		}
5040 
5041 		if (linktype == DLT_SUNATM && is_lane) {
5042 			/*
5043 			 * Check that the packet doesn't begin with an
5044 			 * LE Control marker.  (We've already generated
5045 			 * a test for LANE.)
5046 			 */
5047 			b1 = gen_cmp(SUNATM_PKT_BEGIN_POS, BPF_H, 0xFF00);
5048 			gen_not(b1);
5049 
5050 			/* ether[off_mac] & 1 != 0 */
5051 			b0 = gen_mac_multicast(off_mac);
5052 			gen_and(b1, b0);
5053 			return b0;
5054 		}
5055 
5056 		/* Link not known to support multicasts */
5057 		break;
5058 
5059 	case Q_IP:
5060 		b0 = gen_linktype(ETHERTYPE_IP);
5061 		b1 = gen_cmp(off_nl + 16, BPF_B, (bpf_int32)224);
5062 		b1->s.code = JMP(BPF_JGE);
5063 		gen_and(b0, b1);
5064 		return b1;
5065 
5066 #ifdef INET6
5067 	case Q_IPV6:
5068 		b0 = gen_linktype(ETHERTYPE_IPV6);
5069 		b1 = gen_cmp(off_nl + 24, BPF_B, (bpf_int32)255);
5070 		gen_and(b0, b1);
5071 		return b1;
5072 #endif /* INET6 */
5073 	}
5074 	bpf_error("link-layer multicast filters supported only on ethernet/FDDI/token ring/ARCNET/802.11/ATM LANE/Fibre Channel");
5075 	/* NOTREACHED */
5076 }
5077 
5078 /*
5079  * generate command for inbound/outbound.  It's here so we can
5080  * make it link-type specific.  'dir' = 0 implies "inbound",
5081  * = 1 implies "outbound".
5082  */
5083 struct block *
5084 gen_inbound(dir)
5085 	int dir;
5086 {
5087 	register struct block *b0;
5088 
5089 	/*
5090 	 * Only some data link types support inbound/outbound qualifiers.
5091 	 */
5092 	switch (linktype) {
5093 	case DLT_SLIP:
5094 		b0 = gen_relation(BPF_JEQ,
5095 			  gen_load(Q_LINK, gen_loadi(0), 1),
5096 			  gen_loadi(0),
5097 			  dir);
5098 		break;
5099 
5100 	case DLT_LINUX_SLL:
5101 		if (dir) {
5102 			/*
5103 			 * Match packets sent by this machine.
5104 			 */
5105 			b0 = gen_cmp(0, BPF_H, LINUX_SLL_OUTGOING);
5106 		} else {
5107 			/*
5108 			 * Match packets sent to this machine.
5109 			 * (No broadcast or multicast packets, or
5110 			 * packets sent to some other machine and
5111 			 * received promiscuously.)
5112 			 *
5113 			 * XXX - packets sent to other machines probably
5114 			 * shouldn't be matched, but what about broadcast
5115 			 * or multicast packets we received?
5116 			 */
5117 			b0 = gen_cmp(0, BPF_H, LINUX_SLL_HOST);
5118 		}
5119 		break;
5120 
5121 	case DLT_PFLOG:
5122 		b0 = gen_cmp(offsetof(struct pfloghdr, dir), BPF_B,
5123 		    (bpf_int32)((dir == 0) ? PF_IN : PF_OUT));
5124 		break;
5125 
5126 	case DLT_PPP_PPPD:
5127 		if (dir) {
5128 			/* match outgoing packets */
5129 			b0 = gen_cmp(0, BPF_B, PPP_PPPD_OUT);
5130 		} else {
5131 			/* match incoming packets */
5132 			b0 = gen_cmp(0, BPF_B, PPP_PPPD_IN);
5133 		}
5134 		break;
5135 
5136         case DLT_JUNIPER_MLFR:
5137         case DLT_JUNIPER_MLPPP:
5138 	case DLT_JUNIPER_ATM1:
5139 	case DLT_JUNIPER_ATM2:
5140 		/* juniper flags (including direction) are stored
5141 		 * the byte after the 3-byte magic number */
5142 		if (dir) {
5143 			/* match outgoing packets */
5144 			b0 = gen_mcmp(3, BPF_B, 0, 0x01);
5145 		} else {
5146 			/* match incoming packets */
5147 			b0 = gen_mcmp(3, BPF_B, 1, 0x01);
5148 		}
5149 	    break;
5150 
5151 	default:
5152 		bpf_error("inbound/outbound not supported on linktype %d",
5153 		    linktype);
5154 		b0 = NULL;
5155 		/* NOTREACHED */
5156 	}
5157 	return (b0);
5158 }
5159 
5160 /* PF firewall log matched interface */
5161 struct block *
5162 gen_pf_ifname(const char *ifname)
5163 {
5164 	struct block *b0;
5165 	u_int len, off;
5166 
5167 	if (linktype == DLT_PFLOG) {
5168 		len = sizeof(((struct pfloghdr *)0)->ifname);
5169 		off = offsetof(struct pfloghdr, ifname);
5170 	} else {
5171 		bpf_error("ifname not supported on linktype 0x%x", linktype);
5172 		/* NOTREACHED */
5173 	}
5174 	if (strlen(ifname) >= len) {
5175 		bpf_error("ifname interface names can only be %d characters",
5176 		    len-1);
5177 		/* NOTREACHED */
5178 	}
5179 	b0 = gen_bcmp(off, strlen(ifname), (const u_char *)ifname);
5180 	return (b0);
5181 }
5182 
5183 /* PF firewall log matched interface */
5184 struct block *
5185 gen_pf_ruleset(char *ruleset)
5186 {
5187 	struct block *b0;
5188 
5189 	if (linktype != DLT_PFLOG) {
5190 		bpf_error("ruleset not supported on linktype 0x%x", linktype);
5191 		/* NOTREACHED */
5192 	}
5193 	if (strlen(ruleset) >= sizeof(((struct pfloghdr *)0)->ruleset)) {
5194 		bpf_error("ruleset names can only be %ld characters",
5195 		    (long)(sizeof(((struct pfloghdr *)0)->ruleset) - 1));
5196 		/* NOTREACHED */
5197 	}
5198 	b0 = gen_bcmp(offsetof(struct pfloghdr, ruleset),
5199 	    strlen(ruleset), (const u_char *)ruleset);
5200 	return (b0);
5201 }
5202 
5203 /* PF firewall log rule number */
5204 struct block *
5205 gen_pf_rnr(int rnr)
5206 {
5207 	struct block *b0;
5208 
5209 	if (linktype == DLT_PFLOG) {
5210 		b0 = gen_cmp(offsetof(struct pfloghdr, rulenr), BPF_W,
5211 			 (bpf_int32)rnr);
5212 	} else {
5213 		bpf_error("rnr not supported on linktype 0x%x", linktype);
5214 		/* NOTREACHED */
5215 	}
5216 
5217 	return (b0);
5218 }
5219 
5220 /* PF firewall log sub-rule number */
5221 struct block *
5222 gen_pf_srnr(int srnr)
5223 {
5224 	struct block *b0;
5225 
5226 	if (linktype != DLT_PFLOG) {
5227 		bpf_error("srnr not supported on linktype 0x%x", linktype);
5228 		/* NOTREACHED */
5229 	}
5230 
5231 	b0 = gen_cmp(offsetof(struct pfloghdr, subrulenr), BPF_W,
5232 	    (bpf_int32)srnr);
5233 	return (b0);
5234 }
5235 
5236 /* PF firewall log reason code */
5237 struct block *
5238 gen_pf_reason(int reason)
5239 {
5240 	struct block *b0;
5241 
5242 	if (linktype == DLT_PFLOG) {
5243 		b0 = gen_cmp(offsetof(struct pfloghdr, reason), BPF_B,
5244 		    (bpf_int32)reason);
5245 	} else {
5246 		bpf_error("reason not supported on linktype 0x%x", linktype);
5247 		/* NOTREACHED */
5248 	}
5249 
5250 	return (b0);
5251 }
5252 
5253 /* PF firewall log action */
5254 struct block *
5255 gen_pf_action(int action)
5256 {
5257 	struct block *b0;
5258 
5259 	if (linktype == DLT_PFLOG) {
5260 		b0 = gen_cmp(offsetof(struct pfloghdr, action), BPF_B,
5261 		    (bpf_int32)action);
5262 	} else {
5263 		bpf_error("action not supported on linktype 0x%x", linktype);
5264 		/* NOTREACHED */
5265 	}
5266 
5267 	return (b0);
5268 }
5269 
5270 struct block *
5271 gen_acode(eaddr, q)
5272 	register const u_char *eaddr;
5273 	struct qual q;
5274 {
5275 	if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) {
5276 		if (linktype == DLT_ARCNET || linktype == DLT_ARCNET_LINUX)
5277 			return gen_ahostop(eaddr, (int)q.dir);
5278 	}
5279 	bpf_error("ARCnet address used in non-arc expression");
5280 	/* NOTREACHED */
5281 }
5282 
5283 static struct block *
5284 gen_ahostop(eaddr, dir)
5285 	register const u_char *eaddr;
5286 	register int dir;
5287 {
5288 	register struct block *b0, *b1;
5289 
5290 	switch (dir) {
5291 	/* src comes first, different from Ethernet */
5292 	case Q_SRC:
5293 		return gen_bcmp(0, 1, eaddr);
5294 
5295 	case Q_DST:
5296 		return gen_bcmp(1, 1, eaddr);
5297 
5298 	case Q_AND:
5299 		b0 = gen_ahostop(eaddr, Q_SRC);
5300 		b1 = gen_ahostop(eaddr, Q_DST);
5301 		gen_and(b0, b1);
5302 		return b1;
5303 
5304 	case Q_DEFAULT:
5305 	case Q_OR:
5306 		b0 = gen_ahostop(eaddr, Q_SRC);
5307 		b1 = gen_ahostop(eaddr, Q_DST);
5308 		gen_or(b0, b1);
5309 		return b1;
5310 	}
5311 	abort();
5312 	/* NOTREACHED */
5313 }
5314 
5315 /*
5316  * support IEEE 802.1Q VLAN trunk over ethernet
5317  */
5318 struct block *
5319 gen_vlan(vlan_num)
5320 	int vlan_num;
5321 {
5322 	struct	block	*b0;
5323 
5324 	/*
5325 	 * Change the offsets to point to the type and data fields within
5326 	 * the VLAN packet.  This is somewhat of a kludge.
5327 	 */
5328 	if (orig_nl == (u_int)-1) {
5329 		orig_linktype = off_linktype;	/* save original values */
5330 		orig_nl = off_nl;
5331 		orig_nl_nosnap = off_nl_nosnap;
5332 
5333 		switch (linktype) {
5334 
5335 		case DLT_EN10MB:
5336 			off_linktype = 16;
5337 			off_nl_nosnap = 18;
5338 			off_nl = 18;
5339 			break;
5340 
5341 		default:
5342 			bpf_error("no VLAN support for data link type %d",
5343 				  linktype);
5344 			/*NOTREACHED*/
5345 		}
5346 	}
5347 
5348 	/* check for VLAN */
5349 	b0 = gen_cmp(orig_linktype, BPF_H, (bpf_int32)ETHERTYPE_8021Q);
5350 
5351 	/* If a specific VLAN is requested, check VLAN id */
5352 	if (vlan_num >= 0) {
5353 		struct block *b1;
5354 
5355 		b1 = gen_mcmp(orig_nl, BPF_H, (bpf_int32)vlan_num, 0x0fff);
5356 		gen_and(b0, b1);
5357 		b0 = b1;
5358 	}
5359 
5360 	return (b0);
5361 }
5362 
5363 /*
5364  * support for MPLS
5365  */
5366 struct block *
5367 gen_mpls(label_num)
5368 	int label_num;
5369 {
5370 	struct	block	*b0;
5371 
5372 	/*
5373 	 * Change the offsets to point to the type and data fields within
5374 	 * the MPLS packet.  This is somewhat of a kludge.
5375 	 */
5376 	if (orig_nl == (u_int)-1) {
5377 		orig_linktype = off_linktype;	/* save original values */
5378 		orig_nl = off_nl;
5379 		orig_nl_nosnap = off_nl_nosnap;
5380 
5381 		switch (linktype) {
5382 
5383 		case DLT_EN10MB:
5384 			off_linktype = 16;
5385 			off_nl_nosnap = 18;
5386 			off_nl = 18;
5387 
5388 			b0 = gen_cmp(orig_linktype, BPF_H, (bpf_int32)ETHERTYPE_MPLS);
5389 			break;
5390 
5391 		case DLT_PPP:
5392 			off_linktype = 6;
5393 			off_nl_nosnap = 8;
5394 			off_nl = 8;
5395 
5396 			b0 = gen_cmp(orig_linktype, BPF_H, (bpf_int32)PPP_MPLS_UCAST);
5397 			break;
5398 
5399 		case DLT_C_HDLC:
5400 			off_linktype = 6;
5401 			off_nl_nosnap = 8;
5402 			off_nl = 8;
5403 
5404 			b0 = gen_cmp(orig_linktype, BPF_H, (bpf_int32)ETHERTYPE_MPLS);
5405 			break;
5406 
5407 			/* FIXME add other DLT_s ...
5408 			 * for Frame-Relay/and ATM this may get messy due to SNAP headers
5409 			 * leave it for now */
5410 
5411 		default:
5412 			bpf_error("no MPLS support for data link type %d",
5413 				  linktype);
5414 			b0 = NULL;
5415 			/*NOTREACHED*/
5416 		}
5417 	} else {
5418 		bpf_error("'mpls' can't be combined with 'vlan' or another 'mpls'");
5419 		b0 = NULL;
5420 		/*NOTREACHED*/
5421 	}
5422 
5423 	/* If a specific MPLS label is requested, check it */
5424 	if (label_num >= 0) {
5425 		struct block *b1;
5426 
5427 		label_num = label_num << 12; /* label is shifted 12 bits on the wire */
5428 		b1 = gen_mcmp(orig_nl, BPF_W, (bpf_int32)label_num, 0xfffff000); /* only compare the first 20 bits */
5429 		gen_and(b0, b1);
5430 		b0 = b1;
5431 	}
5432 
5433 	return (b0);
5434 }
5435 
5436 struct block *
5437 gen_atmfield_code(atmfield, jvalue, jtype, reverse)
5438 	int atmfield;
5439 	bpf_u_int32 jvalue;
5440 	bpf_u_int32 jtype;
5441 	int reverse;
5442 {
5443 	struct block *b0;
5444 
5445 	switch (atmfield) {
5446 
5447 	case A_VPI:
5448 		if (!is_atm)
5449 			bpf_error("'vpi' supported only on raw ATM");
5450 		if (off_vpi == (u_int)-1)
5451 			abort();
5452 		b0 = gen_ncmp(BPF_B, off_vpi, 0xffffffff, (u_int)jtype,
5453 		    (u_int)jvalue, reverse);
5454 		break;
5455 
5456 	case A_VCI:
5457 		if (!is_atm)
5458 			bpf_error("'vci' supported only on raw ATM");
5459 		if (off_vci == (u_int)-1)
5460 			abort();
5461 		b0 = gen_ncmp(BPF_H, off_vci, 0xffffffff, (u_int)jtype,
5462 		    (u_int)jvalue, reverse);
5463 		break;
5464 
5465 	case A_PROTOTYPE:
5466 		if (off_proto == (u_int)-1)
5467 			abort();	/* XXX - this isn't on FreeBSD */
5468 		b0 = gen_ncmp(BPF_B, off_proto, 0x0f, (u_int)jtype,
5469 		    (u_int)jvalue, reverse);
5470 		break;
5471 
5472 	case A_MSGTYPE:
5473 		if (off_payload == (u_int)-1)
5474 			abort();
5475 		b0 = gen_ncmp(BPF_B, off_payload + MSG_TYPE_POS, 0xffffffff,
5476 		    (u_int)jtype, (u_int)jvalue, reverse);
5477 		break;
5478 
5479 	case A_CALLREFTYPE:
5480 		if (!is_atm)
5481 			bpf_error("'callref' supported only on raw ATM");
5482 		if (off_proto == (u_int)-1)
5483 			abort();
5484 		b0 = gen_ncmp(BPF_B, off_proto, 0xffffffff, (u_int)jtype,
5485 		    (u_int)jvalue, reverse);
5486 		break;
5487 
5488 	default:
5489 		abort();
5490 	}
5491 	return b0;
5492 }
5493 
5494 struct block *
5495 gen_atmtype_abbrev(type)
5496 	int type;
5497 {
5498 	struct block *b0, *b1;
5499 
5500 	switch (type) {
5501 
5502 	case A_METAC:
5503 		/* Get all packets in Meta signalling Circuit */
5504 		if (!is_atm)
5505 			bpf_error("'metac' supported only on raw ATM");
5506 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
5507 		b1 = gen_atmfield_code(A_VCI, 1, BPF_JEQ, 0);
5508 		gen_and(b0, b1);
5509 		break;
5510 
5511 	case A_BCC:
5512 		/* Get all packets in Broadcast Circuit*/
5513 		if (!is_atm)
5514 			bpf_error("'bcc' supported only on raw ATM");
5515 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
5516 		b1 = gen_atmfield_code(A_VCI, 2, BPF_JEQ, 0);
5517 		gen_and(b0, b1);
5518 		break;
5519 
5520 	case A_OAMF4SC:
5521 		/* Get all cells in Segment OAM F4 circuit*/
5522 		if (!is_atm)
5523 			bpf_error("'oam4sc' supported only on raw ATM");
5524 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
5525 		b1 = gen_atmfield_code(A_VCI, 3, BPF_JEQ, 0);
5526 		gen_and(b0, b1);
5527 		break;
5528 
5529 	case A_OAMF4EC:
5530 		/* Get all cells in End-to-End OAM F4 Circuit*/
5531 		if (!is_atm)
5532 			bpf_error("'oam4ec' supported only on raw ATM");
5533 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
5534 		b1 = gen_atmfield_code(A_VCI, 4, BPF_JEQ, 0);
5535 		gen_and(b0, b1);
5536 		break;
5537 
5538 	case A_SC:
5539 		/*  Get all packets in connection Signalling Circuit */
5540 		if (!is_atm)
5541 			bpf_error("'sc' supported only on raw ATM");
5542 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
5543 		b1 = gen_atmfield_code(A_VCI, 5, BPF_JEQ, 0);
5544 		gen_and(b0, b1);
5545 		break;
5546 
5547 	case A_ILMIC:
5548 		/* Get all packets in ILMI Circuit */
5549 		if (!is_atm)
5550 			bpf_error("'ilmic' supported only on raw ATM");
5551 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
5552 		b1 = gen_atmfield_code(A_VCI, 16, BPF_JEQ, 0);
5553 		gen_and(b0, b1);
5554 		break;
5555 
5556 	case A_LANE:
5557 		/* Get all LANE packets */
5558 		if (!is_atm)
5559 			bpf_error("'lane' supported only on raw ATM");
5560 		b1 = gen_atmfield_code(A_PROTOTYPE, PT_LANE, BPF_JEQ, 0);
5561 
5562 		/*
5563 		 * Arrange that all subsequent tests assume LANE
5564 		 * rather than LLC-encapsulated packets, and set
5565 		 * the offsets appropriately for LANE-encapsulated
5566 		 * Ethernet.
5567 		 *
5568 		 * "off_mac" is the offset of the Ethernet header,
5569 		 * which is 2 bytes past the ATM pseudo-header
5570 		 * (skipping the pseudo-header and 2-byte LE Client
5571 		 * field).  The other offsets are Ethernet offsets
5572 		 * relative to "off_mac".
5573 		 */
5574 		is_lane = 1;
5575 		off_mac = off_payload + 2;	/* MAC header */
5576 		off_linktype = off_mac + 12;
5577 		off_nl = off_mac + 14;		/* Ethernet II */
5578 		off_nl_nosnap = off_mac + 17;	/* 802.3+802.2 */
5579 		break;
5580 
5581 	case A_LLC:
5582 		/* Get all LLC-encapsulated packets */
5583 		if (!is_atm)
5584 			bpf_error("'llc' supported only on raw ATM");
5585 		b1 = gen_atmfield_code(A_PROTOTYPE, PT_LLC, BPF_JEQ, 0);
5586 		is_lane = 0;
5587 		break;
5588 
5589 	default:
5590 		abort();
5591 	}
5592 	return b1;
5593 }
5594 
5595 
5596 static struct block *
5597 gen_msg_abbrev(type)
5598 	int type;
5599 {
5600 	struct block *b1;
5601 
5602 	/*
5603 	 * Q.2931 signalling protocol messages for handling virtual circuits
5604 	 * establishment and teardown
5605 	 */
5606 	switch (type) {
5607 
5608 	case A_SETUP:
5609 		b1 = gen_atmfield_code(A_MSGTYPE, SETUP, BPF_JEQ, 0);
5610 		break;
5611 
5612 	case A_CALLPROCEED:
5613 		b1 = gen_atmfield_code(A_MSGTYPE, CALL_PROCEED, BPF_JEQ, 0);
5614 		break;
5615 
5616 	case A_CONNECT:
5617 		b1 = gen_atmfield_code(A_MSGTYPE, CONNECT, BPF_JEQ, 0);
5618 		break;
5619 
5620 	case A_CONNECTACK:
5621 		b1 = gen_atmfield_code(A_MSGTYPE, CONNECT_ACK, BPF_JEQ, 0);
5622 		break;
5623 
5624 	case A_RELEASE:
5625 		b1 = gen_atmfield_code(A_MSGTYPE, RELEASE, BPF_JEQ, 0);
5626 		break;
5627 
5628 	case A_RELEASE_DONE:
5629 		b1 = gen_atmfield_code(A_MSGTYPE, RELEASE_DONE, BPF_JEQ, 0);
5630 		break;
5631 
5632 	default:
5633 		abort();
5634 	}
5635 	return b1;
5636 }
5637 
5638 struct block *
5639 gen_atmmulti_abbrev(type)
5640 	int type;
5641 {
5642 	struct block *b0, *b1;
5643 
5644 	switch (type) {
5645 
5646 	case A_OAM:
5647 		if (!is_atm)
5648 			bpf_error("'oam' supported only on raw ATM");
5649 		b1 = gen_atmmulti_abbrev(A_OAMF4);
5650 		break;
5651 
5652 	case A_OAMF4:
5653 		if (!is_atm)
5654 			bpf_error("'oamf4' supported only on raw ATM");
5655 		/* OAM F4 type */
5656 		b0 = gen_atmfield_code(A_VCI, 3, BPF_JEQ, 0);
5657 		b1 = gen_atmfield_code(A_VCI, 4, BPF_JEQ, 0);
5658 		gen_or(b0, b1);
5659 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
5660 		gen_and(b0, b1);
5661 		break;
5662 
5663 	case A_CONNECTMSG:
5664 		/*
5665 		 * Get Q.2931 signalling messages for switched
5666 		 * virtual connection
5667 		 */
5668 		if (!is_atm)
5669 			bpf_error("'connectmsg' supported only on raw ATM");
5670 		b0 = gen_msg_abbrev(A_SETUP);
5671 		b1 = gen_msg_abbrev(A_CALLPROCEED);
5672 		gen_or(b0, b1);
5673 		b0 = gen_msg_abbrev(A_CONNECT);
5674 		gen_or(b0, b1);
5675 		b0 = gen_msg_abbrev(A_CONNECTACK);
5676 		gen_or(b0, b1);
5677 		b0 = gen_msg_abbrev(A_RELEASE);
5678 		gen_or(b0, b1);
5679 		b0 = gen_msg_abbrev(A_RELEASE_DONE);
5680 		gen_or(b0, b1);
5681 		b0 = gen_atmtype_abbrev(A_SC);
5682 		gen_and(b0, b1);
5683 		break;
5684 
5685 	case A_METACONNECT:
5686 		if (!is_atm)
5687 			bpf_error("'metaconnect' supported only on raw ATM");
5688 		b0 = gen_msg_abbrev(A_SETUP);
5689 		b1 = gen_msg_abbrev(A_CALLPROCEED);
5690 		gen_or(b0, b1);
5691 		b0 = gen_msg_abbrev(A_CONNECT);
5692 		gen_or(b0, b1);
5693 		b0 = gen_msg_abbrev(A_RELEASE);
5694 		gen_or(b0, b1);
5695 		b0 = gen_msg_abbrev(A_RELEASE_DONE);
5696 		gen_or(b0, b1);
5697 		b0 = gen_atmtype_abbrev(A_METAC);
5698 		gen_and(b0, b1);
5699 		break;
5700 
5701 	default:
5702 		abort();
5703 	}
5704 	return b1;
5705 }
5706