From b795bd0c5cadfc6734ee8b2355cbc3965be0a1c1 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Thu, 14 Dec 2017 11:30:48 -0800 Subject: [PATCH] tcp: add builtin server/client transfer test Change-Id: Iab0baabf2f27bc7ad7fbf2d2789a493752b07d8a Signed-off-by: Florin Coras --- src/vnet/session/session_lookup.c | 1 + src/vnet/tcp/builtin_client.c | 88 +++++++++++++++++++++++++-------------- src/vnet/tcp/builtin_client.h | 3 ++ src/vnet/tcp/tcp_test.c | 1 - test/test_tcp.py | 63 +++++++++++++++++++++++++++- test/vpp_papi_provider.py | 15 +++++++ 6 files changed, 136 insertions(+), 35 deletions(-) diff --git a/src/vnet/session/session_lookup.c b/src/vnet/session/session_lookup.c index 68886a09456..77f6f4be78d 100644 --- a/src/vnet/session/session_lookup.c +++ b/src/vnet/session/session_lookup.c @@ -205,6 +205,7 @@ session_table_get_or_alloc (u8 fib_proto, u8 fib_index) vec_validate (fib_index_to_table_index[fib_proto], fib_index); fib_index_to_table_index[fib_proto][fib_index] = table_index; st->active_fib_proto = fib_proto; + session_table_init (st, fib_proto); return st; } else diff --git a/src/vnet/tcp/builtin_client.c b/src/vnet/tcp/builtin_client.c index b90773b7586..319b70f2008 100644 --- a/src/vnet/tcp/builtin_client.c +++ b/src/vnet/tcp/builtin_client.c @@ -112,13 +112,13 @@ static void receive_test_chunk (tclient_main_t * tm, session_t * s) { svm_fifo_t *rx_fifo = s->server_rx_fifo; - int n_read, test_bytes = 0; u32 my_thread_index = vlib_get_thread_index (); + int n_read, i; /* Allow enqueuing of new event */ // svm_fifo_unset_event (rx_fifo); - if (test_bytes) + if (tm->test_bytes) { n_read = svm_fifo_dequeue_nowait (rx_fifo, vec_len (tm->rx_buf[my_thread_index]), @@ -149,9 +149,8 @@ receive_test_chunk (tclient_main_t * tm, session_t * s) ed->data[0] = n_read; } - if (test_bytes) + if (tm->test_bytes) { - int i; for (i = 0; i < n_read; i++) { if (tm->rx_buf[my_thread_index][i] @@ -161,6 +160,7 @@ receive_test_chunk (tclient_main_t * tm, session_t * s) n_read, s->bytes_received + i, tm->rx_buf[my_thread_index][i], ((s->bytes_received + i) & 0xff)); + tm->test_failed = 1; } } } @@ -530,6 +530,10 @@ clients_connect (vlib_main_t * vm, u8 * uri, u32 n_clients) return 0; } +#define CLI_OUTPUT(_fmt, _args...) \ + if (!tm->no_output) \ + vlib_cli_output(vm, _fmt, ##_args) + static clib_error_t * test_tcp_clients_command_fn (vlib_main_t * vm, unformat_input_t * input, @@ -554,6 +558,9 @@ test_tcp_clients_command_fn (vlib_main_t * vm, tm->connections_per_batch = 1000; tm->private_segment_count = 0; tm->private_segment_size = 0; + tm->no_output = 0; + tm->test_bytes = 0; + tm->test_failed = 0; tm->vlib_main = vm; if (thread_main->n_vlib_mains > 1) clib_spinlock_init (&tm->sessions_lock); @@ -608,6 +615,10 @@ test_tcp_clients_command_fn (vlib_main_t * vm, appns_flags = APP_OPTIONS_FLAGS_USE_GLOBAL_SCOPE; else if (unformat (input, "secret %lu", &appns_secret)) ; + else if (unformat (input, "no-output")) + tm->no_output = 1; + else if (unformat (input, "test-bytes")) + tm->test_bytes = 1; else return clib_error_return (0, "unknown input `%U'", format_unformat_error, input); @@ -678,26 +689,26 @@ test_tcp_clients_command_fn (vlib_main_t * vm, switch (event_type) { case ~0: - vlib_cli_output (vm, "Timeout with only %d sessions active...", - tm->ready_connections); + CLI_OUTPUT ("Timeout with only %d sessions active...", + tm->ready_connections); + error = clib_error_return (0, "failed: syn timeout with %d sessions", + tm->ready_connections); goto cleanup; case 1: delta = vlib_time_now (vm) - time_before_connects; - if (delta != 0.0) - { - vlib_cli_output - (vm, "%d three-way handshakes in %.2f seconds, %.2f/sec", - n_clients, delta, ((f64) n_clients) / delta); - } + CLI_OUTPUT ("%d three-way handshakes in %.2f seconds %.2f/s", + n_clients, delta, ((f64) n_clients) / delta); tm->test_start_time = vlib_time_now (tm->vlib_main); - vlib_cli_output (vm, "Test started at %.6f", tm->test_start_time); + CLI_OUTPUT ("Test started at %.6f", tm->test_start_time); break; default: - vlib_cli_output (vm, "unexpected event(1): %d", event_type); + CLI_OUTPUT ("unexpected event(1): %d", event_type); + error = clib_error_return (0, "failed: unexpected event(1): %d", + event_type); goto cleanup; } @@ -707,17 +718,21 @@ test_tcp_clients_command_fn (vlib_main_t * vm, switch (event_type) { case ~0: - vlib_cli_output (vm, "Timeout with %d sessions still active...", - tm->ready_connections); + CLI_OUTPUT ("Timeout with %d sessions still active...", + tm->ready_connections); + error = clib_error_return (0, "failed: timeout with %d sessions", + tm->ready_connections); goto cleanup; case 2: tm->test_end_time = vlib_time_now (vm); - vlib_cli_output (vm, "Test finished at %.6f", tm->test_end_time); + CLI_OUTPUT ("Test finished at %.6f", tm->test_end_time); break; default: - vlib_cli_output (vm, "unexpected event(2): %d", event_type); + CLI_OUTPUT ("unexpected event(2): %d", event_type); + error = clib_error_return (0, "failed: unexpected event(2): %d", + event_type); goto cleanup; } @@ -727,18 +742,23 @@ test_tcp_clients_command_fn (vlib_main_t * vm, { total_bytes = (tm->no_return ? tm->tx_total : tm->rx_total); transfer_type = tm->no_return ? "half-duplex" : "full-duplex"; - vlib_cli_output (vm, - "%lld bytes (%lld mbytes, %lld gbytes) in %.2f seconds", - total_bytes, total_bytes / (1ULL << 20), - total_bytes / (1ULL << 30), delta); - vlib_cli_output (vm, "%.2f bytes/second %s", - ((f64) total_bytes) / (delta), transfer_type); - vlib_cli_output (vm, "%.4f gbit/second %s", - (((f64) total_bytes * 8.0) / delta / 1e9), - transfer_type); + CLI_OUTPUT ("%lld bytes (%lld mbytes, %lld gbytes) in %.2f seconds", + total_bytes, total_bytes / (1ULL << 20), + total_bytes / (1ULL << 30), delta); + CLI_OUTPUT ("%.2f bytes/second %s", ((f64) total_bytes) / (delta), + transfer_type); + CLI_OUTPUT ("%.4f gbit/second %s", + (((f64) total_bytes * 8.0) / delta / 1e9), transfer_type); } else - vlib_cli_output (vm, "zero delta-t?"); + { + CLI_OUTPUT ("zero delta-t?"); + error = clib_error_return (0, "failed: zero delta-t"); + goto cleanup; + } + + if (tm->test_bytes && tm->test_failed) + error = clib_error_return (0, "failed: test bytes"); cleanup: tm->run_test = 0; @@ -757,14 +777,18 @@ cleanup: int rv; da->app_index = tm->app_index; - rv = vnet_application_detach (da); if (rv) - vlib_cli_output (vm, "WARNING: app detach failed..."); + { + error = clib_error_return (0, "failed: app detach"); + CLI_OUTPUT ("WARNING: app detach failed..."); + } tm->test_client_attached = 0; tm->app_index = ~0; } - return 0; + if (error) + CLI_OUTPUT ("test failed"); + return error; } /* *INDENT-OFF* */ @@ -775,7 +799,7 @@ VLIB_CLI_COMMAND (test_clients_command, static) = "[test-timeout