1 #ifndef __TC_EMATCH_H_ 2 #define __TC_EMATCH_H_ 3 4 #include <ctype.h> 5 #include <stdlib.h> 6 #include <string.h> 7 8 #include "utils.h" 9 #include "tc_util.h" 10 11 #define EMATCHKINDSIZ 16 12 13 struct bstr 14 { 15 char *data; 16 unsigned int len; 17 int quoted; 18 struct bstr *next; 19 }; 20 21 extern struct bstr * bstr_alloc(const char *text); 22 23 static inline struct bstr * bstr_new(char *data, unsigned int len) 24 { 25 struct bstr *b = calloc(1, sizeof(*b)); 26 27 if (b == NULL) 28 return NULL; 29 30 b->data = data; 31 b->len = len; 32 33 return b; 34 } 35 36 static inline int bstrcmp(struct bstr *b, const char *text) 37 { 38 int len = strlen(text); 39 int d = b->len - len; 40 41 if (d == 0) 42 return strncmp(b->data, text, len); 43 44 return d; 45 } 46 47 static inline struct bstr *bstr_next(struct bstr *b) 48 { 49 return b->next; 50 } 51 52 extern unsigned long bstrtoul(const struct bstr *b); 53 extern void bstr_print(FILE *fd, const struct bstr *b, int ascii); 54 55 56 struct ematch 57 { 58 struct bstr *args; 59 int index; 60 int inverted; 61 int relation; 62 int child_ref; 63 struct ematch *child; 64 struct ematch *next; 65 }; 66 67 static inline struct ematch * new_ematch(struct bstr *args, int inverted) 68 { 69 struct ematch *e = calloc(1, sizeof(*e)); 70 71 if (e == NULL) 72 return NULL; 73 74 e->args = args; 75 e->inverted = inverted; 76 77 return e; 78 } 79 80 extern void print_ematch_tree(const struct ematch *tree); 81 82 83 struct ematch_util 84 { 85 char kind[EMATCHKINDSIZ]; 86 int kind_num; 87 int (*parse_eopt)(struct nlmsghdr *,struct tcf_ematch_hdr *, 88 struct bstr *); 89 int (*print_eopt)(FILE *, struct tcf_ematch_hdr *, void *, int); 90 void (*print_usage)(FILE *); 91 struct ematch_util *next; 92 }; 93 94 static inline int parse_layer(struct bstr *b) 95 { 96 if (*((char *) b->data) == 'l') 97 return TCF_LAYER_LINK; 98 else if (*((char *) b->data) == 'n') 99 return TCF_LAYER_NETWORK; 100 else if (*((char *) b->data) == 't') 101 return TCF_LAYER_TRANSPORT; 102 else 103 return INT_MAX; 104 } 105 106 extern int em_parse_error(int err, struct bstr *args, struct bstr *carg, 107 struct ematch_util *, char *fmt, ...); 108 extern int print_ematch(FILE *, const struct rtattr *); 109 extern int parse_ematch(int *, char ***, int, struct nlmsghdr *); 110 111 #endif 112