FD.io VPP  v18.07.1-19-g511ce25
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/session/session.h>
22 
23 typedef struct _stream_session_cb_vft
24 {
25  /** Notify server of new segment */
26  int (*add_segment_callback) (u32 api_client_index,
27  const ssvm_private_t * ssvm_seg);
28  /** Notify server of new segment */
29  int (*del_segment_callback) (u32 api_client_index,
30  const ssvm_private_t * ssvm_seg);
31 
32  /** Notify server of newly accepted session */
33  int (*session_accept_callback) (stream_session_t * new_session);
34 
35  /** Connection request callback */
36  int (*session_connected_callback) (u32 app_index, u32 opaque,
37  stream_session_t * s, u8 code);
38 
39  /** Notify app that session is closing */
40  void (*session_disconnect_callback) (stream_session_t * s);
41 
42  /** Notify app that session was reset */
43  void (*session_reset_callback) (stream_session_t * s);
44 
45  /** Direct RX callback for built-in application */
46  int (*builtin_app_rx_callback) (stream_session_t * session);
47 
48  /** Direct TX callback for built-in application */
49  int (*builtin_app_tx_callback) (stream_session_t * session);
50 
52 
53 typedef struct _application
54 {
55  /** Index in server pool */
56  u32 index;
57 
58  /** Flags */
59  u32 flags;
60 
61  /** Name registered by builtin apps */
62  u8 *name;
63 
64  /*
65  * Binary API interface to external app
66  */
67 
68  /** Binary API connection index, ~0 if internal */
69  u32 api_client_index;
70 
71  /** Namespace the application belongs to */
72  u32 ns_index;
73 
74  /** Application listens for events on this svm queue */
75  svm_queue_t *event_queue;
76 
77  /*
78  * Callbacks: shoulder-taps for the server/client
79  */
80 
81  session_cb_vft_t cb_fns;
82 
83  /*
84  * ssvm (fifo) segment management
85  */
86  /** Segment manager used for outgoing connects issued by the app */
87  u32 connects_seg_manager;
88 
89  /** Lookup tables for listeners. Value is segment manager index */
90  uword *listeners_table;
91 
92  /**
93  * First segment manager has in the the first segment the application's
94  * event fifo. Depending on what the app does, it may be either used for
95  * a listener or for connects.
96  */
97  u32 first_segment_manager;
98  u8 first_segment_manager_in_use;
99 
100  /** Segment manager properties. Shared by all segment managers */
101  segment_manager_properties_t sm_properties;
102 
103  u16 proxied_transports;
104 
105  /*
106  * Local "cut through" connections specific
107  */
108 
109  /** Segment manager used for incoming "cut through" connects */
110  u32 local_segment_manager;
111 
112  /** Pool of local listen sessions */
113  local_session_t *local_listen_sessions;
114 
115  /** Pool of local sessions the app owns (as a server) */
116  local_session_t *local_sessions;
117 
118  /** Hash table of the app's local connects */
119  uword *local_connects;
120 
121  /*
122  * TLS Specific
123  */
124 
125  /** Certificate to be used for listen sessions */
126  u8 *tls_cert;
127 
128  /** PEM encoded key */
129  u8 *tls_key;
130 
131  /** Preferred tls engine */
132  u8 tls_engine;
133 } application_t;
134 
135 #define APP_INVALID_INDEX ((u32)~0)
136 #define APP_NS_INVALID_INDEX ((u32)~0)
137 #define APP_INVALID_SEGMENT_MANAGER_INDEX ((u32) ~0)
138 
140 int application_init (application_t * app, u32 api_client_index,
141  u8 * name, u64 * options, session_cb_vft_t * cb_fns);
142 void application_del (application_t * app);
145 application_t *application_lookup (u32 api_client_index);
148 
150  session_endpoint_t * tep,
151  session_handle_t * handle);
153  session_endpoint_t * sep,
154  session_handle_t * handle);
157  session_handle_t listener_handle);
159  u32 api_context);
161 
163  app,
165  ls);
167  app);
169 
174 u32 application_session_table (application_t * app, u8 fib_proto);
176 u8 *application_name_from_index (u32 app_index);
177 
182  u8 fib_proto,
183  u8 transport_proto);
186 
188  app_index);
191 
194  local_session_t * ls);
196  u32 session_index);
198  handle);
199 int application_local_session_connect (u32 table_index,
200  application_t * client,
201  application_t * server,
202  local_session_t * ll, u32 opaque);
205  local_session_t * ls);
207  u32 ls_index);
209 
212 {
213  ASSERT (ll->app_index < (2 << 16) && ll->session_index < (2 << 16));
214  return ((u32) ll->app_index << 16 | (u32) ll->session_index);
215 }
216 
217 always_inline void
218 local_session_parse_id (u32 ls_id, u32 * app_index, u32 * session_index)
219 {
220  *app_index = ls_id >> 16;
221  *session_index = ls_id & 0xFFF;
222 }
223 
224 always_inline void
226  u32 * session_index)
227 {
228  u32 bottom;
229  ASSERT ((handle >> 32) == SESSION_LOCAL_HANDLE_PREFIX);
230  bottom = (handle & 0xFFFFFFFF);
231  local_session_parse_id (bottom, server_index, session_index);
232 }
233 
236 {
237  return ((u64) SESSION_LOCAL_HANDLE_PREFIX << 32)
238  | (u64) local_session_id (ls);
239 }
240 
243 {
244  return pool_elt_at_index (app->local_listen_sessions, session_index);
245 }
246 
249 {
250  u32 server_index, session_index;
251  application_t *app;
252  local_session_parse_handle (handle, &server_index, &session_index);
253  app = application_get (server_index);
254  return application_get_local_listen_session (app, session_index);
255 }
256 
259 {
262  return (tp != TRANSPORT_PROTO_NONE);
263 }
264 
266  local_session_t * ls);
267 
268 int application_connect (u32 client_index, u32 api_context,
269  session_endpoint_t * sep);
270 
271 uword unformat_application_proto (unformat_input_t * input, va_list * args);
272 
273 #endif /* SRC_VNET_SESSION_APPLICATION_H_ */
274 
275 /*
276  * fd.io coding-style-patch-verification: ON
277  *
278  * Local Variables:
279  * eval: (c-set-style "gnu")
280  * End:
281  */
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:235
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:242
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:464
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:225
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:258
static u32 local_session_id(local_session_t *ll)
Definition: application.h:211
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
u32 flags
Definition: vhost_user.h:110
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:248
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:218
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
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.