From b5b6875bc5401c373e9880035b23458afc8cdd8c Mon Sep 17 00:00:00 2001 From: Evgeny Date: Wed, 1 Jul 2026 14:48:38 +0300 Subject: [PATCH] bgp: skip own NODEINFO in route_bgp_process_nodeinfo When own NODEINFO is reflected back from a peer, do not add it to bgp->nodes. Only update bgp->local_node which is sent separately. This prevents route duplication and the 'local node in learned list' inconsistency. --- src/route_bgp.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/route_bgp.c b/src/route_bgp.c index 207cd925..45168398 100644 --- a/src/route_bgp.c +++ b/src/route_bgp.c @@ -750,6 +750,8 @@ int route_bgp_process_nodeinfo(struct ROUTE_BGP* bgp, struct ETCP_CONN* from, co struct NODEINFO_Q* nodeinfo1 = nodeinfo_find_by_id(bgp, node_id); uint8_t new_ver = ni->ver; + if (node_id == bgp->instance->node_id) return 0; + if (nodeinfo1 && (int8_t)(nodeinfo1->last_ver-new_ver)>=0) { int new_hops = ni->hop_count + 1; if (new_hops <= MAX_HOPS) { @@ -810,22 +812,6 @@ int route_bgp_process_nodeinfo(struct ROUTE_BGP* bgp, struct ETCP_CONN* from, co memcpy(&nodeinfo1->node, ni, sizeof(struct NODEINFO) + dyn_size); } - /* Если это наш local_node (по node_id), обновляем его данные */ - if (node_id == bgp->instance->node_id && bgp->local_node) { - uint8_t* dyn_src = (uint8_t*)&nodeinfo1->node + sizeof(struct NODEINFO); - uint8_t* dyn_dst = (uint8_t*)&bgp->local_node->node + sizeof(struct NODEINFO); - int dyn_sz = nodeinfo1->node.node_name_len + - nodeinfo1->node.local_v4_sockets * sizeof(struct NODEINFO_IPV4_SOCKET_META) + - nodeinfo1->node.local_v4_addrs * sizeof(struct NODEINFO_IPV4_ADDR) + - nodeinfo1->node.local_v6_sockets * sizeof(struct NODEINFO_IPV6_SOCKET_META) + - nodeinfo1->node.local_v6_addrs * sizeof(struct NODEINFO_IPV6_ADDR) + - nodeinfo1->node.local_v4_subnets * sizeof(struct NODEINFO_IPV4_SUBNET) + - nodeinfo1->node.local_v6_subnets * sizeof(struct NODEINFO_IPV6_SUBNET); - memcpy(dyn_dst, dyn_src, dyn_sz); - bgp->local_node->node.ver = nodeinfo1->node.ver; - bgp->local_node->last_ver = new_ver; - DEBUG_INFO(DEBUG_CATEGORY_BGP, "Updated local_node from remote NODEINFO: node=%016llx", (unsigned long long)node_id); - } nodeinfo1->paths = paths; nodeinfo1->last_ver = new_ver;