mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	Explicit definition structures of route attributes
Changes in internal API: * Every route attribute must be defined as struct ea_class somewhere. * Registration of route attributes known at startup must be done by ea_register_init() from protocol build functions. * Every attribute has now its symbol registered in a global symbol table defined as SYM_ATTRIBUTE * All attribute ID's are dynamically allocated. * Attribute value custom formatting hook is defined in the ea_class. * Attribute names are the same for display and filters, always prefixed by protocol name. Also added some unit testing code for filters with route attributes.
This commit is contained in:
		@@ -86,9 +86,12 @@ static uint cf_hash(const byte *c);
 | 
			
		||||
HASH_DEFINE_REHASH_FN(SYM, struct symbol)
 | 
			
		||||
 | 
			
		||||
HASH(struct keyword) kw_hash;
 | 
			
		||||
HASH(struct ea_class) ea_name_hash;
 | 
			
		||||
 | 
			
		||||
struct sym_scope *conf_this_scope;
 | 
			
		||||
struct sym_scope *global_root_scope;
 | 
			
		||||
 | 
			
		||||
static struct sym_scope global_root_scope__init = { .active = 1, };
 | 
			
		||||
struct sym_scope *global_root_scope = &global_root_scope__init;
 | 
			
		||||
 | 
			
		||||
linpool *cfg_mem;
 | 
			
		||||
 | 
			
		||||
@@ -598,6 +601,25 @@ cf_new_symbol(const byte *c)
 | 
			
		||||
  return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct symbol *
 | 
			
		||||
cf_root_symbol(const byte *c)
 | 
			
		||||
{
 | 
			
		||||
  uint l = strlen(c);
 | 
			
		||||
  if (l > SYM_MAX_LEN)
 | 
			
		||||
    bug("Root symbol %s too long", c);
 | 
			
		||||
 | 
			
		||||
  struct symbol *s = mb_alloc(&root_pool, sizeof(struct symbol) + l + 1);
 | 
			
		||||
  *s = (struct symbol) { .scope = global_root_scope, .class = SYM_VOID, };
 | 
			
		||||
  memcpy(s->name, c, l+1);
 | 
			
		||||
 | 
			
		||||
  if (!global_root_scope->hash.data)
 | 
			
		||||
    HASH_INIT(global_root_scope->hash, &root_pool, SYM_ORDER);
 | 
			
		||||
 | 
			
		||||
  HASH_INSERT2(global_root_scope->hash, SYM, &root_pool, s);
 | 
			
		||||
  return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cf_find_symbol_scope - find a symbol by name
 | 
			
		||||
 * @scope: config scope
 | 
			
		||||
@@ -652,7 +674,7 @@ cf_localize_symbol(struct symbol *sym)
 | 
			
		||||
  /* If the symbol type is void, it has been recently allocated just in this scope. */
 | 
			
		||||
  if (!sym->class)
 | 
			
		||||
    return sym;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  /* If the scope is the current, it is already defined in this scope. */
 | 
			
		||||
  if (sym->scope == conf_this_scope)
 | 
			
		||||
    cf_error("Symbol already defined");
 | 
			
		||||
@@ -716,8 +738,34 @@ cf_lex_init_kh(void)
 | 
			
		||||
  struct keyword *k;
 | 
			
		||||
  for (k=keyword_list; k->name; k++)
 | 
			
		||||
    HASH_INSERT(kw_hash, KW, k);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
  global_root_scope = mb_allocz(&root_pool, sizeof(*global_root_scope));
 | 
			
		||||
void
 | 
			
		||||
ea_lex_register(struct ea_class *def)
 | 
			
		||||
{
 | 
			
		||||
  struct symbol *sym = cf_root_symbol(def->name);
 | 
			
		||||
  sym->class = SYM_ATTRIBUTE;
 | 
			
		||||
  sym->attribute = def;
 | 
			
		||||
  def->sym = sym;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
ea_lex_unregister(struct ea_class *def)
 | 
			
		||||
{
 | 
			
		||||
  struct symbol *sym = def->sym;
 | 
			
		||||
  HASH_REMOVE2(global_root_scope->hash, SYM, &root_pool, sym);
 | 
			
		||||
  mb_free(sym);
 | 
			
		||||
  def->sym = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ea_class *
 | 
			
		||||
ea_class_find_by_name(const char *name)
 | 
			
		||||
{
 | 
			
		||||
  struct symbol *sym = cf_find_symbol(global_root_scope, name);
 | 
			
		||||
  if (!sym || (sym->class != SYM_ATTRIBUTE))
 | 
			
		||||
    return NULL;
 | 
			
		||||
  else
 | 
			
		||||
    return sym->attribute;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -120,7 +120,7 @@ struct symbol {
 | 
			
		||||
    const struct f_line *function;	/* For SYM_FUNCTION */
 | 
			
		||||
    const struct filter *filter;	/* For SYM_FILTER */
 | 
			
		||||
    struct rtable_config *table;	/* For SYM_TABLE */
 | 
			
		||||
    struct f_dynamic_attr *attribute;	/* For SYM_ATTRIBUTE */
 | 
			
		||||
    struct ea_class *attribute;		/* For SYM_ATTRIBUTE */
 | 
			
		||||
    struct f_val *val;			/* For SYM_CONSTANT */
 | 
			
		||||
    uint offset;			/* For SYM_VARIABLE */
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -71,8 +71,9 @@ CF_DECLS
 | 
			
		||||
  } xp;
 | 
			
		||||
  enum filter_return fret;
 | 
			
		||||
  enum ec_subtype ecs;
 | 
			
		||||
  struct f_dynamic_attr fda;
 | 
			
		||||
  struct ea_class *ea_class;
 | 
			
		||||
  struct f_static_attr fsa;
 | 
			
		||||
  struct f_attr_bit fab;
 | 
			
		||||
  struct f_lval flv;
 | 
			
		||||
  struct f_line *fl;
 | 
			
		||||
  const struct filter *f;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user