X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvcl_private.c;h=c5dcd39038eddeae594e75937bf9688eb9a00446;hb=ec112e5a9eb708c1ee85faf569fef6fa40178294;hp=fd35db0b678d673b532828118e95344c2c0913ea;hpb=935ce75cb060da34991e6b02bec5680445f85323;p=vpp.git diff --git a/src/vcl/vcl_private.c b/src/vcl/vcl_private.c index fd35db0b678..c5dcd39038e 100644 --- a/src/vcl/vcl_private.c +++ b/src/vcl/vcl_private.c @@ -226,100 +226,87 @@ vcl_worker_ctrl_mq (vcl_worker_t * wrk) } int -vcl_session_read_ready (vcl_session_t * session) +vcl_session_read_ready (vcl_session_t * s) { - u32 max_deq; - - /* Assumes caller has acquired spinlock: vcm->sessions_lockp */ - if (PREDICT_FALSE (session->is_vep)) + if (PREDICT_FALSE (s->flags & VCL_SESSION_F_IS_VEP)) { VDBG (0, "ERROR: session %u: cannot read from an epoll session!", - session->session_index); + s->session_index); return VPPCOM_EBADFD; } - if (PREDICT_FALSE (!(session->session_state & (STATE_OPEN | STATE_LISTEN)))) + if (vcl_session_is_open (s)) { - vcl_session_state_t state = session->session_state; - int rv; + if (vcl_session_is_ct (s)) + return svm_fifo_max_dequeue_cons (s->ct_rx_fifo); - rv = ((state & STATE_DISCONNECT) ? VPPCOM_ECONNRESET : VPPCOM_ENOTCONN); + if (s->is_dgram) + { + session_dgram_pre_hdr_t ph; + u32 max_deq; + + max_deq = svm_fifo_max_dequeue_cons (s->rx_fifo); + if (max_deq <= SESSION_CONN_HDR_LEN) + return 0; + if (svm_fifo_peek (s->rx_fifo, 0, sizeof (ph), (u8 *) & ph) < 0) + return 0; + if (ph.data_length + SESSION_CONN_HDR_LEN > max_deq) + return 0; + + return ph.data_length; + } - 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; + return svm_fifo_max_dequeue_cons (s->rx_fifo); } - - if (session->session_state & STATE_LISTEN) - return clib_fifo_elts (session->accept_evts_fifo); - - if (vcl_session_is_ct (session)) - return svm_fifo_max_dequeue_cons (session->ct_rx_fifo); - - max_deq = svm_fifo_max_dequeue_cons (session->rx_fifo); - - if (session->is_dgram) + else if (s->session_state == VCL_STATE_LISTEN) { - session_dgram_pre_hdr_t ph; - - if (max_deq <= SESSION_CONN_HDR_LEN) - return 0; - if (svm_fifo_peek (session->rx_fifo, 0, sizeof (ph), (u8 *) & ph) < 0) - return 0; - if (ph.data_length + SESSION_CONN_HDR_LEN > max_deq) - return 0; - - return ph.data_length; + return clib_fifo_elts (s->accept_evts_fifo); + } + else + { + return (s->session_state == VCL_STATE_DISCONNECT) ? + VPPCOM_ECONNRESET : VPPCOM_ENOTCONN; } - - return max_deq; } int -vcl_session_write_ready (vcl_session_t * session) +vcl_session_write_ready (vcl_session_t * s) { - /* Assumes caller has acquired spinlock: vcm->sessions_lockp */ - if (PREDICT_FALSE (session->is_vep)) + if (PREDICT_FALSE (s->flags & VCL_SESSION_F_IS_VEP)) { VDBG (0, "session %u [0x%llx]: cannot write to an epoll session!", - session->session_index, session->vpp_handle); + s->session_index, s->vpp_handle); return VPPCOM_EBADFD; } - if (PREDICT_FALSE (session->session_state & STATE_LISTEN)) + if (vcl_session_is_open (s)) { - if (session->tx_fifo) - return svm_fifo_max_enqueue_prod (session->tx_fifo); - else - return VPPCOM_EBADFD; - } - - if (PREDICT_FALSE (!(session->session_state & STATE_OPEN))) - { - vcl_session_state_t state = session->session_state; - int rv; + if (vcl_session_is_ct (s)) + return svm_fifo_max_enqueue_prod (s->ct_tx_fifo); - 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; - } + if (s->is_dgram) + { + u32 max_enq = svm_fifo_max_enqueue_prod (s->tx_fifo); - if (vcl_session_is_ct (session)) - return svm_fifo_max_enqueue_prod (session->ct_tx_fifo); + if (max_enq <= sizeof (session_dgram_hdr_t)) + return 0; + return max_enq - sizeof (session_dgram_hdr_t); + } - if (session->is_dgram) + return svm_fifo_max_enqueue_prod (s->tx_fifo); + } + else if (s->session_state == VCL_STATE_LISTEN) { - u32 max_enq = svm_fifo_max_enqueue_prod (session->tx_fifo); - - if (max_enq <= sizeof (session_dgram_hdr_t)) - return 0; - return max_enq - sizeof (session_dgram_hdr_t); + if (s->tx_fifo) + return svm_fifo_max_enqueue_prod (s->tx_fifo); + else + return VPPCOM_EBADFD; + } + else + { + return (s->session_state == VCL_STATE_DISCONNECT) ? + VPPCOM_ECONNRESET : VPPCOM_ENOTCONN; } - - return svm_fifo_max_enqueue_prod (session->tx_fifo); } int