From 59ecefe2db1a69b0a5a5169d0ad88a5701762e64 Mon Sep 17 00:00:00 2001 From: vivek Date: Wed, 16 Mar 2016 20:38:31 +0000 Subject: [PATCH] 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 Reviewed-by: Donald Sharp Ticket: CM-9419 Reviewed By: CCR-4302 Testing Done: Manual, also verified by Atul --- bgpd/bgpd.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/bgpd/bgpd.h b/bgpd/bgpd.h index 3a0a679d6f..240694bb6d 100644 --- a/bgpd/bgpd.h +++ b/bgpd/bgpd.h @@ -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; } -- 2.39.5