diff --git a/zebra/interface.c b/zebra/interface.c index f7fd112cd4ce..1c86a6a5c707 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -972,6 +972,8 @@ void if_up(struct interface *ifp, bool install_connected) event_ignore_late_timer(zif->speed_update); if_addr_wakeup(ifp); + + rib_update_handle_vrf_all(RIB_UPDATE_KERNEL, ZEBRA_ROUTE_KERNEL); } /* Interface goes down. We have to manage different behavior of based diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c index 1519246c179e..e61c158ca9f2 100644 --- a/zebra/zebra_nhg.c +++ b/zebra/zebra_nhg.c @@ -2648,7 +2648,7 @@ static unsigned nexthop_active_check(struct route_node *rn, ifp = if_lookup_by_index(nexthop->ifindex, nexthop->vrf_id); - if (ifp && ifp->vrf->vrf_id == vrf_id && if_is_up(ifp)) { + if (ifp && ifp->vrf->vrf_id == vrf_id && if_is_up(ifp) && if_is_operative(ifp)) { SET_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE); goto skip_check; } diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index b2543ca0e8b1..3ea5f70f8bb2 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -1480,7 +1480,7 @@ static void rib_process(struct route_node *rn) rib_process_update_fib(zvrf, rn, old_fib, new_fib); else if (new_fib) rib_process_add_fib(zvrf, rn, new_fib); - else if (old_fib) + else if (old_fib && !RIB_SYSTEM_ROUTE(old_fib)) rib_process_del_fib(zvrf, rn, old_fib); /* Remove all RE entries queued for removal */