X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fsession_types.h;h=821aac9394db45002fb06d0b692ee4bbe4d87fc8;hb=534468e9f768ae7465ef722520dadfd916cdc9fb;hp=97c915bbae29b3907778169d879ed5f6e3f951e2;hpb=dfae9f938f81480995a7ef20a63d016e57dd2899;p=vpp.git diff --git a/src/vnet/session/session_types.h b/src/vnet/session/session_types.h index 97c915bbae2..821aac9394d 100644 --- a/src/vnet/session/session_types.h +++ b/src/vnet/session/session_types.h @@ -19,8 +19,10 @@ #include #include -#define SESSION_LOCAL_HANDLE_PREFIX 0x7FFFFFFF -#define SESSION_LISTENER_PREFIX 0x5FFFFFFF +#define SESSION_INVALID_INDEX ((u32)~0) +#define SESSION_INVALID_HANDLE ((u64)~0) +#define SESSION_CTRL_MSG_MAX_SIZE 86 +#define SESSION_NODE_FRAME_SIZE 128 #define foreach_session_endpoint_fields \ foreach_transport_endpoint_cfg_fields \ @@ -41,7 +43,10 @@ typedef struct _session_endpoint_cfg u32 app_wrk_index; u32 opaque; u32 ns_index; - u8 *hostname; + u8 original_tp; + u64 parent_handle; + u8 flags; + transport_endpt_ext_cfg_t *ext_cfg; } session_endpoint_cfg_t; #define SESSION_IP46_ZERO \ @@ -69,19 +74,15 @@ typedef struct _session_endpoint_cfg .peer = TRANSPORT_ENDPOINT_NULL, \ .transport_proto = 0, \ } -#define SESSION_ENDPOINT_CFG_NULL \ -{ \ - .sw_if_index = ENDPOINT_INVALID_INDEX, \ - .ip = SESSION_IP46_ZERO, \ - .fib_index = ENDPOINT_INVALID_INDEX, \ - .is_ip4 = 0, \ - .port = 0, \ - .peer = TRANSPORT_ENDPOINT_NULL, \ - .transport_proto = 0, \ - .app_wrk_index = ENDPOINT_INVALID_INDEX, \ - .opaque = ENDPOINT_INVALID_INDEX, \ - .hostname = 0, \ -} +#define SESSION_ENDPOINT_CFG_NULL \ + { \ + .sw_if_index = ENDPOINT_INVALID_INDEX, .ip = SESSION_IP46_ZERO, \ + .fib_index = ENDPOINT_INVALID_INDEX, .is_ip4 = 0, .port = 0, \ + .peer = TRANSPORT_ENDPOINT_NULL, .transport_proto = 0, \ + .app_wrk_index = ENDPOINT_INVALID_INDEX, \ + .opaque = ENDPOINT_INVALID_INDEX, \ + .parent_handle = SESSION_INVALID_HANDLE, .ext_cfg = 0, \ + } #define session_endpoint_to_transport(_sep) ((transport_endpoint_t *)_sep) #define session_endpoint_to_transport_cfg(_sep) \ @@ -109,84 +110,113 @@ session_endpoint_is_zero (session_endpoint_t * sep) typedef u8 session_type_t; typedef u64 session_handle_t; +typedef enum +{ + SESSION_CLEANUP_TRANSPORT, + SESSION_CLEANUP_SESSION, +} session_cleanup_ntf_t; + +typedef enum session_ft_action_ +{ + SESSION_FT_ACTION_ENQUEUED, + SESSION_FT_ACTION_DEQUEUED, + SESSION_FT_ACTION_N_ACTIONS +} session_ft_action_t; + /* - * Application session state + * Session states */ +#define foreach_session_state \ + _(CREATED, "created") \ + _(LISTENING, "listening") \ + _(CONNECTING, "connecting") \ + _(ACCEPTING, "accepting") \ + _(READY, "ready") \ + _(OPENED, "opened") \ + _(TRANSPORT_CLOSING, "transport-closing") \ + _(CLOSING, "closing") \ + _(APP_CLOSED, "app-closed") \ + _(TRANSPORT_CLOSED, "transport-closed") \ + _(CLOSED, "closed") \ + _(TRANSPORT_DELETED, "transport-deleted") \ + typedef enum { - SESSION_STATE_CREATED, - SESSION_STATE_LISTENING, - SESSION_STATE_CONNECTING, - SESSION_STATE_ACCEPTING, - SESSION_STATE_READY, - SESSION_STATE_OPENED, - SESSION_STATE_TRANSPORT_CLOSING, - SESSION_STATE_CLOSING, - SESSION_STATE_CLOSED_WAITING, - SESSION_STATE_TRANSPORT_CLOSED, - SESSION_STATE_CLOSED, - SESSION_STATE_N_STATES, +#define _(sym, str) SESSION_STATE_ ## sym, + foreach_session_state +#undef _ + SESSION_N_STATES, } session_state_t; -typedef struct generic_session_ +#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") + +typedef enum session_flags_bits_ { - svm_fifo_t *rx_fifo; /**< rx fifo */ - svm_fifo_t *tx_fifo; /**< tx fifo */ - session_type_t session_type; /**< session type */ - volatile u8 session_state; /**< session state */ - u32 session_index; /**< index in owning pool */ -} generic_session_t; +#define _(sym, str) SESSION_F_BIT_ ## sym, + foreach_session_flag +#undef _ + SESSION_N_FLAGS +} session_flag_bits_t; + +typedef enum session_flags_ +{ +#define _(sym, str) SESSION_F_ ## sym = 1 << SESSION_F_BIT_ ## sym, + foreach_session_flag +#undef _ +} session_flags_t; typedef struct session_ { - /** fifo pointers. Once allocated, these do not move */ + /** Pointers to rx/tx buffers. Once allocated, these do not move */ svm_fifo_t *rx_fifo; svm_fifo_t *tx_fifo; - /** Type */ + /** Type built from transport and network protocol types */ session_type_t session_type; - /** State */ + /** State in session layer state machine. See @ref session_state_t */ volatile u8 session_state; - /** Session index in per_thread pool */ + /** Index in thread pool where session was allocated */ u32 session_index; - /** App worker pool 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; - /** To avoid n**2 "one event per frame" check */ - u64 enqueue_epoch; + /** Session flags. See @ref session_flags_t */ + u32 flags; - /** svm segment index where fifos were allocated */ - u32 svm_segment_index; - - /** Transport specific */ + /** Index of the transport connection associated to the session */ u32 connection_index; - union - { - /** Parent listener session if the result of an accept */ - u32 listener_index; - - /** Application index if a listener */ - u32 app_index; - }; + /** Index of application that owns the listener. Set only if a listener */ + u32 app_index; union { - /** Transport app index for apps acting as transports */ - u32 t_app_index; + /** Parent listener session index if the result of an accept */ + session_handle_t listener_handle; - /** App listener index */ + /** App listener index in app's listener pool if a listener */ u32 al_index; - /** Opaque, for general use */ - u32 opaque; + /** Index in app worker's half-open table if a half-open */ + u32 ho_index; }; + /** Opaque, for general use */ + u32 opaque; + CLIB_CACHE_LINE_ALIGN_MARK (pad); } session_t; @@ -275,156 +305,96 @@ session_parse_handle (session_handle_t handle, u32 * index, *thread_index = session_thread_from_handle (handle); } -always_inline u8 -session_handle_is_local (session_handle_t handle) +static inline session_handle_t +session_make_handle (u32 session_index, u32 data) { - if ((handle >> 32) == SESSION_LOCAL_HANDLE_PREFIX) - return 1; - return 0; + return (((u64) data << 32) | (u64) session_index); } -typedef struct local_session_ -{ - /** fifo pointers. Once allocated, these do not move */ - svm_fifo_t *rx_fifo; - svm_fifo_t *tx_fifo; - - /** Type */ - session_type_t session_type; - - /** State */ - volatile u8 session_state; - - /** Session index */ - u32 session_index; - - /** Server index */ - u32 app_wrk_index; - - /** Port for connection. Overlaps thread_index/enqueue_epoch */ - u16 port; - - /** Partly overlaps enqueue_epoch */ - u8 pad_epoch[7]; - - /** Segment index where fifos were allocated */ - u32 svm_segment_index; - - /** Transport listener index. Overlaps connection index */ - u32 transport_listener_index; - - union - { - u32 listener_index; - u32 app_index; - }; - - u32 al_index; - - /** Has transport embedded when listener not purely local */ - session_type_t listener_session_type; - - /** - * Client data - */ - u32 client_wrk_index; - u32 client_opaque; - - u64 server_evt_q; - u64 client_evt_q; - - CLIB_CACHE_LINE_ALIGN_MARK (pad); -} local_session_t; - always_inline u32 -local_session_id (local_session_t * ls) +session_handle_index (session_handle_t ho_handle) { - ASSERT (ls->session_index < (2 << 16)); - u32 app_or_wrk_index; - - if (ls->session_state == SESSION_STATE_LISTENING) - { - ASSERT (ls->app_index < (2 << 16)); - app_or_wrk_index = ls->app_index; - } - else - { - ASSERT (ls->app_wrk_index < (2 << 16)); - app_or_wrk_index = ls->app_wrk_index; - } - - return ((u32) app_or_wrk_index << 16 | (u32) ls->session_index); + return (ho_handle & 0xffffffff); } -always_inline void -local_session_parse_id (u32 ls_id, u32 * app_or_wrk, u32 * session_index) -{ - *app_or_wrk = ls_id >> 16; - *session_index = ls_id & 0xFF; -} - -always_inline void -local_session_parse_handle (session_handle_t handle, u32 * app_or_wrk_index, - u32 * session_index) -{ - u32 bottom; - ASSERT ((handle >> 32) == SESSION_LOCAL_HANDLE_PREFIX); - bottom = (handle & 0xFFFFFFFF); - local_session_parse_id (bottom, app_or_wrk_index, session_index); -} - -always_inline session_handle_t -application_local_session_handle (local_session_t * ls) +always_inline u32 +session_handle_data (session_handle_t ho_handle) { - return ((u64) SESSION_LOCAL_HANDLE_PREFIX << 32) - | (u64) local_session_id (ls); + return (ho_handle >> 32); } typedef enum { - FIFO_EVENT_APP_RX, - SESSION_IO_EVT_CT_RX, - FIFO_EVENT_APP_TX, - SESSION_IO_EVT_CT_TX, + SESSION_IO_EVT_RX, + SESSION_IO_EVT_TX, SESSION_IO_EVT_TX_FLUSH, - FIFO_EVENT_DISCONNECT, - FIFO_EVENT_BUILTIN_RX, - FIFO_EVENT_BUILTIN_TX, - FIFO_EVENT_RPC, + SESSION_IO_EVT_BUILTIN_RX, + SESSION_IO_EVT_BUILTIN_TX, + SESSION_CTRL_EVT_RPC, + SESSION_CTRL_EVT_HALF_CLOSE, + SESSION_CTRL_EVT_CLOSE, + SESSION_CTRL_EVT_RESET, SESSION_CTRL_EVT_BOUND, SESSION_CTRL_EVT_UNLISTEN_REPLY, SESSION_CTRL_EVT_ACCEPTED, SESSION_CTRL_EVT_ACCEPTED_REPLY, SESSION_CTRL_EVT_CONNECTED, - SESSION_CTRL_EVT_CONNECTED_REPLY, SESSION_CTRL_EVT_DISCONNECTED, SESSION_CTRL_EVT_DISCONNECTED_REPLY, - SESSION_CTRL_EVT_RESET, SESSION_CTRL_EVT_RESET_REPLY, 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, + SESSION_CTRL_EVT_LISTEN, + SESSION_CTRL_EVT_LISTEN_URI, + SESSION_CTRL_EVT_UNLISTEN, + SESSION_CTRL_EVT_APP_DETACH, + SESSION_CTRL_EVT_APP_ADD_SEGMENT, + SESSION_CTRL_EVT_APP_DEL_SEGMENT, + SESSION_CTRL_EVT_MIGRATED, + SESSION_CTRL_EVT_CLEANUP, + SESSION_CTRL_EVT_APP_WRK_RPC, + SESSION_CTRL_EVT_TRANSPORT_ATTR, + SESSION_CTRL_EVT_TRANSPORT_ATTR_REPLY, } session_evt_type_t; -static inline const char * -fifo_event_type_str (session_evt_type_t et) -{ - switch (et) - { - case FIFO_EVENT_APP_RX: - return "FIFO_EVENT_APP_RX"; - case FIFO_EVENT_APP_TX: - return "FIFO_EVENT_APP_TX"; - case FIFO_EVENT_DISCONNECT: - return "FIFO_EVENT_DISCONNECT"; - case FIFO_EVENT_BUILTIN_RX: - return "FIFO_EVENT_BUILTIN_RX"; - case FIFO_EVENT_RPC: - return "FIFO_EVENT_RPC"; - default: - return "UNKNOWN FIFO EVENT"; - } -} +#define foreach_session_ctrl_evt \ + _ (LISTEN, listen) \ + _ (LISTEN_URI, listen_uri) \ + _ (BOUND, bound) \ + _ (UNLISTEN, unlisten) \ + _ (UNLISTEN_REPLY, unlisten_reply) \ + _ (ACCEPTED, accepted) \ + _ (ACCEPTED_REPLY, accepted_reply) \ + _ (CONNECT, connect) \ + _ (CONNECT_URI, connect_uri) \ + _ (CONNECTED, connected) \ + _ (SHUTDOWN, shutdown) \ + _ (DISCONNECT, disconnect) \ + _ (DISCONNECTED, disconnected) \ + _ (DISCONNECTED_REPLY, disconnected_reply) \ + _ (RESET_REPLY, reset_reply) \ + _ (REQ_WORKER_UPDATE, req_worker_update) \ + _ (WORKER_UPDATE, worker_update) \ + _ (WORKER_UPDATE_REPLY, worker_update_reply) \ + _ (APP_DETACH, app_detach) \ + _ (APP_ADD_SEGMENT, app_add_segment) \ + _ (APP_DEL_SEGMENT, app_del_segment) \ + _ (MIGRATED, migrated) \ + _ (CLEANUP, cleanup) \ + _ (APP_WRK_RPC, app_wrk_rpc) \ + _ (TRANSPORT_ATTR, transport_attr) \ + _ (TRANSPORT_ATTR_REPLY, transport_attr_reply) \ +/* Deprecated and will be removed. Use types above */ +#define FIFO_EVENT_APP_RX SESSION_IO_EVT_RX +#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 { @@ -439,23 +409,22 @@ typedef struct void *arg; } session_rpc_args_t; -/* *INDENT-OFF* */ typedef struct { u8 event_type; u8 postponed; union { - svm_fifo_t *fifo; + u32 session_index; session_handle_t session_handle; session_rpc_args_t rpc_args; + u32 ctrl_data_index; struct { u8 data[0]; }; }; } __clib_packed session_event_t; -/* *INDENT-ON* */ #define SESSION_MSG_NULL { } @@ -465,8 +434,7 @@ typedef struct session_dgram_pre_hdr_ u32 data_offset; } session_dgram_pre_hdr_t; -/* *INDENT-OFF* */ -typedef CLIB_PACKED (struct session_dgram_header_ +typedef struct session_dgram_header_ { u32 data_length; u32 data_offset; @@ -475,14 +443,73 @@ typedef CLIB_PACKED (struct session_dgram_header_ u16 rmt_port; u16 lcl_port; u8 is_ip4; -}) session_dgram_hdr_t; -/* *INDENT-ON* */ +} __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), "session conn id wrong length"); + +#define foreach_session_error \ + _ (NONE, "no error") \ + _ (UNKNOWN, "generic/unknown error") \ + _ (REFUSED, "refused") \ + _ (TIMEDOUT, "timedout") \ + _ (ALLOC, "obj/memory allocation error") \ + _ (OWNER, "object not owned by application") \ + _ (NOROUTE, "no route") \ + _ (NOINTF, "no resolving interface") \ + _ (NOIP, "no ip for lcl interface") \ + _ (NOPORT, "no lcl port") \ + _ (NOSUPPORT, "not supported") \ + _ (NOLISTEN, "not listening") \ + _ (NOSESSION, "session does not exist") \ + _ (NOAPP, "app not attached") \ + _ (PORTINUSE, "lcl port in use") \ + _ (IPINUSE, "ip in use") \ + _ (ALREADY_LISTENING, "ip port pair already listened on") \ + _ (INVALID_RMT_IP, "invalid remote ip") \ + _ (INVALID_APPWRK, "invalid app worker") \ + _ (INVALID_NS, "invalid namespace") \ + _ (SEG_NO_SPACE, "Couldn't allocate a fifo pair") \ + _ (SEG_NO_SPACE2, "Created segment, couldn't allocate a fifo pair") \ + _ (SEG_CREATE, "Couldn't create a new segment") \ + _ (FILTERED, "session filtered") \ + _ (SCOPE, "scope not supported") \ + _ (BAPI_NO_FD, "bapi doesn't have a socket fd") \ + _ (BAPI_SEND_FD, "couldn't send fd over bapi socket fd") \ + _ (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") \ + _ (NOEXTCFG, "no extended transport config") \ + _ (NOCRYPTOENG, "no crypto engine") \ + _ (NOCRYPTOCKP, "cert key pair not found ") + +typedef enum session_error_p_ +{ +#define _(sym, str) SESSION_EP_##sym, + foreach_session_error +#undef _ + SESSION_N_ERRORS +} session_error_p_t; + +typedef enum session_error_ +{ +#define _(sym, str) SESSION_E_##sym = -SESSION_EP_##sym, + foreach_session_error +#undef _ +} session_error_t; + +#define SESSION_CLI_ID_LEN "60" +#define SESSION_CLI_STATE_LEN "15" + +/* Maintained for compatibility. Will be deprecated */ +#define SESSION_ERROR_SEG_CREATE SESSION_E_SEG_CREATE +#define SESSION_ERROR_NO_SPACE SESSION_E_SEG_NO_SPACE +#define SESSION_ERROR_NEW_SEG_NO_SPACE SESSION_E_SEG_NO_SPACE2 + #endif /* SRC_VNET_SESSION_SESSION_TYPES_H_ */ /*