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