X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fapplication.h;h=5fea61bdab4413571757872a8b84dd5006c7b370;hb=e8ea6be8dfb626b5bb4ff3355ce8037724ce1d83;hp=b6f957ab871efeb113d940ad46af345db3690784;hpb=c8e812f6fb88dcd537e4de9333b5acf32e6f1ca0;p=vpp.git diff --git a/src/vnet/session/application.h b/src/vnet/session/application.h index b6f957ab871..5fea61bdab4 100644 --- a/src/vnet/session/application.h +++ b/src/vnet/session/application.h @@ -29,6 +29,16 @@ #define APP_DBG(_fmt, _args...) #endif +typedef struct app_wrk_postponed_msg_ +{ + u32 len; + u8 event_type; + u8 ring; + u8 is_sapi; + int fd; + u8 data[SESSION_CTRL_MSG_TX_MAX_SIZE]; +} app_wrk_postponed_msg_t; + typedef struct app_worker_ { CLIB_CACHE_LINE_ALIGN_MARK (cacheline0); @@ -45,27 +55,33 @@ typedef struct app_worker_ /** Application listens for events on this svm queue */ svm_msg_q_t *event_queue; - /** Segment manager used for outgoing connects issued by the app */ + /** + * Segment manager used for outgoing connects issued by the app. By + * convention this is the first segment manager allocated by the worker + * so it's also the one that holds the first segment with the app's + * message queue in it. + */ u32 connects_seg_manager; /** Lookup tables for listeners. Value is segment manager index */ uword *listeners_table; - /** - * First segment manager has in the the first segment the application's - * event fifo. Depending on what the app does, it may be either used for - * a listener or for connects. - */ - u32 first_segment_manager; - u8 first_segment_manager_in_use; - /** API index for the worker. Needed for multi-process apps */ u32 api_client_index; + /** Set if mq is congested */ + u8 mq_congested; + u8 app_is_builtin; - /** Per transport proto hash tables of half-open connection handles */ - uword **half_open_table; + /** Pool of half-open session handles. Tracked in case worker detaches */ + session_handle_t *half_open_table; + + /* Per vpp worker fifos of events for app worker */ + session_event_t **wrk_evts; + + /* Vector of vpp workers mq congestion flags */ + u8 *wrk_mq_congested; /** Protects detached seg managers */ clib_spinlock_t detached_seg_managers_lock; @@ -90,8 +106,26 @@ typedef struct app_listener_ session_handle_t ls_handle; /**< session handle of the local or global listening session that also identifies the app listener */ + u32 *cl_listeners; /**< vector that maps app workers to their + cl sessions with fifos */ } app_listener_t; +typedef enum app_rx_mq_flags_ +{ + APP_RX_MQ_F_PENDING = 1 << 0, + APP_RX_MQ_F_POSTPONED = 1 << 1, +} app_rx_mq_flags_t; + +typedef struct app_rx_mq_elt_ +{ + struct app_rx_mq_elt_ *next; + struct app_rx_mq_elt_ *prev; + svm_msg_q_t *mq; + uword file_index; + u32 app_index; + u8 flags; +} app_rx_mq_elt_t; + typedef struct application_ { /** App index in app pool */ @@ -117,9 +151,6 @@ typedef struct application_ u16 proxied_transports; - /** Pool of listeners for the app */ - app_listener_t *listeners; - /** Preferred tls engine */ u8 tls_engine; @@ -127,8 +158,38 @@ typedef struct application_ char quic_iv[17]; u8 quic_iv_set; + /** Segment where rx mqs were allocated */ + fifo_segment_t rx_mqs_segment; + + /** + * Fixed vector of rx mqs that can be a part of pending_rx_mqs + * linked list maintained by the app sublayer for each worker + */ + app_rx_mq_elt_t *rx_mqs; } application_t; +typedef struct app_rx_mq_handle_ +{ + union + { + struct + { + u32 app_index; + u32 thread_index; + }; + u64 as_u64; + }; +} __attribute__ ((aligned (sizeof (u64)))) app_rx_mq_handle_t; + +/** + * App sublayer per vpp worker state + */ +typedef struct asl_wrk_ +{ + /** Linked list of mqs with pending messages */ + app_rx_mq_elt_t *pending_rx_mqs; +} appsl_wrk_t; + typedef struct app_main_ { /** @@ -136,6 +197,9 @@ typedef struct app_main_ */ application_t *app_pool; + /** Pool of app listeners */ + app_listener_t *listeners; + /** * Hash table of apps by api client index */ @@ -155,6 +219,11 @@ typedef struct app_main_ * Last registered crypto engine type */ crypto_engine_type_t last_crypto_engine; + + /** + * App sublayer per-worker state + */ + appsl_wrk_t *wrk; } app_main_t; typedef struct app_init_args_ @@ -179,7 +248,7 @@ typedef struct _vnet_app_worker_add_del_args #define APP_NS_INVALID_INDEX ((u32)~0) #define APP_INVALID_SEGMENT_MANAGER_INDEX ((u32) ~0) -app_listener_t *app_listener_get (application_t * app, u32 al_index); +app_listener_t *app_listener_get (u32 al_index); int app_listener_alloc_and_init (application_t * app, session_endpoint_cfg_t * sep, app_listener_t ** listener); @@ -187,6 +256,8 @@ void app_listener_cleanup (app_listener_t * app_listener); session_handle_t app_listener_handle (app_listener_t * app_listener); app_listener_t *app_listener_lookup (application_t * app, session_endpoint_cfg_t * sep); +session_t *app_listener_select_wrk_cl_session (session_t *ls, + session_dgram_hdr_t *hdr); /** * Get app listener handle for listening session @@ -210,9 +281,9 @@ session_handle_t app_listen_session_handle (session_t * ls); * @return pointer to app listener or 0 */ app_listener_t *app_listener_get_w_handle (session_handle_t handle); -app_listener_t *app_listener_get_w_session (session_t * ls); session_t *app_listener_get_session (app_listener_t * al); session_t *app_listener_get_local_session (app_listener_t * al); +session_t *app_listener_get_wrk_cl_session (app_listener_t *al, u32 wrk_index); application_t *application_get (u32 index); application_t *application_get_if_valid (u32 index); @@ -232,6 +303,8 @@ u8 application_has_local_scope (application_t * app); u8 application_has_global_scope (application_t * app); void application_setup_proxy (application_t * app); void application_remove_proxy (application_t * app); +void application_namespace_cleanup (app_namespace_t *app_ns); +int application_original_dst_is_enabled (application_t *app); segment_manager_props_t *application_get_segment_manager_properties (u32 app_index); @@ -239,10 +312,21 @@ segment_manager_props_t *application_get_segment_manager_properties (u32 segment_manager_props_t * application_segment_manager_properties (application_t * app); +svm_msg_q_t *application_rx_mq_get (application_t *app, u32 mq_index); +u8 application_use_private_rx_mqs (void); +fifo_segment_t *application_get_rx_mqs_segment (application_t *app); +void application_enable_rx_mqs_nodes (u8 is_en); + /* * App worker */ +always_inline u8 +app_worker_mq_is_congested (app_worker_t *app_wrk) +{ + return app_wrk->mq_congested > 0; +} + app_worker_t *app_worker_alloc (application_t * app); int application_alloc_worker_and_init (application_t * app, app_worker_t ** wrk); @@ -251,41 +335,46 @@ app_worker_t *app_worker_get_if_valid (u32 wrk_index); application_t *app_worker_get_app (u32 wrk_index); int app_worker_own_session (app_worker_t * app_wrk, session_t * s); void app_worker_free (app_worker_t * app_wrk); -int app_worker_connect_session (app_worker_t * app, session_endpoint_t * tep, - u32 api_context); -int app_worker_start_listen (app_worker_t * app_wrk, app_listener_t * lstnr); +int app_worker_connect_session (app_worker_t *app, session_endpoint_cfg_t *sep, + session_handle_t *rsh); +session_error_t app_worker_start_listen (app_worker_t *app_wrk, + app_listener_t *lstnr); int app_worker_stop_listen (app_worker_t * app_wrk, app_listener_t * al); int app_worker_init_accepted (session_t * s); +int app_worker_listened_notify (app_worker_t *app_wrk, session_handle_t alsh, + u32 opaque, int err); +int app_worker_unlisten_reply (app_worker_t *app_wrk, session_handle_t sh, + u32 opaque, session_error_t err); int app_worker_accept_notify (app_worker_t * app_wrk, session_t * s); int app_worker_init_connected (app_worker_t * app_wrk, session_t * s); int app_worker_connect_notify (app_worker_t * app_wrk, session_t * s, session_error_t err, u32 opaque); -int app_worker_add_half_open (app_worker_t * app_wrk, transport_proto_t tp, - session_handle_t ho_handle, - session_handle_t wrk_handle); -int app_worker_del_half_open (app_worker_t * app_wrk, transport_proto_t tp, - session_handle_t ho_handle); -u64 app_worker_lookup_half_open (app_worker_t * app_wrk, transport_proto_t tp, - session_handle_t ho_handle); +int app_worker_add_half_open (app_worker_t *app_wrk, session_handle_t sh); +int app_worker_del_half_open (app_worker_t *app_wrk, session_t *s); int app_worker_close_notify (app_worker_t * app_wrk, session_t * s); int app_worker_transport_closed_notify (app_worker_t * app_wrk, session_t * s); int app_worker_reset_notify (app_worker_t * app_wrk, session_t * s); int app_worker_cleanup_notify (app_worker_t * app_wrk, session_t * s, session_cleanup_ntf_t ntf); +int app_worker_cleanup_notify_custom (app_worker_t *app_wrk, session_t *s, + session_cleanup_ntf_t ntf, + void (*cleanup_cb) (session_t *s)); int app_worker_migrate_notify (app_worker_t * app_wrk, session_t * s, session_handle_t new_sh); -int app_worker_builtin_rx (app_worker_t * app_wrk, session_t * s); -int app_worker_builtin_tx (app_worker_t * app_wrk, session_t * s); +int app_worker_rx_notify (app_worker_t *app_wrk, session_t *s); int app_worker_session_fifo_tuning (app_worker_t * app_wrk, session_t * s, svm_fifo_t * f, session_ft_action_t act, u32 len); +void app_worker_add_event (app_worker_t *app_wrk, session_t *s, + session_evt_type_t evt_type); +void app_worker_add_event_custom (app_worker_t *app_wrk, u32 thread_index, + session_event_t *evt); +int app_wrk_flush_wrk_events (app_worker_t *app_wrk, u32 thread_index); +void app_worker_del_all_events (app_worker_t *app_wrk); segment_manager_t *app_worker_get_listen_segment_manager (app_worker_t *, session_t *); segment_manager_t *app_worker_get_connect_segment_manager (app_worker_t *); -segment_manager_t - * app_worker_get_or_alloc_connect_segment_manager (app_worker_t *); -int app_worker_alloc_connects_segment_manager (app_worker_t * app); int app_worker_add_segment_notify (app_worker_t * app_wrk, u64 segment_handle); int app_worker_del_segment_notify (app_worker_t * app_wrk, @@ -293,9 +382,14 @@ int app_worker_del_segment_notify (app_worker_t * app_wrk, u32 app_worker_n_listeners (app_worker_t * app); session_t *app_worker_first_listener (app_worker_t * app, u8 fib_proto, u8 transport_proto); -int app_worker_send_event (app_worker_t * app, session_t * s, u8 evt); -int app_worker_lock_and_send_event (app_worker_t * app, session_t * s, - u8 evt_type); +void app_wrk_send_ctrl_evt_fd (app_worker_t *app_wrk, u8 evt_type, void *msg, + u32 msg_len, int fd); +void app_wrk_send_ctrl_evt (app_worker_t *app_wrk, u8 evt_type, void *msg, + u32 msg_len); +u8 app_worker_mq_wrk_is_congested (app_worker_t *app_wrk, u32 thread_index); +void app_worker_set_mq_wrk_congested (app_worker_t *app_wrk, u32 thread_index); +void app_worker_unset_wrk_mq_congested (app_worker_t *app_wrk, + u32 thread_index); session_t *app_worker_proxy_listener (app_worker_t * app, u8 fib_proto, u8 transport_proto); void app_worker_del_detached_sm (app_worker_t * app_wrk, u32 sm_index); @@ -304,7 +398,7 @@ u8 *format_app_worker_listener (u8 * s, va_list * args); u8 *format_crypto_engine (u8 * s, va_list * args); u8 *format_crypto_context (u8 * s, va_list * args); void app_worker_format_connects (app_worker_t * app_wrk, int verbose); -int vnet_app_worker_add_del (vnet_app_worker_add_del_args_t * a); +session_error_t vnet_app_worker_add_del (vnet_app_worker_add_del_args_t *a); uword unformat_application_proto (unformat_input_t * input, va_list * args); @@ -312,17 +406,17 @@ app_cert_key_pair_t *app_cert_key_pair_get (u32 index); app_cert_key_pair_t *app_cert_key_pair_get_if_valid (u32 index); app_cert_key_pair_t *app_cert_key_pair_get_default (); -/* Needed while we support both bapi and mq ctrl messages */ -int mq_send_session_bound_cb (u32 app_wrk_index, u32 api_context, - session_handle_t handle, int rv); -int mq_send_session_connected_cb (u32 app_wrk_index, u32 api_context, - session_t * s, session_error_t err); -void mq_send_unlisten_reply (app_worker_t * app_wrk, session_handle_t sh, - u32 context, int rv); +void sapi_socket_close_w_handle (u32 api_handle); crypto_engine_type_t app_crypto_engine_type_add (void); u8 app_crypto_engine_n_types (void); +static inline u8 +app_worker_application_is_builtin (app_worker_t *app_wrk) +{ + return app_wrk->app_is_builtin; +} + #endif /* SRC_VNET_SESSION_APPLICATION_H_ */ /*