diff options
| author | Anuradha Karuppiah <anuradhak@cumulusnetworks.com> | 2020-02-06 09:30:40 -0800 | 
|---|---|---|
| committer | Anuradha Karuppiah <anuradhak@cumulusnetworks.com> | 2020-02-14 09:18:30 -0800 | 
| commit | 95586137e6662f9cdeede87dc75e70ab70877360 (patch) | |
| tree | 2fb24c2cde649ab84407380305fc7a71b66e6c6e /pimd/pim_vxlan.c | |
| parent | 05ca004b804b85343f450c99792b065254c5ccc3 (diff) | |
pimd: inherit MLAG DF role from the parent (*, G) entry
DF election is only run for (*,G) entries i.e. election is skipped
for (S,G) entries that are setup as a result of SPT switchover. (S,G)
entries inherit the DF role from the parent (*,G) entry. So the DF is
responsible for terminating all sources associated with a group.
Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
Diffstat (limited to 'pimd/pim_vxlan.c')
| -rw-r--r-- | pimd/pim_vxlan.c | 38 | 
1 files changed, 38 insertions, 0 deletions
diff --git a/pimd/pim_vxlan.c b/pimd/pim_vxlan.c index f1f5c81c00..58d988e920 100644 --- a/pimd/pim_vxlan.c +++ b/pimd/pim_vxlan.c @@ -551,6 +551,37 @@ static void pim_vxlan_term_mr_oif_del(struct pim_vxlan_sg *vxlan_sg)  	pim_ifchannel_local_membership_del(vxlan_sg->term_oif, &vxlan_sg->sg);  } +static void pim_vxlan_update_sg_entry_mlag(struct pim_instance *pim, +		struct pim_upstream *up, bool inherit) +{ +	bool is_df = true; + +	if (inherit && up->parent && +			PIM_UPSTREAM_FLAG_TEST_MLAG_VXLAN(up->parent->flags) && +			PIM_UPSTREAM_FLAG_TEST_MLAG_NON_DF(up->parent->flags)) +		is_df = false; + +	pim_mlag_up_df_role_update(pim, up, is_df, "inherit_xg_df"); +} + +/* We run MLAG DF election only on mroutes that have the termination + * device ipmr-lo in the immediate OIL. This is only (*, G) entries at the + * moment. For (S, G) entries that (with ipmr-lo in the inherited OIL) we + * inherit the DF role from the (*, G) entry. + */ +void pim_vxlan_inherit_mlag_flags(struct pim_instance *pim, +		struct pim_upstream *up, bool inherit) +{ +	struct listnode *listnode; +	struct pim_upstream *child; + +	for (ALL_LIST_ELEMENTS_RO(up->sources, listnode, +				child)) { +		pim_vxlan_update_sg_entry_mlag(pim, +				child, true /* inherit */); +	} +} +  static void pim_vxlan_term_mr_up_add(struct pim_vxlan_sg *vxlan_sg)  {  	struct pim_upstream *up; @@ -577,7 +608,11 @@ static void pim_vxlan_term_mr_up_add(struct pim_vxlan_sg *vxlan_sg)  	if (!up) {  		zlog_warn("vxlan SG %s term mroute-up add failed",  			vxlan_sg->sg_str); +		return;  	} + +	/* update existing SG entries with the parent's MLAG flag */ +	pim_vxlan_inherit_mlag_flags(vxlan_sg->pim, up, true /*enable*/);  }  static void pim_vxlan_term_mr_up_del(struct pim_vxlan_sg *vxlan_sg) @@ -592,6 +627,9 @@ static void pim_vxlan_term_mr_up_del(struct pim_vxlan_sg *vxlan_sg)  			vxlan_sg->sg_str);  	vxlan_sg->up = NULL;  	if (up->flags & PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM) { +		/* update SG entries that are inheriting from this XG entry */ +		pim_vxlan_inherit_mlag_flags(vxlan_sg->pim, up, +				false /*enable*/);  		/* clear out all the vxlan related flags */  		up->flags &= ~(PIM_UPSTREAM_FLAG_MASK_SRC_VXLAN_TERM |  			PIM_UPSTREAM_FLAG_MASK_MLAG_VXLAN);  | 
