From 5cfa34630a43592f9fb1b2892da9f2ea77adf2df Mon Sep 17 00:00:00 2001 From: "roman.khlopkov" <roman.khlopkov@demlabs.net> Date: Fri, 29 Mar 2024 11:45:21 +0300 Subject: [PATCH] [*] Net accounting protocol changes --- .../chain-net/dap_stream_ch_chain_net.c | 40 ++++++++++++------- .../include/dap_stream_ch_chain_net_pkt.h | 15 +++---- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/modules/channel/chain-net/dap_stream_ch_chain_net.c b/modules/channel/chain-net/dap_stream_ch_chain_net.c index 59c936263d..44b1a49682 100644 --- a/modules/channel/chain-net/dap_stream_ch_chain_net.c +++ b/modules/channel/chain-net/dap_stream_ch_chain_net.c @@ -132,11 +132,6 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) l_ch_pkt->hdr.data_size, l_ch_chain_net_pkt->hdr.data_size + sizeof(dap_stream_ch_chain_net_pkt_t)); return; } - if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR) { - char *l_err_str = (char *)l_ch_chain_net_pkt->data; - log_it(L_WARNING, "Stream channel N for network communication got error on other side: %s", l_err_str); - return; - } dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain_net_pkt->hdr.net_id); if (!l_net) { log_it(L_ERROR, "Invalid net id in packet"); @@ -145,6 +140,15 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str)); return; } + if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR) { + char *l_err_str = (char *)l_ch_chain_net_pkt->data; + log_it(L_WARNING, "Stream channel N for network communication got error on other side: %s", l_err_str); + if (a_ch->stream->authorized) { + assert(!dap_stream_node_addr_is_blank(&a_ch->stream->node)); + dap_link_manager_accounting_link_in_net(l_net->pub.id.uint64, &a_ch->stream->node, false); + } + return; + } uint16_t l_acl_idx = dap_chain_net_get_acl_idx(l_net); uint8_t l_acl = a_ch->stream->session->acl ? a_ch->stream->session->acl[l_acl_idx] : 1; if (!l_acl) { @@ -155,23 +159,31 @@ void s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void* a_arg) l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str)); return; } - /*if (dap_chain_net_get_state(l_net) == NET_STATE_OFFLINE) { - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, - l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, - "ERROR_NET_IS_OFFLINE"); - a_ch->stream->esocket->flags |= DAP_SOCK_SIGNAL_CLOSE; + if (dap_chain_net_get_state(l_net) == NET_STATE_OFFLINE) { + char l_err_str[] = "ERROR_NET_IS_OFFLINE"; + dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR, + l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str)); return; - }*/ + } switch (l_ch_pkt->hdr.type) { + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE: + case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE_ACK: if (!a_ch->stream->authorized) { log_it(L_WARNING, "Trying to announce net from not authorized stream"); - break; + char l_err_str[] = "ERROR_STREAM_NOT_AUTHORIZED"; + dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR , + l_ch_chain_net_pkt->hdr.net_id, l_err_str, sizeof(l_err_str)); + return; } assert(!dap_stream_node_addr_is_blank(&a_ch->stream->node)); - dap_accounting_downlink_in_net(l_net->pub.id.uint64, &a_ch->stream->node); + dap_link_manager_accounting_link_in_net(l_net->pub.id.uint64, &a_ch->stream->node, true); + if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE) + dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE_ACK, + l_ch_chain_net_pkt->hdr.net_id, NULL, 0); break; - // received ping request - > send pong request + + // received ping request - > send pong request case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING: //log_it(L_INFO, "Get CHAIN_CH_NET_PKT_TYPE_PING"); dap_stream_ch_chain_net_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG, diff --git a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h index 4186c1c556..724d216f48 100644 --- a/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h +++ b/modules/channel/chain-net/include/dap_stream_ch_chain_net_pkt.h @@ -32,17 +32,18 @@ #define DAP_STREAM_CH_CHAIN_NET_PKT_VERSION 1 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_TEST 0x01 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_TEST 0x01 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING 0x02 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG 0x03 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PING 0x02 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_PONG 0x03 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST 0x30 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY 0x31 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY_REQUEST 0x30 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_VALIDATOR_READY 0x31 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE 0x44 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE 0x44 +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ANNOUNCE_ACK 0x45 -#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR 0xff +#define DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR 0xff typedef struct stream_ch_chain_net_pkt_hdr { uint8_t version; -- GitLab