- deq_now = clib_min (svm_fifo_max_write_chunk (f), enq_max - read);
- read = BIO_read (oc->rbio, svm_fifo_tail (f), deq_now);
- if (read > 0)
- svm_fifo_enqueue_nocopy (f, read);
+ /* Peeking only pre-header dgram because the session is connected */
+ rv = svm_fifo_peek (app_session->tx_fifo, 0, sizeof (hdr), (u8 *) &hdr);
+ ASSERT (rv == sizeof (hdr) && hdr.data_length < vec_len (buf));
+ ASSERT (to_deq >= hdr.data_length + SESSION_CONN_HDR_LEN);
+
+ dgram_sz = hdr.data_length + SESSION_CONN_HDR_LEN;
+ enq_max = dgram_sz + TLSO_CTRL_BYTES;
+ if (svm_fifo_max_enqueue_prod (us->tx_fifo) < enq_max ||
+ svm_fifo_provision_chunks (us->tx_fifo, 0, 0, enq_max))
+ {
+ svm_fifo_add_want_deq_ntf (us->tx_fifo, SVM_FIFO_WANT_DEQ_NOTIF);
+ transport_connection_deschedule (&ctx->connection);
+ sp->flags |= TRANSPORT_SND_F_DESCHED;
+ goto done;
+ }
+
+ rv = svm_fifo_peek (app_session->tx_fifo, SESSION_CONN_HDR_LEN,
+ hdr.data_length, buf);
+ ASSERT (rv == hdr.data_length);
+ svm_fifo_dequeue_drop (app_session->tx_fifo, dgram_sz);
+
+ wrote = SSL_write (oc->ssl, buf, rv);
+ ASSERT (wrote > 0);
+
+ read += rv;
+ to_deq -= dgram_sz;