gencode.c revision 356341
1310600Smmel/*#define CHASE_CHAIN*/
2310600Smmel/*
3310600Smmel * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
4310600Smmel *	The Regents of the University of California.  All rights reserved.
5310600Smmel *
6310600Smmel * Redistribution and use in source and binary forms, with or without
7310600Smmel * modification, are permitted provided that: (1) source code distributions
8310600Smmel * retain the above copyright notice and this paragraph in its entirety, (2)
9310600Smmel * distributions including binary code include the above copyright notice and
10310600Smmel * this paragraph in its entirety in the documentation or other materials
11310600Smmel * provided with the distribution, and (3) all advertising materials mentioning
12310600Smmel * features or use of this software display the following acknowledgement:
13310600Smmel * ``This product includes software developed by the University of California,
14310600Smmel * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
15310600Smmel * the University nor the names of its contributors may be used to endorse
16310600Smmel * or promote products derived from this software without specific prior
17310600Smmel * written permission.
18310600Smmel * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19310600Smmel * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20310600Smmel * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21310600Smmel */
22310600Smmel
23310600Smmel#ifdef HAVE_CONFIG_H
24310600Smmel#include <config.h>
25310600Smmel#endif
26310600Smmel
27310600Smmel#include <pcap-types.h>
28310600Smmel#ifdef _WIN32
29310600Smmel  #include <ws2tcpip.h>
30310600Smmel#else
31310600Smmel  #include <sys/socket.h>
32310600Smmel
33310600Smmel  #ifdef __NetBSD__
34310600Smmel    #include <sys/param.h>
35310600Smmel  #endif
36310600Smmel
37310600Smmel  #include <netinet/in.h>
38310600Smmel  #include <arpa/inet.h>
39310600Smmel#endif /* _WIN32 */
40310600Smmel
41310600Smmel#include <stdlib.h>
42310600Smmel#include <string.h>
43310600Smmel#include <memory.h>
44310600Smmel#include <setjmp.h>
45310600Smmel#include <stdarg.h>
46310600Smmel
47310600Smmel#ifdef MSDOS
48310600Smmel#include "pcap-dos.h"
49310600Smmel#endif
50310600Smmel
51310600Smmel#include "pcap-int.h"
52310600Smmel
53310600Smmel#include "extract.h"
54310600Smmel
55310600Smmel#include "ethertype.h"
56310600Smmel#include "nlpid.h"
57310600Smmel#include "llc.h"
58310600Smmel#include "gencode.h"
59310600Smmel#include "ieee80211.h"
60310600Smmel#include "atmuni31.h"
61310600Smmel#include "sunatmpos.h"
62310600Smmel#include "ppp.h"
63310600Smmel#include "pcap/sll.h"
64310600Smmel#include "pcap/ipnet.h"
65310600Smmel#include "arcnet.h"
66310600Smmel
67310600Smmel#include "grammar.h"
68310600Smmel#include "scanner.h"
69310600Smmel
70310600Smmel#if defined(linux) && defined(PF_PACKET) && defined(SO_ATTACH_FILTER)
71310600Smmel#include <linux/types.h>
72310600Smmel#include <linux/if_packet.h>
73310600Smmel#include <linux/filter.h>
74310600Smmel#endif
75310600Smmel
76310600Smmel#ifdef HAVE_NET_PFVAR_H
77310600Smmel#include <sys/socket.h>
78310600Smmel#include <net/if.h>
79310600Smmel#include <net/pfvar.h>
80310600Smmel#include <net/if_pflog.h>
81310600Smmel#endif
82310600Smmel
83310600Smmel#ifndef offsetof
84310600Smmel#define offsetof(s, e) ((size_t)&((s *)0)->e)
85310600Smmel#endif
86310600Smmel
87310600Smmel#ifdef _WIN32
88310600Smmel  #ifdef INET6
89310600Smmel    #if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)
90310600Smmel/* IPv6 address */
91310600Smmelstruct in6_addr
92310600Smmel  {
93310600Smmel    union
94310600Smmel      {
95310600Smmel	uint8_t		u6_addr8[16];
96310600Smmel	uint16_t	u6_addr16[8];
97310600Smmel	uint32_t	u6_addr32[4];
98310600Smmel      } in6_u;
99310600Smmel#define s6_addr			in6_u.u6_addr8
100310600Smmel#define s6_addr16		in6_u.u6_addr16
101310600Smmel#define s6_addr32		in6_u.u6_addr32
102310600Smmel#define s6_addr64		in6_u.u6_addr64
103310600Smmel  };
104310600Smmel
105310600Smmeltypedef unsigned short	sa_family_t;
106310600Smmel
107310600Smmel#define	__SOCKADDR_COMMON(sa_prefix) \
108310600Smmel  sa_family_t sa_prefix##family
109310600Smmel
110310600Smmel/* Ditto, for IPv6.  */
111310600Smmelstruct sockaddr_in6
112310600Smmel  {
113310600Smmel    __SOCKADDR_COMMON (sin6_);
114310600Smmel    uint16_t sin6_port;		/* Transport layer port # */
115310600Smmel    uint32_t sin6_flowinfo;	/* IPv6 flow information */
116310600Smmel    struct in6_addr sin6_addr;	/* IPv6 address */
117310600Smmel  };
118310600Smmel
119310600Smmel      #ifndef EAI_ADDRFAMILY
120310600Smmelstruct addrinfo {
121310600Smmel	int	ai_flags;	/* AI_PASSIVE, AI_CANONNAME */
122310600Smmel	int	ai_family;	/* PF_xxx */
123310600Smmel	int	ai_socktype;	/* SOCK_xxx */
124310600Smmel	int	ai_protocol;	/* 0 or IPPROTO_xxx for IPv4 and IPv6 */
125310600Smmel	size_t	ai_addrlen;	/* length of ai_addr */
126310600Smmel	char	*ai_canonname;	/* canonical name for hostname */
127310600Smmel	struct sockaddr *ai_addr;	/* binary address */
128310600Smmel	struct addrinfo *ai_next;	/* next structure in linked list */
129310600Smmel};
130310600Smmel      #endif /* EAI_ADDRFAMILY */
131310600Smmel    #endif /* defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) */
132310600Smmel  #endif /* INET6 */
133310600Smmel#else /* _WIN32 */
134310600Smmel  #include <netdb.h>	/* for "struct addrinfo" */
135310600Smmel#endif /* _WIN32 */
136310600Smmel#include <pcap/namedb.h>
137310600Smmel
138310600Smmel#include "nametoaddr.h"
139310600Smmel
140310600Smmel#define ETHERMTU	1500
141310600Smmel
142310600Smmel#ifndef ETHERTYPE_TEB
143310600Smmel#define ETHERTYPE_TEB 0x6558
144310600Smmel#endif
145310600Smmel
146310600Smmel#ifndef IPPROTO_HOPOPTS
147310600Smmel#define IPPROTO_HOPOPTS 0
148310600Smmel#endif
149310600Smmel#ifndef IPPROTO_ROUTING
150310600Smmel#define IPPROTO_ROUTING 43
151310600Smmel#endif
152310600Smmel#ifndef IPPROTO_FRAGMENT
153310600Smmel#define IPPROTO_FRAGMENT 44
154310600Smmel#endif
155310600Smmel#ifndef IPPROTO_DSTOPTS
156310600Smmel#define IPPROTO_DSTOPTS 60
157310600Smmel#endif
158310600Smmel#ifndef IPPROTO_SCTP
159310600Smmel#define IPPROTO_SCTP 132
160310600Smmel#endif
161310600Smmel
162310600Smmel#define GENEVE_PORT 6081
163310600Smmel
164310600Smmel#ifdef HAVE_OS_PROTO_H
165310600Smmel#include "os-proto.h"
166310600Smmel#endif
167310600Smmel
168310600Smmel#define JMP(c) ((c)|BPF_JMP|BPF_K)
169310600Smmel
170310600Smmel/*
171310600Smmel * "Push" the current value of the link-layer header type and link-layer
172310600Smmel * header offset onto a "stack", and set a new value.  (It's not a
173310600Smmel * full-blown stack; we keep only the top two items.)
174310600Smmel */
175310600Smmel#define PUSH_LINKHDR(cs, new_linktype, new_is_variable, new_constant_part, new_reg) \
176310600Smmel{ \
177310600Smmel	(cs)->prevlinktype = (cs)->linktype; \
178310600Smmel	(cs)->off_prevlinkhdr = (cs)->off_linkhdr; \
179310600Smmel	(cs)->linktype = (new_linktype); \
180310600Smmel	(cs)->off_linkhdr.is_variable = (new_is_variable); \
181310600Smmel	(cs)->off_linkhdr.constant_part = (new_constant_part); \
182310600Smmel	(cs)->off_linkhdr.reg = (new_reg); \
183310600Smmel	(cs)->is_geneve = 0; \
184310600Smmel}
185310600Smmel
186310600Smmel/*
187310600Smmel * Offset "not set" value.
188310600Smmel */
189310600Smmel#define OFFSET_NOT_SET	0xffffffffU
190310600Smmel
191310600Smmel/*
192310600Smmel * Absolute offsets, which are offsets from the beginning of the raw
193310600Smmel * packet data, are, in the general case, the sum of a variable value
194310600Smmel * and a constant value; the variable value may be absent, in which
195310600Smmel * case the offset is only the constant value, and the constant value
196310600Smmel * may be zero, in which case the offset is only the variable value.
197310600Smmel *
198310600Smmel * bpf_abs_offset is a structure containing all that information:
199310600Smmel *
200310600Smmel *   is_variable is 1 if there's a variable part.
201310600Smmel *
202310600Smmel *   constant_part is the constant part of the value, possibly zero;
203310600Smmel *
204310600Smmel *   if is_variable is 1, reg is the register number for a register
205310600Smmel *   containing the variable value if the register has been assigned,
206310600Smmel *   and -1 otherwise.
207310600Smmel */
208310600Smmeltypedef struct {
209310600Smmel	int	is_variable;
210310600Smmel	u_int	constant_part;
211310600Smmel	int	reg;
212310600Smmel} bpf_abs_offset;
213310600Smmel
214310600Smmel/*
215310600Smmel * Value passed to gen_load_a() to indicate what the offset argument
216310600Smmel * is relative to the beginning of.
217310600Smmel */
218310600Smmelenum e_offrel {
219310600Smmel	OR_PACKET,		/* full packet data */
220310600Smmel	OR_LINKHDR,		/* link-layer header */
221310600Smmel	OR_PREVLINKHDR,		/* previous link-layer header */
222310600Smmel	OR_LLC,			/* 802.2 LLC header */
223310600Smmel	OR_PREVMPLSHDR,		/* previous MPLS header */
224310600Smmel	OR_LINKTYPE,		/* link-layer type */
225310600Smmel	OR_LINKPL,		/* link-layer payload */
226310600Smmel	OR_LINKPL_NOSNAP,	/* link-layer payload, with no SNAP header at the link layer */
227310600Smmel	OR_TRAN_IPV4,		/* transport-layer header, with IPv4 network layer */
228310600Smmel	OR_TRAN_IPV6		/* transport-layer header, with IPv6 network layer */
229310600Smmel};
230310600Smmel
231310600Smmel/*
232310600Smmel * We divy out chunks of memory rather than call malloc each time so
233310600Smmel * we don't have to worry about leaking memory.  It's probably
234310600Smmel * not a big deal if all this memory was wasted but if this ever
235310600Smmel * goes into a library that would probably not be a good idea.
236310600Smmel *
237310600Smmel * XXX - this *is* in a library....
238310600Smmel */
239310600Smmel#define NCHUNKS 16
240310600Smmel#define CHUNK0SIZE 1024
241310600Smmelstruct chunk {
242310600Smmel	size_t n_left;
243310600Smmel	void *m;
244310600Smmel};
245310600Smmel
246310600Smmel/* Code generator state */
247310600Smmel
248310600Smmelstruct _compiler_state {
249310600Smmel	jmp_buf top_ctx;
250310600Smmel	pcap_t *bpf_pcap;
251310600Smmel
252310600Smmel	struct icode ic;
253310600Smmel
254310600Smmel	int snaplen;
255310600Smmel
256310600Smmel	int linktype;
257310600Smmel	int prevlinktype;
258310600Smmel	int outermostlinktype;
259310600Smmel
260310600Smmel	bpf_u_int32 netmask;
261310600Smmel	int no_optimize;
262310600Smmel
263310600Smmel	/* Hack for handling VLAN and MPLS stacks. */
264310600Smmel	u_int label_stack_depth;
265310600Smmel	u_int vlan_stack_depth;
266310600Smmel
267310600Smmel	/* XXX */
268310600Smmel	u_int pcap_fddipad;
269310600Smmel
270310600Smmel	/*
271310600Smmel	 * As errors are handled by a longjmp, anything allocated must
272310600Smmel	 * be freed in the longjmp handler, so it must be reachable
273310600Smmel	 * from that handler.
274310600Smmel	 *
275310600Smmel	 * One thing that's allocated is the result of pcap_nametoaddrinfo();
276310600Smmel	 * it must be freed with freeaddrinfo().  This variable points to
277310600Smmel	 * any addrinfo structure that would need to be freed.
278310600Smmel	 */
279310600Smmel	struct addrinfo *ai;
280310600Smmel
281310600Smmel	/*
282310600Smmel	 * Another thing that's allocated is the result of pcap_ether_aton();
283310600Smmel	 * it must be freed with free().  This variable points to any
284310600Smmel	 * address that would need to be freed.
285310600Smmel	 */
286310600Smmel	u_char *e;
287310600Smmel
288310600Smmel	/*
289310600Smmel	 * Various code constructs need to know the layout of the packet.
290310600Smmel	 * These values give the necessary offsets from the beginning
291310600Smmel	 * of the packet data.
292310600Smmel	 */
293310600Smmel
294310600Smmel	/*
295310600Smmel	 * Absolute offset of the beginning of the link-layer header.
296310600Smmel	 */
297310600Smmel	bpf_abs_offset off_linkhdr;
298310600Smmel
299310600Smmel	/*
300310600Smmel	 * If we're checking a link-layer header for a packet encapsulated
301310600Smmel	 * in another protocol layer, this is the equivalent information
302310600Smmel	 * for the previous layers' link-layer header from the beginning
303310600Smmel	 * of the raw packet data.
304310600Smmel	 */
305310600Smmel	bpf_abs_offset off_prevlinkhdr;
306310600Smmel
307310600Smmel	/*
308310600Smmel	 * This is the equivalent information for the outermost layers'
309310600Smmel	 * link-layer header.
310310600Smmel	 */
311310600Smmel	bpf_abs_offset off_outermostlinkhdr;
312310600Smmel
313310600Smmel	/*
314310600Smmel	 * Absolute offset of the beginning of the link-layer payload.
315310600Smmel	 */
316310600Smmel	bpf_abs_offset off_linkpl;
317310600Smmel
318310600Smmel	/*
319310600Smmel	 * "off_linktype" is the offset to information in the link-layer
320310600Smmel	 * header giving the packet type. This is an absolute offset
321310600Smmel	 * from the beginning of the packet.
322310600Smmel	 *
323310600Smmel	 * For Ethernet, it's the offset of the Ethernet type field; this
324310600Smmel	 * means that it must have a value that skips VLAN tags.
325310600Smmel	 *
326310600Smmel	 * For link-layer types that always use 802.2 headers, it's the
327310600Smmel	 * offset of the LLC header; this means that it must have a value
328310600Smmel	 * that skips VLAN tags.
329310600Smmel	 *
330310600Smmel	 * For PPP, it's the offset of the PPP type field.
331310600Smmel	 *
332310600Smmel	 * For Cisco HDLC, it's the offset of the CHDLC type field.
333310600Smmel	 *
334310600Smmel	 * For BSD loopback, it's the offset of the AF_ value.
335310600Smmel	 *
336310600Smmel	 * For Linux cooked sockets, it's the offset of the type field.
337310600Smmel	 *
338310600Smmel	 * off_linktype.constant_part is set to OFFSET_NOT_SET for no
339310600Smmel	 * encapsulation, in which case, IP is assumed.
340310600Smmel	 */
341310600Smmel	bpf_abs_offset off_linktype;
342310600Smmel
343310600Smmel	/*
344310600Smmel	 * TRUE if the link layer includes an ATM pseudo-header.
345310600Smmel	 */
346310600Smmel	int is_atm;
347310600Smmel
348310600Smmel	/*
349310600Smmel	 * TRUE if "geneve" appeared in the filter; it causes us to
350310600Smmel	 * generate code that checks for a Geneve header and assume
351310600Smmel	 * that later filters apply to the encapsulated payload.
352310600Smmel	 */
353310600Smmel	int is_geneve;
354310600Smmel
355310600Smmel	/*
356310600Smmel	 * TRUE if we need variable length part of VLAN offset
357310600Smmel	 */
358310600Smmel	int is_vlan_vloffset;
359310600Smmel
360310600Smmel	/*
361310600Smmel	 * These are offsets for the ATM pseudo-header.
362310600Smmel	 */
363310600Smmel	u_int off_vpi;
364310600Smmel	u_int off_vci;
365310600Smmel	u_int off_proto;
366310600Smmel
367310600Smmel	/*
368310600Smmel	 * These are offsets for the MTP2 fields.
369310600Smmel	 */
370310600Smmel	u_int off_li;
371310600Smmel	u_int off_li_hsl;
372310600Smmel
373310600Smmel	/*
374310600Smmel	 * These are offsets for the MTP3 fields.
375310600Smmel	 */
376310600Smmel	u_int off_sio;
377310600Smmel	u_int off_opc;
378310600Smmel	u_int off_dpc;
379310600Smmel	u_int off_sls;
380310600Smmel
381310600Smmel	/*
382310600Smmel	 * This is the offset of the first byte after the ATM pseudo_header,
383310600Smmel	 * or -1 if there is no ATM pseudo-header.
384310600Smmel	 */
385310600Smmel	u_int off_payload;
386310600Smmel
387310600Smmel	/*
388310600Smmel	 * These are offsets to the beginning of the network-layer header.
389310600Smmel	 * They are relative to the beginning of the link-layer payload
390310600Smmel	 * (i.e., they don't include off_linkhdr.constant_part or
391310600Smmel	 * off_linkpl.constant_part).
392310600Smmel	 *
393310600Smmel	 * If the link layer never uses 802.2 LLC:
394310600Smmel	 *
395310600Smmel	 *	"off_nl" and "off_nl_nosnap" are the same.
396310600Smmel	 *
397310600Smmel	 * If the link layer always uses 802.2 LLC:
398310600Smmel	 *
399310600Smmel	 *	"off_nl" is the offset if there's a SNAP header following
400310600Smmel	 *	the 802.2 header;
401	 *
402	 *	"off_nl_nosnap" is the offset if there's no SNAP header.
403	 *
404	 * If the link layer is Ethernet:
405	 *
406	 *	"off_nl" is the offset if the packet is an Ethernet II packet
407	 *	(we assume no 802.3+802.2+SNAP);
408	 *
409	 *	"off_nl_nosnap" is the offset if the packet is an 802.3 packet
410	 *	with an 802.2 header following it.
411	 */
412	u_int off_nl;
413	u_int off_nl_nosnap;
414
415	/*
416	 * Here we handle simple allocation of the scratch registers.
417	 * If too many registers are alloc'd, the allocator punts.
418	 */
419	int regused[BPF_MEMWORDS];
420	int curreg;
421
422	/*
423	 * Memory chunks.
424	 */
425	struct chunk chunks[NCHUNKS];
426	int cur_chunk;
427};
428
429/*
430 * For use by routines outside this file.
431 */
432/* VARARGS */
433void
434bpf_set_error(compiler_state_t *cstate, const char *fmt, ...)
435{
436	va_list ap;
437
438	va_start(ap, fmt);
439	(void)pcap_vsnprintf(cstate->bpf_pcap->errbuf, PCAP_ERRBUF_SIZE,
440	    fmt, ap);
441	va_end(ap);
442}
443
444/*
445 * For use *ONLY* in routines in this file.
446 */
447static void PCAP_NORETURN bpf_error(compiler_state_t *, const char *, ...)
448    PCAP_PRINTFLIKE(2, 3);
449
450/* VARARGS */
451static void PCAP_NORETURN
452bpf_error(compiler_state_t *cstate, const char *fmt, ...)
453{
454	va_list ap;
455
456	va_start(ap, fmt);
457	(void)pcap_vsnprintf(cstate->bpf_pcap->errbuf, PCAP_ERRBUF_SIZE,
458	    fmt, ap);
459	va_end(ap);
460	longjmp(cstate->top_ctx, 1);
461	/*NOTREACHED*/
462}
463
464static int init_linktype(compiler_state_t *, pcap_t *);
465
466static void init_regs(compiler_state_t *);
467static int alloc_reg(compiler_state_t *);
468static void free_reg(compiler_state_t *, int);
469
470static void initchunks(compiler_state_t *cstate);
471static void *newchunk_nolongjmp(compiler_state_t *cstate, size_t);
472static void *newchunk(compiler_state_t *cstate, size_t);
473static void freechunks(compiler_state_t *cstate);
474static inline struct block *new_block(compiler_state_t *cstate, int);
475static inline struct slist *new_stmt(compiler_state_t *cstate, int);
476static struct block *gen_retblk(compiler_state_t *cstate, int);
477static inline void syntax(compiler_state_t *cstate);
478
479static void backpatch(struct block *, struct block *);
480static void merge(struct block *, struct block *);
481static struct block *gen_cmp(compiler_state_t *, enum e_offrel, u_int,
482    u_int, bpf_int32);
483static struct block *gen_cmp_gt(compiler_state_t *, enum e_offrel, u_int,
484    u_int, bpf_int32);
485static struct block *gen_cmp_ge(compiler_state_t *, enum e_offrel, u_int,
486    u_int, bpf_int32);
487static struct block *gen_cmp_lt(compiler_state_t *, enum e_offrel, u_int,
488    u_int, bpf_int32);
489static struct block *gen_cmp_le(compiler_state_t *, enum e_offrel, u_int,
490    u_int, bpf_int32);
491static struct block *gen_mcmp(compiler_state_t *, enum e_offrel, u_int,
492    u_int, bpf_int32, bpf_u_int32);
493static struct block *gen_bcmp(compiler_state_t *, enum e_offrel, u_int,
494    u_int, const u_char *);
495static struct block *gen_ncmp(compiler_state_t *, enum e_offrel, bpf_u_int32,
496    bpf_u_int32, bpf_u_int32, bpf_u_int32, int, bpf_int32);
497static struct slist *gen_load_absoffsetrel(compiler_state_t *, bpf_abs_offset *,
498    u_int, u_int);
499static struct slist *gen_load_a(compiler_state_t *, enum e_offrel, u_int,
500    u_int);
501static struct slist *gen_loadx_iphdrlen(compiler_state_t *);
502static struct block *gen_uncond(compiler_state_t *, int);
503static inline struct block *gen_true(compiler_state_t *);
504static inline struct block *gen_false(compiler_state_t *);
505static struct block *gen_ether_linktype(compiler_state_t *, int);
506static struct block *gen_ipnet_linktype(compiler_state_t *, int);
507static struct block *gen_linux_sll_linktype(compiler_state_t *, int);
508static struct slist *gen_load_prism_llprefixlen(compiler_state_t *);
509static struct slist *gen_load_avs_llprefixlen(compiler_state_t *);
510static struct slist *gen_load_radiotap_llprefixlen(compiler_state_t *);
511static struct slist *gen_load_ppi_llprefixlen(compiler_state_t *);
512static void insert_compute_vloffsets(compiler_state_t *, struct block *);
513static struct slist *gen_abs_offset_varpart(compiler_state_t *,
514    bpf_abs_offset *);
515static int ethertype_to_ppptype(int);
516static struct block *gen_linktype(compiler_state_t *, int);
517static struct block *gen_snap(compiler_state_t *, bpf_u_int32, bpf_u_int32);
518static struct block *gen_llc_linktype(compiler_state_t *, int);
519static struct block *gen_hostop(compiler_state_t *, bpf_u_int32, bpf_u_int32,
520    int, int, u_int, u_int);
521#ifdef INET6
522static struct block *gen_hostop6(compiler_state_t *, struct in6_addr *,
523    struct in6_addr *, int, int, u_int, u_int);
524#endif
525static struct block *gen_ahostop(compiler_state_t *, const u_char *, int);
526static struct block *gen_ehostop(compiler_state_t *, const u_char *, int);
527static struct block *gen_fhostop(compiler_state_t *, const u_char *, int);
528static struct block *gen_thostop(compiler_state_t *, const u_char *, int);
529static struct block *gen_wlanhostop(compiler_state_t *, const u_char *, int);
530static struct block *gen_ipfchostop(compiler_state_t *, const u_char *, int);
531static struct block *gen_dnhostop(compiler_state_t *, bpf_u_int32, int);
532static struct block *gen_mpls_linktype(compiler_state_t *, int);
533static struct block *gen_host(compiler_state_t *, bpf_u_int32, bpf_u_int32,
534    int, int, int);
535#ifdef INET6
536static struct block *gen_host6(compiler_state_t *, struct in6_addr *,
537    struct in6_addr *, int, int, int);
538#endif
539#ifndef INET6
540static struct block *gen_gateway(compiler_state_t *, const u_char *,
541    struct addrinfo *, int, int);
542#endif
543static struct block *gen_ipfrag(compiler_state_t *);
544static struct block *gen_portatom(compiler_state_t *, int, bpf_int32);
545static struct block *gen_portrangeatom(compiler_state_t *, int, bpf_int32,
546    bpf_int32);
547static struct block *gen_portatom6(compiler_state_t *, int, bpf_int32);
548static struct block *gen_portrangeatom6(compiler_state_t *, int, bpf_int32,
549    bpf_int32);
550struct block *gen_portop(compiler_state_t *, int, int, int);
551static struct block *gen_port(compiler_state_t *, int, int, int);
552struct block *gen_portrangeop(compiler_state_t *, int, int, int, int);
553static struct block *gen_portrange(compiler_state_t *, int, int, int, int);
554struct block *gen_portop6(compiler_state_t *, int, int, int);
555static struct block *gen_port6(compiler_state_t *, int, int, int);
556struct block *gen_portrangeop6(compiler_state_t *, int, int, int, int);
557static struct block *gen_portrange6(compiler_state_t *, int, int, int, int);
558static int lookup_proto(compiler_state_t *, const char *, int);
559static struct block *gen_protochain(compiler_state_t *, int, int, int);
560static struct block *gen_proto(compiler_state_t *, int, int, int);
561static struct slist *xfer_to_x(compiler_state_t *, struct arth *);
562static struct slist *xfer_to_a(compiler_state_t *, struct arth *);
563static struct block *gen_mac_multicast(compiler_state_t *, int);
564static struct block *gen_len(compiler_state_t *, int, int);
565static struct block *gen_check_802_11_data_frame(compiler_state_t *);
566static struct block *gen_geneve_ll_check(compiler_state_t *cstate);
567
568static struct block *gen_ppi_dlt_check(compiler_state_t *);
569static struct block *gen_atmfield_code_internal(compiler_state_t *, int,
570    bpf_int32, bpf_u_int32, int);
571static struct block *gen_atmtype_llc(compiler_state_t *);
572static struct block *gen_msg_abbrev(compiler_state_t *, int type);
573
574static void
575initchunks(compiler_state_t *cstate)
576{
577	int i;
578
579	for (i = 0; i < NCHUNKS; i++) {
580		cstate->chunks[i].n_left = 0;
581		cstate->chunks[i].m = NULL;
582	}
583	cstate->cur_chunk = 0;
584}
585
586static void *
587newchunk_nolongjmp(compiler_state_t *cstate, size_t n)
588{
589	struct chunk *cp;
590	int k;
591	size_t size;
592
593#ifndef __NetBSD__
594	/* XXX Round up to nearest long. */
595	n = (n + sizeof(long) - 1) & ~(sizeof(long) - 1);
596#else
597	/* XXX Round up to structure boundary. */
598	n = ALIGN(n);
599#endif
600
601	cp = &cstate->chunks[cstate->cur_chunk];
602	if (n > cp->n_left) {
603		++cp;
604		k = ++cstate->cur_chunk;
605		if (k >= NCHUNKS) {
606			bpf_set_error(cstate, "out of memory");
607			return (NULL);
608		}
609		size = CHUNK0SIZE << k;
610		cp->m = (void *)malloc(size);
611		if (cp->m == NULL) {
612			bpf_set_error(cstate, "out of memory");
613			return (NULL);
614		}
615		memset((char *)cp->m, 0, size);
616		cp->n_left = size;
617		if (n > size) {
618			bpf_set_error(cstate, "out of memory");
619			return (NULL);
620		}
621	}
622	cp->n_left -= n;
623	return (void *)((char *)cp->m + cp->n_left);
624}
625
626static void *
627newchunk(compiler_state_t *cstate, size_t n)
628{
629	void *p;
630
631	p = newchunk_nolongjmp(cstate, n);
632	if (p == NULL) {
633		longjmp(cstate->top_ctx, 1);
634		/*NOTREACHED*/
635	}
636	return (p);
637}
638
639static void
640freechunks(compiler_state_t *cstate)
641{
642	int i;
643
644	for (i = 0; i < NCHUNKS; ++i)
645		if (cstate->chunks[i].m != NULL)
646			free(cstate->chunks[i].m);
647}
648
649/*
650 * A strdup whose allocations are freed after code generation is over.
651 * This is used by the lexical analyzer, so it can't longjmp; it just
652 * returns NULL on an allocation error, and the callers must check
653 * for it.
654 */
655char *
656sdup(compiler_state_t *cstate, const char *s)
657{
658	size_t n = strlen(s) + 1;
659	char *cp = newchunk_nolongjmp(cstate, n);
660
661	if (cp == NULL)
662		return (NULL);
663	pcap_strlcpy(cp, s, n);
664	return (cp);
665}
666
667static inline struct block *
668new_block(compiler_state_t *cstate, int code)
669{
670	struct block *p;
671
672	p = (struct block *)newchunk(cstate, sizeof(*p));
673	p->s.code = code;
674	p->head = p;
675
676	return p;
677}
678
679static inline struct slist *
680new_stmt(compiler_state_t *cstate, int code)
681{
682	struct slist *p;
683
684	p = (struct slist *)newchunk(cstate, sizeof(*p));
685	p->s.code = code;
686
687	return p;
688}
689
690static struct block *
691gen_retblk(compiler_state_t *cstate, int v)
692{
693	struct block *b = new_block(cstate, BPF_RET|BPF_K);
694
695	b->s.k = v;
696	return b;
697}
698
699static inline PCAP_NORETURN_DEF void
700syntax(compiler_state_t *cstate)
701{
702	bpf_error(cstate, "syntax error in filter expression");
703}
704
705int
706pcap_compile(pcap_t *p, struct bpf_program *program,
707	     const char *buf, int optimize, bpf_u_int32 mask)
708{
709#ifdef _WIN32
710	static int done = 0;
711#endif
712	compiler_state_t cstate;
713	const char * volatile xbuf = buf;
714	yyscan_t scanner = NULL;
715	volatile YY_BUFFER_STATE in_buffer = NULL;
716	u_int len;
717	int  rc;
718
719	/*
720	 * If this pcap_t hasn't been activated, it doesn't have a
721	 * link-layer type, so we can't use it.
722	 */
723	if (!p->activated) {
724		pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
725		    "not-yet-activated pcap_t passed to pcap_compile");
726		return (-1);
727	}
728
729#ifdef _WIN32
730	if (!done)
731		pcap_wsockinit();
732	done = 1;
733#endif
734
735#ifdef ENABLE_REMOTE
736	/*
737	 * If the device on which we're capturing need to be notified
738	 * that a new filter is being compiled, do so.
739	 *
740	 * This allows them to save a copy of it, in case, for example,
741	 * they're implementing a form of remote packet capture, and
742	 * want the remote machine to filter out the packets in which
743	 * it's sending the packets it's captured.
744	 *
745	 * XXX - the fact that we happen to be compiling a filter
746	 * doesn't necessarily mean we'll be installing it as the
747	 * filter for this pcap_t; we might be running it from userland
748	 * on captured packets to do packet classification.  We really
749	 * need a better way of handling this, but this is all that
750	 * the WinPcap remote capture code did.
751	 */
752	if (p->save_current_filter_op != NULL)
753		(p->save_current_filter_op)(p, buf);
754#endif
755
756	initchunks(&cstate);
757	cstate.no_optimize = 0;
758#ifdef INET6
759	cstate.ai = NULL;
760#endif
761	cstate.e = NULL;
762	cstate.ic.root = NULL;
763	cstate.ic.cur_mark = 0;
764	cstate.bpf_pcap = p;
765	init_regs(&cstate);
766
767	cstate.netmask = mask;
768
769	cstate.snaplen = pcap_snapshot(p);
770	if (cstate.snaplen == 0) {
771		pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
772			 "snaplen of 0 rejects all packets");
773		rc = -1;
774		goto quit;
775	}
776
777	if (pcap_lex_init(&scanner) != 0)
778		pcap_fmt_errmsg_for_errno(p->errbuf, PCAP_ERRBUF_SIZE,
779		    errno, "can't initialize scanner");
780	in_buffer = pcap__scan_string(xbuf ? xbuf : "", scanner);
781
782	/*
783	 * Associate the compiler state with the lexical analyzer
784	 * state.
785	 */
786	pcap_set_extra(&cstate, scanner);
787
788	if (init_linktype(&cstate, p) == -1) {
789		rc = -1;
790		goto quit;
791	}
792	if (pcap_parse(scanner, &cstate) != 0) {
793#ifdef INET6
794		if (cstate.ai != NULL)
795			freeaddrinfo(cstate.ai);
796#endif
797		if (cstate.e != NULL)
798			free(cstate.e);
799		rc = -1;
800		goto quit;
801	}
802
803	if (cstate.ic.root == NULL) {
804		/*
805		 * Catch errors reported by gen_retblk().
806		 */
807		if (setjmp(cstate.top_ctx)) {
808			rc = -1;
809			goto quit;
810		}
811		cstate.ic.root = gen_retblk(&cstate, cstate.snaplen);
812	}
813
814	if (optimize && !cstate.no_optimize) {
815		if (bpf_optimize(&cstate.ic, p->errbuf) == -1) {
816			/* Failure */
817			rc = -1;
818			goto quit;
819		}
820		if (cstate.ic.root == NULL ||
821		    (cstate.ic.root->s.code == (BPF_RET|BPF_K) && cstate.ic.root->s.k == 0)) {
822			(void)pcap_snprintf(p->errbuf, PCAP_ERRBUF_SIZE,
823			    "expression rejects all packets");
824			rc = -1;
825			goto quit;
826		}
827	}
828	program->bf_insns = icode_to_fcode(&cstate.ic,
829	    cstate.ic.root, &len, p->errbuf);
830	if (program->bf_insns == NULL) {
831		/* Failure */
832		rc = -1;
833		goto quit;
834	}
835	program->bf_len = len;
836
837	rc = 0;  /* We're all okay */
838
839quit:
840	/*
841	 * Clean up everything for the lexical analyzer.
842	 */
843	if (in_buffer != NULL)
844		pcap__delete_buffer(in_buffer, scanner);
845	if (scanner != NULL)
846		pcap_lex_destroy(scanner);
847
848	/*
849	 * Clean up our own allocated memory.
850	 */
851	freechunks(&cstate);
852
853	return (rc);
854}
855
856/*
857 * entry point for using the compiler with no pcap open
858 * pass in all the stuff that is needed explicitly instead.
859 */
860int
861pcap_compile_nopcap(int snaplen_arg, int linktype_arg,
862		    struct bpf_program *program,
863	     const char *buf, int optimize, bpf_u_int32 mask)
864{
865	pcap_t *p;
866	int ret;
867
868	p = pcap_open_dead(linktype_arg, snaplen_arg);
869	if (p == NULL)
870		return (-1);
871	ret = pcap_compile(p, program, buf, optimize, mask);
872	pcap_close(p);
873	return (ret);
874}
875
876/*
877 * Clean up a "struct bpf_program" by freeing all the memory allocated
878 * in it.
879 */
880void
881pcap_freecode(struct bpf_program *program)
882{
883	program->bf_len = 0;
884	if (program->bf_insns != NULL) {
885		free((char *)program->bf_insns);
886		program->bf_insns = NULL;
887	}
888}
889
890/*
891 * Backpatch the blocks in 'list' to 'target'.  The 'sense' field indicates
892 * which of the jt and jf fields has been resolved and which is a pointer
893 * back to another unresolved block (or nil).  At least one of the fields
894 * in each block is already resolved.
895 */
896static void
897backpatch(struct block *list, struct block *target)
898{
899	struct block *next;
900
901	while (list) {
902		if (!list->sense) {
903			next = JT(list);
904			JT(list) = target;
905		} else {
906			next = JF(list);
907			JF(list) = target;
908		}
909		list = next;
910	}
911}
912
913/*
914 * Merge the lists in b0 and b1, using the 'sense' field to indicate
915 * which of jt and jf is the link.
916 */
917static void
918merge(struct block *b0, struct block *b1)
919{
920	register struct block **p = &b0;
921
922	/* Find end of list. */
923	while (*p)
924		p = !((*p)->sense) ? &JT(*p) : &JF(*p);
925
926	/* Concatenate the lists. */
927	*p = b1;
928}
929
930int
931finish_parse(compiler_state_t *cstate, struct block *p)
932{
933	struct block *ppi_dlt_check;
934
935	/*
936	 * Catch errors reported by us and routines below us, and return -1
937	 * on an error.
938	 */
939	if (setjmp(cstate->top_ctx))
940		return (-1);
941
942	/*
943	 * Insert before the statements of the first (root) block any
944	 * statements needed to load the lengths of any variable-length
945	 * headers into registers.
946	 *
947	 * XXX - a fancier strategy would be to insert those before the
948	 * statements of all blocks that use those lengths and that
949	 * have no predecessors that use them, so that we only compute
950	 * the lengths if we need them.  There might be even better
951	 * approaches than that.
952	 *
953	 * However, those strategies would be more complicated, and
954	 * as we don't generate code to compute a length if the
955	 * program has no tests that use the length, and as most
956	 * tests will probably use those lengths, we would just
957	 * postpone computing the lengths so that it's not done
958	 * for tests that fail early, and it's not clear that's
959	 * worth the effort.
960	 */
961	insert_compute_vloffsets(cstate, p->head);
962
963	/*
964	 * For DLT_PPI captures, generate a check of the per-packet
965	 * DLT value to make sure it's DLT_IEEE802_11.
966	 *
967	 * XXX - TurboCap cards use DLT_PPI for Ethernet.
968	 * Can we just define some DLT_ETHERNET_WITH_PHDR pseudo-header
969	 * with appropriate Ethernet information and use that rather
970	 * than using something such as DLT_PPI where you don't know
971	 * the link-layer header type until runtime, which, in the
972	 * general case, would force us to generate both Ethernet *and*
973	 * 802.11 code (*and* anything else for which PPI is used)
974	 * and choose between them early in the BPF program?
975	 */
976	ppi_dlt_check = gen_ppi_dlt_check(cstate);
977	if (ppi_dlt_check != NULL)
978		gen_and(ppi_dlt_check, p);
979
980	backpatch(p, gen_retblk(cstate, cstate->snaplen));
981	p->sense = !p->sense;
982	backpatch(p, gen_retblk(cstate, 0));
983	cstate->ic.root = p->head;
984	return (0);
985}
986
987void
988gen_and(struct block *b0, struct block *b1)
989{
990	backpatch(b0, b1->head);
991	b0->sense = !b0->sense;
992	b1->sense = !b1->sense;
993	merge(b1, b0);
994	b1->sense = !b1->sense;
995	b1->head = b0->head;
996}
997
998void
999gen_or(struct block *b0, struct block *b1)
1000{
1001	b0->sense = !b0->sense;
1002	backpatch(b0, b1->head);
1003	b0->sense = !b0->sense;
1004	merge(b1, b0);
1005	b1->head = b0->head;
1006}
1007
1008void
1009gen_not(struct block *b)
1010{
1011	b->sense = !b->sense;
1012}
1013
1014static struct block *
1015gen_cmp(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
1016    u_int size, bpf_int32 v)
1017{
1018	return gen_ncmp(cstate, offrel, offset, size, 0xffffffff, BPF_JEQ, 0, v);
1019}
1020
1021static struct block *
1022gen_cmp_gt(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
1023    u_int size, bpf_int32 v)
1024{
1025	return gen_ncmp(cstate, offrel, offset, size, 0xffffffff, BPF_JGT, 0, v);
1026}
1027
1028static struct block *
1029gen_cmp_ge(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
1030    u_int size, bpf_int32 v)
1031{
1032	return gen_ncmp(cstate, offrel, offset, size, 0xffffffff, BPF_JGE, 0, v);
1033}
1034
1035static struct block *
1036gen_cmp_lt(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
1037    u_int size, bpf_int32 v)
1038{
1039	return gen_ncmp(cstate, offrel, offset, size, 0xffffffff, BPF_JGE, 1, v);
1040}
1041
1042static struct block *
1043gen_cmp_le(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
1044    u_int size, bpf_int32 v)
1045{
1046	return gen_ncmp(cstate, offrel, offset, size, 0xffffffff, BPF_JGT, 1, v);
1047}
1048
1049static struct block *
1050gen_mcmp(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
1051    u_int size, bpf_int32 v, bpf_u_int32 mask)
1052{
1053	return gen_ncmp(cstate, offrel, offset, size, mask, BPF_JEQ, 0, v);
1054}
1055
1056static struct block *
1057gen_bcmp(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
1058    u_int size, const u_char *v)
1059{
1060	register struct block *b, *tmp;
1061
1062	/*
1063	 * XXX - the actual *instructions* do unsigned comparisons on
1064	 * most platforms, and the load instructions don't do sign
1065	 * extension, so gen_cmp() should really take an unsigned
1066	 * value argument.
1067	 *
1068	 * As the load instructons also don't do sign-extension, we
1069	 * fetch the values from the byte array as unsigned.  We don't
1070	 * want to use the signed versions of the extract calls.
1071	 */
1072	b = NULL;
1073	while (size >= 4) {
1074		register const u_char *p = &v[size - 4];
1075
1076		tmp = gen_cmp(cstate, offrel, offset + size - 4, BPF_W,
1077		    (bpf_int32)EXTRACT_32BITS(p));
1078		if (b != NULL)
1079			gen_and(b, tmp);
1080		b = tmp;
1081		size -= 4;
1082	}
1083	while (size >= 2) {
1084		register const u_char *p = &v[size - 2];
1085
1086		tmp = gen_cmp(cstate, offrel, offset + size - 2, BPF_H,
1087		    (bpf_int32)EXTRACT_16BITS(p));
1088		if (b != NULL)
1089			gen_and(b, tmp);
1090		b = tmp;
1091		size -= 2;
1092	}
1093	if (size > 0) {
1094		tmp = gen_cmp(cstate, offrel, offset, BPF_B, (bpf_int32)v[0]);
1095		if (b != NULL)
1096			gen_and(b, tmp);
1097		b = tmp;
1098	}
1099	return b;
1100}
1101
1102/*
1103 * AND the field of size "size" at offset "offset" relative to the header
1104 * specified by "offrel" with "mask", and compare it with the value "v"
1105 * with the test specified by "jtype"; if "reverse" is true, the test
1106 * should test the opposite of "jtype".
1107 */
1108static struct block *
1109gen_ncmp(compiler_state_t *cstate, enum e_offrel offrel, bpf_u_int32 offset,
1110    bpf_u_int32 size, bpf_u_int32 mask, bpf_u_int32 jtype, int reverse,
1111    bpf_int32 v)
1112{
1113	struct slist *s, *s2;
1114	struct block *b;
1115
1116	s = gen_load_a(cstate, offrel, offset, size);
1117
1118	if (mask != 0xffffffff) {
1119		s2 = new_stmt(cstate, BPF_ALU|BPF_AND|BPF_K);
1120		s2->s.k = mask;
1121		sappend(s, s2);
1122	}
1123
1124	b = new_block(cstate, JMP(jtype));
1125	b->stmts = s;
1126	b->s.k = v;
1127	if (reverse && (jtype == BPF_JGT || jtype == BPF_JGE))
1128		gen_not(b);
1129	return b;
1130}
1131
1132static int
1133init_linktype(compiler_state_t *cstate, pcap_t *p)
1134{
1135	cstate->pcap_fddipad = p->fddipad;
1136
1137	/*
1138	 * We start out with only one link-layer header.
1139	 */
1140	cstate->outermostlinktype = pcap_datalink(p);
1141	cstate->off_outermostlinkhdr.constant_part = 0;
1142	cstate->off_outermostlinkhdr.is_variable = 0;
1143	cstate->off_outermostlinkhdr.reg = -1;
1144
1145	cstate->prevlinktype = cstate->outermostlinktype;
1146	cstate->off_prevlinkhdr.constant_part = 0;
1147	cstate->off_prevlinkhdr.is_variable = 0;
1148	cstate->off_prevlinkhdr.reg = -1;
1149
1150	cstate->linktype = cstate->outermostlinktype;
1151	cstate->off_linkhdr.constant_part = 0;
1152	cstate->off_linkhdr.is_variable = 0;
1153	cstate->off_linkhdr.reg = -1;
1154
1155	/*
1156	 * XXX
1157	 */
1158	cstate->off_linkpl.constant_part = 0;
1159	cstate->off_linkpl.is_variable = 0;
1160	cstate->off_linkpl.reg = -1;
1161
1162	cstate->off_linktype.constant_part = 0;
1163	cstate->off_linktype.is_variable = 0;
1164	cstate->off_linktype.reg = -1;
1165
1166	/*
1167	 * Assume it's not raw ATM with a pseudo-header, for now.
1168	 */
1169	cstate->is_atm = 0;
1170	cstate->off_vpi = OFFSET_NOT_SET;
1171	cstate->off_vci = OFFSET_NOT_SET;
1172	cstate->off_proto = OFFSET_NOT_SET;
1173	cstate->off_payload = OFFSET_NOT_SET;
1174
1175	/*
1176	 * And not Geneve.
1177	 */
1178	cstate->is_geneve = 0;
1179
1180	/*
1181	 * No variable length VLAN offset by default
1182	 */
1183	cstate->is_vlan_vloffset = 0;
1184
1185	/*
1186	 * And assume we're not doing SS7.
1187	 */
1188	cstate->off_li = OFFSET_NOT_SET;
1189	cstate->off_li_hsl = OFFSET_NOT_SET;
1190	cstate->off_sio = OFFSET_NOT_SET;
1191	cstate->off_opc = OFFSET_NOT_SET;
1192	cstate->off_dpc = OFFSET_NOT_SET;
1193	cstate->off_sls = OFFSET_NOT_SET;
1194
1195	cstate->label_stack_depth = 0;
1196	cstate->vlan_stack_depth = 0;
1197
1198	switch (cstate->linktype) {
1199
1200	case DLT_ARCNET:
1201		cstate->off_linktype.constant_part = 2;
1202		cstate->off_linkpl.constant_part = 6;
1203		cstate->off_nl = 0;		/* XXX in reality, variable! */
1204		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1205		break;
1206
1207	case DLT_ARCNET_LINUX:
1208		cstate->off_linktype.constant_part = 4;
1209		cstate->off_linkpl.constant_part = 8;
1210		cstate->off_nl = 0;		/* XXX in reality, variable! */
1211		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1212		break;
1213
1214	case DLT_EN10MB:
1215		cstate->off_linktype.constant_part = 12;
1216		cstate->off_linkpl.constant_part = 14;	/* Ethernet header length */
1217		cstate->off_nl = 0;		/* Ethernet II */
1218		cstate->off_nl_nosnap = 3;	/* 802.3+802.2 */
1219		break;
1220
1221	case DLT_SLIP:
1222		/*
1223		 * SLIP doesn't have a link level type.  The 16 byte
1224		 * header is hacked into our SLIP driver.
1225		 */
1226		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1227		cstate->off_linkpl.constant_part = 16;
1228		cstate->off_nl = 0;
1229		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1230		break;
1231
1232	case DLT_SLIP_BSDOS:
1233		/* XXX this may be the same as the DLT_PPP_BSDOS case */
1234		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1235		/* XXX end */
1236		cstate->off_linkpl.constant_part = 24;
1237		cstate->off_nl = 0;
1238		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1239		break;
1240
1241	case DLT_NULL:
1242	case DLT_LOOP:
1243		cstate->off_linktype.constant_part = 0;
1244		cstate->off_linkpl.constant_part = 4;
1245		cstate->off_nl = 0;
1246		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1247		break;
1248
1249	case DLT_ENC:
1250		cstate->off_linktype.constant_part = 0;
1251		cstate->off_linkpl.constant_part = 12;
1252		cstate->off_nl = 0;
1253		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1254		break;
1255
1256	case DLT_PPP:
1257	case DLT_PPP_PPPD:
1258	case DLT_C_HDLC:		/* BSD/OS Cisco HDLC */
1259	case DLT_PPP_SERIAL:		/* NetBSD sync/async serial PPP */
1260		cstate->off_linktype.constant_part = 2;	/* skip HDLC-like framing */
1261		cstate->off_linkpl.constant_part = 4;	/* skip HDLC-like framing and protocol field */
1262		cstate->off_nl = 0;
1263		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1264		break;
1265
1266	case DLT_PPP_ETHER:
1267		/*
1268		 * This does no include the Ethernet header, and
1269		 * only covers session state.
1270		 */
1271		cstate->off_linktype.constant_part = 6;
1272		cstate->off_linkpl.constant_part = 8;
1273		cstate->off_nl = 0;
1274		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1275		break;
1276
1277	case DLT_PPP_BSDOS:
1278		cstate->off_linktype.constant_part = 5;
1279		cstate->off_linkpl.constant_part = 24;
1280		cstate->off_nl = 0;
1281		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1282		break;
1283
1284	case DLT_FDDI:
1285		/*
1286		 * FDDI doesn't really have a link-level type field.
1287		 * We set "off_linktype" to the offset of the LLC header.
1288		 *
1289		 * To check for Ethernet types, we assume that SSAP = SNAP
1290		 * is being used and pick out the encapsulated Ethernet type.
1291		 * XXX - should we generate code to check for SNAP?
1292		 */
1293		cstate->off_linktype.constant_part = 13;
1294		cstate->off_linktype.constant_part += cstate->pcap_fddipad;
1295		cstate->off_linkpl.constant_part = 13;	/* FDDI MAC header length */
1296		cstate->off_linkpl.constant_part += cstate->pcap_fddipad;
1297		cstate->off_nl = 8;		/* 802.2+SNAP */
1298		cstate->off_nl_nosnap = 3;	/* 802.2 */
1299		break;
1300
1301	case DLT_IEEE802:
1302		/*
1303		 * Token Ring doesn't really have a link-level type field.
1304		 * We set "off_linktype" to the offset of the LLC header.
1305		 *
1306		 * To check for Ethernet types, we assume that SSAP = SNAP
1307		 * is being used and pick out the encapsulated Ethernet type.
1308		 * XXX - should we generate code to check for SNAP?
1309		 *
1310		 * XXX - the header is actually variable-length.
1311		 * Some various Linux patched versions gave 38
1312		 * as "off_linktype" and 40 as "off_nl"; however,
1313		 * if a token ring packet has *no* routing
1314		 * information, i.e. is not source-routed, the correct
1315		 * values are 20 and 22, as they are in the vanilla code.
1316		 *
1317		 * A packet is source-routed iff the uppermost bit
1318		 * of the first byte of the source address, at an
1319		 * offset of 8, has the uppermost bit set.  If the
1320		 * packet is source-routed, the total number of bytes
1321		 * of routing information is 2 plus bits 0x1F00 of
1322		 * the 16-bit value at an offset of 14 (shifted right
1323		 * 8 - figure out which byte that is).
1324		 */
1325		cstate->off_linktype.constant_part = 14;
1326		cstate->off_linkpl.constant_part = 14;	/* Token Ring MAC header length */
1327		cstate->off_nl = 8;		/* 802.2+SNAP */
1328		cstate->off_nl_nosnap = 3;	/* 802.2 */
1329		break;
1330
1331	case DLT_PRISM_HEADER:
1332	case DLT_IEEE802_11_RADIO_AVS:
1333	case DLT_IEEE802_11_RADIO:
1334		cstate->off_linkhdr.is_variable = 1;
1335		/* Fall through, 802.11 doesn't have a variable link
1336		 * prefix but is otherwise the same. */
1337		/* FALLTHROUGH */
1338
1339	case DLT_IEEE802_11:
1340		/*
1341		 * 802.11 doesn't really have a link-level type field.
1342		 * We set "off_linktype.constant_part" to the offset of
1343		 * the LLC header.
1344		 *
1345		 * To check for Ethernet types, we assume that SSAP = SNAP
1346		 * is being used and pick out the encapsulated Ethernet type.
1347		 * XXX - should we generate code to check for SNAP?
1348		 *
1349		 * We also handle variable-length radio headers here.
1350		 * The Prism header is in theory variable-length, but in
1351		 * practice it's always 144 bytes long.  However, some
1352		 * drivers on Linux use ARPHRD_IEEE80211_PRISM, but
1353		 * sometimes or always supply an AVS header, so we
1354		 * have to check whether the radio header is a Prism
1355		 * header or an AVS header, so, in practice, it's
1356		 * variable-length.
1357		 */
1358		cstate->off_linktype.constant_part = 24;
1359		cstate->off_linkpl.constant_part = 0;	/* link-layer header is variable-length */
1360		cstate->off_linkpl.is_variable = 1;
1361		cstate->off_nl = 8;		/* 802.2+SNAP */
1362		cstate->off_nl_nosnap = 3;	/* 802.2 */
1363		break;
1364
1365	case DLT_PPI:
1366		/*
1367		 * At the moment we treat PPI the same way that we treat
1368		 * normal Radiotap encoded packets. The difference is in
1369		 * the function that generates the code at the beginning
1370		 * to compute the header length.  Since this code generator
1371		 * of PPI supports bare 802.11 encapsulation only (i.e.
1372		 * the encapsulated DLT should be DLT_IEEE802_11) we
1373		 * generate code to check for this too.
1374		 */
1375		cstate->off_linktype.constant_part = 24;
1376		cstate->off_linkpl.constant_part = 0;	/* link-layer header is variable-length */
1377		cstate->off_linkpl.is_variable = 1;
1378		cstate->off_linkhdr.is_variable = 1;
1379		cstate->off_nl = 8;		/* 802.2+SNAP */
1380		cstate->off_nl_nosnap = 3;	/* 802.2 */
1381		break;
1382
1383	case DLT_ATM_RFC1483:
1384	case DLT_ATM_CLIP:	/* Linux ATM defines this */
1385		/*
1386		 * assume routed, non-ISO PDUs
1387		 * (i.e., LLC = 0xAA-AA-03, OUT = 0x00-00-00)
1388		 *
1389		 * XXX - what about ISO PDUs, e.g. CLNP, ISIS, ESIS,
1390		 * or PPP with the PPP NLPID (e.g., PPPoA)?  The
1391		 * latter would presumably be treated the way PPPoE
1392		 * should be, so you can do "pppoe and udp port 2049"
1393		 * or "pppoa and tcp port 80" and have it check for
1394		 * PPPo{A,E} and a PPP protocol of IP and....
1395		 */
1396		cstate->off_linktype.constant_part = 0;
1397		cstate->off_linkpl.constant_part = 0;	/* packet begins with LLC header */
1398		cstate->off_nl = 8;		/* 802.2+SNAP */
1399		cstate->off_nl_nosnap = 3;	/* 802.2 */
1400		break;
1401
1402	case DLT_SUNATM:
1403		/*
1404		 * Full Frontal ATM; you get AALn PDUs with an ATM
1405		 * pseudo-header.
1406		 */
1407		cstate->is_atm = 1;
1408		cstate->off_vpi = SUNATM_VPI_POS;
1409		cstate->off_vci = SUNATM_VCI_POS;
1410		cstate->off_proto = PROTO_POS;
1411		cstate->off_payload = SUNATM_PKT_BEGIN_POS;
1412		cstate->off_linktype.constant_part = cstate->off_payload;
1413		cstate->off_linkpl.constant_part = cstate->off_payload;	/* if LLC-encapsulated */
1414		cstate->off_nl = 8;		/* 802.2+SNAP */
1415		cstate->off_nl_nosnap = 3;	/* 802.2 */
1416		break;
1417
1418	case DLT_RAW:
1419	case DLT_IPV4:
1420	case DLT_IPV6:
1421		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1422		cstate->off_linkpl.constant_part = 0;
1423		cstate->off_nl = 0;
1424		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1425		break;
1426
1427	case DLT_LINUX_SLL:	/* fake header for Linux cooked socket v1 */
1428		cstate->off_linktype.constant_part = 14;
1429		cstate->off_linkpl.constant_part = 16;
1430		cstate->off_nl = 0;
1431		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1432		break;
1433
1434	case DLT_LINUX_SLL2:	/* fake header for Linux cooked socket v2 */
1435		cstate->off_linktype.constant_part = 0;
1436		cstate->off_linkpl.constant_part = 20;
1437		cstate->off_nl = 0;
1438		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1439		break;
1440
1441	case DLT_LTALK:
1442		/*
1443		 * LocalTalk does have a 1-byte type field in the LLAP header,
1444		 * but really it just indicates whether there is a "short" or
1445		 * "long" DDP packet following.
1446		 */
1447		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1448		cstate->off_linkpl.constant_part = 0;
1449		cstate->off_nl = 0;
1450		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1451		break;
1452
1453	case DLT_IP_OVER_FC:
1454		/*
1455		 * RFC 2625 IP-over-Fibre-Channel doesn't really have a
1456		 * link-level type field.  We set "off_linktype" to the
1457		 * offset of the LLC header.
1458		 *
1459		 * To check for Ethernet types, we assume that SSAP = SNAP
1460		 * is being used and pick out the encapsulated Ethernet type.
1461		 * XXX - should we generate code to check for SNAP? RFC
1462		 * 2625 says SNAP should be used.
1463		 */
1464		cstate->off_linktype.constant_part = 16;
1465		cstate->off_linkpl.constant_part = 16;
1466		cstate->off_nl = 8;		/* 802.2+SNAP */
1467		cstate->off_nl_nosnap = 3;	/* 802.2 */
1468		break;
1469
1470	case DLT_FRELAY:
1471		/*
1472		 * XXX - we should set this to handle SNAP-encapsulated
1473		 * frames (NLPID of 0x80).
1474		 */
1475		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1476		cstate->off_linkpl.constant_part = 0;
1477		cstate->off_nl = 0;
1478		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1479		break;
1480
1481                /*
1482                 * the only BPF-interesting FRF.16 frames are non-control frames;
1483                 * Frame Relay has a variable length link-layer
1484                 * so lets start with offset 4 for now and increments later on (FIXME);
1485                 */
1486	case DLT_MFR:
1487		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1488		cstate->off_linkpl.constant_part = 0;
1489		cstate->off_nl = 4;
1490		cstate->off_nl_nosnap = 0;	/* XXX - for now -> no 802.2 LLC */
1491		break;
1492
1493	case DLT_APPLE_IP_OVER_IEEE1394:
1494		cstate->off_linktype.constant_part = 16;
1495		cstate->off_linkpl.constant_part = 18;
1496		cstate->off_nl = 0;
1497		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1498		break;
1499
1500	case DLT_SYMANTEC_FIREWALL:
1501		cstate->off_linktype.constant_part = 6;
1502		cstate->off_linkpl.constant_part = 44;
1503		cstate->off_nl = 0;		/* Ethernet II */
1504		cstate->off_nl_nosnap = 0;	/* XXX - what does it do with 802.3 packets? */
1505		break;
1506
1507#ifdef HAVE_NET_PFVAR_H
1508	case DLT_PFLOG:
1509		cstate->off_linktype.constant_part = 0;
1510		cstate->off_linkpl.constant_part = PFLOG_HDRLEN;
1511		cstate->off_nl = 0;
1512		cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
1513		break;
1514#endif
1515
1516        case DLT_JUNIPER_MFR:
1517        case DLT_JUNIPER_MLFR:
1518        case DLT_JUNIPER_MLPPP:
1519        case DLT_JUNIPER_PPP:
1520        case DLT_JUNIPER_CHDLC:
1521        case DLT_JUNIPER_FRELAY:
1522		cstate->off_linktype.constant_part = 4;
1523		cstate->off_linkpl.constant_part = 4;
1524		cstate->off_nl = 0;
1525		cstate->off_nl_nosnap = OFFSET_NOT_SET;	/* no 802.2 LLC */
1526                break;
1527
1528	case DLT_JUNIPER_ATM1:
1529		cstate->off_linktype.constant_part = 4;		/* in reality variable between 4-8 */
1530		cstate->off_linkpl.constant_part = 4;	/* in reality variable between 4-8 */
1531		cstate->off_nl = 0;
1532		cstate->off_nl_nosnap = 10;
1533		break;
1534
1535	case DLT_JUNIPER_ATM2:
1536		cstate->off_linktype.constant_part = 8;		/* in reality variable between 8-12 */
1537		cstate->off_linkpl.constant_part = 8;	/* in reality variable between 8-12 */
1538		cstate->off_nl = 0;
1539		cstate->off_nl_nosnap = 10;
1540		break;
1541
1542		/* frames captured on a Juniper PPPoE service PIC
1543		 * contain raw ethernet frames */
1544	case DLT_JUNIPER_PPPOE:
1545        case DLT_JUNIPER_ETHER:
1546		cstate->off_linkpl.constant_part = 14;
1547		cstate->off_linktype.constant_part = 16;
1548		cstate->off_nl = 18;		/* Ethernet II */
1549		cstate->off_nl_nosnap = 21;	/* 802.3+802.2 */
1550		break;
1551
1552	case DLT_JUNIPER_PPPOE_ATM:
1553		cstate->off_linktype.constant_part = 4;
1554		cstate->off_linkpl.constant_part = 6;
1555		cstate->off_nl = 0;
1556		cstate->off_nl_nosnap = OFFSET_NOT_SET;	/* no 802.2 LLC */
1557		break;
1558
1559	case DLT_JUNIPER_GGSN:
1560		cstate->off_linktype.constant_part = 6;
1561		cstate->off_linkpl.constant_part = 12;
1562		cstate->off_nl = 0;
1563		cstate->off_nl_nosnap = OFFSET_NOT_SET;	/* no 802.2 LLC */
1564		break;
1565
1566	case DLT_JUNIPER_ES:
1567		cstate->off_linktype.constant_part = 6;
1568		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;	/* not really a network layer but raw IP addresses */
1569		cstate->off_nl = OFFSET_NOT_SET;	/* not really a network layer but raw IP addresses */
1570		cstate->off_nl_nosnap = OFFSET_NOT_SET;	/* no 802.2 LLC */
1571		break;
1572
1573	case DLT_JUNIPER_MONITOR:
1574		cstate->off_linktype.constant_part = 12;
1575		cstate->off_linkpl.constant_part = 12;
1576		cstate->off_nl = 0;			/* raw IP/IP6 header */
1577		cstate->off_nl_nosnap = OFFSET_NOT_SET;	/* no 802.2 LLC */
1578		break;
1579
1580	case DLT_BACNET_MS_TP:
1581		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1582		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1583		cstate->off_nl = OFFSET_NOT_SET;
1584		cstate->off_nl_nosnap = OFFSET_NOT_SET;
1585		break;
1586
1587	case DLT_JUNIPER_SERVICES:
1588		cstate->off_linktype.constant_part = 12;
1589		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;	/* L3 proto location dep. on cookie type */
1590		cstate->off_nl = OFFSET_NOT_SET;	/* L3 proto location dep. on cookie type */
1591		cstate->off_nl_nosnap = OFFSET_NOT_SET;	/* no 802.2 LLC */
1592		break;
1593
1594	case DLT_JUNIPER_VP:
1595		cstate->off_linktype.constant_part = 18;
1596		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1597		cstate->off_nl = OFFSET_NOT_SET;
1598		cstate->off_nl_nosnap = OFFSET_NOT_SET;
1599		break;
1600
1601	case DLT_JUNIPER_ST:
1602		cstate->off_linktype.constant_part = 18;
1603		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1604		cstate->off_nl = OFFSET_NOT_SET;
1605		cstate->off_nl_nosnap = OFFSET_NOT_SET;
1606		break;
1607
1608	case DLT_JUNIPER_ISM:
1609		cstate->off_linktype.constant_part = 8;
1610		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1611		cstate->off_nl = OFFSET_NOT_SET;
1612		cstate->off_nl_nosnap = OFFSET_NOT_SET;
1613		break;
1614
1615	case DLT_JUNIPER_VS:
1616	case DLT_JUNIPER_SRX_E2E:
1617	case DLT_JUNIPER_FIBRECHANNEL:
1618	case DLT_JUNIPER_ATM_CEMIC:
1619		cstate->off_linktype.constant_part = 8;
1620		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1621		cstate->off_nl = OFFSET_NOT_SET;
1622		cstate->off_nl_nosnap = OFFSET_NOT_SET;
1623		break;
1624
1625	case DLT_MTP2:
1626		cstate->off_li = 2;
1627		cstate->off_li_hsl = 4;
1628		cstate->off_sio = 3;
1629		cstate->off_opc = 4;
1630		cstate->off_dpc = 4;
1631		cstate->off_sls = 7;
1632		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1633		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1634		cstate->off_nl = OFFSET_NOT_SET;
1635		cstate->off_nl_nosnap = OFFSET_NOT_SET;
1636		break;
1637
1638	case DLT_MTP2_WITH_PHDR:
1639		cstate->off_li = 6;
1640		cstate->off_li_hsl = 8;
1641		cstate->off_sio = 7;
1642		cstate->off_opc = 8;
1643		cstate->off_dpc = 8;
1644		cstate->off_sls = 11;
1645		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1646		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1647		cstate->off_nl = OFFSET_NOT_SET;
1648		cstate->off_nl_nosnap = OFFSET_NOT_SET;
1649		break;
1650
1651	case DLT_ERF:
1652		cstate->off_li = 22;
1653		cstate->off_li_hsl = 24;
1654		cstate->off_sio = 23;
1655		cstate->off_opc = 24;
1656		cstate->off_dpc = 24;
1657		cstate->off_sls = 27;
1658		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1659		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1660		cstate->off_nl = OFFSET_NOT_SET;
1661		cstate->off_nl_nosnap = OFFSET_NOT_SET;
1662		break;
1663
1664	case DLT_PFSYNC:
1665		cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1666		cstate->off_linkpl.constant_part = 4;
1667		cstate->off_nl = 0;
1668		cstate->off_nl_nosnap = 0;
1669		break;
1670
1671	case DLT_AX25_KISS:
1672		/*
1673		 * Currently, only raw "link[N:M]" filtering is supported.
1674		 */
1675		cstate->off_linktype.constant_part = OFFSET_NOT_SET;	/* variable, min 15, max 71 steps of 7 */
1676		cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1677		cstate->off_nl = OFFSET_NOT_SET;	/* variable, min 16, max 71 steps of 7 */
1678		cstate->off_nl_nosnap = OFFSET_NOT_SET;	/* no 802.2 LLC */
1679		break;
1680
1681	case DLT_IPNET:
1682		cstate->off_linktype.constant_part = 1;
1683		cstate->off_linkpl.constant_part = 24;	/* ipnet header length */
1684		cstate->off_nl = 0;
1685		cstate->off_nl_nosnap = OFFSET_NOT_SET;
1686		break;
1687
1688	case DLT_NETANALYZER:
1689		cstate->off_linkhdr.constant_part = 4;	/* Ethernet header is past 4-byte pseudo-header */
1690		cstate->off_linktype.constant_part = cstate->off_linkhdr.constant_part + 12;
1691		cstate->off_linkpl.constant_part = cstate->off_linkhdr.constant_part + 14;	/* pseudo-header+Ethernet header length */
1692		cstate->off_nl = 0;		/* Ethernet II */
1693		cstate->off_nl_nosnap = 3;	/* 802.3+802.2 */
1694		break;
1695
1696	case DLT_NETANALYZER_TRANSPARENT:
1697		cstate->off_linkhdr.constant_part = 12;	/* MAC header is past 4-byte pseudo-header, preamble, and SFD */
1698		cstate->off_linktype.constant_part = cstate->off_linkhdr.constant_part + 12;
1699		cstate->off_linkpl.constant_part = cstate->off_linkhdr.constant_part + 14;	/* pseudo-header+preamble+SFD+Ethernet header length */
1700		cstate->off_nl = 0;		/* Ethernet II */
1701		cstate->off_nl_nosnap = 3;	/* 802.3+802.2 */
1702		break;
1703
1704	default:
1705		/*
1706		 * For values in the range in which we've assigned new
1707		 * DLT_ values, only raw "link[N:M]" filtering is supported.
1708		 */
1709		if (cstate->linktype >= DLT_MATCHING_MIN &&
1710		    cstate->linktype <= DLT_MATCHING_MAX) {
1711			cstate->off_linktype.constant_part = OFFSET_NOT_SET;
1712			cstate->off_linkpl.constant_part = OFFSET_NOT_SET;
1713			cstate->off_nl = OFFSET_NOT_SET;
1714			cstate->off_nl_nosnap = OFFSET_NOT_SET;
1715		} else {
1716			bpf_set_error(cstate, "unknown data link type %d", cstate->linktype);
1717			return (-1);
1718		}
1719		break;
1720	}
1721
1722	cstate->off_outermostlinkhdr = cstate->off_prevlinkhdr = cstate->off_linkhdr;
1723	return (0);
1724}
1725
1726/*
1727 * Load a value relative to the specified absolute offset.
1728 */
1729static struct slist *
1730gen_load_absoffsetrel(compiler_state_t *cstate, bpf_abs_offset *abs_offset,
1731    u_int offset, u_int size)
1732{
1733	struct slist *s, *s2;
1734
1735	s = gen_abs_offset_varpart(cstate, abs_offset);
1736
1737	/*
1738	 * If "s" is non-null, it has code to arrange that the X register
1739	 * contains the variable part of the absolute offset, so we
1740	 * generate a load relative to that, with an offset of
1741	 * abs_offset->constant_part + offset.
1742	 *
1743	 * Otherwise, we can do an absolute load with an offset of
1744	 * abs_offset->constant_part + offset.
1745	 */
1746	if (s != NULL) {
1747		/*
1748		 * "s" points to a list of statements that puts the
1749		 * variable part of the absolute offset into the X register.
1750		 * Do an indirect load, to use the X register as an offset.
1751		 */
1752		s2 = new_stmt(cstate, BPF_LD|BPF_IND|size);
1753		s2->s.k = abs_offset->constant_part + offset;
1754		sappend(s, s2);
1755	} else {
1756		/*
1757		 * There is no variable part of the absolute offset, so
1758		 * just do an absolute load.
1759		 */
1760		s = new_stmt(cstate, BPF_LD|BPF_ABS|size);
1761		s->s.k = abs_offset->constant_part + offset;
1762	}
1763	return s;
1764}
1765
1766/*
1767 * Load a value relative to the beginning of the specified header.
1768 */
1769static struct slist *
1770gen_load_a(compiler_state_t *cstate, enum e_offrel offrel, u_int offset,
1771    u_int size)
1772{
1773	struct slist *s, *s2;
1774
1775	/*
1776	 * Squelch warnings from compilers that *don't* assume that
1777	 * offrel always has a valid enum value and therefore don't
1778	 * assume that we'll always go through one of the case arms.
1779	 *
1780	 * If we have a default case, compilers that *do* assume that
1781	 * will then complain about the default case code being
1782	 * unreachable.
1783	 *
1784	 * Damned if you do, damned if you don't.
1785	 */
1786	s = NULL;
1787
1788	switch (offrel) {
1789
1790	case OR_PACKET:
1791                s = new_stmt(cstate, BPF_LD|BPF_ABS|size);
1792                s->s.k = offset;
1793		break;
1794
1795	case OR_LINKHDR:
1796		s = gen_load_absoffsetrel(cstate, &cstate->off_linkhdr, offset, size);
1797		break;
1798
1799	case OR_PREVLINKHDR:
1800		s = gen_load_absoffsetrel(cstate, &cstate->off_prevlinkhdr, offset, size);
1801		break;
1802
1803	case OR_LLC:
1804		s = gen_load_absoffsetrel(cstate, &cstate->off_linkpl, offset, size);
1805		break;
1806
1807	case OR_PREVMPLSHDR:
1808		s = gen_load_absoffsetrel(cstate, &cstate->off_linkpl, cstate->off_nl - 4 + offset, size);
1809		break;
1810
1811	case OR_LINKPL:
1812		s = gen_load_absoffsetrel(cstate, &cstate->off_linkpl, cstate->off_nl + offset, size);
1813		break;
1814
1815	case OR_LINKPL_NOSNAP:
1816		s = gen_load_absoffsetrel(cstate, &cstate->off_linkpl, cstate->off_nl_nosnap + offset, size);
1817		break;
1818
1819	case OR_LINKTYPE:
1820		s = gen_load_absoffsetrel(cstate, &cstate->off_linktype, offset, size);
1821		break;
1822
1823	case OR_TRAN_IPV4:
1824		/*
1825		 * Load the X register with the length of the IPv4 header
1826		 * (plus the offset of the link-layer header, if it's
1827		 * preceded by a variable-length header such as a radio
1828		 * header), in bytes.
1829		 */
1830		s = gen_loadx_iphdrlen(cstate);
1831
1832		/*
1833		 * Load the item at {offset of the link-layer payload} +
1834		 * {offset, relative to the start of the link-layer
1835		 * paylod, of the IPv4 header} + {length of the IPv4 header} +
1836		 * {specified offset}.
1837		 *
1838		 * If the offset of the link-layer payload is variable,
1839		 * the variable part of that offset is included in the
1840		 * value in the X register, and we include the constant
1841		 * part in the offset of the load.
1842		 */
1843		s2 = new_stmt(cstate, BPF_LD|BPF_IND|size);
1844		s2->s.k = cstate->off_linkpl.constant_part + cstate->off_nl + offset;
1845		sappend(s, s2);
1846		break;
1847
1848	case OR_TRAN_IPV6:
1849		s = gen_load_absoffsetrel(cstate, &cstate->off_linkpl, cstate->off_nl + 40 + offset, size);
1850		break;
1851	}
1852	return s;
1853}
1854
1855/*
1856 * Generate code to load into the X register the sum of the length of
1857 * the IPv4 header and the variable part of the offset of the link-layer
1858 * payload.
1859 */
1860static struct slist *
1861gen_loadx_iphdrlen(compiler_state_t *cstate)
1862{
1863	struct slist *s, *s2;
1864
1865	s = gen_abs_offset_varpart(cstate, &cstate->off_linkpl);
1866	if (s != NULL) {
1867		/*
1868		 * The offset of the link-layer payload has a variable
1869		 * part.  "s" points to a list of statements that put
1870		 * the variable part of that offset into the X register.
1871		 *
1872		 * The 4*([k]&0xf) addressing mode can't be used, as we
1873		 * don't have a constant offset, so we have to load the
1874		 * value in question into the A register and add to it
1875		 * the value from the X register.
1876		 */
1877		s2 = new_stmt(cstate, BPF_LD|BPF_IND|BPF_B);
1878		s2->s.k = cstate->off_linkpl.constant_part + cstate->off_nl;
1879		sappend(s, s2);
1880		s2 = new_stmt(cstate, BPF_ALU|BPF_AND|BPF_K);
1881		s2->s.k = 0xf;
1882		sappend(s, s2);
1883		s2 = new_stmt(cstate, BPF_ALU|BPF_LSH|BPF_K);
1884		s2->s.k = 2;
1885		sappend(s, s2);
1886
1887		/*
1888		 * The A register now contains the length of the IP header.
1889		 * We need to add to it the variable part of the offset of
1890		 * the link-layer payload, which is still in the X
1891		 * register, and move the result into the X register.
1892		 */
1893		sappend(s, new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_X));
1894		sappend(s, new_stmt(cstate, BPF_MISC|BPF_TAX));
1895	} else {
1896		/*
1897		 * The offset of the link-layer payload is a constant,
1898		 * so no code was generated to load the (non-existent)
1899		 * variable part of that offset.
1900		 *
1901		 * This means we can use the 4*([k]&0xf) addressing
1902		 * mode.  Load the length of the IPv4 header, which
1903		 * is at an offset of cstate->off_nl from the beginning of
1904		 * the link-layer payload, and thus at an offset of
1905		 * cstate->off_linkpl.constant_part + cstate->off_nl from the beginning
1906		 * of the raw packet data, using that addressing mode.
1907		 */
1908		s = new_stmt(cstate, BPF_LDX|BPF_MSH|BPF_B);
1909		s->s.k = cstate->off_linkpl.constant_part + cstate->off_nl;
1910	}
1911	return s;
1912}
1913
1914
1915static struct block *
1916gen_uncond(compiler_state_t *cstate, int rsense)
1917{
1918	struct block *b;
1919	struct slist *s;
1920
1921	s = new_stmt(cstate, BPF_LD|BPF_IMM);
1922	s->s.k = !rsense;
1923	b = new_block(cstate, JMP(BPF_JEQ));
1924	b->stmts = s;
1925
1926	return b;
1927}
1928
1929static inline struct block *
1930gen_true(compiler_state_t *cstate)
1931{
1932	return gen_uncond(cstate, 1);
1933}
1934
1935static inline struct block *
1936gen_false(compiler_state_t *cstate)
1937{
1938	return gen_uncond(cstate, 0);
1939}
1940
1941/*
1942 * Byte-swap a 32-bit number.
1943 * ("htonl()" or "ntohl()" won't work - we want to byte-swap even on
1944 * big-endian platforms.)
1945 */
1946#define	SWAPLONG(y) \
1947((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff))
1948
1949/*
1950 * Generate code to match a particular packet type.
1951 *
1952 * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
1953 * value, if <= ETHERMTU.  We use that to determine whether to
1954 * match the type/length field or to check the type/length field for
1955 * a value <= ETHERMTU to see whether it's a type field and then do
1956 * the appropriate test.
1957 */
1958static struct block *
1959gen_ether_linktype(compiler_state_t *cstate, int proto)
1960{
1961	struct block *b0, *b1;
1962
1963	switch (proto) {
1964
1965	case LLCSAP_ISONS:
1966	case LLCSAP_IP:
1967	case LLCSAP_NETBEUI:
1968		/*
1969		 * OSI protocols and NetBEUI always use 802.2 encapsulation,
1970		 * so we check the DSAP and SSAP.
1971		 *
1972		 * LLCSAP_IP checks for IP-over-802.2, rather
1973		 * than IP-over-Ethernet or IP-over-SNAP.
1974		 *
1975		 * XXX - should we check both the DSAP and the
1976		 * SSAP, like this, or should we check just the
1977		 * DSAP, as we do for other types <= ETHERMTU
1978		 * (i.e., other SAP values)?
1979		 */
1980		b0 = gen_cmp_gt(cstate, OR_LINKTYPE, 0, BPF_H, ETHERMTU);
1981		gen_not(b0);
1982		b1 = gen_cmp(cstate, OR_LLC, 0, BPF_H, (bpf_int32)
1983			     ((proto << 8) | proto));
1984		gen_and(b0, b1);
1985		return b1;
1986
1987	case LLCSAP_IPX:
1988		/*
1989		 * Check for;
1990		 *
1991		 *	Ethernet_II frames, which are Ethernet
1992		 *	frames with a frame type of ETHERTYPE_IPX;
1993		 *
1994		 *	Ethernet_802.3 frames, which are 802.3
1995		 *	frames (i.e., the type/length field is
1996		 *	a length field, <= ETHERMTU, rather than
1997		 *	a type field) with the first two bytes
1998		 *	after the Ethernet/802.3 header being
1999		 *	0xFFFF;
2000		 *
2001		 *	Ethernet_802.2 frames, which are 802.3
2002		 *	frames with an 802.2 LLC header and
2003		 *	with the IPX LSAP as the DSAP in the LLC
2004		 *	header;
2005		 *
2006		 *	Ethernet_SNAP frames, which are 802.3
2007		 *	frames with an LLC header and a SNAP
2008		 *	header and with an OUI of 0x000000
2009		 *	(encapsulated Ethernet) and a protocol
2010		 *	ID of ETHERTYPE_IPX in the SNAP header.
2011		 *
2012		 * XXX - should we generate the same code both
2013		 * for tests for LLCSAP_IPX and for ETHERTYPE_IPX?
2014		 */
2015
2016		/*
2017		 * This generates code to check both for the
2018		 * IPX LSAP (Ethernet_802.2) and for Ethernet_802.3.
2019		 */
2020		b0 = gen_cmp(cstate, OR_LLC, 0, BPF_B, (bpf_int32)LLCSAP_IPX);
2021		b1 = gen_cmp(cstate, OR_LLC, 0, BPF_H, (bpf_int32)0xFFFF);
2022		gen_or(b0, b1);
2023
2024		/*
2025		 * Now we add code to check for SNAP frames with
2026		 * ETHERTYPE_IPX, i.e. Ethernet_SNAP.
2027		 */
2028		b0 = gen_snap(cstate, 0x000000, ETHERTYPE_IPX);
2029		gen_or(b0, b1);
2030
2031		/*
2032		 * Now we generate code to check for 802.3
2033		 * frames in general.
2034		 */
2035		b0 = gen_cmp_gt(cstate, OR_LINKTYPE, 0, BPF_H, ETHERMTU);
2036		gen_not(b0);
2037
2038		/*
2039		 * Now add the check for 802.3 frames before the
2040		 * check for Ethernet_802.2 and Ethernet_802.3,
2041		 * as those checks should only be done on 802.3
2042		 * frames, not on Ethernet frames.
2043		 */
2044		gen_and(b0, b1);
2045
2046		/*
2047		 * Now add the check for Ethernet_II frames, and
2048		 * do that before checking for the other frame
2049		 * types.
2050		 */
2051		b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, (bpf_int32)ETHERTYPE_IPX);
2052		gen_or(b0, b1);
2053		return b1;
2054
2055	case ETHERTYPE_ATALK:
2056	case ETHERTYPE_AARP:
2057		/*
2058		 * EtherTalk (AppleTalk protocols on Ethernet link
2059		 * layer) may use 802.2 encapsulation.
2060		 */
2061
2062		/*
2063		 * Check for 802.2 encapsulation (EtherTalk phase 2?);
2064		 * we check for an Ethernet type field less than
2065		 * 1500, which means it's an 802.3 length field.
2066		 */
2067		b0 = gen_cmp_gt(cstate, OR_LINKTYPE, 0, BPF_H, ETHERMTU);
2068		gen_not(b0);
2069
2070		/*
2071		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
2072		 * SNAP packets with an organization code of
2073		 * 0x080007 (Apple, for Appletalk) and a protocol
2074		 * type of ETHERTYPE_ATALK (Appletalk).
2075		 *
2076		 * 802.2-encapsulated ETHERTYPE_AARP packets are
2077		 * SNAP packets with an organization code of
2078		 * 0x000000 (encapsulated Ethernet) and a protocol
2079		 * type of ETHERTYPE_AARP (Appletalk ARP).
2080		 */
2081		if (proto == ETHERTYPE_ATALK)
2082			b1 = gen_snap(cstate, 0x080007, ETHERTYPE_ATALK);
2083		else	/* proto == ETHERTYPE_AARP */
2084			b1 = gen_snap(cstate, 0x000000, ETHERTYPE_AARP);
2085		gen_and(b0, b1);
2086
2087		/*
2088		 * Check for Ethernet encapsulation (Ethertalk
2089		 * phase 1?); we just check for the Ethernet
2090		 * protocol type.
2091		 */
2092		b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, (bpf_int32)proto);
2093
2094		gen_or(b0, b1);
2095		return b1;
2096
2097	default:
2098		if (proto <= ETHERMTU) {
2099			/*
2100			 * This is an LLC SAP value, so the frames
2101			 * that match would be 802.2 frames.
2102			 * Check that the frame is an 802.2 frame
2103			 * (i.e., that the length/type field is
2104			 * a length field, <= ETHERMTU) and
2105			 * then check the DSAP.
2106			 */
2107			b0 = gen_cmp_gt(cstate, OR_LINKTYPE, 0, BPF_H, ETHERMTU);
2108			gen_not(b0);
2109			b1 = gen_cmp(cstate, OR_LINKTYPE, 2, BPF_B, (bpf_int32)proto);
2110			gen_and(b0, b1);
2111			return b1;
2112		} else {
2113			/*
2114			 * This is an Ethernet type, so compare
2115			 * the length/type field with it (if
2116			 * the frame is an 802.2 frame, the length
2117			 * field will be <= ETHERMTU, and, as
2118			 * "proto" is > ETHERMTU, this test
2119			 * will fail and the frame won't match,
2120			 * which is what we want).
2121			 */
2122			return gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H,
2123			    (bpf_int32)proto);
2124		}
2125	}
2126}
2127
2128static struct block *
2129gen_loopback_linktype(compiler_state_t *cstate, int proto)
2130{
2131	/*
2132	 * For DLT_NULL, the link-layer header is a 32-bit word
2133	 * containing an AF_ value in *host* byte order, and for
2134	 * DLT_ENC, the link-layer header begins with a 32-bit
2135	 * word containing an AF_ value in host byte order.
2136	 *
2137	 * In addition, if we're reading a saved capture file,
2138	 * the host byte order in the capture may not be the
2139	 * same as the host byte order on this machine.
2140	 *
2141	 * For DLT_LOOP, the link-layer header is a 32-bit
2142	 * word containing an AF_ value in *network* byte order.
2143	 */
2144	if (cstate->linktype == DLT_NULL || cstate->linktype == DLT_ENC) {
2145		/*
2146		 * The AF_ value is in host byte order, but the BPF
2147		 * interpreter will convert it to network byte order.
2148		 *
2149		 * If this is a save file, and it's from a machine
2150		 * with the opposite byte order to ours, we byte-swap
2151		 * the AF_ value.
2152		 *
2153		 * Then we run it through "htonl()", and generate
2154		 * code to compare against the result.
2155		 */
2156		if (cstate->bpf_pcap->rfile != NULL && cstate->bpf_pcap->swapped)
2157			proto = SWAPLONG(proto);
2158		proto = htonl(proto);
2159	}
2160	return (gen_cmp(cstate, OR_LINKHDR, 0, BPF_W, (bpf_int32)proto));
2161}
2162
2163/*
2164 * "proto" is an Ethernet type value and for IPNET, if it is not IPv4
2165 * or IPv6 then we have an error.
2166 */
2167static struct block *
2168gen_ipnet_linktype(compiler_state_t *cstate, int proto)
2169{
2170	switch (proto) {
2171
2172	case ETHERTYPE_IP:
2173		return gen_cmp(cstate, OR_LINKTYPE, 0, BPF_B, (bpf_int32)IPH_AF_INET);
2174		/*NOTREACHED*/
2175
2176	case ETHERTYPE_IPV6:
2177		return gen_cmp(cstate, OR_LINKTYPE, 0, BPF_B,
2178		    (bpf_int32)IPH_AF_INET6);
2179		/*NOTREACHED*/
2180
2181	default:
2182		break;
2183	}
2184
2185	return gen_false(cstate);
2186}
2187
2188/*
2189 * Generate code to match a particular packet type.
2190 *
2191 * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
2192 * value, if <= ETHERMTU.  We use that to determine whether to
2193 * match the type field or to check the type field for the special
2194 * LINUX_SLL_P_802_2 value and then do the appropriate test.
2195 */
2196static struct block *
2197gen_linux_sll_linktype(compiler_state_t *cstate, int proto)
2198{
2199	struct block *b0, *b1;
2200
2201	switch (proto) {
2202
2203	case LLCSAP_ISONS:
2204	case LLCSAP_IP:
2205	case LLCSAP_NETBEUI:
2206		/*
2207		 * OSI protocols and NetBEUI always use 802.2 encapsulation,
2208		 * so we check the DSAP and SSAP.
2209		 *
2210		 * LLCSAP_IP checks for IP-over-802.2, rather
2211		 * than IP-over-Ethernet or IP-over-SNAP.
2212		 *
2213		 * XXX - should we check both the DSAP and the
2214		 * SSAP, like this, or should we check just the
2215		 * DSAP, as we do for other types <= ETHERMTU
2216		 * (i.e., other SAP values)?
2217		 */
2218		b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, LINUX_SLL_P_802_2);
2219		b1 = gen_cmp(cstate, OR_LLC, 0, BPF_H, (bpf_int32)
2220			     ((proto << 8) | proto));
2221		gen_and(b0, b1);
2222		return b1;
2223
2224	case LLCSAP_IPX:
2225		/*
2226		 *	Ethernet_II frames, which are Ethernet
2227		 *	frames with a frame type of ETHERTYPE_IPX;
2228		 *
2229		 *	Ethernet_802.3 frames, which have a frame
2230		 *	type of LINUX_SLL_P_802_3;
2231		 *
2232		 *	Ethernet_802.2 frames, which are 802.3
2233		 *	frames with an 802.2 LLC header (i.e, have
2234		 *	a frame type of LINUX_SLL_P_802_2) and
2235		 *	with the IPX LSAP as the DSAP in the LLC
2236		 *	header;
2237		 *
2238		 *	Ethernet_SNAP frames, which are 802.3
2239		 *	frames with an LLC header and a SNAP
2240		 *	header and with an OUI of 0x000000
2241		 *	(encapsulated Ethernet) and a protocol
2242		 *	ID of ETHERTYPE_IPX in the SNAP header.
2243		 *
2244		 * First, do the checks on LINUX_SLL_P_802_2
2245		 * frames; generate the check for either
2246		 * Ethernet_802.2 or Ethernet_SNAP frames, and
2247		 * then put a check for LINUX_SLL_P_802_2 frames
2248		 * before it.
2249		 */
2250		b0 = gen_cmp(cstate, OR_LLC, 0, BPF_B, (bpf_int32)LLCSAP_IPX);
2251		b1 = gen_snap(cstate, 0x000000, ETHERTYPE_IPX);
2252		gen_or(b0, b1);
2253		b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, LINUX_SLL_P_802_2);
2254		gen_and(b0, b1);
2255
2256		/*
2257		 * Now check for 802.3 frames and OR that with
2258		 * the previous test.
2259		 */
2260		b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, LINUX_SLL_P_802_3);
2261		gen_or(b0, b1);
2262
2263		/*
2264		 * Now add the check for Ethernet_II frames, and
2265		 * do that before checking for the other frame
2266		 * types.
2267		 */
2268		b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, (bpf_int32)ETHERTYPE_IPX);
2269		gen_or(b0, b1);
2270		return b1;
2271
2272	case ETHERTYPE_ATALK:
2273	case ETHERTYPE_AARP:
2274		/*
2275		 * EtherTalk (AppleTalk protocols on Ethernet link
2276		 * layer) may use 802.2 encapsulation.
2277		 */
2278
2279		/*
2280		 * Check for 802.2 encapsulation (EtherTalk phase 2?);
2281		 * we check for the 802.2 protocol type in the
2282		 * "Ethernet type" field.
2283		 */
2284		b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, LINUX_SLL_P_802_2);
2285
2286		/*
2287		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
2288		 * SNAP packets with an organization code of
2289		 * 0x080007 (Apple, for Appletalk) and a protocol
2290		 * type of ETHERTYPE_ATALK (Appletalk).
2291		 *
2292		 * 802.2-encapsulated ETHERTYPE_AARP packets are
2293		 * SNAP packets with an organization code of
2294		 * 0x000000 (encapsulated Ethernet) and a protocol
2295		 * type of ETHERTYPE_AARP (Appletalk ARP).
2296		 */
2297		if (proto == ETHERTYPE_ATALK)
2298			b1 = gen_snap(cstate, 0x080007, ETHERTYPE_ATALK);
2299		else	/* proto == ETHERTYPE_AARP */
2300			b1 = gen_snap(cstate, 0x000000, ETHERTYPE_AARP);
2301		gen_and(b0, b1);
2302
2303		/*
2304		 * Check for Ethernet encapsulation (Ethertalk
2305		 * phase 1?); we just check for the Ethernet
2306		 * protocol type.
2307		 */
2308		b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, (bpf_int32)proto);
2309
2310		gen_or(b0, b1);
2311		return b1;
2312
2313	default:
2314		if (proto <= ETHERMTU) {
2315			/*
2316			 * This is an LLC SAP value, so the frames
2317			 * that match would be 802.2 frames.
2318			 * Check for the 802.2 protocol type
2319			 * in the "Ethernet type" field, and
2320			 * then check the DSAP.
2321			 */
2322			b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, LINUX_SLL_P_802_2);
2323			b1 = gen_cmp(cstate, OR_LINKHDR, cstate->off_linkpl.constant_part, BPF_B,
2324			     (bpf_int32)proto);
2325			gen_and(b0, b1);
2326			return b1;
2327		} else {
2328			/*
2329			 * This is an Ethernet type, so compare
2330			 * the length/type field with it (if
2331			 * the frame is an 802.2 frame, the length
2332			 * field will be <= ETHERMTU, and, as
2333			 * "proto" is > ETHERMTU, this test
2334			 * will fail and the frame won't match,
2335			 * which is what we want).
2336			 */
2337			return gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, (bpf_int32)proto);
2338		}
2339	}
2340}
2341
2342static struct slist *
2343gen_load_prism_llprefixlen(compiler_state_t *cstate)
2344{
2345	struct slist *s1, *s2;
2346	struct slist *sjeq_avs_cookie;
2347	struct slist *sjcommon;
2348
2349	/*
2350	 * This code is not compatible with the optimizer, as
2351	 * we are generating jmp instructions within a normal
2352	 * slist of instructions
2353	 */
2354	cstate->no_optimize = 1;
2355
2356	/*
2357	 * Generate code to load the length of the radio header into
2358	 * the register assigned to hold that length, if one has been
2359	 * assigned.  (If one hasn't been assigned, no code we've
2360	 * generated uses that prefix, so we don't need to generate any
2361	 * code to load it.)
2362	 *
2363	 * Some Linux drivers use ARPHRD_IEEE80211_PRISM but sometimes
2364	 * or always use the AVS header rather than the Prism header.
2365	 * We load a 4-byte big-endian value at the beginning of the
2366	 * raw packet data, and see whether, when masked with 0xFFFFF000,
2367	 * it's equal to 0x80211000.  If so, that indicates that it's
2368	 * an AVS header (the masked-out bits are the version number).
2369	 * Otherwise, it's a Prism header.
2370	 *
2371	 * XXX - the Prism header is also, in theory, variable-length,
2372	 * but no known software generates headers that aren't 144
2373	 * bytes long.
2374	 */
2375	if (cstate->off_linkhdr.reg != -1) {
2376		/*
2377		 * Load the cookie.
2378		 */
2379		s1 = new_stmt(cstate, BPF_LD|BPF_W|BPF_ABS);
2380		s1->s.k = 0;
2381
2382		/*
2383		 * AND it with 0xFFFFF000.
2384		 */
2385		s2 = new_stmt(cstate, BPF_ALU|BPF_AND|BPF_K);
2386		s2->s.k = 0xFFFFF000;
2387		sappend(s1, s2);
2388
2389		/*
2390		 * Compare with 0x80211000.
2391		 */
2392		sjeq_avs_cookie = new_stmt(cstate, JMP(BPF_JEQ));
2393		sjeq_avs_cookie->s.k = 0x80211000;
2394		sappend(s1, sjeq_avs_cookie);
2395
2396		/*
2397		 * If it's AVS:
2398		 *
2399		 * The 4 bytes at an offset of 4 from the beginning of
2400		 * the AVS header are the length of the AVS header.
2401		 * That field is big-endian.
2402		 */
2403		s2 = new_stmt(cstate, BPF_LD|BPF_W|BPF_ABS);
2404		s2->s.k = 4;
2405		sappend(s1, s2);
2406		sjeq_avs_cookie->s.jt = s2;
2407
2408		/*
2409		 * Now jump to the code to allocate a register
2410		 * into which to save the header length and
2411		 * store the length there.  (The "jump always"
2412		 * instruction needs to have the k field set;
2413		 * it's added to the PC, so, as we're jumping
2414		 * over a single instruction, it should be 1.)
2415		 */
2416		sjcommon = new_stmt(cstate, JMP(BPF_JA));
2417		sjcommon->s.k = 1;
2418		sappend(s1, sjcommon);
2419
2420		/*
2421		 * Now for the code that handles the Prism header.
2422		 * Just load the length of the Prism header (144)
2423		 * into the A register.  Have the test for an AVS
2424		 * header branch here if we don't have an AVS header.
2425		 */
2426		s2 = new_stmt(cstate, BPF_LD|BPF_W|BPF_IMM);
2427		s2->s.k = 144;
2428		sappend(s1, s2);
2429		sjeq_avs_cookie->s.jf = s2;
2430
2431		/*
2432		 * Now allocate a register to hold that value and store
2433		 * it.  The code for the AVS header will jump here after
2434		 * loading the length of the AVS header.
2435		 */
2436		s2 = new_stmt(cstate, BPF_ST);
2437		s2->s.k = cstate->off_linkhdr.reg;
2438		sappend(s1, s2);
2439		sjcommon->s.jf = s2;
2440
2441		/*
2442		 * Now move it into the X register.
2443		 */
2444		s2 = new_stmt(cstate, BPF_MISC|BPF_TAX);
2445		sappend(s1, s2);
2446
2447		return (s1);
2448	} else
2449		return (NULL);
2450}
2451
2452static struct slist *
2453gen_load_avs_llprefixlen(compiler_state_t *cstate)
2454{
2455	struct slist *s1, *s2;
2456
2457	/*
2458	 * Generate code to load the length of the AVS header into
2459	 * the register assigned to hold that length, if one has been
2460	 * assigned.  (If one hasn't been assigned, no code we've
2461	 * generated uses that prefix, so we don't need to generate any
2462	 * code to load it.)
2463	 */
2464	if (cstate->off_linkhdr.reg != -1) {
2465		/*
2466		 * The 4 bytes at an offset of 4 from the beginning of
2467		 * the AVS header are the length of the AVS header.
2468		 * That field is big-endian.
2469		 */
2470		s1 = new_stmt(cstate, BPF_LD|BPF_W|BPF_ABS);
2471		s1->s.k = 4;
2472
2473		/*
2474		 * Now allocate a register to hold that value and store
2475		 * it.
2476		 */
2477		s2 = new_stmt(cstate, BPF_ST);
2478		s2->s.k = cstate->off_linkhdr.reg;
2479		sappend(s1, s2);
2480
2481		/*
2482		 * Now move it into the X register.
2483		 */
2484		s2 = new_stmt(cstate, BPF_MISC|BPF_TAX);
2485		sappend(s1, s2);
2486
2487		return (s1);
2488	} else
2489		return (NULL);
2490}
2491
2492static struct slist *
2493gen_load_radiotap_llprefixlen(compiler_state_t *cstate)
2494{
2495	struct slist *s1, *s2;
2496
2497	/*
2498	 * Generate code to load the length of the radiotap header into
2499	 * the register assigned to hold that length, if one has been
2500	 * assigned.  (If one hasn't been assigned, no code we've
2501	 * generated uses that prefix, so we don't need to generate any
2502	 * code to load it.)
2503	 */
2504	if (cstate->off_linkhdr.reg != -1) {
2505		/*
2506		 * The 2 bytes at offsets of 2 and 3 from the beginning
2507		 * of the radiotap header are the length of the radiotap
2508		 * header; unfortunately, it's little-endian, so we have
2509		 * to load it a byte at a time and construct the value.
2510		 */
2511
2512		/*
2513		 * Load the high-order byte, at an offset of 3, shift it
2514		 * left a byte, and put the result in the X register.
2515		 */
2516		s1 = new_stmt(cstate, BPF_LD|BPF_B|BPF_ABS);
2517		s1->s.k = 3;
2518		s2 = new_stmt(cstate, BPF_ALU|BPF_LSH|BPF_K);
2519		sappend(s1, s2);
2520		s2->s.k = 8;
2521		s2 = new_stmt(cstate, BPF_MISC|BPF_TAX);
2522		sappend(s1, s2);
2523
2524		/*
2525		 * Load the next byte, at an offset of 2, and OR the
2526		 * value from the X register into it.
2527		 */
2528		s2 = new_stmt(cstate, BPF_LD|BPF_B|BPF_ABS);
2529		sappend(s1, s2);
2530		s2->s.k = 2;
2531		s2 = new_stmt(cstate, BPF_ALU|BPF_OR|BPF_X);
2532		sappend(s1, s2);
2533
2534		/*
2535		 * Now allocate a register to hold that value and store
2536		 * it.
2537		 */
2538		s2 = new_stmt(cstate, BPF_ST);
2539		s2->s.k = cstate->off_linkhdr.reg;
2540		sappend(s1, s2);
2541
2542		/*
2543		 * Now move it into the X register.
2544		 */
2545		s2 = new_stmt(cstate, BPF_MISC|BPF_TAX);
2546		sappend(s1, s2);
2547
2548		return (s1);
2549	} else
2550		return (NULL);
2551}
2552
2553/*
2554 * At the moment we treat PPI as normal Radiotap encoded
2555 * packets. The difference is in the function that generates
2556 * the code at the beginning to compute the header length.
2557 * Since this code generator of PPI supports bare 802.11
2558 * encapsulation only (i.e. the encapsulated DLT should be
2559 * DLT_IEEE802_11) we generate code to check for this too;
2560 * that's done in finish_parse().
2561 */
2562static struct slist *
2563gen_load_ppi_llprefixlen(compiler_state_t *cstate)
2564{
2565	struct slist *s1, *s2;
2566
2567	/*
2568	 * Generate code to load the length of the radiotap header
2569	 * into the register assigned to hold that length, if one has
2570	 * been assigned.
2571	 */
2572	if (cstate->off_linkhdr.reg != -1) {
2573		/*
2574		 * The 2 bytes at offsets of 2 and 3 from the beginning
2575		 * of the radiotap header are the length of the radiotap
2576		 * header; unfortunately, it's little-endian, so we have
2577		 * to load it a byte at a time and construct the value.
2578		 */
2579
2580		/*
2581		 * Load the high-order byte, at an offset of 3, shift it
2582		 * left a byte, and put the result in the X register.
2583		 */
2584		s1 = new_stmt(cstate, BPF_LD|BPF_B|BPF_ABS);
2585		s1->s.k = 3;
2586		s2 = new_stmt(cstate, BPF_ALU|BPF_LSH|BPF_K);
2587		sappend(s1, s2);
2588		s2->s.k = 8;
2589		s2 = new_stmt(cstate, BPF_MISC|BPF_TAX);
2590		sappend(s1, s2);
2591
2592		/*
2593		 * Load the next byte, at an offset of 2, and OR the
2594		 * value from the X register into it.
2595		 */
2596		s2 = new_stmt(cstate, BPF_LD|BPF_B|BPF_ABS);
2597		sappend(s1, s2);
2598		s2->s.k = 2;
2599		s2 = new_stmt(cstate, BPF_ALU|BPF_OR|BPF_X);
2600		sappend(s1, s2);
2601
2602		/*
2603		 * Now allocate a register to hold that value and store
2604		 * it.
2605		 */
2606		s2 = new_stmt(cstate, BPF_ST);
2607		s2->s.k = cstate->off_linkhdr.reg;
2608		sappend(s1, s2);
2609
2610		/*
2611		 * Now move it into the X register.
2612		 */
2613		s2 = new_stmt(cstate, BPF_MISC|BPF_TAX);
2614		sappend(s1, s2);
2615
2616		return (s1);
2617	} else
2618		return (NULL);
2619}
2620
2621/*
2622 * Load a value relative to the beginning of the link-layer header after the 802.11
2623 * header, i.e. LLC_SNAP.
2624 * The link-layer header doesn't necessarily begin at the beginning
2625 * of the packet data; there might be a variable-length prefix containing
2626 * radio information.
2627 */
2628static struct slist *
2629gen_load_802_11_header_len(compiler_state_t *cstate, struct slist *s, struct slist *snext)
2630{
2631	struct slist *s2;
2632	struct slist *sjset_data_frame_1;
2633	struct slist *sjset_data_frame_2;
2634	struct slist *sjset_qos;
2635	struct slist *sjset_radiotap_flags_present;
2636	struct slist *sjset_radiotap_ext_present;
2637	struct slist *sjset_radiotap_tsft_present;
2638	struct slist *sjset_tsft_datapad, *sjset_notsft_datapad;
2639	struct slist *s_roundup;
2640
2641	if (cstate->off_linkpl.reg == -1) {
2642		/*
2643		 * No register has been assigned to the offset of
2644		 * the link-layer payload, which means nobody needs
2645		 * it; don't bother computing it - just return
2646		 * what we already have.
2647		 */
2648		return (s);
2649	}
2650
2651	/*
2652	 * This code is not compatible with the optimizer, as
2653	 * we are generating jmp instructions within a normal
2654	 * slist of instructions
2655	 */
2656	cstate->no_optimize = 1;
2657
2658	/*
2659	 * If "s" is non-null, it has code to arrange that the X register
2660	 * contains the length of the prefix preceding the link-layer
2661	 * header.
2662	 *
2663	 * Otherwise, the length of the prefix preceding the link-layer
2664	 * header is "off_outermostlinkhdr.constant_part".
2665	 */
2666	if (s == NULL) {
2667		/*
2668		 * There is no variable-length header preceding the
2669		 * link-layer header.
2670		 *
2671		 * Load the length of the fixed-length prefix preceding
2672		 * the link-layer header (if any) into the X register,
2673		 * and store it in the cstate->off_linkpl.reg register.
2674		 * That length is off_outermostlinkhdr.constant_part.
2675		 */
2676		s = new_stmt(cstate, BPF_LDX|BPF_IMM);
2677		s->s.k = cstate->off_outermostlinkhdr.constant_part;
2678	}
2679
2680	/*
2681	 * The X register contains the offset of the beginning of the
2682	 * link-layer header; add 24, which is the minimum length
2683	 * of the MAC header for a data frame, to that, and store it
2684	 * in cstate->off_linkpl.reg, and then load the Frame Control field,
2685	 * which is at the offset in the X register, with an indexed load.
2686	 */
2687	s2 = new_stmt(cstate, BPF_MISC|BPF_TXA);
2688	sappend(s, s2);
2689	s2 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
2690	s2->s.k = 24;
2691	sappend(s, s2);
2692	s2 = new_stmt(cstate, BPF_ST);
2693	s2->s.k = cstate->off_linkpl.reg;
2694	sappend(s, s2);
2695
2696	s2 = new_stmt(cstate, BPF_LD|BPF_IND|BPF_B);
2697	s2->s.k = 0;
2698	sappend(s, s2);
2699
2700	/*
2701	 * Check the Frame Control field to see if this is a data frame;
2702	 * a data frame has the 0x08 bit (b3) in that field set and the
2703	 * 0x04 bit (b2) clear.
2704	 */
2705	sjset_data_frame_1 = new_stmt(cstate, JMP(BPF_JSET));
2706	sjset_data_frame_1->s.k = 0x08;
2707	sappend(s, sjset_data_frame_1);
2708
2709	/*
2710	 * If b3 is set, test b2, otherwise go to the first statement of
2711	 * the rest of the program.
2712	 */
2713	sjset_data_frame_1->s.jt = sjset_data_frame_2 = new_stmt(cstate, JMP(BPF_JSET));
2714	sjset_data_frame_2->s.k = 0x04;
2715	sappend(s, sjset_data_frame_2);
2716	sjset_data_frame_1->s.jf = snext;
2717
2718	/*
2719	 * If b2 is not set, this is a data frame; test the QoS bit.
2720	 * Otherwise, go to the first statement of the rest of the
2721	 * program.
2722	 */
2723	sjset_data_frame_2->s.jt = snext;
2724	sjset_data_frame_2->s.jf = sjset_qos = new_stmt(cstate, JMP(BPF_JSET));
2725	sjset_qos->s.k = 0x80;	/* QoS bit */
2726	sappend(s, sjset_qos);
2727
2728	/*
2729	 * If it's set, add 2 to cstate->off_linkpl.reg, to skip the QoS
2730	 * field.
2731	 * Otherwise, go to the first statement of the rest of the
2732	 * program.
2733	 */
2734	sjset_qos->s.jt = s2 = new_stmt(cstate, BPF_LD|BPF_MEM);
2735	s2->s.k = cstate->off_linkpl.reg;
2736	sappend(s, s2);
2737	s2 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_IMM);
2738	s2->s.k = 2;
2739	sappend(s, s2);
2740	s2 = new_stmt(cstate, BPF_ST);
2741	s2->s.k = cstate->off_linkpl.reg;
2742	sappend(s, s2);
2743
2744	/*
2745	 * If we have a radiotap header, look at it to see whether
2746	 * there's Atheros padding between the MAC-layer header
2747	 * and the payload.
2748	 *
2749	 * Note: all of the fields in the radiotap header are
2750	 * little-endian, so we byte-swap all of the values
2751	 * we test against, as they will be loaded as big-endian
2752	 * values.
2753	 *
2754	 * XXX - in the general case, we would have to scan through
2755	 * *all* the presence bits, if there's more than one word of
2756	 * presence bits.  That would require a loop, meaning that
2757	 * we wouldn't be able to run the filter in the kernel.
2758	 *
2759	 * We assume here that the Atheros adapters that insert the
2760	 * annoying padding don't have multiple antennae and therefore
2761	 * do not generate radiotap headers with multiple presence words.
2762	 */
2763	if (cstate->linktype == DLT_IEEE802_11_RADIO) {
2764		/*
2765		 * Is the IEEE80211_RADIOTAP_FLAGS bit (0x0000002) set
2766		 * in the first presence flag word?
2767		 */
2768		sjset_qos->s.jf = s2 = new_stmt(cstate, BPF_LD|BPF_ABS|BPF_W);
2769		s2->s.k = 4;
2770		sappend(s, s2);
2771
2772		sjset_radiotap_flags_present = new_stmt(cstate, JMP(BPF_JSET));
2773		sjset_radiotap_flags_present->s.k = SWAPLONG(0x00000002);
2774		sappend(s, sjset_radiotap_flags_present);
2775
2776		/*
2777		 * If not, skip all of this.
2778		 */
2779		sjset_radiotap_flags_present->s.jf = snext;
2780
2781		/*
2782		 * Otherwise, is the "extension" bit set in that word?
2783		 */
2784		sjset_radiotap_ext_present = new_stmt(cstate, JMP(BPF_JSET));
2785		sjset_radiotap_ext_present->s.k = SWAPLONG(0x80000000);
2786		sappend(s, sjset_radiotap_ext_present);
2787		sjset_radiotap_flags_present->s.jt = sjset_radiotap_ext_present;
2788
2789		/*
2790		 * If so, skip all of this.
2791		 */
2792		sjset_radiotap_ext_present->s.jt = snext;
2793
2794		/*
2795		 * Otherwise, is the IEEE80211_RADIOTAP_TSFT bit set?
2796		 */
2797		sjset_radiotap_tsft_present = new_stmt(cstate, JMP(BPF_JSET));
2798		sjset_radiotap_tsft_present->s.k = SWAPLONG(0x00000001);
2799		sappend(s, sjset_radiotap_tsft_present);
2800		sjset_radiotap_ext_present->s.jf = sjset_radiotap_tsft_present;
2801
2802		/*
2803		 * If IEEE80211_RADIOTAP_TSFT is set, the flags field is
2804		 * at an offset of 16 from the beginning of the raw packet
2805		 * data (8 bytes for the radiotap header and 8 bytes for
2806		 * the TSFT field).
2807		 *
2808		 * Test whether the IEEE80211_RADIOTAP_F_DATAPAD bit (0x20)
2809		 * is set.
2810		 */
2811		s2 = new_stmt(cstate, BPF_LD|BPF_ABS|BPF_B);
2812		s2->s.k = 16;
2813		sappend(s, s2);
2814		sjset_radiotap_tsft_present->s.jt = s2;
2815
2816		sjset_tsft_datapad = new_stmt(cstate, JMP(BPF_JSET));
2817		sjset_tsft_datapad->s.k = 0x20;
2818		sappend(s, sjset_tsft_datapad);
2819
2820		/*
2821		 * If IEEE80211_RADIOTAP_TSFT is not set, the flags field is
2822		 * at an offset of 8 from the beginning of the raw packet
2823		 * data (8 bytes for the radiotap header).
2824		 *
2825		 * Test whether the IEEE80211_RADIOTAP_F_DATAPAD bit (0x20)
2826		 * is set.
2827		 */
2828		s2 = new_stmt(cstate, BPF_LD|BPF_ABS|BPF_B);
2829		s2->s.k = 8;
2830		sappend(s, s2);
2831		sjset_radiotap_tsft_present->s.jf = s2;
2832
2833		sjset_notsft_datapad = new_stmt(cstate, JMP(BPF_JSET));
2834		sjset_notsft_datapad->s.k = 0x20;
2835		sappend(s, sjset_notsft_datapad);
2836
2837		/*
2838		 * In either case, if IEEE80211_RADIOTAP_F_DATAPAD is
2839		 * set, round the length of the 802.11 header to
2840		 * a multiple of 4.  Do that by adding 3 and then
2841		 * dividing by and multiplying by 4, which we do by
2842		 * ANDing with ~3.
2843		 */
2844		s_roundup = new_stmt(cstate, BPF_LD|BPF_MEM);
2845		s_roundup->s.k = cstate->off_linkpl.reg;
2846		sappend(s, s_roundup);
2847		s2 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_IMM);
2848		s2->s.k = 3;
2849		sappend(s, s2);
2850		s2 = new_stmt(cstate, BPF_ALU|BPF_AND|BPF_IMM);
2851		s2->s.k = ~3;
2852		sappend(s, s2);
2853		s2 = new_stmt(cstate, BPF_ST);
2854		s2->s.k = cstate->off_linkpl.reg;
2855		sappend(s, s2);
2856
2857		sjset_tsft_datapad->s.jt = s_roundup;
2858		sjset_tsft_datapad->s.jf = snext;
2859		sjset_notsft_datapad->s.jt = s_roundup;
2860		sjset_notsft_datapad->s.jf = snext;
2861	} else
2862		sjset_qos->s.jf = snext;
2863
2864	return s;
2865}
2866
2867static void
2868insert_compute_vloffsets(compiler_state_t *cstate, struct block *b)
2869{
2870	struct slist *s;
2871
2872	/* There is an implicit dependency between the link
2873	 * payload and link header since the payload computation
2874	 * includes the variable part of the header. Therefore,
2875	 * if nobody else has allocated a register for the link
2876	 * header and we need it, do it now. */
2877	if (cstate->off_linkpl.reg != -1 && cstate->off_linkhdr.is_variable &&
2878	    cstate->off_linkhdr.reg == -1)
2879		cstate->off_linkhdr.reg = alloc_reg(cstate);
2880
2881	/*
2882	 * For link-layer types that have a variable-length header
2883	 * preceding the link-layer header, generate code to load
2884	 * the offset of the link-layer header into the register
2885	 * assigned to that offset, if any.
2886	 *
2887	 * XXX - this, and the next switch statement, won't handle
2888	 * encapsulation of 802.11 or 802.11+radio information in
2889	 * some other protocol stack.  That's significantly more
2890	 * complicated.
2891	 */
2892	switch (cstate->outermostlinktype) {
2893
2894	case DLT_PRISM_HEADER:
2895		s = gen_load_prism_llprefixlen(cstate);
2896		break;
2897
2898	case DLT_IEEE802_11_RADIO_AVS:
2899		s = gen_load_avs_llprefixlen(cstate);
2900		break;
2901
2902	case DLT_IEEE802_11_RADIO:
2903		s = gen_load_radiotap_llprefixlen(cstate);
2904		break;
2905
2906	case DLT_PPI:
2907		s = gen_load_ppi_llprefixlen(cstate);
2908		break;
2909
2910	default:
2911		s = NULL;
2912		break;
2913	}
2914
2915	/*
2916	 * For link-layer types that have a variable-length link-layer
2917	 * header, generate code to load the offset of the link-layer
2918	 * payload into the register assigned to that offset, if any.
2919	 */
2920	switch (cstate->outermostlinktype) {
2921
2922	case DLT_IEEE802_11:
2923	case DLT_PRISM_HEADER:
2924	case DLT_IEEE802_11_RADIO_AVS:
2925	case DLT_IEEE802_11_RADIO:
2926	case DLT_PPI:
2927		s = gen_load_802_11_header_len(cstate, s, b->stmts);
2928		break;
2929	}
2930
2931	/*
2932	 * If there there is no initialization yet and we need variable
2933	 * length offsets for VLAN, initialize them to zero
2934	 */
2935	if (s == NULL && cstate->is_vlan_vloffset) {
2936		struct slist *s2;
2937
2938		if (cstate->off_linkpl.reg == -1)
2939			cstate->off_linkpl.reg = alloc_reg(cstate);
2940		if (cstate->off_linktype.reg == -1)
2941			cstate->off_linktype.reg = alloc_reg(cstate);
2942
2943		s = new_stmt(cstate, BPF_LD|BPF_W|BPF_IMM);
2944		s->s.k = 0;
2945		s2 = new_stmt(cstate, BPF_ST);
2946		s2->s.k = cstate->off_linkpl.reg;
2947		sappend(s, s2);
2948		s2 = new_stmt(cstate, BPF_ST);
2949		s2->s.k = cstate->off_linktype.reg;
2950		sappend(s, s2);
2951	}
2952
2953	/*
2954	 * If we have any offset-loading code, append all the
2955	 * existing statements in the block to those statements,
2956	 * and make the resulting list the list of statements
2957	 * for the block.
2958	 */
2959	if (s != NULL) {
2960		sappend(s, b->stmts);
2961		b->stmts = s;
2962	}
2963}
2964
2965static struct block *
2966gen_ppi_dlt_check(compiler_state_t *cstate)
2967{
2968	struct slist *s_load_dlt;
2969	struct block *b;
2970
2971	if (cstate->linktype == DLT_PPI)
2972	{
2973		/* Create the statements that check for the DLT
2974		 */
2975		s_load_dlt = new_stmt(cstate, BPF_LD|BPF_W|BPF_ABS);
2976		s_load_dlt->s.k = 4;
2977
2978		b = new_block(cstate, JMP(BPF_JEQ));
2979
2980		b->stmts = s_load_dlt;
2981		b->s.k = SWAPLONG(DLT_IEEE802_11);
2982	}
2983	else
2984	{
2985		b = NULL;
2986	}
2987
2988	return b;
2989}
2990
2991/*
2992 * Take an absolute offset, and:
2993 *
2994 *    if it has no variable part, return NULL;
2995 *
2996 *    if it has a variable part, generate code to load the register
2997 *    containing that variable part into the X register, returning
2998 *    a pointer to that code - if no register for that offset has
2999 *    been allocated, allocate it first.
3000 *
3001 * (The code to set that register will be generated later, but will
3002 * be placed earlier in the code sequence.)
3003 */
3004static struct slist *
3005gen_abs_offset_varpart(compiler_state_t *cstate, bpf_abs_offset *off)
3006{
3007	struct slist *s;
3008
3009	if (off->is_variable) {
3010		if (off->reg == -1) {
3011			/*
3012			 * We haven't yet assigned a register for the
3013			 * variable part of the offset of the link-layer
3014			 * header; allocate one.
3015			 */
3016			off->reg = alloc_reg(cstate);
3017		}
3018
3019		/*
3020		 * Load the register containing the variable part of the
3021		 * offset of the link-layer header into the X register.
3022		 */
3023		s = new_stmt(cstate, BPF_LDX|BPF_MEM);
3024		s->s.k = off->reg;
3025		return s;
3026	} else {
3027		/*
3028		 * That offset isn't variable, there's no variable part,
3029		 * so we don't need to generate any code.
3030		 */
3031		return NULL;
3032	}
3033}
3034
3035/*
3036 * Map an Ethernet type to the equivalent PPP type.
3037 */
3038static int
3039ethertype_to_ppptype(int proto)
3040{
3041	switch (proto) {
3042
3043	case ETHERTYPE_IP:
3044		proto = PPP_IP;
3045		break;
3046
3047	case ETHERTYPE_IPV6:
3048		proto = PPP_IPV6;
3049		break;
3050
3051	case ETHERTYPE_DN:
3052		proto = PPP_DECNET;
3053		break;
3054
3055	case ETHERTYPE_ATALK:
3056		proto = PPP_APPLE;
3057		break;
3058
3059	case ETHERTYPE_NS:
3060		proto = PPP_NS;
3061		break;
3062
3063	case LLCSAP_ISONS:
3064		proto = PPP_OSI;
3065		break;
3066
3067	case LLCSAP_8021D:
3068		/*
3069		 * I'm assuming the "Bridging PDU"s that go
3070		 * over PPP are Spanning Tree Protocol
3071		 * Bridging PDUs.
3072		 */
3073		proto = PPP_BRPDU;
3074		break;
3075
3076	case LLCSAP_IPX:
3077		proto = PPP_IPX;
3078		break;
3079	}
3080	return (proto);
3081}
3082
3083/*
3084 * Generate any tests that, for encapsulation of a link-layer packet
3085 * inside another protocol stack, need to be done to check for those
3086 * link-layer packets (and that haven't already been done by a check
3087 * for that encapsulation).
3088 */
3089static struct block *
3090gen_prevlinkhdr_check(compiler_state_t *cstate)
3091{
3092	struct block *b0;
3093
3094	if (cstate->is_geneve)
3095		return gen_geneve_ll_check(cstate);
3096
3097	switch (cstate->prevlinktype) {
3098
3099	case DLT_SUNATM:
3100		/*
3101		 * This is LANE-encapsulated Ethernet; check that the LANE
3102		 * packet doesn't begin with an LE Control marker, i.e.
3103		 * that it's data, not a control message.
3104		 *
3105		 * (We've already generated a test for LANE.)
3106		 */
3107		b0 = gen_cmp(cstate, OR_PREVLINKHDR, SUNATM_PKT_BEGIN_POS, BPF_H, 0xFF00);
3108		gen_not(b0);
3109		return b0;
3110
3111	default:
3112		/*
3113		 * No such tests are necessary.
3114		 */
3115		return NULL;
3116	}
3117	/*NOTREACHED*/
3118}
3119
3120/*
3121 * The three different values we should check for when checking for an
3122 * IPv6 packet with DLT_NULL.
3123 */
3124#define BSD_AFNUM_INET6_BSD	24	/* NetBSD, OpenBSD, BSD/OS, Npcap */
3125#define BSD_AFNUM_INET6_FREEBSD	28	/* FreeBSD */
3126#define BSD_AFNUM_INET6_DARWIN	30	/* macOS, iOS, other Darwin-based OSes */
3127
3128/*
3129 * Generate code to match a particular packet type by matching the
3130 * link-layer type field or fields in the 802.2 LLC header.
3131 *
3132 * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
3133 * value, if <= ETHERMTU.
3134 */
3135static struct block *
3136gen_linktype(compiler_state_t *cstate, int proto)
3137{
3138	struct block *b0, *b1, *b2;
3139	const char *description;
3140
3141	/* are we checking MPLS-encapsulated packets? */
3142	if (cstate->label_stack_depth > 0) {
3143		switch (proto) {
3144		case ETHERTYPE_IP:
3145		case PPP_IP:
3146			/* FIXME add other L3 proto IDs */
3147			return gen_mpls_linktype(cstate, Q_IP);
3148
3149		case ETHERTYPE_IPV6:
3150		case PPP_IPV6:
3151			/* FIXME add other L3 proto IDs */
3152			return gen_mpls_linktype(cstate, Q_IPV6);
3153
3154		default:
3155			bpf_error(cstate, "unsupported protocol over mpls");
3156			/*NOTREACHED*/
3157		}
3158	}
3159
3160	switch (cstate->linktype) {
3161
3162	case DLT_EN10MB:
3163	case DLT_NETANALYZER:
3164	case DLT_NETANALYZER_TRANSPARENT:
3165		/* Geneve has an EtherType regardless of whether there is an
3166		 * L2 header. */
3167		if (!cstate->is_geneve)
3168			b0 = gen_prevlinkhdr_check(cstate);
3169		else
3170			b0 = NULL;
3171
3172		b1 = gen_ether_linktype(cstate, proto);
3173		if (b0 != NULL)
3174			gen_and(b0, b1);
3175		return b1;
3176		/*NOTREACHED*/
3177
3178	case DLT_C_HDLC:
3179		switch (proto) {
3180
3181		case LLCSAP_ISONS:
3182			proto = (proto << 8 | LLCSAP_ISONS);
3183			/* fall through */
3184
3185		default:
3186			return gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, (bpf_int32)proto);
3187			/*NOTREACHED*/
3188		}
3189
3190	case DLT_IEEE802_11:
3191	case DLT_PRISM_HEADER:
3192	case DLT_IEEE802_11_RADIO_AVS:
3193	case DLT_IEEE802_11_RADIO:
3194	case DLT_PPI:
3195		/*
3196		 * Check that we have a data frame.
3197		 */
3198		b0 = gen_check_802_11_data_frame(cstate);
3199
3200		/*
3201		 * Now check for the specified link-layer type.
3202		 */
3203		b1 = gen_llc_linktype(cstate, proto);
3204		gen_and(b0, b1);
3205		return b1;
3206		/*NOTREACHED*/
3207
3208	case DLT_FDDI:
3209		/*
3210		 * XXX - check for LLC frames.
3211		 */
3212		return gen_llc_linktype(cstate, proto);
3213		/*NOTREACHED*/
3214
3215	case DLT_IEEE802:
3216		/*
3217		 * XXX - check for LLC PDUs, as per IEEE 802.5.
3218		 */
3219		return gen_llc_linktype(cstate, proto);
3220		/*NOTREACHED*/
3221
3222	case DLT_ATM_RFC1483:
3223	case DLT_ATM_CLIP:
3224	case DLT_IP_OVER_FC:
3225		return gen_llc_linktype(cstate, proto);
3226		/*NOTREACHED*/
3227
3228	case DLT_SUNATM:
3229		/*
3230		 * Check for an LLC-encapsulated version of this protocol;
3231		 * if we were checking for LANE, linktype would no longer
3232		 * be DLT_SUNATM.
3233		 *
3234		 * Check for LLC encapsulation and then check the protocol.
3235		 */
3236		b0 = gen_atmfield_code_internal(cstate, A_PROTOTYPE, PT_LLC, BPF_JEQ, 0);
3237		b1 = gen_llc_linktype(cstate, proto);
3238		gen_and(b0, b1);
3239		return b1;
3240		/*NOTREACHED*/
3241
3242	case DLT_LINUX_SLL:
3243		return gen_linux_sll_linktype(cstate, proto);
3244		/*NOTREACHED*/
3245
3246	case DLT_SLIP:
3247	case DLT_SLIP_BSDOS:
3248	case DLT_RAW:
3249		/*
3250		 * These types don't provide any type field; packets
3251		 * are always IPv4 or IPv6.
3252		 *
3253		 * XXX - for IPv4, check for a version number of 4, and,
3254		 * for IPv6, check for a version number of 6?
3255		 */
3256		switch (proto) {
3257
3258		case ETHERTYPE_IP:
3259			/* Check for a version number of 4. */
3260			return gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, 0x40, 0xF0);
3261
3262		case ETHERTYPE_IPV6:
3263			/* Check for a version number of 6. */
3264			return gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, 0x60, 0xF0);
3265
3266		default:
3267			return gen_false(cstate);	/* always false */
3268		}
3269		/*NOTREACHED*/
3270
3271	case DLT_IPV4:
3272		/*
3273		 * Raw IPv4, so no type field.
3274		 */
3275		if (proto == ETHERTYPE_IP)
3276			return gen_true(cstate);	/* always true */
3277
3278		/* Checking for something other than IPv4; always false */
3279		return gen_false(cstate);
3280		/*NOTREACHED*/
3281
3282	case DLT_IPV6:
3283		/*
3284		 * Raw IPv6, so no type field.
3285		 */
3286		if (proto == ETHERTYPE_IPV6)
3287			return gen_true(cstate);	/* always true */
3288
3289		/* Checking for something other than IPv6; always false */
3290		return gen_false(cstate);
3291		/*NOTREACHED*/
3292
3293	case DLT_PPP:
3294	case DLT_PPP_PPPD:
3295	case DLT_PPP_SERIAL:
3296	case DLT_PPP_ETHER:
3297		/*
3298		 * We use Ethernet protocol types inside libpcap;
3299		 * map them to the corresponding PPP protocol types.
3300		 */
3301		proto = ethertype_to_ppptype(proto);
3302		return gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, (bpf_int32)proto);
3303		/*NOTREACHED*/
3304
3305	case DLT_PPP_BSDOS:
3306		/*
3307		 * We use Ethernet protocol types inside libpcap;
3308		 * map them to the corresponding PPP protocol types.
3309		 */
3310		switch (proto) {
3311
3312		case ETHERTYPE_IP:
3313			/*
3314			 * Also check for Van Jacobson-compressed IP.
3315			 * XXX - do this for other forms of PPP?
3316			 */
3317			b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, PPP_IP);
3318			b1 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, PPP_VJC);
3319			gen_or(b0, b1);
3320			b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, PPP_VJNC);
3321			gen_or(b1, b0);
3322			return b0;
3323
3324		default:
3325			proto = ethertype_to_ppptype(proto);
3326			return gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H,
3327				(bpf_int32)proto);
3328		}
3329		/*NOTREACHED*/
3330
3331	case DLT_NULL:
3332	case DLT_LOOP:
3333	case DLT_ENC:
3334		switch (proto) {
3335
3336		case ETHERTYPE_IP:
3337			return (gen_loopback_linktype(cstate, AF_INET));
3338
3339		case ETHERTYPE_IPV6:
3340			/*
3341			 * AF_ values may, unfortunately, be platform-
3342			 * dependent; AF_INET isn't, because everybody
3343			 * used 4.2BSD's value, but AF_INET6 is, because
3344			 * 4.2BSD didn't have a value for it (given that
3345			 * IPv6 didn't exist back in the early 1980's),
3346			 * and they all picked their own values.
3347			 *
3348			 * This means that, if we're reading from a
3349			 * savefile, we need to check for all the
3350			 * possible values.
3351			 *
3352			 * If we're doing a live capture, we only need
3353			 * to check for this platform's value; however,
3354			 * Npcap uses 24, which isn't Windows's AF_INET6
3355			 * value.  (Given the multiple different values,
3356			 * programs that read pcap files shouldn't be
3357			 * checking for their platform's AF_INET6 value
3358			 * anyway, they should check for all of the
3359			 * possible values. and they might as well do
3360			 * that even for live captures.)
3361			 */
3362			if (cstate->bpf_pcap->rfile != NULL) {
3363				/*
3364				 * Savefile - check for all three
3365				 * possible IPv6 values.
3366				 */
3367				b0 = gen_loopback_linktype(cstate, BSD_AFNUM_INET6_BSD);
3368				b1 = gen_loopback_linktype(cstate, BSD_AFNUM_INET6_FREEBSD);
3369				gen_or(b0, b1);
3370				b0 = gen_loopback_linktype(cstate, BSD_AFNUM_INET6_DARWIN);
3371				gen_or(b0, b1);
3372				return (b1);
3373			} else {
3374				/*
3375				 * Live capture, so we only need to
3376				 * check for the value used on this
3377				 * platform.
3378				 */
3379#ifdef _WIN32
3380				/*
3381				 * Npcap doesn't use Windows's AF_INET6,
3382				 * as that collides with AF_IPX on
3383				 * some BSDs (both have the value 23).
3384				 * Instead, it uses 24.
3385				 */
3386				return (gen_loopback_linktype(cstate, 24));
3387#else /* _WIN32 */
3388#ifdef AF_INET6
3389				return (gen_loopback_linktype(cstate, AF_INET6));
3390#else /* AF_INET6 */
3391				/*
3392				 * I guess this platform doesn't support
3393				 * IPv6, so we just reject all packets.
3394				 */
3395				return gen_false(cstate);
3396#endif /* AF_INET6 */
3397#endif /* _WIN32 */
3398			}
3399
3400		default:
3401			/*
3402			 * Not a type on which we support filtering.
3403			 * XXX - support those that have AF_ values
3404			 * #defined on this platform, at least?
3405			 */
3406			return gen_false(cstate);
3407		}
3408
3409#ifdef HAVE_NET_PFVAR_H
3410	case DLT_PFLOG:
3411		/*
3412		 * af field is host byte order in contrast to the rest of
3413		 * the packet.
3414		 */
3415		if (proto == ETHERTYPE_IP)
3416			return (gen_cmp(cstate, OR_LINKHDR, offsetof(struct pfloghdr, af),
3417			    BPF_B, (bpf_int32)AF_INET));
3418		else if (proto == ETHERTYPE_IPV6)
3419			return (gen_cmp(cstate, OR_LINKHDR, offsetof(struct pfloghdr, af),
3420			    BPF_B, (bpf_int32)AF_INET6));
3421		else
3422			return gen_false(cstate);
3423		/*NOTREACHED*/
3424#endif /* HAVE_NET_PFVAR_H */
3425
3426	case DLT_ARCNET:
3427	case DLT_ARCNET_LINUX:
3428		/*
3429		 * XXX should we check for first fragment if the protocol
3430		 * uses PHDS?
3431		 */
3432		switch (proto) {
3433
3434		default:
3435			return gen_false(cstate);
3436
3437		case ETHERTYPE_IPV6:
3438			return (gen_cmp(cstate, OR_LINKTYPE, 0, BPF_B,
3439				(bpf_int32)ARCTYPE_INET6));
3440
3441		case ETHERTYPE_IP:
3442			b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_B,
3443				     (bpf_int32)ARCTYPE_IP);
3444			b1 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_B,
3445				     (bpf_int32)ARCTYPE_IP_OLD);
3446			gen_or(b0, b1);
3447			return (b1);
3448
3449		case ETHERTYPE_ARP:
3450			b0 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_B,
3451				     (bpf_int32)ARCTYPE_ARP);
3452			b1 = gen_cmp(cstate, OR_LINKTYPE, 0, BPF_B,
3453				     (bpf_int32)ARCTYPE_ARP_OLD);
3454			gen_or(b0, b1);
3455			return (b1);
3456
3457		case ETHERTYPE_REVARP:
3458			return (gen_cmp(cstate, OR_LINKTYPE, 0, BPF_B,
3459					(bpf_int32)ARCTYPE_REVARP));
3460
3461		case ETHERTYPE_ATALK:
3462			return (gen_cmp(cstate, OR_LINKTYPE, 0, BPF_B,
3463					(bpf_int32)ARCTYPE_ATALK));
3464		}
3465		/*NOTREACHED*/
3466
3467	case DLT_LTALK:
3468		switch (proto) {
3469		case ETHERTYPE_ATALK:
3470			return gen_true(cstate);
3471		default:
3472			return gen_false(cstate);
3473		}
3474		/*NOTREACHED*/
3475
3476	case DLT_FRELAY:
3477		/*
3478		 * XXX - assumes a 2-byte Frame Relay header with
3479		 * DLCI and flags.  What if the address is longer?
3480		 */
3481		switch (proto) {
3482
3483		case ETHERTYPE_IP:
3484			/*
3485			 * Check for the special NLPID for IP.
3486			 */
3487			return gen_cmp(cstate, OR_LINKHDR, 2, BPF_H, (0x03<<8) | 0xcc);
3488
3489		case ETHERTYPE_IPV6:
3490			/*
3491			 * Check for the special NLPID for IPv6.
3492			 */
3493			return gen_cmp(cstate, OR_LINKHDR, 2, BPF_H, (0x03<<8) | 0x8e);
3494
3495		case LLCSAP_ISONS:
3496			/*
3497			 * Check for several OSI protocols.
3498			 *
3499			 * Frame Relay packets typically have an OSI
3500			 * NLPID at the beginning; we check for each
3501			 * of them.
3502			 *
3503			 * What we check for is the NLPID and a frame
3504			 * control field of UI, i.e. 0x03 followed
3505			 * by the NLPID.
3506			 */
3507			b0 = gen_cmp(cstate, OR_LINKHDR, 2, BPF_H, (0x03<<8) | ISO8473_CLNP);
3508			b1 = gen_cmp(cstate, OR_LINKHDR, 2, BPF_H, (0x03<<8) | ISO9542_ESIS);
3509			b2 = gen_cmp(cstate, OR_LINKHDR, 2, BPF_H, (0x03<<8) | ISO10589_ISIS);
3510			gen_or(b1, b2);
3511			gen_or(b0, b2);
3512			return b2;
3513
3514		default:
3515			return gen_false(cstate);
3516		}
3517		/*NOTREACHED*/
3518
3519	case DLT_MFR:
3520		bpf_error(cstate, "Multi-link Frame Relay link-layer type filtering not implemented");
3521
3522        case DLT_JUNIPER_MFR:
3523        case DLT_JUNIPER_MLFR:
3524        case DLT_JUNIPER_MLPPP:
3525	case DLT_JUNIPER_ATM1:
3526	case DLT_JUNIPER_ATM2:
3527	case DLT_JUNIPER_PPPOE:
3528	case DLT_JUNIPER_PPPOE_ATM:
3529        case DLT_JUNIPER_GGSN:
3530        case DLT_JUNIPER_ES:
3531        case DLT_JUNIPER_MONITOR:
3532        case DLT_JUNIPER_SERVICES:
3533        case DLT_JUNIPER_ETHER:
3534        case DLT_JUNIPER_PPP:
3535        case DLT_JUNIPER_FRELAY:
3536        case DLT_JUNIPER_CHDLC:
3537        case DLT_JUNIPER_VP:
3538        case DLT_JUNIPER_ST:
3539        case DLT_JUNIPER_ISM:
3540        case DLT_JUNIPER_VS:
3541        case DLT_JUNIPER_SRX_E2E:
3542        case DLT_JUNIPER_FIBRECHANNEL:
3543	case DLT_JUNIPER_ATM_CEMIC:
3544
3545		/* just lets verify the magic number for now -
3546		 * on ATM we may have up to 6 different encapsulations on the wire
3547		 * and need a lot of heuristics to figure out that the payload
3548		 * might be;
3549		 *
3550		 * FIXME encapsulation specific BPF_ filters
3551		 */
3552		return gen_mcmp(cstate, OR_LINKHDR, 0, BPF_W, 0x4d474300, 0xffffff00); /* compare the magic number */
3553
3554	case DLT_BACNET_MS_TP:
3555		return gen_mcmp(cstate, OR_LINKHDR, 0, BPF_W, 0x55FF0000, 0xffff0000);
3556
3557	case DLT_IPNET:
3558		return gen_ipnet_linktype(cstate, proto);
3559
3560	case DLT_LINUX_IRDA:
3561		bpf_error(cstate, "IrDA link-layer type filtering not implemented");
3562
3563	case DLT_DOCSIS:
3564		bpf_error(cstate, "DOCSIS link-layer type filtering not implemented");
3565
3566	case DLT_MTP2:
3567	case DLT_MTP2_WITH_PHDR:
3568		bpf_error(cstate, "MTP2 link-layer type filtering not implemented");
3569
3570	case DLT_ERF:
3571		bpf_error(cstate, "ERF link-layer type filtering not implemented");
3572
3573	case DLT_PFSYNC:
3574		bpf_error(cstate, "PFSYNC link-layer type filtering not implemented");
3575
3576	case DLT_LINUX_LAPD:
3577		bpf_error(cstate, "LAPD link-layer type filtering not implemented");
3578
3579	case DLT_USB_FREEBSD:
3580	case DLT_USB_LINUX:
3581	case DLT_USB_LINUX_MMAPPED:
3582	case DLT_USBPCAP:
3583		bpf_error(cstate, "USB link-layer type filtering not implemented");
3584
3585	case DLT_BLUETOOTH_HCI_H4:
3586	case DLT_BLUETOOTH_HCI_H4_WITH_PHDR:
3587		bpf_error(cstate, "Bluetooth link-layer type filtering not implemented");
3588
3589	case DLT_CAN20B:
3590	case DLT_CAN_SOCKETCAN:
3591		bpf_error(cstate, "CAN link-layer type filtering not implemented");
3592
3593	case DLT_IEEE802_15_4:
3594	case DLT_IEEE802_15_4_LINUX:
3595	case DLT_IEEE802_15_4_NONASK_PHY:
3596	case DLT_IEEE802_15_4_NOFCS:
3597		bpf_error(cstate, "IEEE 802.15.4 link-layer type filtering not implemented");
3598
3599	case DLT_IEEE802_16_MAC_CPS_RADIO:
3600		bpf_error(cstate, "IEEE 802.16 link-layer type filtering not implemented");
3601
3602	case DLT_SITA:
3603		bpf_error(cstate, "SITA link-layer type filtering not implemented");
3604
3605	case DLT_RAIF1:
3606		bpf_error(cstate, "RAIF1 link-layer type filtering not implemented");
3607
3608	case DLT_IPMB_KONTRON:
3609	case DLT_IPMB_LINUX:
3610		bpf_error(cstate, "IPMB link-layer type filtering not implemented");
3611
3612	case DLT_AX25_KISS:
3613		bpf_error(cstate, "AX.25 link-layer type filtering not implemented");
3614
3615	case DLT_NFLOG:
3616		/* Using the fixed-size NFLOG header it is possible to tell only
3617		 * the address family of the packet, other meaningful data is
3618		 * either missing or behind TLVs.
3619		 */
3620		bpf_error(cstate, "NFLOG link-layer type filtering not implemented");
3621
3622	default:
3623		/*
3624		 * Does this link-layer header type have a field
3625		 * indicating the type of the next protocol?  If
3626		 * so, off_linktype.constant_part will be the offset of that
3627		 * field in the packet; if not, it will be OFFSET_NOT_SET.
3628		 */
3629		if (cstate->off_linktype.constant_part != OFFSET_NOT_SET) {
3630			/*
3631			 * Yes; assume it's an Ethernet type.  (If
3632			 * it's not, it needs to be handled specially
3633			 * above.)
3634			 */
3635			return gen_cmp(cstate, OR_LINKTYPE, 0, BPF_H, (bpf_int32)proto);
3636			/*NOTREACHED */
3637		} else {
3638			/*
3639			 * No; report an error.
3640			 */
3641			description = pcap_datalink_val_to_description_or_dlt(cstate->linktype);
3642			bpf_error(cstate, "%s link-layer type filtering not implemented",
3643			    description);
3644			/*NOTREACHED */
3645		}
3646	}
3647}
3648
3649/*
3650 * Check for an LLC SNAP packet with a given organization code and
3651 * protocol type; we check the entire contents of the 802.2 LLC and
3652 * snap headers, checking for DSAP and SSAP of SNAP and a control
3653 * field of 0x03 in the LLC header, and for the specified organization
3654 * code and protocol type in the SNAP header.
3655 */
3656static struct block *
3657gen_snap(compiler_state_t *cstate, bpf_u_int32 orgcode, bpf_u_int32 ptype)
3658{
3659	u_char snapblock[8];
3660
3661	snapblock[0] = LLCSAP_SNAP;		/* DSAP = SNAP */
3662	snapblock[1] = LLCSAP_SNAP;		/* SSAP = SNAP */
3663	snapblock[2] = 0x03;			/* control = UI */
3664	snapblock[3] = (u_char)(orgcode >> 16);	/* upper 8 bits of organization code */
3665	snapblock[4] = (u_char)(orgcode >> 8);	/* middle 8 bits of organization code */
3666	snapblock[5] = (u_char)(orgcode >> 0);	/* lower 8 bits of organization code */
3667	snapblock[6] = (u_char)(ptype >> 8);	/* upper 8 bits of protocol type */
3668	snapblock[7] = (u_char)(ptype >> 0);	/* lower 8 bits of protocol type */
3669	return gen_bcmp(cstate, OR_LLC, 0, 8, snapblock);
3670}
3671
3672/*
3673 * Generate code to match frames with an LLC header.
3674 */
3675static struct block *
3676gen_llc_internal(compiler_state_t *cstate)
3677{
3678	struct block *b0, *b1;
3679
3680	switch (cstate->linktype) {
3681
3682	case DLT_EN10MB:
3683		/*
3684		 * We check for an Ethernet type field less than
3685		 * 1500, which means it's an 802.3 length field.
3686		 */
3687		b0 = gen_cmp_gt(cstate, OR_LINKTYPE, 0, BPF_H, ETHERMTU);
3688		gen_not(b0);
3689
3690		/*
3691		 * Now check for the purported DSAP and SSAP not being
3692		 * 0xFF, to rule out NetWare-over-802.3.
3693		 */
3694		b1 = gen_cmp(cstate, OR_LLC, 0, BPF_H, (bpf_int32)0xFFFF);
3695		gen_not(b1);
3696		gen_and(b0, b1);
3697		return b1;
3698
3699	case DLT_SUNATM:
3700		/*
3701		 * We check for LLC traffic.
3702		 */
3703		b0 = gen_atmtype_llc(cstate);
3704		return b0;
3705
3706	case DLT_IEEE802:	/* Token Ring */
3707		/*
3708		 * XXX - check for LLC frames.
3709		 */
3710		return gen_true(cstate);
3711
3712	case DLT_FDDI:
3713		/*
3714		 * XXX - check for LLC frames.
3715		 */
3716		return gen_true(cstate);
3717
3718	case DLT_ATM_RFC1483:
3719		/*
3720		 * For LLC encapsulation, these are defined to have an
3721		 * 802.2 LLC header.
3722		 *
3723		 * For VC encapsulation, they don't, but there's no
3724		 * way to check for that; the protocol used on the VC
3725		 * is negotiated out of band.
3726		 */
3727		return gen_true(cstate);
3728
3729	case DLT_IEEE802_11:
3730	case DLT_PRISM_HEADER:
3731	case DLT_IEEE802_11_RADIO:
3732	case DLT_IEEE802_11_RADIO_AVS:
3733	case DLT_PPI:
3734		/*
3735		 * Check that we have a data frame.
3736		 */
3737		b0 = gen_check_802_11_data_frame(cstate);
3738		return b0;
3739
3740	default:
3741		bpf_error(cstate, "'llc' not supported for %s",
3742			  pcap_datalink_val_to_description_or_dlt(cstate->linktype));
3743		/*NOTREACHED*/
3744	}
3745}
3746
3747struct block *
3748gen_llc(compiler_state_t *cstate)
3749{
3750	/*
3751	 * Catch errors reported by us and routines below us, and return NULL
3752	 * on an error.
3753	 */
3754	if (setjmp(cstate->top_ctx))
3755		return (NULL);
3756
3757	return gen_llc_internal(cstate);
3758}
3759
3760struct block *
3761gen_llc_i(compiler_state_t *cstate)
3762{
3763	struct block *b0, *b1;
3764	struct slist *s;
3765
3766	/*
3767	 * Catch errors reported by us and routines below us, and return NULL
3768	 * on an error.
3769	 */
3770	if (setjmp(cstate->top_ctx))
3771		return (NULL);
3772
3773	/*
3774	 * Check whether this is an LLC frame.
3775	 */
3776	b0 = gen_llc_internal(cstate);
3777
3778	/*
3779	 * Load the control byte and test the low-order bit; it must
3780	 * be clear for I frames.
3781	 */
3782	s = gen_load_a(cstate, OR_LLC, 2, BPF_B);
3783	b1 = new_block(cstate, JMP(BPF_JSET));
3784	b1->s.k = 0x01;
3785	b1->stmts = s;
3786	gen_not(b1);
3787	gen_and(b0, b1);
3788	return b1;
3789}
3790
3791struct block *
3792gen_llc_s(compiler_state_t *cstate)
3793{
3794	struct block *b0, *b1;
3795
3796	/*
3797	 * Catch errors reported by us and routines below us, and return NULL
3798	 * on an error.
3799	 */
3800	if (setjmp(cstate->top_ctx))
3801		return (NULL);
3802
3803	/*
3804	 * Check whether this is an LLC frame.
3805	 */
3806	b0 = gen_llc_internal(cstate);
3807
3808	/*
3809	 * Now compare the low-order 2 bit of the control byte against
3810	 * the appropriate value for S frames.
3811	 */
3812	b1 = gen_mcmp(cstate, OR_LLC, 2, BPF_B, LLC_S_FMT, 0x03);
3813	gen_and(b0, b1);
3814	return b1;
3815}
3816
3817struct block *
3818gen_llc_u(compiler_state_t *cstate)
3819{
3820	struct block *b0, *b1;
3821
3822	/*
3823	 * Catch errors reported by us and routines below us, and return NULL
3824	 * on an error.
3825	 */
3826	if (setjmp(cstate->top_ctx))
3827		return (NULL);
3828
3829	/*
3830	 * Check whether this is an LLC frame.
3831	 */
3832	b0 = gen_llc_internal(cstate);
3833
3834	/*
3835	 * Now compare the low-order 2 bit of the control byte against
3836	 * the appropriate value for U frames.
3837	 */
3838	b1 = gen_mcmp(cstate, OR_LLC, 2, BPF_B, LLC_U_FMT, 0x03);
3839	gen_and(b0, b1);
3840	return b1;
3841}
3842
3843struct block *
3844gen_llc_s_subtype(compiler_state_t *cstate, bpf_u_int32 subtype)
3845{
3846	struct block *b0, *b1;
3847
3848	/*
3849	 * Catch errors reported by us and routines below us, and return NULL
3850	 * on an error.
3851	 */
3852	if (setjmp(cstate->top_ctx))
3853		return (NULL);
3854
3855	/*
3856	 * Check whether this is an LLC frame.
3857	 */
3858	b0 = gen_llc_internal(cstate);
3859
3860	/*
3861	 * Now check for an S frame with the appropriate type.
3862	 */
3863	b1 = gen_mcmp(cstate, OR_LLC, 2, BPF_B, subtype, LLC_S_CMD_MASK);
3864	gen_and(b0, b1);
3865	return b1;
3866}
3867
3868struct block *
3869gen_llc_u_subtype(compiler_state_t *cstate, bpf_u_int32 subtype)
3870{
3871	struct block *b0, *b1;
3872
3873	/*
3874	 * Catch errors reported by us and routines below us, and return NULL
3875	 * on an error.
3876	 */
3877	if (setjmp(cstate->top_ctx))
3878		return (NULL);
3879
3880	/*
3881	 * Check whether this is an LLC frame.
3882	 */
3883	b0 = gen_llc_internal(cstate);
3884
3885	/*
3886	 * Now check for a U frame with the appropriate type.
3887	 */
3888	b1 = gen_mcmp(cstate, OR_LLC, 2, BPF_B, subtype, LLC_U_CMD_MASK);
3889	gen_and(b0, b1);
3890	return b1;
3891}
3892
3893/*
3894 * Generate code to match a particular packet type, for link-layer types
3895 * using 802.2 LLC headers.
3896 *
3897 * This is *NOT* used for Ethernet; "gen_ether_linktype()" is used
3898 * for that - it handles the D/I/X Ethernet vs. 802.3+802.2 issues.
3899 *
3900 * "proto" is an Ethernet type value, if > ETHERMTU, or an LLC SAP
3901 * value, if <= ETHERMTU.  We use that to determine whether to
3902 * match the DSAP or both DSAP and LSAP or to check the OUI and
3903 * protocol ID in a SNAP header.
3904 */
3905static struct block *
3906gen_llc_linktype(compiler_state_t *cstate, int proto)
3907{
3908	/*
3909	 * XXX - handle token-ring variable-length header.
3910	 */
3911	switch (proto) {
3912
3913	case LLCSAP_IP:
3914	case LLCSAP_ISONS:
3915	case LLCSAP_NETBEUI:
3916		/*
3917		 * XXX - should we check both the DSAP and the
3918		 * SSAP, like this, or should we check just the
3919		 * DSAP, as we do for other SAP values?
3920		 */
3921		return gen_cmp(cstate, OR_LLC, 0, BPF_H, (bpf_u_int32)
3922			     ((proto << 8) | proto));
3923
3924	case LLCSAP_IPX:
3925		/*
3926		 * XXX - are there ever SNAP frames for IPX on
3927		 * non-Ethernet 802.x networks?
3928		 */
3929		return gen_cmp(cstate, OR_LLC, 0, BPF_B,
3930		    (bpf_int32)LLCSAP_IPX);
3931
3932	case ETHERTYPE_ATALK:
3933		/*
3934		 * 802.2-encapsulated ETHERTYPE_ATALK packets are
3935		 * SNAP packets with an organization code of
3936		 * 0x080007 (Apple, for Appletalk) and a protocol
3937		 * type of ETHERTYPE_ATALK (Appletalk).
3938		 *
3939		 * XXX - check for an organization code of
3940		 * encapsulated Ethernet as well?
3941		 */
3942		return gen_snap(cstate, 0x080007, ETHERTYPE_ATALK);
3943
3944	default:
3945		/*
3946		 * XXX - we don't have to check for IPX 802.3
3947		 * here, but should we check for the IPX Ethertype?
3948		 */
3949		if (proto <= ETHERMTU) {
3950			/*
3951			 * This is an LLC SAP value, so check
3952			 * the DSAP.
3953			 */
3954			return gen_cmp(cstate, OR_LLC, 0, BPF_B, (bpf_int32)proto);
3955		} else {
3956			/*
3957			 * This is an Ethernet type; we assume that it's
3958			 * unlikely that it'll appear in the right place
3959			 * at random, and therefore check only the
3960			 * location that would hold the Ethernet type
3961			 * in a SNAP frame with an organization code of
3962			 * 0x000000 (encapsulated Ethernet).
3963			 *
3964			 * XXX - if we were to check for the SNAP DSAP and
3965			 * LSAP, as per XXX, and were also to check for an
3966			 * organization code of 0x000000 (encapsulated
3967			 * Ethernet), we'd do
3968			 *
3969			 *	return gen_snap(cstate, 0x000000, proto);
3970			 *
3971			 * here; for now, we don't, as per the above.
3972			 * I don't know whether it's worth the extra CPU
3973			 * time to do the right check or not.
3974			 */
3975			return gen_cmp(cstate, OR_LLC, 6, BPF_H, (bpf_int32)proto);
3976		}
3977	}
3978}
3979
3980static struct block *
3981gen_hostop(compiler_state_t *cstate, bpf_u_int32 addr, bpf_u_int32 mask,
3982    int dir, int proto, u_int src_off, u_int dst_off)
3983{
3984	struct block *b0, *b1;
3985	u_int offset;
3986
3987	switch (dir) {
3988
3989	case Q_SRC:
3990		offset = src_off;
3991		break;
3992
3993	case Q_DST:
3994		offset = dst_off;
3995		break;
3996
3997	case Q_AND:
3998		b0 = gen_hostop(cstate, addr, mask, Q_SRC, proto, src_off, dst_off);
3999		b1 = gen_hostop(cstate, addr, mask, Q_DST, proto, src_off, dst_off);
4000		gen_and(b0, b1);
4001		return b1;
4002
4003	case Q_DEFAULT:
4004	case Q_OR:
4005		b0 = gen_hostop(cstate, addr, mask, Q_SRC, proto, src_off, dst_off);
4006		b1 = gen_hostop(cstate, addr, mask, Q_DST, proto, src_off, dst_off);
4007		gen_or(b0, b1);
4008		return b1;
4009
4010	case Q_ADDR1:
4011		bpf_error(cstate, "'addr1' and 'address1' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4012		/*NOTREACHED*/
4013
4014	case Q_ADDR2:
4015		bpf_error(cstate, "'addr2' and 'address2' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4016		/*NOTREACHED*/
4017
4018	case Q_ADDR3:
4019		bpf_error(cstate, "'addr3' and 'address3' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4020		/*NOTREACHED*/
4021
4022	case Q_ADDR4:
4023		bpf_error(cstate, "'addr4' and 'address4' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4024		/*NOTREACHED*/
4025
4026	case Q_RA:
4027		bpf_error(cstate, "'ra' is not a valid qualifier for addresses other than 802.11 MAC addresses");
4028		/*NOTREACHED*/
4029
4030	case Q_TA:
4031		bpf_error(cstate, "'ta' is not a valid qualifier for addresses other than 802.11 MAC addresses");
4032		/*NOTREACHED*/
4033
4034	default:
4035		abort();
4036		/*NOTREACHED*/
4037	}
4038	b0 = gen_linktype(cstate, proto);
4039	b1 = gen_mcmp(cstate, OR_LINKPL, offset, BPF_W, (bpf_int32)addr, mask);
4040	gen_and(b0, b1);
4041	return b1;
4042}
4043
4044#ifdef INET6
4045static struct block *
4046gen_hostop6(compiler_state_t *cstate, struct in6_addr *addr,
4047    struct in6_addr *mask, int dir, int proto, u_int src_off, u_int dst_off)
4048{
4049	struct block *b0, *b1;
4050	u_int offset;
4051	uint32_t *a, *m;
4052
4053	switch (dir) {
4054
4055	case Q_SRC:
4056		offset = src_off;
4057		break;
4058
4059	case Q_DST:
4060		offset = dst_off;
4061		break;
4062
4063	case Q_AND:
4064		b0 = gen_hostop6(cstate, addr, mask, Q_SRC, proto, src_off, dst_off);
4065		b1 = gen_hostop6(cstate, addr, mask, Q_DST, proto, src_off, dst_off);
4066		gen_and(b0, b1);
4067		return b1;
4068
4069	case Q_DEFAULT:
4070	case Q_OR:
4071		b0 = gen_hostop6(cstate, addr, mask, Q_SRC, proto, src_off, dst_off);
4072		b1 = gen_hostop6(cstate, addr, mask, Q_DST, proto, src_off, dst_off);
4073		gen_or(b0, b1);
4074		return b1;
4075
4076	case Q_ADDR1:
4077		bpf_error(cstate, "'addr1' and 'address1' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4078		/*NOTREACHED*/
4079
4080	case Q_ADDR2:
4081		bpf_error(cstate, "'addr2' and 'address2' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4082		/*NOTREACHED*/
4083
4084	case Q_ADDR3:
4085		bpf_error(cstate, "'addr3' and 'address3' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4086		/*NOTREACHED*/
4087
4088	case Q_ADDR4:
4089		bpf_error(cstate, "'addr4' and 'address4' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4090		/*NOTREACHED*/
4091
4092	case Q_RA:
4093		bpf_error(cstate, "'ra' is not a valid qualifier for addresses other than 802.11 MAC addresses");
4094		/*NOTREACHED*/
4095
4096	case Q_TA:
4097		bpf_error(cstate, "'ta' is not a valid qualifier for addresses other than 802.11 MAC addresses");
4098		/*NOTREACHED*/
4099
4100	default:
4101		abort();
4102		/*NOTREACHED*/
4103	}
4104	/* this order is important */
4105	a = (uint32_t *)addr;
4106	m = (uint32_t *)mask;
4107	b1 = gen_mcmp(cstate, OR_LINKPL, offset + 12, BPF_W, ntohl(a[3]), ntohl(m[3]));
4108	b0 = gen_mcmp(cstate, OR_LINKPL, offset + 8, BPF_W, ntohl(a[2]), ntohl(m[2]));
4109	gen_and(b0, b1);
4110	b0 = gen_mcmp(cstate, OR_LINKPL, offset + 4, BPF_W, ntohl(a[1]), ntohl(m[1]));
4111	gen_and(b0, b1);
4112	b0 = gen_mcmp(cstate, OR_LINKPL, offset + 0, BPF_W, ntohl(a[0]), ntohl(m[0]));
4113	gen_and(b0, b1);
4114	b0 = gen_linktype(cstate, proto);
4115	gen_and(b0, b1);
4116	return b1;
4117}
4118#endif
4119
4120static struct block *
4121gen_ehostop(compiler_state_t *cstate, const u_char *eaddr, int dir)
4122{
4123	register struct block *b0, *b1;
4124
4125	switch (dir) {
4126	case Q_SRC:
4127		return gen_bcmp(cstate, OR_LINKHDR, 6, 6, eaddr);
4128
4129	case Q_DST:
4130		return gen_bcmp(cstate, OR_LINKHDR, 0, 6, eaddr);
4131
4132	case Q_AND:
4133		b0 = gen_ehostop(cstate, eaddr, Q_SRC);
4134		b1 = gen_ehostop(cstate, eaddr, Q_DST);
4135		gen_and(b0, b1);
4136		return b1;
4137
4138	case Q_DEFAULT:
4139	case Q_OR:
4140		b0 = gen_ehostop(cstate, eaddr, Q_SRC);
4141		b1 = gen_ehostop(cstate, eaddr, Q_DST);
4142		gen_or(b0, b1);
4143		return b1;
4144
4145	case Q_ADDR1:
4146		bpf_error(cstate, "'addr1' and 'address1' are only supported on 802.11 with 802.11 headers");
4147		/*NOTREACHED*/
4148
4149	case Q_ADDR2:
4150		bpf_error(cstate, "'addr2' and 'address2' are only supported on 802.11 with 802.11 headers");
4151		/*NOTREACHED*/
4152
4153	case Q_ADDR3:
4154		bpf_error(cstate, "'addr3' and 'address3' are only supported on 802.11 with 802.11 headers");
4155		/*NOTREACHED*/
4156
4157	case Q_ADDR4:
4158		bpf_error(cstate, "'addr4' and 'address4' are only supported on 802.11 with 802.11 headers");
4159		/*NOTREACHED*/
4160
4161	case Q_RA:
4162		bpf_error(cstate, "'ra' is only supported on 802.11 with 802.11 headers");
4163		/*NOTREACHED*/
4164
4165	case Q_TA:
4166		bpf_error(cstate, "'ta' is only supported on 802.11 with 802.11 headers");
4167		/*NOTREACHED*/
4168	}
4169	abort();
4170	/*NOTREACHED*/
4171}
4172
4173/*
4174 * Like gen_ehostop, but for DLT_FDDI
4175 */
4176static struct block *
4177gen_fhostop(compiler_state_t *cstate, const u_char *eaddr, int dir)
4178{
4179	struct block *b0, *b1;
4180
4181	switch (dir) {
4182	case Q_SRC:
4183		return gen_bcmp(cstate, OR_LINKHDR, 6 + 1 + cstate->pcap_fddipad, 6, eaddr);
4184
4185	case Q_DST:
4186		return gen_bcmp(cstate, OR_LINKHDR, 0 + 1 + cstate->pcap_fddipad, 6, eaddr);
4187
4188	case Q_AND:
4189		b0 = gen_fhostop(cstate, eaddr, Q_SRC);
4190		b1 = gen_fhostop(cstate, eaddr, Q_DST);
4191		gen_and(b0, b1);
4192		return b1;
4193
4194	case Q_DEFAULT:
4195	case Q_OR:
4196		b0 = gen_fhostop(cstate, eaddr, Q_SRC);
4197		b1 = gen_fhostop(cstate, eaddr, Q_DST);
4198		gen_or(b0, b1);
4199		return b1;
4200
4201	case Q_ADDR1:
4202		bpf_error(cstate, "'addr1' and 'address1' are only supported on 802.11");
4203		/*NOTREACHED*/
4204
4205	case Q_ADDR2:
4206		bpf_error(cstate, "'addr2' and 'address2' are only supported on 802.11");
4207		/*NOTREACHED*/
4208
4209	case Q_ADDR3:
4210		bpf_error(cstate, "'addr3' and 'address3' are only supported on 802.11");
4211		/*NOTREACHED*/
4212
4213	case Q_ADDR4:
4214		bpf_error(cstate, "'addr4' and 'address4' are only supported on 802.11");
4215		/*NOTREACHED*/
4216
4217	case Q_RA:
4218		bpf_error(cstate, "'ra' is only supported on 802.11");
4219		/*NOTREACHED*/
4220
4221	case Q_TA:
4222		bpf_error(cstate, "'ta' is only supported on 802.11");
4223		/*NOTREACHED*/
4224	}
4225	abort();
4226	/*NOTREACHED*/
4227}
4228
4229/*
4230 * Like gen_ehostop, but for DLT_IEEE802 (Token Ring)
4231 */
4232static struct block *
4233gen_thostop(compiler_state_t *cstate, const u_char *eaddr, int dir)
4234{
4235	register struct block *b0, *b1;
4236
4237	switch (dir) {
4238	case Q_SRC:
4239		return gen_bcmp(cstate, OR_LINKHDR, 8, 6, eaddr);
4240
4241	case Q_DST:
4242		return gen_bcmp(cstate, OR_LINKHDR, 2, 6, eaddr);
4243
4244	case Q_AND:
4245		b0 = gen_thostop(cstate, eaddr, Q_SRC);
4246		b1 = gen_thostop(cstate, eaddr, Q_DST);
4247		gen_and(b0, b1);
4248		return b1;
4249
4250	case Q_DEFAULT:
4251	case Q_OR:
4252		b0 = gen_thostop(cstate, eaddr, Q_SRC);
4253		b1 = gen_thostop(cstate, eaddr, Q_DST);
4254		gen_or(b0, b1);
4255		return b1;
4256
4257	case Q_ADDR1:
4258		bpf_error(cstate, "'addr1' and 'address1' are only supported on 802.11");
4259		/*NOTREACHED*/
4260
4261	case Q_ADDR2:
4262		bpf_error(cstate, "'addr2' and 'address2' are only supported on 802.11");
4263		/*NOTREACHED*/
4264
4265	case Q_ADDR3:
4266		bpf_error(cstate, "'addr3' and 'address3' are only supported on 802.11");
4267		/*NOTREACHED*/
4268
4269	case Q_ADDR4:
4270		bpf_error(cstate, "'addr4' and 'address4' are only supported on 802.11");
4271		/*NOTREACHED*/
4272
4273	case Q_RA:
4274		bpf_error(cstate, "'ra' is only supported on 802.11");
4275		/*NOTREACHED*/
4276
4277	case Q_TA:
4278		bpf_error(cstate, "'ta' is only supported on 802.11");
4279		/*NOTREACHED*/
4280	}
4281	abort();
4282	/*NOTREACHED*/
4283}
4284
4285/*
4286 * Like gen_ehostop, but for DLT_IEEE802_11 (802.11 wireless LAN) and
4287 * various 802.11 + radio headers.
4288 */
4289static struct block *
4290gen_wlanhostop(compiler_state_t *cstate, const u_char *eaddr, int dir)
4291{
4292	register struct block *b0, *b1, *b2;
4293	register struct slist *s;
4294
4295#ifdef ENABLE_WLAN_FILTERING_PATCH
4296	/*
4297	 * TODO GV 20070613
4298	 * We need to disable the optimizer because the optimizer is buggy
4299	 * and wipes out some LD instructions generated by the below
4300	 * code to validate the Frame Control bits
4301	 */
4302	cstate->no_optimize = 1;
4303#endif /* ENABLE_WLAN_FILTERING_PATCH */
4304
4305	switch (dir) {
4306	case Q_SRC:
4307		/*
4308		 * Oh, yuk.
4309		 *
4310		 *	For control frames, there is no SA.
4311		 *
4312		 *	For management frames, SA is at an
4313		 *	offset of 10 from the beginning of
4314		 *	the packet.
4315		 *
4316		 *	For data frames, SA is at an offset
4317		 *	of 10 from the beginning of the packet
4318		 *	if From DS is clear, at an offset of
4319		 *	16 from the beginning of the packet
4320		 *	if From DS is set and To DS is clear,
4321		 *	and an offset of 24 from the beginning
4322		 *	of the packet if From DS is set and To DS
4323		 *	is set.
4324		 */
4325
4326		/*
4327		 * Generate the tests to be done for data frames
4328		 * with From DS set.
4329		 *
4330		 * First, check for To DS set, i.e. check "link[1] & 0x01".
4331		 */
4332		s = gen_load_a(cstate, OR_LINKHDR, 1, BPF_B);
4333		b1 = new_block(cstate, JMP(BPF_JSET));
4334		b1->s.k = 0x01;	/* To DS */
4335		b1->stmts = s;
4336
4337		/*
4338		 * If To DS is set, the SA is at 24.
4339		 */
4340		b0 = gen_bcmp(cstate, OR_LINKHDR, 24, 6, eaddr);
4341		gen_and(b1, b0);
4342
4343		/*
4344		 * Now, check for To DS not set, i.e. check
4345		 * "!(link[1] & 0x01)".
4346		 */
4347		s = gen_load_a(cstate, OR_LINKHDR, 1, BPF_B);
4348		b2 = new_block(cstate, JMP(BPF_JSET));
4349		b2->s.k = 0x01;	/* To DS */
4350		b2->stmts = s;
4351		gen_not(b2);
4352
4353		/*
4354		 * If To DS is not set, the SA is at 16.
4355		 */
4356		b1 = gen_bcmp(cstate, OR_LINKHDR, 16, 6, eaddr);
4357		gen_and(b2, b1);
4358
4359		/*
4360		 * Now OR together the last two checks.  That gives
4361		 * the complete set of checks for data frames with
4362		 * From DS set.
4363		 */
4364		gen_or(b1, b0);
4365
4366		/*
4367		 * Now check for From DS being set, and AND that with
4368		 * the ORed-together checks.
4369		 */
4370		s = gen_load_a(cstate, OR_LINKHDR, 1, BPF_B);
4371		b1 = new_block(cstate, JMP(BPF_JSET));
4372		b1->s.k = 0x02;	/* From DS */
4373		b1->stmts = s;
4374		gen_and(b1, b0);
4375
4376		/*
4377		 * Now check for data frames with From DS not set.
4378		 */
4379		s = gen_load_a(cstate, OR_LINKHDR, 1, BPF_B);
4380		b2 = new_block(cstate, JMP(BPF_JSET));
4381		b2->s.k = 0x02;	/* From DS */
4382		b2->stmts = s;
4383		gen_not(b2);
4384
4385		/*
4386		 * If From DS isn't set, the SA is at 10.
4387		 */
4388		b1 = gen_bcmp(cstate, OR_LINKHDR, 10, 6, eaddr);
4389		gen_and(b2, b1);
4390
4391		/*
4392		 * Now OR together the checks for data frames with
4393		 * From DS not set and for data frames with From DS
4394		 * set; that gives the checks done for data frames.
4395		 */
4396		gen_or(b1, b0);
4397
4398		/*
4399		 * Now check for a data frame.
4400		 * I.e, check "link[0] & 0x08".
4401		 */
4402		s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
4403		b1 = new_block(cstate, JMP(BPF_JSET));
4404		b1->s.k = 0x08;
4405		b1->stmts = s;
4406
4407		/*
4408		 * AND that with the checks done for data frames.
4409		 */
4410		gen_and(b1, b0);
4411
4412		/*
4413		 * If the high-order bit of the type value is 0, this
4414		 * is a management frame.
4415		 * I.e, check "!(link[0] & 0x08)".
4416		 */
4417		s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
4418		b2 = new_block(cstate, JMP(BPF_JSET));
4419		b2->s.k = 0x08;
4420		b2->stmts = s;
4421		gen_not(b2);
4422
4423		/*
4424		 * For management frames, the SA is at 10.
4425		 */
4426		b1 = gen_bcmp(cstate, OR_LINKHDR, 10, 6, eaddr);
4427		gen_and(b2, b1);
4428
4429		/*
4430		 * OR that with the checks done for data frames.
4431		 * That gives the checks done for management and
4432		 * data frames.
4433		 */
4434		gen_or(b1, b0);
4435
4436		/*
4437		 * If the low-order bit of the type value is 1,
4438		 * this is either a control frame or a frame
4439		 * with a reserved type, and thus not a
4440		 * frame with an SA.
4441		 *
4442		 * I.e., check "!(link[0] & 0x04)".
4443		 */
4444		s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
4445		b1 = new_block(cstate, JMP(BPF_JSET));
4446		b1->s.k = 0x04;
4447		b1->stmts = s;
4448		gen_not(b1);
4449
4450		/*
4451		 * AND that with the checks for data and management
4452		 * frames.
4453		 */
4454		gen_and(b1, b0);
4455		return b0;
4456
4457	case Q_DST:
4458		/*
4459		 * Oh, yuk.
4460		 *
4461		 *	For control frames, there is no DA.
4462		 *
4463		 *	For management frames, DA is at an
4464		 *	offset of 4 from the beginning of
4465		 *	the packet.
4466		 *
4467		 *	For data frames, DA is at an offset
4468		 *	of 4 from the beginning of the packet
4469		 *	if To DS is clear and at an offset of
4470		 *	16 from the beginning of the packet
4471		 *	if To DS is set.
4472		 */
4473
4474		/*
4475		 * Generate the tests to be done for data frames.
4476		 *
4477		 * First, check for To DS set, i.e. "link[1] & 0x01".
4478		 */
4479		s = gen_load_a(cstate, OR_LINKHDR, 1, BPF_B);
4480		b1 = new_block(cstate, JMP(BPF_JSET));
4481		b1->s.k = 0x01;	/* To DS */
4482		b1->stmts = s;
4483
4484		/*
4485		 * If To DS is set, the DA is at 16.
4486		 */
4487		b0 = gen_bcmp(cstate, OR_LINKHDR, 16, 6, eaddr);
4488		gen_and(b1, b0);
4489
4490		/*
4491		 * Now, check for To DS not set, i.e. check
4492		 * "!(link[1] & 0x01)".
4493		 */
4494		s = gen_load_a(cstate, OR_LINKHDR, 1, BPF_B);
4495		b2 = new_block(cstate, JMP(BPF_JSET));
4496		b2->s.k = 0x01;	/* To DS */
4497		b2->stmts = s;
4498		gen_not(b2);
4499
4500		/*
4501		 * If To DS is not set, the DA is at 4.
4502		 */
4503		b1 = gen_bcmp(cstate, OR_LINKHDR, 4, 6, eaddr);
4504		gen_and(b2, b1);
4505
4506		/*
4507		 * Now OR together the last two checks.  That gives
4508		 * the complete set of checks for data frames.
4509		 */
4510		gen_or(b1, b0);
4511
4512		/*
4513		 * Now check for a data frame.
4514		 * I.e, check "link[0] & 0x08".
4515		 */
4516		s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
4517		b1 = new_block(cstate, JMP(BPF_JSET));
4518		b1->s.k = 0x08;
4519		b1->stmts = s;
4520
4521		/*
4522		 * AND that with the checks done for data frames.
4523		 */
4524		gen_and(b1, b0);
4525
4526		/*
4527		 * If the high-order bit of the type value is 0, this
4528		 * is a management frame.
4529		 * I.e, check "!(link[0] & 0x08)".
4530		 */
4531		s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
4532		b2 = new_block(cstate, JMP(BPF_JSET));
4533		b2->s.k = 0x08;
4534		b2->stmts = s;
4535		gen_not(b2);
4536
4537		/*
4538		 * For management frames, the DA is at 4.
4539		 */
4540		b1 = gen_bcmp(cstate, OR_LINKHDR, 4, 6, eaddr);
4541		gen_and(b2, b1);
4542
4543		/*
4544		 * OR that with the checks done for data frames.
4545		 * That gives the checks done for management and
4546		 * data frames.
4547		 */
4548		gen_or(b1, b0);
4549
4550		/*
4551		 * If the low-order bit of the type value is 1,
4552		 * this is either a control frame or a frame
4553		 * with a reserved type, and thus not a
4554		 * frame with an SA.
4555		 *
4556		 * I.e., check "!(link[0] & 0x04)".
4557		 */
4558		s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
4559		b1 = new_block(cstate, JMP(BPF_JSET));
4560		b1->s.k = 0x04;
4561		b1->stmts = s;
4562		gen_not(b1);
4563
4564		/*
4565		 * AND that with the checks for data and management
4566		 * frames.
4567		 */
4568		gen_and(b1, b0);
4569		return b0;
4570
4571	case Q_AND:
4572		b0 = gen_wlanhostop(cstate, eaddr, Q_SRC);
4573		b1 = gen_wlanhostop(cstate, eaddr, Q_DST);
4574		gen_and(b0, b1);
4575		return b1;
4576
4577	case Q_DEFAULT:
4578	case Q_OR:
4579		b0 = gen_wlanhostop(cstate, eaddr, Q_SRC);
4580		b1 = gen_wlanhostop(cstate, eaddr, Q_DST);
4581		gen_or(b0, b1);
4582		return b1;
4583
4584	/*
4585	 * XXX - add BSSID keyword?
4586	 */
4587	case Q_ADDR1:
4588		return (gen_bcmp(cstate, OR_LINKHDR, 4, 6, eaddr));
4589
4590	case Q_ADDR2:
4591		/*
4592		 * Not present in CTS or ACK control frames.
4593		 */
4594		b0 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
4595			IEEE80211_FC0_TYPE_MASK);
4596		gen_not(b0);
4597		b1 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_CTS,
4598			IEEE80211_FC0_SUBTYPE_MASK);
4599		gen_not(b1);
4600		b2 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_ACK,
4601			IEEE80211_FC0_SUBTYPE_MASK);
4602		gen_not(b2);
4603		gen_and(b1, b2);
4604		gen_or(b0, b2);
4605		b1 = gen_bcmp(cstate, OR_LINKHDR, 10, 6, eaddr);
4606		gen_and(b2, b1);
4607		return b1;
4608
4609	case Q_ADDR3:
4610		/*
4611		 * Not present in control frames.
4612		 */
4613		b0 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
4614			IEEE80211_FC0_TYPE_MASK);
4615		gen_not(b0);
4616		b1 = gen_bcmp(cstate, OR_LINKHDR, 16, 6, eaddr);
4617		gen_and(b0, b1);
4618		return b1;
4619
4620	case Q_ADDR4:
4621		/*
4622		 * Present only if the direction mask has both "From DS"
4623		 * and "To DS" set.  Neither control frames nor management
4624		 * frames should have both of those set, so we don't
4625		 * check the frame type.
4626		 */
4627		b0 = gen_mcmp(cstate, OR_LINKHDR, 1, BPF_B,
4628			IEEE80211_FC1_DIR_DSTODS, IEEE80211_FC1_DIR_MASK);
4629		b1 = gen_bcmp(cstate, OR_LINKHDR, 24, 6, eaddr);
4630		gen_and(b0, b1);
4631		return b1;
4632
4633	case Q_RA:
4634		/*
4635		 * Not present in management frames; addr1 in other
4636		 * frames.
4637		 */
4638
4639		/*
4640		 * If the high-order bit of the type value is 0, this
4641		 * is a management frame.
4642		 * I.e, check "(link[0] & 0x08)".
4643		 */
4644		s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
4645		b1 = new_block(cstate, JMP(BPF_JSET));
4646		b1->s.k = 0x08;
4647		b1->stmts = s;
4648
4649		/*
4650		 * Check addr1.
4651		 */
4652		b0 = gen_bcmp(cstate, OR_LINKHDR, 4, 6, eaddr);
4653
4654		/*
4655		 * AND that with the check of addr1.
4656		 */
4657		gen_and(b1, b0);
4658		return (b0);
4659
4660	case Q_TA:
4661		/*
4662		 * Not present in management frames; addr2, if present,
4663		 * in other frames.
4664		 */
4665
4666		/*
4667		 * Not present in CTS or ACK control frames.
4668		 */
4669		b0 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_TYPE_CTL,
4670			IEEE80211_FC0_TYPE_MASK);
4671		gen_not(b0);
4672		b1 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_CTS,
4673			IEEE80211_FC0_SUBTYPE_MASK);
4674		gen_not(b1);
4675		b2 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, IEEE80211_FC0_SUBTYPE_ACK,
4676			IEEE80211_FC0_SUBTYPE_MASK);
4677		gen_not(b2);
4678		gen_and(b1, b2);
4679		gen_or(b0, b2);
4680
4681		/*
4682		 * If the high-order bit of the type value is 0, this
4683		 * is a management frame.
4684		 * I.e, check "(link[0] & 0x08)".
4685		 */
4686		s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
4687		b1 = new_block(cstate, JMP(BPF_JSET));
4688		b1->s.k = 0x08;
4689		b1->stmts = s;
4690
4691		/*
4692		 * AND that with the check for frames other than
4693		 * CTS and ACK frames.
4694		 */
4695		gen_and(b1, b2);
4696
4697		/*
4698		 * Check addr2.
4699		 */
4700		b1 = gen_bcmp(cstate, OR_LINKHDR, 10, 6, eaddr);
4701		gen_and(b2, b1);
4702		return b1;
4703	}
4704	abort();
4705	/*NOTREACHED*/
4706}
4707
4708/*
4709 * Like gen_ehostop, but for RFC 2625 IP-over-Fibre-Channel.
4710 * (We assume that the addresses are IEEE 48-bit MAC addresses,
4711 * as the RFC states.)
4712 */
4713static struct block *
4714gen_ipfchostop(compiler_state_t *cstate, const u_char *eaddr, int dir)
4715{
4716	register struct block *b0, *b1;
4717
4718	switch (dir) {
4719	case Q_SRC:
4720		return gen_bcmp(cstate, OR_LINKHDR, 10, 6, eaddr);
4721
4722	case Q_DST:
4723		return gen_bcmp(cstate, OR_LINKHDR, 2, 6, eaddr);
4724
4725	case Q_AND:
4726		b0 = gen_ipfchostop(cstate, eaddr, Q_SRC);
4727		b1 = gen_ipfchostop(cstate, eaddr, Q_DST);
4728		gen_and(b0, b1);
4729		return b1;
4730
4731	case Q_DEFAULT:
4732	case Q_OR:
4733		b0 = gen_ipfchostop(cstate, eaddr, Q_SRC);
4734		b1 = gen_ipfchostop(cstate, eaddr, Q_DST);
4735		gen_or(b0, b1);
4736		return b1;
4737
4738	case Q_ADDR1:
4739		bpf_error(cstate, "'addr1' and 'address1' are only supported on 802.11");
4740		/*NOTREACHED*/
4741
4742	case Q_ADDR2:
4743		bpf_error(cstate, "'addr2' and 'address2' are only supported on 802.11");
4744		/*NOTREACHED*/
4745
4746	case Q_ADDR3:
4747		bpf_error(cstate, "'addr3' and 'address3' are only supported on 802.11");
4748		/*NOTREACHED*/
4749
4750	case Q_ADDR4:
4751		bpf_error(cstate, "'addr4' and 'address4' are only supported on 802.11");
4752		/*NOTREACHED*/
4753
4754	case Q_RA:
4755		bpf_error(cstate, "'ra' is only supported on 802.11");
4756		/*NOTREACHED*/
4757
4758	case Q_TA:
4759		bpf_error(cstate, "'ta' is only supported on 802.11");
4760		/*NOTREACHED*/
4761	}
4762	abort();
4763	/*NOTREACHED*/
4764}
4765
4766/*
4767 * This is quite tricky because there may be pad bytes in front of the
4768 * DECNET header, and then there are two possible data packet formats that
4769 * carry both src and dst addresses, plus 5 packet types in a format that
4770 * carries only the src node, plus 2 types that use a different format and
4771 * also carry just the src node.
4772 *
4773 * Yuck.
4774 *
4775 * Instead of doing those all right, we just look for data packets with
4776 * 0 or 1 bytes of padding.  If you want to look at other packets, that
4777 * will require a lot more hacking.
4778 *
4779 * To add support for filtering on DECNET "areas" (network numbers)
4780 * one would want to add a "mask" argument to this routine.  That would
4781 * make the filter even more inefficient, although one could be clever
4782 * and not generate masking instructions if the mask is 0xFFFF.
4783 */
4784static struct block *
4785gen_dnhostop(compiler_state_t *cstate, bpf_u_int32 addr, int dir)
4786{
4787	struct block *b0, *b1, *b2, *tmp;
4788	u_int offset_lh;	/* offset if long header is received */
4789	u_int offset_sh;	/* offset if short header is received */
4790
4791	switch (dir) {
4792
4793	case Q_DST:
4794		offset_sh = 1;	/* follows flags */
4795		offset_lh = 7;	/* flgs,darea,dsubarea,HIORD */
4796		break;
4797
4798	case Q_SRC:
4799		offset_sh = 3;	/* follows flags, dstnode */
4800		offset_lh = 15;	/* flgs,darea,dsubarea,did,sarea,ssub,HIORD */
4801		break;
4802
4803	case Q_AND:
4804		/* Inefficient because we do our Calvinball dance twice */
4805		b0 = gen_dnhostop(cstate, addr, Q_SRC);
4806		b1 = gen_dnhostop(cstate, addr, Q_DST);
4807		gen_and(b0, b1);
4808		return b1;
4809
4810	case Q_DEFAULT:
4811	case Q_OR:
4812		/* Inefficient because we do our Calvinball dance twice */
4813		b0 = gen_dnhostop(cstate, addr, Q_SRC);
4814		b1 = gen_dnhostop(cstate, addr, Q_DST);
4815		gen_or(b0, b1);
4816		return b1;
4817
4818	case Q_ADDR1:
4819		bpf_error(cstate, "'addr1' and 'address1' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4820		/*NOTREACHED*/
4821
4822	case Q_ADDR2:
4823		bpf_error(cstate, "'addr2' and 'address2' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4824		/*NOTREACHED*/
4825
4826	case Q_ADDR3:
4827		bpf_error(cstate, "'addr3' and 'address3' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4828		/*NOTREACHED*/
4829
4830	case Q_ADDR4:
4831		bpf_error(cstate, "'addr4' and 'address4' are not valid qualifiers for addresses other than 802.11 MAC addresses");
4832		/*NOTREACHED*/
4833
4834	case Q_RA:
4835		bpf_error(cstate, "'ra' is not a valid qualifier for addresses other than 802.11 MAC addresses");
4836		/*NOTREACHED*/
4837
4838	case Q_TA:
4839		bpf_error(cstate, "'ta' is not a valid qualifier for addresses other than 802.11 MAC addresses");
4840		/*NOTREACHED*/
4841
4842	default:
4843		abort();
4844		/*NOTREACHED*/
4845	}
4846	b0 = gen_linktype(cstate, ETHERTYPE_DN);
4847	/* Check for pad = 1, long header case */
4848	tmp = gen_mcmp(cstate, OR_LINKPL, 2, BPF_H,
4849	    (bpf_int32)ntohs(0x0681), (bpf_int32)ntohs(0x07FF));
4850	b1 = gen_cmp(cstate, OR_LINKPL, 2 + 1 + offset_lh,
4851	    BPF_H, (bpf_int32)ntohs((u_short)addr));
4852	gen_and(tmp, b1);
4853	/* Check for pad = 0, long header case */
4854	tmp = gen_mcmp(cstate, OR_LINKPL, 2, BPF_B, (bpf_int32)0x06, (bpf_int32)0x7);
4855	b2 = gen_cmp(cstate, OR_LINKPL, 2 + offset_lh, BPF_H, (bpf_int32)ntohs((u_short)addr));
4856	gen_and(tmp, b2);
4857	gen_or(b2, b1);
4858	/* Check for pad = 1, short header case */
4859	tmp = gen_mcmp(cstate, OR_LINKPL, 2, BPF_H,
4860	    (bpf_int32)ntohs(0x0281), (bpf_int32)ntohs(0x07FF));
4861	b2 = gen_cmp(cstate, OR_LINKPL, 2 + 1 + offset_sh, BPF_H, (bpf_int32)ntohs((u_short)addr));
4862	gen_and(tmp, b2);
4863	gen_or(b2, b1);
4864	/* Check for pad = 0, short header case */
4865	tmp = gen_mcmp(cstate, OR_LINKPL, 2, BPF_B, (bpf_int32)0x02, (bpf_int32)0x7);
4866	b2 = gen_cmp(cstate, OR_LINKPL, 2 + offset_sh, BPF_H, (bpf_int32)ntohs((u_short)addr));
4867	gen_and(tmp, b2);
4868	gen_or(b2, b1);
4869
4870	/* Combine with test for cstate->linktype */
4871	gen_and(b0, b1);
4872	return b1;
4873}
4874
4875/*
4876 * Generate a check for IPv4 or IPv6 for MPLS-encapsulated packets;
4877 * test the bottom-of-stack bit, and then check the version number
4878 * field in the IP header.
4879 */
4880static struct block *
4881gen_mpls_linktype(compiler_state_t *cstate, int proto)
4882{
4883	struct block *b0, *b1;
4884
4885        switch (proto) {
4886
4887        case Q_IP:
4888                /* match the bottom-of-stack bit */
4889                b0 = gen_mcmp(cstate, OR_LINKPL, (u_int)-2, BPF_B, 0x01, 0x01);
4890                /* match the IPv4 version number */
4891                b1 = gen_mcmp(cstate, OR_LINKPL, 0, BPF_B, 0x40, 0xf0);
4892                gen_and(b0, b1);
4893                return b1;
4894
4895       case Q_IPV6:
4896                /* match the bottom-of-stack bit */
4897                b0 = gen_mcmp(cstate, OR_LINKPL, (u_int)-2, BPF_B, 0x01, 0x01);
4898                /* match the IPv4 version number */
4899                b1 = gen_mcmp(cstate, OR_LINKPL, 0, BPF_B, 0x60, 0xf0);
4900                gen_and(b0, b1);
4901                return b1;
4902
4903       default:
4904                abort();
4905        }
4906}
4907
4908static struct block *
4909gen_host(compiler_state_t *cstate, bpf_u_int32 addr, bpf_u_int32 mask,
4910    int proto, int dir, int type)
4911{
4912	struct block *b0, *b1;
4913	const char *typestr;
4914
4915	if (type == Q_NET)
4916		typestr = "net";
4917	else
4918		typestr = "host";
4919
4920	switch (proto) {
4921
4922	case Q_DEFAULT:
4923		b0 = gen_host(cstate, addr, mask, Q_IP, dir, type);
4924		/*
4925		 * Only check for non-IPv4 addresses if we're not
4926		 * checking MPLS-encapsulated packets.
4927		 */
4928		if (cstate->label_stack_depth == 0) {
4929			b1 = gen_host(cstate, addr, mask, Q_ARP, dir, type);
4930			gen_or(b0, b1);
4931			b0 = gen_host(cstate, addr, mask, Q_RARP, dir, type);
4932			gen_or(b1, b0);
4933		}
4934		return b0;
4935
4936	case Q_LINK:
4937		bpf_error(cstate, "link-layer modifier applied to %s", typestr);
4938
4939	case Q_IP:
4940		return gen_hostop(cstate, addr, mask, dir, ETHERTYPE_IP, 12, 16);
4941
4942	case Q_RARP:
4943		return gen_hostop(cstate, addr, mask, dir, ETHERTYPE_REVARP, 14, 24);
4944
4945	case Q_ARP:
4946		return gen_hostop(cstate, addr, mask, dir, ETHERTYPE_ARP, 14, 24);
4947
4948	case Q_SCTP:
4949		bpf_error(cstate, "'sctp' modifier applied to %s", typestr);
4950
4951	case Q_TCP:
4952		bpf_error(cstate, "'tcp' modifier applied to %s", typestr);
4953
4954	case Q_UDP:
4955		bpf_error(cstate, "'udp' modifier applied to %s", typestr);
4956
4957	case Q_ICMP:
4958		bpf_error(cstate, "'icmp' modifier applied to %s", typestr);
4959
4960	case Q_IGMP:
4961		bpf_error(cstate, "'igmp' modifier applied to %s", typestr);
4962
4963	case Q_IGRP:
4964		bpf_error(cstate, "'igrp' modifier applied to %s", typestr);
4965
4966	case Q_ATALK:
4967		bpf_error(cstate, "AppleTalk host filtering not implemented");
4968
4969	case Q_DECNET:
4970		return gen_dnhostop(cstate, addr, dir);
4971
4972	case Q_LAT:
4973		bpf_error(cstate, "LAT host filtering not implemented");
4974
4975	case Q_SCA:
4976		bpf_error(cstate, "SCA host filtering not implemented");
4977
4978	case Q_MOPRC:
4979		bpf_error(cstate, "MOPRC host filtering not implemented");
4980
4981	case Q_MOPDL:
4982		bpf_error(cstate, "MOPDL host filtering not implemented");
4983
4984	case Q_IPV6:
4985		bpf_error(cstate, "'ip6' modifier applied to ip host");
4986
4987	case Q_ICMPV6:
4988		bpf_error(cstate, "'icmp6' modifier applied to %s", typestr);
4989
4990	case Q_AH:
4991		bpf_error(cstate, "'ah' modifier applied to %s", typestr);
4992
4993	case Q_ESP:
4994		bpf_error(cstate, "'esp' modifier applied to %s", typestr);
4995
4996	case Q_PIM:
4997		bpf_error(cstate, "'pim' modifier applied to %s", typestr);
4998
4999	case Q_VRRP:
5000		bpf_error(cstate, "'vrrp' modifier applied to %s", typestr);
5001
5002	case Q_AARP:
5003		bpf_error(cstate, "AARP host filtering not implemented");
5004
5005	case Q_ISO:
5006		bpf_error(cstate, "ISO host filtering not implemented");
5007
5008	case Q_ESIS:
5009		bpf_error(cstate, "'esis' modifier applied to %s", typestr);
5010
5011	case Q_ISIS:
5012		bpf_error(cstate, "'isis' modifier applied to %s", typestr);
5013
5014	case Q_CLNP:
5015		bpf_error(cstate, "'clnp' modifier applied to %s", typestr);
5016
5017	case Q_STP:
5018		bpf_error(cstate, "'stp' modifier applied to %s", typestr);
5019
5020	case Q_IPX:
5021		bpf_error(cstate, "IPX host filtering not implemented");
5022
5023	case Q_NETBEUI:
5024		bpf_error(cstate, "'netbeui' modifier applied to %s", typestr);
5025
5026	case Q_ISIS_L1:
5027		bpf_error(cstate, "'l1' modifier applied to %s", typestr);
5028
5029	case Q_ISIS_L2:
5030		bpf_error(cstate, "'l2' modifier applied to %s", typestr);
5031
5032	case Q_ISIS_IIH:
5033		bpf_error(cstate, "'iih' modifier applied to %s", typestr);
5034
5035	case Q_ISIS_SNP:
5036		bpf_error(cstate, "'snp' modifier applied to %s", typestr);
5037
5038	case Q_ISIS_CSNP:
5039		bpf_error(cstate, "'csnp' modifier applied to %s", typestr);
5040
5041	case Q_ISIS_PSNP:
5042		bpf_error(cstate, "'psnp' modifier applied to %s", typestr);
5043
5044	case Q_ISIS_LSP:
5045		bpf_error(cstate, "'lsp' modifier applied to %s", typestr);
5046
5047	case Q_RADIO:
5048		bpf_error(cstate, "'radio' modifier applied to %s", typestr);
5049
5050	case Q_CARP:
5051		bpf_error(cstate, "'carp' modifier applied to %s", typestr);
5052
5053	default:
5054		abort();
5055	}
5056	/*NOTREACHED*/
5057}
5058
5059#ifdef INET6
5060static struct block *
5061gen_host6(compiler_state_t *cstate, struct in6_addr *addr,
5062    struct in6_addr *mask, int proto, int dir, int type)
5063{
5064	const char *typestr;
5065
5066	if (type == Q_NET)
5067		typestr = "net";
5068	else
5069		typestr = "host";
5070
5071	switch (proto) {
5072
5073	case Q_DEFAULT:
5074		return gen_host6(cstate, addr, mask, Q_IPV6, dir, type);
5075
5076	case Q_LINK:
5077		bpf_error(cstate, "link-layer modifier applied to ip6 %s", typestr);
5078
5079	case Q_IP:
5080		bpf_error(cstate, "'ip' modifier applied to ip6 %s", typestr);
5081
5082	case Q_RARP:
5083		bpf_error(cstate, "'rarp' modifier applied to ip6 %s", typestr);
5084
5085	case Q_ARP:
5086		bpf_error(cstate, "'arp' modifier applied to ip6 %s", typestr);
5087
5088	case Q_SCTP:
5089		bpf_error(cstate, "'sctp' modifier applied to ip6 %s", typestr);
5090
5091	case Q_TCP:
5092		bpf_error(cstate, "'tcp' modifier applied to ip6 %s", typestr);
5093
5094	case Q_UDP:
5095		bpf_error(cstate, "'udp' modifier applied to ip6 %s", typestr);
5096
5097	case Q_ICMP:
5098		bpf_error(cstate, "'icmp' modifier applied to ip6 %s", typestr);
5099
5100	case Q_IGMP:
5101		bpf_error(cstate, "'igmp' modifier applied to ip6 %s", typestr);
5102
5103	case Q_IGRP:
5104		bpf_error(cstate, "'igrp' modifier applied to ip6 %s", typestr);
5105
5106	case Q_ATALK:
5107		bpf_error(cstate, "AppleTalk modifier applied to ip6 %s", typestr);
5108
5109	case Q_DECNET:
5110		bpf_error(cstate, "'decnet' modifier applied to ip6 %s", typestr);
5111
5112	case Q_LAT:
5113		bpf_error(cstate, "'lat' modifier applied to ip6 %s", typestr);
5114
5115	case Q_SCA:
5116		bpf_error(cstate, "'sca' modifier applied to ip6 %s", typestr);
5117
5118	case Q_MOPRC:
5119		bpf_error(cstate, "'moprc' modifier applied to ip6 %s", typestr);
5120
5121	case Q_MOPDL:
5122		bpf_error(cstate, "'mopdl' modifier applied to ip6 %s", typestr);
5123
5124	case Q_IPV6:
5125		return gen_hostop6(cstate, addr, mask, dir, ETHERTYPE_IPV6, 8, 24);
5126
5127	case Q_ICMPV6:
5128		bpf_error(cstate, "'icmp6' modifier applied to ip6 %s", typestr);
5129
5130	case Q_AH:
5131		bpf_error(cstate, "'ah' modifier applied to ip6 %s", typestr);
5132
5133	case Q_ESP:
5134		bpf_error(cstate, "'esp' modifier applied to ip6 %s", typestr);
5135
5136	case Q_PIM:
5137		bpf_error(cstate, "'pim' modifier applied to ip6 %s", typestr);
5138
5139	case Q_VRRP:
5140		bpf_error(cstate, "'vrrp' modifier applied to ip6 %s", typestr);
5141
5142	case Q_AARP:
5143		bpf_error(cstate, "'aarp' modifier applied to ip6 %s", typestr);
5144
5145	case Q_ISO:
5146		bpf_error(cstate, "'iso' modifier applied to ip6 %s", typestr);
5147
5148	case Q_ESIS:
5149		bpf_error(cstate, "'esis' modifier applied to ip6 %s", typestr);
5150
5151	case Q_ISIS:
5152		bpf_error(cstate, "'isis' modifier applied to ip6 %s", typestr);
5153
5154	case Q_CLNP:
5155		bpf_error(cstate, "'clnp' modifier applied to ip6 %s", typestr);
5156
5157	case Q_STP:
5158		bpf_error(cstate, "'stp' modifier applied to ip6 %s", typestr);
5159
5160	case Q_IPX:
5161		bpf_error(cstate, "'ipx' modifier applied to ip6 %s", typestr);
5162
5163	case Q_NETBEUI:
5164		bpf_error(cstate, "'netbeui' modifier applied to ip6 %s", typestr);
5165
5166	case Q_ISIS_L1:
5167		bpf_error(cstate, "'l1' modifier applied to ip6 %s", typestr);
5168
5169	case Q_ISIS_L2:
5170		bpf_error(cstate, "'l2' modifier applied to ip6 %s", typestr);
5171
5172	case Q_ISIS_IIH:
5173		bpf_error(cstate, "'iih' modifier applied to ip6 %s", typestr);
5174
5175	case Q_ISIS_SNP:
5176		bpf_error(cstate, "'snp' modifier applied to ip6 %s", typestr);
5177
5178	case Q_ISIS_CSNP:
5179		bpf_error(cstate, "'csnp' modifier applied to ip6 %s", typestr);
5180
5181	case Q_ISIS_PSNP:
5182		bpf_error(cstate, "'psnp' modifier applied to ip6 %s", typestr);
5183
5184	case Q_ISIS_LSP:
5185		bpf_error(cstate, "'lsp' modifier applied to ip6 %s", typestr);
5186
5187	case Q_RADIO:
5188		bpf_error(cstate, "'radio' modifier applied to ip6 %s", typestr);
5189
5190	case Q_CARP:
5191		bpf_error(cstate, "'carp' modifier applied to ip6 %s", typestr);
5192
5193	default:
5194		abort();
5195	}
5196	/*NOTREACHED*/
5197}
5198#endif
5199
5200#ifndef INET6
5201static struct block *
5202gen_gateway(compiler_state_t *cstate, const u_char *eaddr,
5203    struct addrinfo *alist, int proto, int dir)
5204{
5205	struct block *b0, *b1, *tmp;
5206	struct addrinfo *ai;
5207	struct sockaddr_in *sin;
5208
5209	if (dir != 0)
5210		bpf_error(cstate, "direction applied to 'gateway'");
5211
5212	switch (proto) {
5213	case Q_DEFAULT:
5214	case Q_IP:
5215	case Q_ARP:
5216	case Q_RARP:
5217		switch (cstate->linktype) {
5218		case DLT_EN10MB:
5219		case DLT_NETANALYZER:
5220		case DLT_NETANALYZER_TRANSPARENT:
5221			b1 = gen_prevlinkhdr_check(cstate);
5222			b0 = gen_ehostop(cstate, eaddr, Q_OR);
5223			if (b1 != NULL)
5224				gen_and(b1, b0);
5225			break;
5226		case DLT_FDDI:
5227			b0 = gen_fhostop(cstate, eaddr, Q_OR);
5228			break;
5229		case DLT_IEEE802:
5230			b0 = gen_thostop(cstate, eaddr, Q_OR);
5231			break;
5232		case DLT_IEEE802_11:
5233		case DLT_PRISM_HEADER:
5234		case DLT_IEEE802_11_RADIO_AVS:
5235		case DLT_IEEE802_11_RADIO:
5236		case DLT_PPI:
5237			b0 = gen_wlanhostop(cstate, eaddr, Q_OR);
5238			break;
5239		case DLT_SUNATM:
5240			/*
5241			 * This is LLC-multiplexed traffic; if it were
5242			 * LANE, cstate->linktype would have been set to
5243			 * DLT_EN10MB.
5244			 */
5245			bpf_error(cstate,
5246			    "'gateway' supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
5247			break;
5248		case DLT_IP_OVER_FC:
5249			b0 = gen_ipfchostop(cstate, eaddr, Q_OR);
5250			break;
5251		default:
5252			bpf_error(cstate,
5253			    "'gateway' supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
5254		}
5255		b1 = NULL;
5256		for (ai = alist; ai != NULL; ai = ai->ai_next) {
5257			/*
5258			 * Does it have an address?
5259			 */
5260			if (ai->ai_addr != NULL) {
5261				/*
5262				 * Yes.  Is it an IPv4 address?
5263				 */
5264				if (ai->ai_addr->sa_family == AF_INET) {
5265					/*
5266					 * Generate an entry for it.
5267					 */
5268					sin = (struct sockaddr_in *)ai->ai_addr;
5269					tmp = gen_host(cstate,
5270					    ntohl(sin->sin_addr.s_addr),
5271					    0xffffffff, proto, Q_OR, Q_HOST);
5272					/*
5273					 * Is it the *first* IPv4 address?
5274					 */
5275					if (b1 == NULL) {
5276						/*
5277						 * Yes, so start with it.
5278						 */
5279						b1 = tmp;
5280					} else {
5281						/*
5282						 * No, so OR it into the
5283						 * existing set of
5284						 * addresses.
5285						 */
5286						gen_or(b1, tmp);
5287						b1 = tmp;
5288					}
5289				}
5290			}
5291		}
5292		if (b1 == NULL) {
5293			/*
5294			 * No IPv4 addresses found.
5295			 */
5296			return (NULL);
5297		}
5298		gen_not(b1);
5299		gen_and(b0, b1);
5300		return b1;
5301	}
5302	bpf_error(cstate, "illegal modifier of 'gateway'");
5303	/*NOTREACHED*/
5304}
5305#endif
5306
5307static struct block *
5308gen_proto_abbrev_internal(compiler_state_t *cstate, int proto)
5309{
5310	struct block *b0;
5311	struct block *b1;
5312
5313	switch (proto) {
5314
5315	case Q_SCTP:
5316		b1 = gen_proto(cstate, IPPROTO_SCTP, Q_IP, Q_DEFAULT);
5317		b0 = gen_proto(cstate, IPPROTO_SCTP, Q_IPV6, Q_DEFAULT);
5318		gen_or(b0, b1);
5319		break;
5320
5321	case Q_TCP:
5322		b1 = gen_proto(cstate, IPPROTO_TCP, Q_IP, Q_DEFAULT);
5323		b0 = gen_proto(cstate, IPPROTO_TCP, Q_IPV6, Q_DEFAULT);
5324		gen_or(b0, b1);
5325		break;
5326
5327	case Q_UDP:
5328		b1 = gen_proto(cstate, IPPROTO_UDP, Q_IP, Q_DEFAULT);
5329		b0 = gen_proto(cstate, IPPROTO_UDP, Q_IPV6, Q_DEFAULT);
5330		gen_or(b0, b1);
5331		break;
5332
5333	case Q_ICMP:
5334		b1 = gen_proto(cstate, IPPROTO_ICMP, Q_IP, Q_DEFAULT);
5335		break;
5336
5337#ifndef	IPPROTO_IGMP
5338#define	IPPROTO_IGMP	2
5339#endif
5340
5341	case Q_IGMP:
5342		b1 = gen_proto(cstate, IPPROTO_IGMP, Q_IP, Q_DEFAULT);
5343		break;
5344
5345#ifndef	IPPROTO_IGRP
5346#define	IPPROTO_IGRP	9
5347#endif
5348	case Q_IGRP:
5349		b1 = gen_proto(cstate, IPPROTO_IGRP, Q_IP, Q_DEFAULT);
5350		break;
5351
5352#ifndef IPPROTO_PIM
5353#define IPPROTO_PIM	103
5354#endif
5355
5356	case Q_PIM:
5357		b1 = gen_proto(cstate, IPPROTO_PIM, Q_IP, Q_DEFAULT);
5358		b0 = gen_proto(cstate, IPPROTO_PIM, Q_IPV6, Q_DEFAULT);
5359		gen_or(b0, b1);
5360		break;
5361
5362#ifndef IPPROTO_VRRP
5363#define IPPROTO_VRRP	112
5364#endif
5365
5366	case Q_VRRP:
5367		b1 = gen_proto(cstate, IPPROTO_VRRP, Q_IP, Q_DEFAULT);
5368		break;
5369
5370#ifndef IPPROTO_CARP
5371#define IPPROTO_CARP	112
5372#endif
5373
5374	case Q_CARP:
5375		b1 = gen_proto(cstate, IPPROTO_CARP, Q_IP, Q_DEFAULT);
5376		break;
5377
5378	case Q_IP:
5379		b1 = gen_linktype(cstate, ETHERTYPE_IP);
5380		break;
5381
5382	case Q_ARP:
5383		b1 = gen_linktype(cstate, ETHERTYPE_ARP);
5384		break;
5385
5386	case Q_RARP:
5387		b1 = gen_linktype(cstate, ETHERTYPE_REVARP);
5388		break;
5389
5390	case Q_LINK:
5391		bpf_error(cstate, "link layer applied in wrong context");
5392
5393	case Q_ATALK:
5394		b1 = gen_linktype(cstate, ETHERTYPE_ATALK);
5395		break;
5396
5397	case Q_AARP:
5398		b1 = gen_linktype(cstate, ETHERTYPE_AARP);
5399		break;
5400
5401	case Q_DECNET:
5402		b1 = gen_linktype(cstate, ETHERTYPE_DN);
5403		break;
5404
5405	case Q_SCA:
5406		b1 = gen_linktype(cstate, ETHERTYPE_SCA);
5407		break;
5408
5409	case Q_LAT:
5410		b1 = gen_linktype(cstate, ETHERTYPE_LAT);
5411		break;
5412
5413	case Q_MOPDL:
5414		b1 = gen_linktype(cstate, ETHERTYPE_MOPDL);
5415		break;
5416
5417	case Q_MOPRC:
5418		b1 = gen_linktype(cstate, ETHERTYPE_MOPRC);
5419		break;
5420
5421	case Q_IPV6:
5422		b1 = gen_linktype(cstate, ETHERTYPE_IPV6);
5423		break;
5424
5425#ifndef IPPROTO_ICMPV6
5426#define IPPROTO_ICMPV6	58
5427#endif
5428	case Q_ICMPV6:
5429		b1 = gen_proto(cstate, IPPROTO_ICMPV6, Q_IPV6, Q_DEFAULT);
5430		break;
5431
5432#ifndef IPPROTO_AH
5433#define IPPROTO_AH	51
5434#endif
5435	case Q_AH:
5436		b1 = gen_proto(cstate, IPPROTO_AH, Q_IP, Q_DEFAULT);
5437		b0 = gen_proto(cstate, IPPROTO_AH, Q_IPV6, Q_DEFAULT);
5438		gen_or(b0, b1);
5439		break;
5440
5441#ifndef IPPROTO_ESP
5442#define IPPROTO_ESP	50
5443#endif
5444	case Q_ESP:
5445		b1 = gen_proto(cstate, IPPROTO_ESP, Q_IP, Q_DEFAULT);
5446		b0 = gen_proto(cstate, IPPROTO_ESP, Q_IPV6, Q_DEFAULT);
5447		gen_or(b0, b1);
5448		break;
5449
5450	case Q_ISO:
5451		b1 = gen_linktype(cstate, LLCSAP_ISONS);
5452		break;
5453
5454	case Q_ESIS:
5455		b1 = gen_proto(cstate, ISO9542_ESIS, Q_ISO, Q_DEFAULT);
5456		break;
5457
5458	case Q_ISIS:
5459		b1 = gen_proto(cstate, ISO10589_ISIS, Q_ISO, Q_DEFAULT);
5460		break;
5461
5462	case Q_ISIS_L1: /* all IS-IS Level1 PDU-Types */
5463		b0 = gen_proto(cstate, ISIS_L1_LAN_IIH, Q_ISIS, Q_DEFAULT);
5464		b1 = gen_proto(cstate, ISIS_PTP_IIH, Q_ISIS, Q_DEFAULT); /* FIXME extract the circuit-type bits */
5465		gen_or(b0, b1);
5466		b0 = gen_proto(cstate, ISIS_L1_LSP, Q_ISIS, Q_DEFAULT);
5467		gen_or(b0, b1);
5468		b0 = gen_proto(cstate, ISIS_L1_CSNP, Q_ISIS, Q_DEFAULT);
5469		gen_or(b0, b1);
5470		b0 = gen_proto(cstate, ISIS_L1_PSNP, Q_ISIS, Q_DEFAULT);
5471		gen_or(b0, b1);
5472		break;
5473
5474	case Q_ISIS_L2: /* all IS-IS Level2 PDU-Types */
5475		b0 = gen_proto(cstate, ISIS_L2_LAN_IIH, Q_ISIS, Q_DEFAULT);
5476		b1 = gen_proto(cstate, ISIS_PTP_IIH, Q_ISIS, Q_DEFAULT); /* FIXME extract the circuit-type bits */
5477		gen_or(b0, b1);
5478		b0 = gen_proto(cstate, ISIS_L2_LSP, Q_ISIS, Q_DEFAULT);
5479		gen_or(b0, b1);
5480		b0 = gen_proto(cstate, ISIS_L2_CSNP, Q_ISIS, Q_DEFAULT);
5481		gen_or(b0, b1);
5482		b0 = gen_proto(cstate, ISIS_L2_PSNP, Q_ISIS, Q_DEFAULT);
5483		gen_or(b0, b1);
5484		break;
5485
5486	case Q_ISIS_IIH: /* all IS-IS Hello PDU-Types */
5487		b0 = gen_proto(cstate, ISIS_L1_LAN_IIH, Q_ISIS, Q_DEFAULT);
5488		b1 = gen_proto(cstate, ISIS_L2_LAN_IIH, Q_ISIS, Q_DEFAULT);
5489		gen_or(b0, b1);
5490		b0 = gen_proto(cstate, ISIS_PTP_IIH, Q_ISIS, Q_DEFAULT);
5491		gen_or(b0, b1);
5492		break;
5493
5494	case Q_ISIS_LSP:
5495		b0 = gen_proto(cstate, ISIS_L1_LSP, Q_ISIS, Q_DEFAULT);
5496		b1 = gen_proto(cstate, ISIS_L2_LSP, Q_ISIS, Q_DEFAULT);
5497		gen_or(b0, b1);
5498		break;
5499
5500	case Q_ISIS_SNP:
5501		b0 = gen_proto(cstate, ISIS_L1_CSNP, Q_ISIS, Q_DEFAULT);
5502		b1 = gen_proto(cstate, ISIS_L2_CSNP, Q_ISIS, Q_DEFAULT);
5503		gen_or(b0, b1);
5504		b0 = gen_proto(cstate, ISIS_L1_PSNP, Q_ISIS, Q_DEFAULT);
5505		gen_or(b0, b1);
5506		b0 = gen_proto(cstate, ISIS_L2_PSNP, Q_ISIS, Q_DEFAULT);
5507		gen_or(b0, b1);
5508		break;
5509
5510	case Q_ISIS_CSNP:
5511		b0 = gen_proto(cstate, ISIS_L1_CSNP, Q_ISIS, Q_DEFAULT);
5512		b1 = gen_proto(cstate, ISIS_L2_CSNP, Q_ISIS, Q_DEFAULT);
5513		gen_or(b0, b1);
5514		break;
5515
5516	case Q_ISIS_PSNP:
5517		b0 = gen_proto(cstate, ISIS_L1_PSNP, Q_ISIS, Q_DEFAULT);
5518		b1 = gen_proto(cstate, ISIS_L2_PSNP, Q_ISIS, Q_DEFAULT);
5519		gen_or(b0, b1);
5520		break;
5521
5522	case Q_CLNP:
5523		b1 = gen_proto(cstate, ISO8473_CLNP, Q_ISO, Q_DEFAULT);
5524		break;
5525
5526	case Q_STP:
5527		b1 = gen_linktype(cstate, LLCSAP_8021D);
5528		break;
5529
5530	case Q_IPX:
5531		b1 = gen_linktype(cstate, LLCSAP_IPX);
5532		break;
5533
5534	case Q_NETBEUI:
5535		b1 = gen_linktype(cstate, LLCSAP_NETBEUI);
5536		break;
5537
5538	case Q_RADIO:
5539		bpf_error(cstate, "'radio' is not a valid protocol type");
5540
5541	default:
5542		abort();
5543	}
5544	return b1;
5545}
5546
5547struct block *
5548gen_proto_abbrev(compiler_state_t *cstate, int proto)
5549{
5550	/*
5551	 * Catch errors reported by us and routines below us, and return NULL
5552	 * on an error.
5553	 */
5554	if (setjmp(cstate->top_ctx))
5555		return (NULL);
5556
5557	return gen_proto_abbrev_internal(cstate, proto);
5558}
5559
5560static struct block *
5561gen_ipfrag(compiler_state_t *cstate)
5562{
5563	struct slist *s;
5564	struct block *b;
5565
5566	/* not IPv4 frag other than the first frag */
5567	s = gen_load_a(cstate, OR_LINKPL, 6, BPF_H);
5568	b = new_block(cstate, JMP(BPF_JSET));
5569	b->s.k = 0x1fff;
5570	b->stmts = s;
5571	gen_not(b);
5572
5573	return b;
5574}
5575
5576/*
5577 * Generate a comparison to a port value in the transport-layer header
5578 * at the specified offset from the beginning of that header.
5579 *
5580 * XXX - this handles a variable-length prefix preceding the link-layer
5581 * header, such as the radiotap or AVS radio prefix, but doesn't handle
5582 * variable-length link-layer headers (such as Token Ring or 802.11
5583 * headers).
5584 */
5585static struct block *
5586gen_portatom(compiler_state_t *cstate, int off, bpf_int32 v)
5587{
5588	return gen_cmp(cstate, OR_TRAN_IPV4, off, BPF_H, v);
5589}
5590
5591static struct block *
5592gen_portatom6(compiler_state_t *cstate, int off, bpf_int32 v)
5593{
5594	return gen_cmp(cstate, OR_TRAN_IPV6, off, BPF_H, v);
5595}
5596
5597struct block *
5598gen_portop(compiler_state_t *cstate, int port, int proto, int dir)
5599{
5600	struct block *b0, *b1, *tmp;
5601
5602	/* ip proto 'proto' and not a fragment other than the first fragment */
5603	tmp = gen_cmp(cstate, OR_LINKPL, 9, BPF_B, (bpf_int32)proto);
5604	b0 = gen_ipfrag(cstate);
5605	gen_and(tmp, b0);
5606
5607	switch (dir) {
5608	case Q_SRC:
5609		b1 = gen_portatom(cstate, 0, (bpf_int32)port);
5610		break;
5611
5612	case Q_DST:
5613		b1 = gen_portatom(cstate, 2, (bpf_int32)port);
5614		break;
5615
5616	case Q_AND:
5617		tmp = gen_portatom(cstate, 0, (bpf_int32)port);
5618		b1 = gen_portatom(cstate, 2, (bpf_int32)port);
5619		gen_and(tmp, b1);
5620		break;
5621
5622	case Q_DEFAULT:
5623	case Q_OR:
5624		tmp = gen_portatom(cstate, 0, (bpf_int32)port);
5625		b1 = gen_portatom(cstate, 2, (bpf_int32)port);
5626		gen_or(tmp, b1);
5627		break;
5628
5629	case Q_ADDR1:
5630		bpf_error(cstate, "'addr1' and 'address1' are not valid qualifiers for ports");
5631		/*NOTREACHED*/
5632
5633	case Q_ADDR2:
5634		bpf_error(cstate, "'addr2' and 'address2' are not valid qualifiers for ports");
5635		/*NOTREACHED*/
5636
5637	case Q_ADDR3:
5638		bpf_error(cstate, "'addr3' and 'address3' are not valid qualifiers for ports");
5639		/*NOTREACHED*/
5640
5641	case Q_ADDR4:
5642		bpf_error(cstate, "'addr4' and 'address4' are not valid qualifiers for ports");
5643		/*NOTREACHED*/
5644
5645	case Q_RA:
5646		bpf_error(cstate, "'ra' is not a valid qualifier for ports");
5647		/*NOTREACHED*/
5648
5649	case Q_TA:
5650		bpf_error(cstate, "'ta' is not a valid qualifier for ports");
5651		/*NOTREACHED*/
5652
5653	default:
5654		abort();
5655		/*NOTREACHED*/
5656	}
5657	gen_and(b0, b1);
5658
5659	return b1;
5660}
5661
5662static struct block *
5663gen_port(compiler_state_t *cstate, int port, int ip_proto, int dir)
5664{
5665	struct block *b0, *b1, *tmp;
5666
5667	/*
5668	 * ether proto ip
5669	 *
5670	 * For FDDI, RFC 1188 says that SNAP encapsulation is used,
5671	 * not LLC encapsulation with LLCSAP_IP.
5672	 *
5673	 * For IEEE 802 networks - which includes 802.5 token ring
5674	 * (which is what DLT_IEEE802 means) and 802.11 - RFC 1042
5675	 * says that SNAP encapsulation is used, not LLC encapsulation
5676	 * with LLCSAP_IP.
5677	 *
5678	 * For LLC-encapsulated ATM/"Classical IP", RFC 1483 and
5679	 * RFC 2225 say that SNAP encapsulation is used, not LLC
5680	 * encapsulation with LLCSAP_IP.
5681	 *
5682	 * So we always check for ETHERTYPE_IP.
5683	 */
5684	b0 = gen_linktype(cstate, ETHERTYPE_IP);
5685
5686	switch (ip_proto) {
5687	case IPPROTO_UDP:
5688	case IPPROTO_TCP:
5689	case IPPROTO_SCTP:
5690		b1 = gen_portop(cstate, port, ip_proto, dir);
5691		break;
5692
5693	case PROTO_UNDEF:
5694		tmp = gen_portop(cstate, port, IPPROTO_TCP, dir);
5695		b1 = gen_portop(cstate, port, IPPROTO_UDP, dir);
5696		gen_or(tmp, b1);
5697		tmp = gen_portop(cstate, port, IPPROTO_SCTP, dir);
5698		gen_or(tmp, b1);
5699		break;
5700
5701	default:
5702		abort();
5703	}
5704	gen_and(b0, b1);
5705	return b1;
5706}
5707
5708struct block *
5709gen_portop6(compiler_state_t *cstate, int port, int proto, int dir)
5710{
5711	struct block *b0, *b1, *tmp;
5712
5713	/* ip6 proto 'proto' */
5714	/* XXX - catch the first fragment of a fragmented packet? */
5715	b0 = gen_cmp(cstate, OR_LINKPL, 6, BPF_B, (bpf_int32)proto);
5716
5717	switch (dir) {
5718	case Q_SRC:
5719		b1 = gen_portatom6(cstate, 0, (bpf_int32)port);
5720		break;
5721
5722	case Q_DST:
5723		b1 = gen_portatom6(cstate, 2, (bpf_int32)port);
5724		break;
5725
5726	case Q_AND:
5727		tmp = gen_portatom6(cstate, 0, (bpf_int32)port);
5728		b1 = gen_portatom6(cstate, 2, (bpf_int32)port);
5729		gen_and(tmp, b1);
5730		break;
5731
5732	case Q_DEFAULT:
5733	case Q_OR:
5734		tmp = gen_portatom6(cstate, 0, (bpf_int32)port);
5735		b1 = gen_portatom6(cstate, 2, (bpf_int32)port);
5736		gen_or(tmp, b1);
5737		break;
5738
5739	default:
5740		abort();
5741	}
5742	gen_and(b0, b1);
5743
5744	return b1;
5745}
5746
5747static struct block *
5748gen_port6(compiler_state_t *cstate, int port, int ip_proto, int dir)
5749{
5750	struct block *b0, *b1, *tmp;
5751
5752	/* link proto ip6 */
5753	b0 = gen_linktype(cstate, ETHERTYPE_IPV6);
5754
5755	switch (ip_proto) {
5756	case IPPROTO_UDP:
5757	case IPPROTO_TCP:
5758	case IPPROTO_SCTP:
5759		b1 = gen_portop6(cstate, port, ip_proto, dir);
5760		break;
5761
5762	case PROTO_UNDEF:
5763		tmp = gen_portop6(cstate, port, IPPROTO_TCP, dir);
5764		b1 = gen_portop6(cstate, port, IPPROTO_UDP, dir);
5765		gen_or(tmp, b1);
5766		tmp = gen_portop6(cstate, port, IPPROTO_SCTP, dir);
5767		gen_or(tmp, b1);
5768		break;
5769
5770	default:
5771		abort();
5772	}
5773	gen_and(b0, b1);
5774	return b1;
5775}
5776
5777/* gen_portrange code */
5778static struct block *
5779gen_portrangeatom(compiler_state_t *cstate, int off, bpf_int32 v1,
5780    bpf_int32 v2)
5781{
5782	struct block *b1, *b2;
5783
5784	if (v1 > v2) {
5785		/*
5786		 * Reverse the order of the ports, so v1 is the lower one.
5787		 */
5788		bpf_int32 vtemp;
5789
5790		vtemp = v1;
5791		v1 = v2;
5792		v2 = vtemp;
5793	}
5794
5795	b1 = gen_cmp_ge(cstate, OR_TRAN_IPV4, off, BPF_H, v1);
5796	b2 = gen_cmp_le(cstate, OR_TRAN_IPV4, off, BPF_H, v2);
5797
5798	gen_and(b1, b2);
5799
5800	return b2;
5801}
5802
5803struct block *
5804gen_portrangeop(compiler_state_t *cstate, int port1, int port2, int proto,
5805    int dir)
5806{
5807	struct block *b0, *b1, *tmp;
5808
5809	/* ip proto 'proto' and not a fragment other than the first fragment */
5810	tmp = gen_cmp(cstate, OR_LINKPL, 9, BPF_B, (bpf_int32)proto);
5811	b0 = gen_ipfrag(cstate);
5812	gen_and(tmp, b0);
5813
5814	switch (dir) {
5815	case Q_SRC:
5816		b1 = gen_portrangeatom(cstate, 0, (bpf_int32)port1, (bpf_int32)port2);
5817		break;
5818
5819	case Q_DST:
5820		b1 = gen_portrangeatom(cstate, 2, (bpf_int32)port1, (bpf_int32)port2);
5821		break;
5822
5823	case Q_AND:
5824		tmp = gen_portrangeatom(cstate, 0, (bpf_int32)port1, (bpf_int32)port2);
5825		b1 = gen_portrangeatom(cstate, 2, (bpf_int32)port1, (bpf_int32)port2);
5826		gen_and(tmp, b1);
5827		break;
5828
5829	case Q_DEFAULT:
5830	case Q_OR:
5831		tmp = gen_portrangeatom(cstate, 0, (bpf_int32)port1, (bpf_int32)port2);
5832		b1 = gen_portrangeatom(cstate, 2, (bpf_int32)port1, (bpf_int32)port2);
5833		gen_or(tmp, b1);
5834		break;
5835
5836	case Q_ADDR1:
5837		bpf_error(cstate, "'addr1' and 'address1' are not valid qualifiers for port ranges");
5838		/*NOTREACHED*/
5839
5840	case Q_ADDR2:
5841		bpf_error(cstate, "'addr2' and 'address2' are not valid qualifiers for port ranges");
5842		/*NOTREACHED*/
5843
5844	case Q_ADDR3:
5845		bpf_error(cstate, "'addr3' and 'address3' are not valid qualifiers for port ranges");
5846		/*NOTREACHED*/
5847
5848	case Q_ADDR4:
5849		bpf_error(cstate, "'addr4' and 'address4' are not valid qualifiers for port ranges");
5850		/*NOTREACHED*/
5851
5852	case Q_RA:
5853		bpf_error(cstate, "'ra' is not a valid qualifier for port ranges");
5854		/*NOTREACHED*/
5855
5856	case Q_TA:
5857		bpf_error(cstate, "'ta' is not a valid qualifier for port ranges");
5858		/*NOTREACHED*/
5859
5860	default:
5861		abort();
5862		/*NOTREACHED*/
5863	}
5864	gen_and(b0, b1);
5865
5866	return b1;
5867}
5868
5869static struct block *
5870gen_portrange(compiler_state_t *cstate, int port1, int port2, int ip_proto,
5871    int dir)
5872{
5873	struct block *b0, *b1, *tmp;
5874
5875	/* link proto ip */
5876	b0 = gen_linktype(cstate, ETHERTYPE_IP);
5877
5878	switch (ip_proto) {
5879	case IPPROTO_UDP:
5880	case IPPROTO_TCP:
5881	case IPPROTO_SCTP:
5882		b1 = gen_portrangeop(cstate, port1, port2, ip_proto, dir);
5883		break;
5884
5885	case PROTO_UNDEF:
5886		tmp = gen_portrangeop(cstate, port1, port2, IPPROTO_TCP, dir);
5887		b1 = gen_portrangeop(cstate, port1, port2, IPPROTO_UDP, dir);
5888		gen_or(tmp, b1);
5889		tmp = gen_portrangeop(cstate, port1, port2, IPPROTO_SCTP, dir);
5890		gen_or(tmp, b1);
5891		break;
5892
5893	default:
5894		abort();
5895	}
5896	gen_and(b0, b1);
5897	return b1;
5898}
5899
5900static struct block *
5901gen_portrangeatom6(compiler_state_t *cstate, int off, bpf_int32 v1,
5902    bpf_int32 v2)
5903{
5904	struct block *b1, *b2;
5905
5906	if (v1 > v2) {
5907		/*
5908		 * Reverse the order of the ports, so v1 is the lower one.
5909		 */
5910		bpf_int32 vtemp;
5911
5912		vtemp = v1;
5913		v1 = v2;
5914		v2 = vtemp;
5915	}
5916
5917	b1 = gen_cmp_ge(cstate, OR_TRAN_IPV6, off, BPF_H, v1);
5918	b2 = gen_cmp_le(cstate, OR_TRAN_IPV6, off, BPF_H, v2);
5919
5920	gen_and(b1, b2);
5921
5922	return b2;
5923}
5924
5925struct block *
5926gen_portrangeop6(compiler_state_t *cstate, int port1, int port2, int proto,
5927    int dir)
5928{
5929	struct block *b0, *b1, *tmp;
5930
5931	/* ip6 proto 'proto' */
5932	/* XXX - catch the first fragment of a fragmented packet? */
5933	b0 = gen_cmp(cstate, OR_LINKPL, 6, BPF_B, (bpf_int32)proto);
5934
5935	switch (dir) {
5936	case Q_SRC:
5937		b1 = gen_portrangeatom6(cstate, 0, (bpf_int32)port1, (bpf_int32)port2);
5938		break;
5939
5940	case Q_DST:
5941		b1 = gen_portrangeatom6(cstate, 2, (bpf_int32)port1, (bpf_int32)port2);
5942		break;
5943
5944	case Q_AND:
5945		tmp = gen_portrangeatom6(cstate, 0, (bpf_int32)port1, (bpf_int32)port2);
5946		b1 = gen_portrangeatom6(cstate, 2, (bpf_int32)port1, (bpf_int32)port2);
5947		gen_and(tmp, b1);
5948		break;
5949
5950	case Q_DEFAULT:
5951	case Q_OR:
5952		tmp = gen_portrangeatom6(cstate, 0, (bpf_int32)port1, (bpf_int32)port2);
5953		b1 = gen_portrangeatom6(cstate, 2, (bpf_int32)port1, (bpf_int32)port2);
5954		gen_or(tmp, b1);
5955		break;
5956
5957	default:
5958		abort();
5959	}
5960	gen_and(b0, b1);
5961
5962	return b1;
5963}
5964
5965static struct block *
5966gen_portrange6(compiler_state_t *cstate, int port1, int port2, int ip_proto,
5967    int dir)
5968{
5969	struct block *b0, *b1, *tmp;
5970
5971	/* link proto ip6 */
5972	b0 = gen_linktype(cstate, ETHERTYPE_IPV6);
5973
5974	switch (ip_proto) {
5975	case IPPROTO_UDP:
5976	case IPPROTO_TCP:
5977	case IPPROTO_SCTP:
5978		b1 = gen_portrangeop6(cstate, port1, port2, ip_proto, dir);
5979		break;
5980
5981	case PROTO_UNDEF:
5982		tmp = gen_portrangeop6(cstate, port1, port2, IPPROTO_TCP, dir);
5983		b1 = gen_portrangeop6(cstate, port1, port2, IPPROTO_UDP, dir);
5984		gen_or(tmp, b1);
5985		tmp = gen_portrangeop6(cstate, port1, port2, IPPROTO_SCTP, dir);
5986		gen_or(tmp, b1);
5987		break;
5988
5989	default:
5990		abort();
5991	}
5992	gen_and(b0, b1);
5993	return b1;
5994}
5995
5996static int
5997lookup_proto(compiler_state_t *cstate, const char *name, int proto)
5998{
5999	register int v;
6000
6001	switch (proto) {
6002
6003	case Q_DEFAULT:
6004	case Q_IP:
6005	case Q_IPV6:
6006		v = pcap_nametoproto(name);
6007		if (v == PROTO_UNDEF)
6008			bpf_error(cstate, "unknown ip proto '%s'", name);
6009		break;
6010
6011	case Q_LINK:
6012		/* XXX should look up h/w protocol type based on cstate->linktype */
6013		v = pcap_nametoeproto(name);
6014		if (v == PROTO_UNDEF) {
6015			v = pcap_nametollc(name);
6016			if (v == PROTO_UNDEF)
6017				bpf_error(cstate, "unknown ether proto '%s'", name);
6018		}
6019		break;
6020
6021	case Q_ISO:
6022		if (strcmp(name, "esis") == 0)
6023			v = ISO9542_ESIS;
6024		else if (strcmp(name, "isis") == 0)
6025			v = ISO10589_ISIS;
6026		else if (strcmp(name, "clnp") == 0)
6027			v = ISO8473_CLNP;
6028		else
6029			bpf_error(cstate, "unknown osi proto '%s'", name);
6030		break;
6031
6032	default:
6033		v = PROTO_UNDEF;
6034		break;
6035	}
6036	return v;
6037}
6038
6039#if 0
6040struct stmt *
6041gen_joinsp(struct stmt **s, int n)
6042{
6043	return NULL;
6044}
6045#endif
6046
6047static struct block *
6048gen_protochain(compiler_state_t *cstate, int v, int proto, int dir)
6049{
6050#ifdef NO_PROTOCHAIN
6051	return gen_proto(cstate, v, proto, dir);
6052#else
6053	struct block *b0, *b;
6054	struct slist *s[100];
6055	int fix2, fix3, fix4, fix5;
6056	int ahcheck, again, end;
6057	int i, max;
6058	int reg2 = alloc_reg(cstate);
6059
6060	memset(s, 0, sizeof(s));
6061	fix3 = fix4 = fix5 = 0;
6062
6063	switch (proto) {
6064	case Q_IP:
6065	case Q_IPV6:
6066		break;
6067	case Q_DEFAULT:
6068		b0 = gen_protochain(cstate, v, Q_IP, dir);
6069		b = gen_protochain(cstate, v, Q_IPV6, dir);
6070		gen_or(b0, b);
6071		return b;
6072	default:
6073		bpf_error(cstate, "bad protocol applied for 'protochain'");
6074		/*NOTREACHED*/
6075	}
6076
6077	/*
6078	 * We don't handle variable-length prefixes before the link-layer
6079	 * header, or variable-length link-layer headers, here yet.
6080	 * We might want to add BPF instructions to do the protochain
6081	 * work, to simplify that and, on platforms that have a BPF
6082	 * interpreter with the new instructions, let the filtering
6083	 * be done in the kernel.  (We already require a modified BPF
6084	 * engine to do the protochain stuff, to support backward
6085	 * branches, and backward branch support is unlikely to appear
6086	 * in kernel BPF engines.)
6087	 */
6088	if (cstate->off_linkpl.is_variable)
6089		bpf_error(cstate, "'protochain' not supported with variable length headers");
6090
6091	cstate->no_optimize = 1; /* this code is not compatible with optimizer yet */
6092
6093	/*
6094	 * s[0] is a dummy entry to protect other BPF insn from damage
6095	 * by s[fix] = foo with uninitialized variable "fix".  It is somewhat
6096	 * hard to find interdependency made by jump table fixup.
6097	 */
6098	i = 0;
6099	s[i] = new_stmt(cstate, 0);	/*dummy*/
6100	i++;
6101
6102	switch (proto) {
6103	case Q_IP:
6104		b0 = gen_linktype(cstate, ETHERTYPE_IP);
6105
6106		/* A = ip->ip_p */
6107		s[i] = new_stmt(cstate, BPF_LD|BPF_ABS|BPF_B);
6108		s[i]->s.k = cstate->off_linkpl.constant_part + cstate->off_nl + 9;
6109		i++;
6110		/* X = ip->ip_hl << 2 */
6111		s[i] = new_stmt(cstate, BPF_LDX|BPF_MSH|BPF_B);
6112		s[i]->s.k = cstate->off_linkpl.constant_part + cstate->off_nl;
6113		i++;
6114		break;
6115
6116	case Q_IPV6:
6117		b0 = gen_linktype(cstate, ETHERTYPE_IPV6);
6118
6119		/* A = ip6->ip_nxt */
6120		s[i] = new_stmt(cstate, BPF_LD|BPF_ABS|BPF_B);
6121		s[i]->s.k = cstate->off_linkpl.constant_part + cstate->off_nl + 6;
6122		i++;
6123		/* X = sizeof(struct ip6_hdr) */
6124		s[i] = new_stmt(cstate, BPF_LDX|BPF_IMM);
6125		s[i]->s.k = 40;
6126		i++;
6127		break;
6128
6129	default:
6130		bpf_error(cstate, "unsupported proto to gen_protochain");
6131		/*NOTREACHED*/
6132	}
6133
6134	/* again: if (A == v) goto end; else fall through; */
6135	again = i;
6136	s[i] = new_stmt(cstate, BPF_JMP|BPF_JEQ|BPF_K);
6137	s[i]->s.k = v;
6138	s[i]->s.jt = NULL;		/*later*/
6139	s[i]->s.jf = NULL;		/*update in next stmt*/
6140	fix5 = i;
6141	i++;
6142
6143#ifndef IPPROTO_NONE
6144#define IPPROTO_NONE	59
6145#endif
6146	/* if (A == IPPROTO_NONE) goto end */
6147	s[i] = new_stmt(cstate, BPF_JMP|BPF_JEQ|BPF_K);
6148	s[i]->s.jt = NULL;	/*later*/
6149	s[i]->s.jf = NULL;	/*update in next stmt*/
6150	s[i]->s.k = IPPROTO_NONE;
6151	s[fix5]->s.jf = s[i];
6152	fix2 = i;
6153	i++;
6154
6155	if (proto == Q_IPV6) {
6156		int v6start, v6end, v6advance, j;
6157
6158		v6start = i;
6159		/* if (A == IPPROTO_HOPOPTS) goto v6advance */
6160		s[i] = new_stmt(cstate, BPF_JMP|BPF_JEQ|BPF_K);
6161		s[i]->s.jt = NULL;	/*later*/
6162		s[i]->s.jf = NULL;	/*update in next stmt*/
6163		s[i]->s.k = IPPROTO_HOPOPTS;
6164		s[fix2]->s.jf = s[i];
6165		i++;
6166		/* if (A == IPPROTO_DSTOPTS) goto v6advance */
6167		s[i - 1]->s.jf = s[i] = new_stmt(cstate, BPF_JMP|BPF_JEQ|BPF_K);
6168		s[i]->s.jt = NULL;	/*later*/
6169		s[i]->s.jf = NULL;	/*update in next stmt*/
6170		s[i]->s.k = IPPROTO_DSTOPTS;
6171		i++;
6172		/* if (A == IPPROTO_ROUTING) goto v6advance */
6173		s[i - 1]->s.jf = s[i] = new_stmt(cstate, BPF_JMP|BPF_JEQ|BPF_K);
6174		s[i]->s.jt = NULL;	/*later*/
6175		s[i]->s.jf = NULL;	/*update in next stmt*/
6176		s[i]->s.k = IPPROTO_ROUTING;
6177		i++;
6178		/* if (A == IPPROTO_FRAGMENT) goto v6advance; else goto ahcheck; */
6179		s[i - 1]->s.jf = s[i] = new_stmt(cstate, BPF_JMP|BPF_JEQ|BPF_K);
6180		s[i]->s.jt = NULL;	/*later*/
6181		s[i]->s.jf = NULL;	/*later*/
6182		s[i]->s.k = IPPROTO_FRAGMENT;
6183		fix3 = i;
6184		v6end = i;
6185		i++;
6186
6187		/* v6advance: */
6188		v6advance = i;
6189
6190		/*
6191		 * in short,
6192		 * A = P[X + packet head];
6193		 * X = X + (P[X + packet head + 1] + 1) * 8;
6194		 */
6195		/* A = P[X + packet head] */
6196		s[i] = new_stmt(cstate, BPF_LD|BPF_IND|BPF_B);
6197		s[i]->s.k = cstate->off_linkpl.constant_part + cstate->off_nl;
6198		i++;
6199		/* MEM[reg2] = A */
6200		s[i] = new_stmt(cstate, BPF_ST);
6201		s[i]->s.k = reg2;
6202		i++;
6203		/* A = P[X + packet head + 1]; */
6204		s[i] = new_stmt(cstate, BPF_LD|BPF_IND|BPF_B);
6205		s[i]->s.k = cstate->off_linkpl.constant_part + cstate->off_nl + 1;
6206		i++;
6207		/* A += 1 */
6208		s[i] = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
6209		s[i]->s.k = 1;
6210		i++;
6211		/* A *= 8 */
6212		s[i] = new_stmt(cstate, BPF_ALU|BPF_MUL|BPF_K);
6213		s[i]->s.k = 8;
6214		i++;
6215		/* A += X */
6216		s[i] = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_X);
6217		s[i]->s.k = 0;
6218		i++;
6219		/* X = A; */
6220		s[i] = new_stmt(cstate, BPF_MISC|BPF_TAX);
6221		i++;
6222		/* A = MEM[reg2] */
6223		s[i] = new_stmt(cstate, BPF_LD|BPF_MEM);
6224		s[i]->s.k = reg2;
6225		i++;
6226
6227		/* goto again; (must use BPF_JA for backward jump) */
6228		s[i] = new_stmt(cstate, BPF_JMP|BPF_JA);
6229		s[i]->s.k = again - i - 1;
6230		s[i - 1]->s.jf = s[i];
6231		i++;
6232
6233		/* fixup */
6234		for (j = v6start; j <= v6end; j++)
6235			s[j]->s.jt = s[v6advance];
6236	} else {
6237		/* nop */
6238		s[i] = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
6239		s[i]->s.k = 0;
6240		s[fix2]->s.jf = s[i];
6241		i++;
6242	}
6243
6244	/* ahcheck: */
6245	ahcheck = i;
6246	/* if (A == IPPROTO_AH) then fall through; else goto end; */
6247	s[i] = new_stmt(cstate, BPF_JMP|BPF_JEQ|BPF_K);
6248	s[i]->s.jt = NULL;	/*later*/
6249	s[i]->s.jf = NULL;	/*later*/
6250	s[i]->s.k = IPPROTO_AH;
6251	if (fix3)
6252		s[fix3]->s.jf = s[ahcheck];
6253	fix4 = i;
6254	i++;
6255
6256	/*
6257	 * in short,
6258	 * A = P[X];
6259	 * X = X + (P[X + 1] + 2) * 4;
6260	 */
6261	/* A = X */
6262	s[i - 1]->s.jt = s[i] = new_stmt(cstate, BPF_MISC|BPF_TXA);
6263	i++;
6264	/* A = P[X + packet head]; */
6265	s[i] = new_stmt(cstate, BPF_LD|BPF_IND|BPF_B);
6266	s[i]->s.k = cstate->off_linkpl.constant_part + cstate->off_nl;
6267	i++;
6268	/* MEM[reg2] = A */
6269	s[i] = new_stmt(cstate, BPF_ST);
6270	s[i]->s.k = reg2;
6271	i++;
6272	/* A = X */
6273	s[i - 1]->s.jt = s[i] = new_stmt(cstate, BPF_MISC|BPF_TXA);
6274	i++;
6275	/* A += 1 */
6276	s[i] = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
6277	s[i]->s.k = 1;
6278	i++;
6279	/* X = A */
6280	s[i] = new_stmt(cstate, BPF_MISC|BPF_TAX);
6281	i++;
6282	/* A = P[X + packet head] */
6283	s[i] = new_stmt(cstate, BPF_LD|BPF_IND|BPF_B);
6284	s[i]->s.k = cstate->off_linkpl.constant_part + cstate->off_nl;
6285	i++;
6286	/* A += 2 */
6287	s[i] = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
6288	s[i]->s.k = 2;
6289	i++;
6290	/* A *= 4 */
6291	s[i] = new_stmt(cstate, BPF_ALU|BPF_MUL|BPF_K);
6292	s[i]->s.k = 4;
6293	i++;
6294	/* X = A; */
6295	s[i] = new_stmt(cstate, BPF_MISC|BPF_TAX);
6296	i++;
6297	/* A = MEM[reg2] */
6298	s[i] = new_stmt(cstate, BPF_LD|BPF_MEM);
6299	s[i]->s.k = reg2;
6300	i++;
6301
6302	/* goto again; (must use BPF_JA for backward jump) */
6303	s[i] = new_stmt(cstate, BPF_JMP|BPF_JA);
6304	s[i]->s.k = again - i - 1;
6305	i++;
6306
6307	/* end: nop */
6308	end = i;
6309	s[i] = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
6310	s[i]->s.k = 0;
6311	s[fix2]->s.jt = s[end];
6312	s[fix4]->s.jf = s[end];
6313	s[fix5]->s.jt = s[end];
6314	i++;
6315
6316	/*
6317	 * make slist chain
6318	 */
6319	max = i;
6320	for (i = 0; i < max - 1; i++)
6321		s[i]->next = s[i + 1];
6322	s[max - 1]->next = NULL;
6323
6324	/*
6325	 * emit final check
6326	 */
6327	b = new_block(cstate, JMP(BPF_JEQ));
6328	b->stmts = s[1];	/*remember, s[0] is dummy*/
6329	b->s.k = v;
6330
6331	free_reg(cstate, reg2);
6332
6333	gen_and(b0, b);
6334	return b;
6335#endif
6336}
6337
6338static struct block *
6339gen_check_802_11_data_frame(compiler_state_t *cstate)
6340{
6341	struct slist *s;
6342	struct block *b0, *b1;
6343
6344	/*
6345	 * A data frame has the 0x08 bit (b3) in the frame control field set
6346	 * and the 0x04 bit (b2) clear.
6347	 */
6348	s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
6349	b0 = new_block(cstate, JMP(BPF_JSET));
6350	b0->s.k = 0x08;
6351	b0->stmts = s;
6352
6353	s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
6354	b1 = new_block(cstate, JMP(BPF_JSET));
6355	b1->s.k = 0x04;
6356	b1->stmts = s;
6357	gen_not(b1);
6358
6359	gen_and(b1, b0);
6360
6361	return b0;
6362}
6363
6364/*
6365 * Generate code that checks whether the packet is a packet for protocol
6366 * <proto> and whether the type field in that protocol's header has
6367 * the value <v>, e.g. if <proto> is Q_IP, it checks whether it's an
6368 * IP packet and checks the protocol number in the IP header against <v>.
6369 *
6370 * If <proto> is Q_DEFAULT, i.e. just "proto" was specified, it checks
6371 * against Q_IP and Q_IPV6.
6372 */
6373static struct block *
6374gen_proto(compiler_state_t *cstate, int v, int proto, int dir)
6375{
6376	struct block *b0, *b1;
6377#ifndef CHASE_CHAIN
6378	struct block *b2;
6379#endif
6380
6381	if (dir != Q_DEFAULT)
6382		bpf_error(cstate, "direction applied to 'proto'");
6383
6384	switch (proto) {
6385	case Q_DEFAULT:
6386		b0 = gen_proto(cstate, v, Q_IP, dir);
6387		b1 = gen_proto(cstate, v, Q_IPV6, dir);
6388		gen_or(b0, b1);
6389		return b1;
6390
6391	case Q_LINK:
6392		return gen_linktype(cstate, v);
6393
6394	case Q_IP:
6395		/*
6396		 * For FDDI, RFC 1188 says that SNAP encapsulation is used,
6397		 * not LLC encapsulation with LLCSAP_IP.
6398		 *
6399		 * For IEEE 802 networks - which includes 802.5 token ring
6400		 * (which is what DLT_IEEE802 means) and 802.11 - RFC 1042
6401		 * says that SNAP encapsulation is used, not LLC encapsulation
6402		 * with LLCSAP_IP.
6403		 *
6404		 * For LLC-encapsulated ATM/"Classical IP", RFC 1483 and
6405		 * RFC 2225 say that SNAP encapsulation is used, not LLC
6406		 * encapsulation with LLCSAP_IP.
6407		 *
6408		 * So we always check for ETHERTYPE_IP.
6409		 */
6410		b0 = gen_linktype(cstate, ETHERTYPE_IP);
6411#ifndef CHASE_CHAIN
6412		b1 = gen_cmp(cstate, OR_LINKPL, 9, BPF_B, (bpf_int32)v);
6413#else
6414		b1 = gen_protochain(cstate, v, Q_IP);
6415#endif
6416		gen_and(b0, b1);
6417		return b1;
6418
6419	case Q_ARP:
6420		bpf_error(cstate, "arp does not encapsulate another protocol");
6421		/*NOTREACHED*/
6422
6423	case Q_RARP:
6424		bpf_error(cstate, "rarp does not encapsulate another protocol");
6425		/*NOTREACHED*/
6426
6427	case Q_SCTP:
6428		bpf_error(cstate, "'sctp proto' is bogus");
6429		/*NOTREACHED*/
6430
6431	case Q_TCP:
6432		bpf_error(cstate, "'tcp proto' is bogus");
6433		/*NOTREACHED*/
6434
6435	case Q_UDP:
6436		bpf_error(cstate, "'udp proto' is bogus");
6437		/*NOTREACHED*/
6438
6439	case Q_ICMP:
6440		bpf_error(cstate, "'icmp proto' is bogus");
6441		/*NOTREACHED*/
6442
6443	case Q_IGMP:
6444		bpf_error(cstate, "'igmp proto' is bogus");
6445		/*NOTREACHED*/
6446
6447	case Q_IGRP:
6448		bpf_error(cstate, "'igrp proto' is bogus");
6449		/*NOTREACHED*/
6450
6451	case Q_ATALK:
6452		bpf_error(cstate, "AppleTalk encapsulation is not specifiable");
6453		/*NOTREACHED*/
6454
6455	case Q_DECNET:
6456		bpf_error(cstate, "DECNET encapsulation is not specifiable");
6457		/*NOTREACHED*/
6458
6459	case Q_LAT:
6460		bpf_error(cstate, "LAT does not encapsulate another protocol");
6461		/*NOTREACHED*/
6462
6463	case Q_SCA:
6464		bpf_error(cstate, "SCA does not encapsulate another protocol");
6465		/*NOTREACHED*/
6466
6467	case Q_MOPRC:
6468		bpf_error(cstate, "MOPRC does not encapsulate another protocol");
6469		/*NOTREACHED*/
6470
6471	case Q_MOPDL:
6472		bpf_error(cstate, "MOPDL does not encapsulate another protocol");
6473		/*NOTREACHED*/
6474
6475	case Q_IPV6:
6476		b0 = gen_linktype(cstate, ETHERTYPE_IPV6);
6477#ifndef CHASE_CHAIN
6478		/*
6479		 * Also check for a fragment header before the final
6480		 * header.
6481		 */
6482		b2 = gen_cmp(cstate, OR_LINKPL, 6, BPF_B, IPPROTO_FRAGMENT);
6483		b1 = gen_cmp(cstate, OR_LINKPL, 40, BPF_B, (bpf_int32)v);
6484		gen_and(b2, b1);
6485		b2 = gen_cmp(cstate, OR_LINKPL, 6, BPF_B, (bpf_int32)v);
6486		gen_or(b2, b1);
6487#else
6488		b1 = gen_protochain(cstate, v, Q_IPV6);
6489#endif
6490		gen_and(b0, b1);
6491		return b1;
6492
6493	case Q_ICMPV6:
6494		bpf_error(cstate, "'icmp6 proto' is bogus");
6495		/*NOTREACHED*/
6496
6497	case Q_AH:
6498		bpf_error(cstate, "'ah proto' is bogus");
6499		/*NOTREACHED*/
6500
6501	case Q_ESP:
6502		bpf_error(cstate, "'ah proto' is bogus");
6503		/*NOTREACHED*/
6504
6505	case Q_PIM:
6506		bpf_error(cstate, "'pim proto' is bogus");
6507		/*NOTREACHED*/
6508
6509	case Q_VRRP:
6510		bpf_error(cstate, "'vrrp proto' is bogus");
6511		/*NOTREACHED*/
6512
6513	case Q_AARP:
6514		bpf_error(cstate, "'aarp proto' is bogus");
6515		/*NOTREACHED*/
6516
6517	case Q_ISO:
6518		switch (cstate->linktype) {
6519
6520		case DLT_FRELAY:
6521			/*
6522			 * Frame Relay packets typically have an OSI
6523			 * NLPID at the beginning; "gen_linktype(cstate, LLCSAP_ISONS)"
6524			 * generates code to check for all the OSI
6525			 * NLPIDs, so calling it and then adding a check
6526			 * for the particular NLPID for which we're
6527			 * looking is bogus, as we can just check for
6528			 * the NLPID.
6529			 *
6530			 * What we check for is the NLPID and a frame
6531			 * control field value of UI, i.e. 0x03 followed
6532			 * by the NLPID.
6533			 *
6534			 * XXX - assumes a 2-byte Frame Relay header with
6535			 * DLCI and flags.  What if the address is longer?
6536			 *
6537			 * XXX - what about SNAP-encapsulated frames?
6538			 */
6539			return gen_cmp(cstate, OR_LINKHDR, 2, BPF_H, (0x03<<8) | v);
6540			/*NOTREACHED*/
6541
6542		case DLT_C_HDLC:
6543			/*
6544			 * Cisco uses an Ethertype lookalike - for OSI,
6545			 * it's 0xfefe.
6546			 */
6547			b0 = gen_linktype(cstate, LLCSAP_ISONS<<8 | LLCSAP_ISONS);
6548			/* OSI in C-HDLC is stuffed with a fudge byte */
6549			b1 = gen_cmp(cstate, OR_LINKPL_NOSNAP, 1, BPF_B, (long)v);
6550			gen_and(b0, b1);
6551			return b1;
6552
6553		default:
6554			b0 = gen_linktype(cstate, LLCSAP_ISONS);
6555			b1 = gen_cmp(cstate, OR_LINKPL_NOSNAP, 0, BPF_B, (long)v);
6556			gen_and(b0, b1);
6557			return b1;
6558		}
6559
6560	case Q_ESIS:
6561		bpf_error(cstate, "'esis proto' is bogus");
6562		/*NOTREACHED*/
6563
6564	case Q_ISIS:
6565		b0 = gen_proto(cstate, ISO10589_ISIS, Q_ISO, Q_DEFAULT);
6566		/*
6567		 * 4 is the offset of the PDU type relative to the IS-IS
6568		 * header.
6569		 */
6570		b1 = gen_cmp(cstate, OR_LINKPL_NOSNAP, 4, BPF_B, (long)v);
6571		gen_and(b0, b1);
6572		return b1;
6573
6574	case Q_CLNP:
6575		bpf_error(cstate, "'clnp proto' is not supported");
6576		/*NOTREACHED*/
6577
6578	case Q_STP:
6579		bpf_error(cstate, "'stp proto' is bogus");
6580		/*NOTREACHED*/
6581
6582	case Q_IPX:
6583		bpf_error(cstate, "'ipx proto' is bogus");
6584		/*NOTREACHED*/
6585
6586	case Q_NETBEUI:
6587		bpf_error(cstate, "'netbeui proto' is bogus");
6588		/*NOTREACHED*/
6589
6590	case Q_ISIS_L1:
6591		bpf_error(cstate, "'l1 proto' is bogus");
6592		/*NOTREACHED*/
6593
6594	case Q_ISIS_L2:
6595		bpf_error(cstate, "'l2 proto' is bogus");
6596		/*NOTREACHED*/
6597
6598	case Q_ISIS_IIH:
6599		bpf_error(cstate, "'iih proto' is bogus");
6600		/*NOTREACHED*/
6601
6602	case Q_ISIS_SNP:
6603		bpf_error(cstate, "'snp proto' is bogus");
6604		/*NOTREACHED*/
6605
6606	case Q_ISIS_CSNP:
6607		bpf_error(cstate, "'csnp proto' is bogus");
6608		/*NOTREACHED*/
6609
6610	case Q_ISIS_PSNP:
6611		bpf_error(cstate, "'psnp proto' is bogus");
6612		/*NOTREACHED*/
6613
6614	case Q_ISIS_LSP:
6615		bpf_error(cstate, "'lsp proto' is bogus");
6616		/*NOTREACHED*/
6617
6618	case Q_RADIO:
6619		bpf_error(cstate, "'radio proto' is bogus");
6620		/*NOTREACHED*/
6621
6622	case Q_CARP:
6623		bpf_error(cstate, "'carp proto' is bogus");
6624		/*NOTREACHED*/
6625
6626	default:
6627		abort();
6628		/*NOTREACHED*/
6629	}
6630	/*NOTREACHED*/
6631}
6632
6633struct block *
6634gen_scode(compiler_state_t *cstate, const char *name, struct qual q)
6635{
6636	int proto = q.proto;
6637	int dir = q.dir;
6638	int tproto;
6639	u_char *eaddr;
6640	bpf_u_int32 mask, addr;
6641	struct addrinfo *res, *res0;
6642	struct sockaddr_in *sin4;
6643#ifdef INET6
6644	int tproto6;
6645	struct sockaddr_in6 *sin6;
6646	struct in6_addr mask128;
6647#endif /*INET6*/
6648	struct block *b, *tmp;
6649	int port, real_proto;
6650	int port1, port2;
6651
6652	/*
6653	 * Catch errors reported by us and routines below us, and return NULL
6654	 * on an error.
6655	 */
6656	if (setjmp(cstate->top_ctx))
6657		return (NULL);
6658
6659	switch (q.addr) {
6660
6661	case Q_NET:
6662		addr = pcap_nametonetaddr(name);
6663		if (addr == 0)
6664			bpf_error(cstate, "unknown network '%s'", name);
6665		/* Left justify network addr and calculate its network mask */
6666		mask = 0xffffffff;
6667		while (addr && (addr & 0xff000000) == 0) {
6668			addr <<= 8;
6669			mask <<= 8;
6670		}
6671		return gen_host(cstate, addr, mask, proto, dir, q.addr);
6672
6673	case Q_DEFAULT:
6674	case Q_HOST:
6675		if (proto == Q_LINK) {
6676			switch (cstate->linktype) {
6677
6678			case DLT_EN10MB:
6679			case DLT_NETANALYZER:
6680			case DLT_NETANALYZER_TRANSPARENT:
6681				eaddr = pcap_ether_hostton(name);
6682				if (eaddr == NULL)
6683					bpf_error(cstate,
6684					    "unknown ether host '%s'", name);
6685				tmp = gen_prevlinkhdr_check(cstate);
6686				b = gen_ehostop(cstate, eaddr, dir);
6687				if (tmp != NULL)
6688					gen_and(tmp, b);
6689				free(eaddr);
6690				return b;
6691
6692			case DLT_FDDI:
6693				eaddr = pcap_ether_hostton(name);
6694				if (eaddr == NULL)
6695					bpf_error(cstate,
6696					    "unknown FDDI host '%s'", name);
6697				b = gen_fhostop(cstate, eaddr, dir);
6698				free(eaddr);
6699				return b;
6700
6701			case DLT_IEEE802:
6702				eaddr = pcap_ether_hostton(name);
6703				if (eaddr == NULL)
6704					bpf_error(cstate,
6705					    "unknown token ring host '%s'", name);
6706				b = gen_thostop(cstate, eaddr, dir);
6707				free(eaddr);
6708				return b;
6709
6710			case DLT_IEEE802_11:
6711			case DLT_PRISM_HEADER:
6712			case DLT_IEEE802_11_RADIO_AVS:
6713			case DLT_IEEE802_11_RADIO:
6714			case DLT_PPI:
6715				eaddr = pcap_ether_hostton(name);
6716				if (eaddr == NULL)
6717					bpf_error(cstate,
6718					    "unknown 802.11 host '%s'", name);
6719				b = gen_wlanhostop(cstate, eaddr, dir);
6720				free(eaddr);
6721				return b;
6722
6723			case DLT_IP_OVER_FC:
6724				eaddr = pcap_ether_hostton(name);
6725				if (eaddr == NULL)
6726					bpf_error(cstate,
6727					    "unknown Fibre Channel host '%s'", name);
6728				b = gen_ipfchostop(cstate, eaddr, dir);
6729				free(eaddr);
6730				return b;
6731			}
6732
6733			bpf_error(cstate, "only ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel supports link-level host name");
6734		} else if (proto == Q_DECNET) {
6735			unsigned short dn_addr;
6736
6737			if (!__pcap_nametodnaddr(name, &dn_addr)) {
6738#ifdef	DECNETLIB
6739				bpf_error(cstate, "unknown decnet host name '%s'\n", name);
6740#else
6741				bpf_error(cstate, "decnet name support not included, '%s' cannot be translated\n",
6742					name);
6743#endif
6744			}
6745			/*
6746			 * I don't think DECNET hosts can be multihomed, so
6747			 * there is no need to build up a list of addresses
6748			 */
6749			return (gen_host(cstate, dn_addr, 0, proto, dir, q.addr));
6750		} else {
6751#ifdef INET6
6752			memset(&mask128, 0xff, sizeof(mask128));
6753#endif
6754			res0 = res = pcap_nametoaddrinfo(name);
6755			if (res == NULL)
6756				bpf_error(cstate, "unknown host '%s'", name);
6757			cstate->ai = res;
6758			b = tmp = NULL;
6759			tproto = proto;
6760#ifdef INET6
6761			tproto6 = proto;
6762#endif
6763			if (cstate->off_linktype.constant_part == OFFSET_NOT_SET &&
6764			    tproto == Q_DEFAULT) {
6765				tproto = Q_IP;
6766#ifdef INET6
6767				tproto6 = Q_IPV6;
6768#endif
6769			}
6770			for (res = res0; res; res = res->ai_next) {
6771				switch (res->ai_family) {
6772				case AF_INET:
6773#ifdef INET6
6774					if (tproto == Q_IPV6)
6775						continue;
6776#endif
6777
6778					sin4 = (struct sockaddr_in *)
6779						res->ai_addr;
6780					tmp = gen_host(cstate, ntohl(sin4->sin_addr.s_addr),
6781						0xffffffff, tproto, dir, q.addr);
6782					break;
6783#ifdef INET6
6784				case AF_INET6:
6785					if (tproto6 == Q_IP)
6786						continue;
6787
6788					sin6 = (struct sockaddr_in6 *)
6789						res->ai_addr;
6790					tmp = gen_host6(cstate, &sin6->sin6_addr,
6791						&mask128, tproto6, dir, q.addr);
6792					break;
6793#endif
6794				default:
6795					continue;
6796				}
6797				if (b)
6798					gen_or(b, tmp);
6799				b = tmp;
6800			}
6801			cstate->ai = NULL;
6802			freeaddrinfo(res0);
6803			if (b == NULL) {
6804				bpf_error(cstate, "unknown host '%s'%s", name,
6805				    (proto == Q_DEFAULT)
6806					? ""
6807					: " for specified address family");
6808			}
6809			return b;
6810		}
6811
6812	case Q_PORT:
6813		if (proto != Q_DEFAULT &&
6814		    proto != Q_UDP && proto != Q_TCP && proto != Q_SCTP)
6815			bpf_error(cstate, "illegal qualifier of 'port'");
6816		if (pcap_nametoport(name, &port, &real_proto) == 0)
6817			bpf_error(cstate, "unknown port '%s'", name);
6818		if (proto == Q_UDP) {
6819			if (real_proto == IPPROTO_TCP)
6820				bpf_error(cstate, "port '%s' is tcp", name);
6821			else if (real_proto == IPPROTO_SCTP)
6822				bpf_error(cstate, "port '%s' is sctp", name);
6823			else
6824				/* override PROTO_UNDEF */
6825				real_proto = IPPROTO_UDP;
6826		}
6827		if (proto == Q_TCP) {
6828			if (real_proto == IPPROTO_UDP)
6829				bpf_error(cstate, "port '%s' is udp", name);
6830
6831			else if (real_proto == IPPROTO_SCTP)
6832				bpf_error(cstate, "port '%s' is sctp", name);
6833			else
6834				/* override PROTO_UNDEF */
6835				real_proto = IPPROTO_TCP;
6836		}
6837		if (proto == Q_SCTP) {
6838			if (real_proto == IPPROTO_UDP)
6839				bpf_error(cstate, "port '%s' is udp", name);
6840
6841			else if (real_proto == IPPROTO_TCP)
6842				bpf_error(cstate, "port '%s' is tcp", name);
6843			else
6844				/* override PROTO_UNDEF */
6845				real_proto = IPPROTO_SCTP;
6846		}
6847		if (port < 0)
6848			bpf_error(cstate, "illegal port number %d < 0", port);
6849		if (port > 65535)
6850			bpf_error(cstate, "illegal port number %d > 65535", port);
6851		b = gen_port(cstate, port, real_proto, dir);
6852		gen_or(gen_port6(cstate, port, real_proto, dir), b);
6853		return b;
6854
6855	case Q_PORTRANGE:
6856		if (proto != Q_DEFAULT &&
6857		    proto != Q_UDP && proto != Q_TCP && proto != Q_SCTP)
6858			bpf_error(cstate, "illegal qualifier of 'portrange'");
6859		if (pcap_nametoportrange(name, &port1, &port2, &real_proto) == 0)
6860			bpf_error(cstate, "unknown port in range '%s'", name);
6861		if (proto == Q_UDP) {
6862			if (real_proto == IPPROTO_TCP)
6863				bpf_error(cstate, "port in range '%s' is tcp", name);
6864			else if (real_proto == IPPROTO_SCTP)
6865				bpf_error(cstate, "port in range '%s' is sctp", name);
6866			else
6867				/* override PROTO_UNDEF */
6868				real_proto = IPPROTO_UDP;
6869		}
6870		if (proto == Q_TCP) {
6871			if (real_proto == IPPROTO_UDP)
6872				bpf_error(cstate, "port in range '%s' is udp", name);
6873			else if (real_proto == IPPROTO_SCTP)
6874				bpf_error(cstate, "port in range '%s' is sctp", name);
6875			else
6876				/* override PROTO_UNDEF */
6877				real_proto = IPPROTO_TCP;
6878		}
6879		if (proto == Q_SCTP) {
6880			if (real_proto == IPPROTO_UDP)
6881				bpf_error(cstate, "port in range '%s' is udp", name);
6882			else if (real_proto == IPPROTO_TCP)
6883				bpf_error(cstate, "port in range '%s' is tcp", name);
6884			else
6885				/* override PROTO_UNDEF */
6886				real_proto = IPPROTO_SCTP;
6887		}
6888		if (port1 < 0)
6889			bpf_error(cstate, "illegal port number %d < 0", port1);
6890		if (port1 > 65535)
6891			bpf_error(cstate, "illegal port number %d > 65535", port1);
6892		if (port2 < 0)
6893			bpf_error(cstate, "illegal port number %d < 0", port2);
6894		if (port2 > 65535)
6895			bpf_error(cstate, "illegal port number %d > 65535", port2);
6896
6897		b = gen_portrange(cstate, port1, port2, real_proto, dir);
6898		gen_or(gen_portrange6(cstate, port1, port2, real_proto, dir), b);
6899		return b;
6900
6901	case Q_GATEWAY:
6902#ifndef INET6
6903		eaddr = pcap_ether_hostton(name);
6904		if (eaddr == NULL)
6905			bpf_error(cstate, "unknown ether host: %s", name);
6906
6907		res = pcap_nametoaddrinfo(name);
6908		cstate->ai = res;
6909		if (res == NULL)
6910			bpf_error(cstate, "unknown host '%s'", name);
6911		b = gen_gateway(cstate, eaddr, res, proto, dir);
6912		cstate->ai = NULL;
6913		freeaddrinfo(res);
6914		if (b == NULL)
6915			bpf_error(cstate, "unknown host '%s'", name);
6916		return b;
6917#else
6918		bpf_error(cstate, "'gateway' not supported in this configuration");
6919#endif /*INET6*/
6920
6921	case Q_PROTO:
6922		real_proto = lookup_proto(cstate, name, proto);
6923		if (real_proto >= 0)
6924			return gen_proto(cstate, real_proto, proto, dir);
6925		else
6926			bpf_error(cstate, "unknown protocol: %s", name);
6927
6928	case Q_PROTOCHAIN:
6929		real_proto = lookup_proto(cstate, name, proto);
6930		if (real_proto >= 0)
6931			return gen_protochain(cstate, real_proto, proto, dir);
6932		else
6933			bpf_error(cstate, "unknown protocol: %s", name);
6934
6935	case Q_UNDEF:
6936		syntax(cstate);
6937		/*NOTREACHED*/
6938	}
6939	abort();
6940	/*NOTREACHED*/
6941}
6942
6943struct block *
6944gen_mcode(compiler_state_t *cstate, const char *s1, const char *s2,
6945    unsigned int masklen, struct qual q)
6946{
6947	register int nlen, mlen;
6948	bpf_u_int32 n, m;
6949
6950	/*
6951	 * Catch errors reported by us and routines below us, and return NULL
6952	 * on an error.
6953	 */
6954	if (setjmp(cstate->top_ctx))
6955		return (NULL);
6956
6957	nlen = __pcap_atoin(s1, &n);
6958	if (nlen < 0)
6959		bpf_error(cstate, "invalid IPv4 address '%s'", s1);
6960	/* Promote short ipaddr */
6961	n <<= 32 - nlen;
6962
6963	if (s2 != NULL) {
6964		mlen = __pcap_atoin(s2, &m);
6965		if (mlen < 0)
6966			bpf_error(cstate, "invalid IPv4 address '%s'", s2);
6967		/* Promote short ipaddr */
6968		m <<= 32 - mlen;
6969		if ((n & ~m) != 0)
6970			bpf_error(cstate, "non-network bits set in \"%s mask %s\"",
6971			    s1, s2);
6972	} else {
6973		/* Convert mask len to mask */
6974		if (masklen > 32)
6975			bpf_error(cstate, "mask length must be <= 32");
6976		if (masklen == 0) {
6977			/*
6978			 * X << 32 is not guaranteed by C to be 0; it's
6979			 * undefined.
6980			 */
6981			m = 0;
6982		} else
6983			m = 0xffffffff << (32 - masklen);
6984		if ((n & ~m) != 0)
6985			bpf_error(cstate, "non-network bits set in \"%s/%d\"",
6986			    s1, masklen);
6987	}
6988
6989	switch (q.addr) {
6990
6991	case Q_NET:
6992		return gen_host(cstate, n, m, q.proto, q.dir, q.addr);
6993
6994	default:
6995		bpf_error(cstate, "Mask syntax for networks only");
6996		/*NOTREACHED*/
6997	}
6998	/*NOTREACHED*/
6999}
7000
7001struct block *
7002gen_ncode(compiler_state_t *cstate, const char *s, bpf_u_int32 v, struct qual q)
7003{
7004	bpf_u_int32 mask;
7005	int proto;
7006	int dir;
7007	register int vlen;
7008
7009	/*
7010	 * Catch errors reported by us and routines below us, and return NULL
7011	 * on an error.
7012	 */
7013	if (setjmp(cstate->top_ctx))
7014		return (NULL);
7015
7016	proto = q.proto;
7017	dir = q.dir;
7018	if (s == NULL)
7019		vlen = 32;
7020	else if (q.proto == Q_DECNET) {
7021		vlen = __pcap_atodn(s, &v);
7022		if (vlen == 0)
7023			bpf_error(cstate, "malformed decnet address '%s'", s);
7024	} else {
7025		vlen = __pcap_atoin(s, &v);
7026		if (vlen < 0)
7027			bpf_error(cstate, "invalid IPv4 address '%s'", s);
7028	}
7029
7030	switch (q.addr) {
7031
7032	case Q_DEFAULT:
7033	case Q_HOST:
7034	case Q_NET:
7035		if (proto == Q_DECNET)
7036			return gen_host(cstate, v, 0, proto, dir, q.addr);
7037		else if (proto == Q_LINK) {
7038			bpf_error(cstate, "illegal link layer address");
7039		} else {
7040			mask = 0xffffffff;
7041			if (s == NULL && q.addr == Q_NET) {
7042				/* Promote short net number */
7043				while (v && (v & 0xff000000) == 0) {
7044					v <<= 8;
7045					mask <<= 8;
7046				}
7047			} else {
7048				/* Promote short ipaddr */
7049				v <<= 32 - vlen;
7050				mask <<= 32 - vlen ;
7051			}
7052			return gen_host(cstate, v, mask, proto, dir, q.addr);
7053		}
7054
7055	case Q_PORT:
7056		if (proto == Q_UDP)
7057			proto = IPPROTO_UDP;
7058		else if (proto == Q_TCP)
7059			proto = IPPROTO_TCP;
7060		else if (proto == Q_SCTP)
7061			proto = IPPROTO_SCTP;
7062		else if (proto == Q_DEFAULT)
7063			proto = PROTO_UNDEF;
7064		else
7065			bpf_error(cstate, "illegal qualifier of 'port'");
7066
7067		if (v > 65535)
7068			bpf_error(cstate, "illegal port number %u > 65535", v);
7069
7070	    {
7071		struct block *b;
7072		b = gen_port(cstate, (int)v, proto, dir);
7073		gen_or(gen_port6(cstate, (int)v, proto, dir), b);
7074		return b;
7075	    }
7076
7077	case Q_PORTRANGE:
7078		if (proto == Q_UDP)
7079			proto = IPPROTO_UDP;
7080		else if (proto == Q_TCP)
7081			proto = IPPROTO_TCP;
7082		else if (proto == Q_SCTP)
7083			proto = IPPROTO_SCTP;
7084		else if (proto == Q_DEFAULT)
7085			proto = PROTO_UNDEF;
7086		else
7087			bpf_error(cstate, "illegal qualifier of 'portrange'");
7088
7089		if (v > 65535)
7090			bpf_error(cstate, "illegal port number %u > 65535", v);
7091
7092	    {
7093		struct block *b;
7094		b = gen_portrange(cstate, (int)v, (int)v, proto, dir);
7095		gen_or(gen_portrange6(cstate, (int)v, (int)v, proto, dir), b);
7096		return b;
7097	    }
7098
7099	case Q_GATEWAY:
7100		bpf_error(cstate, "'gateway' requires a name");
7101		/*NOTREACHED*/
7102
7103	case Q_PROTO:
7104		return gen_proto(cstate, (int)v, proto, dir);
7105
7106	case Q_PROTOCHAIN:
7107		return gen_protochain(cstate, (int)v, proto, dir);
7108
7109	case Q_UNDEF:
7110		syntax(cstate);
7111		/*NOTREACHED*/
7112
7113	default:
7114		abort();
7115		/*NOTREACHED*/
7116	}
7117	/*NOTREACHED*/
7118}
7119
7120#ifdef INET6
7121struct block *
7122gen_mcode6(compiler_state_t *cstate, const char *s1, const char *s2,
7123    unsigned int masklen, struct qual q)
7124{
7125	struct addrinfo *res;
7126	struct in6_addr *addr;
7127	struct in6_addr mask;
7128	struct block *b;
7129	uint32_t *a, *m;
7130
7131	/*
7132	 * Catch errors reported by us and routines below us, and return NULL
7133	 * on an error.
7134	 */
7135	if (setjmp(cstate->top_ctx))
7136		return (NULL);
7137
7138	if (s2)
7139		bpf_error(cstate, "no mask %s supported", s2);
7140
7141	res = pcap_nametoaddrinfo(s1);
7142	if (!res)
7143		bpf_error(cstate, "invalid ip6 address %s", s1);
7144	cstate->ai = res;
7145	if (res->ai_next)
7146		bpf_error(cstate, "%s resolved to multiple address", s1);
7147	addr = &((struct sockaddr_in6 *)res->ai_addr)->sin6_addr;
7148
7149	if (sizeof(mask) * 8 < masklen)
7150		bpf_error(cstate, "mask length must be <= %u", (unsigned int)(sizeof(mask) * 8));
7151	memset(&mask, 0, sizeof(mask));
7152	memset(&mask, 0xff, masklen / 8);
7153	if (masklen % 8) {
7154		mask.s6_addr[masklen / 8] =
7155			(0xff << (8 - masklen % 8)) & 0xff;
7156	}
7157
7158	a = (uint32_t *)addr;
7159	m = (uint32_t *)&mask;
7160	if ((a[0] & ~m[0]) || (a[1] & ~m[1])
7161	 || (a[2] & ~m[2]) || (a[3] & ~m[3])) {
7162		bpf_error(cstate, "non-network bits set in \"%s/%d\"", s1, masklen);
7163	}
7164
7165	switch (q.addr) {
7166
7167	case Q_DEFAULT:
7168	case Q_HOST:
7169		if (masklen != 128)
7170			bpf_error(cstate, "Mask syntax for networks only");
7171		/* FALLTHROUGH */
7172
7173	case Q_NET:
7174		b = gen_host6(cstate, addr, &mask, q.proto, q.dir, q.addr);
7175		cstate->ai = NULL;
7176		freeaddrinfo(res);
7177		return b;
7178
7179	default:
7180		bpf_error(cstate, "invalid qualifier against IPv6 address");
7181		/*NOTREACHED*/
7182	}
7183}
7184#endif /*INET6*/
7185
7186struct block *
7187gen_ecode(compiler_state_t *cstate, const char *s, struct qual q)
7188{
7189	struct block *b, *tmp;
7190
7191	/*
7192	 * Catch errors reported by us and routines below us, and return NULL
7193	 * on an error.
7194	 */
7195	if (setjmp(cstate->top_ctx))
7196		return (NULL);
7197
7198	if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) && q.proto == Q_LINK) {
7199		cstate->e = pcap_ether_aton(s);
7200		if (cstate->e == NULL)
7201			bpf_error(cstate, "malloc");
7202		switch (cstate->linktype) {
7203		case DLT_EN10MB:
7204		case DLT_NETANALYZER:
7205		case DLT_NETANALYZER_TRANSPARENT:
7206			tmp = gen_prevlinkhdr_check(cstate);
7207			b = gen_ehostop(cstate, cstate->e, (int)q.dir);
7208			if (tmp != NULL)
7209				gen_and(tmp, b);
7210			break;
7211		case DLT_FDDI:
7212			b = gen_fhostop(cstate, cstate->e, (int)q.dir);
7213			break;
7214		case DLT_IEEE802:
7215			b = gen_thostop(cstate, cstate->e, (int)q.dir);
7216			break;
7217		case DLT_IEEE802_11:
7218		case DLT_PRISM_HEADER:
7219		case DLT_IEEE802_11_RADIO_AVS:
7220		case DLT_IEEE802_11_RADIO:
7221		case DLT_PPI:
7222			b = gen_wlanhostop(cstate, cstate->e, (int)q.dir);
7223			break;
7224		case DLT_IP_OVER_FC:
7225			b = gen_ipfchostop(cstate, cstate->e, (int)q.dir);
7226			break;
7227		default:
7228			free(cstate->e);
7229			cstate->e = NULL;
7230			bpf_error(cstate, "ethernet addresses supported only on ethernet/FDDI/token ring/802.11/ATM LANE/Fibre Channel");
7231			/*NOTREACHED*/
7232		}
7233		free(cstate->e);
7234		cstate->e = NULL;
7235		return (b);
7236	}
7237	bpf_error(cstate, "ethernet address used in non-ether expression");
7238	/*NOTREACHED*/
7239}
7240
7241void
7242sappend(struct slist *s0, struct slist *s1)
7243{
7244	/*
7245	 * This is definitely not the best way to do this, but the
7246	 * lists will rarely get long.
7247	 */
7248	while (s0->next)
7249		s0 = s0->next;
7250	s0->next = s1;
7251}
7252
7253static struct slist *
7254xfer_to_x(compiler_state_t *cstate, struct arth *a)
7255{
7256	struct slist *s;
7257
7258	s = new_stmt(cstate, BPF_LDX|BPF_MEM);
7259	s->s.k = a->regno;
7260	return s;
7261}
7262
7263static struct slist *
7264xfer_to_a(compiler_state_t *cstate, struct arth *a)
7265{
7266	struct slist *s;
7267
7268	s = new_stmt(cstate, BPF_LD|BPF_MEM);
7269	s->s.k = a->regno;
7270	return s;
7271}
7272
7273/*
7274 * Modify "index" to use the value stored into its register as an
7275 * offset relative to the beginning of the header for the protocol
7276 * "proto", and allocate a register and put an item "size" bytes long
7277 * (1, 2, or 4) at that offset into that register, making it the register
7278 * for "index".
7279 */
7280static struct arth *
7281gen_load_internal(compiler_state_t *cstate, int proto, struct arth *inst, int size)
7282{
7283	struct slist *s, *tmp;
7284	struct block *b;
7285	int regno = alloc_reg(cstate);
7286
7287	free_reg(cstate, inst->regno);
7288	switch (size) {
7289
7290	default:
7291		bpf_error(cstate, "data size must be 1, 2, or 4");
7292
7293	case 1:
7294		size = BPF_B;
7295		break;
7296
7297	case 2:
7298		size = BPF_H;
7299		break;
7300
7301	case 4:
7302		size = BPF_W;
7303		break;
7304	}
7305	switch (proto) {
7306	default:
7307		bpf_error(cstate, "unsupported index operation");
7308
7309	case Q_RADIO:
7310		/*
7311		 * The offset is relative to the beginning of the packet
7312		 * data, if we have a radio header.  (If we don't, this
7313		 * is an error.)
7314		 */
7315		if (cstate->linktype != DLT_IEEE802_11_RADIO_AVS &&
7316		    cstate->linktype != DLT_IEEE802_11_RADIO &&
7317		    cstate->linktype != DLT_PRISM_HEADER)
7318			bpf_error(cstate, "radio information not present in capture");
7319
7320		/*
7321		 * Load into the X register the offset computed into the
7322		 * register specified by "index".
7323		 */
7324		s = xfer_to_x(cstate, inst);
7325
7326		/*
7327		 * Load the item at that offset.
7328		 */
7329		tmp = new_stmt(cstate, BPF_LD|BPF_IND|size);
7330		sappend(s, tmp);
7331		sappend(inst->s, s);
7332		break;
7333
7334	case Q_LINK:
7335		/*
7336		 * The offset is relative to the beginning of
7337		 * the link-layer header.
7338		 *
7339		 * XXX - what about ATM LANE?  Should the index be
7340		 * relative to the beginning of the AAL5 frame, so
7341		 * that 0 refers to the beginning of the LE Control
7342		 * field, or relative to the beginning of the LAN
7343		 * frame, so that 0 refers, for Ethernet LANE, to
7344		 * the beginning of the destination address?
7345		 */
7346		s = gen_abs_offset_varpart(cstate, &cstate->off_linkhdr);
7347
7348		/*
7349		 * If "s" is non-null, it has code to arrange that the
7350		 * X register contains the length of the prefix preceding
7351		 * the link-layer header.  Add to it the offset computed
7352		 * into the register specified by "index", and move that
7353		 * into the X register.  Otherwise, just load into the X
7354		 * register the offset computed into the register specified
7355		 * by "index".
7356		 */
7357		if (s != NULL) {
7358			sappend(s, xfer_to_a(cstate, inst));
7359			sappend(s, new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_X));
7360			sappend(s, new_stmt(cstate, BPF_MISC|BPF_TAX));
7361		} else
7362			s = xfer_to_x(cstate, inst);
7363
7364		/*
7365		 * Load the item at the sum of the offset we've put in the
7366		 * X register and the offset of the start of the link
7367		 * layer header (which is 0 if the radio header is
7368		 * variable-length; that header length is what we put
7369		 * into the X register and then added to the index).
7370		 */
7371		tmp = new_stmt(cstate, BPF_LD|BPF_IND|size);
7372		tmp->s.k = cstate->off_linkhdr.constant_part;
7373		sappend(s, tmp);
7374		sappend(inst->s, s);
7375		break;
7376
7377	case Q_IP:
7378	case Q_ARP:
7379	case Q_RARP:
7380	case Q_ATALK:
7381	case Q_DECNET:
7382	case Q_SCA:
7383	case Q_LAT:
7384	case Q_MOPRC:
7385	case Q_MOPDL:
7386	case Q_IPV6:
7387		/*
7388		 * The offset is relative to the beginning of
7389		 * the network-layer header.
7390		 * XXX - are there any cases where we want
7391		 * cstate->off_nl_nosnap?
7392		 */
7393		s = gen_abs_offset_varpart(cstate, &cstate->off_linkpl);
7394
7395		/*
7396		 * If "s" is non-null, it has code to arrange that the
7397		 * X register contains the variable part of the offset
7398		 * of the link-layer payload.  Add to it the offset
7399		 * computed into the register specified by "index",
7400		 * and move that into the X register.  Otherwise, just
7401		 * load into the X register the offset computed into
7402		 * the register specified by "index".
7403		 */
7404		if (s != NULL) {
7405			sappend(s, xfer_to_a(cstate, inst));
7406			sappend(s, new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_X));
7407			sappend(s, new_stmt(cstate, BPF_MISC|BPF_TAX));
7408		} else
7409			s = xfer_to_x(cstate, inst);
7410
7411		/*
7412		 * Load the item at the sum of the offset we've put in the
7413		 * X register, the offset of the start of the network
7414		 * layer header from the beginning of the link-layer
7415		 * payload, and the constant part of the offset of the
7416		 * start of the link-layer payload.
7417		 */
7418		tmp = new_stmt(cstate, BPF_LD|BPF_IND|size);
7419		tmp->s.k = cstate->off_linkpl.constant_part + cstate->off_nl;
7420		sappend(s, tmp);
7421		sappend(inst->s, s);
7422
7423		/*
7424		 * Do the computation only if the packet contains
7425		 * the protocol in question.
7426		 */
7427		b = gen_proto_abbrev_internal(cstate, proto);
7428		if (inst->b)
7429			gen_and(inst->b, b);
7430		inst->b = b;
7431		break;
7432
7433	case Q_SCTP:
7434	case Q_TCP:
7435	case Q_UDP:
7436	case Q_ICMP:
7437	case Q_IGMP:
7438	case Q_IGRP:
7439	case Q_PIM:
7440	case Q_VRRP:
7441	case Q_CARP:
7442		/*
7443		 * The offset is relative to the beginning of
7444		 * the transport-layer header.
7445		 *
7446		 * Load the X register with the length of the IPv4 header
7447		 * (plus the offset of the link-layer header, if it's
7448		 * a variable-length header), in bytes.
7449		 *
7450		 * XXX - are there any cases where we want
7451		 * cstate->off_nl_nosnap?
7452		 * XXX - we should, if we're built with
7453		 * IPv6 support, generate code to load either
7454		 * IPv4, IPv6, or both, as appropriate.
7455		 */
7456		s = gen_loadx_iphdrlen(cstate);
7457
7458		/*
7459		 * The X register now contains the sum of the variable
7460		 * part of the offset of the link-layer payload and the
7461		 * length of the network-layer header.
7462		 *
7463		 * Load into the A register the offset relative to
7464		 * the beginning of the transport layer header,
7465		 * add the X register to that, move that to the
7466		 * X register, and load with an offset from the
7467		 * X register equal to the sum of the constant part of
7468		 * the offset of the link-layer payload and the offset,
7469		 * relative to the beginning of the link-layer payload,
7470		 * of the network-layer header.
7471		 */
7472		sappend(s, xfer_to_a(cstate, inst));
7473		sappend(s, new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_X));
7474		sappend(s, new_stmt(cstate, BPF_MISC|BPF_TAX));
7475		sappend(s, tmp = new_stmt(cstate, BPF_LD|BPF_IND|size));
7476		tmp->s.k = cstate->off_linkpl.constant_part + cstate->off_nl;
7477		sappend(inst->s, s);
7478
7479		/*
7480		 * Do the computation only if the packet contains
7481		 * the protocol in question - which is true only
7482		 * if this is an IP datagram and is the first or
7483		 * only fragment of that datagram.
7484		 */
7485		gen_and(gen_proto_abbrev_internal(cstate, proto), b = gen_ipfrag(cstate));
7486		if (inst->b)
7487			gen_and(inst->b, b);
7488		gen_and(gen_proto_abbrev_internal(cstate, Q_IP), b);
7489		inst->b = b;
7490		break;
7491	case Q_ICMPV6:
7492        /*
7493        * Do the computation only if the packet contains
7494        * the protocol in question.
7495        */
7496        b = gen_proto_abbrev_internal(cstate, Q_IPV6);
7497        if (inst->b) {
7498            gen_and(inst->b, b);
7499        }
7500        inst->b = b;
7501
7502        /*
7503        * Check if we have an icmp6 next header
7504        */
7505        b = gen_cmp(cstate, OR_LINKPL, 6, BPF_B, 58);
7506        if (inst->b) {
7507            gen_and(inst->b, b);
7508        }
7509        inst->b = b;
7510
7511
7512        s = gen_abs_offset_varpart(cstate, &cstate->off_linkpl);
7513        /*
7514        * If "s" is non-null, it has code to arrange that the
7515        * X register contains the variable part of the offset
7516        * of the link-layer payload.  Add to it the offset
7517        * computed into the register specified by "index",
7518        * and move that into the X register.  Otherwise, just
7519        * load into the X register the offset computed into
7520        * the register specified by "index".
7521        */
7522        if (s != NULL) {
7523            sappend(s, xfer_to_a(cstate, inst));
7524            sappend(s, new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_X));
7525            sappend(s, new_stmt(cstate, BPF_MISC|BPF_TAX));
7526        } else {
7527            s = xfer_to_x(cstate, inst);
7528        }
7529
7530        /*
7531        * Load the item at the sum of the offset we've put in the
7532        * X register, the offset of the start of the network
7533        * layer header from the beginning of the link-layer
7534        * payload, and the constant part of the offset of the
7535        * start of the link-layer payload.
7536        */
7537        tmp = new_stmt(cstate, BPF_LD|BPF_IND|size);
7538        tmp->s.k = cstate->off_linkpl.constant_part + cstate->off_nl + 40;
7539
7540        sappend(s, tmp);
7541        sappend(inst->s, s);
7542
7543        break;
7544	}
7545	inst->regno = regno;
7546	s = new_stmt(cstate, BPF_ST);
7547	s->s.k = regno;
7548	sappend(inst->s, s);
7549
7550	return inst;
7551}
7552
7553struct arth *
7554gen_load(compiler_state_t *cstate, int proto, struct arth *inst, int size)
7555{
7556	/*
7557	 * Catch errors reported by us and routines below us, and return NULL
7558	 * on an error.
7559	 */
7560	if (setjmp(cstate->top_ctx))
7561		return (NULL);
7562
7563	return gen_load_internal(cstate, proto, inst, size);
7564}
7565
7566static struct block *
7567gen_relation_internal(compiler_state_t *cstate, int code, struct arth *a0,
7568    struct arth *a1, int reversed)
7569{
7570	struct slist *s0, *s1, *s2;
7571	struct block *b, *tmp;
7572
7573	s0 = xfer_to_x(cstate, a1);
7574	s1 = xfer_to_a(cstate, a0);
7575	if (code == BPF_JEQ) {
7576		s2 = new_stmt(cstate, BPF_ALU|BPF_SUB|BPF_X);
7577		b = new_block(cstate, JMP(code));
7578		sappend(s1, s2);
7579	}
7580	else
7581		b = new_block(cstate, BPF_JMP|code|BPF_X);
7582	if (reversed)
7583		gen_not(b);
7584
7585	sappend(s0, s1);
7586	sappend(a1->s, s0);
7587	sappend(a0->s, a1->s);
7588
7589	b->stmts = a0->s;
7590
7591	free_reg(cstate, a0->regno);
7592	free_reg(cstate, a1->regno);
7593
7594	/* 'and' together protocol checks */
7595	if (a0->b) {
7596		if (a1->b) {
7597			gen_and(a0->b, tmp = a1->b);
7598		}
7599		else
7600			tmp = a0->b;
7601	} else
7602		tmp = a1->b;
7603
7604	if (tmp)
7605		gen_and(tmp, b);
7606
7607	return b;
7608}
7609
7610struct block *
7611gen_relation(compiler_state_t *cstate, int code, struct arth *a0,
7612    struct arth *a1, int reversed)
7613{
7614	/*
7615	 * Catch errors reported by us and routines below us, and return NULL
7616	 * on an error.
7617	 */
7618	if (setjmp(cstate->top_ctx))
7619		return (NULL);
7620
7621	return gen_relation_internal(cstate, code, a0, a1, reversed);
7622}
7623
7624struct arth *
7625gen_loadlen(compiler_state_t *cstate)
7626{
7627	int regno;
7628	struct arth *a;
7629	struct slist *s;
7630
7631	/*
7632	 * Catch errors reported by us and routines below us, and return NULL
7633	 * on an error.
7634	 */
7635	if (setjmp(cstate->top_ctx))
7636		return (NULL);
7637
7638	regno = alloc_reg(cstate);
7639	a = (struct arth *)newchunk(cstate, sizeof(*a));
7640	s = new_stmt(cstate, BPF_LD|BPF_LEN);
7641	s->next = new_stmt(cstate, BPF_ST);
7642	s->next->s.k = regno;
7643	a->s = s;
7644	a->regno = regno;
7645
7646	return a;
7647}
7648
7649static struct arth *
7650gen_loadi_internal(compiler_state_t *cstate, int val)
7651{
7652	struct arth *a;
7653	struct slist *s;
7654	int reg;
7655
7656	a = (struct arth *)newchunk(cstate, sizeof(*a));
7657
7658	reg = alloc_reg(cstate);
7659
7660	s = new_stmt(cstate, BPF_LD|BPF_IMM);
7661	s->s.k = val;
7662	s->next = new_stmt(cstate, BPF_ST);
7663	s->next->s.k = reg;
7664	a->s = s;
7665	a->regno = reg;
7666
7667	return a;
7668}
7669
7670struct arth *
7671gen_loadi(compiler_state_t *cstate, int val)
7672{
7673	/*
7674	 * Catch errors reported by us and routines below us, and return NULL
7675	 * on an error.
7676	 */
7677	if (setjmp(cstate->top_ctx))
7678		return (NULL);
7679
7680	return gen_loadi_internal(cstate, val);
7681}
7682
7683/*
7684 * The a_arg dance is to avoid annoying whining by compilers that
7685 * a might be clobbered by longjmp - yeah, it might, but *WHO CARES*?
7686 * It's not *used* after setjmp returns.
7687 */
7688struct arth *
7689gen_neg(compiler_state_t *cstate, struct arth *a_arg)
7690{
7691	struct arth *a = a_arg;
7692	struct slist *s;
7693
7694	/*
7695	 * Catch errors reported by us and routines below us, and return NULL
7696	 * on an error.
7697	 */
7698	if (setjmp(cstate->top_ctx))
7699		return (NULL);
7700
7701	s = xfer_to_a(cstate, a);
7702	sappend(a->s, s);
7703	s = new_stmt(cstate, BPF_ALU|BPF_NEG);
7704	s->s.k = 0;
7705	sappend(a->s, s);
7706	s = new_stmt(cstate, BPF_ST);
7707	s->s.k = a->regno;
7708	sappend(a->s, s);
7709
7710	return a;
7711}
7712
7713/*
7714 * The a0_arg dance is to avoid annoying whining by compilers that
7715 * a0 might be clobbered by longjmp - yeah, it might, but *WHO CARES*?
7716 * It's not *used* after setjmp returns.
7717 */
7718struct arth *
7719gen_arth(compiler_state_t *cstate, int code, struct arth *a0_arg,
7720    struct arth *a1)
7721{
7722	struct arth *a0 = a0_arg;
7723	struct slist *s0, *s1, *s2;
7724
7725	/*
7726	 * Catch errors reported by us and routines below us, and return NULL
7727	 * on an error.
7728	 */
7729	if (setjmp(cstate->top_ctx))
7730		return (NULL);
7731
7732	/*
7733	 * Disallow division by, or modulus by, zero; we do this here
7734	 * so that it gets done even if the optimizer is disabled.
7735	 *
7736	 * Also disallow shifts by a value greater than 31; we do this
7737	 * here, for the same reason.
7738	 */
7739	if (code == BPF_DIV) {
7740		if (a1->s->s.code == (BPF_LD|BPF_IMM) && a1->s->s.k == 0)
7741			bpf_error(cstate, "division by zero");
7742	} else if (code == BPF_MOD) {
7743		if (a1->s->s.code == (BPF_LD|BPF_IMM) && a1->s->s.k == 0)
7744			bpf_error(cstate, "modulus by zero");
7745	} else if (code == BPF_LSH || code == BPF_RSH) {
7746		/*
7747		 * XXX - we need to make up our minds as to what integers
7748		 * are signed and what integers are unsigned in BPF programs
7749		 * and in our IR.
7750		 */
7751		if (a1->s->s.code == (BPF_LD|BPF_IMM) &&
7752		    (a1->s->s.k < 0 || a1->s->s.k > 31))
7753			bpf_error(cstate, "shift by more than 31 bits");
7754	}
7755	s0 = xfer_to_x(cstate, a1);
7756	s1 = xfer_to_a(cstate, a0);
7757	s2 = new_stmt(cstate, BPF_ALU|BPF_X|code);
7758
7759	sappend(s1, s2);
7760	sappend(s0, s1);
7761	sappend(a1->s, s0);
7762	sappend(a0->s, a1->s);
7763
7764	free_reg(cstate, a0->regno);
7765	free_reg(cstate, a1->regno);
7766
7767	s0 = new_stmt(cstate, BPF_ST);
7768	a0->regno = s0->s.k = alloc_reg(cstate);
7769	sappend(a0->s, s0);
7770
7771	return a0;
7772}
7773
7774/*
7775 * Initialize the table of used registers and the current register.
7776 */
7777static void
7778init_regs(compiler_state_t *cstate)
7779{
7780	cstate->curreg = 0;
7781	memset(cstate->regused, 0, sizeof cstate->regused);
7782}
7783
7784/*
7785 * Return the next free register.
7786 */
7787static int
7788alloc_reg(compiler_state_t *cstate)
7789{
7790	int n = BPF_MEMWORDS;
7791
7792	while (--n >= 0) {
7793		if (cstate->regused[cstate->curreg])
7794			cstate->curreg = (cstate->curreg + 1) % BPF_MEMWORDS;
7795		else {
7796			cstate->regused[cstate->curreg] = 1;
7797			return cstate->curreg;
7798		}
7799	}
7800	bpf_error(cstate, "too many registers needed to evaluate expression");
7801	/*NOTREACHED*/
7802}
7803
7804/*
7805 * Return a register to the table so it can
7806 * be used later.
7807 */
7808static void
7809free_reg(compiler_state_t *cstate, int n)
7810{
7811	cstate->regused[n] = 0;
7812}
7813
7814static struct block *
7815gen_len(compiler_state_t *cstate, int jmp, int n)
7816{
7817	struct slist *s;
7818	struct block *b;
7819
7820	s = new_stmt(cstate, BPF_LD|BPF_LEN);
7821	b = new_block(cstate, JMP(jmp));
7822	b->stmts = s;
7823	b->s.k = n;
7824
7825	return b;
7826}
7827
7828struct block *
7829gen_greater(compiler_state_t *cstate, int n)
7830{
7831	/*
7832	 * Catch errors reported by us and routines below us, and return NULL
7833	 * on an error.
7834	 */
7835	if (setjmp(cstate->top_ctx))
7836		return (NULL);
7837
7838	return gen_len(cstate, BPF_JGE, n);
7839}
7840
7841/*
7842 * Actually, this is less than or equal.
7843 */
7844struct block *
7845gen_less(compiler_state_t *cstate, int n)
7846{
7847	struct block *b;
7848
7849	/*
7850	 * Catch errors reported by us and routines below us, and return NULL
7851	 * on an error.
7852	 */
7853	if (setjmp(cstate->top_ctx))
7854		return (NULL);
7855
7856	b = gen_len(cstate, BPF_JGT, n);
7857	gen_not(b);
7858
7859	return b;
7860}
7861
7862/*
7863 * This is for "byte {idx} {op} {val}"; "idx" is treated as relative to
7864 * the beginning of the link-layer header.
7865 * XXX - that means you can't test values in the radiotap header, but
7866 * as that header is difficult if not impossible to parse generally
7867 * without a loop, that might not be a severe problem.  A new keyword
7868 * "radio" could be added for that, although what you'd really want
7869 * would be a way of testing particular radio header values, which
7870 * would generate code appropriate to the radio header in question.
7871 */
7872struct block *
7873gen_byteop(compiler_state_t *cstate, int op, int idx, int val)
7874{
7875	struct block *b;
7876	struct slist *s;
7877
7878	/*
7879	 * Catch errors reported by us and routines below us, and return NULL
7880	 * on an error.
7881	 */
7882	if (setjmp(cstate->top_ctx))
7883		return (NULL);
7884
7885	switch (op) {
7886	default:
7887		abort();
7888
7889	case '=':
7890		return gen_cmp(cstate, OR_LINKHDR, (u_int)idx, BPF_B, (bpf_int32)val);
7891
7892	case '<':
7893		b = gen_cmp_lt(cstate, OR_LINKHDR, (u_int)idx, BPF_B, (bpf_int32)val);
7894		return b;
7895
7896	case '>':
7897		b = gen_cmp_gt(cstate, OR_LINKHDR, (u_int)idx, BPF_B, (bpf_int32)val);
7898		return b;
7899
7900	case '|':
7901		s = new_stmt(cstate, BPF_ALU|BPF_OR|BPF_K);
7902		break;
7903
7904	case '&':
7905		s = new_stmt(cstate, BPF_ALU|BPF_AND|BPF_K);
7906		break;
7907	}
7908	s->s.k = val;
7909	b = new_block(cstate, JMP(BPF_JEQ));
7910	b->stmts = s;
7911	gen_not(b);
7912
7913	return b;
7914}
7915
7916static const u_char abroadcast[] = { 0x0 };
7917
7918struct block *
7919gen_broadcast(compiler_state_t *cstate, int proto)
7920{
7921	bpf_u_int32 hostmask;
7922	struct block *b0, *b1, *b2;
7923	static const u_char ebroadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
7924
7925	/*
7926	 * Catch errors reported by us and routines below us, and return NULL
7927	 * on an error.
7928	 */
7929	if (setjmp(cstate->top_ctx))
7930		return (NULL);
7931
7932	switch (proto) {
7933
7934	case Q_DEFAULT:
7935	case Q_LINK:
7936		switch (cstate->linktype) {
7937		case DLT_ARCNET:
7938		case DLT_ARCNET_LINUX:
7939			return gen_ahostop(cstate, abroadcast, Q_DST);
7940		case DLT_EN10MB:
7941		case DLT_NETANALYZER:
7942		case DLT_NETANALYZER_TRANSPARENT:
7943			b1 = gen_prevlinkhdr_check(cstate);
7944			b0 = gen_ehostop(cstate, ebroadcast, Q_DST);
7945			if (b1 != NULL)
7946				gen_and(b1, b0);
7947			return b0;
7948		case DLT_FDDI:
7949			return gen_fhostop(cstate, ebroadcast, Q_DST);
7950		case DLT_IEEE802:
7951			return gen_thostop(cstate, ebroadcast, Q_DST);
7952		case DLT_IEEE802_11:
7953		case DLT_PRISM_HEADER:
7954		case DLT_IEEE802_11_RADIO_AVS:
7955		case DLT_IEEE802_11_RADIO:
7956		case DLT_PPI:
7957			return gen_wlanhostop(cstate, ebroadcast, Q_DST);
7958		case DLT_IP_OVER_FC:
7959			return gen_ipfchostop(cstate, ebroadcast, Q_DST);
7960		default:
7961			bpf_error(cstate, "not a broadcast link");
7962		}
7963 		/*NOTREACHED*/
7964
7965	case Q_IP:
7966		/*
7967		 * We treat a netmask of PCAP_NETMASK_UNKNOWN (0xffffffff)
7968		 * as an indication that we don't know the netmask, and fail
7969		 * in that case.
7970		 */
7971		if (cstate->netmask == PCAP_NETMASK_UNKNOWN)
7972			bpf_error(cstate, "netmask not known, so 'ip broadcast' not supported");
7973		b0 = gen_linktype(cstate, ETHERTYPE_IP);
7974		hostmask = ~cstate->netmask;
7975		b1 = gen_mcmp(cstate, OR_LINKPL, 16, BPF_W, (bpf_int32)0, hostmask);
7976		b2 = gen_mcmp(cstate, OR_LINKPL, 16, BPF_W,
7977			      (bpf_int32)(~0 & hostmask), hostmask);
7978		gen_or(b1, b2);
7979		gen_and(b0, b2);
7980		return b2;
7981	}
7982	bpf_error(cstate, "only link-layer/IP broadcast filters supported");
7983	/*NOTREACHED*/
7984}
7985
7986/*
7987 * Generate code to test the low-order bit of a MAC address (that's
7988 * the bottom bit of the *first* byte).
7989 */
7990static struct block *
7991gen_mac_multicast(compiler_state_t *cstate, int offset)
7992{
7993	register struct block *b0;
7994	register struct slist *s;
7995
7996	/* link[offset] & 1 != 0 */
7997	s = gen_load_a(cstate, OR_LINKHDR, offset, BPF_B);
7998	b0 = new_block(cstate, JMP(BPF_JSET));
7999	b0->s.k = 1;
8000	b0->stmts = s;
8001	return b0;
8002}
8003
8004struct block *
8005gen_multicast(compiler_state_t *cstate, int proto)
8006{
8007	register struct block *b0, *b1, *b2;
8008	register struct slist *s;
8009
8010	/*
8011	 * Catch errors reported by us and routines below us, and return NULL
8012	 * on an error.
8013	 */
8014	if (setjmp(cstate->top_ctx))
8015		return (NULL);
8016
8017	switch (proto) {
8018
8019	case Q_DEFAULT:
8020	case Q_LINK:
8021		switch (cstate->linktype) {
8022		case DLT_ARCNET:
8023		case DLT_ARCNET_LINUX:
8024			/* all ARCnet multicasts use the same address */
8025			return gen_ahostop(cstate, abroadcast, Q_DST);
8026		case DLT_EN10MB:
8027		case DLT_NETANALYZER:
8028		case DLT_NETANALYZER_TRANSPARENT:
8029			b1 = gen_prevlinkhdr_check(cstate);
8030			/* ether[0] & 1 != 0 */
8031			b0 = gen_mac_multicast(cstate, 0);
8032			if (b1 != NULL)
8033				gen_and(b1, b0);
8034			return b0;
8035		case DLT_FDDI:
8036			/*
8037			 * XXX TEST THIS: MIGHT NOT PORT PROPERLY XXX
8038			 *
8039			 * XXX - was that referring to bit-order issues?
8040			 */
8041			/* fddi[1] & 1 != 0 */
8042			return gen_mac_multicast(cstate, 1);
8043		case DLT_IEEE802:
8044			/* tr[2] & 1 != 0 */
8045			return gen_mac_multicast(cstate, 2);
8046		case DLT_IEEE802_11:
8047		case DLT_PRISM_HEADER:
8048		case DLT_IEEE802_11_RADIO_AVS:
8049		case DLT_IEEE802_11_RADIO:
8050		case DLT_PPI:
8051			/*
8052			 * Oh, yuk.
8053			 *
8054			 *	For control frames, there is no DA.
8055			 *
8056			 *	For management frames, DA is at an
8057			 *	offset of 4 from the beginning of
8058			 *	the packet.
8059			 *
8060			 *	For data frames, DA is at an offset
8061			 *	of 4 from the beginning of the packet
8062			 *	if To DS is clear and at an offset of
8063			 *	16 from the beginning of the packet
8064			 *	if To DS is set.
8065			 */
8066
8067			/*
8068			 * Generate the tests to be done for data frames.
8069			 *
8070			 * First, check for To DS set, i.e. "link[1] & 0x01".
8071			 */
8072			s = gen_load_a(cstate, OR_LINKHDR, 1, BPF_B);
8073			b1 = new_block(cstate, JMP(BPF_JSET));
8074			b1->s.k = 0x01;	/* To DS */
8075			b1->stmts = s;
8076
8077			/*
8078			 * If To DS is set, the DA is at 16.
8079			 */
8080			b0 = gen_mac_multicast(cstate, 16);
8081			gen_and(b1, b0);
8082
8083			/*
8084			 * Now, check for To DS not set, i.e. check
8085			 * "!(link[1] & 0x01)".
8086			 */
8087			s = gen_load_a(cstate, OR_LINKHDR, 1, BPF_B);
8088			b2 = new_block(cstate, JMP(BPF_JSET));
8089			b2->s.k = 0x01;	/* To DS */
8090			b2->stmts = s;
8091			gen_not(b2);
8092
8093			/*
8094			 * If To DS is not set, the DA is at 4.
8095			 */
8096			b1 = gen_mac_multicast(cstate, 4);
8097			gen_and(b2, b1);
8098
8099			/*
8100			 * Now OR together the last two checks.  That gives
8101			 * the complete set of checks for data frames.
8102			 */
8103			gen_or(b1, b0);
8104
8105			/*
8106			 * Now check for a data frame.
8107			 * I.e, check "link[0] & 0x08".
8108			 */
8109			s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
8110			b1 = new_block(cstate, JMP(BPF_JSET));
8111			b1->s.k = 0x08;
8112			b1->stmts = s;
8113
8114			/*
8115			 * AND that with the checks done for data frames.
8116			 */
8117			gen_and(b1, b0);
8118
8119			/*
8120			 * If the high-order bit of the type value is 0, this
8121			 * is a management frame.
8122			 * I.e, check "!(link[0] & 0x08)".
8123			 */
8124			s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
8125			b2 = new_block(cstate, JMP(BPF_JSET));
8126			b2->s.k = 0x08;
8127			b2->stmts = s;
8128			gen_not(b2);
8129
8130			/*
8131			 * For management frames, the DA is at 4.
8132			 */
8133			b1 = gen_mac_multicast(cstate, 4);
8134			gen_and(b2, b1);
8135
8136			/*
8137			 * OR that with the checks done for data frames.
8138			 * That gives the checks done for management and
8139			 * data frames.
8140			 */
8141			gen_or(b1, b0);
8142
8143			/*
8144			 * If the low-order bit of the type value is 1,
8145			 * this is either a control frame or a frame
8146			 * with a reserved type, and thus not a
8147			 * frame with an SA.
8148			 *
8149			 * I.e., check "!(link[0] & 0x04)".
8150			 */
8151			s = gen_load_a(cstate, OR_LINKHDR, 0, BPF_B);
8152			b1 = new_block(cstate, JMP(BPF_JSET));
8153			b1->s.k = 0x04;
8154			b1->stmts = s;
8155			gen_not(b1);
8156
8157			/*
8158			 * AND that with the checks for data and management
8159			 * frames.
8160			 */
8161			gen_and(b1, b0);
8162			return b0;
8163		case DLT_IP_OVER_FC:
8164			b0 = gen_mac_multicast(cstate, 2);
8165			return b0;
8166		default:
8167			break;
8168		}
8169		/* Link not known to support multicasts */
8170		break;
8171
8172	case Q_IP:
8173		b0 = gen_linktype(cstate, ETHERTYPE_IP);
8174		b1 = gen_cmp_ge(cstate, OR_LINKPL, 16, BPF_B, (bpf_int32)224);
8175		gen_and(b0, b1);
8176		return b1;
8177
8178	case Q_IPV6:
8179		b0 = gen_linktype(cstate, ETHERTYPE_IPV6);
8180		b1 = gen_cmp(cstate, OR_LINKPL, 24, BPF_B, (bpf_int32)255);
8181		gen_and(b0, b1);
8182		return b1;
8183	}
8184	bpf_error(cstate, "link-layer multicast filters supported only on ethernet/FDDI/token ring/ARCNET/802.11/ATM LANE/Fibre Channel");
8185	/*NOTREACHED*/
8186}
8187
8188/*
8189 * Filter on inbound (dir == 0) or outbound (dir == 1) traffic.
8190 * Outbound traffic is sent by this machine, while inbound traffic is
8191 * sent by a remote machine (and may include packets destined for a
8192 * unicast or multicast link-layer address we are not subscribing to).
8193 * These are the same definitions implemented by pcap_setdirection().
8194 * Capturing only unicast traffic destined for this host is probably
8195 * better accomplished using a higher-layer filter.
8196 */
8197struct block *
8198gen_inbound(compiler_state_t *cstate, int dir)
8199{
8200	register struct block *b0;
8201
8202	/*
8203	 * Catch errors reported by us and routines below us, and return NULL
8204	 * on an error.
8205	 */
8206	if (setjmp(cstate->top_ctx))
8207		return (NULL);
8208
8209	/*
8210	 * Only some data link types support inbound/outbound qualifiers.
8211	 */
8212	switch (cstate->linktype) {
8213	case DLT_SLIP:
8214		b0 = gen_relation_internal(cstate, BPF_JEQ,
8215			  gen_load_internal(cstate, Q_LINK, gen_loadi_internal(cstate, 0), 1),
8216			  gen_loadi_internal(cstate, 0),
8217			  dir);
8218		break;
8219
8220	case DLT_IPNET:
8221		if (dir) {
8222			/* match outgoing packets */
8223			b0 = gen_cmp(cstate, OR_LINKHDR, 2, BPF_H, IPNET_OUTBOUND);
8224		} else {
8225			/* match incoming packets */
8226			b0 = gen_cmp(cstate, OR_LINKHDR, 2, BPF_H, IPNET_INBOUND);
8227		}
8228		break;
8229
8230	case DLT_LINUX_SLL:
8231		/* match outgoing packets */
8232		b0 = gen_cmp(cstate, OR_LINKHDR, 0, BPF_H, LINUX_SLL_OUTGOING);
8233		if (!dir) {
8234			/* to filter on inbound traffic, invert the match */
8235			gen_not(b0);
8236		}
8237		break;
8238
8239	case DLT_LINUX_SLL2:
8240		/* match outgoing packets */
8241		b0 = gen_cmp(cstate, OR_LINKHDR, 10, BPF_B, LINUX_SLL_OUTGOING);
8242		if (!dir) {
8243			/* to filter on inbound traffic, invert the match */
8244			gen_not(b0);
8245		}
8246		break;
8247
8248#ifdef HAVE_NET_PFVAR_H
8249	case DLT_PFLOG:
8250		b0 = gen_cmp(cstate, OR_LINKHDR, offsetof(struct pfloghdr, dir), BPF_B,
8251		    (bpf_int32)((dir == 0) ? PF_IN : PF_OUT));
8252		break;
8253#endif
8254
8255	case DLT_PPP_PPPD:
8256		if (dir) {
8257			/* match outgoing packets */
8258			b0 = gen_cmp(cstate, OR_LINKHDR, 0, BPF_B, PPP_PPPD_OUT);
8259		} else {
8260			/* match incoming packets */
8261			b0 = gen_cmp(cstate, OR_LINKHDR, 0, BPF_B, PPP_PPPD_IN);
8262		}
8263		break;
8264
8265        case DLT_JUNIPER_MFR:
8266        case DLT_JUNIPER_MLFR:
8267        case DLT_JUNIPER_MLPPP:
8268	case DLT_JUNIPER_ATM1:
8269	case DLT_JUNIPER_ATM2:
8270	case DLT_JUNIPER_PPPOE:
8271	case DLT_JUNIPER_PPPOE_ATM:
8272        case DLT_JUNIPER_GGSN:
8273        case DLT_JUNIPER_ES:
8274        case DLT_JUNIPER_MONITOR:
8275        case DLT_JUNIPER_SERVICES:
8276        case DLT_JUNIPER_ETHER:
8277        case DLT_JUNIPER_PPP:
8278        case DLT_JUNIPER_FRELAY:
8279        case DLT_JUNIPER_CHDLC:
8280        case DLT_JUNIPER_VP:
8281        case DLT_JUNIPER_ST:
8282        case DLT_JUNIPER_ISM:
8283        case DLT_JUNIPER_VS:
8284        case DLT_JUNIPER_SRX_E2E:
8285        case DLT_JUNIPER_FIBRECHANNEL:
8286	case DLT_JUNIPER_ATM_CEMIC:
8287
8288		/* juniper flags (including direction) are stored
8289		 * the byte after the 3-byte magic number */
8290		if (dir) {
8291			/* match outgoing packets */
8292			b0 = gen_mcmp(cstate, OR_LINKHDR, 3, BPF_B, 0, 0x01);
8293		} else {
8294			/* match incoming packets */
8295			b0 = gen_mcmp(cstate, OR_LINKHDR, 3, BPF_B, 1, 0x01);
8296		}
8297		break;
8298
8299	default:
8300		/*
8301		 * If we have packet meta-data indicating a direction,
8302		 * and that metadata can be checked by BPF code, check
8303		 * it.  Otherwise, give up, as this link-layer type has
8304		 * nothing in the packet data.
8305		 *
8306		 * Currently, the only platform where a BPF filter can
8307		 * check that metadata is Linux with the in-kernel
8308		 * BPF interpreter.  If other packet capture mechanisms
8309		 * and BPF filters also supported this, it would be
8310		 * nice.  It would be even better if they made that
8311		 * metadata available so that we could provide it
8312		 * with newer capture APIs, allowing it to be saved
8313		 * in pcapng files.
8314		 */
8315#if defined(linux) && defined(PF_PACKET) && defined(SO_ATTACH_FILTER)
8316		/*
8317		 * This is Linux with PF_PACKET support.
8318		 * If this is a *live* capture, we can look at
8319		 * special meta-data in the filter expression;
8320		 * if it's a savefile, we can't.
8321		 */
8322		if (cstate->bpf_pcap->rfile != NULL) {
8323			/* We have a FILE *, so this is a savefile */
8324			bpf_error(cstate, "inbound/outbound not supported on %s when reading savefiles",
8325			    pcap_datalink_val_to_description_or_dlt(cstate->linktype));
8326			b0 = NULL;
8327			/*NOTREACHED*/
8328		}
8329		/* match outgoing packets */
8330		b0 = gen_cmp(cstate, OR_LINKHDR, SKF_AD_OFF + SKF_AD_PKTTYPE, BPF_H,
8331		             PACKET_OUTGOING);
8332		if (!dir) {
8333			/* to filter on inbound traffic, invert the match */
8334			gen_not(b0);
8335		}
8336#else /* defined(linux) && defined(PF_PACKET) && defined(SO_ATTACH_FILTER) */
8337		bpf_error(cstate, "inbound/outbound not supported on %s",
8338		    pcap_datalink_val_to_description_or_dlt(cstate->linktype));
8339		/*NOTREACHED*/
8340#endif /* defined(linux) && defined(PF_PACKET) && defined(SO_ATTACH_FILTER) */
8341	}
8342	return (b0);
8343}
8344
8345#ifdef HAVE_NET_PFVAR_H
8346/* PF firewall log matched interface */
8347struct block *
8348gen_pf_ifname(compiler_state_t *cstate, const char *ifname)
8349{
8350	struct block *b0;
8351	u_int len, off;
8352
8353	/*
8354	 * Catch errors reported by us and routines below us, and return NULL
8355	 * on an error.
8356	 */
8357	if (setjmp(cstate->top_ctx))
8358		return (NULL);
8359
8360	if (cstate->linktype != DLT_PFLOG) {
8361		bpf_error(cstate, "ifname supported only on PF linktype");
8362		/*NOTREACHED*/
8363	}
8364	len = sizeof(((struct pfloghdr *)0)->ifname);
8365	off = offsetof(struct pfloghdr, ifname);
8366	if (strlen(ifname) >= len) {
8367		bpf_error(cstate, "ifname interface names can only be %d characters",
8368		    len-1);
8369		/*NOTREACHED*/
8370	}
8371	b0 = gen_bcmp(cstate, OR_LINKHDR, off, (u_int)strlen(ifname),
8372	    (const u_char *)ifname);
8373	return (b0);
8374}
8375
8376/* PF firewall log ruleset name */
8377struct block *
8378gen_pf_ruleset(compiler_state_t *cstate, char *ruleset)
8379{
8380	struct block *b0;
8381
8382	/*
8383	 * Catch errors reported by us and routines below us, and return NULL
8384	 * on an error.
8385	 */
8386	if (setjmp(cstate->top_ctx))
8387		return (NULL);
8388
8389	if (cstate->linktype != DLT_PFLOG) {
8390		bpf_error(cstate, "ruleset supported only on PF linktype");
8391		/*NOTREACHED*/
8392	}
8393
8394	if (strlen(ruleset) >= sizeof(((struct pfloghdr *)0)->ruleset)) {
8395		bpf_error(cstate, "ruleset names can only be %ld characters",
8396		    (long)(sizeof(((struct pfloghdr *)0)->ruleset) - 1));
8397		/*NOTREACHED*/
8398	}
8399
8400	b0 = gen_bcmp(cstate, OR_LINKHDR, offsetof(struct pfloghdr, ruleset),
8401	    (u_int)strlen(ruleset), (const u_char *)ruleset);
8402	return (b0);
8403}
8404
8405/* PF firewall log rule number */
8406struct block *
8407gen_pf_rnr(compiler_state_t *cstate, int rnr)
8408{
8409	struct block *b0;
8410
8411	/*
8412	 * Catch errors reported by us and routines below us, and return NULL
8413	 * on an error.
8414	 */
8415	if (setjmp(cstate->top_ctx))
8416		return (NULL);
8417
8418	if (cstate->linktype != DLT_PFLOG) {
8419		bpf_error(cstate, "rnr supported only on PF linktype");
8420		/*NOTREACHED*/
8421	}
8422
8423	b0 = gen_cmp(cstate, OR_LINKHDR, offsetof(struct pfloghdr, rulenr), BPF_W,
8424		 (bpf_int32)rnr);
8425	return (b0);
8426}
8427
8428/* PF firewall log sub-rule number */
8429struct block *
8430gen_pf_srnr(compiler_state_t *cstate, int srnr)
8431{
8432	struct block *b0;
8433
8434	/*
8435	 * Catch errors reported by us and routines below us, and return NULL
8436	 * on an error.
8437	 */
8438	if (setjmp(cstate->top_ctx))
8439		return (NULL);
8440
8441	if (cstate->linktype != DLT_PFLOG) {
8442		bpf_error(cstate, "srnr supported only on PF linktype");
8443		/*NOTREACHED*/
8444	}
8445
8446	b0 = gen_cmp(cstate, OR_LINKHDR, offsetof(struct pfloghdr, subrulenr), BPF_W,
8447	    (bpf_int32)srnr);
8448	return (b0);
8449}
8450
8451/* PF firewall log reason code */
8452struct block *
8453gen_pf_reason(compiler_state_t *cstate, int reason)
8454{
8455	struct block *b0;
8456
8457	/*
8458	 * Catch errors reported by us and routines below us, and return NULL
8459	 * on an error.
8460	 */
8461	if (setjmp(cstate->top_ctx))
8462		return (NULL);
8463
8464	if (cstate->linktype != DLT_PFLOG) {
8465		bpf_error(cstate, "reason supported only on PF linktype");
8466		/*NOTREACHED*/
8467	}
8468
8469	b0 = gen_cmp(cstate, OR_LINKHDR, offsetof(struct pfloghdr, reason), BPF_B,
8470	    (bpf_int32)reason);
8471	return (b0);
8472}
8473
8474/* PF firewall log action */
8475struct block *
8476gen_pf_action(compiler_state_t *cstate, int action)
8477{
8478	struct block *b0;
8479
8480	/*
8481	 * Catch errors reported by us and routines below us, and return NULL
8482	 * on an error.
8483	 */
8484	if (setjmp(cstate->top_ctx))
8485		return (NULL);
8486
8487	if (cstate->linktype != DLT_PFLOG) {
8488		bpf_error(cstate, "action supported only on PF linktype");
8489		/*NOTREACHED*/
8490	}
8491
8492	b0 = gen_cmp(cstate, OR_LINKHDR, offsetof(struct pfloghdr, action), BPF_B,
8493	    (bpf_int32)action);
8494	return (b0);
8495}
8496#else /* !HAVE_NET_PFVAR_H */
8497struct block *
8498gen_pf_ifname(compiler_state_t *cstate, const char *ifname _U_)
8499{
8500	/*
8501	 * Catch errors reported by us and routines below us, and return NULL
8502	 * on an error.
8503	 */
8504	if (setjmp(cstate->top_ctx))
8505		return (NULL);
8506
8507	bpf_error(cstate, "libpcap was compiled without pf support");
8508	/*NOTREACHED*/
8509}
8510
8511struct block *
8512gen_pf_ruleset(compiler_state_t *cstate, char *ruleset _U_)
8513{
8514	/*
8515	 * Catch errors reported by us and routines below us, and return NULL
8516	 * on an error.
8517	 */
8518	if (setjmp(cstate->top_ctx))
8519		return (NULL);
8520
8521	bpf_error(cstate, "libpcap was compiled on a machine without pf support");
8522	/*NOTREACHED*/
8523}
8524
8525struct block *
8526gen_pf_rnr(compiler_state_t *cstate, int rnr _U_)
8527{
8528	/*
8529	 * Catch errors reported by us and routines below us, and return NULL
8530	 * on an error.
8531	 */
8532	if (setjmp(cstate->top_ctx))
8533		return (NULL);
8534
8535	bpf_error(cstate, "libpcap was compiled on a machine without pf support");
8536	/*NOTREACHED*/
8537}
8538
8539struct block *
8540gen_pf_srnr(compiler_state_t *cstate, int srnr _U_)
8541{
8542	/*
8543	 * Catch errors reported by us and routines below us, and return NULL
8544	 * on an error.
8545	 */
8546	if (setjmp(cstate->top_ctx))
8547		return (NULL);
8548
8549	bpf_error(cstate, "libpcap was compiled on a machine without pf support");
8550	/*NOTREACHED*/
8551}
8552
8553struct block *
8554gen_pf_reason(compiler_state_t *cstate, int reason _U_)
8555{
8556	/*
8557	 * Catch errors reported by us and routines below us, and return NULL
8558	 * on an error.
8559	 */
8560	if (setjmp(cstate->top_ctx))
8561		return (NULL);
8562
8563	bpf_error(cstate, "libpcap was compiled on a machine without pf support");
8564	/*NOTREACHED*/
8565}
8566
8567struct block *
8568gen_pf_action(compiler_state_t *cstate, int action _U_)
8569{
8570	/*
8571	 * Catch errors reported by us and routines below us, and return NULL
8572	 * on an error.
8573	 */
8574	if (setjmp(cstate->top_ctx))
8575		return (NULL);
8576
8577	bpf_error(cstate, "libpcap was compiled on a machine without pf support");
8578	/*NOTREACHED*/
8579}
8580#endif /* HAVE_NET_PFVAR_H */
8581
8582/* IEEE 802.11 wireless header */
8583struct block *
8584gen_p80211_type(compiler_state_t *cstate, int type, int mask)
8585{
8586	struct block *b0;
8587
8588	/*
8589	 * Catch errors reported by us and routines below us, and return NULL
8590	 * on an error.
8591	 */
8592	if (setjmp(cstate->top_ctx))
8593		return (NULL);
8594
8595	switch (cstate->linktype) {
8596
8597	case DLT_IEEE802_11:
8598	case DLT_PRISM_HEADER:
8599	case DLT_IEEE802_11_RADIO_AVS:
8600	case DLT_IEEE802_11_RADIO:
8601		b0 = gen_mcmp(cstate, OR_LINKHDR, 0, BPF_B, (bpf_int32)type,
8602		    (bpf_int32)mask);
8603		break;
8604
8605	default:
8606		bpf_error(cstate, "802.11 link-layer types supported only on 802.11");
8607		/*NOTREACHED*/
8608	}
8609
8610	return (b0);
8611}
8612
8613struct block *
8614gen_p80211_fcdir(compiler_state_t *cstate, int fcdir)
8615{
8616	struct block *b0;
8617
8618	/*
8619	 * Catch errors reported by us and routines below us, and return NULL
8620	 * on an error.
8621	 */
8622	if (setjmp(cstate->top_ctx))
8623		return (NULL);
8624
8625	switch (cstate->linktype) {
8626
8627	case DLT_IEEE802_11:
8628	case DLT_PRISM_HEADER:
8629	case DLT_IEEE802_11_RADIO_AVS:
8630	case DLT_IEEE802_11_RADIO:
8631		break;
8632
8633	default:
8634		bpf_error(cstate, "frame direction supported only with 802.11 headers");
8635		/*NOTREACHED*/
8636	}
8637
8638	b0 = gen_mcmp(cstate, OR_LINKHDR, 1, BPF_B, (bpf_int32)fcdir,
8639		(bpf_u_int32)IEEE80211_FC1_DIR_MASK);
8640
8641	return (b0);
8642}
8643
8644struct block *
8645gen_acode(compiler_state_t *cstate, const char *s, struct qual q)
8646{
8647	struct block *b;
8648
8649	/*
8650	 * Catch errors reported by us and routines below us, and return NULL
8651	 * on an error.
8652	 */
8653	if (setjmp(cstate->top_ctx))
8654		return (NULL);
8655
8656	switch (cstate->linktype) {
8657
8658	case DLT_ARCNET:
8659	case DLT_ARCNET_LINUX:
8660		if ((q.addr == Q_HOST || q.addr == Q_DEFAULT) &&
8661		    q.proto == Q_LINK) {
8662			cstate->e = pcap_ether_aton(s);
8663			if (cstate->e == NULL)
8664				bpf_error(cstate, "malloc");
8665			b = gen_ahostop(cstate, cstate->e, (int)q.dir);
8666			free(cstate->e);
8667			cstate->e = NULL;
8668			return (b);
8669		} else
8670			bpf_error(cstate, "ARCnet address used in non-arc expression");
8671 		/*NOTREACHED*/
8672
8673	default:
8674		bpf_error(cstate, "aid supported only on ARCnet");
8675		/*NOTREACHED*/
8676	}
8677}
8678
8679static struct block *
8680gen_ahostop(compiler_state_t *cstate, const u_char *eaddr, int dir)
8681{
8682	register struct block *b0, *b1;
8683
8684	switch (dir) {
8685	/* src comes first, different from Ethernet */
8686	case Q_SRC:
8687		return gen_bcmp(cstate, OR_LINKHDR, 0, 1, eaddr);
8688
8689	case Q_DST:
8690		return gen_bcmp(cstate, OR_LINKHDR, 1, 1, eaddr);
8691
8692	case Q_AND:
8693		b0 = gen_ahostop(cstate, eaddr, Q_SRC);
8694		b1 = gen_ahostop(cstate, eaddr, Q_DST);
8695		gen_and(b0, b1);
8696		return b1;
8697
8698	case Q_DEFAULT:
8699	case Q_OR:
8700		b0 = gen_ahostop(cstate, eaddr, Q_SRC);
8701		b1 = gen_ahostop(cstate, eaddr, Q_DST);
8702		gen_or(b0, b1);
8703		return b1;
8704
8705	case Q_ADDR1:
8706		bpf_error(cstate, "'addr1' and 'address1' are only supported on 802.11");
8707 		/*NOTREACHED*/
8708
8709	case Q_ADDR2:
8710		bpf_error(cstate, "'addr2' and 'address2' are only supported on 802.11");
8711 		/*NOTREACHED*/
8712
8713	case Q_ADDR3:
8714		bpf_error(cstate, "'addr3' and 'address3' are only supported on 802.11");
8715 		/*NOTREACHED*/
8716
8717	case Q_ADDR4:
8718		bpf_error(cstate, "'addr4' and 'address4' are only supported on 802.11");
8719 		/*NOTREACHED*/
8720
8721	case Q_RA:
8722		bpf_error(cstate, "'ra' is only supported on 802.11");
8723 		/*NOTREACHED*/
8724
8725	case Q_TA:
8726		bpf_error(cstate, "'ta' is only supported on 802.11");
8727 		/*NOTREACHED*/
8728	}
8729	abort();
8730	/*NOTREACHED*/
8731}
8732
8733static struct block *
8734gen_vlan_tpid_test(compiler_state_t *cstate)
8735{
8736	struct block *b0, *b1;
8737
8738	/* check for VLAN, including QinQ */
8739	b0 = gen_linktype(cstate, ETHERTYPE_8021Q);
8740	b1 = gen_linktype(cstate, ETHERTYPE_8021AD);
8741	gen_or(b0,b1);
8742	b0 = b1;
8743	b1 = gen_linktype(cstate, ETHERTYPE_8021QINQ);
8744	gen_or(b0,b1);
8745
8746	return b1;
8747}
8748
8749static struct block *
8750gen_vlan_vid_test(compiler_state_t *cstate, bpf_u_int32 vlan_num)
8751{
8752	if (vlan_num > 0x0fff) {
8753		bpf_error(cstate, "VLAN tag %u greater than maximum %u",
8754		    vlan_num, 0x0fff);
8755	}
8756	return gen_mcmp(cstate, OR_LINKPL, 0, BPF_H, (bpf_int32)vlan_num, 0x0fff);
8757}
8758
8759static struct block *
8760gen_vlan_no_bpf_extensions(compiler_state_t *cstate, bpf_u_int32 vlan_num,
8761    int has_vlan_tag)
8762{
8763	struct block *b0, *b1;
8764
8765	b0 = gen_vlan_tpid_test(cstate);
8766
8767	if (has_vlan_tag) {
8768		b1 = gen_vlan_vid_test(cstate, vlan_num);
8769		gen_and(b0, b1);
8770		b0 = b1;
8771	}
8772
8773	/*
8774	 * Both payload and link header type follow the VLAN tags so that
8775	 * both need to be updated.
8776	 */
8777	cstate->off_linkpl.constant_part += 4;
8778	cstate->off_linktype.constant_part += 4;
8779
8780	return b0;
8781}
8782
8783#if defined(SKF_AD_VLAN_TAG_PRESENT)
8784/* add v to variable part of off */
8785static void
8786gen_vlan_vloffset_add(compiler_state_t *cstate, bpf_abs_offset *off, int v, struct slist *s)
8787{
8788	struct slist *s2;
8789
8790	if (!off->is_variable)
8791		off->is_variable = 1;
8792	if (off->reg == -1)
8793		off->reg = alloc_reg(cstate);
8794
8795	s2 = new_stmt(cstate, BPF_LD|BPF_MEM);
8796	s2->s.k = off->reg;
8797	sappend(s, s2);
8798	s2 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_IMM);
8799	s2->s.k = v;
8800	sappend(s, s2);
8801	s2 = new_stmt(cstate, BPF_ST);
8802	s2->s.k = off->reg;
8803	sappend(s, s2);
8804}
8805
8806/*
8807 * patch block b_tpid (VLAN TPID test) to update variable parts of link payload
8808 * and link type offsets first
8809 */
8810static void
8811gen_vlan_patch_tpid_test(compiler_state_t *cstate, struct block *b_tpid)
8812{
8813	struct slist s;
8814
8815	/* offset determined at run time, shift variable part */
8816	s.next = NULL;
8817	cstate->is_vlan_vloffset = 1;
8818	gen_vlan_vloffset_add(cstate, &cstate->off_linkpl, 4, &s);
8819	gen_vlan_vloffset_add(cstate, &cstate->off_linktype, 4, &s);
8820
8821	/* we get a pointer to a chain of or-ed blocks, patch first of them */
8822	sappend(s.next, b_tpid->head->stmts);
8823	b_tpid->head->stmts = s.next;
8824}
8825
8826/*
8827 * patch block b_vid (VLAN id test) to load VID value either from packet
8828 * metadata (using BPF extensions) if SKF_AD_VLAN_TAG_PRESENT is true
8829 */
8830static void
8831gen_vlan_patch_vid_test(compiler_state_t *cstate, struct block *b_vid)
8832{
8833	struct slist *s, *s2, *sjeq;
8834	unsigned cnt;
8835
8836	s = new_stmt(cstate, BPF_LD|BPF_B|BPF_ABS);
8837	s->s.k = SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT;
8838
8839	/* true -> next instructions, false -> beginning of b_vid */
8840	sjeq = new_stmt(cstate, JMP(BPF_JEQ));
8841	sjeq->s.k = 1;
8842	sjeq->s.jf = b_vid->stmts;
8843	sappend(s, sjeq);
8844
8845	s2 = new_stmt(cstate, BPF_LD|BPF_B|BPF_ABS);
8846	s2->s.k = SKF_AD_OFF + SKF_AD_VLAN_TAG;
8847	sappend(s, s2);
8848	sjeq->s.jt = s2;
8849
8850	/* Jump to the test in b_vid. We need to jump one instruction before
8851	 * the end of the b_vid block so that we only skip loading the TCI
8852	 * from packet data and not the 'and' instruction extractging VID.
8853	 */
8854	cnt = 0;
8855	for (s2 = b_vid->stmts; s2; s2 = s2->next)
8856		cnt++;
8857	s2 = new_stmt(cstate, JMP(BPF_JA));
8858	s2->s.k = cnt - 1;
8859	sappend(s, s2);
8860
8861	/* insert our statements at the beginning of b_vid */
8862	sappend(s, b_vid->stmts);
8863	b_vid->stmts = s;
8864}
8865
8866/*
8867 * Generate check for "vlan" or "vlan <id>" on systems with support for BPF
8868 * extensions.  Even if kernel supports VLAN BPF extensions, (outermost) VLAN
8869 * tag can be either in metadata or in packet data; therefore if the
8870 * SKF_AD_VLAN_TAG_PRESENT test is negative, we need to check link
8871 * header for VLAN tag. As the decision is done at run time, we need
8872 * update variable part of the offsets
8873 */
8874static struct block *
8875gen_vlan_bpf_extensions(compiler_state_t *cstate, bpf_u_int32 vlan_num,
8876    int has_vlan_tag)
8877{
8878        struct block *b0, *b_tpid, *b_vid = NULL;
8879        struct slist *s;
8880
8881        /* generate new filter code based on extracting packet
8882         * metadata */
8883        s = new_stmt(cstate, BPF_LD|BPF_B|BPF_ABS);
8884        s->s.k = SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT;
8885
8886        b0 = new_block(cstate, JMP(BPF_JEQ));
8887        b0->stmts = s;
8888        b0->s.k = 1;
8889
8890	/*
8891	 * This is tricky. We need to insert the statements updating variable
8892	 * parts of offsets before the the traditional TPID and VID tests so
8893	 * that they are called whenever SKF_AD_VLAN_TAG_PRESENT fails but
8894	 * we do not want this update to affect those checks. That's why we
8895	 * generate both test blocks first and insert the statements updating
8896	 * variable parts of both offsets after that. This wouldn't work if
8897	 * there already were variable length link header when entering this
8898	 * function but gen_vlan_bpf_extensions() isn't called in that case.
8899	 */
8900	b_tpid = gen_vlan_tpid_test(cstate);
8901	if (has_vlan_tag)
8902		b_vid = gen_vlan_vid_test(cstate, vlan_num);
8903
8904	gen_vlan_patch_tpid_test(cstate, b_tpid);
8905	gen_or(b0, b_tpid);
8906	b0 = b_tpid;
8907
8908	if (has_vlan_tag) {
8909		gen_vlan_patch_vid_test(cstate, b_vid);
8910		gen_and(b0, b_vid);
8911		b0 = b_vid;
8912	}
8913
8914        return b0;
8915}
8916#endif
8917
8918/*
8919 * support IEEE 802.1Q VLAN trunk over ethernet
8920 */
8921struct block *
8922gen_vlan(compiler_state_t *cstate, bpf_u_int32 vlan_num, int has_vlan_tag)
8923{
8924	struct	block	*b0;
8925
8926	/*
8927	 * Catch errors reported by us and routines below us, and return NULL
8928	 * on an error.
8929	 */
8930	if (setjmp(cstate->top_ctx))
8931		return (NULL);
8932
8933	/* can't check for VLAN-encapsulated packets inside MPLS */
8934	if (cstate->label_stack_depth > 0)
8935		bpf_error(cstate, "no VLAN match after MPLS");
8936
8937	/*
8938	 * Check for a VLAN packet, and then change the offsets to point
8939	 * to the type and data fields within the VLAN packet.  Just
8940	 * increment the offsets, so that we can support a hierarchy, e.g.
8941	 * "vlan 300 && vlan 200" to capture VLAN 200 encapsulated within
8942	 * VLAN 100.
8943	 *
8944	 * XXX - this is a bit of a kludge.  If we were to split the
8945	 * compiler into a parser that parses an expression and
8946	 * generates an expression tree, and a code generator that
8947	 * takes an expression tree (which could come from our
8948	 * parser or from some other parser) and generates BPF code,
8949	 * we could perhaps make the offsets parameters of routines
8950	 * and, in the handler for an "AND" node, pass to subnodes
8951	 * other than the VLAN node the adjusted offsets.
8952	 *
8953	 * This would mean that "vlan" would, instead of changing the
8954	 * behavior of *all* tests after it, change only the behavior
8955	 * of tests ANDed with it.  That would change the documented
8956	 * semantics of "vlan", which might break some expressions.
8957	 * However, it would mean that "(vlan and ip) or ip" would check
8958	 * both for VLAN-encapsulated IP and IP-over-Ethernet, rather than
8959	 * checking only for VLAN-encapsulated IP, so that could still
8960	 * be considered worth doing; it wouldn't break expressions
8961	 * that are of the form "vlan and ..." or "vlan N and ...",
8962	 * which I suspect are the most common expressions involving
8963	 * "vlan".  "vlan or ..." doesn't necessarily do what the user
8964	 * would really want, now, as all the "or ..." tests would
8965	 * be done assuming a VLAN, even though the "or" could be viewed
8966	 * as meaning "or, if this isn't a VLAN packet...".
8967	 */
8968	switch (cstate->linktype) {
8969
8970	case DLT_EN10MB:
8971	case DLT_NETANALYZER:
8972	case DLT_NETANALYZER_TRANSPARENT:
8973#if defined(SKF_AD_VLAN_TAG_PRESENT)
8974		/* Verify that this is the outer part of the packet and
8975		 * not encapsulated somehow. */
8976		if (cstate->vlan_stack_depth == 0 && !cstate->off_linkhdr.is_variable &&
8977		    cstate->off_linkhdr.constant_part ==
8978		    cstate->off_outermostlinkhdr.constant_part) {
8979			/*
8980			 * Do we need special VLAN handling?
8981			 */
8982			if (cstate->bpf_pcap->bpf_codegen_flags & BPF_SPECIAL_VLAN_HANDLING)
8983				b0 = gen_vlan_bpf_extensions(cstate, vlan_num,
8984				    has_vlan_tag);
8985			else
8986				b0 = gen_vlan_no_bpf_extensions(cstate,
8987				    vlan_num, has_vlan_tag);
8988		} else
8989#endif
8990			b0 = gen_vlan_no_bpf_extensions(cstate, vlan_num,
8991			    has_vlan_tag);
8992                break;
8993
8994	case DLT_IEEE802_11:
8995	case DLT_PRISM_HEADER:
8996	case DLT_IEEE802_11_RADIO_AVS:
8997	case DLT_IEEE802_11_RADIO:
8998		b0 = gen_vlan_no_bpf_extensions(cstate, vlan_num, has_vlan_tag);
8999		break;
9000
9001	default:
9002		bpf_error(cstate, "no VLAN support for %s",
9003		      pcap_datalink_val_to_description_or_dlt(cstate->linktype));
9004		/*NOTREACHED*/
9005	}
9006
9007        cstate->vlan_stack_depth++;
9008
9009	return (b0);
9010}
9011
9012/*
9013 * support for MPLS
9014 *
9015 * The label_num_arg dance is to avoid annoying whining by compilers that
9016 * label_num might be clobbered by longjmp - yeah, it might, but *WHO CARES*?
9017 * It's not *used* after setjmp returns.
9018 */
9019struct block *
9020gen_mpls(compiler_state_t *cstate, bpf_u_int32 label_num_arg,
9021    int has_label_num)
9022{
9023	volatile bpf_u_int32 label_num = label_num_arg;
9024	struct	block	*b0, *b1;
9025
9026	/*
9027	 * Catch errors reported by us and routines below us, and return NULL
9028	 * on an error.
9029	 */
9030	if (setjmp(cstate->top_ctx))
9031		return (NULL);
9032
9033        if (cstate->label_stack_depth > 0) {
9034            /* just match the bottom-of-stack bit clear */
9035            b0 = gen_mcmp(cstate, OR_PREVMPLSHDR, 2, BPF_B, 0, 0x01);
9036        } else {
9037            /*
9038             * We're not in an MPLS stack yet, so check the link-layer
9039             * type against MPLS.
9040             */
9041            switch (cstate->linktype) {
9042
9043            case DLT_C_HDLC: /* fall through */
9044            case DLT_EN10MB:
9045            case DLT_NETANALYZER:
9046            case DLT_NETANALYZER_TRANSPARENT:
9047                    b0 = gen_linktype(cstate, ETHERTYPE_MPLS);
9048                    break;
9049
9050            case DLT_PPP:
9051                    b0 = gen_linktype(cstate, PPP_MPLS_UCAST);
9052                    break;
9053
9054                    /* FIXME add other DLT_s ...
9055                     * for Frame-Relay/and ATM this may get messy due to SNAP headers
9056                     * leave it for now */
9057
9058            default:
9059                    bpf_error(cstate, "no MPLS support for %s",
9060                          pcap_datalink_val_to_description_or_dlt(cstate->linktype));
9061                    /*NOTREACHED*/
9062            }
9063        }
9064
9065	/* If a specific MPLS label is requested, check it */
9066	if (has_label_num) {
9067		if (label_num > 0xFFFFF) {
9068			bpf_error(cstate, "MPLS label %u greater than maximum %u",
9069			    label_num, 0xFFFFF);
9070		}
9071		label_num = label_num << 12; /* label is shifted 12 bits on the wire */
9072		b1 = gen_mcmp(cstate, OR_LINKPL, 0, BPF_W, (bpf_int32)label_num,
9073		    0xfffff000); /* only compare the first 20 bits */
9074		gen_and(b0, b1);
9075		b0 = b1;
9076	}
9077
9078        /*
9079         * Change the offsets to point to the type and data fields within
9080         * the MPLS packet.  Just increment the offsets, so that we
9081         * can support a hierarchy, e.g. "mpls 100000 && mpls 1024" to
9082         * capture packets with an outer label of 100000 and an inner
9083         * label of 1024.
9084         *
9085         * Increment the MPLS stack depth as well; this indicates that
9086         * we're checking MPLS-encapsulated headers, to make sure higher
9087         * level code generators don't try to match against IP-related
9088         * protocols such as Q_ARP, Q_RARP etc.
9089         *
9090         * XXX - this is a bit of a kludge.  See comments in gen_vlan().
9091         */
9092        cstate->off_nl_nosnap += 4;
9093        cstate->off_nl += 4;
9094        cstate->label_stack_depth++;
9095	return (b0);
9096}
9097
9098/*
9099 * Support PPPOE discovery and session.
9100 */
9101struct block *
9102gen_pppoed(compiler_state_t *cstate)
9103{
9104	/*
9105	 * Catch errors reported by us and routines below us, and return NULL
9106	 * on an error.
9107	 */
9108	if (setjmp(cstate->top_ctx))
9109		return (NULL);
9110
9111	/* check for PPPoE discovery */
9112	return gen_linktype(cstate, (bpf_int32)ETHERTYPE_PPPOED);
9113}
9114
9115struct block *
9116gen_pppoes(compiler_state_t *cstate, bpf_u_int32 sess_num, int has_sess_num)
9117{
9118	struct block *b0, *b1;
9119
9120	/*
9121	 * Catch errors reported by us and routines below us, and return NULL
9122	 * on an error.
9123	 */
9124	if (setjmp(cstate->top_ctx))
9125		return (NULL);
9126
9127	/*
9128	 * Test against the PPPoE session link-layer type.
9129	 */
9130	b0 = gen_linktype(cstate, (bpf_int32)ETHERTYPE_PPPOES);
9131
9132	/* If a specific session is requested, check PPPoE session id */
9133	if (has_sess_num) {
9134		if (sess_num > 0x0000ffff) {
9135			bpf_error(cstate, "PPPoE session number %u greater than maximum %u",
9136			    sess_num, 0x0000ffff);
9137		}
9138		b1 = gen_mcmp(cstate, OR_LINKPL, 0, BPF_W,
9139		    (bpf_int32)sess_num, 0x0000ffff);
9140		gen_and(b0, b1);
9141		b0 = b1;
9142	}
9143
9144	/*
9145	 * Change the offsets to point to the type and data fields within
9146	 * the PPP packet, and note that this is PPPoE rather than
9147	 * raw PPP.
9148	 *
9149	 * XXX - this is a bit of a kludge.  See the comments in
9150	 * gen_vlan().
9151	 *
9152	 * The "network-layer" protocol is PPPoE, which has a 6-byte
9153	 * PPPoE header, followed by a PPP packet.
9154	 *
9155	 * There is no HDLC encapsulation for the PPP packet (it's
9156	 * encapsulated in PPPoES instead), so the link-layer type
9157	 * starts at the first byte of the PPP packet.  For PPPoE,
9158	 * that offset is relative to the beginning of the total
9159	 * link-layer payload, including any 802.2 LLC header, so
9160	 * it's 6 bytes past cstate->off_nl.
9161	 */
9162	PUSH_LINKHDR(cstate, DLT_PPP, cstate->off_linkpl.is_variable,
9163	    cstate->off_linkpl.constant_part + cstate->off_nl + 6, /* 6 bytes past the PPPoE header */
9164	    cstate->off_linkpl.reg);
9165
9166	cstate->off_linktype = cstate->off_linkhdr;
9167	cstate->off_linkpl.constant_part = cstate->off_linkhdr.constant_part + 2;
9168
9169	cstate->off_nl = 0;
9170	cstate->off_nl_nosnap = 0;	/* no 802.2 LLC */
9171
9172	return b0;
9173}
9174
9175/* Check that this is Geneve and the VNI is correct if
9176 * specified. Parameterized to handle both IPv4 and IPv6. */
9177static struct block *
9178gen_geneve_check(compiler_state_t *cstate,
9179    struct block *(*gen_portfn)(compiler_state_t *, int, int, int),
9180    enum e_offrel offrel, bpf_u_int32 vni, int has_vni)
9181{
9182	struct block *b0, *b1;
9183
9184	b0 = gen_portfn(cstate, GENEVE_PORT, IPPROTO_UDP, Q_DST);
9185
9186	/* Check that we are operating on version 0. Otherwise, we
9187	 * can't decode the rest of the fields. The version is 2 bits
9188	 * in the first byte of the Geneve header. */
9189	b1 = gen_mcmp(cstate, offrel, 8, BPF_B, (bpf_int32)0, 0xc0);
9190	gen_and(b0, b1);
9191	b0 = b1;
9192
9193	if (has_vni) {
9194		if (vni > 0xffffff) {
9195			bpf_error(cstate, "Geneve VNI %u greater than maximum %u",
9196			    vni, 0xffffff);
9197		}
9198		vni <<= 8; /* VNI is in the upper 3 bytes */
9199		b1 = gen_mcmp(cstate, offrel, 12, BPF_W, (bpf_int32)vni,
9200			      0xffffff00);
9201		gen_and(b0, b1);
9202		b0 = b1;
9203	}
9204
9205	return b0;
9206}
9207
9208/* The IPv4 and IPv6 Geneve checks need to do two things:
9209 * - Verify that this actually is Geneve with the right VNI.
9210 * - Place the IP header length (plus variable link prefix if
9211 *   needed) into register A to be used later to compute
9212 *   the inner packet offsets. */
9213static struct block *
9214gen_geneve4(compiler_state_t *cstate, bpf_u_int32 vni, int has_vni)
9215{
9216	struct block *b0, *b1;
9217	struct slist *s, *s1;
9218
9219	b0 = gen_geneve_check(cstate, gen_port, OR_TRAN_IPV4, vni, has_vni);
9220
9221	/* Load the IP header length into A. */
9222	s = gen_loadx_iphdrlen(cstate);
9223
9224	s1 = new_stmt(cstate, BPF_MISC|BPF_TXA);
9225	sappend(s, s1);
9226
9227	/* Forcibly append these statements to the true condition
9228	 * of the protocol check by creating a new block that is
9229	 * always true and ANDing them. */
9230	b1 = new_block(cstate, BPF_JMP|BPF_JEQ|BPF_X);
9231	b1->stmts = s;
9232	b1->s.k = 0;
9233
9234	gen_and(b0, b1);
9235
9236	return b1;
9237}
9238
9239static struct block *
9240gen_geneve6(compiler_state_t *cstate, bpf_u_int32 vni, int has_vni)
9241{
9242	struct block *b0, *b1;
9243	struct slist *s, *s1;
9244
9245	b0 = gen_geneve_check(cstate, gen_port6, OR_TRAN_IPV6, vni, has_vni);
9246
9247	/* Load the IP header length. We need to account for a
9248	 * variable length link prefix if there is one. */
9249	s = gen_abs_offset_varpart(cstate, &cstate->off_linkpl);
9250	if (s) {
9251		s1 = new_stmt(cstate, BPF_LD|BPF_IMM);
9252		s1->s.k = 40;
9253		sappend(s, s1);
9254
9255		s1 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_X);
9256		s1->s.k = 0;
9257		sappend(s, s1);
9258	} else {
9259		s = new_stmt(cstate, BPF_LD|BPF_IMM);
9260		s->s.k = 40;
9261	}
9262
9263	/* Forcibly append these statements to the true condition
9264	 * of the protocol check by creating a new block that is
9265	 * always true and ANDing them. */
9266	s1 = new_stmt(cstate, BPF_MISC|BPF_TAX);
9267	sappend(s, s1);
9268
9269	b1 = new_block(cstate, BPF_JMP|BPF_JEQ|BPF_X);
9270	b1->stmts = s;
9271	b1->s.k = 0;
9272
9273	gen_and(b0, b1);
9274
9275	return b1;
9276}
9277
9278/* We need to store three values based on the Geneve header::
9279 * - The offset of the linktype.
9280 * - The offset of the end of the Geneve header.
9281 * - The offset of the end of the encapsulated MAC header. */
9282static struct slist *
9283gen_geneve_offsets(compiler_state_t *cstate)
9284{
9285	struct slist *s, *s1, *s_proto;
9286
9287	/* First we need to calculate the offset of the Geneve header
9288	 * itself. This is composed of the IP header previously calculated
9289	 * (include any variable link prefix) and stored in A plus the
9290	 * fixed sized headers (fixed link prefix, MAC length, and UDP
9291	 * header). */
9292	s = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
9293	s->s.k = cstate->off_linkpl.constant_part + cstate->off_nl + 8;
9294
9295	/* Stash this in X since we'll need it later. */
9296	s1 = new_stmt(cstate, BPF_MISC|BPF_TAX);
9297	sappend(s, s1);
9298
9299	/* The EtherType in Geneve is 2 bytes in. Calculate this and
9300	 * store it. */
9301	s1 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
9302	s1->s.k = 2;
9303	sappend(s, s1);
9304
9305	cstate->off_linktype.reg = alloc_reg(cstate);
9306	cstate->off_linktype.is_variable = 1;
9307	cstate->off_linktype.constant_part = 0;
9308
9309	s1 = new_stmt(cstate, BPF_ST);
9310	s1->s.k = cstate->off_linktype.reg;
9311	sappend(s, s1);
9312
9313	/* Load the Geneve option length and mask and shift to get the
9314	 * number of bytes. It is stored in the first byte of the Geneve
9315	 * header. */
9316	s1 = new_stmt(cstate, BPF_LD|BPF_IND|BPF_B);
9317	s1->s.k = 0;
9318	sappend(s, s1);
9319
9320	s1 = new_stmt(cstate, BPF_ALU|BPF_AND|BPF_K);
9321	s1->s.k = 0x3f;
9322	sappend(s, s1);
9323
9324	s1 = new_stmt(cstate, BPF_ALU|BPF_MUL|BPF_K);
9325	s1->s.k = 4;
9326	sappend(s, s1);
9327
9328	/* Add in the rest of the Geneve base header. */
9329	s1 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
9330	s1->s.k = 8;
9331	sappend(s, s1);
9332
9333	/* Add the Geneve header length to its offset and store. */
9334	s1 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_X);
9335	s1->s.k = 0;
9336	sappend(s, s1);
9337
9338	/* Set the encapsulated type as Ethernet. Even though we may
9339	 * not actually have Ethernet inside there are two reasons this
9340	 * is useful:
9341	 * - The linktype field is always in EtherType format regardless
9342	 *   of whether it is in Geneve or an inner Ethernet frame.
9343	 * - The only link layer that we have specific support for is
9344	 *   Ethernet. We will confirm that the packet actually is
9345	 *   Ethernet at runtime before executing these checks. */
9346	PUSH_LINKHDR(cstate, DLT_EN10MB, 1, 0, alloc_reg(cstate));
9347
9348	s1 = new_stmt(cstate, BPF_ST);
9349	s1->s.k = cstate->off_linkhdr.reg;
9350	sappend(s, s1);
9351
9352	/* Calculate whether we have an Ethernet header or just raw IP/
9353	 * MPLS/etc. If we have Ethernet, advance the end of the MAC offset
9354	 * and linktype by 14 bytes so that the network header can be found
9355	 * seamlessly. Otherwise, keep what we've calculated already. */
9356
9357	/* We have a bare jmp so we can't use the optimizer. */
9358	cstate->no_optimize = 1;
9359
9360	/* Load the EtherType in the Geneve header, 2 bytes in. */
9361	s1 = new_stmt(cstate, BPF_LD|BPF_IND|BPF_H);
9362	s1->s.k = 2;
9363	sappend(s, s1);
9364
9365	/* Load X with the end of the Geneve header. */
9366	s1 = new_stmt(cstate, BPF_LDX|BPF_MEM);
9367	s1->s.k = cstate->off_linkhdr.reg;
9368	sappend(s, s1);
9369
9370	/* Check if the EtherType is Transparent Ethernet Bridging. At the
9371	 * end of this check, we should have the total length in X. In
9372	 * the non-Ethernet case, it's already there. */
9373	s_proto = new_stmt(cstate, JMP(BPF_JEQ));
9374	s_proto->s.k = ETHERTYPE_TEB;
9375	sappend(s, s_proto);
9376
9377	s1 = new_stmt(cstate, BPF_MISC|BPF_TXA);
9378	sappend(s, s1);
9379	s_proto->s.jt = s1;
9380
9381	/* Since this is Ethernet, use the EtherType of the payload
9382	 * directly as the linktype. Overwrite what we already have. */
9383	s1 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
9384	s1->s.k = 12;
9385	sappend(s, s1);
9386
9387	s1 = new_stmt(cstate, BPF_ST);
9388	s1->s.k = cstate->off_linktype.reg;
9389	sappend(s, s1);
9390
9391	/* Advance two bytes further to get the end of the Ethernet
9392	 * header. */
9393	s1 = new_stmt(cstate, BPF_ALU|BPF_ADD|BPF_K);
9394	s1->s.k = 2;
9395	sappend(s, s1);
9396
9397	/* Move the result to X. */
9398	s1 = new_stmt(cstate, BPF_MISC|BPF_TAX);
9399	sappend(s, s1);
9400
9401	/* Store the final result of our linkpl calculation. */
9402	cstate->off_linkpl.reg = alloc_reg(cstate);
9403	cstate->off_linkpl.is_variable = 1;
9404	cstate->off_linkpl.constant_part = 0;
9405
9406	s1 = new_stmt(cstate, BPF_STX);
9407	s1->s.k = cstate->off_linkpl.reg;
9408	sappend(s, s1);
9409	s_proto->s.jf = s1;
9410
9411	cstate->off_nl = 0;
9412
9413	return s;
9414}
9415
9416/* Check to see if this is a Geneve packet. */
9417struct block *
9418gen_geneve(compiler_state_t *cstate, bpf_u_int32 vni, int has_vni)
9419{
9420	struct block *b0, *b1;
9421	struct slist *s;
9422
9423	/*
9424	 * Catch errors reported by us and routines below us, and return NULL
9425	 * on an error.
9426	 */
9427	if (setjmp(cstate->top_ctx))
9428		return (NULL);
9429
9430	b0 = gen_geneve4(cstate, vni, has_vni);
9431	b1 = gen_geneve6(cstate, vni, has_vni);
9432
9433	gen_or(b0, b1);
9434	b0 = b1;
9435
9436	/* Later filters should act on the payload of the Geneve frame,
9437	 * update all of the header pointers. Attach this code so that
9438	 * it gets executed in the event that the Geneve filter matches. */
9439	s = gen_geneve_offsets(cstate);
9440
9441	b1 = gen_true(cstate);
9442	sappend(s, b1->stmts);
9443	b1->stmts = s;
9444
9445	gen_and(b0, b1);
9446
9447	cstate->is_geneve = 1;
9448
9449	return b1;
9450}
9451
9452/* Check that the encapsulated frame has a link layer header
9453 * for Ethernet filters. */
9454static struct block *
9455gen_geneve_ll_check(compiler_state_t *cstate)
9456{
9457	struct block *b0;
9458	struct slist *s, *s1;
9459
9460	/* The easiest way to see if there is a link layer present
9461	 * is to check if the link layer header and payload are not
9462	 * the same. */
9463
9464	/* Geneve always generates pure variable offsets so we can
9465	 * compare only the registers. */
9466	s = new_stmt(cstate, BPF_LD|BPF_MEM);
9467	s->s.k = cstate->off_linkhdr.reg;
9468
9469	s1 = new_stmt(cstate, BPF_LDX|BPF_MEM);
9470	s1->s.k = cstate->off_linkpl.reg;
9471	sappend(s, s1);
9472
9473	b0 = new_block(cstate, BPF_JMP|BPF_JEQ|BPF_X);
9474	b0->stmts = s;
9475	b0->s.k = 0;
9476	gen_not(b0);
9477
9478	return b0;
9479}
9480
9481static struct block *
9482gen_atmfield_code_internal(compiler_state_t *cstate, int atmfield,
9483    bpf_int32 jvalue, bpf_u_int32 jtype, int reverse)
9484{
9485	struct block *b0;
9486
9487	switch (atmfield) {
9488
9489	case A_VPI:
9490		if (!cstate->is_atm)
9491			bpf_error(cstate, "'vpi' supported only on raw ATM");
9492		if (cstate->off_vpi == OFFSET_NOT_SET)
9493			abort();
9494		b0 = gen_ncmp(cstate, OR_LINKHDR, cstate->off_vpi, BPF_B, 0xffffffff, jtype,
9495		    reverse, jvalue);
9496		break;
9497
9498	case A_VCI:
9499		if (!cstate->is_atm)
9500			bpf_error(cstate, "'vci' supported only on raw ATM");
9501		if (cstate->off_vci == OFFSET_NOT_SET)
9502			abort();
9503		b0 = gen_ncmp(cstate, OR_LINKHDR, cstate->off_vci, BPF_H, 0xffffffff, jtype,
9504		    reverse, jvalue);
9505		break;
9506
9507	case A_PROTOTYPE:
9508		if (cstate->off_proto == OFFSET_NOT_SET)
9509			abort();	/* XXX - this isn't on FreeBSD */
9510		b0 = gen_ncmp(cstate, OR_LINKHDR, cstate->off_proto, BPF_B, 0x0f, jtype,
9511		    reverse, jvalue);
9512		break;
9513
9514	case A_MSGTYPE:
9515		if (cstate->off_payload == OFFSET_NOT_SET)
9516			abort();
9517		b0 = gen_ncmp(cstate, OR_LINKHDR, cstate->off_payload + MSG_TYPE_POS, BPF_B,
9518		    0xffffffff, jtype, reverse, jvalue);
9519		break;
9520
9521	case A_CALLREFTYPE:
9522		if (!cstate->is_atm)
9523			bpf_error(cstate, "'callref' supported only on raw ATM");
9524		if (cstate->off_proto == OFFSET_NOT_SET)
9525			abort();
9526		b0 = gen_ncmp(cstate, OR_LINKHDR, cstate->off_proto, BPF_B, 0xffffffff,
9527		    jtype, reverse, jvalue);
9528		break;
9529
9530	default:
9531		abort();
9532	}
9533	return b0;
9534}
9535
9536static struct block *
9537gen_atmtype_metac(compiler_state_t *cstate)
9538{
9539	struct block *b0, *b1;
9540
9541	b0 = gen_atmfield_code_internal(cstate, A_VPI, 0, BPF_JEQ, 0);
9542	b1 = gen_atmfield_code_internal(cstate, A_VCI, 1, BPF_JEQ, 0);
9543	gen_and(b0, b1);
9544	return b1;
9545}
9546
9547static struct block *
9548gen_atmtype_sc(compiler_state_t *cstate)
9549{
9550	struct block *b0, *b1;
9551
9552	b0 = gen_atmfield_code_internal(cstate, A_VPI, 0, BPF_JEQ, 0);
9553	b1 = gen_atmfield_code_internal(cstate, A_VCI, 5, BPF_JEQ, 0);
9554	gen_and(b0, b1);
9555	return b1;
9556}
9557
9558static struct block *
9559gen_atmtype_llc(compiler_state_t *cstate)
9560{
9561	struct block *b0;
9562
9563	b0 = gen_atmfield_code_internal(cstate, A_PROTOTYPE, PT_LLC, BPF_JEQ, 0);
9564	cstate->linktype = cstate->prevlinktype;
9565	return b0;
9566}
9567
9568struct block *
9569gen_atmfield_code(compiler_state_t *cstate, int atmfield,
9570    bpf_int32 jvalue, bpf_u_int32 jtype, int reverse)
9571{
9572	/*
9573	 * Catch errors reported by us and routines below us, and return NULL
9574	 * on an error.
9575	 */
9576	if (setjmp(cstate->top_ctx))
9577		return (NULL);
9578
9579	return gen_atmfield_code_internal(cstate, atmfield, jvalue, jtype,
9580	    reverse);
9581}
9582
9583struct block *
9584gen_atmtype_abbrev(compiler_state_t *cstate, int type)
9585{
9586	struct block *b0, *b1;
9587
9588	/*
9589	 * Catch errors reported by us and routines below us, and return NULL
9590	 * on an error.
9591	 */
9592	if (setjmp(cstate->top_ctx))
9593		return (NULL);
9594
9595	switch (type) {
9596
9597	case A_METAC:
9598		/* Get all packets in Meta signalling Circuit */
9599		if (!cstate->is_atm)
9600			bpf_error(cstate, "'metac' supported only on raw ATM");
9601		b1 = gen_atmtype_metac(cstate);
9602		break;
9603
9604	case A_BCC:
9605		/* Get all packets in Broadcast Circuit*/
9606		if (!cstate->is_atm)
9607			bpf_error(cstate, "'bcc' supported only on raw ATM");
9608		b0 = gen_atmfield_code_internal(cstate, A_VPI, 0, BPF_JEQ, 0);
9609		b1 = gen_atmfield_code_internal(cstate, A_VCI, 2, BPF_JEQ, 0);
9610		gen_and(b0, b1);
9611		break;
9612
9613	case A_OAMF4SC:
9614		/* Get all cells in Segment OAM F4 circuit*/
9615		if (!cstate->is_atm)
9616			bpf_error(cstate, "'oam4sc' supported only on raw ATM");
9617		b0 = gen_atmfield_code_internal(cstate, A_VPI, 0, BPF_JEQ, 0);
9618		b1 = gen_atmfield_code_internal(cstate, A_VCI, 3, BPF_JEQ, 0);
9619		gen_and(b0, b1);
9620		break;
9621
9622	case A_OAMF4EC:
9623		/* Get all cells in End-to-End OAM F4 Circuit*/
9624		if (!cstate->is_atm)
9625			bpf_error(cstate, "'oam4ec' supported only on raw ATM");
9626		b0 = gen_atmfield_code_internal(cstate, A_VPI, 0, BPF_JEQ, 0);
9627		b1 = gen_atmfield_code_internal(cstate, A_VCI, 4, BPF_JEQ, 0);
9628		gen_and(b0, b1);
9629		break;
9630
9631	case A_SC:
9632		/*  Get all packets in connection Signalling Circuit */
9633		if (!cstate->is_atm)
9634			bpf_error(cstate, "'sc' supported only on raw ATM");
9635		b1 = gen_atmtype_sc(cstate);
9636		break;
9637
9638	case A_ILMIC:
9639		/* Get all packets in ILMI Circuit */
9640		if (!cstate->is_atm)
9641			bpf_error(cstate, "'ilmic' supported only on raw ATM");
9642		b0 = gen_atmfield_code_internal(cstate, A_VPI, 0, BPF_JEQ, 0);
9643		b1 = gen_atmfield_code_internal(cstate, A_VCI, 16, BPF_JEQ, 0);
9644		gen_and(b0, b1);
9645		break;
9646
9647	case A_LANE:
9648		/* Get all LANE packets */
9649		if (!cstate->is_atm)
9650			bpf_error(cstate, "'lane' supported only on raw ATM");
9651		b1 = gen_atmfield_code_internal(cstate, A_PROTOTYPE, PT_LANE, BPF_JEQ, 0);
9652
9653		/*
9654		 * Arrange that all subsequent tests assume LANE
9655		 * rather than LLC-encapsulated packets, and set
9656		 * the offsets appropriately for LANE-encapsulated
9657		 * Ethernet.
9658		 *
9659		 * We assume LANE means Ethernet, not Token Ring.
9660		 */
9661		PUSH_LINKHDR(cstate, DLT_EN10MB, 0,
9662		    cstate->off_payload + 2,	/* Ethernet header */
9663		    -1);
9664		cstate->off_linktype.constant_part = cstate->off_linkhdr.constant_part + 12;
9665		cstate->off_linkpl.constant_part = cstate->off_linkhdr.constant_part + 14;	/* Ethernet */
9666		cstate->off_nl = 0;			/* Ethernet II */
9667		cstate->off_nl_nosnap = 3;		/* 802.3+802.2 */
9668		break;
9669
9670	case A_LLC:
9671		/* Get all LLC-encapsulated packets */
9672		if (!cstate->is_atm)
9673			bpf_error(cstate, "'llc' supported only on raw ATM");
9674		b1 = gen_atmtype_llc(cstate);
9675		break;
9676
9677	default:
9678		abort();
9679	}
9680	return b1;
9681}
9682
9683/*
9684 * Filtering for MTP2 messages based on li value
9685 * FISU, length is null
9686 * LSSU, length is 1 or 2
9687 * MSU, length is 3 or more
9688 * For MTP2_HSL, sequences are on 2 bytes, and length on 9 bits
9689 */
9690struct block *
9691gen_mtp2type_abbrev(compiler_state_t *cstate, int type)
9692{
9693	struct block *b0, *b1;
9694
9695	/*
9696	 * Catch errors reported by us and routines below us, and return NULL
9697	 * on an error.
9698	 */
9699	if (setjmp(cstate->top_ctx))
9700		return (NULL);
9701
9702	switch (type) {
9703
9704	case M_FISU:
9705		if ( (cstate->linktype != DLT_MTP2) &&
9706		     (cstate->linktype != DLT_ERF) &&
9707		     (cstate->linktype != DLT_MTP2_WITH_PHDR) )
9708			bpf_error(cstate, "'fisu' supported only on MTP2");
9709		/* gen_ncmp(cstate, offrel, offset, size, mask, jtype, reverse, value) */
9710		b0 = gen_ncmp(cstate, OR_PACKET, cstate->off_li, BPF_B, 0x3f, BPF_JEQ, 0, 0);
9711		break;
9712
9713	case M_LSSU:
9714		if ( (cstate->linktype != DLT_MTP2) &&
9715		     (cstate->linktype != DLT_ERF) &&
9716		     (cstate->linktype != DLT_MTP2_WITH_PHDR) )
9717			bpf_error(cstate, "'lssu' supported only on MTP2");
9718		b0 = gen_ncmp(cstate, OR_PACKET, cstate->off_li, BPF_B, 0x3f, BPF_JGT, 1, 2);
9719		b1 = gen_ncmp(cstate, OR_PACKET, cstate->off_li, BPF_B, 0x3f, BPF_JGT, 0, 0);
9720		gen_and(b1, b0);
9721		break;
9722
9723	case M_MSU:
9724		if ( (cstate->linktype != DLT_MTP2) &&
9725		     (cstate->linktype != DLT_ERF) &&
9726		     (cstate->linktype != DLT_MTP2_WITH_PHDR) )
9727			bpf_error(cstate, "'msu' supported only on MTP2");
9728		b0 = gen_ncmp(cstate, OR_PACKET, cstate->off_li, BPF_B, 0x3f, BPF_JGT, 0, 2);
9729		break;
9730
9731	case MH_FISU:
9732		if ( (cstate->linktype != DLT_MTP2) &&
9733		     (cstate->linktype != DLT_ERF) &&
9734		     (cstate->linktype != DLT_MTP2_WITH_PHDR) )
9735			bpf_error(cstate, "'hfisu' supported only on MTP2_HSL");
9736		/* gen_ncmp(cstate, offrel, offset, size, mask, jtype, reverse, value) */
9737		b0 = gen_ncmp(cstate, OR_PACKET, cstate->off_li_hsl, BPF_H, 0xff80, BPF_JEQ, 0, 0);
9738		break;
9739
9740	case MH_LSSU:
9741		if ( (cstate->linktype != DLT_MTP2) &&
9742		     (cstate->linktype != DLT_ERF) &&
9743		     (cstate->linktype != DLT_MTP2_WITH_PHDR) )
9744			bpf_error(cstate, "'hlssu' supported only on MTP2_HSL");
9745		b0 = gen_ncmp(cstate, OR_PACKET, cstate->off_li_hsl, BPF_H, 0xff80, BPF_JGT, 1, 0x0100);
9746		b1 = gen_ncmp(cstate, OR_PACKET, cstate->off_li_hsl, BPF_H, 0xff80, BPF_JGT, 0, 0);
9747		gen_and(b1, b0);
9748		break;
9749
9750	case MH_MSU:
9751		if ( (cstate->linktype != DLT_MTP2) &&
9752		     (cstate->linktype != DLT_ERF) &&
9753		     (cstate->linktype != DLT_MTP2_WITH_PHDR) )
9754			bpf_error(cstate, "'hmsu' supported only on MTP2_HSL");
9755		b0 = gen_ncmp(cstate, OR_PACKET, cstate->off_li_hsl, BPF_H, 0xff80, BPF_JGT, 0, 0x0100);
9756		break;
9757
9758	default:
9759		abort();
9760	}
9761	return b0;
9762}
9763
9764/*
9765 * The jvalue_arg dance is to avoid annoying whining by compilers that
9766 * jvalue might be clobbered by longjmp - yeah, it might, but *WHO CARES*?
9767 * It's not *used* after setjmp returns.
9768 */
9769struct block *
9770gen_mtp3field_code(compiler_state_t *cstate, int mtp3field,
9771    bpf_u_int32 jvalue_arg, bpf_u_int32 jtype, int reverse)
9772{
9773	volatile bpf_u_int32 jvalue = jvalue_arg;
9774	struct block *b0;
9775	bpf_u_int32 val1 , val2 , val3;
9776	u_int newoff_sio;
9777	u_int newoff_opc;
9778	u_int newoff_dpc;
9779	u_int newoff_sls;
9780
9781	/*
9782	 * Catch errors reported by us and routines below us, and return NULL
9783	 * on an error.
9784	 */
9785	if (setjmp(cstate->top_ctx))
9786		return (NULL);
9787
9788	newoff_sio = cstate->off_sio;
9789	newoff_opc = cstate->off_opc;
9790	newoff_dpc = cstate->off_dpc;
9791	newoff_sls = cstate->off_sls;
9792	switch (mtp3field) {
9793
9794	case MH_SIO:
9795		newoff_sio += 3; /* offset for MTP2_HSL */
9796		/* FALLTHROUGH */
9797
9798	case M_SIO:
9799		if (cstate->off_sio == OFFSET_NOT_SET)
9800			bpf_error(cstate, "'sio' supported only on SS7");
9801		/* sio coded on 1 byte so max value 255 */
9802		if(jvalue > 255)
9803		        bpf_error(cstate, "sio value %u too big; max value = 255",
9804		            jvalue);
9805		b0 = gen_ncmp(cstate, OR_PACKET, newoff_sio, BPF_B, 0xffffffff,
9806		    (u_int)jtype, reverse, (u_int)jvalue);
9807		break;
9808
9809	case MH_OPC:
9810		newoff_opc += 3;
9811
9812		/* FALLTHROUGH */
9813        case M_OPC:
9814	        if (cstate->off_opc == OFFSET_NOT_SET)
9815			bpf_error(cstate, "'opc' supported only on SS7");
9816		/* opc coded on 14 bits so max value 16383 */
9817		if (jvalue > 16383)
9818		        bpf_error(cstate, "opc value %u too big; max value = 16383",
9819		            jvalue);
9820		/* the following instructions are made to convert jvalue
9821		 * to the form used to write opc in an ss7 message*/
9822		val1 = jvalue & 0x00003c00;
9823		val1 = val1 >>10;
9824		val2 = jvalue & 0x000003fc;
9825		val2 = val2 <<6;
9826		val3 = jvalue & 0x00000003;
9827		val3 = val3 <<22;
9828		jvalue = val1 + val2 + val3;
9829		b0 = gen_ncmp(cstate, OR_PACKET, newoff_opc, BPF_W, 0x00c0ff0f,
9830		    (u_int)jtype, reverse, (u_int)jvalue);
9831		break;
9832
9833	case MH_DPC:
9834		newoff_dpc += 3;
9835		/* FALLTHROUGH */
9836
9837	case M_DPC:
9838	        if (cstate->off_dpc == OFFSET_NOT_SET)
9839			bpf_error(cstate, "'dpc' supported only on SS7");
9840		/* dpc coded on 14 bits so max value 16383 */
9841		if (jvalue > 16383)
9842		        bpf_error(cstate, "dpc value %u too big; max value = 16383",
9843		            jvalue);
9844		/* the following instructions are made to convert jvalue
9845		 * to the forme used to write dpc in an ss7 message*/
9846		val1 = jvalue & 0x000000ff;
9847		val1 = val1 << 24;
9848		val2 = jvalue & 0x00003f00;
9849		val2 = val2 << 8;
9850		jvalue = val1 + val2;
9851		b0 = gen_ncmp(cstate, OR_PACKET, newoff_dpc, BPF_W, 0xff3f0000,
9852		    (u_int)jtype, reverse, (u_int)jvalue);
9853		break;
9854
9855	case MH_SLS:
9856		newoff_sls += 3;
9857		/* FALLTHROUGH */
9858
9859	case M_SLS:
9860	        if (cstate->off_sls == OFFSET_NOT_SET)
9861			bpf_error(cstate, "'sls' supported only on SS7");
9862		/* sls coded on 4 bits so max value 15 */
9863		if (jvalue > 15)
9864		         bpf_error(cstate, "sls value %u too big; max value = 15",
9865		             jvalue);
9866		/* the following instruction is made to convert jvalue
9867		 * to the forme used to write sls in an ss7 message*/
9868		jvalue = jvalue << 4;
9869		b0 = gen_ncmp(cstate, OR_PACKET, newoff_sls, BPF_B, 0xf0,
9870		    (u_int)jtype,reverse, (u_int)jvalue);
9871		break;
9872
9873	default:
9874		abort();
9875	}
9876	return b0;
9877}
9878
9879static struct block *
9880gen_msg_abbrev(compiler_state_t *cstate, int type)
9881{
9882	struct block *b1;
9883
9884	/*
9885	 * Q.2931 signalling protocol messages for handling virtual circuits
9886	 * establishment and teardown
9887	 */
9888	switch (type) {
9889
9890	case A_SETUP:
9891		b1 = gen_atmfield_code_internal(cstate, A_MSGTYPE, SETUP, BPF_JEQ, 0);
9892		break;
9893
9894	case A_CALLPROCEED:
9895		b1 = gen_atmfield_code_internal(cstate, A_MSGTYPE, CALL_PROCEED, BPF_JEQ, 0);
9896		break;
9897
9898	case A_CONNECT:
9899		b1 = gen_atmfield_code_internal(cstate, A_MSGTYPE, CONNECT, BPF_JEQ, 0);
9900		break;
9901
9902	case A_CONNECTACK:
9903		b1 = gen_atmfield_code_internal(cstate, A_MSGTYPE, CONNECT_ACK, BPF_JEQ, 0);
9904		break;
9905
9906	case A_RELEASE:
9907		b1 = gen_atmfield_code_internal(cstate, A_MSGTYPE, RELEASE, BPF_JEQ, 0);
9908		break;
9909
9910	case A_RELEASE_DONE:
9911		b1 = gen_atmfield_code_internal(cstate, A_MSGTYPE, RELEASE_DONE, BPF_JEQ, 0);
9912		break;
9913
9914	default:
9915		abort();
9916	}
9917	return b1;
9918}
9919
9920struct block *
9921gen_atmmulti_abbrev(compiler_state_t *cstate, int type)
9922{
9923	struct block *b0, *b1;
9924
9925	/*
9926	 * Catch errors reported by us and routines below us, and return NULL
9927	 * on an error.
9928	 */
9929	if (setjmp(cstate->top_ctx))
9930		return (NULL);
9931
9932	switch (type) {
9933
9934	case A_OAM:
9935		if (!cstate->is_atm)
9936			bpf_error(cstate, "'oam' supported only on raw ATM");
9937		/* OAM F4 type */
9938		b0 = gen_atmfield_code_internal(cstate, A_VCI, 3, BPF_JEQ, 0);
9939		b1 = gen_atmfield_code_internal(cstate, A_VCI, 4, BPF_JEQ, 0);
9940		gen_or(b0, b1);
9941		b0 = gen_atmfield_code_internal(cstate, A_VPI, 0, BPF_JEQ, 0);
9942		gen_and(b0, b1);
9943		break;
9944
9945	case A_OAMF4:
9946		if (!cstate->is_atm)
9947			bpf_error(cstate, "'oamf4' supported only on raw ATM");
9948		/* OAM F4 type */
9949		b0 = gen_atmfield_code_internal(cstate, A_VCI, 3, BPF_JEQ, 0);
9950		b1 = gen_atmfield_code_internal(cstate, A_VCI, 4, BPF_JEQ, 0);
9951		gen_or(b0, b1);
9952		b0 = gen_atmfield_code_internal(cstate, A_VPI, 0, BPF_JEQ, 0);
9953		gen_and(b0, b1);
9954		break;
9955
9956	case A_CONNECTMSG:
9957		/*
9958		 * Get Q.2931 signalling messages for switched
9959		 * virtual connection
9960		 */
9961		if (!cstate->is_atm)
9962			bpf_error(cstate, "'connectmsg' supported only on raw ATM");
9963		b0 = gen_msg_abbrev(cstate, A_SETUP);
9964		b1 = gen_msg_abbrev(cstate, A_CALLPROCEED);
9965		gen_or(b0, b1);
9966		b0 = gen_msg_abbrev(cstate, A_CONNECT);
9967		gen_or(b0, b1);
9968		b0 = gen_msg_abbrev(cstate, A_CONNECTACK);
9969		gen_or(b0, b1);
9970		b0 = gen_msg_abbrev(cstate, A_RELEASE);
9971		gen_or(b0, b1);
9972		b0 = gen_msg_abbrev(cstate, A_RELEASE_DONE);
9973		gen_or(b0, b1);
9974		b0 = gen_atmtype_sc(cstate);
9975		gen_and(b0, b1);
9976		break;
9977
9978	case A_METACONNECT:
9979		if (!cstate->is_atm)
9980			bpf_error(cstate, "'metaconnect' supported only on raw ATM");
9981		b0 = gen_msg_abbrev(cstate, A_SETUP);
9982		b1 = gen_msg_abbrev(cstate, A_CALLPROCEED);
9983		gen_or(b0, b1);
9984		b0 = gen_msg_abbrev(cstate, A_CONNECT);
9985		gen_or(b0, b1);
9986		b0 = gen_msg_abbrev(cstate, A_RELEASE);
9987		gen_or(b0, b1);
9988		b0 = gen_msg_abbrev(cstate, A_RELEASE_DONE);
9989		gen_or(b0, b1);
9990		b0 = gen_atmtype_metac(cstate);
9991		gen_and(b0, b1);
9992		break;
9993
9994	default:
9995		abort();
9996	}
9997	return b1;
9998}
9999