@ -336,10 +336,10 @@ static void cm_idle_timer_cb(void* arg) {
static int cm_nat_compatible ( struct ETCP_SOCKET * our , uint8_t target_config_type , uint8_t target_nat_type ) {
uint8_t tt = target_nat_type > = NAT_VERIFIED_UNKNOWN ? CFG_SERVER_TYPE_PUBLIC : target_config_type ;
uint8_t ot = our - > type ;
if ( ot = = CFG_SERVER_TYPE_PUBLIC ) return 1 ;
if ( ot = = CFG_SERVER_TYPE_PUBLIC | | ot = = CFG_SERVER_TYPE_UNKNOWN ) return 1 ;
if ( ot = = CFG_SERVER_TYPE_NAT & & our - > nat_type = = NAT_VERIFIED_EIM & & tt = = CFG_SERVER_TYPE_PUBLIC ) return 1 ;
if ( ot = = CFG_SERVER_TYPE_NAT & & our - > nat_type = = NAT_VERIFIED_EIM & & tt = = CFG_SERVER_TYPE_NAT ) return 1 ;
if ( ot = = CFG_SERVER_TYPE_PRIVATE & & tt = = CFG_SERVER_TYPE_PRIVATE ) return 2 ;
if ( ( ot = = CFG_SERVER_TYPE_PRIVATE | | ot = = CFG_SERVER_TYPE_LOCAL ) & & tt = = CFG_SERVER_TYPE_PRIVATE ) return 2 ;
return 0 ;
}
@ -376,7 +376,8 @@ static int cm_has_direct_ip(struct NODEINFO_Q* nq) {
if ( addrs [ i ] . type = = ADDR_TYPE_REAL | | addrs [ i ] . type = = ADDR_TYPE_NAT ) {
for ( int j = 0 ; j < meta_count ; j + + ) {
if ( metas [ j ] . id = = addrs [ i ] . socket_id & &
( metas [ j ] . config_type = = CFG_SERVER_TYPE_PUBLIC | | metas [ j ] . nat_type = = NAT_VERIFIED_EIM | | metas [ j ] . nat_type = = NAT_VERIFIED_DIRECT ) )
( metas [ j ] . config_type = = CFG_SERVER_TYPE_PUBLIC | | metas [ j ] . config_type = = CFG_SERVER_TYPE_UNKNOWN
| | metas [ j ] . nat_type = = NAT_VERIFIED_EIM | | metas [ j ] . nat_type = = NAT_VERIFIED_DIRECT ) )
return 1 ;
}
}
@ -393,7 +394,8 @@ static int cm_has_local_addr(struct NODEINFO_Q* nq) {
for ( int i = 0 ; i < addr_count ; i + + ) {
if ( addrs [ i ] . type = = ADDR_TYPE_INTERFACE ) {
for ( int j = 0 ; j < meta_count ; j + + ) {
if ( metas [ j ] . id = = addrs [ i ] . socket_id & & metas [ j ] . config_type = = CFG_SERVER_TYPE_PRIVATE )
if ( metas [ j ] . id = = addrs [ i ] . socket_id & &
( metas [ j ] . config_type = = CFG_SERVER_TYPE_PRIVATE | | metas [ j ] . config_type = = CFG_SERVER_TYPE_LOCAL ) )
return 1 ;
}
}
@ -424,10 +426,11 @@ static void cm_start_local_scan(struct CONN_MGR_ENTRY* entry) {
for ( int i = 0 ; i < addr_count ; i + + ) {
if ( addrs [ i ] . type ! = ADDR_TYPE_INTERFACE ) continue ;
for ( int j = 0 ; j < meta_count ; j + + ) {
if ( metas [ j ] . id ! = addrs [ i ] . socket_id | | metas [ j ] . config_type ! = CFG_SERVER_TYPE_PRIVATE ) continue ;
if ( metas [ j ] . id ! = addrs [ i ] . socket_id | |
( metas [ j ] . config_type ! = CFG_SERVER_TYPE_PRIVATE & & metas [ j ] . config_type ! = CFG_SERVER_TYPE_LOCAL ) ) continue ;
struct ETCP_SOCKET * s = entry - > mgr - > instance - > etcp_sockets ;
while ( s ) {
if ( s - > type = = CFG_SERVER_TYPE_PRIVATE & & s - > local_addr . ss_family = = AF_INET ) {
if ( ( s - > type = = CFG_SERVER_TYPE_PRIVATE | | s - > type = = CFG_SERVER_TYPE_LOCAL ) & & s - > local_addr . ss_family = = AF_INET ) {
struct sockaddr_in sin ;
memset ( & sin , 0 , sizeof ( sin ) ) ;
sin . sin_family = AF_INET ;
@ -589,7 +592,8 @@ static void cm_start_phase_reverse(struct CONN_MGR_ENTRY* entry) {
if ( addrs [ i ] . type ! = ADDR_TYPE_REAL & & addrs [ i ] . type ! = ADDR_TYPE_NAT ) continue ;
for ( int j = 0 ; j < meta_count ; j + + ) {
if ( metas [ j ] . id = = addrs [ i ] . socket_id & &
( metas [ j ] . config_type = = CFG_SERVER_TYPE_PUBLIC | | metas [ j ] . nat_type = = NAT_VERIFIED_EIM | | metas [ j ] . nat_type = = NAT_VERIFIED_DIRECT ) ) {
( metas [ j ] . config_type = = CFG_SERVER_TYPE_PUBLIC | | metas [ j ] . config_type = = CFG_SERVER_TYPE_UNKNOWN
| | metas [ j ] . nat_type = = NAT_VERIFIED_EIM | | metas [ j ] . nat_type = = NAT_VERIFIED_DIRECT ) ) {
out_addrs [ direct_count ] . type = addrs [ i ] . type ;
memcpy ( out_addrs [ direct_count ] . ip , addrs [ i ] . addr , 4 ) ;
out_addrs [ direct_count ] . port = htons ( addrs [ i ] . port ) ;
@ -852,7 +856,7 @@ static void cm_handle_direct_req(struct ETCP_CONN* conn, const uint8_t* data, si
( void ) sock_id ; ( void ) type ;
struct ETCP_SOCKET * s = conn - > instance - > etcp_sockets ;
while ( s ) {
if ( s - > type = = CFG_SERVER_TYPE_PUBLIC & & s - > local_addr . ss_family = = AF_INET ) {
if ( ( s - > type = = CFG_SERVER_TYPE_PUBLIC | | s - > type = = CFG_SERVER_TYPE_UNKNOWN ) & & s - > local_addr . ss_family = = AF_INET ) {
struct sockaddr_in sin ;
memset ( & sin , 0 , sizeof ( sin ) ) ; sin . sin_family = AF_INET ;
memcpy ( & sin . sin_addr . s_addr , ip , 4 ) ; sin . sin_port = port ;