summaryrefslogtreecommitdiffstats
path: root/zebra
diff options
context:
space:
mode:
authoranlan_cs <vic.lan@pica8.com>2023-05-22 12:32:23 +0200
committeranlan_cs <vic.lan@pica8.com>2023-07-13 09:25:31 +0200
commita99521a26f7ca02bc4d4d9dcc36b8f80a4c3d2f7 (patch)
treeb56b98c67343105cb698c74cbc870a86475bf1e1 /zebra
parentMerge pull request #13717 from anlancs/fix/pimd-igmp-prot-back-2 (diff)
downloadfrr-a99521a26f7ca02bc4d4d9dcc36b8f80a4c3d2f7.tar.xz
frr-a99521a26f7ca02bc4d4d9dcc36b8f80a4c3d2f7.zip
zebra: Fix wrong vrf change procedure
Currently the vrf change procedure for the deleted interface is after its deletion, it causes problem for upper daemons. Here is the problem of `bgp`: After deletion of one **irrelevant** interface in the same vrf, its `ifindex` is set to 0. And then, the vrf change procedure will send "ZEBRA_INTERFACE_DOWN" to `bgpd`. Normally, `bgp_nht_ifp_table_handle()` should igore this message for no correlation. However, it wrongly matched `ifindex` of 0, and removed the related routes for the down `bnc`. Adjust the location of the vrf change procedure to fix this issue. Signed-off-by: anlan_cs <vic.lan@pica8.com>
Diffstat (limited to 'zebra')
-rw-r--r--zebra/interface.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/zebra/interface.c b/zebra/interface.c
index 989763d13..4006f9c57 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -787,6 +787,15 @@ void if_delete_update(struct interface **pifp)
/* Delete connected routes from the kernel. */
if_delete_connected(ifp);
+ /* if the ifp is in a vrf, move it to default so vrf can be deleted if
+ * desired. This operation is not done for netns implementation to avoid
+ * collision with interface with the same name in the default vrf (can
+ * occur with this implementation whereas it is not possible with
+ * vrf-lite).
+ */
+ if (ifp->vrf->vrf_id && !vrf_is_backend_netns())
+ if_handle_vrf_change(ifp, VRF_DEFAULT);
+
/* Send out notification on interface delete. */
zebra_interface_delete_update(ifp);
@@ -800,15 +809,6 @@ void if_delete_update(struct interface **pifp)
if_set_index(ifp, IFINDEX_INTERNAL);
ifp->node = NULL;
- /* if the ifp is in a vrf, move it to default so vrf can be deleted if
- * desired. This operation is not done for netns implementation to avoid
- * collision with interface with the same name in the default vrf (can
- * occur with this implementation whereas it is not possible with
- * vrf-lite).
- */
- 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. */