X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvppcom.c;h=107b109dc752913e6916aa1b65e996c417663d48;hb=2f09bfc8b;hp=940a8b92dc1faa34d2d28c2f4640dab7e4fd8621;hpb=f6e284b20c7a5b774ae21934fbf3f07801d61fc2;p=vpp.git diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 940a8b92dc1..107b109dc75 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -219,6 +219,7 @@ vcl_send_session_connect (vcl_worker_t * wrk, vcl_session_t * s) memset (mp, 0, sizeof (*mp)); mp->client_index = wrk->api_client_handle; mp->context = s->session_index; + mp->dscp = s->dscp; mp->wrk_index = wrk->vpp_wrk_index; mp->is_ip4 = s->transport.is_ip4; mp->parent_handle = s->parent_handle; @@ -508,10 +509,20 @@ vcl_session_connected_handler (vcl_worker_t * wrk, session_index = mp->context; session = vcl_session_get (wrk, session_index); - if (!session) + if (PREDICT_FALSE (!session)) { VDBG (0, "ERROR: vpp handle 0x%llx has no session index (%u)!", mp->handle, session_index); + /* Should not happen but if it does, force vpp session cleanup */ + vcl_session_t tmp_session = { + .vpp_handle = mp->handle, + .vpp_evt_q = 0, + }; + vcl_segment_attach_session ( + mp->segment_handle, mp->server_rx_fifo, mp->server_tx_fifo, + mp->vpp_event_queue_address, mp->mq_index, 0, session); + if (tmp_session.vpp_evt_q) + vcl_send_session_disconnect (wrk, &tmp_session); return VCL_INVALID_SESSION_INDEX; } if (mp->retval) @@ -1368,8 +1379,8 @@ vppcom_app_create (const char *app_name) vcm->main_cpu = pthread_self (); vcm->main_pid = getpid (); vcm->app_name = format (0, "%s", app_name); - fifo_segment_main_init (&vcm->segment_main, vcl_cfg->segment_baseva, - 20 /* timeout in secs */ ); + fifo_segment_main_init (&vcm->segment_main, (uword) ~0, + 20 /* timeout in secs */); pool_alloc (vcm->workers, vcl_cfg->max_workers); clib_spinlock_init (&vcm->workers_lock); clib_rwlock_init (&vcm->segment_table_lock); @@ -1645,9 +1656,6 @@ vppcom_session_listen (uint32_t listen_sh, uint32_t q_len) if (!listen_session || (listen_session->flags & VCL_SESSION_F_IS_VEP)) return VPPCOM_EBADFD; - if (q_len == 0 || q_len == ~0) - q_len = vcm->cfg.listen_queue_size; - listen_vpp_handle = listen_session->vpp_handle; if (listen_session->session_state == VCL_STATE_LISTEN) { @@ -2196,7 +2204,7 @@ vppcom_session_free_segments (uint32_t session_handle, uint32_t n_bytes) is_ct = vcl_session_is_ct (s); svm_fifo_dequeue_drop (is_ct ? s->ct_rx_fifo : s->rx_fifo, n_bytes); - ASSERT (s->rx_bytes_pending < n_bytes); + ASSERT (s->rx_bytes_pending >= n_bytes); s->rx_bytes_pending -= n_bytes; } @@ -3016,8 +3024,9 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, break; vcl_fifo_rx_evt_valid_or_break (s); session_events = s->vep.ev.events; - if (!(EPOLLIN & s->vep.ev.events) - || (s->flags & VCL_SESSION_F_HAS_RX_EVT)) + if (!(EPOLLIN & s->vep.ev.events) || + (s->flags & VCL_SESSION_F_HAS_RX_EVT) || + (s->vep.lt_next != VCL_INVALID_SESSION_INDEX)) break; add_event = 1; events[*num_ev].events = EPOLLIN; @@ -3047,7 +3056,8 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, break; session_events = s->vep.ev.events; sid = s->session_index; - if (!(EPOLLIN & session_events)) + if (!(EPOLLIN & session_events) || + (s->vep.lt_next != VCL_INVALID_SESSION_INDEX)) break; add_event = 1; events[*num_ev].events = EPOLLIN; @@ -3090,8 +3100,22 @@ vcl_epoll_wait_handle_mq_event (vcl_worker_t * wrk, session_event_t * e, sid = s->session_index; session_events = s->vep.ev.events; add_event = 1; - events[*num_ev].events = EPOLLHUP | EPOLLRDHUP; + if (EPOLLRDHUP & session_events) + { + /* If app can distinguish between RDHUP and HUP, + * we make finer control */ + events[*num_ev].events = EPOLLRDHUP; + if (s->flags & VCL_SESSION_F_WR_SHUTDOWN) + { + events[*num_ev].events |= EPOLLHUP; + } + } + else + { + events[*num_ev].events = EPOLLHUP; + } session_evt_data = s->vep.ev.data.u64; + break; case SESSION_CTRL_EVT_RESET: if (!e->postponed) @@ -3363,6 +3387,10 @@ vppcom_epoll_wait (uint32_t vep_handle, struct epoll_event *events, } vec_reset_length (wrk->unhandled_evts_vector); } + + if (PREDICT_FALSE (wrk->ep_lt_current != VCL_INVALID_SESSION_INDEX)) + vcl_epoll_wait_handle_lt (wrk, events, maxevents, &n_evts); + /* Request to only drain unhandled */ if ((int) wait_for_time == -2) return n_evts; @@ -3375,9 +3403,6 @@ vppcom_epoll_wait (uint32_t vep_handle, struct epoll_event *events, n_evts = vppcom_epoll_wait_condvar (wrk, events, maxevents, n_evts, wait_for_time); - if (PREDICT_FALSE (wrk->ep_lt_current != VCL_INVALID_SESSION_INDEX)) - vcl_epoll_wait_handle_lt (wrk, events, maxevents, &n_evts); - return n_evts; } @@ -3584,6 +3609,18 @@ vppcom_session_attr (uint32_t session_handle, uint32_t op, rv = VPPCOM_EINVAL; break; + case VPPCOM_ATTR_SET_DSCP: + if (buffer && buflen && (*buflen >= sizeof (u8))) + { + session->dscp = *(u8 *) buffer; + + VDBG (2, "VPPCOM_ATTR_SET_DSCP: %u (0x%x), buflen %d,", + *(u8 *) buffer, *(u8 *) buffer, *buflen); + } + else + rv = VPPCOM_EINVAL; + break; + case VPPCOM_ATTR_SET_TX_FIFO_LEN: if (buffer && buflen && (*buflen == sizeof (u32))) { @@ -4060,6 +4097,10 @@ vppcom_session_sendto (uint32_t session_handle, void *buffer, if (!vcl_session_is_cl (s)) return VPPCOM_EINVAL; + s->transport.is_ip4 = ep->is_ip4; + s->transport.rmt_port = ep->port; + vcl_ip_copy_from_ep (&s->transport.rmt_ip, ep); + /* Session not connected/bound in vpp. Create it by 'connecting' it */ if (PREDICT_FALSE (s->session_state == VCL_STATE_CLOSED)) { @@ -4075,10 +4116,6 @@ vppcom_session_sendto (uint32_t session_handle, void *buffer, return rv; s = vcl_session_get (wrk, session_index); } - - s->transport.is_ip4 = ep->is_ip4; - s->transport.rmt_port = ep->port; - vcl_ip_copy_from_ep (&s->transport.rmt_ip, ep); } if (flags) @@ -4388,22 +4425,18 @@ int vppcom_add_cert_key_pair (vppcom_cert_key_pair_t *ckpair) { if (vcm->cfg.vpp_app_socket_api) - { - clib_warning ("not supported"); - return VPPCOM_EINVAL; - } - return vcl_bapi_add_cert_key_pair (ckpair); + return vcl_sapi_add_cert_key_pair (ckpair); + else + return vcl_bapi_add_cert_key_pair (ckpair); } int vppcom_del_cert_key_pair (uint32_t ckpair_index) { if (vcm->cfg.vpp_app_socket_api) - { - clib_warning ("not supported"); - return VPPCOM_EINVAL; - } - return vcl_bapi_del_cert_key_pair (ckpair_index); + return vcl_sapi_del_cert_key_pair (ckpair_index); + else + return vcl_bapi_del_cert_key_pair (ckpair_index); } /*