Files
utun2/src/tun_route_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.8 KiB
Raw Blame History

TUN Route (tun_route)

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

Модуль управления маршрутами в системной таблице маршрутизации. Добавляет маршруты к заданным подсетям через TUN-интерфейс, чтобы исходящий трафик на эти подсети направлялся в виртуальный интерфейс uTun. Удаляет их при завершении работы. Кроссплатформенный: использует разные механизмы ОС с fallback-стратегией.

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

// Добавить один маршрут
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 <net>/<prefix> dev <ifname> через system()
  3. tun_route_flush: ip route flush dev <ifname>, при неудаче — парсинг 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 <net>/<prefix> -interface <ifname> через system()
  3. tun_route_flush: route -n show -interface <ifname> → парсинг awk → route delete