diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e3792c84..be34c7e51 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,3 @@ -# CMake build script for ZeroTier One - cmake_minimum_required (VERSION 3.8) if(${CMAKE_VERSION} VERSION_LESS 3.15) @@ -13,17 +11,11 @@ if(WIN32) set(CMAKE_SYSTEM_VERSION "7" CACHE STRING INTERNAL FORCE) endif(WIN32) -# -# ZeroTier One Version Config -# -set(ZEROTIER_ONE_VERSION_MAJOR 1 CACHE INTERNAL "") -set(ZEROTIER_ONE_VERSION_MINOR 9 CACHE INTERNAL "") +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 "") -# -# Set a default build type if none was specified -# set(default_build_type "Release") if(EXISTS "${CMAKE_SOURCE_DIR}/.git") set(default_build_type "Debug") @@ -59,8 +51,8 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_definitions(-DZT_TRACE) endif(CMAKE_BUILD_TYPE STREQUAL "Debug") -project(zerotier-one - DESCRIPTION "ZeroTier One" +project(zerotier + DESCRIPTION "ZeroTier Network Hypervisor" LANGUAGES CXX C) if(WIN32) @@ -141,20 +133,20 @@ endif() add_subdirectory(node) add_subdirectory(controller) add_subdirectory(osdep) -#add_subdirectory(service) add_subdirectory(root) +add_subdirectory(go/native) -if(WIN32) - add_subdirectory("windows/WinUI") - add_subdirectory("windows/copyutil") - add_definitions(-DNOMINMAX) -endif(WIN32) +#if(WIN32) +# add_subdirectory("windows/WinUI") +# add_subdirectory("windows/copyutil") +# add_definitions(-DNOMINMAX) +#endif(WIN32) -set(libs -# zt_service +set( zt_osdep zt_core zt_controller + zt_go_native ) configure_file( @@ -162,40 +154,47 @@ configure_file( ${CMAKE_BINARY_DIR}/version.h ) -set(src - one.cpp - "ext/http-parser/http_parser.c" -) -set(headers - "ext/http-parser/http_parser.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) - set(src - ${src} - "windows/ZeroTierOne/ServiceBase.cpp" - "windows/ZeroTierOne/ServiceInstaller.cpp" - "windows/ZeroTierOne/ZeroTierOneService.cpp" - "windows/ZeroTierOne/ZeroTierOne.rc" - ) - set(headers - ${headers} - "windows/ZeroTierOne/ServiceBase.h" - "windows/ZeroTierOne/ServiceInstaller.h" - "windows/ZeroTierOne/ZeroTierOneService.h" - ) else(WIN32) - set(libs ${libs} pthread resolv) + set(libs ${libs} pthread) endif(WIN32) -if(BUILD_CENTRAL_CONTROLLER) - set(libs ${libs} rabbitmq-static ${PostgreSQL_LIBRARIES}) -endif(BUILD_CENTRAL_CONTROLLER) +#if(WIN32) +# set(libs ${libs} wsock32 ws2_32 rpcrt4 iphlpapi) +# set(src +# ${src} +# "windows/ZeroTierOne/ServiceBase.cpp" +# "windows/ZeroTierOne/ServiceInstaller.cpp" +# "windows/ZeroTierOne/ZeroTierOneService.cpp" +# "windows/ZeroTierOne/ZeroTierOne.rc" +# ) +# set(headers +# ${headers} +# "windows/ZeroTierOne/ServiceBase.h" +# "windows/ZeroTierOne/ServiceInstaller.h" +# "windows/ZeroTierOne/ZeroTierOneService.h" +# ) +#else(WIN32) +# set(libs ${libs} pthread resolv) +#endif(WIN32) -add_executable(${PROJECT_NAME} ${src} ${headers}) -target_link_libraries(${PROJECT_NAME} ${libs}) -target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_BINARY_DIR}) +#if(BUILD_CENTRAL_CONTROLLER) +# set(libs ${libs} rabbitmq-static ${PostgreSQL_LIBRARIES}) +#endif(BUILD_CENTRAL_CONTROLLER) + +#add_executable(${PROJECT_NAME} ${src} ${headers}) +#target_link_libraries(${PROJECT_NAME} ${libs}) +#target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_BINARY_DIR}) add_executable(zerotier-selftest selftest.cpp) -target_link_libraries(zerotier-selftest ${libs}) +target_link_libraries(zerotier-selftest ${libs} zt_core zt_osdep) +target_compile_features(zerotier-selftest PUBLIC cxx_std_11) diff --git a/go/native/GoGlue.cpp b/go/native/GoGlue.cpp index 04451c880..6647284bc 100644 --- a/go/native/GoGlue.cpp +++ b/go/native/GoGlue.cpp @@ -124,6 +124,7 @@ static int ZT_GoNode_VirtualNetworkConfigFunction( if (cfg) ev.data.nconf.conf = *cfg; reinterpret_cast(uptr)->eq.post(ev); + return 0; } static void ZT_GoNode_VirtualNetworkFrameFunction( @@ -218,7 +219,7 @@ static ZT_ALWAYS_INLINE void doUdpSend(ZT_SOCKET sock,const struct sockaddr_stor } } -static void ZT_GoNode_WirePacketSendFunction( +static int ZT_GoNode_WirePacketSendFunction( ZT_Node *node, void *uptr, void *tptr, @@ -242,6 +243,7 @@ static void ZT_GoNode_WirePacketSendFunction( } } } + return 0; } static int ZT_GoNode_PathCheckFunction( @@ -291,14 +293,15 @@ extern "C" ZT_GoNode *ZT_GoNode_new( { try { struct ZT_Node_Callbacks cb; - cb.virtualNetworkConfigFunction = &ZT_GoNode_VirtualNetworkConfigFunction; - cb.virtualNetworkFrameFunction = &ZT_GoNode_VirtualNetworkFrameFunction; - cb.eventCallback = &ZT_GoNode_EventCallback; cb.statePutFunction = &ZT_GoNode_StatePutFunction; cb.stateGetFunction = &ZT_GoNode_StateGetFunction; + cb.wirePacketSendFunction = &ZT_GoNode_WirePacketSendFunction; + cb.virtualNetworkFrameFunction = &ZT_GoNode_VirtualNetworkFrameFunction; + cb.virtualNetworkConfigFunction = &ZT_GoNode_VirtualNetworkConfigFunction; + cb.eventCallback = &ZT_GoNode_EventCallback; + cb.dnsResolver = &ZT_GoNode_DNSResolver; cb.pathCheckFunction = &ZT_GoNode_PathCheckFunction; cb.pathLookupFunction = &ZT_GoNode_PathLookupFunction; - cb.dnsResolver = &ZT_GoNode_DNSResolver; ZT_GoNode_Impl *gn = new ZT_GoNode_Impl; const int64_t now = OSUtils::now(); @@ -334,17 +337,14 @@ extern "C" void ZT_GoNode_delete(ZT_GoNode *gn) sd.type = ZT_GONODE_EVENT_SHUTDOWN; gn->eq.post(sd); - std::vector th; gn->threads_l.lock(); for(auto t=gn->threads.begin();t!=gn->threads.end();++t) { t->second.run = false; shutdown(t->first,SHUT_RDWR); close(t->first); - th.emplace_back(t->second.thr); + t->second.thr.join(); } gn->threads_l.unlock(); - for(auto t=th.begin();t!=th.end();++t) - t->join(); gn->taps_l.lock(); for(auto t=gn->taps.begin();t!=gn->taps.end();++t) @@ -518,9 +518,10 @@ extern "C" int ZT_GoNode_phyStopListen(ZT_GoNode *gn,const char *dev,const char } else ++t; } } + return 0; } -extern "C" int ZT_GoNode_waitForEvent(ZT_GoNode *gn,ZT_GoNodeEvent *ev) +extern "C" void ZT_GoNode_waitForEvent(ZT_GoNode *gn,ZT_GoNodeEvent *ev) { gn->eq.get(*ev); } diff --git a/go/native/GoGlue.h b/go/native/GoGlue.h index cd94b799c..929ec6f25 100644 --- a/go/native/GoGlue.h +++ b/go/native/GoGlue.h @@ -45,7 +45,7 @@ struct ZT_GoNodeEvent_Impl { #ifdef __cplusplus inline ZT_GoNodeEvent_Impl() { memset(reinterpret_cast(this),0,sizeof(ZT_GoNodeEvent_Impl)); } - inline ZT_GoNodeEvent_Impl(const ZT_GoNodeEvent &ev) { memcpy(reinterpret_cast(this),reinterpret_cast(&ev),sizeof(ZT_GoNodeEvent_Impl)); } + inline ZT_GoNodeEvent_Impl(const ZT_GoNodeEvent_Impl &ev) { memcpy(reinterpret_cast(this),reinterpret_cast(&ev),sizeof(ZT_GoNodeEvent_Impl)); } inline ZT_GoNodeEvent_Impl &operator=(const ZT_GoNodeEvent_Impl &ev) { memcpy(reinterpret_cast(this),reinterpret_cast(&ev),sizeof(ZT_GoNodeEvent_Impl)); return *this; } #endif @@ -106,7 +106,7 @@ int ZT_GoNode_phyStartListen(ZT_GoNode *gn,const char *dev,const char *ip,const /* Close all listener threads for a given local IP and port */ int ZT_GoNode_phyStopListen(ZT_GoNode *gn,const char *dev,const char *ip,const int port); -int ZT_GoNode_waitForEvent(ZT_GoNode *gn,ZT_GoNodeEvent *ev); +void ZT_GoNode_waitForEvent(ZT_GoNode *gn,ZT_GoNodeEvent *ev); ZT_GoTap *ZT_GoNode_join(ZT_GoNode *gn,uint64_t nwid); diff --git a/go/pkg/ztnode/node.go b/go/pkg/ztnode/node.go index 763fdea46..bab6fe58f 100644 --- a/go/pkg/ztnode/node.go +++ b/go/pkg/ztnode/node.go @@ -14,10 +14,10 @@ package ztnode //#cgo CFLAGS: -O3 -//#cgo LDFLAGS: ${SRCDIR}/../../../build/node/libzt_core.a -lc++ +//#cgo LDFLAGS: ${SRCDIR}/../../../build/node/libzt_core.a ${SRCDIR}/../../../build/go/native/libzt_go_native.a -lc++ //#define ZT_CGO 1 //#include -//#include "../../../include/ZeroTierCore.h" +//#include "../../native/GoGlue.h" //#if __has_include("../../../version.h") //#include "../../../version.h" //#else @@ -27,6 +27,7 @@ package ztnode //#define ZEROTIER_ONE_VERSION_BUILD 255 //#endif import "C" +import "sync" const ( // CoreVersionMajor is the major version of the ZeroTier core @@ -44,5 +45,11 @@ const ( // Node is an instance of a ZeroTier node type Node struct { - node *C.ZT_Node + gn *C.ZT_GoNode + zn *C.ZT_Node } + +var ( + nodesByUserPtr map[uintptr]*Node + nodesByUserPtrLock sync.Mutex +) diff --git a/osdep/OSUtils.cpp b/osdep/OSUtils.cpp index 8b223e2c5..7cbf78ba7 100644 --- a/osdep/OSUtils.cpp +++ b/osdep/OSUtils.cpp @@ -30,15 +30,6 @@ #include #include #include -#include -#include -#include -#ifndef C_IN -#define C_IN ns_c_in -#endif -#ifndef T_TXT -#define T_TXT ns_t_txt -#endif #endif #ifdef __WINDOWS__ @@ -300,54 +291,6 @@ int64_t OSUtils::getFileSize(const char *path) return -1; } -std::vector OSUtils::resolveTxt(const char *host) -{ - static std::atomic_bool libresolvInitialized(false); - if (!libresolvInitialized.exchange(true)) - res_init(); - - std::vector results; - - uint8_t answer[32768]; - char name[1024]; - int alen = res_search(host,C_IN,T_TXT,answer,sizeof(answer)); - if ((alen > 12)&&(alen < sizeof(answer))) { - uint8_t *pptr = answer + 12; - uint8_t *const end = answer + alen; - int explen = dn_expand(answer,end,pptr,name,sizeof(name)); - if (explen > 0) { - pptr += explen; - if ((pptr + 2) >= end) return results; - unsigned int rtype = ((unsigned int)pptr[0] << 8) | (unsigned int)pptr[1]; - if (rtype == T_TXT) { - pptr += 4; - if (pptr >= end) return results; - while (pptr < end) { - explen = dn_expand(answer,end,pptr,name,sizeof(name)); - if (explen > 0) { - pptr += explen; - if ((pptr + 2) >= end) return results; - rtype = ((unsigned int)pptr[0] << 8) | (unsigned int)pptr[1]; - pptr += 10; - if (pptr >= end) return results; - unsigned int elen = *(pptr++); - if (elen) { - if ((pptr + elen) > end) return results; - if (rtype == T_TXT) - results.push_back(std::string((const char *)pptr,elen)); - pptr += elen; - } - } else { - return results; - } - } - } - } - } - - return results; -} - bool OSUtils::readFile(const char *path,std::string &buf) { char tmp[16384]; diff --git a/osdep/OSUtils.hpp b/osdep/OSUtils.hpp index 77786cb12..30b34115c 100644 --- a/osdep/OSUtils.hpp +++ b/osdep/OSUtils.hpp @@ -185,14 +185,6 @@ public: */ static int64_t getFileSize(const char *path); - /** - * Get full DNS TXT results - * - * @param name DNS FQDN - * @return TXT record result(s) or empty on error or not found - */ - static std::vector resolveTxt(const char *name); - /** * @return Current time in milliseconds since epoch */ diff --git a/selftest.cpp b/selftest.cpp index ee7e1609a..c1a6b9dff 100644 --- a/selftest.cpp +++ b/selftest.cpp @@ -620,31 +620,6 @@ static int testIdentity() } } - /* - try { - std::cout << "[identity] Testing Locator and DNS TXT encoding... "; std::cout.flush(); - uint8_t dnsPub[ZT_ECC384_PUBLIC_KEY_SIZE],dnsPriv[ZT_ECC384_PRIVATE_KEY_SIZE]; - ECC384GenerateKey(dnsPub,dnsPriv); - std::unique_ptr l(new Locator()); - std::unique_ptr ti(new Identity()); - ti->generate(Identity::C25519); - l->add(InetAddress("127.0.0.1/9993")); - l->add(InetAddress("cafe:babe:face:dbad:deca:f::1/9993")); - l->finish(*ti,OSUtils::now()); - l->sign(*ti); - auto tr = l->makeTxtRecords(dnsPub,dnsPriv); - std::unique_ptr l2(new Locator()); - if (!l2->decodeTxtRecords(tr.begin(),tr.end())) { - std::cout << "FAILED (decode TXT records returned false)" ZT_EOL_S; - return -1; - } - std::cout << "OK" ZT_EOL_S; - } catch (int e) { - std::cout << "FAILED (threw integer exception " << e << ")" ZT_EOL_S; - return -1; - } - */ - return 0; }