summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Ryzhov <iryzhov@nfware.com>2021-04-08 14:43:07 +0200
committerIgor Ryzhov <iryzhov@nfware.com>2021-04-12 09:56:04 +0200
commitaf736200e1c0e1e6da88bca6a57027db70a92c68 (patch)
tree17fdf8e55d771d2fbd9a03782eea0974447ece27
parentMerge pull request #7434 from sudhanshukumar22/bgp-link-local-address (diff)
downloadfrr-af736200e1c0e1e6da88bca6a57027db70a92c68.tar.xz
frr-af736200e1c0e1e6da88bca6a57027db70a92c68.zip
lib: fix interface nb stale pointers
The first change in this commit is the processing of the VRF termination. When we terminate the VRF, we should not delete the underlying interfaces, because there may be pointers to them in the northbound configuration. We should move them to the default VRF instead. Because of the first change, the VRF interface itself is also not deleted when deleting the VRF. It should be handled in netlink_link_change. This is done by the second change. Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
-rw-r--r--lib/if.c23
-rw-r--r--zebra/if_netlink.c3
2 files changed, 20 insertions, 6 deletions
diff --git a/lib/if.c b/lib/if.c
index 629ef4e70..f8a693d8f 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -1056,15 +1056,30 @@ struct connected *connected_get_linklocal(struct interface *ifp)
void if_terminate(struct vrf *vrf)
{
struct interface *ifp;
+ bool delete;
+
+ /*
+ * If the default VRF is being terminated or has
+ * already been terminated it means that
+ * the program is shutting down and we need to
+ * delete all the interfaces. Otherwise, we only
+ * need to move VRF's interfaces to the default VRF.
+ */
+ delete = vrf_is_backend_netns() || vrf->vrf_id == VRF_DEFAULT
+ || !vrf_lookup_by_id(VRF_DEFAULT);
while (!RB_EMPTY(if_name_head, &vrf->ifaces_by_name)) {
ifp = RB_ROOT(if_name_head, &vrf->ifaces_by_name);
- if (ifp->node) {
- ifp->node->info = NULL;
- route_unlock_node(ifp->node);
+ if (delete) {
+ if (ifp->node) {
+ ifp->node->info = NULL;
+ route_unlock_node(ifp->node);
+ }
+ if_delete(&ifp);
+ } else {
+ if_update_to_new_vrf(ifp, VRF_DEFAULT);
}
- if_delete(&ifp);
}
}
diff --git a/zebra/if_netlink.c b/zebra/if_netlink.c
index af2c25160..6aaf9d94f 100644
--- a/zebra/if_netlink.c
+++ b/zebra/if_netlink.c
@@ -1661,8 +1661,7 @@ int netlink_link_change(struct nlmsghdr *h, ns_id_t ns_id, int startup)
else if (IS_ZEBRA_IF_VXLAN(ifp))
zebra_l2_vxlanif_del(ifp);
- if (!IS_ZEBRA_IF_VRF(ifp))
- if_delete_update(ifp);
+ if_delete_update(ifp);
}
return 0;