FD.io VPP  v18.07-rc0-415-g6c78436
Vector Packet Processing
application_interface.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 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 #ifndef __included_uri_h__
16 #define __included_uri_h__
17 
18 #include <vlib/vlib.h>
19 #include <vnet/vnet.h>
20 #include <svm/svm_fifo_segment.h>
21 #include <vnet/session/session.h>
23 #include <vnet/session/transport.h>
24 #include <vnet/tls/tls.h>
25 
26 typedef struct _vnet_app_attach_args_t
27 {
28  /** Binary API client index */
29  u32 api_client_index;
30 
31  /** Application name. Used by builtin apps */
32  u8 *name;
33 
34  /** Application and segment manager options */
35  u64 *options;
36 
37  /** ID of the namespace the app has access to */
38  u8 *namespace_id;
39 
40  /** Session to application callback functions */
42 
43  /*
44  * Results
45  */
46  ssvm_private_t *segment;
47  u64 app_event_queue_address;
48  u32 app_index;
50 
51 typedef struct _vnet_app_detach_args_t
52 {
53  u32 app_index;
55 
56 typedef struct _vnet_bind_args_t
57 {
58  union
59  {
60  char *uri;
62  };
63 
64  u32 app_index;
65 
66  /*
67  * Results
68  */
69  char *segment_name;
70  u32 segment_name_length;
71  u64 server_event_queue_address;
72  u64 handle;
74 
75 typedef struct _vnet_unbind_args_t
76 {
77  union
78  {
79  char *uri;
80  u64 handle;
81  };
82  u32 app_index;
84 
85 typedef struct _vnet_connect_args
86 {
87  union
88  {
89  char *uri;
91  };
92  u32 app_index;
93  u32 api_context;
94 
97 
98 typedef struct _vnet_disconnect_args_t
99 {
100  session_handle_t handle;
101  u32 app_index;
103 
104 typedef struct _vnet_application_add_tls_cert_args_t
105 {
106  u32 app_index;
107  u8 *cert;
109 
110 typedef struct _vnet_application_add_tls_key_args_t
111 {
112  u32 app_index;
113  u8 *key;
115 
116 /* Application attach options */
117 typedef enum
118 {
134 
135 #define foreach_app_options_flags \
136  _(ACCEPT_REDIRECT, "Use FIFO with redirects") \
137  _(ADD_SEGMENT, "Add segment and signal app if needed") \
138  _(IS_BUILTIN, "Application is builtin") \
139  _(IS_PROXY, "Application is proxying") \
140  _(USE_GLOBAL_SCOPE, "App can use global session scope") \
141  _(USE_LOCAL_SCOPE, "App can use local session scope")
142 
143 typedef enum _app_options
144 {
145 #define _(sym, str) APP_OPTIONS_##sym,
147 #undef _
148 } app_options_t;
149 
150 typedef enum _app_options_flags
151 {
152 #define _(sym, str) APP_OPTIONS_FLAGS_##sym = 1 << APP_OPTIONS_##sym,
154 #undef _
156 
160 
167 
170 
171 extern const char test_srv_crt_rsa[];
172 extern const u32 test_srv_crt_rsa_len;
173 extern const char test_srv_key_rsa[];
174 extern const u32 test_srv_key_rsa_len;
175 
177 {
178  ip46_address_t rmt_ip; /**< remote ip */
179  ip46_address_t lcl_ip; /**< local ip */
180  u16 rmt_port; /**< remote port */
181  u16 lcl_port; /**< local port */
182  u8 is_ip4; /**< set if uses ip4 networking */
184 
185 typedef struct app_session_
186 {
187  svm_fifo_t *rx_fifo; /**< rx fifo */
188  svm_fifo_t *tx_fifo; /**< tx fifo */
189  session_type_t session_type; /**< session type */
190  volatile u8 session_state; /**< session state */
191  u32 session_index; /**< index in owning pool */
192  app_session_transport_t transport; /**< transport info */
193  svm_queue_t *vpp_evt_q; /**< vpp event queue for session */
194  u8 is_dgram; /**< set if it works in dgram mode */
195 } app_session_t;
196 
197 always_inline int
199  svm_queue_t * vpp_evt_q, u8 * data, u32 len, u8 noblock)
200 {
201  u32 max_enqueue, actual_write;
202  session_dgram_hdr_t hdr;
203  session_fifo_event_t evt;
204  int rv;
205 
206  max_enqueue = svm_fifo_max_enqueue (f);
207  if (max_enqueue <= sizeof (session_dgram_hdr_t))
208  return 0;
209 
210  max_enqueue -= sizeof (session_dgram_hdr_t);
211  actual_write = clib_min (len, max_enqueue);
212  hdr.data_length = actual_write;
213  hdr.data_offset = 0;
214  clib_memcpy (&hdr.rmt_ip, &at->rmt_ip, sizeof (ip46_address_t));
215  hdr.is_ip4 = at->is_ip4;
216  hdr.rmt_port = at->rmt_port;
217  clib_memcpy (&hdr.lcl_ip, &at->lcl_ip, sizeof (ip46_address_t));
218  hdr.lcl_port = at->lcl_port;
219  rv = svm_fifo_enqueue_nowait (f, sizeof (hdr), (u8 *) & hdr);
220  ASSERT (rv == sizeof (hdr));
221 
222  if ((rv = svm_fifo_enqueue_nowait (f, actual_write, data)) > 0)
223  {
224  if (svm_fifo_set_event (f))
225  {
226  evt.fifo = f;
227  evt.event_type = FIFO_EVENT_APP_TX;
228  svm_queue_add (vpp_evt_q, (u8 *) & evt, noblock);
229  }
230  }
231  ASSERT (rv);
232  return rv;
233 }
234 
235 always_inline int
236 app_send_dgram (app_session_t * s, u8 * data, u32 len, u8 noblock)
237 {
238  return app_send_dgram_raw (s->tx_fifo, &s->transport, s->vpp_evt_q, data,
239  len, noblock);
240 }
241 
242 always_inline int
243 app_send_stream_raw (svm_fifo_t * f, svm_queue_t * vpp_evt_q, u8 * data,
244  u32 len, u8 noblock)
245 {
246  session_fifo_event_t evt;
247  int rv;
248 
249  if ((rv = svm_fifo_enqueue_nowait (f, len, data)) > 0)
250  {
251  if (svm_fifo_set_event (f))
252  {
253  evt.fifo = f;
254  evt.event_type = FIFO_EVENT_APP_TX;
255  svm_queue_add (vpp_evt_q, (u8 *) & evt, noblock);
256  }
257  }
258  return rv;
259 }
260 
261 always_inline int
262 app_send_stream (app_session_t * s, u8 * data, u32 len, u8 noblock)
263 {
264  return app_send_stream_raw (s->tx_fifo, s->vpp_evt_q, data, len, noblock);
265 }
266 
267 always_inline int
268 app_send (app_session_t * s, u8 * data, u32 len, u8 noblock)
269 {
270  if (s->is_dgram)
271  return app_send_dgram (s, data, len, noblock);
272  return app_send_stream (s, data, len, noblock);
273 }
274 
275 always_inline int
277  app_session_transport_t * at, u8 clear_evt)
278 {
280  u32 max_deq;
281  int rv;
282 
283  if (clear_evt)
285  max_deq = svm_fifo_max_dequeue (f);
286  if (max_deq < sizeof (session_dgram_hdr_t))
287  return 0;
288 
289  svm_fifo_peek (f, 0, sizeof (ph), (u8 *) & ph);
290  ASSERT (ph.data_length >= ph.data_offset);
291  if (!ph.data_offset)
292  svm_fifo_peek (f, sizeof (ph), sizeof (*at), (u8 *) at);
293  len = clib_min (len, ph.data_length - ph.data_offset);
294  rv = svm_fifo_peek (f, ph.data_offset + SESSION_CONN_HDR_LEN, len, buf);
295  ph.data_offset += rv;
296  if (ph.data_offset == ph.data_length)
298  else
299  svm_fifo_overwrite_head (f, (u8 *) & ph, sizeof (ph));
300  return rv;
301 }
302 
303 always_inline int
305 {
306  return app_recv_dgram_raw (s->rx_fifo, buf, len, &s->transport, 1);
307 }
308 
309 always_inline int
310 app_recv_stream_raw (svm_fifo_t * f, u8 * buf, u32 len, u8 clear_evt)
311 {
312  if (clear_evt)
314  return svm_fifo_dequeue_nowait (f, len, buf);
315 }
316 
317 always_inline int
319 {
320  return app_recv_stream_raw (s->rx_fifo, buf, len, 1);
321 }
322 
323 always_inline int
324 app_recv (app_session_t * s, u8 * data, u32 len)
325 {
326  if (s->is_dgram)
327  return app_recv_dgram (s, data, len);
328  return app_recv_stream (s, data, len);
329 }
330 
331 #endif /* __included_uri_h__ */
332 
333 /*
334  * fd.io coding-style-patch-verification: ON
335  *
336  * Local Variables:
337  * eval: (c-set-style "gnu")
338  * End:
339  */
clib_error_t * vnet_connect_uri(vnet_connect_args_t *a)
#define clib_min(x, y)
Definition: clib.h:289
int svm_queue_add(svm_queue_t *q, u8 *elem, int nowait)
Definition: queue.c:184
u8 is_ip4
set if uses ip4 networking
a
Definition: bitmap.h:537
#define SESSION_CONN_HDR_LEN
Definition: session.h:126
struct _vnet_connect_args vnet_connect_args_t
static int app_recv_dgram_raw(svm_fifo_t *f, u8 *buf, u32 len, app_session_transport_t *at, u8 clear_evt)
unsigned long u64
Definition: types.h:89
const char test_srv_key_rsa[]
const u32 test_srv_crt_rsa_len
clib_error_t * vnet_unbind(vnet_unbind_args_t *a)
static int app_send_stream(app_session_t *s, u8 *data, u32 len, u8 noblock)
void svm_fifo_overwrite_head(svm_fifo_t *f, u8 *data, u32 len)
Definition: svm_fifo.c:623
static u32 svm_fifo_max_enqueue(svm_fifo_t *f)
Definition: svm_fifo.h:111
u32 session_index
index in owning pool
u64 session_handle_t
Definition: session.h:91
struct _vnet_application_add_tls_cert_args_t vnet_app_add_tls_cert_args_t
unsigned char u8
Definition: types.h:56
struct _svm_fifo svm_fifo_t
clib_error_t * vnet_connect(vnet_connect_args_t *a)
static int app_send(app_session_t *s, u8 *data, u32 len, u8 noblock)
struct _vnet_disconnect_args_t vnet_disconnect_args_t
#define always_inline
Definition: clib.h:92
static u32 svm_fifo_max_dequeue(svm_fifo_t *f)
Definition: svm_fifo.h:105
struct _stream_session_cb_vft session_cb_vft_t
svm_fifo_t * tx_fifo
tx fifo
struct _vnet_unbind_args_t vnet_unbind_args_t
int svm_fifo_enqueue_nowait(svm_fifo_t *f, u32 max_bytes, const u8 *copy_from_here)
Definition: svm_fifo.c:538
unsigned int u32
Definition: types.h:88
u8 is_dgram
set if it works in dgram mode
struct _vnet_app_attach_args_t vnet_app_attach_args_t
clib_error_t * vnet_app_add_tls_key(vnet_app_add_tls_key_args_t *a)
Definition: application.c:1245
static int app_recv(app_session_t *s, u8 *data, u32 len)
static session_cb_vft_t session_cb_vft
Definition: session_api.c:357
session_type_t session_type
session type
int vnet_unbind_uri(vnet_unbind_args_t *a)
struct _session_endpoint session_endpoint_t
clib_error_t * vnet_bind(vnet_bind_args_t *a)
unsigned short u16
Definition: types.h:57
static session_handle_t session_handle(stream_session_t *s)
Definition: session.h:310
ip46_address_t rmt_ip
remote ip
static void svm_fifo_unset_event(svm_fifo_t *f)
Unsets fifo event flag.
Definition: svm_fifo.h:138
int vnet_bind_uri(vnet_bind_args_t *)
const u32 test_srv_key_rsa_len
static u8 svm_fifo_set_event(svm_fifo_t *f)
Sets fifo event flag.
Definition: svm_fifo.h:128
struct app_session_ app_session_t
clib_error_t * vnet_application_attach(vnet_app_attach_args_t *a)
Attach application to vpp.
static int app_send_dgram_raw(svm_fifo_t *f, app_session_transport_t *at, svm_queue_t *vpp_evt_q, u8 *data, u32 len, u8 noblock)
#define clib_memcpy(a, b, c)
Definition: string.h:75
struct app_session_transport_ app_session_transport_t
static int app_recv_stream(app_session_t *s, u8 *buf, u32 len)
enum _app_options_flags app_options_flags_t
const char test_srv_crt_rsa[]
static int app_send_stream_raw(svm_fifo_t *f, svm_queue_t *vpp_evt_q, u8 *data, u32 len, u8 noblock)
clib_error_t * vnet_app_add_tls_cert(vnet_app_add_tls_cert_args_t *a)
Definition: application.c:1233
int vnet_disconnect_session(vnet_disconnect_args_t *a)
#define ASSERT(truth)
enum _app_options app_options_t
app_attach_options_index_t
u8 session_type_t
volatile u8 session_state
session state
static int app_send_dgram(app_session_t *s, u8 *data, u32 len, u8 noblock)
struct _vnet_application_add_tls_key_args_t vnet_app_add_tls_key_args_t
int vnet_application_detach(vnet_app_detach_args_t *a)
Detach application from vpp.
struct _vnet_app_detach_args_t vnet_app_detach_args_t
ip46_address_t lcl_ip
local ip
int svm_fifo_dequeue_drop(svm_fifo_t *f, u32 max_bytes)
Definition: svm_fifo.c:792
svm_fifo_t * rx_fifo
rx fifo
app_session_transport_t transport
transport info
static int app_recv_stream_raw(svm_fifo_t *f, u8 *buf, u32 len, u8 clear_evt)
struct _svm_queue svm_queue_t
#define foreach_app_options_flags
int svm_fifo_peek(svm_fifo_t *f, u32 relative_offset, u32 max_bytes, u8 *copy_here)
Definition: svm_fifo.c:776
int svm_fifo_dequeue_nowait(svm_fifo_t *f, u32 max_bytes, u8 *copy_here)
Definition: svm_fifo.c:710
struct _vnet_bind_args_t vnet_bind_args_t
svm_queue_t * vpp_evt_q
vpp event queue for session
struct _session_endpoint_extended session_endpoint_extended_t
static int app_recv_dgram(app_session_t *s, u8 *buf, u32 len)