@ -18,6 +18,7 @@
static struct UTUN_INSTANCE * server_instance = NULL ;
static struct UTUN_INSTANCE * client_instance = NULL ;
static struct UASYNC * ua = NULL ;
static int test_completed = 0 ; // 0 = running, 1 = success, 2 = timeout/failure
static void * monitor_timeout_id = NULL ;
static void * test_timeout_id = NULL ;
@ -88,7 +89,7 @@ static void monitor_connections(void* arg) {
// Отменить таймаут теста для быстрого завершения
if ( test_timeout_id ) {
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [TEST] Cancelling test timeout for immediate exit \n " ) ;
uasync_cancel_timeout ( server_instance - > ua , test_timeout_id ) ;
uasync_cancel_timeout ( ua , test_timeout_id ) ;
test_timeout_id = NULL ;
}
return ;
@ -100,7 +101,7 @@ static void monitor_connections(void* arg) {
// Schedule next check
if ( ! test_completed ) {
monitor_timeout_id = uasync_set_timeout ( server_instance - > ua , 200 , NULL , monitor_connections ) ; // Check every 200ms for faster detection
monitor_timeout_id = uasync_set_timeout ( ua , 200 , NULL , monitor_connections ) ; // Check every 200ms for faster detection
}
}
@ -111,7 +112,7 @@ static void test_timeout(void* arg) {
test_completed = 2 ; // Timeout/failure
// Cancel the monitoring timeout since we're done
if ( monitor_timeout_id ) {
uasync_cancel_timeout ( server_instance - > ua , monitor_timeout_id ) ;
uasync_cancel_timeout ( ua , monitor_timeout_id ) ;
monitor_timeout_id = NULL ;
}
}
@ -129,18 +130,24 @@ int main() {
// Create server instance
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " Creating server instance... " ) ;
struct UASYNC * server_ ua = uasync_create ( ) ;
server_instance = utun_instance_create ( server_ ua, " test_server.conf " ) ;
ua = uasync_create ( ) ;
server_instance = utun_instance_create ( ua , " test_server.conf " ) ;
if ( ! server_instance ) {
DEBUG_ERROR ( DEBUG_CATEGORY_ETCP , " Failed to create server instance " ) ;
return 1 ;
}
// Initialize ETCP connections regardless of TUN state
if ( init_connections ( server_instance ) < 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_ETCP , " Failed to initialize server connections " ) ;
utun_instance_destroy ( server_instance ) ;
return 1 ;
}
// Check if TUN is disabled and handle accordingly
if ( server_instance - > tun . fd < 0 ) {
DEBUG_INFO ( DEBUG_CATEGORY_TUN , " Server TUN disabled - skipping full initialization " ) ;
DEBUG_INFO ( DEBUG_CATEGORY_TUN , " Server TUN disabled - skipping TUN initialization " ) ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " Server instance created successfully (node_id=%llx) " , ( unsigned long long ) server_instance - > node_id ) ;
// Skip to client creation
} else {
// Normal initialization for TUN-enabled mode
if ( utun_instance_init ( server_instance ) < 0 ) {
@ -159,19 +166,25 @@ int main() {
// Create client instance
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " Creating client instance... " ) ;
struct UASYNC * client_ua = uasync_create ( ) ;
client_instance = utun_instance_create ( client_ua , " test_client.conf " ) ;
client_instance = utun_instance_create ( ua , " test_client.conf " ) ;
if ( ! client_instance ) {
DEBUG_ERROR ( DEBUG_CATEGORY_ETCP , " Failed to create client instance " ) ;
utun_instance_destroy ( server_instance ) ;
return 1 ;
}
// Initialize ETCP connections regardless of TUN state
if ( init_connections ( client_instance ) < 0 ) {
DEBUG_ERROR ( DEBUG_CATEGORY_ETCP , " Failed to initialize client connections " ) ;
utun_instance_destroy ( server_instance ) ;
utun_instance_destroy ( client_instance ) ;
return 1 ;
}
// Check if TUN is disabled and handle accordingly
if ( client_instance - > tun . fd < 0 ) {
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " ℹ️ Client TUN disabled - skipping full initialization \n " ) ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " ℹ️ Client TUN disabled - skipping TUN initialization \n " ) ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " ✅ Client instance created successfully (node_id=%llx) \n " , ( unsigned long long ) client_instance - > node_id ) ;
// Skip to test execution
} else {
// Normal initialization for TUN-enabled mode
if ( utun_instance_init ( client_instance ) < 0 ) {
@ -192,8 +205,8 @@ int main() {
// Start monitoring
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " Starting connection monitoring... \n " ) ;
monitor_timeout_id = uasync_set_timeout ( server_ ua, 10 00 , NULL , monitor_connections ) ;
test_timeout_id = uasync_set_timeout ( server_ ua, TEST_TIMEOUT_MS , NULL , test_timeout ) ;
monitor_timeout_id = uasync_set_timeout ( ua , 100 , NULL , monitor_connections ) ;
test_timeout_id = uasync_set_timeout ( ua , TEST_TIMEOUT_MS , NULL , test_timeout ) ;
// Main event loop
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " Running event loop... \n \n " ) ;
@ -201,19 +214,15 @@ int main() {
// Give server time to fully initialize before client starts sending
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " Waiting 0.5 seconds for server initialization... \n " ) ;
for ( int i = 0 ; i < 50 ; i + + ) { // Reduced from 200 to 50 iterations (0.5 seconds)
if ( server_ua ) uasync_poll ( server_ua , 10 ) ;
if ( client_ua ) uasync_poll ( client_ua , 10 ) ;
usleep ( 10000 ) ; // 10ms
if ( ua ) uasync_poll ( ua , 10 ) ;
}
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " Starting connection attempts... \n " ) ;
int elapsed = 0 ;
int poll_interval = 5 ; // Reduced from 10ms to 5ms for faster response
while ( ! test_completed & & elapsed < TEST_TIMEOUT_MS + 500 ) {
if ( server_ua ) uasync_poll ( server_ua , poll_interval ) ;
if ( client_ua ) uasync_poll ( client_ua , poll_interval ) ;
if ( ua ) uasync_poll ( ua , poll_interval ) ;
usleep ( poll_interval * 1000 ) ; // microseconds
elapsed + = poll_interval ;
// Быстрый выход если подключение установлено
@ -225,31 +234,27 @@ int main() {
// Cleanup
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " \n Cleaning up... \n " ) ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] server_ua=%p, client_ ua=%p \n " , server_ua , client_ ua) ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] ua=%p \n " , ua ) ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] server_instance=%p, client_instance=%p \n " , server_instance , client_instance ) ;
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] monitor_timeout_id=%p, test_timeout_id=%p \n " , monitor_timeout_id , test_timeout_id ) ;
// СНАЧАЛА отменить таймеры пока uasync ещё жив
if ( monitor_timeout_id ) {
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] Canceling monitor timeout on valid uasync \n " ) ;
uasync_cancel_timeout ( server_ ua, monitor_timeout_id ) ;
uasync_cancel_timeout ( ua , monitor_timeout_id ) ;
monitor_timeout_id = NULL ;
}
if ( test_timeout_id ) {
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] Canceling test timeout on valid uasync \n " ) ;
uasync_cancel_timeout ( server_ ua, test_timeout_id ) ;
uasync_cancel_timeout ( ua , test_timeout_id ) ;
test_timeout_id = NULL ;
}
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] Timeouts canceled \n " ) ;
// Диагностика ресурсов перед cleanup
if ( server_ua ) {
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] Server resources before destroy: \n " ) ;
uasync_print_resources ( server_ua , " SERVER " ) ;
}
if ( client_ua ) {
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] Client resources before destroy: \n " ) ;
uasync_print_resources ( client_ua , " CLIENT " ) ;
if ( ua ) {
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " [CLEANUP] Shared uasync resources before destroy: \n " ) ;
uasync_print_resources ( ua , " SHARED " ) ;
}
// ПОТОМ уничтожить instances
@ -265,8 +270,10 @@ int main() {
}
// Cleanup uasync objects - now required since utun_instance_destroy no longer calls uasync_destroy
if ( server_ua ) uasync_destroy ( server_ua , 0 ) ;
if ( client_ua ) uasync_destroy ( client_ua , 0 ) ;
if ( ua ) {
uasync_destroy ( ua , 0 ) ;
ua = NULL ;
}
if ( test_completed = = 1 ) {
DEBUG_INFO ( DEBUG_CATEGORY_ETCP , " \n === TEST PASSED === \n " ) ;