Diff for /embedaddon/bird/filter/filter.h between versions 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 2017/08/22 12:33:54 version 1.1.1.2, 2021/03/17 19:50:23
Line 14 Line 14
 #include "nest/route.h"  #include "nest/route.h"
 #include "nest/attrs.h"  #include "nest/attrs.h"
   
   /* Filter instruction types */
   
   #define FI__TWOCHAR(a,b)        ((a<<8) | b)
   #define FI__LIST \
     F(FI_ADD,                       0, '+') \
     F(FI_SUBTRACT,                  0, '-') \
     F(FI_MULTIPLY,                  0, '*') \
     F(FI_DIVIDE,                    0, '/') \
     F(FI_AND,                       0, '&') \
     F(FI_OR,                        0, '|') \
     F(FI_PAIR_CONSTRUCT,          'm', 'p') \
     F(FI_EC_CONSTRUCT,            'm', 'c') \
     F(FI_LC_CONSTRUCT,            'm', 'l') \
     F(FI_PATHMASK_CONSTRUCT,      'm', 'P') \
     F(FI_NEQ,                     '!', '=') \
     F(FI_EQ,                      '=', '=') \
     F(FI_LT,                        0, '<') \
     F(FI_LTE,                     '<', '=') \
     F(FI_NOT,                       0, '!') \
     F(FI_MATCH,                     0, '~') \
     F(FI_NOT_MATCH,               '!', '~') \
     F(FI_DEFINED,                 'd', 'e') \
     F(FI_SET,                       0, 's') \
     F(FI_CONSTANT,                  0, 'c') \
     F(FI_VARIABLE,                  0, 'V') \
     F(FI_CONSTANT_INDIRECT,         0, 'C') \
     F(FI_PRINT,                     0, 'p') \
     F(FI_CONDITION,                 0, '?') \
     F(FI_NOP,                       0, '0') \
     F(FI_PRINT_AND_DIE,           'p', ',') \
     F(FI_RTA_GET,                   0, 'a') \
     F(FI_RTA_SET,                 'a', 'S') \
     F(FI_EA_GET,                  'e', 'a') \
     F(FI_EA_SET,                  'e', 'S') \
     F(FI_PREF_GET,                  0, 'P') \
     F(FI_PREF_SET,                'P', 'S') \
     F(FI_LENGTH,                    0, 'L') \
     F(FI_IP,                      'c', 'p') \
     F(FI_AS_PATH_FIRST,           'a', 'f') \
     F(FI_AS_PATH_LAST,            'a', 'l') \
     F(FI_AS_PATH_LAST_NAG,        'a', 'L') \
     F(FI_RETURN,                    0, 'r') \
     F(FI_CALL,                    'c', 'a') \
     F(FI_CLEAR_LOCAL_VARS,        'c', 'V') \
     F(FI_SWITCH,                  'S', 'W') \
     F(FI_IP_MASK,                 'i', 'M') \
     F(FI_EMPTY,                     0, 'E') \
     F(FI_PATH_PREPEND,            'A', 'p') \
     F(FI_CLIST_ADD_DEL,           'C', 'a') \
     F(FI_ROA_CHECK,               'R', 'C')
   
   enum f_instruction_code {
   #define F(c,a,b) \
     c = FI__TWOCHAR(a,b),
   FI__LIST
   #undef F
   } PACKED;
   
 struct f_inst {         /* Instruction */  struct f_inst {         /* Instruction */
   struct f_inst *next;  /* Structure is 16 bytes, anyway */    struct f_inst *next;  /* Structure is 16 bytes, anyway */
  u16 code;  enum f_instruction_code fi_code;
   u16 aux;    u16 aux;
   union {    union {
     int i;      int i;
Line 75  struct f_val { Line 133  struct f_val {
   } val;    } val;
 };  };
   
   struct f_dynamic_attr {
     int type;
     int f_type;
     int ea_code;
   };
   
   struct f_static_attr {
     int f_type;
     int sa_code;
     int readonly;
   };
   
 struct filter {  struct filter {
   char *name;    char *name;
   struct f_inst *root;    struct f_inst *root;
 };  };
   
struct f_inst *f_new_inst(void);struct f_inst *f_new_inst(enum f_instruction_code fi_code);
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 */struct f_inst *f_new_inst_da(enum f_instruction_code fi_code, struct f_dynamic_attr da);
 struct f_inst *f_new_inst_sa(enum f_instruction_code fi_code, struct f_static_attr sa);
 static inline struct f_dynamic_attr 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 */
 { return (struct f_dynamic_attr) { .type = type, .f_type = f_type, .ea_code = code }; }   /* f_type currently unused; will be handy for static type checking */
 static inline struct f_static_attr f_new_static_attr(int f_type, int code, int readonly)
 { return (struct f_static_attr) { .f_type = f_type, .sa_code = code, .readonly = readonly }; }
 struct f_tree *f_new_tree(void);  struct f_tree *f_new_tree(void);
struct f_inst *f_generate_complex(int operation, int operation_aux, struct f_inst *dyn, struct f_inst *argument);struct f_inst *f_generate_complex(int operation, int operation_aux, struct f_dynamic_attr da, struct f_inst *argument);
 struct f_inst *f_generate_roa_check(struct symbol *sym, struct f_inst *prefix, struct f_inst *asn);  struct f_inst *f_generate_roa_check(struct symbol *sym, struct f_inst *prefix, struct f_inst *asn);
   
   
Line 122  int f_run(struct filter *filter, struct rte **rte, str Line 197  int f_run(struct filter *filter, struct rte **rte, str
 struct f_val f_eval_rte(struct f_inst *expr, struct rte **rte, struct linpool *tmp_pool);  struct f_val f_eval_rte(struct f_inst *expr, struct rte **rte, struct linpool *tmp_pool);
 struct f_val f_eval(struct f_inst *expr, struct linpool *tmp_pool);  struct f_val f_eval(struct f_inst *expr, struct linpool *tmp_pool);
 uint f_eval_int(struct f_inst *expr);  uint f_eval_int(struct f_inst *expr);
 u32 f_eval_asn(struct f_inst *expr);  
   
 char *filter_name(struct filter *filter);  char *filter_name(struct filter *filter);
 int filter_same(struct filter *new, struct filter *old);  int filter_same(struct filter *new, struct filter *old);
Line 168  void val_format(struct f_val v, buffer *buf); Line 242  void val_format(struct f_val v, buffer *buf);
 #define T_ENUM_RTC 0x33  #define T_ENUM_RTC 0x33
 #define T_ENUM_RTD 0x34  #define T_ENUM_RTD 0x34
 #define T_ENUM_ROA 0x35  #define T_ENUM_ROA 0x35
   #define T_ENUM_RA_PREFERENCE 0x36
 /* new enums go here */  /* new enums go here */
 #define T_ENUM_EMPTY 0x3f       /* Special hack for atomic_aggr */  #define T_ENUM_EMPTY 0x3f       /* Special hack for atomic_aggr */
   
Line 226  struct f_trie Line 301  struct f_trie
 #define NEW_F_VAL struct f_val * val; val = cfg_alloc(sizeof(struct f_val));  #define NEW_F_VAL struct f_val * val; val = cfg_alloc(sizeof(struct f_val));
   
 #define FF_FORCE_TMPATTR 1              /* Force all attributes to be temporary */  #define FF_FORCE_TMPATTR 1              /* Force all attributes to be temporary */
   #define FF_SILENT 2                     /* Silent filter execution */
   
 #endif  #endif

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


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