@ -256,6 +256,20 @@ static int run_traffic(int n, uint64_t timeout_ms) {
}
}
// Проверяет, что конкретный линк (по серверному порту) реально перенёс данные.
// Линк может пропустить короткий burst из-за keepalive-стабилизации link_status,
// поэтому повторяем до нескольких keepalive-тиков. Возвращает 0 если линк нёс трафик.
static int check_link_traffic ( uint16_t srv_port , const char * label ) {
for ( int attempt = 0 ; attempt < 6 ; attempt + + ) {
uint64_t before = client_link_acked ( srv_port ) ;
if ( run_traffic ( TRAFFIC_PACKETS , TRAFFIC_TIMEOUT_MS ) ! = 0 ) return - 1 ;
if ( client_link_acked ( srv_port ) > before ) return 0 ;
uasync_poll ( ua , 50 ) ;
}
printf ( " [%s] link never carried traffic \n " , label ) ;
return - 1 ;
}
// ===== instance lifecycle =====
static int start_instances ( void ) {
@ -306,9 +320,7 @@ static int session_a(void) {
// -- per-link трафик на исходном линке --
printf ( " [A] traffic on initial link... \n " ) ;
uint64_t ack0 = client_link_acked ( server_port ) ;
CHECK ( run_traffic ( TRAFFIC_PACKETS , TRAFFIC_TIMEOUT_MS ) = = 0 , " initial traffic failed " ) ;
CHECK ( client_link_acked ( server_port ) > ack0 , " initial link carried no traffic " ) ;
CHECK ( check_link_traffic ( server_port , " initial " ) = = 0 , " initial link carried no traffic " ) ;
CHECK ( sc - > reinit_count = = srv_reinit0 & & cc - > reinit_count = = cli_reinit0 , " reinit during initial traffic " ) ;
// -- V1: клиент дозванивается до нового серверного сокета S1 --
@ -324,9 +336,7 @@ static int session_a(void) {
g_sock = s1 ;
CHECK ( poll_until ( c_socket_link_up , LINK_UP_TIMEOUT_MS , " V1 link up (server) " ) = = 0 , " V1 server link did not come up " ) ;
CHECK ( sc - > reinit_count = = srv_reinit0 & & cc - > reinit_count = = cli_reinit0 , " reinit during V1 " ) ;
ack0 = client_link_acked ( sp1 ) ;
CHECK ( run_traffic ( TRAFFIC_PACKETS , TRAFFIC_TIMEOUT_MS ) = = 0 , " V1 traffic failed " ) ;
CHECK ( client_link_acked ( sp1 ) > ack0 , " V1 link carried no traffic " ) ;
CHECK ( check_link_traffic ( sp1 , " V1 " ) = = 0 , " V1 link carried no traffic " ) ;
// -- V2: сервер дозванивается до клиента --
int sp2 = alloc_port ( ) ;
@ -341,9 +351,7 @@ static int session_a(void) {
g_conn = cc ; g_port = sp2 ;
CHECK ( poll_until ( c_link_on_port_up , LINK_UP_TIMEOUT_MS , " V2 link up (client) " ) = = 0 , " V2 client link did not come up " ) ;
CHECK ( sc - > reinit_count = = srv_reinit0 & & cc - > reinit_count = = cli_reinit0 , " reinit during V2 " ) ;
ack0 = client_link_acked ( sp2 ) ;
CHECK ( run_traffic ( TRAFFIC_PACKETS , TRAFFIC_TIMEOUT_MS ) = = 0 , " V2 traffic failed " ) ;
CHECK ( client_link_acked ( sp2 ) > ack0 , " V2 link carried no traffic " ) ;
CHECK ( check_link_traffic ( sp2 , " V2 " ) = = 0 , " V2 link carried no traffic " ) ;
printf ( " [A] after adds: server links_up=%d/%d client links_up=%d/%d \n " ,
count_links_up ( sc ) , count_links ( sc ) , count_links_up ( cc ) , count_links ( cc ) ) ;