Browse Source

add metrics to monitor

nodeinfo-routing-update
jeka 4 weeks ago
parent
commit
b1c8ba7e90
  1. 8
      src/control_server.c
  2. 2
      src/etcp.h
  3. 11
      src/etcp_connections.c
  4. 2
      src/etcp_connections.h
  5. 183
      tools/etcpmon/etcpmon_gui.c
  6. 60
      tools/etcpmon/etcpmon_gui.h
  7. 10
      tools/etcpmon/etcpmon_protocol.h

8
src/control_server.c

@ -753,6 +753,12 @@ static void send_metrics(struct control_server* server, struct control_client* c
rsp->etcp.retrans_timer_active = (conn->retrans_timer != NULL) ? 1 : 0;
rsp->etcp.ack_resp_timer_active = (conn->ack_resp_timer != NULL) ? 1 : 0;
/* Connection IDs */
rsp->etcp.next_tx_id = conn->next_tx_id;
rsp->etcp.last_rx_id = conn->last_rx_id;
rsp->etcp.last_delivered_id = conn->last_delivered_id;
rsp->etcp.rx_ack_till = conn->rx_ack_till;
/* Fill TUN metrics */
if (instance->tun) {
rsp->tun.bytes_read = instance->tun->bytes_read;
@ -784,6 +790,8 @@ static void send_metrics(struct control_server* server, struct control_client* c
link_info[i].init_timer_active = (link->init_timer != NULL) ? 1 : 0;
link_info[i].keepalive_timer_active = (link->keepalive_timer != NULL) ? 1 : 0;
link_info[i].shaper_timer_active = (link->shaper_timer != NULL) ? 1 : 0;
link_info[i].keepalive_sent = (uint32_t)link->keepalive_sent_count;
link_info[i].keepalive_recv = (uint32_t)link->keepalive_recv_count;
link = link->next;
}

2
src/etcp.h

@ -103,7 +103,7 @@ struct ETCP_CONN {
uint32_t last_rx_id; // Last received ID
uint32_t last_delivered_id; // Last delivered to output_queue
uint32_t rx_ack_till;// из ack пакета - по какой пакет получено и собрано на уданенной стороне
uint32_t rx_ack_till;// из ack пакета - по какой пакет получено и собрано на удаленной стороне
// Metrics (RTT, jitter, etc.)
// uint16_t retrans_delay; // Not used

11
src/etcp_connections.c

@ -140,6 +140,8 @@ static void etcp_link_send_keepalive(struct ETCP_LINK* link) {
DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "[%s] Sending keepalive on link %p (local_id=%d)",
link->etcp->log_name, link, link->local_link_id);
link->keepalive_sent_count++;
etcp_encrypt_send(dgram);
u_free(dgram);
}
@ -572,6 +574,8 @@ struct ETCP_LINK* etcp_link_new(struct ETCP_CONN* etcp, struct ETCP_SOCKET* conn
link->keepalive_timeout = 2000; // Default 2 seconds
link->keepalive_interval = 200; // Default 0.2 s
}
link->keepalive_sent_count = 0;
link->keepalive_recv_count = 0;
// Выделяем свободный local_link_id
int free_id = etcp_find_free_local_link_id(etcp);
@ -1006,7 +1010,12 @@ process_decrypted:
DEBUG_INFO(DEBUG_CATEGORY_CONNECTION, "[%s] Link %p (local_id=%d) status changed to UP - packet received",
link->etcp->log_name, link, link->local_link_id);
}
// Count received keepalive packets (empty packets with no payload)
if (pkt->data_len == 0) {
link->keepalive_recv_count++;
}
// Cancel all init timers - link is alive, no need for recovery
etcp_cancel_all_init_timers(link->etcp);

2
src/etcp_connections.h

@ -111,6 +111,8 @@ struct ETCP_LINK {
void* keepalive_timer; // Таймер для отправки keepalive пакетов
uint32_t keepalive_timeout; // таймаут (ms)
uint8_t pkt_sent_since_keepalive; // Флаг: был ли отправлен пакет с последнего keepalive тика
uint32_t keepalive_sent_count; // Счётчик отправленных keepalive
uint32_t keepalive_recv_count; // Счётчик полученных keepalive
};
// INITIALIZATION (создаёт listen-сокеты и подключения из конфига)

183
tools/etcpmon/etcpmon_gui.c

@ -19,7 +19,7 @@
//#pragma comment(lib, "user32.lib")
//#pragma comment(lib, "gdi32.lib")
#define WINDOW_WIDTH 900
#define WINDOW_HEIGHT 900
#define WINDOW_HEIGHT 1080
#define UPDATE_INTERVAL 10 /* 50ms → 20 samples per second */
/* Global app pointer for callbacks */
static struct etcpmon_app* g_app = NULL;
@ -379,6 +379,115 @@ 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, 100, hWnd, (HMENU)IDC_LIST_LINKS, hInst, NULL);
/* Queues & Errors group - below Links */
y = 845;
CreateWindowExA(0, "BUTTON", "Queues & Errors",
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
10, y, 880, 165, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL);
int qy = y + 22;
int q_col1 = 20;
int q_col2 = 300;
int q_col3 = 580;
/* Queue metrics - row 1 */
CreateWindowExA(0, "STATIC", "InQ:",
WS_CHILD | WS_VISIBLE, q_col1, qy, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditQInQBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 55, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_Q_IN_Q_BYTES, hInst, NULL);
app->hEditQInQPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 120, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_Q_IN_Q_PKTS, hInst, NULL);
CreateWindowExA(0, "STATIC", "InSend:",
WS_CHILD | WS_VISIBLE, q_col2, qy, 60, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditQInSendBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col2 + 65, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_Q_IN_SEND_BYTES, hInst, NULL);
app->hEditQInSendPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col2 + 130, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_Q_IN_SEND_PKTS, hInst, NULL);
CreateWindowExA(0, "STATIC", "WaitAck:",
WS_CHILD | WS_VISIBLE, q_col3, qy, 65, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditQWaitAckBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col3 + 70, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_Q_WAIT_ACK_BYTES, hInst, NULL);
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);
/* Queue metrics - row 2 */
qy += 28;
CreateWindowExA(0, "STATIC", "AckQ:",
WS_CHILD | WS_VISIBLE, q_col1, qy, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditQAckBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 55, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_Q_ACK_BYTES, hInst, NULL);
app->hEditQAckPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 120, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_Q_ACK_PKTS, hInst, NULL);
CreateWindowExA(0, "STATIC", "RecvQ:",
WS_CHILD | WS_VISIBLE, q_col2, qy, 60, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditQRecvBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col2 + 65, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_Q_RECV_BYTES, hInst, NULL);
app->hEditQRecvPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col2 + 130, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_Q_RECV_PKTS, hInst, NULL);
CreateWindowExA(0, "STATIC", "OutQ:",
WS_CHILD | WS_VISIBLE, q_col3, qy, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditQOutBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col3 + 55, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_Q_OUT_BYTES, hInst, NULL);
app->hEditQOutPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col3 + 120, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_Q_OUT_PKTS, hInst, NULL);
/* Error counters - row 3 */
qy += 30;
CreateWindowExA(0, "STATIC", "Errors:",
WS_CHILD | WS_VISIBLE, q_col1, qy, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditErrReinit = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 55, qy - 2, 55, 18, hWnd, (HMENU)IDC_EDIT_ERR_REINIT, hInst, NULL);
app->hEditErrReset = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 115, qy - 2, 55, 18, hWnd, (HMENU)IDC_EDIT_ERR_RESET, hInst, NULL);
app->hEditErrPktFmt = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 175, qy - 2, 55, 18, hWnd, (HMENU)IDC_EDIT_ERR_PKT_FMT, hInst, NULL);
/* Timer flags - same row, to the right */
CreateWindowExA(0, "STATIC", "Timers:",
WS_CHILD | WS_VISIBLE, q_col2, qy, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditTimerRetrans = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col2 + 55, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_TIMER_RETRANS, hInst, NULL);
app->hEditTimerAckResp = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
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 */
qy += 30;
CreateWindowExA(0, "STATIC", "IDs:",
WS_CHILD | WS_VISIBLE, q_col1, 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);
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);
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);
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);
}
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
struct etcpmon_app* app = NULL;
@ -655,15 +764,47 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app,
UpdateEditIfChanged(hMain, IDC_EDIT_TUN_WRITE_PKTS, "%u", metrics->tun.packets_written);
UpdateEditIfChanged(hMain, IDC_EDIT_TUN_READ_ERRS, "%u", metrics->tun.read_errors);
UpdateEditIfChanged(hMain, IDC_EDIT_TUN_WRITE_ERRS, "%u", metrics->tun.write_errors);
/* 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);
UpdateEditIfChanged(hMain, IDC_EDIT_Q_IN_SEND_BYTES, "%u", metrics->etcp.input_send_q_bytes);
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_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);
UpdateEditIfChanged(hMain, IDC_EDIT_Q_RECV_PKTS, "%u", metrics->etcp.recv_q_packets);
UpdateEditIfChanged(hMain, IDC_EDIT_Q_OUT_BYTES, "%u", metrics->etcp.output_queue_bytes);
UpdateEditIfChanged(hMain, IDC_EDIT_Q_OUT_PKTS, "%u", metrics->etcp.output_queue_packets);
/* Error Counters */
UpdateEditIfChanged(hMain, IDC_EDIT_ERR_REINIT, "%u", metrics->etcp.reinit_count);
UpdateEditIfChanged(hMain, IDC_EDIT_ERR_RESET, "%u", metrics->etcp.reset_count);
UpdateEditIfChanged(hMain, IDC_EDIT_ERR_PKT_FMT, "%u", metrics->etcp.pkt_format_errors);
/* Timer Flags */
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");
/* 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);
UpdateEditIfChanged(hMain, IDC_EDIT_ID_LAST_DEL, "%u", metrics->etcp.last_delivered_id);
UpdateEditIfChanged(hMain, IDC_EDIT_ID_RX_ACK_TILL, "%u", metrics->etcp.rx_ack_till);
/* Links list */
if (app->hListLinks) {
SendMessage(app->hListLinks, LB_RESETCONTENT, 0, 0);
for (uint8_t i = 0; i < links_count; i++) {
char display[256];
char display[380];
snprintf(display, sizeof(display),
"Link %u: Status=%s, EncErrors=%u, DecErrors=%u, "
"SendErr=%u, RecvErr=%u, BytesEnc=%llu, BytesDec=%llu, "
"BW=%u Kbps, NATChg=%u, RTT=%u us, TT=%u us",
"Link %u: Status=%s, EncErr=%u, DecErr=%u, "
"SndErr=%u, RcvErr=%u, Enc=%llu, Dec=%llu, "
"BW=%u Kbps, NAT=%u, RTT=%u us, TT=%u us, "
"Timers: Init=%s, KA=%s, Shaper=%s, "
"KAsent=%u, KArecv=%u",
links[i].local_link_id,
links[i].status ? "UP" : "DOWN",
links[i].encrypt_errors,
@ -675,7 +816,12 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app,
links[i].bandwidth,
links[i].nat_changes_count,
links[i].rtt_last * 100,
links[i].tt_last * 100);
links[i].tt_last * 100,
links[i].init_timer_active ? "ON" : "OFF",
links[i].keepalive_timer_active ? "ON" : "OFF",
links[i].shaper_timer_active ? "ON" : "OFF",
links[i].keepalive_sent,
links[i].keepalive_recv);
SendMessageA(app->hListLinks, LB_ADDSTRING, 0, (LPARAM)display);
}
InvalidateRect(app->hListLinks, NULL, FALSE);
@ -705,6 +851,31 @@ void etcpmon_gui_clear_metrics(struct etcpmon_app* app) {
SetDlgItemTextA(app->hWndMain, IDC_EDIT_TUN_READ_ERRS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_TUN_WRITE_ERRS, "");
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, "");
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_Q_ACK_BYTES, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_ACK_PKTS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_RECV_BYTES, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_RECV_PKTS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_OUT_BYTES, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_OUT_PKTS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ERR_REINIT, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ERR_RESET, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ERR_PKT_FMT, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_TIMER_RETRANS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_TIMER_ACK_RESP, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ID_NEXT_TX, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ID_LAST_RX, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ID_LAST_DEL, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ID_RX_ACK_TILL, "");
if (app->hListLinks) {
SendMessage(app->hListLinks, LB_RESETCONTENT, 0, 0);
}

60
tools/etcpmon/etcpmon_gui.h

@ -62,6 +62,37 @@ extern "C" {
/* Link list control ID */
#define IDC_LIST_LINKS 400
/* Queue & Error Metrics control IDs */
#define IDC_STATIC_QUEUES 600
#define IDC_EDIT_Q_IN_Q_BYTES 601
#define IDC_EDIT_Q_IN_Q_PKTS 602
#define IDC_EDIT_Q_IN_SEND_BYTES 603
#define IDC_EDIT_Q_IN_SEND_PKTS 604
#define IDC_EDIT_Q_WAIT_ACK_BYTES 605
#define IDC_EDIT_Q_WAIT_ACK_PKTS 606
#define IDC_EDIT_Q_ACK_BYTES 607
#define IDC_EDIT_Q_ACK_PKTS 608
#define IDC_EDIT_Q_RECV_BYTES 609
#define IDC_EDIT_Q_RECV_PKTS 610
#define IDC_EDIT_Q_OUT_BYTES 611
#define IDC_EDIT_Q_OUT_PKTS 612
#define IDC_STATIC_ERRORS 620
#define IDC_EDIT_ERR_REINIT 621
#define IDC_EDIT_ERR_RESET 622
#define IDC_EDIT_ERR_PKT_FMT 623
#define IDC_STATIC_TIMERS 630
#define IDC_EDIT_TIMER_RETRANS 631
#define IDC_EDIT_TIMER_ACK_RESP 632
/* ID Metrics control IDs */
#define IDC_STATIC_IDS 640
#define IDC_EDIT_ID_NEXT_TX 641
#define IDC_EDIT_ID_LAST_RX 642
#define IDC_EDIT_ID_LAST_DEL 643
#define IDC_EDIT_ID_RX_ACK_TILL 644
/* Graph control ID */
#define IDC_GRAPH 500
@ -129,6 +160,35 @@ struct etcpmon_app {
/* Links list */
HWND hListLinks;
/* Queue metrics controls */
HWND hEditQInQBytes;
HWND hEditQInQPkts;
HWND hEditQInSendBytes;
HWND hEditQInSendPkts;
HWND hEditQWaitAckBytes;
HWND hEditQWaitAckPkts;
HWND hEditQAckBytes;
HWND hEditQAckPkts;
HWND hEditQRecvBytes;
HWND hEditQRecvPkts;
HWND hEditQOutBytes;
HWND hEditQOutPkts;
/* Error counters */
HWND hEditErrReinit;
HWND hEditErrReset;
HWND hEditErrPktFmt;
/* Timer flags */
HWND hEditTimerRetrans;
HWND hEditTimerAckResp;
/* ID metrics */
HWND hEditIdNextTx;
HWND hEditIdLastRx;
HWND hEditIdLastDel;
HWND hEditIdRxAckTill;
/* Graph controls */
HWND hGraphWnd;
HWND hChannelName[GRAPH_METRICS_COUNT];

10
tools/etcpmon/etcpmon_protocol.h

@ -129,6 +129,12 @@ struct etcpmon_etcp_metrics {
/* Timer flags (1 = active, 0 = NULL) */
uint8_t retrans_timer_active;
uint8_t ack_resp_timer_active;
/* Connection IDs */
uint32_t next_tx_id;
uint32_t last_rx_id;
uint32_t last_delivered_id;
uint32_t rx_ack_till;
};
/* Link metrics */
@ -150,6 +156,10 @@ struct etcpmon_link_metrics {
uint8_t init_timer_active;
uint8_t keepalive_timer_active;
uint8_t shaper_timer_active;
/* Keepalive counters */
uint32_t keepalive_sent;
uint32_t keepalive_recv;
};
/* TUN interface metrics */

Loading…
Cancel
Save