1 typedef struct Field Field;
2 typedef struct Filter Filter;
3 typedef struct Msg Msg;
4 typedef struct Mux Mux;
5 typedef struct Proto Proto;
6 
7 #define NetS(x) ((((uchar*)x)[0]<<8) | ((uchar*)x)[1])
8 #define Net3(x) ((((uchar*)x)[0]<<16) | (((uchar*)x)[1]<<8) | ((uchar*)x)[2])
9 #define NetL(x) (((ulong)((((uchar*)x)[0]<<24) | (((uchar*)x)[1]<<16) | (((uchar*)x)[2]<<8) | ((uchar*)x)[3]))&0xFFFFFFFFU)
10 
11 #define LittleS(x) ((((uchar*)x)[1]<<8) | ((uchar*)x)[0])
12 #define LittleL(x) (((ulong)((((uchar*)x)[3]<<24) | (((uchar*)x)[2]<<16) | (((uchar*)x)[1]<<8) | ((uchar*)x)[0]))&0xFFFFFFFFU)
13 
14 /*
15  *  one per protocol module
16  */
17 struct Proto
18 {
19 	char*	name;
20 	void	(*compile)(Filter*);
21 	int	(*filter)(Filter*, Msg*);
22 	int	(*seprint)(Msg*);
23 	Mux*	mux;
24 	char*	valfmt;
25 	Field*	field;
26 	int	(*framer)(int, uchar*, int);
27 };
28 extern Proto *protos[];
29 
30 /*
31  *  one per protocol module, pointed to by Proto.mux
32  */
33 struct Mux
34 {
35 	char*	name;
36 	ulong	val;
37 	Proto*	pr;
38 };
39 
40 /*
41  *  a field defining a comparison filter
42  */
43 struct Field
44 {
45 	char*	name;
46 	int	ftype;
47 	int	subop;
48 	char*	help;
49 };
50 
51 /*
52  *  the status of the current message walk
53  */
54 struct Msg
55 {
56 	uchar	*ps;	/* packet ptr */
57 	uchar	*pe;	/* packet end */
58 
59 	char	*p;	/* buffer start */
60 	char	*e;	/* buffer end */
61 
62 	int	needroot;	/* pr is root, need to see in expression */
63 	Proto	*pr;	/* current/next protocol */
64 };
65 
66 enum
67 {
68 	Fnum,		/* just a number */
69 	Fether,		/* ethernet address */
70 	Fv4ip,		/* v4 ip address */
71 	Fv6ip,		/* v6 ip address */
72 	Fba,		/* byte array */
73 };
74 
75 /*
76  *  a node in the filter tree
77  */
78 struct Filter {
79 	int	op;	/* token type */
80 	char	*s;	/* string */
81 	Filter	*l;
82 	Filter	*r;
83 
84 	Proto	*pr;	/* next protocol;
85 
86 	/* protocol specific */
87 	int	subop;
88 	ulong	param;
89 	union {
90 		ulong	ulv;
91 		vlong	vlv;
92 		uchar	a[32];
93 	};
94 };
95 
96 extern void	yyinit(char*);
97 extern int	yyparse(void);
98 extern Filter*	newfilter(void);
99 extern void	compile_cmp(char*, Filter*, Field*);
100 extern void	demux(Mux*, ulong, ulong, Msg*, Proto*);
101 extern int	defaultframer(int, uchar*, int);
102 extern int	opendevice(char*, int);
103 
104 extern int Nflag;
105 extern int dflag;
106 extern int Cflag;
107 
108 typedef Filter *Filterptr;
109 #define YYSTYPE Filterptr
110 extern Filter *filter;
111