diff --git a/protocols/bgp/server/bmp_router.go b/protocols/bgp/server/bmp_router.go index 31c8348ac05a97fbdb16c50241810367503f3579..5f93feb98a45e9a40c9340a825ffde5b0dfe7158 100644 --- a/protocols/bgp/server/bmp_router.go +++ b/protocols/bgp/server/bmp_router.go @@ -104,6 +104,8 @@ func (r *Router) Address() net.IP { } func (r *Router) serve(con net.Conn) error { + defer r.cleanup() + r.con = con r.runMu.Lock() defer r.con.Close() @@ -125,6 +127,11 @@ func (r *Router) serve(con net.Conn) error { } } +func (r *Router) cleanup() { + r.vrfRegistry.UnregisterAll() + r.neighborManager.disposeAll() +} + func (r *Router) processMsg(msg []byte) { bmpMsg, err := bmppkt.Decode(msg) if err != nil { diff --git a/protocols/bgp/server/bmp_server.go b/protocols/bgp/server/bmp_server.go index 99dfe1416c79c59bde760a142169fcf36e585246..5fb1bb9b53be2c7c42056d91f7508efff46ac549 100644 --- a/protocols/bgp/server/bmp_server.go +++ b/protocols/bgp/server/bmp_server.go @@ -129,7 +129,7 @@ func (b *BMPServer) deleteRouter(addr net.IP) { func (b *BMPServer) RemoveRouter(addr net.IP) { id := addr.String() r := b.routers[id] - r.stop <- struct{}{} + close(r.stop) b.deleteRouter(addr) } diff --git a/routingtable/vrf/vrf_registry.go b/routingtable/vrf/vrf_registry.go index b85408880cb0b127d5311868a1ebd4560370e3e8..8fe3893cd699d5b0f24862c1a79d2fc482678e10 100644 --- a/routingtable/vrf/vrf_registry.go +++ b/routingtable/vrf/vrf_registry.go @@ -59,6 +59,16 @@ func (r *VRFRegistry) UnregisterVRF(v *VRF) { delete(r.vrfs, v.routeDistinguisher) } +// UnregisterAll unregisters all VRFs +func (r *VRFRegistry) UnregisterAll() { + r.mu.Lock() + defer r.mu.Unlock() + + for id := range r.vrfs { + delete(r.vrfs, id) + } +} + func (r *VRFRegistry) List() []*VRF { r.mu.Lock() defer r.mu.Unlock()