X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fsession%2Fapplication_interface.h;h=b410c638155003ea98a6d99cbec6b1b7c74c8a79;hb=7a2abce4c9fc2191b3d3989c84516391036b6882;hp=2e850a98e573ffe4fb21a3c37140276f44262182;hpb=c4c4cf5066fbdceebd62a8819e3ecd0fc879f05d;p=vpp.git diff --git a/src/vnet/session/application_interface.h b/src/vnet/session/application_interface.h index 2e850a98e57..b410c638155 100644 --- a/src/vnet/session/application_interface.h +++ b/src/vnet/session/application_interface.h @@ -42,7 +42,7 @@ typedef struct session_cb_vft_ /** Connection request callback */ int (*session_connected_callback) (u32 app_wrk_index, u32 opaque, - session_t * s, u8 code); + session_t * s, session_error_t code); /** Notify app that session is closing */ void (*session_disconnect_callback) (session_t * s); @@ -68,6 +68,10 @@ typedef struct session_cb_vft_ /** Cert and key pair delete notification */ int (*app_cert_key_pair_delete_callback) (app_cert_key_pair_t * ckpair); + /** Delegate fifo-tuning-logic to application */ + int (*fifo_tuning_callback) (session_t * s, svm_fifo_t * f, + session_ft_action_t act, u32 bytes); + } session_cb_vft_t; #define foreach_app_init_args \ @@ -201,6 +205,10 @@ typedef enum APP_OPTIONS_PROXY_TRANSPORT, APP_OPTIONS_ACCEPT_COOKIE, APP_OPTIONS_TLS_ENGINE, + APP_OPTIONS_MAX_FIFO_SIZE, + APP_OPTIONS_HIGH_WATERMARK, + APP_OPTIONS_LOW_WATERMARK, + APP_OPTIONS_PCT_FIRST_ALLOC, APP_OPTIONS_N_OPTIONS } app_attach_options_index_t; @@ -379,6 +387,7 @@ typedef struct session_connect_msg_ u32 wrk_index; u32 vrf; u16 port; + u16 lcl_port; u8 proto; u8 is_ip4; ip46_address_t ip; @@ -502,6 +511,19 @@ typedef struct app_unmap_segment_msg_ u64 segment_handle; } session_app_del_segment_msg_t; +typedef struct session_migrate_msg_ +{ + uword vpp_evt_q; + session_handle_t handle; + session_handle_t new_handle; + u32 vpp_thread_index; +} __clib_packed session_migrated_msg_t; + +typedef struct session_cleanup_msg_ +{ + session_handle_t handle; +} __clib_packed session_cleanup_msg_t; + typedef struct app_session_event_ { svm_msg_q_msg_t msg; @@ -586,7 +608,7 @@ app_send_dgram_raw (svm_fifo_t * f, app_session_transport_t * at, int rv; max_enqueue = svm_fifo_max_enqueue_prod (f); - if (max_enqueue <= sizeof (session_dgram_hdr_t)) + if (max_enqueue < (sizeof (session_dgram_hdr_t) + len)) return 0; max_enqueue -= sizeof (session_dgram_hdr_t); @@ -660,7 +682,7 @@ app_recv_dgram_raw (svm_fifo_t * f, u8 * buf, u32 len, int rv; max_deq = svm_fifo_max_dequeue_cons (f); - if (max_deq < sizeof (session_dgram_hdr_t)) + if (max_deq <= sizeof (session_dgram_hdr_t)) { if (clear_evt) svm_fifo_unset_event (f); @@ -672,17 +694,16 @@ app_recv_dgram_raw (svm_fifo_t * f, u8 * buf, u32 len, svm_fifo_peek (f, 0, sizeof (ph), (u8 *) & ph); ASSERT (ph.data_length >= ph.data_offset); - if (!ph.data_offset) - svm_fifo_peek (f, sizeof (ph), sizeof (*at), (u8 *) at); + svm_fifo_peek (f, sizeof (ph), sizeof (*at), (u8 *) at); + len = clib_min (len, ph.data_length - ph.data_offset); rv = svm_fifo_peek (f, ph.data_offset + SESSION_CONN_HDR_LEN, len, buf); if (peek) return rv; - ph.data_offset += rv; - if (ph.data_offset == ph.data_length) - svm_fifo_dequeue_drop (f, ph.data_length + SESSION_CONN_HDR_LEN); - else - svm_fifo_overwrite_head (f, (u8 *) & ph, sizeof (ph)); + + /* Discards data that did not fit in buffer */ + svm_fifo_dequeue_drop (f, ph.data_length + SESSION_CONN_HDR_LEN); + return rv; } @@ -718,6 +739,24 @@ app_recv (app_session_t * s, u8 * data, u32 len) return app_recv_stream (s, data, len); } +/* *INDENT-OFF* */ +static char *session_error_str[] = { +#define _(sym, str) str, + foreach_session_error +#undef _ +}; +/* *INDENT-ON* */ + +static inline u8 * +format_session_error (u8 * s, va_list * args) +{ + session_error_t error = va_arg (*args, session_error_t); + if (-error >= 0 && -error < SESSION_N_ERRORS) + s = format (s, "%s", session_error_str[-error]); + else + s = format (s, "invalid session err %u", -error); + return s; +} #endif /* __included_uri_h__ */ /*