Browse Source

1

nodeinfo-routing-update
jeka 4 weeks ago
parent
commit
d77e725cbe
  1. 33
      src/control_server.c
  2. 43
      src/pkt_normalizer.c
  3. 6
      src/pkt_normalizer.h
  4. 89
      tools/etcpmon/etcpmon_gui.c
  5. 31
      tools/etcpmon/etcpmon_gui.h
  6. 15
      tools/etcpmon/etcpmon_protocol.h

33
src/control_server.c

@ -10,6 +10,7 @@
#include "etcp_connections.h"
#include "tun_if.h"
#include "route_lib.h"
#include "pkt_normalizer.h"
#include "../lib/u_async.h"
#include "../lib/debug_config.h"
#include "../lib/mem.h"
@ -765,6 +766,38 @@ static void send_metrics(struct control_server* server, struct control_client* c
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;
/* Normalizer */
if (conn->normalizer) {
struct PKTNORM* norm = (struct PKTNORM*)conn->normalizer;
rsp->etcp.norm_input_pkts = (uint32_t)queue_entry_count(norm->input);
rsp->etcp.norm_input_bytes = (uint32_t)queue_total_bytes(norm->input);
rsp->etcp.norm_output_pkts = (uint32_t)queue_entry_count(norm->output);
rsp->etcp.norm_output_bytes = (uint32_t)queue_total_bytes(norm->output);
rsp->etcp.norm_alloc_errors = norm->alloc_errors;
rsp->etcp.norm_logic_errors = norm->logic_errors;
rsp->etcp.norm_frag_size = norm->frag_size;
rsp->etcp.norm_data_ptr = norm->data_ptr;
rsp->etcp.norm_data_size = norm->data_size;
rsp->etcp.norm_in_total_pkts = norm->in_total_pkts;
rsp->etcp.norm_in_total_bytes = norm->in_total_bytes;
rsp->etcp.norm_out_total_pkts = norm->out_total_pkts;
rsp->etcp.norm_out_total_bytes = norm->out_total_bytes;
} else {
rsp->etcp.norm_input_pkts = 0;
rsp->etcp.norm_input_bytes = 0;
rsp->etcp.norm_output_pkts = 0;
rsp->etcp.norm_output_bytes = 0;
rsp->etcp.norm_alloc_errors = 0;
rsp->etcp.norm_logic_errors = 0;
rsp->etcp.norm_frag_size = 0;
rsp->etcp.norm_data_ptr = 0;
rsp->etcp.norm_data_size = 0;
rsp->etcp.norm_in_total_pkts = 0;
rsp->etcp.norm_in_total_bytes = 0;
rsp->etcp.norm_out_total_pkts = 0;
rsp->etcp.norm_out_total_bytes = 0;
}
/* Fill TUN metrics */
if (instance->tun) {
rsp->tun.bytes_read = instance->tun->bytes_read;

43
src/pkt_normalizer.c

@ -14,7 +14,6 @@
// Forward declarations
static void packer_cb(struct ll_queue* q, void* arg);
static void pn_flush_cb(void* arg);
static void etcp_input_ready_cb(struct ll_queue* q, void* arg);
static void pn_unpacker_cb(struct ll_queue* q, void* arg);
static void pn_send_to_etcp(struct PKTNORM* pn);
@ -63,7 +62,6 @@ struct PKTNORM* pn_init(struct ETCP_CONN* etcp) {
pn->data = NULL;
pn->recvpart = NULL;
pn->flush_timer = NULL;
return pn;
}
@ -100,10 +98,6 @@ void pn_deinit(struct PKTNORM* pn) {
queue_free(pn->output);
}
if (pn->flush_timer) {
uasync_cancel_timeout(pn->ua, pn->flush_timer);
}
if (pn->data) {
memory_pool_free(pn->etcp->instance->data_pool, pn->data);
}
@ -142,12 +136,6 @@ void pn_reset(struct PKTNORM* pn) {
DEBUG_TRACE(DEBUG_CATEGORY_NORMALIZER, "");
if (!pn) return;
// Cancel flush timer
if (pn->flush_timer) {
uasync_cancel_timeout(pn->ua, pn->flush_timer);
pn->flush_timer = NULL;
}
// Reset packer state
if (pn->data) {
memory_pool_free(pn->etcp->instance->data_pool, pn->data);
@ -194,14 +182,10 @@ void pn_packer_send(struct PKTNORM* pn, uint8_t* data, uint16_t len) {
entry->len = len;
entry->dgram_pool = NULL;
// Cancel flush timer if active
if (pn->flush_timer) {
uasync_cancel_timeout(pn->ua, pn->flush_timer);
pn->flush_timer = NULL;
}
DEBUG_TRACE(DEBUG_CATEGORY_NORMALIZER, "PUT to input");
int ret = queue_data_put(pn->input, entry, 0);
pn->in_total_pkts++;
pn->in_total_bytes += len;
DEBUG_TRACE(DEBUG_CATEGORY_NORMALIZER, "PUT to input end");
// DEBUG_INFO(DEBUG_CATEGORY_NORMALIZER, "pn_packer_send: queue_data_put returned %d, input count=%d", ret, queue_entry_count(pn->input));
}
@ -305,30 +289,9 @@ exit:
queue_dgram_free(in_dgram);
queue_entry_free(in_dgram);
// Cancel flush timer if active
if (pn->flush_timer) {
uasync_cancel_timeout(pn->ua, pn->flush_timer);
pn->flush_timer = NULL;
}
// Set flush timer if no more input
if (queue_entry_count(pn->input) == 0) {
pn->flush_timer = uasync_set_timeout(pn->ua, pn->tx_wait_time, pn, pn_flush_cb);
}
queue_resume_callback(pn->input);
}
// Internal: Flush callback on timeout
static void pn_flush_cb(void* arg) {
DEBUG_TRACE(DEBUG_CATEGORY_NORMALIZER, "");
struct PKTNORM* pn = (struct PKTNORM*)arg;
if (!pn) return;
pn->flush_timer = NULL;
pn_send_to_etcp(pn);
}
// Internal: Unpacker callback (assembles fragments into original packets)
static void pn_unpacker_cb(struct ll_queue* q, void* arg) {
@ -391,6 +354,8 @@ static void pn_unpacker_cb(struct ll_queue* q, void* arg) {
DEBUG_DEBUG(DEBUG_CATEGORY_NORMALIZER, "unpacked dgram (size=%d)", pn->recvpart->len);
if (debug_should_output(DEBUG_LEVEL_DEBUG, DEBUG_CATEGORY_DUMP)) log_dump("NORM->", pn->recvpart->dgram, pn->recvpart->len);
queue_data_put(pn->output, pn->recvpart, 0);
pn->out_total_pkts++;
pn->out_total_bytes += pn->recvpart->len;
pn->recvpart = NULL;
}
}

6
src/pkt_normalizer.h

@ -32,7 +32,7 @@ struct PKTNORM {
uint16_t data_ptr; // число заполненных байт
uint16_t data_size; // размер выделенной области
// struct ll_entry sndpart; // блок ожидающий досборки
void* flush_timer; // For timeout flush
// void* flush_timer; // For timeout flush
struct ll_entry* pending; // Partial processed input entry
uint16_t pending_in_ptr; // Pointer in pending entry
@ -43,6 +43,10 @@ struct PKTNORM {
// stats:
uint32_t alloc_errors;
uint32_t logic_errors;
uint64_t in_total_pkts;
uint64_t in_total_bytes;
uint64_t out_total_pkts;
uint64_t out_total_bytes;
};
// Инициализация пары

89
tools/etcpmon/etcpmon_gui.c

@ -436,7 +436,7 @@ static void CreateControls(struct etcpmon_app* app) {
y = 915;
CreateWindowExA(0, "BUTTON", "Queues & Errors",
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
10, y, 880, 165, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL);
10, y, 880, 235, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL);
int qy = y + 22;
int q_col1 = 20;
@ -554,6 +554,64 @@ static void CreateControls(struct etcpmon_app* app) {
app->hEditIdRxAckTill = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col2 + 245, qy - 2, 65, 18, hWnd, (HMENU)IDC_EDIT_ID_RX_ACK_TILL, hInst, NULL);
/* Normalizer - row 5 */
qy += 28;
CreateWindowExA(0, "STATIC", "Norm:",
WS_CHILD | WS_VISIBLE, q_col1, qy, 40, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditNormInPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 45, qy - 2, 40, 18, hWnd, (HMENU)IDC_EDIT_NORM_IN_PKTS, hInst, NULL);
app->hEditNormInBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 90, qy - 2, 55, 18, hWnd, (HMENU)IDC_EDIT_NORM_IN_BYTES, hInst, NULL);
app->hEditNormOutPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 150, qy - 2, 40, 18, hWnd, (HMENU)IDC_EDIT_NORM_OUT_PKTS, hInst, NULL);
app->hEditNormOutBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 195, qy - 2, 55, 18, hWnd, (HMENU)IDC_EDIT_NORM_OUT_BYTES, hInst, NULL);
app->hEditNormAllocErr = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 255, qy - 2, 40, 18, hWnd, (HMENU)IDC_EDIT_NORM_ALLOC_ERR, hInst, NULL);
app->hEditNormLogicErr = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 300, qy - 2, 40, 18, hWnd, (HMENU)IDC_EDIT_NORM_LOGIC_ERR, hInst, NULL);
CreateWindowExA(0, "STATIC", "frag:",
WS_CHILD | WS_VISIBLE, q_col1 + 345, qy, 30, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditNormFragSize = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 380, qy - 2, 40, 18, hWnd, (HMENU)IDC_EDIT_NORM_FRAG_SIZE, hInst, NULL);
CreateWindowExA(0, "STATIC", "buf:",
WS_CHILD | WS_VISIBLE, q_col1 + 425, qy, 30, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditNormDataPtr = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 460, qy - 2, 40, 18, hWnd, (HMENU)IDC_EDIT_NORM_DATA_PTR, hInst, NULL);
app->hEditNormDataSize = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 505, qy - 2, 40, 18, hWnd, (HMENU)IDC_EDIT_NORM_DATA_SIZE, hInst, NULL);
/* Normalizer cumulative totals - row 2 */
qy += 25;
CreateWindowExA(0, "STATIC", "NormTot:",
WS_CHILD | WS_VISIBLE, q_col1, qy, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL);
app->hEditNormInTotPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 55, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_NORM_IN_TOT_PKTS, hInst, NULL);
app->hEditNormInTotBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 120, qy - 2, 70, 18, hWnd, (HMENU)IDC_EDIT_NORM_IN_TOT_BYTES, hInst, NULL);
app->hEditNormOutTotPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 200, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_NORM_OUT_TOT_PKTS, hInst, NULL);
app->hEditNormOutTotBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "",
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER,
q_col1 + 265, qy - 2, 70, 18, hWnd, (HMENU)IDC_EDIT_NORM_OUT_TOT_BYTES, hInst, NULL);
}
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
struct etcpmon_app* app = NULL;
@ -876,6 +934,21 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app,
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);
/* Normalizer */
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_IN_PKTS, "%u", metrics->etcp.norm_input_pkts);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_IN_BYTES, "%u", metrics->etcp.norm_input_bytes);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_OUT_PKTS, "%u", metrics->etcp.norm_output_pkts);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_OUT_BYTES, "%u", metrics->etcp.norm_output_bytes);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_ALLOC_ERR, "%u", metrics->etcp.norm_alloc_errors);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_LOGIC_ERR, "%u", metrics->etcp.norm_logic_errors);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_FRAG_SIZE, "%u", metrics->etcp.norm_frag_size);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_DATA_PTR, "%u", metrics->etcp.norm_data_ptr);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_DATA_SIZE, "%u", metrics->etcp.norm_data_size);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_IN_TOT_PKTS, "%llu", (unsigned long long)metrics->etcp.norm_in_total_pkts);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_IN_TOT_BYTES, "%llu", (unsigned long long)metrics->etcp.norm_in_total_bytes);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_OUT_TOT_PKTS, "%llu", (unsigned long long)metrics->etcp.norm_out_total_pkts);
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_OUT_TOT_BYTES, "%llu", (unsigned long long)metrics->etcp.norm_out_total_bytes);
/* Links list */
if (app->hListLinks) {
SendMessage(app->hListLinks, LB_RESETCONTENT, 0, 0);
@ -978,6 +1051,20 @@ void etcpmon_gui_clear_metrics(struct etcpmon_app* app) {
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ID_LAST_DEL, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ID_RX_ACK_TILL, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_IN_PKTS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_IN_BYTES, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_OUT_PKTS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_OUT_BYTES, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_ALLOC_ERR, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_LOGIC_ERR, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_FRAG_SIZE, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_DATA_PTR, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_DATA_SIZE, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_IN_TOT_PKTS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_IN_TOT_BYTES, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_OUT_TOT_PKTS, "");
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_OUT_TOT_BYTES, "");
if (app->hListLinks) {
SendMessage(app->hListLinks, LB_RESETCONTENT, 0, 0);
}

31
tools/etcpmon/etcpmon_gui.h

@ -109,6 +109,22 @@ extern "C" {
#define IDC_EDIT_ID_LAST_DEL 643
#define IDC_EDIT_ID_RX_ACK_TILL 644
/* Normalizer IDs */
#define IDC_STATIC_NORM 660
#define IDC_EDIT_NORM_IN_PKTS 661
#define IDC_EDIT_NORM_IN_BYTES 662
#define IDC_EDIT_NORM_OUT_PKTS 663
#define IDC_EDIT_NORM_OUT_BYTES 664
#define IDC_EDIT_NORM_ALLOC_ERR 665
#define IDC_EDIT_NORM_LOGIC_ERR 666
#define IDC_EDIT_NORM_FRAG_SIZE 667
#define IDC_EDIT_NORM_DATA_PTR 668
#define IDC_EDIT_NORM_DATA_SIZE 669
#define IDC_EDIT_NORM_IN_TOT_PKTS 670
#define IDC_EDIT_NORM_IN_TOT_BYTES 671
#define IDC_EDIT_NORM_OUT_TOT_PKTS 672
#define IDC_EDIT_NORM_OUT_TOT_BYTES 673
/* Graph control ID */
#define IDC_GRAPH 500
@ -221,6 +237,21 @@ struct etcpmon_app {
HWND hEditIdLastDel;
HWND hEditIdRxAckTill;
/* Normalizer */
HWND hEditNormInPkts;
HWND hEditNormInBytes;
HWND hEditNormOutPkts;
HWND hEditNormOutBytes;
HWND hEditNormAllocErr;
HWND hEditNormLogicErr;
HWND hEditNormFragSize;
HWND hEditNormDataPtr;
HWND hEditNormDataSize;
HWND hEditNormInTotPkts;
HWND hEditNormInTotBytes;
HWND hEditNormOutTotPkts;
HWND hEditNormOutTotBytes;
/* Graph controls */
HWND hGraphWnd;
HWND hChannelName[GRAPH_METRICS_COUNT];

15
tools/etcpmon/etcpmon_protocol.h

@ -140,6 +140,21 @@ struct etcpmon_etcp_metrics {
uint32_t last_rx_id;
uint32_t last_delivered_id;
uint32_t rx_ack_till;
/* Normalizer */
uint32_t norm_input_pkts;
uint32_t norm_input_bytes;
uint32_t norm_output_pkts;
uint32_t norm_output_bytes;
uint32_t norm_alloc_errors;
uint32_t norm_logic_errors;
uint16_t norm_frag_size;
uint16_t norm_data_ptr;
uint16_t norm_data_size;
uint64_t norm_in_total_pkts;
uint64_t norm_in_total_bytes;
uint64_t norm_out_total_pkts;
uint64_t norm_out_total_bytes;
};
/* Link metrics */

Loading…
Cancel
Save