@ -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