#ifndef ROUTE_PING_H #define ROUTE_PING_H #include #include #include "route_bgp.h" #define ROUTE_SUBCMD_PING_REQ 0x07 #define ROUTE_SUBCMD_PING_RESP 0x08 struct BGP_PING_REQUEST { uint8_t cmd; // ETCP_ID_ROUTE_ENTRY uint8_t subcmd; // ROUTE_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 BGP_PING_RESPONSE { uint8_t cmd; uint8_t subcmd; // ROUTE_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)); typedef void (*route_ping_callback_t)(int success, uint16_t avg_rtt, uint8_t count_sent, uint8_t count_ok, void* arg); // Отправить запрос пинга по произвольному IP:port (используется для NAT-детекции) // Если target_ip == 0, используется node_id из списка известных узлов // Если pubkey != NULL, он передается в пакете (для пинга без локального nodeinfo) int route_ping_send_req_addr(struct ROUTE_BGP* bgp, 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); // Очистить список ожидающих запросов (при уничтожении BGP) void route_ping_destroy_pending(struct ROUTE_BGP* bgp); // Отменить pending запросы для указанного соединения (при удалении conn) void route_ping_cancel_for_conn(struct ROUTE_BGP* bgp, struct ETCP_CONN* conn); // Обработчики, вызываемые из route_bgp_receive_cbk void route_ping_handle_req(struct ROUTE_BGP* bgp, struct ETCP_CONN* from_conn, const uint8_t* data, size_t len); void route_ping_handle_resp(struct ROUTE_BGP* bgp, struct ETCP_CONN* from_conn, const uint8_t* data, size_t len); #endif // ROUTE_PING_H