diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2020-06-18 10:37:51 -0400 | 
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2020-06-18 11:06:09 -0400 | 
| commit | b0ee422ab1102bec5c5cb910282bf17de4e906ed (patch) | |
| tree | e6510739046699ca69e3efdbc2994d0b235d9d8a /pimd/pim_mlag.c | |
| parent | 6df72c7f1779b01e8b333bca1ab640507df906fd (diff) | |
pimd: Poorly ported code fix
This section of code was ported incorrectly and is causing
issues when running against some tests.  Fix the missed
code.
Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'pimd/pim_mlag.c')
| -rw-r--r-- | pimd/pim_mlag.c | 62 | 
1 files changed, 43 insertions, 19 deletions
diff --git a/pimd/pim_mlag.c b/pimd/pim_mlag.c index 02f206144f..305dd5cf2c 100644 --- a/pimd/pim_mlag.c +++ b/pimd/pim_mlag.c @@ -41,8 +41,7 @@ extern struct zclient *zclient;  				"%s: add Dual-active Interface to %s "         \  				"to oil:%s",                                   \  				__func__, ch->interface->name, ch->sg_str);    \ -		pim_channel_add_oif(ch_oil, ch->interface,                     \ -				    PIM_OIF_FLAG_PROTO_IGMP, __func__);        \ +		pim_channel_update_oif_mute(ch_oil, ch->interface->info);      \  	} while (0)  #define PIM_MLAG_DEL_OIF_TO_OIL(ch, ch_oil)                                    \ @@ -52,8 +51,7 @@ extern struct zclient *zclient;  				"%s: del Dual-active Interface to %s "         \  				"to oil:%s",                                   \  				__func__, ch->interface->name, ch->sg_str);    \ -		pim_channel_del_oif(ch_oil, ch->interface,                     \ -				    PIM_OIF_FLAG_PROTO_IGMP, __func__);        \ +		pim_channel_update_oif_mute(ch_oil, ch->interface->info);      \  	} while (0) @@ -91,14 +89,36 @@ static void pim_mlag_inherit_mlag_flags(struct pim_upstream *up, bool is_df)  {  	struct listnode *listnode;  	struct pim_upstream *child; +	struct listnode *chnode; +	struct listnode *chnextnode; +	struct pim_ifchannel *ch; +	struct pim_interface *pim_ifp = NULL; +	struct channel_oil *ch_oil = NULL; -	for (ALL_LIST_ELEMENTS_RO(up->sources, listnode, child)) { -		PIM_UPSTREAM_FLAG_SET_MLAG_PEER(child->flags); -		if (is_df) -			PIM_UPSTREAM_FLAG_UNSET_MLAG_NON_DF(child->flags); -		else -			PIM_UPSTREAM_FLAG_SET_MLAG_NON_DF(child->flags); -		pim_mlag_calculate_df_for_ifchannels(child, is_df); +	if (PIM_DEBUG_MLAG) +		zlog_debug("%s: Updating DF for uptream:%s childs", __func__, +			   up->sg_str); + + +	for (ALL_LIST_ELEMENTS(up->ifchannels, chnode, chnextnode, ch)) { +		pim_ifp = (ch->interface) ? ch->interface->info : NULL; +		if (!pim_ifp || !PIM_I_am_DualActive(pim_ifp)) +			continue; + +		for (ALL_LIST_ELEMENTS_RO(up->sources, listnode, child)) { +			if (PIM_DEBUG_MLAG) +				zlog_debug("%s: Updating DF for child:%s", +					   __func__, child->sg_str); +			ch_oil = (child) ? child->channel_oil : NULL; + +			if (!ch_oil) +				continue; + +			if (is_df) +				PIM_MLAG_ADD_OIF_TO_OIL(ch, ch_oil); +			else +				PIM_MLAG_DEL_OIF_TO_OIL(ch, ch_oil); +		}  	}  } @@ -134,8 +154,8 @@ bool pim_mlag_up_df_role_update(struct pim_instance *pim,  	 * Interface configuration  	 */  	if (PIM_UPSTREAM_FLAG_TEST_MLAG_INTERFACE(up->flags)) { -		pim_mlag_calculate_df_for_ifchannels(up, is_df);  		pim_mlag_inherit_mlag_flags(up, is_df); +		pim_mlag_calculate_df_for_ifchannels(up, is_df);  	}  	/* If the DF role has changed check if ipmr-lo needs to be @@ -170,8 +190,7 @@ static bool pim_mlag_up_df_role_elect(struct pim_instance *pim,  	uint32_t local_cost;  	bool rv; -	if (!pim_up_mlag_is_local(up) -	    && !PIM_UPSTREAM_FLAG_TEST_MLAG_INTERFACE(up->flags)) +	if (!pim_up_mlag_is_local(up))  		return false;  	/* We are yet to rx a status update from the local MLAG daemon so @@ -501,8 +520,7 @@ static void pim_mlag_up_local_replay(void)  	RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) {  		pim = vrf->info;  		frr_each (rb_pim_upstream, &pim->upstream_head, up) { -			if (pim_up_mlag_is_local(up) -			    || PIM_UPSTREAM_FLAG_TEST_MLAG_INTERFACE(up->flags)) +			if (pim_up_mlag_is_local(up))  				pim_mlag_up_local_add_send(pim, up);  		}  	} @@ -523,9 +541,7 @@ static void pim_mlag_up_local_reeval(bool mlagd_send, const char *reason_code)  	RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) {  		pim = vrf->info;  		frr_each (rb_pim_upstream, &pim->upstream_head, up) { -			if (!pim_up_mlag_is_local(up) -			    && !PIM_UPSTREAM_FLAG_TEST_MLAG_INTERFACE( -				    up->flags)) +			if (!pim_up_mlag_is_local(up))  				continue;  			/* if role changes re-send to peer */  			if (pim_mlag_up_df_role_elect(pim, up) && @@ -985,6 +1001,10 @@ void pim_if_configure_mlag_dualactive(struct pim_interface *pim_ifp)  	if (!pim_ifp || !pim_ifp->pim || pim_ifp->activeactive == true)  		return; +	if (PIM_DEBUG_MLAG) +		zlog_debug("%s: Configuring active-active on Interface: %s", +			   __func__, "NULL"); +  	pim_ifp->activeactive = true;  	if (pim_ifp->pim)  		pim_ifp->pim->inst_mlag_intf_cnt++; @@ -1010,6 +1030,10 @@ void pim_if_unconfigure_mlag_dualactive(struct pim_interface *pim_ifp)  	if (!pim_ifp || !pim_ifp->pim || pim_ifp->activeactive == false)  		return; +	if (PIM_DEBUG_MLAG) +		zlog_debug("%s: UnConfiguring active-active on Interface: %s", +			   __func__, "NULL"); +  	pim_ifp->activeactive = false;  	pim_ifp->pim->inst_mlag_intf_cnt--;  | 
