From 0b4d78704252aa58c8ed26e02e943687908f57d5 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 28 Apr 2019 16:57:41 +0100 Subject: [PATCH] More work on router docker image - Multi-stage docker build (final image only 15MB!) - Build in release mode - Fix bug with release mode - Fix compiler being dumb AF - Disable FORTIFY for now - Enable LTO when making a staticly linked release - Fix some gcc specific warnings - Refactor cmake stuff into multiple files --- CMakeLists.txt | 106 ++++++----------------------- Makefile | 28 ++++---- cmake/coverage.cmake | 9 +++ cmake/shadow.cmake | 18 +++++ cmake/solaris.cmake | 23 +++++++ cmake/unix.cmake | 30 ++++++++ crypto/sha512/sha512.c | 2 +- docker/router.Dockerfile | 16 +++-- llarp/messages/relay_commit.cpp | 4 +- llarp/path/path.cpp | 2 +- llarp/path/path.hpp | 2 +- llarp/service/endpoint.cpp | 8 +-- llarp/service/endpoint.hpp | 2 +- llarp/service/outbound_context.cpp | 2 +- llarp/utp/session.cpp | 6 +- lokinet-bootstrap | 2 +- 16 files changed, 140 insertions(+), 120 deletions(-) create mode 100644 cmake/coverage.cmake create mode 100644 cmake/shadow.cmake create mode 100644 cmake/solaris.cmake create mode 100644 cmake/unix.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b9bfdf55..6aefd3620 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,29 +40,7 @@ else() enable_language(ASM) endif(MSVC_VERSION) -if(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") - # check if we have the (saner) emulation of epoll here - # it's basically linux epoll but with a sane method of - # dealing with closed file handles that still exist in the - # epoll set - # - # Note that the zombie of Oracle Solaris 2.11.x will NOT have - # this, the header check is the only method we have to distinguish - # them. -rick the svr4 guy - set(SOLARIS ON) - option(USE_POLL "Revert to using poll(2) event loop (useful if targeting Oracle Solaris)" OFF) - set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lsocket -lnsl") - add_definitions(-D_POSIX_PTHREAD_SEMANTICS) - INCLUDE(CheckIncludeFiles) - CHECK_INCLUDE_FILES(sys/epoll.h SOLARIS_HAVE_EPOLL) - if (SOLARIS_HAVE_EPOLL AND NOT USE_POLL) - message(STATUS "Using fast emulation of Linux epoll(5) on Solaris.") - add_definitions(-DSOLARIS_HAVE_EPOLL) - else() - set(SOLARIS_HAVE_EPOLL OFF) - message(STATUS "Falling back to poll(2)-based event loop.") - endif() -endif() +include(cmake/solaris.cmake) if(WIN32) set(CMAKE_CXX_STANDARD 17) @@ -112,15 +90,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wthread-safety) endif() -if (WITH_COVERAGE) - if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - add_compile_options( -fprofile-instr-generate -fcoverage-mapping ) - link_libraries( -fprofile-instr-generate ) - else() - add_compile_options( --coverage -g0 ) - link_libraries( --coverage ) - endif() -endif() +include(cmake/coverage.cmake) # these vars are set by the cmake toolchain spec if (WOW64_CROSS_COMPILE OR WIN64_CROSS_COMPILE) @@ -173,16 +143,21 @@ find_package(Threads REQUIRED) # not supported on Solaris - system libraries are not available as archives if(STATIC_LINK_RUNTIME) if (NOT SOLARIS) - add_compile_options(-static) + add_compile_options(-static -flto) if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -static-libstdc++ -pthread" ) + link_libraries( -static -static-libstdc++ -pthread -flto ) else() - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive" ) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") + # this is messing with release builds + add_compile_options(-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0) + set(CMAKE_AR "gcc-ar") + set(CMAKE_C_ARCHIVE_CREATE " qcs ") + set(CMAKE_C_ARCHIVE_FINISH "true") + set(CMAKE_CXX_ARCHIVE_CREATE " qcs ") + set(CMAKE_CXX_ARCHIVE_FINISH "true") + link_libraries( -flto -static-libstdc++ -static-libgcc -static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive ) endif() else() - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++ -static-libgcc" ) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") + link_libraries( -static-libstdc++ -static-libgcc ) endif() endif(STATIC_LINK_RUNTIME) @@ -207,26 +182,14 @@ if(ASAN) endif(ASAN) if(SHADOW) - set(WITH_STATIC OFF) - set(WITH_SHARED ON) - if("${SHADOW_ROOT}" STREQUAL "") - set(SHADOW_ROOT "$ENV{HOME}/.shadow") - endif("${SHADOW_ROOT}" STREQUAL "") - if(EXISTS "${SHADOW_ROOT}") - message(STATUS "SHADOW_ROOT = ${SHADOW_ROOT}") - else() - message(FATAL_ERROR "SHADOW_ROOT path does not exist: '${SHADOW_ROOT}'") - endif(EXISTS "${SHADOW_ROOT}") - - set(CMAKE_MODULE_PATH "${SHADOW_ROOT}/share/cmake/Modules") - include_directories(${CMAKE_MODULE_PATH}) - include(ShadowTools) - add_compile_options(-fno-inline -fno-strict-aliasing ) - add_definitions(-DTESTNET=1) - add_definitions(-DSHADOW_TESTNET) - include_directories(${SHADOW_ROOT}/include) + include(cmake/shadow.cmake) endif(SHADOW) +# if(CMAKE_BUILD_TYPE MATCHES Release AND CMAKE_CXX_COMPILER_ID MATCHES "Clang|GCC") +# set(OPTIMIZE_FLAGS -UNDEBUG) +# endif() + + if(CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") set(OPTIMIZE_FLAGS "") add_definitions(-DLOKINET_DEBUG=1) @@ -300,36 +263,7 @@ function(add_import_library libname) endfunction() if(UNIX) - add_definitions(-DUNIX) - add_definitions(-DPOSIX) - if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") - get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-linux.c ABSOLUTE) - get_filename_component(EV_SRC "llarp/ev/ev_epoll.cpp" ABSOLUTE) - elseif(${CMAKE_SYSTEM_NAME} MATCHES "Android") - get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-linux.c ABSOLUTE) - get_filename_component(EV_SRC "llarp/ev/ev_epoll.cpp" ABSOLUTE) - elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") - set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-openbsd.c ${TT_ROOT}/tuntap-unix-bsd.c) - get_filename_component(EV_SRC "llarp/ev/ev_kqueue.cpp" ABSOLUTE) - elseif (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") - set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-netbsd.c ${TT_ROOT}/tuntap-unix-bsd.c) - get_filename_component(EV_SRC "llarp/ev/ev_kqueue.cpp" ABSOLUTE) - elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "DragonFly") - set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-freebsd.c ${TT_ROOT}/tuntap-unix-bsd.c) - get_filename_component(EV_SRC "llarp/ev/ev_kqueue.cpp" ABSOLUTE) - elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-darwin.c ${TT_ROOT}/tuntap-unix-bsd.c) - get_filename_component(EV_SRC "llarp/ev/ev_kqueue.cpp" ABSOLUTE) - elseif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") - set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-sunos.c) - if (SOLARIS_HAVE_EPOLL) - get_filename_component(EV_SRC "llarp/ev/ev_epoll.cpp" ABSOLUTE) - else() - get_filename_component(EV_SRC "llarp/ev/ev_sun.cpp" ABSOLUTE) - endif() - else() - message(FATAL_ERROR "Your operating system is not supported yet") - endif() + include(cmake/unix.cmake) elseif(WIN32) get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-windows.c ABSOLUTE) get_filename_component(EV_SRC "llarp/ev/ev_win32.cpp" ABSOLUTE) diff --git a/Makefile b/Makefile index e100bfc68..43ade9a0e 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,8 @@ prefix = $(DESTDIR)/usr/local CC ?= cc CXX ?= c++ +BUILD_TYPE ?= Debug + PYTHON ?= python3 SETCAP ?= which setcap && setcap cap_net_admin,cap_net_bind_service=+eip @@ -51,8 +53,6 @@ ANDROID_LOCAL_PROPS=$(ANDROID_DIR)/local.properties GRADLE ?= gradle JAVA_HOME ?= /usr/lib/jvm/default-java -# jsonrpc server -JSONRPC ?= ON # native avx2 code AVX2 ?= OFF # non x86 target @@ -86,17 +86,17 @@ SCAN_BUILD ?= scan-build UNAME = $(shell which uname) ifeq ($(shell $(UNAME)),SunOS) -CONFIG_CMD = $(shell gecho -n "cd '$(BUILD_ROOT)' && " ; gecho -n "cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DUSE_LIBABYSS=$(JSONRPC) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") +CONFIG_CMD = $(shell gecho -n "cd '$(BUILD_ROOT)' && " ; gecho -n "cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") -ANALYZE_CONFIG_CMD = $(shell gecho -n "cd '$(BUILD_ROOT)' && " ; gecho -n "$(SCAN_BUILD) cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DUSE_LIBABYSS=$(JSONRPC) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") +ANALYZE_CONFIG_CMD = $(shell gecho -n "cd '$(BUILD_ROOT)' && " ; gecho -n "$(SCAN_BUILD) cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") -COVERAGE_CONFIG_CMD = $(shell gecho -n "cd '$(BUILD_ROOT)' && " ; gecho -n "cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DUSE_LIBABYSS=$(JSONRPC) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DWITH_COVERAGE=yes -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") +COVERAGE_CONFIG_CMD = $(shell gecho -n "cd '$(BUILD_ROOT)' && " ; gecho -n "cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DWITH_COVERAGE=yes -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") else -CONFIG_CMD = $(shell /bin/echo -n "cd '$(BUILD_ROOT)' && " ; /bin/echo -n "cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DUSE_LIBABYSS=$(JSONRPC) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") +CONFIG_CMD = $(shell /bin/echo -n "cd '$(BUILD_ROOT)' && " ; /bin/echo -n "cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") -ANALYZE_CONFIG_CMD = $(shell /bin/echo -n "cd '$(BUILD_ROOT)' && " ; /bin/echo -n "$(SCAN_BUILD) cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DUSE_LIBABYSS=$(JSONRPC) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") +ANALYZE_CONFIG_CMD = $(shell /bin/echo -n "cd '$(BUILD_ROOT)' && " ; /bin/echo -n "$(SCAN_BUILD) cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") -COVERAGE_CONFIG_CMD = $(shell /bin/echo -n "cd '$(BUILD_ROOT)' && " ; /bin/echo -n "cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DUSE_LIBABYSS=$(JSONRPC) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DWITH_COVERAGE=yes -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") +COVERAGE_CONFIG_CMD = $(shell /bin/echo -n "cd '$(BUILD_ROOT)' && " ; /bin/echo -n "cmake -G'$(CMAKE_GEN)' -DCMAKE_CROSSCOMPILING=$(CROSS) -DSTATIC_LINK_RUNTIME=$(STATIC_LINK) -DUSE_NETNS=$(NETNS) -DUSE_AVX2=$(AVX2) -DNON_PC_TARGET=$(NON_PC_TARGET) -DWITH_SHARED=$(SHARED_LIB) -DWITH_COVERAGE=yes -DCMAKE_EXPORT_COMPILE_COMMANDS=ON '$(REPO)'") endif TARGETS = $(REPO)/lokinet @@ -118,11 +118,11 @@ clean: debug-configure: mkdir -p '$(BUILD_ROOT)' - $(CONFIG_CMD) -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_FLAGS='$(CFLAGS)' -DCMAKE_CXX_FLAGS='$(CXXFLAGS)' + $(CONFIG_CMD) -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DCMAKE_C_FLAGS='$(CFLAGS)' -DCMAKE_CXX_FLAGS='$(CXXFLAGS)' release-configure: clean mkdir -p '$(BUILD_ROOT)' - $(CONFIG_CMD) -DSTATIC_LINK_RUNTIME=ON -DCMAKE_BUILD_TYPE=Debug -DRELEASE_MOTTO="$(shell cat motto.txt)" -DCMAKE_C_FLAGS='$(CFLAGS)' -DCMAKE_CXX_FLAGS='$(CXXFLAGS)' + $(CONFIG_CMD) -DSTATIC_LINK_RUNTIME=ON -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DRELEASE_MOTTO="$(shell cat motto.txt)" -DCMAKE_C_FLAGS='$(CFLAGS)' -DCMAKE_CXX_FLAGS='$(CXXFLAGS)' debug: debug-configure $(MAKE) -C $(BUILD_ROOT) @@ -143,7 +143,7 @@ release: $(SIGS) shadow-configure: clean mkdir -p $(BUILD_ROOT) - $(CONFIG_CMD) -DCMAKE_BUILD_TYPE=Debug -DSHADOW=ON + $(CONFIG_CMD) -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DSHADOW=ON shadow-build: shadow-configure $(MAKE) -C $(BUILD_ROOT) @@ -163,7 +163,7 @@ testnet-clean: clean testnet-configure: testnet-clean mkdir -p $(BUILD_ROOT) - $(CONFIG_CMD) -DCMAKE_BUILD_TYPE=Debug -DTESTNET=1 + $(CONFIG_CMD) -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DTESTNET=1 testnet-build: testnet-configure $(MAKE) -C $(BUILD_ROOT) @@ -198,7 +198,7 @@ android: android-gradle windows-debug-configure: clean mkdir -p '$(BUILD_ROOT)' - $(CONFIG_CMD) -DCMAKE_TOOLCHAIN_FILE='$(REPO)/contrib/cross/mingw.cmake' -DCMAKE_BUILD_TYPE=Debug -DCMAKE_ASM_FLAGS='$(ASFLAGS)' -DCMAKE_C_FLAGS='$(CFLAGS)' -DCMAKE_CXX_FLAGS='$(CXXFLAGS)' + $(CONFIG_CMD) -DCMAKE_TOOLCHAIN_FILE='$(REPO)/contrib/cross/mingw.cmake' -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DCMAKE_ASM_FLAGS='$(ASFLAGS)' -DCMAKE_C_FLAGS='$(CFLAGS)' -DCMAKE_CXX_FLAGS='$(CXXFLAGS)' windows-debug: windows-debug-configure $(MAKE) -C '$(BUILD_ROOT)' @@ -206,7 +206,7 @@ windows-debug: windows-debug-configure windows-release-configure: clean mkdir -p '$(BUILD_ROOT)' - $(CONFIG_CMD) -DCMAKE_TOOLCHAIN_FILE='$(REPO)/contrib/cross/mingw.cmake' -DCMAKE_BUILD_TYPE=Release -DCMAKE_ASM_FLAGS='$(ASFLAGS)' -DCMAKE_C_FLAGS='$(CFLAGS)' -DCMAKE_CXX_FLAGS='$(CXXFLAGS)' + $(CONFIG_CMD) -DCMAKE_TOOLCHAIN_FILE='$(REPO)/contrib/cross/mingw.cmake' -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DCMAKE_ASM_FLAGS='$(ASFLAGS)' -DCMAKE_C_FLAGS='$(CFLAGS)' -DCMAKE_CXX_FLAGS='$(CXXFLAGS)' windows-release: windows-release-configure $(MAKE) -C '$(BUILD_ROOT)' diff --git a/cmake/coverage.cmake b/cmake/coverage.cmake new file mode 100644 index 000000000..65a8bcb97 --- /dev/null +++ b/cmake/coverage.cmake @@ -0,0 +1,9 @@ +if (WITH_COVERAGE) + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options( -fprofile-instr-generate -fcoverage-mapping ) + link_libraries( -fprofile-instr-generate ) + else() + add_compile_options( --coverage -g0 ) + link_libraries( --coverage ) + endif() +endif() diff --git a/cmake/shadow.cmake b/cmake/shadow.cmake new file mode 100644 index 000000000..6bdd95bb1 --- /dev/null +++ b/cmake/shadow.cmake @@ -0,0 +1,18 @@ +set(WITH_STATIC OFF) +set(WITH_SHARED ON) +if("${SHADOW_ROOT}" STREQUAL "") + set(SHADOW_ROOT "$ENV{HOME}/.shadow") +endif("${SHADOW_ROOT}" STREQUAL "") +if(EXISTS "${SHADOW_ROOT}") + message(STATUS "SHADOW_ROOT = ${SHADOW_ROOT}") +else() + message(FATAL_ERROR "SHADOW_ROOT path does not exist: '${SHADOW_ROOT}'") +endif(EXISTS "${SHADOW_ROOT}") + +set(CMAKE_MODULE_PATH "${SHADOW_ROOT}/share/cmake/Modules") +include_directories(${CMAKE_MODULE_PATH}) +include(ShadowTools) +add_compile_options(-fno-inline -fno-strict-aliasing ) +add_definitions(-DTESTNET=1) +add_definitions(-DSHADOW_TESTNET) +include_directories(${SHADOW_ROOT}/include) diff --git a/cmake/solaris.cmake b/cmake/solaris.cmake new file mode 100644 index 000000000..a3915e3b3 --- /dev/null +++ b/cmake/solaris.cmake @@ -0,0 +1,23 @@ +if(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + # check if we have the (saner) emulation of epoll here + # it's basically linux epoll but with a sane method of + # dealing with closed file handles that still exist in the + # epoll set + # + # Note that the zombie of Oracle Solaris 2.11.x will NOT have + # this, the header check is the only method we have to distinguish + # them. -rick the svr4 guy + set(SOLARIS ON) + option(USE_POLL "Revert to using poll(2) event loop (useful if targeting Oracle Solaris)" OFF) + set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lsocket -lnsl") + add_definitions(-D_POSIX_PTHREAD_SEMANTICS) + INCLUDE(CheckIncludeFiles) + CHECK_INCLUDE_FILES(sys/epoll.h SOLARIS_HAVE_EPOLL) + if (SOLARIS_HAVE_EPOLL AND NOT USE_POLL) + message(STATUS "Using fast emulation of Linux epoll(5) on Solaris.") + add_definitions(-DSOLARIS_HAVE_EPOLL) + else() + set(SOLARIS_HAVE_EPOLL OFF) + message(STATUS "Falling back to poll(2)-based event loop.") + endif() +endif() diff --git a/cmake/unix.cmake b/cmake/unix.cmake new file mode 100644 index 000000000..64f71e020 --- /dev/null +++ b/cmake/unix.cmake @@ -0,0 +1,30 @@ +add_definitions(-DUNIX) +add_definitions(-DPOSIX) +if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-linux.c ABSOLUTE) + get_filename_component(EV_SRC "llarp/ev/ev_epoll.cpp" ABSOLUTE) +elseif(${CMAKE_SYSTEM_NAME} MATCHES "Android") +get_filename_component(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-linux.c ABSOLUTE) + get_filename_component(EV_SRC "llarp/ev/ev_epoll.cpp" ABSOLUTE) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") + set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-openbsd.c ${TT_ROOT}/tuntap-unix-bsd.c) + get_filename_component(EV_SRC "llarp/ev/ev_kqueue.cpp" ABSOLUTE) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") + set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-netbsd.c ${TT_ROOT}/tuntap-unix-bsd.c) + get_filename_component(EV_SRC "llarp/ev/ev_kqueue.cpp" ABSOLUTE) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR ${CMAKE_SYSTEM_NAME} MATCHES "DragonFly") + set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-freebsd.c ${TT_ROOT}/tuntap-unix-bsd.c) + get_filename_component(EV_SRC "llarp/ev/ev_kqueue.cpp" ABSOLUTE) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-darwin.c ${TT_ROOT}/tuntap-unix-bsd.c) + get_filename_component(EV_SRC "llarp/ev/ev_kqueue.cpp" ABSOLUTE) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + set(LIBTUNTAP_IMPL ${TT_ROOT}/tuntap-unix-sunos.c) + if (SOLARIS_HAVE_EPOLL) + get_filename_component(EV_SRC "llarp/ev/ev_epoll.cpp" ABSOLUTE) + else() + get_filename_component(EV_SRC "llarp/ev/ev_sun.cpp" ABSOLUTE) + endif() +else() + message(FATAL_ERROR "Your operating system is not supported yet") +endif() diff --git a/crypto/sha512/sha512.c b/crypto/sha512/sha512.c index 79ed7c4c9..6ec6af033 100644 --- a/crypto/sha512/sha512.c +++ b/crypto/sha512/sha512.c @@ -239,7 +239,7 @@ crypto_hash_sha512_update(crypto_hash_sha512_state *state, state->count[0] += bitlen[0]; if(inlen < 128 - r) { - for(i = 0; i < inlen; i++) + for(i = 0; i < inlen || i < 128; i++) { state->buf[r + i] = in[i]; } diff --git a/docker/router.Dockerfile b/docker/router.Dockerfile index 403942a18..fa2b2651a 100644 --- a/docker/router.Dockerfile +++ b/docker/router.Dockerfile @@ -1,15 +1,19 @@ -FROM ubuntu:latest +FROM alpine:latest as builder -RUN apt update && \ - apt install -y build-essential cmake git libcap-dev curl ninja-build +RUN apk update && \ + apk add build-base cmake git libcap-dev curl ninja bash binutils-gold WORKDIR /src/ COPY . /src/ -RUN make NINJA=ninja -#RUN ./lokinet -r -f -COPY lokinet-docker.ini /root/.lokinet/lokinet.ini +RUN make NINJA=ninja STATIC_LINK=ON BUILD_TYPE=Release RUN ./lokinet-bootstrap +FROM alpine:latest + +COPY lokinet-docker.ini /root/.lokinet/lokinet.ini +COPY --from=builder /src/build/lokinet . +COPY --from=builder /root/.lokinet/bootstrap.signed /root/.lokinet/ + CMD ["./lokinet"] EXPOSE 1090/udp 1190/tcp diff --git a/llarp/messages/relay_commit.cpp b/llarp/messages/relay_commit.cpp index 10ce47f52..c1b956b64 100644 --- a/llarp/messages/relay_commit.cpp +++ b/llarp/messages/relay_commit.cpp @@ -366,13 +366,13 @@ namespace llarp // we are the farthest hop llarp::LogDebug("We are the farthest hop for ", info); // send a LRAM down the path - self->context->Logic()->queue_job({self, &SendPathConfirm}); + self->context->logic()->queue_job({self, &SendPathConfirm}); } else { // forward upstream // we are still in the worker thread so post job to logic - self->context->Logic()->queue_job({self, &SendLRCM}); + self->context->logic()->queue_job({self, &SendLRCM}); } } }; diff --git a/llarp/path/path.cpp b/llarp/path/path.cpp index 07cfd6523..20ea469ff 100644 --- a/llarp/path/path.cpp +++ b/llarp/path/path.cpp @@ -64,7 +64,7 @@ namespace llarp } Logic* - PathContext::Logic() + PathContext::logic() { return m_Router->logic(); } diff --git a/llarp/path/path.hpp b/llarp/path/path.hpp index 1adb03434..570660d71 100644 --- a/llarp/path/path.hpp +++ b/llarp/path/path.hpp @@ -675,7 +675,7 @@ namespace llarp Crypto(); Logic* - Logic(); + logic(); AbstractRouter* Router(); diff --git a/llarp/service/endpoint.cpp b/llarp/service/endpoint.cpp index 84b50f2b2..09cf692ec 100644 --- a/llarp/service/endpoint.cpp +++ b/llarp/service/endpoint.cpp @@ -897,14 +897,14 @@ namespace llarp if(!GetSenderFor(frame.T, si)) return false; // verify source - if(!frame.Verify(Crypto(), si)) + if(!frame.Verify(crypto(), si)) return false; // remove convotag it doesn't exist LogWarn("remove convotag T=", frame.T); RemoveConvoTag(frame.T); return true; } - if(!frame.AsyncDecryptAndVerify(EndpointLogic(), Crypto(), p, Worker(), + if(!frame.AsyncDecryptAndVerify(EndpointLogic(), crypto(), p, Worker(), m_Identity, m_DataHandler)) { // send discard @@ -912,7 +912,7 @@ namespace llarp f.R = 1; f.T = frame.T; f.F = p->intro.pathID; - if(!f.Sign(Crypto(), m_Identity)) + if(!f.Sign(crypto(), m_Identity)) return false; const routing::PathTransferMessage d(f, frame.F); return p->SendRoutingMessage(d, router); @@ -1197,7 +1197,7 @@ namespace llarp } Crypto* - Endpoint::Crypto() + Endpoint::crypto() { return m_Router->crypto(); } diff --git a/llarp/service/endpoint.hpp b/llarp/service/endpoint.hpp index 7744704ae..1bd219f7b 100644 --- a/llarp/service/endpoint.hpp +++ b/llarp/service/endpoint.hpp @@ -82,7 +82,7 @@ namespace llarp EndpointNetLoop(); Crypto* - Crypto(); + crypto(); llarp_threadpool* Worker(); diff --git a/llarp/service/outbound_context.cpp b/llarp/service/outbound_context.cpp index e756a039c..ca468974a 100644 --- a/llarp/service/outbound_context.cpp +++ b/llarp/service/outbound_context.cpp @@ -195,7 +195,7 @@ namespace llarp } currentConvoTag.Randomize(); AsyncKeyExchange* ex = new AsyncKeyExchange( - m_Endpoint->RouterLogic(), m_Endpoint->Crypto(), remoteIdent, + m_Endpoint->RouterLogic(), m_Endpoint->crypto(), remoteIdent, m_Endpoint->GetIdentity(), currentIntroSet.K, remoteIntro, m_DataHandler, currentConvoTag); diff --git a/llarp/utp/session.cpp b/llarp/utp/session.cpp index 6037c31c5..225d2f802 100644 --- a/llarp/utp/session.cpp +++ b/llarp/utp/session.cpp @@ -603,8 +603,9 @@ namespace llarp OurCrypto()->shorthash(rxKey, llarp_buffer_t(rid)); remoteRC.Clear(); + ABSL_ATTRIBUTE_UNUSED void* res = utp_set_userdata(sock, this); + assert(res == this); assert(s == sock); - assert(utp_set_userdata(sock, this) == this); GotLIM = std::bind(&InboundSession::InboundLIM, this, _1); } @@ -693,7 +694,8 @@ namespace llarp rid = p->GetOurRC().pubkey; OurCrypto()->shorthash(rxKey, llarp_buffer_t(rid)); - assert(utp_set_userdata(sock, this) == this); + ABSL_ATTRIBUTE_UNUSED void* res = utp_set_userdata(sock, this); + assert(res == this); assert(s == sock); GotLIM = std::bind(&OutboundSession::OutboundLIM, this, _1); diff --git a/lokinet-bootstrap b/lokinet-bootstrap index a1921f5ef..fbbd7b445 100755 --- a/lokinet-bootstrap +++ b/lokinet-bootstrap @@ -26,7 +26,7 @@ tmp=/tmp/bootstrap.tmp # MacOS does not have wget without homebrew but does have curl # Rick also had indicated most BSDs have curl too -curl "$url" > "$tmp" && \ +curl -o "$tmp" "$url" && \ (mv "$tmp" "$HOME/.lokinet/bootstrap.signed" && echo -e "${GREEN}lokinet successfully bootstrapped${NC}" ) \ || echo -e "${RED}failed to download bootstrap from $url${NC}" rm -f "$tmp"