В таблице роутинга маршруты не пересекаются. Т.е. не может быть одновременно 192.168.1.1/24 и 192.168.1.100/30 Как работает роутинг: 1. типов маршрута бывает два: learned (роутятся в ETCP instance) и local (роутятся в TUN). local - локальные маршруты из конфига (опция конфига my_subnet=IP/Mask) при инициализации local сразу добавляются в роутинг таблицу (ипользуя запись BGP_NODEINFO_PACKET* my_nodeinfo). BGP_NODEINFO собирается на узле владельце node, далее распространяется по остальным узлам. 2. При установке подключения к новому узлу мы отправляем этому узлу все nodeinfo. Если несколько доступных линков - отправляем только один - preferred_conn 3. При изменении preferred_conn рассылаем reroute (например старый preferred_conn удален) 3. При удалении всех подключений рассылаем withdraw. 3. При получении BGP_NODEINFO_PACKET мы смотрим есть ли такой узел уже в таблице. Если узла нет - добавляем, если есть - обновляем информацию о узле включая его маршруты и список next_hop через которые доступен узел (nb_routes). Добавляем так: инкрементируем hop_count устанавливая etcp линк с которого приняли как next_hop, добавляем его в hop_list. рассылаем по всем активным линкам кроме линка с которого получили (обязательно) Обновление: обновляем hop_list если поменялся 4. При отключении от узла (если у node не осталось nb_routes) мы: Удаляем node и вложенные структуры: все маршруты узла Рассылаем withdraw для узла hop_id. Логика рассылки withdraw: Если получен withdraw - удаляем этот маршрут и распространяем withdraw или reroute по всем линкам кроме того с которого получили. В зависимости от изменений (остались ли резервные линки или изменился preferred_conn). Метрик маршрута пока нет. используется первый доступный. Как работаеут маршрутизация: destination IP -> route table lookup -> route entry (ip/mask, node_info*) -> выбор лучшего next_hop -> отправка в next_hop