]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: re-evaluated S,G OILs upon RP changes and for empty SG upstream oils 15342/head
authorRajesh Varatharaj <rvaratharaj@nvidia.com>
Thu, 8 Feb 2024 02:58:39 +0000 (18:58 -0800)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Fri, 9 Feb 2024 15:15:51 +0000 (15:15 +0000)
Topology:

TOR11 (FHR) --- LEAF-11---SPINE1 (RP)MSDP SPINE-2(RP)MSDP --- LEAF-12 -- TOR12 (LHR)
        |         |                    | |       |
|         -----------------------------------------------------(ECMP)   |
|         |                                 |               |
 -----------------------------------------------------------------------(ECMP)
Issue:
In some triggers, S,G upstream is preserved even with the PP timer expiry, resulting
in S,G with NULL OILS. This could be because we create a dummy S,G upstream and
dummy channel_oif for *,G, where RPF is UNKNOWN. As a result, PIM+VXLAN traffic is never
forwarded downstream to LHR.

Fix:
when the S,G stream is running, Determine if a reevaluation of the outgoing interface
 list (OIL) is required. S,G upstream should then inherit the OIL from *,G.

Testing:
- Evpn pim tests - TestEvpnPimSingleVtepOneMdt.test_02_broadcast_traffic_spt_zero
- pim-smoke

Ticket: #
Signed-off-by: Rajesh Varatharaj <rvaratharaj@nvidia.com>
(cherry picked from commit 071d43a052e04de52771b2f03461c407f0ced36f)

pimd/pim_mroute.c
pimd/pim_upstream.c
pimd/pim_upstream.h

index 3d15666dd60052d057f11cf941feea46c1d87c0f..399a05369865de11be32f41e92a2129cdc205c2f 100644 (file)
@@ -1221,7 +1221,7 @@ int pim_upstream_mroute_add(struct channel_oil *c_oil, const char *name)
        return pim_upstream_mroute_update(c_oil, name);
 }
 
-/* Look for IIF changes and update the dateplane entry only if the IIF
+/* Look for IIF changes and update the dataplane entry only if the IIF
  * has changed.
  */
 int pim_upstream_mroute_iif_update(struct channel_oil *c_oil, const char *name)
index 2d542d6187c709239c06ee66d9aeb36ad4abbb56..702c248f55ff93f7e505108f159064f540fbf6fb 100644 (file)
@@ -1949,6 +1949,40 @@ void pim_upstream_terminate(struct pim_instance *pim)
                wheel_delete(pim->upstream_sg_wheel);
        pim->upstream_sg_wheel = NULL;
 }
+bool pim_sg_is_reevaluate_oil_req(struct pim_instance *pim,
+                                 struct pim_upstream *up)
+{
+       struct pim_interface *pim_ifp = NULL;
+
+       /*
+        * Attempt to retrieve the PIM interface information if the RPF
+        * interface is present
+        */
+       if (up->rpf.source_nexthop.interface) {
+               pim_ifp = up->rpf.source_nexthop.interface->info;
+       } else {
+               if (PIM_DEBUG_PIM_TRACE) {
+                       zlog_debug("%s: up %s RPF is not present", __func__,
+                                  up->sg_str);
+               }
+       }
+
+       /*
+        * Determine if a reevaluation of the outgoing interface list (OIL) is
+        * required. This may be necessary in scenarios such as MSDP where the
+        * RP role for a group changes from secondary to primary. In such cases,
+        * SGRpt may receive a prune, resulting in an S,G entry with a NULL OIL.
+        * The S,G upstream should then inherit the OIL from *,G, which is
+        * particularly important for VXLAN setups.
+        */
+       if (up->channel_oil->oil_inherited_rescan ||
+           (pim_ifp && I_am_RP(pim_ifp->pim, up->sg.grp)) ||
+           pim_upstream_empty_inherited_olist(up)) {
+               return true;
+       }
+
+       return false;
+}
 
 bool pim_upstream_equal(const void *arg1, const void *arg2)
 {
@@ -2082,7 +2116,7 @@ static void pim_upstream_sg_running(void *arg)
         * only doing this at this point in time
         * to get us up and working for the moment
         */
-       if (up->channel_oil->oil_inherited_rescan) {
+       if (pim_sg_is_reevaluate_oil_req(pim, up)) {
                if (PIM_DEBUG_TRACE)
                        zlog_debug(
                                "%s: Handling unscanned inherited_olist for %s[%s]",
index 3841d1af7b7b227b0f1d975dda82b609bd7e6bab..15c4fcfe7ef3ced63da5844bb73f8a46a89203b4 100644 (file)
@@ -396,4 +396,6 @@ uint32_t pim_up_mlag_local_cost(struct pim_upstream *up);
 uint32_t pim_up_mlag_peer_cost(struct pim_upstream *up);
 void pim_upstream_reeval_use_rpt(struct pim_instance *pim);
 int pim_upstream_could_register(struct pim_upstream *up);
+bool pim_sg_is_reevaluate_oil_req(struct pim_instance *pim,
+                                 struct pim_upstream *up);
 #endif /* PIM_UPSTREAM_H */