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