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
13struct bstr
14{
15	char	*data;
16	unsigned int	len;
17	int		quoted;
18	struct bstr	*next;
19};
20
21extern struct bstr * bstr_alloc(const char *text);
22
23static 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
36static 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
47static inline struct bstr *bstr_next(struct bstr *b)
48{
49	return b->next;
50}
51
52extern unsigned long bstrtoul(const struct bstr *b);
53extern void bstr_print(FILE *fd, const struct bstr *b, int ascii);
54
55
56struct 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
67static 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
80extern void print_ematch_tree(const struct ematch *tree);
81
82
83struct 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
94static 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
106extern int em_parse_error(int err, struct bstr *args, struct bstr *carg,
107		   struct ematch_util *, char *fmt, ...);
108extern int print_ematch(FILE *, const struct rtattr *);
109extern int parse_ematch(int *, char ***, int, struct nlmsghdr *);
110
111#endif
112