diff --git a/src/etcp_connections.c b/src/etcp_connections.c index 0d1c966a..ed3dd989 100644 --- a/src/etcp_connections.c +++ b/src/etcp_connections.c @@ -1295,14 +1295,14 @@ static void send_init_response(struct ETCP_SOCKET* e_sock, struct ETCP_DGRAM* pk } } /* Self-detection: if my IP is non-local, I'm on a public IP */ - if (e_sock->nat_type != NAT_VERIFIED_DIRECT && e_sock->local_addr.ss_family == AF_INET) { - uint32_t my_ip = ((struct sockaddr_in*)&e_sock->local_addr)->sin_addr.s_addr; + if (e_sock->nat_type != NAT_VERIFIED_DIRECT && e_sock->interface_addr.ss_family == AF_INET) { + uint32_t my_ip = ((struct sockaddr_in*)&e_sock->interface_addr)->sin_addr.s_addr; if (my_ip != 0 && !is_local_subnet(my_ip)) { e_sock->nat_type = NAT_VERIFIED_DIRECT; struct sockaddr_in* nat_sin = (struct sockaddr_in*)&e_sock->nat_addr; nat_sin->sin_family = AF_INET; nat_sin->sin_addr.s_addr = my_ip; - nat_sin->sin_port = ((struct sockaddr_in*)&e_sock->local_addr)->sin_port; + nat_sin->sin_port = ((struct sockaddr_in*)&e_sock->interface_addr)->sin_port; if (link->etcp->instance->bgp) { route_bgp_update_my_nodeinfo(link->etcp->instance->bgp->instance, link->etcp->instance->bgp); struct ROUTE_BGP* bgp = link->etcp->instance->bgp; @@ -1421,12 +1421,14 @@ static int handle_init_response_client(struct ETCP_SOCKET* e_sock, struct ETCP_D link->nat_changes_count); } - // Update socket NAT address + // Update socket NAT address (only if not already verified) { - struct sockaddr_in* sin = (struct sockaddr_in*)&e_sock->nat_addr; - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = new_nat_ip; - sin->sin_port = htons(new_nat_port); + if (e_sock->nat_type < NAT_VERIFIED_UNKNOWN) { + struct sockaddr_in* sin = (struct sockaddr_in*)&e_sock->nat_addr; + sin->sin_family = AF_INET; + sin->sin_addr.s_addr = new_nat_ip; + sin->sin_port = htons(new_nat_port); + } } } else { // Legacy format without NAT info