mirror_frr/zebra
Donald Sharp 48dc861028 zebra: Allow multiple connected routes to be choosen for kernel routes
This bug should only really affect kernel routes.  To reproduce:

a) Have multiple connected routes that point to the same prefix
swp8  up      default         169.254.0.250/30
swp9  up      default         169.254.0.250/30

b) Have a kernel route that uses one of those connected routes
7.6.2.8 via 169.254.0.249 dev swp8 proto static
(But have it choose a non-selected connected nexthop)

c) Introduce an event that causes the rib table to be reprocessed,
say a unrelated interface going up / down

  This causes the route to be lost with this message:
2022/03/28 21:21:53 ZEBRA: [YXCJP-0WZWV] netlink_nexthop_msg_encode: ID (3454): 169.254.0.249, via swp8(1383) vrf default(0)
2022/03/28 21:21:53 ZEBRA: [YF2E6-J60JH] nexthop_active: 169.254.0.249, via swp8 given ifindex does not match nexthops ifindex found found: directly connected, swp9

Effectively the nexthop that zebra is choosing would not be the one
that the kernel route has choosen and FRR removes the route:
022/03/28 21:21:53 ZEBRA: [NM15X-X83N9] rib_process: (0:254):7.6.2.8/32: rn 0x56042e632e90, removing re 0x56042e6316e0
2022/03/28 21:21:53 ZEBRA: [Y53JX-CBC5H] rib_unlink: (0:254):7.6.2.8/32: rn 0x56042e632e90, re 0x56042e6316e0
2022/03/28 21:21:53 ZEBRA: [KT8QQ-45WQ0] rib_gc_dest: (0:?):7.6.2.8/32: removing dest from table

What is happening?

Zebra is not looking at all connected routes and if any of them
would have the appropriate ifindex and just blindly rejecting
the route.

So when nexthop resolution happens and it matches a connected
route and the dest->selected nexthop ifindex does not match, let's sort
through the rest of them and see if any of them match and if so
let's keep the route.

Signed-off-by: Donald Sharp <sharpd@nvidia.com>
2022-04-08 08:15:20 -04:00
..
.gitignore
connected.c zebra: Fix ships in the night issue 2022-02-07 16:10:03 -05:00
connected.h lib,zebra: use more const 2021-09-14 10:31:45 -04:00
debug_nl.c zebra: add support for protodown reason code 2022-03-09 17:52:44 -05:00
debug.c zebra: debug zebra kernel msgdump is linux specific 2021-08-06 10:04:40 -04:00
debug.h zebra: add 'detail' mpls debug setting 2021-04-05 15:53:48 -04:00
dplane_fpm_nl.c Merge pull request #10427 from sworleys/Protodown-Reason-Upstream 2022-03-15 19:58:16 -04:00
if_ioctl.c *: cleanup ifp->vrf_id 2021-11-22 20:47:23 +03:00
if_netlink.c zebra: Fix use after deletion event in freebsd 2022-03-24 20:48:24 -04:00
if_netlink.h zebra: remove old protodown dplane path 2022-03-09 18:02:44 -05:00
if_socket.c zebra: add boilerplate protodown updates for *bsd 2022-03-09 18:02:44 -05:00
if_sysctl.c zebra: kill zebra_memory.h, use MTYPE_STATIC 2021-03-22 20:02:17 +01:00
interface.c zebra: Fix use after deletion event in freebsd 2022-03-24 20:48:24 -04:00
interface.h zebra: Fix use after deletion event in freebsd 2022-03-24 20:48:24 -04:00
ioctl.c zebra: Don't send uninited data to kernel on FreeBSD 2022-03-24 12:57:01 -04:00
ioctl.h *: Remove solaris from FRR 2020-09-21 10:02:20 -04:00
ipforward_proc.c zebra: Cleanup set but unused variables 2020-02-27 09:41:58 -05:00
ipforward_sysctl.c *: Remove solaris from FRR 2020-09-21 10:02:20 -04:00
ipforward.h
irdp_interface.c zebra: kill zebra_memory.h, use MTYPE_STATIC 2021-03-22 20:02:17 +01:00
irdp_main.c *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
irdp_packet.c *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
irdp.h *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
kernel_netlink.c zebra: Note when the netlink DUMP command is interrupted 2022-03-25 19:08:14 -04:00
kernel_netlink.h zebra: Make netlink buffer reads resizeable when needed 2022-02-08 17:28:19 -05:00
kernel_socket.c Merge pull request #10867 from donaldsharp/ifp_use_after_free 2022-03-25 06:55:37 +01:00
kernel_socket.h
label_manager.c Merge pull request #7756 from pjdruddy/bgplu-fixes 2021-01-09 15:48:22 -05:00
label_manager.h zebra: expose label-manager util-funcs 2021-01-05 18:19:44 +00:00
main.c zebra: Allow *BSD to specify a receive buffer size 2022-02-27 07:47:58 -05:00
Makefile
netconf_netlink.c zebra: use dataplane to read interface NETCONF info 2022-02-25 10:18:32 -05:00
netconf_netlink.h zebra: use dataplane to read interface NETCONF info 2022-02-25 10:18:32 -05:00
redistribute.c zebra: Fix ships in the night issue 2022-02-07 16:10:03 -05:00
redistribute.h zebra: Fix redistribute.h up to our standards 2022-01-18 08:39:40 -05:00
rib.h zebra: Remove unused ZEBRA_NHT_EXACT_MATCH 2022-03-12 08:27:22 -05:00
router-id.c *: cleanup ifp->vrf_id 2021-11-22 20:47:23 +03:00
router-id.h zebra: add IPv6 router-id 2020-07-17 17:39:05 +02:00
rt_netlink.c zebra: remove unnecessary check for parsing macfdb 2022-03-30 05:50:21 -04:00
rt_netlink.h zebra: add support for protodown reason code 2022-03-09 17:52:44 -05:00
rt_socket.c zebra: Do not complain if deletion fails 2022-03-19 07:44:54 -04:00
rt.h zebra: add boilerplate protodown updates for *bsd 2022-03-09 18:02:44 -05:00
rtadv.c zebra: don't send RAs w/o LLv6 or on bridge-ports 2022-03-31 16:38:37 +00:00
rtadv.h zebra: Add knowledge about RA and RFC 5549 to show zebra 2022-02-04 10:29:38 -05:00
rtread_netlink.c zebra: use more const 2021-07-19 10:36:12 -04:00
rtread_sysctl.c zebra: use more const 2021-07-19 10:36:12 -04:00
rule_netlink.c zebra: Use a bool for startup indications 2021-10-04 20:26:38 -04:00
rule_netlink.h zebra: netlink message batching 2020-08-10 21:42:43 +02:00
rule_socket.c zebra: convert ip rule installation to use dplane thread 2020-06-10 16:18:45 +02:00
sample_plugin.c *: require semicolon after FRR_DAEMON_INFO & co. 2021-03-17 06:18:39 +01:00
subdir.am zebra: add boilerplate protodown updates for *bsd 2022-03-09 18:02:44 -05:00
table_manager.c zebra: fix memleak on shutdown 2021-11-16 12:42:32 +03:00
table_manager.h zebra: extend table manager per vrf, add vty configuration 2021-09-21 18:37:30 +02:00
testrib.conf
zapi_msg.c zebra: register NHT nexthops with proper SAFI 2022-03-27 14:51:00 +02:00
zapi_msg.h zebra: name the route_entry opaque struct more specifically 2022-01-31 08:50:50 -05:00
zebra_dplane.c zebra: avoid initialization in ctx_intf_init 2022-03-09 18:02:44 -05:00
zebra_dplane.h zebra: only clear pd_reason on shutdown/sweep 2022-03-09 18:02:44 -05:00
zebra_errors.c zebra: add support for protodown reason code 2022-03-09 17:52:44 -05:00
zebra_errors.h zebra: add support for protodown reason code 2022-03-09 17:52:44 -05:00
zebra_evpn_mac.c pimd, zebra: Fix spelling of fowarding 2022-04-02 07:46:19 -04:00
zebra_evpn_mac.h Merge pull request #10726 from chiragshah6/fdev2 2022-03-22 22:05:47 -07:00
zebra_evpn_mh.c zebra: remove check returning value of RB_INSERT() 2022-03-19 13:45:14 +08:00
zebra_evpn_mh.h zebra: add support for protodown reason code 2022-03-09 17:52:44 -05:00
zebra_evpn_neigh.c Merge pull request #10704 from anlancs/zebra-remove-check 2022-03-13 10:17:13 -04:00
zebra_evpn_neigh.h zebra: Convert to struct zebra_neigh as per our internal standard 2021-09-02 10:33:23 -04:00
zebra_evpn_vxlan.h *: cleanup ifp->vrf_id 2021-11-22 20:47:23 +03:00
zebra_evpn.c zebra: use "assert" instead of unnecessary check 2022-03-30 03:19:28 -04:00
zebra_evpn.h zebra: Convert to struct zebra_vtep as per our internal standard 2021-09-02 10:33:22 -04:00
zebra_fpm_dt.c zebra: replace inet_ntoa 2020-10-22 13:37:25 -04:00
zebra_fpm_netlink.c zebra: FPM next hop weights 2022-02-10 19:16:33 +03:00
zebra_fpm_private.h zebra: Fix IPv4 routes with IPv6 link local next hops install in FPM 2021-09-13 08:39:43 -07:00
zebra_fpm_protobuf.c *: Do not cast to the same type 2020-04-08 17:15:06 +03:00
zebra_fpm.c *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
zebra_gr.c *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
zebra_l2.c *: cleanup ifp->vrf_id 2021-11-22 20:47:23 +03:00
zebra_l2.h zebra: refresh vxlan evpn contexts, when bridge interface goes up 2021-09-17 10:25:38 +02:00
zebra_mlag_private.c *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
zebra_mlag_vty.c zebra: Do not build mlag protobuf support if version 3 is not avail 2019-12-15 09:37:51 -05:00
zebra_mlag_vty.h lib, zebra: add missing extern "C" {} blocks to new header files 2020-04-22 23:49:22 -03:00
zebra_mlag.c *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
zebra_mlag.h *: require semicolon after DEFINE_HOOK & co. 2021-03-17 06:18:17 +01:00
zebra_mpls_netlink.c zebra: dplane FPM handle LSP install/update/delete 2020-11-27 16:32:01 +00:00
zebra_mpls_null.c
zebra_mpls_openbsd.c zebra: Convert to struct zebra_nhlfe as per our internal standard 2021-09-02 10:33:23 -04:00
zebra_mpls_vty.c zebra: fix wrong check of mpls command 2021-08-18 19:34:03 -04:00
zebra_mpls.c zebra: Convert vty_out to vty_json for JSON 2021-11-25 17:49:46 +02:00
zebra_mpls.h zebra: Convert to struct zebra_fec as per our internal standard 2021-09-02 10:33:23 -04:00
zebra_mroute.c pimd, zebra: explicit cast int netlink val to uint 2021-04-28 11:43:50 -04:00
zebra_mroute.h
zebra_nb_config.c zebra: Convert to struct zebra_l3nvi as per our internal standard 2021-09-02 10:33:22 -04:00
zebra_nb_rpcs.c zebra: display rpc error msg to vtysh 2020-10-05 13:57:54 -07:00
zebra_nb_state.c zebra: make ribs config false 2021-03-16 17:25:49 +03:00
zebra_nb.c zebra: North-bound implementation for zebra rmaps 2021-03-30 22:58:42 +03:00
zebra_nb.h zebra: North-bound implementation for zebra rmaps 2021-03-30 22:58:42 +03:00
zebra_netns_id.c zebra: remove unused variable 2022-03-07 17:37:27 +01:00
zebra_netns_id.h zebra: dynamically detect vxlan link interfaces in other netns 2020-09-11 18:26:23 +02:00
zebra_netns_notify.c zebra: Fix use after deletion event in freebsd 2022-03-24 20:48:24 -04:00
zebra_netns_notify.h
zebra_nhg_private.h lib, zebra: add missing extern "C" {} blocks to new header files 2020-04-22 23:49:22 -03:00
zebra_nhg.c zebra: Allow multiple connected routes to be choosen for kernel routes 2022-04-08 08:15:20 -04:00
zebra_nhg.h Merge pull request #8488 from mjstapp/more_workqueue 2021-04-27 11:59:33 -04:00
zebra_ns.c *: rework renaming the default VRF 2021-12-21 22:09:29 +03:00
zebra_ns.h zebra: Make netlink buffer reads resizeable when needed 2022-02-08 17:28:19 -05:00
zebra_opaque.c *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
zebra_opaque.h zebra: add zebra opaque module 2020-06-02 08:20:54 -04:00
zebra_pbr.c zebra: return void for dplane_ctx_get_pbr_ipset_entry 2021-11-17 07:46:36 -05:00
zebra_pbr.h zebra: update dataplane flowspec address family in ipset_info 2021-11-03 17:17:08 +01:00
zebra_ptm_redistribute.c zebra: kill zebra_memory.h, use MTYPE_STATIC 2021-03-22 20:02:17 +01:00
zebra_ptm_redistribute.h
zebra_ptm.c zebra: Prevent installation of connected multiple times 2022-03-02 18:34:32 -08:00
zebra_ptm.h *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
zebra_pw.c *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
zebra_pw.h *: require semicolon after DEFINE_QOBJ & co. 2021-03-17 06:18:37 +01:00
zebra_rib.c zebra: add support for protodown reason code 2022-03-09 17:52:44 -05:00
zebra_rnh.c zebra: add a few const in RNH code 2022-03-27 14:57:22 +02:00
zebra_rnh.h zebra: add a few const in RNH code 2022-03-27 14:57:22 +02:00
zebra_routemap_nb_config.c zebra: remove checks for src address existence when using "set src" 2021-08-02 18:35:30 +03:00
zebra_routemap_nb.c *: make sure config.h or zebra.h is first 2021-04-23 12:06:35 +02:00
zebra_routemap_nb.h zebra: North-bound implementation for zebra rmaps 2021-03-30 22:58:42 +03:00
zebra_routemap.c *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00
zebra_routemap.h zebra: North-bound implementation for zebra rmaps 2021-03-30 22:58:42 +03:00
zebra_router.c zebra: make netlink object hash threadsafe 2022-02-11 17:03:26 -05:00
zebra_router.h zebra: clear protodown_rc on shutdown and sweep 2022-03-09 18:02:42 -05:00
zebra_script.c zebra: Fixup lua with new dplane ops 2022-03-16 15:10:54 -04:00
zebra_script.h zebra: Add encoders/decoders for zebra 2021-10-20 00:56:00 +08:00
zebra_snmp.c build: make builddir include path consistent 2021-04-21 15:42:33 +02:00
zebra_srte.c *: When matching against a nexthop send and process what it matched against 2022-03-12 11:18:45 -05:00
zebra_srte.h zebra: Convert to struct zebra_lsp as per our internal standard 2021-09-02 10:33:23 -04:00
zebra_srv6_vty.c zebra: output optional param "func-bits" for SRv6 2022-03-28 17:37:45 +09:00
zebra_srv6_vty.h *: new cli-nodes for SRv6 manager (step2) 2021-06-02 10:24:47 -04:00
zebra_srv6.c zebra: elliminate srv6 locator auto allocation by zlicnet request 2021-09-07 12:54:39 +00:00
zebra_srv6.h *: fix code format accourding to checkpatch 2021-06-02 10:24:48 -04:00
zebra_vrf.c zebra: fix cleanup of meta queues on vrf disable 2022-02-01 18:20:30 +03:00
zebra_vrf.h lib: move zebra-only netns stuff to zebra 2021-10-19 00:16:10 +03:00
zebra_vty.c zebra: show ip nht mrib 2022-03-27 14:57:18 +02:00
zebra_vxlan_private.h zebra: Convert to struct zebra_l3nvi as per our internal standard 2021-09-02 10:33:22 -04:00
zebra_vxlan.c Merge pull request #10928 from anlancs/zebra-cleanup-1 2022-04-05 09:49:00 -04:00
zebra_vxlan.h zebra: handle bridge mac address update in evpn contexts 2021-09-17 10:25:35 +02:00
zserv.c *: Fix spelling of Gracefull 2022-04-02 07:46:19 -04:00
zserv.h *: Change thread->func to return void instead of int 2022-02-23 19:56:04 -05:00