From 2e3eb0976a4c5da10f0c19b3e18f5132ebee42a0 Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 22 Apr 2026 16:28:33 +0300 Subject: [PATCH] Add RX/TX dup counters to ETCP monitor GUI - Add IDC_EDIT_ETCP_RX_DUP and IDC_EDIT_ETCP_TX_DUP controls - Insert RX Dup / TX Dup fields after Retrans in ETCP Metrics group - Update tooltips, metrics display and clear functions --- tools/etcpmon/etcpmon_gui.c | 25 +++++++++++++++++++++++-- tools/etcpmon/etcpmon_gui.h | 4 ++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/tools/etcpmon/etcpmon_gui.c b/tools/etcpmon/etcpmon_gui.c index 4f1da4d7..b128a730 100644 --- a/tools/etcpmon/etcpmon_gui.c +++ b/tools/etcpmon/etcpmon_gui.c @@ -315,19 +315,32 @@ static void CreateControls(struct etcpmon_app* app) { WS_CHILD | WS_VISIBLE | ES_READONLY, mx + 285, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_RETRANS, hInst, NULL); + my += 25; + CreateWindowExA(0, "STATIC", "RX Dup:", + WS_CHILD | WS_VISIBLE, mx, my, 80, 20, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + app->hEditEtcpRxDup = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", + WS_CHILD | WS_VISIBLE | ES_READONLY, + mx + 85, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_RX_DUP, hInst, NULL); + + CreateWindowExA(0, "STATIC", "TX Dup:", + WS_CHILD | WS_VISIBLE, mx + 200, my, 80, 20, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + app->hEditEtcpTxDup = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", + WS_CHILD | WS_VISIBLE | ES_READONLY, + mx + 285, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_TX_DUP, hInst, NULL); + my += 25; CreateWindowExA(0, "STATIC", "ACKs:", WS_CHILD | WS_VISIBLE, mx, my, 80, 20, hWnd, (HMENU)IDC_STATIC, hInst, NULL); app->hEditEtcpAcks = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY, mx + 85, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_ACKS, hInst, NULL); - + CreateWindowExA(0, "STATIC", "Inflight:", WS_CHILD | WS_VISIBLE, mx + 200, my, 80, 20, hWnd, (HMENU)IDC_STATIC, hInst, NULL); app->hEditEtcpInflight = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY, mx + 285, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_INFLIGHT, hInst, NULL); - + my += 25; CreateWindowExA(0, "STATIC", "Links:", WS_CHILD | WS_VISIBLE, mx, my, 80, 20, hWnd, (HMENU)IDC_STATIC, hInst, NULL); @@ -738,6 +751,10 @@ static void CreateTooltips(struct etcpmon_app* app) "etcp.bytes_sent_total / ETCP Connection\r\nTotal bytes sent since connection start"); AddTooltip(app->hToolTip, app->hEditEtcpRetrans, "etcp.retrans_count / ETCP Connection\r\nNumber of retransmissions (resent packets)"); + AddTooltip(app->hToolTip, app->hEditEtcpRxDup, + "etcp.rx_dup_count / ETCP Connection\r\nLocal received duplicate packets counter"); + AddTooltip(app->hToolTip, app->hEditEtcpTxDup, + "etcp.tx_dup_count / ETCP Connection\r\nRemote duplicate packets counter (from ACK)"); AddTooltip(app->hToolTip, app->hEditEtcpAcks, "etcp.ack_count / ETCP Connection\r\nNumber of received ACK packets (confirmations)"); AddTooltip(app->hToolTip, app->hEditEtcpInflight, @@ -1226,6 +1243,8 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app, UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_JITTER, "%.1f ms", metrics->etcp.jitter/10.f); UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_BYTES_SENT, "%llu", (unsigned long long)metrics->etcp.bytes_sent_total); UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_RETRANS, "%u", metrics->etcp.retrans_count); + UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_RX_DUP, "%u", metrics->etcp.rx_dup_count); + UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_TX_DUP, "%u", metrics->etcp.tx_dup_count); UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_ACKS, "%u", metrics->etcp.ack_count); UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_INFLIGHT, "%u bytes", metrics->etcp.unacked_bytes); UpdateEditIfChanged(hMain, IDC_EDIT_ETCP_LINKS, "%u", metrics->etcp.links_count); @@ -1373,6 +1392,8 @@ void etcpmon_gui_clear_metrics(struct etcpmon_app* app) { SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_JITTER, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_BYTES_SENT, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_RETRANS, ""); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_RX_DUP, ""); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_TX_DUP, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_ACKS, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_INFLIGHT, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_ETCP_LINKS, ""); diff --git a/tools/etcpmon/etcpmon_gui.h b/tools/etcpmon/etcpmon_gui.h index 3f7dc6b7..f7e55acf 100644 --- a/tools/etcpmon/etcpmon_gui.h +++ b/tools/etcpmon/etcpmon_gui.h @@ -52,6 +52,8 @@ extern "C" { #define IDC_EDIT_ETCP_ACKS 207 #define IDC_EDIT_ETCP_INFLIGHT 208 #define IDC_EDIT_ETCP_LINKS 209 +#define IDC_EDIT_ETCP_RX_DUP 210 +#define IDC_EDIT_ETCP_TX_DUP 211 /* TUN Metrics control IDs */ #define IDC_EDIT_TUN_READ_BYTES 300 @@ -204,6 +206,8 @@ struct etcpmon_app { HWND hEditEtcpJitter; HWND hEditEtcpBytesSent; HWND hEditEtcpRetrans; + HWND hEditEtcpRxDup; + HWND hEditEtcpTxDup; HWND hEditEtcpAcks; HWND hEditEtcpInflight; HWND hEditEtcpLinks;