From 554850a59d0dab4ea06f688b28cf9e4f8e745951 Mon Sep 17 00:00:00 2001
From: Dmtiriy Gerasimov <naeper@demlabs.net>
Date: Sun, 12 May 2019 17:10:36 +0700
Subject: [PATCH] [+] Networking FSM, lot of additional information for hold
 and parse

---
 dap_chain_net.c          | 67 ++++++++++++++++++++++++++++++++--------
 dap_chain_net.h          | 12 ++++---
 dap_chain_node_cli_cmd.c | 38 ++++++++++++-----------
 dap_chain_node_cli_cmd.h |  4 +++
 4 files changed, 86 insertions(+), 35 deletions(-)

diff --git a/dap_chain_net.c b/dap_chain_net.c
index d411ab796c..7880c6b8d9 100644
--- a/dap_chain_net.c
+++ b/dap_chain_net.c
@@ -30,11 +30,15 @@
 #include "utlist.h"
 
 #include "dap_common.h"
+#include "dap_string.h"
 #include "dap_strfuncs.h"
 #include "dap_config.h"
 #include "dap_chain_utxo.h"
 #include "dap_chain_net.h"
 #include "dap_chain_node_client.h"
+#include "dap_chain_node_cli.h"
+#include "dap_chain_node_cli_cmd.h"
+
 #include "dap_module.h"
 
 #define _XOPEN_SOURCE 700
@@ -76,21 +80,27 @@ typedef struct dap_chain_net_item{
 static dap_chain_net_item_t * s_net_items = NULL;
 static dap_chain_net_item_t * s_net_items_ids = NULL;
 
-static size_t            s_net_configs_count = 0;
 static pthread_cond_t    s_net_proc_loop_cond = PTHREAD_COND_INITIALIZER;
 static pthread_mutex_t    s_net_proc_loop_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-int s_net_states_proc(dap_chain_net_t * l_net);
-
 static const char * c_net_states[]={
     [NET_STATE_BEGIN] = "NET_STATE_BEGIN",
     [NET_STATE_LINKS_CONNECTING] = "NET_STATE_LINKS_CONNECTING",
     [NET_STATE_LINKS_ESTABLISHED]= "NET_STATE_LINKS_ESTABLISHED",
     [NET_STATE_SYNC_GDB]= "NET_STATE_SYNC_GDB",
     [NET_STATE_SYNC_CHAINS]= "NET_STATE_SYNC_CHAINS",
-    [NET_STATE_STAND_BY]= "NET_STATE_STAND_BY"
+    [NET_STATE_SYNC_ALL]= "NET_STATE_STAND_BY"
 };
 
+static dap_chain_net_t * s_net_new(const char * a_id, const char * a_name , const char * a_node_role);
+inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state);
+static int s_net_states_proc(dap_chain_net_t * l_net);
+static void * s_net_proc_thread ( void * a_net);
+static void s_net_proc_thread_start( dap_chain_net_t * a_net );
+static void s_net_proc_kill( dap_chain_net_t * a_net );
+
+static int s_cli_net(int argc, const char ** argv, char **str_reply);
+
 /**
  * @brief s_net_state_to_str
  * @param l_state
@@ -120,13 +130,14 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n
  * @brief s_net_states_proc
  * @param l_net
  */
-int s_net_states_proc(dap_chain_net_t * l_net)
+static int s_net_states_proc(dap_chain_net_t * l_net)
 {
     int ret=0;
     switch ( PVT(l_net)->state ){
         case NET_STATE_BEGIN:{
-            if ( PVT(l_net)->state_target != NET_STATE_BEGIN )
-                dap_chain_net_links_establish(l_net);
+            if ( PVT(l_net)->state_target != NET_STATE_BEGIN ){
+
+            }
         }break;
         case NET_STATE_LINKS_CONNECTING:{
 
@@ -142,7 +153,7 @@ int s_net_states_proc(dap_chain_net_t * l_net)
         case NET_STATE_SYNC_CHAINS:{
 
         }break;
-        case NET_STATE_STAND_BY:{
+        case NET_STATE_SYNC_ALL:{
 
         } break;
     }
@@ -203,7 +214,7 @@ static void s_net_proc_kill( dap_chain_net_t * a_net )
  * @param a_node_name
  * @return
  */
-dap_chain_net_t * dap_chain_net_new(const char * a_id, const char * a_name ,
+static dap_chain_net_t * s_net_new(const char * a_id, const char * a_name ,
                                     const char * a_node_role)
 {
     dap_chain_net_t * ret = DAP_NEW_Z_SIZE (dap_chain_net_t, sizeof (ret->pub)+ sizeof (dap_chain_net_pvt_t) );
@@ -266,13 +277,40 @@ void dap_chain_net_delete( dap_chain_net_t * a_net )
  * @return
  */
 int dap_chain_net_init()
+{
+    dap_chain_node_cli_cmd_item_create ("net", s_cli_net, "Network commands",
+        "net -net <chain net name> sync < all | gdb | chains >\n"
+            "\tSyncronyze gdb, chains or everything\n\n" );
+
+    return dap_chain_net_load("default");
+}
+
+/**
+ * @brief s_cli_net
+ * @param argc
+ * @param argv
+ * @param str_reply
+ * @return
+ */
+static int s_cli_net(int argc, const char ** argv, char **str_reply)
+{
+
+}
+
+
+int dap_chain_net_load(const char * a_net_name)
 {
     static dap_config_t *l_cfg=NULL;
-    if((l_cfg = dap_config_open( "network/default" ) ) == NULL) {
+    dap_string_t *l_cfg_path = dap_string_new("network/");
+    dap_string_append(l_cfg_path,a_net_name);
+
+    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);
         return -1;
-    }else{
-        dap_chain_net_t * l_net = dap_chain_net_new(
+    } else {
+        dap_string_free(l_cfg_path,true);
+        dap_chain_net_t * l_net = s_net_new(
                                             dap_config_get_item_str(l_cfg , "general" , "id" ),
                                             dap_config_get_item_str(l_cfg , "general" , "name" ),
                                             dap_config_get_item_str(l_cfg , "general" , "node-role" )
@@ -322,8 +360,11 @@ int dap_chain_net_init()
 
                         // Create chain object
                         dap_chain_t * l_chain = dap_chain_load_from_cfg(l_net->pub.name, l_net->pub.id, l_chains_path);
-                        if(l_chain)
+                        if(l_chain){
                             DL_APPEND( l_net->pub.chains, l_chain);
+                            if(l_chain->callback_created)
+                                l_chain->callback_created(l_chain,l_cfg);
+                        }
                         free(l_entry_name);
                     }
                 }
diff --git a/dap_chain_net.h b/dap_chain_net.h
index 276a09b08a..ab49382ae0 100644
--- a/dap_chain_net.h
+++ b/dap_chain_net.h
@@ -39,13 +39,14 @@ typedef  enum dap_chain_net_state{
     NET_STATE_LINKS_ESTABLISHED,
     NET_STATE_SYNC_GDB,
     NET_STATE_SYNC_CHAINS,
-    NET_STATE_STAND_BY,
+    NET_STATE_SYNC_ALL,
 } dap_chain_net_state_t;
 
 
 typedef struct dap_chain_net{
     struct {
         dap_chain_net_id_t id;
+        dap_chain_cell_id_t cell_id; // Cell where the node is connected to. {{0}} if not celled(sharder) blockchain
         char * name;
         char * gdb_groups_prefix;
         dap_chain_t * chains; // double-linked list of chains
@@ -53,17 +54,20 @@ typedef struct dap_chain_net{
     uint8_t pvt[];
 } dap_chain_net_t;
 
+
 int dap_chain_net_init(void);
 void dap_chain_net_deinit(void);
 
-dap_chain_net_t * dap_chain_net_new (const char * a_id,  const char * a_name,
-                                     const char* a_node_role );
+int dap_chain_net_load(const char * a_net_name);
 
 int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state);
 
-inline static int dap_chain_net_start(dap_chain_net_t * a_net){ return dap_chain_net_state_go_to(a_net,NET_STATE_STAND_BY); }
+inline static int dap_chain_net_start(dap_chain_net_t * a_net){ return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_ALL); }
 inline static int dap_chain_net_stop(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_BEGIN); }
 inline static int dap_chain_net_links_establish(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_LINKS_ESTABLISHED); }
+inline static int dap_chain_net_sync_chains(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_CHAINS); }
+inline static int dap_chain_net_sync_gdb(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_GDB); }
+inline static int dap_chain_net_sync_all(dap_chain_net_t * a_net) { return dap_chain_net_state_go_to(a_net,NET_STATE_SYNC_ALL); }
 
 void dap_chain_net_delete( dap_chain_net_t * a_net);
 void dap_chain_net_proc_datapool (dap_chain_net_t * a_net);
diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index e168a31d39..79a686eef4 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -1382,33 +1382,35 @@ int com_tx_wallet(int argc, const char ** argv, char **str_reply)
  * @param l_net
  * @return
  */
-int s_values_parse_net_chain(int *a_arg_index,int argc, const char ** argv, char ** a_str_reply,
+int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int argc, const char ** argv, char ** a_str_reply,
                              dap_chain_t ** a_chain, dap_chain_net_t ** a_net)
 {
     const char * l_chain_str = NULL;
     const char * l_net_str = NULL;
-    // Net name
-    dap_chain_node_cli_find_option_val(argv, *a_arg_index, argc, "-net", &l_net_str);
 
-    // Chain name
-    dap_chain_node_cli_find_option_val(argv, *a_arg_index, argc, "-chain", &l_chain_str);
+    // Net name
+    if ( a_net )
+        dap_chain_node_cli_find_option_val(argv, *a_arg_index, argc, "-net", &l_net_str);
+    else
+       return -100;
 
     // Select chain network
     if(!l_net_str) {
         dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'net'",argv[0]);
         return -42;
-    }else {
-        if ( ( *a_net  = dap_chain_net_by_name(l_net_str) ) == NULL ){ // Can't find such network
-            dap_chain_node_cli_set_reply_text(a_str_reply, "%s cand find network \"%s\"",argv[0],l_net_str);
-            return -43;
-        }
     }
+    // Chain name
+    if ( a_chain )
+        dap_chain_node_cli_find_option_val(argv, *a_arg_index, argc, "-chain", &l_chain_str);
+
+    if ( ( *a_net  = dap_chain_net_by_name(l_net_str) ) == NULL ){ // Can't find such network
+        dap_chain_node_cli_set_reply_text(a_str_reply, "%s cand find network \"%s\"",argv[0],l_net_str);
+        return -43;
+    }
+
 
     // Select chain
-    if(!l_chain_str) {
-        dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'chain'",argv[0]);
-        return -44;
-    }else {
+    if(l_chain_str) {
         if ( ( *a_chain  = dap_chain_net_get_chain_by_name(*a_net, l_chain_str ) ) == NULL ){ // Can't find such chain
             dap_chain_node_cli_set_reply_text(a_str_reply, "%s requires parameter 'chain' to be valid chain name in chain net %s",
                                               argv[0] , l_net_str);
@@ -1442,7 +1444,7 @@ int com_token_decl_sign(int argc, const char ** argv, char ** a_str_reply)
 
         dap_chain_net_t * l_net = NULL;
 
-        if ( s_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0 )
+        if ( dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0 )
             return -1;
 
         // Load certs lists
@@ -1597,7 +1599,7 @@ int com_mempool_list(int argc, const char ** argv, char ** a_str_reply)
     dap_chain_t * l_chain;
     dap_chain_net_t * l_net = NULL;
 
-    if (s_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0)
+    if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0)
         return -1;
 
     char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
@@ -1632,7 +1634,7 @@ int com_mempool_proc(int argc, const char ** argv, char ** a_str_reply)
     dap_chain_t * l_chain;
     dap_chain_net_t * l_net = NULL;
 
-    if (s_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0)
+    if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,a_str_reply,&l_chain, &l_net) < 0)
         return -1;
 
     char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
@@ -1702,7 +1704,7 @@ int com_token_decl(int argc, const char ** argv, char ** str_reply)
     dap_chain_t * l_chain;
     dap_chain_net_t * l_net = NULL;
 
-    if (s_values_parse_net_chain(&arg_index,argc,argv,str_reply,&l_chain, &l_net) < 0)
+    if (dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index,argc,argv,str_reply,&l_chain, &l_net) < 0)
         return -1;
 
 
diff --git a/dap_chain_node_cli_cmd.h b/dap_chain_node_cli_cmd.h
index 3428ccb42a..ff408b30ca 100644
--- a/dap_chain_node_cli_cmd.h
+++ b/dap_chain_node_cli_cmd.h
@@ -24,6 +24,8 @@
 
 #pragma once
 
+#include "dap_chain.h"
+#include "dap_chain_net.h"
 #include "dap_chain_node.h"
 #include "dap_chain_node_cli.h"
 
@@ -35,6 +37,8 @@
 dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias(const char *alias);
 
 
+int dap_chain_node_cli_cmd_values_parse_net_chain(int *a_arg_index,int argc, const char ** argv, char ** a_str_reply,
+                             dap_chain_t ** a_chain, dap_chain_net_t ** a_net);
 
 /**
  * global_db command
-- 
GitLab