|
|
|
|
@ -147,6 +147,10 @@ namespace ZeroTier { typedef BSDEthernetTap EthernetTap; }
|
|
|
|
|
|
|
|
|
|
#endif // ZT_USE_TEST_TAP
|
|
|
|
|
|
|
|
|
|
#ifndef ZT_SOFTWARE_UPDATE_DEFAULT |
|
|
|
|
#define ZT_SOFTWARE_UPDATE_DEFAULT "disable" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// Sanity limits for HTTP
|
|
|
|
|
#define ZT_MAX_HTTP_MESSAGE_SIZE (1024 * 1024 * 64) |
|
|
|
|
#define ZT_MAX_HTTP_CONNECTIONS 65536 |
|
|
|
|
@ -477,12 +481,6 @@ public:
|
|
|
|
|
unsigned int _tertiaryPort; |
|
|
|
|
volatile unsigned int _udpPortPickerCounter; |
|
|
|
|
|
|
|
|
|
unsigned long _incomingPacketConcurrency; |
|
|
|
|
std::vector<OneServiceIncomingPacket *> _incomingPacketMemoryPool; |
|
|
|
|
BlockingQueue<OneServiceIncomingPacket *> _incomingPacketQueue; |
|
|
|
|
std::vector<std::thread> _incomingPacketThreads; |
|
|
|
|
Mutex _incomingPacketMemoryPoolLock,_incomingPacketThreadsLock; |
|
|
|
|
|
|
|
|
|
// Local configuration and memo-ized information from it
|
|
|
|
|
json _localConfig; |
|
|
|
|
Hashtable< uint64_t,std::vector<InetAddress> > _v4Hints; |
|
|
|
|
@ -615,43 +613,6 @@ public:
|
|
|
|
|
_ports[1] = 0; |
|
|
|
|
_ports[2] = 0; |
|
|
|
|
|
|
|
|
|
_incomingPacketConcurrency = std::max((unsigned long)1,std::min((unsigned long)16,(unsigned long)std::thread::hardware_concurrency())); |
|
|
|
|
char *envPool = std::getenv("INCOMING_PACKET_CONCURRENCY"); |
|
|
|
|
if (envPool != NULL) { |
|
|
|
|
int tmp = atoi(envPool); |
|
|
|
|
if (tmp > 0) { |
|
|
|
|
_incomingPacketConcurrency = tmp; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for(unsigned long t=0;t<_incomingPacketConcurrency;++t) { |
|
|
|
|
_incomingPacketThreads.push_back(std::thread([this]() { |
|
|
|
|
OneServiceIncomingPacket *pkt = nullptr; |
|
|
|
|
for(;;) { |
|
|
|
|
if (!_incomingPacketQueue.get(pkt)) |
|
|
|
|
break; |
|
|
|
|
if (!pkt) |
|
|
|
|
break; |
|
|
|
|
if (!_run) |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
const ZT_ResultCode rc = _node->processWirePacket(nullptr,pkt->now,pkt->sock,&(pkt->from),pkt->data,pkt->size,&_nextBackgroundTaskDeadline); |
|
|
|
|
{ |
|
|
|
|
Mutex::Lock l(_incomingPacketMemoryPoolLock); |
|
|
|
|
_incomingPacketMemoryPool.push_back(pkt); |
|
|
|
|
} |
|
|
|
|
if (ZT_ResultCode_isFatal(rc)) { |
|
|
|
|
char tmp[256]; |
|
|
|
|
OSUtils::ztsnprintf(tmp,sizeof(tmp),"fatal error code from processWirePacket: %d",(int)rc); |
|
|
|
|
Mutex::Lock _l(_termReason_m); |
|
|
|
|
_termReason = ONE_UNRECOVERABLE_ERROR; |
|
|
|
|
_fatalErrorMessage = tmp; |
|
|
|
|
this->terminate(); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
})); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#if ZT_VAULT_SUPPORT |
|
|
|
|
curl_global_init(CURL_GLOBAL_DEFAULT); |
|
|
|
|
#endif |
|
|
|
|
@ -659,12 +620,6 @@ public:
|
|
|
|
|
|
|
|
|
|
virtual ~OneServiceImpl() |
|
|
|
|
{ |
|
|
|
|
_incomingPacketQueue.stop(); |
|
|
|
|
_incomingPacketThreadsLock.lock(); |
|
|
|
|
for(auto t=_incomingPacketThreads.begin();t!=_incomingPacketThreads.end();++t) |
|
|
|
|
t->join(); |
|
|
|
|
_incomingPacketThreadsLock.unlock(); |
|
|
|
|
|
|
|
|
|
_binder.closeAll(_phy); |
|
|
|
|
_phy.close(_localControlSocket4); |
|
|
|
|
_phy.close(_localControlSocket6); |
|
|
|
|
@ -673,13 +628,6 @@ public:
|
|
|
|
|
curl_global_cleanup(); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
_incomingPacketMemoryPoolLock.lock(); |
|
|
|
|
while (!_incomingPacketMemoryPool.empty()) { |
|
|
|
|
delete _incomingPacketMemoryPool.back(); |
|
|
|
|
_incomingPacketMemoryPool.pop_back(); |
|
|
|
|
} |
|
|
|
|
_incomingPacketMemoryPoolLock.unlock(); |
|
|
|
|
|
|
|
|
|
#ifdef ZT_USE_MINIUPNPC |
|
|
|
|
delete _portMapper; |
|
|
|
|
#endif |
|
|
|
|
@ -1917,24 +1865,15 @@ public:
|
|
|
|
|
const uint64_t now = OSUtils::now(); |
|
|
|
|
if ((len >= 16)&&(reinterpret_cast<const InetAddress *>(from)->ipScope() == InetAddress::IP_SCOPE_GLOBAL)) |
|
|
|
|
_lastDirectReceiveFromGlobal = now; |
|
|
|
|
|
|
|
|
|
OneServiceIncomingPacket *pkt; |
|
|
|
|
_incomingPacketMemoryPoolLock.lock(); |
|
|
|
|
if (_incomingPacketMemoryPool.empty()) { |
|
|
|
|
pkt = new OneServiceIncomingPacket; |
|
|
|
|
} else { |
|
|
|
|
pkt = _incomingPacketMemoryPool.back(); |
|
|
|
|
_incomingPacketMemoryPool.pop_back(); |
|
|
|
|
const ZT_ResultCode rc = _node->processWirePacket(nullptr,now,reinterpret_cast<int64_t>(sock),reinterpret_cast<const struct sockaddr_storage *>(from),data,len,&_nextBackgroundTaskDeadline); |
|
|
|
|
if (ZT_ResultCode_isFatal(rc)) { |
|
|
|
|
char tmp[256]; |
|
|
|
|
OSUtils::ztsnprintf(tmp,sizeof(tmp),"fatal error code from processWirePacket: %d",(int)rc); |
|
|
|
|
Mutex::Lock _l(_termReason_m); |
|
|
|
|
_termReason = ONE_UNRECOVERABLE_ERROR; |
|
|
|
|
_fatalErrorMessage = tmp; |
|
|
|
|
this->terminate(); |
|
|
|
|
} |
|
|
|
|
_incomingPacketMemoryPoolLock.unlock(); |
|
|
|
|
|
|
|
|
|
pkt->now = now; |
|
|
|
|
pkt->sock = reinterpret_cast<int64_t>(sock); |
|
|
|
|
memcpy(&(pkt->from),from,sizeof(struct sockaddr_storage)); |
|
|
|
|
pkt->size = (unsigned int)len; |
|
|
|
|
memcpy(pkt->data,data,len); |
|
|
|
|
|
|
|
|
|
_incomingPacketQueue.postLimit(pkt,16 * _incomingPacketConcurrency); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline void phyOnTcpConnect(PhySocket *sock,void **uptr,bool success) |
|
|
|
|
|