diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index f76fc708cf9ed5b77daa41323bfb93b986b1ac1f..7694b786979b6f1c01c2693e27a24facdbeaaca4 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -788,7 +788,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) const char *l_last_group = l_store_obj->group; uint32_t l_last_type = l_store_obj->type; bool l_group_changed = false; - uint32_t l_time_store_lim_hours = dap_config_get_item_uint32_default(g_config, "resources", "dap_global_db_time_store_limit", 72); + uint32_t l_time_store_lim_hours = dap_config_get_item_uint32_default(g_config, "global_db", "time_store_limit", 72); dap_nanotime_t l_time_now = dap_nanotime_now() + dap_nanotime_from_sec(120); // time differnece consideration dap_nanotime_t l_limit_time = l_time_store_lim_hours ? l_time_now - dap_nanotime_from_sec(l_time_store_lim_hours * 3600) : 0; for (size_t i = 0; i < l_data_obj_count; i++) { @@ -950,12 +950,9 @@ static bool s_chain_timer_callback(void *a_arg) static void s_chain_timer_reset(dap_stream_ch_chain_t *a_ch_chain) { - if (s_ch_chain_get_idle(a_ch_chain)) - return; - if (!a_ch_chain->activity_timer) { - dap_stream_ch_chain_timer_start(a_ch_chain); - } a_ch_chain->timer_shots = 0; + if (!a_ch_chain->activity_timer) + dap_stream_ch_chain_timer_start(a_ch_chain); } void dap_stream_ch_chain_timer_start(dap_stream_ch_chain_t *a_ch_chain) @@ -1585,6 +1582,7 @@ static void s_ch_chain_go_idle(dap_stream_ch_chain_t *a_ch_chain) DAP_DELETE(l_hash_item); } a_ch_chain->remote_atoms = NULL; + a_ch_chain->sent_breaks = 0; } struct chain_io_complete { @@ -1870,9 +1868,10 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) } if (l_go_idle) s_ch_chain_go_idle(l_ch_chain); + else + s_chain_timer_reset(l_ch_chain); if (l_was_sent_smth) l_ch_chain->sent_breaks = 0; else l_ch_chain->sent_breaks++; - s_chain_timer_reset(l_ch_chain); } diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index a22e47f6f7eb928220bec2dd13a8812c15b8b3c7..daef86b3808c1bb4ff561589b5bc7d0407fc4834 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -170,8 +170,9 @@ typedef struct dap_chain_net_pvt{ bool only_static_links; uint16_t required_links_count; uint16_t max_links_count; + uint16_t reconnect_delay; // sec - struct downlink *downlinks; // HT of links who sent SYNC REQ, it used for sync broadcasting + struct downlink *downlinks; // HT of links who sent SYNC REQ, it used for sync broadcasting dap_list_t *records_queue; dap_list_t *atoms_queue; @@ -245,12 +246,12 @@ static void s_node_link_callback_stage(dap_chain_node_client_t * a_node_client,d static void s_node_link_callback_error(dap_chain_node_client_t * a_node_client, int a_error, void * a_arg); static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client, void * a_arg); -static const dap_chain_node_client_callbacks_t s_node_link_callbacks={ - .connected=s_node_link_callback_connected, - .disconnected=s_node_link_callback_disconnected, - .stage=s_node_link_callback_stage, - .error=s_node_link_callback_error, - .delete=s_node_link_callback_delete +static const dap_chain_node_client_callbacks_t s_node_link_callbacks = { + .connected = s_node_link_callback_connected, + .disconnected = s_node_link_callback_disconnected, + .stage = s_node_link_callback_stage, + .error = s_node_link_callback_error, + .delete = s_node_link_callback_delete }; // State machine switchs here @@ -679,6 +680,43 @@ static size_t s_net_get_active_links_count(dap_chain_net_t * a_net) return l_ret; } +static struct net_link *s_get_free_link(dap_chain_net_t *a_net) +{ + struct net_link *l_link, *l_link_tmp; + HASH_ITER(hh, PVT(a_net)->net_links, l_link, l_link_tmp) { + if (l_link->link == NULL) // We have a free prepared link + return l_link; + } + return NULL; +} + +static bool s_net_link_callback_connect_delayed(void *a_arg) +{ + dap_chain_node_client_t *l_client = a_arg; + debug_if(s_debug_more, L_DEBUG, "Link "NODE_ADDR_FP_STR" started", NODE_ADDR_FP_ARGS_S(l_client->info->hdr.address)); + dap_chain_node_client_connect(l_client, "CN"); + return false; +} + +static bool s_net_link_start(dap_chain_net_t *a_net, struct net_link *a_link, uint16_t a_delay) +{ + assert(a_net && a_link); + dap_chain_node_info_t *l_link_info = a_link->link_info; + dap_chain_node_client_t *l_client = dap_chain_node_client_create(a_net, l_link_info, &s_node_link_callbacks, a_net); + if (l_client) + l_client->keep_connection = true; + else + return false; + a_link->link = l_client; + a_link->client_uuid = l_client->uuid; + if (a_delay) { + dap_timerfd_start(a_delay * 1000, s_net_link_callback_connect_delayed, l_client); + return true; + } + debug_if(s_debug_more, L_DEBUG, "Link "NODE_ADDR_FP_STR" started", NODE_ADDR_FP_ARGS_S(l_link_info->hdr.address)); + return dap_chain_node_client_connect(l_client, "CN"); +} + /** * @brief s_fill_links_from_root_aliases * @param a_net @@ -744,21 +782,6 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie } -static bool s_start_free_link(dap_chain_net_t *a_net) -{ - struct net_link *l_link, *l_link_tmp; - HASH_ITER(hh, PVT(a_net)->net_links, l_link, l_link_tmp) { - if (l_link->link == NULL) { // We have a free prepared link - dap_chain_node_client_t *l_client_new = dap_chain_net_client_create_n_connect( - a_net, l_link->link_info); - l_link->link = l_client_new; - l_link->client_uuid = l_client_new->uuid; - return true; - } - } - return false; -} - /** * @brief s_node_link_callback_disconnected * @param a_node_client @@ -779,7 +802,9 @@ static void s_node_link_callback_disconnected(dap_chain_node_client_t *a_node_cl pthread_rwlock_wrlock(&l_net_pvt->uplinks_lock); s_net_link_remove(l_net_pvt, a_node_client->uuid, l_net_pvt->only_static_links); a_node_client->keep_connection = false; - if (s_start_free_link(l_net)) { + struct net_link *l_free_link = s_get_free_link(l_net); + if (l_free_link) { + s_net_link_start(l_net, l_free_link, l_net_pvt->reconnect_delay); pthread_rwlock_unlock(&l_net_pvt->uplinks_lock); return; } @@ -863,10 +888,8 @@ static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client, struct net_link *l_link, *l_link_tmp; HASH_ITER(hh, l_net_pvt->net_links, l_link, l_link_tmp) { if (l_link->link == a_node_client) { - log_it(L_DEBUG,"Replace node client with new one"); - dap_chain_node_client_t *l_client = dap_chain_net_client_create_n_connect(l_net, a_node_client->info); - l_link->link = l_client; - l_link->client_uuid = l_client->uuid; + log_it(L_DEBUG, "Replace node client with new one with %d sec", l_net_pvt->reconnect_delay); + s_net_link_start(l_net, l_link, l_net_pvt->reconnect_delay); } } pthread_rwlock_unlock(&l_net_pvt->uplinks_lock); @@ -941,12 +964,11 @@ static void s_net_balancer_link_prepare_success(dap_worker_t * a_worker, dap_cha // Auto-start new link pthread_rwlock_rdlock(&PVT(l_net)->states_lock); if (PVT(l_net)->state_target != NET_STATE_OFFLINE) { - debug_if(s_debug_more, L_DEBUG, "Link "NODE_ADDR_FP_STR" started", - NODE_ADDR_FP_ARGS_S(a_node_info->hdr.address)); - dap_chain_node_client_t *l_client = dap_chain_net_client_create_n_connect(l_net, a_node_info); struct net_link *l_new_link = s_net_link_find(l_net, a_node_info); - l_new_link->link = l_client; - l_new_link->client_uuid = l_client->uuid; + if (l_new_link) + s_net_link_start(l_net, l_new_link, PVT(l_net)->reconnect_delay); + else + s_new_balancer_link_request(l_net, l_balancer_request->link_replace_tries); } pthread_rwlock_unlock(&PVT(l_net)->states_lock); } @@ -1031,7 +1053,8 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla // network problems, make static links s_fill_links_from_root_aliases(a_net); pthread_rwlock_wrlock(&l_net_pvt->uplinks_lock); - s_start_free_link(a_net); + struct net_link *l_free_link = s_get_free_link(a_net); + s_net_link_start(a_net, l_free_link, 0); pthread_rwlock_unlock(&l_net_pvt->uplinks_lock); return false; } @@ -1228,10 +1251,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) size_t l_used_links = 0; struct net_link *l_link, *l_link_tmp; HASH_ITER(hh, l_net_pvt->net_links, l_link, l_link_tmp) { - dap_chain_node_info_t *l_link_info = l_link->link_info; - dap_chain_node_client_t *l_client = dap_chain_net_client_create_n_connect(l_net, l_link_info); - l_link->link = l_client; - l_link->client_uuid = l_client->uuid; + s_net_link_start(l_net, l_link, 0); if (++l_used_links == l_net_pvt->required_links_count) break; } @@ -1322,36 +1342,6 @@ bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t * pthread_rwlock_unlock(&l_net_pvt->uplinks_lock); return l_ret; } -/** - * @brief dap_chain_net_client_create_n_connect - * @param a_net - * @param a_link_info - * @return - */ -struct dap_chain_node_client * dap_chain_net_client_create_n_connect( dap_chain_net_t * a_net,struct dap_chain_node_info* a_link_info) -{ - dap_chain_node_client_t *l_ret = dap_chain_node_client_create_n_connect(a_net, - a_link_info, - "CN", - (dap_chain_node_client_callbacks_t *)&s_node_link_callbacks, - a_net); - if (l_ret) - l_ret->keep_connection = true; - return l_ret; -} - -/** - * @brief dap_chain_net_client_create_n_connect_channels - * @param a_net - * @param a_link_info - * @param a_channels - * @return - */ -struct dap_chain_node_client * dap_chain_net_client_create_n_connect_channels( dap_chain_net_t * a_net,struct dap_chain_node_info* a_link_info,const char * a_channels ) -{ - return dap_chain_node_client_create_n_connect(a_net, a_link_info,a_channels,(dap_chain_node_client_callbacks_t *)&s_node_link_callbacks,a_net); -} - /** * @brief dap_chain_net_get_role @@ -2255,6 +2245,8 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) l_net_pvt->max_links_count = dap_config_get_item_int16_default(l_cfg, "general", "max_links", 5); // required number of active connections to other nodes l_net_pvt->required_links_count = dap_config_get_item_int16_default(l_cfg, "general", "require_links", 3); + // wait time before reconnect attempt with same link + l_net_pvt->reconnect_delay = dap_config_get_item_int16_default(l_cfg, "general", "reconnect_delay", 10); const char * l_node_addr_type = dap_config_get_item_str_default(l_cfg , "general" ,"node_addr_type","auto"); diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index ea1af2558b987d1bb8b8ae1c3f410072c7adaf26..95c52c38118e280229b6a390c68c850680cd923e 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -1147,7 +1147,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) return -1; } // start connect - l_node_client = dap_chain_node_client_connect(l_net,l_remote_node_info); + l_node_client = dap_chain_node_client_connect_default_channels(l_net,l_remote_node_info); if(!l_node_client) { dap_cli_server_cmd_set_reply_text(a_str_reply, "can't connect"); DAP_DELETE(l_remote_node_info); @@ -1210,8 +1210,6 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) uint8_t l_ch_id = dap_stream_ch_chain_net_get_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); - size_t res = dap_stream_ch_chain_net_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST, //DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST, @@ -1224,7 +1222,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) return -1; } int timeout_ms = 15000; // 15 sec = 15 000 ms - l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_NODE_ADDR_LEASED, timeout_ms); + int l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_NODE_ADDR_LEASED, timeout_ms); switch (l_res) { case 0: if(l_node_client->cur_node_addr.uint64 != 0) { @@ -1358,7 +1356,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) return -6; int timeout_ms = 5000; //5 sec = 5000 ms // start handshake - dap_chain_node_client_t *client = dap_chain_node_client_connect(l_net,node_info); + dap_chain_node_client_t *client = dap_chain_node_client_connect_default_channels(l_net,node_info); if(!client) { dap_cli_server_cmd_set_reply_text(a_str_reply, "Can't connect"); DAP_DELETE(node_info); diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index 4a9ad7d32375cdef9cf6e570b0e58d1cfc2dbbe7..5ea1d1d8c8f3ef988ffd825498ed9b2aab01796b 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -85,14 +85,13 @@ static dap_chain_node_client_handle_t * s_clients = NULL; static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg); static bool s_timer_update_states_callback(void *a_arg); - +static int s_node_client_set_notify_callbacks(dap_client_t *a_client, uint8_t a_ch_id); static void s_ch_chain_callback_notify_packet_out(dap_stream_ch_chain_t*, uint8_t a_pkt_type, dap_stream_ch_chain_pkt_t *a_pkt, size_t a_pkt_data_size, void * a_arg); static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_chain, uint8_t a_pkt_type, dap_stream_ch_chain_pkt_t *a_pkt, size_t a_pkt_data_size, void * a_arg); -static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_node_client, const char *a_active_channels); bool s_stream_ch_chain_debug_more = false; uint32_t s_timer_update_states = 600; @@ -342,7 +341,7 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg) if(l_client_internal && l_client_internal->active_channels) { size_t l_channels_count = dap_strlen(l_client_internal->active_channels); for(size_t i = 0; i < l_channels_count; i++) { - if(dap_chain_node_client_set_callbacks(a_client, l_client_internal->active_channels[i]) == -1) { + if(s_node_client_set_notify_callbacks(a_client, l_client_internal->active_channels[i]) == -1) { log_it(L_WARNING, "No ch_chain channel, can't init notify callback for pkt type CH_CHAIN"); return; } @@ -729,20 +728,6 @@ static void s_ch_chain_callback_notify_packet_R(dap_stream_ch_chain_net_srv_t* a } } - -/** - * @brief dap_chain_node_client_connect_channels - * Create connection to server - * @param l_net - * @param a_node_info - * @param a_active_channels - * @return dap_chain_node_client_t* return a connection handle, or NULL, if an error - */ -dap_chain_node_client_t* dap_chain_node_client_connect_channels(dap_chain_net_t * l_net, dap_chain_node_info_t *a_node_info, const char *a_active_channels) -{ - return dap_chain_net_client_create_n_connect_channels(l_net,a_node_info,a_active_channels); -} - /** * @brief dap_chain_node_client_create_n_connect * @param a_net @@ -752,8 +737,22 @@ dap_chain_node_client_t* dap_chain_node_client_connect_channels(dap_chain_net_t * @param a_callback_arg * @return */ -dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info, - const char *a_active_channels,dap_chain_node_client_callbacks_t *a_callbacks, void * a_callback_arg ) +dap_chain_node_client_t *dap_chain_node_client_create_n_connect(dap_chain_net_t *a_net, + dap_chain_node_info_t *a_node_info, + const char *a_active_channels, + const dap_chain_node_client_callbacks_t *a_callbacks, + void *a_callback_arg) +{ + dap_chain_node_client_t *l_node_client = dap_chain_node_client_create(a_net, a_node_info, a_callbacks, a_callback_arg); + if (dap_chain_node_client_connect(l_node_client, a_active_channels)) + return l_node_client; + return NULL; +} + +dap_chain_node_client_t *dap_chain_node_client_create(dap_chain_net_t *a_net, + dap_chain_node_info_t *a_node_info, + const dap_chain_node_client_callbacks_t *a_callbacks, + void *a_callback_arg) { if(!a_node_info) { log_it(L_ERROR, "Can't connect to the node: null object node_info"); @@ -763,7 +762,7 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t l_node_client->state = NODE_CLIENT_STATE_DISCONNECTED; l_node_client->callbacks_arg = a_callback_arg; - if(a_callbacks) + if (a_callbacks) l_node_client->callbacks = *a_callbacks; l_node_client->info = DAP_DUP(a_node_info); l_node_client->uuid = dap_uuid_generate_uint64(); @@ -786,21 +785,21 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t pthread_mutex_init(&l_node_client->wait_mutex, NULL); l_node_client->remote_node_addr.uint64 = a_node_info->hdr.address.uint64; - if (dap_chain_node_client_connect_internal(l_node_client, a_active_channels)) - return l_node_client; - return NULL; + return l_node_client; } /** - * @brief dap_chain_node_client_connect_internal + * @brief dap_chain_node_client_connect * Create new dap_client, setup it, and send it in adventure trip * @param a_node_client dap_chain_node_client_t * @param a_active_channels a_active_channels * @return true * @return false */ -static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_node_client, const char *a_active_channels) +bool dap_chain_node_client_connect(dap_chain_node_client_t *a_node_client, const char *a_active_channels) { + if (!a_node_client) + return false; a_node_client->client = dap_client_new( s_stage_status_callback, s_stage_status_error_callback); dap_client_set_is_always_reconnect(a_node_client->client, false); @@ -814,15 +813,14 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no if(a_node_client->info->hdr.ext_addr_v4.s_addr){ struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = a_node_client->info->hdr.ext_addr_v4 }; inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host, hostlen); - log_it(L_INFO, "Connecting to %s address",host); } else { struct sockaddr_in6 sa6 = { .sin6_family = AF_INET6, .sin6_addr = a_node_client->info->hdr.ext_addr_v6 }; inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), host, hostlen); - log_it(L_INFO, "Connecting to %s address",host); } + log_it(L_INFO, "Connecting to %s address", host); // address not defined if(!strcmp(host, "::")) { - dap_chain_node_client_close(a_node_client->uuid); + log_it(L_WARNING, "Undefined address with node client connect to"); return false; } dap_client_set_uplink_unsafe(a_node_client->client, host, a_node_client->info->hdr.ext_port); @@ -832,19 +830,6 @@ static bool dap_chain_node_client_connect_internal(dap_chain_node_client_t *a_no return true; } -/** - * @brief dap_chain_node_client_connect - * Create connection to server - * @param a_net - * @param a_node_info - * @return dap_chain_node_client_t* return a connection handle, or NULL, if an error - */ -dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_net_t * a_net,dap_chain_node_info_t *a_node_info) -{ - const char *l_active_channels = "CN"; - return dap_chain_node_client_connect_channels(a_net,a_node_info, l_active_channels); -} - /** * @brief dap_chain_node_client_reset * @@ -1021,14 +1006,16 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s } /** - * @brief dap_chain_node_client_set_callbacks + * @brief s_node_client_set_notify_callbacks * * @param a_client dap_client_t * @param a_ch_id uint8_t * @return int */ -int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id) +static int s_node_client_set_notify_callbacks(dap_client_t *a_client, uint8_t a_ch_id) { + //TODO pass callbacks through stream creation to internal ch structures + int l_ret = -1; dap_chain_node_client_t *l_node_client = a_client->_inheritor; if(l_node_client) { @@ -1059,9 +1046,9 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id) // R if(a_ch_id == dap_stream_ch_chain_net_srv_get_id()) { dap_stream_ch_chain_net_srv_t *l_ch_chain = DAP_STREAM_CH_CHAIN_NET_SRV(l_ch); - if (l_node_client->callbacks.srv_pkt_in) { + if (l_node_client->notify_callbacks.srv_pkt_in) { l_ch_chain->notify_callback = (dap_stream_ch_chain_net_srv_callback_packet_t) - l_node_client->callbacks.srv_pkt_in; + l_node_client->notify_callbacks.srv_pkt_in; l_ch_chain->notify_callback_arg = l_node_client->callbacks_arg; } else { l_ch_chain->notify_callback = s_ch_chain_callback_notify_packet_R; @@ -1086,15 +1073,6 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id) return l_ret; } -/*static void nodelist_response_callback(dap_client_t *a_client, void *data, size_t data_len) -{ -} - -static void nodelist_response_error_callback(dap_client_t *a_client, int a_err) -{ -}*/ - - /** * @brief dap_chain_node_client_send_nodelist_req * Send nodelist request to server diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 1aecefcb8a96e92c24778025c1ceb2a28b81bbd5..dd739d590761ede5d9a26e8ccdd7f61815b88f33 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -185,10 +185,6 @@ int dap_chain_net_add_downlink(dap_chain_net_t *a_net, dap_stream_worker_t *a_wo void dap_chain_net_add_gdb_notify_callback(dap_chain_net_t *a_net, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg); void dap_chain_net_sync_gdb_broadcast(dap_global_db_context_t *a_context, dap_store_obj_t *a_obj, void *a_arg); -struct dap_chain_node_client * dap_chain_net_client_create_n_connect( dap_chain_net_t * a_net, struct dap_chain_node_info *a_link_info); -struct dap_chain_node_client * dap_chain_net_client_create_n_connect_channels( dap_chain_net_t * a_net,struct dap_chain_node_info *a_link_info, - const char * a_channels); - /** * @brief dap_chain_datum_list * Get datum list by filter diff --git a/modules/net/include/dap_chain_node_client.h b/modules/net/include/dap_chain_node_client.h index b8d06075cfa14572d5e3af0385d83ae72f34fa3f..6a311c5f3aabd104e5a68efc5dc55a793953c45b 100644 --- a/modules/net/include/dap_chain_node_client.h +++ b/modules/net/include/dap_chain_node_client.h @@ -64,20 +64,22 @@ typedef void (*dap_chain_node_client_callback_t)(dap_chain_node_client_t *, void typedef void (*dap_chain_node_client_callback_stage_t)(dap_chain_node_client_t *, dap_client_stage_t, void * ); typedef void (*dap_chain_node_client_callback_error_t)(dap_chain_node_client_t *, int, void *); -typedef struct dap_chain_node_client_callbacks{ +typedef struct dap_chain_node_client_callbacks { dap_chain_node_client_callback_t connected; dap_chain_node_client_callback_t disconnected; dap_chain_node_client_callback_t delete; dap_chain_node_client_callback_stage_t stage; dap_chain_node_client_callback_error_t error; +} dap_chain_node_client_callbacks_t; +typedef struct dap_chain_node_client_notify_callbacks { dap_stream_ch_callback_packet_t chain_pkt_in; dap_stream_ch_callback_packet_t chain_pkt_out; dap_stream_ch_callback_packet_t net_pkt_in; dap_stream_ch_callback_packet_t net_pkt_out; dap_stream_ch_callback_packet_t srv_pkt_in; dap_stream_ch_callback_packet_t srv_pkt_out; -} dap_chain_node_client_callbacks_t; +} dap_chain_node_client_notify_callbacks_t; // state for a client connection typedef struct dap_chain_node_client { @@ -136,7 +138,8 @@ typedef struct dap_chain_node_client { dap_timerfd_t *sync_timer; // callbacks dap_chain_node_client_callbacks_t callbacks; - void * callbacks_arg; + dap_chain_node_client_notify_callbacks_t notify_callbacks; + void *callbacks_arg; } dap_chain_node_client_t; #define DAP_CHAIN_NODE_CLIENT(a) (a ? (dap_chain_node_client_t *) (a)->_inheritor : NULL) @@ -145,18 +148,28 @@ int dap_chain_node_client_init(void); void dap_chain_node_client_deinit(void); -dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info, - const char *a_active_channels,dap_chain_node_client_callbacks_t *a_callbacks, - void * a_callback_arg ); +dap_chain_node_client_t *dap_chain_node_client_create(dap_chain_net_t *a_net, dap_chain_node_info_t *a_node_info, + const dap_chain_node_client_callbacks_t *a_callbacks, void *a_callback_arg); +bool dap_chain_node_client_connect(dap_chain_node_client_t *a_node_client, const char *a_active_channels); -dap_chain_node_client_t* dap_chain_node_client_connect_channels(dap_chain_net_t * a_net, dap_chain_node_info_t *a_node_info, const char *a_active_channels); /** * Create handshake to server * * return a connection handle, or NULL, if an error */ -dap_chain_node_client_t* dap_chain_node_client_connect(dap_chain_net_t * a_net, dap_chain_node_info_t *node_info); +dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t *a_net, dap_chain_node_info_t *a_node_info, + const char *a_active_channels, const dap_chain_node_client_callbacks_t *a_callbacks, + void *a_callback_arg); + +DAP_STATIC_INLINE dap_chain_node_client_t *dap_chain_node_client_connect_channels(dap_chain_net_t *a_net, + dap_chain_node_info_t *a_node_info, + const char *a_active_channels) +{ return dap_chain_node_client_create_n_connect(a_net, a_node_info, a_active_channels, NULL, NULL); } + +DAP_STATIC_INLINE dap_chain_node_client_t* dap_chain_node_client_connect_default_channels(dap_chain_net_t *a_net, dap_chain_node_info_t *a_node_info) +{ return dap_chain_node_client_connect_channels(a_net,a_node_info, "CN"); } + dap_chain_node_client_t *dap_chain_node_client_find(dap_events_socket_uuid_t a_uuid); @@ -184,8 +197,6 @@ int dap_chain_node_client_send_ch_pkt(dap_chain_node_client_t *a_client, uint8_t */ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_state, int a_timeout_ms); -int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id); - int dap_chain_node_client_send_nodelist_req(dap_chain_node_client_t *a_client); dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *l_uuid); diff --git a/modules/net/srv/dap_chain_net_srv_client.c b/modules/net/srv/dap_chain_net_srv_client.c index 6084e6895177ba0f05129d6f4977469e61ec3eb2..6f0cb58542fb9b6b9304a426eb8c297b01d4b36d 100644 --- a/modules/net/srv/dap_chain_net_srv_client.c +++ b/modules/net/srv/dap_chain_net_srv_client.c @@ -49,7 +49,6 @@ dap_chain_net_srv_client_t *dap_chain_net_srv_client_create_n_connect(dap_chain_ .disconnected = s_srv_client_callback_disconnected, .delete = s_srv_client_callback_deleted }; - l_callbacks.srv_pkt_in = (dap_stream_ch_callback_packet_t)s_srv_client_pkt_in; dap_chain_node_info_t *l_info = DAP_NEW_Z(dap_chain_node_info_t); inet_pton(AF_INET, a_addr, &l_info->hdr.ext_addr_v4); l_info->hdr.ext_port = a_port; @@ -57,6 +56,7 @@ dap_chain_net_srv_client_t *dap_chain_net_srv_client_create_n_connect(dap_chain_ l_ret->node_client = dap_chain_node_client_create_n_connect(a_net, l_info, l_channels, &l_callbacks, l_ret); + l_ret->node_client->notify_callbacks.srv_pkt_in = (dap_stream_ch_callback_packet_t)s_srv_client_pkt_in; DAP_DELETE(l_info); return l_ret; }