Skip to content

Commit

Permalink
Merge pull request #12524 from leonshaw/fix/evpn-nh-order
Browse files Browse the repository at this point in the history
lib, zebra: Fix EVPN nexthop config order
  • Loading branch information
riw777 authored Jul 27, 2023
2 parents 49f0484 + cea3f7f commit 49e9bb2
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 13 deletions.
1 change: 1 addition & 0 deletions lib/nexthop.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
6 changes: 6 additions & 0 deletions lib/nexthop.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
15 changes: 2 additions & 13 deletions zebra/zapi_msg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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] = "";
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
18 changes: 18 additions & 0 deletions zebra/zebra_rib.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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);
}
}
}

/*
Expand Down

0 comments on commit 49e9bb2

Please sign in to comment.