Annotation of embedaddon/bird/filter/filter.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  *     BIRD Internet Routing Daemon -- Filters
                      3:  *
                      4:  *     (c) 1999 Pavel Machek <pavel@ucw.cz>
                      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"
                     13: #include "lib/ip.h"
                     14: #include "nest/route.h"
                     15: #include "nest/attrs.h"
                     16: 
                     17: struct f_inst {                /* Instruction */
                     18:   struct f_inst *next; /* Structure is 16 bytes, anyway */
                     19:   u16 code;
                     20:   u16 aux;
                     21:   union {
                     22:     int i;
                     23:     void *p;
                     24:   } a1;
                     25:   union {
                     26:     int i;
                     27:     void *p;
                     28:   } a2;
                     29:   int lineno;
                     30: };
                     31: 
                     32: #define arg1 a1.p
                     33: #define arg2 a2.p
                     34: 
                     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: 
                     41: struct f_inst3 {
                     42:   struct f_inst i;
                     43:   union {
                     44:     int i;
                     45:     void *p;
                     46:   } a3;
                     47: };
                     48: 
                     49: #define INST3(x) (((struct f_inst3 *) x)->a3)
                     50: 
                     51: 
                     52: struct f_prefix {
                     53:   ip_addr ip;
                     54:   int len;
                     55: #define LEN_MASK 0xff
                     56: #define LEN_PLUS  0x1000000
                     57: #define LEN_MINUS 0x2000000
                     58: #define LEN_RANGE 0x4000000
                     59:   /* If range then prefix must be in range (len >> 16 & 0xff, len >> 8 & 0xff) */
                     60: };
                     61: 
                     62: struct f_val {
                     63:   int type;
                     64:   union {
                     65:     uint i;
                     66:     u64 ec;
                     67:     lcomm lc;
                     68:     /*    ip_addr ip; Folded into prefix */
                     69:     struct f_prefix px;
                     70:     char *s;
                     71:     struct f_tree *t;
                     72:     struct f_trie *ti;
                     73:     struct adata *ad;
                     74:     struct f_path_mask *path_mask;
                     75:   } val;
                     76: };
                     77: 
                     78: struct filter {
                     79:   char *name;
                     80:   struct f_inst *root;
                     81: };
                     82: 
                     83: struct f_inst *f_new_inst(void);
                     84: 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 */
                     85: struct f_tree *f_new_tree(void);
                     86: struct f_inst *f_generate_complex(int operation, int operation_aux, struct f_inst *dyn, struct f_inst *argument);
                     87: struct f_inst *f_generate_roa_check(struct symbol *sym, struct f_inst *prefix, struct f_inst *asn);
                     88: 
                     89: 
                     90: struct f_tree *build_tree(struct f_tree *);
                     91: struct f_tree *find_tree(struct f_tree *t, struct f_val val);
                     92: int same_tree(struct f_tree *t1, struct f_tree *t2);
                     93: void tree_format(struct f_tree *t, buffer *buf);
                     94: 
                     95: struct f_trie *f_new_trie(linpool *lp, uint node_size);
                     96: void *trie_add_prefix(struct f_trie *t, ip_addr px, int plen, int l, int h);
                     97: int trie_match_prefix(struct f_trie *t, ip_addr px, int plen);
                     98: int trie_same(struct f_trie *t1, struct f_trie *t2);
                     99: void trie_format(struct f_trie *t, buffer *buf);
                    100: 
                    101: void fprefix_get_bounds(struct f_prefix *px, int *l, int *h);
                    102: 
                    103: static inline void
                    104: trie_add_fprefix(struct f_trie *t, struct f_prefix *px)
                    105: {
                    106:   int l, h;
                    107:   fprefix_get_bounds(px, &l, &h);
                    108:   trie_add_prefix(t, px->ip, px->len & LEN_MASK, l, h);
                    109: }
                    110: 
                    111: static inline int
                    112: trie_match_fprefix(struct f_trie *t, struct f_prefix *px)
                    113: {
                    114:   return trie_match_prefix(t, px->ip, px->len & LEN_MASK);
                    115: }
                    116: 
                    117: 
                    118: struct ea_list;
                    119: struct rte;
                    120: 
                    121: int f_run(struct filter *filter, struct rte **rte, struct ea_list **tmp_attrs, struct linpool *tmp_pool, int flags);
                    122: struct f_val f_eval_rte(struct f_inst *expr, struct rte **rte, struct linpool *tmp_pool);
                    123: struct f_val f_eval(struct f_inst *expr, struct linpool *tmp_pool);
                    124: uint f_eval_int(struct f_inst *expr);
                    125: u32 f_eval_asn(struct f_inst *expr);
                    126: 
                    127: char *filter_name(struct filter *filter);
                    128: int filter_same(struct filter *new, struct filter *old);
                    129: 
                    130: int i_same(struct f_inst *f1, struct f_inst *f2);
                    131: 
                    132: int val_compare(struct f_val v1, struct f_val v2);
                    133: int val_same(struct f_val v1, struct f_val v2);
                    134: 
                    135: void val_format(struct f_val v, buffer *buf);
                    136: 
                    137: 
                    138: #define F_NOP 0
                    139: #define F_NONL 1
                    140: #define F_ACCEPT 2     /* Need to preserve ordering: accepts < rejects! */
                    141: #define F_REJECT 3
                    142: #define F_ERROR 4
                    143: #define F_QUITBIRD 5
                    144: 
                    145: #define FILTER_ACCEPT NULL
                    146: #define FILTER_REJECT ((void *) 1)
                    147: 
                    148: /* Type numbers must be in 0..0xff range */
                    149: #define T_MASK 0xff
                    150: 
                    151: /* Internal types */
                    152: /* Do not use type of zero, that way we'll see errors easier. */
                    153: #define T_VOID 1
                    154: 
                    155: /* User visible types, which fit in int */
                    156: #define T_INT 0x10
                    157: #define T_BOOL 0x11
                    158: #define T_PAIR 0x12  /*        Notice that pair is stored as integer: first << 16 | second */
                    159: #define T_QUAD 0x13
                    160: 
                    161: /* Put enumerational types in 0x30..0x3f range */
                    162: #define T_ENUM_LO 0x30
                    163: #define T_ENUM_HI 0x3f
                    164: 
                    165: #define T_ENUM_RTS 0x30
                    166: #define T_ENUM_BGP_ORIGIN 0x31
                    167: #define T_ENUM_SCOPE 0x32
                    168: #define T_ENUM_RTC 0x33
                    169: #define T_ENUM_RTD 0x34
                    170: #define T_ENUM_ROA 0x35
                    171: /* new enums go here */
                    172: #define T_ENUM_EMPTY 0x3f      /* Special hack for atomic_aggr */
                    173: 
                    174: #define T_ENUM T_ENUM_LO ... T_ENUM_HI
                    175: 
                    176: /* Bigger ones */
                    177: #define T_IP 0x20
                    178: #define T_PREFIX 0x21
                    179: #define T_STRING 0x22
                    180: #define T_PATH_MASK 0x23       /* mask for BGP path */
                    181: #define T_PATH 0x24            /* BGP path */
                    182: #define T_CLIST 0x25           /* Community list */
                    183: #define T_EC 0x26              /* Extended community value, u64 */
                    184: #define T_ECLIST 0x27          /* Extended community list */
                    185: #define T_LC 0x28              /* Large community value, lcomm */
                    186: #define T_LCLIST 0x29          /* Large community list */
                    187: 
                    188: #define T_RETURN 0x40
                    189: #define T_SET 0x80
                    190: #define T_PREFIX_SET 0x81
                    191: 
                    192: 
                    193: #define SA_FROM                 1
                    194: #define SA_GW           2
                    195: #define SA_NET          3
                    196: #define SA_PROTO        4
                    197: #define SA_SOURCE       5
                    198: #define SA_SCOPE        6
                    199: #define SA_CAST                 7
                    200: #define SA_DEST                 8
                    201: #define SA_IFNAME       9
                    202: #define SA_IFINDEX     10
                    203: 
                    204: 
                    205: struct f_tree {
                    206:   struct f_tree *left, *right;
                    207:   struct f_val from, to;
                    208:   void *data;
                    209: };
                    210: 
                    211: struct f_trie_node
                    212: {
                    213:   ip_addr addr, mask, accept;
                    214:   int plen;
                    215:   struct f_trie_node *c[2];
                    216: };
                    217: 
                    218: struct f_trie
                    219: {
                    220:   linpool *lp;
                    221:   int zero;
                    222:   uint node_size;
                    223:   struct f_trie_node root[0];          /* Root trie node follows */
                    224: };
                    225: 
                    226: #define NEW_F_VAL struct f_val * val; val = cfg_alloc(sizeof(struct f_val));
                    227: 
                    228: #define FF_FORCE_TMPATTR 1             /* Force all attributes to be temporary */
                    229: 
                    230: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>