mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-11 16:39:33 +00:00
BGP: Cleanup interfaces properly on instance delete or exit
Perform interface cleanup as an instance is deleted. This takes care of the
scenario when BGP exits (or is stopped/restarted) too as instances undergo
deletion and the interface cleanup is done as the last step in that.
Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Fixes: 46abd3e3e6
Ticket: CM-9410
Reviewed By: CCR-4143
Testing Done: Reran failed test
This commit is contained in:
parent
ceebe0c4e0
commit
009b18fc80
@ -234,9 +234,6 @@ bgp_exit (int status)
|
|||||||
if (retain_mode)
|
if (retain_mode)
|
||||||
if_add_hook (IF_DELETE_HOOK, NULL);
|
if_add_hook (IF_DELETE_HOOK, NULL);
|
||||||
|
|
||||||
/* free interface and connected route information. */
|
|
||||||
bgp_if_finish ();
|
|
||||||
|
|
||||||
/* reverse bgp_master_init */
|
/* reverse bgp_master_init */
|
||||||
for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
|
for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
|
||||||
bgp_delete (bgp);
|
bgp_delete (bgp);
|
||||||
|
38
bgpd/bgpd.c
38
bgpd/bgpd.c
@ -3058,6 +3058,9 @@ bgp_delete (struct bgp *bgp)
|
|||||||
if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp))
|
if (IS_BGP_INST_KNOWN_TO_ZEBRA(bgp))
|
||||||
bgp_zebra_instance_deregister (bgp);
|
bgp_zebra_instance_deregister (bgp);
|
||||||
|
|
||||||
|
/* Free interfaces in this instance. */
|
||||||
|
bgp_if_finish (bgp);
|
||||||
|
|
||||||
/* If Default instance or VRF, unlink from the VRF structure. */
|
/* If Default instance or VRF, unlink from the VRF structure. */
|
||||||
vrf = bgp_vrf_lookup_by_instance_type (bgp);
|
vrf = bgp_vrf_lookup_by_instance_type (bgp);
|
||||||
if (vrf)
|
if (vrf)
|
||||||
@ -7158,34 +7161,27 @@ bgp_master_init (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free up connected routes and interfaces; invoked upon bgp_exit()
|
* Free up connected routes and interfaces for a BGP instance. Invoked upon
|
||||||
|
* instance delete (non-default only) or BGP exit.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
bgp_if_finish (void)
|
bgp_if_finish (struct bgp *bgp)
|
||||||
{
|
{
|
||||||
struct bgp *bgp;
|
struct listnode *ifnode, *ifnnode;
|
||||||
struct listnode *node, *nnode;
|
struct interface *ifp;
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
|
|
||||||
{
|
|
||||||
struct listnode *ifnode, *ifnnode;
|
|
||||||
struct interface *ifp;
|
|
||||||
|
|
||||||
if (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW)
|
if (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW)
|
||||||
continue;
|
return;
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS (vrf_iflist(bgp->vrf_id), ifnode, ifnnode, ifp))
|
for (ALL_LIST_ELEMENTS (vrf_iflist(bgp->vrf_id), ifnode, ifnnode, ifp))
|
||||||
{
|
{
|
||||||
struct listnode *c_node, *c_nnode;
|
struct listnode *c_node, *c_nnode;
|
||||||
struct connected *c;
|
struct connected *c;
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS (ifp->connected, c_node, c_nnode, c))
|
for (ALL_LIST_ELEMENTS (ifp->connected, c_node, c_nnode, c))
|
||||||
bgp_connected_delete (bgp, c);
|
bgp_connected_delete (bgp, c);
|
||||||
|
|
||||||
if_delete (ifp);
|
|
||||||
}
|
|
||||||
list_free (vrf_iflist(bgp->vrf_id));
|
|
||||||
}
|
}
|
||||||
|
vrf_iflist_terminate (bgp->vrf_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1174,7 +1174,7 @@ extern char *peer_uptime (time_t, char *, size_t, u_char, json_object *);
|
|||||||
extern int bgp_config_write (struct vty *);
|
extern int bgp_config_write (struct vty *);
|
||||||
extern void bgp_config_write_family_header (struct vty *, afi_t, safi_t, int *);
|
extern void bgp_config_write_family_header (struct vty *, afi_t, safi_t, int *);
|
||||||
|
|
||||||
extern void bgp_if_finish (void);
|
extern void bgp_if_finish (struct bgp *);
|
||||||
extern void bgp_master_init (void);
|
extern void bgp_master_init (void);
|
||||||
|
|
||||||
extern void bgp_init (void);
|
extern void bgp_init (void);
|
||||||
|
@ -495,6 +495,15 @@ vrf_iflist_get (vrf_id_t vrf_id)
|
|||||||
return vrf->iflist;
|
return vrf->iflist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Free the interface list of the specified VRF. */
|
||||||
|
void
|
||||||
|
vrf_iflist_terminate (vrf_id_t vrf_id)
|
||||||
|
{
|
||||||
|
struct vrf * vrf = vrf_lookup (vrf_id);
|
||||||
|
if (vrf && vrf->iflist)
|
||||||
|
if_terminate (vrf->vrf_id, &vrf->iflist);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VRF bit-map
|
* VRF bit-map
|
||||||
*/
|
*/
|
||||||
|
@ -180,6 +180,8 @@ extern void *vrf_info_lookup (vrf_id_t);
|
|||||||
extern struct list *vrf_iflist (vrf_id_t);
|
extern struct list *vrf_iflist (vrf_id_t);
|
||||||
/* Get the interface list of the specified VRF. Create one if not find. */
|
/* Get the interface list of the specified VRF. Create one if not find. */
|
||||||
extern struct list *vrf_iflist_get (vrf_id_t);
|
extern struct list *vrf_iflist_get (vrf_id_t);
|
||||||
|
/* Free the interface list of the specified VRF. */
|
||||||
|
extern void vrf_iflist_terminate (vrf_id_t vrf_id);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VRF bit-map: maintaining flags, one bit per VRF ID
|
* VRF bit-map: maintaining flags, one bit per VRF ID
|
||||||
|
Loading…
Reference in New Issue
Block a user