From 2645f68985df4955fd8a161224595dad9f4ab488 Mon Sep 17 00:00:00 2001 From: Florin Coras Date: Fri, 4 Jun 2021 15:59:41 -0700 Subject: [PATCH] vcl: epoll error handling fixes and improvements - return VPPCOM_EEXIST if attempting to re-add a session - return VPPCOM_ENOENT if the session to be removed is not epolled - generate EPOLLIN if adding it through a mod operation on a session that has data and did not have the event previously set. Type: fix Signed-off-by: Florin Coras Change-Id: I728a06b8cf84af8d8c1dea7406e284de8886dffc --- src/vcl/vppcom.c | 25 ++++++++++++++++++++----- src/vcl/vppcom.h | 3 ++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 28f46f17b93..e98f9b7c84a 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -2713,6 +2713,12 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle, VDBG (0, "EPOLL_CTL_ADD: NULL pointer to epoll_event structure!"); return VPPCOM_EINVAL; } + if (s->flags & VCL_SESSION_F_IS_VEP_SESSION) + { + VDBG (0, "EPOLL_CTL_ADD: %u already epolled!", s->session_index); + rv = VPPCOM_EEXIST; + goto done; + } if (vep_session->vep.next_sh != ~0) { vcl_session_t *next_session; @@ -2771,7 +2777,7 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle, else if (PREDICT_FALSE (!(s->flags & VCL_SESSION_F_IS_VEP_SESSION))) { VDBG (0, "sh %u EPOLL_CTL_MOD: not a vep session!", session_handle); - rv = VPPCOM_EINVAL; + rv = VPPCOM_ENOENT; goto done; } else if (PREDICT_FALSE (s->vep.vep_sh != vep_handle)) @@ -2782,15 +2788,24 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle, goto done; } - /* Generate EPOLLOUT when tx_fifo/ct_tx_fifo not full */ - if ((event->events & EPOLLOUT) && - !(s->vep.ev.events & EPOLLOUT) && (vcl_session_write_ready (s) > 0)) + /* Generate EPOLLOUT if session write ready nd event was not on */ + if ((event->events & EPOLLOUT) && !(s->vep.ev.events & EPOLLOUT) && + (vcl_session_write_ready (s) > 0)) { session_event_t e = { 0 }; e.event_type = SESSION_IO_EVT_TX; e.session_index = s->session_index; vec_add1 (wrk->unhandled_evts_vector, e); } + /* Generate EPOLLIN if session read ready and event was not on */ + if ((event->events & EPOLLIN) && !(s->vep.ev.events & EPOLLIN) && + (vcl_session_read_ready (s) > 0)) + { + session_event_t e = { 0 }; + e.event_type = SESSION_IO_EVT_RX; + e.session_index = s->session_index; + vec_add1 (wrk->unhandled_evts_vector, e); + } s->vep.et_mask = VEP_DEFAULT_ET_MASK; s->vep.ev = *event; txf = vcl_session_is_ct (s) ? s->ct_tx_fifo : s->tx_fifo; @@ -2809,7 +2824,7 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle, if (PREDICT_FALSE (!(s->flags & VCL_SESSION_F_IS_VEP_SESSION))) { VDBG (0, "EPOLL_CTL_DEL: %u not a vep session!", session_handle); - rv = VPPCOM_EINVAL; + rv = VPPCOM_ENOENT; goto done; } else if (PREDICT_FALSE (s->vep.vep_sh != vep_handle)) diff --git a/src/vcl/vppcom.h b/src/vcl/vppcom.h index ae157ccc8b4..c2a625e974e 100644 --- a/src/vcl/vppcom.h +++ b/src/vcl/vppcom.h @@ -98,7 +98,8 @@ typedef enum VPPCOM_ECONNREFUSED = -ECONNREFUSED, VPPCOM_ETIMEDOUT = -ETIMEDOUT, VPPCOM_EEXIST = -EEXIST, - VPPCOM_ENOPROTOOPT = -ENOPROTOOPT + VPPCOM_ENOPROTOOPT = -ENOPROTOOPT, + VPPCOM_ENOENT = -ENOENT, } vppcom_error_t; typedef enum -- 2.16.6