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