summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2014-02-03 10:46:37 -0800
committerAdam Ierymenko <adam.ierymenko@gmail.com>2014-02-03 10:46:37 -0800
commitbf5f09a0c7e388f622c0466f3bec19605c3990b2 (patch)
tree94150d7f491573e35bf10ba9fecfbbe9c63b1292
parenta154d660d936e448bb24fb7c2691ddfd73763b45 (diff)
downloadinfinitytier-bf5f09a0c7e388f622c0466f3bec19605c3990b2.tar.gz
infinitytier-bf5f09a0c7e388f622c0466f3bec19605c3990b2.zip
Yank a code path it turns out we probably don't want.
-rw-r--r--node/PacketDecoder.cpp9
-rw-r--r--node/Peer.cpp21
-rw-r--r--node/Peer.hpp71
-rw-r--r--node/Switch.cpp14
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());