]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: fill in local ecommunity context with ecom unit length
authorPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 22 Oct 2019 07:21:28 +0000 (09:21 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Fri, 21 Aug 2020 11:37:08 +0000 (13:37 +0200)
because the same extended community can be used for storing ipv6 and
ipv4 et communities, the unit length must be stored. do not forget to
set the standard value in bgp evpn.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bgpd/bgp_evpn.c
bgpd/bgp_evpn_mh.c

index 3bcef1a5554b158d309112cdbac909dc77798ca9..e552866f38ccee9ad2f321d3b325ae20d89c9fe2 100644 (file)
@@ -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);
index eb65c43bb9b72bc0b64f8ffe21764a10e91664cc..8dfb7a305e58c879c21f36def95e0cfe74a3bcc0 100644 (file)
@@ -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);