# TUN Route (tun_route) ## 1. Назначение Модуль управления маршрутами в системной таблице маршрутизации. Добавляет маршруты к заданным подсетям через TUN-интерфейс, чтобы исходящий трафик на эти подсети направлялся в виртуальный интерфейс uTun. Удаляет их при завершении работы. Кроссплатформенный: использует разные механизмы ОС с fallback-стратегией. ## 2. Как пользоваться ```c // Добавить один маршрут tun_route_add(ifindex, "tun0", 0x0A000000, 8); // 10.0.0.0/8 // Добавить все маршруты из конфига tun_route_add_all(ifindex, "tun0", cfg.routes); // Удалить все маршруты из конфига tun_route_del_all(ifindex, "tun0", cfg.routes); // Удалить все маршруты через интерфейс (очистка) tun_route_flush("tun0"); ``` **Network передаётся в host byte order** (внутри конвертируется в network byte order). `tun_route_add_all`/`tun_route_del_all` проходят по связному списку `CFG_ROUTE_ENTRY` и вызывают `tun_route_add`/`tun_route_del` для каждого элемента. **Root-права:** требуются для изменения системной таблицы маршрутизации. ## 3. API ### Функции - **`tun_route_add(ifindex, ifname, network, prefix_len)`** — добавляет маршрут к подсети `network/prefix_len` через интерфейс `ifindex`. Пытается использовать нативный механизм платформы, при неудаче — fallback на shell-команду - **`tun_route_del(ifindex, ifname, network, prefix_len)`** — удаляет аналогичный маршрут - **`tun_route_add_all(ifindex, ifname, routes)`** — массовое добавление маршрутов из связного списка `CFG_ROUTE_ENTRY`. Возвращает количество успешно добавленных - **`tun_route_del_all(ifindex, ifname, routes)`** — массовое удаление. Возвращает количество удалённых - **`tun_route_flush(ifname)`** — удаление всех маршрутов, привязанных к интерфейсу `ifname`, без привязки к конфигу ### Платформенные механизмы **Linux:** 1. Netlink socket (`AF_NETLINK`, `NETLINK_ROUTE`): сообщения `RTM_NEWROUTE`/`RTM_DELROUTE` с атрибутами `RTA_DST` (адрес сети) и `RTA_OIF` (индекс интерфейса). Ожидание ACK от ядра через `poll` с таймаутом 1с 2. Fallback: `ip route add/del / dev ` через `system()` 3. `tun_route_flush`: `ip route flush dev `, при неудаче — парсинг `ip route show` и удаление по одному **Windows:** 1. `netsh interface ip add/delete route` через `system()` (первичный метод) 2. Fallback: IP Helper API — `CreateIpForwardEntry`/`DeleteIpForwardEntry` с заполнением `MIB_IPFORWARDROW` 3. `tun_route_flush`: `GetIpForwardTable` → перебор записей по `dwForwardIfIndex` → `DeleteIpForwardEntry` **BSD/macOS:** 1. Routing socket (`PF_ROUTE`, `SOCK_RAW`): сообщения `RTM_ADD`/`RTM_DELETE`, адреса RTA_DST + RTA_NETMASK + RTA_IFP (sockaddr_dl) 2. Fallback: `route add/delete -net / -interface ` через `system()` 3. `tun_route_flush`: `route -n show -interface ` → парсинг awk → `route delete`