]> git.proxmox.com Git - mirror_frr.git/commitdiff
Merge pull request #10853 from plsaranya/pim_assert_fixes
authorDonald Sharp <donaldsharp72@gmail.com>
Wed, 20 Apr 2022 11:57:40 +0000 (07:57 -0400)
committerGitHub <noreply@github.com>
Wed, 20 Apr 2022 11:57:40 +0000 (07:57 -0400)
pimd: assert fixes

pimd/pim_assert.c
pimd/pim_upstream.c

index cbd44388c167fcfd88a2bf7c10eadb34a6355c70..7d924d6505c36403d80de1d5861d21080d46e880 100644 (file)
@@ -34,6 +34,7 @@
 #include "pim_hello.h"
 #include "pim_macro.h"
 #include "pim_assert.h"
+#include "pim_zebra.h"
 #include "pim_ifchannel.h"
 
 static int assert_action_a3(struct pim_ifchannel *ch);
@@ -50,6 +51,8 @@ void pim_ifassert_winner_set(struct pim_ifchannel *ch,
        int winner_changed = !!pim_addr_cmp(ch->ifassert_winner, winner);
        int metric_changed = !pim_assert_metric_match(
                &ch->ifassert_winner_metric, &winner_metric);
+       enum pim_rpf_result rpf_result;
+       struct pim_rpf old_rpf;
 
        if (PIM_DEBUG_PIM_EVENTS) {
                if (ch->ifassert_state != new_state) {
@@ -74,6 +77,22 @@ void pim_ifassert_winner_set(struct pim_ifchannel *ch,
        ch->ifassert_creation = pim_time_monotonic_sec();
 
        if (winner_changed || metric_changed) {
+               if (winner_changed) {
+                       old_rpf.source_nexthop.interface =
+                               ch->upstream->rpf.source_nexthop.interface;
+                       rpf_result = pim_rpf_update(pim_ifp->pim, ch->upstream,
+                                                   &old_rpf, __func__);
+                       if (rpf_result == PIM_RPF_CHANGED ||
+                           (rpf_result == PIM_RPF_FAILURE &&
+                            old_rpf.source_nexthop.interface))
+                               pim_zebra_upstream_rpf_changed(
+                                       pim_ifp->pim, ch->upstream, &old_rpf);
+                       /* update kernel multicast forwarding cache (MFC) */
+                       if (ch->upstream->rpf.source_nexthop.interface &&
+                           ch->upstream->channel_oil)
+                               pim_upstream_mroute_iif_update(
+                                       ch->upstream->channel_oil, __func__);
+               }
                pim_upstream_update_join_desired(pim_ifp->pim, ch->upstream);
                pim_ifchannel_update_could_assert(ch);
                pim_ifchannel_update_assert_tracking_desired(ch);
index c38acc485f078f022f0b78f4b6939de6a4e90080..2b5b4bcf537a789dcc0419a1c488f669e8e0ce69 100644 (file)
@@ -2062,6 +2062,7 @@ static bool pim_upstream_sg_running_proc(struct pim_upstream *up)
        if ((up->sptbit != PIM_UPSTREAM_SPTBIT_TRUE) &&
            (up->rpf.source_nexthop.interface)) {
                pim_upstream_set_sptbit(up, up->rpf.source_nexthop.interface);
+               pim_upstream_update_could_assert(up);
        }
 
        return rv;