Files
utun2/src/routing_layer/routing_doc.md
T
evgeny 38c9f229bc stcp: ed25519 pubkey exchange in handshake, fix instance destroy segfault, fix chat_tcp_test
- u_async.c: process immediate_queue BEFORE epoll_wait in uasync_poll
- stcp_link.c: defensive NULL etcp_conn/etcp_link in stcp_link_close
- utun_instance.c: move stcp_server_list_destroy_all to Phase J (before ETCP),
  add deferred drain in both Phase J and L
- stcp.h/c: STCP_HS_ENC_CLIENT 6→38, STCP_HS_ENC_SERVER 7→39,
  exchange ed25519_pubkey in both handshake directions
- etcp_connections.c: copy peer_ed25519 from STCP to ETCP_CONN in
  etcp_link_enter_ready_tcp; guard link->etcp in tcp_link_close_cb
- chat_sync.c: fix lk->conn NULL dereference for TCP links
- test_stcp.c: update stcp_server_create/stcp_client_connect callsites
- tools/chat_tcp_test: change transport udp→tcp
2026-08-07 00:48:27 +03:00

3.7 KiB

routing – централизованный модуль маршрутизации

1. Назначение

Связывает TUN-интерфейс и ETCP-транспорт в единый маршрутизатор. Принимает IP-пакеты из TUN, по IP-адресу назначения ищет маршрут в таблице (route_lib) и отправляет пакет через ETCP нужному узлу. В обратную сторону принимает пакеты из ETCP (callback routing_pkt_from_etcp_cb) и отдаёт в TUN локально.

IPv6-пакеты на данный момент дропаются на этапе extract_dst_ip (возвращает 0).

Модуль НЕ реализует таблицу маршрутизации сам — он пользуется route_lib (instance->rt) и BGP-обменом (topo_node / topo_group) для наполнения таблицы.

2. Как пользоваться

Порядок инициализации в utun_instance.c:

  1. routing_create() — создаёт ROUTE_TABLE в instance->rt
  2. routing_bind() — биндит коллбек routing_pkt_from_etcp_cb через etcp_router_bind(ETCP_RT_ID_DATA) — принимать пакеты из ETCP
  3. routing_set_tun() — вешает коллбек routing_pkt_from_tun_cb на tun->output_queue — забирать пакеты из TUN

Основной поток данных:

  • TUN → сеть: пакет попадает в tun->output_queue → routing_pkt_from_tun_cb → route_pkt → etcp_route_send
  • сеть → TUN: пакет приходит через ETCP → etcp_router вызывает routing_pkt_from_etcp_cb → route_pkt → queue_data_put(tun->input_queue)

Ключевые нюансы:

  • routing_add_conn / routing_del_conn — deprecated (no-op), маршруты теперь управляются через BGP и таблицу route_lib
  • Все не-IPv4 пакеты (IPv6, unknown) дропаются в extract_dst_ip
  • Multicast (224.0.0.0/4) и limited broadcast (255.255.255.255) дропаются без логирования
  • Пакеты без маршрута дропаются с инкрементом instance->dropped_packets

3. API

Функция Описание
routing_create(instance) Создаёт ROUTE_TABLE в instance->rt. -1 при ошибке
routing_bind(instance) Биндит обработчик входящих ETCP-пакетов через etcp_router_bind
routing_destroy(instance) Отвязывает ETCP-обработчик, уничтожает ROUTE_TABLE
routing_set_tun(instance) Вешает callback на tun->output_queue для перехвата пакетов из TUN
routing_add_conn(etcp) Deprecated, ничего не делает
routing_del_conn(etcp) Deprecated, ничего не делает
route_pkt(instance, entry, src_node_id) Ядро маршрутизации: извлекает dst IP → route_lookup → etcp_route_send или queue_data_put(tun->input_queue) для локального

Внутренние функции

Функция Описание
extract_dst_ip(data, len) Извлекает dst IPv4 из заголовка пакета (offset 16, 4 байта). Возвращает 0 для не-IPv4
routing_pkt_from_etcp_cb(conn, pkt) Callback: приём пакета из ETCP-роутера, вызывает route_pkt
routing_pkt_from_tun_cb(q, arg) Callback: приём пакета из TUN output_queue, вызывает route_pkt