summaryrefslogtreecommitdiffhomepage
path: root/pkg/server/server.go
diff options
context:
space:
mode:
authorFoivos Filippopoulos <ffilippopoulos@utilitywarehouse.co.uk>2019-01-17 17:07:34 +0000
committerFoivos Filippopoulos <ffilippopoulos@utilitywarehouse.co.uk>2019-01-17 17:07:34 +0000
commit318a91e31b8baed86bb66a3767525da68ae49a5d (patch)
treea60f6d6c7c4326e33314e466f1053db4ae98984b /pkg/server/server.go
parent61d7a5e90bae220a45accf9914604ea568ae8c4a (diff)
Allow graceful restart for dynamic neighbors
Diffstat (limited to 'pkg/server/server.go')
-rw-r--r--pkg/server/server.go25
1 files changed, 17 insertions, 8 deletions
diff --git a/pkg/server/server.go b/pkg/server/server.go
index 941afdeb..c95ba700 100644
--- a/pkg/server/server.go
+++ b/pkg/server/server.go
@@ -1150,6 +1150,18 @@ func (s *BgpServer) propagateUpdateToNeighbors(source *peer, newPath *table.Path
}
}
+func (s *BgpServer) deleteDynamicNeighbor(peer *peer, oldState bgp.FSMState, e *fsmMsg) {
+ if peer.isDynamicNeighbor() {
+ peer.stopPeerRestarting()
+ go peer.stopFSM()
+ peer.fsm.lock.RLock()
+ delete(s.neighborMap, peer.fsm.pConf.State.NeighborAddress)
+ peer.fsm.lock.RUnlock()
+ s.broadcastPeerState(peer, oldState, e)
+ return
+ }
+}
+
func (s *BgpServer) handleFSMMessage(peer *peer, e *fsmMsg) {
switch e.MsgType {
case fsmMsgStateChange:
@@ -1196,15 +1208,10 @@ func (s *BgpServer) handleFSMMessage(peer *peer, e *fsmMsg) {
}
peer.fsm.lock.Unlock()
- if peer.isDynamicNeighbor() {
- peer.stopPeerRestarting()
- go peer.stopFSM()
- peer.fsm.lock.RLock()
- delete(s.neighborMap, peer.fsm.pConf.State.NeighborAddress)
- peer.fsm.lock.RUnlock()
- s.broadcastPeerState(peer, oldState, e)
- return
+ if !graceful {
+ s.deleteDynamicNeighbor(peer, oldState, e)
}
+
} else if nextStateIdle {
peer.fsm.lock.RLock()
longLivedEnabled := peer.fsm.pConf.GracefulRestart.State.LongLivedEnabled
@@ -1274,6 +1281,8 @@ func (s *BgpServer) handleFSMMessage(peer *peer, e *fsmMsg) {
peer.fsm.lock.Unlock()
peer.DropAll(peer.configuredRFlist())
s.dropPeerAllRoutes(peer, peer.configuredRFlist())
+
+ s.deleteDynamicNeighbor(peer, oldState, e)
}
}