- 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
3.7 KiB
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:
routing_create()— создаётROUTE_TABLEвinstance->rtrouting_bind()— биндит коллбекrouting_pkt_from_etcp_cbчерезetcp_router_bind(ETCP_RT_ID_DATA)— принимать пакеты из ETCProuting_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 |