"Fossies" - the Fresh Open Source Software Archive

Member "daq-2.0.7/sfbpf/gencode.h" (8 Apr 2020, 10440 Bytes) of package /linux/misc/daq-2.0.7.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "gencode.h" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 2.0.6_vs_2.0.7.

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