summaryrefslogtreecommitdiff
path: root/node/Topology.cpp
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2017-02-13 16:38:21 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2017-02-13 16:38:21 -0800
commitaf4e79735c3f97d4228472077bcd5d2ddfb2cb93 (patch)
treec891b3213a1664ba294fc864886036f659a00ce1 /node/Topology.cpp
parent969e09210d89f4cecf01920d8315f984ea59245e (diff)
downloadinfinitytier-af4e79735c3f97d4228472077bcd5d2ddfb2cb93.tar.gz
infinitytier-af4e79735c3f97d4228472077bcd5d2ddfb2cb93.zip
Fix "orbit" semantics. Federation works.
Diffstat (limited to 'node/Topology.cpp')
-rw-r--r--node/Topology.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/node/Topology.cpp b/node/Topology.cpp
index 7d0b0550..5abc4df0 100644
--- a/node/Topology.cpp
+++ b/node/Topology.cpp
@@ -225,6 +225,18 @@ bool Topology::isUpstream(const Identity &id) const
return (std::find(_upstreamAddresses.begin(),_upstreamAddresses.end(),id.address()) != _upstreamAddresses.end());
}
+bool Topology::shouldAcceptWorldUpdateFrom(const Address &addr) const
+{
+ Mutex::Lock _l(_upstreams_m);
+ if (std::find(_upstreamAddresses.begin(),_upstreamAddresses.end(),addr) != _upstreamAddresses.end())
+ return true;
+ for(std::vector< std::pair< uint64_t,Address> >::const_iterator s(_moonSeeds.begin());s!=_moonSeeds.end();++s) {
+ if (s->second == addr)
+ return true;
+ }
+ return false;
+}
+
ZT_PeerRole Topology::role(const Address &ztaddr) const
{
Mutex::Lock _l(_upstreams_m);
@@ -312,12 +324,13 @@ bool Topology::addWorld(const World &newWorld,bool alwaysAcceptNew)
for(std::vector<World::Root>::const_iterator r(newWorld.roots().begin());r!=newWorld.roots().end();++r) {
if (r->identity.address() == m->second) {
_moonSeeds.erase(m);
- m = _moonSeeds.end(); // cause outer loop to terminate
_moons.push_back(newWorld);
existing = &(_moons.back());
break;
}
}
+ if (existing)
+ break;
}
}
}