From 320253517b92e2563a3617ea0e91fcf2e09f0dcf Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Mon, 11 Mar 2019 17:17:35 -0700 Subject: [PATCH] RX/TX improvements, build process improvements --- CMakeLists.txt | 112 +++++++++++++++++++++++++++++++++++------------ Makefile | 1 + ports/dist.sh | 7 ++- src/Controls.cpp | 1 + src/Service.cpp | 39 ++++++++--------- src/Sockets.cpp | 2 +- 6 files changed, 110 insertions(+), 52 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d0378a5..ded5e91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,6 @@ cmake_minimum_required (VERSION 3.0) project (zt) -set (CMAKE_VERBOSE_MAKEFILE OFF) - # ----------------------------------------------------------------------------- # | PLATFORM/FEATURE AND IDE DETECTION | # ----------------------------------------------------------------------------- @@ -45,10 +43,12 @@ endif () # ----------------------------------------------------------------------------- if (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "debug") + set (CMAKE_VERBOSE_MAKEFILE ON) set (CMAKE_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin) set (LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/lib) endif() if (CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "release") + set (CMAKE_VERBOSE_MAKEFILE OFF) set (CMAKE_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin) set (LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/lib) endif() @@ -81,34 +81,57 @@ endif () # | FLAGS | # ----------------------------------------------------------------------------- -set (SILENCE "-Wno-unused-parameter \ - -Wno-format \ - -Wno-tautological-constant-out-of-range-compare \ - -Wno-macro-redefined -Wno-parentheses-equality \ - -Wno-sign-compare \ - -Wno-unused-parameter \ - -Wno-unused-variable \ - -Wno-missing-field-initializers") +set (SILENCE "${SILENCE} -Wno-unused-parameter") +set (SILENCE "${SILENCE} -Wno-format") +set (SILENCE "${SILENCE} -Wno-tautological-constant-out-of-range-compare ") +set (SILENCE "${SILENCE} -Wno-macro-redefined") +set (SILENCE "${SILENCE} -Wno-parentheses-equality") +set (SILENCE "${SILENCE} -Wno-sign-compare") +set (SILENCE "${SILENCE} -Wno-unused-variable") +set (SILENCE "${SILENCE} -Wno-missing-field-initializers") +set (SILENCE "${SILENCE} -Wno-unused-parameter") -set (LIBZT_FLAGS "-D_USING_LWIP_DEFINITIONS_=1 -DZT_SDK") -set (ZTCORE_FLAGS "-DZT_USE_MINIUPNPC=1 -DZT_SOFTWARE_UPDATE_DEFAULT=0") +set (ZT_FLAGS "${ZT_FLAGS} -DZT_USE_MINIUPNPC=1") +set (ZT_FLAGS "${ZT_FLAGS} -DZT_SOFTWARE_UPDATE_DEFAULT=0") +set (ZT_FLAGS "${ZT_FLAGS} -D_USING_LWIP_DEFINITIONS_=0") +set (ZT_FLAGS "${ZT_FLAGS} -DZT_SDK=1") + +set (DEBUG_OPTIMIZATION "-O3") +set (RELEASE_OPTIMIZATION "-O3") if (BUILDING_WIN) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc -DNOMINMAX") else () set (CMAKE_C_FLAGS - "${SILENCE} ${CMAKE_C_FLAGS} ${LIBZT_FLAGS} -fstack-protector -O3") + "${CMAKE_C_FLAGS} \ + ${ZT_FLAGS} \ + -fstack-protector") + set (CMAKE_C_FLAGS_DEBUG - "${CMAKE_C_FLAGS_DEBUG} ${LIBZT_FLAGS} -DLWIP_DEBUG=1 -DLIBZT_DEBUG=1") + "${CMAKE_C_FLAGS_DEBUG} \ + ${DEBUG_OPTIMIZATION} \ + -DLWIP_DEBUG=1 -DLIBZT_DEBUG=1") + set (CMAKE_C_FLAGS_RELEASE - "${SILENCE} ${CMAKE_C_FLAGS_RELEASE} ${LIBZT_FLAGS} -fstack-protector -O3") + "${SILENCE} \ + ${CMAKE_C_FLAGS_RELEASE} \ + ${RELEASE_OPTIMIZATION} \ + -fstack-protector") + set (CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} ${SILENCE} ${LIBZT_FLAGS} -Wall -Wextra -std=c++11 -O3") + "${CMAKE_CXX_FLAGS} \ + ${ZT_FLAGS} -Wall -Wextra -std=c++11") + set (CMAKE_CXX_FLAGS_DEBUG - "${CMAKE_CXX_FLAGS_DEBUG} ${LIBZT_FLAGS} -std=c++11 -DLWIP_DEBUG=1 -DLIBZT_DEBUG=1") + "${CMAKE_CXX_FLAGS_DEBUG} \ + ${DEBUG_OPTIMIZATION} \ + -DLWIP_DEBUG=1 -DLIBZT_DEBUG=1") + set (CMAKE_CXX_FLAGS_RELEASE - "${CMAKE_CXX_FLAGS_RELEASE} ${SILENCE} ${LIBZT_FLAGS} -std=c++11 -O3") + "${CMAKE_CXX_FLAGS_RELEASE} \ + ${SILENCE} \ + ${RELEASE_OPTIMIZATION}") endif () if (BUILDING_LINUX AND NOT BUILDING_ANDROID) @@ -119,7 +142,7 @@ endif () # | JNI | # ----------------------------------------------------------------------------- -if (SDK_JNI) +if (SDK_JNI OR BUILDING_ANDROID) MESSAGE (STATUS "Looking for JNI") if (BUILDING_WIN) @@ -155,7 +178,7 @@ if (SDK_JNI) message (STATUS "JNI not found") endif () - if ((BUILDING_ANDROID OR JNI) AND JNI_FOUND) + if (JNI_FOUND) add_definitions (-DSDK_JNI=1) endif () endif () # SDK_JNI @@ -268,7 +291,7 @@ endif () # zto_obj add_library (zto_obj OBJECT ${zerotiercoreSrcGlob}) set_target_properties (zto_obj PROPERTIES - COMPILE_FLAGS "${SILENCE} -std=c++11 -DZT_USE_MINIUPNPC=1 -DZT_SOFTWARE_UPDATE_DEFAULT=0") + COMPILE_FLAGS "${ZT_FLAGS}") if (BUILDING_WIN) target_link_libraries (zto_obj ws2_32) target_link_libraries (zto_obj ${shlwapi_LIBRARY_PATH}) @@ -282,11 +305,14 @@ set_target_properties (libnatpmp_obj PROPERTIES COMPILE_FLAGS "") # miniupnpc_obj add_library (miniupnpc_obj OBJECT ${libminiupnpcSrcGlob}) target_compile_definitions(miniupnpc_obj - PRIVATE MACOSX ZT_USE_MINIUPNPC MINIUPNP_STATICLIB _DARWIN_C_SOURCE + PRIVATE ZT_USE_MINIUPNPC MINIUPNP_STATICLIB _DARWIN_C_SOURCE MINIUPNPC_SET_SOCKET_TIMEOUT MINIUPNPC_GET_SRC_ADDR _BSD_SOURCE _DEFAULT_SOURCE MINIUPNPC_VERSION_STRING=\"2.0\" UPNP_VERSION_STRING=\"UPnP/1.1\" ENABLE_STRNATPMPERR OS_STRING=\"Darwin/15.0.0\") +if (BUILDING_DARWIN AND NOT IOS_FRAMEWORK) + target_compile_definitions(miniupnpc_obj PRIVATE MACOSX) +endif () # lwip_obj add_library (lwip_obj OBJECT ${lwipSrcGlob}) @@ -294,13 +320,41 @@ set_target_properties (lwip_obj PROPERTIES COMPILE_FLAGS "") # libzt_obj add_library (libzt_obj OBJECT ${libztSrcGlob}) -set_target_properties (libzt_obj PROPERTIES COMPILE_FLAGS "-std=c++11") +set_target_properties (libzt_obj PROPERTIES COMPILE_FLAGS "${ZT_FLAGS}") +# PIC + +# zto_pic +add_library (zto_pic ${zerotiercoreSrcGlob}) +set_target_properties (zto_pic PROPERTIES + COMPILE_FLAGS "${ZT_FLAGS}" + POSITION_INDEPENDENT_CODE ON) + +# libnatpmp_pic +add_library (natpmp_pic ${libnatpmpSrcGlob}) +set_target_properties (natpmp_pic PROPERTIES + POSITION_INDEPENDENT_CODE ON) + +# miniupnpc_pic +add_library (miniupnpc_pic ${libminiupnpcSrcGlob}) +target_compile_definitions(miniupnpc_pic + PRIVATE MACOSX ZT_USE_MINIUPNPC MINIUPNP_STATICLIB _DARWIN_C_SOURCE + MINIUPNPC_SET_SOCKET_TIMEOUT MINIUPNPC_GET_SRC_ADDR _BSD_SOURCE + _DEFAULT_SOURCE MINIUPNPC_VERSION_STRING=\"2.0\" + UPNP_VERSION_STRING=\"UPnP/1.1\" ENABLE_STRNATPMPERR + OS_STRING=\"Darwin/15.0.0\") +set_target_properties (miniupnpc_pic PROPERTIES + POSITION_INDEPENDENT_CODE ON) + +# lwip_pic add_library (lwip_pic ${lwipSrcGlob}) set_target_properties (lwip_pic PROPERTIES POSITION_INDEPENDENT_CODE ON) -add_library (zto_pic ${zerotiercoreSrcGlob}) -set_target_properties (zto_pic PROPERTIES COMPILE_FLAGS "${SILENCE} -std=c++11") -set_target_properties (zto_pic PROPERTIES POSITION_INDEPENDENT_CODE ON) + +# libzt_pic +add_library (zt_pic ${libztSrcGlob}) +set_target_properties (zt_pic PROPERTIES + COMPILE_FLAGS "${ZT_FLAGS}" + POSITION_INDEPENDENT_CODE ON) # ----------------------------------------------------------------------------- # | BUILD TARGETS (FINAL PRODUCT) | @@ -339,12 +393,12 @@ $ ${libztSrcGlob}) set_target_properties (${STATIC_LIB_NAME} PROPERTIES OUTPUT_NAME zt LIBRARY_OUTPUT_DIRECTORY ${INTERMEDIATE_LIBRARY_OUTPUT_PATH}) +set_target_properties (${STATIC_LIB_NAME} PROPERTIES COMPILE_FLAGS "${ZT_FLAGS}") # libzt.so/dylib/dll add_library (${DYNAMIC_LIB_NAME} SHARED ${libztSrcGlob}) -message (STATUS ${libztSrcGlob}) -target_link_libraries (${DYNAMIC_LIB_NAME} lwip_pic zto_pic) -set_target_properties (${DYNAMIC_LIB_NAME} PROPERTIES COMPILE_FLAGS "${SILENCE} -std=c++11 -DZT_SDK") +target_link_libraries (${DYNAMIC_LIB_NAME} zt_pic lwip_pic zto_pic natpmp_pic miniupnpc_pic) +set_target_properties (${DYNAMIC_LIB_NAME} PROPERTIES COMPILE_FLAGS "${ZT_FLAGS}") set_target_properties (${DYNAMIC_LIB_NAME} PROPERTIES OUTPUT_NAME ${DYNAMIC_LIB_OUTPUT_NAME} WINDOWS_EXPORT_ALL_SYMBOLS true) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) diff --git a/Makefile b/Makefile index de2096f..63a26bc 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,7 @@ patch: .PHONY: clean clean: + -rm -rf ports/android/app/build -rm -rf tmp lib bin products -find ports -name ".externalNativeBuild" -exec rm -r "{}" \; -rm -f *.o *.s *.exp *.lib *.core core diff --git a/ports/dist.sh b/ports/dist.sh index 70b78d6..d5eabf3 100755 --- a/ports/dist.sh +++ b/ports/dist.sh @@ -121,7 +121,7 @@ host_jar() # Build dynamic library BUILD_DIR=$(pwd)/tmp/${NORMALIZED_OSNAME}-$(uname -m)-jni-$1 UPPERCASE_CONFIG="$(tr '[:lower:]' '[:upper:]' <<< ${1:0:1})${1:1}" - cmake -H. -B$BUILD_DIR -DCMAKE_BUILD_TYPE=$UPPERCASE_CONFIG "-DJNI=1" + cmake -H. -B$BUILD_DIR -DCMAKE_BUILD_TYPE=$UPPERCASE_CONFIG -DSDK_JNI=ON "-DSDK_JNI=1" cmake --build $BUILD_DIR $BUILD_CONCURRENCY # Copy dynamic library from previous build step # And, remove any lib that may exist prior. We don't want accidental successes @@ -186,7 +186,7 @@ android() mkdir -p $LIB_OUTPUT_DIR # Build UPPERCASE_CONFIG="$(tr '[:lower:]' '[:upper:]' <<< ${1:0:1})${1:1}" - CMAKE_FLAGS=$CMAKE_FLAGS" -DSDK_JNI=1" + CMAKE_FLAGS="-DSDK_JNI=1 -DSDK_JNI=ON" cd $ANDROID_PROJ_DIR ./gradlew assemble$UPPERCASE_CONFIG # assembleRelease / assembleDebug mv $ANDROID_PROJ_DIR/app/build/outputs/aar/app-$1.aar \ @@ -200,8 +200,11 @@ cleanup() find $(pwd)/lib -type f -name 'liblwip_pic.a' -exec rm {} + find $(pwd)/lib -type f -name 'liblwip.a' -exec rm {} + find $(pwd)/lib -type f -name 'libminiupnpc.a' -exec rm {} + + find $(pwd)/lib -type f -name 'libminiupnpc_pic.a' -exec rm {} + find $(pwd)/lib -type f -name 'libnatpmp.a' -exec rm {} + + find $(pwd)/lib -type f -name 'libnatpmp_pic.a' -exec rm {} + find $(pwd)/lib -type f -name 'libzto_pic.a' -exec rm {} + + find $(pwd)/lib -type f -name 'libzt_pic.a' -exec rm {} + find $(pwd)/lib -type f -name 'libzerotiercore.a' -exec rm {} + } diff --git a/src/Controls.cpp b/src/Controls.cpp index a78208a..faa4426 100644 --- a/src/Controls.cpp +++ b/src/Controls.cpp @@ -327,6 +327,7 @@ void *_zts_run_callbacks(void *thread_id) jint rs = jvm->DetachCurrentThread(); pthread_exit(0); #endif + return NULL; } ////////////////////////////////////////////////////////////////////////////// diff --git a/src/Service.cpp b/src/Service.cpp index 9908c3a..7d10683 100644 --- a/src/Service.cpp +++ b/src/Service.cpp @@ -275,6 +275,8 @@ public: /* Packet input concurrency is disabled intentially since it would force the user-space network stack to constantly re-order frames, resulting in lower RX performance */ + + /* _incomingPacketConcurrency = 1; // std::max((unsigned long)1,std::min((unsigned long)16,(unsigned long)std::thread::hardware_concurrency())); char *envPool = std::getenv("INCOMING_PACKET_CONCURRENCY"); @@ -311,7 +313,7 @@ public: } } })); - } + }*/ } virtual ~OneServiceImpl() @@ -713,27 +715,24 @@ public: inline void phyOnDatagram(PhySocket *sock,void **uptr,const struct sockaddr *localAddr,const struct sockaddr *from,void *data,unsigned long len) { - const uint64_t now = OSUtils::now(); if ((len >= 16)&&(reinterpret_cast(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(); + _lastDirectReceiveFromGlobal = OSUtils::now(); + const ZT_ResultCode rc = _node->processWirePacket( + (void *)0, + OSUtils::now(), + reinterpret_cast(sock), + reinterpret_cast(from), // Phy<> uses sockaddr_storage, so it'll always be that big + 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(sock); - ZT_FAST_MEMCPY(&(pkt->from),from,sizeof(struct sockaddr_storage)); - pkt->size = (unsigned int)len; - ZT_FAST_MEMCPY(pkt->data,data,len); - - _incomingPacketQueue.postLimit(pkt,16 * _incomingPacketConcurrency); } inline void phyOnTcpConnect(PhySocket *sock,void **uptr,bool success) {} diff --git a/src/Sockets.cpp b/src/Sockets.cpp index d1ec9e6..76c5bad 100644 --- a/src/Sockets.cpp +++ b/src/Sockets.cpp @@ -152,7 +152,7 @@ JNIEXPORT jint JNICALL Java_com_zerotier_libzt_ZeroTier_accept( { struct sockaddr_storage ss; socklen_t addrlen = sizeof(struct sockaddr_storage); - int retval =zts_accept(fd, (struct sockaddr *)&ss, &addrlen); + int retval = zts_accept(fd, (struct sockaddr *)&ss, &addrlen); ss2zta(env, &ss, addr); return retval > -1 ? retval : -(zts_errno); }