diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-02-03 10:46:37 -0800 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-02-03 10:46:37 -0800 |
commit | bf5f09a0c7e388f622c0466f3bec19605c3990b2 (patch) | |
tree | 94150d7f491573e35bf10ba9fecfbbe9c63b1292 | |
parent | a154d660d936e448bb24fb7c2691ddfd73763b45 (diff) | |
download | infinitytier-bf5f09a0c7e388f622c0466f3bec19605c3990b2.tar.gz infinitytier-bf5f09a0c7e388f622c0466f3bec19605c3990b2.zip |
Yank a code path it turns out we probably don't want.
-rw-r--r-- | node/PacketDecoder.cpp | 9 | ||||
-rw-r--r-- | node/Peer.cpp | 21 | ||||
-rw-r--r-- | node/Peer.hpp | 71 | ||||
-rw-r--r-- | node/Switch.cpp | 14 |
4 files changed, 34 insertions, 81 deletions
diff --git a/node/PacketDecoder.cpp b/node/PacketDecoder.cpp index 25ec85ce..2a207e0b 100644 --- a/node/PacketDecoder.cpp +++ b/node/PacketDecoder.cpp @@ -282,15 +282,18 @@ bool PacketDecoder::_doOK(const RuntimeEnvironment *_r,const SharedPtr<Peer> &pe switch(inReVerb) { case Packet::VERB_HELLO: { - //unsigned int latency = std::min((unsigned int)(Utils::now() - at<uint64_t>(ZT_PROTO_VERB_HELLO__OK__IDX_TIMESTAMP)),(unsigned int)0xffff); + unsigned int latency = std::min((unsigned int)(Utils::now() - at<uint64_t>(ZT_PROTO_VERB_HELLO__OK__IDX_TIMESTAMP)),(unsigned int)0xffff); unsigned int vMajor = (*this)[ZT_PROTO_VERB_HELLO__OK__IDX_MAJOR_VERSION]; unsigned int vMinor = (*this)[ZT_PROTO_VERB_HELLO__OK__IDX_MINOR_VERSION]; unsigned int vRevision = at<uint16_t>(ZT_PROTO_VERB_HELLO__OK__IDX_REVISION); - TRACE("%s(%s): OK(HELLO), version %u.%u.%u",source().toString().c_str(),_remoteAddress.toString().c_str(),vMajor,vMinor,vRevision); + TRACE("%s(%s): OK(HELLO), version %u.%u.%u, latency %u",source().toString().c_str(),_remoteAddress.toString().c_str(),vMajor,vMinor,vRevision,latency); + peer->addDirectLatencyMeasurment(latency); peer->setRemoteVersion(vMajor,vMinor,vRevision); // If a supernode has a version higher than ours, this causes a software - // update check to run now. + // update check to run now. This might bum-rush download.zerotier.com, but + // it's hosted on S3 so hopefully it can take it. This should cause updates + // to propagate out very quickly. if ((_r->updater)&&(_r->topology->isSupernode(peer->address()))) _r->updater->sawRemoteVersion(vMajor,vMinor,vRevision); } break; diff --git a/node/Peer.cpp b/node/Peer.cpp index 512918de..142f1189 100644 --- a/node/Peer.cpp +++ b/node/Peer.cpp @@ -43,8 +43,7 @@ Peer::Peer() : _vMajor(0), _vMinor(0), _vRevision(0), - _latency(0), - _requestHistoryPtr(0) + _latency(0) { } @@ -59,7 +58,8 @@ Peer::Peer(const Identity &myIdentity,const Identity &peerIdentity) _lastAnnouncedTo(0), _vMajor(0), _vMinor(0), - _vRevision(0) + _vRevision(0), + _latency(0) { if (!myIdentity.agree(peerIdentity,_key,ZT_PEER_SECRET_KEY_LENGTH)) throw std::runtime_error("new peer identity key agreement failed"); @@ -84,17 +84,6 @@ void Peer::onReceive( if (!wp->fixed) wp->addr = remoteAddr; - // Learn latency from replies - if (inReVerb != Packet::VERB_NOP) { - for(unsigned int p=0;p<ZT_PEER_REQUEST_HISTORY_LENGTH;++p) { - if ((_requestHistory[p].timestamp)&&(_requestHistory[p].packetId == inRePacketId)&&(_requestHistory[p].verb == inReVerb)) { - _latency = std::min((unsigned int)(now - _requestHistory[p].timestamp),(unsigned int)0xffff); - _requestHistory[p].timestamp = 0; - break; - } - } - } - // Announce multicast LIKEs to peers to whom we have a direct link if ((now - _lastAnnouncedTo) >= ((ZT_MULTICAST_LIKE_EXPIRE / 2) - 1000)) { _lastAnnouncedTo = now; @@ -137,12 +126,14 @@ bool Peer::sendFirewallOpener(const RuntimeEnvironment *_r,uint64_t now) sent = true; } } + if (_ipv6p.addr) { if (_r->demarc->send(_ipv6p.localPort,_ipv6p.addr,"\0",1,ZT_FIREWALL_OPENER_HOPS)) { _ipv6p.lastFirewallOpener = now; sent = true; } } + return sent; } @@ -156,6 +147,7 @@ bool Peer::sendPing(const RuntimeEnvironment *_r,uint64_t now) sent = true; } } + if (_ipv6p.addr) { TRACE("PING %s(%s)",_id.address().toString().c_str(),_ipv6p.addr.toString().c_str()); if (_r->sw->sendHELLO(SharedPtr<Peer>(this),_ipv6p.localPort,_ipv6p.addr)) { @@ -163,6 +155,7 @@ bool Peer::sendPing(const RuntimeEnvironment *_r,uint64_t now) sent = true; } } + return sent; } diff --git a/node/Peer.hpp b/node/Peer.hpp index ac9de661..ac0edd69 100644 --- a/node/Peer.hpp +++ b/node/Peer.hpp @@ -149,7 +149,7 @@ public: bool sendFirewallOpener(const RuntimeEnvironment *_r,uint64_t now); /** - * Send HELLO to a peer using one or both active link types + * Send HELLO to a peer via all active direct paths available * * @param _r Runtime environment * @param now Current time @@ -241,13 +241,23 @@ public: inline unsigned int latency() const throw() { - uint64_t now = Utils::now(); - uint64_t latestOutstandingReq = 0; - for(unsigned int p=0;p<ZT_PEER_REQUEST_HISTORY_LENGTH;++p) - latestOutstandingReq = std::max(latestOutstandingReq,_requestHistory[p].timestamp); - if (latestOutstandingReq) - return std::min(std::max((unsigned int)(now - latestOutstandingReq),(unsigned int)_latency),(unsigned int)0xffff); - else return _latency; + unsigned int l = _latency; + return std::min(l,(unsigned int)65535); + } + + /** + * Update latency with a new direct measurment + * + * @param l Direct latency measurment in ms + */ + inline void addDirectLatencyMeasurment(unsigned int l) + throw() + { + if (l > 65535) l = 65535; + unsigned int ol = _latency; + if ((ol > 0)&&(ol < 10000)) + _latency = (ol + l) / 2; + else _latency = l; } /** @@ -313,7 +323,7 @@ public: inline const unsigned char *key() const throw() { return _key; } /** - * Set the remote version of the peer (not persisted) + * Set the currently known remote version of this peer's client * * @param vmaj Major version * @param vmin Minor version @@ -340,24 +350,6 @@ public: } /** - * Called when certain packet types are sent that expect OK responses - * - * @param packetId ID of sent packet - * @param verb Verb of sent packet - * @param sentFromLocalPort Outgoing local port - * @param now Current time - */ - inline void expectResponseTo(uint64_t packetId,Packet::Verb verb,Demarc::Port sentFromLocalPort,uint64_t now) - throw() - { - unsigned int p = _requestHistoryPtr++ % ZT_PEER_REQUEST_HISTORY_LENGTH; - _requestHistory[p].timestamp = now; - _requestHistory[p].packetId = packetId; - _requestHistory[p].localPort = sentFromLocalPort; - _requestHistory[p].verb = verb; - } - - /** * @return True if this Peer is initialized with something */ inline operator bool() const throw() { return (_id); } @@ -512,25 +504,6 @@ private: bool fixed; // do not learn address from received packets }; - /** - * A history of a packet sent to a peer expecing a response (e.g. HELLO) - */ - class RequestHistoryItem - { - public: - RequestHistoryItem() : - timestamp(0), - packetId(0), - verb(Packet::VERB_NOP) - { - } - - uint64_t timestamp; - uint64_t packetId; - Demarc::Port localPort; - Packet::Verb verb; - }; - unsigned char _key[ZT_PEER_SECRET_KEY_LENGTH]; Identity _id; @@ -541,13 +514,9 @@ private: volatile uint64_t _lastUnicastFrame; volatile uint64_t _lastMulticastFrame; volatile uint64_t _lastAnnouncedTo; - unsigned int _vMajor,_vMinor,_vRevision; + volatile unsigned int _vMajor,_vMinor,_vRevision; volatile unsigned int _latency; - // not persisted - RequestHistoryItem _requestHistory[ZT_PEER_REQUEST_HISTORY_LENGTH]; - volatile unsigned int _requestHistoryPtr; - AtomicCounter __refCount; }; diff --git a/node/Switch.cpp b/node/Switch.cpp index bf4f812d..a759a01b 100644 --- a/node/Switch.cpp +++ b/node/Switch.cpp @@ -218,11 +218,7 @@ bool Switch::sendHELLO(const SharedPtr<Peer> &dest,Demarc::Port localPort,const outp.append(now); _r->identity.serialize(outp,false); outp.armor(dest->key(),false); - - if (_r->demarc->send(localPort,remoteAddr,outp.data(),outp.size(),-1)) { - dest->expectResponseTo(outp.packetId(),Packet::VERB_HELLO,localPort,now); - return true; - } else return false; + return _r->demarc->send(localPort,remoteAddr,outp.data(),outp.size(),-1); } bool Switch::unite(const Address &p1,const Address &p2,bool force) @@ -737,14 +733,6 @@ bool Switch::_trySend(const Packet &packet,bool encrypt) } } - switch(packet.verb()) { - case Packet::VERB_HELLO: - peer->expectResponseTo(packet.packetId(),Packet::VERB_HELLO,localPort,now); - break; - default: - break; - } - #ifdef ZT_TRACE if (via != peer) { TRACE(">> %s to %s via %s (%d)",Packet::verbString(packet.verb()),peer->address().toString().c_str(),via->address().toString().c_str(),(int)packet.size()); |