diff options
| author | Chirag Shah <chirag@cumulusnetworks.com> | 2019-08-04 16:51:33 -0700 | 
|---|---|---|
| committer | Chirag Shah <chirag@cumulusnetworks.com> | 2019-11-22 07:53:30 -0800 | 
| commit | 14e814ea75ca8211499106e472a3acdd4730b370 (patch) | |
| tree | 88d37b32ca3365b3dd1d4a8f6a14197180d17963 | |
| parent | 06d9cde5c71d31c5467b7625d41fb4845fbd6e54 (diff) | |
bgpd: evpn pip parse vrr mac
In L3VNI add callback parse, vrr rmac value.
For non-zero vrr mac value, use it as anycast RMAC
and svi mac as individual rmac value.
If advertise-pip is disable or vrr rmac is not present
use svi mac as anycast rmac value for all routes.
Ticket:CM-26190
Reviewed By:
Testing Done:
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
| -rw-r--r-- | bgpd/bgp_evpn.c | 38 | ||||
| -rw-r--r-- | bgpd/bgp_evpn.h | 3 | ||||
| -rw-r--r-- | bgpd/bgp_zebra.c | 21 | 
3 files changed, 51 insertions, 11 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c index 5824a1cb56..49b2b7d1ed 100644 --- a/bgpd/bgp_evpn.c +++ b/bgpd/bgp_evpn.c @@ -5581,9 +5581,12 @@ static void link_l2vni_hash_to_l3vni(struct hash_bucket *bucket,  		bgpevpn_link_to_l3vni(vpn);  } -int bgp_evpn_local_l3vni_add(vni_t l3vni, vrf_id_t vrf_id, struct ethaddr *rmac, +int bgp_evpn_local_l3vni_add(vni_t l3vni, vrf_id_t vrf_id, +			     struct ethaddr *svi_rmac, +			     struct ethaddr *vrr_rmac,  			     struct in_addr originator_ip, int filter, -			     ifindex_t svi_ifindex) +			     ifindex_t svi_ifindex, +			     bool is_anycast_mac)  {  	struct bgp *bgp_vrf = NULL; /* bgp VRF instance */  	struct bgp *bgp_evpn = NULL; /* EVPN bgp instance */ @@ -5630,10 +5633,35 @@ int bgp_evpn_local_l3vni_add(vni_t l3vni, vrf_id_t vrf_id, struct ethaddr *rmac,  	/* associate the vrf with l3vni and related parameters */  	bgp_vrf->l3vni = l3vni; -	memcpy(&bgp_vrf->rmac, rmac, sizeof(struct ethaddr));  	bgp_vrf->originator_ip = originator_ip;  	bgp_vrf->l3vni_svi_ifindex = svi_ifindex; +	bgp_vrf->evpn_info->is_anycast_mac = is_anycast_mac; +	/* copy anycast MAC from VRR MAC */ +	memcpy(&bgp_vrf->rmac, vrr_rmac, ETH_ALEN); +	/* copy sys RMAC from SVI MAC */ +	memcpy(&bgp_vrf->evpn_info->pip_rmac_zebra, svi_rmac, ETH_ALEN); +	/* PIP user configured mac is not present use svi mac as sys mac */ +	if (is_zero_mac(&bgp_vrf->evpn_info->pip_rmac_static)) +		memcpy(&bgp_vrf->evpn_info->pip_rmac, svi_rmac, ETH_ALEN); + +	if (bgp_debug_zebra(NULL)) { +		char buf[ETHER_ADDR_STRLEN]; +		char buf1[ETHER_ADDR_STRLEN]; +		char buf2[ETHER_ADDR_STRLEN]; + +		zlog_debug("VRF %s vni %u pip %s RMAC %s sys RMAC %s static RMAC %s is_anycast_mac %s", +			   vrf_id_to_name(bgp_vrf->vrf_id), +			   bgp_vrf->l3vni, +			   bgp_vrf->evpn_info->advertise_pip ? "enable" +			   : "disable", +			   prefix_mac2str(&bgp_vrf->rmac, buf, sizeof(buf)), +			   prefix_mac2str(&bgp_vrf->evpn_info->pip_rmac, +					  buf1, sizeof(buf1)), +			   prefix_mac2str(&bgp_vrf->evpn_info->pip_rmac_static, +					  buf2, sizeof(buf2)), +			   is_anycast_mac ? "Enable" : "Disable"); +	}  	/* set the right filter - are we using l3vni only for prefix routes? */  	if (filter)  		SET_FLAG(bgp_vrf->vrf_flags, BGP_VRF_L3VNI_PREFIX_ROUTES_ONLY); @@ -5714,6 +5742,10 @@ int bgp_evpn_local_l3vni_del(vni_t l3vni, vrf_id_t vrf_id)  	/* remove the Rmac from the BGP vrf */  	memset(&bgp_vrf->rmac, 0, sizeof(struct ethaddr)); +	memset(&bgp_vrf->evpn_info->pip_rmac_zebra, 0, ETH_ALEN); +	if (is_zero_mac(&bgp_vrf->evpn_info->pip_rmac_static) && +	    !is_zero_mac(&bgp_vrf->evpn_info->pip_rmac)) +		memset(&bgp_vrf->evpn_info->pip_rmac, 0, ETH_ALEN);  	/* remove default import RT or Unmap non-default import RT */  	if (!list_isempty(bgp_vrf->vrf_import_rtl)) { diff --git a/bgpd/bgp_evpn.h b/bgpd/bgp_evpn.h index f9927067e5..b030f0a33e 100644 --- a/bgpd/bgp_evpn.h +++ b/bgpd/bgp_evpn.h @@ -174,8 +174,9 @@ extern int bgp_evpn_local_macip_add(struct bgp *bgp, vni_t vni,  				    uint8_t flags, uint32_t seq);  extern int bgp_evpn_local_l3vni_add(vni_t vni, vrf_id_t vrf_id,  				    struct ethaddr *rmac, +				    struct ethaddr *vrr_rmac,  				    struct in_addr originator_ip, int filter, -				    ifindex_t svi_ifindex); +				    ifindex_t svi_ifindex, bool is_anycast_mac);  extern int bgp_evpn_local_l3vni_del(vni_t vni, vrf_id_t vrf_id);  extern int bgp_evpn_local_vni_del(struct bgp *bgp, vni_t vni);  extern int bgp_evpn_local_vni_add(struct bgp *bgp, vni_t vni, diff --git a/bgpd/bgp_zebra.c b/bgpd/bgp_zebra.c index d0a732b153..790d350697 100644 --- a/bgpd/bgp_zebra.c +++ b/bgpd/bgp_zebra.c @@ -2469,30 +2469,37 @@ static int bgp_zebra_process_local_l3vni(ZAPI_CALLBACK_ARGS)  	int filter = 0;  	char buf[ETHER_ADDR_STRLEN];  	vni_t l3vni = 0; -	struct ethaddr rmac; +	struct ethaddr svi_rmac, vrr_rmac = {.octet = {0} };  	struct in_addr originator_ip;  	struct stream *s;  	ifindex_t svi_ifindex; +	bool is_anycast_mac = false; +	char buf1[ETHER_ADDR_STRLEN]; -	memset(&rmac, 0, sizeof(struct ethaddr)); +	memset(&svi_rmac, 0, sizeof(struct ethaddr));  	memset(&originator_ip, 0, sizeof(struct in_addr));  	s = zclient->ibuf;  	l3vni = stream_getl(s);  	if (cmd == ZEBRA_L3VNI_ADD) { -		stream_get(&rmac, s, sizeof(struct ethaddr)); +		stream_get(&svi_rmac, s, sizeof(struct ethaddr));  		originator_ip.s_addr = stream_get_ipv4(s);  		stream_get(&filter, s, sizeof(int));  		svi_ifindex = stream_getl(s); +		stream_get(&vrr_rmac, s, sizeof(struct ethaddr)); +		is_anycast_mac = stream_getl(s);  		if (BGP_DEBUG(zebra, ZEBRA)) -			zlog_debug("Rx L3-VNI ADD VRF %s VNI %u RMAC %s filter %s svi-if %u", +			zlog_debug("Rx L3-VNI ADD VRF %s VNI %u RMAC svi-mac %s vrr-mac %s filter %s svi-if %u",  				   vrf_id_to_name(vrf_id), l3vni, -				   prefix_mac2str(&rmac, buf, sizeof(buf)), +				   prefix_mac2str(&svi_rmac, buf, sizeof(buf)), +				   prefix_mac2str(&vrr_rmac, buf1, +						  sizeof(buf1)),  				   filter ? "prefix-routes-only" : "none",  				   svi_ifindex); -		bgp_evpn_local_l3vni_add(l3vni, vrf_id, &rmac, originator_ip, -					 filter, svi_ifindex); +		bgp_evpn_local_l3vni_add(l3vni, vrf_id, &svi_rmac, &vrr_rmac, +					 originator_ip, filter, svi_ifindex, +					 is_anycast_mac);  	} else {  		if (BGP_DEBUG(zebra, ZEBRA))  			zlog_debug("Rx L3-VNI DEL VRF %s VNI %u",  | 
