Browse Source

Everything but the Go code builds now!

Adam Ierymenko 5 years ago
parent
commit
a5aea2f3bb
16 changed files with 106 additions and 164 deletions
  1. 26 51
      CMakeLists.txt
  2. 1 1
      node/AES.hpp
  3. 6 4
      node/Address.hpp
  4. 1 1
      node/Locator.cpp
  5. 0 15
      node/Membership.hpp
  6. 6 4
      node/Network.cpp
  7. 4 6
      node/Node.cpp
  8. 0 1
      node/Node.hpp
  9. 7 0
      node/Peer.cpp
  10. 7 0
      node/Peer.hpp
  11. 6 6
      node/SHA512.hpp
  12. 38 46
      node/Utils.hpp
  13. 0 18
      osdep/OSUtils.cpp
  14. 0 1
      osdep/OSUtils.hpp
  15. 1 1
      osdep/Thread.hpp
  16. 3 9
      root/root.cpp

+ 26 - 51
CMakeLists.txt

@@ -1,4 +1,5 @@
 cmake_minimum_required (VERSION 3.8)
+project(zerotier DESCRIPTION "ZeroTier Network Hypervisor" LANGUAGES CXX C)
 
 if(${CMAKE_VERSION} VERSION_LESS 3.15)
 	cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
@@ -7,31 +8,32 @@ else()
 endif()
 
 if(WIN32)
-	# If building on Windows, set minimum target to Windows 7
 	set(CMAKE_SYSTEM_VERSION "7" CACHE STRING INTERNAL FORCE)
 endif(WIN32)
+set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X Deployment Version")
 
 set(ZEROTIER_ONE_VERSION_MAJOR 2 CACHE INTERNAL "")
 set(ZEROTIER_ONE_VERSION_MINOR 0 CACHE INTERNAL "")
 set(ZEROTIER_ONE_VERSION_REVISION 0 CACHE INTERNAL "")
 set(ZEROTIER_ONE_VERSION_BUILD 0 CACHE INTERNAL "")
 
+configure_file(
+	${CMAKE_SOURCE_DIR}/version.h.in
+	${CMAKE_BINARY_DIR}/version.h
+)
+
 set(default_build_type "Release")
-if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
-	set(default_build_type "Debug")
-endif()
+#if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
+#	set(default_build_type "Debug")
+#endif()
 
 if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
 	message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
-	set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
-		STRING "Choose the type of build." FORCE)
-	# Set the possible values of build type for cmake-gui
-	set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
-		"Debug" "Release" "MinSizeRel" "RelWithDebInfo")
+	set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE)
+	set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
 endif()
 
 option(BUILD_CENTRAL_CONTROLLER "Build ZeroTier Central Controller" OFF)
-
 if (BUILD_CENTRAL_CONTROLLER)
 	find_package(PostgreSQL REQUIRED)
 	set(ENABLE_SSL_SUPPORT OFF)
@@ -43,22 +45,17 @@ if (BUILD_CENTRAL_CONTROLLER)
 	add_subdirectory("ext/librabbitmq")
 endif(BUILD_CENTRAL_CONTROLLER)
 
-set(CMAKE_OSX_DEPLOYMENT_TARGET "10.9" CACHE STRING "Minimum OS X Deployment Version")
-
 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
 	add_definitions(-DZT_TRACE)
 endif(CMAKE_BUILD_TYPE STREQUAL "Debug")
 
-project(zerotier
-	DESCRIPTION "ZeroTier Network Hypervisor"
-	LANGUAGES CXX C)
-
 if(WIN32)
+	message("++ Setting Windows Compiler Flags ${CMAKE_BUILD_TYPE}")
 	add_definitions(-DNOMINMAX)
 else(WIN32)
 	if(APPLE)
 
-		message("Setting macOS Compiler Flags ${CMAKE_BUILD_TYPE}")
+		message("++ Setting MacOS Compiler Flags ${CMAKE_BUILD_TYPE}")
 		add_compile_options(
 			-Wall
 			-Wno-deprecated
@@ -77,14 +74,9 @@ else(WIN32)
 			$<$<CONFIG:RELEASE>:-flto>
 		)
 
-	elseif (
-		CMAKE_SYSTEM_NAME MATCHES "Linux" OR
-		CMAKE_SYSTEM_NAME MATCHES "FreeBSD" OR
-		CMAKE_SYSTEM_NAME MATCHES "OpenBSD" OR
-		CMAKE_SYSTEM_NAME MATCHES "NetBSD"
-	)
+	else(APPLE)
 
-		message("Setting Linux/BSD Compiler Flags (${CMAKE_BUILD_TYPE})")
+		message("++ Setting Linux/BSD/Posix Compiler Flags (${CMAKE_BUILD_TYPE})")
 		add_compile_options(
 			-Wall
 			-Wno-deprecated
@@ -108,10 +100,9 @@ if (
 	CMAKE_SYSTEM_PROCESSOR MATCHES "i586" OR
 	CMAKE_SYSTEM_PROCESSOR MATCHES "i686"
 )
-	message("Adding SSE and AES-NI flags for processor ${CMAKE_SYSTEM_PROCESSOR}")
+	message("++ Adding SSE and AES-NI flags for processor ${CMAKE_SYSTEM_PROCESSOR}")
 	add_compile_options(
 		-maes
-		-mmmx
 		-mrdrnd
 		-mpclmul
 		-msse
@@ -124,9 +115,6 @@ endif()
 if(ZT_TRACE)
 	add_definitions(-DZT_TRACE)
 endif()
-if(ZT_DEBUG_TRACE)
-	add_definitions(-DZT_DEBUG_TRACE)
-endif()
 
 add_subdirectory(node)
 add_subdirectory(controller)
@@ -134,12 +122,6 @@ add_subdirectory(osdep)
 add_subdirectory(root)
 add_subdirectory(go/native)
 
-#if(WIN32)
-#	add_subdirectory("windows/WinUI")
-#	add_subdirectory("windows/copyutil")
-#	add_definitions(-DNOMINMAX)
-#endif(WIN32)
-
 set(
 	zt_osdep
 	zt_core
@@ -147,25 +129,18 @@ set(
 	zt_go_native
 )
 
-configure_file(
-	${CMAKE_SOURCE_DIR}/version.h.in
-	${CMAKE_BINARY_DIR}/version.h
-)
-
-#set(src
-#	one.cpp
-#	"ext/http-parser/http_parser.c"
-#)
-#set(headers
-#	"ext/http-parser/http_parser.h"
-#)
-
 if(WIN32)
 	set(libs ${libs} wsock32 ws2_32 rpcrt4 iphlpapi)
 else(WIN32)
 	set(libs ${libs} pthread)
 endif(WIN32)
 
+#if(WIN32)
+#	add_subdirectory("windows/WinUI")
+#	add_subdirectory("windows/copyutil")
+#	add_definitions(-DNOMINMAX)
+#endif(WIN32)
+
 #if(WIN32)
 #	set(libs ${libs} wsock32 ws2_32 rpcrt4 iphlpapi)
 #	set(src
@@ -201,6 +176,6 @@ add_custom_command(
 )
 add_custom_target(build_zerotier ALL DEPENDS zerotier)
 
-add_executable(zerotier-selftest selftest.cpp)
-target_link_libraries(zerotier-selftest ${libs} zt_core zt_osdep)
-target_compile_features(zerotier-selftest PUBLIC cxx_std_11)
+#add_executable(zerotier-selftest selftest.cpp)
+#target_link_libraries(zerotier-selftest ${libs} zt_core zt_osdep)
+#target_compile_features(zerotier-selftest PUBLIC cxx_std_11)

+ 1 - 1
node/AES.hpp

@@ -487,7 +487,7 @@ private:
 		_mm_storeu_si128((__m128i *)out,_mm_aesenclast_si128(tmp,_k.ni.k[14]));
 	}
 
-	ZT_ALWAYS_INLINE inline __m128i _mult_block_aesni(__m128i shuf,__m128i h,__m128i y)
+	static ZT_ALWAYS_INLINE inline __m128i _mult_block_aesni(__m128i shuf,__m128i h,__m128i y)
 	{
 		y = _mm_shuffle_epi8(y,shuf);
 		__m128i t1 = _mm_clmulepi64_si128(h,y,0x00);

+ 6 - 4
node/Address.hpp

@@ -130,10 +130,10 @@ public:
 	 */
 	ZT_ALWAYS_INLINE uint8_t operator[](unsigned int i) const { return (uint8_t)(_a >> (32 - (i * 8))); }
 
-	explicit ZT_ALWAYS_INLINE operator bool() const { return (_a != 0); }
-	explicit ZT_ALWAYS_INLINE operator unsigned int() const { return (unsigned int)_a; }
-	explicit ZT_ALWAYS_INLINE operator unsigned long() const { return (unsigned long)_a; }
-	explicit ZT_ALWAYS_INLINE operator unsigned long long() const { return (unsigned long long)_a; }
+	ZT_ALWAYS_INLINE operator bool() const { return (_a != 0); }
+	ZT_ALWAYS_INLINE operator unsigned int() const { return (unsigned int)_a; }
+	ZT_ALWAYS_INLINE operator unsigned long() const { return (unsigned long)_a; }
+	ZT_ALWAYS_INLINE operator unsigned long long() const { return (unsigned long long)_a; }
 
 	ZT_ALWAYS_INLINE void zero() { _a = 0; }
 
@@ -151,6 +151,7 @@ public:
 	ZT_ALWAYS_INLINE bool operator>=(const Address &a) const { return (_a >= a._a); }
 	ZT_ALWAYS_INLINE bool operator<=(const Address &a) const { return (_a <= a._a); }
 
+#if 0
 	/**
 	 * Create a list of the first N bits of a list of unique addresses with N as the minimum unique size
 	 *
@@ -232,6 +233,7 @@ try_additional_bits: {
 
 		return l;
 	}
+#endif
 
 private:
 	uint64_t _a;

+ 1 - 1
node/Locator.cpp

@@ -37,7 +37,7 @@ bool Locator::verify(const Identity &id) const
 	return id.verify(signData,signLen,_signature,_signatureLength);
 }
 
-int Locator::marshal(uint8_t data[ZT_LOCATOR_MARSHAL_SIZE_MAX],const bool excludeSignature = false) const
+int Locator::marshal(uint8_t data[ZT_LOCATOR_MARSHAL_SIZE_MAX],const bool excludeSignature) const
 {
 	if ((_endpointCount > ZT_LOCATOR_MAX_ENDPOINTS)||(_signatureLength > ZT_SIGNATURE_BUFFER_SIZE))
 		return -1;

+ 0 - 15
node/Membership.hpp

@@ -70,21 +70,6 @@ public:
 	 */
 	ZT_ALWAYS_INLINE int64_t lastPushedCredentials() const { return _lastPushedCredentials; }
 
-	/**
-	 * Check whether we should push MULTICAST_LIKEs to this peer, and update last sent time if true
-	 *
-	 * @param now Current time
-	 * @return True if we should update multicasts
-	 */
-	ZT_ALWAYS_INLINE bool multicastLikeGate(const int64_t now)
-	{
-		if ((now - _lastUpdatedMulticast) >= ZT_MULTICAST_ANNOUNCE_PERIOD) {
-			_lastUpdatedMulticast = now;
-			return true;
-		}
-		return false;
-	}
-
 	/**
 	 * Check whether the peer represented by this Membership should be allowed on this network at all
 	 *

+ 6 - 4
node/Network.cpp

@@ -1018,10 +1018,6 @@ bool Network::gate(void *tPtr,const SharedPtr<Peer> &peer)
 			if ( (_config.isPublic()) || ((m)&&(m->isAllowedOnNetwork(_config))) ) {
 				if (!m)
 					m = &(_memberships[peer->address()]);
-				if (m->multicastLikeGate(now)) {
-					Mutex::Lock l2(_myMulticastGroups_l);
-					_announceMulticastGroupsTo(tPtr,peer->address(),_allMulticastGroups());
-				}
 				return true;
 			}
 		}
@@ -1051,6 +1047,8 @@ void Network::doPeriodicTasks(void *tPtr,const int64_t now)
 		{
 			Mutex::Lock l2(_myMulticastGroups_l);
 
+			// TODO
+			/*
 			Hashtable< MulticastGroup,uint64_t >::Iterator i(_multicastGroupsBehindMe);
 			MulticastGroup *mg = (MulticastGroup *)0;
 			uint64_t *ts = (uint64_t *)0;
@@ -1060,6 +1058,7 @@ void Network::doPeriodicTasks(void *tPtr,const int64_t now)
 			}
 
 			_announceMulticastGroups(tPtr,false);
+			*/
 		}
 	}
 }
@@ -1374,11 +1373,14 @@ void Network::_announceMulticastGroups(void *tPtr,bool force)
 		Membership *m = (Membership *)0;
 		Hashtable<Address,Membership>::Iterator i(_memberships);
 		while (i.next(a,m)) {
+			// TODO
+			/*
 			bool announce = m->multicastLikeGate(now); // force this to be called even if 'force' is true since it updates last push time
 			if ((!announce)&&(force))
 				announce = true;
 			if ((announce)&&(m->isAllowedOnNetwork(_config)))
 				_announceMulticastGroupsTo(tPtr,*a,groups);
+			*/
 		}
 	}
 }

+ 4 - 6
node/Node.cpp

@@ -47,7 +47,6 @@ Node::Node(void *uPtr, void *tPtr, const struct ZT_Node_Callbacks *callbacks, in
 	_lastPing(0),
 	_lastHousekeepingRun(0),
 	_lastNetworkHousekeepingRun(0),
-	_lastDynamicRootUpdate(0),
 	_online(false)
 {
 	memset(_expectingRepliesToBucketPtr,0,sizeof(_expectingRepliesToBucketPtr));
@@ -408,13 +407,13 @@ ZT_PeerList *Node::peers() const
 			p->versionMinor = -1;
 			p->versionRev = -1;
 		}
-		p->latency = (int)(*pi)->latency(now);
+		p->latency = (int)(*pi)->latency();
 		if (p->latency >= 0xffff)
 			p->latency = -1;
 		p->role = RR->topology->isRoot((*pi)->identity()) ? ZT_PEER_ROLE_ROOT : ZT_PEER_ROLE_LEAF;
 
-		std::vector< SharedPtr<Path> > paths((*pi)->paths(now));
-		SharedPtr<Path> bestp((*pi)->getAppropriatePath(now,false));
+		std::vector< SharedPtr<Path> > paths;
+		(*pi)->getAllPaths(paths);
 		p->pathCount = 0;
 		for(std::vector< SharedPtr<Path> >::iterator path(paths.begin());path!=paths.end();++path) {
 			memcpy(&(p->paths[p->pathCount].address),&((*path)->address()),sizeof(struct sockaddr_storage));
@@ -422,8 +421,7 @@ ZT_PeerList *Node::peers() const
 			p->paths[p->pathCount].lastReceive = (*path)->lastIn();
 			p->paths[p->pathCount].trustedPathId = RR->topology->getOutboundPathTrust((*path)->address());
 			p->paths[p->pathCount].alive = (*path)->alive(now) ? 1 : 0;
-			p->paths[p->pathCount].preferred = ((*path) == bestp) ? 1 : 0;
-
+			p->paths[p->pathCount].preferred = (p->pathCount == 0) ? 1 : 0;
 			++p->pathCount;
 		}
 

+ 0 - 1
node/Node.hpp

@@ -270,7 +270,6 @@ private:
 	int64_t _lastPing;
 	int64_t _lastHousekeepingRun;
 	int64_t _lastNetworkHousekeepingRun;
-	int64_t _lastDynamicRootUpdate;
 	bool _online;
 };
 

+ 7 - 0
node/Peer.cpp

@@ -260,4 +260,11 @@ void Peer::resetWithinScope(void *tPtr,InetAddress::IpScope scope,int inetAddres
 	*/
 }
 
+void Peer::getAllPaths(std::vector< SharedPtr<Path> > &paths)
+{
+	RWMutex::RLock l(_paths_l);
+	paths.clear();
+	paths.assign(_paths,_paths + _pathCount);
+}
+
 } // namespace ZeroTier

+ 7 - 0
node/Peer.hpp

@@ -278,6 +278,13 @@ public:
 		return _paths[0];
 	}
 
+	/**
+	 * Get all paths
+	 *
+	 * @param paths Vector of paths with the first path being the current preferred path
+	 */
+	void getAllPaths(std::vector< SharedPtr<Path> > &paths);
+
 private:
 	uint8_t _key[ZT_PEER_SECRET_KEY_LENGTH];
 

+ 6 - 6
node/SHA512.hpp

@@ -42,21 +42,21 @@ namespace ZeroTier {
 
 #ifdef __APPLE__
 #define ZT_HAVE_NATIVE_SHA512 1
-static ZT_ALWAYS_INLINE void SHA512(void *digest,const void *data,unsigned int len)
+ZT_ALWAYS_INLINE void SHA512(void *digest,const void *data,unsigned int len)
 {
 	CC_SHA512_CTX ctx;
 	CC_SHA512_Init(&ctx);
 	CC_SHA512_Update(&ctx,data,len);
 	CC_SHA512_Final(reinterpret_cast<unsigned char *>(digest),&ctx);
 }
-static ZT_ALWAYS_INLINE void SHA384(void *digest,const void *data,unsigned int len)
+ZT_ALWAYS_INLINE void SHA384(void *digest,const void *data,unsigned int len)
 {
 	CC_SHA512_CTX ctx;
 	CC_SHA384_Init(&ctx);
 	CC_SHA384_Update(&ctx,data,len);
 	CC_SHA384_Final(reinterpret_cast<unsigned char *>(digest),&ctx);
 }
-static ZT_ALWAYS_INLINE void SHA384(void *digest,const void *data0,unsigned int len0,const void *data1,unsigned int len1)
+ZT_ALWAYS_INLINE void SHA384(void *digest,const void *data0,unsigned int len0,const void *data1,unsigned int len1)
 {
 	CC_SHA512_CTX ctx;
 	CC_SHA384_Init(&ctx);
@@ -69,21 +69,21 @@ static ZT_ALWAYS_INLINE void SHA384(void *digest,const void *data0,unsigned int
 #ifndef ZT_HAVE_NATIVE_SHA512
 #ifdef ZT_USE_LIBCRYPTO
 #define ZT_HAVE_NATIVE_SHA512 1
-static ZT_ALWAYS_INLINE void SHA512(void *digest,const void *data,unsigned int len)
+ZT_ALWAYS_INLINE void SHA512(void *digest,const void *data,unsigned int len)
 {
 	SHA512_CTX ctx;
 	SHA512_Init(&ctx);
 	SHA512_Update(&ctx,data,len);
 	SHA512_Final(reinterpret_cast<unsigned char *>(digest),&ctx);
 }
-static ZT_ALWAYS_INLINE void SHA384(void *digest,const void *data,unsigned int len)
+ZT_ALWAYS_INLINE void SHA384(void *digest,const void *data,unsigned int len)
 {
 	SHA512_CTX ctx;
 	SHA384_Init(&ctx);
 	SHA384_Update(&ctx,data,len);
 	SHA384_Final(reinterpret_cast<unsigned char *>(digest),&ctx);
 }
-static ZT_ALWAYS_INLINE void SHA384(void *digest,const void *data0,unsigned int len0,const void *data1,unsigned int len1)
+ZT_ALWAYS_INLINE void SHA384(void *digest,const void *data0,unsigned int len0,const void *data1,unsigned int len1)
 {
 	SHA512_CTX ctx;
 	SHA384_Init(&ctx);

+ 38 - 46
node/Utils.hpp

@@ -174,14 +174,6 @@ uint64_t random();
  */
 bool scopy(char *dest,unsigned int len,const char *src);
 
-static ZT_ALWAYS_INLINE float normalize(float value, int64_t bigMin, int64_t bigMax, int32_t targetMin, int32_t targetMax)
-{
-	int64_t bigSpan = bigMax - bigMin;
-	int64_t smallSpan = targetMax - targetMin;
-	float valueScaled = (value - (float)bigMin) / (float)bigSpan;
-	return (float)targetMin + valueScaled * (float)smallSpan;
-}
-
 /**
  * Tokenize a string (alias for strtok_r or strtok_s depending on platform)
  *
@@ -189,7 +181,7 @@ static ZT_ALWAYS_INLINE float normalize(float value, int64_t bigMin, int64_t big
  * @param delim Delimiters
  * @param saveptr Pointer to a char * for temporary reentrant storage
  */
-static ZT_ALWAYS_INLINE char *stok(char *str,const char *delim,char **saveptr)
+ZT_ALWAYS_INLINE char *stok(char *str,const char *delim,char **saveptr)
 {
 #ifdef __WINDOWS__
 	return strtok_s(str,delim,saveptr);
@@ -198,11 +190,11 @@ static ZT_ALWAYS_INLINE char *stok(char *str,const char *delim,char **saveptr)
 #endif
 }
 
-static ZT_ALWAYS_INLINE unsigned int strToUInt(const char *s) { return (unsigned int)strtoul(s,(char **)0,10); }
-static ZT_ALWAYS_INLINE int strToInt(const char *s) { return (int)strtol(s,(char **)0,10); }
-static ZT_ALWAYS_INLINE unsigned long strToULong(const char *s) { return strtoul(s,(char **)0,10); }
-static ZT_ALWAYS_INLINE long strToLong(const char *s) { return strtol(s,(char **)0,10); }
-static ZT_ALWAYS_INLINE unsigned long long strToU64(const char *s)
+ZT_ALWAYS_INLINE unsigned int strToUInt(const char *s) { return (unsigned int)strtoul(s,(char **)0,10); }
+ZT_ALWAYS_INLINE int strToInt(const char *s) { return (int)strtol(s,(char **)0,10); }
+ZT_ALWAYS_INLINE unsigned long strToULong(const char *s) { return strtoul(s,(char **)0,10); }
+ZT_ALWAYS_INLINE long strToLong(const char *s) { return strtol(s,(char **)0,10); }
+ZT_ALWAYS_INLINE unsigned long long strToU64(const char *s)
 {
 #ifdef __WINDOWS__
 	return (unsigned long long)_strtoui64(s,(char **)0,10);
@@ -210,7 +202,7 @@ static ZT_ALWAYS_INLINE unsigned long long strToU64(const char *s)
 	return strtoull(s,(char **)0,10);
 #endif
 }
-static ZT_ALWAYS_INLINE long long strTo64(const char *s)
+ZT_ALWAYS_INLINE long long strTo64(const char *s)
 {
 #ifdef __WINDOWS__
 	return (long long)_strtoi64(s,(char **)0,10);
@@ -218,11 +210,11 @@ static ZT_ALWAYS_INLINE long long strTo64(const char *s)
 	return strtoll(s,(char **)0,10);
 #endif
 }
-static ZT_ALWAYS_INLINE unsigned int hexStrToUInt(const char *s) { return (unsigned int)strtoul(s,(char **)0,16); }
-static ZT_ALWAYS_INLINE int hexStrToInt(const char *s) { return (int)strtol(s,(char **)0,16); }
-static ZT_ALWAYS_INLINE unsigned long hexStrToULong(const char *s) { return strtoul(s,(char **)0,16); }
-static ZT_ALWAYS_INLINE long hexStrToLong(const char *s) { return strtol(s,(char **)0,16); }
-static ZT_ALWAYS_INLINE unsigned long long hexStrToU64(const char *s)
+ZT_ALWAYS_INLINE unsigned int hexStrToUInt(const char *s) { return (unsigned int)strtoul(s,(char **)0,16); }
+ZT_ALWAYS_INLINE int hexStrToInt(const char *s) { return (int)strtol(s,(char **)0,16); }
+ZT_ALWAYS_INLINE unsigned long hexStrToULong(const char *s) { return strtoul(s,(char **)0,16); }
+ZT_ALWAYS_INLINE long hexStrToLong(const char *s) { return strtol(s,(char **)0,16); }
+ZT_ALWAYS_INLINE unsigned long long hexStrToU64(const char *s)
 {
 #ifdef __WINDOWS__
 	return (unsigned long long)_strtoui64(s,(char **)0,16);
@@ -230,7 +222,7 @@ static ZT_ALWAYS_INLINE unsigned long long hexStrToU64(const char *s)
 	return strtoull(s,(char **)0,16);
 #endif
 }
-static ZT_ALWAYS_INLINE long long hexStrTo64(const char *s)
+ZT_ALWAYS_INLINE long long hexStrTo64(const char *s)
 {
 #ifdef __WINDOWS__
 	return (long long)_strtoi64(s,(char **)0,16);
@@ -246,7 +238,7 @@ static ZT_ALWAYS_INLINE long long hexStrTo64(const char *s)
  * @param len Length in bytes
  * @return Non-cryptographic hash suitable for use in a hash table
  */
-static unsigned long ZT_ALWAYS_INLINE hashString(const void *restrict key,const unsigned int len)
+ZT_ALWAYS_INLINE unsigned long hashString(const void *restrict key,const unsigned int len)
 {
 	const uint8_t *p = reinterpret_cast<const uint8_t *>(key);
 	unsigned long h = 0;
@@ -262,13 +254,13 @@ static unsigned long ZT_ALWAYS_INLINE hashString(const void *restrict key,const
 }
 
 #ifdef __GNUC__
-static ZT_ALWAYS_INLINE unsigned int countBits(const uint8_t v) { return (unsigned int)__builtin_popcount((unsigned int)v); }
-static ZT_ALWAYS_INLINE unsigned int countBits(const uint16_t v) { return (unsigned int)__builtin_popcount((unsigned int)v); }
-static ZT_ALWAYS_INLINE unsigned int countBits(const uint32_t v) { return (unsigned int)__builtin_popcountl((unsigned long)v); }
-static ZT_ALWAYS_INLINE unsigned int countBits(const uint64_t v) { return (unsigned int)__builtin_popcountll((unsigned long long)v); }
+ZT_ALWAYS_INLINE unsigned int countBits(const uint8_t v) { return (unsigned int)__builtin_popcount((unsigned int)v); }
+ZT_ALWAYS_INLINE unsigned int countBits(const uint16_t v) { return (unsigned int)__builtin_popcount((unsigned int)v); }
+ZT_ALWAYS_INLINE unsigned int countBits(const uint32_t v) { return (unsigned int)__builtin_popcountl((unsigned long)v); }
+ZT_ALWAYS_INLINE unsigned int countBits(const uint64_t v) { return (unsigned int)__builtin_popcountll((unsigned long long)v); }
 #else
 template<typename T>
-static ZT_ALWAYS_INLINE unsigned int countBits(T v)
+ZT_ALWAYS_INLINE unsigned int countBits(T v)
 {
 	v = v - ((v >> 1) & (T)~(T)0/3);
 	v = (v & (T)~(T)0/15*3) + ((v >> 2) & (T)~(T)0/15*3);
@@ -278,9 +270,9 @@ static ZT_ALWAYS_INLINE unsigned int countBits(T v)
 #endif
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-static ZT_ALWAYS_INLINE uint8_t hton(uint8_t n) { return n; }
-static ZT_ALWAYS_INLINE int8_t hton(int8_t n) { return n; }
-static ZT_ALWAYS_INLINE uint16_t hton(uint16_t n)
+ZT_ALWAYS_INLINE uint8_t hton(uint8_t n) { return n; }
+ZT_ALWAYS_INLINE int8_t hton(int8_t n) { return n; }
+ZT_ALWAYS_INLINE uint16_t hton(uint16_t n)
 {
 #if defined(__GNUC__)
 #if defined(__FreeBSD__)
@@ -292,8 +284,8 @@ static ZT_ALWAYS_INLINE uint16_t hton(uint16_t n)
 	return htons(n);
 #endif
 }
-static ZT_ALWAYS_INLINE int16_t hton(int16_t n) { return (int16_t)Utils::hton((uint16_t)n); }
-static ZT_ALWAYS_INLINE uint32_t hton(uint32_t n)
+ZT_ALWAYS_INLINE int16_t hton(int16_t n) { return (int16_t)Utils::hton((uint16_t)n); }
+ZT_ALWAYS_INLINE uint32_t hton(uint32_t n)
 {
 #if defined(__GNUC__)
 #if defined(__FreeBSD__)
@@ -305,8 +297,8 @@ static ZT_ALWAYS_INLINE uint32_t hton(uint32_t n)
 	return htonl(n);
 #endif
 }
-static ZT_ALWAYS_INLINE int32_t hton(int32_t n) { return (int32_t)Utils::hton((uint32_t)n); }
-static ZT_ALWAYS_INLINE uint64_t hton(uint64_t n)
+ZT_ALWAYS_INLINE int32_t hton(int32_t n) { return (int32_t)Utils::hton((uint32_t)n); }
+ZT_ALWAYS_INLINE uint64_t hton(uint64_t n)
 {
 #if defined(__GNUC__)
 #if defined(__FreeBSD__)
@@ -327,16 +319,16 @@ static ZT_ALWAYS_INLINE uint64_t hton(uint64_t n)
 	);
 #endif
 }
-static ZT_ALWAYS_INLINE int64_t hton(int64_t n) { return (int64_t)hton((uint64_t)n); }
+ZT_ALWAYS_INLINE int64_t hton(int64_t n) { return (int64_t)hton((uint64_t)n); }
 #else
 template<typename T>
 static ZT_ALWAYS_INLINE T hton(T n) { return n; }
 #endif
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
-static ZT_ALWAYS_INLINE uint8_t ntoh(uint8_t n) { return n; }
-static ZT_ALWAYS_INLINE int8_t ntoh(int8_t n) { return n; }
-static ZT_ALWAYS_INLINE uint16_t ntoh(uint16_t n)
+ZT_ALWAYS_INLINE uint8_t ntoh(uint8_t n) { return n; }
+ZT_ALWAYS_INLINE int8_t ntoh(int8_t n) { return n; }
+ZT_ALWAYS_INLINE uint16_t ntoh(uint16_t n)
 {
 #if defined(__GNUC__)
 #if defined(__FreeBSD__)
@@ -348,8 +340,8 @@ static ZT_ALWAYS_INLINE uint16_t ntoh(uint16_t n)
 	return htons(n);
 #endif
 }
-static ZT_ALWAYS_INLINE int16_t ntoh(int16_t n) { return (int16_t)Utils::ntoh((uint16_t)n); }
-static ZT_ALWAYS_INLINE uint32_t ntoh(uint32_t n)
+ZT_ALWAYS_INLINE int16_t ntoh(int16_t n) { return (int16_t)Utils::ntoh((uint16_t)n); }
+ZT_ALWAYS_INLINE uint32_t ntoh(uint32_t n)
 {
 #if defined(__GNUC__)
 #if defined(__FreeBSD__)
@@ -361,8 +353,8 @@ static ZT_ALWAYS_INLINE uint32_t ntoh(uint32_t n)
 	return ntohl(n);
 #endif
 }
-static ZT_ALWAYS_INLINE int32_t ntoh(int32_t n) { return (int32_t)Utils::ntoh((uint32_t)n); }
-static ZT_ALWAYS_INLINE uint64_t ntoh(uint64_t n)
+ZT_ALWAYS_INLINE int32_t ntoh(int32_t n) { return (int32_t)Utils::ntoh((uint32_t)n); }
+ZT_ALWAYS_INLINE uint64_t ntoh(uint64_t n)
 {
 #if defined(__GNUC__)
 #if defined(__FreeBSD__)
@@ -383,13 +375,13 @@ static ZT_ALWAYS_INLINE uint64_t ntoh(uint64_t n)
 	);
 #endif
 }
-static ZT_ALWAYS_INLINE int64_t ntoh(int64_t n) { return (int64_t)ntoh((uint64_t)n); }
+ZT_ALWAYS_INLINE int64_t ntoh(int64_t n) { return (int64_t)ntoh((uint64_t)n); }
 #else
 template<typename T>
-static ZT_ALWAYS_INLINE T ntoh(T n) { return n; }
+ZT_ALWAYS_INLINE T ntoh(T n) { return n; }
 #endif
 
-static ZT_ALWAYS_INLINE uint64_t readUInt64(const void *const p)
+ZT_ALWAYS_INLINE uint64_t readUInt64(const void *const p)
 {
 #ifdef ZT_NO_TYPE_PUNNING
 	const uint8_t *const b = reinterpret_cast<const uint8_t *>(p);
@@ -407,7 +399,7 @@ static ZT_ALWAYS_INLINE uint64_t readUInt64(const void *const p)
 #endif
 }
 
-static ZT_ALWAYS_INLINE void putUInt64(void *const p,const uint64_t i)
+ZT_ALWAYS_INLINE void putUInt64(void *const p,const uint64_t i)
 {
 #ifdef ZT_NO_TYPE_PUNNING
 	uint8_t *const b = reinterpret_cast<uint8_t *>(p);

+ 0 - 18
osdep/OSUtils.cpp

@@ -510,24 +510,6 @@ std::string OSUtils::jsonString(const nlohmann::json &jv,const char *dfl)
 	return std::string((dfl) ? dfl : "");
 }
 
-std::string OSUtils::jsonBinFromHex(const nlohmann::json &jv)
-{
-	std::string s(jsonString(jv,""));
-	if (s.length() > 0) {
-		unsigned int buflen = (unsigned int)((s.length() / 2) + 1);
-		char *buf = new char[buflen];
-		try {
-			unsigned int l = Utils::unhex(s.c_str(),buf,buflen);
-			std::string b(buf,l);
-			delete [] buf;
-			return b;
-		} catch ( ... ) {
-			delete [] buf;
-		}
-	}
-	return std::string();
-}
-
 #endif // OMIT_JSON_SUPPORT
 
 // Used to convert HTTP header names to ASCII lower case

+ 0 - 1
osdep/OSUtils.hpp

@@ -292,7 +292,6 @@ public:
 	static uint64_t jsonIntHex(const nlohmann::json &jv,const uint64_t dfl);
 	static bool jsonBool(const nlohmann::json &jv,const bool dfl);
 	static std::string jsonString(const nlohmann::json &jv,const char *dfl);
-	static std::string jsonBinFromHex(const nlohmann::json &jv);
 #endif // OMIT_JSON_SUPPORT
 
 private:

+ 1 - 1
osdep/Thread.hpp

@@ -149,7 +149,7 @@ public:
 		pthread_attr_init(&tattr);
 		// This corrects for systems with abnormally small defaults (musl) and also
 		// shrinks the stack on systems with large defaults to save a bit of memory.
-		pthread_attr_setstacksize(&tattr,ZT_THREAD_MIN_STACK_SIZE);
+		pthread_attr_setstacksize(&tattr,1048576);
 		if (pthread_create(&t._tid,&tattr,&___zt_threadMain<C>,instance)) {
 			pthread_attr_destroy(&tattr);
 			throw std::runtime_error("pthread_create() failed, unable to create thread");

+ 3 - 9
root/root.cpp

@@ -230,7 +230,7 @@ static ZT_ALWAYS_INLINE std::array< uint64_t,2 > ip6ToH128(const InetAddress &ip
 
 static void handlePacket(const int v4s,const int v6s,const InetAddress *const ip,Packet &pkt)
 {
-	char ipstr[128],ipstr2[128],astr[32],astr2[32],tmpstr[256];
+	char ipstr[128];
 	const bool fragment = pkt[ZT_PACKET_FRAGMENT_IDX_FRAGMENT_INDICATOR] == ZT_PACKET_FRAGMENT_INDICATOR;
 	const Address source(pkt.source());
 	const Address dest(pkt.destination());
@@ -249,10 +249,8 @@ static void handlePacket(const int v4s,const int v6s,const InetAddress *const ip
 				{
 					std::lock_guard<std::mutex> pbi_l(s_peersByIdentity_l);
 					auto pById = s_peersByIdentity.find(id);
-					if (pById != s_peersByIdentity.end()) {
+					if (pById != s_peersByIdentity.end())
 						peer = pById->second;
-						//printf("%s has %s (known (1))" ZT_EOL_S,ip->toString(ipstr),source().toString(astr));
-					}
 				}
 				if (peer) {
 					if (!pkt.dearmor(peer->key)) {
@@ -503,13 +501,11 @@ static void handlePacket(const int v4s,const int v6s,const InetAddress *const ip
 	bool introduce = false;
 	if (fragment) {
 		if ((hops = (int)reinterpret_cast<Packet::Fragment *>(&pkt)->incrementHops()) > s_relayMaxHops) {
-			//printf("%s refused to forward to %s: max hop count exceeded" ZT_EOL_S,ip->toString(ipstr),dest.toString(astr));
 			s_discardedForwardRate.log(now,pkt.size());
 			return;
 		}
 	} else {
 		if ((hops = (int)pkt.incrementHops()) > s_relayMaxHops) {
-			//printf("%s refused to forward to %s: max hop count exceeded" ZT_EOL_S,ip->toString(ipstr),dest.toString(astr));
 			s_discardedForwardRate.log(now,pkt.size());
 			return;
 		}
@@ -552,7 +548,6 @@ static void handlePacket(const int v4s,const int v6s,const InetAddress *const ip
 			for(auto a=sources->second.begin();a!=sources->second.end();++a) {
 				for(auto b=toAddrs.begin();b!=toAddrs.end();++b) {
 					if (((*a)->ip6)&&(b->second->ip6)) {
-						//printf("* introducing %s(%s) to %s(%s)" ZT_EOL_S,ip->toString(ipstr),source.toString(astr),b->second->ip6.toString(ipstr2),dest.toString(astr2));
 
 						// Introduce source to destination (V6)
 						Packet outp(source,s_self.address(),Packet::VERB_RENDEZVOUS);
@@ -581,7 +576,6 @@ static void handlePacket(const int v4s,const int v6s,const InetAddress *const ip
 						b->second->lastSend = now;
 					}
 					if (((*a)->ip4)&&(b->second->ip4)) {
-						//printf("* introducing %s(%s) to %s(%s)" ZT_EOL_S,ip->toString(ipstr),source.toString(astr),b->second->ip4.toString(ipstr2),dest.toString(astr2));
 
 						// Introduce source to destination (V4)
 						Packet outp(source,s_self.address(),Packet::VERB_RENDEZVOUS);
@@ -1134,7 +1128,7 @@ int main(int argc,char **argv)
 				for(auto a=s_multicastSubscriptions.begin();a!=s_multicastSubscriptions.end();) {
 					for(auto b=a->second.begin();b!=a->second.end();) {
 						for(auto c=b->second.begin();c!=b->second.end();) {
-							if ((now - c->second) > ZT_MULTICAST_LIKE_EXPIRE)
+							if ((now - c->second) > ZT_PEER_ACTIVITY_TIMEOUT)
 								b->second.erase(c++);
 							else ++c;
 						}