diff options
| author | plsaranya <saranya_panjarathina@dell.com> | 2022-03-23 19:19:43 +0530 |
|---|---|---|
| committer | plsaranya <saranya_panjarathina@dell.com> | 2022-03-29 13:57:14 +0530 |
| commit | 2145e986b4ded4f029d4725a4dd175c10f1fb1c9 (patch) | |
| tree | 3e1532581477478f91d208878858c25d1eb2276b /pimd/pim_assert.c | |
| parent | db89f2a3ebd29b53fc06e2c6735b6ff0ff9dcf8a (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.c | 19 |
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); |
