diff --git a/CMakeLists.txt b/CMakeLists.txt index f3633b819cf59e489340dfd74522eb695ae63020..6674d2d72a5583ec16cdf69cb9d6bfe559a16b91 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-54") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-55") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 97984100805038c474e8d6815424dd269eef1219..5d635959b24720673871e6e768a148e03365c3d1 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -565,12 +565,10 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) (dap_stream_ch_chain_sync_request_t *) l_chain_pkt->data; memcpy(&l_ch_chain->request, l_request, l_chain_pkt_data_size); memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(l_chain_pkt->hdr)); - - dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker); - dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_gdb_callback, a_ch); log_it(L_INFO, "In: SYNC_GLOBAL_DB pkt: net 0x%016x chain 0x%016x cell 0x%016x, range between %u and %u", l_ch_chain->request_hdr.net_id.uint64 , l_ch_chain->request_hdr.chain_id.uint64, l_ch_chain->request_hdr.cell_id.uint64, l_ch_chain->request.id_start, l_ch_chain->request.id_end ); + if(l_ch_chain->state != CHAIN_STATE_IDLE) { log_it(L_INFO, "Can't process SYNC_GLOBAL_DB request because not in idle state"); dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, @@ -583,10 +581,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) else { log_it(L_ERROR, "Get DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB session_id=%u bad request", a_ch->stream->session->id); - dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, - l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, - "ERROR_SYNC_GLOBAL_DB_REQUEST_BAD"); - dap_stream_ch_set_ready_to_write_unsafe(a_ch, true); + dap_events_socket_remove_from_worker_unsafe(a_ch->stream->esocket, a_ch->stream_worker->worker); + dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_gdb_callback, a_ch); } }else{ log_it(L_WARNING, "DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB: Wrong chain packet size %zd when expected %zd", l_chain_pkt_data_size, sizeof(l_ch_chain->request)); @@ -607,7 +603,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) log_it(L_WARNING,"Incorrect data size %zd in packet DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_CHAIN", l_chain_pkt_data_size); dap_stream_ch_chain_pkt_write_error(a_ch, l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, - "ERROR_CHAIN_PACKET_TYPE_FIRST_CHAIN_INCORRET_DATA_SIZE"); + "ERROR_CHAIN_PACKET_TYPE_FIRST_CHAIN_INCORRET_DATA_SIZE(%zd/%zd)",l_chain_pkt_data_size, sizeof(dap_chain_node_addr_t)); } } break; diff --git a/modules/channel/chain/include/dap_stream_ch_chain_pkt.h b/modules/channel/chain/include/dap_stream_ch_chain_pkt.h index ae718a35bf8de012426777f25357c9e5b2c13224..4fd1b254e7077bd551d2a944f64b50d396551caa 100644 --- a/modules/channel/chain/include/dap_stream_ch_chain_pkt.h +++ b/modules/channel/chain/include/dap_stream_ch_chain_pkt.h @@ -26,6 +26,7 @@ #include <stdint.h> #include <stddef.h> #include <string.h> +#include <stdarg.h> #include "dap_common.h" #include "dap_chain_common.h" @@ -55,9 +56,9 @@ typedef enum dap_stream_ch_chain_state{ CHAIN_STATE_IDLE=0, - CHAIN_STATE_SYNC_CHAINS, - CHAIN_STATE_SYNC_GLOBAL_DB, - CHAIN_STATE_SYNC_ALL + CHAIN_STATE_SYNC_CHAINS=1, + CHAIN_STATE_SYNC_GLOBAL_DB=2, + CHAIN_STATE_SYNC_ALL=3 } dap_stream_ch_chain_state_t; typedef struct dap_stream_ch_chain_sync_request{ @@ -106,7 +107,20 @@ size_t dap_stream_ch_chain_pkt_write_mt(dap_stream_worker_t *a_worker, dap_strea const void * a_data, size_t a_data_size); inline static size_t dap_stream_ch_chain_pkt_write_error(dap_stream_ch_t *a_ch, dap_chain_net_id_t a_net_id, - dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, const char * a_err_string ) + dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, const char * a_err_string_format,... ) { - return dap_stream_ch_chain_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR, a_net_id, a_chain_id, a_cell_id, a_err_string,strlen (a_err_string)+1 ); + va_list l_va; + char * l_str; + va_start(l_va, a_err_string_format); + int l_size = vsnprintf(NULL,0,a_err_string_format,l_va); + if(l_size >0){ + l_size++; + l_str = DAP_NEW_S_SIZE(char, l_size); + vsnprintf(l_str,l_size,a_err_string_format,l_va); + va_end(l_va); + return dap_stream_ch_chain_pkt_write_unsafe( a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_ERROR, a_net_id, a_chain_id, a_cell_id, l_str,l_size ); + }else{ + va_end(l_va); + return 0; + } } diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index aac0e599e44eb706b08d5701a8f42af536baa53f..940b411ceb809fc9e4e1466bfcd6a09f3ead25fa 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -99,8 +99,9 @@ #define LOG_TAG "chain_net" -#define F_DAP_CHAIN_NET_SHUTDOWN ( 1 << 9 ) -#define F_DAP_CHAIN_NET_GO_SYNC ( 1 << 10 ) +#define F_DAP_CHAIN_NET_SYNC_FROM_ZERO ( 1 << 8 ) +#define F_DAP_CHAIN_NET_SHUTDOWN ( 1 << 9 ) +#define F_DAP_CHAIN_NET_GO_SYNC ( 1 << 10 ) // maximum number of connections static size_t s_max_links_count = 5;// by default 5 @@ -1124,6 +1125,12 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) } } else if( l_sync_str) { + + const char * l_sync_mode_str = "updates"; + dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-mode", &l_sync_mode_str); + if ( !dap_strcmp(l_sync_mode_str,"all") ) + dap_chain_net_get_flag_sync_from_zero(l_net); + if ( strcmp(l_sync_str,"all") == 0 ) { dap_chain_node_cli_set_reply_text(a_str_reply, "SYNC_ALL state requested to state machine. Current state: %s\n", @@ -2016,6 +2023,29 @@ dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net) return l_node_list; } +/** + * @brief dap_chain_net_set_flag_sync_from_zero + * @param a_net + * @param a_flag_sync_from_zero + */ +void dap_chain_net_set_flag_sync_from_zero( dap_chain_net_t * a_net, bool a_flag_sync_from_zero) +{ + if( a_flag_sync_from_zero) + PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO; + else + PVT(a_net)->flags ^= F_DAP_CHAIN_NET_SYNC_FROM_ZERO; +} + +/** + * @brief dap_chain_net_get_flag_sync_from_zero + * @param a_net + * @return + */ +bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net) +{ + return PVT(a_net)->flags &F_DAP_CHAIN_NET_SYNC_FROM_ZERO ; +} + /** * @brief dap_chain_net_proc_datapool * @param a_net diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index c59c2aee0fc5398353d28912c1f1609eda16d752..f35e099d4680f994c652d55afc179fcc8af90dcc 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -85,6 +85,9 @@ inline static int dap_chain_net_sync_all(dap_chain_net_t * a_net) { return dap_c void dap_chain_net_delete( dap_chain_net_t * a_net); void dap_chain_net_proc_mempool (dap_chain_net_t * a_net); +void dap_chain_net_set_flag_sync_from_zero( dap_chain_net_t * a_net, bool a_flag_sync_from_zero); +bool dap_chain_net_get_flag_sync_from_zero( dap_chain_net_t * a_net); + dap_chain_net_t * dap_chain_net_by_name( const char * a_name); dap_chain_net_t * dap_chain_net_by_id( dap_chain_net_id_t a_id);