• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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: /tcpdump/master/libpcap/gencode.h,v 1.71 2007-11-18 02:03:52 guy Exp $ (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  #ifndef HAVE___ATTRIBUTE__
59  #define __attribute__(x)
60  #endif /* HAVE___ATTRIBUTE__ */
61  
62  /* Address qualifiers. */
63  
64  #define Q_HOST		1
65  #define Q_NET		2
66  #define Q_PORT		3
67  #define Q_GATEWAY	4
68  #define Q_PROTO		5
69  #define Q_PROTOCHAIN	6
70  #define Q_PORTRANGE	7
71  
72  /* Protocol qualifiers. */
73  
74  #define Q_LINK		1
75  #define Q_IP		2
76  #define Q_ARP		3
77  #define Q_RARP		4
78  #define Q_SCTP		5
79  #define Q_TCP		6
80  #define Q_UDP		7
81  #define Q_ICMP		8
82  #define Q_IGMP		9
83  #define Q_IGRP		10
84  
85  
86  #define	Q_ATALK		11
87  #define	Q_DECNET	12
88  #define	Q_LAT		13
89  #define Q_SCA		14
90  #define	Q_MOPRC		15
91  #define	Q_MOPDL		16
92  
93  
94  #define Q_IPV6		17
95  #define Q_ICMPV6	18
96  #define Q_AH		19
97  #define Q_ESP		20
98  
99  #define Q_PIM		21
100  #define Q_VRRP		22
101  
102  #define Q_AARP		23
103  
104  #define Q_ISO		24
105  #define Q_ESIS		25
106  #define Q_ISIS		26
107  #define Q_CLNP		27
108  
109  #define Q_STP		28
110  
111  #define Q_IPX		29
112  
113  #define Q_NETBEUI	30
114  
115  /* IS-IS Levels */
116  #define Q_ISIS_L1       31
117  #define Q_ISIS_L2       32
118  /* PDU types */
119  #define Q_ISIS_IIH      33
120  #define Q_ISIS_LAN_IIH  34
121  #define Q_ISIS_PTP_IIH  35
122  #define Q_ISIS_SNP      36
123  #define Q_ISIS_CSNP     37
124  #define Q_ISIS_PSNP     38
125  #define Q_ISIS_LSP      39
126  
127  #define Q_RADIO		40
128  
129  #define Q_CARP		41
130  
131  /* Directional qualifiers. */
132  
133  #define Q_SRC		1
134  #define Q_DST		2
135  #define Q_OR		3
136  #define Q_AND		4
137  #define Q_ADDR1		5
138  #define Q_ADDR2		6
139  #define Q_ADDR3		7
140  #define Q_ADDR4		8
141  #define Q_RA		9
142  #define Q_TA		10
143  
144  #define Q_DEFAULT	0
145  #define Q_UNDEF		255
146  
147  /* ATM types */
148  #define A_METAC		22	/* Meta signalling Circuit */
149  #define A_BCC		23	/* Broadcast Circuit */
150  #define A_OAMF4SC	24	/* Segment OAM F4 Circuit */
151  #define A_OAMF4EC	25	/* End-to-End OAM F4 Circuit */
152  #define A_SC		26	/* Signalling Circuit*/
153  #define A_ILMIC		27	/* ILMI Circuit */
154  #define A_OAM		28	/* OAM cells : F4 only */
155  #define A_OAMF4		29	/* OAM F4 cells: Segment + End-to-end */
156  #define A_LANE		30	/* LANE traffic */
157  #define A_LLC		31	/* LLC-encapsulated traffic */
158  
159  /* Based on Q.2931 signalling protocol */
160  #define A_SETUP		41	/* Setup message */
161  #define A_CALLPROCEED	42	/* Call proceeding message */
162  #define A_CONNECT	43	/* Connect message */
163  #define A_CONNECTACK	44	/* Connect Ack message */
164  #define A_RELEASE	45	/* Release message */
165  #define A_RELEASE_DONE	46	/* Release message */
166  
167  /* ATM field types */
168  #define A_VPI		51
169  #define A_VCI		52
170  #define A_PROTOTYPE	53
171  #define A_MSGTYPE	54
172  #define A_CALLREFTYPE	55
173  
174  #define A_CONNECTMSG	70	/* returns Q.2931 signalling messages for
175  				   establishing and destroying switched
176  				   virtual connection */
177  #define A_METACONNECT	71	/* returns Q.2931 signalling messages for
178  				   establishing and destroying predefined
179  				   virtual circuits, such as broadcast
180  				   circuit, oamf4 segment circuit, oamf4
181  				   end-to-end circuits, ILMI circuits or
182  				   connection signalling circuit. */
183  
184  /* MTP2 types */
185  #define M_FISU		22	/* FISU */
186  #define M_LSSU		23	/* LSSU */
187  #define M_MSU		24	/* MSU */
188  
189  /* MTP2 HSL types */
190  #define MH_FISU		25	/* FISU for HSL */
191  #define MH_LSSU		26	/* LSSU */
192  #define MH_MSU		27	/* MSU */
193  
194  /* MTP3 field types */
195  #define M_SIO		1
196  #define M_OPC		2
197  #define M_DPC		3
198  #define M_SLS		4
199  
200  /* MTP3 field types in case of MTP2 HSL */
201  #define MH_SIO		5
202  #define MH_OPC		6
203  #define MH_DPC		7
204  #define MH_SLS		8
205  
206  
207  struct slist;
208  
209  struct stmt {
210  	int code;
211  	struct slist *jt;	/*only for relative jump in block*/
212  	struct slist *jf;	/*only for relative jump in block*/
213  	bpf_int32 k;
214  };
215  
216  struct slist {
217  	struct stmt s;
218  	struct slist *next;
219  };
220  
221  /*
222   * A bit vector to represent definition sets.  We assume TOT_REGISTERS
223   * is smaller than 8*sizeof(atomset).
224   */
225  typedef bpf_u_int32 atomset;
226  #define ATOMMASK(n) (1 << (n))
227  #define ATOMELEM(d, n) (d & ATOMMASK(n))
228  
229  /*
230   * An unbounded set.
231   */
232  typedef bpf_u_int32 *uset;
233  
234  /*
235   * Total number of atomic entities, including accumulator (A) and index (X).
236   * We treat all these guys similarly during flow analysis.
237   */
238  #define N_ATOMS (BPF_MEMWORDS+2)
239  
240  struct edge {
241  	int id;
242  	int code;
243  	uset edom;
244  	struct block *succ;
245  	struct block *pred;
246  	struct edge *next;	/* link list of incoming edges for a node */
247  };
248  
249  struct block {
250  	int id;
251  	struct slist *stmts;	/* side effect stmts */
252  	struct stmt s;		/* branch stmt */
253  	int mark;
254  	u_int longjt;		/* jt branch requires long jump */
255  	u_int longjf;		/* jf branch requires long jump */
256  	int level;
257  	int offset;
258  	int sense;
259  	struct edge et;
260  	struct edge ef;
261  	struct block *head;
262  	struct block *link;	/* link field used by optimizer */
263  	uset dom;
264  	uset closure;
265  	struct edge *in_edges;
266  	atomset def, kill;
267  	atomset in_use;
268  	atomset out_use;
269  	int oval;
270  	int val[N_ATOMS];
271  };
272  
273  struct arth {
274  	struct block *b;	/* protocol checks */
275  	struct slist *s;	/* stmt list */
276  	int regno;		/* virtual register number of result */
277  };
278  
279  struct qual {
280  	unsigned char addr;
281  	unsigned char proto;
282  	unsigned char dir;
283  	unsigned char pad;
284  };
285  
286  struct arth *gen_loadi(int);
287  struct arth *gen_load(int, struct arth *, int);
288  struct arth *gen_loadlen(void);
289  struct arth *gen_neg(struct arth *);
290  struct arth *gen_arth(int, struct arth *, struct arth *);
291  
292  void gen_and(struct block *, struct block *);
293  void gen_or(struct block *, struct block *);
294  void gen_not(struct block *);
295  
296  struct block *gen_scode(const char *, struct qual);
297  struct block *gen_ecode(const u_char *, struct qual);
298  struct block *gen_acode(const u_char *, struct qual);
299  struct block *gen_mcode(const char *, const char *, int, struct qual);
300  #ifdef INET6
301  struct block *gen_mcode6(const char *, const char *, int, struct qual);
302  #endif
303  struct block *gen_ncode(const char *, bpf_u_int32, struct qual);
304  struct block *gen_proto_abbrev(int);
305  struct block *gen_relation(int, struct arth *, struct arth *, int);
306  struct block *gen_less(int);
307  struct block *gen_greater(int);
308  struct block *gen_byteop(int, int, int);
309  struct block *gen_broadcast(int);
310  struct block *gen_multicast(int);
311  struct block *gen_inbound(int);
312  
313  struct block *gen_vlan(int);
314  struct block *gen_mpls(int);
315  
316  struct block *gen_pppoed(void);
317  struct block *gen_pppoes(int);
318  
319  struct block *gen_atmfield_code(int atmfield, bpf_int32 jvalue, bpf_u_int32 jtype, int reverse);
320  struct block *gen_atmtype_abbrev(int type);
321  struct block *gen_atmmulti_abbrev(int type);
322  
323  struct block *gen_mtp2type_abbrev(int type);
324  struct block *gen_mtp3field_code(int mtp3field, bpf_u_int32 jvalue, bpf_u_int32 jtype, int reverse);
325  
326  struct block *gen_pf_ifname(const char *);
327  struct block *gen_pf_rnr(int);
328  struct block *gen_pf_srnr(int);
329  struct block *gen_pf_ruleset(char *);
330  struct block *gen_pf_reason(int);
331  struct block *gen_pf_action(int);
332  struct block *gen_pf_dir(int);
333  
334  struct block *gen_p80211_type(int, int);
335  struct block *gen_p80211_fcdir(int);
336  
337  void bpf_optimize(struct block **);
338  void bpf_error(const char *, ...)
339      __attribute__((noreturn))
340  #ifdef __ATTRIBUTE___FORMAT_OK
341      __attribute__((format (printf, 1, 2)))
342  #endif /* __ATTRIBUTE___FORMAT_OK */
343      ;
344  
345  void finish_parse(struct block *);
346  char *sdup(const char *);
347  
348  struct bpf_insn *icode_to_fcode(struct block *, u_int *);
349  int pcap_parse(void);
350  void lex_init(const char *);
351  void lex_cleanup(void);
352  void sappend(struct slist *, struct slist *);
353  
354  /* XXX */
355  #define JT(b)  ((b)->et.succ)
356  #define JF(b)  ((b)->ef.succ)
357  
358  extern int no_optimize;
359