xref: /plan9/sys/src/cmd/ip/snoopy/dat.h (revision 64c7f6b621085267af4b575b992b6c601bb4d7ea)
19a747e4fSDavid du Colombier typedef struct Field Field;
29a747e4fSDavid du Colombier typedef struct Filter Filter;
39a747e4fSDavid du Colombier typedef struct Msg Msg;
49a747e4fSDavid du Colombier typedef struct Mux Mux;
59a747e4fSDavid du Colombier typedef struct Proto Proto;
69a747e4fSDavid du Colombier 
79a747e4fSDavid du Colombier #define NetS(x) ((((uchar*)x)[0]<<8) | ((uchar*)x)[1])
89a747e4fSDavid du Colombier #define Net3(x) ((((uchar*)x)[0]<<16) | (((uchar*)x)[1]<<8) | ((uchar*)x)[2])
99a747e4fSDavid du Colombier #define NetL(x) ((((uchar*)x)[0]<<24) | (((uchar*)x)[1]<<16) | (((uchar*)x)[2]<<8) | ((uchar*)x)[3])
109a747e4fSDavid du Colombier 
119a747e4fSDavid du Colombier /*
129a747e4fSDavid du Colombier  *  one per protocol module
139a747e4fSDavid du Colombier  */
149a747e4fSDavid du Colombier struct Proto
159a747e4fSDavid du Colombier {
169a747e4fSDavid du Colombier 	char*	name;
179a747e4fSDavid du Colombier 	void	(*compile)(Filter*);
189a747e4fSDavid du Colombier 	int	(*filter)(Filter*, Msg*);
199a747e4fSDavid du Colombier 	int	(*seprint)(Msg*);
209a747e4fSDavid du Colombier 	Mux*	mux;
21ed397113SDavid du Colombier 	char*	valfmt;
229a747e4fSDavid du Colombier 	Field*	field;
233ff48bf5SDavid du Colombier 	int	(*framer)(int, uchar*, int);
249a747e4fSDavid du Colombier };
259a747e4fSDavid du Colombier extern Proto *protos[];
269a747e4fSDavid du Colombier 
279a747e4fSDavid du Colombier /*
289a747e4fSDavid du Colombier  *  one per protocol module, pointed to by Proto.mux
299a747e4fSDavid du Colombier  */
309a747e4fSDavid du Colombier struct Mux
319a747e4fSDavid du Colombier {
329a747e4fSDavid du Colombier 	char*	name;
339a747e4fSDavid du Colombier 	ulong	val;
349a747e4fSDavid du Colombier 	Proto*	pr;
359a747e4fSDavid du Colombier };
369a747e4fSDavid du Colombier 
379a747e4fSDavid du Colombier /*
389a747e4fSDavid du Colombier  *  a field defining a comparison filter
399a747e4fSDavid du Colombier  */
409a747e4fSDavid du Colombier struct Field
419a747e4fSDavid du Colombier {
429a747e4fSDavid du Colombier 	char*	name;
439a747e4fSDavid du Colombier 	int	ftype;
449a747e4fSDavid du Colombier 	int	subop;
459a747e4fSDavid du Colombier 	char*	help;
469a747e4fSDavid du Colombier };
479a747e4fSDavid du Colombier 
489a747e4fSDavid du Colombier /*
499a747e4fSDavid du Colombier  *  the status of the current message walk
509a747e4fSDavid du Colombier  */
519a747e4fSDavid du Colombier struct Msg
529a747e4fSDavid du Colombier {
539a747e4fSDavid du Colombier 	uchar	*ps;	/* packet ptr */
549a747e4fSDavid du Colombier 	uchar	*pe;	/* packet end */
559a747e4fSDavid du Colombier 
569a747e4fSDavid du Colombier 	char	*p;	/* buffer start */
579a747e4fSDavid du Colombier 	char	*e;	/* buffer end */
589a747e4fSDavid du Colombier 
596b6b9ac8SDavid du Colombier 	int	needroot;	/* pr is root, need to see in expression */
609a747e4fSDavid du Colombier 	Proto	*pr;	/* current/next protocol */
619a747e4fSDavid du Colombier };
629a747e4fSDavid du Colombier 
639a747e4fSDavid du Colombier enum
649a747e4fSDavid du Colombier {
659a747e4fSDavid du Colombier 	Fnum,		/* just a number */
669a747e4fSDavid du Colombier 	Fether,		/* ethernet address */
679a747e4fSDavid du Colombier 	Fv4ip,		/* v4 ip address */
689a747e4fSDavid du Colombier 	Fv6ip,		/* v6 ip address */
699a747e4fSDavid du Colombier 	Fba,		/* byte array */
709a747e4fSDavid du Colombier };
719a747e4fSDavid du Colombier 
729a747e4fSDavid du Colombier /*
739a747e4fSDavid du Colombier  *  a node in the filter tree
749a747e4fSDavid du Colombier  */
759a747e4fSDavid du Colombier struct Filter {
769a747e4fSDavid du Colombier 	int	op;	/* token type */
779a747e4fSDavid du Colombier 	char	*s;	/* string */
789a747e4fSDavid du Colombier 	Filter	*l;
799a747e4fSDavid du Colombier 	Filter	*r;
809a747e4fSDavid du Colombier 
819a747e4fSDavid du Colombier 	Proto	*pr;	/* next protocol;
829a747e4fSDavid du Colombier 
839a747e4fSDavid du Colombier 	/* protocol specific */
849a747e4fSDavid du Colombier 	int	subop;
859a747e4fSDavid du Colombier 	ulong	param;
869a747e4fSDavid du Colombier 	union {
879a747e4fSDavid du Colombier 		ulong	ulv;
889a747e4fSDavid du Colombier 		vlong	vlv;
899a747e4fSDavid du Colombier 		uchar	a[32];
909a747e4fSDavid du Colombier 	};
919a747e4fSDavid du Colombier };
929a747e4fSDavid du Colombier 
939a747e4fSDavid du Colombier extern void	yyinit(char*);
949a747e4fSDavid du Colombier extern int	yyparse(void);
959a747e4fSDavid du Colombier extern Filter*	newfilter(void);
969a747e4fSDavid du Colombier extern void	compile_cmp(char*, Filter*, Field*);
979a747e4fSDavid du Colombier extern void	demux(Mux*, ulong, ulong, Msg*, Proto*);
983ff48bf5SDavid du Colombier extern int	defaultframer(int, uchar*, int);
999a747e4fSDavid du Colombier 
100*64c7f6b6SDavid du Colombier extern int Mflag;
1019a747e4fSDavid du Colombier extern int Nflag;
1029a747e4fSDavid du Colombier extern int dflag;
1039a747e4fSDavid du Colombier extern int Cflag;
1049a747e4fSDavid du Colombier 
1059a747e4fSDavid du Colombier typedef Filter *Filterptr;
1069a747e4fSDavid du Colombier #define YYSTYPE Filterptr
1079a747e4fSDavid du Colombier extern Filter *filter;
108