diff options
author | Florin Coras <fcoras@cisco.com> | 2018-02-08 15:10:09 -0800 |
---|---|---|
committer | Florin Coras <fcoras@cisco.com> | 2018-02-14 00:54:43 -0800 |
commit | f8f516a8b0ccab2f5d9796f90419bf2661c750af (patch) | |
tree | f02f6c01ed1bf33aeb4ebb5714af470e537f87c2 /src/vnet/session/application.h | |
parent | 7758bf68a03a32f17c07154172157f5bdf30e684 (diff) |
session: support local sessions and deprecate redirects
Memfd backed shared memory segments can only be negotiated over sockets.
For such scenarios, the existing redirect mechanism that establishes
cut-through sessions does not work anymore as the two peer application
do not share such a socket.
This patch adds support for local sessions, as opposed to sessions
backed by a transport connection, in a way that is almost transparent to
the two applications by reusing the existing binary api messages.
Moreover, all segment allocations are now entirely done through the
segment manager valloc, so segment overlaps due to independent
allocations previously required for redirects are completely avoided.
The one notable characteristic of local sessions (cut-through from app
perspective) notification messages is that they carry pointers to two
event queues, one for each app peer, instead of one. For
transport-backed sessions one of the queues can be inferred but for
local session they cannot.
Change-Id: Ia443fb63e2d9d8e43490275062a708f039038175
Signed-off-by: Florin Coras <fcoras@cisco.com>
Diffstat (limited to 'src/vnet/session/application.h')
-rw-r--r-- | src/vnet/session/application.h | 98 |
1 files changed, 91 insertions, 7 deletions
diff --git a/src/vnet/session/application.h b/src/vnet/session/application.h index 36ae6fce8b2..4938bef08bd 100644 --- a/src/vnet/session/application.h +++ b/src/vnet/session/application.h @@ -32,6 +32,9 @@ typedef struct _stream_session_cb_vft /** Notify server of new segment */ int (*add_segment_callback) (u32 api_client_index, const ssvm_private_t * ssvm_seg); + /** Notify server of new segment */ + int (*del_segment_callback) (u32 api_client_index, + const ssvm_private_t * ssvm_seg); /** Notify server of newly accepted session */ int (*session_accept_callback) (stream_session_t * new_session); @@ -49,8 +52,6 @@ typedef struct _stream_session_cb_vft /** Direct RX callback, for built-in servers */ int (*builtin_server_rx_callback) (stream_session_t * session); - /** Redirect connection to local server */ - int (*redirect_connect_callback) (u32 api_client_index, void *mp); } session_cb_vft_t; typedef struct _application @@ -81,8 +82,9 @@ typedef struct _application session_cb_vft_t cb_fns; /* - * svm segment management + * ssvm (fifo) segment management */ + /** Segment manager used for outgoing connects issued by the app */ u32 connects_seg_manager; /** Lookup tables for listeners. Value is segment manager index */ @@ -100,10 +102,25 @@ typedef struct _application segment_manager_properties_t sm_properties; u16 proxied_transports; + + /* + * Local "cut through" connections specific + */ + + /** Segment manager used for incoming "cut through" connects */ + u32 local_segment_manager; + + /** Pool of local listen sessions */ + local_session_t *local_listen_sessions; + + /** Pool of local sessions the app owns (as a server) */ + local_session_t *local_sessions; + + /** Hash table of the app's local connects */ + uword *local_connects; } application_t; #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) @@ -117,8 +134,14 @@ application_t *application_lookup (u32 api_client_index); u32 application_get_index (application_t * app); int application_start_listen (application_t * app, - session_endpoint_t * tep, u64 * handle); -int application_stop_listen (application_t * srv, u64 handle); + session_endpoint_t * tep, + session_handle_t * handle); +int application_start_local_listen (application_t * server, + session_endpoint_t * sep, + session_handle_t * handle); +int application_stop_listen (application_t * srv, session_handle_t handle); +int application_stop_local_listen (application_t * server, + session_handle_t listener_handle); int application_open_session (application_t * app, session_endpoint_t * tep, u32 api_context); int application_api_queue_is_full (application_t * app); @@ -126,7 +149,7 @@ int application_api_queue_is_full (application_t * app); segment_manager_t *application_get_listen_segment_manager (application_t * app, stream_session_t * - s); + ls); segment_manager_t *application_get_connect_segment_manager (application_t * app); int application_is_proxy (application_t * app); @@ -151,6 +174,67 @@ segment_manager_properties_t *application_get_segment_manager_properties (u32 segment_manager_properties_t * application_segment_manager_properties (application_t * app); +local_session_t *application_alloc_local_session (application_t * app); +void application_free_local_session (application_t * app, + local_session_t * ls); +local_session_t *application_get_local_session (application_t * app, + u32 session_index); +local_session_t *application_get_local_session_from_handle (session_handle_t + handle); +int application_local_session_connect (u32 table_index, + application_t * client, + application_t * server, + local_session_t * ll, u32 opaque); +int application_local_session_connect_notify (local_session_t * ls); +int application_local_session_disconnect (u32 app_index, + local_session_t * ls); +void application_local_sessions_del (application_t * app); + +always_inline u32 +local_session_id (local_session_t * ll) +{ + ASSERT (ll->app_index < (2 << 16) && ll->session_index < (2 << 16)); + return ((u32) ll->app_index << 16 | (u32) ll->session_index); +} + +always_inline void +local_session_parse_id (u32 ls_id, u32 * app_index, u32 * session_index) +{ + *app_index = ls_id >> 16; + *session_index = ls_id & 0xFFF; +} + +always_inline void +local_session_parse_handle (session_handle_t handle, u32 * server_index, + u32 * session_index) +{ + u32 bottom; + ASSERT ((handle >> 32) == SESSION_LOCAL_TABLE_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); +} + +always_inline local_session_t * +application_get_local_listen_session (application_t * app, u32 session_index) +{ + return pool_elt_at_index (app->local_listen_sessions, session_index); +} + +always_inline u8 +application_local_session_listener_has_transport (local_session_t * ls) +{ + transport_proto_t tp; + tp = session_type_transport_proto (ls->listener_session_type); + return (tp != TRANSPORT_PROTO_NONE); +} + + #endif /* SRC_VNET_SESSION_APPLICATION_H_ */ /* |