"Fossies" - the Fresh Open Source Software Archive

Member "libpcap-1.9.1/./gencode.h" (30 Sep 2019, 11714 Bytes) of package /linux/misc/libpcap-1.9.1.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: 1.9.0_vs_1.9.1.

    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 
   22 #include "pcap/funcattrs.h"
   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 /* Address qualifiers. */
   59 
   60 #define Q_HOST      1
   61 #define Q_NET       2
   62 #define Q_PORT      3
   63 #define Q_GATEWAY   4
   64 #define Q_PROTO     5
   65 #define Q_PROTOCHAIN    6
   66 #define Q_PORTRANGE 7
   67 
   68 /* Protocol qualifiers. */
   69 
   70 #define Q_LINK      1
   71 #define Q_IP        2
   72 #define Q_ARP       3
   73 #define Q_RARP      4
   74 #define Q_SCTP      5
   75 #define Q_TCP       6
   76 #define Q_UDP       7
   77 #define Q_ICMP      8
   78 #define Q_IGMP      9
   79 #define Q_IGRP      10
   80 
   81 
   82 #define Q_ATALK     11
   83 #define Q_DECNET    12
   84 #define Q_LAT       13
   85 #define Q_SCA       14
   86 #define Q_MOPRC     15
   87 #define Q_MOPDL     16
   88 
   89 
   90 #define Q_IPV6      17
   91 #define Q_ICMPV6    18
   92 #define Q_AH        19
   93 #define Q_ESP       20
   94 
   95 #define Q_PIM       21
   96 #define Q_VRRP      22
   97 
   98 #define Q_AARP      23
   99 
  100 #define Q_ISO       24
  101 #define Q_ESIS      25
  102 #define Q_ISIS      26
  103 #define Q_CLNP      27
  104 
  105 #define Q_STP       28
  106 
  107 #define Q_IPX       29
  108 
  109 #define Q_NETBEUI   30
  110 
  111 /* IS-IS Levels */
  112 #define Q_ISIS_L1       31
  113 #define Q_ISIS_L2       32
  114 /* PDU types */
  115 #define Q_ISIS_IIH      33
  116 #define Q_ISIS_SNP      34
  117 #define Q_ISIS_CSNP     35
  118 #define Q_ISIS_PSNP     36
  119 #define Q_ISIS_LSP      37
  120 
  121 #define Q_RADIO     38
  122 
  123 #define Q_CARP      39
  124 
  125 /* Directional qualifiers. */
  126 
  127 #define Q_SRC       1
  128 #define Q_DST       2
  129 #define Q_OR        3
  130 #define Q_AND       4
  131 #define Q_ADDR1     5
  132 #define Q_ADDR2     6
  133 #define Q_ADDR3     7
  134 #define Q_ADDR4     8
  135 #define Q_RA        9
  136 #define Q_TA        10
  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 /* MTP2 HSL types */
  184 #define MH_FISU     25  /* FISU for HSL */
  185 #define MH_LSSU     26  /* LSSU */
  186 #define MH_MSU      27  /* MSU */
  187 
  188 /* MTP3 field types */
  189 #define M_SIO       1
  190 #define M_OPC       2
  191 #define M_DPC       3
  192 #define M_SLS       4
  193 
  194 /* MTP3 field types in case of MTP2 HSL */
  195 #define MH_SIO      5
  196 #define MH_OPC      6
  197 #define MH_DPC      7
  198 #define MH_SLS      8
  199 
  200 
  201 struct slist;
  202 
  203 struct stmt {
  204     int code;
  205     struct slist *jt;   /*only for relative jump in block*/
  206     struct slist *jf;   /*only for relative jump in block*/
  207     bpf_int32 k;
  208 };
  209 
  210 struct slist {
  211     struct stmt s;
  212     struct slist *next;
  213 };
  214 
  215 /*
  216  * A bit vector to represent definition sets.  We assume TOT_REGISTERS
  217  * is smaller than 8*sizeof(atomset).
  218  */
  219 typedef bpf_u_int32 atomset;
  220 #define ATOMMASK(n) (1 << (n))
  221 #define ATOMELEM(d, n) (d & ATOMMASK(n))
  222 
  223 /*
  224  * An unbounded set.
  225  */
  226 typedef bpf_u_int32 *uset;
  227 
  228 /*
  229  * Total number of atomic entities, including accumulator (A) and index (X).
  230  * We treat all these guys similarly during flow analysis.
  231  */
  232 #define N_ATOMS (BPF_MEMWORDS+2)
  233 
  234 struct edge {
  235     int id;
  236     int code;
  237     uset edom;
  238     struct block *succ;
  239     struct block *pred;
  240     struct edge *next;  /* link list of incoming edges for a node */
  241 };
  242 
  243 struct block {
  244     int id;
  245     struct slist *stmts;    /* side effect stmts */
  246     struct stmt s;      /* branch stmt */
  247     int mark;
  248     u_int longjt;       /* jt branch requires long jump */
  249     u_int longjf;       /* jf branch requires long jump */
  250     int level;
  251     int offset;
  252     int sense;
  253     struct edge et;
  254     struct edge ef;
  255     struct block *head;
  256     struct block *link; /* link field used by optimizer */
  257     uset dom;
  258     uset closure;
  259     struct edge *in_edges;
  260     atomset def, kill;
  261     atomset in_use;
  262     atomset out_use;
  263     int oval;
  264     int val[N_ATOMS];
  265 };
  266 
  267 /*
  268  * A value of 0 for val[i] means the value is unknown.
  269  */
  270 #define VAL_UNKNOWN 0
  271 
  272 struct arth {
  273     struct block *b;    /* protocol checks */
  274     struct slist *s;    /* stmt list */
  275     int regno;      /* virtual register number of result */
  276 };
  277 
  278 struct qual {
  279     unsigned char addr;
  280     unsigned char proto;
  281     unsigned char dir;
  282     unsigned char pad;
  283 };
  284 
  285 struct _compiler_state;
  286 
  287 typedef struct _compiler_state compiler_state_t;
  288 
  289 struct arth *gen_loadi(compiler_state_t *, int);
  290 struct arth *gen_load(compiler_state_t *, int, struct arth *, int);
  291 struct arth *gen_loadlen(compiler_state_t *);
  292 struct arth *gen_neg(compiler_state_t *, struct arth *);
  293 struct arth *gen_arth(compiler_state_t *, int, struct arth *, struct arth *);
  294 
  295 void gen_and(struct block *, struct block *);
  296 void gen_or(struct block *, struct block *);
  297 void gen_not(struct block *);
  298 
  299 struct block *gen_scode(compiler_state_t *, const char *, struct qual);
  300 struct block *gen_ecode(compiler_state_t *, const char *, struct qual);
  301 struct block *gen_acode(compiler_state_t *, const char *, struct qual);
  302 struct block *gen_mcode(compiler_state_t *, const char *, const char *,
  303     unsigned int, struct qual);
  304 #ifdef INET6
  305 struct block *gen_mcode6(compiler_state_t *, const char *, const char *,
  306     unsigned int, struct qual);
  307 #endif
  308 struct block *gen_ncode(compiler_state_t *, const char *, bpf_u_int32,
  309     struct qual);
  310 struct block *gen_proto_abbrev(compiler_state_t *, int);
  311 struct block *gen_relation(compiler_state_t *, int, struct arth *,
  312     struct arth *, int);
  313 struct block *gen_less(compiler_state_t *, int);
  314 struct block *gen_greater(compiler_state_t *, int);
  315 struct block *gen_byteop(compiler_state_t *, int, int, int);
  316 struct block *gen_broadcast(compiler_state_t *, int);
  317 struct block *gen_multicast(compiler_state_t *, int);
  318 struct block *gen_inbound(compiler_state_t *, int);
  319 
  320 struct block *gen_llc(compiler_state_t *);
  321 struct block *gen_llc_i(compiler_state_t *);
  322 struct block *gen_llc_s(compiler_state_t *);
  323 struct block *gen_llc_u(compiler_state_t *);
  324 struct block *gen_llc_s_subtype(compiler_state_t *, bpf_u_int32);
  325 struct block *gen_llc_u_subtype(compiler_state_t *, bpf_u_int32);
  326 
  327 struct block *gen_vlan(compiler_state_t *, bpf_u_int32, int);
  328 struct block *gen_mpls(compiler_state_t *, bpf_u_int32, int);
  329 
  330 struct block *gen_pppoed(compiler_state_t *);
  331 struct block *gen_pppoes(compiler_state_t *, bpf_u_int32, int);
  332 
  333 struct block *gen_geneve(compiler_state_t *, bpf_u_int32, int);
  334 
  335 struct block *gen_atmfield_code(compiler_state_t *, int, bpf_int32,
  336     bpf_u_int32, int);
  337 struct block *gen_atmtype_abbrev(compiler_state_t *, int type);
  338 struct block *gen_atmmulti_abbrev(compiler_state_t *, int type);
  339 
  340 struct block *gen_mtp2type_abbrev(compiler_state_t *, int type);
  341 struct block *gen_mtp3field_code(compiler_state_t *, int, bpf_u_int32,
  342     bpf_u_int32, int);
  343 
  344 struct block *gen_pf_ifname(compiler_state_t *, const char *);
  345 struct block *gen_pf_rnr(compiler_state_t *, int);
  346 struct block *gen_pf_srnr(compiler_state_t *, int);
  347 struct block *gen_pf_ruleset(compiler_state_t *, char *);
  348 struct block *gen_pf_reason(compiler_state_t *, int);
  349 struct block *gen_pf_action(compiler_state_t *, int);
  350 
  351 struct block *gen_p80211_type(compiler_state_t *, int, int);
  352 struct block *gen_p80211_fcdir(compiler_state_t *, int);
  353 
  354 /*
  355  * Representation of a program as a tree of blocks, plus current mark.
  356  * A block is marked if only if its mark equals the current mark.
  357  * Rather than traverse the code array, marking each item, 'cur_mark'
  358  * is incremented.  This automatically makes each element unmarked.
  359  */
  360 #define isMarked(icp, p) ((p)->mark == (icp)->cur_mark)
  361 #define unMarkAll(icp) (icp)->cur_mark += 1
  362 #define Mark(icp, p) ((p)->mark = (icp)->cur_mark)
  363 
  364 struct icode {
  365     struct block *root;
  366     int cur_mark;
  367 };
  368 
  369 int bpf_optimize(struct icode *, char *);
  370 void bpf_set_error(compiler_state_t *, const char *, ...)
  371     PCAP_PRINTFLIKE(2, 3);
  372 
  373 int finish_parse(compiler_state_t *, struct block *);
  374 char *sdup(compiler_state_t *, const char *);
  375 
  376 struct bpf_insn *icode_to_fcode(struct icode *, struct block *, u_int *,
  377     char *);
  378 void sappend(struct slist *, struct slist *);
  379 
  380 /*
  381  * Older versions of Bison don't put this declaration in
  382  * grammar.h.
  383  */
  384 int pcap_parse(void *, compiler_state_t *);
  385 
  386 /* XXX */
  387 #define JT(b)  ((b)->et.succ)
  388 #define JF(b)  ((b)->ef.succ)