diff --git a/CMakeLists.txt b/CMakeLists.txt index fbecb5ed9377df7c5a9f236a2a5ac7918baea81b..e7ae039b5fb50a7dd29e522c460b1c97bc9c5143 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-28") +set(CELLFRAME_SDK_NATIVE_VERSION "2.9-29") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") message("Cellframe modules: ${CELLFRAME_MODULES}") diff --git a/dap-sdk/crypto/src/oaes/oaes_lib.c b/dap-sdk/crypto/src/oaes/oaes_lib.c index 96d06863eec204916e3f47f5aa1914a1c29f80a8..326cbf8b502c299734188acb7e2b7433a04a7795 100755 --- a/dap-sdk/crypto/src/oaes/oaes_lib.c +++ b/dap-sdk/crypto/src/oaes/oaes_lib.c @@ -615,8 +615,9 @@ static OAES_RET oaes_key_gen( OAES_CTX * ctx, size_t key_size ) return OAES_RET_ARG1; oaes_key_destroy( &(_ctx->key_flat) ); - if(_key == NULL) + if(_key == NULL) { return OAES_RET_ARG1; + } _key->data_len = key_size; diff --git a/dap-sdk/net/client/dap_client.c b/dap-sdk/net/client/dap_client.c index cfdcbfcb087aab4ac844ab4e26440e6cc0988225..138c188502380b2ef4192a64bf068deec562db5f 100644 --- a/dap-sdk/net/client/dap_client.c +++ b/dap-sdk/net/client/dap_client.c @@ -439,7 +439,7 @@ const char * dap_client_error_str(dap_client_error_t a_client_error) */ const char * dap_client_get_error_str(dap_client_t * a_client) { - if(a_client == NULL){ + if(a_client == NULL || DAP_CLIENT_PVT(a_client) == NULL){ log_it(L_ERROR,"Client is NULL for dap_client_get_error_str"); return NULL; } diff --git a/dap-sdk/net/client/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c index 94c34ab001ee09f0800ca9e4dd0256d582dacc7d..c1741a56ee5c4a2a499458ecc29665b78ffb981d 100644 --- a/dap-sdk/net/client/dap_client_http.c +++ b/dap-sdk/net/client/dap_client_http.c @@ -286,29 +286,12 @@ static void s_http_read(dap_events_socket_t * a_es, void * arg) } // process http header if(l_http_pvt->is_header_read) { - l_http_pvt->response[l_http_pvt->header_length - 1] = 0; - // search strings in header - char **l_strings = dap_strsplit((char*) l_http_pvt->response, "\r\n", -1); - if(l_strings) { - int i = 0; - while(l_strings[i]) { - char *l_string = l_strings[i]; - char **l_values = dap_strsplit(l_string, ":", 2); - if(l_values && l_values[0] && l_values[1]) - if(!dap_strcmp("Content-Length", l_values[0])) { - l_http_pvt->content_length = atoi(l_values[1]); - l_http_pvt->is_header_read = false; - } - dap_strfreev(l_values); - if(l_http_pvt->content_length) - break; - i++; - } - dap_strfreev(l_strings); + const char *l_token = "Content-Length: "; + char *l_content_len_ptr = strstr((char*)l_http_pvt->response, l_token); + if (l_content_len_ptr) { + l_http_pvt->content_length = atoi(l_content_len_ptr + strlen(l_token)); + l_http_pvt->is_header_read = false; } - - // restore last symbol - l_http_pvt->response[l_http_pvt->header_length - 1] = '\n'; } // process data diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c index 323a66af107fa1530f4a4ba84de8c8c590a624f4..537221e0b2c7e201b55ee3389e6756fcf39dfbdd 100644 --- a/dap-sdk/net/client/dap_client_pvt.c +++ b/dap-sdk/net/client/dap_client_pvt.c @@ -606,6 +606,8 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt) break; case STAGE_STATUS_ERROR: { + if (a_client_pvt->is_to_delete) + break; // limit the number of attempts a_client_pvt->stage_errors++; bool l_is_last_attempt = a_client_pvt->stage_errors > s_max_attempts ? true : false; @@ -613,11 +615,7 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt) // l_is_last_attempt = true; //} - //if (a_client_pvt->is_always_reconnect ){ - // l_is_last_attempt = false; - //} - - log_it(L_ERROR, "Error state( %s), doing callback if present", dap_client_get_error_str(a_client_pvt->client)); + log_it(L_ERROR, "Error state( %s), doing callback if present", dap_client_error_str(a_client_pvt->last_error)); if(a_client_pvt->stage_status_error_callback) a_client_pvt->stage_status_error_callback(a_client_pvt->client, (void*) l_is_last_attempt); @@ -637,16 +635,20 @@ static bool s_stage_status_after(dap_client_pvt_t * a_client_pvt) log_it(L_ERROR,"Can't run timer for small delay before the next enc_init request"); } } else { - - log_it(L_INFO, "Too many attempts, reconnect attempt in %d seconds with %s:%u",s_timeout*3, - a_client_pvt->uplink_addr,a_client_pvt->uplink_port); // Trying the step again - a_client_pvt->stage_status = STAGE_STATUS_IN_PROGRESS; - a_client_pvt->stage_errors = 0; - - // bigger delay before next request - if(dap_timerfd_start( s_timeout*3000,(dap_timerfd_callback_t) s_stage_status_after, - a_client_pvt ) == NULL){ - log_it(L_ERROR,"Can't run timer for bigger delay before the next enc_init request"); + if (a_client_pvt->is_always_reconnect) { + log_it(L_INFO, "Too many attempts, reconnect attempt in %d seconds with %s:%u",s_timeout*3, + a_client_pvt->uplink_addr,a_client_pvt->uplink_port); // Trying the step again + a_client_pvt->stage_status = STAGE_STATUS_IN_PROGRESS; + a_client_pvt->stage_errors = 0; + + // bigger delay before next request + if(dap_timerfd_start( s_timeout*3000,(dap_timerfd_callback_t) s_stage_status_after, + a_client_pvt ) == NULL){ + log_it(L_ERROR,"Can't run timer for bigger delay before the next enc_init request"); + } + } else { + log_it(L_ERROR, "Connet to %s:%u failed", a_client_pvt->uplink_addr, a_client_pvt->uplink_port); + dap_client_delete_mt(a_client_pvt->client); } } } @@ -868,7 +870,8 @@ static void s_request_error(int a_err_code, void * a_obj) if(l_client_pvt && l_client_pvt->request_error_callback && l_client_pvt->client) { - if(l_client_pvt && l_client_pvt->request_error_callback && l_client_pvt->client && l_client_pvt->client->_internal) + if(l_client_pvt && l_client_pvt->request_error_callback + && l_client_pvt->client && l_client_pvt->client->_internal && l_client_pvt->client->_internal == l_client_pvt) l_client_pvt->request_error_callback(l_client_pvt->client, a_err_code); } } @@ -1335,7 +1338,13 @@ static void s_stream_es_callback_write(dap_events_socket_t * a_es, void * arg) */ static void s_stream_es_callback_error(dap_events_socket_t * a_es, int a_error) { - dap_client_pvt_t * l_client_pvt = (dap_client_pvt_t *) a_es->_inheritor; + a_es->flags |= DAP_SOCK_SIGNAL_CLOSE; + dap_client_pvt_t *l_client_pvt = (dap_client_pvt_t *) a_es->_inheritor; + if (!l_client_pvt) + return; + l_client_pvt = dap_client_pvt_find(l_client_pvt->uuid); + if (!l_client_pvt) + return; char l_errbuf[128]; l_errbuf[0]='\0'; @@ -1344,9 +1353,7 @@ static void s_stream_es_callback_error(dap_events_socket_t * a_es, int a_error) else strncpy(l_errbuf,"Unknown Error",sizeof(l_errbuf)-1); - log_it(L_WARNING, "STREAM error \"%s\" (code %d)", l_errbuf, a_error); - - l_client_pvt->stream_es->flags |= DAP_SOCK_SIGNAL_CLOSE; + log_it(L_WARNING, "STREAM error \"%s\" (code %d)", l_errbuf, a_error); if (a_error == ETIMEDOUT) { l_client_pvt->last_error = ERROR_NETWORK_CONNECTION_TIMEOUT; diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c index 741096c7987226aefc7e451da2c896cc3275288c..80c31d96ca1b6a4c18402c7ea1b9f0010c937d50 100644 --- a/dap-sdk/net/core/dap_events_socket.c +++ b/dap-sdk/net/core/dap_events_socket.c @@ -127,6 +127,13 @@ int dap_events_socket_init( ) char l_cmd[256]; snprintf(l_cmd,sizeof (l_cmd),"rm /dev/mqueue/%s-queue_ptr*", dap_get_appname()); system(l_cmd); + FILE *l_mq_msg_max = fopen("/proc/sys/fs/mqueue/msg_max", "w"); + if (l_mq_msg_max) { + fprintf(l_mq_msg_max, "%d", DAP_QUEUE_MAX_MSGS); + fclose(l_mq_msg_max); + } else { + log_it(L_ERROR, "Сan't open /proc/sys/fs/mqueue/msg_max file for writing"); + } #endif dap_timerfd_init(); return 0; @@ -434,9 +441,9 @@ dap_events_socket_t * dap_events_socket_queue_ptr_create_input(dap_events_socket { dap_events_socket_t * l_es = DAP_NEW_Z(dap_events_socket_t); l_es->type = DESCRIPTOR_TYPE_QUEUE; - l_es->buf_out_size_max = 8 * sizeof(void*); + l_es->buf_out_size_max = DAP_QUEUE_MAX_MSGS * sizeof(void*); l_es->buf_out = DAP_NEW_Z_SIZE(byte_t,l_es->buf_out_size_max ); - l_es->buf_in_size_max = 8 * sizeof(void*); + l_es->buf_in_size_max = DAP_QUEUE_MAX_MSGS * sizeof(void*); l_es->buf_in = DAP_NEW_Z_SIZE(byte_t,l_es->buf_in_size_max ); //l_es->buf_out_size = 8 * sizeof(void*); l_es->events = a_es->events; @@ -463,7 +470,7 @@ dap_events_socket_t * dap_events_socket_queue_ptr_create_input(dap_events_socket char l_mq_name[64]; struct mq_attr l_mq_attr; memset(&l_mq_attr,0,sizeof (l_mq_attr)); - l_mq_attr.mq_maxmsg = 8; // Don't think we need to hold more than 1024 messages + l_mq_attr.mq_maxmsg = DAP_QUEUE_MAX_MSGS; // Don't think we need to hold more than 1024 messages l_mq_attr.mq_msgsize = sizeof (void*); // We send only pointer on memory, // so use it with shared memory if you do access from another process snprintf(l_mq_name,sizeof (l_mq_name),"/%s-queue_ptr-%u",dap_get_appname(), a_es->mqd_id ); @@ -556,7 +563,8 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc l_es->worker = a_w; } l_es->callbacks.queue_ptr_callback = a_callback; // Arm event callback - l_es->buf_in_size_max = 8 * sizeof(void*); + l_es->buf_in_size_max = DAP_QUEUE_MAX_MSGS * sizeof(void*); + l_es->buf_in = DAP_NEW_Z_SIZE(byte_t,l_es->buf_in_size_max); l_es->buf_out = NULL; #if defined(DAP_EVENTS_CAPS_EPOLL) @@ -621,7 +629,6 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc char l_file_buf[l_file_buf_size]; memset(l_file_buf, 0, l_file_buf_size); fread(l_file_buf, l_file_buf_size, 1, l_sys_max_pipe_size_fd); - l_sys_max_pipe_size_fd = NULL; uint64_t l_sys_max_pipe_size = strtoull(l_file_buf, 0, 10); fcntl(l_pipe[0], F_SETPIPE_SZ, l_sys_max_pipe_size); fclose(l_sys_max_pipe_size_fd); @@ -633,7 +640,7 @@ dap_events_socket_t * s_create_type_queue_ptr(dap_worker_t * a_w, dap_events_soc struct mq_attr l_mq_attr; static uint32_t l_mq_last_number=0; memset(&l_mq_attr,0,sizeof (l_mq_attr)); - l_mq_attr.mq_maxmsg = 8; // Don't think we need to hold more than 1024 messages + l_mq_attr.mq_maxmsg = DAP_QUEUE_MAX_MSGS; // Don't think we need to hold more than 1024 messages l_mq_attr.mq_msgsize = sizeof (void*); // We send only pointer on memory, // so use it with shared memory if you do access from another process snprintf(l_mq_name,sizeof (l_mq_name),"/%s-queue_ptr-%u",dap_get_appname(),l_mq_last_number ); diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h index b756ef154722f7e8e510c72cf64903c06aa08515..e7463c46cb389a2b737f296e40ce60c5030180b3 100644 --- a/dap-sdk/net/core/include/dap_events_socket.h +++ b/dap-sdk/net/core/include/dap_events_socket.h @@ -143,6 +143,7 @@ typedef struct dap_events_socket_callbacks { } dap_events_socket_callbacks_t; #define DAP_EVENTS_SOCKET_BUF 100000 +#define DAP_QUEUE_MAX_MSGS 8 typedef enum { DESCRIPTOR_TYPE_SOCKET_CLIENT = 0, diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_client.c b/dap-sdk/net/server/http_server/http_client/dap_http_client.c index 6a93998d27e8591b9de3c85005986c2698e9156f..f3bbcc5f9330b3ba73d43dec4cd1057f22e8d3af 100644 --- a/dap-sdk/net/server/http_server/http_client/dap_http_client.c +++ b/dap-sdk/net/server/http_server/http_client/dap_http_client.c @@ -647,9 +647,9 @@ void dap_http_client_out_header_generate(dap_http_client_t *a_http_client) log_it(L_DEBUG,"output: Content-Type = '%s'",a_http_client->out_content_type); } if ( a_http_client->out_content_length ) { - dap_snprintf(buf,sizeof(buf),"%"DAP_UINT64_FORMAT_U"",(unsigned long long)a_http_client->out_content_length); + dap_snprintf(buf,sizeof(buf),"%"DAP_UINT64_FORMAT_u"",a_http_client->out_content_length); dap_http_header_add(&a_http_client->out_headers,"Content-Length",buf); - log_it(L_DEBUG,"output: Content-Length = %"DAP_UINT64_FORMAT_U"",a_http_client->out_content_length); + log_it(L_DEBUG,"output: Content-Length = %"DAP_UINT64_FORMAT_u"",a_http_client->out_content_length); } }else if (s_debug_http) diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c index 9f19d041c5e5377bf8e75759f69781da871a6a6c..ba48ef50dccc779073b509be2e76c141fcd4c9dd 100644 --- a/dap-sdk/net/stream/stream/dap_stream.c +++ b/dap-sdk/net/stream/stream/dap_stream.c @@ -664,14 +664,13 @@ size_t dap_stream_data_proc_read (dap_stream_t *a_stream) // log_it(DEBUG,"No prefill or defrag buffer, process directly buf_in"); // Now lets see how many packets we have in buffer now while ( (pkt = dap_stream_pkt_detect( proc_data , bytes_left_to_read)) ){ - if(bytes_left_to_read -((byte_t*)pkt- proc_data ) >=sizeof (dap_stream_pkt_t)){ - if(pkt->hdr.size > STREAM_PKT_SIZE_MAX ){ - //log_it(L_ERROR, "stream_pkt_detect() Too big packet size %u", - // pkt->hdr.size); - bytes_left_to_read=0; - break; - } + if(pkt->hdr.size > STREAM_PKT_SIZE_MAX ){ + //log_it(L_ERROR, "stream_pkt_detect() Too big packet size %u", + // pkt->hdr.size); + bytes_left_to_read=0; + break; } + size_t pkt_offset=( ((uint8_t*)pkt)- proc_data ); bytes_left_to_read -= pkt_offset ; found_sig=true; diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c index 645875763a6453aba0647717e7a605cd1ef7d2c0..542d5758af4b53788311cf2a6543c897cca5ef88 100644 --- a/modules/global-db/dap_chain_global_db_driver.c +++ b/modules/global-db/dap_chain_global_db_driver.c @@ -325,9 +325,9 @@ dap_store_obj_t *dap_store_unpacket_multiple(const dap_store_obj_pkt_t *pkt, siz memcpy(obj->key, pkt->data + offset, str_length); offset += str_length; - if (offset+sizeof (uint32_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value_length' field"); break;} // Check for buffer boundries - memcpy(&obj->value_len, pkt->data + offset, sizeof(uint32_t)); - offset += sizeof(uint32_t); + if (offset+sizeof (size_t)> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value_length' field"); break;} // Check for buffer boundries + memcpy(&obj->value_len, pkt->data + offset, sizeof(size_t)); + offset += sizeof(size_t); if (offset+obj->value_len> pkt->data_size) {log_it(L_ERROR, "Broken GDB element: can't read 'value' field"); break;} // Check for buffer boundries obj->value = DAP_NEW_Z_SIZE(uint8_t, obj->value_len + 1); diff --git a/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c b/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c index 079cd913b5732c513d22c670ed727c307a0ed3ed..4b234c34f7e77afbf603d3fa7902f401acaae6e0 100644 --- a/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c +++ b/modules/modules_dynamic/cdb/dap_modules_dynamic_cdb.c @@ -32,38 +32,53 @@ #define LOG_TAG "dap_http" static const char * s_default_path_modules = "var/modules"; +static void *s_cdb_handle = NULL; -int dap_modules_dynamic_load_cdb(dap_http_t * a_server){ +void dap_modules_dynamic_close_cdb() +{ + if (s_cdb_handle) { + dlclose(s_cdb_handle); + s_cdb_handle = NULL; + } +} + +void *dap_modules_dynamic_get_cdb_func(const char *a_func_name) +{ char l_lib_path[MAX_PATH] = {'\0'}; + void *l_ref_func = NULL; + // find func from dynamic library #if defined (DAP_OS_LINUX) && !defined (__ANDROID__) const char * l_cdb_so_name = "libcellframe-node-cdb.so"; - dap_sprintf(l_lib_path, "%s/%s/%s", g_sys_dir_path, s_default_path_modules, l_cdb_so_name); + if (!s_cdb_handle) { + dap_sprintf(l_lib_path, "%s/%s/%s", g_sys_dir_path, s_default_path_modules, l_cdb_so_name); - void* l_cdb_handle = NULL; - l_cdb_handle = dlopen(l_lib_path, RTLD_NOW); - if(!l_cdb_handle){ - log_it(L_ERROR,"Can't load %s module: %s", l_cdb_so_name, dlerror()); - return -1; + s_cdb_handle = dlopen(l_lib_path, RTLD_NOW); + if (!s_cdb_handle) { + log_it(L_ERROR,"Can't load %s module: %s", l_cdb_so_name, dlerror()); + return NULL; + } } - int (*dap_chain_net_srv_vpn_cdb_init)(dap_http_t*); - const char * l_init_func_name = "dap_chain_net_srv_vpn_cdb_init"; - *(void **) (&dap_chain_net_srv_vpn_cdb_init) = dlsym(l_cdb_handle, l_init_func_name); - char* error; - if (( error = dlerror()) != NULL) { - log_it(L_ERROR,"%s module: %s error loading (%s)", l_cdb_so_name, l_init_func_name, error); - return -2; - } + l_ref_func = dlsym(s_cdb_handle, a_func_name); - int l_init_res = (*dap_chain_net_srv_vpn_cdb_init)(a_server); - if(l_init_res){ - log_it(L_ERROR,"%s: %s returns %d", l_cdb_so_name, l_init_func_name, error); - return -3; + if (!l_ref_func) { + log_it(L_ERROR,"%s module: %s error loading (%s)", l_cdb_so_name, a_func_name, dlerror()); + return NULL; } - - return 0; #else log_it(L_ERROR,"%s: module is not supported on current platfrom", __PRETTY_FUNCTION__); - return -3; #endif + return l_ref_func; +} + +int dap_modules_dynamic_load_cdb(dap_http_t * a_server) +{ + int (*dap_chain_net_srv_vpn_cdb_init)(dap_http_t *); + dap_chain_net_srv_vpn_cdb_init = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_init"); + int l_init_res = dap_chain_net_srv_vpn_cdb_init(a_server); + if (l_init_res) { + log_it(L_ERROR,"dap_modules_dynamic: dap_chain_net_srv_vpn_cdb_init returns %d", l_init_res); + return -3; + } + return 0; } diff --git a/modules/modules_dynamic/cdb/include/dap_modules_dynamic_cdb.h b/modules/modules_dynamic/cdb/include/dap_modules_dynamic_cdb.h index 492b98c71127b030ed44527e276fa41eeda9d9e1..5f395b833ac6c5342b46cbd54932c086c8d62773 100644 --- a/modules/modules_dynamic/cdb/include/dap_modules_dynamic_cdb.h +++ b/modules/modules_dynamic/cdb/include/dap_modules_dynamic_cdb.h @@ -26,4 +26,5 @@ #include "dap_http.h" int dap_modules_dynamic_load_cdb(dap_http_t * a_server); - +void *dap_modules_dynamic_get_cdb_func(const char *a_func_name); +void dap_modules_dynamic_close_cdb(); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 6dfd45a8ef99b8afdffb8493c5dfb052c9c3ddaa..a54f91f39d300c41a993c758f6fed23ba895e36e 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -392,7 +392,7 @@ static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chai pthread_rwlock_rdlock(&PVT(l_net)->rwlock); for (dap_list_t *l_tmp = PVT(l_net)->links; l_tmp; l_tmp = dap_list_next(l_tmp)) { dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data; - dap_worker_t * l_worker = dap_client_get_stream_worker( l_node_client->client); + dap_stream_worker_t * l_worker = dap_client_get_stream_worker( l_node_client->client); if(l_worker) dap_stream_ch_chain_pkt_write_mt(l_worker, l_node_client->ch_chain_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, l_net->pub.id.uint64, a_chain->id.uint64, a_id.uint64, a_atom, a_atom_size); diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index e1c0cd0ae665ab0d0f17a59a938bf6ff5d23b56f..9c8ffa7d18299fdac22f5b512c3ddd4abc7b8720 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -271,6 +271,7 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg) dap_stream_t * l_stream = dap_client_get_stream(a_client); if (l_stream) { l_node_client->esocket_uuid = l_stream->esocket->uuid; + l_node_client->stream_worker = l_stream->stream_worker; if (l_node_client->keep_connection) { dap_events_socket_uuid_t *l_uuid = DAP_NEW(dap_events_socket_uuid_t); memcpy(l_uuid, &l_node_client->uuid, sizeof(dap_events_socket_uuid_t)); @@ -628,7 +629,7 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no a_node_client->client = dap_client_new(a_node_client->events, s_stage_status_callback, s_stage_status_error_callback); a_node_client->keep_connection = true; - dap_client_set_is_always_reconnect(a_node_client->client, true); + dap_client_set_is_always_reconnect(a_node_client->client, false); a_node_client->client->_inheritor = a_node_client; dap_client_set_active_channels_unsafe(a_node_client->client, a_active_channels); @@ -691,6 +692,10 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client) inet_ntop(AF_INET, &a_client->info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN); log_it(L_INFO, "Closing node client to uplink %s:%d", l_node_addr_str, a_client->info->hdr.ext_port); // clean client + DAP_CLIENT_PVT(a_client->client)->stage_status_error_callback = NULL; + a_client->client->_inheritor = NULL; + if (a_client->stream_worker) + dap_events_socket_remove_and_delete_mt(a_client->stream_worker->worker, a_client->esocket_uuid); dap_client_delete_mt(a_client->client); #ifndef _WIN32 pthread_cond_destroy(&a_client->wait_cond); @@ -698,7 +703,6 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client) CloseHandle( a_client->wait_cond ); #endif pthread_mutex_destroy(&a_client->wait_mutex); - a_client->client->_inheritor = NULL; a_client->client = NULL; dap_chain_node_client_handle_t * l_client_found = NULL; HASH_FIND(hh,s_clients,&a_client->uuid,sizeof(a_client->uuid),l_client_found); diff --git a/modules/net/srv/CMakeLists.txt b/modules/net/srv/CMakeLists.txt index 54d4d4be1e00cd1770be36a7ec91907aa3e86b9d..70e34da69704e70015fa7b91f5c9d6f2292b6148 100644 --- a/modules/net/srv/CMakeLists.txt +++ b/modules/net/srv/CMakeLists.txt @@ -7,7 +7,7 @@ file(GLOB DAP_CHAIN_NET_SRV_HEADERS include/*.h libmaxminddb/*.h) add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_SRCS} ${DAP_CHAIN_NET_SRV_HEADERS}) -target_link_libraries(dap_chain_net_srv dap_core dap_crypto dap_chain dap_chain_net dap_chain_wallet) +target_link_libraries(dap_chain_net_srv dap_core dap_crypto dap_chain dap_chain_net dap_chain_wallet dap_modules_dynamic_cdb) target_include_directories(dap_chain_net_srv INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/modules/net/srv/dap_chain_net_srv.c b/modules/net/srv/dap_chain_net_srv.c index a3de7a17fb2b51dfa0f8a2fcde6f35395c8392b8..abec2696aeb8f709f6f07f660ca55ec1b6846a14 100644 --- a/modules/net/srv/dap_chain_net_srv.c +++ b/modules/net/srv/dap_chain_net_srv.c @@ -60,6 +60,7 @@ #include "dap_chain_net_srv.h" #include "dap_chain_net_srv_order.h" #include "dap_chain_net_srv_stream_session.h" +#include "dap_modules_dynamic_cdb.h" #include "dap_chain_node_cli_cmd.h" @@ -178,29 +179,6 @@ void dap_chain_net_srv_deinit(void) dap_chain_net_srv_del_all(); } - -static void* get_cdb_func(const char *func_name) -{ - void *l_ref_func = NULL; - // find func from dynamic library -#if defined (DAP_OS_LINUX) && !defined (__ANDROID__) && defined(DAP_MODULES_DYNAMIC) - const char * s_default_path_modules = "var/modules"; - const char * l_cdb_so_name = "libcellframe-node-cdb.so"; - char *l_lib_path = dap_strdup_printf("%s/%s/%s", g_sys_dir_path, s_default_path_modules, l_cdb_so_name); - void* l_cdb_handle = NULL; - l_cdb_handle = dlopen(l_lib_path, RTLD_NOW); - DAP_DELETE(l_lib_path); - if(!l_cdb_handle) { - log_it(L_ERROR, "Can't load %s module: %s", l_cdb_so_name, dlerror()); - } - else { - l_ref_func = dlsym(l_cdb_handle, func_name); - dlclose(l_cdb_handle); - } -#endif - return l_ref_func; -} - /** * @brief s_cli_net_srv * @param argc @@ -554,10 +532,9 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re } }else if( dap_strcmp( l_order_str, "recheck" ) == 0 ){ //int dap_chain_net_srv_vpn_cdb_server_list_check_orders(dap_chain_net_t *a_net); - int (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(dap_chain_net_t *a_net) = NULL; - *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_check_orders) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_check_orders"); - int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders ? (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(l_net) : -5; - //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders(l_net); + int (*dap_chain_net_srv_vpn_cdb_server_list_check_orders)(dap_chain_net_t *a_net); + dap_chain_net_srv_vpn_cdb_server_list_check_orders = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_check_orders"); + int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_check_orders ? dap_chain_net_srv_vpn_cdb_server_list_check_orders(l_net) : -5; ret = (l_init_res > 0) ? 0 : -10; }else if( dap_strcmp( l_order_str, "static" ) == 0 ){ @@ -570,12 +547,11 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re int (*dap_chain_net_srv_vpn_cdb_server_list_static_delete)(dap_chain_net_t *a_net) = NULL; // find func from dinamic library if(l_subcmd_save || l_subcmd_del) { - *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_static_create) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_create"); - *(void **) (&dap_chain_net_srv_vpn_cdb_server_list_static_delete) = get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_delete"); + dap_chain_net_srv_vpn_cdb_server_list_static_create = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_create"); + dap_chain_net_srv_vpn_cdb_server_list_static_delete = dap_modules_dynamic_get_cdb_func("dap_chain_net_srv_vpn_cdb_server_list_static_delete"); } if(l_subcmd_save) { - int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create ? (*dap_chain_net_srv_vpn_cdb_server_list_static_create)(l_net) : -5; - //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create(l_net); + int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_create ? dap_chain_net_srv_vpn_cdb_server_list_static_create(l_net) : -5; if(l_init_res >= 0){ dap_string_append_printf(l_string_ret, "Static node list saved, %d orders in list\n", l_init_res); ret = 0; @@ -586,8 +562,7 @@ static int s_cli_net_srv( int argc, char **argv, void *arg_func, char **a_str_re } } else if(l_subcmd_del) { - int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete ? (*dap_chain_net_srv_vpn_cdb_server_list_static_delete)(l_net) : -5; - //int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete(l_net); + int l_init_res = dap_chain_net_srv_vpn_cdb_server_list_static_delete ? dap_chain_net_srv_vpn_cdb_server_list_static_delete(l_net) : -5; if(!l_init_res){ dap_string_append_printf(l_string_ret, "Static node list deleted\n"); ret = 0; diff --git a/modules/service/vpn/CMakeLists.txt b/modules/service/vpn/CMakeLists.txt index 9383e4082f41b431e5e78cd81f503898e1d44044..30e2258599f8a27aaac447963f2206034dbe6b67 100644 --- a/modules/service/vpn/CMakeLists.txt +++ b/modules/service/vpn/CMakeLists.txt @@ -15,7 +15,7 @@ endif() add_library(${PROJECT_NAME} STATIC ${DAP_CHAIN_NET_SRV_VPN_SRCS} ${DAP_CHAIN_NET_SRV_VPN_HEADERS}) -target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_stream dap_stream_ch_chain_net_srv dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_stream dap_stream_ch_chain_net_srv dap_chain dap_chain_crypto dap_chain_net dap_chain_net_srv dap_modules_dynamic_cdb) add_definitions("-DDAP_TUN_IN_WORKER") target_include_directories(${PROJECT_NAME} INTERFACE .) diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index 5034adb19a356c15ee43a7271fc6050261c71e32..c653df47a16de9735a236c415e021433ab92208c 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -79,7 +79,6 @@ #include "dap_chain_net_srv.h" #include "dap_chain_net_srv_client.h" #include "dap_chain_net_srv_vpn.h" -#include "dap_chain_net_srv_vpn_cdb.h" #include "dap_chain_net_srv_stream_session.h" #include "dap_chain_net_vpn_client.h" #include "dap_chain_net_vpn_client_tun.h" diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index c41ca37e10a2eca76e11855fec0ff643a35e16a1..4021249ad7183dc948d52fdd2c0d4cfb7f013555 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -58,16 +58,13 @@ #include "dap_chain_mempool.h" #include "dap_chain_node_cli.h" #include "dap_chain_net_srv_vpn.h" -#include "dap_chain_net_srv_vpn_cdb.h" // for DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX #include "dap_chain_net_vpn_client.h" #include "dap_stream_ch_pkt.h" #include "dap_stream_ch_chain_net_srv.h" -//#include "dap_stream_ch_chain_net_srv.h" #include "dap_chain_net_vpn_client_tun.h" #include "dap_chain_net_srv_vpn_cmd.h" -#include "dap_chain_net_srv_vpn_cdb_server_list.h" -//#include "dap_chain_net_vpn_client_data.h" +#include "dap_modules_dynamic_cdb.h" /* #if !defined( dap_http_client_state_t ) @@ -416,7 +413,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st if(a_timeout_test_ms==-1) a_timeout_test_ms = 10000; // default 5 sec = 5000 ms - int l_timeout_conn_ms = 5000; + int l_timeout_conn_ms = 25000; int l_ret = 0; if(!a_ipv4_str) // && !a_ipv6_str) @@ -437,7 +434,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st if(a_ipv6_str) inet_pton(AF_INET6, a_ipv6_str, &(s_node_info->hdr.ext_addr_v6)); - s_vpn_client = dap_chain_node_client_connect_channels(a_net, s_node_info, l_active_channels); + s_vpn_client = dap_chain_node_client_create_n_connect(a_net, s_node_info, l_active_channels, NULL, NULL); if(!s_vpn_client) { log_it(L_ERROR, "Can't connect to VPN server=%s:%d", a_ipv4_str, a_port); // clean client struct diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn.h b/modules/service/vpn/include/dap_chain_net_srv_vpn.h index cb396c969577d647c4e59f48d42a22ee7e535f2d..810330bb7b254f9dde8bb34a31a4b9db14fd1382 100644 --- a/modules/service/vpn/include/dap_chain_net_srv_vpn.h +++ b/modules/service/vpn/include/dap_chain_net_srv_vpn.h @@ -29,6 +29,7 @@ #include "dap_chain_net_srv.h" #include "dap_events.h" +#define DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX "srv.vpn" #define DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_CLIENT 0x01 #define DAP_STREAM_CH_PKT_TYPE_NET_SRV_VPN_DATA 0x02 diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb.h b/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb.h deleted file mode 100644 index 94e0772aa5314e45d065e7be31a893a0b2de662e..0000000000000000000000000000000000000000 --- a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Authors: - * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> - * DeM Labs Inc. https://demlabs.net - * CellFrame https://cellframe.net - * Sources https://gitlab.demlabs.net/cellframe - * Copyright (c) 2017-2019 - * All rights reserved. - - This file is part of CellFrame SDK the open source project - - CellFrame SDK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - CellFrame SDK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>. -*/ -#pragma once -#include "dap_http.h" -#include "dap_enc_http.h" -#include "dap_config.h" - -#define DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX "srv.vpn" - -extern dap_config_t * g_dap_config_cdb; - -int dap_chain_net_srv_vpn_cdb_init(dap_http_t * a_http); -void dap_chain_net_srv_vpn_cdb_deinit(); -void dap_chain_net_srv_vpn_cdb_auth_after(enc_http_delegate_t* a_delegate, const char * a_login, const char * a_pkey_b64 ); diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h b/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h deleted file mode 100644 index 820d9f81936a8ada6244ff6706c28434aeba1003..0000000000000000000000000000000000000000 --- a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_auth.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Authors: - * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> - * DeM Labs Inc. https://demlabs.net - * CellFrame https://cellframe.net - * Sources https://gitlab.demlabs.net/cellframe - * Copyright (c) 2017-2020 - * All rights reserved. - - This file is part of CellFrame SDK the open source project - - CellFrame SDK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - CellFrame SDK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>. -*/ -#pragma once - -#include "dap_http.h" -#include "dap_enc_http.h" - -typedef struct dap_serial_key { - struct { - char serial[20]; - time_t activated; // if set, then serial is activated - // if zero then time no expired - union{ - time_t expired; - int64_t license_length;// in sec - }; - int32_t pkey_type;// dap_enc_key_type_t pkey type - size_t ext_size; - }DAP_ALIGN_PACKED header; - uint8_t ext[];// pkey here -}DAP_ALIGN_PACKED dap_serial_key_t; - -size_t dap_serial_key_len(dap_serial_key_t *a_serial_key); -dap_serial_key_t* dap_chain_net_srv_vpn_cdb_auth_get_serial_param(const char *a_serial_str, const char **a_group_out); - -int dap_chain_net_srv_vpn_cdb_auth_init (const char * a_domain, const char * a_mode, bool a_is_registration_open); -void dap_chain_net_srv_vpn_cdb_auth_deinit(); - -void dap_chain_net_srv_vpn_cdb_auth_add_proc(dap_http_t * a_http, const char * a_url); -void dap_chain_net_srv_vpn_cdb_auth_set_callback(dap_enc_http_callback_t a_callback_success); -int dap_chain_net_srv_vpn_cdb_auth_cli_cmd_serial(const char *a_serial_str, int a_arg_index, int a_argc, char ** a_argv, char **a_str_reply); -int dap_chain_net_srv_vpn_cdb_auth_cli_cmd_user(const char *a_user_str, int a_arg_index, int a_argc, char ** a_argv, char **a_str_reply); - -int dap_chain_net_srv_vpn_cdb_auth_check_login(const char * a_login, const char * a_password); -int dap_chain_net_srv_vpn_cdb_auth_activate_serial(const char * a_serial_raw, const char * a_serial, const char * a_sign, const char * a_pkey); -int dap_chain_net_srv_vpn_cdb_auth_check_serial(const char * a_serial, const char * a_pkey); diff --git a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_server_list.h b/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_server_list.h deleted file mode 100644 index 1aa4f8be6c3d5aed3da64426dff8392cbe31cbb5..0000000000000000000000000000000000000000 --- a/modules/service/vpn/include/dap_chain_net_srv_vpn_cdb_server_list.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Authors: - * Dmitriy A. Gearasimov <gerasimov.dmitriy@demlabs.net> - * Alexander Lysikov <alexander.lysikov@demlabs.net> - * DeM Labs Inc. https://demlabs.net - * CellFrame https://cellframe.net - * Sources https://gitlab.demlabs.net/cellframe - * Copyright (c) 2017-2019 - * All rights reserved. - - This file is part of CellFrame SDK the open source project - - CellFrame SDK is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - CellFrame SDK is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with any CellFrame SDK based project. If not, see <http://www.gnu.org/licenses/>. -*/ - -#pragma once - -#include "dap_enc_http.h" -#include <stdbool.h> - -struct dap_http; - -int get_order_state(dap_chain_node_addr_t a_node_addr); - -int dap_chain_net_srv_vpn_cdb_server_list_init(void); -void dap_chain_net_srv_vpn_cdb_server_list_deinit(void); -void dap_chain_net_srv_vpn_cdb_server_list_add_proc(struct dap_http * sh, const char * url); - -void dap_chain_net_srv_vpn_cdb_server_list_cache_reset(void); -int dap_chain_net_srv_vpn_cdb_server_list_static_create(dap_chain_net_t *a_net); -