refactor: move transport (etcp/stcp/normalizer) to transport_layer/, routing (bgp/pings/topo*) to routing_layer/

This commit is contained in:
Evgeny committed 2026-07-21 20:25:41 +03:00
1 parent 3dda701c67
commit fcf3fb7f51
146 files changed
+582 -333

No files matched your search

+44
View File
@@ -0,0 +1,44 @@
# 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` |