list[hdr].n = ist("");
- if (!(res = qcc_get_stream_txbuf(qcs)))
+ if (!(res = qcc_get_stream_txbuf(qcs))) {
+ TRACE_ERROR("cannot allocate Tx buffer", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
+ h3c->err = H3_INTERNAL_ERROR;
goto err;
+ }
/* At least 5 bytes to store frame type + length as a varint max size */
if (b_room(res) < 5)
err:
TRACE_DEVEL("leaving on error", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
- return 0;
+ return -1;
}
/* Convert a series of HTX trailer blocks from <htx> buffer into <qcs> buffer
}
list[hdr].n = ist("");
- if (!(res = qcc_get_stream_txbuf(qcs)))
+ if (!(res = qcc_get_stream_txbuf(qcs))) {
+ TRACE_ERROR("cannot allocate Tx buffer", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
+ h3c->err = H3_INTERNAL_ERROR;
goto err;
+ }
/* At least 9 bytes to store frame type + length as a varint max size */
if (b_room(res) < 9) {
err:
TRACE_DEVEL("leaving on error", H3_EV_TX_FRAME|H3_EV_TX_HDR, qcs->qcc->conn, qcs);
- return 0;
+ return -1;
}
/* Convert a series of HTX data blocks from <htx> buffer of size <count> into
static int h3_resp_data_send(struct qcs *qcs, struct htx *htx,
struct buffer *buf, size_t count)
{
+ struct h3s *h3s = qcs->ctx;
+ struct h3c *h3c = h3s->h3c;
struct buffer outbuf;
struct buffer *res;
size_t total = 0;
goto end;
if (!(res = qcc_get_stream_txbuf(qcs))) {
- /* TODO */
+ TRACE_ERROR("cannot allocate Tx buffer", H3_EV_TX_FRAME|H3_EV_TX_DATA, qcs->qcc->conn, qcs);
+ h3c->err = H3_INTERNAL_ERROR;
+ goto err;
}
/* If HTX contains only one DATA block, try to exchange it with MUX
* on SEND.
*/
if (b_size(&outbuf) <= hsize) {
+ TRACE_STATE("not enough room for data frame", H3_EV_TX_FRAME|H3_EV_TX_DATA, qcs->qcc->conn, qcs);
qcs->flags |= QC_SF_BLK_MROOM;
- goto end;
+ goto err;
}
if (b_size(&outbuf) < hsize + fsize)
end:
TRACE_LEAVE(H3_EV_TX_FRAME|H3_EV_TX_DATA, qcs->qcc->conn, qcs);
return total;
+
+ err:
+ TRACE_DEVEL("leaving on error", H3_EV_TX_FRAME|H3_EV_TX_DATA, qcs->qcc->conn, qcs);
+ return -1;
}
static size_t h3_snd_buf(struct qcs *qcs, struct buffer *buf, size_t count)
struct htx_blk *blk;
uint32_t bsize;
int32_t idx;
- int ret;
+ int ret = 0;
h3_debug_printf(stderr, "%s\n", __func__);
count -= bsize;
break;
}
+
+ /* If an error occured, either buffer space or connection error
+ * must be set to break current loop.
+ */
+ BUG_ON(ret < 0 && !(qcs->flags & QC_SF_BLK_MROOM) && !h3c->err);
}
/* Interrupt sending on connection error. */