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