X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvcl%2Fvppcom.c;h=cf8bb72d4515a74c92255239c5fd98cba11b7323;hb=6a6555ac34cf1c74cb3d82ae3b77232797c73b6a;hp=412b6a4b995a220e342c32fc8b946cd013b4859d;hpb=a5a9efd4d1995ef6d46dfab4e5b8aba9c5d114ef;p=vpp.git diff --git a/src/vcl/vppcom.c b/src/vcl/vppcom.c index 412b6a4b995..cf8bb72d451 100644 --- a/src/vcl/vppcom.c +++ b/src/vcl/vppcom.c @@ -183,6 +183,7 @@ vcl_send_session_listen (vcl_worker_t * wrk, vcl_session_t * s) mp->port = s->transport.lcl_port; mp->proto = s->session_type; mp->ckpair_index = s->ckpair_index; + mp->vrf = s->vrf; if (s->flags & VCL_SESSION_F_CONNECTED) mp->flags = TRANSPORT_CFG_F_CONNECTED; app_send_ctrl_evt_to_vpp (mq, app_evt); @@ -210,6 +211,7 @@ vcl_send_session_connect (vcl_worker_t * wrk, vcl_session_t * s) mp->lcl_port = s->transport.lcl_port; mp->proto = s->session_type; mp->ckpair_index = s->ckpair_index; + mp->vrf = s->vrf; if (s->flags & VCL_SESSION_F_CONNECTED) mp->flags |= TRANSPORT_CFG_F_CONNECTED; app_send_ctrl_evt_to_vpp (mq, app_evt); @@ -2392,7 +2394,7 @@ vppcom_select (int n_bits, vcl_si_set * read_map, vcl_si_set * write_map, { u32 sid, minbits = clib_max (n_bits, BITS (uword)), bits_set = 0; vcl_worker_t *wrk = vcl_worker_get_current (); - vcl_session_t *session = 0; + vcl_session_t *s = 0; int i; if (n_bits && read_map) @@ -2423,43 +2425,46 @@ vppcom_select (int n_bits, vcl_si_set * read_map, vcl_si_set * write_map, if (!write_map) goto check_rd; - /* *INDENT-OFF* */ - clib_bitmap_foreach (sid, wrk->wr_bitmap) { - if (!(session = vcl_session_get (wrk, sid))) - { - clib_bitmap_set_no_check ((uword*)write_map, sid, 1); - bits_set++; - continue; - } - - if (vcl_session_write_ready (session)) - { - clib_bitmap_set_no_check ((uword*)write_map, sid, 1); - bits_set++; - } - else - svm_fifo_add_want_deq_ntf (session->tx_fifo, SVM_FIFO_WANT_DEQ_NOTIF); - } + clib_bitmap_foreach (sid, wrk->wr_bitmap) + { + if (!(s = vcl_session_get (wrk, sid))) + { + clib_bitmap_set_no_check ((uword *) write_map, sid, 1); + bits_set++; + continue; + } + + if (vcl_session_write_ready (s)) + { + clib_bitmap_set_no_check ((uword *) write_map, sid, 1); + bits_set++; + } + else + { + svm_fifo_t *txf = vcl_session_is_ct (s) ? s->ct_tx_fifo : s->tx_fifo; + svm_fifo_add_want_deq_ntf (txf, SVM_FIFO_WANT_DEQ_NOTIF); + } + } check_rd: if (!read_map) goto check_mq; - clib_bitmap_foreach (sid, wrk->rd_bitmap) { - if (!(session = vcl_session_get (wrk, sid))) - { - clib_bitmap_set_no_check ((uword*)read_map, sid, 1); - bits_set++; - continue; - } + clib_bitmap_foreach (sid, wrk->rd_bitmap) + { + if (!(s = vcl_session_get (wrk, sid))) + { + clib_bitmap_set_no_check ((uword *) read_map, sid, 1); + bits_set++; + continue; + } - if (vcl_session_read_ready (session)) - { - clib_bitmap_set_no_check ((uword*)read_map, sid, 1); - bits_set++; - } - } - /* *INDENT-ON* */ + if (vcl_session_read_ready (s)) + { + clib_bitmap_set_no_check ((uword *) read_map, sid, 1); + bits_set++; + } + } check_mq: @@ -3009,25 +3014,49 @@ static int vppcom_epoll_wait_eventfd (vcl_worker_t * wrk, struct epoll_event *events, int maxevents, u32 n_evts, double wait_for_time) { - vcl_mq_evt_conn_t *mqc; + double wait = 0, start = 0, now; int __clib_unused n_read; + vcl_mq_evt_conn_t *mqc; int n_mq_evts, i; u64 buf; vec_validate (wrk->mq_events, pool_elts (wrk->mq_evt_conns)); -again: - n_mq_evts = epoll_wait (wrk->mqs_epfd, wrk->mq_events, - vec_len (wrk->mq_events), wait_for_time); - for (i = 0; i < n_mq_evts; i++) + if (!n_evts) { - mqc = vcl_mq_evt_conn_get (wrk, wrk->mq_events[i].data.u32); - n_read = read (mqc->mq_fd, &buf, sizeof (buf)); - vcl_epoll_wait_handle_mq (wrk, mqc->mq, events, maxevents, 0, &n_evts); + wait = wait_for_time; + start = clib_time_now (&wrk->clib_time); } - if (!n_evts && n_mq_evts > 0) - goto again; - return (int) n_evts; + do + { + n_mq_evts = epoll_wait (wrk->mqs_epfd, wrk->mq_events, + vec_len (wrk->mq_events), wait); + if (n_mq_evts < 0) + { + VDBG (0, "epoll_wait error %u", errno); + return n_evts; + } + + for (i = 0; i < n_mq_evts; i++) + { + mqc = vcl_mq_evt_conn_get (wrk, wrk->mq_events[i].data.u32); + n_read = read (mqc->mq_fd, &buf, sizeof (buf)); + vcl_epoll_wait_handle_mq (wrk, mqc->mq, events, maxevents, 0, + &n_evts); + } + + if (n_evts) + return n_evts; + if (wait == -1) + continue; + + now = clib_time_now (&wrk->clib_time); + wait -= (now - start) * 1e3; + start = now; + } + while (wait > 0); + + return 0; } int @@ -3646,6 +3675,25 @@ vppcom_session_attr (uint32_t session_handle, uint32_t op, session->ckpair_index = *(uint32_t *) buffer; break; + case VPPCOM_ATTR_SET_VRF: + if (!(buffer && buflen && (*buflen == sizeof (u32)))) + { + rv = VPPCOM_EINVAL; + break; + } + session->vrf = *(u32 *) buffer; + break; + + case VPPCOM_ATTR_GET_VRF: + if (!(buffer && buflen && (*buflen >= sizeof (u32)))) + { + rv = VPPCOM_EINVAL; + break; + } + *(u32 *) buffer = session->vrf; + *buflen = sizeof (u32); + break; + default: rv = VPPCOM_EINVAL; break;