summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2017-03-17 13:56:01 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2017-03-17 13:56:01 -0700
commitcc883cc3d81dd72427c0be0f386f39590f4578dd (patch)
tree4227f77bb0293bbc2d13240abe5149d0f13766d7
parentdf3025554213570aca6259b30d2bd314f3628659 (diff)
parentc6a39ed927161736e44aeaa67c6783024c1fb86a (diff)
downloadinfinitytier-cc883cc3d81dd72427c0be0f386f39590f4578dd.tar.gz
infinitytier-cc883cc3d81dd72427c0be0f386f39590f4578dd.zip
Merge branch 'master' of http://10.6.6.2/zerotier/ZeroTierOne
-rw-r--r--make-linux.mk14
-rw-r--r--node/Dictionary.hpp25
-rw-r--r--node/IncomingPacket.cpp6
-rw-r--r--node/Network.cpp8
-rw-r--r--one.cpp85
-rw-r--r--service/OneService.cpp2
6 files changed, 99 insertions, 41 deletions
diff --git a/make-linux.mk b/make-linux.mk
index 1bb62852..528c41c4 100644
--- a/make-linux.mk
+++ b/make-linux.mk
@@ -54,7 +54,7 @@ ifeq ($(ZT_RULES_ENGINE_DEBUGGING),1)
endif
ifeq ($(ZT_DEBUG),1)
- DEFS+=-DZT_TRACE
+# DEFS+=-DZT_TRACE
override CFLAGS+=-Wall -g -O -pthread $(INCLUDES) $(DEFS)
override CXXFLAGS+=-Wall -g -O -std=c++11 -pthread $(INCLUDES) $(DEFS)
override LDFLAGS+=
@@ -96,6 +96,12 @@ endif
ifeq ($(CC_MACH),arm)
ZT_ARCHITECTURE=3
endif
+ifeq ($(CC_MACH),armv6)
+ ZT_ARCHITECTURE=3
+endif
+ifeq ($(CC_MACH),armv7)
+ ZT_ARCHITECTURE=3
+endif
ifeq ($(CC_MACH),arm64)
ZT_ARCHITECTURE=4
endif
@@ -104,6 +110,12 @@ ifeq ($(CC_MACH),aarch64)
endif
DEFS+=-DZT_BUILD_PLATFORM=1 -DZT_BUILD_ARCHITECTURE=$(ZT_ARCHITECTURE) -DZT_SOFTWARE_UPDATE_DEFAULT="\"disable\""
+# Define some conservative CPU instruction set flags for arm32 since there's a ton of variation out there
+ifeq ($(ZT_ARCHITECTURE),3)
+ override CFLAGS+=-march=armv6zk -mcpu=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp
+ override CXXFLAGS+=-march=armv6zk -mcpu=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp
+endif
+
# Define this to build a static binary, which is needed to make this runnable on a few ancient Linux distros
ifeq ($(ZT_STATIC),1)
override LDFLAGS+=-static
diff --git a/node/Dictionary.hpp b/node/Dictionary.hpp
index 15ab9ce3..fa9e2883 100644
--- a/node/Dictionary.hpp
+++ b/node/Dictionary.hpp
@@ -61,15 +61,23 @@ public:
Dictionary(const char *s)
{
- Utils::scopy(_d,sizeof(_d),s);
+ if (s) {
+ Utils::scopy(_d,sizeof(_d),s);
+ } else {
+ _d[0] = (char)0;
+ }
}
Dictionary(const char *s,unsigned int len)
{
- if (len > (C-1))
- len = C-1;
- memcpy(_d,s,len);
- _d[len] = (char)0;
+ if (s) {
+ if (len > (C-1))
+ len = C-1;
+ memcpy(_d,s,len);
+ _d[len] = (char)0;
+ } else {
+ _d[0] = (char)0;
+ }
}
Dictionary(const Dictionary &d)
@@ -91,7 +99,12 @@ public:
*/
inline bool load(const char *s)
{
- return Utils::scopy(_d,sizeof(_d),s);
+ if (s) {
+ return Utils::scopy(_d,sizeof(_d),s);
+ } else {
+ _d[0] = (char)0;
+ return true;
+ }
}
/**
diff --git a/node/IncomingPacket.cpp b/node/IncomingPacket.cpp
index 800985dc..ac4ae377 100644
--- a/node/IncomingPacket.cpp
+++ b/node/IncomingPacket.cpp
@@ -836,7 +836,7 @@ bool IncomingPacket::_doNETWORK_CREDENTIALS(const RuntimeEnvironment *RR,const S
bool trustEstablished = false;
unsigned int p = ZT_PACKET_IDX_PAYLOAD;
- while ((p < size())&&((*this)[p])) {
+ while ((p < size())&&((*this)[p] != 0)) {
p += com.deserialize(*this,p);
if (com) {
const SharedPtr<Network> network(RR->node->network(com.networkId()));
@@ -953,8 +953,8 @@ bool IncomingPacket::_doNETWORK_CONFIG_REQUEST(const RuntimeEnvironment *RR,cons
const uint64_t requestPacketId = packetId();
if (RR->localNetworkController) {
- const unsigned int metaDataLength = at<uint16_t>(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT_LEN);
- const char *metaDataBytes = (const char *)field(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT,metaDataLength);
+ const unsigned int metaDataLength = (ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT_LEN <= size()) ? at<uint16_t>(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT_LEN) : 0;
+ const char *metaDataBytes = (metaDataLength != 0) ? (const char *)field(ZT_PROTO_VERB_NETWORK_CONFIG_REQUEST_IDX_DICT,metaDataLength) : (const char *)0;
const Dictionary<ZT_NETWORKCONFIG_METADATA_DICT_CAPACITY> metaData(metaDataBytes,metaDataLength);
RR->localNetworkController->request(nwid,(hopCount > 0) ? InetAddress() : _path->address(),requestPacketId,peer->identity(),metaData);
} else {
diff --git a/node/Network.cpp b/node/Network.cpp
index dd812cab..92ca67ab 100644
--- a/node/Network.cpp
+++ b/node/Network.cpp
@@ -1517,6 +1517,10 @@ void Network::_sendUpdatesToMembers(const MulticastGroup *const newMulticastGrou
Packet outp(*a,RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS);
_config.com.serialize(outp);
outp.append((uint8_t)0x00);
+ outp.append((uint16_t)0); // no capabilities
+ outp.append((uint16_t)0); // no tags
+ outp.append((uint16_t)0); // no revocations
+ outp.append((uint16_t)0); // no certificates of ownership
RR->sw->send(outp,true);
}
_announceMulticastGroupsTo(*a,groups);
@@ -1529,6 +1533,10 @@ void Network::_sendUpdatesToMembers(const MulticastGroup *const newMulticastGrou
Packet outp(c,RR->identity.address(),Packet::VERB_NETWORK_CREDENTIALS);
_config.com.serialize(outp);
outp.append((uint8_t)0x00);
+ outp.append((uint16_t)0); // no capabilities
+ outp.append((uint16_t)0); // no tags
+ outp.append((uint16_t)0); // no revocations
+ outp.append((uint16_t)0); // no certificates of ownership
RR->sw->send(outp,true);
}
_announceMulticastGroupsTo(c,groups);
diff --git a/one.cpp b/one.cpp
index 95230bf1..25a50dbb 100644
--- a/one.cpp
+++ b/one.cpp
@@ -72,6 +72,7 @@
#include "osdep/OSUtils.hpp"
#include "osdep/Http.hpp"
+#include "osdep/Thread.hpp"
#include "service/OneService.hpp"
@@ -1209,6 +1210,52 @@ static void printHelp(const char *cn,FILE *out)
fprintf(out," -q - Query API (zerotier-cli)" ZT_EOL_S);
}
+class _OneServiceRunner
+{
+public:
+ _OneServiceRunner(const char *pn,const std::string &hd,unsigned int p) : progname(pn),returnValue(0),port(p),homeDir(hd) {}
+ void threadMain()
+ throw()
+ {
+ 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,progname,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
+ }
+
+ delete zt1Service;
+ zt1Service = (OneService *)0;
+ } catch ( ... ) {
+ fprintf(stderr,"%s: unexpected exception starting main OneService instance" ZT_EOL_S,progname);
+ returnValue = 1;
+ }
+ }
+ const char *progname;
+ unsigned int returnValue;
+ unsigned int port;
+ const std::string &homeDir;
+};
+
#ifdef __WINDOWS__
int _tmain(int argc, _TCHAR* argv[])
#else
@@ -1421,8 +1468,8 @@ int main(int argc,char **argv)
} else {
// Running from service manager
_winPokeAHole();
- ZeroTierOneService zt1Service;
- if (CServiceBase::Run(zt1Service) == TRUE) {
+ ZeroTierOneService zt1WindowsService;
+ if (CServiceBase::Run(zt1WindowsService) == TRUE) {
return 0;
} else {
fprintf(stderr,"%s: unable to start service (try -h for help)" ZT_EOL_S,argv[0]);
@@ -1448,35 +1495,11 @@ int main(int argc,char **argv)
}
#endif // __UNIX_LIKE__
- unsigned int returnValue = 0;
-
- 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
- }
+ _OneServiceRunner thr(argv[0],homeDir,port);
+ thr.threadMain();
+ //Thread::join(Thread::start(&thr));
- delete zt1Service;
- zt1Service = (OneService *)0;
+ OSUtils::rm(pidPath.c_str());
- return returnValue;
+ return thr.returnValue;
}
diff --git a/service/OneService.cpp b/service/OneService.cpp
index 4a2102f1..1c2fa05d 100644
--- a/service/OneService.cpp
+++ b/service/OneService.cpp
@@ -488,6 +488,8 @@ public:
,_updater((SoftwareUpdater *)0)
,_updateAutoApply(false)
,_primaryPort(port)
+ ,_v4TcpControlSocket((PhySocket *)0)
+ ,_v6TcpControlSocket((PhySocket *)0)
,_lastDirectReceiveFromGlobal(0)
#ifdef ZT_TCP_FALLBACK_RELAY
,_lastSendToGlobalV4(0)