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