Handle properly enums for extended attributes

This commit is contained in:
Ondrej Zajicek (work) 2018-02-13 19:52:22 +01:00
parent d5144ea9bf
commit 1561ee799c
2 changed files with 7 additions and 6 deletions

View file

@ -24,11 +24,11 @@ f_new_inst(void)
} }
struct f_inst * struct f_inst *
f_new_dynamic_attr(int type, int f_type UNUSED, int code) f_new_dynamic_attr(int type, int f_type, int code)
{ {
/* FIXME: Remove the f_type parameter? */ /* FIXME: Remove the f_type parameter? */
struct f_inst *f = f_new_inst(); struct f_inst *f = f_new_inst();
f->aux = type; f->aux = (f_type << 8) | type;
f->a2.i = code; f->a2.i = code;
return f; return f;
} }

View file

@ -1005,6 +1005,7 @@ interpret(struct f_inst *what)
{ {
eattr *e = NULL; eattr *e = NULL;
u16 code = what->a2.i; u16 code = what->a2.i;
int f_type = what->aux >> 8;
if (!(f_flags & FF_FORCE_TMPATTR)) if (!(f_flags & FF_FORCE_TMPATTR))
e = ea_find((*f_rte)->attrs->eattrs, code); e = ea_find((*f_rte)->attrs->eattrs, code);
@ -1049,7 +1050,7 @@ interpret(struct f_inst *what)
switch (what->aux & EAF_TYPE_MASK) { switch (what->aux & EAF_TYPE_MASK) {
case EAF_TYPE_INT: case EAF_TYPE_INT:
res.type = T_INT; res.type = f_type;
res.val.i = e->u.data; res.val.i = e->u.data;
break; break;
case EAF_TYPE_ROUTER_ID: case EAF_TYPE_ROUTER_ID:
@ -1099,18 +1100,18 @@ interpret(struct f_inst *what)
{ {
struct ea_list *l = lp_alloc(f_pool, sizeof(struct ea_list) + sizeof(eattr)); struct ea_list *l = lp_alloc(f_pool, sizeof(struct ea_list) + sizeof(eattr));
u16 code = what->a2.i; u16 code = what->a2.i;
int f_type = what->aux >> 8;
l->next = NULL; l->next = NULL;
l->flags = EALF_SORTED; l->flags = EALF_SORTED;
l->count = 1; l->count = 1;
l->attrs[0].id = code; l->attrs[0].id = code;
l->attrs[0].flags = 0; l->attrs[0].flags = 0;
l->attrs[0].type = what->aux | EAF_ORIGINATED | EAF_FRESH; l->attrs[0].type = (what->aux & 0xff) | EAF_ORIGINATED | EAF_FRESH;
switch (what->aux & EAF_TYPE_MASK) { switch (what->aux & EAF_TYPE_MASK) {
case EAF_TYPE_INT: case EAF_TYPE_INT:
// Enums are also ints, so allow them in. if (v1.type != f_type)
if (v1.type != T_INT && (v1.type < T_ENUM_LO || v1.type > T_ENUM_HI))
runtime( "Setting int attribute to non-int value" ); runtime( "Setting int attribute to non-int value" );
l->attrs[0].u.data = v1.val.i; l->attrs[0].u.data = v1.val.i;
break; break;