session vcl: refactor builtin tx event for main tx
[vpp.git] / src / vnet / session / session_api.c
index f6170de..3481cdf 100644 (file)
@@ -314,6 +314,8 @@ mq_send_session_bound_cb (u32 app_wrk_index, u32 api_context,
   if (session_transport_service_type (ls) == TRANSPORT_SERVICE_CL &&
       ls->rx_fifo)
     {
+      m.mq_index = transport_cl_thread ();
+      m.vpp_evt_q = fifo_segment_msg_q_offset (eq_seg, m.mq_index);
       m.rx_fifo = fifo_segment_fifo_offset (ls->rx_fifo);
       m.tx_fifo = fifo_segment_fifo_offset (ls->tx_fifo);
       m.segment_handle = session_segment_handle (ls);
@@ -1372,6 +1374,31 @@ done:
   clib_socket_sendmsg (cs, &msg, sizeof (msg), fds, n_fds);
 }
 
+/* This is a workaround for the case when session layer starts reading
+ * the socket before the client actualy sends the data
+ */
+static clib_error_t *
+sapi_socket_receive_wait (clib_socket_t *cs, u8 *msg, u32 msg_len)
+{
+  clib_error_t *err;
+  int n_tries = 5;
+
+  while (1)
+    {
+      err = clib_socket_recvmsg (cs, msg, msg_len, 0, 0);
+      if (!err)
+       break;
+
+      if (!n_tries)
+       return err;
+
+      n_tries--;
+      usleep (1);
+    }
+
+  return err;
+}
+
 static void
 sapi_add_del_cert_key_handler (app_namespace_t *app_ns, clib_socket_t *cs,
                               app_sapi_cert_key_add_del_msg_t *mp)
@@ -1395,11 +1422,11 @@ sapi_add_del_cert_key_handler (app_namespace_t *app_ns, clib_socket_t *cs,
        }
 
       vec_validate (certkey, mp->certkey_len - 1);
-      err = clib_socket_recvmsg (cs, certkey, mp->certkey_len, 0, 0);
+
+      err = sapi_socket_receive_wait (cs, certkey, mp->certkey_len);
       if (err)
        {
          clib_error_report (err);
-         clib_error_free (err);
          rv = SESSION_E_INVALID;
          goto send_reply;
        }
@@ -1460,7 +1487,9 @@ sapi_socket_detach (app_namespace_t * app_ns, clib_socket_t * cs)
 
   /* Cleanup everything because app worker closed socket or crashed */
   handle = (app_ns_api_handle_t *) & cs->private_data;
-  app_wrk = app_worker_get (handle->aah_app_wrk_index);
+  app_wrk = app_worker_get_if_valid (handle->aah_app_wrk_index);
+  if (!app_wrk)
+    return;
 
   vnet_app_worker_add_del_args_t args = {
     .app_index = app_wrk->app_index,