]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib, zebra: Fix EVPN nexthop config order
authorXiao Liang <shaw.leon@gmail.com>
Thu, 15 Dec 2022 09:04:32 +0000 (17:04 +0800)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Fri, 11 Aug 2023 15:40:24 +0000 (15:40 +0000)
Delay EVPN route addition to synchronize with rib_delete(), which now
uses early route queue.

Signed-off-by: Xiao Liang <shaw.leon@gmail.com>
(cherry picked from commit cea3f7f25a23e485d4f814b670c11c92249568e1)

lib/nexthop.c
lib/nexthop.h
zebra/zapi_msg.c
zebra/zebra_rib.c

index dcbb76b68e106a4585276d81ac2709b60f6a213e..01c1662f28354e18f96ca25856f86d7a38c95319 100644 (file)
@@ -797,6 +797,7 @@ void nexthop_copy_no_recurse(struct nexthop *copy,
        memcpy(&copy->gate, &nexthop->gate, sizeof(nexthop->gate));
        memcpy(&copy->src, &nexthop->src, sizeof(nexthop->src));
        memcpy(&copy->rmap_src, &nexthop->rmap_src, sizeof(nexthop->rmap_src));
+       memcpy(&copy->rmac, &nexthop->rmac, sizeof(nexthop->rmac));
        copy->rparent = rparent;
        if (nexthop->nh_label)
                nexthop_add_labels(copy, nexthop->nh_label_type,
index 43dd71e11231c85f3c950b4467d0522e64ba624c..2be89f8240bd384c6523f5f91f230cbefb69e36a 100644 (file)
@@ -125,6 +125,12 @@ struct nexthop {
                vni_t vni;
        } nh_encap;
 
+       /* EVPN router's MAC.
+        * Don't support multiple RMAC from the same VTEP yet, so it's not
+        * included in hash key.
+        */
+       struct ethaddr rmac;
+
        /* SR-TE color used for matching SR-TE policies */
        uint32_t srte_color;
 
index 4bc9f4acfa84a2d0f9f25bd06d02f92a86d2cfe4..1d0984323915d5240575340f71c7324d69896509 100644 (file)
@@ -1560,7 +1560,6 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
                                         uint16_t backup_nexthop_num)
 {
        struct nexthop *nexthop = NULL;
-       struct ipaddr vtep_ip;
        struct interface *ifp;
        int i;
        char nhbuf[INET6_ADDRSTRLEN] = "";
@@ -1596,13 +1595,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
                 * the nexthop and associated MAC need to be installed.
                 */
                if (CHECK_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_EVPN)) {
-                       memset(&vtep_ip, 0, sizeof(vtep_ip));
-                       vtep_ip.ipa_type = IPADDR_V4;
-                       memcpy(&(vtep_ip.ipaddr_v4), &(api_nh->gate.ipv4),
-                              sizeof(struct in_addr));
-                       zebra_rib_queue_evpn_route_add(
-                               api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p);
                        SET_FLAG(nexthop->flags, NEXTHOP_FLAG_EVPN);
+                       nexthop->rmac = api_nh->rmac;
                }
                break;
        case NEXTHOP_TYPE_IPV6:
@@ -1630,13 +1624,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
                 * the nexthop and associated MAC need to be installed.
                 */
                if (CHECK_FLAG(api_nh->flags, ZAPI_NEXTHOP_FLAG_EVPN)) {
-                       memset(&vtep_ip, 0, sizeof(vtep_ip));
-                       vtep_ip.ipa_type = IPADDR_V6;
-                       memcpy(&vtep_ip.ipaddr_v6, &(api_nh->gate.ipv6),
-                              sizeof(struct in6_addr));
-                       zebra_rib_queue_evpn_route_add(
-                               api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p);
                        SET_FLAG(nexthop->flags, NEXTHOP_FLAG_EVPN);
+                       nexthop->rmac = api_nh->rmac;
                }
                break;
        case NEXTHOP_TYPE_BLACKHOLE:
index 8260ccddf66161dfdd374a0b564f41b35bcd21b6..b531eb7c23b59adc2a4a15279b791954e4674437 100644 (file)
@@ -2706,6 +2706,8 @@ static void process_subq_early_route_add(struct zebra_early_route *ere)
                        return;
                }
        } else {
+               struct nexthop *tmp_nh;
+
                /* Lookup nhe from route information */
                nhe = zebra_nhg_rib_find_nhe(ere->re_nhe, ere->afi);
                if (!nhe) {
@@ -2723,6 +2725,22 @@ static void process_subq_early_route_add(struct zebra_early_route *ere)
                        early_route_memory_free(ere);
                        return;
                }
+               for (ALL_NEXTHOPS(nhe->nhg, tmp_nh)) {
+                       if (CHECK_FLAG(tmp_nh->flags, NEXTHOP_FLAG_EVPN)) {
+                               struct ipaddr vtep_ip = {};
+
+                               if (ere->afi == AFI_IP) {
+                                       vtep_ip.ipa_type = IPADDR_V4;
+                                       vtep_ip.ipaddr_v4 = tmp_nh->gate.ipv4;
+                               } else {
+                                       vtep_ip.ipa_type = IPADDR_V6;
+                                       vtep_ip.ipaddr_v6 = tmp_nh->gate.ipv6;
+                               }
+                               zebra_rib_queue_evpn_route_add(
+                                       re->vrf_id, &tmp_nh->rmac, &vtep_ip,
+                                       &ere->p);
+                       }
+               }
        }
 
        /*