summaryrefslogtreecommitdiffstats
path: root/src/vnet/session/application_interface.h
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2018-07-17 10:46:29 -0700
committerFlorin Coras <florin.coras@gmail.com>2018-07-27 17:40:29 +0000
commit54693d23307ce8944a4d97379efd3bd4dcf0485c (patch)
tree14ee8cded17a87405de9c0cc9ba3fe7370aabc7f /src/vnet/session/application_interface.h
parent5df580eec93c0c6fc07dd38f8713f671565b9c38 (diff)
vcl: use events for epoll/select/read/write
Have vcl poll and wait on the event message queues as opposed to constantly polling the session fifos. This also adds event signaling to cut through sessions. On the downside, because we can't wait on multiple condvars, i.e., when we have multiple message queues because of cut-through registrations, we do timed waits. Change-Id: I29ade95dba449659fe46008bb1af502276a7c5fd Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vnet/session/application_interface.h')
-rw-r--r--src/vnet/session/application_interface.h25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/vnet/session/application_interface.h b/src/vnet/session/application_interface.h
index 0aabd380f8f..ffe2a64c245 100644
--- a/src/vnet/session/application_interface.h
+++ b/src/vnet/session/application_interface.h
@@ -207,17 +207,18 @@ typedef struct session_accepted_msg_
u64 server_tx_fifo;
u64 vpp_event_queue_address;
u64 server_event_queue_address;
+ u64 client_event_queue_address;
u16 port;
u8 is_ip4;
u8 ip[16];
-} session_accepted_msg_t;
+} __clib_packed session_accepted_msg_t;
typedef struct session_accepted_reply_msg_
{
u32 context;
i32 retval;
u64 handle;
-} session_accepted_reply_msg_t;
+} __clib_packed session_accepted_reply_msg_t;
/* Make sure this is not too large, otherwise it won't fit when dequeued in
* the session queue node */
@@ -232,34 +233,35 @@ typedef struct session_connected_msg_
u64 server_tx_fifo;
u64 vpp_event_queue_address;
u64 client_event_queue_address;
+ u64 server_event_queue_address;
u32 segment_size;
u8 segment_name_length;
u8 segment_name[64];
u8 lcl_ip[16];
u8 is_ip4;
u16 lcl_port;
-} session_connected_msg_t;
+} __clib_packed session_connected_msg_t;
typedef struct session_disconnected_msg_
{
u32 client_index;
u32 context;
u64 handle;
-} session_disconnected_msg_t;
+} __clib_packed session_disconnected_msg_t;
typedef struct session_disconnected_reply_msg_
{
u32 context;
i32 retval;
u64 handle;
-} session_disconnected_reply_msg_t;
+} __clib_packed session_disconnected_reply_msg_t;
typedef struct session_reset_msg_
{
u32 client_index;
u32 context;
u64 handle;
-} session_reset_msg_t;
+} __clib_packed session_reset_msg_t;
typedef struct session_reset_reply_msg_
{
@@ -267,13 +269,13 @@ typedef struct session_reset_reply_msg_
u32 context;
i32 retval;
u64 handle;
-} session_reset_reply_msg_t;
+} __clib_packed session_reset_reply_msg_t;
typedef struct app_session_event_
{
svm_msg_q_msg_t msg;
session_event_t *evt;
-} app_session_evt_t;
+} __clib_packed app_session_evt_t;
static inline void
app_alloc_ctrl_evt_to_vpp (svm_msg_q_t * mq, app_session_evt_t * app_evt,
@@ -337,12 +339,9 @@ app_send_io_evt_to_vpp (svm_msg_q_t * mq, svm_fifo_t * f, u8 evt_type,
else
{
svm_msg_q_lock (mq);
+ while (svm_msg_q_ring_is_full (mq, SESSION_MQ_IO_EVT_RING))
+ svm_msg_q_wait (mq);
msg = svm_msg_q_alloc_msg_w_ring (mq, SESSION_MQ_IO_EVT_RING);
- while (svm_msg_q_msg_is_invalid (&msg))
- {
- svm_msg_q_wait (mq);
- msg = svm_msg_q_alloc_msg_w_ring (mq, SESSION_MQ_IO_EVT_RING);
- }
evt = (session_event_t *) svm_msg_q_msg_data (mq, &msg);
evt->fifo = f;
evt->event_type = evt_type;