You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

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_DONE
  • interface_status/nat_status/real_status — PROBE_RESULT_UNKNOWN / REACHABLE / UNREACHABLE
  • interface_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)

Для каждого адреса узла подбирает локальные сокеты в порядке предпочтения:

  1. INTERFACE-адрес: PRIVATE/LOCAL сокеты в той же /24 подсети
  2. NAT/REAL-адрес: DIRECT > EIM > PUBLIC/UNKNOWN сокеты
  3. 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_ADDR6
  • src/topo_group.h — topo_groups_get_default() (для cancel_all)
  • lib/u_async.h — get_time_tb() для отметок времени