xref: /dragonfly/contrib/libpcap/gencode.c (revision 6693db17)
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 #ifndef lint
23 static const char rcsid[] _U_ =
24     "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.290.2.16 2008-09-22 20:16:01 guy Exp $ (LBL)";
25 #endif
26 
27 #ifdef HAVE_CONFIG_H
28 #include "config.h"
29 #endif
30 
31 #ifdef WIN32
32 #include <pcap-stdinc.h>
33 #else /* WIN32 */
34 #include <sys/types.h>
35 #include <sys/socket.h>
36 #endif /* WIN32 */
37 
38 /*
39  * XXX - why was this included even on UNIX?
40  */
41 #ifdef __MINGW32__
42 #include "IP6_misc.h"
43 #endif
44 
45 #ifndef WIN32
46 
47 #ifdef __NetBSD__
48 #include <sys/param.h>
49 #endif
50 
51 #include <netinet/in.h>
52 
53 #endif /* WIN32 */
54 
55 #include <stdlib.h>
56 #include <string.h>
57 #include <memory.h>
58 #include <setjmp.h>
59 #include <stdarg.h>
60 
61 #ifdef MSDOS
62 #include "pcap-dos.h"
63 #endif
64 
65 #include "pcap-int.h"
66 
67 #include "ethertype.h"
68 #include "nlpid.h"
69 #include "llc.h"
70 #include "gencode.h"
71 #include <netproto/802_11/ieee80211.h>
72 #include "atmuni31.h"
73 #include "sunatmpos.h"
74 #include "ppp.h"
75 #include "pcap/sll.h"
76 #include "arcnet.h"
77 #ifdef HAVE_NET_PFVAR_H
78 #include <sys/socket.h>
79 #include <net/if.h>
80 #include <net/if_var.h>
81 #include <net/pf/pfvar.h>
82 #include <net/pf/if_pflog.h>
83 #endif
84 #ifndef offsetof
85 #define offsetof(s, e) ((size_t)&((s *)0)->e)
86 #endif
87 #ifdef INET6
88 #ifndef WIN32
89 #include <netdb.h>	/* for "struct addrinfo" */
90 #endif /* WIN32 */
91 #endif /*INET6*/
92 #include <pcap/namedb.h>
93 
94 #include <netproto/802_11/ieee80211_radiotap.h>
95 
96 #define ETHERMTU	1500
97 
98 #ifndef IPPROTO_SCTP
99 #define IPPROTO_SCTP 132
100 #endif
101 
102 #ifdef HAVE_OS_PROTO_H
103 #include "os-proto.h"
104 #endif
105 
106 #define JMP(c) ((c)|BPF_JMP|BPF_K)
107 
108 /* Locals */
109 static jmp_buf top_ctx;
110 static pcap_t *bpf_pcap;
111 
112 /* Hack for updating VLAN, MPLS, and PPPoE offsets. */
113 #ifdef WIN32
114 static u_int	orig_linktype = (u_int)-1, orig_nl = (u_int)-1, label_stack_depth = (u_int)-1;
115 #else
116 static u_int	orig_linktype = -1U, orig_nl = -1U, label_stack_depth = -1U;
117 #endif
118 
119 /* XXX */
120 #ifdef PCAP_FDDIPAD
121 static int	pcap_fddipad;
122 #endif
123 
124 /* VARARGS */
125 void
126 bpf_error(const char *fmt, ...)
127 {
128 	va_list ap;
129 
130 	va_start(ap, fmt);
131 	if (bpf_pcap != NULL)
132 		(void)vsnprintf(pcap_geterr(bpf_pcap), PCAP_ERRBUF_SIZE,
133 		    fmt, ap);
134 	va_end(ap);
135 	longjmp(top_ctx, 1);
136 	/* NOTREACHED */
137 }
138 
139 static void init_linktype(pcap_t *);
140 
141 static void init_regs(void);
142 static int alloc_reg(void);
143 static void free_reg(int);
144 
145 static struct block *root;
146 
147 /*
148  * Value passed to gen_load_a() to indicate what the offset argument
149  * is relative to.
150  */
151 enum e_offrel {
152 	OR_PACKET,	/* relative to the beginning of the packet */
153 	OR_LINK,	/* relative to the beginning of the link-layer header */
154 	OR_MACPL,	/* relative to the end of the MAC-layer header */
155 	OR_NET,		/* relative to the network-layer header */
156 	OR_NET_NOSNAP,	/* relative to the network-layer header, with no SNAP header at the link layer */
157 	OR_TRAN_IPV4,	/* relative to the transport-layer header, with IPv4 network layer */
158 	OR_TRAN_IPV6	/* relative to the transport-layer header, with IPv6 network layer */
159 };
160 
161 /*
162  * We divy out chunks of memory rather than call malloc each time so
163  * we don't have to worry about leaking memory.  It's probably
164  * not a big deal if all this memory was wasted but if this ever
165  * goes into a library that would probably not be a good idea.
166  *
167  * XXX - this *is* in a library....
168  */
169 #define NCHUNKS 16
170 #define CHUNK0SIZE 1024
171 struct chunk {
172 	u_int n_left;
173 	void *m;
174 };
175 
176 static struct chunk chunks[NCHUNKS];
177 static int cur_chunk;
178 
179 static void *newchunk(u_int);
180 static void freechunks(void);
181 static inline struct block *new_block(int);
182 static inline struct slist *new_stmt(int);
183 static struct block *gen_retblk(int);
184 static inline void syntax(void);
185 
186 static void backpatch(struct block *, struct block *);
187 static void merge(struct block *, struct block *);
188 static struct block *gen_cmp(enum e_offrel, u_int, u_int, bpf_int32);
189 static struct block *gen_cmp_gt(enum e_offrel, u_int, u_int, bpf_int32);
190 static struct block *gen_cmp_ge(enum e_offrel, u_int, u_int, bpf_int32);
191 static struct block *gen_cmp_lt(enum e_offrel, u_int, u_int, bpf_int32);
192 static struct block *gen_cmp_le(enum e_offrel, u_int, u_int, bpf_int32);
193 static struct block *gen_mcmp(enum e_offrel, u_int, u_int, bpf_int32,
194     bpf_u_int32);
195 static struct block *gen_bcmp(enum e_offrel, u_int, u_int, const u_char *);
196 static struct block *gen_ncmp(enum e_offrel, bpf_u_int32, bpf_u_int32,
197     bpf_u_int32, bpf_u_int32, int, bpf_int32);
198 static struct slist *gen_load_llrel(u_int, u_int);
199 static struct slist *gen_load_macplrel(u_int, u_int);
200 static struct slist *gen_load_a(enum e_offrel, u_int, u_int);
201 static struct slist *gen_loadx_iphdrlen(void);
202 static struct block *gen_uncond(int);
203 static inline struct block *gen_true(void);
204 static inline struct block *gen_false(void);
205 static struct block *gen_ether_linktype(int);
206 static struct block *gen_linux_sll_linktype(int);
207 static struct slist *gen_load_prism_llprefixlen(void);
208 static struct slist *gen_load_avs_llprefixlen(void);
209 static struct slist *gen_load_radiotap_llprefixlen(void);
210 static struct slist *gen_load_ppi_llprefixlen(void);
211 static void insert_compute_vloffsets(struct block *);
212 static struct slist *gen_llprefixlen(void);
213 static struct slist *gen_off_macpl(void);
214 static int ethertype_to_ppptype(int);
215 static struct block *gen_linktype(int);
216 static struct block *gen_snap(bpf_u_int32, bpf_u_int32);
217 static struct block *gen_llc_linktype(int);
218 static struct block *gen_hostop(bpf_u_int32, bpf_u_int32, int, int, u_int, u_int);
219 #ifdef INET6
220 static struct block *gen_hostop6(struct in6_addr *, struct in6_addr *, int, int, u_int, u_int);
221 #endif
222 static struct block *gen_ahostop(const u_char *, int);
223 static struct block *gen_ehostop(const u_char *, int);
224 static struct block *gen_fhostop(const u_char *, int);
225 static struct block *gen_thostop(const u_char *, int);
226 static struct block *gen_wlanhostop(const u_char *, int);
227 static struct block *gen_ipfchostop(const u_char *, int);
228 static struct block *gen_dnhostop(bpf_u_int32, int);
229 static struct block *gen_mpls_linktype(int);
230 static struct block *gen_host(bpf_u_int32, bpf_u_int32, int, int, int);
231 #ifdef INET6
232 static struct block *gen_host6(struct in6_addr *, struct in6_addr *, int, int, int);
233 #endif
234 #ifndef INET6
235 static struct block *gen_gateway(const u_char *, bpf_u_int32 **, int, int);
236 #endif
237 static struct block *gen_ipfrag(void);
238 static struct block *gen_portatom(int, bpf_int32);
239 static struct block *gen_portrangeatom(int, bpf_int32, bpf_int32);
240 #ifdef INET6
241 static struct block *gen_portatom6(int, bpf_int32);
242 static struct block *gen_portrangeatom6(int, bpf_int32, bpf_int32);
243 #endif
244 struct block *gen_portop(int, int, int);
245 static struct block *gen_port(int, int, int);
246 struct block *gen_portrangeop(int, int, int, int);
247 static struct block *gen_portrange(int, int, int, int);
248 #ifdef INET6
249 struct block *gen_portop6(int, int, int);
250 static struct block *gen_port6(int, int, int);
251 struct block *gen_portrangeop6(int, int, int, int);
252 static struct block *gen_portrange6(int, int, int, int);
253 #endif
254 static int lookup_proto(const char *, int);
255 static struct block *gen_protochain(int, int, int);
256 static struct block *gen_proto(int, int, int);
257 static struct slist *xfer_to_x(struct arth *);
258 static struct slist *xfer_to_a(struct arth *);
259 static struct block *gen_mac_multicast(int);
260 static struct block *gen_len(int, int);
261 static struct block *gen_check_802_11_data_frame(void);
262 
263 static struct block *gen_ppi_dlt_check(void);
264 static struct block *gen_msg_abbrev(int type);
265 
266 static void *
267 newchunk(n)
268 	u_int n;
269 {
270 	struct chunk *cp;
271 	int k;
272 	size_t size;
273 
274 #ifndef __NetBSD__
275 	/* XXX Round up to nearest long. */
276 	n = (n + sizeof(long) - 1) & ~(sizeof(long) - 1);
277 #else
278 	/* XXX Round up to structure boundary. */
279 	n = ALIGN(n);
280 #endif
281 
282 	cp = &chunks[cur_chunk];
283 	if (n > cp->n_left) {
284 		++cp, k = ++cur_chunk;
285 		if (k >= NCHUNKS)
286 			bpf_error("out of memory");
287 		size = CHUNK0SIZE << k;
288 		cp->m = (void *)malloc(size);
289 		if (cp->m == NULL)
290 			bpf_error("out of memory");
291 		memset((char *)cp->m, 0, size);
292 		cp->n_left = size;
293 		if (n > size)
294 			bpf_error("out of memory");
295 	}
296 	cp->n_left -= n;
297 	return (void *)((char *)cp->m + cp->n_left);
298 }
299 
300 static void
301 freechunks()
302 {
303 	int i;
304 
305 	cur_chunk = 0;
306 	for (i = 0; i < NCHUNKS; ++i)
307 		if (chunks[i].m != NULL) {
308 			free(chunks[i].m);
309 			chunks[i].m = NULL;
310 		}
311 }
312 
313 /*
314  * A strdup whose allocations are freed after code generation is over.
315  */
316 char *
317 sdup(s)
318 	register const char *s;
319 {
320 	int n = strlen(s) + 1;
321 	char *cp = newchunk(n);
322 
323 	strlcpy(cp, s, n);
324 	return (cp);
325 }
326 
327 static inline struct block *
328 new_block(code)
329 	int code;
330 {
331 	struct block *p;
332 
333 	p = (struct block *)newchunk(sizeof(*p));
334 	p->s.code = code;
335 	p->head = p;
336 
337 	return p;
338 }
339 
340 static inline struct slist *
341 new_stmt(code)
342 	int code;
343 {
344 	struct slist *p;
345 
346 	p = (struct slist *)newchunk(sizeof(*p));
347 	p->s.code = code;
348 
349 	return p;
350 }
351 
352 static struct block *
353 gen_retblk(v)
354 	int v;
355 {
356 	struct block *b = new_block(BPF_RET|BPF_K);
357 
358 	b->s.k = v;
359 	return b;
360 }
361 
362 static inline void
363 syntax()
364 {
365 	bpf_error("syntax error in filter expression");
366 }
367 
368 static bpf_u_int32 netmask;
369 static int snaplen;
370 int no_optimize;
371 
372 int
373 pcap_compile(pcap_t *p, struct bpf_program *program,
374 	     const char *buf, int optimize, bpf_u_int32 mask)
375 {
376 	extern int n_errors;
377 	const char * volatile xbuf = buf;
378 	int len;
379 
380 	no_optimize = 0;
381 	n_errors = 0;
382 	root = NULL;
383 	bpf_pcap = p;
384 	init_regs();
385 	if (setjmp(top_ctx)) {
386 		lex_cleanup();
387 		freechunks();
388 		return (-1);
389 	}
390 
391 	netmask = mask;
392 
393 	snaplen = pcap_snapshot(p);
394 	if (snaplen == 0) {
395 		snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
396 			 "snaplen of 0 rejects all packets");
397 		return -1;
398 	}
399 
400 	lex_init(xbuf ? xbuf : "");
401 	init_linktype(p);
402 	(void)pcap_parse();
403 
404 	if (n_errors)
405 		syntax();
406 
407 	if (root == NULL)
408 		root = gen_retblk(snaplen);
409 
410 	if (optimize && !no_optimize) {
411 		bpf_optimize(&root);
412 		if (root == NULL ||
413 		    (root->s.code == (BPF_RET|BPF_K) && root->s.k == 0))
414 			bpf_error("expression rejects all packets");
415 	}
416 	program->bf_insns = icode_to_fcode(root, &len);
417 	program->bf_len = len;
418 
419 	lex_cleanup();
420 	freechunks();
421 	return (0);
422 }
423 
424 /*
425  * entry point for using the compiler with no pcap open
426  * pass in all the stuff that is needed explicitly instead.
427  */
428 int
429 pcap_compile_nopcap(int snaplen_arg, int linktype_arg,
430 		    struct bpf_program *program,
431 	     const char *buf, int optimize, bpf_u_int32 mask)
432 {
433 	pcap_t *p;
434 	int ret;
435 
436 	p = pcap_open_dead(linktype_arg, snaplen_arg);
437 	if (p == NULL)
438 		return (-1);
439 	ret = pcap_compile(p, program, buf, optimize, mask);
440 	pcap_close(p);
441 	return (ret);
442 }
443 
444 /*
445  * Clean up a "struct bpf_program" by freeing all the memory allocated
446  * in it.
447  */
448 void
449 pcap_freecode(struct bpf_program *program)
450 {
451 	program->bf_len = 0;
452 	if (program->bf_insns != NULL) {
453 		free((char *)program->bf_insns);
454 		program->bf_insns = NULL;
455 	}
456 }
457 
458 /*
459  * Backpatch the blocks in 'list' to 'target'.  The 'sense' field indicates
460  * which of the jt and jf fields has been resolved and which is a pointer
461  * back to another unresolved block (or nil).  At least one of the fields
462  * in each block is already resolved.
463  */
464 static void
465 backpatch(list, target)
466 	struct block *list, *target;
467 {
468 	struct block *next;
469 
470 	while (list) {
471 		if (!list->sense) {
472 			next = JT(list);
473 			JT(list) = target;
474 		} else {
475 			next = JF(list);
476 			JF(list) = target;
477 		}
478 		list = next;
479 	}
480 }
481 
482 /*
483  * Merge the lists in b0 and b1, using the 'sense' field to indicate
484  * which of jt and jf is the link.
485  */
486 static void
487 merge(b0, b1)
488 	struct block *b0, *b1;
489 {
490 	register struct block **p = &b0;
491 
492 	/* Find end of list. */
493 	while (*p)
494 		p = !((*p)->sense) ? &JT(*p) : &JF(*p);
495 
496 	/* Concatenate the lists. */
497 	*p = b1;
498 }
499 
500 void
501 finish_parse(p)
502 	struct block *p;
503 {
504 	struct block *ppi_dlt_check;
505 
506 	/*
507 	 * Insert before the statements of the first (root) block any
508 	 * statements needed to load the lengths of any variable-length
509 	 * headers into registers.
510 	 *
511 	 * XXX - a fancier strategy would be to insert those before the
512 	 * statements of all blocks that use those lengths and that
513 	 * have no predecessors that use them, so that we only compute
514 	 * the lengths if we need them.  There might be even better
515 	 * approaches than that.
516 	 *
517 	 * However, those strategies would be more complicated, and
518 	 * as we don't generate code to compute a length if the
519 	 * program has no tests that use the length, and as most
520 	 * tests will probably use those lengths, we would just
521 	 * postpone computing the lengths so that it's not done
522 	 * for tests that fail early, and it's not clear that's
523 	 * worth the effort.
524 	 */
525 	insert_compute_vloffsets(p->head);
526 
527 	/*
528 	 * For DLT_PPI captures, generate a check of the per-packet
529 	 * DLT value to make sure it's DLT_IEEE802_11.
530 	 */
531 	ppi_dlt_check = gen_ppi_dlt_check();
532 	if (ppi_dlt_check != NULL)
533 		gen_and(ppi_dlt_check, p);
534 
535 	backpatch(p, gen_retblk(snaplen));
536 	p->sense = !p->sense;
537 	backpatch(p, gen_retblk(0));
538 	root = p->head;
539 }
540 
541 void
542 gen_and(b0, b1)
543 	struct block *b0, *b1;
544 {
545 	backpatch(b0, b1->head);
546 	b0->sense = !b0->sense;
547 	b1->sense = !b1->sense;
548 	merge(b1, b0);
549 	b1->sense = !b1->sense;
550 	b1->head = b0->head;
551 }
552 
553 void
554 gen_or(b0, b1)
555 	struct block *b0, *b1;
556 {
557 	b0->sense = !b0->sense;
558 	backpatch(b0, b1->head);
559 	b0->sense = !b0->sense;
560 	merge(b1, b0);
561 	b1->head = b0->head;
562 }
563 
564 void
565 gen_not(b)
566 	struct block *b;
567 {
568 	b->sense = !b->sense;
569 }
570 
571 static struct block *
572 gen_cmp(offrel, offset, size, v)
573 	enum e_offrel offrel;
574 	u_int offset, size;
575 	bpf_int32 v;
576 {
577 	return gen_ncmp(offrel, offset, size, 0xffffffff, BPF_JEQ, 0, v);
578 }
579 
580 static struct block *
581 gen_cmp_gt(offrel, offset, size, v)
582 	enum e_offrel offrel;
583 	u_int offset, size;
584 	bpf_int32 v;
585 {
586 	return gen_ncmp(offrel, offset, size, 0xffffffff, BPF_JGT, 0, v);
587 }
588 
589 static struct block *
590 gen_cmp_ge(offrel, offset, size, v)
591 	enum e_offrel offrel;
592 	u_int offset, size;
593 	bpf_int32 v;
594 {
595 	return gen_ncmp(offrel, offset, size, 0xffffffff, BPF_JGE, 0, v);
596 }
597 
598 static struct block *
599 gen_cmp_lt(offrel, offset, size, v)
600 	enum e_offrel offrel;
601 	u_int offset, size;
602 	bpf_int32 v;
603 {
604 	return gen_ncmp(offrel, offset, size, 0xffffffff, BPF_JGE, 1, v);
605 }
606 
607 static struct block *
608 gen_cmp_le(offrel, offset, size, v)
609 	enum e_offrel offrel;
610 	u_int offset, size;
611 	bpf_int32 v;
612 {
613 	return gen_ncmp(offrel, offset, size, 0xffffffff, BPF_JGT, 1, v);
614 }
615 
616 static struct block *
617 gen_mcmp(offrel, offset, size, v, mask)
618 	enum e_offrel offrel;
619 	u_int offset, size;
620 	bpf_int32 v;
621 	bpf_u_int32 mask;
622 {
623 	return gen_ncmp(offrel, offset, size, mask, BPF_JEQ, 0, v);
624 }
625 
626 static struct block *
627 gen_bcmp(offrel, offset, size, v)
628 	enum e_offrel offrel;
629 	register u_int offset, size;
630 	register const u_char *v;
631 {
632 	register struct block *b, *tmp;
633 
634 	b = NULL;
635 	while (size >= 4) {
636 		register const u_char *p = &v[size - 4];
637 		bpf_int32 w = ((bpf_int32)p[0] << 24) |
638 		    ((bpf_int32)p[1] << 16) | ((bpf_int32)p[2] << 8) | p[3];
639 
640 		tmp = gen_cmp(offrel, offset + size - 4, BPF_W, w);
641 		if (b != NULL)
642 			gen_and(b, tmp);
643 		b = tmp;
644 		size -= 4;
645 	}
646 	while (size >= 2) {
647 		register const u_char *p = &v[size - 2];
648 		bpf_int32 w = ((bpf_int32)p[0] << 8) | p[1];
649 
650 		tmp = gen_cmp(offrel, offset + size - 2, BPF_H, w);
651 		if (b != NULL)
652 			gen_and(b, tmp);
653 		b = tmp;
654 		size -= 2;
655 	}
656 	if (size > 0) {
657 		tmp = gen_cmp(offrel, offset, BPF_B, (bpf_int32)v[0]);
658 		if (b != NULL)
659 			gen_and(b, tmp);
660 		b = tmp;
661 	}
662 	return b;
663 }
664 
665 /*
666  * AND the field of size "size" at offset "offset" relative to the header
667  * specified by "offrel" with "mask", and compare it with the value "v"
668  * with the test specified by "jtype"; if "reverse" is true, the test
669  * should test the opposite of "jtype".
670  */
671 static struct block *
672 gen_ncmp(offrel, offset, size, mask, jtype, reverse, v)
673 	enum e_offrel offrel;
674 	bpf_int32 v;
675 	bpf_u_int32 offset, size, mask, jtype;
676 	int reverse;
677 {
678 	struct slist *s, *s2;
679 	struct block *b;
680 
681 	s = gen_load_a(offrel, offset, size);
682 
683 	if (mask != 0xffffffff) {
684 		s2 = new_stmt(BPF_ALU|BPF_AND|BPF_K);
685 		s2->s.k = mask;
686 		sappend(s, s2);
687 	}
688 
689 	b = new_block(JMP(jtype));
690 	b->stmts = s;
691 	b->s.k = v;
692 	if (reverse && (jtype == BPF_JGT || jtype == BPF_JGE))
693 		gen_not(b);
694 	return b;
695 }
696 
697 /*
698  * Various code constructs need to know the layout of the data link
699  * layer.  These variables give the necessary offsets from the beginning
700  * of the packet data.
701  */
702 
703 /*
704  * This is the offset of the beginning of the link-layer header from
705  * the beginning of the raw packet data.
706  *
707  * It's usually 0, except for 802.11 with a fixed-length radio header.
708  * (For 802.11 with a variable-length radio header, we have to generate
709  * code to compute that offset; off_ll is 0 in that case.)
710  */
711 static u_int off_ll;
712 
713 /*
714  * If there's a variable-length header preceding the link-layer header,
715  * "reg_off_ll" is the register number for a register containing the
716  * length of that header, and therefore the offset of the link-layer
717  * header from the beginning of the raw packet data.  Otherwise,
718  * "reg_off_ll" is -1.
719  */
720 static int reg_off_ll;
721 
722 /*
723  * This is the offset of the beginning of the MAC-layer header from
724  * the beginning of the link-layer header.
725  * It's usually 0, except for ATM LANE, where it's the offset, relative
726  * to the beginning of the raw packet data, of the Ethernet header.
727  */
728 static u_int off_mac;
729 
730 /*
731  * This is the offset of the beginning of the MAC-layer payload,
732  * from the beginning of the raw packet data.
733  *
734  * I.e., it's the sum of the length of the link-layer header (without,
735  * for example, any 802.2 LLC header, so it's the MAC-layer
736  * portion of that header), plus any prefix preceding the
737  * link-layer header.
738  */
739 static u_int off_macpl;
740 
741 /*
742  * This is 1 if the offset of the beginning of the MAC-layer payload
743  * from the beginning of the link-layer header is variable-length.
744  */
745 static int off_macpl_is_variable;
746 
747 /*
748  * If the link layer has variable_length headers, "reg_off_macpl"
749  * is the register number for a register containing the length of the
750  * link-layer header plus the length of any variable-length header
751  * preceding the link-layer header.  Otherwise, "reg_off_macpl"
752  * is -1.
753  */
754 static int reg_off_macpl;
755 
756 /*
757  * "off_linktype" is the offset to information in the link-layer header
758  * giving the packet type.  This offset is relative to the beginning
759  * of the link-layer header (i.e., it doesn't include off_ll).
760  *
761  * For Ethernet, it's the offset of the Ethernet type field.
762  *
763  * For link-layer types that always use 802.2 headers, it's the
764  * offset of the LLC header.
765  *
766  * For PPP, it's the offset of the PPP type field.
767  *
768  * For Cisco HDLC, it's the offset of the CHDLC type field.
769  *
770  * For BSD loopback, it's the offset of the AF_ value.
771  *
772  * For Linux cooked sockets, it's the offset of the type field.
773  *
774  * It's set to -1 for no encapsulation, in which case, IP is assumed.
775  */
776 static u_int off_linktype;
777 
778 /*
779  * TRUE if "pppoes" appeared in the filter; it causes link-layer type
780  * checks to check the PPP header, assumed to follow a LAN-style link-
781  * layer header and a PPPoE session header.
782  */
783 static int is_pppoes = 0;
784 
785 /*
786  * TRUE if the link layer includes an ATM pseudo-header.
787  */
788 static int is_atm = 0;
789 
790 /*
791  * TRUE if "lane" appeared in the filter; it causes us to generate
792  * code that assumes LANE rather than LLC-encapsulated traffic in SunATM.
793  */
794 static int is_lane = 0;
795 
796 /*
797  * These are offsets for the ATM pseudo-header.
798  */
799 static u_int off_vpi;
800 static u_int off_vci;
801 static u_int off_proto;
802 
803 /*
804  * These are offsets for the MTP2 fields.
805  */
806 static u_int off_li;
807 
808 /*
809  * These are offsets for the MTP3 fields.
810  */
811 static u_int off_sio;
812 static u_int off_opc;
813 static u_int off_dpc;
814 static u_int off_sls;
815 
816 /*
817  * This is the offset of the first byte after the ATM pseudo_header,
818  * or -1 if there is no ATM pseudo-header.
819  */
820 static u_int off_payload;
821 
822 /*
823  * These are offsets to the beginning of the network-layer header.
824  * They are relative to the beginning of the MAC-layer payload (i.e.,
825  * they don't include off_ll or off_macpl).
826  *
827  * If the link layer never uses 802.2 LLC:
828  *
829  *	"off_nl" and "off_nl_nosnap" are the same.
830  *
831  * If the link layer always uses 802.2 LLC:
832  *
833  *	"off_nl" is the offset if there's a SNAP header following
834  *	the 802.2 header;
835  *
836  *	"off_nl_nosnap" is the offset if there's no SNAP header.
837  *
838  * If the link layer is Ethernet:
839  *
840  *	"off_nl" is the offset if the packet is an Ethernet II packet
841  *	(we assume no 802.3+802.2+SNAP);
842  *
843  *	"off_nl_nosnap" is the offset if the packet is an 802.3 packet
844  *	with an 802.2 header following it.
845  */
846 static u_int off_nl;
847 static u_int off_nl_nosnap;
848 
849 static int linktype;
850 
851 static void
852 init_linktype(p)
853 	pcap_t *p;
854 {
855 	linktype = pcap_datalink(p);
856 #ifdef PCAP_FDDIPAD
857 	pcap_fddipad = p->fddipad;
858 #endif
859 
860 	/*
861 	 * Assume it's not raw ATM with a pseudo-header, for now.
862 	 */
863 	off_mac = 0;
864 	is_atm = 0;
865 	is_lane = 0;
866 	off_vpi = -1;
867 	off_vci = -1;
868 	off_proto = -1;
869 	off_payload = -1;
870 
871 	/*
872 	 * And that we're not doing PPPoE.
873 	 */
874 	is_pppoes = 0;
875 
876 	/*
877 	 * And assume we're not doing SS7.
878 	 */
879 	off_li = -1;
880 	off_sio = -1;
881 	off_opc = -1;
882 	off_dpc = -1;
883 	off_sls = -1;
884 
885 	/*
886 	 * Also assume it's not 802.11.
887 	 */
888 	off_ll = 0;
889 	off_macpl = 0;
890 	off_macpl_is_variable = 0;
891 
892 	orig_linktype = -1;
893 	orig_nl = -1;
894         label_stack_depth = 0;
895 
896 	reg_off_ll = -1;
897 	reg_off_macpl = -1;
898 
899 	switch (linktype) {
900 
901 	case DLT_ARCNET:
902 		off_linktype = 2;
903 		off_macpl = 6;
904 		off_nl = 0;		/* XXX in reality, variable! */
905 		off_nl_nosnap = 0;	/* no 802.2 LLC */
906 		return;
907 
908 	case DLT_ARCNET_LINUX:
909 		off_linktype = 4;
910 		off_macpl = 8;
911 		off_nl = 0;		/* XXX in reality, variable! */
912 		off_nl_nosnap = 0;	/* no 802.2 LLC */
913 		return;
914 
915 	case DLT_EN10MB:
916 		off_linktype = 12;
917 		off_macpl = 14;		/* Ethernet header length */
918 		off_nl = 0;		/* Ethernet II */
919 		off_nl_nosnap = 3;	/* 802.3+802.2 */
920 		return;
921 
922 	case DLT_SLIP:
923 		/*
924 		 * SLIP doesn't have a link level type.  The 16 byte
925 		 * header is hacked into our SLIP driver.
926 		 */
927 		off_linktype = -1;
928 		off_macpl = 16;
929 		off_nl = 0;
930 		off_nl_nosnap = 0;	/* no 802.2 LLC */
931 		return;
932 
933 	case DLT_SLIP_BSDOS:
934 		/* XXX this may be the same as the DLT_PPP_BSDOS case */
935 		off_linktype = -1;
936 		/* XXX end */
937 		off_macpl = 24;
938 		off_nl = 0;
939 		off_nl_nosnap = 0;	/* no 802.2 LLC */
940 		return;
941 
942 	case DLT_NULL:
943 	case DLT_LOOP:
944 		off_linktype = 0;
945 		off_macpl = 4;
946 		off_nl = 0;
947 		off_nl_nosnap = 0;	/* no 802.2 LLC */
948 		return;
949 
950 	case DLT_ENC:
951 		off_linktype = 0;
952 		off_macpl = 12;
953 		off_nl = 0;
954 		off_nl_nosnap = 0;	/* no 802.2 LLC */
955 		return;
956 
957 	case DLT_PPP:
958 	case DLT_PPP_PPPD:
959 	case DLT_C_HDLC:		/* BSD/OS Cisco HDLC */
960 	case DLT_PPP_SERIAL:		/* NetBSD sync/async serial PPP */
961 		off_linktype = 2;
962 		off_macpl = 4;
963 		off_nl = 0;
964 		off_nl_nosnap = 0;	/* no 802.2 LLC */
965 		return;
966 
967 	case DLT_PPP_ETHER:
968 		/*
969 		 * This does no include the Ethernet header, and
970 		 * only covers session state.
971 		 */
972 		off_linktype = 6;
973 		off_macpl = 8;
974 		off_nl = 0;
975 		off_nl_nosnap = 0;	/* no 802.2 LLC */
976 		return;
977 
978 	case DLT_PPP_BSDOS:
979 		off_linktype = 5;
980 		off_macpl = 24;
981 		off_nl = 0;
982 		off_nl_nosnap = 0;	/* no 802.2 LLC */
983 		return;
984 
985 	case DLT_FDDI:
986 		/*
987 		 * FDDI doesn't really have a link-level type field.
988 		 * We set "off_linktype" to the offset of the LLC header.
989 		 *
990 		 * To check for Ethernet types, we assume that SSAP = SNAP
991 		 * is being used and pick out the encapsulated Ethernet type.
992 		 * XXX - should we generate code to check for SNAP?
993 		 */
994 		off_linktype = 13;
995 #ifdef PCAP_FDDIPAD
996 		off_linktype += pcap_fddipad;
997 #endif
998 		off_macpl = 13;		/* FDDI MAC header length */
999 #ifdef PCAP_FDDIPAD
1000 		off_macpl += pcap_fddipad;
1001 #endif
1002 		off_nl = 8;		/* 802.2+SNAP */
1003 		off_nl_nosnap = 3;	/* 802.2 */
1004 		return;
1005 
1006 	case DLT_IEEE802:
1007 		/*
1008 		 * Token Ring doesn't really have a link-level type field.
1009 		 * We set "off_linktype" to the offset of the LLC header.
1010 		 *
1011 		 * To check for Ethernet types, we assume that SSAP = SNAP
1012 		 * is being used and pick out the encapsulated Ethernet type.
1013 		 * XXX - should we generate code to check for SNAP?
1014 		 *
1015 		 * XXX - the header is actually variable-length.
1016 		 * Some various Linux patched versions gave 38
1017 		 * as "off_linktype" and 40 as "off_nl"; however,
1018 		 * if a token ring packet has *no* routing
1019 		 * information, i.e. is not source-routed, the correct
1020 		 * values are 20 and 22, as they are in the vanilla code.
1021 		 *
1022 		 * A packet is source-routed iff the uppermost bit
1023 		 * of the first byte of the source address, at an
1024 		 * offset of 8, has the uppermost bit set.  If the
1025 		 * packet is source-routed, the total number of bytes
1026 		 * of routing information is 2 plus bits 0x1F00 of
1027 		 * the 16-bit value at an offset of 14 (shifted right
1028 		 * 8 - figure out which byte that is).
1029 		 */
1030 		off_linktype = 14;
1031 		off_macpl = 14;		/* Token Ring MAC header length */
1032 		off_nl = 8;		/* 802.2+SNAP */
1033 		off_nl_nosnap = 3;	/* 802.2 */
1034 		return;
1035 
1036 	case DLT_IEEE802_11:
1037 	case DLT_PRISM_HEADER:
1038 	case DLT_IEEE802_11_RADIO_AVS:
1039 	case DLT_IEEE802_11_RADIO:
1040 		/*
1041 		 * 802.11 doesn't really have a link-level type field.
1042 		 * We set "off_linktype" to the offset of the LLC header.
1043 		 *
1044 		 * To check for Ethernet types, we assume that SSAP = SNAP
1045 		 * is being used and pick out the encapsulated Ethernet type.
1046 		 * XXX - should we generate code to check for SNAP?
1047 		 *
1048 		 * We also handle variable-length radio headers here.
1049 		 * The Prism header is in theory variable-length, but in
1050 		 * practice it's always 144 bytes long.  However, some
1051 		 * drivers on Linux use ARPHRD_IEEE80211_PRISM, but
1052 		 * sometimes or always supply an AVS header, so we
1053 		 * have to check whether the radio header is a Prism
1054 		 * header or an AVS header, so, in practice, it's
1055 		 * variable-length.
1056 		 */
1057 		off_linktype = 24;
1058 		off_macpl = 0;		/* link-layer header is variable-length */
1059 		off_macpl_is_variable = 1;
1060 		off_nl = 8;		/* 802.2+SNAP */
1061 		off_nl_nosnap = 3;	/* 802.2 */
1062 		return;
1063 
1064 	case DLT_PPI:
1065 		/*
1066 		 * At the moment we treat PPI the same way that we treat
1067 		 * normal Radiotap encoded packets. The difference is in
1068 		 * the function that generates the code at the beginning
1069 		 * to compute the header length.  Since this code generator
1070 		 * of PPI supports bare 802.11 encapsulation only (i.e.
1071 		 * the encapsulated DLT should be DLT_IEEE802_11) we
1072 		 * generate code to check for this too.
1073 		 */
1074 		off_linktype = 24;
1075 		off_macpl = 0;		/* link-layer header is variable-length */
1076 		off_macpl_is_variable = 1;
1077 		off_nl = 8;		/* 802.2+SNAP */
1078 		off_nl_nosnap = 3;	/* 802.2 */
1079 		return;
1080 
1081 	case DLT_ATM_RFC1483:
1082 	case DLT_ATM_CLIP:	/* Linux ATM defines this */
1083 		/*
1084 		 * assume routed, non-ISO PDUs
1085 		 * (i.e., LLC = 0xAA-AA-03, OUT = 0x00-00-00)
1086 		 *
1087 		 * XXX - what about ISO PDUs, e.g. CLNP, ISIS, ESIS,
1088 		 * or PPP with the PPP NLPID (e.g., PPPoA)?  The
1089 		 * latter would presumably be treated the way PPPoE
1090 		 * should be, so you can do "pppoe and udp port 2049"
1091 		 * or "pppoa and tcp port 80" and have it check for
1092 		 * PPPo{A,E} and a PPP protocol of IP and....
1093 		 */
1094 		off_linktype = 0;
1095 		off_macpl = 0;		/* packet begins with LLC header */
1096 		off_nl = 8;		/* 802.2+SNAP */
1097 		off_nl_nosnap = 3;	/* 802.2 */
1098 		return;
1099 
1100 	case DLT_SUNATM:
1101 		/*
1102 		 * Full Frontal ATM; you get AALn PDUs with an ATM
1103 		 * pseudo-header.
1104 		 */
1105 		is_atm = 1;
1106 		off_vpi = SUNATM_VPI_POS;
1107 		off_vci = SUNATM_VCI_POS;
1108 		off_proto = PROTO_POS;
1109 		off_mac = -1;	/* assume LLC-encapsulated, so no MAC-layer header */
1110 		off_payload = SUNATM_PKT_BEGIN_POS;
1111 		off_linktype = off_payload;
1112 		off_macpl = off_payload;	/* if LLC-encapsulated */
1113 		off_nl = 8;		/* 802.2+SNAP */
1114 		off_nl_nosnap = 3;	/* 802.2 */
1115 		return;
1116 
1117 	case DLT_RAW:
1118 		off_linktype = -1;
1119 		off_macpl = 0;
1120 		off_nl = 0;
1121 		off_nl_nosnap = 0;	/* no 802.2 LLC */
1122 		return;
1123 
1124 	case DLT_LINUX_SLL:	/* fake header for Linux cooked socket */
1125 		off_linktype = 14;
1126 		off_macpl = 16;
1127 		off_nl = 0;
1128 		off_nl_nosnap = 0;	/* no 802.2 LLC */
1129 		return;
1130 
1131 	case DLT_LTALK:
1132 		/*
1133 		 * LocalTalk does have a 1-byte type field in the LLAP header,
1134 		 * but really it just indicates whether there is a "short" or
1135 		 * "long" DDP packet following.
1136 		 */
1137 		off_linktype = -1;
1138 		off_macpl = 0;
1139 		off_nl = 0;
1140 		off_nl_nosnap = 0;	/* no 802.2 LLC */
1141 		return;
1142 
1143 	case DLT_IP_OVER_FC:
1144 		/*
1145 		 * RFC 2625 IP-over-Fibre-Channel doesn't really have a
1146 		 * link-level type field.  We set "off_linktype" to the
1147 		 * offset of the LLC header.
1148 		 *
1149 		 * To check for Ethernet types, we assume that SSAP = SNAP
1150 		 * is being used and pick out the encapsulated Ethernet type.
1151 		 * XXX - should we generate code to check for SNAP? RFC
1152 		 * 2625 says SNAP should be used.
1153 		 */
1154 		off_linktype = 16;
1155 		off_macpl = 16;
1156 		off_nl = 8;		/* 802.2+SNAP */
1157 		off_nl_nosnap = 3;	/* 802.2 */
1158 		return;
1159 
1160 	case DLT_FRELAY:
1161 		/*
1162 		 * XXX - we should set this to handle SNAP-encapsulated
1163 		 * frames (NLPID of 0x80).
1164 		 */
1165 		off_linktype = -1;
1166 		off_macpl = 0;
1167 		off_nl = 0;
1168 		off_nl_nosnap = 0;	/* no 802.2 LLC */
1169 		return;
1170 
1171                 /*
1172                  * the only BPF-interesting FRF.16 frames are non-control frames;
1173                  * Frame Relay has a variable length link-layer
1174                  * so lets start with offset 4 for now and increments later on (FIXME);
1175                  */
1176 	case DLT_MFR:
1177 		off_linktype = -1;
1178 		off_macpl = 0;
1179 		off_nl = 4;
1180 		off_nl_nosnap = 0;	/* XXX - for now -> no 802.2 LLC */
1181 		return;
1182 
1183 	case DLT_APPLE_IP_OVER_IEEE1394:
1184 		off_linktype = 16;
1185 		off_macpl = 18;
1186 		off_nl = 0;
1187 		off_nl_nosnap = 0;	/* no 802.2 LLC */
1188 		return;
1189 
1190 	case DLT_LINUX_IRDA:
1191 		/*
1192 		 * Currently, only raw "link[N:M]" filtering is supported.
1193 		 */
1194 		off_linktype = -1;
1195 		off_macpl = -1;
1196 		off_nl = -1;
1197 		off_nl_nosnap = -1;
1198 		return;
1199 
1200 	case DLT_DOCSIS:
1201 		/*
1202 		 * Currently, only raw "link[N:M]" filtering is supported.
1203 		 */
1204 		off_linktype = -1;
1205 		off_macpl = -1;
1206 		off_nl = -1;
1207 		off_nl_nosnap = -1;
1208 		return;
1209 
1210 	case DLT_SYMANTEC_FIREWALL:
1211 		off_linktype = 6;
1212 		off_macpl = 44;
1213 		off_nl = 0;		/* Ethernet II */
1214 		off_nl_nosnap = 0;	/* XXX - what does it do with 802.3 packets? */
1215 		return;
1216 
1217 #ifdef HAVE_NET_PFVAR_H
1218 	case DLT_PFLOG:
1219 		off_linktype = 0;
1220 		off_macpl = PFLOG_HDRLEN;
1221 		off_nl = 0;
1222 		off_nl_nosnap = 0;	/* no 802.2 LLC */
1223 		return;
1224 #endif
1225 
1226         case DLT_JUNIPER_MFR:
1227         case DLT_JUNIPER_MLFR:
1228         case DLT_JUNIPER_MLPPP:
1229         case DLT_JUNIPER_PPP:
1230         case DLT_JUNIPER_CHDLC:
1231         case DLT_JUNIPER_FRELAY:
1232                 off_linktype = 4;
1233 		off_macpl = 4;
1234 		off_nl = 0;
1235 		off_nl_nosnap = -1;	/* no 802.2 LLC */
1236                 return;
1237 
1238 	case DLT_JUNIPER_ATM1:
1239 		off_linktype = 4;	/* in reality variable between 4-8 */
1240 		off_macpl = 4;	/* in reality variable between 4-8 */
1241 		off_nl = 0;
1242 		off_nl_nosnap = 10;
1243 		return;
1244 
1245 	case DLT_JUNIPER_ATM2:
1246 		off_linktype = 8;	/* in reality variable between 8-12 */
1247 		off_macpl = 8;	/* in reality variable between 8-12 */
1248 		off_nl = 0;
1249 		off_nl_nosnap = 10;
1250 		return;
1251 
1252 		/* frames captured on a Juniper PPPoE service PIC
1253 		 * contain raw ethernet frames */
1254 	case DLT_JUNIPER_PPPOE:
1255         case DLT_JUNIPER_ETHER:
1256         	off_macpl = 14;
1257 		off_linktype = 16;
1258 		off_nl = 18;		/* Ethernet II */
1259 		off_nl_nosnap = 21;	/* 802.3+802.2 */
1260 		return;
1261 
1262 	case DLT_JUNIPER_PPPOE_ATM:
1263 		off_linktype = 4;
1264 		off_macpl = 6;
1265 		off_nl = 0;
1266 		off_nl_nosnap = -1;	/* no 802.2 LLC */
1267 		return;
1268 
1269 	case DLT_JUNIPER_GGSN:
1270 		off_linktype = 6;
1271 		off_macpl = 12;
1272 		off_nl = 0;
1273 		off_nl_nosnap = -1;	/* no 802.2 LLC */
1274 		return;
1275 
1276 	case DLT_JUNIPER_ES:
1277 		off_linktype = 6;
1278 		off_macpl = -1;		/* not really a network layer but raw IP addresses */
1279 		off_nl = -1;		/* not really a network layer but raw IP addresses */
1280 		off_nl_nosnap = -1;	/* no 802.2 LLC */
1281 		return;
1282 
1283 	case DLT_JUNIPER_MONITOR:
1284 		off_linktype = 12;
1285 		off_macpl = 12;
1286 		off_nl = 0;		/* raw IP/IP6 header */
1287 		off_nl_nosnap = -1;	/* no 802.2 LLC */
1288 		return;
1289 
1290 	case DLT_JUNIPER_SERVICES:
1291 		off_linktype = 12;
1292 		off_macpl = -1;		/* L3 proto location dep. on cookie type */
1293 		off_nl = -1;		/* L3 proto location dep. on cookie type */
1294 		off_nl_nosnap = -1;	/* no 802.2 LLC */
1295 		return;
1296 
1297 	case DLT_JUNIPER_VP:
1298 		off_linktype = 18;
1299 		off_macpl = -1;
1300 		off_nl = -1;
1301 		off_nl_nosnap = -1;
1302 		return;
1303 
1304 	case DLT_JUNIPER_ST:
1305 		off_linktype = 18;
1306 		off_macpl = -1;
1307 		off_nl = -1;
1308 		off_nl_nosnap = -1;
1309 		return;
1310 
1311 	case DLT_JUNIPER_ISM:
1312 		off_linktype = 8;
1313 		off_macpl = -1;
1314 		off_nl = -1;
1315 		off_nl_nosnap = -1;
1316 		return;
1317 
1318 	case DLT_MTP2:
1319 		off_li = 2;
1320 		off_sio = 3;
1321 		off_opc = 4;
1322 		off_dpc = 4;
1323 		off_sls = 7;
1324 		off_linktype = -1;
1325 		off_macpl = -1;
1326 		off_nl = -1;
1327 		off_nl_nosnap = -1;
1328 		return;
1329 
1330 	case DLT_MTP2_WITH_PHDR:
1331 		off_li = 6;
1332 		off_sio = 7;
1333 		off_opc = 8;
1334 		off_dpc = 8;
1335 		off_sls = 11;
1336 		off_linktype = -1;
1337 		off_macpl = -1;
1338 		off_nl = -1;
1339 		off_nl_nosnap = -1;
1340 		return;
1341 
1342 	case DLT_ERF:
1343 		off_li = 22;
1344 		off_sio = 23;
1345 		off_opc = 24;
1346 		off_dpc = 24;
1347 		off_sls = 27;
1348 		off_linktype = -1;
1349 		off_macpl = -1;
1350 		off_nl = -1;
1351 		off_nl_nosnap = -1;
1352 		return;
1353 
1354 #ifdef DLT_PFSYNC
1355 	case DLT_PFSYNC:
1356 		off_linktype = -1;
1357 		off_macpl = 4;
1358 		off_nl = 0;
1359 		off_nl_nosnap = 0;
1360 		return;
1361 #endif
1362 
1363 	case DLT_LINUX_LAPD:
1364 		/*
1365 		 * Currently, only raw "link[N:M]" filtering is supported.
1366 		 */
1367 		off_linktype = -1;
1368 		off_macpl = -1;
1369 		off_nl = -1;
1370 		off_nl_nosnap = -1;
1371 		return;
1372 
1373 	case DLT_USB:
1374 		/*
1375 		 * Currently, only raw "link[N:M]" filtering is supported.
1376 		 */
1377 		off_linktype = -1;
1378 		off_macpl = -1;
1379 		off_nl = -1;
1380 		off_nl_nosnap = -1;
1381 		return;
1382 
1383 	case DLT_BLUETOOTH_HCI_H4:
1384 		/*
1385 		 * Currently, only raw "link[N:M]" filtering is supported.
1386 		 */
1387 		off_linktype = -1;
1388 		off_macpl = -1;
1389 		off_nl = -1;
1390 		off_nl_nosnap = -1;
1391 		return;
1392 
1393 	case DLT_USB_LINUX:
1394 		/*
1395 		 * Currently, only raw "link[N:M]" filtering is supported.
1396 		 */
1397 		off_linktype = -1;
1398 		off_macpl = -1;
1399 		off_nl = -1;
1400 		off_nl_nosnap = -1;
1401 		return;
1402 
1403 	case DLT_CAN20B:
1404 		/*
1405 		 * Currently, only raw "link[N:M]" filtering is supported.
1406 		 */
1407 		off_linktype = -1;
1408 		off_macpl = -1;
1409 		off_nl = -1;
1410 		off_nl_nosnap = -1;
1411 		return;
1412 
1413 	case DLT_IEEE802_15_4_LINUX:
1414 		/*
1415 		 * Currently, only raw "link[N:M]" filtering is supported.
1416 		 */
1417 		off_linktype = -1;
1418 		off_macpl = -1;
1419 		off_nl = -1;
1420 		off_nl_nosnap = -1;
1421 		return;
1422 
1423 	case DLT_IEEE802_16_MAC_CPS_RADIO:
1424 		/*
1425 		 * Currently, only raw "link[N:M]" filtering is supported.
1426 		 */
1427 		off_linktype = -1;
1428 		off_macpl = -1;
1429 		off_nl = -1;
1430 		off_nl_nosnap = -1;
1431 		return;
1432 
1433 	case DLT_IEEE802_15_4:
1434 		/*
1435 		 * Currently, only raw "link[N:M]" filtering is supported.
1436 		 */
1437 		off_linktype = -1;
1438 		off_macpl = -1;
1439 		off_nl = -1;
1440 		off_nl_nosnap = -1;
1441 		return;
1442 
1443 	case DLT_SITA:
1444 		/*
1445 		 * Currently, only raw "link[N:M]" filtering is supported.
1446 		 */
1447 		off_linktype = -1;
1448 		off_macpl = -1;
1449 		off_nl = -1;
1450 		off_nl_nosnap = -1;
1451 		return;
1452 
1453 	case DLT_RAIF1:
1454 		/*
1455 		 * Currently, only raw "link[N:M]" filtering is supported.
1456 		 */
1457 		off_linktype = -1;
1458 		off_macpl = -1;
1459 		off_nl = -1;
1460 		off_nl_nosnap = -1;
1461 		return;
1462 
1463 	case DLT_IPMB:
1464 		/*
1465 		 * Currently, only raw "link[N:M]" filtering is supported.
1466 		 */
1467 		off_linktype = -1;
1468 		off_macpl = -1;
1469 		off_nl = -1;
1470 		off_nl_nosnap = -1;
1471 		return;
1472 
1473 	case DLT_BLUETOOTH_HCI_H4_WITH_PHDR:
1474 		/*
1475 		 * Currently, only raw "link[N:M]" filtering is supported.
1476 		 */
1477 		off_linktype = -1;
1478 		off_macpl = -1;
1479 		off_nl = -1;
1480 		off_nl_nosnap = -1;
1481 		return;
1482 
1483 	case DLT_AX25_KISS:
1484 		/*
1485 		 * Currently, only raw "link[N:M]" filtering is supported.
1486 		 */
1487 		off_linktype = -1;	/* variable, min 15, max 71 steps of 7 */
1488 		off_macpl = -1;
1489 		off_nl = -1;		/* variable, min 16, max 71 steps of 7 */
1490 		off_nl_nosnap = -1;	/* no 802.2 LLC */
1491 		off_mac = 1;		/* step over the kiss length byte */
1492 		return;
1493 
1494 	case DLT_IEEE802_15_4_NONASK_PHY:
1495 		/*
1496 		 * Currently, only raw "link[N:M]" filtering is supported.
1497 		 */
1498 		off_linktype = -1;
1499 		off_macpl = -1;
1500 		off_nl = -1;
1501 		off_nl_nosnap = -1;
1502 		return;
1503 	}
1504 	bpf_error("unknown data link type %d", linktype);
1505 	/* NOTREACHED */
1506 }
1507 
1508 /*
1509  * Load a value relative to the beginning of the link-layer header.
1510  * The link-layer header doesn't necessarily begin at the beginning
1511  * of the packet data; there might be a variable-length prefix containing
1512  * radio information.
1513  */
1514 static struct slist *
1515 gen_load_llrel(offset, size)
1516 	u_int offset, size;
1517 {
1518 	struct slist *s, *s2;
1519 
1520 	s = gen_llprefixlen();
1521 
1522 	/*
1523 	 * If "s" is non-null, it has code to arrange that the X register
1524 	 * contains the length of the prefix preceding the link-layer
1525 	 * header.
1526 	 *
1527 	 * Otherwise, the length of the prefix preceding the link-layer
1528 	 * header is "off_ll".
1529 	 */
1530 	if (s != NULL) {
1531 		/*
1532 		 * There's a variable-length prefix preceding the
1533 		 * link-layer header.  "s" points to a list of statements
1534 		 * that put the length of that prefix into the X register.
1535 		 * do an indirect load, to use the X register as an offset.
1536 		 */
1537 		s2 = new_stmt(BPF_LD|BPF_IND|size);
1538 		s2->s.k = offset;
1539 		sappend(s, s2);
1540 	} else {
1541 		/*
1542 		 * There is no variable-length header preceding the
1543 		 * link-layer header; add in off_ll, which, if there's
1544 		 * a fixed-length header preceding the link-layer header,
1545 		 * is the length of that header.
1546 		 */
1547 		s = new_stmt(BPF_LD|BPF_ABS|size);
1548 		s->s.k = offset + off_ll;
1549 	}
1550 	return s;
1551 }
1552 
1553 /*
1554  * Load a value relative to the beginning of the MAC-layer payload.
1555  */
1556 static struct slist *
1557 gen_load_macplrel(offset, size)
1558 	u_int offset, size;
1559 {
1560 	struct slist *s, *s2;
1561 
1562 	s = gen_off_macpl();
1563 
1564 	/*
1565 	 * If s is non-null, the offset of the MAC-layer payload is
1566 	 * variable, and s points to a list of instructions that
1567 	 * arrange that the X register contains that offset.
1568 	 *
1569 	 * Otherwise, the offset of the MAC-layer payload is constant,
1570 	 * and is in off_macpl.
1571 	 */
1572 	if (s != NULL) {
1573 		/*
1574 		 * The offset of the MAC-layer payload is in the X
1575 		 * register.  Do an indirect load, to use the X register
1576 		 * as an offset.
1577 		 */
1578 		s2 = new_stmt(BPF_LD|BPF_IND|size);
1579 		s2->s.k = offset;
1580 		sappend(s, s2);
1581 	} else {
1582 		/*
1583 		 * The offset of the MAC-layer payload is constant,
1584 		 * and is in off_macpl; load the value at that offset
1585 		 * plus the specified offset.
1586 		 */
1587 		s = new_stmt(BPF_LD|BPF_ABS|size);
1588 		s->s.k = off_macpl + offset;
1589 	}
1590 	return s;
1591 }
1592 
1593 /*
1594  * Load a value relative to the beginning of the specified header.
1595  */
1596 static struct slist *
1597 gen_load_a(offrel, offset, size)
1598 	enum e_offrel offrel;
1599 	u_int offset, size;
1600 {
1601 	struct slist *s, *s2;
1602 
1603 	switch (offrel) {
1604 
1605 	case OR_PACKET:
1606                 s = new_stmt(BPF_LD|BPF_ABS|size);
1607                 s->s.k = offset;
1608 		break;
1609 
1610 	case OR_LINK:
1611 		s = gen_load_llrel(offset, size);
1612 		break;
1613 
1614 	case OR_MACPL:
1615 		s = gen_load_macplrel(offset, size);
1616 		break;
1617 
1618 	case OR_NET:
1619 		s = gen_load_macplrel(off_nl + offset, size);
1620 		break;
1621 
1622 	case OR_NET_NOSNAP:
1623 		s = gen_load_macplrel(off_nl_nosnap + offset, size);
1624 		break;
1625 
1626 	case OR_TRAN_IPV4:
1627 		/*
1628 		 * Load the X register with the length of the IPv4 header
1629 		 * (plus the offset of the link-layer header, if it's
1630 		 * preceded by a variable-length header such as a radio
1631 		 * header), in bytes.
1632 		 */
1633 		s = gen_loadx_iphdrlen();
1634 
1635 		/*
1636 		 * Load the item at {offset of the MAC-layer payload} +
1637 		 * {offset, relative to the start of the MAC-layer
1638 		 * paylod, of the IPv4 header} + {length of the IPv4 header} +
1639 		 * {specified offset}.
1640 		 *
1641 		 * (If the offset of the MAC-layer payload is variable,
1642 		 * it's included in the value in the X register, and
1643 		 * off_macpl is 0.)
1644 		 */
1645 		s2 = new_stmt(BPF_LD|BPF_IND|size);
1646 		s2->s.k = off_macpl + off_nl + offset;
1647 		sappend(s, s2);
1648 		break;
1649 
1650 	case OR_TRAN_IPV6:
1651 		s = gen_load_macplrel(off_nl + 40 + offset, size);
1652 		break;
1653 
1654 	default:
1655 		abort();
1656 		return NULL;
1657 	}
1658 	return s;
1659 }
1660 
1661 /*
1662  * Generate code to load into the X register the sum of the length of
1663  * the IPv4 header and any variable-length header preceding the link-layer
1664  * header.
1665  */
1666 static struct slist *
1667 gen_loadx_iphdrlen()
1668 {
1669 	struct slist *s, *s2;
1670 
1671 	s = gen_off_macpl();
1672 	if (s != NULL) {
1673 		/*
1674 		 * There's a variable-length prefix preceding the
1675 		 * link-layer header, or the link-layer header is itself
1676 		 * variable-length.  "s" points to a list of statements
1677 		 * that put the offset of the MAC-layer payload into
1678 		 * the X register.
1679 		 *
1680 		 * The 4*([k]&0xf) addressing mode can't be used, as we
1681 		 * don't have a constant offset, so we have to load the
1682 		 * value in question into the A register and add to it
1683 		 * the value from the X register.
1684 		 */
1685 		s2 = new_stmt(BPF_LD|BPF_IND|BPF_B);
1686 		s2->s.k = off_nl;
1687 		sappend(s, s2);
1688 		s2 = new_stmt(BPF_ALU|BPF_AND|BPF_K);
1689 		s2->s.k = 0xf;
1690 		sappend(s, s2);
1691 		s2 = new_stmt(BPF_ALU|BPF_LSH|BPF_K);
1692 		s2->s.k = 2;
1693 		sappend(s, s2);
1694 
1695 		/*
1696 		 * The A register now contains the length of the
1697 		 * IP header.  We need to add to it the offset of
1698 		 * the MAC-layer payload, which is still in the X
1699 		 * register, and move the result into the X register.
1700 		 */
1701 		sappend(s, new_stmt(BPF_ALU|BPF_ADD|BPF_X));
1702 		sappend(s, new_stmt(BPF_MISC|BPF_TAX));
1703 	} else {
1704 		/*
1705 		 * There is no variable-length header preceding the
1706 		 * link-layer header, and the link-layer header is
1707 		 * fixed-length; load the length of the IPv4 header,
1708 		 * which is at an offset of off_nl from the beginning
1709 		 * of the MAC-layer payload, and thus at an offset
1710 		 * of off_mac_pl + off_nl from the beginning of the
1711 		 * raw packet data.
1712 		 */
1713 		s = new_stmt(BPF_LDX|BPF_MSH|BPF_B);
1714 		s->s.k = off_macpl + off_nl;
1715 	}
1716 	return s;
1717 }
1718 
1719 static struct block *
1720 gen_uncond(rsense)
1721 	int rsense;
1722 {
1723 	struct block *b;
1724 	struct slist *s;
1725 
1726 	s = new_stmt(BPF_LD|BPF_IMM);
1727 	s->s.k = !rsense;
1728 	b = new_block(JMP(BPF_JEQ));
1729 	b->stmts = s;
1730 
1731 	return b;
1732 }
1733 
1734 static inline struct block *
1735 gen_true()
1736 {
1737 	return gen_uncond(1);
1738 }
1739 
1740 static inline struct block *
1741 gen_false()
1742 {
1743 	return gen_uncond(0);
1744 }
1745 
1746 /*
1747  * Byte-swap a 32-bit number.
1748  * ("htonl()" or "ntohl()" won't work - we want to byte-swap even on
1749  * big-endian platforms.)
1750  */
1751 #define	SWAPLONG(y) \
1752 ((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff))
1753 
1754 /*
1755  * Generate code to match a particular packet type.
1756  *
1757  * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
1758  * value, if <= ETHERMTU.  We use that to determine whether to
1759  * match the type/length field or to check the type/length field for
1760  * a value <= ETHERMTU to see whether it's a type field and then do
1761  * the appropriate test.
1762  */
1763 static struct block *
1764 gen_ether_linktype(proto)
1765 	register int proto;
1766 {
1767 	struct block *b0, *b1;
1768 
1769 	switch (proto) {
1770 
1771 	case LLCSAP_ISONS:
1772 	case LLCSAP_IP:
1773 	case LLCSAP_NETBEUI:
1774 		/*
1775 		 * OSI protocols and NetBEUI always use 802.2 encapsulation,
1776 		 * so we check the DSAP and SSAP.
1777 		 *
1778 		 * LLCSAP_IP checks for IP-over-802.2, rather
1779 		 * than IP-over-Ethernet or IP-over-SNAP.
1780 		 *
1781 		 * XXX - should we check both the DSAP and the
1782 		 * SSAP, like this, or should we check just the
1783 		 * DSAP, as we do for other types <= ETHERMTU
1784 		 * (i.e., other SAP values)?
1785 		 */
1786 		b0 = gen_cmp_gt(OR_LINK, off_linktype, BPF_H, ETHERMTU);
1787 		gen_not(b0);
1788 		b1 = gen_cmp(OR_MACPL, 0, BPF_H, (bpf_int32)
1789 			     ((proto << 8) | proto));
1790 		gen_and(b0, b1);
1791 		return b1;
1792 
1793 	case LLCSAP_IPX:
1794 		/*
1795 		 * Check for;
1796 		 *
1797 		 *	Ethernet_II frames, which are Ethernet
1798 		 *	frames with a frame type of ETHERTYPE_IPX;
1799 		 *
1800 		 *	Ethernet_802.3 frames, which are 802.3
1801 		 *	frames (i.e., the type/length field is
1802 		 *	a length field, <= ETHERMTU, rather than
1803 		 *	a type field) with the first two bytes
1804 		 *	after the Ethernet/802.3 header being
1805 		 *	0xFFFF;
1806 		 *
1807 		 *	Ethernet_802.2 frames, which are 802.3
1808 		 *	frames with an 802.2 LLC header and
1809 		 *	with the IPX LSAP as the DSAP in the LLC
1810 		 *	header;
1811 		 *
1812 		 *	Ethernet_SNAP frames, which are 802.3
1813 		 *	frames with an LLC header and a SNAP
1814 		 *	header and with an OUI of 0x000000
1815 		 *	(encapsulated Ethernet) and a protocol
1816 		 *	ID of ETHERTYPE_IPX in the SNAP header.
1817 		 *
1818 		 * XXX - should we generate the same code both
1819 		 * for tests for LLCSAP_IPX and for ETHERTYPE_IPX?
1820 		 */
1821 
1822 		/*
1823 		 * This generates code to check both for the
1824 		 * IPX LSAP (Ethernet_802.2) and for Ethernet_802.3.
1825 		 */
1826 		b0 = gen_cmp(OR_MACPL, 0, BPF_B, (bpf_int32)LLCSAP_IPX);
1827 		b1 = gen_cmp(OR_MACPL, 0, BPF_H, (bpf_int32)0xFFFF);
1828 		gen_or(b0, b1);
1829 
1830 		/*
1831 		 * Now we add code to check for SNAP frames with
1832 		 * ETHERTYPE_IPX, i.e. Ethernet_SNAP.
1833 		 */
1834 		b0 = gen_snap(0x000000, ETHERTYPE_IPX);
1835 		gen_or(b0, b1);
1836 
1837 		/*
1838 		 * Now we generate code to check for 802.3
1839 		 * frames in general.
1840 		 */
1841 		b0 = gen_cmp_gt(OR_LINK, off_linktype, BPF_H, ETHERMTU);
1842 		gen_not(b0);
1843 
1844 		/*
1845 		 * Now add the check for 802.3 frames before the
1846 		 * check for Ethernet_802.2 and Ethernet_802.3,
1847 		 * as those checks should only be done on 802.3
1848 		 * frames, not on Ethernet frames.
1849 		 */
1850 		gen_and(b0, b1);
1851 
1852 		/*
1853 		 * Now add the check for Ethernet_II frames, and
1854 		 * do that before checking for the other frame
1855 		 * types.
1856 		 */
1857 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H,
1858 		    (bpf_int32)ETHERTYPE_IPX);
1859 		gen_or(b0, b1);
1860 		return b1;
1861 
1862 	case ETHERTYPE_ATALK:
1863 	case ETHERTYPE_AARP:
1864 		/*
1865 		 * EtherTalk (AppleTalk protocols on Ethernet link
1866 		 * layer) may use 802.2 encapsulation.
1867 		 */
1868 
1869 		/*
1870 		 * Check for 802.2 encapsulation (EtherTalk phase 2?);
1871 		 * we check for an Ethernet type field less than
1872 		 * 1500, which means it's an 802.3 length field.
1873 		 */
1874 		b0 = gen_cmp_gt(OR_LINK, off_linktype, BPF_H, ETHERMTU);
1875 		gen_not(b0);
1876 
1877 		/*
1878 		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
1879 		 * SNAP packets with an organization code of
1880 		 * 0x080007 (Apple, for Appletalk) and a protocol
1881 		 * type of ETHERTYPE_ATALK (Appletalk).
1882 		 *
1883 		 * 802.2-encapsulated ETHERTYPE_AARP packets are
1884 		 * SNAP packets with an organization code of
1885 		 * 0x000000 (encapsulated Ethernet) and a protocol
1886 		 * type of ETHERTYPE_AARP (Appletalk ARP).
1887 		 */
1888 		if (proto == ETHERTYPE_ATALK)
1889 			b1 = gen_snap(0x080007, ETHERTYPE_ATALK);
1890 		else	/* proto == ETHERTYPE_AARP */
1891 			b1 = gen_snap(0x000000, ETHERTYPE_AARP);
1892 		gen_and(b0, b1);
1893 
1894 		/*
1895 		 * Check for Ethernet encapsulation (Ethertalk
1896 		 * phase 1?); we just check for the Ethernet
1897 		 * protocol type.
1898 		 */
1899 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, (bpf_int32)proto);
1900 
1901 		gen_or(b0, b1);
1902 		return b1;
1903 
1904 	default:
1905 		if (proto <= ETHERMTU) {
1906 			/*
1907 			 * This is an LLC SAP value, so the frames
1908 			 * that match would be 802.2 frames.
1909 			 * Check that the frame is an 802.2 frame
1910 			 * (i.e., that the length/type field is
1911 			 * a length field, <= ETHERMTU) and
1912 			 * then check the DSAP.
1913 			 */
1914 			b0 = gen_cmp_gt(OR_LINK, off_linktype, BPF_H, ETHERMTU);
1915 			gen_not(b0);
1916 			b1 = gen_cmp(OR_LINK, off_linktype + 2, BPF_B,
1917 			    (bpf_int32)proto);
1918 			gen_and(b0, b1);
1919 			return b1;
1920 		} else {
1921 			/*
1922 			 * This is an Ethernet type, so compare
1923 			 * the length/type field with it (if
1924 			 * the frame is an 802.2 frame, the length
1925 			 * field will be <= ETHERMTU, and, as
1926 			 * "proto" is > ETHERMTU, this test
1927 			 * will fail and the frame won't match,
1928 			 * which is what we want).
1929 			 */
1930 			return gen_cmp(OR_LINK, off_linktype, BPF_H,
1931 			    (bpf_int32)proto);
1932 		}
1933 	}
1934 }
1935 
1936 /*
1937  * Generate code to match a particular packet type.
1938  *
1939  * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
1940  * value, if <= ETHERMTU.  We use that to determine whether to
1941  * match the type field or to check the type field for the special
1942  * LINUX_SLL_P_802_2 value and then do the appropriate test.
1943  */
1944 static struct block *
1945 gen_linux_sll_linktype(proto)
1946 	register int proto;
1947 {
1948 	struct block *b0, *b1;
1949 
1950 	switch (proto) {
1951 
1952 	case LLCSAP_ISONS:
1953 	case LLCSAP_IP:
1954 	case LLCSAP_NETBEUI:
1955 		/*
1956 		 * OSI protocols and NetBEUI always use 802.2 encapsulation,
1957 		 * so we check the DSAP and SSAP.
1958 		 *
1959 		 * LLCSAP_IP checks for IP-over-802.2, rather
1960 		 * than IP-over-Ethernet or IP-over-SNAP.
1961 		 *
1962 		 * XXX - should we check both the DSAP and the
1963 		 * SSAP, like this, or should we check just the
1964 		 * DSAP, as we do for other types <= ETHERMTU
1965 		 * (i.e., other SAP values)?
1966 		 */
1967 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, LINUX_SLL_P_802_2);
1968 		b1 = gen_cmp(OR_MACPL, 0, BPF_H, (bpf_int32)
1969 			     ((proto << 8) | proto));
1970 		gen_and(b0, b1);
1971 		return b1;
1972 
1973 	case LLCSAP_IPX:
1974 		/*
1975 		 *	Ethernet_II frames, which are Ethernet
1976 		 *	frames with a frame type of ETHERTYPE_IPX;
1977 		 *
1978 		 *	Ethernet_802.3 frames, which have a frame
1979 		 *	type of LINUX_SLL_P_802_3;
1980 		 *
1981 		 *	Ethernet_802.2 frames, which are 802.3
1982 		 *	frames with an 802.2 LLC header (i.e, have
1983 		 *	a frame type of LINUX_SLL_P_802_2) and
1984 		 *	with the IPX LSAP as the DSAP in the LLC
1985 		 *	header;
1986 		 *
1987 		 *	Ethernet_SNAP frames, which are 802.3
1988 		 *	frames with an LLC header and a SNAP
1989 		 *	header and with an OUI of 0x000000
1990 		 *	(encapsulated Ethernet) and a protocol
1991 		 *	ID of ETHERTYPE_IPX in the SNAP header.
1992 		 *
1993 		 * First, do the checks on LINUX_SLL_P_802_2
1994 		 * frames; generate the check for either
1995 		 * Ethernet_802.2 or Ethernet_SNAP frames, and
1996 		 * then put a check for LINUX_SLL_P_802_2 frames
1997 		 * before it.
1998 		 */
1999 		b0 = gen_cmp(OR_MACPL, 0, BPF_B, (bpf_int32)LLCSAP_IPX);
2000 		b1 = gen_snap(0x000000, ETHERTYPE_IPX);
2001 		gen_or(b0, b1);
2002 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, LINUX_SLL_P_802_2);
2003 		gen_and(b0, b1);
2004 
2005 		/*
2006 		 * Now check for 802.3 frames and OR that with
2007 		 * the previous test.
2008 		 */
2009 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, LINUX_SLL_P_802_3);
2010 		gen_or(b0, b1);
2011 
2012 		/*
2013 		 * Now add the check for Ethernet_II frames, and
2014 		 * do that before checking for the other frame
2015 		 * types.
2016 		 */
2017 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H,
2018 		    (bpf_int32)ETHERTYPE_IPX);
2019 		gen_or(b0, b1);
2020 		return b1;
2021 
2022 	case ETHERTYPE_ATALK:
2023 	case ETHERTYPE_AARP:
2024 		/*
2025 		 * EtherTalk (AppleTalk protocols on Ethernet link
2026 		 * layer) may use 802.2 encapsulation.
2027 		 */
2028 
2029 		/*
2030 		 * Check for 802.2 encapsulation (EtherTalk phase 2?);
2031 		 * we check for the 802.2 protocol type in the
2032 		 * "Ethernet type" field.
2033 		 */
2034 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, LINUX_SLL_P_802_2);
2035 
2036 		/*
2037 		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
2038 		 * SNAP packets with an organization code of
2039 		 * 0x080007 (Apple, for Appletalk) and a protocol
2040 		 * type of ETHERTYPE_ATALK (Appletalk).
2041 		 *
2042 		 * 802.2-encapsulated ETHERTYPE_AARP packets are
2043 		 * SNAP packets with an organization code of
2044 		 * 0x000000 (encapsulated Ethernet) and a protocol
2045 		 * type of ETHERTYPE_AARP (Appletalk ARP).
2046 		 */
2047 		if (proto == ETHERTYPE_ATALK)
2048 			b1 = gen_snap(0x080007, ETHERTYPE_ATALK);
2049 		else	/* proto == ETHERTYPE_AARP */
2050 			b1 = gen_snap(0x000000, ETHERTYPE_AARP);
2051 		gen_and(b0, b1);
2052 
2053 		/*
2054 		 * Check for Ethernet encapsulation (Ethertalk
2055 		 * phase 1?); we just check for the Ethernet
2056 		 * protocol type.
2057 		 */
2058 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, (bpf_int32)proto);
2059 
2060 		gen_or(b0, b1);
2061 		return b1;
2062 
2063 	default:
2064 		if (proto <= ETHERMTU) {
2065 			/*
2066 			 * This is an LLC SAP value, so the frames
2067 			 * that match would be 802.2 frames.
2068 			 * Check for the 802.2 protocol type
2069 			 * in the "Ethernet type" field, and
2070 			 * then check the DSAP.
2071 			 */
2072 			b0 = gen_cmp(OR_LINK, off_linktype, BPF_H,
2073 			    LINUX_SLL_P_802_2);
2074 			b1 = gen_cmp(OR_LINK, off_macpl, BPF_B,
2075 			     (bpf_int32)proto);
2076 			gen_and(b0, b1);
2077 			return b1;
2078 		} else {
2079 			/*
2080 			 * This is an Ethernet type, so compare
2081 			 * the length/type field with it (if
2082 			 * the frame is an 802.2 frame, the length
2083 			 * field will be <= ETHERMTU, and, as
2084 			 * "proto" is > ETHERMTU, this test
2085 			 * will fail and the frame won't match,
2086 			 * which is what we want).
2087 			 */
2088 			return gen_cmp(OR_LINK, off_linktype, BPF_H,
2089 			    (bpf_int32)proto);
2090 		}
2091 	}
2092 }
2093 
2094 static struct slist *
2095 gen_load_prism_llprefixlen()
2096 {
2097 	struct slist *s1, *s2;
2098 	struct slist *sjeq_avs_cookie;
2099 	struct slist *sjcommon;
2100 
2101 	/*
2102 	 * This code is not compatible with the optimizer, as
2103 	 * we are generating jmp instructions within a normal
2104 	 * slist of instructions
2105 	 */
2106 	no_optimize = 1;
2107 
2108 	/*
2109 	 * Generate code to load the length of the radio header into
2110 	 * the register assigned to hold that length, if one has been
2111 	 * assigned.  (If one hasn't been assigned, no code we've
2112 	 * generated uses that prefix, so we don't need to generate any
2113 	 * code to load it.)
2114 	 *
2115 	 * Some Linux drivers use ARPHRD_IEEE80211_PRISM but sometimes
2116 	 * or always use the AVS header rather than the Prism header.
2117 	 * We load a 4-byte big-endian value at the beginning of the
2118 	 * raw packet data, and see whether, when masked with 0xFFFFF000,
2119 	 * it's equal to 0x80211000.  If so, that indicates that it's
2120 	 * an AVS header (the masked-out bits are the version number).
2121 	 * Otherwise, it's a Prism header.
2122 	 *
2123 	 * XXX - the Prism header is also, in theory, variable-length,
2124 	 * but no known software generates headers that aren't 144
2125 	 * bytes long.
2126 	 */
2127 	if (reg_off_ll != -1) {
2128 		/*
2129 		 * Load the cookie.
2130 		 */
2131 		s1 = new_stmt(BPF_LD|BPF_W|BPF_ABS);
2132 		s1->s.k = 0;
2133 
2134 		/*
2135 		 * AND it with 0xFFFFF000.
2136 		 */
2137 		s2 = new_stmt(BPF_ALU|BPF_AND|BPF_K);
2138 		s2->s.k = 0xFFFFF000;
2139 		sappend(s1, s2);
2140 
2141 		/*
2142 		 * Compare with 0x80211000.
2143 		 */
2144 		sjeq_avs_cookie = new_stmt(JMP(BPF_JEQ));
2145 		sjeq_avs_cookie->s.k = 0x80211000;
2146 		sappend(s1, sjeq_avs_cookie);
2147 
2148 		/*
2149 		 * If it's AVS:
2150 		 *
2151 		 * The 4 bytes at an offset of 4 from the beginning of
2152 		 * the AVS header are the length of the AVS header.
2153 		 * That field is big-endian.
2154 		 */
2155 		s2 = new_stmt(BPF_LD|BPF_W|BPF_ABS);
2156 		s2->s.k = 4;
2157 		sappend(s1, s2);
2158 		sjeq_avs_cookie->s.jt = s2;
2159 
2160 		/*
2161 		 * Now jump to the code to allocate a register
2162 		 * into which to save the header length and
2163 		 * store the length there.  (The "jump always"
2164 		 * instruction needs to have the k field set;
2165 		 * it's added to the PC, so, as we're jumping
2166 		 * over a single instruction, it should be 1.)
2167 		 */
2168 		sjcommon = new_stmt(JMP(BPF_JA));
2169 		sjcommon->s.k = 1;
2170 		sappend(s1, sjcommon);
2171 
2172 		/*
2173 		 * Now for the code that handles the Prism header.
2174 		 * Just load the length of the Prism header (144)
2175 		 * into the A register.  Have the test for an AVS
2176 		 * header branch here if we don't have an AVS header.
2177 		 */
2178 		s2 = new_stmt(BPF_LD|BPF_W|BPF_IMM);
2179 		s2->s.k = 144;
2180 		sappend(s1, s2);
2181 		sjeq_avs_cookie->s.jf = s2;
2182 
2183 		/*
2184 		 * Now allocate a register to hold that value and store
2185 		 * it.  The code for the AVS header will jump here after
2186 		 * loading the length of the AVS header.
2187 		 */
2188 		s2 = new_stmt(BPF_ST);
2189 		s2->s.k = reg_off_ll;
2190 		sappend(s1, s2);
2191 		sjcommon->s.jf = s2;
2192 
2193 		/*
2194 		 * Now move it into the X register.
2195 		 */
2196 		s2 = new_stmt(BPF_MISC|BPF_TAX);
2197 		sappend(s1, s2);
2198 
2199 		return (s1);
2200 	} else
2201 		return (NULL);
2202 }
2203 
2204 static struct slist *
2205 gen_load_avs_llprefixlen()
2206 {
2207 	struct slist *s1, *s2;
2208 
2209 	/*
2210 	 * Generate code to load the length of the AVS header into
2211 	 * the register assigned to hold that length, if one has been
2212 	 * assigned.  (If one hasn't been assigned, no code we've
2213 	 * generated uses that prefix, so we don't need to generate any
2214 	 * code to load it.)
2215 	 */
2216 	if (reg_off_ll != -1) {
2217 		/*
2218 		 * The 4 bytes at an offset of 4 from the beginning of
2219 		 * the AVS header are the length of the AVS header.
2220 		 * That field is big-endian.
2221 		 */
2222 		s1 = new_stmt(BPF_LD|BPF_W|BPF_ABS);
2223 		s1->s.k = 4;
2224 
2225 		/*
2226 		 * Now allocate a register to hold that value and store
2227 		 * it.
2228 		 */
2229 		s2 = new_stmt(BPF_ST);
2230 		s2->s.k = reg_off_ll;
2231 		sappend(s1, s2);
2232 
2233 		/*
2234 		 * Now move it into the X register.
2235 		 */
2236 		s2 = new_stmt(BPF_MISC|BPF_TAX);
2237 		sappend(s1, s2);
2238 
2239 		return (s1);
2240 	} else
2241 		return (NULL);
2242 }
2243 
2244 static struct slist *
2245 gen_load_radiotap_llprefixlen()
2246 {
2247 	struct slist *s1, *s2;
2248 
2249 	/*
2250 	 * Generate code to load the length of the radiotap header into
2251 	 * the register assigned to hold that length, if one has been
2252 	 * assigned.  (If one hasn't been assigned, no code we've
2253 	 * generated uses that prefix, so we don't need to generate any
2254 	 * code to load it.)
2255 	 */
2256 	if (reg_off_ll != -1) {
2257 		/*
2258 		 * The 2 bytes at offsets of 2 and 3 from the beginning
2259 		 * of the radiotap header are the length of the radiotap
2260 		 * header; unfortunately, it's little-endian, so we have
2261 		 * to load it a byte at a time and construct the value.
2262 		 */
2263 
2264 		/*
2265 		 * Load the high-order byte, at an offset of 3, shift it
2266 		 * left a byte, and put the result in the X register.
2267 		 */
2268 		s1 = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2269 		s1->s.k = 3;
2270 		s2 = new_stmt(BPF_ALU|BPF_LSH|BPF_K);
2271 		sappend(s1, s2);
2272 		s2->s.k = 8;
2273 		s2 = new_stmt(BPF_MISC|BPF_TAX);
2274 		sappend(s1, s2);
2275 
2276 		/*
2277 		 * Load the next byte, at an offset of 2, and OR the
2278 		 * value from the X register into it.
2279 		 */
2280 		s2 = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2281 		sappend(s1, s2);
2282 		s2->s.k = 2;
2283 		s2 = new_stmt(BPF_ALU|BPF_OR|BPF_X);
2284 		sappend(s1, s2);
2285 
2286 		/*
2287 		 * Now allocate a register to hold that value and store
2288 		 * it.
2289 		 */
2290 		s2 = new_stmt(BPF_ST);
2291 		s2->s.k = reg_off_ll;
2292 		sappend(s1, s2);
2293 
2294 		/*
2295 		 * Now move it into the X register.
2296 		 */
2297 		s2 = new_stmt(BPF_MISC|BPF_TAX);
2298 		sappend(s1, s2);
2299 
2300 		return (s1);
2301 	} else
2302 		return (NULL);
2303 }
2304 
2305 /*
2306  * At the moment we treat PPI as normal Radiotap encoded
2307  * packets. The difference is in the function that generates
2308  * the code at the beginning to compute the header length.
2309  * Since this code generator of PPI supports bare 802.11
2310  * encapsulation only (i.e. the encapsulated DLT should be
2311  * DLT_IEEE802_11) we generate code to check for this too;
2312  * that's done in finish_parse().
2313  */
2314 static struct slist *
2315 gen_load_ppi_llprefixlen()
2316 {
2317 	struct slist *s1, *s2;
2318 
2319 	/*
2320 	 * Generate code to load the length of the radiotap header
2321 	 * into the register assigned to hold that length, if one has
2322 	 * been assigned.
2323 	 */
2324 	if (reg_off_ll != -1) {
2325 		/*
2326 		 * The 2 bytes at offsets of 2 and 3 from the beginning
2327 		 * of the radiotap header are the length of the radiotap
2328 		 * header; unfortunately, it's little-endian, so we have
2329 		 * to load it a byte at a time and construct the value.
2330 		 */
2331 
2332 		/*
2333 		 * Load the high-order byte, at an offset of 3, shift it
2334 		 * left a byte, and put the result in the X register.
2335 		 */
2336 		s1 = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2337 		s1->s.k = 3;
2338 		s2 = new_stmt(BPF_ALU|BPF_LSH|BPF_K);
2339 		sappend(s1, s2);
2340 		s2->s.k = 8;
2341 		s2 = new_stmt(BPF_MISC|BPF_TAX);
2342 		sappend(s1, s2);
2343 
2344 		/*
2345 		 * Load the next byte, at an offset of 2, and OR the
2346 		 * value from the X register into it.
2347 		 */
2348 		s2 = new_stmt(BPF_LD|BPF_B|BPF_ABS);
2349 		sappend(s1, s2);
2350 		s2->s.k = 2;
2351 		s2 = new_stmt(BPF_ALU|BPF_OR|BPF_X);
2352 		sappend(s1, s2);
2353 
2354 		/*
2355 		 * Now allocate a register to hold that value and store
2356 		 * it.
2357 		 */
2358 		s2 = new_stmt(BPF_ST);
2359 		s2->s.k = reg_off_ll;
2360 		sappend(s1, s2);
2361 
2362 		/*
2363 		 * Now move it into the X register.
2364 		 */
2365 		s2 = new_stmt(BPF_MISC|BPF_TAX);
2366 		sappend(s1, s2);
2367 
2368 		return (s1);
2369 	} else
2370 		return (NULL);
2371 }
2372 
2373 /*
2374  * Load a value relative to the beginning of the link-layer header after the 802.11
2375  * header, i.e. LLC_SNAP.
2376  * The link-layer header doesn't necessarily begin at the beginning
2377  * of the packet data; there might be a variable-length prefix containing
2378  * radio information.
2379  */
2380 static struct slist *
2381 gen_load_802_11_header_len(struct slist *s, struct slist *snext)
2382 {
2383 	struct slist *s2;
2384 	struct slist *sjset_data_frame_1;
2385 	struct slist *sjset_data_frame_2;
2386 	struct slist *sjset_qos;
2387 	struct slist *sjset_radiotap_flags;
2388 	struct slist *sjset_radiotap_tsft;
2389 	struct slist *sjset_tsft_datapad, *sjset_notsft_datapad;
2390 	struct slist *s_roundup;
2391 
2392 	if (reg_off_macpl == -1) {
2393 		/*
2394 		 * No register has been assigned to the offset of
2395 		 * the MAC-layer payload, which means nobody needs
2396 		 * it; don't bother computing it - just return
2397 		 * what we already have.
2398 		 */
2399 		return (s);
2400 	}
2401 
2402 	/*
2403 	 * This code is not compatible with the optimizer, as
2404 	 * we are generating jmp instructions within a normal
2405 	 * slist of instructions
2406 	 */
2407 	no_optimize = 1;
2408 
2409 	/*
2410 	 * If "s" is non-null, it has code to arrange that the X register
2411 	 * contains the length of the prefix preceding the link-layer
2412 	 * header.
2413 	 *
2414 	 * Otherwise, the length of the prefix preceding the link-layer
2415 	 * header is "off_ll".
2416 	 */
2417 	if (s == NULL) {
2418 		/*
2419 		 * There is no variable-length header preceding the
2420 		 * link-layer header.
2421 		 *
2422 		 * Load the length of the fixed-length prefix preceding
2423 		 * the link-layer header (if any) into the X register,
2424 		 * and store it in the reg_off_macpl register.
2425 		 * That length is off_ll.
2426 		 */
2427 		s = new_stmt(BPF_LDX|BPF_IMM);
2428 		s->s.k = off_ll;
2429 	}
2430 
2431 	/*
2432 	 * The X register contains the offset of the beginning of the
2433 	 * link-layer header; add 24, which is the minimum length
2434 	 * of the MAC header for a data frame, to that, and store it
2435 	 * in reg_off_macpl, and then load the Frame Control field,
2436 	 * which is at the offset in the X register, with an indexed load.
2437 	 */
2438 	s2 = new_stmt(BPF_MISC|BPF_TXA);
2439 	sappend(s, s2);
2440 	s2 = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
2441 	s2->s.k = 24;
2442 	sappend(s, s2);
2443 	s2 = new_stmt(BPF_ST);
2444 	s2->s.k = reg_off_macpl;
2445 	sappend(s, s2);
2446 
2447 	s2 = new_stmt(BPF_LD|BPF_IND|BPF_B);
2448 	s2->s.k = 0;
2449 	sappend(s, s2);
2450 
2451 	/*
2452 	 * Check the Frame Control field to see if this is a data frame;
2453 	 * a data frame has the 0x08 bit (b3) in that field set and the
2454 	 * 0x04 bit (b2) clear.
2455 	 */
2456 	sjset_data_frame_1 = new_stmt(JMP(BPF_JSET));
2457 	sjset_data_frame_1->s.k = 0x08;
2458 	sappend(s, sjset_data_frame_1);
2459 
2460 	/*
2461 	 * If b3 is set, test b2, otherwise go to the first statement of
2462 	 * the rest of the program.
2463 	 */
2464 	sjset_data_frame_1->s.jt = sjset_data_frame_2 = new_stmt(JMP(BPF_JSET));
2465 	sjset_data_frame_2->s.k = 0x04;
2466 	sappend(s, sjset_data_frame_2);
2467 	sjset_data_frame_1->s.jf = snext;
2468 
2469 	/*
2470 	 * If b2 is not set, this is a data frame; test the QoS bit.
2471 	 * Otherwise, go to the first statement of the rest of the
2472 	 * program.
2473 	 */
2474 	sjset_data_frame_2->s.jt = snext;
2475 	sjset_data_frame_2->s.jf = sjset_qos = new_stmt(JMP(BPF_JSET));
2476 	sjset_qos->s.k = 0x80;	/* QoS bit */
2477 	sappend(s, sjset_qos);
2478 
2479 	/*
2480 	 * If it's set, add 2 to reg_off_macpl, to skip the QoS
2481 	 * field.
2482 	 * Otherwise, go to the first statement of the rest of the
2483 	 * program.
2484 	 */
2485 	sjset_qos->s.jt = s2 = new_stmt(BPF_LD|BPF_MEM);
2486 	s2->s.k = reg_off_macpl;
2487 	sappend(s, s2);
2488 	s2 = new_stmt(BPF_ALU|BPF_ADD|BPF_IMM);
2489 	s2->s.k = 2;
2490 	sappend(s, s2);
2491 	s2 = new_stmt(BPF_ST);
2492 	s2->s.k = reg_off_macpl;
2493 	sappend(s, s2);
2494 
2495 	/*
2496 	 * If we have a radiotap header, look at it to see whether
2497 	 * there's Atheros padding between the MAC-layer header
2498 	 * and the payload.
2499 	 *
2500 	 * Note: all of the fields in the radiotap header are
2501 	 * little-endian, so we byte-swap all of the values
2502 	 * we test against, as they will be loaded as big-endian
2503 	 * values.
2504 	 */
2505 	if (linktype == DLT_IEEE802_11_RADIO) {
2506 		/*
2507 		 * Is the IEEE80211_RADIOTAP_FLAGS bit (0x0000002) set
2508 		 * in the presence flag?
2509 		 */
2510 		sjset_qos->s.jf = s2 = new_stmt(BPF_LD|BPF_ABS|BPF_W);
2511 		s2->s.k = 4;
2512 		sappend(s, s2);
2513 
2514 		sjset_radiotap_flags = new_stmt(JMP(BPF_JSET));
2515 		sjset_radiotap_flags->s.k = SWAPLONG(0x00000002);
2516 		sappend(s, sjset_radiotap_flags);
2517 
2518 		/*
2519 		 * If not, skip all of this.
2520 		 */
2521 		sjset_radiotap_flags->s.jf = snext;
2522 
2523 		/*
2524 		 * Otherwise, is the IEEE80211_RADIOTAP_TSFT bit set?
2525 		 */
2526 		sjset_radiotap_tsft = sjset_radiotap_flags->s.jt =
2527 		    new_stmt(JMP(BPF_JSET));
2528 		sjset_radiotap_tsft->s.k = SWAPLONG(0x00000001);
2529 		sappend(s, sjset_radiotap_tsft);
2530 
2531 		/*
2532 		 * If IEEE80211_RADIOTAP_TSFT is set, the flags field is
2533 		 * at an offset of 16 from the beginning of the raw packet
2534 		 * data (8 bytes for the radiotap header and 8 bytes for
2535 		 * the TSFT field).
2536 		 *
2537 		 * Test whether the IEEE80211_RADIOTAP_F_DATAPAD bit (0x20)
2538 		 * is set.
2539 		 */
2540 		sjset_radiotap_tsft->s.jt = s2 = new_stmt(BPF_LD|BPF_ABS|BPF_B);
2541 		s2->s.k = 16;
2542 		sappend(s, s2);
2543 
2544 		sjset_tsft_datapad = new_stmt(JMP(BPF_JSET));
2545 		sjset_tsft_datapad->s.k = 0x20;
2546 		sappend(s, sjset_tsft_datapad);
2547 
2548 		/*
2549 		 * If IEEE80211_RADIOTAP_TSFT is not set, the flags field is
2550 		 * at an offset of 8 from the beginning of the raw packet
2551 		 * data (8 bytes for the radiotap header).
2552 		 *
2553 		 * Test whether the IEEE80211_RADIOTAP_F_DATAPAD bit (0x20)
2554 		 * is set.
2555 		 */
2556 		sjset_radiotap_tsft->s.jf = s2 = new_stmt(BPF_LD|BPF_ABS|BPF_B);
2557 		s2->s.k = 8;
2558 		sappend(s, s2);
2559 
2560 		sjset_notsft_datapad = new_stmt(JMP(BPF_JSET));
2561 		sjset_notsft_datapad->s.k = 0x20;
2562 		sappend(s, sjset_notsft_datapad);
2563 
2564 		/*
2565 		 * In either case, if IEEE80211_RADIOTAP_F_DATAPAD is
2566 		 * set, round the length of the 802.11 header to
2567 		 * a multiple of 4.  Do that by adding 3 and then
2568 		 * dividing by and multiplying by 4, which we do by
2569 		 * ANDing with ~3.
2570 		 */
2571 		s_roundup = new_stmt(BPF_LD|BPF_MEM);
2572 		s_roundup->s.k = reg_off_macpl;
2573 		sappend(s, s_roundup);
2574 		s2 = new_stmt(BPF_ALU|BPF_ADD|BPF_IMM);
2575 		s2->s.k = 3;
2576 		sappend(s, s2);
2577 		s2 = new_stmt(BPF_ALU|BPF_AND|BPF_IMM);
2578 		s2->s.k = ~3;
2579 		sappend(s, s2);
2580 		s2 = new_stmt(BPF_ST);
2581 		s2->s.k = reg_off_macpl;
2582 		sappend(s, s2);
2583 
2584 		sjset_tsft_datapad->s.jt = s_roundup;
2585 		sjset_tsft_datapad->s.jf = snext;
2586 		sjset_notsft_datapad->s.jt = s_roundup;
2587 		sjset_notsft_datapad->s.jf = snext;
2588 	} else
2589 		sjset_qos->s.jf = snext;
2590 
2591 	return s;
2592 }
2593 
2594 static void
2595 insert_compute_vloffsets(b)
2596 	struct block *b;
2597 {
2598 	struct slist *s;
2599 
2600 	/*
2601 	 * For link-layer types that have a variable-length header
2602 	 * preceding the link-layer header, generate code to load
2603 	 * the offset of the link-layer header into the register
2604 	 * assigned to that offset, if any.
2605 	 */
2606 	switch (linktype) {
2607 
2608 	case DLT_PRISM_HEADER:
2609 		s = gen_load_prism_llprefixlen();
2610 		break;
2611 
2612 	case DLT_IEEE802_11_RADIO_AVS:
2613 		s = gen_load_avs_llprefixlen();
2614 		break;
2615 
2616 	case DLT_IEEE802_11_RADIO:
2617 		s = gen_load_radiotap_llprefixlen();
2618 		break;
2619 
2620 	case DLT_PPI:
2621 		s = gen_load_ppi_llprefixlen();
2622 		break;
2623 
2624 	default:
2625 		s = NULL;
2626 		break;
2627 	}
2628 
2629 	/*
2630 	 * For link-layer types that have a variable-length link-layer
2631 	 * header, generate code to load the offset of the MAC-layer
2632 	 * payload into the register assigned to that offset, if any.
2633 	 */
2634 	switch (linktype) {
2635 
2636 	case DLT_IEEE802_11:
2637 	case DLT_PRISM_HEADER:
2638 	case DLT_IEEE802_11_RADIO_AVS:
2639 	case DLT_IEEE802_11_RADIO:
2640 	case DLT_PPI:
2641 		s = gen_load_802_11_header_len(s, b->stmts);
2642 		break;
2643 	}
2644 
2645 	/*
2646 	 * If we have any offset-loading code, append all the
2647 	 * existing statements in the block to those statements,
2648 	 * and make the resulting list the list of statements
2649 	 * for the block.
2650 	 */
2651 	if (s != NULL) {
2652 		sappend(s, b->stmts);
2653 		b->stmts = s;
2654 	}
2655 }
2656 
2657 static struct block *
2658 gen_ppi_dlt_check(void)
2659 {
2660 	struct slist *s_load_dlt;
2661 	struct block *b;
2662 
2663 	if (linktype == DLT_PPI)
2664 	{
2665 		/* Create the statements that check for the DLT
2666 		 */
2667 		s_load_dlt = new_stmt(BPF_LD|BPF_W|BPF_ABS);
2668 		s_load_dlt->s.k = 4;
2669 
2670 		b = new_block(JMP(BPF_JEQ));
2671 
2672 		b->stmts = s_load_dlt;
2673 		b->s.k = SWAPLONG(DLT_IEEE802_11);
2674 	}
2675 	else
2676 	{
2677 		b = NULL;
2678 	}
2679 
2680 	return b;
2681 }
2682 
2683 static struct slist *
2684 gen_prism_llprefixlen(void)
2685 {
2686 	struct slist *s;
2687 
2688 	if (reg_off_ll == -1) {
2689 		/*
2690 		 * We haven't yet assigned a register for the length
2691 		 * of the radio header; allocate one.
2692 		 */
2693 		reg_off_ll = alloc_reg();
2694 	}
2695 
2696 	/*
2697 	 * Load the register containing the radio length
2698 	 * into the X register.
2699 	 */
2700 	s = new_stmt(BPF_LDX|BPF_MEM);
2701 	s->s.k = reg_off_ll;
2702 	return s;
2703 }
2704 
2705 static struct slist *
2706 gen_avs_llprefixlen(void)
2707 {
2708 	struct slist *s;
2709 
2710 	if (reg_off_ll == -1) {
2711 		/*
2712 		 * We haven't yet assigned a register for the length
2713 		 * of the AVS header; allocate one.
2714 		 */
2715 		reg_off_ll = alloc_reg();
2716 	}
2717 
2718 	/*
2719 	 * Load the register containing the AVS length
2720 	 * into the X register.
2721 	 */
2722 	s = new_stmt(BPF_LDX|BPF_MEM);
2723 	s->s.k = reg_off_ll;
2724 	return s;
2725 }
2726 
2727 static struct slist *
2728 gen_radiotap_llprefixlen(void)
2729 {
2730 	struct slist *s;
2731 
2732 	if (reg_off_ll == -1) {
2733 		/*
2734 		 * We haven't yet assigned a register for the length
2735 		 * of the radiotap header; allocate one.
2736 		 */
2737 		reg_off_ll = alloc_reg();
2738 	}
2739 
2740 	/*
2741 	 * Load the register containing the radiotap length
2742 	 * into the X register.
2743 	 */
2744 	s = new_stmt(BPF_LDX|BPF_MEM);
2745 	s->s.k = reg_off_ll;
2746 	return s;
2747 }
2748 
2749 /*
2750  * At the moment we treat PPI as normal Radiotap encoded
2751  * packets. The difference is in the function that generates
2752  * the code at the beginning to compute the header length.
2753  * Since this code generator of PPI supports bare 802.11
2754  * encapsulation only (i.e. the encapsulated DLT should be
2755  * DLT_IEEE802_11) we generate code to check for this too.
2756  */
2757 static struct slist *
2758 gen_ppi_llprefixlen(void)
2759 {
2760 	struct slist *s;
2761 
2762 	if (reg_off_ll == -1) {
2763 		/*
2764 		 * We haven't yet assigned a register for the length
2765 		 * of the radiotap header; allocate one.
2766 		 */
2767 		reg_off_ll = alloc_reg();
2768 	}
2769 
2770 	/*
2771 	 * Load the register containing the PPI length
2772 	 * into the X register.
2773 	 */
2774 	s = new_stmt(BPF_LDX|BPF_MEM);
2775 	s->s.k = reg_off_ll;
2776 	return s;
2777 }
2778 
2779 /*
2780  * Generate code to compute the link-layer header length, if necessary,
2781  * putting it into the X register, and to return either a pointer to a
2782  * "struct slist" for the list of statements in that code, or NULL if
2783  * no code is necessary.
2784  */
2785 static struct slist *
2786 gen_llprefixlen(void)
2787 {
2788 	switch (linktype) {
2789 
2790 	case DLT_PRISM_HEADER:
2791 		return gen_prism_llprefixlen();
2792 
2793 	case DLT_IEEE802_11_RADIO_AVS:
2794 		return gen_avs_llprefixlen();
2795 
2796 	case DLT_IEEE802_11_RADIO:
2797 		return gen_radiotap_llprefixlen();
2798 
2799 	case DLT_PPI:
2800 		return gen_ppi_llprefixlen();
2801 
2802 	default:
2803 		return NULL;
2804 	}
2805 }
2806 
2807 /*
2808  * Generate code to load the register containing the offset of the
2809  * MAC-layer payload into the X register; if no register for that offset
2810  * has been allocated, allocate it first.
2811  */
2812 static struct slist *
2813 gen_off_macpl(void)
2814 {
2815 	struct slist *s;
2816 
2817 	if (off_macpl_is_variable) {
2818 		if (reg_off_macpl == -1) {
2819 			/*
2820 			 * We haven't yet assigned a register for the offset
2821 			 * of the MAC-layer payload; allocate one.
2822 			 */
2823 			reg_off_macpl = alloc_reg();
2824 		}
2825 
2826 		/*
2827 		 * Load the register containing the offset of the MAC-layer
2828 		 * payload into the X register.
2829 		 */
2830 		s = new_stmt(BPF_LDX|BPF_MEM);
2831 		s->s.k = reg_off_macpl;
2832 		return s;
2833 	} else {
2834 		/*
2835 		 * That offset isn't variable, so we don't need to
2836 		 * generate any code.
2837 		 */
2838 		return NULL;
2839 	}
2840 }
2841 
2842 /*
2843  * Map an Ethernet type to the equivalent PPP type.
2844  */
2845 static int
2846 ethertype_to_ppptype(proto)
2847 	int proto;
2848 {
2849 	switch (proto) {
2850 
2851 	case ETHERTYPE_IP:
2852 		proto = PPP_IP;
2853 		break;
2854 
2855 #ifdef INET6
2856 	case ETHERTYPE_IPV6:
2857 		proto = PPP_IPV6;
2858 		break;
2859 #endif
2860 
2861 	case ETHERTYPE_DN:
2862 		proto = PPP_DECNET;
2863 		break;
2864 
2865 	case ETHERTYPE_ATALK:
2866 		proto = PPP_APPLE;
2867 		break;
2868 
2869 	case ETHERTYPE_NS:
2870 		proto = PPP_NS;
2871 		break;
2872 
2873 	case LLCSAP_ISONS:
2874 		proto = PPP_OSI;
2875 		break;
2876 
2877 	case LLCSAP_8021D:
2878 		/*
2879 		 * I'm assuming the "Bridging PDU"s that go
2880 		 * over PPP are Spanning Tree Protocol
2881 		 * Bridging PDUs.
2882 		 */
2883 		proto = PPP_BRPDU;
2884 		break;
2885 
2886 	case LLCSAP_IPX:
2887 		proto = PPP_IPX;
2888 		break;
2889 	}
2890 	return (proto);
2891 }
2892 
2893 /*
2894  * Generate code to match a particular packet type by matching the
2895  * link-layer type field or fields in the 802.2 LLC header.
2896  *
2897  * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
2898  * value, if <= ETHERMTU.
2899  */
2900 static struct block *
2901 gen_linktype(proto)
2902 	register int proto;
2903 {
2904 	struct block *b0, *b1, *b2;
2905 
2906 	/* are we checking MPLS-encapsulated packets? */
2907 	if (label_stack_depth > 0) {
2908 		switch (proto) {
2909 		case ETHERTYPE_IP:
2910 		case PPP_IP:
2911 			/* FIXME add other L3 proto IDs */
2912 			return gen_mpls_linktype(Q_IP);
2913 
2914 		case ETHERTYPE_IPV6:
2915 		case PPP_IPV6:
2916 			/* FIXME add other L3 proto IDs */
2917 			return gen_mpls_linktype(Q_IPV6);
2918 
2919 		default:
2920 			bpf_error("unsupported protocol over mpls");
2921 			/* NOTREACHED */
2922 		}
2923 	}
2924 
2925 	/*
2926 	 * Are we testing PPPoE packets?
2927 	 */
2928 	if (is_pppoes) {
2929 		/*
2930 		 * The PPPoE session header is part of the
2931 		 * MAC-layer payload, so all references
2932 		 * should be relative to the beginning of
2933 		 * that payload.
2934 		 */
2935 
2936 		/*
2937 		 * We use Ethernet protocol types inside libpcap;
2938 		 * map them to the corresponding PPP protocol types.
2939 		 */
2940 		proto = ethertype_to_ppptype(proto);
2941 		return gen_cmp(OR_MACPL, off_linktype, BPF_H, (bpf_int32)proto);
2942 	}
2943 
2944 	switch (linktype) {
2945 
2946 	case DLT_EN10MB:
2947 		return gen_ether_linktype(proto);
2948 		/*NOTREACHED*/
2949 		break;
2950 
2951 	case DLT_C_HDLC:
2952 		switch (proto) {
2953 
2954 		case LLCSAP_ISONS:
2955 			proto = (proto << 8 | LLCSAP_ISONS);
2956 			/* fall through */
2957 
2958 		default:
2959 			return gen_cmp(OR_LINK, off_linktype, BPF_H,
2960 			    (bpf_int32)proto);
2961 			/*NOTREACHED*/
2962 			break;
2963 		}
2964 		break;
2965 
2966 	case DLT_IEEE802_11:
2967 	case DLT_PRISM_HEADER:
2968 	case DLT_IEEE802_11_RADIO_AVS:
2969 	case DLT_IEEE802_11_RADIO:
2970 	case DLT_PPI:
2971 		/*
2972 		 * Check that we have a data frame.
2973 		 */
2974 		b0 = gen_check_802_11_data_frame();
2975 
2976 		/*
2977 		 * Now check for the specified link-layer type.
2978 		 */
2979 		b1 = gen_llc_linktype(proto);
2980 		gen_and(b0, b1);
2981 		return b1;
2982 		/*NOTREACHED*/
2983 		break;
2984 
2985 	case DLT_FDDI:
2986 		/*
2987 		 * XXX - check for asynchronous frames, as per RFC 1103.
2988 		 */
2989 		return gen_llc_linktype(proto);
2990 		/*NOTREACHED*/
2991 		break;
2992 
2993 	case DLT_IEEE802:
2994 		/*
2995 		 * XXX - check for LLC PDUs, as per IEEE 802.5.
2996 		 */
2997 		return gen_llc_linktype(proto);
2998 		/*NOTREACHED*/
2999 		break;
3000 
3001 	case DLT_ATM_RFC1483:
3002 	case DLT_ATM_CLIP:
3003 	case DLT_IP_OVER_FC:
3004 		return gen_llc_linktype(proto);
3005 		/*NOTREACHED*/
3006 		break;
3007 
3008 	case DLT_SUNATM:
3009 		/*
3010 		 * If "is_lane" is set, check for a LANE-encapsulated
3011 		 * version of this protocol, otherwise check for an
3012 		 * LLC-encapsulated version of this protocol.
3013 		 *
3014 		 * We assume LANE means Ethernet, not Token Ring.
3015 		 */
3016 		if (is_lane) {
3017 			/*
3018 			 * Check that the packet doesn't begin with an
3019 			 * LE Control marker.  (We've already generated
3020 			 * a test for LANE.)
3021 			 */
3022 			b0 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS, BPF_H,
3023 			    0xFF00);
3024 			gen_not(b0);
3025 
3026 			/*
3027 			 * Now generate an Ethernet test.
3028 			 */
3029 			b1 = gen_ether_linktype(proto);
3030 			gen_and(b0, b1);
3031 			return b1;
3032 		} else {
3033 			/*
3034 			 * Check for LLC encapsulation and then check the
3035 			 * protocol.
3036 			 */
3037 			b0 = gen_atmfield_code(A_PROTOTYPE, PT_LLC, BPF_JEQ, 0);
3038 			b1 = gen_llc_linktype(proto);
3039 			gen_and(b0, b1);
3040 			return b1;
3041 		}
3042 		/*NOTREACHED*/
3043 		break;
3044 
3045 	case DLT_LINUX_SLL:
3046 		return gen_linux_sll_linktype(proto);
3047 		/*NOTREACHED*/
3048 		break;
3049 
3050 	case DLT_SLIP:
3051 	case DLT_SLIP_BSDOS:
3052 	case DLT_RAW:
3053 		/*
3054 		 * These types don't provide any type field; packets
3055 		 * are always IPv4 or IPv6.
3056 		 *
3057 		 * XXX - for IPv4, check for a version number of 4, and,
3058 		 * for IPv6, check for a version number of 6?
3059 		 */
3060 		switch (proto) {
3061 
3062 		case ETHERTYPE_IP:
3063 			/* Check for a version number of 4. */
3064 			return gen_mcmp(OR_LINK, 0, BPF_B, 0x40, 0xF0);
3065 #ifdef INET6
3066 		case ETHERTYPE_IPV6:
3067 			/* Check for a version number of 6. */
3068 			return gen_mcmp(OR_LINK, 0, BPF_B, 0x60, 0xF0);
3069 #endif
3070 
3071 		default:
3072 			return gen_false();		/* always false */
3073 		}
3074 		/*NOTREACHED*/
3075 		break;
3076 
3077 	case DLT_PPP:
3078 	case DLT_PPP_PPPD:
3079 	case DLT_PPP_SERIAL:
3080 	case DLT_PPP_ETHER:
3081 		/*
3082 		 * We use Ethernet protocol types inside libpcap;
3083 		 * map them to the corresponding PPP protocol types.
3084 		 */
3085 		proto = ethertype_to_ppptype(proto);
3086 		return gen_cmp(OR_LINK, off_linktype, BPF_H, (bpf_int32)proto);
3087 		/*NOTREACHED*/
3088 		break;
3089 
3090 	case DLT_PPP_BSDOS:
3091 		/*
3092 		 * We use Ethernet protocol types inside libpcap;
3093 		 * map them to the corresponding PPP protocol types.
3094 		 */
3095 		switch (proto) {
3096 
3097 		case ETHERTYPE_IP:
3098 			/*
3099 			 * Also check for Van Jacobson-compressed IP.
3100 			 * XXX - do this for other forms of PPP?
3101 			 */
3102 			b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, PPP_IP);
3103 			b1 = gen_cmp(OR_LINK, off_linktype, BPF_H, PPP_VJC);
3104 			gen_or(b0, b1);
3105 			b0 = gen_cmp(OR_LINK, off_linktype, BPF_H, PPP_VJNC);
3106 			gen_or(b1, b0);
3107 			return b0;
3108 
3109 		default:
3110 			proto = ethertype_to_ppptype(proto);
3111 			return gen_cmp(OR_LINK, off_linktype, BPF_H,
3112 				(bpf_int32)proto);
3113 		}
3114 		/*NOTREACHED*/
3115 		break;
3116 
3117 	case DLT_NULL:
3118 	case DLT_LOOP:
3119 	case DLT_ENC:
3120 		/*
3121 		 * For DLT_NULL, the link-layer header is a 32-bit
3122 		 * word containing an AF_ value in *host* byte order,
3123 		 * and for DLT_ENC, the link-layer header begins
3124 		 * with a 32-bit work containing an AF_ value in
3125 		 * host byte order.
3126 		 *
3127 		 * In addition, if we're reading a saved capture file,
3128 		 * the host byte order in the capture may not be the
3129 		 * same as the host byte order on this machine.
3130 		 *
3131 		 * For DLT_LOOP, the link-layer header is a 32-bit
3132 		 * word containing an AF_ value in *network* byte order.
3133 		 *
3134 		 * XXX - AF_ values may, unfortunately, be platform-
3135 		 * dependent; for example, FreeBSD's AF_INET6 is 24
3136 		 * whilst NetBSD's and OpenBSD's is 26.
3137 		 *
3138 		 * This means that, when reading a capture file, just
3139 		 * checking for our AF_INET6 value won't work if the
3140 		 * capture file came from another OS.
3141 		 */
3142 		switch (proto) {
3143 
3144 		case ETHERTYPE_IP:
3145 			proto = AF_INET;
3146 			break;
3147 
3148 #ifdef INET6
3149 		case ETHERTYPE_IPV6:
3150 			proto = AF_INET6;
3151 			break;
3152 #endif
3153 
3154 		default:
3155 			/*
3156 			 * Not a type on which we support filtering.
3157 			 * XXX - support those that have AF_ values
3158 			 * #defined on this platform, at least?
3159 			 */
3160 			return gen_false();
3161 		}
3162 
3163 		if (linktype == DLT_NULL || linktype == DLT_ENC) {
3164 			/*
3165 			 * The AF_ value is in host byte order, but
3166 			 * the BPF interpreter will convert it to
3167 			 * network byte order.
3168 			 *
3169 			 * If this is a save file, and it's from a
3170 			 * machine with the opposite byte order to
3171 			 * ours, we byte-swap the AF_ value.
3172 			 *
3173 			 * Then we run it through "htonl()", and
3174 			 * generate code to compare against the result.
3175 			 */
3176 			if (bpf_pcap->sf.rfile != NULL &&
3177 			    bpf_pcap->sf.swapped)
3178 				proto = SWAPLONG(proto);
3179 			proto = htonl(proto);
3180 		}
3181 		return (gen_cmp(OR_LINK, 0, BPF_W, (bpf_int32)proto));
3182 
3183 #ifdef HAVE_NET_PFVAR_H
3184 	case DLT_PFLOG:
3185 		/*
3186 		 * af field is host byte order in contrast to the rest of
3187 		 * the packet.
3188 		 */
3189 		if (proto == ETHERTYPE_IP)
3190 			return (gen_cmp(OR_LINK, offsetof(struct pfloghdr, af),
3191 			    BPF_B, (bpf_int32)AF_INET));
3192 #ifdef INET6
3193 		else if (proto == ETHERTYPE_IPV6)
3194 			return (gen_cmp(OR_LINK, offsetof(struct pfloghdr, af),
3195 			    BPF_B, (bpf_int32)AF_INET6));
3196 #endif /* INET6 */
3197 		else
3198 			return gen_false();
3199 		/*NOTREACHED*/
3200 		break;
3201 #endif /* HAVE_NET_PFVAR_H */
3202 
3203 	case DLT_ARCNET:
3204 	case DLT_ARCNET_LINUX:
3205 		/*
3206 		 * XXX should we check for first fragment if the protocol
3207 		 * uses PHDS?
3208 		 */
3209 		switch (proto) {
3210 
3211 		default:
3212 			return gen_false();
3213 
3214 #ifdef INET6
3215 		case ETHERTYPE_IPV6:
3216 			return (gen_cmp(OR_LINK, off_linktype, BPF_B,
3217 				(bpf_int32)ARCTYPE_INET6));
3218 #endif /* INET6 */
3219 
3220 		case ETHERTYPE_IP:
3221 			b0 = gen_cmp(OR_LINK, off_linktype, BPF_B,
3222 				     (bpf_int32)ARCTYPE_IP);
3223 			b1 = gen_cmp(OR_LINK, off_linktype, BPF_B,
3224 				     (bpf_int32)ARCTYPE_IP_OLD);
3225 			gen_or(b0, b1);
3226 			return (b1);
3227 
3228 		case ETHERTYPE_ARP:
3229 			b0 = gen_cmp(OR_LINK, off_linktype, BPF_B,
3230 				     (bpf_int32)ARCTYPE_ARP);
3231 			b1 = gen_cmp(OR_LINK, off_linktype, BPF_B,
3232 				     (bpf_int32)ARCTYPE_ARP_OLD);
3233 			gen_or(b0, b1);
3234 			return (b1);
3235 
3236 		case ETHERTYPE_REVARP:
3237 			return (gen_cmp(OR_LINK, off_linktype, BPF_B,
3238 					(bpf_int32)ARCTYPE_REVARP));
3239 
3240 		case ETHERTYPE_ATALK:
3241 			return (gen_cmp(OR_LINK, off_linktype, BPF_B,
3242 					(bpf_int32)ARCTYPE_ATALK));
3243 		}
3244 		/*NOTREACHED*/
3245 		break;
3246 
3247 	case DLT_LTALK:
3248 		switch (proto) {
3249 		case ETHERTYPE_ATALK:
3250 			return gen_true();
3251 		default:
3252 			return gen_false();
3253 		}
3254 		/*NOTREACHED*/
3255 		break;
3256 
3257 	case DLT_FRELAY:
3258 		/*
3259 		 * XXX - assumes a 2-byte Frame Relay header with
3260 		 * DLCI and flags.  What if the address is longer?
3261 		 */
3262 		switch (proto) {
3263 
3264 		case ETHERTYPE_IP:
3265 			/*
3266 			 * Check for the special NLPID for IP.
3267 			 */
3268 			return gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | 0xcc);
3269 
3270 #ifdef INET6
3271 		case ETHERTYPE_IPV6:
3272 			/*
3273 			 * Check for the special NLPID for IPv6.
3274 			 */
3275 			return gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | 0x8e);
3276 #endif
3277 
3278 		case LLCSAP_ISONS:
3279 			/*
3280 			 * Check for several OSI protocols.
3281 			 *
3282 			 * Frame Relay packets typically have an OSI
3283 			 * NLPID at the beginning; we check for each
3284 			 * of them.
3285 			 *
3286 			 * What we check for is the NLPID and a frame
3287 			 * control field of UI, i.e. 0x03 followed
3288 			 * by the NLPID.
3289 			 */
3290 			b0 = gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | ISO8473_CLNP);
3291 			b1 = gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | ISO9542_ESIS);
3292 			b2 = gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | ISO10589_ISIS);
3293 			gen_or(b1, b2);
3294 			gen_or(b0, b2);
3295 			return b2;
3296 
3297 		default:
3298 			return gen_false();
3299 		}
3300 		/*NOTREACHED*/
3301 		break;
3302 
3303 	case DLT_MFR:
3304 		bpf_error("Multi-link Frame Relay link-layer type filtering not implemented");
3305 
3306         case DLT_JUNIPER_MFR:
3307         case DLT_JUNIPER_MLFR:
3308         case DLT_JUNIPER_MLPPP:
3309 	case DLT_JUNIPER_ATM1:
3310 	case DLT_JUNIPER_ATM2:
3311 	case DLT_JUNIPER_PPPOE:
3312 	case DLT_JUNIPER_PPPOE_ATM:
3313         case DLT_JUNIPER_GGSN:
3314         case DLT_JUNIPER_ES:
3315         case DLT_JUNIPER_MONITOR:
3316         case DLT_JUNIPER_SERVICES:
3317         case DLT_JUNIPER_ETHER:
3318         case DLT_JUNIPER_PPP:
3319         case DLT_JUNIPER_FRELAY:
3320         case DLT_JUNIPER_CHDLC:
3321         case DLT_JUNIPER_VP:
3322         case DLT_JUNIPER_ST:
3323         case DLT_JUNIPER_ISM:
3324 		/* just lets verify the magic number for now -
3325 		 * on ATM we may have up to 6 different encapsulations on the wire
3326 		 * and need a lot of heuristics to figure out that the payload
3327 		 * might be;
3328 		 *
3329 		 * FIXME encapsulation specific BPF_ filters
3330 		 */
3331 		return gen_mcmp(OR_LINK, 0, BPF_W, 0x4d474300, 0xffffff00); /* compare the magic number */
3332 
3333 	case DLT_LINUX_IRDA:
3334 		bpf_error("IrDA link-layer type filtering not implemented");
3335 
3336 	case DLT_DOCSIS:
3337 		bpf_error("DOCSIS link-layer type filtering not implemented");
3338 
3339 	case DLT_MTP2:
3340 	case DLT_MTP2_WITH_PHDR:
3341 		bpf_error("MTP2 link-layer type filtering not implemented");
3342 
3343 	case DLT_ERF:
3344 		bpf_error("ERF link-layer type filtering not implemented");
3345 
3346 #ifdef DLT_PFSYNC
3347 	case DLT_PFSYNC:
3348 		bpf_error("PFSYNC link-layer type filtering not implemented");
3349 #endif
3350 
3351 	case DLT_LINUX_LAPD:
3352 		bpf_error("LAPD link-layer type filtering not implemented");
3353 
3354 	case DLT_USB:
3355 	case DLT_USB_LINUX:
3356 		bpf_error("USB link-layer type filtering not implemented");
3357 
3358 	case DLT_BLUETOOTH_HCI_H4:
3359 	case DLT_BLUETOOTH_HCI_H4_WITH_PHDR:
3360 		bpf_error("Bluetooth link-layer type filtering not implemented");
3361 
3362 	case DLT_CAN20B:
3363 		bpf_error("CAN20B link-layer type filtering not implemented");
3364 
3365 	case DLT_IEEE802_15_4:
3366 	case DLT_IEEE802_15_4_LINUX:
3367 	case DLT_IEEE802_15_4_NONASK_PHY:
3368 		bpf_error("IEEE 802.15.4 link-layer type filtering not implemented");
3369 
3370 	case DLT_IEEE802_16_MAC_CPS_RADIO:
3371 		bpf_error("IEEE 802.16 link-layer type filtering not implemented");
3372 
3373 	case DLT_SITA:
3374 		bpf_error("SITA link-layer type filtering not implemented");
3375 
3376 	case DLT_RAIF1:
3377 		bpf_error("RAIF1 link-layer type filtering not implemented");
3378 
3379 	case DLT_IPMB:
3380 		bpf_error("IPMB link-layer type filtering not implemented");
3381 
3382 	case DLT_AX25_KISS:
3383 		bpf_error("AX.25 link-layer type filtering not implemented");
3384 	}
3385 
3386 	/*
3387 	 * All the types that have no encapsulation should either be
3388 	 * handled as DLT_SLIP, DLT_SLIP_BSDOS, and DLT_RAW are, if
3389 	 * all packets are IP packets, or should be handled in some
3390 	 * special case, if none of them are (if some are and some
3391 	 * aren't, the lack of encapsulation is a problem, as we'd
3392 	 * have to find some other way of determining the packet type).
3393 	 *
3394 	 * Therefore, if "off_linktype" is -1, there's an error.
3395 	 */
3396 	if (off_linktype == (u_int)-1)
3397 		abort();
3398 
3399 	/*
3400 	 * Any type not handled above should always have an Ethernet
3401 	 * type at an offset of "off_linktype".
3402 	 */
3403 	return gen_cmp(OR_LINK, off_linktype, BPF_H, (bpf_int32)proto);
3404 }
3405 
3406 /*
3407  * Check for an LLC SNAP packet with a given organization code and
3408  * protocol type; we check the entire contents of the 802.2 LLC and
3409  * snap headers, checking for DSAP and SSAP of SNAP and a control
3410  * field of 0x03 in the LLC header, and for the specified organization
3411  * code and protocol type in the SNAP header.
3412  */
3413 static struct block *
3414 gen_snap(orgcode, ptype)
3415 	bpf_u_int32 orgcode;
3416 	bpf_u_int32 ptype;
3417 {
3418 	u_char snapblock[8];
3419 
3420 	snapblock[0] = LLCSAP_SNAP;	/* DSAP = SNAP */
3421 	snapblock[1] = LLCSAP_SNAP;	/* SSAP = SNAP */
3422 	snapblock[2] = 0x03;		/* control = UI */
3423 	snapblock[3] = (orgcode >> 16);	/* upper 8 bits of organization code */
3424 	snapblock[4] = (orgcode >> 8);	/* middle 8 bits of organization code */
3425 	snapblock[5] = (orgcode >> 0);	/* lower 8 bits of organization code */
3426 	snapblock[6] = (ptype >> 8);	/* upper 8 bits of protocol type */
3427 	snapblock[7] = (ptype >> 0);	/* lower 8 bits of protocol type */
3428 	return gen_bcmp(OR_MACPL, 0, 8, snapblock);
3429 }
3430 
3431 /*
3432  * Generate code to match a particular packet type, for link-layer types
3433  * using 802.2 LLC headers.
3434  *
3435  * This is *NOT* used for Ethernet; "gen_ether_linktype()" is used
3436  * for that - it handles the D/I/X Ethernet vs. 802.3+802.2 issues.
3437  *
3438  * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
3439  * value, if <= ETHERMTU.  We use that to determine whether to
3440  * match the DSAP or both DSAP and LSAP or to check the OUI and
3441  * protocol ID in a SNAP header.
3442  */
3443 static struct block *
3444 gen_llc_linktype(proto)
3445 	int proto;
3446 {
3447 	/*
3448 	 * XXX - handle token-ring variable-length header.
3449 	 */
3450 	switch (proto) {
3451 
3452 	case LLCSAP_IP:
3453 	case LLCSAP_ISONS:
3454 	case LLCSAP_NETBEUI:
3455 		/*
3456 		 * XXX - should we check both the DSAP and the
3457 		 * SSAP, like this, or should we check just the
3458 		 * DSAP, as we do for other types <= ETHERMTU
3459 		 * (i.e., other SAP values)?
3460 		 */
3461 		return gen_cmp(OR_MACPL, 0, BPF_H, (bpf_u_int32)
3462 			     ((proto << 8) | proto));
3463 
3464 	case LLCSAP_IPX:
3465 		/*
3466 		 * XXX - are there ever SNAP frames for IPX on
3467 		 * non-Ethernet 802.x networks?
3468 		 */
3469 		return gen_cmp(OR_MACPL, 0, BPF_B,
3470 		    (bpf_int32)LLCSAP_IPX);
3471 
3472 	case ETHERTYPE_ATALK:
3473 		/*
3474 		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
3475 		 * SNAP packets with an organization code of
3476 		 * 0x080007 (Apple, for Appletalk) and a protocol
3477 		 * type of ETHERTYPE_ATALK (Appletalk).
3478 		 *
3479 		 * XXX - check for an organization code of
3480 		 * encapsulated Ethernet as well?
3481 		 */
3482 		return gen_snap(0x080007, ETHERTYPE_ATALK);
3483 
3484 	default:
3485 		/*
3486 		 * XXX - we don't have to check for IPX 802.3
3487 		 * here, but should we check for the IPX Ethertype?
3488 		 */
3489 		if (proto <= ETHERMTU) {
3490 			/*
3491 			 * This is an LLC SAP value, so check
3492 			 * the DSAP.
3493 			 */
3494 			return gen_cmp(OR_MACPL, 0, BPF_B, (bpf_int32)proto);
3495 		} else {
3496 			/*
3497 			 * This is an Ethernet type; we assume that it's
3498 			 * unlikely that it'll appear in the right place
3499 			 * at random, and therefore check only the
3500 			 * location that would hold the Ethernet type
3501 			 * in a SNAP frame with an organization code of
3502 			 * 0x000000 (encapsulated Ethernet).
3503 			 *
3504 			 * XXX - if we were to check for the SNAP DSAP and
3505 			 * LSAP, as per XXX, and were also to check for an
3506 			 * organization code of 0x000000 (encapsulated
3507 			 * Ethernet), we'd do
3508 			 *
3509 			 *	return gen_snap(0x000000, proto);
3510 			 *
3511 			 * here; for now, we don't, as per the above.
3512 			 * I don't know whether it's worth the extra CPU
3513 			 * time to do the right check or not.
3514 			 */
3515 			return gen_cmp(OR_MACPL, 6, BPF_H, (bpf_int32)proto);
3516 		}
3517 	}
3518 }
3519 
3520 static struct block *
3521 gen_hostop(addr, mask, dir, proto, src_off, dst_off)
3522 	bpf_u_int32 addr;
3523 	bpf_u_int32 mask;
3524 	int dir, proto;
3525 	u_int src_off, dst_off;
3526 {
3527 	struct block *b0, *b1;
3528 	u_int offset;
3529 
3530 	switch (dir) {
3531 
3532 	case Q_SRC:
3533 		offset = src_off;
3534 		break;
3535 
3536 	case Q_DST:
3537 		offset = dst_off;
3538 		break;
3539 
3540 	case Q_AND:
3541 		b0 = gen_hostop(addr, mask, Q_SRC, proto, src_off, dst_off);
3542 		b1 = gen_hostop(addr, mask, Q_DST, proto, src_off, dst_off);
3543 		gen_and(b0, b1);
3544 		return b1;
3545 
3546 	case Q_OR:
3547 	case Q_DEFAULT:
3548 		b0 = gen_hostop(addr, mask, Q_SRC, proto, src_off, dst_off);
3549 		b1 = gen_hostop(addr, mask, Q_DST, proto, src_off, dst_off);
3550 		gen_or(b0, b1);
3551 		return b1;
3552 
3553 	default:
3554 		abort();
3555 	}
3556 	b0 = gen_linktype(proto);
3557 	b1 = gen_mcmp(OR_NET, offset, BPF_W, (bpf_int32)addr, mask);
3558 	gen_and(b0, b1);
3559 	return b1;
3560 }
3561 
3562 #ifdef INET6
3563 static struct block *
3564 gen_hostop6(addr, mask, dir, proto, src_off, dst_off)
3565 	struct in6_addr *addr;
3566 	struct in6_addr *mask;
3567 	int dir, proto;
3568 	u_int src_off, dst_off;
3569 {
3570 	struct block *b0, *b1;
3571 	u_int offset;
3572 	u_int32_t *a, *m;
3573 
3574 	switch (dir) {
3575 
3576 	case Q_SRC:
3577 		offset = src_off;
3578 		break;
3579 
3580 	case Q_DST:
3581 		offset = dst_off;
3582 		break;
3583 
3584 	case Q_AND:
3585 		b0 = gen_hostop6(addr, mask, Q_SRC, proto, src_off, dst_off);
3586 		b1 = gen_hostop6(addr, mask, Q_DST, proto, src_off, dst_off);
3587 		gen_and(b0, b1);
3588 		return b1;
3589 
3590 	case Q_OR:
3591 	case Q_DEFAULT:
3592 		b0 = gen_hostop6(addr, mask, Q_SRC, proto, src_off, dst_off);
3593 		b1 = gen_hostop6(addr, mask, Q_DST, proto, src_off, dst_off);
3594 		gen_or(b0, b1);
3595 		return b1;
3596 
3597 	default:
3598 		abort();
3599 	}
3600 	/* this order is important */
3601 	a = (u_int32_t *)addr;
3602 	m = (u_int32_t *)mask;
3603 	b1 = gen_mcmp(OR_NET, offset + 12, BPF_W, ntohl(a[3]), ntohl(m[3]));
3604 	b0 = gen_mcmp(OR_NET, offset + 8, BPF_W, ntohl(a[2]), ntohl(m[2]));
3605 	gen_and(b0, b1);
3606 	b0 = gen_mcmp(OR_NET, offset + 4, BPF_W, ntohl(a[1]), ntohl(m[1]));
3607 	gen_and(b0, b1);
3608 	b0 = gen_mcmp(OR_NET, offset + 0, BPF_W, ntohl(a[0]), ntohl(m[0]));
3609 	gen_and(b0, b1);
3610 	b0 = gen_linktype(proto);
3611 	gen_and(b0, b1);
3612 	return b1;
3613 }
3614 #endif /*INET6*/
3615 
3616 static struct block *
3617 gen_ehostop(eaddr, dir)
3618 	register const u_char *eaddr;
3619 	register int dir;
3620 {
3621 	register struct block *b0, *b1;
3622 
3623 	switch (dir) {
3624 	case Q_SRC:
3625 		return gen_bcmp(OR_LINK, off_mac + 6, 6, eaddr);
3626 
3627 	case Q_DST:
3628 		return gen_bcmp(OR_LINK, off_mac + 0, 6, eaddr);
3629 
3630 	case Q_AND:
3631 		b0 = gen_ehostop(eaddr, Q_SRC);
3632 		b1 = gen_ehostop(eaddr, Q_DST);
3633 		gen_and(b0, b1);
3634 		return b1;
3635 
3636 	case Q_DEFAULT:
3637 	case Q_OR:
3638 		b0 = gen_ehostop(eaddr, Q_SRC);
3639 		b1 = gen_ehostop(eaddr, Q_DST);
3640 		gen_or(b0, b1);
3641 		return b1;
3642 	}
3643 	abort();
3644 	/* NOTREACHED */
3645 }
3646 
3647 /*
3648  * Like gen_ehostop, but for DLT_FDDI
3649  */
3650 static struct block *
3651 gen_fhostop(eaddr, dir)
3652 	register const u_char *eaddr;
3653 	register int dir;
3654 {
3655 	struct block *b0, *b1;
3656 
3657 	switch (dir) {
3658 	case Q_SRC:
3659 #ifdef PCAP_FDDIPAD
3660 		return gen_bcmp(OR_LINK, 6 + 1 + pcap_fddipad, 6, eaddr);
3661 #else
3662 		return gen_bcmp(OR_LINK, 6 + 1, 6, eaddr);
3663 #endif
3664 
3665 	case Q_DST:
3666 #ifdef PCAP_FDDIPAD
3667 		return gen_bcmp(OR_LINK, 0 + 1 + pcap_fddipad, 6, eaddr);
3668 #else
3669 		return gen_bcmp(OR_LINK, 0 + 1, 6, eaddr);
3670 #endif
3671 
3672 	case Q_AND:
3673 		b0 = gen_fhostop(eaddr, Q_SRC);
3674 		b1 = gen_fhostop(eaddr, Q_DST);
3675 		gen_and(b0, b1);
3676 		return b1;
3677 
3678 	case Q_DEFAULT:
3679 	case Q_OR:
3680 		b0 = gen_fhostop(eaddr, Q_SRC);
3681 		b1 = gen_fhostop(eaddr, Q_DST);
3682 		gen_or(b0, b1);
3683 		return b1;
3684 	}
3685 	abort();
3686 	/* NOTREACHED */
3687 }
3688 
3689 /*
3690  * Like gen_ehostop, but for DLT_IEEE802 (Token Ring)
3691  */
3692 static struct block *
3693 gen_thostop(eaddr, dir)
3694 	register const u_char *eaddr;
3695 	register int dir;
3696 {
3697 	register struct block *b0, *b1;
3698 
3699 	switch (dir) {
3700 	case Q_SRC:
3701 		return gen_bcmp(OR_LINK, 8, 6, eaddr);
3702 
3703 	case Q_DST:
3704 		return gen_bcmp(OR_LINK, 2, 6, eaddr);
3705 
3706 	case Q_AND:
3707 		b0 = gen_thostop(eaddr, Q_SRC);
3708 		b1 = gen_thostop(eaddr, Q_DST);
3709 		gen_and(b0, b1);
3710 		return b1;
3711 
3712 	case Q_DEFAULT:
3713 	case Q_OR:
3714 		b0 = gen_thostop(eaddr, Q_SRC);
3715 		b1 = gen_thostop(eaddr, Q_DST);
3716 		gen_or(b0, b1);
3717 		return b1;
3718 	}
3719 	abort();
3720 	/* NOTREACHED */
3721 }
3722 
3723 /*
3724  * Like gen_ehostop, but for DLT_IEEE802_11 (802.11 wireless LAN) and
3725  * various 802.11 + radio headers.
3726  */
3727 static struct block *
3728 gen_wlanhostop(eaddr, dir)
3729 	register const u_char *eaddr;
3730 	register int dir;
3731 {
3732 	register struct block *b0, *b1, *b2;
3733 	register struct slist *s;
3734 
3735 #ifdef ENABLE_WLAN_FILTERING_PATCH
3736 	/*
3737 	 * TODO GV 20070613
3738 	 * We need to disable the optimizer because the optimizer is buggy
3739 	 * and wipes out some LD instructions generated by the below
3740 	 * code to validate the Frame Control bits
3741 	 */
3742 	no_optimize = 1;
3743 #endif /* ENABLE_WLAN_FILTERING_PATCH */
3744 
3745 	switch (dir) {
3746 	case Q_SRC:
3747 		/*
3748 		 * Oh, yuk.
3749 		 *
3750 		 *	For control frames, there is no SA.
3751 		 *
3752 		 *	For management frames, SA is at an
3753 		 *	offset of 10 from the beginning of
3754 		 *	the packet.
3755 		 *
3756 		 *	For data frames, SA is at an offset
3757 		 *	of 10 from the beginning of the packet
3758 		 *	if From DS is clear, at an offset of
3759 		 *	16 from the beginning of the packet
3760 		 *	if From DS is set and To DS is clear,
3761 		 *	and an offset of 24 from the beginning
3762 		 *	of the packet if From DS is set and To DS
3763 		 *	is set.
3764 		 */
3765 
3766 		/*
3767 		 * Generate the tests to be done for data frames
3768 		 * with From DS set.
3769 		 *
3770 		 * First, check for To DS set, i.e. check "link[1] & 0x01".
3771 		 */
3772 		s = gen_load_a(OR_LINK, 1, BPF_B);
3773 		b1 = new_block(JMP(BPF_JSET));
3774 		b1->s.k = 0x01;	/* To DS */
3775 		b1->stmts = s;
3776 
3777 		/*
3778 		 * If To DS is set, the SA is at 24.
3779 		 */
3780 		b0 = gen_bcmp(OR_LINK, 24, 6, eaddr);
3781 		gen_and(b1, b0);
3782 
3783 		/*
3784 		 * Now, check for To DS not set, i.e. check
3785 		 * "!(link[1] & 0x01)".
3786 		 */
3787 		s = gen_load_a(OR_LINK, 1, BPF_B);
3788 		b2 = new_block(JMP(BPF_JSET));
3789 		b2->s.k = 0x01;	/* To DS */
3790 		b2->stmts = s;
3791 		gen_not(b2);
3792 
3793 		/*
3794 		 * If To DS is not set, the SA is at 16.
3795 		 */
3796 		b1 = gen_bcmp(OR_LINK, 16, 6, eaddr);
3797 		gen_and(b2, b1);
3798 
3799 		/*
3800 		 * Now OR together the last two checks.  That gives
3801 		 * the complete set of checks for data frames with
3802 		 * From DS set.
3803 		 */
3804 		gen_or(b1, b0);
3805 
3806 		/*
3807 		 * Now check for From DS being set, and AND that with
3808 		 * the ORed-together checks.
3809 		 */
3810 		s = gen_load_a(OR_LINK, 1, BPF_B);
3811 		b1 = new_block(JMP(BPF_JSET));
3812 		b1->s.k = 0x02;	/* From DS */
3813 		b1->stmts = s;
3814 		gen_and(b1, b0);
3815 
3816 		/*
3817 		 * Now check for data frames with From DS not set.
3818 		 */
3819 		s = gen_load_a(OR_LINK, 1, BPF_B);
3820 		b2 = new_block(JMP(BPF_JSET));
3821 		b2->s.k = 0x02;	/* From DS */
3822 		b2->stmts = s;
3823 		gen_not(b2);
3824 
3825 		/*
3826 		 * If From DS isn't set, the SA is at 10.
3827 		 */
3828 		b1 = gen_bcmp(OR_LINK, 10, 6, eaddr);
3829 		gen_and(b2, b1);
3830 
3831 		/*
3832 		 * Now OR together the checks for data frames with
3833 		 * From DS not set and for data frames with From DS
3834 		 * set; that gives the checks done for data frames.
3835 		 */
3836 		gen_or(b1, b0);
3837 
3838 		/*
3839 		 * Now check for a data frame.
3840 		 * I.e, check "link[0] & 0x08".
3841 		 */
3842 		s = gen_load_a(OR_LINK, 0, BPF_B);
3843 		b1 = new_block(JMP(BPF_JSET));
3844 		b1->s.k = 0x08;
3845 		b1->stmts = s;
3846 
3847 		/*
3848 		 * AND that with the checks done for data frames.
3849 		 */
3850 		gen_and(b1, b0);
3851 
3852 		/*
3853 		 * If the high-order bit of the type value is 0, this
3854 		 * is a management frame.
3855 		 * I.e, check "!(link[0] & 0x08)".
3856 		 */
3857 		s = gen_load_a(OR_LINK, 0, BPF_B);
3858 		b2 = new_block(JMP(BPF_JSET));
3859 		b2->s.k = 0x08;
3860 		b2->stmts = s;
3861 		gen_not(b2);
3862 
3863 		/*
3864 		 * For management frames, the SA is at 10.
3865 		 */
3866 		b1 = gen_bcmp(OR_LINK, 10, 6, eaddr);
3867 		gen_and(b2, b1);
3868 
3869 		/*
3870 		 * OR that with the checks done for data frames.
3871 		 * That gives the checks done for management and
3872 		 * data frames.
3873 		 */
3874 		gen_or(b1, b0);
3875 
3876 		/*
3877 		 * If the low-order bit of the type value is 1,
3878 		 * this is either a control frame or a frame
3879 		 * with a reserved type, and thus not a
3880 		 * frame with an SA.
3881 		 *
3882 		 * I.e., check "!(link[0] & 0x04)".
3883 		 */
3884 		s = gen_load_a(OR_LINK, 0, BPF_B);
3885 		b1 = new_block(JMP(BPF_JSET));
3886 		b1->s.k = 0x04;
3887 		b1->stmts = s;
3888 		gen_not(b1);
3889 
3890 		/*
3891 		 * AND that with the checks for data and management
3892 		 * frames.
3893 		 */
3894 		gen_and(b1, b0);
3895 		return b0;
3896 
3897 	case Q_DST:
3898 		/*
3899 		 * Oh, yuk.
3900 		 *
3901 		 *	For control frames, there is no DA.
3902 		 *
3903 		 *	For management frames, DA is at an
3904 		 *	offset of 4 from the beginning of
3905 		 *	the packet.
3906 		 *
3907 		 *	For data frames, DA is at an offset
3908 		 *	of 4 from the beginning of the packet
3909 		 *	if To DS is clear and at an offset of
3910 		 *	16 from the beginning of the packet
3911 		 *	if To DS is set.
3912 		 */
3913 
3914 		/*
3915 		 * Generate the tests to be done for data frames.
3916 		 *
3917 		 * First, check for To DS set, i.e. "link[1] & 0x01".
3918 		 */
3919 		s = gen_load_a(OR_LINK, 1, BPF_B);
3920 		b1 = new_block(JMP(BPF_JSET));
3921 		b1->s.k = 0x01;	/* To DS */
3922 		b1->stmts = s;
3923 
3924 		/*
3925 		 * If To DS is set, the DA is at 16.
3926 		 */
3927 		b0 = gen_bcmp(OR_LINK, 16, 6, eaddr);
3928 		gen_and(b1, b0);
3929 
3930 		/*
3931 		 * Now, check for To DS not set, i.e. check
3932 		 * "!(link[1] & 0x01)".
3933 		 */
3934 		s = gen_load_a(OR_LINK, 1, BPF_B);
3935 		b2 = new_block(JMP(BPF_JSET));
3936 		b2->s.k = 0x01;	/* To DS */
3937 		b2->stmts = s;
3938 		gen_not(b2);
3939 
3940 		/*
3941 		 * If To DS is not set, the DA is at 4.
3942 		 */
3943 		b1 = gen_bcmp(OR_LINK, 4, 6, eaddr);
3944 		gen_and(b2, b1);
3945 
3946 		/*
3947 		 * Now OR together the last two checks.  That gives
3948 		 * the complete set of checks for data frames.
3949 		 */
3950 		gen_or(b1, b0);
3951 
3952 		/*
3953 		 * Now check for a data frame.
3954 		 * I.e, check "link[0] & 0x08".
3955 		 */
3956 		s = gen_load_a(OR_LINK, 0, BPF_B);
3957 		b1 = new_block(JMP(BPF_JSET));
3958 		b1->s.k = 0x08;
3959 		b1->stmts = s;
3960 
3961 		/*
3962 		 * AND that with the checks done for data frames.
3963 		 */
3964 		gen_and(b1, b0);
3965 
3966 		/*
3967 		 * If the high-order bit of the type value is 0, this
3968 		 * is a management frame.
3969 		 * I.e, check "!(link[0] & 0x08)".
3970 		 */
3971 		s = gen_load_a(OR_LINK, 0, BPF_B);
3972 		b2 = new_block(JMP(BPF_JSET));
3973 		b2->s.k = 0x08;
3974 		b2->stmts = s;
3975 		gen_not(b2);
3976 
3977 		/*
3978 		 * For management frames, the DA is at 4.
3979 		 */
3980 		b1 = gen_bcmp(OR_LINK, 4, 6, eaddr);
3981 		gen_and(b2, b1);
3982 
3983 		/*
3984 		 * OR that with the checks done for data frames.
3985 		 * That gives the checks done for management and
3986 		 * data frames.
3987 		 */
3988 		gen_or(b1, b0);
3989 
3990 		/*
3991 		 * If the low-order bit of the type value is 1,
3992 		 * this is either a control frame or a frame
3993 		 * with a reserved type, and thus not a
3994 		 * frame with an SA.
3995 		 *
3996 		 * I.e., check "!(link[0] & 0x04)".
3997 		 */
3998 		s = gen_load_a(OR_LINK, 0, BPF_B);
3999 		b1 = new_block(JMP(BPF_JSET));
4000 		b1->s.k = 0x04;
4001 		b1->stmts = s;
4002 		gen_not(b1);
4003 
4004 		/*
4005 		 * AND that with the checks for data and management
4006 		 * frames.
4007 		 */
4008 		gen_and(b1, b0);
4009 		return b0;
4010 
4011 	/*
4012 	 * XXX - add RA, TA, and BSSID keywords?
4013 	 */
4014 	case Q_ADDR1:
4015 		return (gen_bcmp(OR_LINK, 4, 6, eaddr));
4016 
4017 	case Q_ADDR2:
4018 		/*
4019 		 * Not present in CTS or ACK control frames.
4020 		 */
4021 		b0 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
4022 			IEEE80211_FC0_TYPE_MASK);
4023 		gen_not(b0);
4024 		b1 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_SUBTYPE_CTS,
4025 			IEEE80211_FC0_SUBTYPE_MASK);
4026 		gen_not(b1);
4027 		b2 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_SUBTYPE_ACK,
4028 			IEEE80211_FC0_SUBTYPE_MASK);
4029 		gen_not(b2);
4030 		gen_and(b1, b2);
4031 		gen_or(b0, b2);
4032 		b1 = gen_bcmp(OR_LINK, 10, 6, eaddr);
4033 		gen_and(b2, b1);
4034 		return b1;
4035 
4036 	case Q_ADDR3:
4037 		/*
4038 		 * Not present in control frames.
4039 		 */
4040 		b0 = gen_mcmp(OR_LINK, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
4041 			IEEE80211_FC0_TYPE_MASK);
4042 		gen_not(b0);
4043 		b1 = gen_bcmp(OR_LINK, 16, 6, eaddr);
4044 		gen_and(b0, b1);
4045 		return b1;
4046 
4047 	case Q_ADDR4:
4048 		/*
4049 		 * Present only if the direction mask has both "From DS"
4050 		 * and "To DS" set.  Neither control frames nor management
4051 		 * frames should have both of those set, so we don't
4052 		 * check the frame type.
4053 		 */
4054 		b0 = gen_mcmp(OR_LINK, 1, BPF_B,
4055 			IEEE80211_FC1_DIR_DSTODS, IEEE80211_FC1_DIR_MASK);
4056 		b1 = gen_bcmp(OR_LINK, 24, 6, eaddr);
4057 		gen_and(b0, b1);
4058 		return b1;
4059 
4060 	case Q_AND:
4061 		b0 = gen_wlanhostop(eaddr, Q_SRC);
4062 		b1 = gen_wlanhostop(eaddr, Q_DST);
4063 		gen_and(b0, b1);
4064 		return b1;
4065 
4066 	case Q_DEFAULT:
4067 	case Q_OR:
4068 		b0 = gen_wlanhostop(eaddr, Q_SRC);
4069 		b1 = gen_wlanhostop(eaddr, Q_DST);
4070 		gen_or(b0, b1);
4071 		return b1;
4072 	}
4073 	abort();
4074 	/* NOTREACHED */
4075 }
4076 
4077 /*
4078  * Like gen_ehostop, but for RFC 2625 IP-over-Fibre-Channel.
4079  * (We assume that the addresses are IEEE 48-bit MAC addresses,
4080  * as the RFC states.)
4081  */
4082 static struct block *
4083 gen_ipfchostop(eaddr, dir)
4084 	register const u_char *eaddr;
4085 	register int dir;
4086 {
4087 	register struct block *b0, *b1;
4088 
4089 	switch (dir) {
4090 	case Q_SRC:
4091 		return gen_bcmp(OR_LINK, 10, 6, eaddr);
4092 
4093 	case Q_DST:
4094 		return gen_bcmp(OR_LINK, 2, 6, eaddr);
4095 
4096 	case Q_AND:
4097 		b0 = gen_ipfchostop(eaddr, Q_SRC);
4098 		b1 = gen_ipfchostop(eaddr, Q_DST);
4099 		gen_and(b0, b1);
4100 		return b1;
4101 
4102 	case Q_DEFAULT:
4103 	case Q_OR:
4104 		b0 = gen_ipfchostop(eaddr, Q_SRC);
4105 		b1 = gen_ipfchostop(eaddr, Q_DST);
4106 		gen_or(b0, b1);
4107 		return b1;
4108 	}
4109 	abort();
4110 	/* NOTREACHED */
4111 }
4112 
4113 /*
4114  * This is quite tricky because there may be pad bytes in front of the
4115  * DECNET header, and then there are two possible data packet formats that
4116  * carry both src and dst addresses, plus 5 packet types in a format that
4117  * carries only the src node, plus 2 types that use a different format and
4118  * also carry just the src node.
4119  *
4120  * Yuck.
4121  *
4122  * Instead of doing those all right, we just look for data packets with
4123  * 0 or 1 bytes of padding.  If you want to look at other packets, that
4124  * will require a lot more hacking.
4125  *
4126  * To add support for filtering on DECNET "areas" (network numbers)
4127  * one would want to add a "mask" argument to this routine.  That would
4128  * make the filter even more inefficient, although one could be clever
4129  * and not generate masking instructions if the mask is 0xFFFF.
4130  */
4131 static struct block *
4132 gen_dnhostop(addr, dir)
4133 	bpf_u_int32 addr;
4134 	int dir;
4135 {
4136 	struct block *b0, *b1, *b2, *tmp;
4137 	u_int offset_lh;	/* offset if long header is received */
4138 	u_int offset_sh;	/* offset if short header is received */
4139 
4140 	switch (dir) {
4141 
4142 	case Q_DST:
4143 		offset_sh = 1;	/* follows flags */
4144 		offset_lh = 7;	/* flgs,darea,dsubarea,HIORD */
4145 		break;
4146 
4147 	case Q_SRC:
4148 		offset_sh = 3;	/* follows flags, dstnode */
4149 		offset_lh = 15;	/* flgs,darea,dsubarea,did,sarea,ssub,HIORD */
4150 		break;
4151 
4152 	case Q_AND:
4153 		/* Inefficient because we do our Calvinball dance twice */
4154 		b0 = gen_dnhostop(addr, Q_SRC);
4155 		b1 = gen_dnhostop(addr, Q_DST);
4156 		gen_and(b0, b1);
4157 		return b1;
4158 
4159 	case Q_OR:
4160 	case Q_DEFAULT:
4161 		/* Inefficient because we do our Calvinball dance twice */
4162 		b0 = gen_dnhostop(addr, Q_SRC);
4163 		b1 = gen_dnhostop(addr, Q_DST);
4164 		gen_or(b0, b1);
4165 		return b1;
4166 
4167 	case Q_ISO:
4168 		bpf_error("ISO host filtering not implemented");
4169 
4170 	default:
4171 		abort();
4172 	}
4173 	b0 = gen_linktype(ETHERTYPE_DN);
4174 	/* Check for pad = 1, long header case */
4175 	tmp = gen_mcmp(OR_NET, 2, BPF_H,
4176 	    (bpf_int32)ntohs(0x0681), (bpf_int32)ntohs(0x07FF));
4177 	b1 = gen_cmp(OR_NET, 2 + 1 + offset_lh,
4178 	    BPF_H, (bpf_int32)ntohs((u_short)addr));
4179 	gen_and(tmp, b1);
4180 	/* Check for pad = 0, long header case */
4181 	tmp = gen_mcmp(OR_NET, 2, BPF_B, (bpf_int32)0x06, (bpf_int32)0x7);
4182 	b2 = gen_cmp(OR_NET, 2 + offset_lh, BPF_H, (bpf_int32)ntohs((u_short)addr));
4183 	gen_and(tmp, b2);
4184 	gen_or(b2, b1);
4185 	/* Check for pad = 1, short header case */
4186 	tmp = gen_mcmp(OR_NET, 2, BPF_H,
4187 	    (bpf_int32)ntohs(0x0281), (bpf_int32)ntohs(0x07FF));
4188 	b2 = gen_cmp(OR_NET, 2 + 1 + offset_sh, BPF_H, (bpf_int32)ntohs((u_short)addr));
4189 	gen_and(tmp, b2);
4190 	gen_or(b2, b1);
4191 	/* Check for pad = 0, short header case */
4192 	tmp = gen_mcmp(OR_NET, 2, BPF_B, (bpf_int32)0x02, (bpf_int32)0x7);
4193 	b2 = gen_cmp(OR_NET, 2 + offset_sh, BPF_H, (bpf_int32)ntohs((u_short)addr));
4194 	gen_and(tmp, b2);
4195 	gen_or(b2, b1);
4196 
4197 	/* Combine with test for linktype */
4198 	gen_and(b0, b1);
4199 	return b1;
4200 }
4201 
4202 /*
4203  * Generate a check for IPv4 or IPv6 for MPLS-encapsulated packets;
4204  * test the bottom-of-stack bit, and then check the version number
4205  * field in the IP header.
4206  */
4207 static struct block *
4208 gen_mpls_linktype(proto)
4209 	int proto;
4210 {
4211 	struct block *b0, *b1;
4212 
4213         switch (proto) {
4214 
4215         case Q_IP:
4216                 /* match the bottom-of-stack bit */
4217                 b0 = gen_mcmp(OR_NET, -2, BPF_B, 0x01, 0x01);
4218                 /* match the IPv4 version number */
4219                 b1 = gen_mcmp(OR_NET, 0, BPF_B, 0x40, 0xf0);
4220                 gen_and(b0, b1);
4221                 return b1;
4222 
4223        case Q_IPV6:
4224                 /* match the bottom-of-stack bit */
4225                 b0 = gen_mcmp(OR_NET, -2, BPF_B, 0x01, 0x01);
4226                 /* match the IPv4 version number */
4227                 b1 = gen_mcmp(OR_NET, 0, BPF_B, 0x60, 0xf0);
4228                 gen_and(b0, b1);
4229                 return b1;
4230 
4231        default:
4232                 abort();
4233         }
4234 }
4235 
4236 static struct block *
4237 gen_host(addr, mask, proto, dir, type)
4238 	bpf_u_int32 addr;
4239 	bpf_u_int32 mask;
4240 	int proto;
4241 	int dir;
4242 	int type;
4243 {
4244 	struct block *b0, *b1;
4245 	const char *typestr;
4246 
4247 	if (type == Q_NET)
4248 		typestr = "net";
4249 	else
4250 		typestr = "host";
4251 
4252 	switch (proto) {
4253 
4254 	case Q_DEFAULT:
4255 		b0 = gen_host(addr, mask, Q_IP, dir, type);
4256 		/*
4257 		 * Only check for non-IPv4 addresses if we're not
4258 		 * checking MPLS-encapsulated packets.
4259 		 */
4260 		if (label_stack_depth == 0) {
4261 			b1 = gen_host(addr, mask, Q_ARP, dir, type);
4262 			gen_or(b0, b1);
4263 			b0 = gen_host(addr, mask, Q_RARP, dir, type);
4264 			gen_or(b1, b0);
4265 		}
4266 		return b0;
4267 
4268 	case Q_IP:
4269 		return gen_hostop(addr, mask, dir, ETHERTYPE_IP, 12, 16);
4270 
4271 	case Q_RARP:
4272 		return gen_hostop(addr, mask, dir, ETHERTYPE_REVARP, 14, 24);
4273 
4274 	case Q_ARP:
4275 		return gen_hostop(addr, mask, dir, ETHERTYPE_ARP, 14, 24);
4276 
4277 	case Q_TCP:
4278 		bpf_error("'tcp' modifier applied to %s", typestr);
4279 
4280 	case Q_SCTP:
4281 		bpf_error("'sctp' modifier applied to %s", typestr);
4282 
4283 	case Q_UDP:
4284 		bpf_error("'udp' modifier applied to %s", typestr);
4285 
4286 	case Q_ICMP:
4287 		bpf_error("'icmp' modifier applied to %s", typestr);
4288 
4289 	case Q_IGMP:
4290 		bpf_error("'igmp' modifier applied to %s", typestr);
4291 
4292 	case Q_IGRP:
4293 		bpf_error("'igrp' modifier applied to %s", typestr);
4294 
4295 	case Q_PIM:
4296 		bpf_error("'pim' modifier applied to %s", typestr);
4297 
4298 	case Q_VRRP:
4299 		bpf_error("'vrrp' modifier applied to %s", typestr);
4300 
4301 	case Q_ATALK:
4302 		bpf_error("ATALK host filtering not implemented");
4303 
4304 	case Q_AARP:
4305 		bpf_error("AARP host filtering not implemented");
4306 
4307 	case Q_DECNET:
4308 		return gen_dnhostop(addr, dir);
4309 
4310 	case Q_SCA:
4311 		bpf_error("SCA host filtering not implemented");
4312 
4313 	case Q_LAT:
4314 		bpf_error("LAT host filtering not implemented");
4315 
4316 	case Q_MOPDL:
4317 		bpf_error("MOPDL host filtering not implemented");
4318 
4319 	case Q_MOPRC:
4320 		bpf_error("MOPRC host filtering not implemented");
4321 
4322 #ifdef INET6
4323 	case Q_IPV6:
4324 		bpf_error("'ip6' modifier applied to ip host");
4325 
4326 	case Q_ICMPV6:
4327 		bpf_error("'icmp6' modifier applied to %s", typestr);
4328 #endif /* INET6 */
4329 
4330 	case Q_AH:
4331 		bpf_error("'ah' modifier applied to %s", typestr);
4332 
4333 	case Q_ESP:
4334 		bpf_error("'esp' modifier applied to %s", typestr);
4335 
4336 	case Q_ISO:
4337 		bpf_error("ISO host filtering not implemented");
4338 
4339 	case Q_ESIS:
4340 		bpf_error("'esis' modifier applied to %s", typestr);
4341 
4342 	case Q_ISIS:
4343 		bpf_error("'isis' modifier applied to %s", typestr);
4344 
4345 	case Q_CLNP:
4346 		bpf_error("'clnp' modifier applied to %s", typestr);
4347 
4348 	case Q_STP:
4349 		bpf_error("'stp' modifier applied to %s", typestr);
4350 
4351 	case Q_IPX:
4352 		bpf_error("IPX host filtering not implemented");
4353 
4354 	case Q_NETBEUI:
4355 		bpf_error("'netbeui' modifier applied to %s", typestr);
4356 
4357 	case Q_RADIO:
4358 		bpf_error("'radio' modifier applied to %s", typestr);
4359 
4360 	default:
4361 		abort();
4362 	}
4363 	/* NOTREACHED */
4364 }
4365 
4366 #ifdef INET6
4367 static struct block *
4368 gen_host6(addr, mask, proto, dir, type)
4369 	struct in6_addr *addr;
4370 	struct in6_addr *mask;
4371 	int proto;
4372 	int dir;
4373 	int type;
4374 {
4375 	const char *typestr;
4376 
4377 	if (type == Q_NET)
4378 		typestr = "net";
4379 	else
4380 		typestr = "host";
4381 
4382 	switch (proto) {
4383 
4384 	case Q_DEFAULT:
4385 		return gen_host6(addr, mask, Q_IPV6, dir, type);
4386 
4387 	case Q_IP:
4388 		bpf_error("'ip' modifier applied to ip6 %s", typestr);
4389 
4390 	case Q_RARP:
4391 		bpf_error("'rarp' modifier applied to ip6 %s", typestr);
4392 
4393 	case Q_ARP:
4394 		bpf_error("'arp' modifier applied to ip6 %s", typestr);
4395 
4396 	case Q_SCTP:
4397 		bpf_error("'sctp' modifier applied to %s", typestr);
4398 
4399 	case Q_TCP:
4400 		bpf_error("'tcp' modifier applied to %s", typestr);
4401 
4402 	case Q_UDP:
4403 		bpf_error("'udp' modifier applied to %s", typestr);
4404 
4405 	case Q_ICMP:
4406 		bpf_error("'icmp' modifier applied to %s", typestr);
4407 
4408 	case Q_IGMP:
4409 		bpf_error("'igmp' modifier applied to %s", typestr);
4410 
4411 	case Q_IGRP:
4412 		bpf_error("'igrp' modifier applied to %s", typestr);
4413 
4414 	case Q_PIM:
4415 		bpf_error("'pim' modifier applied to %s", typestr);
4416 
4417 	case Q_VRRP:
4418 		bpf_error("'vrrp' modifier applied to %s", typestr);
4419 
4420 	case Q_ATALK:
4421 		bpf_error("ATALK host filtering not implemented");
4422 
4423 	case Q_AARP:
4424 		bpf_error("AARP host filtering not implemented");
4425 
4426 	case Q_DECNET:
4427 		bpf_error("'decnet' modifier applied to ip6 %s", typestr);
4428 
4429 	case Q_SCA:
4430 		bpf_error("SCA host filtering not implemented");
4431 
4432 	case Q_LAT:
4433 		bpf_error("LAT host filtering not implemented");
4434 
4435 	case Q_MOPDL:
4436 		bpf_error("MOPDL host filtering not implemented");
4437 
4438 	case Q_MOPRC:
4439 		bpf_error("MOPRC host filtering not implemented");
4440 
4441 	case Q_IPV6:
4442 		return gen_hostop6(addr, mask, dir, ETHERTYPE_IPV6, 8, 24);
4443 
4444 	case Q_ICMPV6:
4445 		bpf_error("'icmp6' modifier applied to %s", typestr);
4446 
4447 	case Q_AH:
4448 		bpf_error("'ah' modifier applied to %s", typestr);
4449 
4450 	case Q_ESP:
4451 		bpf_error("'esp' modifier applied to %s", typestr);
4452 
4453 	case Q_ISO:
4454 		bpf_error("ISO host filtering not implemented");
4455 
4456 	case Q_ESIS:
4457 		bpf_error("'esis' modifier applied to %s", typestr);
4458 
4459 	case Q_ISIS:
4460 		bpf_error("'isis' modifier applied to %s", typestr);
4461 
4462 	case Q_CLNP:
4463 		bpf_error("'clnp' modifier applied to %s", typestr);
4464 
4465 	case Q_STP:
4466 		bpf_error("'stp' modifier applied to %s", typestr);
4467 
4468 	case Q_IPX:
4469 		bpf_error("IPX host filtering not implemented");
4470 
4471 	case Q_NETBEUI:
4472 		bpf_error("'netbeui' modifier applied to %s", typestr);
4473 
4474 	case Q_RADIO:
4475 		bpf_error("'radio' modifier applied to %s", typestr);
4476 
4477 	default:
4478 		abort();
4479 	}
4480 	/* NOTREACHED */
4481 }
4482 #endif /*INET6*/
4483 
4484 #ifndef INET6
4485 static struct block *
4486 gen_gateway(eaddr, alist, proto, dir)
4487 	const u_char *eaddr;
4488 	bpf_u_int32 **alist;
4489 	int proto;
4490 	int dir;
4491 {
4492 	struct block *b0, *b1, *tmp;
4493 
4494 	if (dir != 0)
4495 		bpf_error("direction applied to 'gateway'");
4496 
4497 	switch (proto) {
4498 	case Q_DEFAULT:
4499 	case Q_IP:
4500 	case Q_ARP:
4501 	case Q_RARP:
4502 		switch (linktype) {
4503 		case DLT_EN10MB:
4504 			b0 = gen_ehostop(eaddr, Q_OR);
4505 			break;
4506 		case DLT_FDDI:
4507 			b0 = gen_fhostop(eaddr, Q_OR);
4508 			break;
4509 		case DLT_IEEE802:
4510 			b0 = gen_thostop(eaddr, Q_OR);
4511 			break;
4512 		case DLT_IEEE802_11:
4513 		case DLT_PRISM_HEADER:
4514 		case DLT_IEEE802_11_RADIO_AVS:
4515 		case DLT_IEEE802_11_RADIO:
4516 		case DLT_PPI:
4517 			b0 = gen_wlanhostop(eaddr, Q_OR);
4518 			break;
4519 		case DLT_SUNATM:
4520 			if (is_lane) {
4521 				/*
4522 				 * Check that the packet doesn't begin with an
4523 				 * LE Control marker.  (We've already generated
4524 				 * a test for LANE.)
4525 				 */
4526 				b1 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS,
4527 				    BPF_H, 0xFF00);
4528 				gen_not(b1);
4529 
4530 				/*
4531 				 * Now check the MAC address.
4532 				 */
4533 				b0 = gen_ehostop(eaddr, Q_OR);
4534 				gen_and(b1, b0);
4535 			}
4536 			break;
4537 		case DLT_IP_OVER_FC:
4538 			b0 = gen_ipfchostop(eaddr, Q_OR);
4539 			break;
4540 		default:
4541 			bpf_error(
4542 			    "'gateway' supported only on ethernet/FDDI/token ring/802.11/Fibre Channel");
4543 		}
4544 		b1 = gen_host(**alist++, 0xffffffff, proto, Q_OR, Q_HOST);
4545 		while (*alist) {
4546 			tmp = gen_host(**alist++, 0xffffffff, proto, Q_OR,
4547 			    Q_HOST);
4548 			gen_or(b1, tmp);
4549 			b1 = tmp;
4550 		}
4551 		gen_not(b1);
4552 		gen_and(b0, b1);
4553 		return b1;
4554 	}
4555 	bpf_error("illegal modifier of 'gateway'");
4556 	/* NOTREACHED */
4557 }
4558 #endif
4559 
4560 struct block *
4561 gen_proto_abbrev(proto)
4562 	int proto;
4563 {
4564 	struct block *b0;
4565 	struct block *b1;
4566 
4567 	switch (proto) {
4568 
4569 	case Q_SCTP:
4570 		b1 = gen_proto(IPPROTO_SCTP, Q_IP, Q_DEFAULT);
4571 #ifdef INET6
4572 		b0 = gen_proto(IPPROTO_SCTP, Q_IPV6, Q_DEFAULT);
4573 		gen_or(b0, b1);
4574 #endif
4575 		break;
4576 
4577 	case Q_TCP:
4578 		b1 = gen_proto(IPPROTO_TCP, Q_IP, Q_DEFAULT);
4579 #ifdef INET6
4580 		b0 = gen_proto(IPPROTO_TCP, Q_IPV6, Q_DEFAULT);
4581 		gen_or(b0, b1);
4582 #endif
4583 		break;
4584 
4585 	case Q_UDP:
4586 		b1 = gen_proto(IPPROTO_UDP, Q_IP, Q_DEFAULT);
4587 #ifdef INET6
4588 		b0 = gen_proto(IPPROTO_UDP, Q_IPV6, Q_DEFAULT);
4589 		gen_or(b0, b1);
4590 #endif
4591 		break;
4592 
4593 	case Q_ICMP:
4594 		b1 = gen_proto(IPPROTO_ICMP, Q_IP, Q_DEFAULT);
4595 		break;
4596 
4597 #ifndef	IPPROTO_IGMP
4598 #define	IPPROTO_IGMP	2
4599 #endif
4600 
4601 	case Q_IGMP:
4602 		b1 = gen_proto(IPPROTO_IGMP, Q_IP, Q_DEFAULT);
4603 		break;
4604 
4605 #ifndef	IPPROTO_IGRP
4606 #define	IPPROTO_IGRP	9
4607 #endif
4608 	case Q_IGRP:
4609 		b1 = gen_proto(IPPROTO_IGRP, Q_IP, Q_DEFAULT);
4610 		break;
4611 
4612 #ifndef IPPROTO_PIM
4613 #define IPPROTO_PIM	103
4614 #endif
4615 
4616 	case Q_PIM:
4617 		b1 = gen_proto(IPPROTO_PIM, Q_IP, Q_DEFAULT);
4618 #ifdef INET6
4619 		b0 = gen_proto(IPPROTO_PIM, Q_IPV6, Q_DEFAULT);
4620 		gen_or(b0, b1);
4621 #endif
4622 		break;
4623 
4624 #ifndef IPPROTO_VRRP
4625 #define IPPROTO_VRRP	112
4626 #endif
4627 
4628 	case Q_VRRP:
4629 		b1 = gen_proto(IPPROTO_VRRP, Q_IP, Q_DEFAULT);
4630 		break;
4631 
4632 	case Q_IP:
4633 		b1 =  gen_linktype(ETHERTYPE_IP);
4634 		break;
4635 
4636 	case Q_ARP:
4637 		b1 =  gen_linktype(ETHERTYPE_ARP);
4638 		break;
4639 
4640 	case Q_RARP:
4641 		b1 =  gen_linktype(ETHERTYPE_REVARP);
4642 		break;
4643 
4644 	case Q_LINK:
4645 		bpf_error("link layer applied in wrong context");
4646 
4647 	case Q_ATALK:
4648 		b1 =  gen_linktype(ETHERTYPE_ATALK);
4649 		break;
4650 
4651 	case Q_AARP:
4652 		b1 =  gen_linktype(ETHERTYPE_AARP);
4653 		break;
4654 
4655 	case Q_DECNET:
4656 		b1 =  gen_linktype(ETHERTYPE_DN);
4657 		break;
4658 
4659 	case Q_SCA:
4660 		b1 =  gen_linktype(ETHERTYPE_SCA);
4661 		break;
4662 
4663 	case Q_LAT:
4664 		b1 =  gen_linktype(ETHERTYPE_LAT);
4665 		break;
4666 
4667 	case Q_MOPDL:
4668 		b1 =  gen_linktype(ETHERTYPE_MOPDL);
4669 		break;
4670 
4671 	case Q_MOPRC:
4672 		b1 =  gen_linktype(ETHERTYPE_MOPRC);
4673 		break;
4674 
4675 #ifdef INET6
4676 	case Q_IPV6:
4677 		b1 = gen_linktype(ETHERTYPE_IPV6);
4678 		break;
4679 
4680 #ifndef IPPROTO_ICMPV6
4681 #define IPPROTO_ICMPV6	58
4682 #endif
4683 	case Q_ICMPV6:
4684 		b1 = gen_proto(IPPROTO_ICMPV6, Q_IPV6, Q_DEFAULT);
4685 		break;
4686 #endif /* INET6 */
4687 
4688 #ifndef IPPROTO_AH
4689 #define IPPROTO_AH	51
4690 #endif
4691 	case Q_AH:
4692 		b1 = gen_proto(IPPROTO_AH, Q_IP, Q_DEFAULT);
4693 #ifdef INET6
4694 		b0 = gen_proto(IPPROTO_AH, Q_IPV6, Q_DEFAULT);
4695 		gen_or(b0, b1);
4696 #endif
4697 		break;
4698 
4699 #ifndef IPPROTO_ESP
4700 #define IPPROTO_ESP	50
4701 #endif
4702 	case Q_ESP:
4703 		b1 = gen_proto(IPPROTO_ESP, Q_IP, Q_DEFAULT);
4704 #ifdef INET6
4705 		b0 = gen_proto(IPPROTO_ESP, Q_IPV6, Q_DEFAULT);
4706 		gen_or(b0, b1);
4707 #endif
4708 		break;
4709 
4710 	case Q_ISO:
4711 		b1 = gen_linktype(LLCSAP_ISONS);
4712 		break;
4713 
4714 	case Q_ESIS:
4715 		b1 = gen_proto(ISO9542_ESIS, Q_ISO, Q_DEFAULT);
4716 		break;
4717 
4718 	case Q_ISIS:
4719 		b1 = gen_proto(ISO10589_ISIS, Q_ISO, Q_DEFAULT);
4720 		break;
4721 
4722 	case Q_ISIS_L1: /* all IS-IS Level1 PDU-Types */
4723 		b0 = gen_proto(ISIS_L1_LAN_IIH, Q_ISIS, Q_DEFAULT);
4724 		b1 = gen_proto(ISIS_PTP_IIH, Q_ISIS, Q_DEFAULT); /* FIXME extract the circuit-type bits */
4725 		gen_or(b0, b1);
4726 		b0 = gen_proto(ISIS_L1_LSP, Q_ISIS, Q_DEFAULT);
4727 		gen_or(b0, b1);
4728 		b0 = gen_proto(ISIS_L1_CSNP, Q_ISIS, Q_DEFAULT);
4729 		gen_or(b0, b1);
4730 		b0 = gen_proto(ISIS_L1_PSNP, Q_ISIS, Q_DEFAULT);
4731 		gen_or(b0, b1);
4732 		break;
4733 
4734 	case Q_ISIS_L2: /* all IS-IS Level2 PDU-Types */
4735 		b0 = gen_proto(ISIS_L2_LAN_IIH, Q_ISIS, Q_DEFAULT);
4736 		b1 = gen_proto(ISIS_PTP_IIH, Q_ISIS, Q_DEFAULT); /* FIXME extract the circuit-type bits */
4737 		gen_or(b0, b1);
4738 		b0 = gen_proto(ISIS_L2_LSP, Q_ISIS, Q_DEFAULT);
4739 		gen_or(b0, b1);
4740 		b0 = gen_proto(ISIS_L2_CSNP, Q_ISIS, Q_DEFAULT);
4741 		gen_or(b0, b1);
4742 		b0 = gen_proto(ISIS_L2_PSNP, Q_ISIS, Q_DEFAULT);
4743 		gen_or(b0, b1);
4744 		break;
4745 
4746 	case Q_ISIS_IIH: /* all IS-IS Hello PDU-Types */
4747 		b0 = gen_proto(ISIS_L1_LAN_IIH, Q_ISIS, Q_DEFAULT);
4748 		b1 = gen_proto(ISIS_L2_LAN_IIH, Q_ISIS, Q_DEFAULT);
4749 		gen_or(b0, b1);
4750 		b0 = gen_proto(ISIS_PTP_IIH, Q_ISIS, Q_DEFAULT);
4751 		gen_or(b0, b1);
4752 		break;
4753 
4754 	case Q_ISIS_LSP:
4755 		b0 = gen_proto(ISIS_L1_LSP, Q_ISIS, Q_DEFAULT);
4756 		b1 = gen_proto(ISIS_L2_LSP, Q_ISIS, Q_DEFAULT);
4757 		gen_or(b0, b1);
4758 		break;
4759 
4760 	case Q_ISIS_SNP:
4761 		b0 = gen_proto(ISIS_L1_CSNP, Q_ISIS, Q_DEFAULT);
4762 		b1 = gen_proto(ISIS_L2_CSNP, Q_ISIS, Q_DEFAULT);
4763 		gen_or(b0, b1);
4764 		b0 = gen_proto(ISIS_L1_PSNP, Q_ISIS, Q_DEFAULT);
4765 		gen_or(b0, b1);
4766 		b0 = gen_proto(ISIS_L2_PSNP, Q_ISIS, Q_DEFAULT);
4767 		gen_or(b0, b1);
4768 		break;
4769 
4770 	case Q_ISIS_CSNP:
4771 		b0 = gen_proto(ISIS_L1_CSNP, Q_ISIS, Q_DEFAULT);
4772 		b1 = gen_proto(ISIS_L2_CSNP, Q_ISIS, Q_DEFAULT);
4773 		gen_or(b0, b1);
4774 		break;
4775 
4776 	case Q_ISIS_PSNP:
4777 		b0 = gen_proto(ISIS_L1_PSNP, Q_ISIS, Q_DEFAULT);
4778 		b1 = gen_proto(ISIS_L2_PSNP, Q_ISIS, Q_DEFAULT);
4779 		gen_or(b0, b1);
4780 		break;
4781 
4782 	case Q_CLNP:
4783 		b1 = gen_proto(ISO8473_CLNP, Q_ISO, Q_DEFAULT);
4784 		break;
4785 
4786 	case Q_STP:
4787 		b1 = gen_linktype(LLCSAP_8021D);
4788 		break;
4789 
4790 	case Q_IPX:
4791 		b1 = gen_linktype(LLCSAP_IPX);
4792 		break;
4793 
4794 	case Q_NETBEUI:
4795 		b1 = gen_linktype(LLCSAP_NETBEUI);
4796 		break;
4797 
4798 	case Q_RADIO:
4799 		bpf_error("'radio' is not a valid protocol type");
4800 
4801 	default:
4802 		abort();
4803 	}
4804 	return b1;
4805 }
4806 
4807 static struct block *
4808 gen_ipfrag()
4809 {
4810 	struct slist *s;
4811 	struct block *b;
4812 
4813 	/* not ip frag */
4814 	s = gen_load_a(OR_NET, 6, BPF_H);
4815 	b = new_block(JMP(BPF_JSET));
4816 	b->s.k = 0x1fff;
4817 	b->stmts = s;
4818 	gen_not(b);
4819 
4820 	return b;
4821 }
4822 
4823 /*
4824  * Generate a comparison to a port value in the transport-layer header
4825  * at the specified offset from the beginning of that header.
4826  *
4827  * XXX - this handles a variable-length prefix preceding the link-layer
4828  * header, such as the radiotap or AVS radio prefix, but doesn't handle
4829  * variable-length link-layer headers (such as Token Ring or 802.11
4830  * headers).
4831  */
4832 static struct block *
4833 gen_portatom(off, v)
4834 	int off;
4835 	bpf_int32 v;
4836 {
4837 	return gen_cmp(OR_TRAN_IPV4, off, BPF_H, v);
4838 }
4839 
4840 #ifdef INET6
4841 static struct block *
4842 gen_portatom6(off, v)
4843 	int off;
4844 	bpf_int32 v;
4845 {
4846 	return gen_cmp(OR_TRAN_IPV6, off, BPF_H, v);
4847 }
4848 #endif/*INET6*/
4849 
4850 struct block *
4851 gen_portop(port, proto, dir)
4852 	int port, proto, dir;
4853 {
4854 	struct block *b0, *b1, *tmp;
4855 
4856 	/* ip proto 'proto' */
4857 	tmp = gen_cmp(OR_NET, 9, BPF_B, (bpf_int32)proto);
4858 	b0 = gen_ipfrag();
4859 	gen_and(tmp, b0);
4860 
4861 	switch (dir) {
4862 	case Q_SRC:
4863 		b1 = gen_portatom(0, (bpf_int32)port);
4864 		break;
4865 
4866 	case Q_DST:
4867 		b1 = gen_portatom(2, (bpf_int32)port);
4868 		break;
4869 
4870 	case Q_OR:
4871 	case Q_DEFAULT:
4872 		tmp = gen_portatom(0, (bpf_int32)port);
4873 		b1 = gen_portatom(2, (bpf_int32)port);
4874 		gen_or(tmp, b1);
4875 		break;
4876 
4877 	case Q_AND:
4878 		tmp = gen_portatom(0, (bpf_int32)port);
4879 		b1 = gen_portatom(2, (bpf_int32)port);
4880 		gen_and(tmp, b1);
4881 		break;
4882 
4883 	default:
4884 		abort();
4885 	}
4886 	gen_and(b0, b1);
4887 
4888 	return b1;
4889 }
4890 
4891 static struct block *
4892 gen_port(port, ip_proto, dir)
4893 	int port;
4894 	int ip_proto;
4895 	int dir;
4896 {
4897 	struct block *b0, *b1, *tmp;
4898 
4899 	/*
4900 	 * ether proto ip
4901 	 *
4902 	 * For FDDI, RFC 1188 says that SNAP encapsulation is used,
4903 	 * not LLC encapsulation with LLCSAP_IP.
4904 	 *
4905 	 * For IEEE 802 networks - which includes 802.5 token ring
4906 	 * (which is what DLT_IEEE802 means) and 802.11 - RFC 1042
4907 	 * says that SNAP encapsulation is used, not LLC encapsulation
4908 	 * with LLCSAP_IP.
4909 	 *
4910 	 * For LLC-encapsulated ATM/"Classical IP", RFC 1483 and
4911 	 * RFC 2225 say that SNAP encapsulation is used, not LLC
4912 	 * encapsulation with LLCSAP_IP.
4913 	 *
4914 	 * So we always check for ETHERTYPE_IP.
4915 	 */
4916 	b0 =  gen_linktype(ETHERTYPE_IP);
4917 
4918 	switch (ip_proto) {
4919 	case IPPROTO_UDP:
4920 	case IPPROTO_TCP:
4921 	case IPPROTO_SCTP:
4922 		b1 = gen_portop(port, ip_proto, dir);
4923 		break;
4924 
4925 	case PROTO_UNDEF:
4926 		tmp = gen_portop(port, IPPROTO_TCP, dir);
4927 		b1 = gen_portop(port, IPPROTO_UDP, dir);
4928 		gen_or(tmp, b1);
4929 		tmp = gen_portop(port, IPPROTO_SCTP, dir);
4930 		gen_or(tmp, b1);
4931 		break;
4932 
4933 	default:
4934 		abort();
4935 	}
4936 	gen_and(b0, b1);
4937 	return b1;
4938 }
4939 
4940 #ifdef INET6
4941 struct block *
4942 gen_portop6(port, proto, dir)
4943 	int port, proto, dir;
4944 {
4945 	struct block *b0, *b1, *tmp;
4946 
4947 	/* ip6 proto 'proto' */
4948 	b0 = gen_cmp(OR_NET, 6, BPF_B, (bpf_int32)proto);
4949 
4950 	switch (dir) {
4951 	case Q_SRC:
4952 		b1 = gen_portatom6(0, (bpf_int32)port);
4953 		break;
4954 
4955 	case Q_DST:
4956 		b1 = gen_portatom6(2, (bpf_int32)port);
4957 		break;
4958 
4959 	case Q_OR:
4960 	case Q_DEFAULT:
4961 		tmp = gen_portatom6(0, (bpf_int32)port);
4962 		b1 = gen_portatom6(2, (bpf_int32)port);
4963 		gen_or(tmp, b1);
4964 		break;
4965 
4966 	case Q_AND:
4967 		tmp = gen_portatom6(0, (bpf_int32)port);
4968 		b1 = gen_portatom6(2, (bpf_int32)port);
4969 		gen_and(tmp, b1);
4970 		break;
4971 
4972 	default:
4973 		abort();
4974 	}
4975 	gen_and(b0, b1);
4976 
4977 	return b1;
4978 }
4979 
4980 static struct block *
4981 gen_port6(port, ip_proto, dir)
4982 	int port;
4983 	int ip_proto;
4984 	int dir;
4985 {
4986 	struct block *b0, *b1, *tmp;
4987 
4988 	/* link proto ip6 */
4989 	b0 =  gen_linktype(ETHERTYPE_IPV6);
4990 
4991 	switch (ip_proto) {
4992 	case IPPROTO_UDP:
4993 	case IPPROTO_TCP:
4994 	case IPPROTO_SCTP:
4995 		b1 = gen_portop6(port, ip_proto, dir);
4996 		break;
4997 
4998 	case PROTO_UNDEF:
4999 		tmp = gen_portop6(port, IPPROTO_TCP, dir);
5000 		b1 = gen_portop6(port, IPPROTO_UDP, dir);
5001 		gen_or(tmp, b1);
5002 		tmp = gen_portop6(port, IPPROTO_SCTP, dir);
5003 		gen_or(tmp, b1);
5004 		break;
5005 
5006 	default:
5007 		abort();
5008 	}
5009 	gen_and(b0, b1);
5010 	return b1;
5011 }
5012 #endif /* INET6 */
5013 
5014 /* gen_portrange code */
5015 static struct block *
5016 gen_portrangeatom(off, v1, v2)
5017 	int off;
5018 	bpf_int32 v1, v2;
5019 {
5020 	struct block *b1, *b2;
5021 
5022 	if (v1 > v2) {
5023 		/*
5024 		 * Reverse the order of the ports, so v1 is the lower one.
5025 		 */
5026 		bpf_int32 vtemp;
5027 
5028 		vtemp = v1;
5029 		v1 = v2;
5030 		v2 = vtemp;
5031 	}
5032 
5033 	b1 = gen_cmp_ge(OR_TRAN_IPV4, off, BPF_H, v1);
5034 	b2 = gen_cmp_le(OR_TRAN_IPV4, off, BPF_H, v2);
5035 
5036 	gen_and(b1, b2);
5037 
5038 	return b2;
5039 }
5040 
5041 struct block *
5042 gen_portrangeop(port1, port2, proto, dir)
5043 	int port1, port2;
5044 	int proto;
5045 	int dir;
5046 {
5047 	struct block *b0, *b1, *tmp;
5048 
5049 	/* ip proto 'proto' */
5050 	tmp = gen_cmp(OR_NET, 9, BPF_B, (bpf_int32)proto);
5051 	b0 = gen_ipfrag();
5052 	gen_and(tmp, b0);
5053 
5054 	switch (dir) {
5055 	case Q_SRC:
5056 		b1 = gen_portrangeatom(0, (bpf_int32)port1, (bpf_int32)port2);
5057 		break;
5058 
5059 	case Q_DST:
5060 		b1 = gen_portrangeatom(2, (bpf_int32)port1, (bpf_int32)port2);
5061 		break;
5062 
5063 	case Q_OR:
5064 	case Q_DEFAULT:
5065 		tmp = gen_portrangeatom(0, (bpf_int32)port1, (bpf_int32)port2);
5066 		b1 = gen_portrangeatom(2, (bpf_int32)port1, (bpf_int32)port2);
5067 		gen_or(tmp, b1);
5068 		break;
5069 
5070 	case Q_AND:
5071 		tmp = gen_portrangeatom(0, (bpf_int32)port1, (bpf_int32)port2);
5072 		b1 = gen_portrangeatom(2, (bpf_int32)port1, (bpf_int32)port2);
5073 		gen_and(tmp, b1);
5074 		break;
5075 
5076 	default:
5077 		abort();
5078 	}
5079 	gen_and(b0, b1);
5080 
5081 	return b1;
5082 }
5083 
5084 static struct block *
5085 gen_portrange(port1, port2, ip_proto, dir)
5086 	int port1, port2;
5087 	int ip_proto;
5088 	int dir;
5089 {
5090 	struct block *b0, *b1, *tmp;
5091 
5092 	/* link proto ip */
5093 	b0 =  gen_linktype(ETHERTYPE_IP);
5094 
5095 	switch (ip_proto) {
5096 	case IPPROTO_UDP:
5097 	case IPPROTO_TCP:
5098 	case IPPROTO_SCTP:
5099 		b1 = gen_portrangeop(port1, port2, ip_proto, dir);
5100 		break;
5101 
5102 	case PROTO_UNDEF:
5103 		tmp = gen_portrangeop(port1, port2, IPPROTO_TCP, dir);
5104 		b1 = gen_portrangeop(port1, port2, IPPROTO_UDP, dir);
5105 		gen_or(tmp, b1);
5106 		tmp = gen_portrangeop(port1, port2, IPPROTO_SCTP, dir);
5107 		gen_or(tmp, b1);
5108 		break;
5109 
5110 	default:
5111 		abort();
5112 	}
5113 	gen_and(b0, b1);
5114 	return b1;
5115 }
5116 
5117 #ifdef INET6
5118 static struct block *
5119 gen_portrangeatom6(off, v1, v2)
5120 	int off;
5121 	bpf_int32 v1, v2;
5122 {
5123 	struct block *b1, *b2;
5124 
5125 	if (v1 > v2) {
5126 		/*
5127 		 * Reverse the order of the ports, so v1 is the lower one.
5128 		 */
5129 		bpf_int32 vtemp;
5130 
5131 		vtemp = v1;
5132 		v1 = v2;
5133 		v2 = vtemp;
5134 	}
5135 
5136 	b1 = gen_cmp_ge(OR_TRAN_IPV6, off, BPF_H, v1);
5137 	b2 = gen_cmp_le(OR_TRAN_IPV6, off, BPF_H, v2);
5138 
5139 	gen_and(b1, b2);
5140 
5141 	return b2;
5142 }
5143 
5144 struct block *
5145 gen_portrangeop6(port1, port2, proto, dir)
5146 	int port1, port2;
5147 	int proto;
5148 	int dir;
5149 {
5150 	struct block *b0, *b1, *tmp;
5151 
5152 	/* ip6 proto 'proto' */
5153 	b0 = gen_cmp(OR_NET, 6, BPF_B, (bpf_int32)proto);
5154 
5155 	switch (dir) {
5156 	case Q_SRC:
5157 		b1 = gen_portrangeatom6(0, (bpf_int32)port1, (bpf_int32)port2);
5158 		break;
5159 
5160 	case Q_DST:
5161 		b1 = gen_portrangeatom6(2, (bpf_int32)port1, (bpf_int32)port2);
5162 		break;
5163 
5164 	case Q_OR:
5165 	case Q_DEFAULT:
5166 		tmp = gen_portrangeatom6(0, (bpf_int32)port1, (bpf_int32)port2);
5167 		b1 = gen_portrangeatom6(2, (bpf_int32)port1, (bpf_int32)port2);
5168 		gen_or(tmp, b1);
5169 		break;
5170 
5171 	case Q_AND:
5172 		tmp = gen_portrangeatom6(0, (bpf_int32)port1, (bpf_int32)port2);
5173 		b1 = gen_portrangeatom6(2, (bpf_int32)port1, (bpf_int32)port2);
5174 		gen_and(tmp, b1);
5175 		break;
5176 
5177 	default:
5178 		abort();
5179 	}
5180 	gen_and(b0, b1);
5181 
5182 	return b1;
5183 }
5184 
5185 static struct block *
5186 gen_portrange6(port1, port2, ip_proto, dir)
5187 	int port1, port2;
5188 	int ip_proto;
5189 	int dir;
5190 {
5191 	struct block *b0, *b1, *tmp;
5192 
5193 	/* link proto ip6 */
5194 	b0 =  gen_linktype(ETHERTYPE_IPV6);
5195 
5196 	switch (ip_proto) {
5197 	case IPPROTO_UDP:
5198 	case IPPROTO_TCP:
5199 	case IPPROTO_SCTP:
5200 		b1 = gen_portrangeop6(port1, port2, ip_proto, dir);
5201 		break;
5202 
5203 	case PROTO_UNDEF:
5204 		tmp = gen_portrangeop6(port1, port2, IPPROTO_TCP, dir);
5205 		b1 = gen_portrangeop6(port1, port2, IPPROTO_UDP, dir);
5206 		gen_or(tmp, b1);
5207 		tmp = gen_portrangeop6(port1, port2, IPPROTO_SCTP, dir);
5208 		gen_or(tmp, b1);
5209 		break;
5210 
5211 	default:
5212 		abort();
5213 	}
5214 	gen_and(b0, b1);
5215 	return b1;
5216 }
5217 #endif /* INET6 */
5218 
5219 static int
5220 lookup_proto(name, proto)
5221 	register const char *name;
5222 	register int proto;
5223 {
5224 	register int v;
5225 
5226 	switch (proto) {
5227 
5228 	case Q_DEFAULT:
5229 	case Q_IP:
5230 	case Q_IPV6:
5231 		v = pcap_nametoproto(name);
5232 		if (v == PROTO_UNDEF)
5233 			bpf_error("unknown ip proto '%s'", name);
5234 		break;
5235 
5236 	case Q_LINK:
5237 		/* XXX should look up h/w protocol type based on linktype */
5238 		v = pcap_nametoeproto(name);
5239 		if (v == PROTO_UNDEF) {
5240 			v = pcap_nametollc(name);
5241 			if (v == PROTO_UNDEF)
5242 				bpf_error("unknown ether proto '%s'", name);
5243 		}
5244 		break;
5245 
5246 	case Q_ISO:
5247 		if (strcmp(name, "esis") == 0)
5248 			v = ISO9542_ESIS;
5249 		else if (strcmp(name, "isis") == 0)
5250 			v = ISO10589_ISIS;
5251 		else if (strcmp(name, "clnp") == 0)
5252 			v = ISO8473_CLNP;
5253 		else
5254 			bpf_error("unknown osi proto '%s'", name);
5255 		break;
5256 
5257 	default:
5258 		v = PROTO_UNDEF;
5259 		break;
5260 	}
5261 	return v;
5262 }
5263 
5264 #if 0
5265 struct stmt *
5266 gen_joinsp(s, n)
5267 	struct stmt **s;
5268 	int n;
5269 {
5270 	return NULL;
5271 }
5272 #endif
5273 
5274 static struct block *
5275 gen_protochain(v, proto, dir)
5276 	int v;
5277 	int proto;
5278 	int dir;
5279 {
5280 #ifdef NO_PROTOCHAIN
5281 	return gen_proto(v, proto, dir);
5282 #else
5283 	struct block *b0, *b;
5284 	struct slist *s[100];
5285 	int fix2, fix3, fix4, fix5;
5286 	int ahcheck, again, end;
5287 	int i, max;
5288 	int reg2 = alloc_reg();
5289 
5290 	memset(s, 0, sizeof(s));
5291 	fix2 = fix3 = fix4 = fix5 = 0;
5292 
5293 	switch (proto) {
5294 	case Q_IP:
5295 	case Q_IPV6:
5296 		break;
5297 	case Q_DEFAULT:
5298 		b0 = gen_protochain(v, Q_IP, dir);
5299 		b = gen_protochain(v, Q_IPV6, dir);
5300 		gen_or(b0, b);
5301 		return b;
5302 	default:
5303 		bpf_error("bad protocol applied for 'protochain'");
5304 		/*NOTREACHED*/
5305 	}
5306 
5307 	/*
5308 	 * We don't handle variable-length prefixes before the link-layer
5309 	 * header, or variable-length link-layer headers, here yet.
5310 	 * We might want to add BPF instructions to do the protochain
5311 	 * work, to simplify that and, on platforms that have a BPF
5312 	 * interpreter with the new instructions, let the filtering
5313 	 * be done in the kernel.  (We already require a modified BPF
5314 	 * engine to do the protochain stuff, to support backward
5315 	 * branches, and backward branch support is unlikely to appear
5316 	 * in kernel BPF engines.)
5317 	 */
5318 	switch (linktype) {
5319 
5320 	case DLT_IEEE802_11:
5321 	case DLT_PRISM_HEADER:
5322 	case DLT_IEEE802_11_RADIO_AVS:
5323 	case DLT_IEEE802_11_RADIO:
5324 	case DLT_PPI:
5325 		bpf_error("'protochain' not supported with 802.11");
5326 	}
5327 
5328 	no_optimize = 1; /*this code is not compatible with optimzer yet */
5329 
5330 	/*
5331 	 * s[0] is a dummy entry to protect other BPF insn from damage
5332 	 * by s[fix] = foo with uninitialized variable "fix".  It is somewhat
5333 	 * hard to find interdependency made by jump table fixup.
5334 	 */
5335 	i = 0;
5336 	s[i] = new_stmt(0);	/*dummy*/
5337 	i++;
5338 
5339 	switch (proto) {
5340 	case Q_IP:
5341 		b0 = gen_linktype(ETHERTYPE_IP);
5342 
5343 		/* A = ip->ip_p */
5344 		s[i] = new_stmt(BPF_LD|BPF_ABS|BPF_B);
5345 		s[i]->s.k = off_macpl + off_nl + 9;
5346 		i++;
5347 		/* X = ip->ip_hl << 2 */
5348 		s[i] = new_stmt(BPF_LDX|BPF_MSH|BPF_B);
5349 		s[i]->s.k = off_macpl + off_nl;
5350 		i++;
5351 		break;
5352 #ifdef INET6
5353 	case Q_IPV6:
5354 		b0 = gen_linktype(ETHERTYPE_IPV6);
5355 
5356 		/* A = ip6->ip_nxt */
5357 		s[i] = new_stmt(BPF_LD|BPF_ABS|BPF_B);
5358 		s[i]->s.k = off_macpl + off_nl + 6;
5359 		i++;
5360 		/* X = sizeof(struct ip6_hdr) */
5361 		s[i] = new_stmt(BPF_LDX|BPF_IMM);
5362 		s[i]->s.k = 40;
5363 		i++;
5364 		break;
5365 #endif
5366 	default:
5367 		bpf_error("unsupported proto to gen_protochain");
5368 		/*NOTREACHED*/
5369 	}
5370 
5371 	/* again: if (A == v) goto end; else fall through; */
5372 	again = i;
5373 	s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
5374 	s[i]->s.k = v;
5375 	s[i]->s.jt = NULL;		/*later*/
5376 	s[i]->s.jf = NULL;		/*update in next stmt*/
5377 	fix5 = i;
5378 	i++;
5379 
5380 #ifndef IPPROTO_NONE
5381 #define IPPROTO_NONE	59
5382 #endif
5383 	/* if (A == IPPROTO_NONE) goto end */
5384 	s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
5385 	s[i]->s.jt = NULL;	/*later*/
5386 	s[i]->s.jf = NULL;	/*update in next stmt*/
5387 	s[i]->s.k = IPPROTO_NONE;
5388 	s[fix5]->s.jf = s[i];
5389 	fix2 = i;
5390 	i++;
5391 
5392 #ifdef INET6
5393 	if (proto == Q_IPV6) {
5394 		int v6start, v6end, v6advance, j;
5395 
5396 		v6start = i;
5397 		/* if (A == IPPROTO_HOPOPTS) goto v6advance */
5398 		s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
5399 		s[i]->s.jt = NULL;	/*later*/
5400 		s[i]->s.jf = NULL;	/*update in next stmt*/
5401 		s[i]->s.k = IPPROTO_HOPOPTS;
5402 		s[fix2]->s.jf = s[i];
5403 		i++;
5404 		/* if (A == IPPROTO_DSTOPTS) goto v6advance */
5405 		s[i - 1]->s.jf = s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
5406 		s[i]->s.jt = NULL;	/*later*/
5407 		s[i]->s.jf = NULL;	/*update in next stmt*/
5408 		s[i]->s.k = IPPROTO_DSTOPTS;
5409 		i++;
5410 		/* if (A == IPPROTO_ROUTING) goto v6advance */
5411 		s[i - 1]->s.jf = s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
5412 		s[i]->s.jt = NULL;	/*later*/
5413 		s[i]->s.jf = NULL;	/*update in next stmt*/
5414 		s[i]->s.k = IPPROTO_ROUTING;
5415 		i++;
5416 		/* if (A == IPPROTO_FRAGMENT) goto v6advance; else goto ahcheck; */
5417 		s[i - 1]->s.jf = s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
5418 		s[i]->s.jt = NULL;	/*later*/
5419 		s[i]->s.jf = NULL;	/*later*/
5420 		s[i]->s.k = IPPROTO_FRAGMENT;
5421 		fix3 = i;
5422 		v6end = i;
5423 		i++;
5424 
5425 		/* v6advance: */
5426 		v6advance = i;
5427 
5428 		/*
5429 		 * in short,
5430 		 * A = P[X];
5431 		 * X = X + (P[X + 1] + 1) * 8;
5432 		 */
5433 		/* A = X */
5434 		s[i] = new_stmt(BPF_MISC|BPF_TXA);
5435 		i++;
5436 		/* A = P[X + packet head] */
5437 		s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
5438 		s[i]->s.k = off_macpl + off_nl;
5439 		i++;
5440 		/* MEM[reg2] = A */
5441 		s[i] = new_stmt(BPF_ST);
5442 		s[i]->s.k = reg2;
5443 		i++;
5444 		/* A = X */
5445 		s[i] = new_stmt(BPF_MISC|BPF_TXA);
5446 		i++;
5447 		/* A += 1 */
5448 		s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
5449 		s[i]->s.k = 1;
5450 		i++;
5451 		/* X = A */
5452 		s[i] = new_stmt(BPF_MISC|BPF_TAX);
5453 		i++;
5454 		/* A = P[X + packet head]; */
5455 		s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
5456 		s[i]->s.k = off_macpl + off_nl;
5457 		i++;
5458 		/* A += 1 */
5459 		s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
5460 		s[i]->s.k = 1;
5461 		i++;
5462 		/* A *= 8 */
5463 		s[i] = new_stmt(BPF_ALU|BPF_MUL|BPF_K);
5464 		s[i]->s.k = 8;
5465 		i++;
5466 		/* X = A; */
5467 		s[i] = new_stmt(BPF_MISC|BPF_TAX);
5468 		i++;
5469 		/* A = MEM[reg2] */
5470 		s[i] = new_stmt(BPF_LD|BPF_MEM);
5471 		s[i]->s.k = reg2;
5472 		i++;
5473 
5474 		/* goto again; (must use BPF_JA for backward jump) */
5475 		s[i] = new_stmt(BPF_JMP|BPF_JA);
5476 		s[i]->s.k = again - i - 1;
5477 		s[i - 1]->s.jf = s[i];
5478 		i++;
5479 
5480 		/* fixup */
5481 		for (j = v6start; j <= v6end; j++)
5482 			s[j]->s.jt = s[v6advance];
5483 	} else
5484 #endif
5485 	{
5486 		/* nop */
5487 		s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
5488 		s[i]->s.k = 0;
5489 		s[fix2]->s.jf = s[i];
5490 		i++;
5491 	}
5492 
5493 	/* ahcheck: */
5494 	ahcheck = i;
5495 	/* if (A == IPPROTO_AH) then fall through; else goto end; */
5496 	s[i] = new_stmt(BPF_JMP|BPF_JEQ|BPF_K);
5497 	s[i]->s.jt = NULL;	/*later*/
5498 	s[i]->s.jf = NULL;	/*later*/
5499 	s[i]->s.k = IPPROTO_AH;
5500 	if (fix3)
5501 		s[fix3]->s.jf = s[ahcheck];
5502 	fix4 = i;
5503 	i++;
5504 
5505 	/*
5506 	 * in short,
5507 	 * A = P[X];
5508 	 * X = X + (P[X + 1] + 2) * 4;
5509 	 */
5510 	/* A = X */
5511 	s[i - 1]->s.jt = s[i] = new_stmt(BPF_MISC|BPF_TXA);
5512 	i++;
5513 	/* A = P[X + packet head]; */
5514 	s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
5515 	s[i]->s.k = off_macpl + off_nl;
5516 	i++;
5517 	/* MEM[reg2] = A */
5518 	s[i] = new_stmt(BPF_ST);
5519 	s[i]->s.k = reg2;
5520 	i++;
5521 	/* A = X */
5522 	s[i - 1]->s.jt = s[i] = new_stmt(BPF_MISC|BPF_TXA);
5523 	i++;
5524 	/* A += 1 */
5525 	s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
5526 	s[i]->s.k = 1;
5527 	i++;
5528 	/* X = A */
5529 	s[i] = new_stmt(BPF_MISC|BPF_TAX);
5530 	i++;
5531 	/* A = P[X + packet head] */
5532 	s[i] = new_stmt(BPF_LD|BPF_IND|BPF_B);
5533 	s[i]->s.k = off_macpl + off_nl;
5534 	i++;
5535 	/* A += 2 */
5536 	s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
5537 	s[i]->s.k = 2;
5538 	i++;
5539 	/* A *= 4 */
5540 	s[i] = new_stmt(BPF_ALU|BPF_MUL|BPF_K);
5541 	s[i]->s.k = 4;
5542 	i++;
5543 	/* X = A; */
5544 	s[i] = new_stmt(BPF_MISC|BPF_TAX);
5545 	i++;
5546 	/* A = MEM[reg2] */
5547 	s[i] = new_stmt(BPF_LD|BPF_MEM);
5548 	s[i]->s.k = reg2;
5549 	i++;
5550 
5551 	/* goto again; (must use BPF_JA for backward jump) */
5552 	s[i] = new_stmt(BPF_JMP|BPF_JA);
5553 	s[i]->s.k = again - i - 1;
5554 	i++;
5555 
5556 	/* end: nop */
5557 	end = i;
5558 	s[i] = new_stmt(BPF_ALU|BPF_ADD|BPF_K);
5559 	s[i]->s.k = 0;
5560 	s[fix2]->s.jt = s[end];
5561 	s[fix4]->s.jf = s[end];
5562 	s[fix5]->s.jt = s[end];
5563 	i++;
5564 
5565 	/*
5566 	 * make slist chain
5567 	 */
5568 	max = i;
5569 	for (i = 0; i < max - 1; i++)
5570 		s[i]->next = s[i + 1];
5571 	s[max - 1]->next = NULL;
5572 
5573 	/*
5574 	 * emit final check
5575 	 */
5576 	b = new_block(JMP(BPF_JEQ));
5577 	b->stmts = s[1];	/*remember, s[0] is dummy*/
5578 	b->s.k = v;
5579 
5580 	free_reg(reg2);
5581 
5582 	gen_and(b0, b);
5583 	return b;
5584 #endif
5585 }
5586 
5587 static struct block *
5588 gen_check_802_11_data_frame()
5589 {
5590 	struct slist *s;
5591 	struct block *b0, *b1;
5592 
5593 	/*
5594 	 * A data frame has the 0x08 bit (b3) in the frame control field set
5595 	 * and the 0x04 bit (b2) clear.
5596 	 */
5597 	s = gen_load_a(OR_LINK, 0, BPF_B);
5598 	b0 = new_block(JMP(BPF_JSET));
5599 	b0->s.k = 0x08;
5600 	b0->stmts = s;
5601 
5602 	s = gen_load_a(OR_LINK, 0, BPF_B);
5603 	b1 = new_block(JMP(BPF_JSET));
5604 	b1->s.k = 0x04;
5605 	b1->stmts = s;
5606 	gen_not(b1);
5607 
5608 	gen_and(b1, b0);
5609 
5610 	return b0;
5611 }
5612 
5613 /*
5614  * Generate code that checks whether the packet is a packet for protocol
5615  * <proto> and whether the type field in that protocol's header has
5616  * the value <v>, e.g. if <proto> is Q_IP, it checks whether it's an
5617  * IP packet and checks the protocol number in the IP header against <v>.
5618  *
5619  * If <proto> is Q_DEFAULT, i.e. just "proto" was specified, it checks
5620  * against Q_IP and Q_IPV6.
5621  */
5622 static struct block *
5623 gen_proto(v, proto, dir)
5624 	int v;
5625 	int proto;
5626 	int dir;
5627 {
5628 	struct block *b0, *b1;
5629 
5630 	if (dir != Q_DEFAULT)
5631 		bpf_error("direction applied to 'proto'");
5632 
5633 	switch (proto) {
5634 	case Q_DEFAULT:
5635 #ifdef INET6
5636 		b0 = gen_proto(v, Q_IP, dir);
5637 		b1 = gen_proto(v, Q_IPV6, dir);
5638 		gen_or(b0, b1);
5639 		return b1;
5640 #else
5641 		/*FALLTHROUGH*/
5642 #endif
5643 	case Q_IP:
5644 		/*
5645 		 * For FDDI, RFC 1188 says that SNAP encapsulation is used,
5646 		 * not LLC encapsulation with LLCSAP_IP.
5647 		 *
5648 		 * For IEEE 802 networks - which includes 802.5 token ring
5649 		 * (which is what DLT_IEEE802 means) and 802.11 - RFC 1042
5650 		 * says that SNAP encapsulation is used, not LLC encapsulation
5651 		 * with LLCSAP_IP.
5652 		 *
5653 		 * For LLC-encapsulated ATM/"Classical IP", RFC 1483 and
5654 		 * RFC 2225 say that SNAP encapsulation is used, not LLC
5655 		 * encapsulation with LLCSAP_IP.
5656 		 *
5657 		 * So we always check for ETHERTYPE_IP.
5658 		 */
5659 		b0 = gen_linktype(ETHERTYPE_IP);
5660 #ifndef CHASE_CHAIN
5661 		b1 = gen_cmp(OR_NET, 9, BPF_B, (bpf_int32)v);
5662 #else
5663 		b1 = gen_protochain(v, Q_IP);
5664 #endif
5665 		gen_and(b0, b1);
5666 		return b1;
5667 
5668 	case Q_ISO:
5669 		switch (linktype) {
5670 
5671 		case DLT_FRELAY:
5672 			/*
5673 			 * Frame Relay packets typically have an OSI
5674 			 * NLPID at the beginning; "gen_linktype(LLCSAP_ISONS)"
5675 			 * generates code to check for all the OSI
5676 			 * NLPIDs, so calling it and then adding a check
5677 			 * for the particular NLPID for which we're
5678 			 * looking is bogus, as we can just check for
5679 			 * the NLPID.
5680 			 *
5681 			 * What we check for is the NLPID and a frame
5682 			 * control field value of UI, i.e. 0x03 followed
5683 			 * by the NLPID.
5684 			 *
5685 			 * XXX - assumes a 2-byte Frame Relay header with
5686 			 * DLCI and flags.  What if the address is longer?
5687 			 *
5688 			 * XXX - what about SNAP-encapsulated frames?
5689 			 */
5690 			return gen_cmp(OR_LINK, 2, BPF_H, (0x03<<8) | v);
5691 			/*NOTREACHED*/
5692 			break;
5693 
5694 		case DLT_C_HDLC:
5695 			/*
5696 			 * Cisco uses an Ethertype lookalike - for OSI,
5697 			 * it's 0xfefe.
5698 			 */
5699 			b0 = gen_linktype(LLCSAP_ISONS<<8 | LLCSAP_ISONS);
5700 			/* OSI in C-HDLC is stuffed with a fudge byte */
5701 			b1 = gen_cmp(OR_NET_NOSNAP, 1, BPF_B, (long)v);
5702 			gen_and(b0, b1);
5703 			return b1;
5704 
5705 		default:
5706 			b0 = gen_linktype(LLCSAP_ISONS);
5707 			b1 = gen_cmp(OR_NET_NOSNAP, 0, BPF_B, (long)v);
5708 			gen_and(b0, b1);
5709 			return b1;
5710 		}
5711 
5712 	case Q_ISIS:
5713 		b0 = gen_proto(ISO10589_ISIS, Q_ISO, Q_DEFAULT);
5714 		/*
5715 		 * 4 is the offset of the PDU type relative to the IS-IS
5716 		 * header.
5717 		 */
5718 		b1 = gen_cmp(OR_NET_NOSNAP, 4, BPF_B, (long)v);
5719 		gen_and(b0, b1);
5720 		return b1;
5721 
5722 	case Q_ARP:
5723 		bpf_error("arp does not encapsulate another protocol");
5724 		/* NOTREACHED */
5725 
5726 	case Q_RARP:
5727 		bpf_error("rarp does not encapsulate another protocol");
5728 		/* NOTREACHED */
5729 
5730 	case Q_ATALK:
5731 		bpf_error("atalk encapsulation is not specifiable");
5732 		/* NOTREACHED */
5733 
5734 	case Q_DECNET:
5735 		bpf_error("decnet encapsulation is not specifiable");
5736 		/* NOTREACHED */
5737 
5738 	case Q_SCA:
5739 		bpf_error("sca does not encapsulate another protocol");
5740 		/* NOTREACHED */
5741 
5742 	case Q_LAT:
5743 		bpf_error("lat does not encapsulate another protocol");
5744 		/* NOTREACHED */
5745 
5746 	case Q_MOPRC:
5747 		bpf_error("moprc does not encapsulate another protocol");
5748 		/* NOTREACHED */
5749 
5750 	case Q_MOPDL:
5751 		bpf_error("mopdl does not encapsulate another protocol");
5752 		/* NOTREACHED */
5753 
5754 	case Q_LINK:
5755 		return gen_linktype(v);
5756 
5757 	case Q_UDP:
5758 		bpf_error("'udp proto' is bogus");
5759 		/* NOTREACHED */
5760 
5761 	case Q_TCP:
5762 		bpf_error("'tcp proto' is bogus");
5763 		/* NOTREACHED */
5764 
5765 	case Q_SCTP:
5766 		bpf_error("'sctp proto' is bogus");
5767 		/* NOTREACHED */
5768 
5769 	case Q_ICMP:
5770 		bpf_error("'icmp proto' is bogus");
5771 		/* NOTREACHED */
5772 
5773 	case Q_IGMP:
5774 		bpf_error("'igmp proto' is bogus");
5775 		/* NOTREACHED */
5776 
5777 	case Q_IGRP:
5778 		bpf_error("'igrp proto' is bogus");
5779 		/* NOTREACHED */
5780 
5781 	case Q_PIM:
5782 		bpf_error("'pim proto' is bogus");
5783 		/* NOTREACHED */
5784 
5785 	case Q_VRRP:
5786 		bpf_error("'vrrp proto' is bogus");
5787 		/* NOTREACHED */
5788 
5789 #ifdef INET6
5790 	case Q_IPV6:
5791 		b0 = gen_linktype(ETHERTYPE_IPV6);
5792 #ifndef CHASE_CHAIN
5793 		b1 = gen_cmp(OR_NET, 6, BPF_B, (bpf_int32)v);
5794 #else
5795 		b1 = gen_protochain(v, Q_IPV6);
5796 #endif
5797 		gen_and(b0, b1);
5798 		return b1;
5799 
5800 	case Q_ICMPV6:
5801 		bpf_error("'icmp6 proto' is bogus");
5802 #endif /* INET6 */
5803 
5804 	case Q_AH:
5805 		bpf_error("'ah proto' is bogus");
5806 
5807 	case Q_ESP:
5808 		bpf_error("'ah proto' is bogus");
5809 
5810 	case Q_STP:
5811 		bpf_error("'stp proto' is bogus");
5812 
5813 	case Q_IPX:
5814 		bpf_error("'ipx proto' is bogus");
5815 
5816 	case Q_NETBEUI:
5817 		bpf_error("'netbeui proto' is bogus");
5818 
5819 	case Q_RADIO:
5820 		bpf_error("'radio proto' is bogus");
5821 
5822 	default:
5823 		abort();
5824 		/* NOTREACHED */
5825 	}
5826 	/* NOTREACHED */
5827 }
5828 
5829 struct block *
5830 gen_scode(name, q)
5831 	register const char *name;
5832 	struct qual q;
5833 {
5834 	int proto = q.proto;
5835 	int dir = q.dir;
5836 	int tproto;
5837 	u_char *eaddr;
5838 	bpf_u_int32 mask, addr;
5839 #ifndef INET6
5840 	bpf_u_int32 **alist;
5841 #else
5842 	int tproto6;
5843 	struct sockaddr_in *sin4;
5844 	struct sockaddr_in6 *sin6;
5845 	struct addrinfo *res, *res0;
5846 	struct in6_addr mask128;
5847 #endif /*INET6*/
5848 	struct block *b, *tmp;
5849 	int port, real_proto;
5850 	int port1, port2;
5851 
5852 	switch (q.addr) {
5853 
5854 	case Q_NET:
5855 		addr = pcap_nametonetaddr(name);
5856 		if (addr == 0)
5857 			bpf_error("unknown network '%s'", name);
5858 		/* Left justify network addr and calculate its network mask */
5859 		mask = 0xffffffff;
5860 		while (addr && (addr & 0xff000000) == 0) {
5861 			addr <<= 8;
5862 			mask <<= 8;
5863 		}
5864 		return gen_host(addr, mask, proto, dir, q.addr);
5865 
5866 	case Q_DEFAULT:
5867 	case Q_HOST:
5868 		if (proto == Q_LINK) {
5869 			switch (linktype) {
5870 
5871 			case DLT_EN10MB:
5872 				eaddr = pcap_ether_hostton(name);
5873 				if (eaddr == NULL)
5874 					bpf_error(
5875 					    "unknown ether host '%s'", name);
5876 				b = gen_ehostop(eaddr, dir);
5877 				free(eaddr);
5878 				return b;
5879 
5880 			case DLT_FDDI:
5881 				eaddr = pcap_ether_hostton(name);
5882 				if (eaddr == NULL)
5883 					bpf_error(
5884 					    "unknown FDDI host '%s'", name);
5885 				b = gen_fhostop(eaddr, dir);
5886 				free(eaddr);
5887 				return b;
5888 
5889 			case DLT_IEEE802:
5890 				eaddr = pcap_ether_hostton(name);
5891 				if (eaddr == NULL)
5892 					bpf_error(
5893 					    "unknown token ring host '%s'", name);
5894 				b = gen_thostop(eaddr, dir);
5895 				free(eaddr);
5896 				return b;
5897 
5898 			case DLT_IEEE802_11:
5899 			case DLT_PRISM_HEADER:
5900 			case DLT_IEEE802_11_RADIO_AVS:
5901 			case DLT_IEEE802_11_RADIO:
5902 			case DLT_PPI:
5903 				eaddr = pcap_ether_hostton(name);
5904 				if (eaddr == NULL)
5905 					bpf_error(
5906 					    "unknown 802.11 host '%s'", name);
5907 				b = gen_wlanhostop(eaddr, dir);
5908 				free(eaddr);
5909 				return b;
5910 
5911 			case DLT_IP_OVER_FC:
5912 				eaddr = pcap_ether_hostton(name);
5913 				if (eaddr == NULL)
5914 					bpf_error(
5915 					    "unknown Fibre Channel host '%s'", name);
5916 				b = gen_ipfchostop(eaddr, dir);
5917 				free(eaddr);
5918 				return b;
5919 
5920 			case DLT_SUNATM:
5921 				if (!is_lane)
5922 					break;
5923 
5924 				/*
5925 				 * Check that the packet doesn't begin
5926 				 * with an LE Control marker.  (We've
5927 				 * already generated a test for LANE.)
5928 				 */
5929 				tmp = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS,
5930 				    BPF_H, 0xFF00);
5931 				gen_not(tmp);
5932 
5933 				eaddr = pcap_ether_hostton(name);
5934 				if (eaddr == NULL)
5935 					bpf_error(
5936 					    "unknown ether host '%s'", name);
5937 				b = gen_ehostop(eaddr, dir);
5938 				gen_and(tmp, b);
5939 				free(eaddr);
5940 				return b;
5941 			}
5942 
5943 			bpf_error("only ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel supports link-level host name");
5944 		} else if (proto == Q_DECNET) {
5945 			unsigned short dn_addr = __pcap_nametodnaddr(name);
5946 			/*
5947 			 * I don't think DECNET hosts can be multihomed, so
5948 			 * there is no need to build up a list of addresses
5949 			 */
5950 			return (gen_host(dn_addr, 0, proto, dir, q.addr));
5951 		} else {
5952 #ifndef INET6
5953 			alist = pcap_nametoaddr(name);
5954 			if (alist == NULL || *alist == NULL)
5955 				bpf_error("unknown host '%s'", name);
5956 			tproto = proto;
5957 			if (off_linktype == (u_int)-1 && tproto == Q_DEFAULT)
5958 				tproto = Q_IP;
5959 			b = gen_host(**alist++, 0xffffffff, tproto, dir, q.addr);
5960 			while (*alist) {
5961 				tmp = gen_host(**alist++, 0xffffffff,
5962 					       tproto, dir, q.addr);
5963 				gen_or(b, tmp);
5964 				b = tmp;
5965 			}
5966 			return b;
5967 #else
5968 			memset(&mask128, 0xff, sizeof(mask128));
5969 			res0 = res = pcap_nametoaddrinfo(name);
5970 			if (res == NULL)
5971 				bpf_error("unknown host '%s'", name);
5972 			b = tmp = NULL;
5973 			tproto = tproto6 = proto;
5974 			if (off_linktype == -1 && tproto == Q_DEFAULT) {
5975 				tproto = Q_IP;
5976 				tproto6 = Q_IPV6;
5977 			}
5978 			for (res = res0; res; res = res->ai_next) {
5979 				switch (res->ai_family) {
5980 				case AF_INET:
5981 					if (tproto == Q_IPV6)
5982 						continue;
5983 
5984 					sin4 = (struct sockaddr_in *)
5985 						res->ai_addr;
5986 					tmp = gen_host(ntohl(sin4->sin_addr.s_addr),
5987 						0xffffffff, tproto, dir, q.addr);
5988 					break;
5989 				case AF_INET6:
5990 					if (tproto6 == Q_IP)
5991 						continue;
5992 
5993 					sin6 = (struct sockaddr_in6 *)
5994 						res->ai_addr;
5995 					tmp = gen_host6(&sin6->sin6_addr,
5996 						&mask128, tproto6, dir, q.addr);
5997 					break;
5998 				default:
5999 					continue;
6000 				}
6001 				if (b)
6002 					gen_or(b, tmp);
6003 				b = tmp;
6004 			}
6005 			freeaddrinfo(res0);
6006 			if (b == NULL) {
6007 				bpf_error("unknown host '%s'%s", name,
6008 				    (proto == Q_DEFAULT)
6009 					? ""
6010 					: " for specified address family");
6011 			}
6012 			return b;
6013 #endif /*INET6*/
6014 		}
6015 
6016 	case Q_PORT:
6017 		if (proto != Q_DEFAULT &&
6018 		    proto != Q_UDP && proto != Q_TCP && proto != Q_SCTP)
6019 			bpf_error("illegal qualifier of 'port'");
6020 		if (pcap_nametoport(name, &port, &real_proto) == 0)
6021 			bpf_error("unknown port '%s'", name);
6022 		if (proto == Q_UDP) {
6023 			if (real_proto == IPPROTO_TCP)
6024 				bpf_error("port '%s' is tcp", name);
6025 			else if (real_proto == IPPROTO_SCTP)
6026 				bpf_error("port '%s' is sctp", name);
6027 			else
6028 				/* override PROTO_UNDEF */
6029 				real_proto = IPPROTO_UDP;
6030 		}
6031 		if (proto == Q_TCP) {
6032 			if (real_proto == IPPROTO_UDP)
6033 				bpf_error("port '%s' is udp", name);
6034 
6035 			else if (real_proto == IPPROTO_SCTP)
6036 				bpf_error("port '%s' is sctp", name);
6037 			else
6038 				/* override PROTO_UNDEF */
6039 				real_proto = IPPROTO_TCP;
6040 		}
6041 		if (proto == Q_SCTP) {
6042 			if (real_proto == IPPROTO_UDP)
6043 				bpf_error("port '%s' is udp", name);
6044 
6045 			else if (real_proto == IPPROTO_TCP)
6046 				bpf_error("port '%s' is tcp", name);
6047 			else
6048 				/* override PROTO_UNDEF */
6049 				real_proto = IPPROTO_SCTP;
6050 		}
6051 #ifndef INET6
6052 		return gen_port(port, real_proto, dir);
6053 #else
6054 		b = gen_port(port, real_proto, dir);
6055 		gen_or(gen_port6(port, real_proto, dir), b);
6056 		return b;
6057 #endif /* INET6 */
6058 
6059 	case Q_PORTRANGE:
6060 		if (proto != Q_DEFAULT &&
6061 		    proto != Q_UDP && proto != Q_TCP && proto != Q_SCTP)
6062 			bpf_error("illegal qualifier of 'portrange'");
6063 		if (pcap_nametoportrange(name, &port1, &port2, &real_proto) == 0)
6064 			bpf_error("unknown port in range '%s'", name);
6065 		if (proto == Q_UDP) {
6066 			if (real_proto == IPPROTO_TCP)
6067 				bpf_error("port in range '%s' is tcp", name);
6068 			else if (real_proto == IPPROTO_SCTP)
6069 				bpf_error("port in range '%s' is sctp", name);
6070 			else
6071 				/* override PROTO_UNDEF */
6072 				real_proto = IPPROTO_UDP;
6073 		}
6074 		if (proto == Q_TCP) {
6075 			if (real_proto == IPPROTO_UDP)
6076 				bpf_error("port in range '%s' is udp", name);
6077 			else if (real_proto == IPPROTO_SCTP)
6078 				bpf_error("port in range '%s' is sctp", name);
6079 			else
6080 				/* override PROTO_UNDEF */
6081 				real_proto = IPPROTO_TCP;
6082 		}
6083 		if (proto == Q_SCTP) {
6084 			if (real_proto == IPPROTO_UDP)
6085 				bpf_error("port in range '%s' is udp", name);
6086 			else if (real_proto == IPPROTO_TCP)
6087 				bpf_error("port in range '%s' is tcp", name);
6088 			else
6089 				/* override PROTO_UNDEF */
6090 				real_proto = IPPROTO_SCTP;
6091 		}
6092 #ifndef INET6
6093 		return gen_portrange(port1, port2, real_proto, dir);
6094 #else
6095 		b = gen_portrange(port1, port2, real_proto, dir);
6096 		gen_or(gen_portrange6(port1, port2, real_proto, dir), b);
6097 		return b;
6098 #endif /* INET6 */
6099 
6100 	case Q_GATEWAY:
6101 #ifndef INET6
6102 		eaddr = pcap_ether_hostton(name);
6103 		if (eaddr == NULL)
6104 			bpf_error("unknown ether host: %s", name);
6105 
6106 		alist = pcap_nametoaddr(name);
6107 		if (alist == NULL || *alist == NULL)
6108 			bpf_error("unknown host '%s'", name);
6109 		b = gen_gateway(eaddr, alist, proto, dir);
6110 		free(eaddr);
6111 		return b;
6112 #else
6113 		bpf_error("'gateway' not supported in this configuration");
6114 #endif /*INET6*/
6115 
6116 	case Q_PROTO:
6117 		real_proto = lookup_proto(name, proto);
6118 		if (real_proto >= 0)
6119 			return gen_proto(real_proto, proto, dir);
6120 		else
6121 			bpf_error("unknown protocol: %s", name);
6122 
6123 	case Q_PROTOCHAIN:
6124 		real_proto = lookup_proto(name, proto);
6125 		if (real_proto >= 0)
6126 			return gen_protochain(real_proto, proto, dir);
6127 		else
6128 			bpf_error("unknown protocol: %s", name);
6129 
6130 	case Q_UNDEF:
6131 		syntax();
6132 		/* NOTREACHED */
6133 	}
6134 	abort();
6135 	/* NOTREACHED */
6136 }
6137 
6138 struct block *
6139 gen_mcode(s1, s2, masklen, q)
6140 	register const char *s1, *s2;
6141 	register int masklen;
6142 	struct qual q;
6143 {
6144 	register int nlen, mlen;
6145 	bpf_u_int32 n, m;
6146 
6147 	nlen = __pcap_atoin(s1, &n);
6148 	/* Promote short ipaddr */
6149 	n <<= 32 - nlen;
6150 
6151 	if (s2 != NULL) {
6152 		mlen = __pcap_atoin(s2, &m);
6153 		/* Promote short ipaddr */
6154 		m <<= 32 - mlen;
6155 		if ((n & ~m) != 0)
6156 			bpf_error("non-network bits set in \"%s mask %s\"",
6157 			    s1, s2);
6158 	} else {
6159 		/* Convert mask len to mask */
6160 		if (masklen > 32)
6161 			bpf_error("mask length must be <= 32");
6162 		if (masklen == 0) {
6163 			/*
6164 			 * X << 32 is not guaranteed by C to be 0; it's
6165 			 * undefined.
6166 			 */
6167 			m = 0;
6168 		} else
6169 			m = 0xffffffff << (32 - masklen);
6170 		if ((n & ~m) != 0)
6171 			bpf_error("non-network bits set in \"%s/%d\"",
6172 			    s1, masklen);
6173 	}
6174 
6175 	switch (q.addr) {
6176 
6177 	case Q_NET:
6178 		return gen_host(n, m, q.proto, q.dir, q.addr);
6179 
6180 	default:
6181 		bpf_error("Mask syntax for networks only");
6182 		/* NOTREACHED */
6183 	}
6184 	/* NOTREACHED */
6185 	return NULL;
6186 }
6187 
6188 struct block *
6189 gen_ncode(s, v, q)
6190 	register const char *s;
6191 	bpf_u_int32 v;
6192 	struct qual q;
6193 {
6194 	bpf_u_int32 mask;
6195 	int proto = q.proto;
6196 	int dir = q.dir;
6197 	register int vlen;
6198 
6199 	if (s == NULL)
6200 		vlen = 32;
6201 	else if (q.proto == Q_DECNET)
6202 		vlen = __pcap_atodn(s, &v);
6203 	else
6204 		vlen = __pcap_atoin(s, &v);
6205 
6206 	switch (q.addr) {
6207 
6208 	case Q_DEFAULT:
6209 	case Q_HOST:
6210 	case Q_NET:
6211 		if (proto == Q_DECNET)
6212 			return gen_host(v, 0, proto, dir, q.addr);
6213 		else if (proto == Q_LINK) {
6214 			bpf_error("illegal link layer address");
6215 		} else {
6216 			mask = 0xffffffff;
6217 			if (s == NULL && q.addr == Q_NET) {
6218 				/* Promote short net number */
6219 				while (v && (v & 0xff000000) == 0) {
6220 					v <<= 8;
6221 					mask <<= 8;
6222 				}
6223 			} else {
6224 				/* Promote short ipaddr */
6225 				v <<= 32 - vlen;
6226 				mask <<= 32 - vlen;
6227 			}
6228 			return gen_host(v, mask, proto, dir, q.addr);
6229 		}
6230 
6231 	case Q_PORT:
6232 		if (proto == Q_UDP)
6233 			proto = IPPROTO_UDP;
6234 		else if (proto == Q_TCP)
6235 			proto = IPPROTO_TCP;
6236 		else if (proto == Q_SCTP)
6237 			proto = IPPROTO_SCTP;
6238 		else if (proto == Q_DEFAULT)
6239 			proto = PROTO_UNDEF;
6240 		else
6241 			bpf_error("illegal qualifier of 'port'");
6242 
6243 #ifndef INET6
6244 		return gen_port((int)v, proto, dir);
6245 #else
6246 	    {
6247 		struct block *b;
6248 		b = gen_port((int)v, proto, dir);
6249 		gen_or(gen_port6((int)v, proto, dir), b);
6250 		return b;
6251 	    }
6252 #endif /* INET6 */
6253 
6254 	case Q_PORTRANGE:
6255 		if (proto == Q_UDP)
6256 			proto = IPPROTO_UDP;
6257 		else if (proto == Q_TCP)
6258 			proto = IPPROTO_TCP;
6259 		else if (proto == Q_SCTP)
6260 			proto = IPPROTO_SCTP;
6261 		else if (proto == Q_DEFAULT)
6262 			proto = PROTO_UNDEF;
6263 		else
6264 			bpf_error("illegal qualifier of 'portrange'");
6265 
6266 #ifndef INET6
6267 		return gen_portrange((int)v, (int)v, proto, dir);
6268 #else
6269 	    {
6270 		struct block *b;
6271 		b = gen_portrange((int)v, (int)v, proto, dir);
6272 		gen_or(gen_portrange6((int)v, (int)v, proto, dir), b);
6273 		return b;
6274 	    }
6275 #endif /* INET6 */
6276 
6277 	case Q_GATEWAY:
6278 		bpf_error("'gateway' requires a name");
6279 		/* NOTREACHED */
6280 
6281 	case Q_PROTO:
6282 		return gen_proto((int)v, proto, dir);
6283 
6284 	case Q_PROTOCHAIN:
6285 		return gen_protochain((int)v, proto, dir);
6286 
6287 	case Q_UNDEF:
6288 		syntax();
6289 		/* NOTREACHED */
6290 
6291 	default:
6292 		abort();
6293 		/* NOTREACHED */
6294 	}
6295 	/* NOTREACHED */
6296 }
6297 
6298 #ifdef INET6
6299 struct block *
6300 gen_mcode6(s1, s2, masklen, q)
6301 	register const char *s1, *s2;
6302 	register int masklen;
6303 	struct qual q;
6304 {
6305 	struct addrinfo *res;
6306 	struct in6_addr *addr;
6307 	struct in6_addr mask;
6308 	struct block *b;
6309 	u_int32_t *a, *m;
6310 
6311 	if (s2)
6312 		bpf_error("no mask %s supported", s2);
6313 
6314 	res = pcap_nametoaddrinfo(s1);
6315 	if (!res)
6316 		bpf_error("invalid ip6 address %s", s1);
6317 	if (res->ai_next)
6318 		bpf_error("%s resolved to multiple address", s1);
6319 	addr = &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr;
6320 
6321 	if (sizeof(mask) * 8 < masklen)
6322 		bpf_error("mask length must be <= %u", (unsigned int)(sizeof(mask) * 8));
6323 	memset(&mask, 0, sizeof(mask));
6324 	memset(&mask, 0xff, masklen / 8);
6325 	if (masklen % 8) {
6326 		mask.s6_addr[masklen / 8] =
6327 			(0xff << (8 - masklen % 8)) & 0xff;
6328 	}
6329 
6330 	a = (u_int32_t *)addr;
6331 	m = (u_int32_t *)&mask;
6332 	if ((a[0] & ~m[0]) || (a[1] & ~m[1])
6333 	 || (a[2] & ~m[2]) || (a[3] & ~m[3])) {
6334 		bpf_error("non-network bits set in \"%s/%d\"", s1, masklen);
6335 	}
6336 
6337 	switch (q.addr) {
6338 
6339 	case Q_DEFAULT:
6340 	case Q_HOST:
6341 		if (masklen != 128)
6342 			bpf_error("Mask syntax for networks only");
6343 		/* FALLTHROUGH */
6344 
6345 	case Q_NET:
6346 		b = gen_host6(addr, &mask, q.proto, q.dir, q.addr);
6347 		freeaddrinfo(res);
6348 		return b;
6349 
6350 	default:
6351 		bpf_error("invalid qualifier against IPv6 address");
6352 		/* NOTREACHED */
6353 	}
6354 	return NULL;
6355 }
6356 #endif /*INET6*/
6357 
6358 struct block *
6359 gen_ecode(eaddr, q)
6360 	register const u_char *eaddr;
6361 	struct qual q;
6362 {
6363 	struct block *b, *tmp;
6364 
6365 	if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) {
6366 		switch (linktype) {
6367 		case DLT_EN10MB:
6368 			return gen_ehostop(eaddr, (int)q.dir);
6369 		case DLT_FDDI:
6370 			return gen_fhostop(eaddr, (int)q.dir);
6371 		case DLT_IEEE802:
6372 			return gen_thostop(eaddr, (int)q.dir);
6373 		case DLT_IEEE802_11:
6374 		case DLT_PRISM_HEADER:
6375 		case DLT_IEEE802_11_RADIO_AVS:
6376 		case DLT_IEEE802_11_RADIO:
6377 		case DLT_PPI:
6378 			return gen_wlanhostop(eaddr, (int)q.dir);
6379 		case DLT_SUNATM:
6380 			if (is_lane) {
6381 				/*
6382 				 * Check that the packet doesn't begin with an
6383 				 * LE Control marker.  (We've already generated
6384 				 * a test for LANE.)
6385 				 */
6386 				tmp = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS, BPF_H,
6387 					0xFF00);
6388 				gen_not(tmp);
6389 
6390 				/*
6391 				 * Now check the MAC address.
6392 				 */
6393 				b = gen_ehostop(eaddr, (int)q.dir);
6394 				gen_and(tmp, b);
6395 				return b;
6396 			}
6397 			break;
6398 		case DLT_IP_OVER_FC:
6399 			return gen_ipfchostop(eaddr, (int)q.dir);
6400 		default:
6401 			bpf_error("ethernet addresses supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
6402 			break;
6403 		}
6404 	}
6405 	bpf_error("ethernet address used in non-ether expression");
6406 	/* NOTREACHED */
6407 	return NULL;
6408 }
6409 
6410 void
6411 sappend(s0, s1)
6412 	struct slist *s0, *s1;
6413 {
6414 	/*
6415 	 * This is definitely not the best way to do this, but the
6416 	 * lists will rarely get long.
6417 	 */
6418 	while (s0->next)
6419 		s0 = s0->next;
6420 	s0->next = s1;
6421 }
6422 
6423 static struct slist *
6424 xfer_to_x(a)
6425 	struct arth *a;
6426 {
6427 	struct slist *s;
6428 
6429 	s = new_stmt(BPF_LDX|BPF_MEM);
6430 	s->s.k = a->regno;
6431 	return s;
6432 }
6433 
6434 static struct slist *
6435 xfer_to_a(a)
6436 	struct arth *a;
6437 {
6438 	struct slist *s;
6439 
6440 	s = new_stmt(BPF_LD|BPF_MEM);
6441 	s->s.k = a->regno;
6442 	return s;
6443 }
6444 
6445 /*
6446  * Modify "index" to use the value stored into its register as an
6447  * offset relative to the beginning of the header for the protocol
6448  * "proto", and allocate a register and put an item "size" bytes long
6449  * (1, 2, or 4) at that offset into that register, making it the register
6450  * for "index".
6451  */
6452 struct arth *
6453 gen_load(proto, inst, size)
6454 	int proto;
6455 	struct arth *inst;
6456 	int size;
6457 {
6458 	struct slist *s, *tmp;
6459 	struct block *b;
6460 	int regno = alloc_reg();
6461 
6462 	free_reg(inst->regno);
6463 	switch (size) {
6464 
6465 	default:
6466 		bpf_error("data size must be 1, 2, or 4");
6467 
6468 	case 1:
6469 		size = BPF_B;
6470 		break;
6471 
6472 	case 2:
6473 		size = BPF_H;
6474 		break;
6475 
6476 	case 4:
6477 		size = BPF_W;
6478 		break;
6479 	}
6480 	switch (proto) {
6481 	default:
6482 		bpf_error("unsupported index operation");
6483 
6484 	case Q_RADIO:
6485 		/*
6486 		 * The offset is relative to the beginning of the packet
6487 		 * data, if we have a radio header.  (If we don't, this
6488 		 * is an error.)
6489 		 */
6490 		if (linktype != DLT_IEEE802_11_RADIO_AVS &&
6491 		    linktype != DLT_IEEE802_11_RADIO &&
6492 		    linktype != DLT_PRISM_HEADER)
6493 			bpf_error("radio information not present in capture");
6494 
6495 		/*
6496 		 * Load into the X register the offset computed into the
6497 		 * register specifed by "index".
6498 		 */
6499 		s = xfer_to_x(inst);
6500 
6501 		/*
6502 		 * Load the item at that offset.
6503 		 */
6504 		tmp = new_stmt(BPF_LD|BPF_IND|size);
6505 		sappend(s, tmp);
6506 		sappend(inst->s, s);
6507 		break;
6508 
6509 	case Q_LINK:
6510 		/*
6511 		 * The offset is relative to the beginning of
6512 		 * the link-layer header.
6513 		 *
6514 		 * XXX - what about ATM LANE?  Should the index be
6515 		 * relative to the beginning of the AAL5 frame, so
6516 		 * that 0 refers to the beginning of the LE Control
6517 		 * field, or relative to the beginning of the LAN
6518 		 * frame, so that 0 refers, for Ethernet LANE, to
6519 		 * the beginning of the destination address?
6520 		 */
6521 		s = gen_llprefixlen();
6522 
6523 		/*
6524 		 * If "s" is non-null, it has code to arrange that the
6525 		 * X register contains the length of the prefix preceding
6526 		 * the link-layer header.  Add to it the offset computed
6527 		 * into the register specified by "index", and move that
6528 		 * into the X register.  Otherwise, just load into the X
6529 		 * register the offset computed into the register specifed
6530 		 * by "index".
6531 		 */
6532 		if (s != NULL) {
6533 			sappend(s, xfer_to_a(inst));
6534 			sappend(s, new_stmt(BPF_ALU|BPF_ADD|BPF_X));
6535 			sappend(s, new_stmt(BPF_MISC|BPF_TAX));
6536 		} else
6537 			s = xfer_to_x(inst);
6538 
6539 		/*
6540 		 * Load the item at the sum of the offset we've put in the
6541 		 * X register and the offset of the start of the link
6542 		 * layer header (which is 0 if the radio header is
6543 		 * variable-length; that header length is what we put
6544 		 * into the X register and then added to the index).
6545 		 */
6546 		tmp = new_stmt(BPF_LD|BPF_IND|size);
6547 		tmp->s.k = off_ll;
6548 		sappend(s, tmp);
6549 		sappend(inst->s, s);
6550 		break;
6551 
6552 	case Q_IP:
6553 	case Q_ARP:
6554 	case Q_RARP:
6555 	case Q_ATALK:
6556 	case Q_DECNET:
6557 	case Q_SCA:
6558 	case Q_LAT:
6559 	case Q_MOPRC:
6560 	case Q_MOPDL:
6561 #ifdef INET6
6562 	case Q_IPV6:
6563 #endif
6564 		/*
6565 		 * The offset is relative to the beginning of
6566 		 * the network-layer header.
6567 		 * XXX - are there any cases where we want
6568 		 * off_nl_nosnap?
6569 		 */
6570 		s = gen_off_macpl();
6571 
6572 		/*
6573 		 * If "s" is non-null, it has code to arrange that the
6574 		 * X register contains the offset of the MAC-layer
6575 		 * payload.  Add to it the offset computed into the
6576 		 * register specified by "index", and move that into
6577 		 * the X register.  Otherwise, just load into the X
6578 		 * register the offset computed into the register specifed
6579 		 * by "index".
6580 		 */
6581 		if (s != NULL) {
6582 			sappend(s, xfer_to_a(inst));
6583 			sappend(s, new_stmt(BPF_ALU|BPF_ADD|BPF_X));
6584 			sappend(s, new_stmt(BPF_MISC|BPF_TAX));
6585 		} else
6586 			s = xfer_to_x(inst);
6587 
6588 		/*
6589 		 * Load the item at the sum of the offset we've put in the
6590 		 * X register, the offset of the start of the network
6591 		 * layer header from the beginning of the MAC-layer
6592 		 * payload, and the purported offset of the start of the
6593 		 * MAC-layer payload (which might be 0 if there's a
6594 		 * variable-length prefix before the link-layer header
6595 		 * or the link-layer header itself is variable-length;
6596 		 * the variable-length offset of the start of the
6597 		 * MAC-layer payload is what we put into the X register
6598 		 * and then added to the index).
6599 		 */
6600 		tmp = new_stmt(BPF_LD|BPF_IND|size);
6601 		tmp->s.k = off_macpl + off_nl;
6602 		sappend(s, tmp);
6603 		sappend(inst->s, s);
6604 
6605 		/*
6606 		 * Do the computation only if the packet contains
6607 		 * the protocol in question.
6608 		 */
6609 		b = gen_proto_abbrev(proto);
6610 		if (inst->b)
6611 			gen_and(inst->b, b);
6612 		inst->b = b;
6613 		break;
6614 
6615 	case Q_SCTP:
6616 	case Q_TCP:
6617 	case Q_UDP:
6618 	case Q_ICMP:
6619 	case Q_IGMP:
6620 	case Q_IGRP:
6621 	case Q_PIM:
6622 	case Q_VRRP:
6623 		/*
6624 		 * The offset is relative to the beginning of
6625 		 * the transport-layer header.
6626 		 *
6627 		 * Load the X register with the length of the IPv4 header
6628 		 * (plus the offset of the link-layer header, if it's
6629 		 * a variable-length header), in bytes.
6630 		 *
6631 		 * XXX - are there any cases where we want
6632 		 * off_nl_nosnap?
6633 		 * XXX - we should, if we're built with
6634 		 * IPv6 support, generate code to load either
6635 		 * IPv4, IPv6, or both, as appropriate.
6636 		 */
6637 		s = gen_loadx_iphdrlen();
6638 
6639 		/*
6640 		 * The X register now contains the sum of the length
6641 		 * of any variable-length header preceding the link-layer
6642 		 * header, any variable-length link-layer header, and the
6643 		 * length of the network-layer header.
6644 		 *
6645 		 * Load into the A register the offset relative to
6646 		 * the beginning of the transport layer header,
6647 		 * add the X register to that, move that to the
6648 		 * X register, and load with an offset from the
6649 		 * X register equal to the offset of the network
6650 		 * layer header relative to the beginning of
6651 		 * the MAC-layer payload plus the fixed-length
6652 		 * portion of the offset of the MAC-layer payload
6653 		 * from the beginning of the raw packet data.
6654 		 */
6655 		sappend(s, xfer_to_a(inst));
6656 		sappend(s, new_stmt(BPF_ALU|BPF_ADD|BPF_X));
6657 		sappend(s, new_stmt(BPF_MISC|BPF_TAX));
6658 		sappend(s, tmp = new_stmt(BPF_LD|BPF_IND|size));
6659 		tmp->s.k = off_macpl + off_nl;
6660 		sappend(inst->s, s);
6661 
6662 		/*
6663 		 * Do the computation only if the packet contains
6664 		 * the protocol in question - which is true only
6665 		 * if this is an IP datagram and is the first or
6666 		 * only fragment of that datagram.
6667 		 */
6668 		gen_and(gen_proto_abbrev(proto), b = gen_ipfrag());
6669 		if (inst->b)
6670 			gen_and(inst->b, b);
6671 #ifdef INET6
6672 		gen_and(gen_proto_abbrev(Q_IP), b);
6673 #endif
6674 		inst->b = b;
6675 		break;
6676 #ifdef INET6
6677 	case Q_ICMPV6:
6678 		bpf_error("IPv6 upper-layer protocol is not supported by proto[x]");
6679 		/*NOTREACHED*/
6680 #endif
6681 	}
6682 	inst->regno = regno;
6683 	s = new_stmt(BPF_ST);
6684 	s->s.k = regno;
6685 	sappend(inst->s, s);
6686 
6687 	return inst;
6688 }
6689 
6690 struct block *
6691 gen_relation(code, a0, a1, reversed)
6692 	int code;
6693 	struct arth *a0, *a1;
6694 	int reversed;
6695 {
6696 	struct slist *s0, *s1, *s2;
6697 	struct block *b, *tmp;
6698 
6699 	s0 = xfer_to_x(a1);
6700 	s1 = xfer_to_a(a0);
6701 	if (code == BPF_JEQ) {
6702 		s2 = new_stmt(BPF_ALU|BPF_SUB|BPF_X);
6703 		b = new_block(JMP(code));
6704 		sappend(s1, s2);
6705 	}
6706 	else
6707 		b = new_block(BPF_JMP|code|BPF_X);
6708 	if (reversed)
6709 		gen_not(b);
6710 
6711 	sappend(s0, s1);
6712 	sappend(a1->s, s0);
6713 	sappend(a0->s, a1->s);
6714 
6715 	b->stmts = a0->s;
6716 
6717 	free_reg(a0->regno);
6718 	free_reg(a1->regno);
6719 
6720 	/* 'and' together protocol checks */
6721 	if (a0->b) {
6722 		if (a1->b) {
6723 			gen_and(a0->b, tmp = a1->b);
6724 		}
6725 		else
6726 			tmp = a0->b;
6727 	} else
6728 		tmp = a1->b;
6729 
6730 	if (tmp)
6731 		gen_and(tmp, b);
6732 
6733 	return b;
6734 }
6735 
6736 struct arth *
6737 gen_loadlen()
6738 {
6739 	int regno = alloc_reg();
6740 	struct arth *a = (struct arth *)newchunk(sizeof(*a));
6741 	struct slist *s;
6742 
6743 	s = new_stmt(BPF_LD|BPF_LEN);
6744 	s->next = new_stmt(BPF_ST);
6745 	s->next->s.k = regno;
6746 	a->s = s;
6747 	a->regno = regno;
6748 
6749 	return a;
6750 }
6751 
6752 struct arth *
6753 gen_loadi(val)
6754 	int val;
6755 {
6756 	struct arth *a;
6757 	struct slist *s;
6758 	int reg;
6759 
6760 	a = (struct arth *)newchunk(sizeof(*a));
6761 
6762 	reg = alloc_reg();
6763 
6764 	s = new_stmt(BPF_LD|BPF_IMM);
6765 	s->s.k = val;
6766 	s->next = new_stmt(BPF_ST);
6767 	s->next->s.k = reg;
6768 	a->s = s;
6769 	a->regno = reg;
6770 
6771 	return a;
6772 }
6773 
6774 struct arth *
6775 gen_neg(a)
6776 	struct arth *a;
6777 {
6778 	struct slist *s;
6779 
6780 	s = xfer_to_a(a);
6781 	sappend(a->s, s);
6782 	s = new_stmt(BPF_ALU|BPF_NEG);
6783 	s->s.k = 0;
6784 	sappend(a->s, s);
6785 	s = new_stmt(BPF_ST);
6786 	s->s.k = a->regno;
6787 	sappend(a->s, s);
6788 
6789 	return a;
6790 }
6791 
6792 struct arth *
6793 gen_arth(code, a0, a1)
6794 	int code;
6795 	struct arth *a0, *a1;
6796 {
6797 	struct slist *s0, *s1, *s2;
6798 
6799 	s0 = xfer_to_x(a1);
6800 	s1 = xfer_to_a(a0);
6801 	s2 = new_stmt(BPF_ALU|BPF_X|code);
6802 
6803 	sappend(s1, s2);
6804 	sappend(s0, s1);
6805 	sappend(a1->s, s0);
6806 	sappend(a0->s, a1->s);
6807 
6808 	free_reg(a0->regno);
6809 	free_reg(a1->regno);
6810 
6811 	s0 = new_stmt(BPF_ST);
6812 	a0->regno = s0->s.k = alloc_reg();
6813 	sappend(a0->s, s0);
6814 
6815 	return a0;
6816 }
6817 
6818 /*
6819  * Here we handle simple allocation of the scratch registers.
6820  * If too many registers are alloc'd, the allocator punts.
6821  */
6822 static int regused[BPF_MEMWORDS];
6823 static int curreg;
6824 
6825 /*
6826  * Initialize the table of used registers and the current register.
6827  */
6828 static void
6829 init_regs()
6830 {
6831 	curreg = 0;
6832 	memset(regused, 0, sizeof regused);
6833 }
6834 
6835 /*
6836  * Return the next free register.
6837  */
6838 static int
6839 alloc_reg()
6840 {
6841 	int n = BPF_MEMWORDS;
6842 
6843 	while (--n >= 0) {
6844 		if (regused[curreg])
6845 			curreg = (curreg + 1) % BPF_MEMWORDS;
6846 		else {
6847 			regused[curreg] = 1;
6848 			return curreg;
6849 		}
6850 	}
6851 	bpf_error("too many registers needed to evaluate expression");
6852 	/* NOTREACHED */
6853 	return 0;
6854 }
6855 
6856 /*
6857  * Return a register to the table so it can
6858  * be used later.
6859  */
6860 static void
6861 free_reg(n)
6862 	int n;
6863 {
6864 	regused[n] = 0;
6865 }
6866 
6867 static struct block *
6868 gen_len(jmp, n)
6869 	int jmp, n;
6870 {
6871 	struct slist *s;
6872 	struct block *b;
6873 
6874 	s = new_stmt(BPF_LD|BPF_LEN);
6875 	b = new_block(JMP(jmp));
6876 	b->stmts = s;
6877 	b->s.k = n;
6878 
6879 	return b;
6880 }
6881 
6882 struct block *
6883 gen_greater(n)
6884 	int n;
6885 {
6886 	return gen_len(BPF_JGE, n);
6887 }
6888 
6889 /*
6890  * Actually, this is less than or equal.
6891  */
6892 struct block *
6893 gen_less(n)
6894 	int n;
6895 {
6896 	struct block *b;
6897 
6898 	b = gen_len(BPF_JGT, n);
6899 	gen_not(b);
6900 
6901 	return b;
6902 }
6903 
6904 /*
6905  * This is for "byte {idx} {op} {val}"; "idx" is treated as relative to
6906  * the beginning of the link-layer header.
6907  * XXX - that means you can't test values in the radiotap header, but
6908  * as that header is difficult if not impossible to parse generally
6909  * without a loop, that might not be a severe problem.  A new keyword
6910  * "radio" could be added for that, although what you'd really want
6911  * would be a way of testing particular radio header values, which
6912  * would generate code appropriate to the radio header in question.
6913  */
6914 struct block *
6915 gen_byteop(op, idx, val)
6916 	int op, idx, val;
6917 {
6918 	struct block *b;
6919 	struct slist *s;
6920 
6921 	switch (op) {
6922 	default:
6923 		abort();
6924 
6925 	case '=':
6926 		return gen_cmp(OR_LINK, (u_int)idx, BPF_B, (bpf_int32)val);
6927 
6928 	case '<':
6929 		b = gen_cmp_lt(OR_LINK, (u_int)idx, BPF_B, (bpf_int32)val);
6930 		return b;
6931 
6932 	case '>':
6933 		b = gen_cmp_gt(OR_LINK, (u_int)idx, BPF_B, (bpf_int32)val);
6934 		return b;
6935 
6936 	case '|':
6937 		s = new_stmt(BPF_ALU|BPF_OR|BPF_K);
6938 		break;
6939 
6940 	case '&':
6941 		s = new_stmt(BPF_ALU|BPF_AND|BPF_K);
6942 		break;
6943 	}
6944 	s->s.k = val;
6945 	b = new_block(JMP(BPF_JEQ));
6946 	b->stmts = s;
6947 	gen_not(b);
6948 
6949 	return b;
6950 }
6951 
6952 static u_char abroadcast[] = { 0x0 };
6953 
6954 struct block *
6955 gen_broadcast(proto)
6956 	int proto;
6957 {
6958 	bpf_u_int32 hostmask;
6959 	struct block *b0, *b1, *b2;
6960 	static u_char ebroadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
6961 
6962 	switch (proto) {
6963 
6964 	case Q_DEFAULT:
6965 	case Q_LINK:
6966 		switch (linktype) {
6967 		case DLT_ARCNET:
6968 		case DLT_ARCNET_LINUX:
6969 			return gen_ahostop(abroadcast, Q_DST);
6970 		case DLT_EN10MB:
6971 			return gen_ehostop(ebroadcast, Q_DST);
6972 		case DLT_FDDI:
6973 			return gen_fhostop(ebroadcast, Q_DST);
6974 		case DLT_IEEE802:
6975 			return gen_thostop(ebroadcast, Q_DST);
6976 		case DLT_IEEE802_11:
6977 		case DLT_PRISM_HEADER:
6978 		case DLT_IEEE802_11_RADIO_AVS:
6979 		case DLT_IEEE802_11_RADIO:
6980 		case DLT_PPI:
6981 			return gen_wlanhostop(ebroadcast, Q_DST);
6982 		case DLT_IP_OVER_FC:
6983 			return gen_ipfchostop(ebroadcast, Q_DST);
6984 		case DLT_SUNATM:
6985 			if (is_lane) {
6986 				/*
6987 				 * Check that the packet doesn't begin with an
6988 				 * LE Control marker.  (We've already generated
6989 				 * a test for LANE.)
6990 				 */
6991 				b1 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS,
6992 				    BPF_H, 0xFF00);
6993 				gen_not(b1);
6994 
6995 				/*
6996 				 * Now check the MAC address.
6997 				 */
6998 				b0 = gen_ehostop(ebroadcast, Q_DST);
6999 				gen_and(b1, b0);
7000 				return b0;
7001 			}
7002 			break;
7003 		default:
7004 			bpf_error("not a broadcast link");
7005 		}
7006 		break;
7007 
7008 	case Q_IP:
7009 		b0 = gen_linktype(ETHERTYPE_IP);
7010 		hostmask = ~netmask;
7011 		b1 = gen_mcmp(OR_NET, 16, BPF_W, (bpf_int32)0, hostmask);
7012 		b2 = gen_mcmp(OR_NET, 16, BPF_W,
7013 			      (bpf_int32)(~0 & hostmask), hostmask);
7014 		gen_or(b1, b2);
7015 		gen_and(b0, b2);
7016 		return b2;
7017 	}
7018 	bpf_error("only link-layer/IP broadcast filters supported");
7019 	/* NOTREACHED */
7020 	return NULL;
7021 }
7022 
7023 /*
7024  * Generate code to test the low-order bit of a MAC address (that's
7025  * the bottom bit of the *first* byte).
7026  */
7027 static struct block *
7028 gen_mac_multicast(offset)
7029 	int offset;
7030 {
7031 	register struct block *b0;
7032 	register struct slist *s;
7033 
7034 	/* link[offset] & 1 != 0 */
7035 	s = gen_load_a(OR_LINK, offset, BPF_B);
7036 	b0 = new_block(JMP(BPF_JSET));
7037 	b0->s.k = 1;
7038 	b0->stmts = s;
7039 	return b0;
7040 }
7041 
7042 struct block *
7043 gen_multicast(proto)
7044 	int proto;
7045 {
7046 	register struct block *b0, *b1, *b2;
7047 	register struct slist *s;
7048 
7049 	switch (proto) {
7050 
7051 	case Q_DEFAULT:
7052 	case Q_LINK:
7053 		switch (linktype) {
7054 		case DLT_ARCNET:
7055 		case DLT_ARCNET_LINUX:
7056 			/* all ARCnet multicasts use the same address */
7057 			return gen_ahostop(abroadcast, Q_DST);
7058 		case DLT_EN10MB:
7059 			/* ether[0] & 1 != 0 */
7060 			return gen_mac_multicast(0);
7061 		case DLT_FDDI:
7062 			/*
7063 			 * XXX TEST THIS: MIGHT NOT PORT PROPERLY XXX
7064 			 *
7065 			 * XXX - was that referring to bit-order issues?
7066 			 */
7067 			/* fddi[1] & 1 != 0 */
7068 			return gen_mac_multicast(1);
7069 		case DLT_IEEE802:
7070 			/* tr[2] & 1 != 0 */
7071 			return gen_mac_multicast(2);
7072 		case DLT_IEEE802_11:
7073 		case DLT_PRISM_HEADER:
7074 		case DLT_IEEE802_11_RADIO_AVS:
7075 		case DLT_IEEE802_11_RADIO:
7076 		case DLT_PPI:
7077 			/*
7078 			 * Oh, yuk.
7079 			 *
7080 			 *	For control frames, there is no DA.
7081 			 *
7082 			 *	For management frames, DA is at an
7083 			 *	offset of 4 from the beginning of
7084 			 *	the packet.
7085 			 *
7086 			 *	For data frames, DA is at an offset
7087 			 *	of 4 from the beginning of the packet
7088 			 *	if To DS is clear and at an offset of
7089 			 *	16 from the beginning of the packet
7090 			 *	if To DS is set.
7091 			 */
7092 
7093 			/*
7094 			 * Generate the tests to be done for data frames.
7095 			 *
7096 			 * First, check for To DS set, i.e. "link[1] & 0x01".
7097 			 */
7098 			s = gen_load_a(OR_LINK, 1, BPF_B);
7099 			b1 = new_block(JMP(BPF_JSET));
7100 			b1->s.k = 0x01;	/* To DS */
7101 			b1->stmts = s;
7102 
7103 			/*
7104 			 * If To DS is set, the DA is at 16.
7105 			 */
7106 			b0 = gen_mac_multicast(16);
7107 			gen_and(b1, b0);
7108 
7109 			/*
7110 			 * Now, check for To DS not set, i.e. check
7111 			 * "!(link[1] & 0x01)".
7112 			 */
7113 			s = gen_load_a(OR_LINK, 1, BPF_B);
7114 			b2 = new_block(JMP(BPF_JSET));
7115 			b2->s.k = 0x01;	/* To DS */
7116 			b2->stmts = s;
7117 			gen_not(b2);
7118 
7119 			/*
7120 			 * If To DS is not set, the DA is at 4.
7121 			 */
7122 			b1 = gen_mac_multicast(4);
7123 			gen_and(b2, b1);
7124 
7125 			/*
7126 			 * Now OR together the last two checks.  That gives
7127 			 * the complete set of checks for data frames.
7128 			 */
7129 			gen_or(b1, b0);
7130 
7131 			/*
7132 			 * Now check for a data frame.
7133 			 * I.e, check "link[0] & 0x08".
7134 			 */
7135 			s = gen_load_a(OR_LINK, 0, BPF_B);
7136 			b1 = new_block(JMP(BPF_JSET));
7137 			b1->s.k = 0x08;
7138 			b1->stmts = s;
7139 
7140 			/*
7141 			 * AND that with the checks done for data frames.
7142 			 */
7143 			gen_and(b1, b0);
7144 
7145 			/*
7146 			 * If the high-order bit of the type value is 0, this
7147 			 * is a management frame.
7148 			 * I.e, check "!(link[0] & 0x08)".
7149 			 */
7150 			s = gen_load_a(OR_LINK, 0, BPF_B);
7151 			b2 = new_block(JMP(BPF_JSET));
7152 			b2->s.k = 0x08;
7153 			b2->stmts = s;
7154 			gen_not(b2);
7155 
7156 			/*
7157 			 * For management frames, the DA is at 4.
7158 			 */
7159 			b1 = gen_mac_multicast(4);
7160 			gen_and(b2, b1);
7161 
7162 			/*
7163 			 * OR that with the checks done for data frames.
7164 			 * That gives the checks done for management and
7165 			 * data frames.
7166 			 */
7167 			gen_or(b1, b0);
7168 
7169 			/*
7170 			 * If the low-order bit of the type value is 1,
7171 			 * this is either a control frame or a frame
7172 			 * with a reserved type, and thus not a
7173 			 * frame with an SA.
7174 			 *
7175 			 * I.e., check "!(link[0] & 0x04)".
7176 			 */
7177 			s = gen_load_a(OR_LINK, 0, BPF_B);
7178 			b1 = new_block(JMP(BPF_JSET));
7179 			b1->s.k = 0x04;
7180 			b1->stmts = s;
7181 			gen_not(b1);
7182 
7183 			/*
7184 			 * AND that with the checks for data and management
7185 			 * frames.
7186 			 */
7187 			gen_and(b1, b0);
7188 			return b0;
7189 		case DLT_IP_OVER_FC:
7190 			b0 = gen_mac_multicast(2);
7191 			return b0;
7192 		case DLT_SUNATM:
7193 			if (is_lane) {
7194 				/*
7195 				 * Check that the packet doesn't begin with an
7196 				 * LE Control marker.  (We've already generated
7197 				 * a test for LANE.)
7198 				 */
7199 				b1 = gen_cmp(OR_LINK, SUNATM_PKT_BEGIN_POS,
7200 				    BPF_H, 0xFF00);
7201 				gen_not(b1);
7202 
7203 				/* ether[off_mac] & 1 != 0 */
7204 				b0 = gen_mac_multicast(off_mac);
7205 				gen_and(b1, b0);
7206 				return b0;
7207 			}
7208 			break;
7209 		default:
7210 			break;
7211 		}
7212 		/* Link not known to support multicasts */
7213 		break;
7214 
7215 	case Q_IP:
7216 		b0 = gen_linktype(ETHERTYPE_IP);
7217 		b1 = gen_cmp_ge(OR_NET, 16, BPF_B, (bpf_int32)224);
7218 		gen_and(b0, b1);
7219 		return b1;
7220 
7221 #ifdef INET6
7222 	case Q_IPV6:
7223 		b0 = gen_linktype(ETHERTYPE_IPV6);
7224 		b1 = gen_cmp(OR_NET, 24, BPF_B, (bpf_int32)255);
7225 		gen_and(b0, b1);
7226 		return b1;
7227 #endif /* INET6 */
7228 	}
7229 	bpf_error("link-layer multicast filters supported only on ethernet/FDDI/token ring/ARCNET/802.11/ATM LANE/Fibre Channel");
7230 	/* NOTREACHED */
7231 	return NULL;
7232 }
7233 
7234 /*
7235  * generate command for inbound/outbound.  It's here so we can
7236  * make it link-type specific.  'dir' = 0 implies "inbound",
7237  * = 1 implies "outbound".
7238  */
7239 struct block *
7240 gen_inbound(dir)
7241 	int dir;
7242 {
7243 	register struct block *b0;
7244 
7245 	/*
7246 	 * Only some data link types support inbound/outbound qualifiers.
7247 	 */
7248 	switch (linktype) {
7249 	case DLT_SLIP:
7250 		b0 = gen_relation(BPF_JEQ,
7251 			  gen_load(Q_LINK, gen_loadi(0), 1),
7252 			  gen_loadi(0),
7253 			  dir);
7254 		break;
7255 
7256 	case DLT_LINUX_SLL:
7257 		if (dir) {
7258 			/*
7259 			 * Match packets sent by this machine.
7260 			 */
7261 			b0 = gen_cmp(OR_LINK, 0, BPF_H, LINUX_SLL_OUTGOING);
7262 		} else {
7263 			/*
7264 			 * Match packets sent to this machine.
7265 			 * (No broadcast or multicast packets, or
7266 			 * packets sent to some other machine and
7267 			 * received promiscuously.)
7268 			 *
7269 			 * XXX - packets sent to other machines probably
7270 			 * shouldn't be matched, but what about broadcast
7271 			 * or multicast packets we received?
7272 			 */
7273 			b0 = gen_cmp(OR_LINK, 0, BPF_H, LINUX_SLL_HOST);
7274 		}
7275 		break;
7276 
7277 #ifdef HAVE_NET_PFVAR_H
7278 	case DLT_PFLOG:
7279 		b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, dir), BPF_B,
7280 		    (bpf_int32)((dir == 0) ? PF_IN : PF_OUT));
7281 		break;
7282 #endif
7283 
7284 	case DLT_PPP_PPPD:
7285 		if (dir) {
7286 			/* match outgoing packets */
7287 			b0 = gen_cmp(OR_LINK, 0, BPF_B, PPP_PPPD_OUT);
7288 		} else {
7289 			/* match incoming packets */
7290 			b0 = gen_cmp(OR_LINK, 0, BPF_B, PPP_PPPD_IN);
7291 		}
7292 		break;
7293 
7294         case DLT_JUNIPER_MFR:
7295         case DLT_JUNIPER_MLFR:
7296         case DLT_JUNIPER_MLPPP:
7297 	case DLT_JUNIPER_ATM1:
7298 	case DLT_JUNIPER_ATM2:
7299 	case DLT_JUNIPER_PPPOE:
7300 	case DLT_JUNIPER_PPPOE_ATM:
7301         case DLT_JUNIPER_GGSN:
7302         case DLT_JUNIPER_ES:
7303         case DLT_JUNIPER_MONITOR:
7304         case DLT_JUNIPER_SERVICES:
7305         case DLT_JUNIPER_ETHER:
7306         case DLT_JUNIPER_PPP:
7307         case DLT_JUNIPER_FRELAY:
7308         case DLT_JUNIPER_CHDLC:
7309         case DLT_JUNIPER_VP:
7310         case DLT_JUNIPER_ST:
7311         case DLT_JUNIPER_ISM:
7312 		/* juniper flags (including direction) are stored
7313 		 * the byte after the 3-byte magic number */
7314 		if (dir) {
7315 			/* match outgoing packets */
7316 			b0 = gen_mcmp(OR_LINK, 3, BPF_B, 0, 0x01);
7317 		} else {
7318 			/* match incoming packets */
7319 			b0 = gen_mcmp(OR_LINK, 3, BPF_B, 1, 0x01);
7320 		}
7321 		break;
7322 
7323 	default:
7324 		bpf_error("inbound/outbound not supported on linktype %d",
7325 		    linktype);
7326 		b0 = NULL;
7327 		/* NOTREACHED */
7328 	}
7329 	return (b0);
7330 }
7331 
7332 #ifdef HAVE_NET_PFVAR_H
7333 /* PF firewall log matched interface */
7334 struct block *
7335 gen_pf_ifname(const char *ifname)
7336 {
7337 	struct block *b0;
7338 	u_int len, off;
7339 
7340 	if (linktype != DLT_PFLOG) {
7341 		bpf_error("ifname supported only on PF linktype");
7342 		/* NOTREACHED */
7343 	}
7344 	len = sizeof(((struct pfloghdr *)0)->ifname);
7345 	off = offsetof(struct pfloghdr, ifname);
7346 	if (strlen(ifname) >= len) {
7347 		bpf_error("ifname interface names can only be %d characters",
7348 		    len-1);
7349 		/* NOTREACHED */
7350 	}
7351 	b0 = gen_bcmp(OR_LINK, off, strlen(ifname), (const u_char *)ifname);
7352 	return (b0);
7353 }
7354 
7355 /* PF firewall log ruleset name */
7356 struct block *
7357 gen_pf_ruleset(char *ruleset)
7358 {
7359 	struct block *b0;
7360 
7361 	if (linktype != DLT_PFLOG) {
7362 		bpf_error("ruleset supported only on PF linktype");
7363 		/* NOTREACHED */
7364 	}
7365 
7366 	if (strlen(ruleset) >= sizeof(((struct pfloghdr *)0)->ruleset)) {
7367 		bpf_error("ruleset names can only be %ld characters",
7368 		    (long)(sizeof(((struct pfloghdr *)0)->ruleset) - 1));
7369 		/* NOTREACHED */
7370 	}
7371 
7372 	b0 = gen_bcmp(OR_LINK, offsetof(struct pfloghdr, ruleset),
7373 	    strlen(ruleset), (const u_char *)ruleset);
7374 	return (b0);
7375 }
7376 
7377 /* PF firewall log rule number */
7378 struct block *
7379 gen_pf_rnr(int rnr)
7380 {
7381 	struct block *b0;
7382 
7383 	if (linktype != DLT_PFLOG) {
7384 		bpf_error("rnr supported only on PF linktype");
7385 		/* NOTREACHED */
7386 	}
7387 
7388 	b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, rulenr), BPF_W,
7389 		 (bpf_int32)rnr);
7390 	return (b0);
7391 }
7392 
7393 /* PF firewall log sub-rule number */
7394 struct block *
7395 gen_pf_srnr(int srnr)
7396 {
7397 	struct block *b0;
7398 
7399 	if (linktype != DLT_PFLOG) {
7400 		bpf_error("srnr supported only on PF linktype");
7401 		/* NOTREACHED */
7402 	}
7403 
7404 	b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, subrulenr), BPF_W,
7405 	    (bpf_int32)srnr);
7406 	return (b0);
7407 }
7408 
7409 /* PF firewall log reason code */
7410 struct block *
7411 gen_pf_reason(int reason)
7412 {
7413 	struct block *b0;
7414 
7415 	if (linktype != DLT_PFLOG) {
7416 		bpf_error("reason supported only on PF linktype");
7417 		/* NOTREACHED */
7418 	}
7419 
7420 	b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, reason), BPF_B,
7421 	    (bpf_int32)reason);
7422 	return (b0);
7423 }
7424 
7425 /* PF firewall log action */
7426 struct block *
7427 gen_pf_action(int action)
7428 {
7429 	struct block *b0;
7430 
7431 	if (linktype != DLT_PFLOG) {
7432 		bpf_error("action supported only on PF linktype");
7433 		/* NOTREACHED */
7434 	}
7435 
7436 	b0 = gen_cmp(OR_LINK, offsetof(struct pfloghdr, action), BPF_B,
7437 	    (bpf_int32)action);
7438 	return (b0);
7439 }
7440 #else /* !HAVE_NET_PFVAR_H */
7441 struct block *
7442 gen_pf_ifname(const char *ifname)
7443 {
7444 	bpf_error("libpcap was compiled without pf support");
7445 	/* NOTREACHED */
7446 	return (NULL);
7447 }
7448 
7449 struct block *
7450 gen_pf_ruleset(char *ruleset)
7451 {
7452 	bpf_error("libpcap was compiled on a machine without pf support");
7453 	/* NOTREACHED */
7454 	return (NULL);
7455 }
7456 
7457 struct block *
7458 gen_pf_rnr(int rnr)
7459 {
7460 	bpf_error("libpcap was compiled on a machine without pf support");
7461 	/* NOTREACHED */
7462 	return (NULL);
7463 }
7464 
7465 struct block *
7466 gen_pf_srnr(int srnr)
7467 {
7468 	bpf_error("libpcap was compiled on a machine without pf support");
7469 	/* NOTREACHED */
7470 	return (NULL);
7471 }
7472 
7473 struct block *
7474 gen_pf_reason(int reason)
7475 {
7476 	bpf_error("libpcap was compiled on a machine without pf support");
7477 	/* NOTREACHED */
7478 	return (NULL);
7479 }
7480 
7481 struct block *
7482 gen_pf_action(int action)
7483 {
7484 	bpf_error("libpcap was compiled on a machine without pf support");
7485 	/* NOTREACHED */
7486 	return (NULL);
7487 }
7488 #endif /* HAVE_NET_PFVAR_H */
7489 
7490 /* IEEE 802.11 wireless header */
7491 struct block *
7492 gen_p80211_type(int type, int mask)
7493 {
7494 	struct block *b0;
7495 
7496 	switch (linktype) {
7497 
7498 	case DLT_IEEE802_11:
7499 	case DLT_PRISM_HEADER:
7500 	case DLT_IEEE802_11_RADIO_AVS:
7501 	case DLT_IEEE802_11_RADIO:
7502 		b0 = gen_mcmp(OR_LINK, 0, BPF_B, (bpf_int32)type,
7503 		    (bpf_int32)mask);
7504 		break;
7505 
7506 	default:
7507 		bpf_error("802.11 link-layer types supported only on 802.11");
7508 		/* NOTREACHED */
7509 	}
7510 
7511 	return (b0);
7512 }
7513 
7514 struct block *
7515 gen_p80211_fcdir(int fcdir)
7516 {
7517 	struct block *b0;
7518 
7519 	switch (linktype) {
7520 
7521 	case DLT_IEEE802_11:
7522 	case DLT_PRISM_HEADER:
7523 	case DLT_IEEE802_11_RADIO_AVS:
7524 	case DLT_IEEE802_11_RADIO:
7525 		break;
7526 
7527 	default:
7528 		bpf_error("frame direction supported only with 802.11 headers");
7529 		/* NOTREACHED */
7530 	}
7531 
7532 	b0 = gen_mcmp(OR_LINK, 1, BPF_B, (bpf_int32)fcdir,
7533 		(bpf_u_int32)IEEE80211_FC1_DIR_MASK);
7534 
7535 	return (b0);
7536 }
7537 
7538 struct block *
7539 gen_acode(eaddr, q)
7540 	register const u_char *eaddr;
7541 	struct qual q;
7542 {
7543 	switch (linktype) {
7544 
7545 	case DLT_ARCNET:
7546 	case DLT_ARCNET_LINUX:
7547 		if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) &&
7548 		    q.proto == Q_LINK)
7549 			return (gen_ahostop(eaddr, (int)q.dir));
7550 		else {
7551 			bpf_error("ARCnet address used in non-arc expression");
7552 			/* NOTREACHED */
7553 		}
7554 		break;
7555 
7556 	default:
7557 		bpf_error("aid supported only on ARCnet");
7558 		/* NOTREACHED */
7559 	}
7560 	bpf_error("ARCnet address used in non-arc expression");
7561 	/* NOTREACHED */
7562 	return NULL;
7563 }
7564 
7565 static struct block *
7566 gen_ahostop(eaddr, dir)
7567 	register const u_char *eaddr;
7568 	register int dir;
7569 {
7570 	register struct block *b0, *b1;
7571 
7572 	switch (dir) {
7573 	/* src comes first, different from Ethernet */
7574 	case Q_SRC:
7575 		return gen_bcmp(OR_LINK, 0, 1, eaddr);
7576 
7577 	case Q_DST:
7578 		return gen_bcmp(OR_LINK, 1, 1, eaddr);
7579 
7580 	case Q_AND:
7581 		b0 = gen_ahostop(eaddr, Q_SRC);
7582 		b1 = gen_ahostop(eaddr, Q_DST);
7583 		gen_and(b0, b1);
7584 		return b1;
7585 
7586 	case Q_DEFAULT:
7587 	case Q_OR:
7588 		b0 = gen_ahostop(eaddr, Q_SRC);
7589 		b1 = gen_ahostop(eaddr, Q_DST);
7590 		gen_or(b0, b1);
7591 		return b1;
7592 	}
7593 	abort();
7594 	/* NOTREACHED */
7595 }
7596 
7597 /*
7598  * support IEEE 802.1Q VLAN trunk over ethernet
7599  */
7600 struct block *
7601 gen_vlan(vlan_num)
7602 	int vlan_num;
7603 {
7604 	struct	block	*b0, *b1;
7605 
7606 	/* can't check for VLAN-encapsulated packets inside MPLS */
7607 	if (label_stack_depth > 0)
7608 		bpf_error("no VLAN match after MPLS");
7609 
7610 	/*
7611 	 * Check for a VLAN packet, and then change the offsets to point
7612 	 * to the type and data fields within the VLAN packet.  Just
7613 	 * increment the offsets, so that we can support a hierarchy, e.g.
7614 	 * "vlan 300 && vlan 200" to capture VLAN 200 encapsulated within
7615 	 * VLAN 100.
7616 	 *
7617 	 * XXX - this is a bit of a kludge.  If we were to split the
7618 	 * compiler into a parser that parses an expression and
7619 	 * generates an expression tree, and a code generator that
7620 	 * takes an expression tree (which could come from our
7621 	 * parser or from some other parser) and generates BPF code,
7622 	 * we could perhaps make the offsets parameters of routines
7623 	 * and, in the handler for an "AND" node, pass to subnodes
7624 	 * other than the VLAN node the adjusted offsets.
7625 	 *
7626 	 * This would mean that "vlan" would, instead of changing the
7627 	 * behavior of *all* tests after it, change only the behavior
7628 	 * of tests ANDed with it.  That would change the documented
7629 	 * semantics of "vlan", which might break some expressions.
7630 	 * However, it would mean that "(vlan and ip) or ip" would check
7631 	 * both for VLAN-encapsulated IP and IP-over-Ethernet, rather than
7632 	 * checking only for VLAN-encapsulated IP, so that could still
7633 	 * be considered worth doing; it wouldn't break expressions
7634 	 * that are of the form "vlan and ..." or "vlan N and ...",
7635 	 * which I suspect are the most common expressions involving
7636 	 * "vlan".  "vlan or ..." doesn't necessarily do what the user
7637 	 * would really want, now, as all the "or ..." tests would
7638 	 * be done assuming a VLAN, even though the "or" could be viewed
7639 	 * as meaning "or, if this isn't a VLAN packet...".
7640 	 */
7641 	orig_nl = off_nl;
7642 
7643 	switch (linktype) {
7644 
7645 	case DLT_EN10MB:
7646 		/* check for VLAN */
7647 		b0 = gen_cmp(OR_LINK, off_linktype, BPF_H,
7648 		    (bpf_int32)ETHERTYPE_8021Q);
7649 
7650 		/* If a specific VLAN is requested, check VLAN id */
7651 		if (vlan_num >= 0) {
7652 			b1 = gen_mcmp(OR_MACPL, 0, BPF_H,
7653 			    (bpf_int32)vlan_num, 0x0fff);
7654 			gen_and(b0, b1);
7655 			b0 = b1;
7656 		}
7657 
7658 		off_macpl += 4;
7659 		off_linktype += 4;
7660 #if 0
7661 		off_nl_nosnap += 4;
7662 		off_nl += 4;
7663 #endif
7664 		break;
7665 
7666 	default:
7667 		bpf_error("no VLAN support for data link type %d",
7668 		      linktype);
7669 		/*NOTREACHED*/
7670 	}
7671 
7672 	return (b0);
7673 }
7674 
7675 /*
7676  * support for MPLS
7677  */
7678 struct block *
7679 gen_mpls(label_num)
7680 	int label_num;
7681 {
7682 	struct	block	*b0,*b1;
7683 
7684 	/*
7685 	 * Change the offsets to point to the type and data fields within
7686 	 * the MPLS packet.  Just increment the offsets, so that we
7687 	 * can support a hierarchy, e.g. "mpls 100000 && mpls 1024" to
7688 	 * capture packets with an outer label of 100000 and an inner
7689 	 * label of 1024.
7690 	 *
7691 	 * XXX - this is a bit of a kludge.  See comments in gen_vlan().
7692 	 */
7693         orig_nl = off_nl;
7694 
7695         if (label_stack_depth > 0) {
7696             /* just match the bottom-of-stack bit clear */
7697             b0 = gen_mcmp(OR_MACPL, orig_nl-2, BPF_B, 0, 0x01);
7698         } else {
7699             /*
7700              * Indicate that we're checking MPLS-encapsulated headers,
7701              * to make sure higher level code generators don't try to
7702              * match against IP-related protocols such as Q_ARP, Q_RARP
7703              * etc.
7704              */
7705             switch (linktype) {
7706 
7707             case DLT_C_HDLC: /* fall through */
7708             case DLT_EN10MB:
7709                     b0 = gen_linktype(ETHERTYPE_MPLS);
7710                     break;
7711 
7712             case DLT_PPP:
7713                     b0 = gen_linktype(PPP_MPLS_UCAST);
7714                     break;
7715 
7716                     /* FIXME add other DLT_s ...
7717                      * for Frame-Relay/and ATM this may get messy due to SNAP headers
7718                      * leave it for now */
7719 
7720             default:
7721                     bpf_error("no MPLS support for data link type %d",
7722                           linktype);
7723                     b0 = NULL;
7724                     /*NOTREACHED*/
7725                     break;
7726             }
7727         }
7728 
7729 	/* If a specific MPLS label is requested, check it */
7730 	if (label_num >= 0) {
7731 		label_num = label_num << 12; /* label is shifted 12 bits on the wire */
7732 		b1 = gen_mcmp(OR_MACPL, orig_nl, BPF_W, (bpf_int32)label_num,
7733 		    0xfffff000); /* only compare the first 20 bits */
7734 		gen_and(b0, b1);
7735 		b0 = b1;
7736 	}
7737 
7738         off_nl_nosnap += 4;
7739         off_nl += 4;
7740         label_stack_depth++;
7741 	return (b0);
7742 }
7743 
7744 /*
7745  * Support PPPOE discovery and session.
7746  */
7747 struct block *
7748 gen_pppoed()
7749 {
7750 	/* check for PPPoE discovery */
7751 	return gen_linktype((bpf_int32)ETHERTYPE_PPPOED);
7752 }
7753 
7754 struct block *
7755 gen_pppoes()
7756 {
7757 	struct block *b0;
7758 
7759 	/*
7760 	 * Test against the PPPoE session link-layer type.
7761 	 */
7762 	b0 = gen_linktype((bpf_int32)ETHERTYPE_PPPOES);
7763 
7764 	/*
7765 	 * Change the offsets to point to the type and data fields within
7766 	 * the PPP packet, and note that this is PPPoE rather than
7767 	 * raw PPP.
7768 	 *
7769 	 * XXX - this is a bit of a kludge.  If we were to split the
7770 	 * compiler into a parser that parses an expression and
7771 	 * generates an expression tree, and a code generator that
7772 	 * takes an expression tree (which could come from our
7773 	 * parser or from some other parser) and generates BPF code,
7774 	 * we could perhaps make the offsets parameters of routines
7775 	 * and, in the handler for an "AND" node, pass to subnodes
7776 	 * other than the PPPoE node the adjusted offsets.
7777 	 *
7778 	 * This would mean that "pppoes" would, instead of changing the
7779 	 * behavior of *all* tests after it, change only the behavior
7780 	 * of tests ANDed with it.  That would change the documented
7781 	 * semantics of "pppoes", which might break some expressions.
7782 	 * However, it would mean that "(pppoes and ip) or ip" would check
7783 	 * both for VLAN-encapsulated IP and IP-over-Ethernet, rather than
7784 	 * checking only for VLAN-encapsulated IP, so that could still
7785 	 * be considered worth doing; it wouldn't break expressions
7786 	 * that are of the form "pppoes and ..." which I suspect are the
7787 	 * most common expressions involving "pppoes".  "pppoes or ..."
7788 	 * doesn't necessarily do what the user would really want, now,
7789 	 * as all the "or ..." tests would be done assuming PPPoE, even
7790 	 * though the "or" could be viewed as meaning "or, if this isn't
7791 	 * a PPPoE packet...".
7792 	 */
7793 	orig_linktype = off_linktype;	/* save original values */
7794 	orig_nl = off_nl;
7795 	is_pppoes = 1;
7796 
7797 	/*
7798 	 * The "network-layer" protocol is PPPoE, which has a 6-byte
7799 	 * PPPoE header, followed by a PPP packet.
7800 	 *
7801 	 * There is no HDLC encapsulation for the PPP packet (it's
7802 	 * encapsulated in PPPoES instead), so the link-layer type
7803 	 * starts at the first byte of the PPP packet.  For PPPoE,
7804 	 * that offset is relative to the beginning of the total
7805 	 * link-layer payload, including any 802.2 LLC header, so
7806 	 * it's 6 bytes past off_nl.
7807 	 */
7808 	off_linktype = off_nl + 6;
7809 
7810 	/*
7811 	 * The network-layer offsets are relative to the beginning
7812 	 * of the MAC-layer payload; that's past the 6-byte
7813 	 * PPPoE header and the 2-byte PPP header.
7814 	 */
7815 	off_nl = 6+2;
7816 	off_nl_nosnap = 6+2;
7817 
7818 	return b0;
7819 }
7820 
7821 struct block *
7822 gen_atmfield_code(atmfield, jvalue, jtype, reverse)
7823 	int atmfield;
7824 	bpf_int32 jvalue;
7825 	bpf_u_int32 jtype;
7826 	int reverse;
7827 {
7828 	struct block *b0;
7829 
7830 	switch (atmfield) {
7831 
7832 	case A_VPI:
7833 		if (!is_atm)
7834 			bpf_error("'vpi' supported only on raw ATM");
7835 		if (off_vpi == (u_int)-1)
7836 			abort();
7837 		b0 = gen_ncmp(OR_LINK, off_vpi, BPF_B, 0xffffffff, jtype,
7838 		    reverse, jvalue);
7839 		break;
7840 
7841 	case A_VCI:
7842 		if (!is_atm)
7843 			bpf_error("'vci' supported only on raw ATM");
7844 		if (off_vci == (u_int)-1)
7845 			abort();
7846 		b0 = gen_ncmp(OR_LINK, off_vci, BPF_H, 0xffffffff, jtype,
7847 		    reverse, jvalue);
7848 		break;
7849 
7850 	case A_PROTOTYPE:
7851 		if (off_proto == (u_int)-1)
7852 			abort();	/* XXX - this isn't on FreeBSD */
7853 		b0 = gen_ncmp(OR_LINK, off_proto, BPF_B, 0x0f, jtype,
7854 		    reverse, jvalue);
7855 		break;
7856 
7857 	case A_MSGTYPE:
7858 		if (off_payload == (u_int)-1)
7859 			abort();
7860 		b0 = gen_ncmp(OR_LINK, off_payload + MSG_TYPE_POS, BPF_B,
7861 		    0xffffffff, jtype, reverse, jvalue);
7862 		break;
7863 
7864 	case A_CALLREFTYPE:
7865 		if (!is_atm)
7866 			bpf_error("'callref' supported only on raw ATM");
7867 		if (off_proto == (u_int)-1)
7868 			abort();
7869 		b0 = gen_ncmp(OR_LINK, off_proto, BPF_B, 0xffffffff,
7870 		    jtype, reverse, jvalue);
7871 		break;
7872 
7873 	default:
7874 		abort();
7875 	}
7876 	return b0;
7877 }
7878 
7879 struct block *
7880 gen_atmtype_abbrev(type)
7881 	int type;
7882 {
7883 	struct block *b0, *b1;
7884 
7885 	switch (type) {
7886 
7887 	case A_METAC:
7888 		/* Get all packets in Meta signalling Circuit */
7889 		if (!is_atm)
7890 			bpf_error("'metac' supported only on raw ATM");
7891 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
7892 		b1 = gen_atmfield_code(A_VCI, 1, BPF_JEQ, 0);
7893 		gen_and(b0, b1);
7894 		break;
7895 
7896 	case A_BCC:
7897 		/* Get all packets in Broadcast Circuit*/
7898 		if (!is_atm)
7899 			bpf_error("'bcc' supported only on raw ATM");
7900 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
7901 		b1 = gen_atmfield_code(A_VCI, 2, BPF_JEQ, 0);
7902 		gen_and(b0, b1);
7903 		break;
7904 
7905 	case A_OAMF4SC:
7906 		/* Get all cells in Segment OAM F4 circuit*/
7907 		if (!is_atm)
7908 			bpf_error("'oam4sc' supported only on raw ATM");
7909 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
7910 		b1 = gen_atmfield_code(A_VCI, 3, BPF_JEQ, 0);
7911 		gen_and(b0, b1);
7912 		break;
7913 
7914 	case A_OAMF4EC:
7915 		/* Get all cells in End-to-End OAM F4 Circuit*/
7916 		if (!is_atm)
7917 			bpf_error("'oam4ec' supported only on raw ATM");
7918 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
7919 		b1 = gen_atmfield_code(A_VCI, 4, BPF_JEQ, 0);
7920 		gen_and(b0, b1);
7921 		break;
7922 
7923 	case A_SC:
7924 		/*  Get all packets in connection Signalling Circuit */
7925 		if (!is_atm)
7926 			bpf_error("'sc' supported only on raw ATM");
7927 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
7928 		b1 = gen_atmfield_code(A_VCI, 5, BPF_JEQ, 0);
7929 		gen_and(b0, b1);
7930 		break;
7931 
7932 	case A_ILMIC:
7933 		/* Get all packets in ILMI Circuit */
7934 		if (!is_atm)
7935 			bpf_error("'ilmic' supported only on raw ATM");
7936 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
7937 		b1 = gen_atmfield_code(A_VCI, 16, BPF_JEQ, 0);
7938 		gen_and(b0, b1);
7939 		break;
7940 
7941 	case A_LANE:
7942 		/* Get all LANE packets */
7943 		if (!is_atm)
7944 			bpf_error("'lane' supported only on raw ATM");
7945 		b1 = gen_atmfield_code(A_PROTOTYPE, PT_LANE, BPF_JEQ, 0);
7946 
7947 		/*
7948 		 * Arrange that all subsequent tests assume LANE
7949 		 * rather than LLC-encapsulated packets, and set
7950 		 * the offsets appropriately for LANE-encapsulated
7951 		 * Ethernet.
7952 		 *
7953 		 * "off_mac" is the offset of the Ethernet header,
7954 		 * which is 2 bytes past the ATM pseudo-header
7955 		 * (skipping the pseudo-header and 2-byte LE Client
7956 		 * field).  The other offsets are Ethernet offsets
7957 		 * relative to "off_mac".
7958 		 */
7959 		is_lane = 1;
7960 		off_mac = off_payload + 2;	/* MAC header */
7961 		off_linktype = off_mac + 12;
7962 		off_macpl = off_mac + 14;	/* Ethernet */
7963 		off_nl = 0;			/* Ethernet II */
7964 		off_nl_nosnap = 3;		/* 802.3+802.2 */
7965 		break;
7966 
7967 	case A_LLC:
7968 		/* Get all LLC-encapsulated packets */
7969 		if (!is_atm)
7970 			bpf_error("'llc' supported only on raw ATM");
7971 		b1 = gen_atmfield_code(A_PROTOTYPE, PT_LLC, BPF_JEQ, 0);
7972 		is_lane = 0;
7973 		break;
7974 
7975 	default:
7976 		abort();
7977 	}
7978 	return b1;
7979 }
7980 
7981 /*
7982  * Filtering for MTP2 messages based on li value
7983  * FISU, length is null
7984  * LSSU, length is 1 or 2
7985  * MSU, length is 3 or more
7986  */
7987 struct block *
7988 gen_mtp2type_abbrev(type)
7989 	int type;
7990 {
7991 	struct block *b0, *b1;
7992 
7993 	switch (type) {
7994 
7995 	case M_FISU:
7996 		if ( (linktype != DLT_MTP2) &&
7997 		     (linktype != DLT_ERF) &&
7998 		     (linktype != DLT_MTP2_WITH_PHDR) )
7999 			bpf_error("'fisu' supported only on MTP2");
8000 		/* gen_ncmp(offrel, offset, size, mask, jtype, reverse, value) */
8001 		b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JEQ, 0, 0);
8002 		break;
8003 
8004 	case M_LSSU:
8005 		if ( (linktype != DLT_MTP2) &&
8006 		     (linktype != DLT_ERF) &&
8007 		     (linktype != DLT_MTP2_WITH_PHDR) )
8008 			bpf_error("'lssu' supported only on MTP2");
8009 		b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 1, 2);
8010 		b1 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 0);
8011 		gen_and(b1, b0);
8012 		break;
8013 
8014 	case M_MSU:
8015 		if ( (linktype != DLT_MTP2) &&
8016 		     (linktype != DLT_ERF) &&
8017 		     (linktype != DLT_MTP2_WITH_PHDR) )
8018 			bpf_error("'msu' supported only on MTP2");
8019 		b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 2);
8020 		break;
8021 
8022 	default:
8023 		abort();
8024 	}
8025 	return b0;
8026 }
8027 
8028 struct block *
8029 gen_mtp3field_code(mtp3field, jvalue, jtype, reverse)
8030 	int mtp3field;
8031 	bpf_u_int32 jvalue;
8032 	bpf_u_int32 jtype;
8033 	int reverse;
8034 {
8035 	struct block *b0;
8036 	bpf_u_int32 val1 , val2 , val3;
8037 
8038 	switch (mtp3field) {
8039 
8040 	case M_SIO:
8041 		if (off_sio == (u_int)-1)
8042 			bpf_error("'sio' supported only on SS7");
8043 		/* sio coded on 1 byte so max value 255 */
8044 		if(jvalue > 255)
8045 		        bpf_error("sio value %u too big; max value = 255",
8046 		            jvalue);
8047 		b0 = gen_ncmp(OR_PACKET, off_sio, BPF_B, 0xffffffff,
8048 		    (u_int)jtype, reverse, (u_int)jvalue);
8049 		break;
8050 
8051         case M_OPC:
8052 	        if (off_opc == (u_int)-1)
8053 			bpf_error("'opc' supported only on SS7");
8054 		/* opc coded on 14 bits so max value 16383 */
8055 		if (jvalue > 16383)
8056 		        bpf_error("opc value %u too big; max value = 16383",
8057 		            jvalue);
8058 		/* the following instructions are made to convert jvalue
8059 		 * to the form used to write opc in an ss7 message*/
8060 		val1 = jvalue & 0x00003c00;
8061 		val1 = val1 >>10;
8062 		val2 = jvalue & 0x000003fc;
8063 		val2 = val2 <<6;
8064 		val3 = jvalue & 0x00000003;
8065 		val3 = val3 <<22;
8066 		jvalue = val1 + val2 + val3;
8067 		b0 = gen_ncmp(OR_PACKET, off_opc, BPF_W, 0x00c0ff0f,
8068 		    (u_int)jtype, reverse, (u_int)jvalue);
8069 		break;
8070 
8071 	case M_DPC:
8072 	        if (off_dpc == (u_int)-1)
8073 			bpf_error("'dpc' supported only on SS7");
8074 		/* dpc coded on 14 bits so max value 16383 */
8075 		if (jvalue > 16383)
8076 		        bpf_error("dpc value %u too big; max value = 16383",
8077 		            jvalue);
8078 		/* the following instructions are made to convert jvalue
8079 		 * to the forme used to write dpc in an ss7 message*/
8080 		val1 = jvalue & 0x000000ff;
8081 		val1 = val1 << 24;
8082 		val2 = jvalue & 0x00003f00;
8083 		val2 = val2 << 8;
8084 		jvalue = val1 + val2;
8085 		b0 = gen_ncmp(OR_PACKET, off_dpc, BPF_W, 0xff3f0000,
8086 		    (u_int)jtype, reverse, (u_int)jvalue);
8087 		break;
8088 
8089 	case M_SLS:
8090 	        if (off_sls == (u_int)-1)
8091 			bpf_error("'sls' supported only on SS7");
8092 		/* sls coded on 4 bits so max value 15 */
8093 		if (jvalue > 15)
8094 		         bpf_error("sls value %u too big; max value = 15",
8095 		             jvalue);
8096 		/* the following instruction is made to convert jvalue
8097 		 * to the forme used to write sls in an ss7 message*/
8098 		jvalue = jvalue << 4;
8099 		b0 = gen_ncmp(OR_PACKET, off_sls, BPF_B, 0xf0,
8100 		    (u_int)jtype,reverse, (u_int)jvalue);
8101 		break;
8102 
8103 	default:
8104 		abort();
8105 	}
8106 	return b0;
8107 }
8108 
8109 static struct block *
8110 gen_msg_abbrev(type)
8111 	int type;
8112 {
8113 	struct block *b1;
8114 
8115 	/*
8116 	 * Q.2931 signalling protocol messages for handling virtual circuits
8117 	 * establishment and teardown
8118 	 */
8119 	switch (type) {
8120 
8121 	case A_SETUP:
8122 		b1 = gen_atmfield_code(A_MSGTYPE, SETUP, BPF_JEQ, 0);
8123 		break;
8124 
8125 	case A_CALLPROCEED:
8126 		b1 = gen_atmfield_code(A_MSGTYPE, CALL_PROCEED, BPF_JEQ, 0);
8127 		break;
8128 
8129 	case A_CONNECT:
8130 		b1 = gen_atmfield_code(A_MSGTYPE, CONNECT, BPF_JEQ, 0);
8131 		break;
8132 
8133 	case A_CONNECTACK:
8134 		b1 = gen_atmfield_code(A_MSGTYPE, CONNECT_ACK, BPF_JEQ, 0);
8135 		break;
8136 
8137 	case A_RELEASE:
8138 		b1 = gen_atmfield_code(A_MSGTYPE, RELEASE, BPF_JEQ, 0);
8139 		break;
8140 
8141 	case A_RELEASE_DONE:
8142 		b1 = gen_atmfield_code(A_MSGTYPE, RELEASE_DONE, BPF_JEQ, 0);
8143 		break;
8144 
8145 	default:
8146 		abort();
8147 	}
8148 	return b1;
8149 }
8150 
8151 struct block *
8152 gen_atmmulti_abbrev(type)
8153 	int type;
8154 {
8155 	struct block *b0, *b1;
8156 
8157 	switch (type) {
8158 
8159 	case A_OAM:
8160 		if (!is_atm)
8161 			bpf_error("'oam' supported only on raw ATM");
8162 		b1 = gen_atmmulti_abbrev(A_OAMF4);
8163 		break;
8164 
8165 	case A_OAMF4:
8166 		if (!is_atm)
8167 			bpf_error("'oamf4' supported only on raw ATM");
8168 		/* OAM F4 type */
8169 		b0 = gen_atmfield_code(A_VCI, 3, BPF_JEQ, 0);
8170 		b1 = gen_atmfield_code(A_VCI, 4, BPF_JEQ, 0);
8171 		gen_or(b0, b1);
8172 		b0 = gen_atmfield_code(A_VPI, 0, BPF_JEQ, 0);
8173 		gen_and(b0, b1);
8174 		break;
8175 
8176 	case A_CONNECTMSG:
8177 		/*
8178 		 * Get Q.2931 signalling messages for switched
8179 		 * virtual connection
8180 		 */
8181 		if (!is_atm)
8182 			bpf_error("'connectmsg' supported only on raw ATM");
8183 		b0 = gen_msg_abbrev(A_SETUP);
8184 		b1 = gen_msg_abbrev(A_CALLPROCEED);
8185 		gen_or(b0, b1);
8186 		b0 = gen_msg_abbrev(A_CONNECT);
8187 		gen_or(b0, b1);
8188 		b0 = gen_msg_abbrev(A_CONNECTACK);
8189 		gen_or(b0, b1);
8190 		b0 = gen_msg_abbrev(A_RELEASE);
8191 		gen_or(b0, b1);
8192 		b0 = gen_msg_abbrev(A_RELEASE_DONE);
8193 		gen_or(b0, b1);
8194 		b0 = gen_atmtype_abbrev(A_SC);
8195 		gen_and(b0, b1);
8196 		break;
8197 
8198 	case A_METACONNECT:
8199 		if (!is_atm)
8200 			bpf_error("'metaconnect' supported only on raw ATM");
8201 		b0 = gen_msg_abbrev(A_SETUP);
8202 		b1 = gen_msg_abbrev(A_CALLPROCEED);
8203 		gen_or(b0, b1);
8204 		b0 = gen_msg_abbrev(A_CONNECT);
8205 		gen_or(b0, b1);
8206 		b0 = gen_msg_abbrev(A_RELEASE);
8207 		gen_or(b0, b1);
8208 		b0 = gen_msg_abbrev(A_RELEASE_DONE);
8209 		gen_or(b0, b1);
8210 		b0 = gen_atmtype_abbrev(A_METAC);
8211 		gen_and(b0, b1);
8212 		break;
8213 
8214 	default:
8215 		abort();
8216 	}
8217 	return b1;
8218 }
8219