diff options
Diffstat (limited to 'node')
-rw-r--r-- | node/ExternalSurface.hpp | 2 | ||||
-rw-r--r-- | node/Topology.cpp | 18 | ||||
-rw-r--r-- | node/Topology.hpp | 13 |
3 files changed, 32 insertions, 1 deletions
diff --git a/node/ExternalSurface.hpp b/node/ExternalSurface.hpp index 2f4bd38d..44c30b97 100644 --- a/node/ExternalSurface.hpp +++ b/node/ExternalSurface.hpp @@ -46,7 +46,7 @@ public: * @param remote Remote address as reflected by any trusted peer * @return True if our external surface has changed */ - inline bool revise(const InetAddress &remote) + inline bool update(const InetAddress &remote) throw() { const unsigned long idx = (remote.isV4() ? 0 : 2) | (remote.isLinkLocal() ? 1 : 0); diff --git a/node/Topology.cpp b/node/Topology.cpp index 3f4043da..dd041007 100644 --- a/node/Topology.cpp +++ b/node/Topology.cpp @@ -258,6 +258,24 @@ void Topology::clean(uint64_t now) } } +bool Topology::updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress) +{ + Mutex::Lock _l(_lock); + + if (std::find(_supernodeAddresses.begin(),_supernodeAddresses.end(),remotePeer->address()) == _supernodeAddresses.end()) + return false; + + if (_surface.update(mirroredAddress)) { + // Clear non-fixed paths for all peers + for(std::map< Address,SharedPtr<Peer> >::const_iterator ap(_activePeers.begin());ap!=_activePeers.end();++ap) + ap->second->clearPaths(false); + + return true; + } + + return false; +} + bool Topology::authenticateRootTopology(const Dictionary &rt) { try { diff --git a/node/Topology.hpp b/node/Topology.hpp index 1dd55646..c68bf507 100644 --- a/node/Topology.hpp +++ b/node/Topology.hpp @@ -355,6 +355,19 @@ public: }; /** + * Update our knowledge of exterior network addresses + * + * If the remote peer in question is trusted, this will update our internal + * instance of ExternalSurface. If our surface has changed, this triggers a + * partial or total reset of ephemeral peer addresses and a renegotiation of + * new ones using supernodes / relays. + * + * @param remotePeer Remote peer address + * @param mirroredAddress Real-world network address the remote peer told us we have + */ + bool updateSurface(const SharedPtr<Peer> &remotePeer,const InetAddress &mirroredAddress); + + /** * Validate a root topology dictionary against the identities specified in Defaults * * @param rt Root topology dictionary |