@@ -208,7 +208,7 @@ echo_client_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node,
208208 connections_this_batch =
209209 ecm -> connections_this_batch_by_thread [my_thread_index ];
210210
211- if ((ecm -> run_test == 0 ) ||
211+ if ((ecm -> run_test != ECHO_CLIENTS_RUNNING ) ||
212212 ((vec_len (connection_indices ) == 0 )
213213 && vec_len (connections_this_batch ) == 0 ))
214214 return 0 ;
@@ -352,6 +352,16 @@ echo_clients_init (vlib_main_t * vm)
352352 return 0 ;
353353}
354354
355+ static void
356+ echo_clients_session_disconnect (stream_session_t * s )
357+ {
358+ echo_client_main_t * ecm = & echo_client_main ;
359+ vnet_disconnect_args_t _a , * a = & _a ;
360+ a -> handle = session_handle (s );
361+ a -> app_index = ecm -> app_index ;
362+ vnet_disconnect_session (a );
363+ }
364+
355365static int
356366echo_clients_session_connected_callback (u32 app_index , u32 api_context ,
357367 stream_session_t * s , u8 is_fail )
@@ -361,6 +371,9 @@ echo_clients_session_connected_callback (u32 app_index, u32 api_context,
361371 u32 session_index ;
362372 u8 thread_index ;
363373
374+ if (PREDICT_FALSE (ecm -> run_test != ECHO_CLIENTS_STARTING ))
375+ return -1 ;
376+
364377 if (is_fail )
365378 {
366379 clib_warning ("connection %d failed!" , api_context );
@@ -407,7 +420,7 @@ echo_clients_session_connected_callback (u32 app_index, u32 api_context,
407420 __sync_fetch_and_add (& ecm -> ready_connections , 1 );
408421 if (ecm -> ready_connections == ecm -> expected_connections )
409422 {
410- ecm -> run_test = 1 ;
423+ ecm -> run_test = ECHO_CLIENTS_RUNNING ;
411424 /* Signal the CLI process that the action is starting... */
412425 signal_evt_to_cli (1 );
413426 }
@@ -447,6 +460,12 @@ echo_clients_rx_callback (stream_session_t * s)
447460 echo_client_main_t * ecm = & echo_client_main ;
448461 eclient_session_t * sp ;
449462
463+ if (PREDICT_FALSE (ecm -> run_test != ECHO_CLIENTS_RUNNING ))
464+ {
465+ echo_clients_session_disconnect (s );
466+ return -1 ;
467+ }
468+
450469 sp = pool_elt_at_index (ecm -> sessions ,
451470 s -> server_rx_fifo -> client_session_index );
452471 receive_data_chunk (ecm , sp );
@@ -624,6 +643,7 @@ echo_clients_command_fn (vlib_main_t * vm,
624643 ecm -> vlib_main = vm ;
625644 ecm -> tls_engine = TLS_ENGINE_OPENSSL ;
626645 ecm -> no_copy = 0 ;
646+ ecm -> run_test = ECHO_CLIENTS_STARTING ;
627647
628648 if (thread_main -> n_vlib_mains > 1 )
629649 clib_spinlock_init (& ecm -> sessions_lock );
@@ -825,7 +845,7 @@ echo_clients_command_fn (vlib_main_t * vm,
825845 error = clib_error_return (0 , "failed: test bytes" );
826846
827847cleanup :
828- ecm -> run_test = 0 ;
848+ ecm -> run_test = ECHO_CLIENTS_EXITING ;
829849 vlib_process_wait_for_event_or_clock (vm , 10e-3 );
830850 for (i = 0 ; i < vec_len (ecm -> connection_index_by_thread ); i ++ )
831851 {
0 commit comments