summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2022-04-20 07:57:40 -0400
committerGitHub <noreply@github.com>2022-04-20 07:57:40 -0400
commitdc7be57dfc1d42b79eeacfa63c74f2bb0823ccad (patch)
tree9f48b6787c9d8bc533f657a1f62426627247d410
parenta71e190d44395ab119579dacd4d86d2a2dfa9916 (diff)
parent2145e986b4ded4f029d4725a4dd175c10f1fb1c9 (diff)
Merge pull request #10853 from plsaranya/pim_assert_fixes
pimd: assert fixes
-rw-r--r--pimd/pim_assert.c19
-rw-r--r--pimd/pim_upstream.c1
2 files changed, 20 insertions, 0 deletions
diff --git a/pimd/pim_assert.c b/pimd/pim_assert.c
index cbd44388c1..7d924d6505 100644
--- a/pimd/pim_assert.c
+++ b/pimd/pim_assert.c
@@ -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);
diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c
index c38acc485f..2b5b4bcf53 100644
--- a/pimd/pim_upstream.c
+++ b/pimd/pim_upstream.c
@@ -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;