summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFlorin Coras <fcoras@cisco.com>2021-06-04 15:59:41 -0700
committerFlorin Coras <florin.coras@gmail.com>2021-06-05 21:25:39 +0000
commit2645f68985df4955fd8a161224595dad9f4ab488 (patch)
tree9df8d7c8011e7700b482fc3424764916a84d6291 /src
parente20d3c8c007bb7437ef7d1db47cfefb4235c0fe6 (diff)
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 <fcoras@cisco.com> Change-Id: I728a06b8cf84af8d8c1dea7406e284de8886dffc
Diffstat (limited to 'src')
-rw-r--r--src/vcl/vppcom.c25
-rw-r--r--src/vcl/vppcom.h3
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