]>
Commit | Line | Data |
---|---|---|
b9d70dc8 | 1 | /* |
e0f2e42f | 2 | * BIRD Internet Routing Daemon -- Filters |
b9d70dc8 | 3 | * |
e0f2e42f | 4 | * (c) 1999 Pavel Machek <pavel@ucw.cz> |
b9d70dc8 PM |
5 | * |
6 | * Can be freely distributed and used under the terms of the GNU GPL. | |
7 | */ | |
8 | ||
9 | #ifndef _BIRD_FILT_H_ | |
10 | #define _BIRD_FILT_H_ | |
11 | ||
12 | #include "lib/resource.h" | |
23b1539b | 13 | #include "lib/ip.h" |
4847a894 | 14 | #include "nest/route.h" |
159fa4ce | 15 | #include "nest/attrs.h" |
b9d70dc8 | 16 | |
b7005824 PM |
17 | struct f_inst { /* Instruction */ |
18 | struct f_inst *next; /* Structure is 16 bytes, anyway */ | |
c7b43f33 PM |
19 | u16 code; |
20 | u16 aux; | |
2db3b288 PM |
21 | union { |
22 | int i; | |
23 | void *p; | |
24 | } a1; | |
25 | union { | |
26 | int i; | |
27 | void *p; | |
28 | } a2; | |
a96a979d | 29 | int lineno; |
b9d70dc8 PM |
30 | }; |
31 | ||
2db3b288 PM |
32 | #define arg1 a1.p |
33 | #define arg2 a2.p | |
34 | ||
af582c48 OZ |
35 | /* Not enough fields in f_inst for three args used by roa_check() */ |
36 | struct f_inst_roa_check { | |
37 | struct f_inst i; | |
38 | struct roa_table_config *rtc; | |
39 | }; | |
40 | ||
b1c9d871 | 41 | struct f_prefix { |
23b1539b PM |
42 | ip_addr ip; |
43 | int len; | |
d3dd620b | 44 | #define LEN_MASK 0xff |
6dc7a0cb PM |
45 | #define LEN_PLUS 0x1000000 |
46 | #define LEN_MINUS 0x2000000 | |
47 | #define LEN_RANGE 0x4000000 | |
48 | /* If range then prefix must be in range (len >> 16 & 0xff, len >> 8 & 0xff) */ | |
23b1539b PM |
49 | }; |
50 | ||
b7005824 PM |
51 | struct f_val { |
52 | int type; | |
53 | union { | |
52e030e1 | 54 | uint i; |
42a0c054 | 55 | u64 ec; |
6dc7a0cb | 56 | /* ip_addr ip; Folded into prefix */ |
b1c9d871 | 57 | struct f_prefix px; |
23b1539b | 58 | char *s; |
38506f71 | 59 | struct f_tree *t; |
b1a597e0 | 60 | struct f_trie *ti; |
10a53608 PM |
61 | struct adata *ad; |
62 | struct f_path_mask *path_mask; | |
b7005824 PM |
63 | } val; |
64 | }; | |
65 | ||
e0f2e42f MM |
66 | struct filter { |
67 | char *name; | |
68 | struct f_inst *root; | |
69 | }; | |
70 | ||
b7005824 | 71 | struct f_inst *f_new_inst(void); |
a2d15746 | 72 | struct f_inst *f_new_dynamic_attr(int type, int f_type, int code); /* Type as core knows it, type as filters know it, and code of dynamic attribute */ |
38506f71 | 73 | struct f_tree *f_new_tree(void); |
ad9074e9 | 74 | struct f_inst *f_generate_complex(int operation, int operation_aux, struct f_inst *dyn, struct f_inst *argument); |
af582c48 OZ |
75 | struct f_inst *f_generate_roa_check(struct symbol *sym, struct f_inst *prefix, struct f_inst *asn); |
76 | ||
38506f71 PM |
77 | |
78 | struct f_tree *build_tree(struct f_tree *); | |
79 | struct f_tree *find_tree(struct f_tree *t, struct f_val val); | |
9a4037d4 | 80 | int same_tree(struct f_tree *t1, struct f_tree *t2); |
0e175f9f | 81 | void tree_format(struct f_tree *t, buffer *buf); |
84c7e194 | 82 | |
7f0d245a OZ |
83 | struct f_trie *f_new_trie(linpool *lp); |
84 | void trie_add_prefix(struct f_trie *t, ip_addr px, int plen, int l, int h); | |
85 | int trie_match_prefix(struct f_trie *t, ip_addr px, int plen); | |
b1a597e0 | 86 | int trie_same(struct f_trie *t1, struct f_trie *t2); |
0e175f9f | 87 | void trie_format(struct f_trie *t, buffer *buf); |
b1a597e0 | 88 | |
7f0d245a OZ |
89 | void fprefix_get_bounds(struct f_prefix *px, int *l, int *h); |
90 | ||
91 | static inline void | |
92 | trie_add_fprefix(struct f_trie *t, struct f_prefix *px) | |
93 | { | |
94 | int l, h; | |
95 | fprefix_get_bounds(px, &l, &h); | |
96 | trie_add_prefix(t, px->ip, px->len & LEN_MASK, l, h); | |
97 | } | |
98 | ||
99 | static inline int | |
100 | trie_match_fprefix(struct f_trie *t, struct f_prefix *px) | |
101 | { | |
102 | return trie_match_prefix(t, px->ip, px->len & LEN_MASK); | |
103 | } | |
104 | ||
105 | ||
9a706f32 MM |
106 | struct ea_list; |
107 | struct rte; | |
108 | ||
0a06a9b8 | 109 | int f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool, int flags); |
508d9360 | 110 | struct f_val f_eval(struct f_inst *expr, struct linpool *tmp_pool); |
52e030e1 | 111 | uint f_eval_int(struct f_inst *expr); |
05198c12 OZ |
112 | u32 f_eval_asn(struct f_inst *expr); |
113 | ||
63a381db | 114 | char *filter_name(struct filter *filter); |
30a6108c | 115 | int filter_same(struct filter *new, struct filter *old); |
e0f2e42f | 116 | |
9a4037d4 PM |
117 | int i_same(struct f_inst *f1, struct f_inst *f2); |
118 | ||
38506f71 | 119 | int val_compare(struct f_val v1, struct f_val v2); |
28a10f84 | 120 | int val_same(struct f_val v1, struct f_val v2); |
23b1539b | 121 | |
0e175f9f OZ |
122 | void val_format(struct f_val v, buffer *buf); |
123 | ||
508d9360 | 124 | |
23b1539b | 125 | #define F_NOP 0 |
d3dd620b PM |
126 | #define F_NONL 1 |
127 | #define F_ACCEPT 2 /* Need to preserve ordering: accepts < rejects! */ | |
d46ffc97 MM |
128 | #define F_REJECT 3 |
129 | #define F_ERROR 4 | |
130 | #define F_QUITBIRD 5 | |
ca3d562b | 131 | |
63a381db MM |
132 | #define FILTER_ACCEPT NULL |
133 | #define FILTER_REJECT ((void *) 1) | |
134 | ||
ba921648 PM |
135 | /* Type numbers must be in 0..0xff range */ |
136 | #define T_MASK 0xff | |
137 | ||
138 | /* Internal types */ | |
c7b43f33 PM |
139 | /* Do not use type of zero, that way we'll see errors easier. */ |
140 | #define T_VOID 1 | |
ba921648 PM |
141 | |
142 | /* User visible types, which fit in int */ | |
143 | #define T_INT 0x10 | |
144 | #define T_BOOL 0x11 | |
7a86a8b0 | 145 | #define T_PAIR 0x12 /* Notice that pair is stored as integer: first << 16 | second */ |
126683fe | 146 | #define T_QUAD 0x13 |
f4536657 | 147 | |
2d496d20 | 148 | /* Put enumerational types in 0x30..0x3f range */ |
f4536657 | 149 | #define T_ENUM_LO 0x30 |
2d496d20 | 150 | #define T_ENUM_HI 0x3f |
f4536657 | 151 | |
cb8034f4 | 152 | #define T_ENUM_RTS 0x30 |
471bd6c3 | 153 | #define T_ENUM_BGP_ORIGIN 0x31 |
26c09e1d PM |
154 | #define T_ENUM_SCOPE 0x32 |
155 | #define T_ENUM_RTC 0x33 | |
156 | #define T_ENUM_RTD 0x34 | |
af582c48 | 157 | #define T_ENUM_ROA 0x35 |
471bd6c3 | 158 | /* new enums go here */ |
3bbc4ad6 | 159 | #define T_ENUM_EMPTY 0x3f /* Special hack for atomic_aggr */ |
cb8034f4 | 160 | |
f4536657 | 161 | #define T_ENUM T_ENUM_LO ... T_ENUM_HI |
ba921648 PM |
162 | |
163 | /* Bigger ones */ | |
164 | #define T_IP 0x20 | |
165 | #define T_PREFIX 0x21 | |
166 | #define T_STRING 0x22 | |
dcab7890 | 167 | #define T_PATH_MASK 0x23 /* mask for BGP path */ |
10a53608 PM |
168 | #define T_PATH 0x24 /* BGP path */ |
169 | #define T_CLIST 0x25 /* Community list */ | |
42a0c054 OZ |
170 | #define T_ECLIST 0x26 /* Extended community list */ |
171 | #define T_EC 0x27 /* Extended community value, u64 */ | |
ba921648 | 172 | |
2d496d20 | 173 | #define T_RETURN 0x40 |
ba921648 | 174 | #define T_SET 0x80 |
b1a597e0 | 175 | #define T_PREFIX_SET 0x81 |
d36d838d | 176 | |
a5fc5958 OZ |
177 | |
178 | #define SA_FROM 1 | |
179 | #define SA_GW 2 | |
180 | #define SA_NET 3 | |
181 | #define SA_PROTO 4 | |
182 | #define SA_SOURCE 5 | |
183 | #define SA_SCOPE 6 | |
184 | #define SA_CAST 7 | |
185 | #define SA_DEST 8 | |
186 | #define SA_IFNAME 9 | |
187 | #define SA_IFINDEX 10 | |
188 | ||
189 | ||
38506f71 PM |
190 | struct f_tree { |
191 | struct f_tree *left, *right; | |
192 | struct f_val from, to; | |
193 | void *data; | |
194 | }; | |
195 | ||
b1a597e0 OZ |
196 | struct f_trie_node |
197 | { | |
198 | ip_addr addr, mask, accept; | |
199 | int plen; | |
200 | struct f_trie_node *c[2]; | |
201 | }; | |
202 | ||
203 | struct f_trie | |
204 | { | |
7f0d245a | 205 | linpool *lp; |
b1a597e0 OZ |
206 | int zero; |
207 | struct f_trie_node root; | |
208 | }; | |
209 | ||
d3dd620b PM |
210 | #define NEW_F_VAL struct f_val * val; val = cfg_alloc(sizeof(struct f_val)); |
211 | ||
3076b5ae | 212 | #define FF_FORCE_TMPATTR 1 /* Force all attributes to be temporary */ |
0a06a9b8 | 213 | |
b9d70dc8 | 214 | #endif |