diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2017-02-13 16:38:21 -0800 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2017-02-13 16:38:21 -0800 |
| commit | af4e79735c3f97d4228472077bcd5d2ddfb2cb93 (patch) | |
| tree | c891b3213a1664ba294fc864886036f659a00ce1 /node/Topology.cpp | |
| parent | 969e09210d89f4cecf01920d8315f984ea59245e (diff) | |
| download | infinitytier-af4e79735c3f97d4228472077bcd5d2ddfb2cb93.tar.gz infinitytier-af4e79735c3f97d4228472077bcd5d2ddfb2cb93.zip | |
Fix "orbit" semantics. Federation works.
Diffstat (limited to 'node/Topology.cpp')
| -rw-r--r-- | node/Topology.cpp | 15 |
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; } } } |
