@ -31,7 +31,7 @@ static void cm_start_local_scan(struct CONN_MGR_ENTRY* entry);
static void cm_idle_timer_cb ( void * arg ) ;
static void cm_deliver_result ( struct CONN_MGR_ENTRY * entry , int result ) ;
static void cm_bg_ping_timer_cb ( void * arg ) ;
static int cm_nat_compatible ( struct ETCP_SOCKET * our , uint8_t target_meta _type ) ;
static int cm_nat_compatible ( struct ETCP_SOCKET * our , uint8_t target_config_type , uint8_t target_nat _type ) ;
static uint16_t cm_get_node_min_rtt ( struct NODEINFO_Q * nq ) ;
static int cm_has_direct_ip ( struct NODEINFO_Q * nq ) ;
static int cm_has_local_addr ( struct NODEINFO_Q * nq ) ;
@ -333,14 +333,12 @@ static void cm_idle_timer_cb(void* arg) {
entry - > idle_timer = uasync_set_timeout ( mgr - > instance - > ua , CONN_MGR_IDLE_CHECK_INTERVAL_TB , entry , cm_idle_timer_cb , " conn_mgr_idle " ) ;
}
static int cm_nat_compatible ( struct ETCP_SOCKET * our , uint8_t target_meta_type ) {
uint8_t tt = target_meta_type ;
if ( tt = = NAT_VERIFIED_DIRECT ) tt = CFG_SERVER_TYPE_PUBLIC ;
else if ( tt > = NAT_VERIFIED_UNKNOWN ) tt = CFG_SERVER_TYPE_PUBLIC ;
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_NAT & & our - > nat_type = = NAT_TYPE _EIM & & tt = = CFG_SERVER_TYPE_PUBLIC ) return 1 ;
if ( ot = = CFG_SERVER_TYPE_NAT & & our - > nat_type = = NAT_TYPE _EIM & & tt = = CFG_SERVER_TYPE_NAT ) 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 ;
return 0 ;
}
@ -378,7 +376,7 @@ 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 ] . type = = CFG_SERVER_TYPE_PUBLIC | | metas [ j ] . type = = NAT_VERIFIED_EIM | | metas [ j ] . type = = NAT_VERIFIED_DIRECT ) )
( metas [ j ] . config_ type = = CFG_SERVER_TYPE_PUBLIC | | metas [ j ] . nat_ type = = NAT_VERIFIED_EIM | | metas [ j ] . nat_ type = = NAT_VERIFIED_DIRECT ) )
return 1 ;
}
}
@ -395,7 +393,7 @@ 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 ] . type = = CFG_SERVER_TYPE_PRIVATE )
if ( metas [ j ] . id = = addrs [ i ] . socket_id & & metas [ j ] . config_ type = = CFG_SERVER_TYPE_PRIVATE )
return 1 ;
}
}
@ -426,7 +424,7 @@ 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 ] . type ! = CFG_SERVER_TYPE_PRIVATE ) continue ;
if ( metas [ j ] . id ! = addrs [ i ] . socket_id | | metas [ j ] . config_ type ! = CFG_SERVER_TYPE_PRIVATE ) 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 ) {
@ -475,7 +473,7 @@ static void cm_start_phase_direct(struct CONN_MGR_ENTRY* entry) {
if ( metas [ j ] . id ! = addrs [ i ] . socket_id ) continue ;
struct ETCP_SOCKET * s = entry - > mgr - > instance - > etcp_sockets ;
while ( s ) {
int compat = cm_nat_compatible ( s , metas [ j ] . type ) ;
int compat = cm_nat_compatible ( s , metas [ j ] . config_type , metas [ j ] . nat_ type) ;
if ( compat & & s - > local_addr . ss_family = = AF_INET ) {
struct sockaddr_in sin ;
memset ( & sin , 0 , sizeof ( sin ) ) ;
@ -591,7 +589,7 @@ 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 ] . type = = CFG_SERVER_TYPE_PUBLIC | | metas [ j ] . type = = NAT_VERIFIED_EIM | | metas [ j ] . type = = NAT_VERIFIED_DIRECT ) ) {
( metas [ j ] . config_ type = = CFG_SERVER_TYPE_PUBLIC | | 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 ) ;