25 #include <vpp/app/version.h> 27 #define TCP_BUILTIN_CLIENT_DBG (0) 53 session_fifo_event_t evt;
54 static int serial_number = 0;
61 bytes_this_chunk =
vec_len (test_data) - test_buf_offset;
68 test_data + test_buf_offset);
82 .format =
"tx-enq: xfer %d bytes, sent %u remain %u",
83 .format_args =
"i4i4i4",
102 evt.event_id = serial_number++;
126 tm->
rx_buf[my_thread_index]);
141 .format =
"rx-deq: %d bytes",
150 ed->data[0] = n_read;
156 for (i = 0; i < n_read; i++)
158 if (tm->
rx_buf[my_thread_index][i]
161 clib_warning (
"read %d error at byte %lld, 0x%x not 0x%x",
163 tm->
rx_buf[my_thread_index][i],
182 u32 *connection_indices;
183 u32 *connections_this_batch;
184 u32 nconnections_this_batch;
187 connections_this_batch =
191 ((
vec_len (connection_indices) == 0)
192 &&
vec_len (connections_this_batch) == 0))
198 nconnections_this_batch =
201 ASSERT (nconnections_this_batch > 0);
202 vec_validate (connections_this_batch, nconnections_this_batch - 1);
204 connection_indices +
vec_len (connection_indices)
205 - nconnections_this_batch,
206 nconnections_this_batch *
sizeof (
u32));
207 _vec_len (connection_indices) -= nconnections_this_batch;
226 for (i = 0; i <
vec_len (connections_this_batch); i++)
244 u32 index, thread_index;
251 &index, &thread_index);
278 connections_this_batch;
286 .name =
"builtin-tcp-client",
288 .state = VLIB_NODE_STATE_DISABLED,
324 for (i = 0; i < num_threads; i++)
352 ASSERT (s->thread_index == thread_index);
365 memset (session, 0,
sizeof (*session));
366 session_index = session - tm->
sessions;
434 u8 segment_name[128];
435 u32 segment_name_length, prealloc_fifos;
438 segment_name_length =
ARRAY_LEN (segment_name);
440 memset (a, 0,
sizeof (*a));
441 memset (options, 0,
sizeof (options));
444 a->segment_name = segment_name;
445 a->segment_name_length = segment_name_length;
460 a->options = options;
499 for (i = 0; i < n_clients; i++)
501 memset (a, 0,
sizeof (*a));
503 a->uri = (
char *) uri;
527 uword *event_data = 0, event_type;
528 u8 *default_connect_uri = (
u8 *)
"tcp://6.0.1.1/1234", *uri;
529 u64 tmp, total_bytes;
530 f64 test_timeout = 20.0, syn_timeout = 20.0, delta;
531 f64 time_before_connects;
533 int preallocate_sessions = 0;
550 if (
unformat (input,
"nclients %d", &n_clients))
552 else if (
unformat (input,
"mbytes %lld", &tmp))
554 else if (
unformat (input,
"gbytes %lld", &tmp))
560 else if (
unformat (input,
"test-timeout %f", &test_timeout))
562 else if (
unformat (input,
"syn-timeout %f", &syn_timeout))
564 else if (
unformat (input,
"no-return"))
568 else if (
unformat (input,
"private-segment-count %d",
571 else if (
unformat (input,
"private-segment-size %U",
574 if (tmp >= 0x100000000ULL)
576 (0,
"private segment size %lld (%llu) too large", tmp, tmp);
579 else if (
unformat (input,
"preallocate-fifos"))
581 else if (
unformat (input,
"preallocate-sessions"))
582 preallocate_sessions = 1;
606 uri = default_connect_uri;
610 #if TCP_BUILTIN_CLIENT_PTHREAD 630 VLIB_NODE_STATE_POLLING);
632 if (preallocate_sessions)
635 for (i = 0; i < n_clients; i++)
637 for (i = 0; i < n_clients; i++)
661 (vm,
"%d three-way handshakes in %.2f seconds, %.2f/sec",
662 n_clients, delta, ((
f64) n_clients) / delta);
699 transfer_type = tm->
no_return ?
"half-duplex" :
"full-duplex";
701 "%lld bytes (%lld mbytes, %lld gbytes) in %.2f seconds",
702 total_bytes, total_bytes / (1ULL << 20),
703 total_bytes / (1ULL << 30), delta);
705 ((
f64) total_bytes) / (delta), transfer_type);
707 (((
f64) total_bytes * 8.0) / delta / 1e9),
743 .path =
"test tcp clients",
744 .short_help =
"test tcp clients [nclients %d] [[m|g]bytes <bytes>] " 745 "[test-timeout <time>][syn-timeout <time>][no-return][fifo-size <size>]" 746 "[private-segment-count <count>][private-segment-size <bytes>[m|g]]" 747 "[preallocate-fifos][preallocate-sessions][client-batch <batch-size>]" 748 "[uri <tcp://ip/port>]",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
void test_bytes(builtin_server_main_t *bsm, int actual_transfer)
unix_shared_memory_queue_t * vl_input_queue
vpe input queue
vlib_main_t vlib_global_main
static session_cb_vft_t builtin_clients
u32 app_index
app index after attach
static int builtin_session_connected_callback(u32 app_index, u32 api_context, stream_session_t *s, u8 is_fail)
sll srl srl sll sra u16x4 i
static void builtin_session_disconnect_callback(stream_session_t *s)
static f64 vlib_process_wait_for_event_or_clock(vlib_main_t *vm, f64 dt)
Suspend a cooperative multi-tasking thread Waits for an event, or for the indicated number of seconds...
vlib_node_runtime_t node_runtime
u64 bytes_to_send
Bytes to send.
static void send_test_chunk(tclient_main_t *tm, session_t *s)
struct _vnet_connect_args vnet_connect_args_t
static void builtin_session_reset_callback(stream_session_t *s)
u8 * connect_uri
URI for slave's connect.
unix_shared_memory_queue_t * vl_input_queue
static f64 vlib_time_now(vlib_main_t *vm)
u32 cli_node_index
cli process node index
static_always_inline void clib_spinlock_unlock_if_init(clib_spinlock_t *p)
static int create_api_loopback(tclient_main_t *tm)
u32 my_client_index
loopback API client handle
#define vec_add1(V, E)
Add 1 element to end of vector (unspecified alignment).
clib_error_t * tcp_test_clients_main_init(vlib_main_t *vm)
u8 ** rx_buf
intermediate rx buffers
u32 ** connections_this_batch_by_thread
active connection batch
unix_shared_memory_queue_t ** vpp_event_queue
static clib_error_t * test_tcp_clients_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
vlib_main_t ** vlib_mains
svm_fifo_t * server_rx_fifo
#define vec_reset_length(v)
Reset vector length to zero NULL-pointer tolerant.
#define vlib_worker_thread_barrier_sync(X)
struct _svm_fifo svm_fifo_t
static uword vlib_process_suspend(vlib_main_t *vm, f64 dt)
Suspend a vlib cooperative multi-tasking thread for a period of time.
static void * tclient_thread_fn(void *arg)
#define VLIB_INIT_FUNCTION(x)
static uword vlib_process_get_events(vlib_main_t *vm, uword **data_vector)
Return the first event type which has occurred and a vector of per-event data of that type...
struct _vnet_disconnect_args_t vnet_disconnect_args_t
static u32 svm_fifo_max_dequeue(svm_fifo_t *f)
struct _stream_session_cb_vft session_cb_vft_t
u32 expected_connections
Number of clients/connections.
static void signal_evt_to_cli(int code)
#define clib_error_return(e, args...)
struct vl_shmem_hdr_ * shmem_hdr
Binary API shared-memory segment header pointer.
void stream_session_cleanup(stream_session_t *s)
Cleanup transport and session state.
struct _stream_session_t stream_session_t
volatile u32 ready_connections
vlib_node_registration_t builtin_client_node
(constructor) VLIB_REGISTER_NODE (builtin_client_node)
u8 prealloc_fifos
Request fifo preallocation.
struct _vnet_app_attach_args_t vnet_app_attach_args_t
static void clib_spinlock_init(clib_spinlock_t *p)
vl_shmem_hdr_t * shmem_hdr
int unix_shared_memory_queue_add(unix_shared_memory_queue_t *q, u8 *elem, int nowait)
u32 ** connection_index_by_thread
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
static void vlib_process_signal_event(vlib_main_t *vm, uword node_index, uword type_opaque, uword data)
int start_tx_pthread(tclient_main_t *tm)
Start a transmit thread.
static void cleanup(void)
u32 node_index
Node index.
clib_error_t * vnet_session_enable_disable(vlib_main_t *vm, u8 is_en)
API main structure, used by both vpp and binary API clients.
static int tcp_test_clients_init(vlib_main_t *vm)
#define pool_free(p)
Free a pool.
static u8 svm_fifo_set_event(svm_fifo_t *f)
Sets fifo event flag.
static unix_shared_memory_queue_t * session_manager_get_vpp_event_queue(u32 thread_index)
pthread_t client_thread_handle
static_always_inline uword vlib_get_thread_index(void)
static vlib_process_t * vlib_get_current_process(vlib_main_t *vm)
u8 * format_stream_session(u8 *s, va_list *args)
Format stream session as per the following format.
#define vec_free(V)
Free vector's memory (no header).
static void signal_evt_to_cli_i(int *code)
tclient_main_t tclient_main
#define clib_warning(format, args...)
static int builtin_session_create_callback(stream_session_t *s)
static void receive_test_chunk(tclient_main_t *tm, session_t *s)
#define clib_memcpy(a, b, c)
void vl_api_rpc_call_main_thread(void *fp, u8 *data, u32 data_length)
u32 vl_api_memclnt_create_internal(char *, unix_shared_memory_queue_t *)
clib_spinlock_t sessions_lock
volatile int run_test
Signal start of test.
int vnet_disconnect_session(vnet_disconnect_args_t *a)
#define ELOG_TYPE_DECLARE(f)
int svm_fifo_enqueue_nowait(svm_fifo_t *f, u32 max_bytes, u8 *copy_from_here)
svm_fifo_t * server_tx_fifo
static stream_session_t * stream_session_get_if_valid(u64 si, u32 thread_index)
#define VLIB_CLI_COMMAND(x,...)
int vnet_application_attach(vnet_app_attach_args_t *a)
Attaches application.
static void stream_session_parse_handle(u64 handle, u32 *index, u32 *thread_index)
#define pool_put_index(p, i)
Free pool element with given index.
#define vec_delete(V, N, M)
Delete N elements starting at element M.
#define TCP_BUILTIN_CLIENT_DBG
static void vlib_node_set_state(vlib_main_t *vm, u32 node_index, vlib_node_state_t new_state)
Set node dispatch state.
struct _vnet_app_detach_args_t vnet_app_detach_args_t
u32 connections_per_batch
Connections to rx/tx at once.
static int builtin_server_rx_callback(stream_session_t *s)
static u64 stream_session_handle(stream_session_t *s)
int svm_fifo_dequeue_drop(svm_fifo_t *f, u32 max_bytes)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
static uword builtin_client_node_fn(vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame)
static int attach_builtin_test_clients_app(void)
void clients_connect(vlib_main_t *vm, u8 *uri, u32 n_clients)
void vlib_worker_thread_barrier_release(vlib_main_t *vm)
#define VLIB_REGISTER_NODE(x,...)
static vlib_thread_main_t * vlib_get_thread_main()
u32 private_segment_size
size of private fifo segs
u32 private_segment_count
Number of private fifo segs.
int vnet_connect_uri(vnet_connect_args_t *a)
int vnet_application_detach(vnet_app_detach_args_t *a)
void vlib_cli_output(vlib_main_t *vm, char *fmt,...)
static_always_inline void clib_spinlock_lock_if_init(clib_spinlock_t *p)
int svm_fifo_dequeue_nowait(svm_fifo_t *f, u32 max_bytes, u8 *copy_here)
session_t * sessions
Session pool, shared.
u8 * connect_test_data
Pre-computed test data.