X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fstream_session.h;h=63adc2b909bb704ffa245a147dec583110e3a5a9;hb=5a2ec8fc41d14ffc5275ab88761c1fb7e0420a33;hp=57d256cdbc609f3f5f663b3e02b855dad33c10ed;hpb=f8f516a8b0ccab2f5d9796f90419bf2661c750af;p=vpp.git diff --git a/src/vnet/session/stream_session.h b/src/vnet/session/stream_session.h index 57d256cdbc6..63adc2b909b 100644 --- a/src/vnet/session/stream_session.h +++ b/src/vnet/session/stream_session.h @@ -16,7 +16,6 @@ #ifndef SRC_VNET_SESSION_STREAM_SESSION_H_ #define SRC_VNET_SESSION_STREAM_SESSION_H_ -#include #include #include @@ -31,30 +30,23 @@ typedef enum SESSION_STATE_CONNECTING, SESSION_STATE_ACCEPTING, SESSION_STATE_READY, - SESSION_STATE_CONNECTING_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, } stream_session_state_t; -/* TODO convert to macro once cleanup completed */ -typedef struct app_session_ +typedef struct generic_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 in owning pool */ - u32 session_index; - - /** Application index */ - u32 app_index; -} app_session_t; + 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 { @@ -71,13 +63,13 @@ typedef struct _stream_session_t /** Session index in per_thread pool */ u32 session_index; - /** stream server pool index */ - u32 app_index; + /** App worker pool index */ + u32 app_wrk_index; u8 thread_index; /** To avoid n**2 "one event per frame" check */ - u8 enqueue_epoch; + u64 enqueue_epoch; /** svm segment index where fifos were allocated */ u32 svm_segment_index; @@ -85,8 +77,26 @@ typedef struct _stream_session_t /** Transport specific */ u32 connection_index; - /** Parent listener session if the result of an accept */ - u32 listener_index; + union + { + /** Parent listener session if the result of an accept */ + u32 listener_index; + + /** Application index if a listener */ + u32 app_index; + }; + + union + { + /** Transport app index for apps acting as transports */ + u32 t_app_index; + + /** Index in listener app's listener db */ + u32 listener_db_index; + + /** Opaque, for general use */ + u32 opaque; + }; CLIB_CACHE_LINE_ALIGN_MARK (pad); } stream_session_t; @@ -107,15 +117,27 @@ typedef struct local_session_ u32 session_index; /** Server index */ - u32 app_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; - u32 listener_index; + /** Transport listener index. Overlaps connection index */ + u32 transport_listener_index; - /** Port for connection */ - u16 port; + union + { + u32 listener_index; + u32 app_index; + }; + + u32 listener_db_index; /** Has transport embedded when listener not purely local */ session_type_t listener_session_type; @@ -123,7 +145,7 @@ typedef struct local_session_ /** * Client data */ - u32 client_index; + u32 client_wrk_index; u32 client_opaque; u64 server_evt_q; @@ -132,37 +154,69 @@ typedef struct local_session_ CLIB_CACHE_LINE_ALIGN_MARK (pad); } local_session_t; +#define foreach_session_endpoint_fields \ + foreach_transport_endpoint_cfg_fields \ + _(u8, transport_proto) \ + typedef struct _session_endpoint { - /* - * Network specific - */ #define _(type, name) type name; - foreach_transport_connection_fields + foreach_session_endpoint_fields #undef _ - /* - * Session specific - */ - u8 transport_proto; /**< transport protocol for session */ } session_endpoint_t; -#define SESSION_IP46_ZERO \ -{ \ - .ip6 = { \ - { 0, 0, }, \ - }, \ +typedef struct _session_endpoint_cfg +{ +#define _(type, name) type name; + foreach_session_endpoint_fields +#undef _ + u32 app_wrk_index; + u32 opaque; + u8 *hostname; +} session_endpoint_cfg_t; + +#define SESSION_IP46_ZERO \ +{ \ + .ip6 = { \ + { 0, 0, }, \ + }, \ +} + +#define TRANSPORT_ENDPOINT_NULL \ +{ \ + .sw_if_index = ENDPOINT_INVALID_INDEX, \ + .ip = SESSION_IP46_ZERO, \ + .fib_index = ENDPOINT_INVALID_INDEX, \ + .is_ip4 = 0, \ + .port = 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, \ + .peer = TRANSPORT_ENDPOINT_NULL, \ + .transport_proto = 0, \ } -#define SESSION_ENDPOINT_NULL \ -{ \ +#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, \ - .transport_proto = 0, \ + .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_to_transport(_sep) ((transport_endpoint_t *)_sep) +#define session_endpoint_to_transport_cfg(_sep) \ + ((transport_endpoint_cfg_t *)_sep) always_inline u8 session_endpoint_fib_proto (session_endpoint_t * sep)