summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--node/AntiRecursion.hpp7
-rw-r--r--node/Cluster.cpp4
-rw-r--r--node/Identity.cpp2
-rw-r--r--node/Node.cpp33
-rw-r--r--node/Topology.cpp31
-rw-r--r--node/Topology.hpp16
-rw-r--r--one.cpp60
-rw-r--r--osdep/OSUtils.cpp2
-rw-r--r--osdep/WindowsEthernetTap.cpp20
-rw-r--r--selftest.cpp3
-rw-r--r--windows/ZeroTierOne/ZeroTierOne.vcxproj13
-rw-r--r--windows/ZeroTierOne/ZeroTierOne.vcxproj.filters9
12 files changed, 103 insertions, 97 deletions
diff --git a/node/AntiRecursion.hpp b/node/AntiRecursion.hpp
index 8629d19a..4d9df465 100644
--- a/node/AntiRecursion.hpp
+++ b/node/AntiRecursion.hpp
@@ -58,7 +58,12 @@ class AntiRecursion
public:
AntiRecursion()
{
- memset(_history,0,sizeof(_history));
+ for(int i=0;i<ZT_ANTIRECURSION_HISTORY_SIZE;++i) {
+ _history[i].tail[0] = 0;
+ _history[i].tail[1] = 0;
+ _history[i].tail[2] = 0;
+ _history[i].tail[3] = 0;
+ }
_ptr = 0;
}
diff --git a/node/Cluster.cpp b/node/Cluster.cpp
index af9ab854..fa9a1611 100644
--- a/node/Cluster.cpp
+++ b/node/Cluster.cpp
@@ -628,7 +628,7 @@ void Cluster::doPeriodicTasks()
}
alive.append((uint64_t)now);
alive.append((uint64_t)0); // TODO: compute and send load average
- alive.append((uint64_t)RR->topology->countActive());
+ alive.append((uint64_t)RR->topology->countActive(now));
alive.append((uint64_t)0); // unused/reserved flags
alive.append((uint8_t)_zeroTierPhysicalEndpoints.size());
for(std::vector<InetAddress>::const_iterator pe(_zeroTierPhysicalEndpoints.begin());pe!=_zeroTierPhysicalEndpoints.end();++pe)
@@ -769,7 +769,7 @@ void Cluster::status(ZT_ClusterStatus &status) const
s->y = _y;
s->z = _z;
s->load = 0; // TODO
- s->peers = RR->topology->countActive();
+ s->peers = RR->topology->countActive(now);
for(std::vector<InetAddress>::const_iterator ep(_zeroTierPhysicalEndpoints.begin());ep!=_zeroTierPhysicalEndpoints.end();++ep) {
if (s->numZeroTierPhysicalEndpoints >= ZT_CLUSTER_MAX_ZT_PHYSICAL_ADDRESSES) // sanity check
break;
diff --git a/node/Identity.cpp b/node/Identity.cpp
index e5aaf13d..4611f6a5 100644
--- a/node/Identity.cpp
+++ b/node/Identity.cpp
@@ -158,7 +158,7 @@ bool Identity::fromString(const char *str)
return false;
char *saveptr = (char *)0;
- char tmp[4096];
+ char tmp[1024];
if (!Utils::scopy(tmp,sizeof(tmp),str))
return false;
diff --git a/node/Node.cpp b/node/Node.cpp
index 4b449401..f077424b 100644
--- a/node/Node.cpp
+++ b/node/Node.cpp
@@ -93,21 +93,22 @@ Node::Node(
_prng.encrypt12(_prngStream,_prngStream,sizeof(_prngStream));
}
- std::string idtmp(dataStoreGet("identity.secret"));
- if ((!idtmp.length())||(!RR->identity.fromString(idtmp))||(!RR->identity.hasPrivate())) {
- TRACE("identity.secret not found, generating...");
- RR->identity.generate();
- idtmp = RR->identity.toString(true);
- if (!dataStorePut("identity.secret",idtmp,true))
- throw std::runtime_error("unable to write identity.secret");
- }
- RR->publicIdentityStr = RR->identity.toString(false);
- RR->secretIdentityStr = RR->identity.toString(true);
-
- idtmp = dataStoreGet("identity.public");
- if (idtmp != RR->publicIdentityStr) {
- if (!dataStorePut("identity.public",RR->publicIdentityStr,false))
- throw std::runtime_error("unable to write identity.public");
+ {
+ std::string idtmp(dataStoreGet("identity.secret"));
+ if ((!idtmp.length())||(!RR->identity.fromString(idtmp))||(!RR->identity.hasPrivate())) {
+ TRACE("identity.secret not found, generating...");
+ RR->identity.generate();
+ idtmp = RR->identity.toString(true);
+ if (!dataStorePut("identity.secret",idtmp,true))
+ throw std::runtime_error("unable to write identity.secret");
+ }
+ RR->publicIdentityStr = RR->identity.toString(false);
+ RR->secretIdentityStr = RR->identity.toString(true);
+ idtmp = dataStoreGet("identity.public");
+ if (idtmp != RR->publicIdentityStr) {
+ if (!dataStorePut("identity.public",RR->publicIdentityStr,false))
+ throw std::runtime_error("unable to write identity.public");
+ }
}
try {
@@ -662,7 +663,7 @@ void Node::backgroundThreadMain()
std::string Node::dataStoreGet(const char *name)
{
- char buf[16384];
+ char buf[1024];
std::string r;
unsigned long olen = 0;
do {
diff --git a/node/Topology.cpp b/node/Topology.cpp
index 5379ac1f..1617dd94 100644
--- a/node/Topology.cpp
+++ b/node/Topology.cpp
@@ -50,6 +50,7 @@ Topology::Topology(const RuntimeEnvironment *renv) :
const uint8_t *all = reinterpret_cast<const uint8_t *>(alls.data());
RR->node->dataStoreDelete("peers.save");
+ Buffer<ZT_PEER_SUGGESTED_SERIALIZATION_BUFFER_SIZE> *deserializeBuf = new Buffer<ZT_PEER_SUGGESTED_SERIALIZATION_BUFFER_SIZE>();
unsigned int ptr = 0;
while ((ptr + 4) < alls.size()) {
try {
@@ -60,7 +61,8 @@ Topology::Topology(const RuntimeEnvironment *renv) :
(((unsigned int)all[ptr + 3]) & 0xff)
);
unsigned int pos = 0;
- SharedPtr<Peer> p(Peer::deserializeNew(RR->identity,Buffer<ZT_PEER_SUGGESTED_SERIALIZATION_BUFFER_SIZE>(all + ptr,reclen + 4),pos));
+ deserializeBuf->copyFrom(all + ptr,reclen + 4);
+ SharedPtr<Peer> p(Peer::deserializeNew(RR->identity,*deserializeBuf,pos));
ptr += pos;
if (!p)
break; // stop if invalid records
@@ -70,16 +72,19 @@ Topology::Topology(const RuntimeEnvironment *renv) :
break; // stop if invalid records
}
}
+ delete deserializeBuf;
clean(RR->node->now());
std::string dsWorld(RR->node->dataStoreGet("world"));
World cachedWorld;
- try {
- Buffer<ZT_WORLD_MAX_SERIALIZED_LENGTH> dswtmp(dsWorld.data(),(unsigned int)dsWorld.length());
- cachedWorld.deserialize(dswtmp,0);
- } catch ( ... ) {
- cachedWorld = World(); // clear if cached world is invalid
+ if (dsWorld.length() > 0) {
+ try {
+ Buffer<ZT_WORLD_MAX_SERIALIZED_LENGTH> dswtmp(dsWorld.data(),(unsigned int)dsWorld.length());
+ cachedWorld.deserialize(dswtmp,0);
+ } catch ( ... ) {
+ cachedWorld = World(); // clear if cached world is invalid
+ }
}
World defaultWorld;
{
@@ -315,20 +320,6 @@ void Topology::clean(uint64_t now)
}
}
-unsigned long Topology::countActive() const
-{
- const uint64_t now = RR->node->now();
- unsigned long cnt = 0;
- Mutex::Lock _l(_lock);
- Hashtable< Address,SharedPtr<Peer> >::Iterator i(const_cast<Topology *>(this)->_peers);
- Address *a = (Address *)0;
- SharedPtr<Peer> *p = (SharedPtr<Peer> *)0;
- while (i.next(a,p)) {
- cnt += (unsigned long)((*p)->hasActiveDirectPath(now));
- }
- return cnt;
-}
-
Identity Topology::_getIdentity(const Address &zta)
{
char p[128];
diff --git a/node/Topology.hpp b/node/Topology.hpp
index 68ad273f..a9a5f2f9 100644
--- a/node/Topology.hpp
+++ b/node/Topology.hpp
@@ -200,9 +200,21 @@ public:
void clean(uint64_t now);
/**
+ * @param now Current time
* @return Number of peers with active direct paths
*/
- unsigned long countActive() const;
+ inline unsigned long countActive(uint64_t now) const
+ {
+ unsigned long cnt = 0;
+ Mutex::Lock _l(_lock);
+ Hashtable< Address,SharedPtr<Peer> >::Iterator i(const_cast<Topology *>(this)->_peers);
+ Address *a = (Address *)0;
+ SharedPtr<Peer> *p = (SharedPtr<Peer> *)0;
+ while (i.next(a,p)) {
+ cnt += (unsigned long)((*p)->hasActiveDirectPath(now));
+ }
+ return cnt;
+ }
/**
* Apply a function or function object to all peers
@@ -253,7 +265,7 @@ private:
Identity _getIdentity(const Address &zta);
void _setWorld(const World &newWorld);
- const RuntimeEnvironment *RR;
+ const RuntimeEnvironment *const RR;
World _world;
Hashtable< Address,SharedPtr<Peer> > _peers;
diff --git a/one.cpp b/one.cpp
index c8661fda..11bcc11e 100644
--- a/one.cpp
+++ b/one.cpp
@@ -958,13 +958,15 @@ int main(int argc,char **argv)
#endif // __UNIX_LIKE__
#ifdef __WINDOWS__
- WSADATA wsaData;
- WSAStartup(MAKEWORD(2,2),&wsaData);
+ {
+ WSADATA wsaData;
+ WSAStartup(MAKEWORD(2,2),&wsaData);
+ }
#ifdef ZT_WIN_RUN_IN_CONSOLE
bool winRunFromCommandLine = true;
#else
- bool winRunFromCommandLine = false;
+ bool winRunFromCommandLine = true;
#endif
#endif // __WINDOWS__
@@ -1153,37 +1155,29 @@ int main(int argc,char **argv)
unsigned int returnValue = 0;
- try {
- for(;;) {
- zt1Service = OneService::newInstance(homeDir.c_str(),port);
- switch(zt1Service->run()) {
- case OneService::ONE_STILL_RUNNING: // shouldn't happen, run() won't return until done
- case OneService::ONE_NORMAL_TERMINATION:
- break;
- case OneService::ONE_UNRECOVERABLE_ERROR:
- fprintf(stderr,"%s: fatal error: %s"ZT_EOL_S,argv[0],zt1Service->fatalErrorMessage().c_str());
- returnValue = 1;
- break;
- case OneService::ONE_IDENTITY_COLLISION: {
- delete zt1Service;
- zt1Service = (OneService *)0;
- std::string oldid;
- OSUtils::readFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str(),oldid);
- if (oldid.length()) {
- OSUtils::writeFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret.saved_after_collision").c_str(),oldid);
- OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str());
- OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.public").c_str());
- }
- } continue; // restart!
- }
- break; // terminate loop -- normally we don't keep restarting
+ for(;;) {
+ zt1Service = OneService::newInstance(homeDir.c_str(),port);
+ switch(zt1Service->run()) {
+ case OneService::ONE_STILL_RUNNING: // shouldn't happen, run() won't return until done
+ case OneService::ONE_NORMAL_TERMINATION:
+ break;
+ case OneService::ONE_UNRECOVERABLE_ERROR:
+ fprintf(stderr,"%s: fatal error: %s"ZT_EOL_S,argv[0],zt1Service->fatalErrorMessage().c_str());
+ returnValue = 1;
+ break;
+ case OneService::ONE_IDENTITY_COLLISION: {
+ delete zt1Service;
+ zt1Service = (OneService *)0;
+ std::string oldid;
+ OSUtils::readFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str(),oldid);
+ if (oldid.length()) {
+ OSUtils::writeFile((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret.saved_after_collision").c_str(),oldid);
+ OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.secret").c_str());
+ OSUtils::rm((homeDir + ZT_PATH_SEPARATOR_S + "identity.public").c_str());
+ }
+ } continue; // restart!
}
- } catch (std::exception &exc) {
- fprintf(stderr,"%s: fatal error: %s"ZT_EOL_S,argv[0],exc.what());
- returnValue = 1;
- } catch ( ... ) {
- fprintf(stderr,"%s: fatal error: unknown exception"ZT_EOL_S,argv[0]);
- returnValue = 1;
+ break; // terminate loop -- normally we don't keep restarting
}
delete zt1Service;
diff --git a/osdep/OSUtils.cpp b/osdep/OSUtils.cpp
index 45fbf100..728704e5 100644
--- a/osdep/OSUtils.cpp
+++ b/osdep/OSUtils.cpp
@@ -206,7 +206,7 @@ skip_add_inetaddr:
bool OSUtils::readFile(const char *path,std::string &buf)
{
- char tmp[4096];
+ char tmp[1024];
FILE *f = fopen(path,"rb");
if (f) {
for(;;) {
diff --git a/osdep/WindowsEthernetTap.cpp b/osdep/WindowsEthernetTap.cpp
index f327009d..5b2bc154 100644
--- a/osdep/WindowsEthernetTap.cpp
+++ b/osdep/WindowsEthernetTap.cpp
@@ -213,7 +213,7 @@ std::string WindowsEthernetTap::addNewPersistentTapDevice(const char *pathToInf,
Mutex::Lock _l(_systemDeviceManagementLock);
GUID classGuid;
- char className[4096];
+ char className[1024];
if (!WINENV.SetupDiGetINFClassA(pathToInf,&classGuid,className,sizeof(className),(PDWORD)0)) {
return std::string("SetupDiGetINFClassA() failed -- unable to read zttap driver INF file");
}
@@ -269,9 +269,9 @@ std::string WindowsEthernetTap::addNewPersistentTapDevice(const char *pathToInf,
std::string WindowsEthernetTap::destroyAllLegacyPersistentTapDevices()
{
- char subkeyName[4096];
- char subkeyClass[4096];
- char data[4096];
+ char subkeyName[1024];
+ char subkeyClass[1024];
+ char data[1024];
std::set<std::string> instanceIdPathsToRemove;
{
@@ -321,9 +321,9 @@ std::string WindowsEthernetTap::destroyAllLegacyPersistentTapDevices()
std::string WindowsEthernetTap::destroyAllPersistentTapDevices()
{
- char subkeyName[4096];
- char subkeyClass[4096];
- char data[4096];
+ char subkeyName[1024];
+ char subkeyClass[1024];
+ char data[1024];
std::set<std::string> instanceIdPathsToRemove;
{
@@ -479,9 +479,9 @@ WindowsEthernetTap::WindowsEthernetTap(
_initialized(false),
_enabled(true)
{
- char subkeyName[4096];
- char subkeyClass[4096];
- char data[4096];
+ char subkeyName[1024];
+ char subkeyClass[1024];
+ char data[1024];
char tag[24];
std::string mySubkeyName;
diff --git a/selftest.cpp b/selftest.cpp
index fa8df48b..87043ddd 100644
--- a/selftest.cpp
+++ b/selftest.cpp
@@ -860,8 +860,9 @@ struct TestPhyHandlers
inline void phyOnUnixClose(PhySocket *sock,void **uptr) {}
inline void phyOnUnixData(PhySocket *sock,void **uptr,void *data,unsigned long len) {}
inline void phyOnUnixWritable(PhySocket *sock,void **uptr) {}
- inline void phyOnFileDescriptorActivity(PhySocket *sock,void **uptr,bool readable,bool writable) {}
#endif // __UNIX_LIKE__
+
+ inline void phyOnFileDescriptorActivity(PhySocket *sock,void **uptr,bool readable,bool writable) {}
};
static int testPhy()
{
diff --git a/windows/ZeroTierOne/ZeroTierOne.vcxproj b/windows/ZeroTierOne/ZeroTierOne.vcxproj
index c3163608..82b70400 100644
--- a/windows/ZeroTierOne/ZeroTierOne.vcxproj
+++ b/windows/ZeroTierOne/ZeroTierOne.vcxproj
@@ -24,6 +24,7 @@
<ClCompile Include="..\..\ext\lz4\lz4.c" />
<ClCompile Include="..\..\node\C25519.cpp" />
<ClCompile Include="..\..\node\CertificateOfMembership.cpp" />
+ <ClCompile Include="..\..\node\Cluster.cpp" />
<ClCompile Include="..\..\node\DeferredPackets.cpp" />
<ClCompile Include="..\..\node\Dictionary.cpp" />
<ClCompile Include="..\..\node\Identity.cpp" />
@@ -44,18 +45,14 @@
<ClCompile Include="..\..\node\Switch.cpp" />
<ClCompile Include="..\..\node\Topology.cpp" />
<ClCompile Include="..\..\node\Utils.cpp" />
- <ClCompile Include="..\..\one.cpp" />
+ <ClCompile Include="..\..\one.cpp">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
+ </ClCompile>
<ClCompile Include="..\..\osdep\BackgroundResolver.cpp" />
<ClCompile Include="..\..\osdep\Http.cpp" />
<ClCompile Include="..\..\osdep\OSUtils.cpp" />
<ClCompile Include="..\..\osdep\UPNPClient.cpp" />
<ClCompile Include="..\..\osdep\WindowsEthernetTap.cpp" />
- <ClCompile Include="..\..\selftest.cpp">
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
- <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
- </ClCompile>
<ClCompile Include="..\..\service\ControlPlane.cpp" />
<ClCompile Include="..\..\service\OneService.cpp" />
<ClCompile Include="ServiceBase.cpp" />
@@ -123,6 +120,7 @@
<ClInclude Include="..\..\node\Switch.hpp" />
<ClInclude Include="..\..\node\Topology.hpp" />
<ClInclude Include="..\..\node\Utils.hpp" />
+ <ClInclude Include="..\..\node\World.hpp" />
<ClInclude Include="..\..\osdep\BackgroundResolver.hpp" />
<ClInclude Include="..\..\osdep\Http.hpp" />
<ClInclude Include="..\..\osdep\OSUtils.hpp" />
@@ -232,6 +230,7 @@
<AdditionalIncludeDirectories>
</AdditionalIncludeDirectories>
<PreprocessorDefinitions>NOMINMAX;ZT_TRACE;ZT_USE_MINIUPNPC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MultiProcessorCompilation>false</MultiProcessorCompilation>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
diff --git a/windows/ZeroTierOne/ZeroTierOne.vcxproj.filters b/windows/ZeroTierOne/ZeroTierOne.vcxproj.filters
index b9e00b37..5a2767e4 100644
--- a/windows/ZeroTierOne/ZeroTierOne.vcxproj.filters
+++ b/windows/ZeroTierOne/ZeroTierOne.vcxproj.filters
@@ -96,9 +96,6 @@
<ClCompile Include="..\..\osdep\OSUtils.cpp">
<Filter>Source Files\osdep</Filter>
</ClCompile>
- <ClCompile Include="..\..\selftest.cpp">
- <Filter>Source Files</Filter>
- </ClCompile>
<ClCompile Include="..\..\node\C25519.cpp">
<Filter>Source Files\node</Filter>
</ClCompile>
@@ -192,6 +189,9 @@
<ClCompile Include="..\..\node\DeferredPackets.cpp">
<Filter>Source Files\node</Filter>
</ClCompile>
+ <ClCompile Include="..\..\node\Cluster.cpp">
+ <Filter>Source Files\node</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="resource.h">
@@ -419,6 +419,9 @@
<ClInclude Include="..\..\node\DeferredPackets.hpp">
<Filter>Header Files\node</Filter>
</ClInclude>
+ <ClInclude Include="..\..\node\World.hpp">
+ <Filter>Header Files\node</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="ZeroTierOne.rc">