diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c index 3a325df06c..fcb692b715 100644 --- a/zebra/if_netlink.c +++ b/zebra/if_netlink.c @@ -2323,8 +2323,6 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup) zlog_debug("RTM_DELLINK for %s(%u)", name, ifp->ifindex); - UNSET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK); - if (IS_ZEBRA_IF_BOND(ifp)) zebra_l2if_update_bond(ifp, false); if (IS_ZEBRA_IF_BOND_SLAVE(ifp)) diff --git a/zebra/interface.c b/zebra/interface.c index 496a85e676..231ddc51db 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -800,6 +800,8 @@ void if_delete_update(struct interface **pifp) if (ifp->vrf->vrf_id && !vrf_is_backend_netns()) if_handle_vrf_change(ifp, VRF_DEFAULT); + UNSET_FLAG(ifp->status, ZEBRA_INTERFACE_VRF_LOOPBACK); + /* Reset some zebra interface params to default values. */ zif = ifp->info; if (zif) { @@ -840,6 +842,9 @@ void if_handle_vrf_change(struct interface *ifp, vrf_id_t vrf_id) /* This is to issue an UPDATE or a DELETE, as appropriate. */ zebra_interface_vrf_update_del(ifp, vrf_id); + if (if_is_vrf(ifp)) + return; + /* update VRF */ if_update_to_new_vrf(ifp, vrf_id);