summaryrefslogtreecommitdiff
path: root/pimd/pim_assert.c
diff options
context:
space:
mode:
authorplsaranya <saranya_panjarathina@dell.com>2022-03-23 19:19:43 +0530
committerplsaranya <saranya_panjarathina@dell.com>2022-03-29 13:57:14 +0530
commit2145e986b4ded4f029d4725a4dd175c10f1fb1c9 (patch)
tree3e1532581477478f91d208878858c25d1eb2276b /pimd/pim_assert.c
parentdb89f2a3ebd29b53fc06e2c6735b6ff0ff9dcf8a (diff)
pimd: RPF change after winner election
Problem: Once Assert election is over and winner is elected, the downstream router has to prune from the upstream LOSER if it has joined already and have to join with upstream elected WINNER pim_rpf_update function takes care of changing the rpf_ch if the existing one is PIM_IFASSERT_I_AM_LOSER Signed-off-by: plsaranya <Saranya_Panjarathina@dell.com>
Diffstat (limited to 'pimd/pim_assert.c')
-rw-r--r--pimd/pim_assert.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/pimd/pim_assert.c b/pimd/pim_assert.c
index e7fff4db6f..6bd8321f07 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);