]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Reset LLA NHT's interface if there is a change
authorvivek <vivek@cumulusnetworks.com>
Sun, 21 Mar 2021 20:39:51 +0000 (13:39 -0700)
committerDonald Sharp <sharpd@nvidia.com>
Mon, 22 Mar 2021 12:45:41 +0000 (08:45 -0400)
For link-local IPv6 next hops, the next hop tracking is implemented based
on interface status changes. For this purpose, the ifindex is stored in
the NHT. Reset this value if a change in ifindex is noticed, such as for
example after a restart of the networking service.

Also add some additional debug logs.

Signed-off-by: Vivek Venkatraman <vivek@nvidia.com>
Updates: "bgpd: Switch LL nexthop tracking to be interface based"

Ticket: RM 2575386
Testing Done:
1. Manual verification
2. Precommit (#156), evpn-smoke (#155), bgp-smoke (#157), vrl (#158)
-- Precommit is clean, reported failures in evpn-smoke & vrl are resolved
-- some other tests fail in evpn-smoke, bgp-smoke & vrl, appear to be existing
-- or unrelated failures

bgpd/bgp_nht.c

index 0fea198cd2b6e51ac70faba09d5db48499789dda..9c8d7878c513ac2bca0105b44f0672873d13a7c4 100644 (file)
@@ -194,6 +194,16 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop,
                                   bnc->srte_color, bnc->bgp->name_pretty,
                                   peer);
                }
+       } else {
+               if (BGP_DEBUG(nht, NHT)) {
+                       char buf[PREFIX2STR_BUFFER];
+
+                       zlog_debug(
+                               "Found existing bnc %s(%s) flags 0x%x ifindex %d #paths %d peer %p",
+                               bnc_str(bnc, buf, PREFIX2STR_BUFFER),
+                               bnc->bgp->name_pretty, bnc->flags, bnc->ifindex,
+                               bnc->path_count, bnc->nht_info);
+               }
        }
 
        if (is_bgp_static_route) {
@@ -237,6 +247,11 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop,
                UNSET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED);
                UNSET_FLAG(bnc->flags, BGP_NEXTHOP_VALID);
        }
+       if (peer && (bnc->ifindex != ifindex)) {
+               UNSET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED);
+               UNSET_FLAG(bnc->flags, BGP_NEXTHOP_VALID);
+               bnc->ifindex = ifindex;
+       }
        if (bgp_route->inst_type == BGP_INSTANCE_TYPE_VIEW) {
                SET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED);
                SET_FLAG(bnc->flags, BGP_NEXTHOP_VALID);
@@ -506,6 +521,11 @@ static int bgp_nht_ifp_initial(struct thread *thread)
        if (!ifp)
                return 0;
 
+       if (BGP_DEBUG(nht, NHT))
+               zlog_debug(
+                       "Handle NHT initial update for Intf %s(%d) status %s",
+                       ifp->name, ifp->ifindex, if_is_up(ifp) ? "up" : "down");
+
        if (if_is_up(ifp))
                bgp_nht_ifp_up(ifp);
        else