summaryrefslogtreecommitdiff
path: root/filter
diff options
context:
space:
mode:
authorOndrej Zajicek (work) <santiago@crfreenet.org>2018-02-13 19:52:22 +0100
committerOndrej Zajicek (work) <santiago@crfreenet.org>2018-02-13 19:52:22 +0100
commit1561ee799cfe79d208ce9588e487da4b62a88dad (patch)
tree4dd9c1d68dbec9d82c65813e1fd044b5c53ff258 /filter
parentd5144ea9bf01f0b19cba40ab06aa05a11d70aa3e (diff)
Handle properly enums for extended attributes
Diffstat (limited to 'filter')
-rw-r--r--filter/f-util.c4
-rw-r--r--filter/filter.c9
2 files changed, 7 insertions, 6 deletions
diff --git a/filter/f-util.c b/filter/f-util.c
index 661941ec..52c13223 100644
--- a/filter/f-util.c
+++ b/filter/f-util.c
@@ -24,11 +24,11 @@ f_new_inst(void)
}
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? */
struct f_inst *f = f_new_inst();
- f->aux = type;
+ f->aux = (f_type << 8) | type;
f->a2.i = code;
return f;
}
diff --git a/filter/filter.c b/filter/filter.c
index 42e60a68..8cf90b53 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -1005,6 +1005,7 @@ interpret(struct f_inst *what)
{
eattr *e = NULL;
u16 code = what->a2.i;
+ int f_type = what->aux >> 8;
if (!(f_flags & FF_FORCE_TMPATTR))
e = ea_find((*f_rte)->attrs->eattrs, code);
@@ -1049,7 +1050,7 @@ interpret(struct f_inst *what)
switch (what->aux & EAF_TYPE_MASK) {
case EAF_TYPE_INT:
- res.type = T_INT;
+ res.type = f_type;
res.val.i = e->u.data;
break;
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));
u16 code = what->a2.i;
+ int f_type = what->aux >> 8;
l->next = NULL;
l->flags = EALF_SORTED;
l->count = 1;
l->attrs[0].id = code;
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) {
case EAF_TYPE_INT:
- // Enums are also ints, so allow them in.
- if (v1.type != T_INT && (v1.type < T_ENUM_LO || v1.type > T_ENUM_HI))
+ if (v1.type != f_type)
runtime( "Setting int attribute to non-int value" );
l->attrs[0].u.data = v1.val.i;
break;