В таблице роутинга маршруты не пересекаются. Т.е. не может быть одновременно 192.168.1.1/24 и 192.168.1.100/30 Как работает роутинг: 1. типов маршрута бывает два: learned и local. local - локальные маршруты из конфига (опция конфига my_subnet=IP/Mask) при инициализации они сразу добавляются в роутинг таблицу (и используются для отправки пакетов в tun интерфейс). 2. При установке подключения к новому узлу мы отправляем этому узлу полностью свою таблицу маршрутизации (local + learned узлы). Если несколько доступных линков - отправляем только один - preferred_conn 3. При изменении preferred_conn рассылаем reroute (например старый preferred_conn удален) 3. При удалении всех подключений рассылаем withdraw. 3. При получении маршрута мы смотрим есть ли такой маршрут уже в таблице. Если такой маршрут есть и ID узла другой - игнорируем с ошибкой. иначе добавляем/обновляем (для одного узла может быть несколько маршрутов). Игнорируем маршрут если наш ID есть в списке узлов (hop_list). Добавляем так: инкрементируем hop_count устанавливая etcp линк с которого приняли как next_hop, добавляем его в hop_list. рассылаем по всем активным линкам кроме линка с которого получили (обязательно) Обновление: обновляем hop_list если поменялся 4. При отключении от узла мы Удаляем все маршруты узла Рассылаем withdraw для узла hop_id. Логика рассылки withdraw: Если получен withdraw - удаляем этот маршрут и распространяем withdraw или reroute по всем линкам кроме того с которого получили. В зависимости от изменений (остались ли резервные линки или изменился preferred_conn). Метрик маршрута пока нет. используется первый доступный.