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