summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
Diffstat (limited to 'node')
-rw-r--r--node/Node.cpp5
-rw-r--r--node/Topology.cpp14
-rw-r--r--node/Topology.hpp5
3 files changed, 16 insertions, 8 deletions
diff --git a/node/Node.cpp b/node/Node.cpp
index 8999642b..9eff2056 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -468,12 +468,7 @@ Node::ReasonForTermination Node::run()
}
if (resynchronize) {
- /* Send NOP to all peers on resynchronize, directly to supernodes and
- * indirectly to regular nodes (to trigger RENDEZVOUS). Also clear
- * learned paths since they're likely no longer valid, and close
- * TCP sockets since they're also likely invalid. */
RR->sm->closeTcpSockets();
- RR->topology->eachPeer(Topology::ResetActivePeers(RR,now));
} else {
/* Periodically check for changes in our local multicast subscriptions
* and broadcast those changes to directly connected peers. */
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;
}
diff --git a/node/Topology.hpp b/node/Topology.hpp
index c68bf507..fcfe2690 100644
--- a/node/Topology.hpp
+++ b/node/Topology.hpp
@@ -298,6 +298,7 @@ public:
/**
* Function object to forget direct links to active peers and then ping them indirectly
*/
+ /*
class ResetActivePeers
{
public:
@@ -332,6 +333,7 @@ public:
std::vector<Address> _supernodeAddresses;
const RuntimeEnvironment *RR;
};
+ */
/**
* Function object to collect peers with any known direct path
@@ -364,8 +366,9 @@ public:
*
* @param remotePeer Remote peer address
* @param mirroredAddress Real-world network address the remote peer told us we have
+ * @param now Current time
*/
- bool updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress);
+ bool updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress,uint64_t now);
/**
* Validate a root topology dictionary against the identities specified in Defaults