X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_types.h;h=ce115b21af8e657f381c0b916e1fe1904d43d35d;hb=980ee74b165a4fa629f868935c446773ca82372e;hp=9211df9e46de245bc5003a1dcae1e2780c1d2f99;hpb=a54b62d77794dee48510e7c128d3ab2fc90934b3;p=vpp.git diff --git a/src/vnet/session/session_types.h b/src/vnet/session/session_types.h index 9211df9e46d..ce115b21af8 100644 --- a/src/vnet/session/session_types.h +++ b/src/vnet/session/session_types.h @@ -22,8 +22,22 @@ #define SESSION_INVALID_INDEX ((u32)~0) #define SESSION_INVALID_HANDLE ((u64)~0) #define SESSION_CTRL_MSG_MAX_SIZE 86 +#define SESSION_CTRL_MSG_TX_MAX_SIZE 160 #define SESSION_NODE_FRAME_SIZE 128 +typedef u8 session_type_t; +typedef u64 session_handle_t; + +typedef union session_handle_tu_ +{ + session_handle_t handle; + struct + { + u32 session_index; + u32 thread_index; + }; +} __attribute__ ((__transparent_union__)) session_handle_tu_t; + #define foreach_session_endpoint_fields \ foreach_transport_endpoint_cfg_fields \ _(u8, transport_proto) \ @@ -35,6 +49,23 @@ typedef struct _session_endpoint #undef _ } session_endpoint_t; +#define foreach_session_endpoint_cfg_flags _ (PROXY_LISTEN, "proxy listener") + +typedef enum session_endpoint_cfg_flags_bits_ +{ +#define _(sym, str) SESSION_ENDPT_CFG_F_BIT_##sym, + foreach_session_endpoint_cfg_flags +#undef _ +} __clib_packed session_endpoint_cfg_flags_bits_t; + +typedef enum session_endpoint_cfg_flags_ +{ +#define _(sym, str) \ + SESSION_ENDPT_CFG_F_##sym = 1 << SESSION_ENDPT_CFG_F_BIT_##sym, + foreach_session_endpoint_cfg_flags +#undef _ +} __clib_packed session_endpoint_cfg_flags_t; + typedef struct _session_endpoint_cfg { #define _(type, name) type name; @@ -45,7 +76,7 @@ typedef struct _session_endpoint_cfg u32 ns_index; u8 original_tp; u64 parent_handle; - u8 flags; + session_endpoint_cfg_flags_t flags; transport_endpt_ext_cfg_t *ext_cfg; } session_endpoint_cfg_t; @@ -107,9 +138,6 @@ session_endpoint_is_zero (session_endpoint_t * sep) return ip_is_zero (&sep->ip, sep->is_ip4); } -typedef u8 session_type_t; -typedef u64 session_handle_t; - typedef enum { SESSION_CLEANUP_TRANSPORT, @@ -148,13 +176,16 @@ typedef enum SESSION_N_STATES, } session_state_t; -#define foreach_session_flag \ - _(RX_EVT, "rx-event") \ - _(PROXY, "proxy") \ - _(CUSTOM_TX, "custom-tx") \ - _(IS_MIGRATING, "migrating") \ - _(UNIDIRECTIONAL, "unidirectional") \ - _(CUSTOM_FIFO_TUNING, "custom-fifo-tuning") \ +#define foreach_session_flag \ + _ (RX_EVT, "rx-event") \ + _ (PROXY, "proxy") \ + _ (CUSTOM_TX, "custom-tx") \ + _ (IS_MIGRATING, "migrating") \ + _ (UNIDIRECTIONAL, "unidirectional") \ + _ (CUSTOM_FIFO_TUNING, "custom-fifo-tuning") \ + _ (HALF_OPEN, "half-open") \ + _ (APP_CLOSED, "app-closed") \ + _ (IS_CLESS, "connectionless") typedef enum session_flags_bits_ { @@ -177,37 +208,44 @@ typedef struct session_ svm_fifo_t *rx_fifo; svm_fifo_t *tx_fifo; + union + { + session_handle_t handle; + struct + { + /** Index in thread pool where session was allocated */ + u32 session_index; + + /** Index of the thread that allocated the session */ + u32 thread_index; + }; + }; + /** Type built from transport and network protocol types */ session_type_t session_type; /** State in session layer state machine. See @ref session_state_t */ volatile u8 session_state; - /** Index in thread pool where session was allocated */ - u32 session_index; - /** Index of the app worker that owns the session */ u32 app_wrk_index; - /** Index of the thread that allocated the session */ - u8 thread_index; - /** Session flags. See @ref session_flags_t */ u32 flags; /** Index of the transport connection associated to the session */ u32 connection_index; - /** Index of application that owns the listener. Set only if a listener */ - u32 app_index; + /** App listener index in app's listener pool if a listener */ + u32 al_index; union { /** Parent listener session index if the result of an accept */ session_handle_t listener_handle; - /** App listener index in app's listener pool if a listener */ - u32 al_index; + /** Index in app worker's half-open table if a half-open */ + u32 ho_index; }; /** Opaque, for general use */ @@ -278,45 +316,35 @@ session_tx_is_dgram (session_t * s) always_inline session_handle_t session_handle (session_t * s) { - return ((u64) s->thread_index << 32) | (u64) s->session_index; + return s->handle; } always_inline u32 -session_index_from_handle (session_handle_t handle) +session_index_from_handle (session_handle_tu_t handle) { - return handle & 0xFFFFFFFF; + return handle.session_index; } always_inline u32 -session_thread_from_handle (session_handle_t handle) +session_thread_from_handle (session_handle_tu_t handle) { - return handle >> 32; + return handle.thread_index; } always_inline void -session_parse_handle (session_handle_t handle, u32 * index, - u32 * thread_index) +session_parse_handle (session_handle_tu_t handle, u32 *index, + u32 *thread_index) { - *index = session_index_from_handle (handle); - *thread_index = session_thread_from_handle (handle); + *index = handle.session_index; + *thread_index = handle.thread_index; } static inline session_handle_t session_make_handle (u32 session_index, u32 data) { - return (((u64) data << 32) | (u64) session_index); -} - -always_inline u32 -session_handle_index (session_handle_t ho_handle) -{ - return (ho_handle & 0xffffffff); -} - -always_inline u32 -session_handle_data (session_handle_t ho_handle) -{ - return (ho_handle >> 32); + return ((session_handle_tu_t){ .session_index = session_index, + .thread_index = data }) + .handle; } typedef enum @@ -325,8 +353,9 @@ typedef enum SESSION_IO_EVT_TX, SESSION_IO_EVT_TX_FLUSH, SESSION_IO_EVT_BUILTIN_RX, - SESSION_IO_EVT_BUILTIN_TX, + SESSION_IO_EVT_TX_MAIN, SESSION_CTRL_EVT_RPC, + SESSION_CTRL_EVT_HALF_CLOSE, SESSION_CTRL_EVT_CLOSE, SESSION_CTRL_EVT_RESET, SESSION_CTRL_EVT_BOUND, @@ -340,6 +369,7 @@ typedef enum SESSION_CTRL_EVT_REQ_WORKER_UPDATE, SESSION_CTRL_EVT_WORKER_UPDATE, SESSION_CTRL_EVT_WORKER_UPDATE_REPLY, + SESSION_CTRL_EVT_SHUTDOWN, SESSION_CTRL_EVT_DISCONNECT, SESSION_CTRL_EVT_CONNECT, SESSION_CTRL_EVT_CONNECT_URI, @@ -354,6 +384,8 @@ typedef enum SESSION_CTRL_EVT_APP_WRK_RPC, SESSION_CTRL_EVT_TRANSPORT_ATTR, SESSION_CTRL_EVT_TRANSPORT_ATTR_REPLY, + SESSION_CTRL_EVT_TRANSPORT_CLOSED, + SESSION_CTRL_EVT_HALF_CLEANUP, } session_evt_type_t; #define foreach_session_ctrl_evt \ @@ -367,6 +399,7 @@ typedef enum _ (CONNECT, connect) \ _ (CONNECT_URI, connect_uri) \ _ (CONNECTED, connected) \ + _ (SHUTDOWN, shutdown) \ _ (DISCONNECT, disconnect) \ _ (DISCONNECTED, disconnected) \ _ (DISCONNECTED_REPLY, disconnected_reply) \ @@ -387,7 +420,6 @@ typedef enum #define FIFO_EVENT_APP_TX SESSION_IO_EVT_TX #define FIFO_EVENT_DISCONNECT SESSION_CTRL_EVT_CLOSE #define FIFO_EVENT_BUILTIN_RX SESSION_IO_EVT_BUILTIN_RX -#define FIFO_EVENT_BUILTIN_TX SESSION_IO_EVT_BUILTIN_TX typedef enum { @@ -412,6 +444,7 @@ typedef struct session_handle_t session_handle; session_rpc_args_t rpc_args; u32 ctrl_data_index; + u64 as_u64[2]; struct { u8 data[0]; @@ -436,12 +469,12 @@ typedef struct session_dgram_header_ u16 rmt_port; u16 lcl_port; u8 is_ip4; + u16 gso_size; } __clib_packed session_dgram_hdr_t; #define SESSION_CONN_ID_LEN 37 -#define SESSION_CONN_HDR_LEN 45 - -STATIC_ASSERT (sizeof (session_dgram_hdr_t) == (SESSION_CONN_ID_LEN + 8), +#define SESSION_CONN_HDR_LEN 47 +STATIC_ASSERT (sizeof (session_dgram_hdr_t) == (SESSION_CONN_ID_LEN + 10), "session conn id wrong length"); #define foreach_session_error \ @@ -459,9 +492,12 @@ STATIC_ASSERT (sizeof (session_dgram_hdr_t) == (SESSION_CONN_ID_LEN + 8), _ (NOLISTEN, "not listening") \ _ (NOSESSION, "session does not exist") \ _ (NOAPP, "app not attached") \ + _ (APP_ATTACHED, "app already attached") \ _ (PORTINUSE, "lcl port in use") \ _ (IPINUSE, "ip in use") \ _ (ALREADY_LISTENING, "ip port pair already listened on") \ + _ (ADDR_NOT_IN_USE, "address not in use") \ + _ (INVALID, "invalid value") \ _ (INVALID_RMT_IP, "invalid remote ip") \ _ (INVALID_APPWRK, "invalid app worker") \ _ (INVALID_NS, "invalid namespace") \ @@ -475,7 +511,14 @@ STATIC_ASSERT (sizeof (session_dgram_hdr_t) == (SESSION_CONN_ID_LEN + 8), _ (BAPI_NO_REG, "app bapi registration not found") \ _ (MQ_MSG_ALLOC, "failed to alloc mq msg") \ _ (TLS_HANDSHAKE, "failed tls handshake") \ - _ (EVENTFD_ALLOC, "failed to alloc eventfd") + _ (EVENTFD_ALLOC, "failed to alloc eventfd") \ + _ (NOEXTCFG, "no extended transport config") \ + _ (NOCRYPTOENG, "no crypto engine") \ + _ (NOCRYPTOCKP, "cert key pair not found ") \ + _ (LOCAL_CONNECT, "could not connect with local scope") \ + _ (WRONG_NS_SECRET, "wrong ns secret") \ + _ (SYSCALL, "system call error") \ + _ (TRANSPORT_NO_REG, "transport was not registered") typedef enum session_error_p_ {