Skip to content

Commit

Permalink
zebra: Fix non-notification of better admin won
Browse files Browse the repository at this point in the history
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.

Signed-off-by: Donald Sharp <[email protected]>
  • Loading branch information
donaldsharp committed Nov 20, 2023
1 parent c142068 commit f12783b
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions zebra/zebra_rib.c
Original file line number Diff line number Diff line change
Expand Up @@ -1206,6 +1206,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;

Expand Down Expand Up @@ -1275,6 +1276,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;
Expand Down Expand Up @@ -1360,6 +1362,8 @@ static void rib_process(struct route_node *rn)
* new_selected --- RE entry that is newly SELECTED
* old_fib --- RE entry currently in kernel FIB
* new_fib --- RE entry that is newly to be in kernel FIB
* proto_re_changed -- RE that is the last changed entry in the
* list of RE's.
*
* new_selected will get SELECTED flag, and is going to be redistributed
* the zclients. new_fib (which can be new_selected) will be installed
Expand Down Expand Up @@ -1414,6 +1418,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);
Expand Down

0 comments on commit f12783b

Please sign in to comment.