vcl: cleanup read and write ready 19/29519/8
authorFlorin Coras <fcoras@cisco.com>
Mon, 19 Oct 2020 03:17:49 +0000 (20:17 -0700)
committerDave Barach <openvpp@barachs.net>
Mon, 19 Oct 2020 22:45:56 +0000 (22:45 +0000)
Type: improvement

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

src/plugins/hs_apps/vcl/sock_test_server.c
src/vcl/vcl_private.c
src/vcl/vcl_private.h
src/vcl/vppcom.c

index 843d80e..6e4d6ea 100644 (file)
@@ -284,6 +284,8 @@ new_client (void)
     stfail ("new_client accept()");
 
   stinf ("Got a connection -- fd = %d (0x%08x)!\n", client_fd, client_fd);
+  if (fcntl (client_fd, F_SETFL, O_NONBLOCK) < 0)
+    stfail ("fcntl()");
 
   conn->fd = client_fd;
 
index a1c252d..54187a7 100644 (file)
@@ -228,9 +228,6 @@ vcl_worker_ctrl_mq (vcl_worker_t * wrk)
 int
 vcl_session_read_ready (vcl_session_t * s)
 {
-  u32 max_deq;
-
-  /* Assumes caller has acquired spinlock: vcm->sessions_lockp */
   if (PREDICT_FALSE (s->is_vep))
     {
       VDBG (0, "ERROR: session %u: cannot read from an epoll session!",
@@ -238,50 +235,43 @@ vcl_session_read_ready (vcl_session_t * s)
       return VPPCOM_EBADFD;
     }
 
-  if (PREDICT_FALSE (!(vcl_session_is_ready (s)
-                      || s->session_state == VCL_STATE_LISTEN)))
+  if (vcl_session_is_open (s))
     {
-      vcl_session_state_t state = s->session_state;
-      int rv;
+      if (vcl_session_is_ct (s))
+       return svm_fifo_max_dequeue_cons (s->ct_rx_fifo);
 
-      rv = (state == VCL_STATE_DISCONNECT) ?
-       VPPCOM_ECONNRESET : VPPCOM_ENOTCONN;
+      if (s->is_dgram)
+       {
+         session_dgram_pre_hdr_t ph;
+         u32 max_deq;
+
+         max_deq = svm_fifo_max_dequeue_cons (s->rx_fifo);
+         if (max_deq <= SESSION_CONN_HDR_LEN)
+           return 0;
+         if (svm_fifo_peek (s->rx_fifo, 0, sizeof (ph), (u8 *) & ph) < 0)
+           return 0;
+         if (ph.data_length + SESSION_CONN_HDR_LEN > max_deq)
+           return 0;
+
+         return ph.data_length;
+       }
 
-      VDBG (1, "session %u [0x%llx]: not open! state 0x%x (%s), ret %d (%s)",
-           s->session_index, s->vpp_handle, state,
-           vppcom_session_state_str (state), rv, vppcom_retval_str (rv));
-      return rv;
+      return svm_fifo_max_dequeue_cons (s->rx_fifo);
     }
-
-  if (s->session_state == VCL_STATE_LISTEN)
-    return clib_fifo_elts (s->accept_evts_fifo);
-
-  if (vcl_session_is_ct (s))
-    return svm_fifo_max_dequeue_cons (s->ct_rx_fifo);
-
-  max_deq = svm_fifo_max_dequeue_cons (s->rx_fifo);
-
-  if (s->is_dgram)
+  else if (s->session_state == VCL_STATE_LISTEN)
     {
-      session_dgram_pre_hdr_t ph;
-
-      if (max_deq <= SESSION_CONN_HDR_LEN)
-       return 0;
-      if (svm_fifo_peek (s->rx_fifo, 0, sizeof (ph), (u8 *) & ph) < 0)
-       return 0;
-      if (ph.data_length + SESSION_CONN_HDR_LEN > max_deq)
-       return 0;
-
-      return ph.data_length;
+      return clib_fifo_elts (s->accept_evts_fifo);
+    }
+  else
+    {
+      return (s->session_state == VCL_STATE_DISCONNECT) ?
+       VPPCOM_ECONNRESET : VPPCOM_ENOTCONN;
     }
-
-  return max_deq;
 }
 
 int
 vcl_session_write_ready (vcl_session_t * s)
 {
-  /* Assumes caller has acquired spinlock: vcm->sessions_lockp */
   if (PREDICT_FALSE (s->is_vep))
     {
       VDBG (0, "session %u [0x%llx]: cannot write to an epoll session!",
@@ -289,40 +279,34 @@ vcl_session_write_ready (vcl_session_t * s)
       return VPPCOM_EBADFD;
     }
 
-  if (PREDICT_FALSE (s->session_state == VCL_STATE_LISTEN))
+  if (vcl_session_is_open (s))
+    {
+      if (vcl_session_is_ct (s))
+       return svm_fifo_max_enqueue_prod (s->ct_tx_fifo);
+
+      if (s->is_dgram)
+       {
+         u32 max_enq = svm_fifo_max_enqueue_prod (s->tx_fifo);
+
+         if (max_enq <= sizeof (session_dgram_hdr_t))
+           return 0;
+         return max_enq - sizeof (session_dgram_hdr_t);
+       }
+
+      return svm_fifo_max_enqueue_prod (s->tx_fifo);
+    }
+  else if (s->session_state == VCL_STATE_LISTEN)
     {
       if (s->tx_fifo)
        return svm_fifo_max_enqueue_prod (s->tx_fifo);
       else
        return VPPCOM_EBADFD;
     }
-
-  if (PREDICT_FALSE (!vcl_session_is_ready (s)))
+  else
     {
-      vcl_session_state_t state = s->session_state;
-      int rv;
-
-      rv = (state == VCL_STATE_DISCONNECT) ?
+      return (s->session_state == VCL_STATE_DISCONNECT) ?
        VPPCOM_ECONNRESET : VPPCOM_ENOTCONN;
-      VDBG (0, "session %u [0x%llx]: not open! state 0x%x (%s), ret %d (%s)",
-           s->session_index, s->vpp_handle, state,
-           vppcom_session_state_str (state), rv, vppcom_retval_str (rv));
-      return rv;
     }
-
-  if (vcl_session_is_ct (s))
-    return svm_fifo_max_enqueue_prod (s->ct_tx_fifo);
-
-  if (s->is_dgram)
-    {
-      u32 max_enq = svm_fifo_max_enqueue_prod (s->tx_fifo);
-
-      if (max_enq <= sizeof (session_dgram_hdr_t))
-       return 0;
-      return max_enq - sizeof (session_dgram_hdr_t);
-    }
-
-  return svm_fifo_max_enqueue_prod (s->tx_fifo);
 }
 
 int
index 8e4c229..03dbbf5 100644 (file)
@@ -564,8 +564,7 @@ static inline u8
 vcl_session_is_open (vcl_session_t * s)
 {
   return ((vcl_session_is_ready (s))
-         || (s->session_state == VCL_STATE_LISTEN
-             && s->session_type == VPPCOM_PROTO_UDP));
+         || (s->session_state == VCL_STATE_LISTEN && vcl_session_is_cl (s)));
 }
 
 static inline u8
index bb59358..99e3fea 100644 (file)
@@ -923,7 +923,7 @@ vcl_handle_mq_event (vcl_worker_t * wrk, session_event_t * e)
     case SESSION_IO_EVT_RX:
     case SESSION_IO_EVT_TX:
       s = vcl_session_get (wrk, e->session_index);
-      if (!s || !(vcl_session_is_ready (s)))
+      if (!s || !vcl_session_is_open (s))
        break;
       vec_add1 (wrk->unhandled_evts_vector, *e);
       break;
@@ -1356,7 +1356,7 @@ vcl_session_cleanup (vcl_worker_t * wrk, vcl_session_t * s,
              vppcom_retval_str (rv));
       return rv;
     }
-  else if ((vcl_session_is_ready (s))
+  else if (vcl_session_is_ready (s)
           || (vcl_session_is_connectable_listener (wrk, s)))
     {
       rv = vppcom_session_disconnect (sh);