mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-02-06 11:10:13 +00:00
More cleanup and removal of cruft due to obsolete network-specific relays (will be replaced with federation stuff).
This commit is contained in:
parent
dbf3e6c3c9
commit
e1310a764a
@ -510,9 +510,13 @@ bool IncomingPacket::_doRENDEZVOUS(const RuntimeEnvironment *RR,const SharedPtr<
|
|||||||
peer->received(_localAddress,_remoteAddress,hops(),packetId(),Packet::VERB_RENDEZVOUS,0,Packet::VERB_NOP);
|
peer->received(_localAddress,_remoteAddress,hops(),packetId(),Packet::VERB_RENDEZVOUS,0,Packet::VERB_NOP);
|
||||||
|
|
||||||
const InetAddress atAddr(field(ZT_PROTO_VERB_RENDEZVOUS_IDX_ADDRESS,addrlen),addrlen,port);
|
const InetAddress atAddr(field(ZT_PROTO_VERB_RENDEZVOUS_IDX_ADDRESS,addrlen),addrlen,port);
|
||||||
TRACE("RENDEZVOUS from %s says %s might be at %s, starting NAT-t",peer->address().toString().c_str(),with.toString().c_str(),atAddr.toString().c_str());
|
TRACE("RENDEZVOUS from %s says %s might be at %s, attempting to contact",peer->address().toString().c_str(),with.toString().c_str(),atAddr.toString().c_str());
|
||||||
if (RR->node->shouldUsePathForZeroTierTraffic(_localAddress,atAddr))
|
if (RR->node->shouldUsePathForZeroTierTraffic(_localAddress,atAddr)) {
|
||||||
RR->sw->rendezvous(withPeer,_localAddress,atAddr);
|
const uint64_t now = RR->node->now();
|
||||||
|
peer->sendHELLO(_localAddress,atAddr,now,2); // send low-TTL packet to 'open' local NAT(s)
|
||||||
|
if (!peer->pushDirectPaths(_localAddress,atAddr,now,true))
|
||||||
|
peer->sendHELLO(_localAddress,atAddr,now);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
TRACE("dropped corrupt RENDEZVOUS from %s(%s) (bad address or port)",peer->address().toString().c_str(),_remoteAddress.toString().c_str());
|
TRACE("dropped corrupt RENDEZVOUS from %s(%s) (bad address or port)",peer->address().toString().c_str(),_remoteAddress.toString().c_str());
|
||||||
}
|
}
|
||||||
@ -746,7 +750,7 @@ bool IncomingPacket::_doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment *RR,cons
|
|||||||
outp.append((uint32_t)totalSize);
|
outp.append((uint32_t)totalSize);
|
||||||
outp.append((uint32_t)chunkIndex);
|
outp.append((uint32_t)chunkIndex);
|
||||||
outp.compress();
|
outp.compress();
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
chunkIndex += chunkLen;
|
chunkIndex += chunkLen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1139,7 +1143,7 @@ bool IncomingPacket::_doCIRCUIT_TEST(const RuntimeEnvironment *RR,const SharedPt
|
|||||||
nextHop[h].appendTo(outp);
|
nextHop[h].appendTo(outp);
|
||||||
nextHopBestPathAddress[h].serialize(outp); // appends 0 if null InetAddress
|
nextHopBestPathAddress[h].serialize(outp); // appends 0 if null InetAddress
|
||||||
}
|
}
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there are next hops, forward the test along through the graph
|
// If there are next hops, forward the test along through the graph
|
||||||
@ -1154,7 +1158,7 @@ bool IncomingPacket::_doCIRCUIT_TEST(const RuntimeEnvironment *RR,const SharedPt
|
|||||||
if (RR->identity.address() != nextHop[h]) { // next hops that loop back to the current hop are not valid
|
if (RR->identity.address() != nextHop[h]) { // next hops that loop back to the current hop are not valid
|
||||||
outp.newInitializationVector();
|
outp.newInitializationVector();
|
||||||
outp.setDestination(nextHop[h]);
|
outp.setDestination(nextHop[h]);
|
||||||
RR->sw->send(outp,true,originatorCredentialNetworkId);
|
RR->sw->send(outp,true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ bool Membership::sendCredentialsIfNeeded(const RuntimeEnvironment *RR,const uint
|
|||||||
outp.append((uint8_t)0x00);
|
outp.append((uint8_t)0x00);
|
||||||
outp.append(capsAndTags.data(),capsAndTags.size());
|
outp.append(capsAndTags.data(),capsAndTags.size());
|
||||||
outp.compress();
|
outp.compress();
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
_lastPushedCom = now;
|
_lastPushedCom = now;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -240,7 +240,7 @@ void Multicaster::send(
|
|||||||
mg.mac().appendTo(outp);
|
mg.mac().appendTo(outp);
|
||||||
outp.append((uint32_t)mg.adi());
|
outp.append((uint32_t)mg.adi());
|
||||||
outp.append((uint32_t)gatherLimit);
|
outp.append((uint32_t)gatherLimit);
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
}
|
}
|
||||||
gatherLimit = 0;
|
gatherLimit = 0;
|
||||||
}
|
}
|
||||||
|
@ -127,7 +127,7 @@ static int _doZtFilter(
|
|||||||
outp.append((uint16_t)etherType);
|
outp.append((uint16_t)etherType);
|
||||||
outp.append(frameData,frameLen);
|
outp.append(frameData,frameLen);
|
||||||
outp.compress();
|
outp.compress();
|
||||||
RR->sw->send(outp,true,nwid);
|
RR->sw->send(outp,true);
|
||||||
|
|
||||||
if (rt == ZT_NETWORK_RULE_ACTION_REDIRECT) {
|
if (rt == ZT_NETWORK_RULE_ACTION_REDIRECT) {
|
||||||
return -1; // match, drop packet (we redirected it)
|
return -1; // match, drop packet (we redirected it)
|
||||||
@ -678,7 +678,7 @@ void Network::requestConfiguration()
|
|||||||
outp.append((const void *)rmd.data(),rmdSize);
|
outp.append((const void *)rmd.data(),rmdSize);
|
||||||
outp.append((_config) ? (uint64_t)_config.revision : (uint64_t)0);
|
outp.append((_config) ? (uint64_t)_config.revision : (uint64_t)0);
|
||||||
outp.compress();
|
outp.compress();
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
|
|
||||||
// Expect replies with this in-re packet ID
|
// Expect replies with this in-re packet ID
|
||||||
_inboundConfigPacketId = outp.packetId();
|
_inboundConfigPacketId = outp.packetId();
|
||||||
@ -894,7 +894,7 @@ void Network::_announceMulticastGroupsTo(const SharedPtr<Peer> &peer,const std::
|
|||||||
for(std::vector<MulticastGroup>::const_iterator mg(allMulticastGroups.begin());mg!=allMulticastGroups.end();++mg) {
|
for(std::vector<MulticastGroup>::const_iterator mg(allMulticastGroups.begin());mg!=allMulticastGroups.end();++mg) {
|
||||||
if ((outp.size() + 24) >= ZT_PROTO_MAX_PACKET_LENGTH) {
|
if ((outp.size() + 24) >= ZT_PROTO_MAX_PACKET_LENGTH) {
|
||||||
outp.compress();
|
outp.compress();
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
outp.reset(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE);
|
outp.reset(peer->address(),RR->identity.address(),Packet::VERB_MULTICAST_LIKE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -906,7 +906,7 @@ void Network::_announceMulticastGroupsTo(const SharedPtr<Peer> &peer,const std::
|
|||||||
|
|
||||||
if (outp.size() > ZT_PROTO_MIN_PACKET_LENGTH) {
|
if (outp.size() > ZT_PROTO_MIN_PACKET_LENGTH) {
|
||||||
outp.compress();
|
outp.compress();
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,7 +237,7 @@ public:
|
|||||||
// way whatsoever. This will e.g. find network preferred relays that lack
|
// way whatsoever. This will e.g. find network preferred relays that lack
|
||||||
// stable endpoints by using root servers.
|
// stable endpoints by using root servers.
|
||||||
Packet outp(p->address(),RR->identity.address(),Packet::VERB_NOP);
|
Packet outp(p->address(),RR->identity.address(),Packet::VERB_NOP);
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
lastReceiveFromUpstream = std::max(p->lastReceive(),lastReceiveFromUpstream);
|
lastReceiveFromUpstream = std::max(p->lastReceive(),lastReceiveFromUpstream);
|
||||||
@ -520,7 +520,7 @@ ZT_ResultCode Node::circuitTestBegin(ZT_CircuitTest *test,void (*reportCallback)
|
|||||||
for(unsigned int a=0;a<test->hops[0].breadth;++a) {
|
for(unsigned int a=0;a<test->hops[0].breadth;++a) {
|
||||||
outp.newInitializationVector();
|
outp.newInitializationVector();
|
||||||
outp.setDestination(Address(test->hops[0].addresses[a]));
|
outp.setDestination(Address(test->hops[0].addresses[a]));
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
}
|
}
|
||||||
} catch ( ... ) {
|
} catch ( ... ) {
|
||||||
return ZT_RESULT_FATAL_ERROR_INTERNAL; // probably indicates FIFO too big for packet
|
return ZT_RESULT_FATAL_ERROR_INTERNAL; // probably indicates FIFO too big for packet
|
||||||
|
@ -90,7 +90,7 @@ void OutboundMulticast::sendOnly(const RuntimeEnvironment *RR,const Address &toA
|
|||||||
//TRACE(">>MC %.16llx -> %s",(unsigned long long)this,toAddr.toString().c_str());
|
//TRACE(">>MC %.16llx -> %s",(unsigned long long)this,toAddr.toString().c_str());
|
||||||
_packet.newInitializationVector();
|
_packet.newInitializationVector();
|
||||||
_packet.setDestination(toAddr);
|
_packet.setDestination(toAddr);
|
||||||
RR->sw->send(_packet,true,_nwid);
|
RR->sw->send(_packet,true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -241,7 +241,7 @@ bool Peer::doPingAndKeepalive(uint64_t now,int inetAddressFamily)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Peer::pushDirectPaths(const InetAddress &localAddr,const InetAddress &toAddress,uint64_t now,bool force,bool includePrivatePaths)
|
bool Peer::pushDirectPaths(const InetAddress &localAddr,const InetAddress &toAddress,uint64_t now,bool force)
|
||||||
{
|
{
|
||||||
#ifdef ZT_ENABLE_CLUSTER
|
#ifdef ZT_ENABLE_CLUSTER
|
||||||
// Cluster mode disables normal PUSH_DIRECT_PATHS in favor of cluster-based peer redirection
|
// Cluster mode disables normal PUSH_DIRECT_PATHS in favor of cluster-based peer redirection
|
||||||
@ -258,10 +258,8 @@ bool Peer::pushDirectPaths(const InetAddress &localAddr,const InetAddress &toAdd
|
|||||||
std::vector<InetAddress> pathsToPush;
|
std::vector<InetAddress> pathsToPush;
|
||||||
|
|
||||||
std::vector<InetAddress> dps(RR->node->directPaths());
|
std::vector<InetAddress> dps(RR->node->directPaths());
|
||||||
for(std::vector<InetAddress>::const_iterator i(dps.begin());i!=dps.end();++i) {
|
for(std::vector<InetAddress>::const_iterator i(dps.begin());i!=dps.end();++i)
|
||||||
if ((includePrivatePaths)||(i->ipScope() == InetAddress::IP_SCOPE_GLOBAL))
|
pathsToPush.push_back(*i);
|
||||||
pathsToPush.push_back(*i);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<InetAddress> sym(RR->sa->getSymmetricNatPredictions());
|
std::vector<InetAddress> sym(RR->sa->getSymmetricNatPredictions());
|
||||||
for(unsigned long i=0,added=0;i<sym.size();++i) {
|
for(unsigned long i=0,added=0;i<sym.size();++i) {
|
||||||
|
@ -199,10 +199,9 @@ public:
|
|||||||
* @param toAddress Remote address to send push to (usually from path)
|
* @param toAddress Remote address to send push to (usually from path)
|
||||||
* @param now Current time
|
* @param now Current time
|
||||||
* @param force If true, push regardless of rate limit
|
* @param force If true, push regardless of rate limit
|
||||||
* @param includePrivatePaths If true, include local interface address paths (should only be done to peers with a trust relationship)
|
|
||||||
* @return True if something was actually sent
|
* @return True if something was actually sent
|
||||||
*/
|
*/
|
||||||
bool pushDirectPaths(const InetAddress &localAddr,const InetAddress &toAddress,uint64_t now,bool force,bool includePrivatePaths);
|
bool pushDirectPaths(const InetAddress &localAddr,const InetAddress &toAddress,uint64_t now,bool force);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return All known direct paths to this peer (active or inactive)
|
* @return All known direct paths to this peer (active or inactive)
|
||||||
|
@ -106,7 +106,7 @@ void SelfAwareness::iam(const Address &reporter,const InetAddress &receivedOnLoc
|
|||||||
for(std::vector< SharedPtr<Peer> >::const_iterator p(rset.peersReset.begin());p!=rset.peersReset.end();++p) {
|
for(std::vector< SharedPtr<Peer> >::const_iterator p(rset.peersReset.begin());p!=rset.peersReset.end();++p) {
|
||||||
if ((*p)->activelyTransferringFrames(now)) {
|
if ((*p)->activelyTransferringFrames(now)) {
|
||||||
Packet outp((*p)->address(),RR->identity.address(),Packet::VERB_NOP);
|
Packet outp((*p)->address(),RR->identity.address(),Packet::VERB_NOP);
|
||||||
RR->sw->send(outp,true,0);
|
RR->sw->send(outp,true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -476,14 +476,14 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
|
|||||||
outp.append((uint16_t)etherType);
|
outp.append((uint16_t)etherType);
|
||||||
outp.append(data,len);
|
outp.append(data,len);
|
||||||
outp.compress();
|
outp.compress();
|
||||||
send(outp,true,network->id());
|
send(outp,true);
|
||||||
} else {
|
} else {
|
||||||
Packet outp(toZT,RR->identity.address(),Packet::VERB_FRAME);
|
Packet outp(toZT,RR->identity.address(),Packet::VERB_FRAME);
|
||||||
outp.append(network->id());
|
outp.append(network->id());
|
||||||
outp.append((uint16_t)etherType);
|
outp.append((uint16_t)etherType);
|
||||||
outp.append(data,len);
|
outp.append(data,len);
|
||||||
outp.compress();
|
outp.compress();
|
||||||
send(outp,true,network->id());
|
send(outp,true);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TRACE("%.16llx: UNICAST: %s -> %s etherType==%s(%.4x) vlanId==%u len==%u fromBridged==%d includeCom==%d",network->id(),from.toString().c_str(),to.toString().c_str(),etherTypeName(etherType),etherType,vlanId,len,(int)fromBridged,(int)includeCom);
|
//TRACE("%.16llx: UNICAST: %s -> %s etherType==%s(%.4x) vlanId==%u len==%u fromBridged==%d includeCom==%d",network->id(),from.toString().c_str(),to.toString().c_str(),etherTypeName(etherType),etherType,vlanId,len,(int)fromBridged,(int)includeCom);
|
||||||
@ -536,23 +536,21 @@ void Switch::onLocalEthernet(const SharedPtr<Network> &network,const MAC &from,c
|
|||||||
outp.append((uint16_t)etherType);
|
outp.append((uint16_t)etherType);
|
||||||
outp.append(data,len);
|
outp.append(data,len);
|
||||||
outp.compress();
|
outp.compress();
|
||||||
send(outp,true,network->id());
|
send(outp,true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Switch::send(const Packet &packet,bool encrypt,uint64_t nwid)
|
void Switch::send(const Packet &packet,bool encrypt)
|
||||||
{
|
{
|
||||||
if (packet.destination() == RR->identity.address()) {
|
if (packet.destination() == RR->identity.address()) {
|
||||||
TRACE("BUG: caught attempt to send() to self, ignored");
|
TRACE("BUG: caught attempt to send() to self, ignored");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TRACE(">> %s to %s (%u bytes, encrypt==%d, nwid==%.16llx)",Packet::verbString(packet.verb()),packet.destination().toString().c_str(),packet.size(),(int)encrypt,nwid);
|
if (!_trySend(packet,encrypt)) {
|
||||||
|
|
||||||
if (!_trySend(packet,encrypt,nwid)) {
|
|
||||||
Mutex::Lock _l(_txQueue_m);
|
Mutex::Lock _l(_txQueue_m);
|
||||||
_txQueue.push_back(TXQueueEntry(packet.destination(),RR->node->now(),packet,encrypt,nwid));
|
_txQueue.push_back(TXQueueEntry(packet.destination(),RR->node->now(),packet,encrypt));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,17 +623,6 @@ bool Switch::unite(const Address &p1,const Address &p2)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Switch::rendezvous(const SharedPtr<Peer> &peer,const InetAddress &localAddr,const InetAddress &atAddr)
|
|
||||||
{
|
|
||||||
TRACE("sending NAT-t message to %s(%s)",peer->address().toString().c_str(),atAddr.toString().c_str());
|
|
||||||
const uint64_t now = RR->node->now();
|
|
||||||
peer->sendHELLO(localAddr,atAddr,now,2); // first attempt: send low-TTL packet to 'open' local NAT
|
|
||||||
{
|
|
||||||
Mutex::Lock _l(_contactQueue_m);
|
|
||||||
_contactQueue.push_back(ContactQueueEntry(peer,now + ZT_NAT_T_TACTICAL_ESCALATION_DELAY,localAddr,atAddr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Switch::requestWhois(const Address &addr)
|
void Switch::requestWhois(const Address &addr)
|
||||||
{
|
{
|
||||||
bool inserted = false;
|
bool inserted = false;
|
||||||
@ -676,7 +663,7 @@ void Switch::doAnythingWaitingForPeer(const SharedPtr<Peer> &peer)
|
|||||||
Mutex::Lock _l(_txQueue_m);
|
Mutex::Lock _l(_txQueue_m);
|
||||||
for(std::list< TXQueueEntry >::iterator txi(_txQueue.begin());txi!=_txQueue.end();) {
|
for(std::list< TXQueueEntry >::iterator txi(_txQueue.begin());txi!=_txQueue.end();) {
|
||||||
if (txi->dest == peer->address()) {
|
if (txi->dest == peer->address()) {
|
||||||
if (_trySend(txi->packet,txi->encrypt,txi->nwid))
|
if (_trySend(txi->packet,txi->encrypt))
|
||||||
_txQueue.erase(txi++);
|
_txQueue.erase(txi++);
|
||||||
else ++txi;
|
else ++txi;
|
||||||
} else ++txi;
|
} else ++txi;
|
||||||
@ -688,42 +675,6 @@ unsigned long Switch::doTimerTasks(uint64_t now)
|
|||||||
{
|
{
|
||||||
unsigned long nextDelay = 0xffffffff; // ceiling delay, caller will cap to minimum
|
unsigned long nextDelay = 0xffffffff; // ceiling delay, caller will cap to minimum
|
||||||
|
|
||||||
{ // Iterate through NAT traversal strategies for entries in contact queue
|
|
||||||
Mutex::Lock _l(_contactQueue_m);
|
|
||||||
for(std::list<ContactQueueEntry>::iterator qi(_contactQueue.begin());qi!=_contactQueue.end();) {
|
|
||||||
if (now >= qi->fireAtTime) {
|
|
||||||
if (!qi->peer->pushDirectPaths(qi->localAddr,qi->inaddr,now,true,false))
|
|
||||||
qi->peer->sendHELLO(qi->localAddr,qi->inaddr,now);
|
|
||||||
_contactQueue.erase(qi++);
|
|
||||||
continue;
|
|
||||||
/* Old symmetric NAT buster code, obsoleted by port prediction alg in SelfAwareness but left around for now in case we revert
|
|
||||||
if (qi->strategyIteration == 0) {
|
|
||||||
// First strategy: send packet directly to destination
|
|
||||||
qi->peer->sendHELLO(qi->localAddr,qi->inaddr,now);
|
|
||||||
} else if (qi->strategyIteration <= 3) {
|
|
||||||
// Strategies 1-3: try escalating ports for symmetric NATs that remap sequentially
|
|
||||||
InetAddress tmpaddr(qi->inaddr);
|
|
||||||
int p = (int)qi->inaddr.port() + qi->strategyIteration;
|
|
||||||
if (p > 65535)
|
|
||||||
p -= 64511;
|
|
||||||
tmpaddr.setPort((unsigned int)p);
|
|
||||||
qi->peer->sendHELLO(qi->localAddr,tmpaddr,now);
|
|
||||||
} else {
|
|
||||||
// All strategies tried, expire entry
|
|
||||||
_contactQueue.erase(qi++);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
++qi->strategyIteration;
|
|
||||||
qi->fireAtTime = now + ZT_NAT_T_TACTICAL_ESCALATION_DELAY;
|
|
||||||
nextDelay = std::min(nextDelay,(unsigned long)ZT_NAT_T_TACTICAL_ESCALATION_DELAY);
|
|
||||||
*/
|
|
||||||
} else {
|
|
||||||
nextDelay = std::min(nextDelay,(unsigned long)(qi->fireAtTime - now));
|
|
||||||
}
|
|
||||||
++qi; // if qi was erased, loop will have continued before here
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{ // Retry outstanding WHOIS requests
|
{ // Retry outstanding WHOIS requests
|
||||||
Mutex::Lock _l(_outstandingWhoisRequests_m);
|
Mutex::Lock _l(_outstandingWhoisRequests_m);
|
||||||
Hashtable< Address,WhoisRequest >::Iterator i(_outstandingWhoisRequests);
|
Hashtable< Address,WhoisRequest >::Iterator i(_outstandingWhoisRequests);
|
||||||
@ -751,7 +702,7 @@ unsigned long Switch::doTimerTasks(uint64_t now)
|
|||||||
{ // Time out TX queue packets that never got WHOIS lookups or other info.
|
{ // Time out TX queue packets that never got WHOIS lookups or other info.
|
||||||
Mutex::Lock _l(_txQueue_m);
|
Mutex::Lock _l(_txQueue_m);
|
||||||
for(std::list< TXQueueEntry >::iterator txi(_txQueue.begin());txi!=_txQueue.end();) {
|
for(std::list< TXQueueEntry >::iterator txi(_txQueue.begin());txi!=_txQueue.end();) {
|
||||||
if (_trySend(txi->packet,txi->encrypt,txi->nwid))
|
if (_trySend(txi->packet,txi->encrypt))
|
||||||
_txQueue.erase(txi++);
|
_txQueue.erase(txi++);
|
||||||
else if ((now - txi->creationTime) > ZT_TRANSMIT_QUEUE_TIMEOUT) {
|
else if ((now - txi->creationTime) > ZT_TRANSMIT_QUEUE_TIMEOUT) {
|
||||||
TRACE("TX %s -> %s timed out",txi->packet.source().toString().c_str(),txi->packet.destination().toString().c_str());
|
TRACE("TX %s -> %s timed out",txi->packet.source().toString().c_str(),txi->packet.destination().toString().c_str());
|
||||||
@ -787,20 +738,13 @@ Address Switch::_sendWhoisRequest(const Address &addr,const Address *peersAlread
|
|||||||
return Address();
|
return Address();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Switch::_trySend(const Packet &packet,bool encrypt,uint64_t nwid)
|
bool Switch::_trySend(const Packet &packet,bool encrypt)
|
||||||
{
|
{
|
||||||
SharedPtr<Peer> peer(RR->topology->getPeer(packet.destination()));
|
SharedPtr<Peer> peer(RR->topology->getPeer(packet.destination()));
|
||||||
|
|
||||||
if (peer) {
|
if (peer) {
|
||||||
const uint64_t now = RR->node->now();
|
const uint64_t now = RR->node->now();
|
||||||
|
|
||||||
SharedPtr<Network> network;
|
|
||||||
if (nwid) {
|
|
||||||
network = RR->node->network(nwid);
|
|
||||||
if ((!network)||(!network->hasConfig()))
|
|
||||||
return false; // we probably just left this network, let its packets die
|
|
||||||
}
|
|
||||||
|
|
||||||
Path *viaPath = peer->getBestPath(now);
|
Path *viaPath = peer->getBestPath(now);
|
||||||
SharedPtr<Peer> relay;
|
SharedPtr<Peer> relay;
|
||||||
|
|
||||||
@ -811,7 +755,7 @@ bool Switch::_trySend(const Packet &packet,bool encrypt,uint64_t nwid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (relay) {
|
if (relay) {
|
||||||
peer->pushDirectPaths(viaPath->localAddress(),viaPath->address(),now,false,( (network)&&(network->isAllowed(peer)) ));
|
peer->pushDirectPaths(viaPath->localAddress(),viaPath->address(),now,false);
|
||||||
viaPath->sent(now);
|
viaPath->sent(now);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,15 +92,10 @@ public:
|
|||||||
* Needless to say, the packet's source must be this node. Otherwise it
|
* Needless to say, the packet's source must be this node. Otherwise it
|
||||||
* won't be encrypted right. (This is not used for relaying.)
|
* won't be encrypted right. (This is not used for relaying.)
|
||||||
*
|
*
|
||||||
* The network ID should only be specified for frames and other actual
|
|
||||||
* network traffic. Other traffic such as controller requests and regular
|
|
||||||
* protocol messages should specify zero.
|
|
||||||
*
|
|
||||||
* @param packet Packet to send
|
* @param packet Packet to send
|
||||||
* @param encrypt Encrypt packet payload? (always true except for HELLO)
|
* @param encrypt Encrypt packet payload? (always true except for HELLO)
|
||||||
* @param nwid Related network ID or 0 if message is not in-network traffic
|
|
||||||
*/
|
*/
|
||||||
void send(const Packet &packet,bool encrypt,uint64_t nwid);
|
void send(const Packet &packet,bool encrypt);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send RENDEZVOUS to two peers to permit them to directly connect
|
* Send RENDEZVOUS to two peers to permit them to directly connect
|
||||||
@ -113,15 +108,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
bool unite(const Address &p1,const Address &p2);
|
bool unite(const Address &p1,const Address &p2);
|
||||||
|
|
||||||
/**
|
|
||||||
* Attempt NAT traversal to peer at a given physical address
|
|
||||||
*
|
|
||||||
* @param peer Peer to contact
|
|
||||||
* @param localAddr Local interface address
|
|
||||||
* @param atAddr Address of peer
|
|
||||||
*/
|
|
||||||
void rendezvous(const SharedPtr<Peer> &peer,const InetAddress &localAddr,const InetAddress &atAddr);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request WHOIS on a given address
|
* Request WHOIS on a given address
|
||||||
*
|
*
|
||||||
@ -151,7 +137,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Address _sendWhoisRequest(const Address &addr,const Address *peersAlreadyConsulted,unsigned int numPeersAlreadyConsulted);
|
Address _sendWhoisRequest(const Address &addr,const Address *peersAlreadyConsulted,unsigned int numPeersAlreadyConsulted);
|
||||||
bool _trySend(const Packet &packet,bool encrypt,uint64_t nwid);
|
bool _trySend(const Packet &packet,bool encrypt);
|
||||||
|
|
||||||
const RuntimeEnvironment *const RR;
|
const RuntimeEnvironment *const RR;
|
||||||
uint64_t _lastBeaconResponse;
|
uint64_t _lastBeaconResponse;
|
||||||
@ -205,16 +191,14 @@ private:
|
|||||||
struct TXQueueEntry
|
struct TXQueueEntry
|
||||||
{
|
{
|
||||||
TXQueueEntry() {}
|
TXQueueEntry() {}
|
||||||
TXQueueEntry(Address d,uint64_t ct,const Packet &p,bool enc,uint64_t nw) :
|
TXQueueEntry(Address d,uint64_t ct,const Packet &p,bool enc) :
|
||||||
dest(d),
|
dest(d),
|
||||||
creationTime(ct),
|
creationTime(ct),
|
||||||
nwid(nw),
|
|
||||||
packet(p),
|
packet(p),
|
||||||
encrypt(enc) {}
|
encrypt(enc) {}
|
||||||
|
|
||||||
Address dest;
|
Address dest;
|
||||||
uint64_t creationTime;
|
uint64_t creationTime;
|
||||||
uint64_t nwid;
|
|
||||||
Packet packet; // unencrypted/unMAC'd packet -- this is done at send time
|
Packet packet; // unencrypted/unMAC'd packet -- this is done at send time
|
||||||
bool encrypt;
|
bool encrypt;
|
||||||
};
|
};
|
||||||
@ -241,26 +225,6 @@ private:
|
|||||||
};
|
};
|
||||||
Hashtable< _LastUniteKey,uint64_t > _lastUniteAttempt; // key is always sorted in ascending order, for set-like behavior
|
Hashtable< _LastUniteKey,uint64_t > _lastUniteAttempt; // key is always sorted in ascending order, for set-like behavior
|
||||||
Mutex _lastUniteAttempt_m;
|
Mutex _lastUniteAttempt_m;
|
||||||
|
|
||||||
// Active attempts to contact remote peers, including state of multi-phase NAT traversal
|
|
||||||
struct ContactQueueEntry
|
|
||||||
{
|
|
||||||
ContactQueueEntry() {}
|
|
||||||
ContactQueueEntry(const SharedPtr<Peer> &p,uint64_t ft,const InetAddress &laddr,const InetAddress &a) :
|
|
||||||
peer(p),
|
|
||||||
fireAtTime(ft),
|
|
||||||
inaddr(a),
|
|
||||||
localAddr(laddr),
|
|
||||||
strategyIteration(0) {}
|
|
||||||
|
|
||||||
SharedPtr<Peer> peer;
|
|
||||||
uint64_t fireAtTime;
|
|
||||||
InetAddress inaddr;
|
|
||||||
InetAddress localAddr;
|
|
||||||
unsigned int strategyIteration;
|
|
||||||
};
|
|
||||||
std::list<ContactQueueEntry> _contactQueue;
|
|
||||||
Mutex _contactQueue_m;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ZeroTier
|
} // namespace ZeroTier
|
||||||
|
Loading…
x
Reference in New Issue
Block a user