[FRR] Switch to dplane_fpm_nl plugin instead of fpm (#12852)

Why I did it
dplane_fpm_nl is a new FPM implementation in FRR. The old plugin fpm will not have any new features implemented. Usage of the new plugin gives us ability to use BGP suppression feature and next hop groups in the future.

How I did it
Switch to dplane_fpm_nl zebra plugin from old fpm plugin which is not supported anymore
Remove stale patches for old fpm plugin and add similar patches for dplane_fpm_nl

How to verify it
Build and run on the switch.

Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>
This commit is contained in:
Stepan Blyshchak 2023-02-06 19:38:39 +02:00 committed by GitHub
parent 1dec473495
commit 68e1079202
No account linked to committer's email address
18 changed files with 250 additions and 164 deletions

View File

@ -41,6 +41,15 @@ update_default_gw()
fi fi
} }
write_default_zebra_config()
{
FILE_NAME=${1}
grep -q '^no fpm use-next-hop-groups' $FILE_NAME || {
sed -i '1i no fpm use-next-hop-groups\nfpm address 127.0.0.1' $FILE_NAME
}
}
if [[ ! -z "$NAMESPACE_ID" ]]; then if [[ ! -z "$NAMESPACE_ID" ]]; then
update_default_gw 4 update_default_gw 4
update_default_gw 6 update_default_gw 6
@ -69,9 +78,11 @@ if [ -z "$CONFIG_TYPE" ] || [ "$CONFIG_TYPE" == "separated" ]; then
elif [ "$CONFIG_TYPE" == "split" ]; then elif [ "$CONFIG_TYPE" == "split" ]; then
echo "no service integrated-vtysh-config" > /etc/frr/vtysh.conf echo "no service integrated-vtysh-config" > /etc/frr/vtysh.conf
rm -f /etc/frr/frr.conf rm -f /etc/frr/frr.conf
write_default_zebra_config /etc/frr/zebra.conf
elif [ "$CONFIG_TYPE" == "split-unified" ]; then elif [ "$CONFIG_TYPE" == "split-unified" ]; then
echo "service integrated-vtysh-config" > /etc/frr/vtysh.conf echo "service integrated-vtysh-config" > /etc/frr/vtysh.conf
rm -f /etc/frr/bgpd.conf /etc/frr/zebra.conf /etc/frr/staticd.conf rm -f /etc/frr/bgpd.conf /etc/frr/zebra.conf /etc/frr/staticd.conf
write_default_zebra_config /etc/frr/frr.conf
elif [ "$CONFIG_TYPE" == "unified" ]; then elif [ "$CONFIG_TYPE" == "unified" ]; then
CFGGEN_PARAMS=" \ CFGGEN_PARAMS=" \
-d \ -d \

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 fpm -M snmp command=/usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M dplane_fpm_nl -M snmp
priority=4 priority=4
autostart=false autostart=false
autorestart=false autorestart=false

View File

@ -6,6 +6,13 @@
! !
{% endblock banner %} {% endblock banner %}
! !
{% block fpm %}
! Uses the old known FPM behavior of including next hop information in the route (e.g. RTM_NEWROUTE) messages
no fpm use-next-hop-groups
!
fpm address 127.0.0.1
{% endblock fpm %}
!
{% include "common/daemons.common.conf.j2" %} {% include "common/daemons.common.conf.j2" %}
! !
{% include "zebra.interfaces.conf.j2" %} {% include "zebra.interfaces.conf.j2" %}

View File

@ -206,6 +206,8 @@ RUN touch /etc/quagga/zebra.conf
# disable integrated vtysh config # disable integrated vtysh config
RUN rm /etc/frr/frr.conf RUN rm /etc/frr/frr.conf
COPY ["frr/zebra.conf", "/etc/frr/"]
# Create /var/warmboot/teamd folder for teammgrd # Create /var/warmboot/teamd folder for teammgrd
RUN mkdir -p /var/warmboot/teamd RUN mkdir -p /var/warmboot/teamd

View File

@ -0,0 +1,4 @@
no fpm use-next-hop-groups
fpm address 127.0.0.1

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 fpm command=/usr/lib/frr/zebra -A 127.0.0.1 -s 90000000 -M dplane_fpm_nl
priority=13 priority=13
autostart=false autostart=false
autorestart=false autorestart=false

View File

@ -3,6 +3,12 @@
! generated by templates/zebra/zebra.conf.j2 using config DB data ! generated by templates/zebra/zebra.conf.j2 using config DB data
! file: zebra.conf ! file: zebra.conf
! !
!
! Uses the old known FPM behavior of including next hop information in the route (e.g. RTM_NEWROUTE) messages
no fpm use-next-hop-groups
!
fpm address 127.0.0.1
!
! template: common/daemons.common.conf.j2 ! template: common/daemons.common.conf.j2
! !
hostname new_hostname hostname new_hostname

View File

@ -4,6 +4,11 @@
! file: zebra.conf ! file: zebra.conf
! !
! !
! Uses the old known FPM behavior of including next hop information in the route (e.g. RTM_NEWROUTE) messages
no fpm use-next-hop-groups
!
fpm address 127.0.0.1
!
! template: common/daemons.common.conf.j2 ! template: common/daemons.common.conf.j2
! !
hostname SpineFront01 hostname SpineFront01

View File

@ -4,6 +4,11 @@
! file: zebra.conf ! file: zebra.conf
! !
! !
! Uses the old known FPM behavior of including next hop information in the route (e.g. RTM_NEWROUTE) messages
no fpm use-next-hop-groups
!
fpm address 127.0.0.1
!
! template: common/daemons.common.conf.j2 ! template: common/daemons.common.conf.j2
! !
hostname SpineFront01 hostname SpineFront01

View File

@ -4,6 +4,11 @@
! file: zebra.conf ! file: zebra.conf
! !
! !
! Uses the old known FPM behavior of including next hop information in the route (e.g. RTM_NEWROUTE) messages
no fpm use-next-hop-groups
!
fpm address 127.0.0.1
!
! template: common/daemons.common.conf.j2 ! template: common/daemons.common.conf.j2
! !
hostname switch-t0 hostname switch-t0

View File

@ -4,6 +4,11 @@
! file: zebra.conf ! file: zebra.conf
! !
! !
! Uses the old known FPM behavior of including next hop information in the route (e.g. RTM_NEWROUTE) messages
no fpm use-next-hop-groups
!
fpm address 127.0.0.1
!
! template: common/daemons.common.conf.j2 ! template: common/daemons.common.conf.j2
! !
hostname SpineFront01 hostname SpineFront01

View File

@ -4,6 +4,11 @@
! file: zebra.conf ! file: zebra.conf
! !
! !
! Uses the old known FPM behavior of including next hop information in the route (e.g. RTM_NEWROUTE) messages
no fpm use-next-hop-groups
!
fpm address 127.0.0.1
!
! template: common/daemons.common.conf.j2 ! template: common/daemons.common.conf.j2
! !
hostname SpineFront01 hostname SpineFront01

View File

@ -4,6 +4,11 @@
! file: zebra.conf ! file: zebra.conf
! !
! !
! Uses the old known FPM behavior of including next hop information in the route (e.g. RTM_NEWROUTE) messages
no fpm use-next-hop-groups
!
fpm address 127.0.0.1
!
! template: common/daemons.common.conf.j2 ! template: common/daemons.common.conf.j2
! !
hostname switch-t0 hostname switch-t0

View File

@ -1,25 +1,48 @@
From 39bb40dc4bad4462e4ae9c98580d75fa2c92e032 Mon Sep 17 00:00:00 2001 From 5dba497fb3810f9e5cb4b23bec151ec44d8dcec4 Mon Sep 17 00:00:00 2001
From: Pavel Shirshov <pavelsh@microsoft.com> From: Stepan Blyschak <stepanb@nvidia.com>
Date: Mon, 16 Nov 2020 18:29:46 -0800 Date: Mon, 16 Jan 2023 11:24:16 +0000
Subject: [PATCH 3/8] Use vrf_id for vrf, not tabled_id Subject: [PATCH] Use vrf_id for vrf, not tabled_id
Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>
--- ---
zebra/zebra_fpm_netlink.c | 2 +- zebra/rt_netlink.c | 24 ++++++++++++++++++------
1 file changed, 1 insertion(+), 1 deletion(-) 1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index ec22c5dd4..aad0156b3 100644 index 24c01b7f5..d4567990e 100644
--- a/zebra/zebra_fpm_netlink.c --- a/zebra/rt_netlink.c
+++ b/zebra/zebra_fpm_netlink.c +++ b/zebra/rt_netlink.c
@@ -287,7 +287,7 @@ static int netlink_route_info_fill(struct netlink_route_info *ri, int cmd, @@ -1969,12 +1969,24 @@ ssize_t netlink_route_multipath_msg_encode(int cmd,
ri->nlmsg_pid = zvrf->zns->netlink_dplane_out.snl.nl_pid; #endif
/* 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;
+ }
}
ri->nlmsg_type = cmd; if (IS_ZEBRA_DEBUG_KERNEL)
- ri->rtm_table = table_info->table_id;
+ ri->rtm_table = zvrf_id(rib_dest_vrf(dest));
ri->rtm_protocol = RTPROT_UNSPEC;
/*
-- --
2.12.2 2.30.2

View File

@ -1,33 +1,34 @@
From 74ee34e4990dbd168b7b8072894eb0cf8927f9d1 Mon Sep 17 00:00:00 2001 From 369bbb4d62aa47d5a6d5157ca6ea819c4cb80f15 Mon Sep 17 00:00:00 2001
From: Kishore Kunal <kishore.kunal@broadcom.com> From: Stepan Blyschak <stepanb@nvidia.com>
Date: Fri, 15 Jan 2021 15:52:13 -0800 Date: Thu, 20 Oct 2022 13:19:31 +0000
Subject: [PATCH 7/8] This is temp patch till Prefix to ARP indirection is Subject: [PATCH 07/13] Added support of L3VNI EVPN
add in neighorch
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>
--- ---
lib/nexthop.c | 2 ++ lib/nexthop.c | 1 +
lib/nexthop.h | 6 ++++++ lib/nexthop.h | 7 ++++++-
zebra/rt_netlink.c | 2 +- zebra/rt_netlink.c | 15 ++++++++++++++-
zebra/zapi_msg.c | 4 ++++ zebra/zapi_msg.c | 4 ++++
zebra/zebra_dplane.c | 1 + zebra/zebra_dplane.c | 2 +-
zebra/zebra_fpm_netlink.c | 20 ++++++++++++++++++++ 5 files changed, 26 insertions(+), 3 deletions(-)
6 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/lib/nexthop.c b/lib/nexthop.c diff --git a/lib/nexthop.c b/lib/nexthop.c
index a1ce22e3b..6f3fe2a5f 100644 index a1ce22e3b..10a87f072 100644
--- a/lib/nexthop.c --- a/lib/nexthop.c
+++ b/lib/nexthop.c +++ b/lib/nexthop.c
@@ -813,6 +813,8 @@ void nexthop_copy_no_recurse(struct nexthop *copy, @@ -813,6 +813,7 @@ void nexthop_copy_no_recurse(struct nexthop *copy,
memcpy(&copy->src, &nexthop->src, sizeof(nexthop->src)); memcpy(&copy->src, &nexthop->src, sizeof(nexthop->src));
memcpy(&copy->rmap_src, &nexthop->rmap_src, sizeof(nexthop->rmap_src)); memcpy(&copy->rmap_src, &nexthop->rmap_src, sizeof(nexthop->rmap_src));
copy->rparent = rparent; copy->rparent = rparent;
+ memcpy(&copy->nh_encap.encap_data.rmac, &nexthop->nh_encap.encap_data.rmac, ETH_ALEN); + memcpy(&copy->nh_encap.encap_data.rmac, &nexthop->nh_encap.encap_data.rmac, ETH_ALEN);
+
if (nexthop->nh_label) if (nexthop->nh_label)
nexthop_add_labels(copy, nexthop->nh_label_type, nexthop_add_labels(copy, nexthop->nh_label_type,
nexthop->nh_label->num_labels, nexthop->nh_label->num_labels,
diff --git a/lib/nexthop.h b/lib/nexthop.h diff --git a/lib/nexthop.h b/lib/nexthop.h
index 320b46315..0f98dc3c2 100644 index 320b46315..77eea3674 100644
--- a/lib/nexthop.h --- a/lib/nexthop.h
+++ b/lib/nexthop.h +++ b/lib/nexthop.h
@@ -66,6 +66,11 @@ enum nh_encap_type { @@ -66,6 +66,11 @@ enum nh_encap_type {
@ -42,27 +43,50 @@ index 320b46315..0f98dc3c2 100644
/* Nexthop structure. */ /* Nexthop structure. */
struct nexthop { struct nexthop {
struct nexthop *next; struct nexthop *next;
@@ -136,6 +141,7 @@ struct nexthop { @@ -135,7 +140,7 @@ struct nexthop {
/* Encapsulation information. */
enum nh_encap_type nh_encap_type; enum nh_encap_type nh_encap_type;
union { union {
vni_t vni; - vni_t vni;
+ struct vxlan_nh_encap encap_data; + struct vxlan_nh_encap encap_data;
} nh_encap; } nh_encap;
/* SR-TE color used for matching SR-TE policies */ /* SR-TE color used for matching SR-TE policies */
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 24c01b7f5..5e0f4cd8f 100644 index 03c84d6dc..a56a95276 100644
--- a/zebra/rt_netlink.c --- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c
@@ -1856,7 +1856,7 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen, @@ -1869,6 +1869,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:
@@ -1879,9 +1880,21 @@ static int netlink_route_nexthop_encap(struct nlmsghdr *n, size_t nlen,
if (!nest)
return false; return false;
+ encap_data = &nh->nh_encap.encap_data;
+
if (!nl_attr_put32(n, nlen, 0 /* VXLAN_VNI */, if (!nl_attr_put32(n, nlen, 0 /* VXLAN_VNI */,
- nh->nh_encap.vni)) - nh->nh_encap.vni))
+ nh->nh_encap.encap_data.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; return false;
+
nl_attr_nest_end(n, nest); nl_attr_nest_end(n, nest);
break; break;
}
diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c
index 5cf7d815d..529cbb44b 100644 index 5cf7d815d..529cbb44b 100644
--- a/zebra/zapi_msg.c --- a/zebra/zapi_msg.c
@ -86,80 +110,18 @@ index 5cf7d815d..529cbb44b 100644
api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p); api_nh->vrf_id, &api_nh->rmac, &vtep_ip, p);
} }
diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c diff --git a/zebra/zebra_dplane.c b/zebra/zebra_dplane.c
index 656ebcf3b..8d125d77e 100644 index 656ebcf3b..bd59df189 100644
--- a/zebra/zebra_dplane.c --- a/zebra/zebra_dplane.c
+++ b/zebra/zebra_dplane.c +++ b/zebra/zebra_dplane.c
@@ -2421,6 +2421,7 @@ int dplane_ctx_route_init(struct zebra_dplane_ctx *ctx, enum dplane_op_e op, @@ -2420,7 +2420,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)) { if (zl3vni && is_l3vni_oper_up(zl3vni)) {
nexthop->nh_encap_type = NET_VXLAN; nexthop->nh_encap_type = NET_VXLAN;
nexthop->nh_encap.vni = zl3vni->vni; - nexthop->nh_encap.vni = zl3vni->vni;
+ nexthop->nh_encap.encap_data.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 aad0156b3..34be9fb39 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.12.2 2.30.2

View File

@ -1,54 +1,32 @@
commit 8b78a43ba243df281f2096a84893ad87cb2a79ff From ca66350aecf7db3354019480d11754fabae3a97c Mon Sep 17 00:00:00 2001
Author: Stephen Xu <stexu@linkedin.com> From: Stepan Blyschak <stepanb@nvidia.com>
Date: Wed Nov 16 16:07:37 2022 -0500 Date: Thu, 20 Oct 2022 13:07:18 +0000
Subject: [PATCH 09/13] ignore route from default table
[PATCH] ignore route from default table Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>
---
zebra/dplane_fpm_nl.c | 9 +++++++++
1 file changed, 9 insertions(+)
Signed-off-by: Stephen Xu <stexu@linkedin.com> diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c
index 3b02128c9..da8504adf 100644
--- a/zebra/dplane_fpm_nl.c
+++ b/zebra/dplane_fpm_nl.c
@@ -699,6 +699,15 @@ static int fpm_nl_enqueue(struct fpm_nl_ctx *fnc, struct zebra_dplane_ctx *ctx)
|| op == DPLANE_OP_NH_UPDATE))
return 0;
diff --git a/zebra/zebra_fpm.c b/zebra/zebra_fpm.c + /*
index 43958fdfd..de7e246d4 100644 + * Ignore route from default table, because when mgmt port goes down,
--- a/zebra/zebra_fpm.c + * zebra will remove the default route and causing ASIC to blackhole IO.
+++ b/zebra/zebra_fpm.c + */
@@ -25,6 +25,7 @@ + if (dplane_ctx_get_table(ctx) == RT_TABLE_DEFAULT) {
+ zlog_debug("%s: discard default table route", __func__);
#include "log.h" + return 0;
#include "libfrr.h" + }
+#include "rib.h"
#include "stream.h"
#include "thread.h"
#include "network.h"
@@ -1016,8 +1017,15 @@ static int zfpm_build_route_updates(void)
else
zfpm_g->stats.route_dels++;
} else {
- zlog_err("%s: Encoding Prefix: %pRN No valid nexthops",
- __func__, dest->rnode);
+ struct rib_table_info *table_info =
+ rib_table_info(rib_dest_table(dest));
+ if (table_info && table_info->table_id == RT_TABLE_DEFAULT) {
+ zfpm_debug("%s: Skip encoding default table prefix: %pRN",
+ __func__, dest->rnode);
+ } else {
+ zlog_err("%s: Encoding Prefix: %pRN No valid nexthops",
+ __func__, dest->rnode);
+ }
}
}
diff --git a/zebra/zebra_fpm_netlink.c b/zebra/zebra_fpm_netlink.c
index ec22c5dd4..53e5f59fb 100644
--- a/zebra/zebra_fpm_netlink.c
+++ b/zebra/zebra_fpm_netlink.c
@@ -278,6 +278,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)); nl_buf_len = 0;
ri->prefix = rib_dest_prefix(dest); frr_mutex_lock_autounlock(&fnc->obuf_mutex);
--
2.30.2

View File

@ -0,0 +1,62 @@
From 551fa8c3549e24020dfce33d06ade4a14f72abfe Mon Sep 17 00:00:00 2001
From: Donald Sharp <sharpd@nvidia.com>
Date: Mon, 14 Nov 2022 08:28:45 -0500
Subject: [PATCH] zebra: Fix dplane_fpm_nl to allow for fast configuration
If you have this order in your configuration file:
no fpm use-next-hop-groups
fpm address 127.0.0.1
the dplane code was using the same event thread t_event and the second
add event in the code was going, you already have an event scheduled
and as such the second event does not overwrite it. Leaving
no code to actually start the whole processing. There are probably
other cli iterations that will cause this fun as well, but I'm
not going to spend the time sussing them out at the moment.
Fixes: #12314
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
---
zebra/dplane_fpm_nl.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/zebra/dplane_fpm_nl.c b/zebra/dplane_fpm_nl.c
index 7383c982baa..c5e1c113cb0 100644
--- a/zebra/dplane_fpm_nl.c
+++ b/zebra/dplane_fpm_nl.c
@@ -98,6 +98,7 @@ struct fpm_nl_ctx {
struct thread *t_read;
struct thread *t_write;
struct thread *t_event;
+ struct thread *t_nhg;
struct thread *t_dequeue;
/* zebra events. */
@@ -271,7 +272,7 @@ DEFUN(fpm_use_nhg, fpm_use_nhg_cmd,
return CMD_SUCCESS;
thread_add_event(gfnc->fthread->master, fpm_process_event, gfnc,
- FNE_TOGGLE_NHG, &gfnc->t_event);
+ FNE_TOGGLE_NHG, &gfnc->t_nhg);
return CMD_SUCCESS;
}
@@ -287,7 +288,7 @@ DEFUN(no_fpm_use_nhg, no_fpm_use_nhg_cmd,
return CMD_SUCCESS;
thread_add_event(gfnc->fthread->master, fpm_process_event, gfnc,
- FNE_TOGGLE_NHG, &gfnc->t_event);
+ FNE_TOGGLE_NHG, &gfnc->t_nhg);
return CMD_SUCCESS;
}
@@ -1367,6 +1368,8 @@ static int fpm_nl_finish_early(struct fpm_nl_ctx *fnc)
THREAD_OFF(fnc->t_ribwalk);
THREAD_OFF(fnc->t_rmacreset);
THREAD_OFF(fnc->t_rmacwalk);
+ THREAD_OFF(fnc->t_event);
+ THREAD_OFF(fnc->t_nhg);
thread_cancel_async(fnc->fthread->master, &fnc->t_read, NULL);
thread_cancel_async(fnc->fthread->master, &fnc->t_write, NULL);
thread_cancel_async(fnc->fthread->master, &fnc->t_connect, NULL);

View File

@ -12,3 +12,4 @@ cross-compile-changes.patch
0010-zebra-Note-when-the-netlink-DUMP-command-is-interrup.patch 0010-zebra-Note-when-the-netlink-DUMP-command-is-interrup.patch
0011-bgpd-enhanced-capability-is-always-turned-on-for-int.patch 0011-bgpd-enhanced-capability-is-always-turned-on-for-int.patch
0012-Ensure-ospf_apiclient_lsa_originate-cannot-accidently-write-into-stack.patch 0012-Ensure-ospf_apiclient_lsa_originate-cannot-accidently-write-into-stack.patch
0013-zebra-fix-dplane-fpm-nl-to-allow-for-fast-configuration.patch