Skip to content
Snippets Groups Projects
Commit 554850a5 authored by dmitriy.gerasimov's avatar dmitriy.gerasimov
Browse files

[+] Networking FSM, lot of additional information for hold and parse

parent b6726042
No related branches found
No related tags found
No related merge requests found
......@@ -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);
}
}
......
......@@ -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);
......
......@@ -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;
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment