X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvcl_private.c;h=5f9ce270508019fff6a73b4be70929c83f0f2fab;hb=0ef8ef2b474473b13de2cee0165b424e79e4e363;hp=df602b3ce879a9fdb26dbf8c59d16bf52e9c488d;hpb=cac8cfaba977d3822c06452817e43d7f0bdaa189;p=vpp.git diff --git a/src/vcl/vcl_private.c b/src/vcl/vcl_private.c index df602b3ce87..5f9ce270508 100644 --- a/src/vcl/vcl_private.c +++ b/src/vcl/vcl_private.c @@ -391,6 +391,70 @@ vcl_cleanup_bapi (void) vl_client_api_unmap (); } +int +vcl_session_read_ready (vcl_session_t * session) +{ + /* Assumes caller has acquired spinlock: vcm->sessions_lockp */ + if (PREDICT_FALSE (session->is_vep)) + { + VDBG (0, "ERROR: session %u: cannot read from an epoll session!", + session->session_index); + return VPPCOM_EBADFD; + } + + if (PREDICT_FALSE (!(session->session_state & (STATE_OPEN | STATE_LISTEN)))) + { + session_state_t state = session->session_state; + int rv; + + rv = ((state & STATE_DISCONNECT) ? VPPCOM_ECONNRESET : VPPCOM_ENOTCONN); + + VDBG (1, "session %u [0x%llx]: not open! state 0x%x (%s), ret %d (%s)", + session->session_index, session->vpp_handle, state, + vppcom_session_state_str (state), rv, vppcom_retval_str (rv)); + return rv; + } + + if (session->session_state & STATE_LISTEN) + return clib_fifo_elts (session->accept_evts_fifo); + + return svm_fifo_max_dequeue (session->rx_fifo); +} + +int +vcl_session_write_ready (vcl_session_t * session) +{ + /* Assumes caller has acquired spinlock: vcm->sessions_lockp */ + if (PREDICT_FALSE (session->is_vep)) + { + VDBG (0, "session %u [0x%llx]: cannot write to an epoll session!", + session->session_index, session->vpp_handle); + return VPPCOM_EBADFD; + } + + if (PREDICT_FALSE (session->session_state & STATE_LISTEN)) + { + if (session->tx_fifo) + return svm_fifo_max_enqueue (session->tx_fifo); + else + return VPPCOM_EBADFD; + } + + if (PREDICT_FALSE (!(session->session_state & STATE_OPEN))) + { + session_state_t state = session->session_state; + int rv; + + rv = ((state & STATE_DISCONNECT) ? VPPCOM_ECONNRESET : VPPCOM_ENOTCONN); + VDBG (0, "session %u [0x%llx]: not open! state 0x%x (%s), ret %d (%s)", + session->session_index, session->vpp_handle, state, + vppcom_session_state_str (state), rv, vppcom_retval_str (rv)); + return rv; + } + + return svm_fifo_max_enqueue (session->tx_fifo); +} + /* * fd.io coding-style-patch-verification: ON *