vxlan-gbp: Mark APIs as in-progress
[vpp.git] / src / vnet / session / application_local.c
index e332593..8143500 100644 (file)
@@ -95,15 +95,16 @@ ct_session_connect_notify (session_t * ss)
   ct_connection_t *sct, *cct;
   app_worker_t *client_wrk;
   segment_manager_t *sm;
+  u32 ss_index, opaque;
   fifo_segment_t *seg;
   u64 segment_handle;
   int err = 0;
   session_t *cs;
-  u32 ss_index;
 
   ss_index = ss->session_index;
   sct = (ct_connection_t *) session_get_transport (ss);
   client_wrk = app_worker_get (sct->client_wrk);
+  opaque = sct->client_opaque;
 
   sm = segment_manager_get (ss->rx_fifo->segment_manager);
   seg = segment_manager_get_segment_w_lock (sm, ss->rx_fifo->segment_index);
@@ -115,6 +116,7 @@ ct_session_connect_notify (session_t * ss)
                    sct->client_wrk);
       segment_manager_segment_reader_unlock (sm);
       session_close (ss);
+      goto error;
     }
   else
     {
@@ -143,15 +145,20 @@ ct_session_connect_notify (session_t * ss)
   /* This will allocate fifos for the session. They won't be used for
    * exchanging data but they will be used to close the connection if
    * the segment manager/worker is freed */
-  if (app_worker_init_connected (client_wrk, cs))
+  if ((err = app_worker_init_connected (client_wrk, cs)))
     {
       session_close (ss);
-      return -1;
+      session_free (cs);
+      goto error;
     }
 
-  if (app_worker_connect_notify (client_wrk, cs, err, sct->client_opaque))
+  cs->session_state = SESSION_STATE_CONNECTING;
+
+  if (app_worker_connect_notify (client_wrk, cs, err, opaque))
     {
       session_close (ss);
+      segment_manager_dealloc_fifos (cs->rx_fifo, cs->tx_fifo);
+      session_free (cs);
       return -1;
     }
 
@@ -159,6 +166,10 @@ ct_session_connect_notify (session_t * ss)
   cs->session_state = SESSION_STATE_READY;
 
   return 0;
+
+error:
+  app_worker_connect_notify (client_wrk, 0, err, opaque);
+  return -1;
 }
 
 static int
@@ -213,6 +224,10 @@ ct_init_local_session (app_worker_t * client_wrk, app_worker_t * server_wrk,
   ls->rx_fifo->segment_index = seg_index;
   ls->tx_fifo->segment_index = seg_index;
 
+  /* Disable ooo lookups on the cut-through fifos. TODO remove once init of
+   * chunk lookup rbtrees is delegated to transports */
+  svm_fifo_free_chunk_lookup (ls->tx_fifo);
+
   segment_handle = segment_manager_segment_handle (sm, seg);
   if ((rv = app_worker_add_segment_notify (server_wrk, segment_handle)))
     {
@@ -475,6 +490,9 @@ ct_custom_tx (void *session, transport_send_params_t * sp)
   session_t *s = (session_t *) session;
   if (session_has_transport (s))
     return 0;
+  /* As all other sessions, cut-throughs are scheduled by vpp for tx so let
+   * the scheduler's custom tx logic decide when to deschedule, i.e., after
+   * fifo is emptied. */
   return ct_session_tx (s);
 }
 
@@ -573,11 +591,14 @@ ct_session_tx (session_t * s)
   ct = (ct_connection_t *) session_get_transport (s);
   peer_ct = ct_connection_get (ct->peer_index);
   if (!peer_ct)
-    return -1;
+    return 0;
   peer_s = session_get (peer_ct->c_s_index, 0);
   if (peer_s->session_state >= SESSION_STATE_TRANSPORT_CLOSING)
     return 0;
-  return session_enqueue_notify (peer_s);
+  session_enqueue_notify (peer_s);
+  /* The scheduler uses packet count as a means of upper bounding the amount
+   * of work done per dispatch. So make it look like we have sent something */
+  return 1;
 }
 
 static clib_error_t *