#ifndef SRC_VNET_SESSION_APPLICATION_H_
#define SRC_VNET_SESSION_APPLICATION_H_
-#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_N_TYPES
-} application_type_t;
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 */
- int (*builtin_server_rx_callback) (stream_session_t * session);
+ /** Direct RX callback for built-in application */
+ int (*builtin_app_rx_callback) (stream_session_t * session);
+
+ /** Direct TX callback for built-in application */
+ int (*builtin_app_tx_callback) (stream_session_t * session);
} session_cb_vft_t;
/** Flags */
u32 flags;
+ /** Name registered by builtin apps */
+ u8 *name;
+
/*
* Binary API interface to external app
*/
/** Hash table of the app's local connects */
uword *local_connects;
+
+ /*
+ * TLS Specific
+ */
+
+ /** Certificate to be used for listen sessions */
+ u8 *tls_cert;
+
+ /** PEM encoded key */
+ u8 *tls_key;
+
+ /** Preferred tls engine */
+ u8 tls_engine;
} application_t;
#define APP_INVALID_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);
+ u8 * name, 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);
+application_t *application_lookup_name (const u8 * name);
u32 application_get_index (application_t * app);
int application_start_listen (application_t * app,
ls);
segment_manager_t *application_get_connect_segment_manager (application_t *
app);
+int application_alloc_connects_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_local_session_connect_notify (local_session_t * ls);
int application_local_session_disconnect (u32 app_index,
local_session_t * ls);
+int application_local_session_disconnect_w_index (u32 app_index,
+ u32 ls_index);
void application_local_sessions_del (application_t * app);
always_inline u32
u32 * session_index)
{
u32 bottom;
- ASSERT ((handle >> 32) == SESSION_LOCAL_TABLE_PREFIX);
+ ASSERT ((handle >> 32) == SESSION_LOCAL_HANDLE_PREFIX);
bottom = (handle & 0xFFFFFFFF);
local_session_parse_id (bottom, server_index, session_index);
}
always_inline session_handle_t
application_local_session_handle (local_session_t * ls)
{
- return ((u64) SESSION_LOCAL_TABLE_PREFIX << 32) | local_session_id (ls);
+ return ((u64) SESSION_LOCAL_HANDLE_PREFIX << 32)
+ | (u64) local_session_id (ls);
}
always_inline local_session_t *
return pool_elt_at_index (app->local_listen_sessions, session_index);
}
+always_inline local_session_t *
+application_get_local_listener_w_handle (session_handle_t handle)
+{
+ u32 server_index, session_index;
+ application_t *app;
+ local_session_parse_handle (handle, &server_index, &session_index);
+ app = application_get (server_index);
+ return application_get_local_listen_session (app, session_index);
+}
+
always_inline u8
application_local_session_listener_has_transport (local_session_t * ls)
{
return (tp != TRANSPORT_PROTO_NONE);
}
+void send_local_session_disconnect_callback (u32 app_index,
+ local_session_t * ls);
+
+int application_connect (u32 client_index, u32 api_context,
+ session_endpoint_t * sep);
+
+uword unformat_application_proto (unformat_input_t * input, va_list * args);
#endif /* SRC_VNET_SESSION_APPLICATION_H_ */