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