4.6 KiB
route_connectivity — зондирование прямой связности с удалённым узлом
1. Назначение
Проверяет прямую IP-достижимость всех адресов удалённого узла через etcp_send_ping_to_socket().
Для каждого адреса перебирает локальные сокеты-кандидаты (до 8), с каждого делает серию из 3 пингов
(CONN_PROBE_COUNT=3, CONN_PROBE_TIMEOUT_MS=1000). Результаты (reachable/unreachable, min_rtt)
сохраняются в TOPO_CONNECTIVITY узла и используются conn_mgr для выбора оптимального пути.
В отличие от route_ping (пинг через BGP-посредника), здесь пинги идут напрямую с локальных сокетов
на адреса удалённого узла — без промежуточных узлов.
2. Как пользоваться
// Запустить зондирование узла (вызывается conn_mgr при обнаружении нового узла):
route_connectivity_probe_node(instance, nodeq);
// Отменить зондирование (при удалении узла / withdraw):
route_connectivity_cancel_node(instance, nodeq);
// Отменить все зондирования (при destroy):
route_connectivity_cancel_all(instance);
Результаты доступны через nodeq->connectivity:
probe_status—PROBE_STATUS_NONE/PROBE_STATUS_IN_PROGRESS/PROBE_STATUS_DONEinterface_status/nat_status/real_status—PROBE_RESULT_UNKNOWN/REACHABLE/UNREACHABLEinterface_min_rtt/nat_min_rtt/real_min_rtt— минимальный RTT по всем сокетам (0.1ms)pending_count— счётчик незавершённых серий (когда 0 → PROBE_STATUS_DONE)
Ключевой нюанс: зондирование пропускает собственный узел (nq->node->node_id == instance->node_id).
Если зондирование уже в процессе, повторный вызов игнорируется.
3. API
Внутренние структуры
| Структура | Назначение |
|---|---|
conn_probe_ctx |
Контекст одной серии проб: addr_type (INTERFACE/NAT/REAL), target_addr, candidate_sockets[8], best_across_sockets (min RTT по всем опробованным сокетам), min_rtt (в текущей серии), счётчики |
Подбор сокетов-кандидатов (conn_match_candidate_sockets)
Для каждого адреса узла подбирает локальные сокеты в порядке предпочтения:
- INTERFACE-адрес: PRIVATE/LOCAL сокеты в той же /24 подсети
- NAT/REAL-адрес: DIRECT > EIM > PUBLIC/UNKNOWN сокеты
- Fallback: остальные подходящие сокеты, затем все IPv4
Для IPv6: предпочитает сокеты в той же /64 подсети.
Функции
| Функция | Назначение |
|---|---|
route_connectivity_probe_node(instance, nq) |
Перебрать все v4/v6 адреса узла, для каждого подобрать сокеты-кандидаты, запустить серии пингов по 3. Заполняет nq->connectivity |
route_connectivity_cancel_node(instance, nq) |
Сбросить probe_status=NONE, pending_count=0, занулить nq в ctx (чтобы callback не обновлял статистику) |
route_connectivity_cancel_all(instance) |
Сбросить состояние всех узлов в default-группе |
Логика завершения
- Серия из 3 пингов с одного сокета: если все 3 потеряны → переход к следующему сокету
- Если хоть 1 пинг успешен → серия считается успешной для данного адреса, обновляется
*_status=REACHABLEи*_min_rtt - Когда
pending_countдоходит до 0 →probe_status = PROBE_STATUS_DONE
Зависимости
src/etcp_connections.h—etcp_send_ping_to_socket()(прямой пинг)src/topo_node.h—TOPO_GROUP_NODE,TOPO_CONNECTIVITY,TOPO_ADDR4,TOPO_ADDR6src/topo_group.h—topo_groups_get_default()(для cancel_all)lib/u_async.h— get_time_tb() для отметок времени