File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / filter / filter.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Aug 22 12:33:54 2017 UTC (6 years, 10 months ago) by misho
Branches: bird, MAIN
CVS tags: v1_6_3p0, v1_6_3, HEAD
bird 1.6.3

    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>