From aad85598f4852dda69d2baeaeb313b9160fe95b2 Mon Sep 17 00:00:00 2001
From: "roman.padenkov" <roman.padenkov@demlabs.net>
Date: Wed, 17 May 2023 12:26:36 +0000
Subject: [PATCH] Feature 6700

---
 modules/net/dap_chain_net.c          | 14 ++++++++++
 modules/net/dap_chain_net_balancer.c | 40 +++++++++++++++++++++-------
 modules/net/include/dap_chain_net.h  |  3 ++-
 3 files changed, 46 insertions(+), 11 deletions(-)

diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 35a230c7a7..7d062584b5 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -3073,6 +3073,20 @@ dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net)
     return l_node_list;
 }
 
+/**
+ * Get nodes list from config file (list of dap_chain_node_addr_t struct)
+ */
+dap_list_t* dap_chain_net_get_node_list_cfg(dap_chain_net_t * a_net)
+{
+    dap_list_t *l_node_list = NULL;
+    dap_chain_net_pvt_t *l_pvt_net = PVT(a_net);
+    for(size_t i=0; i < l_pvt_net->seed_aliases_count;i++)
+    {
+        l_node_list = dap_list_append(l_node_list, &l_pvt_net->node_info[i]);
+    }
+    return l_node_list;
+}
+
 /**
  * @brief dap_chain_net_set_flag_sync_from_zero
  * @param a_net
diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index 0254a46f46..5851af3429 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -30,6 +30,7 @@ along with any CellFrame SDK based project.  If not, see <http://www.gnu.org/lic
 
 dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
 {
+    dap_list_t *l_node_list = NULL,*l_objs_list = NULL;
     dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name);
     if (l_net == NULL) {
         uint16_t l_nets_count;
@@ -43,23 +44,42 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
     // get nodes list from global_db
     dap_global_db_obj_t *l_objs = NULL;
     size_t l_nodes_count = 0;
+    size_t l_node_num = 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;
+        return NULL;    
+    l_node_list = dap_chain_net_get_node_list_cfg(l_net);
+    for(size_t i=0;i<l_nodes_count;i++)
+    {
+        for(dap_list_t *node_i = l_node_list;node_i;node_i = node_i->next)
+        {
+            dap_chain_node_info_t *l_node_cfg = (dap_chain_node_info_t*)node_i->data;
+            dap_chain_node_info_t *l_node_cand = (dap_chain_node_info_t *)l_objs[i].value;
+            if(l_node_cand->hdr.ext_addr_v4.s_addr && l_node_cand->hdr.ext_port &&
+                (l_node_cfg->hdr.ext_addr_v4.s_addr != l_node_cand->hdr.ext_addr_v4.s_addr))
+            {
+                l_objs_list = dap_list_append(l_objs_list,l_objs[i].value);
+                l_node_num++;
+                break;
+            }
+        }
+    }
+    dap_global_db_objs_delete(l_objs, l_nodes_count);
+    l_nodes_count = l_node_num;
     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_nodes_count)
+    {
+        l_node_num = rand() % l_nodes_count;
+        l_node_candidate = (dap_chain_node_info_t *)dap_list_nth_data(l_objs_list,l_node_num);
     }
-    if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port)
-        return NULL;
+    else
+        l_node_candidate = (dap_chain_node_info_t *)dap_list_nth_data(l_node_list,0);
+
     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);
+    dap_list_free(l_objs_list);
+    dap_list_free(l_node_list);
     log_it(L_DEBUG, "Network balancer issues ip %s", inet_ntoa(l_node_info->hdr.ext_addr_v4));
     return l_node_info;
 }
diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h
index 5f191f9b6c..9cc386aa93 100644
--- a/modules/net/include/dap_chain_net.h
+++ b/modules/net/include/dap_chain_net.h
@@ -155,7 +155,8 @@ dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net);
 const char* dap_chain_net_get_type(dap_chain_t *l_chain);
 
 dap_list_t* dap_chain_net_get_link_node_list(dap_chain_net_t * l_net, bool a_is_only_cur_cell);
-dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net);
+dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * a_net);
+dap_list_t* dap_chain_net_get_node_list_cfg(dap_chain_net_t * a_net);
 dap_chain_node_role_t dap_chain_net_get_role(dap_chain_net_t * a_net);
 
 /**
-- 
GitLab