Skip to content

Commit

Permalink
Merge pull request FRRouting#14795 from donaldsharp/zebra_notify_admi…
Browse files Browse the repository at this point in the history
…n_lost

zebra: Fix non-notification of better admin won
  • Loading branch information
mjstapp authored Dec 7, 2023
2 parents 24869b4 + 2d30050 commit 2648661
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 @@ -1233,6 +1233,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 @@ -1302,6 +1303,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 @@ -1387,6 +1389,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 @@ -1441,6 +1445,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 2648661

Please sign in to comment.