summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--filter/filter.c43
-rw-r--r--sysdep/bsd/krt-sock.c11
2 files changed, 33 insertions, 21 deletions
diff --git a/filter/filter.c b/filter/filter.c
index ec155ee6..81bfd4e5 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -605,42 +605,45 @@ interpret(struct f_inst *what)
e = ea_find( (*f_tmp_attrs), what->a2.i );
if ((!e) && (f_flags & FF_FORCE_TMPATTR))
e = ea_find( (*f_rte)->attrs->eattrs, what->a2.i );
-
- switch (what->aux & EAF_TYPE_MASK) {
- case EAF_TYPE_INT:
- if (!e) {
- res.type = T_VOID;
+
+ if (!e) {
+ /* A special case: undefined int_set looks like empty int_set */
+ if ((what->aux & EAF_TYPE_MASK) == EAF_TYPE_INT_SET) {
+ res.type = T_CLIST;
+ res.val.ad = adata_empty(f_pool);
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.val.i = e->u.data;
break;
+ case EAF_TYPE_OPAQUE:
+ res.type = T_ENUM_EMPTY;
+ res.val.i = 0;
+ break;
case EAF_TYPE_IP_ADDRESS:
- if (!e) {
- res.type = T_VOID;
- break;
- }
res.type = T_IP;
struct adata * ad = e->u.ptr;
res.val.px.ip = * (ip_addr *) ad->data;
break;
case EAF_TYPE_AS_PATH:
- if (!e) {
- res.type = T_VOID;
- break;
- }
res.type = T_PATH;
res.val.ad = e->u.ptr;
break;
case EAF_TYPE_INT_SET:
- if (!e) {
- res.type = T_CLIST;
- res.val.ad = adata_empty(f_pool);
- break;
- }
res.type = T_CLIST;
res.val.ad = e->u.ptr;
break;
+ case EAF_TYPE_UNDEF:
+ res.type = T_VOID;
+ break;
default:
bug("Unknown type in e,a");
}
@@ -659,10 +662,14 @@ interpret(struct f_inst *what)
l->attrs[0].type = what->aux | EAF_ORIGINATED;
switch (what->aux & EAF_TYPE_MASK) {
case EAF_TYPE_INT:
+ case EAF_TYPE_ROUTER_ID:
if (v1.type != T_INT)
runtime( "Setting int attribute to non-int value" );
l->attrs[0].u.data = v1.val.i;
break;
+ case EAF_TYPE_OPAQUE:
+ runtime( "Setting opaque attribute is not allowed" );
+ break;
case EAF_TYPE_IP_ADDRESS:
if (v1.type != T_IP)
runtime( "Setting ip attribute to non-ip value" );
diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c
index dac2c2e6..1dd09ae9 100644
--- a/sysdep/bsd/krt-sock.c
+++ b/sysdep/bsd/krt-sock.c
@@ -508,9 +508,6 @@ krt_read_addr(struct ks_msg *msg)
memcpy(&ifa.brd, &ibrd, sizeof(ip_addr));
scope = ipa_classify(ifa.ip);
-
- ifa.prefix = ipa_and(ifa.ip, ipa_mkmask(masklen));
-
if (scope < 0)
{
log(L_ERR "KIF: Invalid interface address %I for %s", ifa.ip, iface->name);
@@ -518,6 +515,14 @@ krt_read_addr(struct ks_msg *msg)
}
ifa.scope = scope & IADDR_SCOPE_MASK;
+ if (iface->flags & IF_MULTIACCESS)
+ ifa.prefix = ipa_and(ifa.ip, ipa_mkmask(masklen));
+ else /* PtP iface */
+ {
+ ifa.flags |= IA_UNNUMBERED;
+ ifa.prefix = ifa.opposite = ifa.brd;
+ }
+
if (new)
ifa_update(&ifa);
else