- n_bytes_per_seg = MAX_HDRS_LEN + snd_mss0;
- n_bufs_per_seg = ceil ((double) n_bytes_per_seg / n_bytes_per_buf);
- n_bufs_per_evt = ceil ((double) max_len_to_snd0 / n_bytes_per_seg);
- n_frames_per_evt = ceil ((double) n_bufs_per_evt / VLIB_FRAME_SIZE);
- n_bufs_per_frame = n_bufs_per_seg * VLIB_FRAME_SIZE;
+ n_bytes_per_seg = MAX_HDRS_LEN + ctx->snd_mss;
+ ctx->n_bufs_per_seg = ceil ((f64) n_bytes_per_seg / n_bytes_per_buf);
+ ctx->deq_per_buf = clib_min (ctx->snd_mss, n_bytes_per_buf);
+ ctx->deq_per_first_buf = clib_min (ctx->snd_mss,
+ n_bytes_per_buf - MAX_HDRS_LEN);
+}
+
+always_inline int
+session_tx_fifo_read_and_snd_i (vlib_main_t * vm, vlib_node_runtime_t * node,
+ session_fifo_event_t * e,
+ stream_session_t * s, int *n_tx_packets,
+ u8 peek_data)
+{
+ u32 next_index, next0, next1, next2, next3, *to_next, n_left_to_next;
+ u32 n_trace = vlib_get_trace_count (vm, node), n_bufs_needed = 0;
+ u32 thread_index = s->thread_index, n_left, pbi;
+ session_manager_main_t *smm = &session_manager_main;
+ session_tx_context_t *ctx = &smm->ctx[thread_index];
+ transport_proto_t tp;
+ vlib_buffer_t *pb;
+ u16 n_bufs;
+
+ if (PREDICT_FALSE (session_tx_not_ready (s, peek_data)))
+ {
+ vec_add1 (smm->pending_event_vector[thread_index], *e);
+ return 0;
+ }