summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiao Liang <shaw.leon@gmail.com>2022-12-15 17:04:32 +0800
committerXiao Liang <shaw.leon@gmail.com>2023-07-27 15:07:42 +0800
commitcea3f7f25a23e485d4f814b670c11c92249568e1 (patch)
treed1a44bda931904553f9384f3ebfa063d6766a0b9
parent49f04841131b917ac6218ecba933af36f51a7f91 (diff)
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 <shaw.leon@gmail.com>
-rw-r--r--lib/nexthop.c1
-rw-r--r--lib/nexthop.h6
-rw-r--r--zebra/zapi_msg.c15
-rw-r--r--zebra/zebra_rib.c18
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(&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,
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);
+ }
+ }
}
/*