#ifndef ROUTE_PING_H #define ROUTE_PING_H #ifdef __cplusplus extern "C" { #endif #include #include #include "nat_detection.h" #include "secure_channel.h" struct TOPO_PING_REQ { uint8_t cmd; // ETCP_ID_TOPO_ENTRY uint8_t subcmd; // TOPO_SUBCMD_PING_REQ uint16_t reserved; // padding для выравнивания request_id uint32_t request_id; // для корреляции uint8_t count; // число пингов uint8_t socket_id; // id сокета пингуемого узла uint16_t interval_ms; // интервал между пингами uint16_t timeout_ms; // таймаут одного пинга uint8_t target_ipv4[4]; // custom target IP (0 = use nodeinfo sockets) uint16_t target_port; // custom target port uint8_t pubkey[SC_PUBKEY_SIZE]; // pubkey for encryption if target not in nodes } __attribute__((packed)); struct TOPO_PING_RESP { uint8_t cmd; uint8_t subcmd; // TOPO_SUBCMD_PING_RESP uint16_t reserved; // padding для выравнивания uint32_t request_id; uint8_t count_sent; uint8_t count_ok; uint16_t avg_rtt; // средний RTT в 0.1ms } __attribute__((packed)); // Отправить запрос пинга по произвольному IP:port (используется для NAT-детекции) // Если pubkey != NULL, он передается в пакете (для пинга без локального nodeinfo) int route_ping_send_req_addr(struct NAT_DETECTION* nd, struct TOPO_GROUP* group, struct ETCP_CONN* to_conn, uint32_t target_ip, uint16_t target_port, uint8_t count, uint16_t interval_ms, uint16_t timeout_ms, uint16_t wait_timeout_ms, route_ping_callback_t cb, void* arg, const uint8_t* pubkey); // Очистить список ожидающих запросов void route_ping_destroy_pending(struct NAT_DETECTION* nd); // Отменить pending запросы для указанного соединения (при удалении conn) void route_ping_cancel_for_conn(struct NAT_DETECTION* nd, struct ETCP_CONN* conn); // Обработчики, вызываемые из topo_group_receive_cbk (через nat_detection) void route_ping_handle_req(struct NAT_DETECTION* nd, struct TOPO_GROUP* group, struct ETCP_CONN* from_conn, const uint8_t* data, size_t len); void route_ping_handle_resp(struct NAT_DETECTION* nd, struct ETCP_CONN* from_conn, const uint8_t* data, size_t len); #ifdef __cplusplus } #endif #endif // ROUTE_PING_H