FD.io VPP  v20.01-48-g3e0dafb74
Vector Packet Processing
session_types.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2019 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_SESSION_TYPES_H_
17 #define SRC_VNET_SESSION_SESSION_TYPES_H_
18 
19 #include <svm/svm_fifo.h>
21 
22 #define SESSION_INVALID_INDEX ((u32)~0)
23 #define SESSION_INVALID_HANDLE ((u64)~0)
24 #define SESSION_CTRL_MSG_MAX_SIZE 84
25 
26 #define foreach_session_endpoint_fields \
27  foreach_transport_endpoint_cfg_fields \
28  _(u8, transport_proto) \
29 
30 typedef struct _session_endpoint
31 {
32 #define _(type, name) type name;
34 #undef _
36 
37 typedef struct _session_endpoint_cfg
38 {
39 #define _(type, name) type name;
41 #undef _
42  u32 app_wrk_index;
43  u32 opaque;
44  u32 ns_index;
45  u8 original_tp;
46  u8 *hostname;
47  u64 parent_handle;
48  u32 ckpair_index;
49  u8 crypto_engine;
50  u8 flags;
52 
53 #define SESSION_IP46_ZERO \
54 { \
55  .ip6 = { \
56  { 0, 0, }, \
57  }, \
58 }
59 
60 #define TRANSPORT_ENDPOINT_NULL \
61 { \
62  .sw_if_index = ENDPOINT_INVALID_INDEX, \
63  .ip = SESSION_IP46_ZERO, \
64  .fib_index = ENDPOINT_INVALID_INDEX, \
65  .is_ip4 = 0, \
66  .port = 0, \
67 }
68 #define SESSION_ENDPOINT_NULL \
69 { \
70  .sw_if_index = ENDPOINT_INVALID_INDEX, \
71  .ip = SESSION_IP46_ZERO, \
72  .fib_index = ENDPOINT_INVALID_INDEX, \
73  .is_ip4 = 0, \
74  .port = 0, \
75  .peer = TRANSPORT_ENDPOINT_NULL, \
76  .transport_proto = 0, \
77 }
78 #define SESSION_ENDPOINT_CFG_NULL \
79 { \
80  .sw_if_index = ENDPOINT_INVALID_INDEX, \
81  .ip = SESSION_IP46_ZERO, \
82  .fib_index = ENDPOINT_INVALID_INDEX, \
83  .is_ip4 = 0, \
84  .port = 0, \
85  .peer = TRANSPORT_ENDPOINT_NULL, \
86  .transport_proto = 0, \
87  .app_wrk_index = ENDPOINT_INVALID_INDEX, \
88  .opaque = ENDPOINT_INVALID_INDEX, \
89  .hostname = 0, \
90  .parent_handle = SESSION_INVALID_HANDLE, \
91  .ckpair_index = 0 \
92 }
93 
94 #define session_endpoint_to_transport(_sep) ((transport_endpoint_t *)_sep)
95 #define session_endpoint_to_transport_cfg(_sep) \
96  ((transport_endpoint_cfg_t *)_sep)
97 
99 session_endpoint_fib_proto (session_endpoint_t * sep)
100 {
101  return sep->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6;
102 }
103 
104 static inline u8
105 session_endpoint_is_local (session_endpoint_t * sep)
106 {
107  return (ip_is_zero (&sep->ip, sep->is_ip4)
108  || ip_is_local_host (&sep->ip, sep->is_ip4));
109 }
110 
111 static inline u8
112 session_endpoint_is_zero (session_endpoint_t * sep)
113 {
114  return ip_is_zero (&sep->ip, sep->is_ip4);
115 }
116 
119 
120 typedef enum
121 {
125 
126 /*
127  * Session states
128  */
129 #define foreach_session_state \
130  _(CREATED, "created") \
131  _(LISTENING, "listening") \
132  _(CONNECTING, "connecting") \
133  _(ACCEPTING, "accepting") \
134  _(READY, "ready") \
135  _(OPENED, "opened") \
136  _(TRANSPORT_CLOSING, "transport-closing") \
137  _(CLOSING, "closing") \
138  _(APP_CLOSED, "app-closed") \
139  _(TRANSPORT_CLOSED, "transport-closed") \
140  _(CLOSED, "closed") \
141  _(TRANSPORT_DELETED, "transport-deleted") \
142 
143 typedef enum
144 {
145 #define _(sym, str) SESSION_STATE_ ## sym,
147 #undef _
150 
151 #define foreach_session_flag \
152  _(RX_EVT, "rx-event") \
153  _(PROXY, "proxy") \
154  _(CUSTOM_TX, "custom-tx") \
155  _(IS_MIGRATING, "migrating") \
156  _(UNIDIRECTIONAL, "unidirectional") \
157 
159 {
160 #define _(sym, str) SESSION_F_BIT_ ## sym,
162 #undef _
165 
166 typedef enum session_flags_
167 {
168 #define _(sym, str) SESSION_F_ ## sym = 1 << SESSION_F_BIT_ ## sym,
170 #undef _
172 
173 typedef struct session_
174 {
175  /** Pointers to rx/tx buffers. Once allocated, these do not move */
178 
179  /** Type built from transport and network protocol types */
180  session_type_t session_type;
181 
182  /** State in session layer state machine. See @ref session_state_t */
183  volatile u8 session_state;
184 
185  /** Index in thread pool where session was allocated */
187 
188  /** Index of the app worker that owns the session */
190 
191  /** Index of the thread that allocated the session */
193 
194  /** Session flags. See @ref session_flags_t */
196 
197  /** Index of the transport connection associated to the session */
199 
200  /** Index of application that owns the listener. Set only if a listener */
202 
203  union
204  {
205  /** Parent listener session index if the result of an accept */
206  session_handle_t listener_handle;
207 
208  /** App listener index in app's listener pool if a listener */
210  };
211 
212  /** Opaque, for general use */
214 
216 } session_t;
217 
218 always_inline session_type_t
220 {
221  return (proto << 1 | is_ip4);
222 }
223 
225 session_type_transport_proto (session_type_t st)
226 {
227  return (st >> 1);
228 }
229 
231 session_type_is_ip4 (session_type_t st)
232 {
233  return (st & 1);
234 }
235 
238 {
239  return (s->session_type >> 1);
240 }
241 
244 {
245  u8 is_ip4 = s->session_type & 1;
246  return (is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6);
247 }
248 
251 {
252  return (session_get_transport_proto (s) != TRANSPORT_PROTO_NONE);
253 }
254 
255 static inline transport_service_type_t
257 {
261 }
262 
263 static inline transport_tx_fn_type_t
265 {
268  return transport_protocol_tx_fn_type (tp);
269 }
270 
271 static inline u8
273 {
275 }
276 
277 always_inline session_handle_t
279 {
280  return ((u64) s->thread_index << 32) | (u64) s->session_index;
281 }
282 
284 session_index_from_handle (session_handle_t handle)
285 {
286  return handle & 0xFFFFFFFF;
287 }
288 
290 session_thread_from_handle (session_handle_t handle)
291 {
292  return handle >> 32;
293 }
294 
295 always_inline void
296 session_parse_handle (session_handle_t handle, u32 * index,
297  u32 * thread_index)
298 {
299  *index = session_index_from_handle (handle);
300  *thread_index = session_thread_from_handle (handle);
301 }
302 
303 static inline session_handle_t
304 session_make_handle (u32 session_index, u32 thread_index)
305 {
306  return (((u64) thread_index << 32) | (u64) session_index);
307 }
308 
309 typedef enum
310 {
340 
341 #define foreach_session_ctrl_evt \
342  _(LISTEN, listen) \
343  _(LISTEN_URI, listen_uri) \
344  _(BOUND, bound) \
345  _(UNLISTEN, unlisten) \
346  _(UNLISTEN_REPLY, unlisten_reply) \
347  _(ACCEPTED, accepted) \
348  _(ACCEPTED_REPLY, accepted_reply) \
349  _(CONNECT, connect) \
350  _(CONNECT_URI, connect_uri) \
351  _(CONNECTED, connected) \
352  _(DISCONNECT, disconnect) \
353  _(DISCONNECTED, disconnected) \
354  _(DISCONNECTED_REPLY, disconnected_reply) \
355  _(RESET_REPLY, reset_reply) \
356  _(REQ_WORKER_UPDATE, req_worker_update) \
357  _(WORKER_UPDATE, worker_update) \
358  _(WORKER_UPDATE_REPLY, worker_update_reply) \
359  _(APP_DETACH, app_detach) \
360  _(APP_ADD_SEGMENT, app_add_segment) \
361  _(APP_DEL_SEGMENT, app_del_segment) \
362 
363 /* Deprecated and will be removed. Use types above */
364 #define FIFO_EVENT_APP_RX SESSION_IO_EVT_RX
365 #define FIFO_EVENT_APP_TX SESSION_IO_EVT_TX
366 #define FIFO_EVENT_DISCONNECT SESSION_CTRL_EVT_CLOSE
367 #define FIFO_EVENT_BUILTIN_RX SESSION_IO_EVT_BUILTIN_RX
368 #define FIFO_EVENT_BUILTIN_TX SESSION_IO_EVT_BUILTIN_TX
369 
370 typedef enum
371 {
376 
377 typedef struct
378 {
379  void *fp;
380  void *arg;
382 
383 typedef struct
384 {
385  u8 event_type;
386  u8 postponed;
387  union
388  {
389  u32 session_index;
390  session_handle_t session_handle;
391  session_rpc_args_t rpc_args;
392  u32 ctrl_data_index;
393  struct
394  {
395  u8 data[0];
396  };
397  };
398 } __clib_packed session_event_t;
399 
400 #define SESSION_MSG_NULL { }
401 
403 {
407 
408 typedef struct session_dgram_header_
409 {
412  ip46_address_t rmt_ip;
413  ip46_address_t lcl_ip;
417 } __clib_packed session_dgram_hdr_t;
418 
419 #define SESSION_CONN_ID_LEN 37
420 #define SESSION_CONN_HDR_LEN 45
421 
422 STATIC_ASSERT (sizeof (session_dgram_hdr_t) == (SESSION_CONN_ID_LEN + 8),
423  "session conn id wrong length");
424 #endif /* SRC_VNET_SESSION_SESSION_TYPES_H_ */
425 
426 /*
427  * fd.io coding-style-patch-verification: ON
428  *
429  * Local Variables:
430  * eval: (c-set-style "gnu")
431  * End:
432  */
string hostname[64]
Definition: dhcp.api:159
u32 al_index
App listener index in app&#39;s listener pool if a listener.
u32 connection_index
Index of the transport connection associated to the session.
u8 proto
Definition: acl_types.api:47
session_flags_bits_
u8 pad[3]
log2 (size of the packing page block)
Definition: bihash_doc.h:61
#define CLIB_CACHE_LINE_ALIGN_MARK(mark)
Definition: cache.h:60
struct session_ session_t
session_type_t session_type
Type built from transport and network protocol types.
svm_fifo_t * tx_fifo
static u8 session_tx_is_dgram(session_t *s)
u32 session_index
Index in thread pool where session was allocated.
unsigned long u64
Definition: types.h:89
svm_fifo_t * rx_fifo
Pointers to rx/tx buffers.
session_evt_type_t
static transport_proto_t session_get_transport_proto(session_t *s)
transport_tx_fn_type_t transport_protocol_tx_fn_type(transport_proto_t tp)
Definition: transport.c:277
static u8 session_endpoint_fib_proto(session_endpoint_t *sep)
Definition: session_types.h:99
u32 flags
Session flags.
static void session_parse_handle(session_handle_t handle, u32 *index, u32 *thread_index)
unsigned char u8
Definition: types.h:56
enum fib_protocol_t_ fib_protocol_t
Protocol Type.
static session_handle_t session_handle(session_t *s)
struct _svm_fifo svm_fifo_t
u8 session_type_t
session_flags_
ip46_address_t lcl_ip
unsigned int u32
Definition: types.h:88
session_state_t
struct _session_endpoint_cfg session_endpoint_cfg_t
static session_type_t session_type_from_proto_and_ip(transport_proto_t proto, u8 is_ip4)
static transport_tx_fn_type_t session_transport_tx_fn_type(session_t *s)
transport_service_type_t transport_protocol_service_type(transport_proto_t tp)
Definition: transport.c:271
u32 app_index
Index of application that owns the listener.
unsigned short u16
Definition: types.h:57
#define SESSION_CONN_ID_LEN
enum session_flags_ session_flags_t
enum transport_service_type_ transport_service_type_t
#define always_inline
Definition: ipsec.h:28
u8 is_ip4
Definition: lisp_gpe.api:232
u32 flags
Definition: vhost_user.h:141
session_handle_t listener_handle
Parent listener session index if the result of an accept.
#define foreach_session_endpoint_fields
Definition: session_types.h:26
static transport_proto_t session_type_transport_proto(session_type_t st)
static u32 session_thread_from_handle(session_handle_t handle)
static u32 session_index_from_handle(session_handle_t handle)
#define foreach_session_flag
static session_handle_t session_make_handle(u32 session_index, u32 thread_index)
u8 data[128]
Definition: ipsec_types.api:87
datagram mode
static fib_protocol_t session_get_fib_proto(session_t *s)
#define foreach_session_state
STATIC_ASSERT(sizeof(session_dgram_hdr_t)==(SESSION_CONN_ID_LEN+8), "session conn id wrong length")
enum _transport_proto transport_proto_t
ip46_address_t rmt_ip
u8 thread_index
Index of the thread that allocated the session.
u8 ip_is_zero(ip46_address_t *ip46_address, u8 is_ip4)
Definition: ip.c:20
static u8 session_type_is_ip4(session_type_t st)
u64 session_handle_t
volatile u8 session_state
State in session layer state machine.
u32 opaque
Opaque, for general use.
static u8 session_endpoint_is_zero(session_endpoint_t *sep)
u8 ip_is_local_host(ip46_address_t *ip46_address, u8 is_ip4)
Definition: ip.c:29
session_mq_rings_e
enum session_flags_bits_ session_flag_bits_t
session_cleanup_ntf_t
static u8 session_has_transport(session_t *s)
u32 app_wrk_index
Index of the app worker that owns the session.
static u8 session_endpoint_is_local(session_endpoint_t *sep)
struct _session_endpoint session_endpoint_t
struct session_dgram_pre_hdr_ session_dgram_pre_hdr_t
static transport_service_type_t session_transport_service_type(session_t *s)
enum transport_dequeue_type_ transport_tx_fn_type_t
struct session_dgram_header_ session_dgram_hdr_t