aboutsummaryrefslogtreecommitdiffstats
path: root/src/vcl
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2020-01-15 01:30:46 +0000
committerDave Barach <openvpp@barachs.net>2020-01-16 15:18:32 +0000
commit6e3c1f8ec3faa8f0cad591fada32ad2f506ec0a0 (patch)
tree005715df713ab91b9c142a9563900cbdbf299590 /src/vcl
parentff2fad1701d8274d602cc46f3f2323154d96dc9f (diff)
vcl: add rx event on epoll ctl if needed
Type: fix Signed-off-by: Florin Coras <fcoras@cisco.com> Change-Id: Ib6d0387076a4bb0b52e4cdfdcd62b6060b704fe6
Diffstat (limited to 'src/vcl')
-rw-r--r--src/vcl/vcl_private.h8
-rw-r--r--src/vcl/vppcom.c12
2 files changed, 18 insertions, 2 deletions
diff --git a/src/vcl/vcl_private.h b/src/vcl/vcl_private.h
index db4bcd315b6..30d3774fa93 100644
--- a/src/vcl/vcl_private.h
+++ b/src/vcl/vcl_private.h
@@ -518,6 +518,14 @@ vcl_session_is_ct (vcl_session_t * s)
}
static inline u8
+vcl_session_is_cl (vcl_session_t * s)
+{
+ if (s->session_type == VPPCOM_PROTO_UDP)
+ return 1;
+ return 0;
+}
+
+static inline u8
vcl_session_is_open (vcl_session_t * s)
{
return ((s->session_state & STATE_OPEN)
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c
index 3d54fb8c7aa..5eea71e143f 100644
--- a/src/vcl/vppcom.c
+++ b/src/vcl/vppcom.c
@@ -589,7 +589,7 @@ vcl_session_bound_handler (vcl_worker_t * wrk, session_bound_msg_t * mp)
vec_validate (wrk->vpp_event_queues, 0);
wrk->vpp_event_queues[0] = session->vpp_evt_q;
- if (session->is_dgram)
+ if (vcl_session_is_cl (session))
{
svm_fifo_t *rx_fifo, *tx_fifo;
session->vpp_evt_q = uword_to_pointer (mp->vpp_evt_q, svm_msg_q_t *);
@@ -2518,7 +2518,7 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
svm_fifo_add_want_deq_ntf (session->tx_fifo,
SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
- /* Generate EPOLLOUT when tx_fifo/ct_tx_fifo not full */
+ /* Generate EPOLLOUT if tx fifo not full */
if ((event->events & EPOLLOUT) &&
(vcl_session_write_ready (session) > 0))
{
@@ -2527,6 +2527,14 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
e.session_index = session->session_index;
vec_add1 (wrk->unhandled_evts_vector, e);
}
+ /* Generate EPOLLIN if rx fifo has data */
+ if ((event->events & EPOLLIN) && (vcl_session_read_ready (session) > 0))
+ {
+ session_event_t e = { 0 };
+ e.event_type = SESSION_IO_EVT_RX;
+ e.session_index = session->session_index;
+ vec_add1 (wrk->unhandled_evts_vector, e);
+ }
VDBG (1, "EPOLL_CTL_ADD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",
vep_handle, session_handle, event->events, event->data.u64);
vcl_evt (VCL_EVT_EPOLL_CTLADD, session, event->events, event->data.u64);