summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_evpn.c30
-rw-r--r--bgpd/bgp_evpn_mh.c4
2 files changed, 22 insertions, 12 deletions
diff --git a/bgpd/bgp_evpn.c b/bgpd/bgp_evpn.c
index 3bcef1a555..e552866f38 100644
--- a/bgpd/bgp_evpn.c
+++ b/bgpd/bgp_evpn.c
@@ -726,6 +726,7 @@ static void build_evpn_type5_route_extcomm(struct bgp *bgp_vrf,
memset(&ecom_encap, 0, sizeof(ecom_encap));
encode_encap_extcomm(tnl_type, &eval);
ecom_encap.size = 1;
+ ecom_encap.unit_size = ECOMMUNITY_SIZE;
ecom_encap.val = (uint8_t *)eval.val;
/* Add Encap */
@@ -788,6 +789,7 @@ static void build_evpn_route_extcomm(struct bgpevpn *vpn, struct attr *attr,
memset(&ecom_encap, 0, sizeof(ecom_encap));
encode_encap_extcomm(tnl_type, &eval);
ecom_encap.size = 1;
+ ecom_encap.unit_size = ECOMMUNITY_SIZE;
ecom_encap.val = (uint8_t *)eval.val;
/* Add Encap */
@@ -816,6 +818,7 @@ static void build_evpn_route_extcomm(struct bgpevpn *vpn, struct attr *attr,
memset(&ecom_sticky, 0, sizeof(ecom_sticky));
encode_mac_mobility_extcomm(1, seqnum, &eval_sticky);
ecom_sticky.size = 1;
+ ecom_sticky.unit_size = ECOMMUNITY_SIZE;
ecom_sticky.val = (uint8_t *)eval_sticky.val;
attr->ecommunity =
ecommunity_merge(attr->ecommunity, &ecom_sticky);
@@ -832,6 +835,7 @@ static void build_evpn_route_extcomm(struct bgpevpn *vpn, struct attr *attr,
memset(&ecom_default_gw, 0, sizeof(ecom_default_gw));
encode_default_gw_extcomm(&eval_default_gw);
ecom_default_gw.size = 1;
+ ecom_default_gw.unit_size = ECOMMUNITY_SIZE;
ecom_default_gw.val = (uint8_t *)eval_default_gw.val;
attr->ecommunity =
ecommunity_merge(attr->ecommunity, &ecom_default_gw);
@@ -842,6 +846,7 @@ static void build_evpn_route_extcomm(struct bgpevpn *vpn, struct attr *attr,
memset(&ecom_na, 0, sizeof(ecom_na));
encode_na_flag_extcomm(&eval_na, attr->router_flag, proxy);
ecom_na.size = 1;
+ ecom_na.unit_size = ECOMMUNITY_SIZE;
ecom_na.val = (uint8_t *)eval_na.val;
attr->ecommunity = ecommunity_merge(attr->ecommunity,
&ecom_na);
@@ -871,7 +876,7 @@ static void add_mac_mobility_to_attr(uint32_t seq_num, struct attr *attr)
if (attr->ecommunity) {
for (i = 0; i < attr->ecommunity->size; i++) {
- pnt = attr->ecommunity->val + (i * 8);
+ pnt = attr->ecommunity->val + (i * attr->ecommunity->unit_size);
type = *pnt++;
sub_type = *pnt++;
@@ -879,7 +884,7 @@ static void add_mac_mobility_to_attr(uint32_t seq_num, struct attr *attr)
&& sub_type
== ECOMMUNITY_EVPN_SUBTYPE_MACMOBILITY) {
ecom_val_ptr =
- (attr->ecommunity->val + (i * 8));
+ (attr->ecommunity->val + (i * attr->ecommunity->unit_size));
break;
}
}
@@ -887,12 +892,13 @@ static void add_mac_mobility_to_attr(uint32_t seq_num, struct attr *attr)
/* Update the existing MM ecommunity */
if (ecom_val_ptr) {
- memcpy(ecom_val_ptr, eval.val, sizeof(char) * ECOMMUNITY_SIZE);
+ memcpy(ecom_val_ptr, eval.val, sizeof(char) * attr->ecommunity->unit_size);
}
/* Add MM to existing */
else {
memset(&ecom_tmp, 0, sizeof(ecom_tmp));
ecom_tmp.size = 1;
+ ecom_tmp.unit_size = ECOMMUNITY_SIZE;
ecom_tmp.val = (uint8_t *)eval.val;
if (attr->ecommunity)
@@ -2713,9 +2719,9 @@ static int is_route_matching_for_vrf(struct bgp *bgp_vrf,
struct vrf_irt_node *irt;
/* Only deal with RTs */
- pnt = (ecom->val + (i * ECOMMUNITY_SIZE));
+ pnt = (ecom->val + (i * ecom->unit_size));
eval = (struct ecommunity_val *)(ecom->val
- + (i * ECOMMUNITY_SIZE));
+ + (i * ecom->unit_size));
type = *pnt++;
sub_type = *pnt++;
if (sub_type != ECOMMUNITY_ROUTE_TARGET)
@@ -2737,7 +2743,7 @@ static int is_route_matching_for_vrf(struct bgp *bgp_vrf,
if (type == ECOMMUNITY_ENCODE_AS
|| type == ECOMMUNITY_ENCODE_AS4
|| type == ECOMMUNITY_ENCODE_IP) {
- memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
+ memcpy(&eval_tmp, eval, ecom->unit_size);
mask_ecom_global_admin(&eval_tmp, eval);
irt = lookup_vrf_import_rt(&eval_tmp);
}
@@ -2780,9 +2786,9 @@ static int is_route_matching_for_vni(struct bgp *bgp, struct bgpevpn *vpn,
struct irt_node *irt;
/* Only deal with RTs */
- pnt = (ecom->val + (i * ECOMMUNITY_SIZE));
+ pnt = (ecom->val + (i * ecom->unit_size));
eval = (struct ecommunity_val *)(ecom->val
- + (i * ECOMMUNITY_SIZE));
+ + (i * ecom->unit_size));
type = *pnt++;
sub_type = *pnt++;
if (sub_type != ECOMMUNITY_ROUTE_TARGET)
@@ -2804,7 +2810,7 @@ static int is_route_matching_for_vni(struct bgp *bgp, struct bgpevpn *vpn,
if (type == ECOMMUNITY_ENCODE_AS
|| type == ECOMMUNITY_ENCODE_AS4
|| type == ECOMMUNITY_ENCODE_IP) {
- memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
+ memcpy(&eval_tmp, eval, ecom->unit_size);
mask_ecom_global_admin(&eval_tmp, eval);
irt = lookup_import_rt(bgp, &eval_tmp);
}
@@ -3220,9 +3226,9 @@ static int install_uninstall_evpn_route(struct bgp *bgp, afi_t afi, safi_t safi,
struct bgp_evpn_es *es;
/* Only deal with RTs */
- pnt = (ecom->val + (i * ECOMMUNITY_SIZE));
+ pnt = (ecom->val + (i * ecom->unit_size));
eval = (struct ecommunity_val *)(ecom->val
- + (i * ECOMMUNITY_SIZE));
+ + (i * ecom->unit_size));
type = *pnt++;
sub_type = *pnt++;
if (sub_type != ECOMMUNITY_ROUTE_TARGET)
@@ -3261,7 +3267,7 @@ static int install_uninstall_evpn_route(struct bgp *bgp, afi_t afi, safi_t safi,
if (type == ECOMMUNITY_ENCODE_AS
|| type == ECOMMUNITY_ENCODE_AS4
|| type == ECOMMUNITY_ENCODE_IP) {
- memcpy(&eval_tmp, eval, ECOMMUNITY_SIZE);
+ memcpy(&eval_tmp, eval, ecom->unit_size);
mask_ecom_global_admin(&eval_tmp, eval);
irt = lookup_import_rt(bgp, &eval_tmp);
vrf_irt = lookup_vrf_import_rt(&eval_tmp);
diff --git a/bgpd/bgp_evpn_mh.c b/bgpd/bgp_evpn_mh.c
index eb65c43bb9..8dfb7a305e 100644
--- a/bgpd/bgp_evpn_mh.c
+++ b/bgpd/bgp_evpn_mh.c
@@ -523,6 +523,7 @@ static void bgp_evpn_type4_route_extcomm_build(struct bgp_evpn_es *es,
memset(&ecom_encap, 0, sizeof(ecom_encap));
encode_encap_extcomm(tnl_type, &eval);
ecom_encap.size = 1;
+ ecom_encap.unit_size = ECOMMUNITY_SIZE;
ecom_encap.val = (uint8_t *)eval.val;
attr->ecommunity = ecommunity_dup(&ecom_encap);
@@ -532,6 +533,7 @@ static void bgp_evpn_type4_route_extcomm_build(struct bgp_evpn_es *es,
es_get_system_mac(&es->esi, &mac);
encode_es_rt_extcomm(&eval_es_rt, &mac);
ecom_es_rt.size = 1;
+ ecom_es_rt.unit_size = ECOMMUNITY_SIZE;
ecom_es_rt.val = (uint8_t *)eval_es_rt.val;
attr->ecommunity =
ecommunity_merge(attr->ecommunity, &ecom_es_rt);
@@ -775,6 +777,7 @@ static void bgp_evpn_type1_es_route_extcomm_build(struct bgp_evpn_es *es,
memset(&ecom_encap, 0, sizeof(ecom_encap));
encode_encap_extcomm(tnl_type, &eval);
ecom_encap.size = 1;
+ ecom_encap.unit_size = ECOMMUNITY_SIZE;
ecom_encap.val = (uint8_t *)eval.val;
attr->ecommunity = ecommunity_dup(&ecom_encap);
@@ -782,6 +785,7 @@ static void bgp_evpn_type1_es_route_extcomm_build(struct bgp_evpn_es *es,
encode_esi_label_extcomm(&eval_esi_label,
false /*single_active*/);
ecom_esi_label.size = 1;
+ ecom_esi_label.unit_size = ECOMMUNITY_SIZE;
ecom_esi_label.val = (uint8_t *)eval_esi_label.val;
attr->ecommunity =
ecommunity_merge(attr->ecommunity, &ecom_esi_label);