# 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` |