X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvppcom.c;h=a94df846402230d35db6ca99be8d9dd5cf1069dc;hb=671e60e65635b8d030bf303c88411192c747b59e;hp=773350ae0c999c5f255005096af9529a6be49d77;hpb=3c7d4f9e1f54ec6627795b64525f182e2cda7490;p=vpp.git diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 773350ae0c9..a94df846402 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -410,7 +410,7 @@ vcl_flag_accepted_session (vcl_session_t * session, u64 handle, u32 flags) accepted_msg = &session->accept_evts_fifo[i]; if (accepted_msg->accepted_msg.handle == handle) { - accepted_msg->flags = flags; + accepted_msg->flags |= flags; return 1; } } @@ -431,8 +431,6 @@ vcl_session_reset_handler (vcl_worker_t * wrk, VDBG (0, "request to reset unknown handle 0x%llx", reset_msg->handle); return VCL_INVALID_SESSION_INDEX; } - if (session->session_state >= STATE_VPP_CLOSING) - return sid; /* Caught a reset before actually accepting the session */ if (session->session_state == STATE_LISTEN) @@ -446,8 +444,6 @@ vcl_session_reset_handler (vcl_worker_t * wrk, session->session_state = STATE_DISCONNECT; VDBG (0, "reset session %u [0x%llx]", sid, reset_msg->handle); - vcl_send_session_reset_reply (vcl_session_vpp_evt_q (wrk, session), - wrk->my_client_index, reset_msg->handle, 0); return sid; } @@ -509,7 +505,8 @@ vcl_session_accepted (vcl_worker_t * wrk, session_accepted_msg_t * msg) session = vcl_session_get_w_vpp_handle (wrk, msg->handle); if (PREDICT_FALSE (session != 0)) - VWRN ("session handle overlap %lu!", msg->handle); + VWRN ("session overlap handle %lu state %u!", msg->handle, + session->session_state); session = vcl_session_table_lookup_listener (wrk, msg->listener_handle); if (!session) @@ -795,7 +792,11 @@ vcl_intercept_sigchld_handler (int signum, siginfo_t * si, void *uc) if (vcl_get_worker_index () == ~0) return; - sigaction (SIGCHLD, &old_sa, 0); + if (sigaction (SIGCHLD, &old_sa, 0)) + { + VERR ("couldn't restore sigchld"); + exit (-1); + } wrk = vcl_worker_get_current (); if (wrk->forked_child == ~0) @@ -1115,6 +1116,12 @@ vppcom_session_close (uint32_t session_handle) getpid (), vpp_handle, session_handle, rv, vppcom_retval_str (rv)); } + else if (state == STATE_DISCONNECT) + { + svm_msg_q_t *mq = vcl_session_vpp_evt_q (wrk, session); + vcl_send_session_reset_reply (mq, wrk->my_client_index, + session->vpp_handle, 0); + } } cleanup: @@ -1374,19 +1381,10 @@ handle: */ if (accept_flags) { - svm_msg_q_t *mq = vcl_session_vpp_evt_q (wrk, client_session); if (accept_flags & VCL_ACCEPTED_F_CLOSED) - { - client_session->session_state = STATE_DISCONNECT; - vcl_send_session_disconnected_reply (mq, wrk->my_client_index, - client_session->vpp_handle, 0); - } + client_session->session_state = STATE_VPP_CLOSING; else if (accept_flags & VCL_ACCEPTED_F_RESET) - { - client_session->session_state = STATE_DISCONNECT; - vcl_send_session_reset_reply (mq, wrk->my_client_index, - client_session->vpp_handle, 0); - } + client_session->session_state = STATE_DISCONNECT; } return vcl_session_handle (client_session); } @@ -1520,9 +1518,8 @@ vppcom_session_read_internal (uint32_t session_handle, void *buf, int n, session_state_t state = s->session_state; rv = ((state & STATE_DISCONNECT) ? VPPCOM_ECONNRESET : VPPCOM_ENOTCONN); - VDBG (0, "VCL<%d>: vpp handle 0x%llx, sid %u: %s session is not open! " - "state 0x%x (%s), returning %d (%s)", - getpid (), s->vpp_handle, session_handle, state, + VDBG (0, "session handle %u[0x%llx] is not open! state 0x%x (%s)," + " returning %d (%s)", session_handle, s->vpp_handle, state, vppcom_session_state_str (state), rv, vppcom_retval_str (rv)); return rv; } @@ -1551,15 +1548,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 +1637,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 +1791,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)) @@ -1835,6 +1824,14 @@ vppcom_session_write (uint32_t session_handle, void *buf, size_t n) 0 /* is_flush */ ); } +int +vppcom_session_write_msg (uint32_t session_handle, void *buf, size_t n) +{ + return vppcom_session_write_inline (session_handle, buf, n, + 1 /* is_flush */ ); +} + + static vcl_session_t * vcl_ct_session_get_from_fifo (vcl_worker_t * wrk, svm_fifo_t * f, u8 type) { @@ -2546,7 +2543,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, ASSERT (e->fifo->client_thread_index == vcl_get_worker_index ()); vcl_fifo_rx_evt_valid_or_break (e->fifo); sid = e->fifo->client_session_index; - session = vcl_session_get (wrk, sid); + if (!(session = vcl_session_get (wrk, sid))) + break; session_events = session->vep.ev.events; if (!(EPOLLIN & session->vep.ev.events) || session->has_rx_evt) break; @@ -2557,7 +2555,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, break; case FIFO_EVENT_APP_TX: sid = e->fifo->client_session_index; - session = vcl_session_get (wrk, sid); + if (!(session = vcl_session_get (wrk, sid))) + break; session_events = session->vep.ev.events; if (!(EPOLLOUT & session_events)) break; @@ -2568,6 +2567,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, case SESSION_IO_EVT_CT_TX: vcl_fifo_rx_evt_valid_or_break (e->fifo); session = vcl_ct_session_get_from_fifo (wrk, e->fifo, 0); + if (PREDICT_FALSE (!session)) + break; sid = session->session_index; session_events = session->vep.ev.events; if (!(EPOLLIN & session->vep.ev.events) || session->has_rx_evt) @@ -2579,6 +2580,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, break; case SESSION_IO_EVT_CT_RX: session = vcl_ct_session_get_from_fifo (wrk, e->fifo, 1); + if (PREDICT_FALSE (!session)) + break; sid = session->session_index; session_events = session->vep.ev.events; if (!(EPOLLOUT & session_events)) @@ -2606,7 +2609,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, vcl_session_connected_handler (wrk, connected_msg); /* Generate EPOLLOUT because there's no connected event */ sid = vcl_session_index_from_vpp_handle (wrk, connected_msg->handle); - session = vcl_session_get (wrk, sid); + if (!(session = vcl_session_get (wrk, sid))) + break; session_events = session->vep.ev.events; if (EPOLLOUT & session_events) {