X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fstream_session.h;h=567962a35db8c23963e8353cf27c35c2f3b1ba87;hb=1553197f9a1a3258b6954adeb9536bbe0191683d;hp=82bbf521ce9722055c04130807a6845470370c99;hpb=04e5344a358a9ad42d896486d2d226149fd326f4;p=vpp.git diff --git a/src/vnet/session/stream_session.h b/src/vnet/session/stream_session.h index 82bbf521ce9..567962a35db 100644 --- a/src/vnet/session/stream_session.h +++ b/src/vnet/session/stream_session.h @@ -16,22 +16,10 @@ #ifndef SRC_VNET_SESSION_STREAM_SESSION_H_ #define SRC_VNET_SESSION_STREAM_SESSION_H_ -#include #include +#include -#define foreach_session_type \ - _(IP4_TCP, ip4_tcp) \ - _(IP4_UDP, ip4_udp) \ - _(IP6_TCP, ip6_tcp) \ - _(IP6_UDP, ip6_udp) - -typedef enum -{ -#define _(A, a) SESSION_TYPE_##A, - foreach_session_type -#undef _ - SESSION_N_TYPES, -} session_type_t; +typedef u8 session_type_t; /* * Application session state @@ -42,10 +30,21 @@ typedef enum SESSION_STATE_CONNECTING, SESSION_STATE_ACCEPTING, SESSION_STATE_READY, + SESSION_STATE_OPENED, + SESSION_STATE_CLOSING, SESSION_STATE_CLOSED, SESSION_STATE_N_STATES, } stream_session_state_t; +typedef struct generic_session_ +{ + 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; + typedef struct _stream_session_t { /** fifo pointers. Once allocated, these do not move */ @@ -53,39 +52,137 @@ typedef struct _stream_session_t svm_fifo_t *server_tx_fifo; /** Type */ - u8 session_type; + session_type_t session_type; /** State */ - u8 session_state; + volatile u8 session_state; + + /** Session index in per_thread pool */ + u32 session_index; + + /** app worker pool index */ + u32 app_wrk_index; u8 thread_index; /** To avoid n**2 "one event per frame" check */ u8 enqueue_epoch; - /** Pad to a multiple of 8 octets */ - u8 align_pad[4]; - /** svm segment index where fifos were allocated */ u32 svm_segment_index; - /** Session index in per_thread pool */ - u32 session_index; - /** Transport specific */ u32 connection_index; - /** stream server pool index */ - u32 app_index; + union + { + /** Parent listener session if the result of an accept */ + u32 listener_index; + /** Opaque, for general use */ + u32 opaque; + }; + + CLIB_CACHE_LINE_ALIGN_MARK (pad); +} stream_session_t; + +typedef struct local_session_ +{ + /** fifo pointers. Once allocated, these do not move */ + svm_fifo_t *server_rx_fifo; + svm_fifo_t *server_tx_fifo; + + /** Type */ + session_type_t session_type; + + /** State */ + volatile u8 session_state; + + /** Session index */ + u32 session_index; + + /** Server index */ + u32 app_wrk_index; + + /** Segment index where fifos were allocated */ + u32 svm_segment_index; - /** Parent listener session if the result of an accept */ u32 listener_index; - u32 opaque2; + /** Port for connection */ + u16 port; - /** Opaque, pad to a 64-octet boundary */ - u64 opaque[2]; -} stream_session_t; + /** Has transport embedded when listener not purely local */ + session_type_t listener_session_type; + u32 transport_listener_index; + + /** + * 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; + +#define foreach_session_endpoint_fields \ + foreach_transport_connection_fields \ + _(u8, transport_proto) \ + +typedef struct _session_endpoint +{ +#define _(type, name) type name; + foreach_session_endpoint_fields +#undef _ +} session_endpoint_t; + +typedef struct _session_endpoint_extended +{ +#define _(type, name) type name; + foreach_session_endpoint_fields +#undef _ + u32 app_wrk_index; + u32 opaque; + u8 *hostname; +} session_endpoint_extended_t; + +#define SESSION_IP46_ZERO \ +{ \ + .ip6 = { \ + { 0, 0, }, \ + }, \ +} +#define SESSION_ENDPOINT_NULL \ +{ \ + .sw_if_index = ENDPOINT_INVALID_INDEX, \ + .ip = SESSION_IP46_ZERO, \ + .fib_index = ENDPOINT_INVALID_INDEX, \ + .is_ip4 = 0, \ + .port = 0, \ + .transport_proto = 0, \ +} +#define SESSION_ENDPOINT_EXT_NULL \ +{ \ + .sw_if_index = ENDPOINT_INVALID_INDEX, \ + .ip = SESSION_IP46_ZERO, \ + .fib_index = ENDPOINT_INVALID_INDEX, \ + .is_ip4 = 0, \ + .port = 0, \ + .transport_proto = 0, \ + .app_wrk_index = ENDPOINT_INVALID_INDEX, \ + .opaque = ENDPOINT_INVALID_INDEX, \ + .hostname = 0, \ +} + +#define session_endpoint_to_transport(_sep) ((transport_endpoint_t *)_sep) + +always_inline u8 +session_endpoint_fib_proto (session_endpoint_t * sep) +{ + return sep->is_ip4 ? FIB_PROTOCOL_IP4 : FIB_PROTOCOL_IP6; +} #endif /* SRC_VNET_SESSION_STREAM_SESSION_H_ */