Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FRR]Fixing zebra to handle non notification of better admin won #81

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
From 4b7ca0f0063b7ddb85c0b6fb3ce6bfeaa26e460f Mon Sep 17 00:00:00 2001
From: dgsudharsan <sudharsand@nvidia.com>
Date: Tue, 14 Nov 2023 23:21:42 +0000
Subject: [PATCH] zebra: Fix non-notification of better admin won If there
happens to be a entry in the zebra rib that has a lower admin distance then a
newly received re, zebra would not notify the upper level protocol about this
happening. Imagine a case where there is a connected route for say a /32 and
bgp receives a route from a peer that is the same route as the connected.
Since BGP has no network statement and perceives the route as being `good`
bgp will install the route into zebra. Zebra will look at the new bgp re and
correctly identify that the re is not something that it will use and do
nothing. This change notices this and sends up a BETTER_ADMIN_WON route
notification.


diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 039c44cc0..1c0da1df8 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1209,6 +1209,7 @@ static void rib_process(struct route_node *rn)
rib_dest_t *dest;
struct zebra_vrf *zvrf = NULL;
struct vrf *vrf;
+ struct route_entry *proto_re_changed = NULL;

vrf_id_t vrf_id = VRF_UNKNOWN;

@@ -1278,6 +1279,7 @@ static void rib_process(struct route_node *rn)
* skip it.
*/
if (CHECK_FLAG(re->status, ROUTE_ENTRY_CHANGED)) {
+ proto_re_changed = re;
if (!nexthop_active_update(rn, re)) {
const struct prefix *p;
struct rib_table_info *info;
@@ -1417,6 +1419,22 @@ static void rib_process(struct route_node *rn)
}
}

+ /*
+ * If zebra has a new_selected and a proto_re_changed
+ * entry that was not the old selected and the protocol
+ * is different, zebra should notify the upper level
+ * protocol that the sent down entry was not selected
+ */
+ if (new_selected && proto_re_changed &&
+ proto_re_changed != old_selected &&
+ new_selected->type != proto_re_changed->type) {
+ struct rib_table_info *info = srcdest_rnode_table_info(rn);
+
+ zsend_route_notify_owner(rn, proto_re_changed,
+ ZAPI_ROUTE_BETTER_ADMIN_WON, info->afi,
+ info->safi);
+ }
+
/* Update fib according to selection results */
if (new_fib && old_fib)
rib_process_update_fib(zvrf, rn, old_fib, new_fib);
--
2.17.1

1 change: 1 addition & 0 deletions src/sonic-frr/patch/series
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,4 @@ cross-compile-changes.patch
0024-bgpd-Do-not-process-NLRIs-if-the-attribute-length-is.patch
0025-bgpd-Use-treat-as-withdraw-for-tunnel-encapsulation-.patch
0026-zebra-Add-encap-type-when-building-packet-for-FPM.patch
0027-zebra-Fix-non-notification-of-better-admin-won.patch