diff --git a/lib/ll_queue.h b/lib/ll_queue.h index 882ce6a..d6037b1 100644 --- a/lib/ll_queue.h +++ b/lib/ll_queue.h @@ -336,7 +336,7 @@ int queue_remove_data(struct ll_queue* q, struct ll_entry* entry); * @return количество байт */ static inline size_t queue_total_bytes(struct ll_queue* q) { - return q ? q->total_bytes : 0; + return q->total_bytes; } #endif // LL_QUEUE_H diff --git a/src/etcp.c b/src/etcp.c index 0de3791..51b75e6 100644 --- a/src/etcp.c +++ b/src/etcp.c @@ -448,7 +448,8 @@ static void input_queue_try_push(struct ETCP_CONN* etcp) {// пробуем пр size_t wait_ack_bytes = queue_total_bytes(etcp->input_wait_ack); if (wait_ack_bytes <= etcp->optimal_inflight) { DEBUG_TRACE(DEBUG_CATEGORY_ETCP, "[%s] resume input queue: inflight_bytes=%d, input_len=%d", etcp->log_name, wait_ack_bytes, etcp->input_queue->total_bytes); - queue_resume_callback(etcp->input_queue);// и только когда больше нечего отправлять - забираем новый пакет + if (etcp->input_queue->count > 0) input_queue_cb(etcp->input_queue, etcp); + else queue_resume_callback(etcp->input_queue);// и только когда больше нечего отправлять - забираем новый пакет } } diff --git a/tools/etcpmon/etcpmon_gui.c b/tools/etcpmon/etcpmon_gui.c index ba81a0f..323261f 100644 --- a/tools/etcpmon/etcpmon_gui.c +++ b/tools/etcpmon/etcpmon_gui.c @@ -19,7 +19,7 @@ //#pragma comment(lib, "comctl32.lib") //#pragma comment(lib, "user32.lib") //#pragma comment(lib, "gdi32.lib") -#define WINDOW_WIDTH 900 +#define WINDOW_WIDTH 1000 #define WINDOW_HEIGHT 1250 #define UPDATE_INTERVAL 10 /* 50ms → 20 samples per second */ /* Global app pointer for callbacks */ @@ -144,8 +144,8 @@ HWND etcpmon_gui_create_window(struct etcpmon_app* app) { } /* Set default values */ - SetDlgItemTextA(app->hWndMain, IDC_EDIT_ADDR, "127.0.0.1"); - SetDlgItemTextA(app->hWndMain, IDC_EDIT_PORT, "9090"); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_ADDR, "192.168.40.1"); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_PORT, "9091"); UpdateUIState(app); OnConnect(app); @@ -159,7 +159,7 @@ static void CreateControls(struct etcpmon_app* app) { /* Connection group */ CreateWindowExA(0, "BUTTON", "Connection", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, - x, y, 880, 60, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + x, y, WINDOW_WIDTH - 20, 60, hWnd, (HMENU)IDC_STATIC, hInst, NULL); /* Address label and edit */ CreateWindowExA(0, "STATIC", "Server:", @@ -253,7 +253,7 @@ static void CreateControls(struct etcpmon_app* app) { y = 485; CreateWindowExA(0, "BUTTON", "ETCP Metrics", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, - x, y, 430, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + x, y, (WINDOW_WIDTH - 40) / 2, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); int mx = x + 10, my = y + 20; @@ -323,10 +323,11 @@ static void CreateControls(struct etcpmon_app* app) { mx + 85, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_LINKS, hInst, NULL); /* TUN/Routing Metrics group - right of ETCP Metrics */ - x = 460; y = 485; + int group_w = (WINDOW_WIDTH - 40) / 2; + x = 10 + group_w + 20; y = 485; CreateWindowExA(0, "BUTTON", "TUN/Routing Metrics", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, - x, y, 430, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); + x, y, group_w, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); mx = x + 10; my = y + 20; @@ -441,13 +442,13 @@ static void CreateControls(struct etcpmon_app* app) { app->hListLinks = CreateWindowExA(WS_EX_CLIENTEDGE, "LISTBOX", "", WS_CHILD | WS_VISIBLE | LBS_NOTIFY | WS_VSCROLL | LBS_NOINTEGRALHEIGHT, - 10, y + 20, 880, 160, hWnd, (HMENU)IDC_LIST_LINKS, hInst, NULL); + 10, y + 20, WINDOW_WIDTH - 20, 160, hWnd, (HMENU)IDC_LIST_LINKS, hInst, NULL); /* Queues & Errors group - below Links */ y = 915; CreateWindowExA(0, "BUTTON", "Queues & Errors", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, - 10, y, 880, 335, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL); + 10, y, WINDOW_WIDTH - 20, 335, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL); int qy = y + 22; int q_col1 = 20; @@ -481,6 +482,9 @@ static void CreateControls(struct etcpmon_app* app) { app->hEditQWaitAckPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, q_col3 + 135, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_Q_WAIT_ACK_PKTS, hInst, NULL); + app->hEditQWaitAckOptInfl = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", + WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, + q_col3 + 190, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_WAITACK_OPT_INFL, hInst, NULL); /* Queue metrics - row 2 */ qy += 28; @@ -548,9 +552,6 @@ static void CreateControls(struct etcpmon_app* app) { 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); - app->hEditWaitAckOptInfl = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", - WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, - q_col1 + 260, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_WAITACK_OPT_INFL, hInst, NULL); /* ID metrics - row 4 */ // qy += 30; @@ -984,6 +985,7 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app, UpdateEditIfChanged(hMain, IDC_EDIT_Q_IN_SEND_PKTS, "%u", metrics->etcp.input_send_q_packets); UpdateEditIfChanged(hMain, IDC_EDIT_Q_WAIT_ACK_BYTES, "%u", metrics->etcp.input_wait_ack_bytes); UpdateEditIfChanged(hMain, IDC_EDIT_Q_WAIT_ACK_PKTS, "%u", metrics->etcp.input_wait_ack_packets); + UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_OPT_INFL, "%u", metrics->etcp.optimal_inflight); UpdateEditIfChanged(hMain, IDC_EDIT_Q_ACK_BYTES, "%u", metrics->etcp.ack_q_bytes); UpdateEditIfChanged(hMain, IDC_EDIT_Q_ACK_PKTS, "%u", metrics->etcp.ack_q_packets); UpdateEditIfChanged(hMain, IDC_EDIT_Q_RECV_BYTES, "%u", metrics->etcp.recv_q_bytes); @@ -1004,7 +1006,6 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app, 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"); - UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_OPT_INFL, "%u", metrics->etcp.optimal_inflight); /* ID Metrics */ UpdateEditIfChanged(hMain, IDC_EDIT_ID_NEXT_TX, "%u", metrics->etcp.next_tx_id); @@ -1125,6 +1126,7 @@ void etcpmon_gui_clear_metrics(struct etcpmon_app* app) { SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_IN_SEND_PKTS, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_WAIT_ACK_BYTES, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_WAIT_ACK_PKTS, ""); + SetDlgItemTextA(app->hWndMain, IDC_EDIT_WAITACK_OPT_INFL, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_ACK_BYTES, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_ACK_PKTS, ""); SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_RECV_BYTES, ""); diff --git a/tools/etcpmon/etcpmon_gui.h b/tools/etcpmon/etcpmon_gui.h index d74b9d8..cc2d810 100644 --- a/tools/etcpmon/etcpmon_gui.h +++ b/tools/etcpmon/etcpmon_gui.h @@ -231,6 +231,7 @@ struct etcpmon_app { HWND hEditQInSendPkts; HWND hEditQWaitAckBytes; HWND hEditQWaitAckPkts; + HWND hEditQWaitAckOptInfl; HWND hEditQAckBytes; HWND hEditQAckPkts; HWND hEditQRecvBytes; @@ -251,7 +252,6 @@ struct etcpmon_app { HWND hEditWaitAckSuspend; HWND hEditWaitAckCb; HWND hEditWaitAckTimer; - HWND hEditWaitAckOptInfl; /* ID metrics */ HWND hEditIdNextTx;