diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2022-04-20 07:57:40 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-20 07:57:40 -0400 | 
| commit | dc7be57dfc1d42b79eeacfa63c74f2bb0823ccad (patch) | |
| tree | 9f48b6787c9d8bc533f657a1f62426627247d410 | |
| parent | a71e190d44395ab119579dacd4d86d2a2dfa9916 (diff) | |
| parent | 2145e986b4ded4f029d4725a4dd175c10f1fb1c9 (diff) | |
Merge pull request #10853 from plsaranya/pim_assert_fixes
pimd: assert fixes
| -rw-r--r-- | pimd/pim_assert.c | 19 | ||||
| -rw-r--r-- | pimd/pim_upstream.c | 1 | 
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;  | 
