summaryrefslogtreecommitdiff
path: root/node
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-13 12:17:47 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-10-13 12:17:47 -0700
commit123c466843fb910c5496cf6218e56678bd4b43ba (patch)
tree6adb1d3ffa9970a23b2b4d22105b3c16dad7149b /node
parent5d2f523e81a56a33405d2b98ccef9d384e269f34 (diff)
downloadinfinitytier-123c466843fb910c5496cf6218e56678bd4b43ba.tar.gz
infinitytier-123c466843fb910c5496cf6218e56678bd4b43ba.zip
Full integration of World and World updates.
Diffstat (limited to 'node')
-rw-r--r--node/IncomingPacket.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp
index 3c6268ed..79a700f6 100644
--- a/node/IncomingPacket.cpp
+++ b/node/IncomingPacket.cpp
@@ -335,9 +335,21 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
const unsigned int vMinor = (*this)[ZT_PROTO_VERB_HELLO__OK__IDX_MINOR_VERSION];
const unsigned int vRevision = at<uint16_t>(ZT_PROTO_VERB_HELLO__OK__IDX_REVISION);
+ const bool trusted = RR->topology->isRoot(peer->identity());
+
InetAddress destAddr;
- if ((ZT_PROTO_VERB_HELLO__OK__IDX_REVISION + 2) < size()) // ZeroTier One < 1.0.3 did not include this field
- destAddr.deserialize(*this,ZT_PROTO_VERB_HELLO__OK__IDX_REVISION + 2);
+ unsigned int ptr = ZT_PROTO_VERB_HELLO__OK__IDX_REVISION + 2;
+ if (ptr < size()) // ZeroTier One < 1.0.3 did not include this field
+ ptr += destAddr.deserialize(*this,ptr);
+ if ((trusted)&&((ptr + 2) <= size())) { // older versions also did not include this field, and right now we only use if from a root
+ World worldUpdate;
+ const unsigned int worldLen = at<uint16_t>(ptr); ptr += 2;
+ if (worldLen > 0) {
+ World w;
+ w.deserialize(*this,ptr);
+ RR->topology->worldUpdateIfValid(w);
+ }
+ }
if (vProto < ZT_PROTO_VERSION_MIN) {
TRACE("%s(%s): OK(HELLO) dropped, protocol version too old",source().toString().c_str(),_remoteAddress.toString().c_str());
@@ -349,7 +361,6 @@ bool IncomingPacket::_doOK(const RuntimeEnvironment *RR,const SharedPtr<Peer> &p
peer->addDirectLatencyMeasurment(latency);
peer->setRemoteVersion(vProto,vMajor,vMinor,vRevision);
- bool trusted = RR->topology->isRoot(peer->identity());
if (destAddr)
RR->sa->iam(peer->address(),_remoteAddress,destAddr,trusted,RR->node->now());
} break;