aboutsummaryrefslogtreecommitdiffstats
path: root/src/vcl/vppcom.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vcl/vppcom.c')
-rw-r--r--src/vcl/vppcom.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c
index 4224a086a21..3d54fb8c7aa 100644
--- a/src/vcl/vppcom.c
+++ b/src/vcl/vppcom.c
@@ -2518,6 +2518,15 @@ 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 */
+ if ((event->events & EPOLLOUT) &&
+ (vcl_session_write_ready (session) > 0))
+ {
+ session_event_t e = { 0 };
+ e.event_type = SESSION_IO_EVT_TX;
+ 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);
@@ -2543,6 +2552,17 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
rv = VPPCOM_EINVAL;
goto done;
}
+
+ /* Generate EPOLLOUT when tx_fifo/ct_tx_fifo not full */
+ if ((event->events & EPOLLOUT) &&
+ !(session->vep.ev.events & EPOLLOUT) &&
+ (vcl_session_write_ready (session) > 0))
+ {
+ session_event_t e = { 0 };
+ e.event_type = SESSION_IO_EVT_TX;
+ e.session_index = session->session_index;
+ vec_add1 (wrk->unhandled_evts_vector, e);
+ }
session->vep.et_mask = VEP_DEFAULT_ET_MASK;
session->vep.ev = *event;
VDBG (1, "EPOLL_CTL_MOD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",