BGP: Fix linkage between BGP instance and VRF structure

The issue here has to do with the fact that VRFs (like interfaces) are not
actually getting deleted when they are removed - they remain present. This
leads to situations in which BGP may try to unlink more than once, which
messes up the reference count (lock) in the BGP instance.

Signed-off-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
Reviewed-by:   Donald Sharp <sharpd@cumulusnetworks.com>

Ticket: CM-9419
Reviewed By: CCR-4302
Testing Done: Manual, also verified by Atul

<DETAILED DESCRIPTION (REPLACE)>
This commit is contained in:
vivek 2016-03-16 20:38:31 +00:00
parent a3cb01d89c
commit 59ecefe2db

View File

@ -1458,17 +1458,22 @@ static inline void
bgp_vrf_link (struct bgp *bgp, struct vrf *vrf)
{
bgp->vrf_id = vrf->vrf_id;
bgp_lock (bgp);
vrf->info = (void *)bgp;
if (vrf->info != (void *)bgp)
{
bgp_lock (bgp);
vrf->info = (void *)bgp;
}
}
/* Unlink BGP instance from VRF. */
static inline void
bgp_vrf_unlink (struct bgp *bgp, struct vrf *vrf)
{
vrf->info = NULL;
bgp_unlock (bgp);
if (vrf->info == (void *)bgp)
{
vrf->info = NULL;
bgp_unlock (bgp);
}
bgp->vrf_id = VRF_DEFAULT;
}