diff --git a/dap_chain_net.c b/dap_chain_net.c index 74a12fba92f141af43fa612f116dde2ab7bb2484..cc1da6e83c6959c3a5f217a32bd21ee0cf640254 100644 --- a/dap_chain_net.c +++ b/dap_chain_net.c @@ -280,9 +280,11 @@ static void s_chain_callback_notify(void * a_arg, dap_chain_t *a_chain, dap_chai */ static int s_net_states_proc(dap_chain_net_t * l_net) { +#if DAP_DEBUG dap_chain_net_pvt_t *pvt_debug = PVT(l_net); +#endif int ret=0; -lb_proc_state: + pthread_mutex_lock(&PVT(l_net)->state_mutex ); switch ( PVT(l_net)->state ){ case NET_STATE_OFFLINE:{ @@ -302,8 +304,7 @@ lb_proc_state: if ( PVT(l_net)->state_target != NET_STATE_OFFLINE ){ PVT(l_net)->state = NET_STATE_LINKS_PREPARE; - pthread_mutex_unlock(&PVT(l_net)->state_mutex ); - goto lb_proc_state; + break; } // disable SYNC_GDB if(PVT(l_net)->flags & F_DAP_CHAIN_NET_GO_SYNC) @@ -390,7 +391,7 @@ lb_proc_state: // add linked nodes for connect for(uint16_t i = 0; i < min(4, l_cur_node_info->hdr.links_number); i++) { dap_chain_node_addr_t *l_addr = l_cur_node_info->links + i; - dap_chain_node_addr_t link_addr = l_cur_node_info->links[i]; + //dap_chain_node_addr_t link_addr = l_cur_node_info->links[i]; dap_chain_node_info_t *l_remore_node_info = dap_chain_node_info_read(l_net, l_addr); if(l_remore_node_info) { // if only nodes from the same cell of cell=0 @@ -449,53 +450,48 @@ lb_proc_state: PVT(l_net)->state = NET_STATE_OFFLINE; } } - pthread_mutex_unlock(&PVT(l_net)->state_mutex ); - goto lb_proc_state; + break; case NET_STATE_LINKS_CONNECTING:{ - log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_CONNECTING",l_net->pub.name); - //size_t l_links_established = 0; - for(size_t j = PVT(l_net)->links_count; j < PVT(l_net)->links_addrs_count; j++) { - //size_t j = - log_it(L_INFO,"Establishing connection with " NODE_ADDR_FP_STR, - NODE_ADDR_FP_ARGS_S( PVT(l_net)->links_addrs[j]) ); - dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(l_net, &PVT(l_net)->links_addrs[j] ); - if ( l_link_node_info ) { - dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_link_node_info ); - if(!l_node_client) { - DAP_DELETE(l_link_node_info); - ret = -1; - break; - } - // wait connected - int timeout_ms = 5000; //5 sec = 5000 ms - int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms); - if (res == 0 ){ - log_it(L_NOTICE, "Connected link %u",j); - HASH_ADD(hh, PVT(l_net)->links, remote_node_addr, sizeof(l_node_client->remote_node_addr), l_node_client); - PVT(l_net)->links_count++; - if(PVT(l_net)->links_count >= s_required_links_count || (PVT(l_net)->links_count + 1) >= s_max_links_count) - break; - }else { - log_it(L_NOTICE, "Cant establish link %u",j); - dap_chain_node_client_close(l_node_client); - } - } + size_t l_links_count = PVT(l_net)->links_count; + if(l_links_count >= s_required_links_count || (l_links_count + 1) >= s_max_links_count) { + // TODO what if other failed and we want more? } - if (PVT(l_net)->links_count >0 ){ - log_it(L_NOTICE, "Established %u links",PVT(l_net)->links_count); - PVT(l_net)->state = NET_STATE_LINKS_ESTABLISHED; - }else { - log_it(L_NOTICE, "Can't establish links, go to offline"); + if (l_links_count < PVT(l_net)->links_addrs_count) { + PVT(l_net)->links_count++; + } else { + log_it(L_NOTICE, "Can't establish enough links, go to offline"); PVT(l_net)->state = NET_STATE_OFFLINE ; PVT(l_net)->state_target = NET_STATE_OFFLINE ; } + log_it(L_DEBUG, "%s.state: NET_STATE_LINKS_CONNECTING",l_net->pub.name); + log_it(L_DEBUG, "Establishing connection with " NODE_ADDR_FP_STR, + NODE_ADDR_FP_ARGS_S( PVT(l_net)->links_addrs[l_links_count]) ); + dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(l_net, &PVT(l_net)->links_addrs[l_links_count]); + if ( l_link_node_info ) { + dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_link_node_info); + if(!l_node_client) { + DAP_DELETE(l_link_node_info); + ret = -1; + break; + } + // wait connected + int timeout_ms = 5000; //5 sec = 5000 ms + int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms); + if (res == 0 ){ + log_it(L_DEBUG, "Connected link %u", l_links_count); + PVT(l_net)->links = l_node_client; + PVT(l_net)->state = NET_STATE_LINKS_ESTABLISHED; + }else { + log_it(L_DEBUG, "Cant establish link %u", l_links_count); + dap_chain_node_client_close(l_node_client); + } + } } - pthread_mutex_unlock(&PVT(l_net)->state_mutex ); - goto lb_proc_state; + break; case NET_STATE_LINKS_ESTABLISHED:{ - log_it(L_NOTICE,"%s.state: NET_STATE_LINKS_ESTABLISHED",l_net->pub.name); + log_it(L_DEBUG,"%s.state: NET_STATE_LINKS_ESTABLISHED",l_net->pub.name); switch (PVT(l_net)->state_target) { case NET_STATE_ONLINE:{ // Online switch ( PVT(l_net)->node_role.enums ){ @@ -526,8 +522,7 @@ lb_proc_state: } } } - pthread_mutex_unlock(&PVT(l_net)->state_mutex ); - goto lb_proc_state; + break; case NET_STATE_SYNC_GDB: // we need only to sync gdb PVT(l_net)->state = NET_STATE_SYNC_GDB ; @@ -537,224 +532,211 @@ lb_proc_state: case NET_STATE_ONLINE: case NET_STATE_SYNC_GDB: PVT(l_net)->state = NET_STATE_SYNC_GDB; - pthread_mutex_unlock(&PVT(l_net)->state_mutex ); - goto lb_proc_state; + break; case NET_STATE_SYNC_CHAINS: PVT(l_net)->state = NET_STATE_SYNC_CHAINS; - pthread_mutex_unlock(&PVT(l_net)->state_mutex ); - goto lb_proc_state; + break; default: { PVT(l_net)->state = NET_STATE_OFFLINE; PVT(l_net)->state_target = NET_STATE_OFFLINE; } } } - pthread_mutex_unlock(&PVT(l_net)->state_mutex ); - goto lb_proc_state; + break; case NET_STATE_SYNC_CHAINS: PVT(l_net)->state = (PVT(l_net)->node_info && PVT(l_net)->node_info->hdr.address.uint64)? NET_STATE_SYNC_CHAINS : NET_STATE_ADDR_REQUEST; - pthread_mutex_unlock(&PVT(l_net)->state_mutex ); - goto lb_proc_state; + break; case NET_STATE_ADDR_REQUEST : PVT(l_net)->state = NET_STATE_ADDR_REQUEST; - pthread_mutex_unlock(&PVT(l_net)->state_mutex ); - goto lb_proc_state; - default:{} + break; + default: break; } - }break; + } break; // get addr for remote node - case NET_STATE_ADDR_REQUEST:{ + case NET_STATE_ADDR_REQUEST: { int l_is_addr_leased = 0; - dap_chain_node_client_t * l_node_client = NULL, *l_node_client_tmp = NULL; - - HASH_ITER(hh,PVT(l_net)->links,l_node_client,l_node_client_tmp){ - uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); // Channel id for chain net request - dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); - // set callback for l_ch_id - dap_chain_node_client_set_callbacks( l_node_client->client, l_ch_id); - // send request for new address - size_t res = dap_stream_ch_chain_net_pkt_write(l_ch_chain, - DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST, - //DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST, - l_net->pub.id, NULL, 0); - if(res == 0) { - log_it(L_WARNING,"Can't send NODE_ADDR_REQUEST packet"); - HASH_DEL(PVT(l_net)->links,l_node_client); - dap_chain_node_client_close(l_node_client); - continue; // try with another link - } - - // wait for finishing of request - int timeout_ms = 5000; // 5 sec = 5 000 ms - // TODO add progress info to console - PVT(l_net)->addr_request_attempts++; - int l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_NODE_ADDR_LEASED, timeout_ms); - switch (l_res) { - case -1: - log_it(L_WARNING,"Timeout with addr leasing"); - // try again 3 times - if(PVT(l_net)->addr_request_attempts < 3) { - pthread_mutex_unlock(&PVT(l_net)->state_mutex); - goto lb_proc_state; - } - continue; // try with another link - case 0: - log_it(L_INFO, "Node address leased"); - l_is_addr_leased++; - //PVT(l_net)->state = NET_STATE_SYNC_GDB; - //pthread_mutex_unlock(&PVT(l_net)->state_mutex ); goto lb_proc_state; + dap_chain_node_client_t *l_node_client = PVT(l_net)->links; + uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); // Channel id for chain net request + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); + // set callback for l_ch_id + dap_chain_node_client_set_callbacks(l_node_client->client, l_ch_id); + // send request for new address + size_t res = dap_stream_ch_chain_net_pkt_write(l_ch_chain, + DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST, + //DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST, + l_net->pub.id, NULL, 0); + if (res == 0) { + log_it(L_WARNING,"Can't send NODE_ADDR_REQUEST packet"); + dap_chain_node_client_close(l_node_client); + PVT(l_net)->state = NET_STATE_LINKS_CONNECTING; + break; // try with another link + } + // wait for finishing of request + int timeout_ms = 5000; // 5 sec = 5 000 ms + // TODO add progress info to console + PVT(l_net)->addr_request_attempts++; + int l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_NODE_ADDR_LEASED, timeout_ms); + switch (l_res) { + case -1: + log_it(L_WARNING,"Timeout with addr leasing"); + // try again 3 times + if (PVT(l_net)->addr_request_attempts < 3) { break; - default: - if ( l_node_client->last_error[0] ){ - log_it(L_INFO, "Node address request error %d: \"%s\"",l_res, l_node_client->last_error ); - l_node_client->last_error[0]='\0'; - } - log_it(L_INFO, "Node address request error %d",l_res); - continue; - } + } + PVT(l_net)->state = NET_STATE_LINKS_CONNECTING; + break; // try with another link + case 0: + log_it(L_INFO, "Node address leased"); + l_is_addr_leased++; + PVT(l_net)->addr_request_attempts = 0; + break; + default: + if (l_node_client->last_error[0]) { + log_it(L_INFO, "Node address request error %d: \"%s\"", l_res, l_node_client->last_error); + l_node_client->last_error[0] = '\0'; + } + log_it(L_INFO, "Node address request error %d", l_res); + PVT(l_net)->state = NET_STATE_LINKS_CONNECTING; + break; } - if(l_is_addr_leased > 0) { + if (l_is_addr_leased > 0) { PVT(l_net)->state = NET_STATE_SYNC_GDB; - pthread_mutex_unlock(&PVT(l_net)->state_mutex); - goto lb_proc_state; - } - else{ - log_it(L_WARNING,"Haven't received address from any links, return back to LINKS_ESTABLISHED"); - PVT(l_net)->state = NET_STATE_LINKS_ESTABLISHED; - pthread_mutex_unlock(&PVT(l_net)->state_mutex );goto lb_proc_state; // One address assigned its enought for now } - } break; case NET_STATE_SYNC_GDB:{ // send request - dap_chain_node_client_t * l_node_client = NULL, *l_node_client_tmp = NULL; - HASH_ITER(hh,PVT(l_net)->links,l_node_client,l_node_client_tmp){ - dap_stream_ch_chain_sync_request_t l_sync_gdb = { { 0 } }; - // Get last timestamp in log - l_sync_gdb.id_start = (uint64_t) dap_db_log_get_last_id_remote(l_node_client->remote_node_addr.uint64); - // no limit - l_sync_gdb.id_end = (uint64_t)0; - - l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr(l_net) ? - dap_chain_net_get_cur_addr(l_net)->uint64 : - dap_db_get_cur_node_addr(l_net->pub.name); - - dap_chain_id_t l_chain_id_null = { { 0 } }; - dap_chain_cell_id_t l_chain_cell_id_null = { { 0 } }; - l_chain_id_null.uint64 = l_net->pub.id.uint64; - l_chain_cell_id_null.uint64 = dap_chain_net_get_cur_cell(l_net) ? dap_chain_net_get_cur_cell(l_net)->uint64 : 0; - - log_it(L_DEBUG,"Prepared request to gdb sync from %llu to %llu",l_sync_gdb.id_start,l_sync_gdb.id_end); - // find dap_chain_id_t - dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb"); - dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t ) { { 0 } }; - - size_t l_res = dap_stream_ch_chain_pkt_write(dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id()), - DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, l_net->pub.id, l_chain_id, - l_net->pub.cell_id, &l_sync_gdb, sizeof(l_sync_gdb)); - if(l_res == 0) { - log_it(L_WARNING,"Can't send GDB sync request"); - HASH_DEL(PVT(l_net)->links,l_node_client); - dap_chain_node_client_close(l_node_client); - PVT(l_net)->state = NET_STATE_OFFLINE; - continue; - } + dap_chain_node_client_t *l_node_client = PVT(l_net)->links; + dap_stream_ch_chain_sync_request_t l_sync_gdb = {}; + // Get last timestamp in log + l_sync_gdb.id_start = (uint64_t) dap_db_log_get_last_id_remote(l_node_client->remote_node_addr.uint64); + // no limit + l_sync_gdb.id_end = (uint64_t)0; + + l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr(l_net) ? + dap_chain_net_get_cur_addr(l_net)->uint64 : + dap_db_get_cur_node_addr(l_net->pub.name); + + dap_chain_id_t l_chain_id_null = {}; + dap_chain_cell_id_t l_chain_cell_id_null = {}; + l_chain_id_null.uint64 = l_net->pub.id.uint64; + l_chain_cell_id_null.uint64 = dap_chain_net_get_cur_cell(l_net) ? dap_chain_net_get_cur_cell(l_net)->uint64 : 0; + + log_it(L_DEBUG, "Prepared request to gdb sync from %llu to %llu", l_sync_gdb.id_start, l_sync_gdb.id_end); + // find dap_chain_id_t + dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb"); + dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t ) {}; + + size_t l_res = dap_stream_ch_chain_pkt_write(dap_client_get_stream_ch(l_node_client->client, dap_stream_ch_chain_get_id()), + DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, l_net->pub.id, l_chain_id, + l_net->pub.cell_id, &l_sync_gdb, sizeof(l_sync_gdb)); + if (l_res == 0) { + log_it(L_WARNING, "Can't send GDB sync request"); + dap_chain_node_client_close(l_node_client); + PVT(l_net)->state = NET_STATE_LINKS_CONNECTING; + break; //try another link + } - // wait for finishing of request - int timeout_ms = 300000; // 5 min = 300 sec = 300 000 ms - // TODO add progress info to console - int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms); - switch (res) { - case -1: - log_it(L_WARNING,"Timeout with link sync"); - break; - case 0: - log_it(L_INFO, "Node sync completed"); - break; - default: - log_it(L_INFO, "Node sync error %d",res); - } + // wait for finishing of request + int timeout_ms = 300000; // 5 min = 300 sec = 300 000 ms + // TODO add progress info to console + l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms); + switch (l_res) { + case -1: + log_it(L_WARNING,"Timeout with link sync"); + break; + case 0: + log_it(L_INFO, "Node sync completed"); + break; + default: + log_it(L_INFO, "Node sync error %d",l_res); + } + if (l_res) { // try another link + break; } if(PVT(l_net)->state_target >= NET_STATE_ONLINE){ PVT(l_net)->state = NET_STATE_SYNC_CHAINS; - }else { + } else { PVT(l_net)->state = NET_STATE_ONLINE; } } - pthread_mutex_unlock(&PVT(l_net)->state_mutex); - goto lb_proc_state; + break; - case NET_STATE_SYNC_CHAINS:{ - dap_chain_node_client_t * l_node_client = NULL, *l_node_client_tmp = NULL; + case NET_STATE_SYNC_CHAINS: { + dap_chain_node_client_t *l_node_client = PVT(l_net)->links; uint8_t l_ch_id = dap_stream_ch_chain_get_id(); // Channel id for global_db and chains sync - - HASH_ITER(hh,PVT(l_net)->links,l_node_client,l_node_client_tmp){ - dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); - if(!l_ch_chain){ - log_it(L_DEBUG,"Can't get stream_ch for id='%c' ", l_ch_id); - continue; - } - dap_chain_t * l_chain = NULL; - DL_FOREACH(l_net->pub.chains, l_chain ){ - //size_t l_lasts_size = 0; - //dap_chain_atom_ptr_t * l_lasts; - //dap_chain_atom_iter_t * l_atom_iter = l_chain->callback_atom_iter_create(l_chain); - //l_lasts = l_chain->callback_atom_iter_get_lasts(l_atom_iter, &l_lasts_size); - //if( l_lasts ) { - l_node_client->state = NODE_CLIENT_STATE_CONNECTED; - dap_stream_ch_chain_sync_request_t l_request = { { 0 } }; - //dap_hash_fast(l_lasts[0], l_chain->callback_atom_get_size(l_lasts[0]), &l_request.hash_from); - dap_stream_ch_chain_pkt_write(l_ch_chain, - DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, l_net->pub.id, l_chain->id, - l_net->pub.cell_id, &l_request, sizeof(l_request)); - // - // dap_chain_node_client_send_ch_pkt(l_node_client,l_ch_id, - // DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, - // &l_request,sizeof (l_request) ); - - // wait for finishing of request - int timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms - // TODO add progress info to console - int l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms); - switch (l_res) { - case -1: - log_it(L_WARNING,"Timeout with sync of chain '%s' ", l_chain->name); - break; - case 0: - // flush global_db - dap_chain_global_db_flush(); - log_it(L_INFO, "sync of chain '%s' completed ", l_chain->name); - // set time of last sync - { - struct timespec l_to; - clock_gettime( CLOCK_MONOTONIC, &l_to); - PVT(l_net)->last_sync = l_to.tv_sec; - } - break; - default: - log_it(L_INFO, "sync of chain '%s' error %d", l_chain->name,l_res); + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); + if(!l_ch_chain) { + log_it(L_DEBUG,"Can't get stream_ch for id='%c' ", l_ch_id); + PVT(l_net)->state = NET_STATE_LINKS_CONNECTING; + break; + } + dap_chain_t * l_chain = NULL; + int l_sync_errors = 0; + DL_FOREACH(l_net->pub.chains, l_chain ){ + //size_t l_lasts_size = 0; + //dap_chain_atom_ptr_t * l_lasts; + //dap_chain_atom_iter_t * l_atom_iter = l_chain->callback_atom_iter_create(l_chain); + //l_lasts = l_chain->callback_atom_iter_get_lasts(l_atom_iter, &l_lasts_size); + //if( l_lasts ) { + l_node_client->state = NODE_CLIENT_STATE_CONNECTED; + dap_stream_ch_chain_sync_request_t l_request = { { 0 } }; + //dap_hash_fast(l_lasts[0], l_chain->callback_atom_get_size(l_lasts[0]), &l_request.hash_from); + dap_stream_ch_chain_pkt_write(l_ch_chain, + DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, l_net->pub.id, l_chain->id, + l_net->pub.cell_id, &l_request, sizeof(l_request)); + // + // dap_chain_node_client_send_ch_pkt(l_node_client,l_ch_id, + // DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, + // &l_request,sizeof (l_request) ); + + // wait for finishing of request + int timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms + // TODO add progress info to console + int l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms); + switch (l_res) { + case -1: + log_it(L_WARNING,"Timeout with sync of chain '%s' ", l_chain->name); + break; + case 0: + // flush global_db + dap_chain_global_db_flush(); + log_it(L_INFO, "sync of chain '%s' completed ", l_chain->name); + // set time of last sync + { + struct timespec l_to; + clock_gettime( CLOCK_MONOTONIC, &l_to); + PVT(l_net)->last_sync = l_to.tv_sec; } - - //DAP_DELETE( l_lasts ); - //} - //DAP_DELETE( l_atom_iter ); - } - + break; + default: + log_it(L_INFO, "sync of chain '%s' error %d", l_chain->name,l_res); + } + if (l_res) { + l_sync_errors++; + } + //DAP_DELETE( l_lasts ); + //} + //DAP_DELETE( l_atom_iter ); + } + dap_chain_node_client_close(l_node_client); + if (l_sync_errors) { + PVT(l_net)->state = NET_STATE_LINKS_CONNECTING; + break; } PVT(l_net)->state = NET_STATE_ONLINE; + PVT(l_net)->links_count = 0; // end sync, go to offline state - PVT(l_net)->state_target = NET_STATE_OFFLINE; + // PVT(l_net)->state_target = NET_STATE_OFFLINE; // end sync, return to online state //if(PVT(l_net)->state_target > NET_STATE_ONLINE) // PVT(l_net)->state_target = NET_STATE_ONLINE; } - pthread_mutex_unlock(&PVT(l_net)->state_mutex); - goto lb_proc_state; + break; case NET_STATE_ONLINE: { //log_it(L_NOTICE, "State online"); @@ -763,8 +745,7 @@ lb_proc_state: case NET_STATE_OFFLINE: PVT(l_net)->state = NET_STATE_OFFLINE; log_it(L_NOTICE, "Going to disconnet"); - pthread_mutex_unlock(&PVT(l_net)->state_mutex); - goto lb_proc_state; + break; case NET_STATE_ONLINE: // if flag set then go to SYNC_GDB if(PVT(l_net)->flags & F_DAP_CHAIN_NET_GO_SYNC) @@ -776,14 +757,12 @@ lb_proc_state: // if flag set then go to SYNC_GDB if(PVT(l_net)->flags & F_DAP_CHAIN_NET_GO_SYNC) PVT(l_net)->flags &= ~F_DAP_CHAIN_NET_GO_SYNC; - - PVT(l_net)->state = NET_STATE_SYNC_GDB; - pthread_mutex_unlock(&PVT(l_net)->state_mutex); - goto lb_proc_state; - + PVT(l_net)->state = NET_STATE_LINKS_CONNECTING; + break; + default: break; } } - break; + break; default: log_it (L_DEBUG, "Unprocessed state"); } pthread_mutex_unlock(&PVT(l_net)->state_mutex );