X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvppcom.c;h=7c076d3b315010db165dc5bc9c85c011ecb3a25c;hb=ac626264ec5cbb3d727147ae336cac55eb37906e;hp=3c3e15d146c9d4c4d955538d50f838d2d28cc74b;hpb=6d0106e44e7dff2c9ef0f7052c4023245e9023a8;p=vpp.git diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 3c3e15d146c..7c076d3b315 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -60,7 +60,7 @@ vcl_mq_dequeue_batch (vcl_worker_t * wrk, svm_msg_q_t * mq) } const char * -vppcom_session_state_str (session_state_t state) +vppcom_session_state_str (vcl_session_state_t state) { char *st; @@ -533,6 +533,30 @@ vcl_session_bound_handler (vcl_worker_t * wrk, session_bound_msg_t * mp) return sid; } +static void +vcl_session_unlisten_reply_handler (vcl_worker_t * wrk, void *data) +{ + session_unlisten_reply_msg_t *mp = (session_unlisten_reply_msg_t *) data; + vcl_session_t *s; + + s = vcl_session_get_w_vpp_handle (wrk, mp->handle); + if (!s || s->session_state != STATE_DISCONNECT) + { + VDBG (0, "Unlisten reply with wrong handle %llx", mp->handle); + return; + } + + if (mp->retval) + VDBG (0, "ERROR: session %u [0xllx]: unlisten failed: %U", + s->session_index, mp->handle, format_api_error, ntohl (mp->retval)); + + if (mp->context != wrk->wrk_index) + VDBG (0, "wrong context"); + + vcl_session_table_del_vpp_handle (wrk, mp->handle); + vcl_session_free (wrk, s); +} + static vcl_session_t * vcl_session_accepted (vcl_worker_t * wrk, session_accepted_msg_t * msg) { @@ -670,6 +694,9 @@ vcl_handle_mq_event (vcl_worker_t * wrk, session_event_t * e) case SESSION_CTRL_EVT_BOUND: vcl_session_bound_handler (wrk, (session_bound_msg_t *) e->data); break; + case SESSION_CTRL_EVT_UNLISTEN_REPLY: + vcl_session_unlisten_reply_handler (wrk, e->data); + break; case SESSION_CTRL_EVT_REQ_WORKER_UPDATE: vcl_session_req_worker_update_handler (wrk, e->data); break; @@ -684,7 +711,7 @@ vcl_handle_mq_event (vcl_worker_t * wrk, session_event_t * e) static int vppcom_wait_for_session_state_change (u32 session_index, - session_state_t state, + vcl_session_state_t state, f64 wait_for_time) { vcl_worker_t *wrk = vcl_worker_get_current (); @@ -730,7 +757,7 @@ vppcom_wait_for_session_state_change (u32 session_index, static void vcl_handle_pending_wrk_updates (vcl_worker_t * wrk) { - session_state_t state; + vcl_session_state_t state; vcl_session_t *s; u32 *sip; @@ -821,7 +848,6 @@ vppcom_session_unbind (u32 session_handle) return VPPCOM_EBADFD; vpp_handle = session->vpp_handle; - vcl_session_table_del_listener (wrk, vpp_handle); session->vpp_handle = ~0; session->session_state = STATE_DISCONNECT; @@ -840,7 +866,7 @@ vppcom_session_disconnect (u32 session_handle) vcl_worker_t *wrk = vcl_worker_get_current (); svm_msg_q_t *vpp_evt_q; vcl_session_t *session; - session_state_t state; + vcl_session_state_t state; u64 vpp_handle; session = vcl_session_get_w_handle (wrk, session_handle); @@ -1027,7 +1053,7 @@ int vcl_session_cleanup (vcl_worker_t * wrk, vcl_session_t * session, vcl_session_handle_t sh, u8 do_disconnect) { - session_state_t state; + vcl_session_state_t state; u32 next_sh, vep_sh; int rv = VPPCOM_OK; u64 vpp_handle; @@ -1079,6 +1105,7 @@ vcl_session_cleanup (vcl_worker_t * wrk, vcl_session_t * session, VDBG (0, "session %u [0x%llx]: listener unbind failed! " "rv %d (%s)", session->session_index, vpp_handle, rv, vppcom_retval_str (rv)); + return rv; } else if (state & STATE_OPEN) { @@ -1937,6 +1964,9 @@ vcl_select_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, *bits_set += 1; } break; + case SESSION_CTRL_EVT_UNLISTEN_REPLY: + vcl_session_unlisten_reply_handler (wrk, e->data); + break; case SESSION_CTRL_EVT_WORKER_UPDATE_REPLY: vcl_session_worker_update_reply_handler (wrk, e->data); break; @@ -2186,11 +2216,9 @@ vep_verify_epoll_chain (vcl_worker_t * wrk, u32 vep_idx) " is_vep = %u\n" " is_vep_session = %u\n" " next_sid = 0x%x (%u)\n" - " wait_cont_idx = 0x%x (%u)\n" "}\n", getpid (), vep_idx, session->is_vep, session->is_vep_session, - vep->next_sh, vep->next_sh, - session->wait_cont_idx, session->wait_cont_idx); + vep->next_sh, vep->next_sh); for (sid = vep->next_sh; sid != ~0; sid = vep->next_sh) { @@ -2250,7 +2278,6 @@ vppcom_epoll_create (void) vep_session->vep.vep_sh = ~0; vep_session->vep.next_sh = ~0; vep_session->vep.prev_sh = ~0; - vep_session->wait_cont_idx = ~0; vep_session->vpp_handle = ~0; vcl_evt (VCL_EVT_EPOLL_CREATE, vep_session, vep_session->session_index); @@ -2383,10 +2410,6 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle, goto done; } - vep_session->wait_cont_idx = - (vep_session->wait_cont_idx == session_handle) ? - session->vep.next_sh : vep_session->wait_cont_idx; - if (session->vep.prev_sh == vep_handle) vep_session->vep.next_sh = session->vep.next_sh; else @@ -2558,6 +2581,9 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, events[*num_ev].events |= EPOLLHUP | EPOLLRDHUP; session_evt_data = session->vep.ev.data.u64; break; + case SESSION_CTRL_EVT_UNLISTEN_REPLY: + vcl_session_unlisten_reply_handler (wrk, e->data); + break; case SESSION_CTRL_EVT_REQ_WORKER_UPDATE: vcl_session_req_worker_update_handler (wrk, e->data); break;