diff options
author | Florin Coras <fcoras@cisco.com> | 2018-12-27 14:51:46 -0800 |
---|---|---|
committer | Dave Barach <openvpp@barachs.net> | 2019-01-01 14:55:53 +0000 |
commit | b0f662fe93f1db0098f7b50306c2f084644788b1 (patch) | |
tree | e70b7c9594391185c0c0b65f492a5ba931c4e69b /src/vcl/vppcom.c | |
parent | 22af447454cf097ac4fc59f9072d805c371ab803 (diff) |
vcl/ldp: add write msg function and fine tuning
Allows app to push data. Additionally, ensure reset/close replies are
not sent unless vcl closes the session.
Change-Id: Icbbf933cf57b55cfbcc7b802af0f83919a066f65
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vcl/vppcom.c')
-rw-r--r-- | src/vcl/vppcom.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 86bb21413a4..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) @@ -1119,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: @@ -1378,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); } @@ -1524,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; } @@ -1831,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) { |