From: Florin Coras Date: Sun, 16 Dec 2018 02:30:43 +0000 (-0800) Subject: vcl: handle reset while reading/writing data X-Git-Tag: v19.04-rc0~149 X-Git-Url: https://gerrit.fd.io/r/gitweb?p=vpp.git;a=commitdiff_plain;h=05ce4b8b79e65d0baf47dbc0970bee163eb2c797 vcl: handle reset while reading/writing data Change-Id: I73d1dde5b78bbb7835f3a4f0d35fc0d5e46ec103 Signed-off-by: Florin Coras --- diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 773350ae0c9..a456ed0e4cd 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -1551,15 +1551,11 @@ vppcom_session_read_internal (uint32_t session_handle, void *buf, int n, e = svm_msg_q_msg_data (mq, &msg); svm_msg_q_unlock (mq); if (!vcl_is_rx_evt_for_session (e, s->session_index, is_ct)) - { - vcl_handle_mq_event (wrk, e); - svm_msg_q_free_msg (mq, &msg); - continue; - } + vcl_handle_mq_event (wrk, e); svm_msg_q_free_msg (mq, &msg); - if (PREDICT_FALSE (s->session_state == STATE_VPP_CLOSING)) - return 0; + if (PREDICT_FALSE (s->session_state == STATE_DISCONNECT)) + return VPPCOM_ECONNRESET; } } @@ -1644,15 +1640,11 @@ vppcom_session_read_segments (uint32_t session_handle, e = svm_msg_q_msg_data (mq, &msg); svm_msg_q_unlock (mq); if (!vcl_is_rx_evt_for_session (e, s->session_index, is_ct)) - { - vcl_handle_mq_event (wrk, e); - svm_msg_q_free_msg (mq, &msg); - continue; - } + vcl_handle_mq_event (wrk, e); svm_msg_q_free_msg (mq, &msg); - if (PREDICT_FALSE (s->session_state == STATE_VPP_CLOSING)) - return 0; + if (PREDICT_FALSE (s->session_state == STATE_DISCONNECT)) + return VPPCOM_ECONNRESET; } } @@ -1802,12 +1794,12 @@ vppcom_session_write_inline (uint32_t session_handle, void *buf, size_t n, if (!vcl_is_tx_evt_for_session (e, s->session_index, is_ct)) vcl_handle_mq_event (wrk, e); svm_msg_q_free_msg (mq, &msg); + + if (PREDICT_FALSE (!(s->session_state & STATE_OPEN))) + return VPPCOM_ECONNRESET; } } - if (PREDICT_FALSE (!(s->session_state & STATE_OPEN))) - return VPPCOM_ECONNRESET; - ASSERT (FIFO_EVENT_APP_TX + 1 == SESSION_IO_EVT_CT_TX); et = FIFO_EVENT_APP_TX + vcl_session_is_ct (s); if (is_flush && !vcl_session_is_ct (s))