diff --git a/3rdparty/monero_crypto/CMakeLists.txt b/3rdparty/monero_crypto/CMakeLists.txt index 958edbd28327894497ea21c9c7b4bf6f6e8e4af9..34af01cb61fa4499f5fa863e4e87d835447432f7 100755 --- a/3rdparty/monero_crypto/CMakeLists.txt +++ b/3rdparty/monero_crypto/CMakeLists.txt @@ -109,6 +109,8 @@ else() message(STATUS "[*] Building on ${CMAKE_SYSTEM_PROCESSOR} for ${ARCH}") if(ARCH STREQUAL "default") set(ARCH_FLAG "") + elseif(ARCH STREQUAL "native") + set(ARCH_FLAG "") elseif(PPC64LE) set(ARCH_FLAG "-mcpu=${ARCH}") elseif(IOS AND ARCH STREQUAL "arm64") diff --git a/3rdparty/wolfssl/cyassl/options.h b/3rdparty/wolfssl/cyassl/options.h index e2e364e7b07848a76c297337dde5dbdb276ba3fb..5ba0ed638c285554c2c930d1d2f18dff9d47d852 100644 --- a/3rdparty/wolfssl/cyassl/options.h +++ b/3rdparty/wolfssl/cyassl/options.h @@ -113,9 +113,6 @@ extern "C" { #undef WC_RSA_PSS #define WC_RSA_PSS -#undef WOLFSSL_BASE64_ENCODE -#define WOLFSSL_BASE64_ENCODE - #undef NO_RC4 #define NO_RC4 @@ -125,15 +122,6 @@ extern "C" { #undef NO_RABBIT #define NO_RABBIT -#undef WOLFSSL_SHA224 -#define WOLFSSL_SHA224 - -#undef WOLFSSL_SHA3 -#define WOLFSSL_SHA3 - -#undef WOLFSSL_SHAKE256 -#define WOLFSSL_SHAKE256 - #undef HAVE_POLY1305 #define HAVE_POLY1305 @@ -173,12 +161,6 @@ extern "C" { #undef NO_MD4 #define NO_MD4 -#undef USE_FAST_MATH -#define USE_FAST_MATH - -#undef WOLFSSL_X86_64_BUILD -#define WOLFSSL_X86_64_BUILD - #undef WC_NO_ASYNC_THREADING #define WC_NO_ASYNC_THREADING diff --git a/3rdparty/wolfssl/wolfssl/options.h b/3rdparty/wolfssl/wolfssl/options.h index d6f39494f92ba9ec7d14c3163a7022520c978b2b..aa54bade2d2bee07571ea17a33ba8145daad7bbd 100644 --- a/3rdparty/wolfssl/wolfssl/options.h +++ b/3rdparty/wolfssl/wolfssl/options.h @@ -110,9 +110,6 @@ extern "C" { #undef WC_RSA_PSS #define WC_RSA_PSS -#undef WOLFSSL_BASE64_ENCODE -#define WOLFSSL_BASE64_ENCODE - #undef NO_RC4 #define NO_RC4 @@ -122,15 +119,6 @@ extern "C" { #undef NO_RABBIT #define NO_RABBIT -#undef WOLFSSL_SHA224 -#define WOLFSSL_SHA224 - -#undef WOLFSSL_SHA3 -#define WOLFSSL_SHA3 - -#undef WOLFSSL_SHAKE256 -#define WOLFSSL_SHAKE256 - #undef HAVE_POLY1305 #define HAVE_POLY1305 @@ -170,12 +158,6 @@ extern "C" { #undef NO_MD4 #define NO_MD4 -#undef USE_FAST_MATH -#define USE_FAST_MATH - -#undef WOLFSSL_X86_64_BUILD -#define WOLFSSL_X86_64_BUILD - #undef WC_NO_ASYNC_THREADING #define WC_NO_ASYNC_THREADING diff --git a/CMakeLists.txt b/CMakeLists.txt index 3eda61f1a80cb4a8820114c1b06f409ff285bc8e..a84c8b4610fd0355bffc26d097ddeb8915f6c723 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 3.0) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.9-5") +set(CELLFRAME_SDK_NATIVE_VERSION "2.9-6") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") message("Cellframe modules: ${CELLFRAME_MODULES}") @@ -53,8 +53,9 @@ endif() add_subdirectory(dap-sdk) add_subdirectory(3rdparty/monero_crypto) add_subdirectory(3rdparty/cuttdb) -add_subdirectory(3rdparty/wolfssl) - +if(DAPSDK_MODULES MATCHES "ssl-support") + add_subdirectory(3rdparty/wolfssl) +endif() add_subdirectory(modules/) diff --git a/cmake/OS_Detection.cmake b/cmake/OS_Detection.cmake index daa8d412dd469c35b759a64d5fed87965a0f197a..161a5b8fa690764c43d26f5e2f027b1c8119834c 100644 --- a/cmake/OS_Detection.cmake +++ b/cmake/OS_Detection.cmake @@ -53,7 +53,14 @@ if(UNIX) set(BSD ON) if (${_CMAKE_OSX_SYSROOT_PATH} MATCHES "MacOS") set(MACOS ON) - add_definitions("-DDAP_OS_MAC") + # on macOS "uname -m" returns the architecture (x86_64 or arm64) + execute_process( + COMMAND uname -m + RESULT_VARIABLE result + OUTPUT_VARIABLE MACOS_ARCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + add_definitions("-DDAP_OS_MAC -DDAP_OS_MAC_ARCH=${MACOS_ARCH}") endif() if (${_CMAKE_OSX_SYSROOT_PATH} MATCHES "iOS") set(IOS ON) diff --git a/dap-sdk/CMakeLists.txt b/dap-sdk/CMakeLists.txt index d327eb51f2fb6f7ae09d68e9746e1e8b850a1a5a..9a6f3fa6394bd90cbc3d3d93c2aae300b843a209 100644 --- a/dap-sdk/CMakeLists.txt +++ b/dap-sdk/CMakeLists.txt @@ -1,4 +1,12 @@ -set(DAP_SDK_NATIVE_VERSION "2.2-1") +set(DAP_SDK_NATIVE_VERSION "2.2-2") + +# We switch off SSL until its not switched on back +if(DAPSDK_MODULES MATCHES "ssl-support") + add_definitions("-DDAP_NET_CLIENT_SSL") +else() + add_definitions("-DDAP_NET_CLIENT_NO_SSL") +endif() + # Core, add it always add_subdirectory(core) if (DAPSDK_MODULES MATCHES "crypto") diff --git a/dap-sdk/core/libdap.pri b/dap-sdk/core/libdap.pri index 0842a446f947c580a624d8c0f89024c03374b4de..e7b623806bf0cd51818aa5029f0135470e2ccb05 100755 --- a/dap-sdk/core/libdap.pri +++ b/dap-sdk/core/libdap.pri @@ -47,7 +47,9 @@ win32 { HEADERS += $$PWD/../../3rdparty/uthash/src/utlist.h \ $$PWD/../../3rdparty/uthash/src/uthash.h -#include($$PWD/../../3rdparty/wolfssl/wolfssl.pri) +if(DAPSDK_MODULES MATCHES "ssl-support") + include($$PWD/../../3rdparty/wolfssl/wolfssl.pri) +endif() # Sources itself HEADERS += $$PWD/include/dap_common.h \ diff --git a/dap-sdk/crypto/CMakeLists.txt b/dap-sdk/crypto/CMakeLists.txt index 0aa772704dde0a443c34cae77a926f11a21769c8..3badd0046895a28ec855633f5e2ba59e44263a7f 100755 --- a/dap-sdk/crypto/CMakeLists.txt +++ b/dap-sdk/crypto/CMakeLists.txt @@ -74,7 +74,11 @@ if(UNIX) endif() elseif(APPLE) if(BUILD_64) - file( GLOB XKCP_SRCS2 src/XKCP/lib/low/KeccakP-1600/OptimizedAsmX86-64/KeccakP-1600-x86-64-gas_Apple.s ) + if((MACOS) AND(MACOS_ARCH STREQUAL "x86_64") ) + file( GLOB XKCP_SRCS2 src/XKCP/lib/low/KeccakP-1600/OptimizedAsmX86-64/KeccakP-1600-x86-64-gas_Apple.s ) + else() + file( GLOB XKCP_SRCS2 src/XKCP/lib/low/KeccakP-1600/Compact64/KeccakP-1600-compact64.c ) + endif() else() file( GLOB XKCP_SRCS2 src/XKCP/lib/low/KeccakP-1600/Inplace32BI/KeccakP-1600-inplace32BI.c ) endif() diff --git a/dap-sdk/net/client/CMakeLists.txt b/dap-sdk/net/client/CMakeLists.txt index 1b51802e4b5ce2b8fd26dac1326a05bea91ce3e5..39185cc300f9dfda0ef43ae046d0adc278dbd018 100644 --- a/dap-sdk/net/client/CMakeLists.txt +++ b/dap-sdk/net/client/CMakeLists.txt @@ -7,8 +7,12 @@ file(GLOB DAP_CLIENT_HEADERS FILES include/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CLIENT_HEADERS} ${DAP_CLIENT_SOURCES}) -target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_http_server dap_enc_server dap_stream dap_session dap_stream_ch json-c wolfssl) +if(DAPSDK_MODULES MATCHES "ssl-support") + target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_http_server dap_enc_server dap_stream dap_session dap_stream_ch json-c wolfssl) +else() + target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_http_server dap_enc_server dap_stream dap_session dap_stream_ch json-c) +endif() if(UNIX AND NOT ANDROID AND NOT DARWIN) target_link_libraries(${PROJECT_NAME} rt) endif() diff --git a/dap-sdk/net/core/CMakeLists.txt b/dap-sdk/net/core/CMakeLists.txt index f3b6a5e2c93c96955b542c6f8c77dc6d6eb620c9..5ed51a7bfb0e11bfeeee142d2e78146cc2833d7a 100644 --- a/dap-sdk/net/core/CMakeLists.txt +++ b/dap-sdk/net/core/CMakeLists.txt @@ -19,13 +19,13 @@ endif() add_library(${PROJECT_NAME} STATIC ${DAP_SERVER_CORE_HEADERS} ${DAP_SERVER_CORE_SOURCES}) -if(WIN32) +if(DAPSDK_MODULES MATCHES "ssl-support") target_link_libraries(${PROJECT_NAME} dap_core dap_crypto wolfssl) +else() + target_link_libraries(${PROJECT_NAME} dap_core dap_crypto) endif() if(UNIX) - target_link_libraries(${PROJECT_NAME} dap_core dap_crypto wolfssl) - if(NOT ANDROID) target_link_libraries(${PROJECT_NAME} pthread) endif() diff --git a/dap-sdk/net/core/dap_events.c b/dap-sdk/net/core/dap_events.c index 5d64b4b80b6dc2cdedba58829c598106c6eaaa05..83cd14845f3626e56a155a73a0aa0790c049b0a7 100644 --- a/dap-sdk/net/core/dap_events.c +++ b/dap-sdk/net/core/dap_events.c @@ -217,7 +217,6 @@ int dap_events_init( uint32_t a_threads_count, size_t a_conn_timeout ) err: log_it(L_ERROR,"Deinit events subsystem"); dap_events_deinit(); - dap_worker_deinit(); return -1; } @@ -226,8 +225,11 @@ err: */ void dap_events_deinit( ) { + dap_proc_thread_deinit(); dap_events_socket_deinit(); dap_worker_deinit(); + + dap_events_wait(s_events_default); if ( s_threads ) DAP_DELETE( s_threads ); @@ -379,7 +381,7 @@ int dap_events_wait( dap_events_t *a_events ) void dap_events_stop_all( ) { for( uint32_t i = 0; i < s_threads_count; i ++ ) { - dap_events_socket_event_signal( s_workers[i]->event_exit, 0); + dap_events_socket_event_signal( s_workers[i]->event_exit, 1); } // TODO implement signal to stop the workers } diff --git a/dap-sdk/net/core/dap_proc_thread.c b/dap-sdk/net/core/dap_proc_thread.c index 9f5b326d2719ac7f2c2c6e538a05e6276ec0d016..da7b629cdd0f61f9f9d60f5c8a609ec9bbd0402f 100644 --- a/dap-sdk/net/core/dap_proc_thread.c +++ b/dap-sdk/net/core/dap_proc_thread.c @@ -62,6 +62,7 @@ static size_t s_threads_count = 0; static bool s_debug_reactor = false; static dap_proc_thread_t * s_threads = NULL; static void * s_proc_thread_function(void * a_arg); +static void s_event_exit_callback( dap_events_socket_t * a_es, uint64_t a_flags); /** * @brief dap_proc_thread_init @@ -97,14 +98,19 @@ int dap_proc_thread_init(uint32_t a_threads_count){ */ void dap_proc_thread_deinit() { - // Signal to cancel working threads and wait for finish - // TODO: Android realization -#ifndef DAP_OS_ANDROID - for (size_t i = 0; i < s_threads_count; i++ ){ - pthread_cancel(s_threads[i].thread_id); + for (uint32_t i = 0; i < s_threads_count; i++){ + dap_events_socket_event_signal(s_threads[i].event_exit, 1); pthread_join(s_threads[i].thread_id, NULL); } -#endif + + // Signal to cancel working threads and wait for finish + // TODO: Android realization +//#ifndef DAP_OS_ANDROID +// for (size_t i = 0; i < s_threads_count; i++ ){ +// pthread_cancel(s_threads[i].thread_id); +// pthread_join(s_threads[i].thread_id, NULL); +// } +//#endif } @@ -145,13 +151,15 @@ dap_proc_thread_t * dap_proc_thread_get_auto() static void s_proc_event_callback(dap_events_socket_t * a_esocket, uint64_t a_value) { (void) a_value; -// log_it(L_DEBUG, "--> Proc event callback start"); + if(s_debug_reactor) + log_it(L_DEBUG, "--> Proc event callback start"); dap_proc_thread_t * l_thread = (dap_proc_thread_t *) a_esocket->_inheritor; dap_proc_queue_item_t * l_item = l_thread->proc_queue->item_first; dap_proc_queue_item_t * l_item_old = NULL; bool l_is_anybody_for_repeat=false; while(l_item){ -// log_it(L_INFO, "Proc event callback: %p/%p", l_item->callback, l_item->callback_arg); + if(s_debug_reactor) + log_it(L_INFO, "Proc event callback: %p/%p", l_item->callback, l_item->callback_arg); bool l_is_finished = l_item->callback(l_thread, l_item->callback_arg); if (l_is_finished){ if ( l_item->prev ){ @@ -176,9 +184,11 @@ static void s_proc_event_callback(dap_events_socket_t * a_esocket, uint64_t a_va DAP_DELETE(l_item); l_item = l_thread->proc_queue->item_first; } -// log_it(L_DEBUG, "Proc event finished"); + if(s_debug_reactor) + log_it(L_DEBUG, "Proc event finished"); }else{ -// log_it(L_DEBUG, "Proc event not finished"); + if(s_debug_reactor) + log_it(L_DEBUG, "Proc event not finished"); l_item_old = l_item; l_item=l_item->prev; } @@ -186,7 +196,8 @@ static void s_proc_event_callback(dap_events_socket_t * a_esocket, uint64_t a_va } if(l_is_anybody_for_repeat) // Arm event if we have smth to proc again dap_events_socket_event_signal(a_esocket,1); -// log_it(L_DEBUG, "<-- Proc event callback end"); + if(s_debug_reactor) + log_it(L_DEBUG, "<-- Proc event callback end"); } @@ -393,7 +404,11 @@ static void * s_proc_thread_function(void * a_arg) dap_events_socket_assign_on_worker_mt(l_worker_related->proc_queue_input,l_worker_related); l_thread->proc_event = dap_events_socket_create_type_event_unsafe(NULL, s_proc_event_callback); + l_thread->event_exit = dap_events_socket_create_type_event_unsafe(NULL, s_event_exit_callback); + l_thread->proc_event->_inheritor = l_thread; // we pass thread through it + l_thread->event_exit->_inheritor = l_thread; + size_t l_workers_count= dap_events_worker_get_count(); assert(l_workers_count); l_thread->queue_assign_input = DAP_NEW_Z_SIZE(dap_events_socket_t*, sizeof (dap_events_socket_t*)*l_workers_count ); @@ -435,6 +450,18 @@ static void * s_proc_thread_function(void * a_arg) log_it(L_CRITICAL, "Can't add proc event on epoll ctl, err: %d", errno); return NULL; } + + // Add exit event + l_thread->event_exit->ev.events = l_thread->event_exit->ev_base_flags; + l_thread->event_exit->ev.data.ptr = l_thread->event_exit; + if( epoll_ctl(l_thread->epoll_ctl, EPOLL_CTL_ADD, l_thread->event_exit->socket , &l_thread->event_exit->ev) != 0 ){ +#ifdef DAP_OS_WINDOWS + errno = WSAGetLastError(); +#endif + log_it(L_CRITICAL, "Can't add exit event on epoll ctl, err: %d", errno); + return NULL; + } + for (size_t n = 0; n< dap_events_worker_get_count(); n++){ // Queue asssign @@ -485,6 +512,13 @@ static void * s_proc_thread_function(void * a_arg) l_thread->poll[l_thread->poll_count].events = l_thread->proc_event->poll_base_flags; l_thread->esockets[l_thread->poll_count] = l_thread->proc_event; l_thread->poll_count++; + + // Add exit event + l_thread->poll[l_thread->poll_count].fd = l_thread->event_exit->fd; + l_thread->poll[l_thread->poll_count].events = l_thread->event_exit->poll_base_flags; + l_thread->esockets[l_thread->poll_count] = l_thread->event_exit; + l_thread->poll_count++; + for (size_t n = 0; n< dap_events_worker_get_count(); n++){ dap_events_socket_t * l_queue_assign_input = l_thread->queue_assign_input[n]; @@ -522,6 +556,7 @@ static void * s_proc_thread_function(void * a_arg) dap_proc_thread_assign_esocket_unsafe(l_thread,l_thread->proc_queue->esocket); dap_proc_thread_assign_esocket_unsafe(l_thread,l_thread->proc_event); + dap_proc_thread_assign_esocket_unsafe(l_thread,l_thread->event_exit); for (size_t n = 0; n< dap_events_worker_get_count(); n++){ // Queue asssign @@ -542,8 +577,11 @@ static void * s_proc_thread_function(void * a_arg) pthread_mutex_lock(&l_thread->started_mutex); pthread_mutex_unlock(&l_thread->started_mutex); pthread_cond_broadcast(&l_thread->started_cond); + + l_thread->signal_exit = false; + // Main loop - while (! l_thread->signal_kill){ + while (!l_thread->signal_kill && !l_thread->signal_exit){ int l_selected_sockets; size_t l_sockets_max; @@ -874,7 +912,8 @@ static void * s_proc_thread_function(void * a_arg) } #endif } - log_it(L_NOTICE, "Stop processing thread #%u", l_thread->cpu_id); + log_it(L_ATT, "Stop processing thread #%u", l_thread->cpu_id); + fflush(stdout); // cleanip inputs for (size_t n=0; n<dap_events_worker_get_count(); n++){ @@ -986,3 +1025,13 @@ void dap_proc_thread_worker_exec_callback(dap_proc_thread_t * a_thread, size_t a dap_proc_thread_esocket_update_poll_flags(a_thread, a_thread->queue_callback_input[a_worker_id]); #endif } + +static void s_event_exit_callback( dap_events_socket_t * a_es, uint64_t a_flags) +{ + (void) a_flags; + dap_proc_thread_t * l_thread = (dap_proc_thread_t *) a_es->_inheritor; + l_thread->signal_exit = true; + if(s_debug_reactor) + log_it(L_DEBUG, "Proc_thread :%u signaled to exit", l_thread->cpu_id); +} + diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c index 8b829f7b33566d3e1cf6b6708d748e127e784a33..d57521e7d3c11c89134f8ea819ba67764f13ae35 100644 --- a/dap-sdk/net/core/dap_worker.c +++ b/dap-sdk/net/core/dap_worker.c @@ -998,7 +998,8 @@ static void s_event_exit_callback( dap_events_socket_t * a_es, uint64_t a_flags) { (void) a_flags; a_es->worker->signal_exit = true; - log_it(L_NOTICE, "Worker :%u signaled to exit", a_es->worker->id); + if(s_debug_reactor) + log_it(L_DEBUG, "Worker :%u signaled to exit", a_es->worker->id); } /** @@ -1124,6 +1125,9 @@ void dap_worker_add_events_socket_inter(dap_events_socket_t * a_es_input, dap_ev */ int dap_worker_add_events_socket_unsafe( dap_events_socket_t * a_esocket, dap_worker_t * a_worker ) { + if(s_debug_reactor){ + log_it(L_DEBUG,"Add event socket %p (socket %d )", a_esocket, a_esocket->socket); + } #ifdef DAP_EVENTS_CAPS_EPOLL // Init events for EPOLL a_esocket->ev.events = a_esocket->ev_base_flags ; diff --git a/dap-sdk/net/core/include/dap_proc_thread.h b/dap-sdk/net/core/include/dap_proc_thread.h index caf4ea2e5a155c64996c185025c7432a47a61f46..68537c3dbec148b82389b80e3967260132e0ac51 100644 --- a/dap-sdk/net/core/include/dap_proc_thread.h +++ b/dap-sdk/net/core/include/dap_proc_thread.h @@ -43,6 +43,10 @@ typedef struct dap_proc_thread{ pthread_mutex_t started_mutex; bool signal_kill; + bool signal_exit; + + dap_events_socket_t * event_exit; + #ifdef DAP_EVENTS_CAPS_EPOLL EPOLL_HANDLE epoll_ctl; diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index fe77c04dfa48adb110b01e45fe6ac6c2f0de3f6d..3885d764a163a0adedc5d79cbe6e1608c427e218 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -92,6 +92,7 @@ void _dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, char *l_tx_hash_user_str; char l_tx_hash_str[70]; dap_chain_hash_fast_to_str(&l_tx_hash, l_tx_hash_str, 70); + time_t l_ts_create = (time_t)a_datum->header.ts_created; if(!dap_strcmp(a_hash_out_type, "hex")) l_tx_hash_user_str = dap_strdup(l_tx_hash_str); else @@ -100,8 +101,9 @@ void _dap_chain_datum_tx_out_data(dap_chain_datum_tx_t *a_datum, if(a_ledger == NULL){ dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n Items:\n", l_list_tx_any ? "(emit)" : "", l_tx_hash_user_str); } else { - dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n Token ticker: %s\n Items:\n", - l_list_tx_any ? "(emit)" : "", l_tx_hash_user_str, + char buf[50]; + dap_string_append_printf(a_str_out, "transaction: %s hash: %s\n TS Created: %s Token ticker: %s\n Items:\n", + l_list_tx_any ? "(emit)" : "", l_tx_hash_user_str, dap_ctime_r(&l_ts_create, buf), dap_chain_ledger_tx_get_token_ticker_by_hash(a_ledger, &l_tx_hash)); } DAP_DELETE(l_tx_hash_user_str);