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;
char* valfmt;
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 Mflag;
extern int Nflag;
extern int dflag;
extern int Cflag;
typedef Filter *Filterptr;
#define YYSTYPE Filterptr
extern Filter *filter;
|