1*76404edcSAsim Jamshed /* 2*76404edcSAsim Jamshed * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996 3*76404edcSAsim Jamshed * The Regents of the University of California. All rights reserved. 4*76404edcSAsim Jamshed * 5*76404edcSAsim Jamshed * Redistribution and use in source and binary forms, with or without 6*76404edcSAsim Jamshed * modification, are permitted provided that: (1) source code distributions 7*76404edcSAsim Jamshed * retain the above copyright notice and this paragraph in its entirety, (2) 8*76404edcSAsim Jamshed * distributions including binary code include the above copyright notice and 9*76404edcSAsim Jamshed * this paragraph in its entirety in the documentation or other materials 10*76404edcSAsim Jamshed * provided with the distribution, and (3) all advertising materials mentioning 11*76404edcSAsim Jamshed * features or use of this software display the following acknowledgement: 12*76404edcSAsim Jamshed * ``This product includes software developed by the University of California, 13*76404edcSAsim Jamshed * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14*76404edcSAsim Jamshed * the University nor the names of its contributors may be used to endorse 15*76404edcSAsim Jamshed * or promote products derived from this software without specific prior 16*76404edcSAsim Jamshed * written permission. 17*76404edcSAsim Jamshed * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18*76404edcSAsim Jamshed * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19*76404edcSAsim Jamshed * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20*76404edcSAsim Jamshed * 21*76404edcSAsim Jamshed * @(#) $Header: /usr/cvsroot/sfeng/ims/src/libraries/daq/daq/sfbpf/gencode.h,v 1.2 2010/05/06 19:13:25 maltizer Exp $ (LBL) 22*76404edcSAsim Jamshed */ 23*76404edcSAsim Jamshed 24*76404edcSAsim Jamshed /* 25*76404edcSAsim Jamshed * ATM support: 26*76404edcSAsim Jamshed * 27*76404edcSAsim Jamshed * Copyright (c) 1997 Yen Yen Lim and North Dakota State University 28*76404edcSAsim Jamshed * All rights reserved. 29*76404edcSAsim Jamshed * 30*76404edcSAsim Jamshed * Redistribution and use in source and binary forms, with or without 31*76404edcSAsim Jamshed * modification, are permitted provided that the following conditions 32*76404edcSAsim Jamshed * are met: 33*76404edcSAsim Jamshed * 1. Redistributions of source code must retain the above copyright 34*76404edcSAsim Jamshed * notice, this list of conditions and the following disclaimer. 35*76404edcSAsim Jamshed * 2. Redistributions in binary form must reproduce the above copyright 36*76404edcSAsim Jamshed * notice, this list of conditions and the following disclaimer in the 37*76404edcSAsim Jamshed * documentation and/or other materials provided with the distribution. 38*76404edcSAsim Jamshed * 3. All advertising materials mentioning features or use of this software 39*76404edcSAsim Jamshed * must display the following acknowledgement: 40*76404edcSAsim Jamshed * This product includes software developed by Yen Yen Lim and 41*76404edcSAsim Jamshed * North Dakota State University 42*76404edcSAsim Jamshed * 4. The name of the author may not be used to endorse or promote products 43*76404edcSAsim Jamshed * derived from this software without specific prior written permission. 44*76404edcSAsim Jamshed * 45*76404edcSAsim Jamshed * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 46*76404edcSAsim Jamshed * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 47*76404edcSAsim Jamshed * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 48*76404edcSAsim Jamshed * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 49*76404edcSAsim Jamshed * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 50*76404edcSAsim Jamshed * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 51*76404edcSAsim Jamshed * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 52*76404edcSAsim Jamshed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 53*76404edcSAsim Jamshed * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 54*76404edcSAsim Jamshed * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 55*76404edcSAsim Jamshed * POSSIBILITY OF SUCH DAMAGE. 56*76404edcSAsim Jamshed */ 57*76404edcSAsim Jamshed 58*76404edcSAsim Jamshed #include "sf-redefines.h" 59*76404edcSAsim Jamshed 60*76404edcSAsim Jamshed /* Address qualifiers. */ 61*76404edcSAsim Jamshed 62*76404edcSAsim Jamshed #define Q_HOST 1 63*76404edcSAsim Jamshed #define Q_NET 2 64*76404edcSAsim Jamshed #define Q_PORT 3 65*76404edcSAsim Jamshed #define Q_GATEWAY 4 66*76404edcSAsim Jamshed #define Q_PROTO 5 67*76404edcSAsim Jamshed #define Q_PROTOCHAIN 6 68*76404edcSAsim Jamshed #define Q_PORTRANGE 7 69*76404edcSAsim Jamshed 70*76404edcSAsim Jamshed /* Protocol qualifiers. */ 71*76404edcSAsim Jamshed 72*76404edcSAsim Jamshed #define Q_LINK 1 73*76404edcSAsim Jamshed #define Q_IP 2 74*76404edcSAsim Jamshed #define Q_ARP 3 75*76404edcSAsim Jamshed #define Q_RARP 4 76*76404edcSAsim Jamshed #define Q_SCTP 5 77*76404edcSAsim Jamshed #define Q_TCP 6 78*76404edcSAsim Jamshed #define Q_UDP 7 79*76404edcSAsim Jamshed #define Q_ICMP 8 80*76404edcSAsim Jamshed #define Q_IGMP 9 81*76404edcSAsim Jamshed #define Q_IGRP 10 82*76404edcSAsim Jamshed 83*76404edcSAsim Jamshed 84*76404edcSAsim Jamshed #define Q_ATALK 11 85*76404edcSAsim Jamshed #define Q_DECNET 12 86*76404edcSAsim Jamshed #define Q_LAT 13 87*76404edcSAsim Jamshed #define Q_SCA 14 88*76404edcSAsim Jamshed #define Q_MOPRC 15 89*76404edcSAsim Jamshed #define Q_MOPDL 16 90*76404edcSAsim Jamshed 91*76404edcSAsim Jamshed 92*76404edcSAsim Jamshed #define Q_IPV6 17 93*76404edcSAsim Jamshed #define Q_ICMPV6 18 94*76404edcSAsim Jamshed #define Q_AH 19 95*76404edcSAsim Jamshed #define Q_ESP 20 96*76404edcSAsim Jamshed 97*76404edcSAsim Jamshed #define Q_PIM 21 98*76404edcSAsim Jamshed #define Q_VRRP 22 99*76404edcSAsim Jamshed 100*76404edcSAsim Jamshed #define Q_AARP 23 101*76404edcSAsim Jamshed 102*76404edcSAsim Jamshed #define Q_ISO 24 103*76404edcSAsim Jamshed #define Q_ESIS 25 104*76404edcSAsim Jamshed #define Q_ISIS 26 105*76404edcSAsim Jamshed #define Q_CLNP 27 106*76404edcSAsim Jamshed 107*76404edcSAsim Jamshed #define Q_STP 28 108*76404edcSAsim Jamshed 109*76404edcSAsim Jamshed #define Q_IPX 29 110*76404edcSAsim Jamshed 111*76404edcSAsim Jamshed #define Q_NETBEUI 30 112*76404edcSAsim Jamshed 113*76404edcSAsim Jamshed /* IS-IS Levels */ 114*76404edcSAsim Jamshed #define Q_ISIS_L1 31 115*76404edcSAsim Jamshed #define Q_ISIS_L2 32 116*76404edcSAsim Jamshed /* PDU types */ 117*76404edcSAsim Jamshed #define Q_ISIS_IIH 33 118*76404edcSAsim Jamshed #define Q_ISIS_LAN_IIH 34 119*76404edcSAsim Jamshed #define Q_ISIS_PTP_IIH 35 120*76404edcSAsim Jamshed #define Q_ISIS_SNP 36 121*76404edcSAsim Jamshed #define Q_ISIS_CSNP 37 122*76404edcSAsim Jamshed #define Q_ISIS_PSNP 38 123*76404edcSAsim Jamshed #define Q_ISIS_LSP 39 124*76404edcSAsim Jamshed 125*76404edcSAsim Jamshed #define Q_RADIO 40 126*76404edcSAsim Jamshed 127*76404edcSAsim Jamshed /* Directional qualifiers. */ 128*76404edcSAsim Jamshed 129*76404edcSAsim Jamshed #define Q_SRC 1 130*76404edcSAsim Jamshed #define Q_DST 2 131*76404edcSAsim Jamshed #define Q_OR 3 132*76404edcSAsim Jamshed #define Q_AND 4 133*76404edcSAsim Jamshed #define Q_ADDR1 5 134*76404edcSAsim Jamshed #define Q_ADDR2 6 135*76404edcSAsim Jamshed #define Q_ADDR3 7 136*76404edcSAsim Jamshed #define Q_ADDR4 8 137*76404edcSAsim Jamshed 138*76404edcSAsim Jamshed #define Q_DEFAULT 0 139*76404edcSAsim Jamshed #define Q_UNDEF 255 140*76404edcSAsim Jamshed 141*76404edcSAsim Jamshed /* ATM types */ 142*76404edcSAsim Jamshed #define A_METAC 22 /* Meta signalling Circuit */ 143*76404edcSAsim Jamshed #define A_BCC 23 /* Broadcast Circuit */ 144*76404edcSAsim Jamshed #define A_OAMF4SC 24 /* Segment OAM F4 Circuit */ 145*76404edcSAsim Jamshed #define A_OAMF4EC 25 /* End-to-End OAM F4 Circuit */ 146*76404edcSAsim Jamshed #define A_SC 26 /* Signalling Circuit */ 147*76404edcSAsim Jamshed #define A_ILMIC 27 /* ILMI Circuit */ 148*76404edcSAsim Jamshed #define A_OAM 28 /* OAM cells : F4 only */ 149*76404edcSAsim Jamshed #define A_OAMF4 29 /* OAM F4 cells: Segment + End-to-end */ 150*76404edcSAsim Jamshed #define A_LANE 30 /* LANE traffic */ 151*76404edcSAsim Jamshed #define A_LLC 31 /* LLC-encapsulated traffic */ 152*76404edcSAsim Jamshed 153*76404edcSAsim Jamshed /* Based on Q.2931 signalling protocol */ 154*76404edcSAsim Jamshed #define A_SETUP 41 /* Setup message */ 155*76404edcSAsim Jamshed #define A_CALLPROCEED 42 /* Call proceeding message */ 156*76404edcSAsim Jamshed #define A_CONNECT 43 /* Connect message */ 157*76404edcSAsim Jamshed #define A_CONNECTACK 44 /* Connect Ack message */ 158*76404edcSAsim Jamshed #define A_RELEASE 45 /* Release message */ 159*76404edcSAsim Jamshed #define A_RELEASE_DONE 46 /* Release message */ 160*76404edcSAsim Jamshed 161*76404edcSAsim Jamshed /* ATM field types */ 162*76404edcSAsim Jamshed #define A_VPI 51 163*76404edcSAsim Jamshed #define A_VCI 52 164*76404edcSAsim Jamshed #define A_PROTOTYPE 53 165*76404edcSAsim Jamshed #define A_MSGTYPE 54 166*76404edcSAsim Jamshed #define A_CALLREFTYPE 55 167*76404edcSAsim Jamshed 168*76404edcSAsim Jamshed #define A_CONNECTMSG 70 /* returns Q.2931 signalling messages for 169*76404edcSAsim Jamshed establishing and destroying switched 170*76404edcSAsim Jamshed virtual connection */ 171*76404edcSAsim Jamshed #define A_METACONNECT 71 /* returns Q.2931 signalling messages for 172*76404edcSAsim Jamshed establishing and destroying predefined 173*76404edcSAsim Jamshed virtual circuits, such as broadcast 174*76404edcSAsim Jamshed circuit, oamf4 segment circuit, oamf4 175*76404edcSAsim Jamshed end-to-end circuits, ILMI circuits or 176*76404edcSAsim Jamshed connection signalling circuit. */ 177*76404edcSAsim Jamshed 178*76404edcSAsim Jamshed /* MTP2 types */ 179*76404edcSAsim Jamshed #define M_FISU 22 /* FISU */ 180*76404edcSAsim Jamshed #define M_LSSU 23 /* LSSU */ 181*76404edcSAsim Jamshed #define M_MSU 24 /* MSU */ 182*76404edcSAsim Jamshed 183*76404edcSAsim Jamshed /* MTP3 field types */ 184*76404edcSAsim Jamshed #define M_SIO 1 185*76404edcSAsim Jamshed #define M_OPC 2 186*76404edcSAsim Jamshed #define M_DPC 3 187*76404edcSAsim Jamshed #define M_SLS 4 188*76404edcSAsim Jamshed 189*76404edcSAsim Jamshed 190*76404edcSAsim Jamshed struct slist; 191*76404edcSAsim Jamshed 192*76404edcSAsim Jamshed struct stmt 193*76404edcSAsim Jamshed { 194*76404edcSAsim Jamshed int code; 195*76404edcSAsim Jamshed struct slist *jt; /*only for relative jump in block */ 196*76404edcSAsim Jamshed struct slist *jf; /*only for relative jump in block */ 197*76404edcSAsim Jamshed bpf_int32 k; 198*76404edcSAsim Jamshed }; 199*76404edcSAsim Jamshed 200*76404edcSAsim Jamshed struct slist 201*76404edcSAsim Jamshed { 202*76404edcSAsim Jamshed struct stmt s; 203*76404edcSAsim Jamshed struct slist *next; 204*76404edcSAsim Jamshed }; 205*76404edcSAsim Jamshed 206*76404edcSAsim Jamshed /* 207*76404edcSAsim Jamshed * A bit vector to represent definition sets. We assume TOT_REGISTERS 208*76404edcSAsim Jamshed * is smaller than 8*sizeof(atomset). 209*76404edcSAsim Jamshed */ 210*76404edcSAsim Jamshed typedef bpf_u_int32 atomset; 211*76404edcSAsim Jamshed #define ATOMMASK(n) (1 << (n)) 212*76404edcSAsim Jamshed #define ATOMELEM(d, n) (d & ATOMMASK(n)) 213*76404edcSAsim Jamshed 214*76404edcSAsim Jamshed /* 215*76404edcSAsim Jamshed * An unbounded set. 216*76404edcSAsim Jamshed */ 217*76404edcSAsim Jamshed typedef bpf_u_int32 *uset; 218*76404edcSAsim Jamshed 219*76404edcSAsim Jamshed /* 220*76404edcSAsim Jamshed * Total number of atomic entities, including accumulator (A) and index (X). 221*76404edcSAsim Jamshed * We treat all these guys similarly during flow analysis. 222*76404edcSAsim Jamshed */ 223*76404edcSAsim Jamshed #define N_ATOMS (BPF_MEMWORDS+2) 224*76404edcSAsim Jamshed 225*76404edcSAsim Jamshed struct edge 226*76404edcSAsim Jamshed { 227*76404edcSAsim Jamshed int id; 228*76404edcSAsim Jamshed int code; 229*76404edcSAsim Jamshed uset edom; 230*76404edcSAsim Jamshed struct block *succ; 231*76404edcSAsim Jamshed struct block *pred; 232*76404edcSAsim Jamshed struct edge *next; /* link list of incoming edges for a node */ 233*76404edcSAsim Jamshed }; 234*76404edcSAsim Jamshed 235*76404edcSAsim Jamshed struct block 236*76404edcSAsim Jamshed { 237*76404edcSAsim Jamshed int id; 238*76404edcSAsim Jamshed struct slist *stmts; /* side effect stmts */ 239*76404edcSAsim Jamshed struct stmt s; /* branch stmt */ 240*76404edcSAsim Jamshed int mark; 241*76404edcSAsim Jamshed int longjt; /* jt branch requires long jump */ 242*76404edcSAsim Jamshed int longjf; /* jf branch requires long jump */ 243*76404edcSAsim Jamshed int level; 244*76404edcSAsim Jamshed int offset; 245*76404edcSAsim Jamshed int sense; 246*76404edcSAsim Jamshed struct edge et; 247*76404edcSAsim Jamshed struct edge ef; 248*76404edcSAsim Jamshed struct block *head; 249*76404edcSAsim Jamshed struct block *link; /* link field used by optimizer */ 250*76404edcSAsim Jamshed uset dom; 251*76404edcSAsim Jamshed uset closure; 252*76404edcSAsim Jamshed struct edge *in_edges; 253*76404edcSAsim Jamshed atomset def, kill; 254*76404edcSAsim Jamshed atomset in_use; 255*76404edcSAsim Jamshed atomset out_use; 256*76404edcSAsim Jamshed int oval; 257*76404edcSAsim Jamshed int val[N_ATOMS]; 258*76404edcSAsim Jamshed }; 259*76404edcSAsim Jamshed 260*76404edcSAsim Jamshed struct arth 261*76404edcSAsim Jamshed { 262*76404edcSAsim Jamshed struct block *b; /* protocol checks */ 263*76404edcSAsim Jamshed struct slist *s; /* stmt list */ 264*76404edcSAsim Jamshed int regno; /* virtual register number of result */ 265*76404edcSAsim Jamshed }; 266*76404edcSAsim Jamshed 267*76404edcSAsim Jamshed struct qual 268*76404edcSAsim Jamshed { 269*76404edcSAsim Jamshed unsigned char addr; 270*76404edcSAsim Jamshed unsigned char proto; 271*76404edcSAsim Jamshed unsigned char dir; 272*76404edcSAsim Jamshed unsigned char pad; 273*76404edcSAsim Jamshed }; 274*76404edcSAsim Jamshed 275*76404edcSAsim Jamshed struct arth *gen_loadi(int); 276*76404edcSAsim Jamshed struct arth *gen_load(int, struct arth *, int); 277*76404edcSAsim Jamshed struct arth *gen_loadlen(void); 278*76404edcSAsim Jamshed struct arth *gen_neg(struct arth *); 279*76404edcSAsim Jamshed struct arth *gen_arth(int, struct arth *, struct arth *); 280*76404edcSAsim Jamshed 281*76404edcSAsim Jamshed void gen_and(struct block *, struct block *); 282*76404edcSAsim Jamshed void gen_or(struct block *, struct block *); 283*76404edcSAsim Jamshed void gen_not(struct block *); 284*76404edcSAsim Jamshed 285*76404edcSAsim Jamshed struct block *gen_scode(const char *, struct qual); 286*76404edcSAsim Jamshed struct block *gen_ecode(const u_char *, struct qual); 287*76404edcSAsim Jamshed struct block *gen_acode(const u_char *, struct qual); 288*76404edcSAsim Jamshed struct block *gen_mcode(const char *, const char *, int, struct qual); 289*76404edcSAsim Jamshed #ifdef INET6 290*76404edcSAsim Jamshed struct block *gen_mcode6(const char *, const char *, int, struct qual); 291*76404edcSAsim Jamshed #endif 292*76404edcSAsim Jamshed struct block *gen_ncode(const char *, bpf_u_int32, struct qual); 293*76404edcSAsim Jamshed struct block *gen_proto_abbrev(int); 294*76404edcSAsim Jamshed struct block *gen_relation(int, struct arth *, struct arth *, int); 295*76404edcSAsim Jamshed struct block *gen_less(int); 296*76404edcSAsim Jamshed struct block *gen_greater(int); 297*76404edcSAsim Jamshed struct block *gen_byteop(int, int, int); 298*76404edcSAsim Jamshed struct block *gen_broadcast(int); 299*76404edcSAsim Jamshed struct block *gen_multicast(int); 300*76404edcSAsim Jamshed struct block *gen_inbound(int); 301*76404edcSAsim Jamshed 302*76404edcSAsim Jamshed struct block *gen_vlan(int); 303*76404edcSAsim Jamshed struct block *gen_mpls(int); 304*76404edcSAsim Jamshed 305*76404edcSAsim Jamshed struct block *gen_pppoed(void); 306*76404edcSAsim Jamshed struct block *gen_pppoes(void); 307*76404edcSAsim Jamshed 308*76404edcSAsim Jamshed struct block *gen_atmfield_code(int atmfield, bpf_int32 jvalue, bpf_u_int32 jtype, int reverse); 309*76404edcSAsim Jamshed struct block *gen_atmtype_abbrev(int type); 310*76404edcSAsim Jamshed struct block *gen_atmmulti_abbrev(int type); 311*76404edcSAsim Jamshed 312*76404edcSAsim Jamshed struct block *gen_mtp2type_abbrev(int type); 313*76404edcSAsim Jamshed struct block *gen_mtp3field_code(int mtp3field, bpf_u_int32 jvalue, bpf_u_int32 jtype, int reverse); 314*76404edcSAsim Jamshed 315*76404edcSAsim Jamshed struct block *gen_pf_ifname(const char *); 316*76404edcSAsim Jamshed struct block *gen_pf_rnr(int); 317*76404edcSAsim Jamshed struct block *gen_pf_srnr(int); 318*76404edcSAsim Jamshed struct block *gen_pf_ruleset(char *); 319*76404edcSAsim Jamshed struct block *gen_pf_reason(int); 320*76404edcSAsim Jamshed struct block *gen_pf_action(int); 321*76404edcSAsim Jamshed struct block *gen_pf_dir(int); 322*76404edcSAsim Jamshed 323*76404edcSAsim Jamshed struct block *gen_p80211_type(int, int); 324*76404edcSAsim Jamshed struct block *gen_p80211_fcdir(int); 325*76404edcSAsim Jamshed 326*76404edcSAsim Jamshed void bpf_optimize(struct block **); 327*76404edcSAsim Jamshed #ifndef WIN32 328*76404edcSAsim Jamshed void bpf_error(const char *, ...) __attribute__ ((noreturn, format(printf, 1, 2))); 329*76404edcSAsim Jamshed #else 330*76404edcSAsim Jamshed __declspec(noreturn) void bpf_error(const char *, ...); 331*76404edcSAsim Jamshed #endif 332*76404edcSAsim Jamshed 333*76404edcSAsim Jamshed void finish_parse(struct block *); 334*76404edcSAsim Jamshed char *sdup(const char *); 335*76404edcSAsim Jamshed 336*76404edcSAsim Jamshed struct bpf_insn *icode_to_fcode(struct block *, int *); 337*76404edcSAsim Jamshed int pcap_parse(void); 338*76404edcSAsim Jamshed void lex_init(const char *); 339*76404edcSAsim Jamshed void lex_cleanup(void); 340*76404edcSAsim Jamshed void sappend(struct slist *, struct slist *); 341*76404edcSAsim Jamshed 342*76404edcSAsim Jamshed /* XXX */ 343*76404edcSAsim Jamshed #define JT(b) ((b)->et.succ) 344*76404edcSAsim Jamshed #define JF(b) ((b)->ef.succ) 345*76404edcSAsim Jamshed 346*76404edcSAsim Jamshed extern __thread int no_optimize; 347