diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 6f5403d431b1f072df23084709d57f4c2e069f5e..ec020ed75a6f71f883e5cb13f857fc4c40ae2425 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -90,6 +90,7 @@ #include "dap_chain_net.h" #include "dap_chain_net_tx.h" #include "dap_chain_net_srv.h" +#include "dap_chain_net_balancer.h" #include "dap_chain_pvt.h" #include "dap_chain_node_client.h" #include "dap_chain_node_cli.h" @@ -271,6 +272,8 @@ static int s_cli_net(int argc, char ** argv, char **str_reply); static uint8_t *s_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash); static bool s_balancer_start_dns_request(dap_chain_net_t *a_net, dap_chain_node_info_t *a_link_node_info, bool a_link_replace); static bool s_balancer_start_http_request(dap_chain_net_t *a_net, dap_chain_node_info_t *a_link_node_info, bool a_link_replace); +static void s_prepare_links_from_balancer(dap_chain_net_t *a_net); +static bool s_new_balancer_link_request(dap_chain_net_t *a_net); static bool s_seed_mode = false; @@ -695,15 +698,14 @@ static dap_chain_node_info_t *s_get_balancer_link_from_cfg(dap_chain_net_t *a_ne dap_chain_node_addr_t *l_remote_addr = dap_chain_node_alias_find(a_net, l_net_pvt->seed_aliases[i]); if (l_remote_addr){ dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read(a_net, l_remote_addr); - if(l_remote_node_info){ - l_node_adrr = l_remote_node_info->hdr.address.uint64; - l_addr.s_addr = l_remote_node_info ? l_remote_node_info->hdr.ext_addr_v4.s_addr : 0; - DAP_DELETE(l_remote_node_info); - l_port = DNS_LISTEN_PORT; - }else{ + if (l_remote_node_info) { + dap_chain_node_info_t *l_ret = l_remote_node_info->hdr.ext_addr_v4.s_addr ? l_remote_node_info : NULL; + if (!l_ret) + DAP_DELETE(l_remote_node_info); + return l_ret; + } else log_it(L_WARNING,"Can't find node info for node addr "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS(l_remote_addr)); - } }else{ log_it(L_WARNING,"Can't find alias info for seed alias %s",l_net_pvt->seed_aliases[i]); } @@ -713,10 +715,6 @@ static dap_chain_node_info_t *s_get_balancer_link_from_cfg(dap_chain_net_t *a_ne l_addr = l_net_pvt->bootstrap_nodes_addrs[i]; l_port = l_net_pvt->bootstrap_nodes_ports[i]; } - if (!l_addr.s_addr){ - log_it(L_WARNING,"Can't find address to connect at all"); - return NULL; - } dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); if(! l_link_node_info){ log_it(L_CRITICAL,"Can't allocate memory for node link info"); @@ -1000,6 +998,14 @@ static void s_net_links_complete_and_start(dap_chain_net_t *a_net, dap_worker_t dap_chain_net_pvt_t * l_net_pvt = PVT(a_net); pthread_rwlock_rdlock(&l_net_pvt->balancer_lock); if (--l_net_pvt->balancer_link_requests == 0){ // It was the last one + // No links obtained from DNS + if (HASH_COUNT(l_net_pvt->net_links) == 0 && !l_net_pvt->balancer_http) { + // Try to get links from HTTP balancer + l_net_pvt->balancer_http = true; + s_prepare_links_from_balancer(a_net); + pthread_rwlock_unlock(&l_net_pvt->balancer_lock); + return; + } if (HASH_COUNT(l_net_pvt->net_links) < l_net_pvt->max_links_count) s_fill_links_from_root_aliases(a_net); // Comlete the sentence pthread_rwlock_wrlock(&l_net_pvt->states_lock); @@ -1032,15 +1038,9 @@ static void s_net_balancer_link_prepare_success(dap_worker_t * a_worker, dap_cha int l_res = s_net_link_add(l_net, a_node_info); if (l_res < 0) { // Can't add this link debug_if(s_debug_more, L_DEBUG, "Can't add link "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(a_node_info->hdr.address)); - if (l_balancer_request->link_replace) { + if (l_balancer_request->link_replace) // Just try a new one - dap_chain_node_info_t *l_link_node_info = s_get_balancer_link_from_cfg(l_net); - if (l_link_node_info) { - if (!s_balancer_start_dns_request(l_net, l_link_node_info, true)) - log_it(L_ERROR, "Can't process node info dns request"); - DAP_DELETE(l_link_node_info); - } - } + s_new_balancer_link_request(l_net); } else if (l_res == 0) { struct json_object *l_json = s_net_states_json_collect(l_net); char l_err_str[128] = { }; @@ -1096,6 +1096,8 @@ static void s_net_balancer_link_prepare_error(dap_worker_t * a_worker, void * a_ json_object_put(l_json); if (!l_balancer_request->link_replace) s_net_links_complete_and_start(l_net, a_worker); + else + s_new_balancer_link_request(l_net); DAP_DELETE(l_node_info); DAP_DELETE(l_balancer_request); } @@ -1106,18 +1108,10 @@ void s_net_http_link_prepare_success(void *a_response, size_t a_response_size, v struct balancer_link_request *l_balancer_request = (struct balancer_link_request *)a_arg; if (a_response_size != sizeof(dap_chain_node_info_t)) { log_it(L_ERROR, "Invalid balancer response size %zu (expect %zu)", a_response_size, sizeof(dap_chain_node_info_t)); - dap_chain_net_t * l_net = l_balancer_request->net; - dap_chain_net_pvt_t * l_net_pvt = PVT(l_net); - if (!l_balancer_request->link_replace) { - if (l_net_pvt->balancer_link_requests) - l_net_pvt->balancer_link_requests--; - } else { - dap_chain_node_info_t *l_link_node_info = s_get_balancer_link_from_cfg(l_net); - s_balancer_start_http_request(l_net, l_link_node_info, true); - } + s_new_balancer_link_request(l_balancer_request->net); return; } - s_net_balancer_link_prepare_success(l_balancer_request->worker, (dap_chain_node_info_t *)&a_response, a_arg); + s_net_balancer_link_prepare_success(l_balancer_request->worker, (dap_chain_node_info_t *)a_response, a_arg); } void s_net_http_link_prepare_error(int a_error_code, void *a_arg) @@ -1173,23 +1167,43 @@ static bool s_balancer_start_http_request(dap_chain_net_t *a_net, dap_chain_node l_balancer_request->link_info = DAP_DUP(a_link_node_info); l_balancer_request->worker = dap_events_worker_get_auto(); l_balancer_request->link_replace = a_link_replace; - const char l_request[] = "/f0intlt4eyl03htogu?version=1,method=random"; - int l_ret = dap_client_http_request(l_balancer_request->worker, l_node_addr_str, a_link_node_info->hdr.ext_port, - "GET", "text/text", DAP_UPLINK_PATH_BALANCER, - l_request, sizeof(l_request), NULL, + char *l_request = dap_strdup_printf("%s/%s?version=1,method=r,net=%s", + DAP_UPLINK_PATH_BALANCER, + DAP_BALANCER_URI_HASH, + a_net->pub.name); + if (dap_client_http_request(l_balancer_request->worker, l_node_addr_str, a_link_node_info->hdr.ext_port, + "GET", "text/text", l_request, + NULL, 0, NULL, s_net_http_link_prepare_success, s_net_http_link_prepare_error, - l_balancer_request, NULL); - if (l_ret) { - l_net_pvt->balancer_link_requests++; - return true; + l_balancer_request, NULL)) { + log_it(L_ERROR, "Can't process balancer link HTTP request"); + DAP_DELETE(l_balancer_request->link_info); + DAP_DELETE(l_balancer_request); + DAP_DELETE(l_request); + return false; } - log_it(L_ERROR, "Can't process balancer link HTTP request"); - DAP_DELETE(l_balancer_request->link_info); - DAP_DELETE(l_balancer_request); - return false; + DAP_DELETE(l_request); + l_net_pvt->balancer_link_requests++; + return true; +} + +static bool s_new_balancer_link_request(dap_chain_net_t *a_net) +{ + bool ret = false; + dap_chain_node_info_t *l_link_node_info = s_get_balancer_link_from_cfg(a_net); + if (l_link_node_info) { + if (PVT(a_net)->balancer_http) + ret = s_balancer_start_http_request(a_net, l_link_node_info, true); + else { + l_link_node_info->hdr.ext_port = DNS_LISTEN_PORT; + ret = s_balancer_start_dns_request(a_net, l_link_node_info, true); + } + DAP_DELETE(l_link_node_info); + } + return ret; } -static void s_prepare_links_from_balancer(dap_chain_net_t *a_net, bool a_over_http) +static void s_prepare_links_from_balancer(dap_chain_net_t *a_net) { // Get list of the unique links for l_net size_t l_max_links_count = PVT(a_net)->max_links_count * 2; // Not all will be success @@ -1200,11 +1214,7 @@ static void s_prepare_links_from_balancer(dap_chain_net_t *a_net, bool a_over_ht if (!l_link_node_info) continue; // Start connect to link hubs - if (a_over_http) - s_balancer_start_http_request(a_net, l_link_node_info, false); - else - s_balancer_start_dns_request(a_net, l_link_node_info, false); - DAP_DELETE(l_link_node_info); + s_new_balancer_link_request(a_net); l_cur_links_count++; } } @@ -1316,7 +1326,7 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) } // Get DNS request result from root nodes as synchronization links if (!l_net_pvt->only_static_links) - s_prepare_links_from_balancer(l_net, false); + s_prepare_links_from_balancer(l_net); else { log_it(L_ATT, "Not use bootstrap addresses, fill seed nodelist from root aliases"); // Add other root nodes as synchronization links diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c new file mode 100644 index 0000000000000000000000000000000000000000..25528122362ffa64c2834b2ac3f6cee25655ced2 --- /dev/null +++ b/modules/net/dap_chain_net_balancer.c @@ -0,0 +1,118 @@ +/* +* Authors: +* Dmitriy Gerasimov <naeper@demlabs.net> +* Cellframe https://cellframe.net +* DeM Labs Inc. https://demlabs.net +* 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/>. +*/ + +#include "dap_chain_net_balancer.h" +#include "dap_chain_net.h" +#include "http_status_code.h" + +#define LOG_TAG "dap_chain_net_balancer" + +dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name) +{ + dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name); + if (l_net == NULL) { + uint16_t l_nets_count; + dap_chain_net_t **l_nets = dap_chain_net_list(&l_nets_count); + if (!l_nets_count) { + log_it(L_WARNING, "No chain network present"); + return NULL; + } + l_net = l_nets[rand() % l_nets_count]; + } + // get nodes list from global_db + dap_global_db_obj_t *l_objs = NULL; + size_t l_nodes_count = 0; + // read all node + l_objs = dap_global_db_get_all_sync(l_net->pub.gdb_nodes, &l_nodes_count); + if (!l_nodes_count || !l_objs) + return NULL; + dap_chain_node_info_t *l_node_candidate; + for (int i = 0; i < 50; i++) { + // 50 tryes for non empty address & port + size_t l_node_num = rand() % l_nodes_count; + l_node_candidate = (dap_chain_node_info_t *)l_objs[l_node_num].value; + if (l_node_candidate->hdr.ext_addr_v4.s_addr && l_node_candidate->hdr.ext_port) + break; + } + if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port) + return NULL; + dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t); + memcpy(l_node_info, l_node_candidate, sizeof(dap_chain_node_info_t)); + dap_global_db_objs_delete(l_objs, l_nodes_count); + log_it(L_DEBUG, "Network balancer issues ip %s", inet_ntoa(l_node_info->hdr.ext_addr_v4)); + return l_node_info; +} + +void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, void *a_arg) +{ + log_it(L_DEBUG,"Proc enc http request"); + http_status_code_t *l_return_code = (http_status_code_t *)a_arg; + + if (strcmp(a_http_simple->http_client->url_path, DAP_BALANCER_URI_HASH)) { + log_it(L_ERROR, "Wrong path '%s' in the request to dap_chain_net_balancer module", + a_http_simple->http_client->url_path); + *l_return_code = Http_Status_BadRequest; + return; + } + int l_protocol_version = 0; + char l_issue_method = 0; + const char l_net_token[] = "net="; + dap_sscanf(a_http_simple->http_client->in_query_string, "version=%d,method=%c,net=", + &l_protocol_version, &l_issue_method); + if (l_protocol_version != 1 || l_issue_method != 'r') { + log_it(L_ERROR, "Unsupported prorocol version/method in the request to dap_chain_net_balancer module"); + *l_return_code = Http_Status_MethodNotAllowed; + return; + } + char *l_net_str = strstr(a_http_simple->http_client->in_query_string, l_net_token); + if (!l_net_str) { + log_it(L_ERROR, "Net name token not found in the request to dap_chain_net_balancer module"); + *l_return_code = Http_Status_NotFound; + return; + } + l_net_str += sizeof(l_net_token) - 1; + char l_net_name[128] = {}; + strncpy(l_net_name, l_net_str, 127); + log_it(L_DEBUG, "HTTP balancer parser retrieve netname %s", l_net_name); + dap_chain_node_info_t *l_node_info = s_balancer_issue_link(l_net_name); + if (!l_node_info) { + log_it(L_WARNING, "Can't issue link for network %s, no acceptable links found", l_net_name); + *l_return_code = Http_Status_NotFound; + return; + } + *l_return_code = Http_Status_OK; + dap_http_simple_reply(a_http_simple, l_node_info, sizeof(*l_node_info)); + DAP_DELETE(l_node_info); +} + +/** + * @brief dap_dns_resolve_hostname + * @param str + * @return + */ +dap_chain_node_info_t *dap_chain_net_balancer_dns_issue_link(char *a_str) +{ + log_it(L_DEBUG, "DNS balancer parser retrieve netname %s", a_str); + return s_balancer_issue_link(a_str); +} diff --git a/modules/net/dap_chain_net_remote.c b/modules/net/dap_chain_net_remote.c deleted file mode 100644 index 65ecddbf07ec61c836dcb3f52cca6c7c35d12f88..0000000000000000000000000000000000000000 --- a/modules/net/dap_chain_net_remote.c +++ /dev/null @@ -1,27 +0,0 @@ -/* -* Authors: -* Dmitriy Gerasimov <naeper@demlabs.net> -* Cellframe https://cellframe.net -* DeM Labs Inc. https://demlabs.net -* 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/>. -*/ -#include "dap_common.h" -#include "dap_chain_net_remote.h" - -#define LOG_TAG "dap_chain_net_remote" diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 6529f934aff7f3c1cd0366a1072562e27690582b..04404537e8b3dd62802b9b0dd0b06d7b98d4cc9a 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -71,14 +71,6 @@ int dap_chain_node_cli_init(dap_config_t * g_config) return 0; } -#ifdef __WIN32 - WSADATA wsaData; - int ret = WSAStartup(MAKEWORD(2, 2), &wsaData); - if (ret != 0) { - log_it(L_CRITICAL, "Couldn't init Winsock DLL, error: %d", ret); - return 2; - } -#endif uint16_t l_listen_port = dap_config_get_item_uint16_default( g_config, "conserver", "listen_port_tcp",0); // For backward compatibility if(l_listen_port == 0) l_listen_port = dap_config_get_item_uint16_default( g_config, "conserver", "listen_port",0); diff --git a/modules/net/dap_chain_node_dns_client.c b/modules/net/dap_chain_node_dns_client.c index a6863afee79cd3378f44b3a133d621a12e4cc628..1601f8087bb460b56600bee6a33653268f2f68a5 100644 --- a/modules/net/dap_chain_node_dns_client.c +++ b/modules/net/dap_chain_node_dns_client.c @@ -33,7 +33,6 @@ struct dns_client { dap_events_socket_t * parent; - dap_chain_node_info_t *result; struct in_addr addr; uint16_t port; char *name; @@ -96,7 +95,7 @@ static void s_dns_client_esocket_read_callback(dap_events_socket_t * a_esocket, l_result.hdr.address.uint64 = be64toh(*(uint64_t *)l_cur); } - l_dns_client->callback_success(a_esocket->context->worker,l_dns_client->result,l_dns_client->callbacks_arg); + l_dns_client->callback_success(a_esocket->context->worker ,&l_result, l_dns_client->callbacks_arg); l_dns_client->is_callbacks_called = true; a_esocket->flags |= DAP_SOCK_SIGNAL_CLOSE; a_esocket->buf_in_size = a_esocket->buf_out_size = 0; diff --git a/modules/net/dap_chain_node_dns_server.c b/modules/net/dap_chain_node_dns_server.c index 1c5c06078fc5a2bb0983cefaa59df3c9efcee51c..6b04324e136d5822d88220bbdc1a18a3094f8a5f 100644 --- a/modules/net/dap_chain_node_dns_server.c +++ b/modules/net/dap_chain_node_dns_server.c @@ -33,6 +33,7 @@ #include "dap_string.h" #include "dap_global_db.h" #include "dap_chain_global_db_remote.h" +#include "dap_chain_net_balancer.h" #define LOG_TAG "dap_chain_node_dns_server" #define BUF_SIZE 1024 @@ -266,7 +267,7 @@ void dap_dns_server_start( uint16_t a_port) log_it(L_ERROR, "Can't start DNS server"); return; } - dap_dns_zone_register(&s_root_alias[0], dap_dns_resolve_hostname); // root resolver + dap_dns_zone_register(&s_root_alias[0], dap_chain_net_balancer_dns_issue_link); // root resolver log_it(L_NOTICE,"DNS server started"); } @@ -284,45 +285,3 @@ void dap_dns_server_stop() { dap_server_delete(s_dns_server->instance); DAP_DELETE(s_dns_server); } - -/** - * @brief dap_dns_resolve_hostname - * @param str - * @return - */ -dap_chain_node_info_t *dap_dns_resolve_hostname(char *str) -{ - log_it(L_DEBUG, "DNS parser retrieve hostname %s", str); - dap_chain_net_t *l_net = dap_chain_net_by_name(str); - if (l_net == NULL) { - uint16_t l_nets_count; - dap_chain_net_t **l_nets = dap_chain_net_list(&l_nets_count); - if (!l_nets_count) { - log_it(L_WARNING, "No chain network present"); - return NULL; - } - l_net = l_nets[rand() % l_nets_count]; - } - // get nodes list from global_db - dap_global_db_obj_t *l_objs = NULL; - size_t l_nodes_count = 0; - // read all node - l_objs = dap_global_db_get_all_sync(l_net->pub.gdb_nodes, &l_nodes_count); - if (!l_nodes_count || !l_objs) - return NULL; - dap_chain_node_info_t *l_node_candidate; - for (int i = 0; i < 50; i++) { - // 50 tryes for non empty address & port - size_t l_node_num = rand() % l_nodes_count; - l_node_candidate = (dap_chain_node_info_t *)l_objs[l_node_num].value; - if (l_node_candidate->hdr.ext_addr_v4.s_addr && l_node_candidate->hdr.ext_port) - break; - } - if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port) - return NULL; - dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t); - memcpy(l_node_info, l_node_candidate, sizeof(dap_chain_node_info_t)); - dap_global_db_objs_delete(l_objs, l_nodes_count); - log_it(L_DEBUG, "DNS resolver find ip %s", inet_ntoa(l_node_info->hdr.ext_addr_v4)); - return l_node_info; -} diff --git a/modules/net/include/dap_chain_net_remote.h b/modules/net/include/dap_chain_net_balancer.h similarity index 70% rename from modules/net/include/dap_chain_net_remote.h rename to modules/net/include/dap_chain_net_balancer.h index e3e35be850eb3ec77cc4bc2d27ee4867abc52230..9b4f5450788d017552176ac2407143ec0ae055c2 100644 --- a/modules/net/include/dap_chain_net_remote.h +++ b/modules/net/include/dap_chain_net_balancer.h @@ -1,9 +1,9 @@ /* * Authors: -* Dmitriy Gerasimov <naeper@demlabs.net> +* Roman Khlopkov <roman.khlopkov@demlabs.net> * Cellframe https://cellframe.net * DeM Labs Inc. https://demlabs.net -* Copyright (c) 2017-2019 +* Copyright (c) 2017-2022 * All rights reserved. This file is part of CellFrame SDK the open source project @@ -23,9 +23,10 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic */ #pragma once -#include "dap_chain_common.h" +#include "dap_chain_node.h" +#include "dap_http_simple.h" -typedef struct dap_chain_net_remote { - dap_chain_node_addr_t remote_addr; - char remote_channel; -} dap_chain_net_remote_t; +#define DAP_BALANCER_URI_HASH "f0intlt4eyl03htogu" + +void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, void *a_arg); +dap_chain_node_info_t *dap_chain_net_balancer_dns_issue_link(char *a_str); diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index c621b8df2b0f19f6a9297406353dc4ea0c06ebc3..94984ee154555b6f3d010f2909eeb834f0d26770 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -27,7 +27,6 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_chain_net.h" #include "dap_chain_common.h" #include "dap_chain_datum_decree.h" -#include "dap_chain_net_remote.h" #include "dap_chain_wallet.h" #include "dap_common.h" #include "dap_config.h" @@ -195,7 +194,6 @@ typedef struct dap_chain_net_srv_client_remote time_t ts_created; dap_stream_worker_t * stream_worker; int session_id; - dap_chain_net_remote_t *net_remote; // For remotes uint64_t bytes_received; uint64_t bytes_sent; struct dap_chain_net_srv_client_remote *prev; diff --git a/modules/net/srv/include/dap_chain_net_srv_client.h b/modules/net/srv/include/dap_chain_net_srv_client.h index 815880d96824eae4984a056b40cfda809d85919b..b5da5a6b9532e5eda2ef87124830cbd16de2bebe 100644 --- a/modules/net/srv/include/dap_chain_net_srv_client.h +++ b/modules/net/srv/include/dap_chain_net_srv_client.h @@ -30,7 +30,6 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #include "dap_enc_key.h" #include "dap_stream_worker.h" #include "dap_chain_net_srv.h" -#include "dap_chain_net_remote.h" #include "dap_chain_node_client.h" typedef struct dap_chain_net_srv_client dap_chain_net_srv_client_t;