tls: fix disconnects for sessions with pending data
[vpp.git] / src / vnet / session / session.h
index 879b382..1e08ccc 100644 (file)
@@ -24,7 +24,7 @@
 
 #define HALF_OPEN_LOOKUP_INVALID_VALUE ((u64)~0)
 #define INVALID_INDEX ((u32)~0)
-#define SESSION_PROXY_LISTENER_INDEX ((u32)~0 - 1)
+#define SESSION_PROXY_LISTENER_INDEX ((u8)~0 - 1)
 #define SESSION_LOCAL_HANDLE_PREFIX 0x7FFFFFFF
 
 /* TODO decide how much since we have pre-data as well */
 typedef enum
 {
   FIFO_EVENT_APP_RX,
+  SESSION_IO_EVT_CT_RX,
   FIFO_EVENT_APP_TX,
-  FIFO_EVENT_TIMEOUT,
+  SESSION_IO_EVT_CT_TX,
   FIFO_EVENT_DISCONNECT,
   FIFO_EVENT_BUILTIN_RX,
+  FIFO_EVENT_BUILTIN_TX,
   FIFO_EVENT_RPC,
+  SESSION_CTRL_EVT_BOUND,
+  SESSION_CTRL_EVT_ACCEPTED,
+  SESSION_CTRL_EVT_ACCEPTED_REPLY,
+  SESSION_CTRL_EVT_CONNECTED,
+  SESSION_CTRL_EVT_CONNECTED_REPLY,
+  SESSION_CTRL_EVT_DISCONNECTED,
+  SESSION_CTRL_EVT_DISCONNECTED_REPLY,
+  SESSION_CTRL_EVT_RESET,
+  SESSION_CTRL_EVT_RESET_REPLY
 } session_evt_type_t;
 
 static inline const char *
@@ -49,8 +60,6 @@ fifo_event_type_str (session_evt_type_t et)
       return "FIFO_EVENT_APP_RX";
     case FIFO_EVENT_APP_TX:
       return "FIFO_EVENT_APP_TX";
-    case FIFO_EVENT_TIMEOUT:
-      return "FIFO_EVENT_TIMEOUT";
     case FIFO_EVENT_DISCONNECT:
       return "FIFO_EVENT_DISCONNECT";
     case FIFO_EVENT_BUILTIN_RX:
@@ -112,7 +121,7 @@ typedef struct
       u8 data[0];
     };
   };
-} __clib_packed session_fifo_event_t;
+} __clib_packed session_event_t;
 /* *INDENT-ON* */
 
 #define SESSION_MSG_NULL { }
@@ -168,14 +177,14 @@ typedef struct _session_manager_main session_manager_main_t;
 
 typedef int
   (session_fifo_rx_fn) (vlib_main_t * vm, vlib_node_runtime_t * node,
-                       session_fifo_event_t * e0, stream_session_t * s0,
+                       session_event_t * e0, stream_session_t * s0,
                        int *n_tx_pkts);
 
 extern session_fifo_rx_fn session_tx_fifo_peek_and_snd;
 extern session_fifo_rx_fn session_tx_fifo_dequeue_and_snd;
 extern session_fifo_rx_fn session_tx_fifo_dequeue_internal;
 
-u8 session_node_lookup_fifo_event (svm_fifo_t * f, session_fifo_event_t * e);
+u8 session_node_lookup_fifo_event (svm_fifo_t * f, session_event_t * e);
 
 struct _session_manager_main
 {
@@ -195,13 +204,13 @@ struct _session_manager_main
   u32 **tx_buffers;
 
   /** Per worker-thread vector of partially read events */
-  session_fifo_event_t **free_event_vector;
+  session_event_t **free_event_vector;
 
   /** per-worker active event vectors */
-  session_fifo_event_t **pending_event_vector;
+  session_event_t **pending_event_vector;
 
   /** per-worker postponed disconnects */
-  session_fifo_event_t **pending_disconnects;
+  session_event_t **pending_disconnects;
 
   /** per-worker session context */
   session_tx_context_t *ctx;
@@ -542,17 +551,18 @@ void stream_session_reset_notify (transport_connection_t * tc);
 int stream_session_accept (transport_connection_t * tc, u32 listener_index,
                           u8 notify);
 int session_open (u32 app_index, session_endpoint_t * tep, u32 opaque);
-int stream_session_listen (stream_session_t * s, session_endpoint_t * tep);
-int stream_session_stop_listen (stream_session_t * s);
+int session_listen (stream_session_t * s, session_endpoint_extended_t * sep);
+int session_stop_listen (stream_session_t * s);
 void stream_session_disconnect (stream_session_t * s);
 void stream_session_disconnect_transport (stream_session_t * s);
 void stream_session_cleanup (stream_session_t * s);
 int session_send_io_evt_to_thread (svm_fifo_t * f,
                                   session_evt_type_t evt_type);
-int session_send_io_evt_to_thread_custom (svm_fifo_t * f, u32 thread_index,
+int session_send_io_evt_to_thread_custom (void *data, u32 thread_index,
                                          session_evt_type_t evt_type);
 void session_send_rpc_evt_to_thread (u32 thread_index, void *fp,
                                     void *rpc_args);
+
 ssvm_private_t *session_manager_get_evt_q_segment (void);
 
 u8 *format_stream_session (u8 * s, va_list * args);
@@ -564,6 +574,15 @@ void session_register_transport (transport_proto_t transport_proto,
                                 const transport_proto_vft_t * vft, u8 is_ip4,
                                 u32 output_node);
 
+always_inline void
+transport_add_tx_event (transport_connection_t * tc)
+{
+  stream_session_t *s = session_get (tc->s_index, tc->thread_index);
+  if (svm_fifo_has_event (s->server_tx_fifo))
+    return;
+  session_send_io_evt_to_thread (s->server_tx_fifo, FIFO_EVENT_APP_TX);
+}
+
 clib_error_t *vnet_session_enable_disable (vlib_main_t * vm, u8 is_en);
 
 always_inline svm_msg_q_t *