diff options
Diffstat (limited to 'src/cmd/ip/snoopy/dat.h')
-rwxr-xr-x | src/cmd/ip/snoopy/dat.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/cmd/ip/snoopy/dat.h b/src/cmd/ip/snoopy/dat.h new file mode 100755 index 00000000..a4258c25 --- /dev/null +++ b/src/cmd/ip/snoopy/dat.h @@ -0,0 +1,106 @@ +typedef struct Field Field; +typedef struct Filter Filter; +typedef struct Msg Msg; +typedef struct Mux Mux; +typedef struct Proto Proto; + +#define NetS(x) ((((uchar*)x)[0]<<8) | ((uchar*)x)[1]) +#define Net3(x) ((((uchar*)x)[0]<<16) | (((uchar*)x)[1]<<8) | ((uchar*)x)[2]) +#define NetL(x) ((((uchar*)x)[0]<<24) | (((uchar*)x)[1]<<16) | (((uchar*)x)[2]<<8) | ((uchar*)x)[3]) + +/* + * one per protocol module + */ +struct Proto +{ + char* name; + void (*compile)(Filter*); + int (*filter)(Filter*, Msg*); + int (*seprint)(Msg*); + Mux* mux; + Field* field; + int (*framer)(int, uchar*, int); +}; +extern Proto *protos[]; + +/* + * one per protocol module, pointed to by Proto.mux + */ +struct Mux +{ + char* name; + ulong val; + Proto* pr; +}; + +/* + * a field defining a comparison filter + */ +struct Field +{ + char* name; + int ftype; + int subop; + char* help; +}; + +/* + * the status of the current message walk + */ +struct Msg +{ + uchar *ps; /* packet ptr */ + uchar *pe; /* packet end */ + + char *p; /* buffer start */ + char *e; /* buffer end */ + + int needroot; /* pr is root, need to see in expression */ + Proto *pr; /* current/next protocol */ +}; + +enum +{ + Fnum, /* just a number */ + Fether, /* ethernet address */ + Fv4ip, /* v4 ip address */ + Fv6ip, /* v6 ip address */ + Fba, /* byte array */ +}; + +/* + * a node in the filter tree + */ +struct Filter { + int op; /* token type */ + char *s; /* string */ + Filter *l; + Filter *r; + + Proto *pr; /* next protocol; + + /* protocol specific */ + int subop; + ulong param; + union { + ulong ulv; + vlong vlv; + uchar a[32]; + }; +}; + +extern void yyinit(char*); +extern int yyparse(void); +extern Filter* newfilter(void); +extern void compile_cmp(char*, Filter*, Field*); +extern void demux(Mux*, ulong, ulong, Msg*, Proto*); +extern int defaultframer(int, uchar*, int); +extern int opendevice(char*, int); + +extern int Nflag; +extern int dflag; +extern int Cflag; + +typedef Filter *Filterptr; +#define YYSTYPE Filterptr +extern Filter *filter; |