From 2e9ed539d29f13d874c6a5ab3120bf4bb26ab2bb Mon Sep 17 00:00:00 2001 From: Kishore Kunal 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