Ключевые изменения в понимании paths route_bgp_process_nodeinfo(bgp, from_conn, data, entry->len): проверяет текущую версию nodeinfo, если совпадает - только bgp_update local nodelist если версия новая или нет узла - spread: bgp_update local nodelist realloc: добавляет next hop: hoplist += prev_node_id, hop_count++ bgp_spread 1. функция распространения маршрута bgp_spread(struct ROUTE_BGP bgp, struct NODEINFO* n) send to: - все подключения, если не найден uid подключения в hoplist bgp_update local nodelist: - обновляем саму node - удалеям conn где lash hop=prev_node_id - добавляем новый conn с новым hoplist 2. withdraw: bgp_withdraw(struct ROUTE_BGP bgp, uint64_t node_to_del, uint64_t wd_source) - wd_source это узел который захотел withdraw. - находим у себя node to del. удаляем если в hoplist найден wd_node (или мы = wd_node) если удалили - распространяем по всем линкам с этими же аргументами =============================== определение nat определяем что оба узла в локальной сети: -если обе ноды имеют локальные адреса сокетов пробуем пинг по локальным адресам если узел подключился и его сокетовый ip:port отличается от connection ip:port - устанавливаем флаг nat. и инициируем проверку пингом третьим узлом: проверка считается успешной если по результату пинга ip источника пинга отличается от ip запросившего пинг узла. проверка типа nat узла который подключился: - пингуем узел с целью зафиксировать свой ip (в сокете может быть например 0.0.0.0) - даём команду третьему узлу пингануть этот узел. - по результатам двух пингов определяем тип nat