The _EMPTY and _CONFED variants are easy to spot bare-eyed from the AS path.
and for <cf>aspa_check_upstream</cf> it is
<cf>aspa_check(<m/table/, bgp_path, true)</cf>.
Note: the ASPA check does not include the local ASN in the AS path.
+ Also, <cf>ASPA_INVALID</cf> is returned for an empty AS path
+ or for AS path containing <cf>CONFED_SET</cf> or <cf>CONFED_SEQUENCE</cf> blocks,
+ as the (draft) stipulates.
</itemize>
<p>The following example checks for ROA and ASPA on routes from a customer:
p1.prepend(65542);
bt_assert(aspa_check(at, p1, false) = ASPA_VALID);
- bt_assert(aspa_check(at, p1, true) = ASPA_INVALID_LEAK);
+ bt_assert(aspa_check(at, p1, true) = ASPA_INVALID);
p1.prepend(65555);
bt_assert(aspa_check(at, p1, false) = ASPA_UNKNOWN);
- bt_assert(aspa_check(at, p1, true) = ASPA_INVALID_LEAK);
+ bt_assert(aspa_check(at, p1, true) = ASPA_INVALID);
bgppath p2 = +empty+;
p2.prepend(65554);
p2.prepend(65543);
bt_assert(aspa_check(at, p2, false) = ASPA_UNKNOWN);
- bt_assert(aspa_check(at, p2, true) = ASPA_INVALID_LEAK);
+ bt_assert(aspa_check(at, p2, true) = ASPA_INVALID);
bgppath p3 = +empty+;
p3.prepend(65541);
p3.prepend(65544);
- bt_assert(aspa_check(at, p3, false) = ASPA_INVALID_LEAK);
- bt_assert(aspa_check(at, p3, true) = ASPA_INVALID_LEAK);
+ bt_assert(aspa_check(at, p3, false) = ASPA_INVALID);
+ bt_assert(aspa_check(at, p3, true) = ASPA_INVALID);
}
bt_test_suite(t_aspa_check, "Testing ASPA");
CF_ENUM(T_ENUM_SCOPE, SCOPE_, HOST, LINK, SITE, ORGANIZATION, UNIVERSE, UNDEFINED)
CF_ENUM(T_ENUM_RTD, RTD_, UNICAST, BLACKHOLE, UNREACHABLE, PROHIBIT)
CF_ENUM(T_ENUM_ROA, ROA_, UNKNOWN, VALID, INVALID)
-CF_ENUM(T_ENUM_ASPA, ASPA_, UNKNOWN, VALID, INVALID_EMPTY, INVALID_LEAK, INVALID_CONFED)
+CF_ENUM(T_ENUM_ASPA, ASPA_, UNKNOWN, VALID, INVALID)
CF_ENUM_PX(T_ENUM_AF, AF_, AFI_, IPV4, IPV6)
CF_ENUM(T_ENUM_MPLS_POLICY, MPLS_POLICY_, NONE, STATIC, PREFIX, AGGREGATE, VRF)
enum aspa_result {
ASPA_UNKNOWN = 0,
ASPA_VALID,
- ASPA_INVALID_EMPTY,
- ASPA_INVALID_CONFED,
- ASPA_INVALID_LEAK,
+ ASPA_INVALID,
};
#endif
/* No support for confed paths */
if (as_path_contains_confed(path))
- return ASPA_INVALID_CONFED;
+ return ASPA_INVALID;
/* Check path length */
uint len = as_path_getlen(path);
if (len == 0)
- return ASPA_INVALID_EMPTY;
+ return ASPA_INVALID;
/* Normalize the AS Path: drop stuffings */
u32 *asns = alloca(sizeof(u32) * len);
min_up = ap;
else if (ap && !up)
/* Exists but doesn't allow this upstream */
- return ASPA_INVALID_LEAK;
+ return ASPA_INVALID;
}
/* Fast path for no ASPA here */
return ASPA_UNKNOWN;
/* Now there is surely a valley there. */
- return ASPA_INVALID_LEAK;
+ return ASPA_INVALID;
}
/**