#include <svm/message_queue.h>
#include <svm/ssvm.h>
-#define SESSION_PROXY_LISTENER_INDEX ((u8)~0 - 1)
-
#define foreach_session_input_error \
_(NO_SESSION, "No session drops") \
_(NO_LISTENER, "No listener for dst port drops") \
session_t *s;
transport_proto_vft_t *transport_vft;
transport_connection_t *tc;
- vlib_buffer_t *b;
u32 max_dequeue;
u32 snd_space;
u32 left_to_snd;
/** vlib_time_now last time around the track */
f64 last_vlib_time;
- /** Per-proto enqueue epoch counters */
- u64 current_enqueue_epoch[TRANSPORT_N_PROTO];
-
/** Per-proto vector of sessions to enqueue */
u32 *session_to_enqueue[TRANSPORT_N_PROTO];
extern session_main_t session_main;
extern vlib_node_registration_t session_queue_node;
extern vlib_node_registration_t session_queue_process_node;
+extern vlib_node_registration_t session_queue_pre_input_node;
#define SESSION_Q_PROCESS_FLUSH_FRAMES 1
#define SESSION_Q_PROCESS_STOP 2
{
session_t *s;
s = pool_elt_at_index (session_main.wrk[thread_index].sessions, si);
+ if (s->session_state == SESSION_STATE_CLOSED)
+ return 1;
+
if (s->thread_index != thread_index || s->session_index != si)
return 0;
return 1;
void session_transport_cleanup (session_t * s);
int session_send_io_evt_to_thread (svm_fifo_t * f,
session_evt_type_t evt_type);
+int session_enqueue_notify (session_t * s);
int session_dequeue_notify (session_t * s);
int session_send_io_evt_to_thread_custom (void *data, u32 thread_index,
session_evt_type_t evt_type);
void session_send_rpc_evt_to_thread (u32 thread_index, void *fp,
void *rpc_args);
+void session_send_rpc_evt_to_thread_force (u32 thread_index, void *fp,
+ void *rpc_args);
transport_connection_t *session_get_transport (session_t * s);
return svm_fifo_max_dequeue (s->tx_fifo);
}
+always_inline u32
+transport_max_rx_dequeue (transport_connection_t * tc)
+{
+ session_t *s = session_get (tc->s_index, tc->thread_index);
+ return svm_fifo_max_dequeue (s->rx_fifo);
+}
+
always_inline u32
transport_rx_fifo_size (transport_connection_t * tc)
{