diff options
| -rw-r--r-- | pimd/pim_neighbor.c | 6 | ||||
| -rw-r--r-- | pimd/pim_oil.c | 25 | ||||
| -rw-r--r-- | pimd/pim_oil.h | 1 | 
3 files changed, 30 insertions, 2 deletions
diff --git a/pimd/pim_neighbor.c b/pimd/pim_neighbor.c index 7726ac00b0..b941eae126 100644 --- a/pimd/pim_neighbor.c +++ b/pimd/pim_neighbor.c @@ -42,6 +42,7 @@  #include "pim_jp_agg.h"  #include "pim_bfd.h"  #include "pim_register.h" +#include "pim_oil.h"  static void dr_election_by_addr(struct interface *ifp)  { @@ -136,9 +137,10 @@ int pim_if_dr_election(struct interface *ifp)  		pim_if_update_could_assert(ifp);  		pim_if_update_assert_tracking_desired(ifp); -		if (PIM_I_am_DR(pim_ifp)) +		if (PIM_I_am_DR(pim_ifp)) {  			pim_ifp->am_i_dr = true; -		else { +			pim_clear_nocache_state(pim_ifp); +		} else {  			if (pim_ifp->am_i_dr == true) {  				pim_reg_del_on_couldreg_fail(ifp);  				pim_ifp->am_i_dr = false; diff --git a/pimd/pim_oil.c b/pimd/pim_oil.c index 3bfb31e0c6..5c8d816406 100644 --- a/pimd/pim_oil.c +++ b/pimd/pim_oil.c @@ -162,6 +162,31 @@ struct channel_oil *pim_channel_oil_add(struct pim_instance *pim,  	return c_oil;  } + +/* + * Clean up mroute and channel oil created for dropping pkts from directly + * connected source when the interface was non DR. + */ +void pim_clear_nocache_state(struct pim_interface *pim_ifp) +{ +	struct channel_oil *c_oil; + +	frr_each_safe (rb_pim_oil, &pim_ifp->pim->channel_oil_head, c_oil) { + +		if ((!c_oil->up) || +		    !(PIM_UPSTREAM_FLAG_TEST_SRC_NOCACHE(c_oil->up->flags))) +			continue; + +		if (*oil_parent(c_oil) != pim_ifp->mroute_vif_index) +			continue; + +		THREAD_OFF(c_oil->up->t_ka_timer); +		PIM_UPSTREAM_FLAG_UNSET_SRC_NOCACHE(c_oil->up->flags); +		PIM_UPSTREAM_FLAG_UNSET_SRC_STREAM(c_oil->up->flags); +		pim_upstream_del(pim_ifp->pim, c_oil->up, __func__); +	} +} +  struct channel_oil *pim_channel_oil_del(struct channel_oil *c_oil,  					const char *name)  { diff --git a/pimd/pim_oil.h b/pimd/pim_oil.h index 5a2647b93f..2ee8065447 100644 --- a/pimd/pim_oil.h +++ b/pimd/pim_oil.h @@ -195,6 +195,7 @@ struct channel_oil *pim_find_channel_oil(struct pim_instance *pim,  					 pim_sgaddr *sg);  struct channel_oil *pim_channel_oil_add(struct pim_instance *pim,  					pim_sgaddr *sg, const char *name); +void pim_clear_nocache_state(struct pim_interface *pim_ifp);  struct channel_oil *pim_channel_oil_del(struct channel_oil *c_oil,  					const char *name);  | 
