diff options
| author | anlan_cs <vic.lan@pica8.com> | 2023-05-22 18:32:23 +0800 | 
|---|---|---|
| committer | anlan_cs <vic.lan@pica8.com> | 2023-07-13 15:25:31 +0800 | 
| commit | a99521a26f7ca02bc4d4d9dcc36b8f80a4c3d2f7 (patch) | |
| tree | b56b98c67343105cb698c74cbc870a86475bf1e1 /zebra/interface.c | |
| parent | 88236d4e952fa05274d5464236a8df4727a6a1c7 (diff) | |
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/interface.c')
| -rw-r--r-- | zebra/interface.c | 18 | 
1 files changed, 9 insertions, 9 deletions
diff --git a/zebra/interface.c b/zebra/interface.c index 989763d13c..4006f9c574 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. */  | 
