|
|
|
|
@ -20,7 +20,7 @@
|
|
|
|
|
//#pragma comment(lib, "user32.lib")
|
|
|
|
|
//#pragma comment(lib, "gdi32.lib")
|
|
|
|
|
#define WINDOW_WIDTH 1000 |
|
|
|
|
#define WINDOW_HEIGHT 1300 |
|
|
|
|
#define WINDOW_HEIGHT 1440 |
|
|
|
|
#define WINDOW_CLIENT_W 1250 |
|
|
|
|
#define UPDATE_INTERVAL 10 /* 50ms → 20 samples per second */ |
|
|
|
|
/* Global app pointer for callbacks */ |
|
|
|
|
@ -750,11 +750,57 @@ static void CreateControls(struct etcpmon_app* app) {
|
|
|
|
|
q_col1 + 85 + i * 65, qy - 2, 60, 18, hWnd, (HMENU)((UINT_PTR)(IDC_EDIT_DEBUG_0 + i)), hInst, NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================
|
|
|
|
|
* Router Congestion group — below Queues & Errors |
|
|
|
|
* ======================================================================== */ |
|
|
|
|
{ |
|
|
|
|
int ry = 1260; |
|
|
|
|
int r_col1 = 20, r_col2 = 260, r_col3 = 500, r_col4 = 740; |
|
|
|
|
int lw = 85, ew = 70; /* label width, edit width */ |
|
|
|
|
CreateWindowExA(0, "BUTTON", "Router Congestion", |
|
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
|
10, ry, WINDOW_WIDTH - 20, 140, hWnd, (HMENU)IDC_GB_ROUTER, hInst, NULL); |
|
|
|
|
/* Row 1 */ |
|
|
|
|
int ry1 = ry + 22; |
|
|
|
|
CreateWindowExA(0, "STATIC", "Conns:", WS_CHILD | WS_VISIBLE, r_col1, ry1, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrConns = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col1 + 55, ry1 - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_RTR_CONNS, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "Inflight:", WS_CHILD | WS_VISIBLE, r_col2, ry1, 55, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrInflight = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col2 + 60, ry1 - 2, 70, 18, hWnd, (HMENU)IDC_EDIT_RTR_INFLIGHT, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "SendQ:", WS_CHILD | WS_VISIBLE, r_col3, ry1, 55, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrSendQ = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col3 + 55, ry1 - 2, 70, 18, hWnd, (HMENU)IDC_EDIT_RTR_SENDQ, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "RecvQ:", WS_CHILD | WS_VISIBLE, r_col4, ry1, 55, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrRecvQ = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col4 + 55, ry1 - 2, 70, 18, hWnd, (HMENU)IDC_EDIT_RTR_RECVQ, hInst, NULL); |
|
|
|
|
/* Row 2 */ |
|
|
|
|
int ry2 = ry + 47; |
|
|
|
|
CreateWindowExA(0, "STATIC", "Pkts Sent:", WS_CHILD | WS_VISIBLE, r_col1, ry2, lw, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrPktsSent = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col1 + lw, ry2 - 2, ew, 18, hWnd, (HMENU)IDC_EDIT_RTR_PKTS_SENT, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "Send Err:", WS_CHILD | WS_VISIBLE, r_col2, ry2, lw, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrSendErr = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col2 + lw, ry2 - 2, ew, 18, hWnd, (HMENU)IDC_EDIT_RTR_SEND_ERR, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "Pkts Rcvd:", WS_CHILD | WS_VISIBLE, r_col3, ry2, lw, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrPktsRcvd = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col3 + lw, ry2 - 2, ew, 18, hWnd, (HMENU)IDC_EDIT_RTR_PKTS_RCVD, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "SignFail:", WS_CHILD | WS_VISIBLE, r_col4, ry2, lw, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrSignFail = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col4 + lw, ry2 - 2, ew, 18, hWnd, (HMENU)IDC_EDIT_RTR_SIGN_FAIL, hInst, NULL); |
|
|
|
|
/* Row 3 */ |
|
|
|
|
int ry3 = ry + 72; |
|
|
|
|
CreateWindowExA(0, "STATIC", "ACK Sent:", WS_CHILD | WS_VISIBLE, r_col1, ry3, lw, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrAckSent = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col1 + lw, ry3 - 2, ew, 18, hWnd, (HMENU)IDC_EDIT_RTR_ACK_SENT, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "ACK Rcvd:", WS_CHILD | WS_VISIBLE, r_col2, ry3, lw, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrAckRecv = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col2 + lw, ry3 - 2, ew, 18, hWnd, (HMENU)IDC_EDIT_RTR_ACK_RECV, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "Stale ACK:", WS_CHILD | WS_VISIBLE, r_col3, ry3, lw, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrStaleAck = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col3 + lw, ry3 - 2, ew, 18, hWnd, (HMENU)IDC_EDIT_RTR_STALE_ACK, hInst, NULL); |
|
|
|
|
/* Row 4 */ |
|
|
|
|
int ry4 = ry + 97; |
|
|
|
|
CreateWindowExA(0, "STATIC", "Dup Drop:", WS_CHILD | WS_VISIBLE, r_col1, ry4, lw, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrDupDrop = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col1 + lw, ry4 - 2, ew, 18, hWnd, (HMENU)IDC_EDIT_RTR_DUP_DROP, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "OOB Drop:", WS_CHILD | WS_VISIBLE, r_col2, ry4, lw, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditRtrOobDrop = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, r_col2 + lw, ry4 - 2, ew, 18, hWnd, (HMENU)IDC_EDIT_RTR_OOB_DROP, hInst, NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* ========================================================================
|
|
|
|
|
* Debug Levels section — right column |
|
|
|
|
* ======================================================================== */ |
|
|
|
|
{ |
|
|
|
|
int dy = 485; |
|
|
|
|
int dy = 645; |
|
|
|
|
app->hDebugGroupBox = CreateWindowExA(0, "BUTTON", "Debug Levels", |
|
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
|
1005, dy, 240, 545, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
@ -1586,6 +1632,21 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app,
|
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RT_BGP_SENDERS, "%u", metrics->tun.rt_bgp_senders); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RT_BGP_NODES, "%u", metrics->tun.rt_bgp_nodes); |
|
|
|
|
|
|
|
|
|
/* Router Congestion Metrics */ |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_CONNS, "%u", metrics->router.total_conns); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_INFLIGHT, "%u", metrics->router.total_inflight); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_SENDQ, "%u", metrics->router.total_send_q); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_RECVQ, "%u", metrics->router.total_recv_q); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_PKTS_SENT, "%u", metrics->router.pkts_sent); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_SEND_ERR, "%u", metrics->router.pkts_send_err); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_PKTS_RCVD, "%u", metrics->router.pkts_rcvd); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_ACK_SENT, "%u", metrics->router.ack_sent); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_ACK_RECV, "%u", metrics->router.ack_recv); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_DUP_DROP, "%u", metrics->router.dup_dropped); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_OOB_DROP, "%u", metrics->router.oob_dropped); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_STALE_ACK, "%u", metrics->router.stale_ack); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_RTR_SIGN_FAIL, "%u", metrics->router.sign_fail); |
|
|
|
|
|
|
|
|
|
/* Queue Metrics */ |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_IN_Q_BYTES, "%u", metrics->etcp.input_queue_bytes); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_IN_Q_PKTS, "%u", metrics->etcp.input_queue_packets); |
|
|
|
|
@ -1757,6 +1818,20 @@ void etcpmon_gui_clear_metrics(struct etcpmon_app* app) {
|
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RT_BGP_SENDERS, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RT_BGP_NODES, ""); |
|
|
|
|
|
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_CONNS, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_INFLIGHT, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_SENDQ, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_RECVQ, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_PKTS_SENT, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_SEND_ERR, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_PKTS_RCVD, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_ACK_SENT, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_ACK_RECV, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_DUP_DROP, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_OOB_DROP, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_STALE_ACK, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_RTR_SIGN_FAIL, ""); |
|
|
|
|
|
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_IN_Q_BYTES, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_IN_Q_PKTS, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_IN_SEND_BYTES, ""); |
|
|
|
|
|