From e3cc73b0d38043cc3115047360dcbb58581c857a Mon Sep 17 00:00:00 2001
From: "roman.padenkov" <roman.padenkov@demlabs.net>
Date: Fri, 12 May 2023 18:50:13 +0700
Subject: [PATCH 1/7] begin

---
 modules/net/dap_chain_net_balancer.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index 0254a46f46..e119ccb1b3 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -57,6 +57,7 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
     }
     if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port)
         return NULL;
+    //if (l_node_candidate->hdr.cell_id)
     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);
-- 
GitLab


From 320e3db713a127747ef14d4b4e86fb4f2e9070ce Mon Sep 17 00:00:00 2001
From: "roman.padenkov" <roman.padenkov@demlabs.net>
Date: Tue, 16 May 2023 10:14:27 +0700
Subject: [PATCH 2/7] edit balancer

---
 modules/net/dap_chain_net_balancer.c | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)

diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index e119ccb1b3..33bee6e957 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -30,6 +30,9 @@ 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_config_t *l_cfg=NULL;
+    dap_string_t *l_cfg_path = dap_string_new("network/");
+    dap_string_append(l_cfg_path,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;
@@ -40,6 +43,24 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
         }
         l_net = l_nets[rand() % l_nets_count];
     }
+    if( ( l_cfg = dap_config_open ( l_cfg_path->str ) ) == NULL ) {
+        log_it(L_ERROR,"Can't open default network config");
+        dap_string_free(l_cfg_path,true);
+    } else {
+        uint16_t l_seed_nodes_hostnames_len =0;
+        char ** l_seed_nodes_hostnames = dap_config_get_array_str( l_cfg , "general" ,"seed_nodes_hostnames"
+                                                             ,&l_seed_nodes_hostnames_len);
+        struct sockaddr l_sa = {};
+        for(size_t i = 0;i<l_seed_nodes_hostnames_len;i++)
+        {
+            if(!dap_net_resolve_host(l_seed_nodes_hostnames[i], AF_INET, &l_sa))
+            {
+                struct in_addr *l_res = (struct in_addr *)&l_sa;
+
+            }
+        }
+
+    }
     // get nodes list from global_db
     dap_global_db_obj_t *l_objs = NULL;
     size_t l_nodes_count = 0;
@@ -57,7 +78,11 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
     }
     if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port)
         return NULL;
-    //if (l_node_candidate->hdr.cell_id)
+
+    if (l_node_candidate->hdr.cell_id)
+        if (dap_global_db_del_sync(a_net->pub.gdb_nodes, l_objs[i].key) !=0 )
+        dap_config_close(l_cfg);
+
     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);
-- 
GitLab


From 9f9d00b275c079ce8d485983df66fc9cd7d3c967 Mon Sep 17 00:00:00 2001
From: "roman.padenkov" <roman.padenkov@demlabs.net>
Date: Tue, 16 May 2023 13:21:33 +0700
Subject: [PATCH 3/7] add remove node from gdb

---
 modules/net/dap_chain_net_balancer.c | 50 +++++++++++++++-------------
 1 file changed, 26 insertions(+), 24 deletions(-)

diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index 33bee6e957..fc0af1ef4a 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -42,7 +42,26 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
             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;
+    size_t l_node_num;
+    // 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
+        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;
+    //dell cfg seed from db
     if( ( l_cfg = dap_config_open ( l_cfg_path->str ) ) == NULL ) {
         log_it(L_ERROR,"Can't open default network config");
         dap_string_free(l_cfg_path,true);
@@ -56,33 +75,16 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
             if(!dap_net_resolve_host(l_seed_nodes_hostnames[i], AF_INET, &l_sa))
             {
                 struct in_addr *l_res = (struct in_addr *)&l_sa;
-
+                if(l_node_candidate->hdr.ext_addr_v4.s_addr == l_res->s_addr)
+                {
+                    dap_global_db_del_sync(l_net->pub.gdb_nodes,l_objs[l_node_num].key);
+                    if(l_nodes_count>1)
+                        return NULL;
+                }
             }
         }
-
     }
-    // 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;
-
-    if (l_node_candidate->hdr.cell_id)
-        if (dap_global_db_del_sync(a_net->pub.gdb_nodes, l_objs[i].key) !=0 )
-        dap_config_close(l_cfg);
-
+    dap_config_close(l_cfg);
     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);
-- 
GitLab


From ffdeee98d64ea87976e29df5fa6d1fde8fd68c00 Mon Sep 17 00:00:00 2001
From: "roman.padenkov" <roman.padenkov@demlabs.net>
Date: Tue, 16 May 2023 18:58:33 +0700
Subject: [PATCH 4/7] edit balancer, change check seed ip

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

diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index e10e6cc409..d801c63f94 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -3074,6 +3074,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 fc0af1ef4a..eec0e723b5 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -30,9 +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_config_t *l_cfg=NULL;
-    dap_string_t *l_cfg_path = dap_string_new("network/");
-    dap_string_append(l_cfg_path,a_net_name);
+    dap_list_t *l_node_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;
@@ -42,7 +40,7 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
             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;
@@ -51,40 +49,34 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
     l_objs = dap_global_db_get_all_sync(l_net->pub.gdb_nodes, &l_nodes_count);
     if (!l_nodes_count || !l_objs)
         return NULL;
+    l_node_list = dap_chain_net_get_node_list_cfg(l_net);
     dap_chain_node_info_t *l_node_candidate;
     for (int i = 0; i < 50; i++) {
         // 50 tryes for non empty address & port
+        bool f_continue = false;
         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;
-    //dell cfg seed from db
-    if( ( l_cfg = dap_config_open ( l_cfg_path->str ) ) == NULL ) {
-        log_it(L_ERROR,"Can't open default network config");
-        dap_string_free(l_cfg_path,true);
-    } else {
-        uint16_t l_seed_nodes_hostnames_len =0;
-        char ** l_seed_nodes_hostnames = dap_config_get_array_str( l_cfg , "general" ,"seed_nodes_hostnames"
-                                                             ,&l_seed_nodes_hostnames_len);
-        struct sockaddr l_sa = {};
-        for(size_t i = 0;i<l_seed_nodes_hostnames_len;i++)
-        {
-            if(!dap_net_resolve_host(l_seed_nodes_hostnames[i], AF_INET, &l_sa))
+            if(l_node_list)
             {
-                struct in_addr *l_res = (struct in_addr *)&l_sa;
-                if(l_node_candidate->hdr.ext_addr_v4.s_addr == l_res->s_addr)
+                for(dap_list_t *node_i = l_node_list;node_i;node_i = node_i->next)
                 {
-                    dap_global_db_del_sync(l_net->pub.gdb_nodes,l_objs[l_node_num].key);
-                    if(l_nodes_count>1)
-                        return NULL;
+                    dap_chain_node_info_t *l_node_cfg = (dap_chain_node_info_t*)node_i->data;
+                    if(l_node_cfg->hdr.ext_addr_v4.s_addr == l_node_candidate->hdr.ext_addr_v4.s_addr)
+                        f_continue = true;
                 }
+                if(f_continue)
+                    continue;
             }
-        }
+            else
+            {
+                break;
+            }
+        break;
     }
-    dap_config_close(l_cfg);
+    dap_list_free(l_node_list);
+    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);
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


From e79f1edfa265758aa3f2d1c4a7dcb07a6dd6f2df Mon Sep 17 00:00:00 2001
From: "roman.padenkov" <roman.padenkov@demlabs.net>
Date: Tue, 16 May 2023 19:55:05 +0700
Subject: [PATCH 5/7] ...

---
 modules/net/dap_chain_net_balancer.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index eec0e723b5..3e6ccec355 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -48,8 +48,13 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
     // 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(i=0;i<l_nodes_count;i++)
+    {
+        l_objs_list = dap_list_append(l_objs_list,l_objs[i]);
+    }
+    dap_global_db_objs_delete(l_objs, l_nodes_count);
     dap_chain_node_info_t *l_node_candidate;
     for (int i = 0; i < 50; i++) {
         // 50 tryes for non empty address & port
-- 
GitLab


From b717b4f07d97c1b902e297b563918c77a7a71282 Mon Sep 17 00:00:00 2001
From: "roman.padenkov" <roman.padenkov@demlabs.net>
Date: Wed, 17 May 2023 15:48:04 +0700
Subject: [PATCH 6/7] edit logic balancer

---
 modules/net/dap_chain_net_balancer.c | 58 +++++++++++++++-------------
 1 file changed, 31 insertions(+), 27 deletions(-)

diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index 3e6ccec355..cc7a7ed22c 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -30,7 +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;
+    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;
@@ -44,47 +44,51 @@ 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;
+    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;    
     l_node_list = dap_chain_net_get_node_list_cfg(l_net);
-    for(i=0;i<l_nodes_count;i++)
+    for(size_t i=0;i<l_nodes_count;i++)
     {
-        l_objs_list = dap_list_append(l_objs_list,l_objs[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_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
-        bool f_continue = false;
-        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)
-            if(l_node_list)
-            {
-                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;
-                    if(l_node_cfg->hdr.ext_addr_v4.s_addr == l_node_candidate->hdr.ext_addr_v4.s_addr)
-                        f_continue = true;
-                }
-                if(f_continue)
-                    continue;
-            }
-            else
-            {
+    if(l_nodes_count)
+    {
+        for (int i = 0; i < 50; i++) {
+            // 50 tryes for non empty address & port
+            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)
                 break;
-            }
-        break;
+        }
     }
-    dap_list_free(l_node_list);
+    else
+        l_node_candidate = (dap_chain_node_info_t *)dap_list_nth_data(l_node_list,0);
     if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port)
+    {
+        dap_list_free(l_node_list);
+        dap_list_free(l_objs_list);
         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);
+    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;
 }
-- 
GitLab


From 52103345b16d046013ee8035c50ebaa89f5f8a2e Mon Sep 17 00:00:00 2001
From: "roman.padenkov" <roman.padenkov@demlabs.net>
Date: Wed, 17 May 2023 17:54:51 +0700
Subject: [PATCH 7/7] ...

---
 modules/net/dap_chain_net_balancer.c | 19 +++++--------------
 1 file changed, 5 insertions(+), 14 deletions(-)

diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c
index cc7a7ed22c..5851af3429 100644
--- a/modules/net/dap_chain_net_balancer.c
+++ b/modules/net/dap_chain_net_balancer.c
@@ -56,7 +56,8 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
         {
             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_cfg->hdr.ext_addr_v4.s_addr != l_node_cand->hdr.ext_addr_v4.s_addr)
+            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++;
@@ -69,22 +70,12 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name)
     dap_chain_node_info_t *l_node_candidate;
     if(l_nodes_count)
     {
-        for (int i = 0; i < 50; i++) {
-            // 50 tryes for non empty address & port
-            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)
-                break;
-        }
+        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);
     }
     else
         l_node_candidate = (dap_chain_node_info_t *)dap_list_nth_data(l_node_list,0);
-    if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port)
-    {
-        dap_list_free(l_node_list);
-        dap_list_free(l_objs_list);
-        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_list_free(l_objs_list);
-- 
GitLab