- data0 = vlib_buffer_make_headroom (b0, MAX_HDRS_LEN);
- if (peek_data)
- {
- n_bytes_read = svm_fifo_peek (s0->server_tx_fifo, tx_offset,
- len_to_deq0, data0);
- if (n_bytes_read <= 0)
- goto dequeue_fail;
- /* Keep track of progress locally, transport is also supposed to
- * increment it independently when pushing the header */
- tx_offset += n_bytes_read;
- }
- else
- {
- if (transport_vft->tx_type == TRANSPORT_TX_DGRAM)
- {
- svm_fifo_t *f = s0->server_tx_fifo;
- u16 deq_now;
- u32 offset;
-
- ASSERT (hdr.data_length > hdr.data_offset);
- deq_now = clib_min (hdr.data_length - hdr.data_offset,
- len_to_deq0);
- offset = hdr.data_offset + SESSION_CONN_HDR_LEN;
- n_bytes_read = svm_fifo_peek (f, offset, deq_now, data0);
- if (PREDICT_FALSE (n_bytes_read <= 0))
- goto dequeue_fail;
-
- if (s0->session_state == SESSION_STATE_LISTENING)
- {
- ip_copy (&tc0->rmt_ip, &hdr.rmt_ip, tc0->is_ip4);
- tc0->rmt_port = hdr.rmt_port;
- }
- hdr.data_offset += n_bytes_read;
- if (hdr.data_offset == hdr.data_length)
- {
- offset = hdr.data_length + SESSION_CONN_HDR_LEN;
- svm_fifo_dequeue_drop (f, offset);
- }
- }
- else
- {
- n_bytes_read = svm_fifo_dequeue_nowait (s0->server_tx_fifo,
- len_to_deq0, data0);
- if (n_bytes_read <= 0)
- goto dequeue_fail;
- }
- }
+ session_tx_fill_buffer (vm, ctx, b0, &n_bufs, peek_data);
+ session_tx_fill_buffer (vm, ctx, b1, &n_bufs, peek_data);