diff --git a/router/local_peer.go b/router/local_peer.go index 1e8cd961..15076963 100644 --- a/router/local_peer.go +++ b/router/local_peer.go @@ -160,7 +160,10 @@ func (peer *LocalPeer) handleAddConnection(conn Connection) error { conn.Log("connection added (new peer)") peer.router.SendAllGossipDown(conn) } + + peer.router.Routes.Recalculate() peer.broadcastPeerUpdate(conn.Remote()) + return nil } @@ -174,6 +177,8 @@ func (peer *LocalPeer) handleConnectionEstablished(conn Connection) { } peer.connectionEstablished(conn) conn.Log("connection fully established") + + peer.router.Routes.Recalculate() peer.broadcastPeerUpdate() } @@ -193,14 +198,14 @@ func (peer *LocalPeer) handleDeleteConnection(conn Connection) { // Must do garbage collection first to ensure we don't send out an // update with unreachable peers (can cause looping) peer.router.Peers.GarbageCollect() + peer.router.Routes.Recalculate() peer.broadcastPeerUpdate() } // helpers func (peer *LocalPeer) broadcastPeerUpdate(peers ...*Peer) { - peer.router.Routes.Recalculate() - peer.router.TopologyGossip.GossipBroadcast(NewTopologyGossipData(peer.router.Peers, append(peers, peer.Peer)...)) + peer.router.BroadcastTopologyUpdate(append(peers, peer.Peer)) } func (peer *LocalPeer) checkConnectionLimit() error { diff --git a/router/router.go b/router/router.go index 12cbf008..93dc923f 100644 --- a/router/router.go +++ b/router/router.go @@ -260,12 +260,16 @@ type TopologyGossipData struct { update PeerNameSet } -func NewTopologyGossipData(peers *Peers, update ...*Peer) *TopologyGossipData { +func (router *Router) BroadcastTopologyUpdate(update []*Peer) { names := make(PeerNameSet) for _, p := range update { names[p.Name] = void } - return &TopologyGossipData{peers: peers, update: names} + + router.TopologyGossip.GossipBroadcast(&TopologyGossipData{ + peers: router.Peers, + update: names, + }) } func (d *TopologyGossipData) Merge(other GossipData) {