]> 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:39:43 +0000 (15:39 +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 248acd270078d1594ae615864c6786f9fb6f99f0..1eeed4adfa0ad0e25777740336527f5c81c0f66b 100644 (file)
@@ -812,6 +812,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 f1309aa525beeb69470570ac697b48601c41fd2b..f35cc5e4e264fe01b09b103d837681b43d31b85b 100644 (file)
@@ -140,6 +140,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 a32a82d73c7bb55f44da1793979bedd8498ef3c8..6a39b126a8cf85ca4ccbe5c850b22873632e17d8 100644 (file)
@@ -1577,7 +1577,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] = "";
@@ -1613,13 +1612,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:
@@ -1647,13 +1641,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 171837610ace192b2a6a38dff68549cea8170db6..40397e587a2530797541b9f6a590ccb09c02d136 100644 (file)
@@ -2642,6 +2642,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) {
@@ -2659,6 +2661,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);
+                       }
+               }
        }
 
        /*