bgpd: BGP-LU use implicit-null in some cases

In some cases where bgp is at the mpls edge, where it has a BGP-LU
peer downstream but an IP peer upstream, it can advertise the
IMPLICIT_NULL label instead of a per-prefix label.

Signed-off-by: Mark Stapp <mstapp@nvidia.com>
This commit is contained in:
Mark Stapp 2021-10-05 11:49:20 -04:00
parent 01236d7aa7
commit bb2ca6927f
2 changed files with 27 additions and 5 deletions

View File

@ -244,6 +244,10 @@ void bgp_reg_dereg_for_label(struct bgp_dest *dest, struct bgp_path_info *pi,
p = bgp_dest_get_prefix(dest);
if (BGP_DEBUG(labelpool, LABELPOOL))
zlog_debug("%s: %pFX: %s ", __func__, p,
(reg ? "reg" : "dereg"));
if (reg) {
assert(pi);
/*

View File

@ -2711,6 +2711,28 @@ static void bgp_process_evpn_route_injection(struct bgp *bgp, afi_t afi,
bgp_evpn_withdraw_type5_route(bgp, p, afi, safi);
}
/*
* Utility to determine whether a particular path_info should use
* the IMPLICIT_NULL label. This is pretty specialized: it's only called
* in a path where we basically _know_ this is a BGP-LU route.
*/
static bool bgp_lu_need_imp_null(const struct bgp_path_info *new_select)
{
/* Certain types get imp null; so do paths where the nexthop is
* not labeled.
*/
if (new_select->sub_type == BGP_ROUTE_STATIC
|| new_select->sub_type == BGP_ROUTE_AGGREGATE
|| new_select->sub_type == BGP_ROUTE_REDISTRIBUTE)
return true;
else if (new_select->extra == NULL ||
!bgp_is_valid_label(&new_select->extra->label[0]))
/* TODO -- should be configurable? */
return true;
else
return false;
}
/*
* old_select = The old best path
* new_select = the new best path
@ -2802,11 +2824,7 @@ static void bgp_process_main_one(struct bgp *bgp, struct bgp_dest *dest,
* implicit-null for local routes, aggregate
* and redistributed routes
*/
if (new_select->sub_type == BGP_ROUTE_STATIC
|| new_select->sub_type
== BGP_ROUTE_AGGREGATE
|| new_select->sub_type
== BGP_ROUTE_REDISTRIBUTE) {
if (bgp_lu_need_imp_null(new_select)) {
if (CHECK_FLAG(
dest->flags,
BGP_NODE_REGISTERED_FOR_LABEL)