Checkign in new iproute2
[iproute2.git] / tc / m_ematch.h
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