Currently FRR is send Prefix with VNI information to FPMSYNCD. This PR allows FRR to send RMAC with EVPN Type5 prefix to fpmsyncd. This is a temp fix. This patch will be removed once neighorch is ready to handle the Prefix and ARP (containing RMAC) separately.
163 lines
5.2 KiB
Diff
163 lines
5.2 KiB
Diff
From 2e9ed539d29f13d874c6a5ab3120bf4bb26ab2bb Mon Sep 17 00:00:00 2001
|
|
From: Kishore Kunal <kishore.kunal@broadcom.com>
|
|
Date: Fri, 15 Jan 2021 15:52:13 -0800
|
|
Subject: [PATCH] This is temp patch till Prefix to ARP indirection is add in neighorch
|
|
|
|
---
|
|
lib/nexthop.c | 1 +
|
|
lib/nexthop.h | 7 ++++++-
|
|
zebra/rt_netlink.c | 2 +-
|
|
zebra/zapi_msg.c | 2 ++
|
|
zebra/zebra_dplane.c | 2 +-
|
|
zebra/zebra_fpm_netlink.c | 19 +++++++++++++++++++
|
|
6 files changed, 30 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/lib/nexthop.c b/lib/nexthop.c
|
|
index 0ea72d03e..02e826048 100644
|
|
--- a/lib/nexthop.c
|
|
+++ b/lib/nexthop.c
|
|
@@ -657,6 +657,7 @@ void nexthop_copy_no_recurse(struct nexthop *copy,
|
|
nexthop_add_labels(copy, nexthop->nh_label_type,
|
|
nexthop->nh_label->num_labels,
|
|
&nexthop->nh_label->label[0]);
|
|
+ memcpy(©->nh_encap.encap_data.rmac, &nexthop->nh_encap.encap_data.rmac, ETH_ALEN);
|
|
}
|
|
|
|
void nexthop_copy(struct nexthop *copy, const struct nexthop *nexthop,
|
|
diff --git a/lib/nexthop.h b/lib/nexthop.h
|
|
index cadcea1f4..fd959eb9e 100644
|
|
--- a/lib/nexthop.h
|
|
+++ b/lib/nexthop.h
|
|
@@ -71,6 +71,11 @@ enum nh_encap_type {
|
|
/* Backup index value is limited */
|
|
#define NEXTHOP_BACKUP_IDX_MAX 255
|
|
|
|
+struct vxlan_nh_encap {
|
|
+ vni_t vni;
|
|
+ struct ethaddr rmac;
|
|
+};
|
|
+
|
|
/* Nexthop structure. */
|
|
struct nexthop {
|
|
struct nexthop *next;
|
|
@@ -140,7 +145,7 @@ struct nexthop {
|
|
/* Encapsulation information. */
|
|
enum nh_encap_type nh_encap_type;
|
|
union {
|
|
- vni_t vni;
|
|
+ struct vxlan_nh_encap encap_data;
|
|
} nh_encap;
|
|
|
|
/* SR-TE color used for matching SR-TE policies */
|
|
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
|
|
index 50b1a62d8..d8249f8e0 100644
|
|
--- a/zebra/rt_netlink.c
|
|
+++ b/zebra/rt_netlink.c
|
|
@@ -1590,7 +1590,7 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen,
|
|
return false;
|
|
|
|
if (!nl_attr_put32(n, nlen, 0 /* VXLAN_VNI */,
|
|
- nh->nh_encap.vni))
|
|
+ nh->nh_encap.encap_data.vni))
|
|
return false;
|
|
nl_attr_nest_end(n, nest);
|
|
break;
|
|
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
|
|
index e436e5a28..c10d50797 100644
|
|
--- a/zebra/zapi_msg.c
|
|
+++ b/zebra/zapi_msg.c
|
|
@@ -1477,6 +1477,7 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re,
|
|
zebra_vxlan_evpn_vrf_route_add(
|
|
api_nh->vrf_id, &api_nh->rmac,
|
|
&vtep_ip, &api->prefix);
|
|
+ memcpy(&(nexthop->nh_encap.encap_data.rmac), &api_nh->rmac, ETH_ALEN);
|
|
}
|
|
break;
|
|
case NEXTHOP_TYPE_IPV6:
|
|
@@ -1511,6 +1512,7 @@ static struct nexthop *nexthop_from_zapi(struct route_entry *re,
|
|
zebra_vxlan_evpn_vrf_route_add(
|
|
api_nh->vrf_id, &api_nh->rmac,
|
|
&vtep_ip, &api->prefix);
|
|
+ memcpy(&(nexthop->nh_encap.encap_data.rmac), &api_nh->rmac, ETH_ALEN);
|
|
}
|
|
break;
|
|
case NEXTHOP_TYPE_BLACKHOLE:
|
|
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
|
|
index abd0adb64..e66d7aae5 100644
|
|
--- a/zebra/zebra_dplane.c
|
|
+++ b/zebra/zebra_dplane.c
|
|
@@ -1891,7 +1891,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op,
|
|
zl3vni = zl3vni_from_vrf(nexthop->vrf_id);
|
|
if (zl3vni && is_l3vni_oper_up(zl3vni)) {
|
|
nexthop->nh_encap_type = NET_VXLAN;
|
|
- nexthop->nh_encap.vni = zl3vni->vni;
|
|
+ nexthop->nh_encap.encap_data.vni = zl3vni->vni;
|
|
}
|
|
}
|
|
|
|
diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c
|
|
index 2c0741363..2731f64fb 100644
|
|
--- a/zebra/zebra_fpm_netlink.c
|
|
+++ b/zebra/zebra_fpm_netlink.c
|
|
@@ -129,10 +129,12 @@ static const char *fpm_nh_encap_type_to_str(enum fpm_nh_encap_type_t encap_type)
|
|
|
|
struct vxlan_encap_info_t {
|
|
vni_t vni;
|
|
+ struct ethaddr rmac;
|
|
};
|
|
|
|
enum vxlan_encap_info_type_t {
|
|
VXLAN_VNI = 0,
|
|
+ VXLAN_RMAC = 1,
|
|
};
|
|
|
|
struct fpm_nh_encap_info_t {
|
|
@@ -238,6 +240,8 @@ static int netlink_route_info_add_nh(struct netlink_route_info *ri,
|
|
|
|
/* Add VNI to VxLAN encap info */
|
|
nhi.encap_info.vxlan_encap.vni = zl3vni->vni;
|
|
+ memcpy(&nhi.encap_info.vxlan_encap.rmac, &(nexthop->nh_encap.encap_data.rmac),
|
|
+ ETH_ALEN);
|
|
}
|
|
}
|
|
|
|
@@ -454,9 +458,16 @@ static int netlink_route_info_encode(struct netlink_route_info *ri,
|
|
nl_attr_put16(&req->n, in_buf_len, RTA_ENCAP_TYPE,
|
|
encap);
|
|
vxlan = &nhi->encap_info.vxlan_encap;
|
|
+ char buf[ETHER_ADDR_STRLEN];
|
|
+
|
|
+ zfpm_debug(
|
|
+ "%s: VNI:%d RMAC:%s", __func__, vxlan->vni,
|
|
+ prefix_mac2str(&vxlan->rmac, buf, sizeof(buf)));
|
|
nest = nl_attr_nest(&req->n, in_buf_len, RTA_ENCAP);
|
|
nl_attr_put32(&req->n, in_buf_len, VXLAN_VNI,
|
|
vxlan->vni);
|
|
+ nl_attr_put(&req->n, in_buf_len, VXLAN_RMAC,
|
|
+ &vxlan->rmac, sizeof(vxlan->rmac));
|
|
nl_attr_nest_end(&req->n, nest);
|
|
break;
|
|
}
|
|
@@ -490,10 +501,18 @@ static int netlink_route_info_encode(struct netlink_route_info *ri,
|
|
nl_attr_put16(&req->n, in_buf_len, RTA_ENCAP_TYPE,
|
|
encap);
|
|
vxlan = &nhi->encap_info.vxlan_encap;
|
|
+ char rmac_buf[ETHER_ADDR_STRLEN];
|
|
+
|
|
+ zfpm_debug("%s: Multi VNI:%d RMAC:%s", __func__,
|
|
+ vxlan->vni,
|
|
+ prefix_mac2str(&vxlan->rmac, rmac_buf,
|
|
+ sizeof(rmac_buf)));
|
|
inner_nest =
|
|
nl_attr_nest(&req->n, in_buf_len, RTA_ENCAP);
|
|
nl_attr_put32(&req->n, in_buf_len, VXLAN_VNI,
|
|
vxlan->vni);
|
|
+ nl_attr_put(&req->n, in_buf_len, VXLAN_RMAC,
|
|
+ &vxlan->rmac, sizeof(vxlan->rmac));
|
|
nl_attr_nest_end(&req->n, inner_nest);
|
|
break;
|
|
}
|
|
--
|
|
2.18.0
|
|
|