[202311] Revert bgp suppress fib pending (#17660)

* [FRR] Bring back patches required for FPM plugin

Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>

* [zebra] use fpm plugin instead of dplane_fpm_nl

Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>

* Revert BGP suppress FIB pending

Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>

---------

Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>
This commit is contained in:
Stepan Blyshchak 2024-01-22 20:17:50 +02:00 committed by GitHub
parent 87caed6f62
commit b527372642
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
36 changed files with 256 additions and 375 deletions

View File

@ -66,7 +66,6 @@ router bgp {{ DEVICE_METADATA['localhost']['bgp_asn'] }}
! !
{% block bgp_init %} {% block bgp_init %}
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
{% if (DEVICE_METADATA is defined) and ('localhost' in DEVICE_METADATA) and ('subtype' in DEVICE_METADATA['localhost']) and (DEVICE_METADATA['localhost']['subtype'].lower() == 'dualtor') %} {% if (DEVICE_METADATA is defined) and ('localhost' in DEVICE_METADATA) and ('subtype' in DEVICE_METADATA['localhost']) and (DEVICE_METADATA['localhost']['subtype'].lower() == 'dualtor') %}

View File

@ -30,7 +30,7 @@ stderr_logfile=syslog
dependent_startup=true dependent_startup=true
[program:zebra] [program:zebra]
command=/usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M dplane_fpm_nl -M snmp --asic-offload=notify_on_offload command=/usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M fpm -M snmp
priority=4 priority=4
autostart=false autostart=false
autorestart=false autorestart=false

View File

@ -164,7 +164,7 @@ environment=ASAN_OPTIONS="log_path=/var/log/asan/teammgrd-asan.log{{ asan_extra_
{% endif %} {% endif %}
[program:zebra] [program:zebra]
command=/usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M dplane_fpm_nl --asic-offload=notify_on_offload command=/usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M fpm
priority=13 priority=13
autostart=false autostart=false
autorestart=false autorestart=false

View File

@ -304,11 +304,10 @@ class BGPPeerMgrBase(Manager):
:return: True if no errors, False if there are errors :return: True if no errors, False if there are errors
""" """
bgp_asn = self.directory.get_slot("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME)["localhost"]["bgp_asn"] bgp_asn = self.directory.get_slot("CONFIG_DB", swsscommon.CFG_DEVICE_METADATA_TABLE_NAME)["localhost"]["bgp_asn"]
enable_bgp_suppress_fib_pending_cmd = 'bgp suppress-fib-pending'
if vrf == 'default': if vrf == 'default':
cmd = ('router bgp %s\n %s\n' % (bgp_asn, enable_bgp_suppress_fib_pending_cmd)) + cmd cmd = ('router bgp %s\n' % bgp_asn) + cmd
else: else:
cmd = ('router bgp %s vrf %s\n %s\n' % (bgp_asn, vrf, enable_bgp_suppress_fib_pending_cmd)) + cmd cmd = ('router bgp %s vrf %s\n' % (bgp_asn, vrf)) + cmd
self.cfg_mgr.push(cmd) self.cfg_mgr.push(cmd)
return True return True

View File

@ -55,7 +55,6 @@ route-map HIDE_INTERNAL permit 20
router bgp 55555 router bgp 55555
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -34,7 +34,6 @@ route-map HIDE_INTERNAL permit 10
router bgp 55555 router bgp 55555
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -12,7 +12,6 @@ ip prefix-list PL_LoopbackV4 permit 55.55.55.55/32
router bgp 55555 router bgp 55555
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -34,7 +34,6 @@ route-map HIDE_INTERNAL permit 10
router bgp 55555 router bgp 55555
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -14,7 +14,6 @@ ipv6 prefix-list PL_LoopbackV6 permit fc00::1/128
router bgp 55555 router bgp 55555
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -34,7 +34,6 @@ route-map HIDE_INTERNAL permit 10
router bgp 55555 router bgp 55555
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -34,7 +34,6 @@ route-map HIDE_INTERNAL permit 10
router bgp 55555 router bgp 55555
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -71,7 +71,6 @@ route-map HIDE_INTERNAL permit 10
router bgp 55555 router bgp 55555
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -2131,10 +2131,6 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
if current_device and current_device['type'] in mgmt_device_types: if current_device and current_device['type'] in mgmt_device_types:
results["FLEX_COUNTER_TABLE"] = {counter: {"FLEX_COUNTER_STATUS": "disable"} for counter in mgmt_disabled_counters} results["FLEX_COUNTER_TABLE"] = {counter: {"FLEX_COUNTER_STATUS": "disable"} for counter in mgmt_disabled_counters}
# Enable bgp-suppress-fib by default for leafrouter
if current_device and current_device['type'] in leafrouter_device_types:
results['DEVICE_METADATA']['localhost']['suppress-fib-pending'] = 'enabled'
return results return results
def get_tunnel_entries(tunnel_intfs, tunnel_intfs_qos_remap_config, lo_intfs, tunnel_qos_remap, mux_tunnel_name, peer_switch_ip): def get_tunnel_entries(tunnel_intfs, tunnel_intfs_qos_remap_config, lo_intfs, tunnel_qos_remap, mux_tunnel_name, peer_switch_ip):

View File

@ -42,7 +42,6 @@ ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 10 permit 192.168.0.0/27
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -53,7 +53,6 @@ route-map HIDE_INTERNAL permit 10
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -42,7 +42,6 @@ ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 10 permit 192.168.0.0/27
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
coalesce-time 10000 coalesce-time 10000

View File

@ -53,7 +53,6 @@ route-map HIDE_INTERNAL permit 10
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -62,7 +62,6 @@ ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 10 permit 192.168.0.0/27
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -58,7 +58,6 @@ ip prefix-list PL_LoopbackV4 permit 4.0.0.0/32
router bgp 4000 router bgp 4000
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -42,7 +42,6 @@ ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 10 permit 192.168.200.0/27
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -53,7 +53,6 @@ route-map HIDE_INTERNAL permit 10
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -42,7 +42,6 @@ ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 10 permit 192.168.200.0/27
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
coalesce-time 10000 coalesce-time 10000

View File

@ -53,7 +53,6 @@ route-map HIDE_INTERNAL permit 10
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -62,7 +62,6 @@ ip prefix-list LOCAL_VLAN_IPV4_PREFIX seq 10 permit 192.168.200.0/27
router bgp 65100 router bgp 65100
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -58,7 +58,6 @@ ip prefix-list PL_LoopbackV4 permit 4.0.0.0/32
router bgp 4000 router bgp 4000
! !
bgp log-neighbor-changes bgp log-neighbor-changes
bgp suppress-fib-pending
no bgp default ipv4-unicast no bgp default ipv4-unicast
no bgp ebgp-requires-policy no bgp ebgp-requires-policy
! !

View File

@ -1,121 +0,0 @@
From f5f0018266c98ad96cdbe69ae60d501de21e5600 Mon Sep 17 00:00:00 2001
From: Stepan Blyschak <stepanb@nvidia.com>
Date: Thu, 20 Oct 2022 13:19:31 +0000
Subject: [PATCH] From 369bbb4d62aa47d5a6d5157ca6ea819c4cb80f15 Mon Sep 17
00:00:00 2001 Subject: [PATCH 07/13] Added support of L3VNI EVPN
This is temp patch till Prefix to ARP indirection is add in neighorch
Signed-off-by: Kishore Kunal <kishore.kunal@broadcom.com>
Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>
diff --git a/lib/nexthop.c b/lib/nexthop.c
index 7ebc4fefb..2f7bb0e7b 100644
--- a/lib/nexthop.c
+++ b/lib/nexthop.c
@@ -813,6 +813,7 @@ void nexthop_copy_no_recurse(struct nexthop *copy,
memcpy(&copy->src, &nexthop->src, sizeof(nexthop->src));
memcpy(&copy->rmap_src, &nexthop->rmap_src, sizeof(nexthop->rmap_src));
copy->rparent = rparent;
+ memcpy(&copy->nh_encap.encap_data.rmac, &nexthop->nh_encap.encap_data.rmac, ETH_ALEN);
if (nexthop->nh_label)
nexthop_add_labels(copy, nexthop->nh_label_type,
nexthop->nh_label->num_labels,
diff --git a/lib/nexthop.h b/lib/nexthop.h
index f1309aa52..7b4bbbafd 100644
--- a/lib/nexthop.h
+++ b/lib/nexthop.h
@@ -66,6 +66,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;
@@ -137,7 +142,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 79d79d74b..325199eff 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1969,6 +1969,7 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen,
struct nexthop *nh)
{
struct rtattr *nest;
+ struct vxlan_nh_encap* encap_data;
switch (nh->nh_encap_type) {
case NET_VXLAN:
@@ -1979,9 +1980,21 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen,
if (!nest)
return false;
+ encap_data = &nh->nh_encap.encap_data;
+
if (!nl_attr_put32(n, nlen, 0 /* VXLAN_VNI */,
- nh->nh_encap.vni))
+ encap_data->vni))
+ return false;
+
+ if (ZEBRA_DEBUG_KERNEL)
+ zlog_debug(
+ "%s: VNI:%d RMAC:%pEA", __func__, encap_data->vni,
+ &encap_data->rmac);
+
+ if (!nl_attr_put(n, nlen, 1 /* VXLAN_RMAC */,
+ &encap_data->rmac, sizeof(encap_data->rmac)))
return false;
+
nl_attr_nest_end(n, nest);
break;
}
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index c0945eae2..157c33ced 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -1605,6 +1605,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
vtep_ip.ipa_type = IPADDR_V4;
memcpy(&(vtep_ip.ipaddr_v4), &(api_nh->gate.ipv4),
sizeof(struct in_addr));
+ memcpy(&(nexthop->nh_encap.encap_data.rmac),
+ &api_nh->rmac, ETH_ALEN);
zebra_rib_queue_evpn_route_add(
api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p);
SET_FLAG(nexthop->flags, NEXTHOP_FLAG_EVPN);
@@ -1639,6 +1641,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
vtep_ip.ipa_type = IPADDR_V6;
memcpy(&vtep_ip.ipaddr_v6, &(api_nh->gate.ipv6),
sizeof(struct in6_addr));
+ memcpy(&(nexthop->nh_encap.encap_data.rmac),
+ &api_nh->rmac, ETH_ALEN);
zebra_rib_queue_evpn_route_add(
api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p);
SET_FLAG(nexthop->flags, NEXTHOP_FLAG_EVPN);
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
index f6f436f39..c8511bd28 100644
--- a/zebra/zebra_dplane.c
+++ b/zebra/zebra_dplane.c
@@ -2917,7 +2917,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;
}
}
--
2.17.1

View File

@ -1,31 +0,0 @@
From 1a639f2dcd400997345dab424a2adbc091752661 Mon Sep 17 00:00:00 2001
From: Stepan Blyschak <stepanb@nvidia.com>
Date: Thu, 20 Oct 2022 13:07:18 +0000
Subject: [PATCH] From ca66350aecf7db3354019480d11754fabae3a97c Mon Sep 17
00:00:00 2001 Subject: [PATCH 09/13] ignore route from default table
Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>
diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c
index 0a9fecc9d..b18a96353 100644
--- a/zebra/dplane_fpm_nl.c
+++ b/zebra/dplane_fpm_nl.c
@@ -814,6 +814,15 @@ static int fpm_nl_enqueue(struct fpm_nl_ctx *fnc, struct zebra_dplane_ctx *ctx)
|| op == DPLANE_OP_NH_UPDATE))
return 0;
+ /*
+ * Ignore route from default table, because when mgmt port goes down,
+ * zebra will remove the default route and causing ASIC to blackhole IO.
+ */
+ if (dplane_ctx_get_table(ctx) == RT_TABLE_DEFAULT) {
+ zlog_debug("%s: discard default table route", __func__);
+ return 0;
+ }
+
nl_buf_len = 0;
frr_mutex_lock_autounlock(&fnc->obuf_mutex);
--
2.17.1

View File

@ -1,111 +0,0 @@
From 44f3736ee601e06e43e978fa075402c3da4823bd Mon Sep 17 00:00:00 2001
From: Stepan Blyschak <stepanb@nvidia.com>
Date: Mon, 16 Jan 2023 11:45:19 +0000
Subject: [PATCH] From 349e3f758860be0077b69919c39764d3486ec44a Mon Sep 17
00:00:00 2001 Subject: [PATCH] use vrf id instead of table id
Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 325199eff..587045eac 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -406,6 +406,30 @@ vrf_id_t vrf_lookup_by_table(uint32_t table_id, ns_id_t ns_id)
return VRF_DEFAULT;
}
+static uint32_t table_lookup_by_vrf(vrf_id_t vrf_id, ns_id_t ns_id)
+{
+ struct vrf *vrf;
+ struct zebra_vrf *zvrf;
+
+ RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) {
+ zvrf = vrf->info;
+ if (zvrf == NULL)
+ continue;
+ /* case vrf with netns : match the netnsid */
+ if (vrf_is_backend_netns()) {
+ if (ns_id == zvrf_id(zvrf))
+ return zvrf->table_id;
+ } else {
+ /* VRF is VRF_BACKEND_VRF_LITE */
+ if (zvrf_id(zvrf) != vrf_id)
+ continue;
+ return zvrf->table_id;
+ }
+ }
+
+ return RT_TABLE_UNSPEC;
+}
+
/**
* @parse_encap_mpls() - Parses encapsulated mpls attributes
* @tb: Pointer to rtattr to look for nested items in.
@@ -782,14 +806,26 @@ int netlink_route_change_read_unicast_internal(struct nlmsghdr *h,
if (rtm->rtm_family == AF_MPLS)
return 0;
- /* Table corresponding to route. */
- if (tb[RTA_TABLE])
- table = *(int *)RTA_DATA(tb[RTA_TABLE]);
- else
- table = rtm->rtm_table;
+ if (!ctx) {
+ /* Table corresponding to route. */
+ if (tb[RTA_TABLE])
+ table = *(int *)RTA_DATA(tb[RTA_TABLE]);
+ else
+ table = rtm->rtm_table;
+
+ /* Map to VRF */
+ vrf_id = vrf_lookup_by_table(table, ns_id);
+ } else {
+ /* With FPM, rtm_table contains vrf id, see netlink_route_multipath_msg_encode */
+ if (tb[RTA_TABLE])
+ vrf_id = *(int *)RTA_DATA(tb[RTA_TABLE]);
+ else
+ vrf_id = rtm->rtm_table;
+
+ /* Map to table */
+ table = table_lookup_by_vrf(vrf_id, ns_id);
+ }
- /* Map to VRF */
- vrf_id = vrf_lookup_by_table(table, ns_id);
if (vrf_id == VRF_DEFAULT) {
if (!is_zebra_valid_kernel_table(table)
&& !is_zebra_main_routing_table(table))
@@ -2102,12 +2138,24 @@ ssize_t netlink_route_multipath_msg_encode(int cmd,
/* Table corresponding to this route. */
table_id = dplane_ctx_get_table(ctx);
- if (table_id < 256)
- req->r.rtm_table = table_id;
- else {
- req->r.rtm_table = RT_TABLE_UNSPEC;
- if (!nl_attr_put32(&req->n, datalen, RTA_TABLE, table_id))
- return 0;
+ if (!fpm) {
+ if (table_id < 256)
+ req->r.rtm_table = table_id;
+ else {
+ req->r.rtm_table = RT_TABLE_UNSPEC;
+ if (!nl_attr_put32(&req->n, datalen, RTA_TABLE, table_id))
+ return 0;
+ }
+ } else {
+ /* Put vrf if_index instead of table id */
+ vrf_id_t vrf = dplane_ctx_get_vrf(ctx);
+ if (vrf < 256)
+ req->r.rtm_table = vrf;
+ else {
+ req->r.rtm_table = RT_TABLE_UNSPEC;
+ if (!nl_attr_put32(&req->n, datalen, RTA_TABLE, vrf))
+ return 0;
+ }
}
if (IS_ZEBRA_DEBUG_KERNEL)
--
2.17.1

View File

@ -1,4 +1,4 @@
From 2b9c7592a9857ddccc77b9d3f178e0c5bd5f19ed Mon Sep 17 00:00:00 2001 From 6a3ae11c9b1480966b22d4f9b67a40b76d96aa15 Mon Sep 17 00:00:00 2001
From: Donald Sharp <sharpd@nvidia.com> From: Donald Sharp <sharpd@nvidia.com>
Date: Wed, 26 Apr 2023 23:25:27 -0400 Date: Wed, 26 Apr 2023 23:25:27 -0400
Subject: [PATCH] zebra: Rename vrf_lookup_by_tableid to zebra_vrf_lookup.. Subject: [PATCH] zebra: Rename vrf_lookup_by_tableid to zebra_vrf_lookup..
@ -9,12 +9,19 @@ we need zebra specific data to find this vrf_id and as such
it does not belong in vrf.c it does not belong in vrf.c
Signed-off-by: Donald Sharp <sharpd@nvidia.com> Signed-off-by: Donald Sharp <sharpd@nvidia.com>
---
zebra/if_netlink.c | 3 ++-
zebra/rt_netlink.c | 31 ++-----------------------------
zebra/rt_netlink.h | 1 -
zebra/zebra_vrf.c | 27 +++++++++++++++++++++++++++
zebra/zebra_vrf.h | 1 +
5 files changed, 32 insertions(+), 31 deletions(-)
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index 81347b550a..4599121261 100644 index cd200d821d7a..cea47b4c30af 100644
--- a/zebra/if_netlink.c --- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c +++ b/zebra/if_netlink.c
@@ -342,7 +342,8 @@ static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb, @@ -325,7 +325,8 @@ static void netlink_vrf_change(struct nlmsghdr *h, struct rtattr *tb,
if (!vrf_lookup_by_id((vrf_id_t)ifi->ifi_index)) { if (!vrf_lookup_by_id((vrf_id_t)ifi->ifi_index)) {
vrf_id_t exist_id; vrf_id_t exist_id;
@ -25,10 +32,10 @@ index 81347b550a..4599121261 100644
vrf = vrf_lookup_by_id(exist_id); vrf = vrf_lookup_by_id(exist_id);
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 587045eac2..6b9b047858 100644 index de01ced411ef..0f542ab80756 100644
--- a/zebra/rt_netlink.c --- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c
@@ -379,33 +379,6 @@ static inline int proto2zebra(int proto, int family, bool is_nexthop) @@ -380,33 +380,6 @@ static inline int proto2zebra(int proto, int family, bool is_nexthop)
return proto; return proto;
} }
@ -59,19 +66,19 @@ index 587045eac2..6b9b047858 100644
- return VRF_DEFAULT; - return VRF_DEFAULT;
-} -}
- -
static uint32_t table_lookup_by_vrf(vrf_id_t vrf_id, ns_id_t ns_id) /**
{ * @parse_encap_mpls() - Parses encapsulated mpls attributes
struct vrf *vrf; * @tb: Pointer to rtattr to look for nested items in.
@@ -814,7 +787,7 @@ int netlink_route_change_read_unicast_internal(struct nlmsghdr *h, @@ -790,7 +763,7 @@ int netlink_route_change_read_unicast_internal(struct nlmsghdr *h,
table = rtm->rtm_table; table = rtm->rtm_table;
/* Map to VRF */ /* Map to VRF */
- vrf_id = vrf_lookup_by_table(table, ns_id); - vrf_id = vrf_lookup_by_table(table, ns_id);
+ vrf_id = zebra_vrf_lookup_by_table(table, ns_id); + vrf_id = zebra_vrf_lookup_by_table(table, ns_id);
} else { if (vrf_id == VRF_DEFAULT) {
/* With FPM, rtm_table contains vrf id, see netlink_route_multipath_msg_encode */ if (!is_zebra_valid_kernel_table(table)
if (tb[RTA_TABLE]) && !is_zebra_main_routing_table(table))
@@ -1114,7 +1087,7 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h, @@ -1079,7 +1052,7 @@ static int netlink_route_change_read_multicast(struct nlmsghdr *h,
else else
table = rtm->rtm_table; table = rtm->rtm_table;
@ -81,10 +88,10 @@ index 587045eac2..6b9b047858 100644
if (tb[RTA_IIF]) if (tb[RTA_IIF])
iif = *(int *)RTA_DATA(tb[RTA_IIF]); iif = *(int *)RTA_DATA(tb[RTA_IIF]);
diff --git a/zebra/rt_netlink.h b/zebra/rt_netlink.h diff --git a/zebra/rt_netlink.h b/zebra/rt_netlink.h
index 8506367ae4..364aac0f6b 100644 index 3ca59ce676f3..d9d0ee76249a 100644
--- a/zebra/rt_netlink.h --- a/zebra/rt_netlink.h
+++ b/zebra/rt_netlink.h +++ b/zebra/rt_netlink.h
@@ -102,7 +102,6 @@ extern int netlink_macfdb_read_specific_mac(struct zebra_ns *zns, @@ -90,7 +90,6 @@ extern int netlink_macfdb_read_specific_mac(struct zebra_ns *zns,
uint16_t vid); uint16_t vid);
extern int netlink_neigh_read_specific_ip(const struct ipaddr *ip, extern int netlink_neigh_read_specific_ip(const struct ipaddr *ip,
struct interface *vlan_if); struct interface *vlan_if);
@ -93,10 +100,10 @@ index 8506367ae4..364aac0f6b 100644
struct nl_batch; struct nl_batch;
extern enum netlink_msg_status extern enum netlink_msg_status
diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c
index be5e91495f..c59cb7c0a7 100644 index 3365cdcdbaa8..74b9d106cdc3 100644
--- a/zebra/zebra_vrf.c --- a/zebra/zebra_vrf.c
+++ b/zebra/zebra_vrf.c +++ b/zebra/zebra_vrf.c
@@ -389,6 +389,33 @@ struct zebra_vrf *zebra_vrf_alloc(struct vrf *vrf) @@ -376,6 +376,33 @@ struct zebra_vrf *zebra_vrf_alloc(struct vrf *vrf)
return zvrf; return zvrf;
} }
@ -131,10 +138,10 @@ index be5e91495f..c59cb7c0a7 100644
struct zebra_vrf *zebra_vrf_lookup_by_id(vrf_id_t vrf_id) struct zebra_vrf *zebra_vrf_lookup_by_id(vrf_id_t vrf_id)
{ {
diff --git a/zebra/zebra_vrf.h b/zebra/zebra_vrf.h diff --git a/zebra/zebra_vrf.h b/zebra/zebra_vrf.h
index 02e3c197c9..937e7fb144 100644 index b23b7282610b..aef83cd8f172 100644
--- a/zebra/zebra_vrf.h --- a/zebra/zebra_vrf.h
+++ b/zebra/zebra_vrf.h +++ b/zebra/zebra_vrf.h
@@ -252,6 +252,7 @@ extern struct route_table *zebra_vrf_get_table_with_table_id(afi_t afi, @@ -237,6 +237,7 @@ extern struct route_table *zebra_vrf_get_table_with_table_id(afi_t afi,
extern void zebra_vrf_update_all(struct zserv *client); extern void zebra_vrf_update_all(struct zserv *client);
extern struct zebra_vrf *zebra_vrf_lookup_by_id(vrf_id_t vrf_id); extern struct zebra_vrf *zebra_vrf_lookup_by_id(vrf_id_t vrf_id);
extern struct zebra_vrf *zebra_vrf_lookup_by_name(const char *); extern struct zebra_vrf *zebra_vrf_lookup_by_name(const char *);
@ -142,6 +149,3 @@ index 02e3c197c9..937e7fb144 100644
extern struct zebra_vrf *zebra_vrf_alloc(struct vrf *vrf); extern struct zebra_vrf *zebra_vrf_alloc(struct vrf *vrf);
extern struct route_table *zebra_vrf_table(afi_t, safi_t, vrf_id_t); extern struct route_table *zebra_vrf_table(afi_t, safi_t, vrf_id_t);
--
2.17.1

View File

@ -0,0 +1,25 @@
From 39bb40dc4bad4462e4ae9c98580d75fa2c92e032 Mon Sep 17 00:00:00 2001
From: Pavel Shirshov <pavelsh@microsoft.com>
Date: Mon, 16 Nov 2020 18:29:46 -0800
Subject: [PATCH 3/8] Use vrf_id for vrf, not tabled_id
---
zebra/zebra_fpm_netlink.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c
index ec22c5dd4..aad0156b3 100644
--- a/zebra/zebra_fpm_netlink.c
+++ b/zebra/zebra_fpm_netlink.c
@@ -287,7 +287,7 @@ static int netlink_route_info_fill(struct netlink_route_info *ri, int cmd,
ri->nlmsg_pid = zvrf->zns->netlink_dplane_out.snl.nl_pid;
ri->nlmsg_type = cmd;
- ri->rtm_table = table_info->table_id;
+ ri->rtm_table = zvrf_id(rib_dest_vrf(dest));
ri->rtm_protocol = RTPROT_UNSPEC;
/*
--
2.12.2

View File

@ -0,0 +1,29 @@
From bb3b003840959adf5b5be52e91bc798007c9857a Mon Sep 17 00:00:00 2001
From: Ying Xie <ying.xie@microsoft.com>
Date: Thu, 8 Sep 2022 04:20:36 +0000
Subject: [PATCH] From 776a29e8ab32c1364ee601a8730aabb773b0c86b Mon Sep 17
00:00:00 2001 Subject: [PATCH] ignore route from default table
Signed-off-by: Ying Xie <ying.xie@microsoft.com>
---
zebra/zebra_fpm_netlink.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c
index 34be9fb39..d6c875a7e 100644
--- a/zebra/zebra_fpm_netlink.c
+++ b/zebra/zebra_fpm_netlink.c
@@ -283,6 +283,11 @@ static int netlink_route_info_fill(struct netlink_route_info *ri, int cmd,
rib_table_info(rib_dest_table(dest));
struct zebra_vrf *zvrf = table_info->zvrf;
+ if (table_info->table_id == RT_TABLE_DEFAULT) {
+ zfpm_debug("%s: Discard default table route", __func__);
+ return 0;
+ }
+
memset(ri, 0, sizeof(*ri));
ri->prefix = rib_dest_prefix(dest);
--
2.17.1

View File

@ -0,0 +1,164 @@
From b1b2e40cf43a9d206e2d867bdec4f0f7b740c8b9 Mon Sep 17 00:00:00 2001
From: stepanb <stepanb@contoso.com>
Date: Tue, 19 Dec 2023 11:27:37 +0000
Subject: [PATCH] Add support of bgp l3vni evpn
---
lib/nexthop.c | 2 ++
lib/nexthop.h | 6 ++++++
zebra/rt_netlink.c | 2 +-
zebra/zapi_msg.c | 4 ++++
zebra/zebra_dplane.c | 1 +
zebra/zebra_fpm_netlink.c | 20 ++++++++++++++++++++
6 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/lib/nexthop.c b/lib/nexthop.c
index 7ebc4fefb..fe42b9f86 100644
--- a/lib/nexthop.c
+++ b/lib/nexthop.c
@@ -813,6 +813,8 @@ void nexthop_copy_no_recurse(struct nexthop *copy,
memcpy(&copy->src, &nexthop->src, sizeof(nexthop->src));
memcpy(&copy->rmap_src, &nexthop->rmap_src, sizeof(nexthop->rmap_src));
copy->rparent = rparent;
+ memcpy(&copy->nh_encap.encap_data.rmac, &nexthop->nh_encap.encap_data.rmac, ETH_ALEN);
+
if (nexthop->nh_label)
nexthop_add_labels(copy, nexthop->nh_label_type,
nexthop->nh_label->num_labels,
diff --git a/lib/nexthop.h b/lib/nexthop.h
index f1309aa52..7026ce1c2 100644
--- a/lib/nexthop.h
+++ b/lib/nexthop.h
@@ -66,6 +66,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;
@@ -138,6 +143,7 @@ struct nexthop {
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 d31732a55..581255158 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1991,7 +1991,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 c0945eae2..157c33ced 100644
--- a/zebra/zapi_msg.c
+++ b/zebra/zapi_msg.c
@@ -1605,6 +1605,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
vtep_ip.ipa_type = IPADDR_V4;
memcpy(&(vtep_ip.ipaddr_v4), &(api_nh->gate.ipv4),
sizeof(struct in_addr));
+ memcpy(&(nexthop->nh_encap.encap_data.rmac),
+ &api_nh->rmac, ETH_ALEN);
zebra_rib_queue_evpn_route_add(
api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p);
SET_FLAG(nexthop->flags, NEXTHOP_FLAG_EVPN);
@@ -1639,6 +1641,8 @@ static struct nexthop *nexthop_from_zapi(const struct zapi_nexthop *api_nh,
vtep_ip.ipa_type = IPADDR_V6;
memcpy(&vtep_ip.ipaddr_v6, &(api_nh->gate.ipv6),
sizeof(struct in6_addr));
+ memcpy(&(nexthop->nh_encap.encap_data.rmac),
+ &api_nh->rmac, ETH_ALEN);
zebra_rib_queue_evpn_route_add(
api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p);
SET_FLAG(nexthop->flags, NEXTHOP_FLAG_EVPN);
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
index 34d30484a..260a7b497 100644
--- a/zebra/zebra_dplane.c
+++ b/zebra/zebra_dplane.c
@@ -3394,6 +3394,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op,
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 ec6090da9..22650eedc 100644
--- a/zebra/zebra_fpm_netlink.c
+++ b/zebra/zebra_fpm_netlink.c
@@ -95,10 +95,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 {
@@ -234,6 +236,9 @@ static int netlink_route_info_add_nh(struct netlink_route_info *ri,
}
nhi.encap_info.vxlan_encap.vni = vni;
+ memcpy(&nhi.encap_info.vxlan_encap.rmac,
+ &(nexthop->nh_encap.encap_data.rmac),
+ ETH_ALEN);
}
/*
@@ -456,9 +461,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;
}
@@ -494,10 +506,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.30.2

View File

@ -2,12 +2,9 @@
0002-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch 0002-Allow-BGP-attr-NEXT_HOP-to-be-0.0.0.0-due-to-allevia.patch
0003-nexthops-compare-vrf-only-if-ip-type.patch 0003-nexthops-compare-vrf-only-if-ip-type.patch
0004-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch 0004-frr-remove-frr-log-outchannel-to-var-log-frr.log.patch
0005-Add-support-of-bgp-l3vni-evpn.patch
0006-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch 0006-Link-local-scope-was-not-set-while-binding-socket-for-bgp-ipv6-link-local-neighbors.patch
Disable-ipv6-src-address-test-in-pceplib.patch Disable-ipv6-src-address-test-in-pceplib.patch
cross-compile-changes.patch cross-compile-changes.patch
0007-ignore-route-from-default-table.patch
0008-Use-vrf_id-for-vrf-not-tabled_id.patch
0009-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch 0009-bgpd-Ensure-suppress-fib-pending-works-with-network-.patch
0010-bgpd-Change-log-level-for-graceful-restart-events.patch 0010-bgpd-Change-log-level-for-graceful-restart-events.patch
0011-zebra-Static-routes-async-notification-do-not-need-t.patch 0011-zebra-Static-routes-async-notification-do-not-need-t.patch
@ -32,3 +29,6 @@ cross-compile-changes.patch
0030-bgpd-Treat-EOR-as-withdrawn-to-avoid-unwanted-handli.patch 0030-bgpd-Treat-EOR-as-withdrawn-to-avoid-unwanted-handli.patch
0031-bgpd-Ignore-handling-NLRIs-if-we-received-MP_UNREACH.patch 0031-bgpd-Ignore-handling-NLRIs-if-we-received-MP_UNREACH.patch
0032-zebra-Fix-fpm-multipath-encap-addition.patch 0032-zebra-Fix-fpm-multipath-encap-addition.patch
0034-fpm-Use-vrf_id-for-vrf-not-tabled_id.patch
0035-fpm-ignore-route-from-default-table.patch
0036-Add-support-of-bgp-l3vni-evpn.patch

View File

@ -126,16 +126,6 @@
"DEVICE_METADATA_ADVERTISE_LO_PREFIX_AS_128": { "DEVICE_METADATA_ADVERTISE_LO_PREFIX_AS_128": {
"desc": "Verifying advertising lo prefix as /128." "desc": "Verifying advertising lo prefix as /128."
}, },
"DEVICE_METADATA_SUPPRESS_PENDING_FIB_ENABLED": {
"desc": "Enable bgp-suppress-fib-pending"
},
"DEVICE_METADATA_SUPPRESS_PENDING_FIB_DISABLED": {
"desc": "Disable bgp-suppress-fib-pending"
},
"DEVICE_METADATA_SUPPRESS_PENDING_FIB_ENABLED_SYNCHRONOUS_MODE_DISABLED": {
"desc": "Enable bgp-suppress-fib-pending when synchronous mode is disabled",
"eStr": ["ASIC synchronous mode must be enabled in order to enable suppress FIB pending feature"]
},
"DEVICE_METADATA_VALID_RACK_MGMT_MAP": { "DEVICE_METADATA_VALID_RACK_MGMT_MAP": {
"desc": "Verifying rack_mgmt_map configuration." "desc": "Verifying rack_mgmt_map configuration."
}, },

View File

@ -333,36 +333,6 @@
} }
} }
}, },
"DEVICE_METADATA_SUPPRESS_PENDING_FIB_ENABLED": {
"sonic-device_metadata:sonic-device_metadata": {
"sonic-device_metadata:DEVICE_METADATA": {
"sonic-device_metadata:localhost": {
"synchronous_mode": "enable",
"suppress-fib-pending": "enabled"
}
}
}
},
"DEVICE_METADATA_SUPPRESS_PENDING_FIB_DISABLED": {
"sonic-device_metadata:sonic-device_metadata": {
"sonic-device_metadata:DEVICE_METADATA": {
"sonic-device_metadata:localhost": {
"synchronous_mode": "disable",
"suppress-fib-pending": "disabled"
}
}
}
},
"DEVICE_METADATA_SUPPRESS_PENDING_FIB_ENABLED_SYNCHRONOUS_MODE_DISABLED": {
"sonic-device_metadata:sonic-device_metadata": {
"sonic-device_metadata:DEVICE_METADATA": {
"sonic-device_metadata:localhost": {
"synchronous_mode": "disable",
"suppress-fib-pending": "enabled"
}
}
}
},
"DEVICE_METADATA_VALID_RACK_MGMT_MAP": { "DEVICE_METADATA_VALID_RACK_MGMT_MAP": {
"sonic-device_metadata:sonic-device_metadata": { "sonic-device_metadata:sonic-device_metadata": {
"sonic-device_metadata:DEVICE_METADATA": { "sonic-device_metadata:DEVICE_METADATA": {

View File

@ -205,18 +205,6 @@ module sonic-device_metadata {
By default SONiC advertises /128 subnet prefix in Loopback0 as /64 subnet route"; By default SONiC advertises /128 subnet prefix in Loopback0 as /64 subnet route";
} }
leaf suppress-fib-pending {
description "Enable BGP suppress FIB pending feature. BGP will wait for route FIB installation before announcing routes";
type enumeration {
enum enabled;
enum disabled;
}
default disabled;
must "((current() = 'disabled') or (current() = 'enabled' and ../synchronous_mode = 'enable'))" {
error-message "ASIC synchronous mode must be enabled in order to enable suppress FIB pending feature";
}
}
leaf rack_mgmt_map { leaf rack_mgmt_map {
type string { type string {
length 0..128 { length 0..128 {