diff --git a/CMakeLists.txt b/CMakeLists.txt index 392122de39b91188ec50eb428e346d4d2656439d..5c920801e9d055f394956fa711ad290bc4e86f77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.6-11") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-12") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/net/client/dap_client.c b/dap-sdk/net/client/dap_client.c index 3f03bcb08d4bb0a8e16b28869ca9d6389cdc12fc..caf4db1444099d4c8ac6d40c6720afeaa69752eb 100644 --- a/dap-sdk/net/client/dap_client.c +++ b/dap-sdk/net/client/dap_client.c @@ -499,7 +499,7 @@ dap_stream_worker_t * dap_client_get_stream_worker(dap_client_t * a_client) } -dap_stream_ch_t * dap_client_get_stream_ch(dap_client_t * a_client, uint8_t a_ch_id) +dap_stream_ch_t * dap_client_get_stream_ch_unsafe(dap_client_t * a_client, uint8_t a_ch_id) { dap_stream_ch_t * l_ch = NULL; dap_client_pvt_t * l_client_internal = a_client ? DAP_CLIENT_PVT(a_client) : NULL; diff --git a/dap-sdk/net/client/include/dap_client.h b/dap-sdk/net/client/include/dap_client.h index ecf7d58d9fb3e83cce092d705fa22120b1dfef73..b9a9c7f25cfec6000fd3ddfd426c75be0b951e89 100644 --- a/dap-sdk/net/client/include/dap_client.h +++ b/dap-sdk/net/client/include/dap_client.h @@ -132,7 +132,7 @@ const char * dap_client_get_error_str(dap_client_t * a_client); const char * dap_client_get_auth_cookie(dap_client_t * a_client); dap_stream_t * dap_client_get_stream(dap_client_t * a_client); dap_stream_worker_t * dap_client_get_stream_worker(dap_client_t * a_client); -dap_stream_ch_t * dap_client_get_stream_ch(dap_client_t * a_client, uint8_t a_ch_id); +dap_stream_ch_t * dap_client_get_stream_ch_unsafe(dap_client_t * a_client, uint8_t a_ch_id); const char * dap_client_get_stream_id(dap_client_t * a_client); void dap_client_set_active_channels (dap_client_t * a_client, const char * a_active_channels); void dap_client_set_auth_cert(dap_client_t * a_client, dap_cert_t *a_cert); diff --git a/dap-sdk/net/core/include/dap_net.h b/dap-sdk/net/core/include/dap_net.h index e2bd58db2feb05794d00e7da32f71dc23680da12..ea9e07e4b65a0322f7eb03d40d9a055376287ce2 100644 --- a/dap-sdk/net/core/include/dap_net.h +++ b/dap-sdk/net/core/include/dap_net.h @@ -30,12 +30,20 @@ #include <mswsock.h> #include <ws2tcpip.h> #include <io.h> + +#include "win32/ip.h" +#include "win32/iphdr.h" + +#define s6_addr32 s6_addr +#define herror perror #else // for Unix-like systems #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <arpa/inet.h> +#include <netinet/in.h> + #endif int dap_net_resolve_host(const char *a_host, int ai_family, struct sockaddr *a_addr_out); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 1d79df09da18128ab6c329f20e011de0cba0efe5..9370189c5073d448654ab172e959763d17da0398 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -106,7 +106,7 @@ static size_t s_max_links_count = 5;// by default 5 // number of required connections static size_t s_required_links_count = 3;// by default 3 -static dap_timerfd_t * s_timer_check = NULL; +static pthread_t s_net_check_pid; /** * @struct dap_chain_net_pvt @@ -119,6 +119,9 @@ typedef struct dap_chain_net_pvt{ #else HANDLE state_proc_cond; #endif + + dap_events_socket_t * event_state_proc; + pthread_mutex_t state_mutex_cond; dap_chain_node_role_t node_role; uint32_t flags; @@ -173,8 +176,8 @@ static const char * c_net_states[]={ static dap_chain_net_t * s_net_new(const char * a_id, const char * a_name , const char * a_node_role); inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state); static int s_net_states_proc(dap_chain_net_t * l_net); -static void s_timer_check_callback ( void * a_net); -static void s_timer_check_start( dap_chain_net_t * a_net ); +static void * s_net_check_thread ( void * a_net); +static void s_net_check_thread_start( dap_chain_net_t * a_net ); static void s_net_proc_kill( dap_chain_net_t * a_net ); int s_net_load(const char * a_net_name, uint16_t a_acl_idx); @@ -229,7 +232,9 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n log_it(L_WARNING,"Already going to state %s",s_net_state_to_str(a_new_state)); } PVT(a_net)->state_target = a_new_state; - pthread_mutex_lock( &PVT(a_net)->state_mutex_cond); + + pthread_mutex_lock( &PVT(a_net)->state_mutex_cond); // Preventing call of state_go_to before wait cond will be armed + pthread_mutex_unlock( &PVT(a_net)->state_mutex_cond); // set flag for sync PVT(a_net)->flags |= F_DAP_CHAIN_NET_GO_SYNC; #ifndef _WIN32 @@ -237,7 +242,6 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n #else SetEvent( PVT(a_net)->state_proc_cond ); #endif - pthread_mutex_unlock( &PVT(a_net)->state_mutex_cond); return 0; } @@ -279,11 +283,11 @@ void dap_chain_net_sync_gdb_broadcast(void *a_arg, const char a_op_code, const c dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t) {}; 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_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id()); + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, dap_stream_ch_chain_get_id()); if (!l_ch_chain) { continue; } - dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id, + dap_stream_ch_chain_pkt_write_mt( dap_client_get_stream_worker(l_node_client->client), l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id, l_chain_id, l_net->pub.cell_id, l_data_out, sizeof(dap_store_obj_pkt_t) + l_data_out->data_size); } @@ -329,13 +333,13 @@ static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chai 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; uint8_t l_ch_id = dap_stream_ch_chain_get_id(); // Channel id for global_db and chains sync - dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, l_ch_id); if (!l_ch_chain) { log_it(L_DEBUG,"Can't get stream_ch for id='%c' ", l_ch_id); continue; } - dap_stream_ch_chain_pkt_write_unsafe(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, l_net->pub.id, - a_chain->id, a_id, a_atom, a_atom_size); + dap_stream_ch_chain_pkt_write_mt( dap_client_get_stream_worker( l_node_client->client), l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, + l_net->pub.id, a_chain->id, a_id, a_atom, a_atom_size); } } } @@ -516,7 +520,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) case NET_STATE_SYNC_GDB:{ for (dap_list_t *l_tmp = l_pvt_net->links; l_tmp; ) { dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data; - dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id()); + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, dap_stream_ch_chain_get_id()); if (!l_ch_chain) { // Channel or stream or client itself closed l_tmp = dap_list_next(l_tmp); dap_chain_node_client_close(l_node_client); @@ -588,7 +592,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) bool l_need_flush = false; for (dap_list_t *l_tmp = l_pvt_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_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id()); + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, dap_stream_ch_chain_get_id()); if (!l_ch_chain) { // Channel or stream or client itself closed l_tmp = dap_list_next(l_tmp); dap_chain_node_client_close(l_node_client); @@ -691,7 +695,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) * @param a_cfg Network1 configuration * @return */ -static void s_timer_check_callback ( void *a_net ) +static void *s_net_check_thread ( void *a_net ) { dap_chain_net_t *l_net = (dap_chain_net_t *)a_net; dap_chain_net_pvt_t *p_net = (dap_chain_net_pvt_t *)(void *)l_net->pvt; @@ -699,38 +703,38 @@ static void s_timer_check_callback ( void *a_net ) // set callback to update data //dap_chain_global_db_set_callback_for_update_base(s_net_proc_thread_callback_update_db); - if ( !(p_net->flags & F_DAP_CHAIN_NET_SHUTDOWN) ) { - dap_events_socket_remove_and_delete_unsafe( s_timer_check->events_socket,false); - } + while(1){ + if ( !(p_net->flags & F_DAP_CHAIN_NET_SHUTDOWN) ) { + return NULL; + } - // check or start sync - s_net_states_proc( l_net ); - if (p_net->flags & F_DAP_CHAIN_NET_GO_SYNC) { - s_net_states_proc( l_net ); - } - struct timespec l_to; - - // checking whether new sync is needed - time_t l_sync_timeout = 180; // 1800 sec = 30 min - clock_gettime(CLOCK_MONOTONIC, &l_to); - // start sync every l_sync_timeout sec - if(l_to.tv_sec >= p_net->last_sync + l_sync_timeout) { - p_net->flags |= F_DAP_CHAIN_NET_GO_SYNC; + // check or start sync s_net_states_proc( l_net ); + if (p_net->flags & F_DAP_CHAIN_NET_GO_SYNC) { + s_net_states_proc( l_net ); + } + struct timespec l_to; + + // checking whether new sync is needed + time_t l_sync_timeout = 180; // 1800 sec = 30 min + clock_gettime(CLOCK_MONOTONIC, &l_to); + // start sync every l_sync_timeout sec + if(l_to.tv_sec >= p_net->last_sync + l_sync_timeout) { + p_net->flags |= F_DAP_CHAIN_NET_GO_SYNC; + s_net_states_proc( l_net ); + } + sleep(10); } + return NULL; } /** * @brief net_proc_start * @param a_cfg */ -static void s_timer_check_start( dap_chain_net_t * a_net ) +static void s_net_check_thread_start( dap_chain_net_t * a_net ) { - if ( ! s_timer_check ){ - dap_timerfd_delete(s_timer_check); - s_timer_check = NULL; - } - s_timer_check=dap_timerfd_start(60000, s_timer_check_callback, a_net ); + pthread_create(&s_net_check_pid,NULL, s_net_check_thread, a_net); } @@ -1739,7 +1743,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) PVT(l_net)->flags |= F_DAP_CHAIN_NET_GO_SYNC; // Start the proc thread - s_timer_check_start(l_net); + s_net_check_thread_start(l_net); log_it(L_NOTICE, "Сhain network \"%s\" initialized",l_net_item->name); dap_config_close(l_cfg); } diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index d312f4f3b8224e91450ded0258d9e2b17ff6b178..17fc21b74105037daad9a3b477f84e4fc74c844f 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -1044,7 +1044,7 @@ int com_node(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) log_it(L_NOTICE, "Stream connection established"); dap_stream_ch_chain_sync_request_t l_sync_request = { { 0 } }; - dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id()); + dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, dap_stream_ch_chain_get_id()); // fill begin id l_sync_request.id_start = (uint64_t) dap_db_log_get_last_id_remote( l_remote_node_info->hdr.address.uint64); @@ -1058,7 +1058,7 @@ int com_node(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) { log_it(L_NOTICE, "Now get node addr"); uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); - dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); + dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch_unsafe(l_node_client->client, l_ch_id); int l_res = dap_chain_node_client_set_callbacks( l_node_client->client, l_ch_id); diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index a95864255192283925b47abae97944b9341fa02e..823c4f91a806468ac79039f4fed2c6abf2323fd0 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -181,14 +181,12 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg) l_node_client->callback_connected(l_node_client, a_arg); l_node_client->keep_connection = true; log_it(L_DEBUG, "Wakeup all who waits"); - pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_CONNECTED; #ifndef _WIN32 - pthread_cond_signal(&l_node_client->wait_cond); + pthread_cond_broadcast(&l_node_client->wait_cond); #else SetEvent( l_node_client->wait_cond ); #endif - pthread_mutex_unlock(&l_node_client->wait_mutex); } } @@ -211,14 +209,12 @@ static void s_ch_chain_callback_notify_packet_in2(dap_stream_ch_chain_net_t* a_c dap_chain_node_addr_t *l_addr = (dap_chain_node_addr_t *) a_pkt_net->data; memcpy(&l_node_client->cur_node_addr, l_addr, sizeof(dap_chain_node_addr_t)); } - pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_NODE_ADDR_LEASED; #ifndef _WIN32 - pthread_cond_signal(&l_node_client->wait_cond); + pthread_cond_broadcast(&l_node_client->wait_cond); #else SetEvent( l_node_client->wait_cond ); #endif - pthread_mutex_unlock(&l_node_client->wait_mutex); break; } // get remote node address @@ -228,14 +224,12 @@ static void s_ch_chain_callback_notify_packet_in2(dap_stream_ch_chain_net_t* a_c dap_chain_node_addr_t *l_addr = (dap_chain_node_addr_t *) a_pkt_net->data; memcpy(&l_node_client->remote_node_addr, l_addr, sizeof(dap_chain_node_addr_t)); } - pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_GET_NODE_ADDR; #ifndef _WIN32 - pthread_cond_signal(&l_node_client->wait_cond); + pthread_cond_broadcast(&l_node_client->wait_cond); #else SetEvent( l_node_client->wait_cond ); #endif - pthread_mutex_unlock(&l_node_client->wait_mutex); break; } } @@ -261,15 +255,13 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha "%s", (char*) a_pkt->data); log_it(L_WARNING, "Received packet DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR with error \"%s\"", l_node_client->last_error); - pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_ERROR; #ifndef _WIN32 - pthread_cond_signal(&l_node_client->wait_cond); + pthread_cond_broadcast(&l_node_client->wait_cond); #else SetEvent( l_node_client->wait_cond ); #endif - pthread_mutex_unlock(&l_node_client->wait_mutex); break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_ALL: case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB: @@ -282,14 +274,12 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha // Process it if need } log_it(L_INFO, "Sync notify without request to sync back, stay in SYNCED state"); - pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_SYNCED; #ifndef _WIN32 - pthread_cond_signal(&l_node_client->wait_cond); + pthread_cond_broadcast(&l_node_client->wait_cond); #else SetEvent( l_node_client->wait_cond ); #endif - pthread_mutex_unlock(&l_node_client->wait_mutex); } default: break; } @@ -317,14 +307,12 @@ static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t* a_ch_ch case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_ALL: case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB: case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS: { - pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_SYNCED; #ifndef _WIN32 - pthread_cond_signal(&l_node_client->wait_cond); + pthread_cond_broadcast(&l_node_client->wait_cond); #else SetEvent( l_node_client->wait_cond ); #endif - pthread_mutex_unlock(&l_node_client->wait_mutex); } break; default: { @@ -399,14 +387,12 @@ static void s_ch_chain_callback_notify_packet_R(dap_stream_ch_chain_net_srv_t* a // todo to write result to database save_stat_to_database(l_request, l_node_client); //... - pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_CHECKED; #ifndef _WIN32 - pthread_cond_signal(&l_node_client->wait_cond); + pthread_cond_broadcast(&l_node_client->wait_cond); #else SetEvent( l_node_client->wait_cond ); #endif - pthread_mutex_unlock(&l_node_client->wait_mutex); break; } } @@ -521,7 +507,7 @@ int dap_chain_node_client_send_ch_pkt(dap_chain_node_client_t *a_client, uint8_t return -1; dap_stream_worker_t *l_stream_worker = dap_client_get_stream_worker(a_client->client); - dap_stream_ch_t * l_ch = dap_client_get_stream_ch(a_client->client, a_ch_id); + dap_stream_ch_t * l_ch = dap_client_get_stream_ch_unsafe(a_client->client, a_ch_id); if(l_ch) { // dap_stream_ch_chain_net_t * l_ch_chain = DAP_STREAM_CH_CHAIN_NET(l_ch); dap_stream_ch_pkt_write_mt(l_stream_worker , l_ch , a_type, a_pkt_data, a_pkt_data_size); @@ -621,7 +607,7 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id) dap_client_pvt_t * l_client_internal = DAP_CLIENT_PVT(a_client); dap_stream_ch_t * l_ch = NULL; if(l_client_internal) - l_ch = dap_client_get_stream_ch(a_client, a_ch_id); + l_ch = dap_client_get_stream_ch_unsafe(a_client, a_ch_id); if(l_ch) { // C if(a_ch_id == dap_stream_ch_chain_get_id()) { diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 15470f9fdc71a2f62996c63565269e0540bf5416..d166e2b156af219ddfcd7256b2368210571ab5d9 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -25,26 +25,11 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #pragma once -#ifndef _WIN32 -#include <sys/socket.h> -#include <netinet/in.h> -#else -#include <winsock2.h> -#include <windows.h> -#include <mswsock.h> -#include <ws2tcpip.h> - -#include "win32/ip.h" -#include "win32/iphdr.h" -#define s6_addr32 s6_addr -#define herror perror -#endif - - #include <stdint.h> #include <string.h> #include "dap_strfuncs.h" #include "dap_string.h" +#include "dap_net.h" #include "dap_chain_common.h" #include "dap_chain_node.h" #include "dap_chain.h" diff --git a/modules/net/include/dap_chain_node_client.h b/modules/net/include/dap_chain_node_client.h index de35fd3d8adb6f41621de7678c5203c57bf6d149..788403989d55ea752d633b7b06356031006027cc 100644 --- a/modules/net/include/dap_chain_node_client.h +++ b/modules/net/include/dap_chain_node_client.h @@ -64,7 +64,7 @@ typedef struct dap_chain_node_client { pthread_cond_t wait_cond; #else HANDLE wait_cond; -#endif + #endif pthread_mutex_t wait_mutex; // For hash indexing diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index 3ad83911090d69415b2a787e7e79098a3d5d5e21..25042bf8d5610074c96305325a5f9c576f2e367f 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -101,7 +101,7 @@ dap_stream_ch_t* dap_chain_net_vpn_client_get_stream_ch(void) { if(!s_vpn_client) return NULL; - dap_stream_ch_t *l_stream = dap_client_get_stream_ch(s_vpn_client->client, DAP_STREAM_CH_ID_NET_SRV_VPN); + dap_stream_ch_t *l_stream = dap_client_get_stream_ch_unsafe(s_vpn_client->client, DAP_STREAM_CH_ID_NET_SRV_VPN); return l_stream; } @@ -468,7 +468,7 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st // send first packet to server { uint8_t l_ch_id = dap_stream_ch_chain_net_srv_get_id(); // Channel id for chain net request = 'R' - dap_stream_ch_t *l_ch = dap_client_get_stream_ch(s_vpn_client->client, l_ch_id); + dap_stream_ch_t *l_ch = dap_client_get_stream_ch_unsafe(s_vpn_client->client, l_ch_id); if(l_ch) { dap_stream_ch_chain_net_srv_pkt_test_t *l_request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_test_t, sizeof(dap_stream_ch_chain_net_srv_pkt_test_t) + a_data_size_to_send); l_request->net_id.uint64 = a_net->pub.id.uint64; @@ -560,7 +560,7 @@ int dap_chain_net_vpn_client_start(dap_chain_net_t *a_net, const char *a_ipv4_st // send first packet to server { uint8_t l_ch_id = dap_stream_ch_chain_net_srv_get_id(); // Channel id for chain net request = 'R' - dap_stream_ch_t *l_ch = dap_client_get_stream_ch(s_vpn_client->client, l_ch_id); + dap_stream_ch_t *l_ch = dap_client_get_stream_ch_unsafe(s_vpn_client->client, l_ch_id); if(l_ch) { dap_stream_ch_chain_net_srv_pkt_request_t l_request; memset(&l_request, 0, sizeof(dap_stream_ch_chain_net_srv_pkt_request_t)); @@ -602,7 +602,7 @@ dap_chain_net_vpn_client_status_t dap_chain_net_vpn_client_status(void) { if(s_vpn_client) { uint8_t l_ch_id = dap_stream_ch_chain_net_srv_get_id(); // Channel id for chain net request = 'R' - dap_stream_ch_t *l_ch = dap_client_get_stream_ch(s_vpn_client->client, l_ch_id); + dap_stream_ch_t *l_ch = dap_client_get_stream_ch_unsafe(s_vpn_client->client, l_ch_id); if(!l_ch) return VPN_CLIENT_STATUS_CONN_LOST; }