api: refactor vlibmemory
[vpp.git] / src / vnet / session / application.h
index 480828f..fd6454f 100644 (file)
 
 #include <vnet/vnet.h>
 #include <vnet/session/session.h>
-
+#include <vnet/session/segment_manager.h>
+#include <vnet/session/application_namespace.h>
 typedef enum
 {
   APP_SERVER,
-  APP_CLIENT
+  APP_CLIENT,
+  APP_N_TYPES
 } application_type_t;
 
 typedef struct _stream_session_cb_vft
@@ -34,8 +36,8 @@ typedef struct _stream_session_cb_vft
   /** Notify server of newly accepted session */
   int (*session_accept_callback) (stream_session_t * new_session);
 
-  /* Connection request callback */
-  int (*session_connected_callback) (u32 api_client_index,
+  /** Connection request callback */
+  int (*session_connected_callback) (u32 app_index, u32 opaque,
                                     stream_session_t * s, u8 code);
 
   /** Notify app that session is closing */
@@ -44,10 +46,10 @@ typedef struct _stream_session_cb_vft
   /** Notify app that session was reset */
   void (*session_reset_callback) (stream_session_t * s);
 
-  /* Direct RX callback, for built-in servers */
+  /** Direct RX callback, for built-in servers */
   int (*builtin_server_rx_callback) (stream_session_t * session);
 
-  /* Redirect connection to local server */
+  /** Redirect connection to local server */
   int (*redirect_connect_callback) (u32 api_client_index, void *mp);
 } session_cb_vft_t;
 
@@ -59,57 +61,91 @@ typedef struct _application
   /** Flags */
   u32 flags;
 
+  /*
+   * Binary API interface to external app
+   */
+
   /** Binary API connection index, ~0 if internal */
   u32 api_client_index;
 
-  /* */
-  u32 api_context;
+  /** Namespace the application belongs to */
+  u32 ns_index;
 
   /** Application listens for events on this svm queue */
-  unix_shared_memory_queue_t *event_queue;
+  svm_queue_t *event_queue;
 
-  /** Stream session type */
-  u8 session_type;
-
-  /* Stream server mode: accept or connect */
-  u8 mode;
+  /*
+   * Callbacks: shoulder-taps for the server/client
+   */
 
-  u32 session_manager_index;
+  session_cb_vft_t cb_fns;
 
   /*
-   * Bind/Listen specific
+   * svm segment management
    */
+  u32 connects_seg_manager;
 
-  /** Accept cookie, for multiple session flavors ($$$ maybe) */
-  u32 accept_cookie;
+  /** Lookup tables for listeners. Value is segment manager index */
+  uword *listeners_table;
 
-  /** Index of the listen session or connect session */
-  u32 session_index;
+  /**
+   * First segment manager has in the the first segment the application's
+   * event fifo. Depending on what the app does, it may be either used for
+   * a listener or for connects.
+   */
+  u32 first_segment_manager;
+  u8 first_segment_manager_in_use;
 
-  /** Session thread index for client connect sessions */
-  u32 thread_index;
+  /** Segment manager properties. Shared by all segment managers */
+  u32 sm_properties;
 
-  /*
-   * Callbacks: shoulder-taps for the server/client
-   */
-  session_cb_vft_t cb_fns;
+  u16 proxied_transports;
 } application_t;
 
-application_t *application_new (application_type_t type, session_type_t sst,
-                               u32 api_client_index, u32 flags,
-                               session_cb_vft_t * cb_fns);
+#define APP_INVALID_INDEX ((u32)~0)
+#define APP_DROP_INDEX (((u32)~0) - 1)
+#define APP_NS_INVALID_INDEX ((u32)~0)
+#define APP_INVALID_SEGMENT_MANAGER_INDEX ((u32) ~0)
+
+application_t *application_new ();
+int application_init (application_t * app, u32 api_client_index,
+                     u64 * options, session_cb_vft_t * cb_fns);
 void application_del (application_t * app);
 application_t *application_get (u32 index);
 application_t *application_get_if_valid (u32 index);
 application_t *application_lookup (u32 api_client_index);
 u32 application_get_index (application_t * app);
 
-int
-application_server_init (application_t * server, u32 segment_size,
-                        u32 add_segment_size, u32 rx_fifo_size,
-                        u32 tx_fifo_size, u8 ** segment_name);
+int application_start_listen (application_t * app,
+                             session_endpoint_t * tep, u64 * handle);
+int application_stop_listen (application_t * srv, u64 handle);
+int application_open_session (application_t * app, session_endpoint_t * tep,
+                             u32 api_context);
 int application_api_queue_is_full (application_t * app);
 
+segment_manager_t *application_get_listen_segment_manager (application_t *
+                                                          app,
+                                                          stream_session_t *
+                                                          s);
+segment_manager_t *application_get_connect_segment_manager (application_t *
+                                                           app);
+int application_is_proxy (application_t * app);
+int application_is_builtin (application_t * app);
+int application_is_builtin_proxy (application_t * app);
+int application_add_segment_notify (u32 app_index, u32 fifo_segment_index);
+u32 application_session_table (application_t * app, u8 fib_proto);
+u32 application_local_session_table (application_t * app);
+u8 *application_name_from_index (u32 app_index);
+
+u8 application_has_local_scope (application_t * app);
+u8 application_has_global_scope (application_t * app);
+u32 application_n_listeners (application_t * app);
+stream_session_t *application_first_listener (application_t * app,
+                                             u8 fib_proto,
+                                             u8 transport_proto);
+void application_setup_proxy (application_t * app);
+void application_remove_proxy (application_t * app);
+
 #endif /* SRC_VNET_SESSION_APPLICATION_H_ */
 
 /*