tcp: state machine improvements
[vpp.git] / src / vnet / session / session.c
index 991bcd5..843d474 100644 (file)
@@ -98,9 +98,9 @@ session_enqueue_chain_tail (stream_session_t * s, vlib_buffer_t * b,
                            u32 offset, u8 is_in_order)
 {
   vlib_buffer_t *chain_b;
-  u32 chain_bi = b->next_buffer;
+  u32 chain_bi = b->next_buffer, len;
   vlib_main_t *vm = vlib_get_main ();
-  u8 *data, len;
+  u8 *data;
   u16 written = 0;
   int rv = 0;
 
@@ -226,7 +226,7 @@ u32
 stream_session_tx_fifo_max_dequeue (transport_connection_t * tc)
 {
   stream_session_t *s = stream_session_get (tc->s_index, tc->thread_index);
-  if (s->session_state != SESSION_STATE_READY)
+  if (!s->server_tx_fifo)
     return 0;
   return svm_fifo_max_dequeue (s->server_tx_fifo);
 }
@@ -266,7 +266,13 @@ stream_session_enqueue_notify (stream_session_t * s, u8 block)
     return 0;
 
   /* Get session's server */
-  app = application_get (s->app_index);
+  app = application_get_if_valid (s->app_index);
+
+  if (PREDICT_FALSE (app == 0))
+    {
+      clib_warning ("invalid s->app_index = %d", s->app_index);
+      return 0;
+    }
 
   /* Built-in server? Hand event to the callback... */
   if (app->cb_fns.builtin_server_rx_callback)
@@ -327,8 +333,9 @@ session_manager_flush_enqueue_events (u32 thread_index)
       stream_session_t *s0;
 
       /* Get session */
-      s0 = stream_session_get (session_indices_to_enqueue[i], thread_index);
-      if (stream_session_enqueue_notify (s0, 0 /* don't block */ ))
+      s0 = stream_session_get_if_valid (session_indices_to_enqueue[i],
+                                       thread_index);
+      if (s0 == 0 || stream_session_enqueue_notify (s0, 0 /* don't block */ ))
        {
          errors++;
        }
@@ -366,7 +373,7 @@ stream_session_connect_notify (transport_connection_t * tc, u8 is_fail)
   application_t *app;
   stream_session_t *new_s = 0;
   u64 handle;
-  u32 api_context = 0;
+  u32 opaque = 0;
   int error = 0;
 
   handle = stream_session_half_open_lookup_handle (&tc->lcl_ip, &tc->rmt_ip,
@@ -378,9 +385,11 @@ stream_session_connect_notify (transport_connection_t * tc, u8 is_fail)
       return -1;
     }
 
-  /* Get the app's index from the handle we stored when opening connection */
+  /* Get the app's index from the handle we stored when opening connection
+   * and the opaque (api_context for external apps) from transport session
+   * index*/
   app = application_get (handle >> 32);
-  api_context = tc->s_index;
+  opaque = tc->s_index;
 
   if (!is_fail)
     {
@@ -399,7 +408,7 @@ stream_session_connect_notify (transport_connection_t * tc, u8 is_fail)
     }
 
   /* Notify client application */
-  if (app->cb_fns.session_connected_callback (app->index, api_context, new_s,
+  if (app->cb_fns.session_connected_callback (app->index, opaque, new_s,
                                              is_fail))
     {
       clib_warning ("failed to notify app");