Skip to content

Commit

Permalink
bgpd: Ensure RMAC extended community is unique
Browse files Browse the repository at this point in the history
The BGP Router MAC extended community should be unique and not occur
multiple times. In a VRF-to-VRF route-leak scenario where EVPN routes
from a source VRF are leaked into the target VRF and then injected
back into EVPN from the target VRF, the resulting route had more than
one RMAC. With this fix, the resulting route will have only the
target VRF's RMAC.

Signed-off-by: Vivek Venkatraman <[email protected]>
  • Loading branch information
vivek-cumulus committed Mar 31, 2020
1 parent fab92da commit feca4f1
Showing 1 changed file with 2 additions and 12 deletions.
14 changes: 2 additions & 12 deletions bgpd/bgp_evpn.c
Original file line number Diff line number Diff line change
Expand Up @@ -738,7 +738,6 @@ static void build_evpn_type5_route_extcomm(struct bgp *bgp_vrf,
struct attr *attr)
{
struct ecommunity ecom_encap;
struct ecommunity ecom_rmac;
struct ecommunity_val eval;
struct ecommunity_val eval_rmac;
bgp_encap_types tnl_type;
Expand Down Expand Up @@ -772,12 +771,8 @@ static void build_evpn_type5_route_extcomm(struct bgp *bgp_vrf,

/* add the router mac extended community */
if (!is_zero_mac(&attr->rmac)) {
memset(&ecom_rmac, 0, sizeof(ecom_rmac));
encode_rmac_extcomm(&eval_rmac, &attr->rmac);
ecom_rmac.size = 1;
ecom_rmac.val = (uint8_t *)eval_rmac.val;
attr->ecommunity =
ecommunity_merge(attr->ecommunity, &ecom_rmac);
ecommunity_add_val(attr->ecommunity, &eval_rmac, true, true);
}

attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_EXT_COMMUNITIES);
Expand All @@ -799,7 +794,6 @@ static void build_evpn_route_extcomm(struct bgpevpn *vpn, struct attr *attr,
struct ecommunity ecom_encap;
struct ecommunity ecom_sticky;
struct ecommunity ecom_default_gw;
struct ecommunity ecom_rmac;
struct ecommunity ecom_na;
struct ecommunity_val eval;
struct ecommunity_val eval_sticky;
Expand Down Expand Up @@ -853,12 +847,8 @@ static void build_evpn_route_extcomm(struct bgpevpn *vpn, struct attr *attr,

/* Add RMAC, if told to. */
if (add_l3_ecomm) {
memset(&ecom_rmac, 0, sizeof(ecom_rmac));
encode_rmac_extcomm(&eval_rmac, &attr->rmac);
ecom_rmac.size = 1;
ecom_rmac.val = (uint8_t *)eval_rmac.val;
attr->ecommunity =
ecommunity_merge(attr->ecommunity, &ecom_rmac);
ecommunity_add_val(attr->ecommunity, &eval_rmac, true, true);
}

/* Add default gateway, if needed. */
Expand Down

0 comments on commit feca4f1

Please sign in to comment.