From 220d23daf794f365b08548fb6df1f47a733bc84a Mon Sep 17 00:00:00 2001 From: jeka Date: Sat, 7 Mar 2026 22:44:19 +0300 Subject: [PATCH] 1 --- src/control_server.c | 5 ++++ src/etcp.h | 2 +- src/etcp_connections.c | 3 +++ tools/etcpmon/etcpmon_gui.c | 43 ++++++++++++++++++++++++-------- tools/etcpmon/etcpmon_gui.h | 10 ++++++++ tools/etcpmon/etcpmon_protocol.h | 7 +++++- 6 files changed, 58 insertions(+), 12 deletions(-) diff --git a/src/control_server.c b/src/control_server.c index 8ebc718..b8896c5 100644 --- a/src/control_server.c +++ b/src/control_server.c @@ -760,6 +760,11 @@ static void send_metrics(struct control_server* server, struct control_client* c rsp->etcp.last_delivered_id = conn->last_delivered_id; rsp->etcp.rx_ack_till = conn->rx_ack_till; + /* input_wait_ack queue state */ + rsp->etcp.wait_ack_cb_suspended = (uint8_t)conn->input_wait_ack->callback_suspended; + rsp->etcp.wait_ack_cb_set = (conn->input_wait_ack->callback != NULL) ? 1 : 0; + rsp->etcp.wait_ack_resume_timeout = (conn->input_wait_ack->resume_timeout_id != NULL) ? 1 : 0; + /* Fill TUN metrics */ if (instance->tun) { rsp->tun.bytes_read = instance->tun->bytes_read; diff --git a/src/etcp.h b/src/etcp.h index 7a520a0..80dfe18 100644 --- a/src/etcp.h +++ b/src/etcp.h @@ -90,7 +90,7 @@ struct ETCP_CONN { struct ll_queue* input_wait_ack; // очередь ожидающих подтверждение (inflight_pool -> struct INFLIGHT_PACKET) struct ll_queue* ack_q; // неотправленные подтверждения приема пакетов (instance.ack_pool -> struct ACK_PACKET) - struct ll_queue* recv_q; // очередь на сборку (rx_pool -> struct ETCP_FRAGMENT) + struct ll_queue* recv_q; // очередь на сборку фрагментированных пакетов(rx_pool -> struct ETCP_FRAGMENT) void (*link_ready_for_send_fn)(struct ETCP_CONN*);// функцию которую должен вызвать драйвер линка при готовности линка принимать данные diff --git a/src/etcp_connections.c b/src/etcp_connections.c index 3c789c4..d46b98d 100644 --- a/src/etcp_connections.c +++ b/src/etcp_connections.c @@ -1011,6 +1011,9 @@ process_decrypted: link->etcp->log_name, link, link->local_link_id); } + // Count decrypted bytes + link->total_decrypted += pkt->data_len; + // Count received keepalive packets (empty packets with no payload) if (pkt->data_len == 0) { link->keepalive_recv_count++; diff --git a/tools/etcpmon/etcpmon_gui.c b/tools/etcpmon/etcpmon_gui.c index 355cffe..587b9f0 100644 --- a/tools/etcpmon/etcpmon_gui.c +++ b/tools/etcpmon/etcpmon_gui.c @@ -255,7 +255,7 @@ static void CreateControls(struct etcpmon_app* app) { y = 485; CreateWindowExA(0, "BUTTON", "ETCP Metrics", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, - x, y, 430, 180, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + x, y, 430, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); int mx = x + 10, my = y + 20; @@ -328,7 +328,7 @@ static void CreateControls(struct etcpmon_app* app) { x = 460; y = 485; CreateWindowExA(0, "BUTTON", "TUN/Routing Metrics", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, - x, y, 430, 180, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + x, y, 430, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); mx = x + 10; my = y + 20; @@ -423,7 +423,7 @@ static void CreateControls(struct etcpmon_app* app) { mx + 260, my - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_RT_LEARNED, hInst, NULL); /* Links list */ - y = 715; + y = 725; CreateWindowExA(0, "STATIC", "Links:", WS_CHILD | WS_VISIBLE, 10, y, 100, 20, hWnd, (HMENU)IDC_STATIC, hInst, NULL); @@ -433,7 +433,7 @@ static void CreateControls(struct etcpmon_app* app) { 10, y + 20, 880, 160, hWnd, (HMENU)IDC_LIST_LINKS, hInst, NULL); /* Queues & Errors group - below Links */ - y = 905; + y = 915; CreateWindowExA(0, "BUTTON", "Queues & Errors", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, y, 880, 165, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL); @@ -524,22 +524,36 @@ static void CreateControls(struct etcpmon_app* app) { WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, q_col2 + 110, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_TIMER_ACK_RESP, hInst, NULL); - /* ID metrics - row 4 */ + /* WaitAck queue state */ qy += 30; + CreateWindowExA(0, "STATIC", "WaitAck:", + WS_CHILD | WS_VISIBLE, q_col1, qy, 60, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + app->hEditWaitAckSuspend = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", + WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, + q_col1 + 65, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_WAITACK_SUSP, hInst, NULL); + app->hEditWaitAckCb = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", + WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, + q_col1 + 130, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_WAITACK_CB, hInst, NULL); + app->hEditWaitAckTimer = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", + WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, + q_col1 + 195, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_WAITACK_TIMER, hInst, NULL); + + /* ID metrics - row 4 */ +// qy += 30; CreateWindowExA(0, "STATIC", "IDs:", - WS_CHILD | WS_VISIBLE, q_col1, qy, 30, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + WS_CHILD | WS_VISIBLE, q_col2, qy, 30, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); app->hEditIdNextTx = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, - q_col1 + 35, qy - 2, 65, 18, hWnd, (HMENU)IDC_EDIT_ID_NEXT_TX, hInst, NULL); + q_col2 + 35, qy - 2, 65, 18, hWnd, (HMENU)IDC_EDIT_ID_NEXT_TX, hInst, NULL); app->hEditIdLastRx = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, - q_col1 + 105, qy - 2, 65, 18, hWnd, (HMENU)IDC_EDIT_ID_LAST_RX, hInst, NULL); + q_col2 + 105, qy - 2, 65, 18, hWnd, (HMENU)IDC_EDIT_ID_LAST_RX, hInst, NULL); app->hEditIdLastDel = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, - q_col1 + 175, qy - 2, 65, 18, hWnd, (HMENU)IDC_EDIT_ID_LAST_DEL, hInst, NULL); + q_col2 + 175, qy - 2, 65, 18, hWnd, (HMENU)IDC_EDIT_ID_LAST_DEL, hInst, NULL); app->hEditIdRxAckTill = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, - q_col1 + 245, qy - 2, 65, 18, hWnd, (HMENU)IDC_EDIT_ID_RX_ACK_TILL, hInst, NULL); + q_col2 + 245, qy - 2, 65, 18, hWnd, (HMENU)IDC_EDIT_ID_RX_ACK_TILL, hInst, NULL); } static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { struct etcpmon_app* app = NULL; @@ -851,6 +865,11 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app, UpdateEditIfChanged(hMain, IDC_EDIT_TIMER_RETRANS, "%s", metrics->etcp.retrans_timer_active ? "ON" : "OFF"); UpdateEditIfChanged(hMain, IDC_EDIT_TIMER_ACK_RESP, "%s", metrics->etcp.ack_resp_timer_active ? "ON" : "OFF"); + /* WaitAck queue state */ + UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_SUSP, "%s", metrics->etcp.wait_ack_cb_suspended ? "ON" : "OFF"); + UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_CB, "%s", metrics->etcp.wait_ack_cb_set ? "ON" : "OFF"); + UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_TIMER, "%s", metrics->etcp.wait_ack_resume_timeout ? "ON" : "OFF"); + /* ID Metrics */ UpdateEditIfChanged(hMain, IDC_EDIT_ID_NEXT_TX, "%u", metrics->etcp.next_tx_id); UpdateEditIfChanged(hMain, IDC_EDIT_ID_LAST_RX, "%u", metrics->etcp.last_rx_id); @@ -950,6 +969,10 @@ void etcpmon_gui_clear_metrics(struct etcpmon_app* app) { SetDlgItemTextA(app->hWndMain, IDC_EDIT_TIMER_RETRANS, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_TIMER_ACK_RESP, ""); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_WAITACK_SUSP, ""); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_WAITACK_CB, ""); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_WAITACK_TIMER, ""); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_ID_NEXT_TX, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ID_LAST_RX, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ID_LAST_DEL, ""); diff --git a/tools/etcpmon/etcpmon_gui.h b/tools/etcpmon/etcpmon_gui.h index 3fa0caa..a5973c6 100644 --- a/tools/etcpmon/etcpmon_gui.h +++ b/tools/etcpmon/etcpmon_gui.h @@ -97,6 +97,11 @@ extern "C" { #define IDC_EDIT_TIMER_RETRANS 631 #define IDC_EDIT_TIMER_ACK_RESP 632 +/* WaitAck queue state IDs */ +#define IDC_EDIT_WAITACK_SUSP 650 +#define IDC_EDIT_WAITACK_CB 651 +#define IDC_EDIT_WAITACK_TIMER 652 + /* ID Metrics control IDs */ #define IDC_STATIC_IDS 640 #define IDC_EDIT_ID_NEXT_TX 641 @@ -205,6 +210,11 @@ struct etcpmon_app { HWND hEditTimerRetrans; HWND hEditTimerAckResp; + /* WaitAck queue state */ + HWND hEditWaitAckSuspend; + HWND hEditWaitAckCb; + HWND hEditWaitAckTimer; + /* ID metrics */ HWND hEditIdNextTx; HWND hEditIdLastRx; diff --git a/tools/etcpmon/etcpmon_protocol.h b/tools/etcpmon/etcpmon_protocol.h index c71a141..3636b9f 100644 --- a/tools/etcpmon/etcpmon_protocol.h +++ b/tools/etcpmon/etcpmon_protocol.h @@ -129,7 +129,12 @@ struct etcpmon_etcp_metrics { /* Timer flags (1 = active, 0 = NULL) */ uint8_t retrans_timer_active; uint8_t ack_resp_timer_active; - + + /* input_wait_ack queue state */ + uint8_t wait_ack_cb_suspended; + uint8_t wait_ack_cb_set; + uint8_t wait_ack_resume_timeout; + /* Connection IDs */ uint32_t next_tx_id; uint32_t last_rx_id;