diff options
-rw-r--r-- | src/vnet/session/session_lookup.c | 1 | ||||
-rw-r--r-- | src/vnet/tcp/builtin_client.c | 88 | ||||
-rw-r--r-- | src/vnet/tcp/builtin_client.h | 3 | ||||
-rw-r--r-- | src/vnet/tcp/tcp_test.c | 1 | ||||
-rw-r--r-- | test/test_tcp.py | 63 | ||||
-rw-r--r-- | 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 <time>][syn-timeout <time>][no-return][fifo-size <size>]" "[private-segment-count <count>][private-segment-size <bytes>[m|g]]" "[preallocate-fifos][preallocate-sessions][client-batch <batch-size>]" - "[uri <tcp://ip/port>]", + "[uri <tcp://ip/port>][test-bytes][no-output]", .function = test_tcp_clients_command_fn, .is_mp_safe = 1, }; diff --git a/src/vnet/tcp/builtin_client.h b/src/vnet/tcp/builtin_client.h index 400c55c8685..a214ae1e1b1 100644 --- a/src/vnet/tcp/builtin_client.h +++ b/src/vnet/tcp/builtin_client.h @@ -97,6 +97,9 @@ typedef struct int i_am_master; int drop_packets; /**< drop all packets */ u8 prealloc_fifos; /**< Request fifo preallocation */ + u8 no_output; + u8 test_bytes; + u8 test_failed; /* * Convenience diff --git a/src/vnet/tcp/tcp_test.c b/src/vnet/tcp/tcp_test.c index 00d574ad762..d26532d4596 100644 --- a/src/vnet/tcp/tcp_test.c +++ b/src/vnet/tcp/tcp_test.c @@ -1770,7 +1770,6 @@ VLIB_CLI_COMMAND (tcp_test_command, static) = }; /* *INDENT-ON* */ - /* * fd.io coding-style-patch-verification: ON * diff --git a/test/test_tcp.py b/test/test_tcp.py index 869ef1af9a6..ea6e024e2d5 100644 --- a/test/test_tcp.py +++ b/test/test_tcp.py @@ -3,6 +3,7 @@ import unittest from framework import VppTestCase, VppTestRunner +from vpp_ip_route import VppIpTable, VppIpRoute, VppRoutePath class TestTCP(VppTestCase): @@ -15,17 +16,75 @@ class TestTCP(VppTestCase): def setUp(self): super(TestTCP, self).setUp() self.vapi.session_enable_disable(is_enabled=1) + self.create_loopback_interfaces(range(2)) + + table_id = 0 + + for i in self.lo_interfaces: + i.admin_up() + + if table_id != 0: + tbl = VppIpTable(self, table_id) + tbl.add_vpp_config() + + i.set_table_ip4(table_id) + i.config_ip4() + table_id += 1 + + # Configure namespaces + self.vapi.app_namespace_add(namespace_id="0", + sw_if_index=self.loop0.sw_if_index) + self.vapi.app_namespace_add(namespace_id="1", + sw_if_index=self.loop1.sw_if_index) def tearDown(self): + for i in self.lo_interfaces: + i.unconfig_ip4() + i.set_table_ip4(0) + i.admin_down() + self.vapi.session_enable_disable(is_enabled=0) super(TestTCP, self).tearDown() - def test_tcp(self): + def test_tcp_unittest(self): """ TCP Unit Tests """ error = self.vapi.cli("test tcp all") if error: self.logger.critical(error) - self.assertEqual(error.find("Failed"), -1) + self.assertEqual(error.find("failed"), -1) + + def test_tcp_transfer(self): + """ TCP builtin client/server transfer """ + + # Add inter-table routes + ip_t01 = VppIpRoute(self, self.loop1.local_ip4, 32, + [VppRoutePath("0.0.0.0", + 0xffffffff, + nh_table_id=1)]) + ip_t10 = VppIpRoute(self, self.loop0.local_ip4, 32, + [VppRoutePath("0.0.0.0", + 0xffffffff, + nh_table_id=0)], table_id=1) + ip_t01.add_vpp_config() + ip_t10.add_vpp_config() + + # Start builtin server and client + uri = "tcp://" + self.loop0.local_ip4 + "/1234" + error = self.vapi.cli("test tcp server appns 0 fifo-size 4 uri " + + uri) + if error: + self.logger.critical(error) + + error = self.vapi.cli("test tcp client mbytes 10 appns 1 fifo-size 4" + + " no-output test-bytes syn-timeout 2 " + + " uri " + uri) + if error: + self.logger.critical(error) + self.assertEqual(error.find("failed"), -1) + + # Delete inter-table routes + ip_t01.remove_vpp_config() + ip_t10.remove_vpp_config() if __name__ == '__main__': unittest.main(testRunner=VppTestRunner) diff --git a/test/vpp_papi_provider.py b/test/vpp_papi_provider.py index a03677970bb..c6157d382d3 100644 --- a/test/vpp_papi_provider.py +++ b/test/vpp_papi_provider.py @@ -3010,3 +3010,18 @@ class VppPapiProvider(object): 'is_outbound': is_outbound, 'sa_id': sa_id, 'is_ip_any': is_ip_any}) + + def app_namespace_add(self, + namespace_id, + ip4_fib_id=0, + ip6_fib_id=0, + sw_if_index=0xFFFFFFFF, + secret=0): + return self.api( + self.papi.app_namespace_add_del, + {'secret': secret, + 'sw_if_index': sw_if_index, + 'ip4_fib_id': ip4_fib_id, + 'ip6_fib_id': ip6_fib_id, + 'namespace_id': namespace_id, + 'namespace_id_len': len(namespace_id)}) |