From cea3f7f25a23e485d4f814b670c11c92249568e1 Mon Sep 17 00:00:00 2001 From: Xiao Liang Date: Thu, 15 Dec 2022 17:04:32 +0800 Subject: [PATCH] lib, zebra: Fix EVPN nexthop config order Delay EVPN route addition to synchronize with rib_delete(), which now uses early route queue. Signed-off-by: Xiao Liang --- lib/nexthop.c | 1 + lib/nexthop.h | 6 ++++++ zebra/zapi_msg.c | 15 ++------------- zebra/zebra_rib.c | 18 ++++++++++++++++++ 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/lib/nexthop.c b/lib/nexthop.c index 6b6b0a79c1..4f92ef9c8b 100644 --- a/lib/nexthop.c +++ b/lib/nexthop.c @@ -797,6 +797,7 @@ void nexthop_copy_no_recurse(struct nexthop *copy, memcpy(©->gate, &nexthop->gate, sizeof(nexthop->gate)); memcpy(©->src, &nexthop->src, sizeof(nexthop->src)); memcpy(©->rmap_src, &nexthop->rmap_src, sizeof(nexthop->rmap_src)); + memcpy(©->rmac, &nexthop->rmac, sizeof(nexthop->rmac)); copy->rparent = rparent; if (nexthop->nh_label) nexthop_add_labels(copy, nexthop->nh_label_type, diff --git a/lib/nexthop.h b/lib/nexthop.h index 43dd71e112..2be89f8240 100644 --- a/lib/nexthop.h +++ b/lib/nexthop.h @@ -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; diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index a136fcf8ae..2fc696c4e1 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -1558,7 +1558,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] = ""; @@ -1594,13 +1593,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: @@ -1628,13 +1622,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: diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index c61b37a697..780d3c8991 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -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); + } + } } /* -- 2.39.5