]> git.ipfire.org Git - thirdparty/bird.git/blame - filter/filter.h
Removes workaround related to import of kernel device routes.
[thirdparty/bird.git] / filter / filter.h
CommitLineData
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
17struct 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() */
36struct f_inst_roa_check {
37 struct f_inst i;
38 struct roa_table_config *rtc;
39};
40
b1c9d871 41struct 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
51struct f_val {
52 int type;
53 union {
54 int 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
66struct filter {
67 char *name;
68 struct f_inst *root;
69};
70
b7005824 71struct f_inst *f_new_inst(void);
a2d15746 72struct 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 73struct f_tree *f_new_tree(void);
ad9074e9 74struct f_inst *f_generate_complex(int operation, int operation_aux, struct f_inst *dyn, struct f_inst *argument);
af582c48
OZ
75struct f_inst *f_generate_roa_check(struct symbol *sym, struct f_inst *prefix, struct f_inst *asn);
76
38506f71
PM
77
78struct f_tree *build_tree(struct f_tree *);
79struct f_tree *find_tree(struct f_tree *t, struct f_val val);
9a4037d4 80int same_tree(struct f_tree *t1, struct f_tree *t2);
0e175f9f 81void tree_format(struct f_tree *t, buffer *buf);
84c7e194 82
7f0d245a
OZ
83struct f_trie *f_new_trie(linpool *lp);
84void trie_add_prefix(struct f_trie *t, ip_addr px, int plen, int l, int h);
85int trie_match_prefix(struct f_trie *t, ip_addr px, int plen);
b1a597e0 86int trie_same(struct f_trie *t1, struct f_trie *t2);
0e175f9f 87void trie_format(struct f_trie *t, buffer *buf);
b1a597e0 88
7f0d245a
OZ
89void fprefix_get_bounds(struct f_prefix *px, int *l, int *h);
90
91static inline void
92trie_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
99static inline int
100trie_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
106struct ea_list;
107struct rte;
108
0a06a9b8 109int f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool, int flags);
508d9360 110struct f_val f_eval(struct f_inst *expr, struct linpool *tmp_pool);
b1c9d871 111int f_eval_int(struct f_inst *expr);
05198c12
OZ
112u32 f_eval_asn(struct f_inst *expr);
113
63a381db 114char *filter_name(struct filter *filter);
30a6108c 115int filter_same(struct filter *new, struct filter *old);
e0f2e42f 116
9a4037d4
PM
117int i_same(struct f_inst *f1, struct f_inst *f2);
118
38506f71 119int val_compare(struct f_val v1, struct f_val v2);
28a10f84 120int val_same(struct f_val v1, struct f_val v2);
23b1539b 121
0e175f9f
OZ
122void 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
190struct f_tree {
191 struct f_tree *left, *right;
192 struct f_val from, to;
193 void *data;
194};
195
b1a597e0
OZ
196struct f_trie_node
197{
198 ip_addr addr, mask, accept;
199 int plen;
200 struct f_trie_node *c[2];
201};
202
203struct 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