From b6234b13a1198034facc1c42e6e369b5005e0f08 Mon Sep 17 00:00:00 2001
From: takt <oliver.herms@exaring.de>
Date: Mon, 20 Jul 2020 17:36:59 +0200
Subject: [PATCH] RIS: Implement cleanup on BMP down event (#280)

* RIS: Implement cleanup on BMP down event

* Cleanup

Co-authored-by: Maximilian Wilhelm <max@sdn.clinic>
---
 protocols/bgp/server/bmp_router.go |  7 +++++++
 protocols/bgp/server/bmp_server.go |  2 +-
 routingtable/vrf/vrf_registry.go   | 10 ++++++++++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/protocols/bgp/server/bmp_router.go b/protocols/bgp/server/bmp_router.go
index 31c8348a..5f93feb9 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 99dfe141..5fb1bb9b 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 b8540888..8fe3893c 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()
-- 
GitLab