GUI: поле действия и кнопка Send для отправки команд в utun

- Добавлен ETCPMON_CMD_ACTION в протокол (32 байта текст)
- В GUI добавлено поле ввода и кнопка Send правее блока Sockets
- Добавлен etcpmon_client_send_action для отправки команд
- Обработка action 'nat' в control_server: запускает NAT check для всех линков
- Сделана route_bgp_start_link_nat_check не-static
- Добавлена route_bgp_request_nat_check_all
- Исправлен баг route_ping.c (request_id -> nonce)
- Исправлена линковка tests/Makefile.am
This commit is contained in:
Evgeny committed 2026-04-22 20:52:30 +03:00
1 parent 5b0a743e02
commit 57dba26e7c
10 files changed
+125 -5

No files matched your search

+13 -1
View File
@@ -613,7 +613,7 @@ static void handle_client_data(struct control_server* server, struct control_cli
close_client(server, client);
return;
}
if (hdr->type < ETCPMON_CMD_LIST_CONN || hdr->type > ETCPMON_CMD_LIST_SOCKETS) {
if (hdr->type < ETCPMON_CMD_LIST_CONN || hdr->type > ETCPMON_CMD_ACTION) {
DEBUG_ERROR(DEBUG_CATEGORY_CONTROL, "Invalid command type from client: 0x%02X", hdr->type);
close_client(server, client);
return;
@@ -684,6 +684,18 @@ static void handle_client_data(struct control_server* server, struct control_cli
send_socket_list(server, client, req_seq);
break;
case ETCPMON_CMD_ACTION:
if (payload_size >= sizeof(struct etcpmon_cmd_action)) {
struct etcpmon_cmd_action* cmd = (struct etcpmon_cmd_action*)payload;
if (strncmp(cmd->action, "nat", 3) == 0) {
DEBUG_INFO(DEBUG_CATEGORY_CONTROL, "Action 'nat' received, requesting NAT check for all links");
route_bgp_request_nat_check_all(server->instance->bgp);
} else {
DEBUG_WARN(DEBUG_CATEGORY_CONTROL, "Unknown action received: '%s'", cmd->action);
}
}
break;
case ETCPMON_CMD_DISCONNECT:
if (server->log_file) {
fprintf(server->log_file, "%llu: [LOG] Client requested disconnect\n",
+18 -2
View File
@@ -113,7 +113,7 @@ static void route_bgp_broadcast_withdraw(struct ROUTE_BGP* bgp, uint64_t node_id
// Приём пакетов
// ============================================================================
static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LINK* link);
void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LINK* link);
static void route_bgp_handle_nat_info(struct ROUTE_BGP* bgp, struct ETCP_CONN* from_conn, const uint8_t* data, size_t len);
static void route_bgp_handle_nat_check_req(struct ROUTE_BGP* bgp, struct ETCP_CONN* from_conn, const uint8_t* data, size_t len);
@@ -596,7 +596,7 @@ static void route_bgp_extract_nat_addr(struct ETCP_CONN* conn, uint32_t* nat_ip,
}
}
static void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LINK* link) {// проверяем тип нат для линка link
void route_bgp_start_link_nat_check(struct ROUTE_BGP* bgp, struct ETCP_LINK* link) {// проверяем тип нат для линка link
if (!bgp || !link || !link->conn || !link->etcp) return;
if (link->nat_check_status == NAT_CHECK_IN_PROGRESS) return;
// Find third node to send ping through
@@ -1095,3 +1095,19 @@ void route_bgp_send_nat_check_req(struct ETCP_CONN* conn, uint8_t socket_id) {
ip_to_str(&pkt->interface_ip, AF_INET).str,
(unsigned)ntohs(pkt->interface_port));
}
void route_bgp_request_nat_check_all(struct ROUTE_BGP* bgp) {
if (!bgp || !bgp->instance) return;
int count = 0;
struct ETCP_CONN* conn = bgp->instance->connections;
while (conn) {
struct ETCP_LINK* link = conn->links;
while (link) {
route_bgp_start_link_nat_check(bgp, link);
count++;
link = link->next;
}
conn = conn->next;
}
DEBUG_INFO(DEBUG_CATEGORY_BGP, "NAT check requested for all links, count=%d", count);
}
+5
View File
@@ -195,4 +195,9 @@ void route_bgp_send_nat_check_req(struct ETCP_CONN* conn, uint8_t socket_id);
*/
void route_bgp_set_nat_check_local(struct ROUTE_BGP* bgp, int allow);
/**
* @brief Запускает NAT check для всех линков всех соединений.
*/
void route_bgp_request_nat_check_all(struct ROUTE_BGP* bgp);
#endif // ROUTE_BGP_H
+1 -1
View File
@@ -227,7 +227,7 @@ static void route_ping_single_cb(int success,
ctx->sum_rtt += rtt;
}
DEBUG_INFO(DEBUG_CATEGORY_BGP, "ping response id=%zu", request_id);
DEBUG_INFO(DEBUG_CATEGORY_BGP, "ping response nonce=%llu", (unsigned long long)nonce);
/* Если ещё не все пакеты отправлены — сразу шлём следующий */
if (ctx->count_sent < ctx->count_total) {