]>
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" |
b9d70dc8 | 14 | |
b7005824 PM |
15 | struct f_inst { /* Instruction */ |
16 | struct f_inst *next; /* Structure is 16 bytes, anyway */ | |
b9d70dc8 | 17 | int code; |
2db3b288 PM |
18 | union { |
19 | int i; | |
20 | void *p; | |
21 | } a1; | |
22 | union { | |
23 | int i; | |
24 | void *p; | |
25 | } a2; | |
b9d70dc8 PM |
26 | }; |
27 | ||
2db3b288 PM |
28 | #define arg1 a1.p |
29 | #define arg2 a2.p | |
30 | ||
23b1539b PM |
31 | struct prefix { |
32 | ip_addr ip; | |
33 | int len; | |
d3dd620b | 34 | #define LEN_MASK 0xff |
6dc7a0cb PM |
35 | #define LEN_PLUS 0x1000000 |
36 | #define LEN_MINUS 0x2000000 | |
37 | #define LEN_RANGE 0x4000000 | |
38 | /* If range then prefix must be in range (len >> 16 & 0xff, len >> 8 & 0xff) */ | |
23b1539b PM |
39 | }; |
40 | ||
b7005824 PM |
41 | struct f_val { |
42 | int type; | |
43 | union { | |
44 | int i; | |
6dc7a0cb | 45 | /* ip_addr ip; Folded into prefix */ |
2db3b288 | 46 | struct prefix px; |
23b1539b | 47 | char *s; |
38506f71 | 48 | struct f_tree *t; |
b7005824 PM |
49 | } val; |
50 | }; | |
51 | ||
e0f2e42f MM |
52 | struct filter { |
53 | char *name; | |
54 | struct f_inst *root; | |
55 | }; | |
56 | ||
ca3d562b | 57 | void filters_postconfig(void); |
b7005824 | 58 | struct f_inst *f_new_inst(void); |
38506f71 PM |
59 | struct f_tree *f_new_tree(void); |
60 | ||
61 | struct f_tree *build_tree(struct f_tree *); | |
62 | struct f_tree *find_tree(struct f_tree *t, struct f_val val); | |
84c7e194 | 63 | |
9a706f32 MM |
64 | struct ea_list; |
65 | struct rte; | |
66 | ||
63a381db MM |
67 | int f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool); |
68 | char *filter_name(struct filter *filter); | |
e0f2e42f | 69 | |
38506f71 PM |
70 | int val_compare(struct f_val v1, struct f_val v2); |
71 | void val_print(struct f_val v); | |
23b1539b PM |
72 | |
73 | #define F_NOP 0 | |
d3dd620b PM |
74 | #define F_NONL 1 |
75 | #define F_ACCEPT 2 /* Need to preserve ordering: accepts < rejects! */ | |
76 | #define F_MODIFY 3 /* FIXME: Introduce modification flags instead? */ | |
77 | #define F_REJECT 4 | |
78 | #define F_ERROR 5 | |
79 | #define F_QUITBIRD 6 | |
ca3d562b | 80 | |
63a381db MM |
81 | #define FILTER_ACCEPT NULL |
82 | #define FILTER_REJECT ((void *) 1) | |
83 | ||
ba921648 PM |
84 | /* Type numbers must be in 0..0xff range */ |
85 | #define T_MASK 0xff | |
86 | ||
87 | /* Internal types */ | |
b7005824 | 88 | #define T_VOID 0 |
d36d838d | 89 | #define T_RETURN 1 |
ba921648 PM |
90 | |
91 | /* User visible types, which fit in int */ | |
92 | #define T_INT 0x10 | |
93 | #define T_BOOL 0x11 | |
94 | #define T_PAIR 0x12 | |
f4536657 PM |
95 | |
96 | /* Put enumerational types in 0x30..0x7f range */ | |
97 | #define T_ENUM_LO 0x30 | |
98 | #define T_ENUM_HI 0x7f | |
99 | ||
cb8034f4 PM |
100 | #define T_ENUM_RTS 0x30 |
101 | ||
f4536657 | 102 | #define T_ENUM T_ENUM_LO ... T_ENUM_HI |
ba921648 PM |
103 | |
104 | /* Bigger ones */ | |
105 | #define T_IP 0x20 | |
106 | #define T_PREFIX 0x21 | |
107 | #define T_STRING 0x22 | |
108 | ||
109 | #define T_SET 0x80 | |
d36d838d | 110 | |
38506f71 PM |
111 | struct f_tree { |
112 | struct f_tree *left, *right; | |
113 | struct f_val from, to; | |
114 | void *data; | |
115 | }; | |
116 | ||
d3dd620b PM |
117 | #define NEW_F_VAL struct f_val * val; val = cfg_alloc(sizeof(struct f_val)); |
118 | ||
b9d70dc8 | 119 | #endif |