18cf6c252SPaul Traina /* 28cf6c252SPaul Traina * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996 38cf6c252SPaul Traina * The Regents of the University of California. All rights reserved. 48cf6c252SPaul Traina * 58cf6c252SPaul Traina * Redistribution and use in source and binary forms, with or without 68cf6c252SPaul Traina * modification, are permitted provided that: (1) source code distributions 78cf6c252SPaul Traina * retain the above copyright notice and this paragraph in its entirety, (2) 88cf6c252SPaul Traina * distributions including binary code include the above copyright notice and 98cf6c252SPaul Traina * this paragraph in its entirety in the documentation or other materials 108cf6c252SPaul Traina * provided with the distribution, and (3) all advertising materials mentioning 118cf6c252SPaul Traina * features or use of this software display the following acknowledgement: 128cf6c252SPaul Traina * ``This product includes software developed by the University of California, 138cf6c252SPaul Traina * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 148cf6c252SPaul Traina * the University nor the names of its contributors may be used to endorse 158cf6c252SPaul Traina * or promote products derived from this software without specific prior 168cf6c252SPaul Traina * written permission. 178cf6c252SPaul Traina * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 188cf6c252SPaul Traina * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 198cf6c252SPaul Traina * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20eb9f0330SBruce M Simpson */ 21eb9f0330SBruce M Simpson 22eb9f0330SBruce M Simpson /* 23eb9f0330SBruce M Simpson * ATM support: 24eb9f0330SBruce M Simpson * 25eb9f0330SBruce M Simpson * Copyright (c) 1997 Yen Yen Lim and North Dakota State University 26eb9f0330SBruce M Simpson * All rights reserved. 27eb9f0330SBruce M Simpson * 28eb9f0330SBruce M Simpson * Redistribution and use in source and binary forms, with or without 29eb9f0330SBruce M Simpson * modification, are permitted provided that the following conditions 30eb9f0330SBruce M Simpson * are met: 31eb9f0330SBruce M Simpson * 1. Redistributions of source code must retain the above copyright 32eb9f0330SBruce M Simpson * notice, this list of conditions and the following disclaimer. 33eb9f0330SBruce M Simpson * 2. Redistributions in binary form must reproduce the above copyright 34eb9f0330SBruce M Simpson * notice, this list of conditions and the following disclaimer in the 35eb9f0330SBruce M Simpson * documentation and/or other materials provided with the distribution. 36eb9f0330SBruce M Simpson * 3. All advertising materials mentioning features or use of this software 37eb9f0330SBruce M Simpson * must display the following acknowledgement: 38eb9f0330SBruce M Simpson * This product includes software developed by Yen Yen Lim and 39eb9f0330SBruce M Simpson * North Dakota State University 40eb9f0330SBruce M Simpson * 4. The name of the author may not be used to endorse or promote products 41eb9f0330SBruce M Simpson * derived from this software without specific prior written permission. 42eb9f0330SBruce M Simpson * 43eb9f0330SBruce M Simpson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 44eb9f0330SBruce M Simpson * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 45eb9f0330SBruce M Simpson * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 46eb9f0330SBruce M Simpson * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 47eb9f0330SBruce M Simpson * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 48eb9f0330SBruce M Simpson * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 49eb9f0330SBruce M Simpson * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 50eb9f0330SBruce M Simpson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 51eb9f0330SBruce M Simpson * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 52eb9f0330SBruce M Simpson * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 53eb9f0330SBruce M Simpson * POSSIBILITY OF SUCH DAMAGE. 548cf6c252SPaul Traina */ 558cf6c252SPaul Traina 564238c2cdSSam Leffler #ifndef HAVE___ATTRIBUTE__ 574238c2cdSSam Leffler #define __attribute__(x) 584238c2cdSSam Leffler #endif /* HAVE___ATTRIBUTE__ */ 594238c2cdSSam Leffler 608cf6c252SPaul Traina /* Address qualifiers. */ 618cf6c252SPaul Traina 628cf6c252SPaul Traina #define Q_HOST 1 638cf6c252SPaul Traina #define Q_NET 2 648cf6c252SPaul Traina #define Q_PORT 3 658cf6c252SPaul Traina #define Q_GATEWAY 4 668cf6c252SPaul Traina #define Q_PROTO 5 67fae05455SBill Fenner #define Q_PROTOCHAIN 6 684238c2cdSSam Leffler #define Q_PORTRANGE 7 698cf6c252SPaul Traina 708cf6c252SPaul Traina /* Protocol qualifiers. */ 718cf6c252SPaul Traina 728cf6c252SPaul Traina #define Q_LINK 1 738cf6c252SPaul Traina #define Q_IP 2 748cf6c252SPaul Traina #define Q_ARP 3 758cf6c252SPaul Traina #define Q_RARP 4 76c0653930SBill Fenner #define Q_SCTP 5 77c0653930SBill Fenner #define Q_TCP 6 78c0653930SBill Fenner #define Q_UDP 7 79c0653930SBill Fenner #define Q_ICMP 8 80c0653930SBill Fenner #define Q_IGMP 9 81c0653930SBill Fenner #define Q_IGRP 10 828cf6c252SPaul Traina 838cf6c252SPaul Traina 84c0653930SBill Fenner #define Q_ATALK 11 85c0653930SBill Fenner #define Q_DECNET 12 86c0653930SBill Fenner #define Q_LAT 13 87c0653930SBill Fenner #define Q_SCA 14 88c0653930SBill Fenner #define Q_MOPRC 15 89c0653930SBill Fenner #define Q_MOPDL 16 90fae05455SBill Fenner 918e1481d1SBill Fenner 92c0653930SBill Fenner #define Q_IPV6 17 93c0653930SBill Fenner #define Q_ICMPV6 18 94c0653930SBill Fenner #define Q_AH 19 95c0653930SBill Fenner #define Q_ESP 20 96fae05455SBill Fenner 97c0653930SBill Fenner #define Q_PIM 21 98c0653930SBill Fenner #define Q_VRRP 22 99fae05455SBill Fenner 100c0653930SBill Fenner #define Q_AARP 23 1018e1481d1SBill Fenner 102c0653930SBill Fenner #define Q_ISO 24 103c0653930SBill Fenner #define Q_ESIS 25 104c0653930SBill Fenner #define Q_ISIS 26 105c0653930SBill Fenner #define Q_CLNP 27 106c0653930SBill Fenner 107c0653930SBill Fenner #define Q_STP 28 108c0653930SBill Fenner 109c0653930SBill Fenner #define Q_IPX 29 110c0653930SBill Fenner 111c0653930SBill Fenner #define Q_NETBEUI 30 1128cf6c252SPaul Traina 113eb9f0330SBruce M Simpson /* IS-IS Levels */ 114eb9f0330SBruce M Simpson #define Q_ISIS_L1 31 115eb9f0330SBruce M Simpson #define Q_ISIS_L2 32 116eb9f0330SBruce M Simpson /* PDU types */ 117eb9f0330SBruce M Simpson #define Q_ISIS_IIH 33 118eb9f0330SBruce M Simpson #define Q_ISIS_LAN_IIH 34 119eb9f0330SBruce M Simpson #define Q_ISIS_PTP_IIH 35 120eb9f0330SBruce M Simpson #define Q_ISIS_SNP 36 121eb9f0330SBruce M Simpson #define Q_ISIS_CSNP 37 122eb9f0330SBruce M Simpson #define Q_ISIS_PSNP 38 123eb9f0330SBruce M Simpson #define Q_ISIS_LSP 39 124eb9f0330SBruce M Simpson 1254238c2cdSSam Leffler #define Q_RADIO 40 1264238c2cdSSam Leffler 127d1e87331SXin LI #define Q_CARP 41 128d1e87331SXin LI 1298cf6c252SPaul Traina /* Directional qualifiers. */ 1308cf6c252SPaul Traina 1318cf6c252SPaul Traina #define Q_SRC 1 1328cf6c252SPaul Traina #define Q_DST 2 1338cf6c252SPaul Traina #define Q_OR 3 1348cf6c252SPaul Traina #define Q_AND 4 135a8e07101SRui Paulo #define Q_ADDR1 5 136a8e07101SRui Paulo #define Q_ADDR2 6 137a8e07101SRui Paulo #define Q_ADDR3 7 138a8e07101SRui Paulo #define Q_ADDR4 8 139d1e87331SXin LI #define Q_RA 9 140d1e87331SXin LI #define Q_TA 10 1418cf6c252SPaul Traina 1428cf6c252SPaul Traina #define Q_DEFAULT 0 1438cf6c252SPaul Traina #define Q_UNDEF 255 1448cf6c252SPaul Traina 145eb9f0330SBruce M Simpson /* ATM types */ 146eb9f0330SBruce M Simpson #define A_METAC 22 /* Meta signalling Circuit */ 147eb9f0330SBruce M Simpson #define A_BCC 23 /* Broadcast Circuit */ 148eb9f0330SBruce M Simpson #define A_OAMF4SC 24 /* Segment OAM F4 Circuit */ 149eb9f0330SBruce M Simpson #define A_OAMF4EC 25 /* End-to-End OAM F4 Circuit */ 150eb9f0330SBruce M Simpson #define A_SC 26 /* Signalling Circuit*/ 151eb9f0330SBruce M Simpson #define A_ILMIC 27 /* ILMI Circuit */ 152eb9f0330SBruce M Simpson #define A_OAM 28 /* OAM cells : F4 only */ 153eb9f0330SBruce M Simpson #define A_OAMF4 29 /* OAM F4 cells: Segment + End-to-end */ 154eb9f0330SBruce M Simpson #define A_LANE 30 /* LANE traffic */ 155eb9f0330SBruce M Simpson #define A_LLC 31 /* LLC-encapsulated traffic */ 156eb9f0330SBruce M Simpson 157eb9f0330SBruce M Simpson /* Based on Q.2931 signalling protocol */ 158eb9f0330SBruce M Simpson #define A_SETUP 41 /* Setup message */ 159eb9f0330SBruce M Simpson #define A_CALLPROCEED 42 /* Call proceeding message */ 160eb9f0330SBruce M Simpson #define A_CONNECT 43 /* Connect message */ 161eb9f0330SBruce M Simpson #define A_CONNECTACK 44 /* Connect Ack message */ 162eb9f0330SBruce M Simpson #define A_RELEASE 45 /* Release message */ 163eb9f0330SBruce M Simpson #define A_RELEASE_DONE 46 /* Release message */ 164eb9f0330SBruce M Simpson 165eb9f0330SBruce M Simpson /* ATM field types */ 166eb9f0330SBruce M Simpson #define A_VPI 51 167eb9f0330SBruce M Simpson #define A_VCI 52 168eb9f0330SBruce M Simpson #define A_PROTOTYPE 53 169eb9f0330SBruce M Simpson #define A_MSGTYPE 54 170eb9f0330SBruce M Simpson #define A_CALLREFTYPE 55 171eb9f0330SBruce M Simpson 172eb9f0330SBruce M Simpson #define A_CONNECTMSG 70 /* returns Q.2931 signalling messages for 173eb9f0330SBruce M Simpson establishing and destroying switched 174eb9f0330SBruce M Simpson virtual connection */ 175eb9f0330SBruce M Simpson #define A_METACONNECT 71 /* returns Q.2931 signalling messages for 176eb9f0330SBruce M Simpson establishing and destroying predefined 177eb9f0330SBruce M Simpson virtual circuits, such as broadcast 178eb9f0330SBruce M Simpson circuit, oamf4 segment circuit, oamf4 179eb9f0330SBruce M Simpson end-to-end circuits, ILMI circuits or 180eb9f0330SBruce M Simpson connection signalling circuit. */ 181eb9f0330SBruce M Simpson 1825357e0feSMax Laier /* MTP2 types */ 1835357e0feSMax Laier #define M_FISU 22 /* FISU */ 1845357e0feSMax Laier #define M_LSSU 23 /* LSSU */ 1855357e0feSMax Laier #define M_MSU 24 /* MSU */ 1865357e0feSMax Laier 187681ed54cSXin LI /* MTP2 HSL types */ 188681ed54cSXin LI #define MH_FISU 25 /* FISU for HSL */ 189681ed54cSXin LI #define MH_LSSU 26 /* LSSU */ 190681ed54cSXin LI #define MH_MSU 27 /* MSU */ 191681ed54cSXin LI 1924238c2cdSSam Leffler /* MTP3 field types */ 1934238c2cdSSam Leffler #define M_SIO 1 1944238c2cdSSam Leffler #define M_OPC 2 1954238c2cdSSam Leffler #define M_DPC 3 1964238c2cdSSam Leffler #define M_SLS 4 1974238c2cdSSam Leffler 198681ed54cSXin LI /* MTP3 field types in case of MTP2 HSL */ 199681ed54cSXin LI #define MH_SIO 5 200681ed54cSXin LI #define MH_OPC 6 201681ed54cSXin LI #define MH_DPC 7 202681ed54cSXin LI #define MH_SLS 8 203681ed54cSXin LI 2044238c2cdSSam Leffler 205fae05455SBill Fenner struct slist; 206fae05455SBill Fenner 2078cf6c252SPaul Traina struct stmt { 2088cf6c252SPaul Traina int code; 209fae05455SBill Fenner struct slist *jt; /*only for relative jump in block*/ 210fae05455SBill Fenner struct slist *jf; /*only for relative jump in block*/ 2118cf6c252SPaul Traina bpf_int32 k; 2128cf6c252SPaul Traina }; 2138cf6c252SPaul Traina 2148cf6c252SPaul Traina struct slist { 2158cf6c252SPaul Traina struct stmt s; 2168cf6c252SPaul Traina struct slist *next; 2178cf6c252SPaul Traina }; 2188cf6c252SPaul Traina 2198cf6c252SPaul Traina /* 2208cf6c252SPaul Traina * A bit vector to represent definition sets. We assume TOT_REGISTERS 2218cf6c252SPaul Traina * is smaller than 8*sizeof(atomset). 2228cf6c252SPaul Traina */ 2238cf6c252SPaul Traina typedef bpf_u_int32 atomset; 2248cf6c252SPaul Traina #define ATOMMASK(n) (1 << (n)) 2258cf6c252SPaul Traina #define ATOMELEM(d, n) (d & ATOMMASK(n)) 2268cf6c252SPaul Traina 2278cf6c252SPaul Traina /* 2288cf6c252SPaul Traina * An unbounded set. 2298cf6c252SPaul Traina */ 2308cf6c252SPaul Traina typedef bpf_u_int32 *uset; 2318cf6c252SPaul Traina 2328cf6c252SPaul Traina /* 2338cf6c252SPaul Traina * Total number of atomic entities, including accumulator (A) and index (X). 2348cf6c252SPaul Traina * We treat all these guys similarly during flow analysis. 2358cf6c252SPaul Traina */ 2368cf6c252SPaul Traina #define N_ATOMS (BPF_MEMWORDS+2) 2378cf6c252SPaul Traina 2388cf6c252SPaul Traina struct edge { 2398cf6c252SPaul Traina int id; 2408cf6c252SPaul Traina int code; 2418cf6c252SPaul Traina uset edom; 2428cf6c252SPaul Traina struct block *succ; 2438cf6c252SPaul Traina struct block *pred; 2448cf6c252SPaul Traina struct edge *next; /* link list of incoming edges for a node */ 2458cf6c252SPaul Traina }; 2468cf6c252SPaul Traina 2478cf6c252SPaul Traina struct block { 2488cf6c252SPaul Traina int id; 2498cf6c252SPaul Traina struct slist *stmts; /* side effect stmts */ 2508cf6c252SPaul Traina struct stmt s; /* branch stmt */ 2518cf6c252SPaul Traina int mark; 25215752fa8SXin LI u_int longjt; /* jt branch requires long jump */ 25315752fa8SXin LI u_int longjf; /* jf branch requires long jump */ 2548cf6c252SPaul Traina int level; 2558cf6c252SPaul Traina int offset; 2568cf6c252SPaul Traina int sense; 2578cf6c252SPaul Traina struct edge et; 2588cf6c252SPaul Traina struct edge ef; 2598cf6c252SPaul Traina struct block *head; 2608cf6c252SPaul Traina struct block *link; /* link field used by optimizer */ 2618cf6c252SPaul Traina uset dom; 2628cf6c252SPaul Traina uset closure; 2638cf6c252SPaul Traina struct edge *in_edges; 2648cf6c252SPaul Traina atomset def, kill; 2658cf6c252SPaul Traina atomset in_use; 2668cf6c252SPaul Traina atomset out_use; 2678cf6c252SPaul Traina int oval; 2688cf6c252SPaul Traina int val[N_ATOMS]; 2698cf6c252SPaul Traina }; 2708cf6c252SPaul Traina 2718cf6c252SPaul Traina struct arth { 2728cf6c252SPaul Traina struct block *b; /* protocol checks */ 2738cf6c252SPaul Traina struct slist *s; /* stmt list */ 2748cf6c252SPaul Traina int regno; /* virtual register number of result */ 2758cf6c252SPaul Traina }; 2768cf6c252SPaul Traina 2778cf6c252SPaul Traina struct qual { 2788cf6c252SPaul Traina unsigned char addr; 2798cf6c252SPaul Traina unsigned char proto; 2808cf6c252SPaul Traina unsigned char dir; 2818cf6c252SPaul Traina unsigned char pad; 2828cf6c252SPaul Traina }; 2838cf6c252SPaul Traina 284*ada6f083SXin LI struct _compiler_state; 285*ada6f083SXin LI 286*ada6f083SXin LI typedef struct _compiler_state compiler_state_t; 287*ada6f083SXin LI 288*ada6f083SXin LI struct arth *gen_loadi(compiler_state_t *, int); 289*ada6f083SXin LI struct arth *gen_load(compiler_state_t *, int, struct arth *, int); 290*ada6f083SXin LI struct arth *gen_loadlen(compiler_state_t *); 291*ada6f083SXin LI struct arth *gen_neg(compiler_state_t *, struct arth *); 292*ada6f083SXin LI struct arth *gen_arth(compiler_state_t *, int, struct arth *, struct arth *); 2938cf6c252SPaul Traina 2948cf6c252SPaul Traina void gen_and(struct block *, struct block *); 2958cf6c252SPaul Traina void gen_or(struct block *, struct block *); 2968cf6c252SPaul Traina void gen_not(struct block *); 2978cf6c252SPaul Traina 298*ada6f083SXin LI struct block *gen_scode(compiler_state_t *, const char *, struct qual); 299*ada6f083SXin LI struct block *gen_ecode(compiler_state_t *, const u_char *, struct qual); 300*ada6f083SXin LI struct block *gen_acode(compiler_state_t *, const u_char *, struct qual); 301*ada6f083SXin LI struct block *gen_mcode(compiler_state_t *, const char *, const char *, 302*ada6f083SXin LI unsigned int, struct qual); 303fae05455SBill Fenner #ifdef INET6 304*ada6f083SXin LI struct block *gen_mcode6(compiler_state_t *, const char *, const char *, 305*ada6f083SXin LI unsigned int, struct qual); 306fae05455SBill Fenner #endif 307*ada6f083SXin LI struct block *gen_ncode(compiler_state_t *, const char *, bpf_u_int32, 308*ada6f083SXin LI struct qual); 309*ada6f083SXin LI struct block *gen_proto_abbrev(compiler_state_t *, int); 310*ada6f083SXin LI struct block *gen_relation(compiler_state_t *, int, struct arth *, 311*ada6f083SXin LI struct arth *, int); 312*ada6f083SXin LI struct block *gen_less(compiler_state_t *, int); 313*ada6f083SXin LI struct block *gen_greater(compiler_state_t *, int); 314*ada6f083SXin LI struct block *gen_byteop(compiler_state_t *, int, int, int); 315*ada6f083SXin LI struct block *gen_broadcast(compiler_state_t *, int); 316*ada6f083SXin LI struct block *gen_multicast(compiler_state_t *, int); 317*ada6f083SXin LI struct block *gen_inbound(compiler_state_t *, int); 3188cf6c252SPaul Traina 319*ada6f083SXin LI struct block *gen_llc(compiler_state_t *); 320*ada6f083SXin LI struct block *gen_llc_i(compiler_state_t *); 321*ada6f083SXin LI struct block *gen_llc_s(compiler_state_t *); 322*ada6f083SXin LI struct block *gen_llc_u(compiler_state_t *); 323*ada6f083SXin LI struct block *gen_llc_s_subtype(compiler_state_t *, bpf_u_int32); 324*ada6f083SXin LI struct block *gen_llc_u_subtype(compiler_state_t *, bpf_u_int32); 325681ed54cSXin LI 326*ada6f083SXin LI struct block *gen_vlan(compiler_state_t *, int); 327*ada6f083SXin LI struct block *gen_mpls(compiler_state_t *, int); 3288e1481d1SBill Fenner 329*ada6f083SXin LI struct block *gen_pppoed(compiler_state_t *); 330*ada6f083SXin LI struct block *gen_pppoes(compiler_state_t *, int); 331ff252dbeSSam Leffler 332*ada6f083SXin LI struct block *gen_geneve(compiler_state_t *, int); 333eb9f0330SBruce M Simpson 334*ada6f083SXin LI struct block *gen_atmfield_code(compiler_state_t *, int, bpf_int32, 335*ada6f083SXin LI bpf_u_int32, int); 336*ada6f083SXin LI struct block *gen_atmtype_abbrev(compiler_state_t *, int type); 337*ada6f083SXin LI struct block *gen_atmmulti_abbrev(compiler_state_t *, int type); 3384238c2cdSSam Leffler 339*ada6f083SXin LI struct block *gen_mtp2type_abbrev(compiler_state_t *, int type); 340*ada6f083SXin LI struct block *gen_mtp3field_code(compiler_state_t *, int, bpf_u_int32, 341*ada6f083SXin LI bpf_u_int32, int); 342eb9f0330SBruce M Simpson 343*ada6f083SXin LI struct block *gen_pf_ifname(compiler_state_t *, const char *); 344*ada6f083SXin LI struct block *gen_pf_rnr(compiler_state_t *, int); 345*ada6f083SXin LI struct block *gen_pf_srnr(compiler_state_t *, int); 346*ada6f083SXin LI struct block *gen_pf_ruleset(compiler_state_t *, char *); 347*ada6f083SXin LI struct block *gen_pf_reason(compiler_state_t *, int); 348*ada6f083SXin LI struct block *gen_pf_action(compiler_state_t *, int); 349a8e07101SRui Paulo 350*ada6f083SXin LI struct block *gen_p80211_type(compiler_state_t *, int, int); 351*ada6f083SXin LI struct block *gen_p80211_fcdir(compiler_state_t *, int); 352*ada6f083SXin LI 353*ada6f083SXin LI /* 354*ada6f083SXin LI * Representation of a program as a tree of blocks, plus current mark. 355*ada6f083SXin LI * A block is marked if only if its mark equals the current mark. 356*ada6f083SXin LI * Rather than traverse the code array, marking each item, 'cur_mark' 357*ada6f083SXin LI * is incremented. This automatically makes each element unmarked. 358*ada6f083SXin LI */ 359*ada6f083SXin LI #define isMarked(icp, p) ((p)->mark == (icp)->cur_mark) 360*ada6f083SXin LI #define unMarkAll(icp) (icp)->cur_mark += 1 361*ada6f083SXin LI #define Mark(icp, p) ((p)->mark = (icp)->cur_mark) 362*ada6f083SXin LI 363*ada6f083SXin LI struct icode { 364*ada6f083SXin LI struct block *root; 365*ada6f083SXin LI int cur_mark; 366*ada6f083SXin LI }; 367*ada6f083SXin LI 368*ada6f083SXin LI void bpf_optimize(compiler_state_t *, struct icode *ic); 369*ada6f083SXin LI void bpf_syntax_error(compiler_state_t *, const char *); 370*ada6f083SXin LI void bpf_error(compiler_state_t *, const char *, ...) 371681ed54cSXin LI __attribute__((noreturn)) 372681ed54cSXin LI #ifdef __ATTRIBUTE___FORMAT_OK 373*ada6f083SXin LI __attribute__((format (printf, 2, 3))) 374681ed54cSXin LI #endif /* __ATTRIBUTE___FORMAT_OK */ 375681ed54cSXin LI ; 3768cf6c252SPaul Traina 377*ada6f083SXin LI void finish_parse(compiler_state_t *, struct block *); 378*ada6f083SXin LI char *sdup(compiler_state_t *, const char *); 3798cf6c252SPaul Traina 380*ada6f083SXin LI struct _opt_state; 381*ada6f083SXin LI typedef struct _opt_state opt_state_t; 382*ada6f083SXin LI 383*ada6f083SXin LI struct bpf_insn *icode_to_fcode(compiler_state_t *, struct icode *, 384*ada6f083SXin LI struct block *, u_int *); 3858cf6c252SPaul Traina void sappend(struct slist *, struct slist *); 3868cf6c252SPaul Traina 387*ada6f083SXin LI /* 388*ada6f083SXin LI * Older versions of Bison don't put this declaration in 389*ada6f083SXin LI * grammar.h. 390*ada6f083SXin LI */ 391*ada6f083SXin LI int pcap_parse(void *, compiler_state_t *); 392*ada6f083SXin LI 3938cf6c252SPaul Traina /* XXX */ 3948cf6c252SPaul Traina #define JT(b) ((b)->et.succ) 3958cf6c252SPaul Traina #define JF(b) ((b)->ef.succ) 396