/** * @file route_ping.h * @brief Удалённый пинг через BGP-посредника. * * A просит B пропинговать C и вернуть сводную статистику: * A --PING_REQ--> B --ETCP ping--> C * A <--PING_RESP-- B (sent/ok/avg_rtt) * * Промежуточный узел задаётся ЯВНО в to_conn — вызывающий сам выбирает, * через кого слать запрос. Автоподбор посредника (nat_check_find_third_node) * находится в nat_detection.c, не здесь. */ #ifndef ROUTE_PING_H #define ROUTE_PING_H #ifdef __cplusplus extern "C" { #endif #include #include #include "nat_detection.h" /** Запросить у to_conn серию пингов на target_ip:target_port. * cb вызывается всегда ровно 1 раз: * success=1 если хоть один пинг успешен (PONG получен) * success=0 при общем таймауте или все пинги провалились * @param to_conn промежуточный узел — выбирается вызывающим явно */ 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); /** Отменить все ожидающие ответы (при остановке NAT_DETECTION). */ 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); /** Входящий PING_REQ — мы посредник: пингуем цель, шлём PING_RESP. */ 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); /** Входящий PING_RESP — мы инициатор: находим pending по request_id, вызываем cb. */ 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