]> git.ipfire.org Git - thirdparty/bird.git/blame - filter/filter.h
DEF_PREF_UKR and DEF_PREF_SINK removed.
[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"
b9d70dc8 14
b7005824
PM
15struct 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
31struct 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
41struct 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
52struct filter {
53 char *name;
54 struct f_inst *root;
55};
56
ca3d562b 57void filters_postconfig(void);
b7005824 58struct f_inst *f_new_inst(void);
38506f71
PM
59struct f_tree *f_new_tree(void);
60
61struct f_tree *build_tree(struct f_tree *);
62struct f_tree *find_tree(struct f_tree *t, struct f_val val);
84c7e194 63
9a706f32
MM
64struct ea_list;
65struct rte;
66
63a381db
MM
67int f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool);
68char *filter_name(struct filter *filter);
e0f2e42f 69
38506f71
PM
70int val_compare(struct f_val v1, struct f_val v2);
71void 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
111struct 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