diff options
-rw-r--r-- | filter/filter.c | 43 | ||||
-rw-r--r-- | sysdep/bsd/krt-sock.c | 11 |
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 |