From 460dce6e2d017cc7b2151fd0fa61d464570489d7 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Fri, 27 Jul 2018 05:45:06 -0700 Subject: vcl: add read/write udp support Change-Id: Ie6171c12055cde6915856de340839f5da1b1b1da Signed-off-by: Florin Coras --- src/vnet/session-apps/echo_server.c | 10 ++++---- src/vnet/session/application.c | 6 +++-- src/vnet/session/application_interface.h | 39 +++++++++++++++++++++----------- src/vnet/session/session.h | 4 ++-- 4 files changed, 38 insertions(+), 21 deletions(-) (limited to 'src/vnet') diff --git a/src/vnet/session-apps/echo_server.c b/src/vnet/session-apps/echo_server.c index 770f4ba7337..14ab36d796c 100644 --- a/src/vnet/session-apps/echo_server.c +++ b/src/vnet/session-apps/echo_server.c @@ -211,14 +211,16 @@ echo_server_rx_callback (stream_session_t * s) actual_transfer = app_recv_stream_raw (rx_fifo, esm->rx_buf[thread_index], max_transfer, - 0 /* don't clear event */ ); + 0 /* don't clear event */ , + 0 /* peek */ ); } else { actual_transfer = app_recv_dgram_raw (rx_fifo, esm->rx_buf[thread_index], max_transfer, &at, - 0 /* don't clear event */ ); + 0 /* don't clear event */ , + 0 /* peek */ ); } ASSERT (actual_transfer == max_transfer); /* test_bytes (esm, actual_transfer); */ @@ -232,14 +234,14 @@ echo_server_rx_callback (stream_session_t * s) n_written = app_send_stream_raw (tx_fifo, esm->vpp_queue[thread_index], esm->rx_buf[thread_index], - actual_transfer, 0); + actual_transfer, FIFO_EVENT_APP_TX, 0); } else { n_written = app_send_dgram_raw (tx_fifo, &at, esm->vpp_queue[s->thread_index], esm->rx_buf[thread_index], - actual_transfer, 0); + actual_transfer, FIFO_EVENT_APP_TX, 0); } if (n_written != max_transfer) diff --git a/src/vnet/session/application.c b/src/vnet/session/application.c index 99f0dff7fab..757e12e1b58 100644 --- a/src/vnet/session/application.c +++ b/src/vnet/session/application.c @@ -841,7 +841,8 @@ app_send_io_evt_rx (application_t * app, stream_session_t * s, u8 lock) svm_msg_q_msg_t msg; svm_msg_q_t *mq; - if (PREDICT_FALSE (s->session_state != SESSION_STATE_READY)) + if (PREDICT_FALSE (s->session_state != SESSION_STATE_READY + && s->session_state != SESSION_STATE_LISTENING)) { /* Session is closed so app will never clean up. Flush rx fifo */ if (s->session_state == SESSION_STATE_CLOSED) @@ -917,8 +918,9 @@ app_send_io_evt_tx (application_t * app, stream_session_t * s, u8 lock) typedef int (app_send_evt_handler_fn) (application_t *app, stream_session_t *s, u8 lock); -static app_send_evt_handler_fn * const app_send_evt_handler_fns[2] = { +static app_send_evt_handler_fn * const app_send_evt_handler_fns[3] = { app_send_io_evt_rx, + 0, app_send_io_evt_tx, }; /* *INDENT-ON* */ diff --git a/src/vnet/session/application_interface.h b/src/vnet/session/application_interface.h index ffe2a64c245..daba169a297 100644 --- a/src/vnet/session/application_interface.h +++ b/src/vnet/session/application_interface.h @@ -354,7 +354,8 @@ app_send_io_evt_to_vpp (svm_msg_q_t * mq, svm_fifo_t * f, u8 evt_type, always_inline int app_send_dgram_raw (svm_fifo_t * f, app_session_transport_t * at, - svm_msg_q_t * vpp_evt_q, u8 * data, u32 len, u8 noblock) + svm_msg_q_t * vpp_evt_q, u8 * data, u32 len, u8 evt_type, + u8 noblock) { u32 max_enqueue, actual_write; session_dgram_hdr_t hdr; @@ -379,7 +380,7 @@ app_send_dgram_raw (svm_fifo_t * f, app_session_transport_t * at, if ((rv = svm_fifo_enqueue_nowait (f, actual_write, data)) > 0) { if (svm_fifo_set_event (f)) - app_send_io_evt_to_vpp (vpp_evt_q, f, FIFO_EVENT_APP_TX, noblock); + app_send_io_evt_to_vpp (vpp_evt_q, f, evt_type, noblock); } ASSERT (rv); return rv; @@ -389,19 +390,19 @@ always_inline int app_send_dgram (app_session_t * s, u8 * data, u32 len, u8 noblock) { return app_send_dgram_raw (s->tx_fifo, &s->transport, s->vpp_evt_q, data, - len, noblock); + len, FIFO_EVENT_APP_TX, noblock); } always_inline int app_send_stream_raw (svm_fifo_t * f, svm_msg_q_t * vpp_evt_q, u8 * data, - u32 len, u8 noblock) + u32 len, u8 evt_type, u8 noblock) { int rv; if ((rv = svm_fifo_enqueue_nowait (f, len, data)) > 0) { if (svm_fifo_set_event (f)) - app_send_io_evt_to_vpp (vpp_evt_q, f, FIFO_EVENT_APP_TX, noblock); + app_send_io_evt_to_vpp (vpp_evt_q, f, evt_type, noblock); } return rv; } @@ -409,7 +410,8 @@ app_send_stream_raw (svm_fifo_t * f, svm_msg_q_t * vpp_evt_q, u8 * data, always_inline int app_send_stream (app_session_t * s, u8 * data, u32 len, u8 noblock) { - return app_send_stream_raw (s->tx_fifo, s->vpp_evt_q, data, len, noblock); + return app_send_stream_raw (s->tx_fifo, s->vpp_evt_q, data, len, + FIFO_EVENT_APP_TX, noblock); } always_inline int @@ -422,17 +424,22 @@ app_send (app_session_t * s, u8 * data, u32 len, u8 noblock) always_inline int app_recv_dgram_raw (svm_fifo_t * f, u8 * buf, u32 len, - app_session_transport_t * at, u8 clear_evt) + app_session_transport_t * at, u8 clear_evt, u8 peek) { session_dgram_pre_hdr_t ph; u32 max_deq; int rv; - if (clear_evt) - svm_fifo_unset_event (f); max_deq = svm_fifo_max_dequeue (f); if (max_deq < sizeof (session_dgram_hdr_t)) - return 0; + { + if (clear_evt) + svm_fifo_unset_event (f); + return 0; + } + + if (clear_evt) + svm_fifo_unset_event (f); svm_fifo_peek (f, 0, sizeof (ph), (u8 *) & ph); ASSERT (ph.data_length >= ph.data_offset); @@ -440,6 +447,8 @@ app_recv_dgram_raw (svm_fifo_t * f, u8 * buf, u32 len, svm_fifo_peek (f, sizeof (ph), sizeof (*at), (u8 *) at); len = clib_min (len, ph.data_length - ph.data_offset); rv = svm_fifo_peek (f, ph.data_offset + SESSION_CONN_HDR_LEN, len, buf); + if (peek) + return rv; ph.data_offset += rv; if (ph.data_offset == ph.data_length) svm_fifo_dequeue_drop (f, ph.data_length + SESSION_CONN_HDR_LEN); @@ -451,21 +460,25 @@ app_recv_dgram_raw (svm_fifo_t * f, u8 * buf, u32 len, always_inline int app_recv_dgram (app_session_t * s, u8 * buf, u32 len) { - return app_recv_dgram_raw (s->rx_fifo, buf, len, &s->transport, 1); + return app_recv_dgram_raw (s->rx_fifo, buf, len, &s->transport, 1, 0); } always_inline int -app_recv_stream_raw (svm_fifo_t * f, u8 * buf, u32 len, u8 clear_evt) +app_recv_stream_raw (svm_fifo_t * f, u8 * buf, u32 len, u8 clear_evt, u8 peek) { if (clear_evt) svm_fifo_unset_event (f); + + if (peek) + return svm_fifo_peek (f, 0, len, buf); + return svm_fifo_dequeue_nowait (f, len, buf); } always_inline int app_recv_stream (app_session_t * s, u8 * buf, u32 len) { - return app_recv_stream_raw (s->rx_fifo, buf, len, 1); + return app_recv_stream_raw (s->rx_fifo, buf, len, 1, 0); } always_inline int diff --git a/src/vnet/session/session.h b/src/vnet/session/session.h index 99546cb1347..5e94c41f927 100644 --- a/src/vnet/session/session.h +++ b/src/vnet/session/session.h @@ -33,12 +33,12 @@ typedef enum { FIFO_EVENT_APP_RX, + SESSION_IO_EVT_CT_RX, FIFO_EVENT_APP_TX, + SESSION_IO_EVT_CT_TX, FIFO_EVENT_DISCONNECT, FIFO_EVENT_BUILTIN_RX, FIFO_EVENT_RPC, - SESSION_IO_EVT_CT_TX, - SESSION_IO_EVT_CT_RX, SESSION_CTRL_EVT_ACCEPTED, SESSION_CTRL_EVT_ACCEPTED_REPLY, SESSION_CTRL_EVT_CONNECTED, -- cgit 1.2.3-korg