mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 09:20:25 +00:00
Merge pull request #14795 from donaldsharp/zebra_notify_admin_lost
zebra: Fix non-notification of better admin won
This commit is contained in:
commit
2648661ed5
@ -1233,6 +1233,7 @@ static void rib_process(struct route_node *rn)
|
|||||||
rib_dest_t *dest;
|
rib_dest_t *dest;
|
||||||
struct zebra_vrf *zvrf = NULL;
|
struct zebra_vrf *zvrf = NULL;
|
||||||
struct vrf *vrf;
|
struct vrf *vrf;
|
||||||
|
struct route_entry *proto_re_changed = NULL;
|
||||||
|
|
||||||
vrf_id_t vrf_id = VRF_UNKNOWN;
|
vrf_id_t vrf_id = VRF_UNKNOWN;
|
||||||
|
|
||||||
@ -1302,6 +1303,7 @@ static void rib_process(struct route_node *rn)
|
|||||||
* skip it.
|
* skip it.
|
||||||
*/
|
*/
|
||||||
if (CHECK_FLAG(re->status, ROUTE_ENTRY_CHANGED)) {
|
if (CHECK_FLAG(re->status, ROUTE_ENTRY_CHANGED)) {
|
||||||
|
proto_re_changed = re;
|
||||||
if (!nexthop_active_update(rn, re)) {
|
if (!nexthop_active_update(rn, re)) {
|
||||||
const struct prefix *p;
|
const struct prefix *p;
|
||||||
struct rib_table_info *info;
|
struct rib_table_info *info;
|
||||||
@ -1387,6 +1389,8 @@ static void rib_process(struct route_node *rn)
|
|||||||
* new_selected --- RE entry that is newly SELECTED
|
* new_selected --- RE entry that is newly SELECTED
|
||||||
* old_fib --- RE entry currently in kernel FIB
|
* old_fib --- RE entry currently in kernel FIB
|
||||||
* new_fib --- RE entry that is newly to be 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
|
* new_selected will get SELECTED flag, and is going to be redistributed
|
||||||
* the zclients. new_fib (which can be new_selected) will be installed
|
* the zclients. new_fib (which can be new_selected) will be installed
|
||||||
@ -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 */
|
/* Update fib according to selection results */
|
||||||
if (new_fib && old_fib)
|
if (new_fib && old_fib)
|
||||||
rib_process_update_fib(zvrf, rn, old_fib, new_fib);
|
rib_process_update_fib(zvrf, rn, old_fib, new_fib);
|
||||||
|
Loading…
Reference in New Issue
Block a user