Fixes missing cases in filters.
This commit is contained in:
parent
afa9f66c27
commit
e8da1bd0b5
1 changed files with 25 additions and 18 deletions
|
@ -605,42 +605,45 @@ interpret(struct f_inst *what)
|
||||||
e = ea_find( (*f_tmp_attrs), what->a2.i );
|
e = ea_find( (*f_tmp_attrs), what->a2.i );
|
||||||
if ((!e) && (f_flags & FF_FORCE_TMPATTR))
|
if ((!e) && (f_flags & FF_FORCE_TMPATTR))
|
||||||
e = ea_find( (*f_rte)->attrs->eattrs, what->a2.i );
|
e = ea_find( (*f_rte)->attrs->eattrs, what->a2.i );
|
||||||
|
|
||||||
switch (what->aux & EAF_TYPE_MASK) {
|
if (!e) {
|
||||||
case EAF_TYPE_INT:
|
/* A special case: undefined int_set looks like empty int_set */
|
||||||
if (!e) {
|
if ((what->aux & EAF_TYPE_MASK) == EAF_TYPE_INT_SET) {
|
||||||
res.type = T_VOID;
|
res.type = T_CLIST;
|
||||||
|
res.val.ad = adata_empty(f_pool);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/* Undefined value */
|
||||||
|
res.type = T_VOID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (what->aux & EAF_TYPE_MASK) {
|
||||||
|
case EAF_TYPE_INT:
|
||||||
|
case EAF_TYPE_ROUTER_ID:
|
||||||
res.type = T_INT;
|
res.type = T_INT;
|
||||||
res.val.i = e->u.data;
|
res.val.i = e->u.data;
|
||||||
break;
|
break;
|
||||||
|
case EAF_TYPE_OPAQUE:
|
||||||
|
res.type = T_ENUM_EMPTY;
|
||||||
|
res.val.i = 0;
|
||||||
|
break;
|
||||||
case EAF_TYPE_IP_ADDRESS:
|
case EAF_TYPE_IP_ADDRESS:
|
||||||
if (!e) {
|
|
||||||
res.type = T_VOID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
res.type = T_IP;
|
res.type = T_IP;
|
||||||
struct adata * ad = e->u.ptr;
|
struct adata * ad = e->u.ptr;
|
||||||
res.val.px.ip = * (ip_addr *) ad->data;
|
res.val.px.ip = * (ip_addr *) ad->data;
|
||||||
break;
|
break;
|
||||||
case EAF_TYPE_AS_PATH:
|
case EAF_TYPE_AS_PATH:
|
||||||
if (!e) {
|
|
||||||
res.type = T_VOID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
res.type = T_PATH;
|
res.type = T_PATH;
|
||||||
res.val.ad = e->u.ptr;
|
res.val.ad = e->u.ptr;
|
||||||
break;
|
break;
|
||||||
case EAF_TYPE_INT_SET:
|
case EAF_TYPE_INT_SET:
|
||||||
if (!e) {
|
|
||||||
res.type = T_CLIST;
|
|
||||||
res.val.ad = adata_empty(f_pool);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
res.type = T_CLIST;
|
res.type = T_CLIST;
|
||||||
res.val.ad = e->u.ptr;
|
res.val.ad = e->u.ptr;
|
||||||
break;
|
break;
|
||||||
|
case EAF_TYPE_UNDEF:
|
||||||
|
res.type = T_VOID;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
bug("Unknown type in e,a");
|
bug("Unknown type in e,a");
|
||||||
}
|
}
|
||||||
|
@ -659,10 +662,14 @@ interpret(struct f_inst *what)
|
||||||
l->attrs[0].type = what->aux | EAF_ORIGINATED;
|
l->attrs[0].type = what->aux | EAF_ORIGINATED;
|
||||||
switch (what->aux & EAF_TYPE_MASK) {
|
switch (what->aux & EAF_TYPE_MASK) {
|
||||||
case EAF_TYPE_INT:
|
case EAF_TYPE_INT:
|
||||||
|
case EAF_TYPE_ROUTER_ID:
|
||||||
if (v1.type != T_INT)
|
if (v1.type != T_INT)
|
||||||
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;
|
||||||
|
case EAF_TYPE_OPAQUE:
|
||||||
|
runtime( "Setting opaque attribute is not allowed" );
|
||||||
|
break;
|
||||||
case EAF_TYPE_IP_ADDRESS:
|
case EAF_TYPE_IP_ADDRESS:
|
||||||
if (v1.type != T_IP)
|
if (v1.type != T_IP)
|
||||||
runtime( "Setting ip attribute to non-ip value" );
|
runtime( "Setting ip attribute to non-ip value" );
|
||||||
|
|
Loading…
Reference in a new issue