FD.io VPP  v18.07-rc0-415-g6c78436
Vector Packet Processing
application.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef SRC_VNET_SESSION_APPLICATION_H_
17 #define SRC_VNET_SESSION_APPLICATION_H_
18 
19 #include <vnet/vnet.h>
20 #include <vnet/session/session.h>
23 
24 typedef struct _stream_session_cb_vft
25 {
26  /** Notify server of new segment */
27  int (*add_segment_callback) (u32 api_client_index,
28  const ssvm_private_t * ssvm_seg);
29  /** Notify server of new segment */
30  int (*del_segment_callback) (u32 api_client_index,
31  const ssvm_private_t * ssvm_seg);
32 
33  /** Notify server of newly accepted session */
34  int (*session_accept_callback) (stream_session_t * new_session);
35 
36  /** Connection request callback */
37  int (*session_connected_callback) (u32 app_index, u32 opaque,
38  stream_session_t * s, u8 code);
39 
40  /** Notify app that session is closing */
41  void (*session_disconnect_callback) (stream_session_t * s);
42 
43  /** Notify app that session was reset */
44  void (*session_reset_callback) (stream_session_t * s);
45 
46  /** Direct RX callback for built-in application */
47  int (*builtin_app_rx_callback) (stream_session_t * session);
48 
49  /** Direct TX callback for built-in application */
50  int (*builtin_app_tx_callback) (stream_session_t * session);
51 
53 
54 typedef struct _application
55 {
56  /** Index in server pool */
57  u32 index;
58 
59  /** Flags */
60  u32 flags;
61 
62  /** Name registered by builtin apps */
63  u8 *name;
64 
65  /*
66  * Binary API interface to external app
67  */
68 
69  /** Binary API connection index, ~0 if internal */
70  u32 api_client_index;
71 
72  /** Namespace the application belongs to */
73  u32 ns_index;
74 
75  /** Application listens for events on this svm queue */
76  svm_queue_t *event_queue;
77 
78  /*
79  * Callbacks: shoulder-taps for the server/client
80  */
81 
82  session_cb_vft_t cb_fns;
83 
84  /*
85  * ssvm (fifo) segment management
86  */
87  /** Segment manager used for outgoing connects issued by the app */
88  u32 connects_seg_manager;
89 
90  /** Lookup tables for listeners. Value is segment manager index */
91  uword *listeners_table;
92 
93  /**
94  * First segment manager has in the the first segment the application's
95  * event fifo. Depending on what the app does, it may be either used for
96  * a listener or for connects.
97  */
98  u32 first_segment_manager;
99  u8 first_segment_manager_in_use;
100 
101  /** Segment manager properties. Shared by all segment managers */
102  segment_manager_properties_t sm_properties;
103 
104  u16 proxied_transports;
105 
106  /*
107  * Local "cut through" connections specific
108  */
109 
110  /** Segment manager used for incoming "cut through" connects */
111  u32 local_segment_manager;
112 
113  /** Pool of local listen sessions */
114  local_session_t *local_listen_sessions;
115 
116  /** Pool of local sessions the app owns (as a server) */
117  local_session_t *local_sessions;
118 
119  /** Hash table of the app's local connects */
120  uword *local_connects;
121 
122  /*
123  * TLS Specific
124  */
125 
126  /** Certificate to be used for listen sessions */
127  u8 *tls_cert;
128 
129  /** PEM encoded key */
130  u8 *tls_key;
131 
132  /** Preferred tls engine */
133  u8 tls_engine;
134 } application_t;
135 
136 #define APP_INVALID_INDEX ((u32)~0)
137 #define APP_NS_INVALID_INDEX ((u32)~0)
138 #define APP_INVALID_SEGMENT_MANAGER_INDEX ((u32) ~0)
139 
141 int application_init (application_t * app, u32 api_client_index,
142  u8 * name, u64 * options, session_cb_vft_t * cb_fns);
143 void application_del (application_t * app);
146 application_t *application_lookup (u32 api_client_index);
149 
151  session_endpoint_t * tep,
152  session_handle_t * handle);
154  session_endpoint_t * sep,
155  session_handle_t * handle);
158  session_handle_t listener_handle);
160  u32 api_context);
162 
164  app,
166  ls);
168  app);
170 
175 u32 application_session_table (application_t * app, u8 fib_proto);
177 u8 *application_name_from_index (u32 app_index);
178 
183  u8 fib_proto,
184  u8 transport_proto);
187 
189  app_index);
192 
195  local_session_t * ls);
197  u32 session_index);
199  handle);
200 int application_local_session_connect (u32 table_index,
201  application_t * client,
202  application_t * server,
203  local_session_t * ll, u32 opaque);
206  local_session_t * ls);
208  u32 ls_index);
210 
213 {
214  ASSERT (ll->app_index < (2 << 16) && ll->session_index < (2 << 16));
215  return ((u32) ll->app_index << 16 | (u32) ll->session_index);
216 }
217 
218 always_inline void
219 local_session_parse_id (u32 ls_id, u32 * app_index, u32 * session_index)
220 {
221  *app_index = ls_id >> 16;
222  *session_index = ls_id & 0xFFF;
223 }
224 
225 always_inline void
227  u32 * session_index)
228 {
229  u32 bottom;
230  ASSERT ((handle >> 32) == SESSION_LOCAL_HANDLE_PREFIX);
231  bottom = (handle & 0xFFFFFFFF);
232  local_session_parse_id (bottom, server_index, session_index);
233 }
234 
237 {
238  return ((u64) SESSION_LOCAL_HANDLE_PREFIX << 32)
239  | (u64) local_session_id (ls);
240 }
241 
244 {
245  return pool_elt_at_index (app->local_listen_sessions, session_index);
246 }
247 
250 {
251  u32 server_index, session_index;
252  application_t *app;
253  local_session_parse_handle (handle, &server_index, &session_index);
254  app = application_get (server_index);
255  return application_get_local_listen_session (app, session_index);
256 }
257 
260 {
263  return (tp != TRANSPORT_PROTO_NONE);
264 }
265 
267  local_session_t * ls);
268 
269 int application_connect (u32 client_index, u32 api_context,
270  session_endpoint_t * sep);
271 
272 uword unformat_application_proto (unformat_input_t * input, va_list * args);
273 
274 #endif /* SRC_VNET_SESSION_APPLICATION_H_ */
275 
276 /*
277  * fd.io coding-style-patch-verification: ON
278  *
279  * Local Variables:
280  * eval: (c-set-style "gnu")
281  * End:
282  */
session_type_t listener_session_type
Has transport embedded when listener not purely local.
static session_handle_t application_local_session_handle(local_session_t *ls)
Definition: application.h:236
int application_stop_listen(application_t *srv, session_handle_t handle)
Stop listening on session associated to handle.
Definition: application.c:477
struct _segment_manager_properties segment_manager_properties_t
application_t * application_lookup_name(const u8 *name)
Definition: application.c:147
application_t * application_get_if_valid(u32 index)
Definition: application.c:394
unsigned long u64
Definition: types.h:89
void application_remove_proxy(application_t *app)
Definition: application.c:782
int application_connect(u32 client_index, u32 api_context, session_endpoint_t *sep)
int application_start_local_listen(application_t *server, session_endpoint_t *sep, session_handle_t *handle)
Definition: application.c:857
int application_add_segment_notify(u32 app_index, ssvm_private_t *fs)
Send an API message to the external app, to map new segment.
Definition: application.c:600
u32 application_n_listeners(application_t *app)
Definition: application.c:619
#define SESSION_LOCAL_HANDLE_PREFIX
Definition: session.h:28
local_session_t * application_get_local_session_from_handle(session_handle_t handle)
Definition: application.c:837
u64 session_handle_t
Definition: session.h:91
application_t * application_lookup(u32 api_client_index)
Definition: application.c:136
unsigned char u8
Definition: types.h:56
segment_manager_properties_t * application_get_segment_manager_properties(u32 app_index)
Definition: application.c:804
uword unformat_application_proto(unformat_input_t *input, va_list *args)
#define always_inline
Definition: clib.h:92
struct _stream_session_cb_vft session_cb_vft_t
unsigned int u32
Definition: types.h:88
static local_session_t * application_get_local_listen_session(application_t *app, u32 session_index)
Definition: application.h:243
int application_init(application_t *app, u32 api_client_index, u8 *name, u64 *options, session_cb_vft_t *cb_fns)
Definition: application.c:291
segment_manager_t * application_get_listen_segment_manager(application_t *app, stream_session_t *ls)
Definition: application.c:550
struct _stream_session_t stream_session_t
application_t * application_new()
Definition: application.c:158
local_session_t * application_get_local_session(application_t *app, u32 session_index)
Definition: application.c:831
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
Definition: pool.h:461
struct _session_endpoint session_endpoint_t
static void local_session_parse_handle(session_handle_t handle, u32 *server_index, u32 *session_index)
Definition: application.h:226
struct _unformat_input_t unformat_input_t
unsigned short u16
Definition: types.h:57
int application_is_builtin(application_t *app)
Definition: application.c:585
static u8 application_local_session_listener_has_transport(local_session_t *ls)
Definition: application.h:259
static u32 local_session_id(local_session_t *ll)
Definition: application.h:212
int application_local_session_disconnect_w_index(u32 app_index, u32 ls_index)
Definition: application.c:1162
stream_session_t * application_first_listener(application_t *app, u8 fib_proto, u8 transport_proto)
Definition: application.c:625
segment_manager_t * application_get_connect_segment_manager(application_t *app)
Definition: application.c:543
static transport_proto_t session_type_transport_proto(session_type_t st)
Definition: session.h:361
u32 application_get_index(application_t *app)
Definition: application.c:403
local_session_t * application_alloc_local_session(application_t *app)
Definition: application.c:811
struct _application application_t
u8 * application_name_from_index(u32 app_index)
Returns app name.
Definition: application.c:109
int application_open_session(application_t *app, session_endpoint_t *tep, u32 api_context)
Definition: application.c:513
void application_free_local_session(application_t *app, local_session_t *ls)
Definition: application.c:823
#define ASSERT(truth)
u8 application_has_global_scope(application_t *app)
Definition: application.c:613
application_t * application_get(u32 index)
Definition: application.c:386
static local_session_t * application_get_local_listener_w_handle(session_handle_t handle)
Definition: application.h:249
int application_is_proxy(application_t *app)
Definition: application.c:579
static void local_session_parse_id(u32 ls_id, u32 *app_index, u32 *session_index)
Definition: application.h:219
u32 application_session_table(application_t *app, u8 fib_proto)
Definition: application.c:60
int application_start_listen(application_t *app, session_endpoint_t *tep, session_handle_t *handle)
Start listening local transport endpoint for requested transport.
Definition: application.c:436
u32 application_local_session_table(application_t *app)
Definition: application.c:75
void send_local_session_disconnect_callback(u32 app_index, local_session_t *ls)
Definition: session_api.c:232
enum _transport_proto transport_proto_t
segment_manager_properties_t * application_segment_manager_properties(application_t *app)
Definition: application.c:798
u64 uword
Definition: types.h:112
u32 session_index
Session index.
struct _segment_manager segment_manager_t
int application_alloc_connects_segment_manager(application_t *app)
Definition: application.c:528
struct _svm_queue svm_queue_t
u8 application_has_local_scope(application_t *app)
Definition: application.c:607
int application_is_builtin_proxy(application_t *app)
Definition: application.c:591
int application_stop_local_listen(application_t *server, session_handle_t listener_handle)
Clean up local session table.
Definition: application.c:895
int application_local_session_disconnect(u32 app_index, local_session_t *ls)
Definition: application.c:1121
int application_api_queue_is_full(application_t *app)
Definition: application.c:85
int application_local_session_connect_notify(local_session_t *ls)
Definition: application.c:1048
u32 flags
Definition: vhost-user.h:77
int application_local_session_connect(u32 table_index, application_t *client, application_t *server, local_session_t *ll, u32 opaque)
Definition: application.c:942
void application_setup_proxy(application_t *app)
Definition: application.c:766
void application_del(application_t *app)
Definition: application.c:173
void application_local_sessions_del(application_t *app)
Definition: application.c:1172
u32 app_index
Server index.