mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-11-12 22:41:03 +01:00
MINOR: mux-quic: remove qcc_decode_qcs() call in XPRT
Slightly change the interface for qcc_recv() between MUX and XPRT. The MUX is now responsible to call qcc_decode_qcs(). This is cleaner as now the XPRT does not have to deal with an extra QCS parameter and the MUX will call qcc_decode_qcs() only if really needed. This change is possible since there is no extra buffering for out-of-order STREAM frames and the XPRT does not have to handle buffered frames.
This commit is contained in:
parent
37c2e4a65a
commit
3a0864067a
@ -25,10 +25,9 @@ void qcs_notify_recv(struct qcs *qcs);
|
|||||||
void qcs_notify_send(struct qcs *qcs);
|
void qcs_notify_send(struct qcs *qcs);
|
||||||
|
|
||||||
int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
|
int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
|
||||||
char fin, char *data, struct qcs **out_qcs);
|
char fin, char *data);
|
||||||
int qcc_recv_max_data(struct qcc *qcc, uint64_t max);
|
int qcc_recv_max_data(struct qcc *qcc, uint64_t max);
|
||||||
int qcc_recv_max_stream_data(struct qcc *qcc, uint64_t id, uint64_t max);
|
int qcc_recv_max_stream_data(struct qcc *qcc, uint64_t id, uint64_t max);
|
||||||
int qcc_decode_qcs(struct qcc *qcc, struct qcs *qcs);
|
|
||||||
void qcc_streams_sent_done(struct qcs *qcs, uint64_t data, uint64_t offset);
|
void qcc_streams_sent_done(struct qcs *qcs, uint64_t data, uint64_t offset);
|
||||||
|
|
||||||
/* Bit shift to get the stream sub ID for internal use which is obtained
|
/* Bit shift to get the stream sub ID for internal use which is obtained
|
||||||
|
|||||||
@ -364,23 +364,41 @@ struct qcs *qcc_get_qcs(struct qcc *qcc, uint64_t id)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle a new STREAM frame <strm_frm>. The frame content will be copied in
|
/* Decode the content of STREAM frames already received on the stream instance
|
||||||
* the buffer of the stream instance. The stream instance will be stored in
|
* <qcs>.
|
||||||
* <out_qcs>. In case of success, the caller can immediatly call qcc_decode_qcs
|
*
|
||||||
* to process the frame content.
|
* Returns 0 on success else non-zero.
|
||||||
|
*/
|
||||||
|
static int qcc_decode_qcs(struct qcc *qcc, struct qcs *qcs)
|
||||||
|
{
|
||||||
|
TRACE_ENTER(QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
||||||
|
|
||||||
|
if (qcc->app_ops->decode_qcs(qcs, qcs->flags & QC_SF_FIN_RECV, qcc->ctx) < 0) {
|
||||||
|
TRACE_DEVEL("leaving on decoding error", QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
qcs_notify_recv(qcs);
|
||||||
|
|
||||||
|
TRACE_LEAVE(QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle a new STREAM frame for stream with id <id>. Payload is pointed by
|
||||||
|
* <data> with length <len> and represents the offset <offset>. <fin> is set if
|
||||||
|
* the QUIC frame FIN bit is set.
|
||||||
*
|
*
|
||||||
* Returns 0 on success else non-zero.
|
* Returns 0 on success else non-zero.
|
||||||
*/
|
*/
|
||||||
int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
|
int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
|
||||||
char fin, char *data, struct qcs **out_qcs)
|
char fin, char *data)
|
||||||
{
|
{
|
||||||
struct qcs *qcs;
|
struct qcs *qcs;
|
||||||
enum ncb_ret ret;
|
enum ncb_ret ret;
|
||||||
|
|
||||||
TRACE_ENTER(QMUX_EV_QCC_RECV, qcc->conn);
|
TRACE_ENTER(QMUX_EV_QCC_RECV, qcc->conn);
|
||||||
|
|
||||||
*out_qcs = NULL;
|
|
||||||
|
|
||||||
qcs = qcc_get_qcs(qcc, id);
|
qcs = qcc_get_qcs(qcc, id);
|
||||||
if (!qcs) {
|
if (!qcs) {
|
||||||
if ((id >> QCS_ID_TYPE_SHIFT) <= qcc->strms[qcs_id_type(id)].largest_id) {
|
if ((id >> QCS_ID_TYPE_SHIFT) <= qcc->strms[qcs_id_type(id)].largest_id) {
|
||||||
@ -393,8 +411,6 @@ int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*out_qcs = qcs;
|
|
||||||
|
|
||||||
if (offset + len <= qcs->rx.offset) {
|
if (offset + len <= qcs->rx.offset) {
|
||||||
TRACE_DEVEL("leaving on already received offset", QMUX_EV_QCC_RECV|QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
TRACE_DEVEL("leaving on already received offset", QMUX_EV_QCC_RECV|QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
||||||
return 0;
|
return 0;
|
||||||
@ -439,6 +455,9 @@ int qcc_recv(struct qcc *qcc, uint64_t id, uint64_t len, uint64_t offset,
|
|||||||
if (fin)
|
if (fin)
|
||||||
qcs->flags |= QC_SF_FIN_RECV;
|
qcs->flags |= QC_SF_FIN_RECV;
|
||||||
|
|
||||||
|
if (ncb_data(&qcs->rx.ncbuf, 0) && !(qcs->flags & QC_SF_DEM_FULL))
|
||||||
|
qcc_decode_qcs(qcc, qcs);
|
||||||
|
|
||||||
TRACE_LEAVE(QMUX_EV_QCC_RECV, qcc->conn);
|
TRACE_LEAVE(QMUX_EV_QCC_RECV, qcc->conn);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -487,27 +506,6 @@ int qcc_recv_max_stream_data(struct qcc *qcc, uint64_t id, uint64_t max)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Decode the content of STREAM frames already received on the stream instance
|
|
||||||
* <qcs>.
|
|
||||||
*
|
|
||||||
* Returns 0 on success else non-zero.
|
|
||||||
*/
|
|
||||||
int qcc_decode_qcs(struct qcc *qcc, struct qcs *qcs)
|
|
||||||
{
|
|
||||||
TRACE_ENTER(QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
|
||||||
|
|
||||||
if (qcc->app_ops->decode_qcs(qcs, qcs->flags & QC_SF_FIN_RECV, qcc->ctx) < 0) {
|
|
||||||
TRACE_DEVEL("leaving on decoding error", QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
qcs_notify_recv(qcs);
|
|
||||||
|
|
||||||
TRACE_LEAVE(QMUX_EV_QCS_RECV, qcc->conn, qcs);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int qc_is_max_streams_needed(struct qcc *qcc)
|
static int qc_is_max_streams_needed(struct qcc *qcc)
|
||||||
{
|
{
|
||||||
return qcc->lfctl.cl_bidi_r > qcc->lfctl.ms_bidi_init / 2;
|
return qcc->lfctl.cl_bidi_r > qcc->lfctl.ms_bidi_init / 2;
|
||||||
|
|||||||
@ -2158,19 +2158,16 @@ static int qc_handle_bidi_strm_frm(struct quic_rx_packet *pkt,
|
|||||||
struct quic_stream *strm_frm,
|
struct quic_stream *strm_frm,
|
||||||
struct quic_conn *qc)
|
struct quic_conn *qc)
|
||||||
{
|
{
|
||||||
struct qcs *qcs = NULL;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = qcc_recv(qc->qcc, strm_frm->id, strm_frm->len,
|
ret = qcc_recv(qc->qcc, strm_frm->id, strm_frm->len,
|
||||||
strm_frm->offset.key, strm_frm->fin,
|
strm_frm->offset.key, strm_frm->fin,
|
||||||
(char *)strm_frm->data, &qcs);
|
(char *)strm_frm->data);
|
||||||
|
|
||||||
/* frame rejected - packet must not be acknowledeged */
|
/* frame rejected - packet must not be acknowledeged */
|
||||||
if (ret)
|
if (ret)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (qcs)
|
|
||||||
qcc_decode_qcs(qc->qcc, qcs);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user