vcl: add rx event on epoll ctl if needed 32/24332/3
authorFlorin Coras <fcoras@cisco.com>
Wed, 15 Jan 2020 01:30:46 +0000 (01:30 +0000)
committerDave Barach <openvpp@barachs.net>
Thu, 16 Jan 2020 15:18:32 +0000 (15:18 +0000)
Type: fix

Signed-off-by: Florin Coras <fcoras@cisco.com>
Change-Id: Ib6d0387076a4bb0b52e4cdfdcd62b6060b704fe6

src/vcl/vcl_private.h
src/vcl/vppcom.c

index db4bcd3..30d3774 100644 (file)
@@ -517,6 +517,14 @@ vcl_session_is_ct (vcl_session_t * s)
   return (s->ct_tx_fifo != 0);
 }
 
+static inline u8
+vcl_session_is_cl (vcl_session_t * s)
+{
+  if (s->session_type == VPPCOM_PROTO_UDP)
+    return 1;
+  return 0;
+}
+
 static inline u8
 vcl_session_is_open (vcl_session_t * s)
 {
index 3d54fb8..5eea71e 100644 (file)
@@ -589,7 +589,7 @@ vcl_session_bound_handler (vcl_worker_t * wrk, session_bound_msg_t * mp)
   vec_validate (wrk->vpp_event_queues, 0);
   wrk->vpp_event_queues[0] = session->vpp_evt_q;
 
-  if (session->is_dgram)
+  if (vcl_session_is_cl (session))
     {
       svm_fifo_t *rx_fifo, *tx_fifo;
       session->vpp_evt_q = uword_to_pointer (mp->vpp_evt_q, svm_msg_q_t *);
@@ -2518,7 +2518,7 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
        svm_fifo_add_want_deq_ntf (session->tx_fifo,
                                   SVM_FIFO_WANT_DEQ_NOTIF_IF_FULL);
 
-      /* Generate EPOLLOUT when tx_fifo/ct_tx_fifo not full */
+      /* Generate EPOLLOUT if tx fifo not full */
       if ((event->events & EPOLLOUT) &&
          (vcl_session_write_ready (session) > 0))
        {
@@ -2527,6 +2527,14 @@ vppcom_epoll_ctl (uint32_t vep_handle, int op, uint32_t session_handle,
          e.session_index = session->session_index;
          vec_add1 (wrk->unhandled_evts_vector, e);
        }
+      /* Generate EPOLLIN if rx fifo has data */
+      if ((event->events & EPOLLIN) && (vcl_session_read_ready (session) > 0))
+       {
+         session_event_t e = { 0 };
+         e.event_type = SESSION_IO_EVT_RX;
+         e.session_index = session->session_index;
+         vec_add1 (wrk->unhandled_evts_vector, e);
+       }
       VDBG (1, "EPOLL_CTL_ADD: vep_sh %u, sh %u, events 0x%x, data 0x%llx!",
            vep_handle, session_handle, event->events, event->data.u64);
       vcl_evt (VCL_EVT_EPOLL_CTLADD, session, event->events, event->data.u64);