bgpd: upon if event, evaluate bnc with matching nexthop

In BGP, when an interface event is detected or triggered,
the BNC that have a next-hop that matches the interface
are not evaluated.

The paths attached to the bnc context are evaluated in the
following situation:
- In the up event case, if at least one next-hop interface
matched the event interface.
- In the down event case, if there is no alternate next-hop
that does not use the event interface.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
This commit is contained in:
Philippe Guibert 2023-05-11 17:11:14 +02:00
parent 713831fa7f
commit 4f725062a4

View File

@ -707,9 +707,40 @@ static void bgp_nht_ifp_table_handle(struct bgp *bgp,
struct interface *ifp, bool up)
{
struct bgp_nexthop_cache *bnc;
struct nexthop *nhop;
uint8_t other_nh_count;
bool nhop_found;
frr_each (bgp_nexthop_cache, table, bnc) {
if (bnc->ifindex_ipv6_ll != ifp->ifindex)
other_nh_count = 0;
nhop_found = bnc->ifindex_ipv6_ll == ifp->ifindex;
for (nhop = bnc->nexthop; nhop; nhop = nhop->next) {
if (nhop->ifindex == bnc->ifindex_ipv6_ll)
continue;
if (nhop->ifindex != ifp->ifindex) {
other_nh_count++;
continue;
}
if (nhop->vrf_id != ifp->vrf->vrf_id) {
other_nh_count++;
continue;
}
nhop_found = true;
}
if (!nhop_found)
/* The event interface does not match the nexthop cache
* entry */
continue;
if (!up && other_nh_count > 0)
/* Down event ignored in case of multiple next-hop
* interfaces. The other might interfaces might be still
* up. The cases where all interfaces are down or a bnc
* is invalid are processed by a separate zebra rnh
* messages.
*/
continue;
bnc->last_update = monotime(NULL);