From 8e43d04ca4f4496aaefc4f5e2b6e1c0951624099 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Fri, 4 May 2018 15:46:57 -0700 Subject: session: cleanup session tx function - rework the function to declutter and avoid building more than one tx frame - add dual loop although benefits in my tests seem to be minimal - improve tcp/udp echo external apps. They have slightly better throughput than internal echo apps. - udp bugfixes Change-Id: Iea4a245b1b1bb407a7f403dedcce2664a49f774b Signed-off-by: Florin Coras --- src/vnet/session-apps/echo_client.c | 58 ++++++++++++++++++++++++++++++++++--- src/vnet/session-apps/echo_client.h | 2 ++ 2 files changed, 56 insertions(+), 4 deletions(-) (limited to 'src/vnet/session-apps') diff --git a/src/vnet/session-apps/echo_client.c b/src/vnet/session-apps/echo_client.c index d47b0d97337..3c1904cb55e 100644 --- a/src/vnet/session-apps/echo_client.c +++ b/src/vnet/session-apps/echo_client.c @@ -56,11 +56,60 @@ send_data_chunk (echo_client_main_t * ecm, session_t * s) s->bytes_to_send); if (!ecm->is_dgram) - rv = app_send_stream (&s->data, test_data + test_buf_offset, - bytes_this_chunk, 0); + { + if (ecm->no_copy) + { + svm_fifo_t *f = s->data.tx_fifo; + rv = clib_min (svm_fifo_max_enqueue (f), bytes_this_chunk); + svm_fifo_enqueue_nocopy (f, rv); + if (svm_fifo_set_event (f)) + { + session_fifo_event_t evt; + evt.fifo = f; + evt.event_type = FIFO_EVENT_APP_TX; + svm_queue_add (s->data.vpp_evt_q, (u8 *) & evt, 0); + } + } + else + rv = app_send_stream (&s->data, test_data + test_buf_offset, + bytes_this_chunk, 0); + } else - rv = app_send_dgram (&s->data, test_data + test_buf_offset, - bytes_this_chunk, 0); + { + if (ecm->no_copy) + { + session_dgram_hdr_t hdr; + svm_fifo_t *f = s->data.tx_fifo; + app_session_transport_t *at = &s->data.transport; + u32 max_enqueue = svm_fifo_max_enqueue (f); + + if (max_enqueue <= sizeof (session_dgram_hdr_t)) + return; + + max_enqueue -= sizeof (session_dgram_hdr_t); + rv = clib_min (max_enqueue, bytes_this_chunk); + + hdr.data_length = rv; + hdr.data_offset = 0; + clib_memcpy (&hdr.rmt_ip, &at->rmt_ip, sizeof (ip46_address_t)); + hdr.is_ip4 = at->is_ip4; + hdr.rmt_port = at->rmt_port; + clib_memcpy (&hdr.lcl_ip, &at->lcl_ip, sizeof (ip46_address_t)); + hdr.lcl_port = at->lcl_port; + svm_fifo_enqueue_nowait (f, sizeof (hdr), (u8 *) & hdr); + svm_fifo_enqueue_nocopy (f, rv); + if (svm_fifo_set_event (f)) + { + session_fifo_event_t evt; + evt.fifo = f; + evt.event_type = FIFO_EVENT_APP_TX; + svm_queue_add (s->data.vpp_evt_q, (u8 *) & evt, 0); + } + } + else + rv = app_send_dgram (&s->data, test_data + test_buf_offset, + bytes_this_chunk, 0); + } /* If we managed to enqueue data... */ if (rv > 0) @@ -591,6 +640,7 @@ echo_clients_command_fn (vlib_main_t * vm, ecm->test_failed = 0; ecm->vlib_main = vm; ecm->tls_engine = TLS_ENGINE_OPENSSL; + ecm->no_copy = 0; if (thread_main->n_vlib_mains > 1) clib_spinlock_init (&ecm->sessions_lock); diff --git a/src/vnet/session-apps/echo_client.h b/src/vnet/session-apps/echo_client.h index 344e43865b5..8c07b10fbba 100644 --- a/src/vnet/session-apps/echo_client.h +++ b/src/vnet/session-apps/echo_client.h @@ -64,6 +64,8 @@ typedef struct u32 private_segment_size; /**< size of private fifo segs */ u32 tls_engine; /**< TLS engine mbedtls/openssl */ u8 is_dgram; + u32 no_copy; /**< Don't memcpy data to tx fifo */ + /* * Test state variables */ -- cgit 1.2.3-korg