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