int qc_purge_txbuf(struct quic_conn *qc, struct buffer *buf);
struct buffer *qc_get_txb(struct quic_conn *qc);
-int qc_send_mux(struct quic_conn *qc, struct list *frms);
+enum quic_tx_err qc_send_mux(struct quic_conn *qc, struct list *frms);
void qel_register_send(struct list *send_list, struct quic_enc_level *qel,
struct list *frms);
*/
static int qcc_send_frames(struct qcc *qcc, struct list *frms)
{
+ enum quic_tx_err ret;
+
TRACE_ENTER(QMUX_EV_QCC_SEND, qcc->conn);
if (LIST_ISEMPTY(frms)) {
return 1;
}
- if (!qc_send_mux(qcc->conn->handle.qc, frms)) {
+ ret = qc_send_mux(qcc->conn->handle.qc, frms);
+ if (ret == QUIC_TX_ERR_FATAL) {
TRACE_DEVEL("error on sending", QMUX_EV_QCC_SEND, qcc->conn);
qcc_subscribe_send(qcc);
goto err;
*
* Returns the result from qc_send() function.
*/
-int qc_send_mux(struct quic_conn *qc, struct list *frms)
+enum quic_tx_err qc_send_mux(struct quic_conn *qc, struct list *frms)
{
struct list send_list = LIST_HEAD_INIT(send_list);
- int ret;
+ enum quic_tx_err ret = QUIC_TX_ERR_NONE;
+ int sent;
TRACE_ENTER(QUIC_EV_CONN_TXPKT, qc);
BUG_ON(qc->mux_state != QC_MUX_READY); /* Only MUX can uses this function so it must be ready. */
if (qc->conn->flags & CO_FL_SOCK_WR_SH) {
qc->conn->flags |= CO_FL_ERROR | CO_FL_SOCK_RD_SH;
TRACE_DEVEL("connection on error", QUIC_EV_CONN_TXPKT, qc);
- return 0;
+ return QUIC_TX_ERR_FATAL;
}
/* Try to send post handshake frames first unless on 0-RTT. */
TRACE_STATE("preparing data (from MUX)", QUIC_EV_CONN_TXPKT, qc);
qel_register_send(&send_list, qc->ael, frms);
- ret = qc_send(qc, 0, &send_list, 0);
+ sent = qc_send(qc, 0, &send_list, 0);
+ if (sent <= 0)
+ ret = QUIC_TX_ERR_FATAL;
TRACE_LEAVE(QUIC_EV_CONN_TXPKT, qc);
return ret;