summaryrefslogtreecommitdiff
path: root/node/Topology.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'node/Topology.cpp')
-rw-r--r--node/Topology.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/node/Topology.cpp b/node/Topology.cpp
index dd041007..d0299108 100644
--- a/node/Topology.cpp
+++ b/node/Topology.cpp
@@ -258,7 +258,7 @@ void Topology::clean(uint64_t now)
}
}
-bool Topology::updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress)
+bool Topology::updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress,uint64_t now)
{
Mutex::Lock _l(_lock);
@@ -266,10 +266,20 @@ bool Topology::updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress
return false;
if (_surface.update(mirroredAddress)) {
- // Clear non-fixed paths for all peers
+ // Clear non-fixed paths for all peers -- will force reconnect on next activity
for(std::map< Address,SharedPtr<Peer> >::const_iterator ap(_activePeers.begin());ap!=_activePeers.end();++ap)
ap->second->clearPaths(false);
+ // Reset TCP tunneling if our global addressing has changed
+ if (!mirroredAddress.isLinkLocal())
+ (const_cast <RuntimeEnvironment *>(RR))->tcpTunnelingEnabled = false;
+
+ // Ping supernodes now (other than the one we might have just heard from)
+ for(std::vector< SharedPtr<Peer> >::const_iterator sn(_supernodePeers.begin());sn!=_supernodePeers.end();++sn) {
+ if (remotePeer != *sn)
+ (*sn)->sendPing(RR,now);
+ }
+
return true;
}