From b373fe522048a6885b0cdeebfa583a61dee2ff1f Mon Sep 17 00:00:00 2001 From: George Wang Date: Thu, 26 Jan 2023 11:19:06 -0500 Subject: [PATCH] Release 3.3.1 --- CHANGELOG | 6 ++++++ docs/conf.py | 2 +- include/lsquic.h | 2 +- src/liblsquic/ls-qpack | 2 +- src/liblsquic/lsquic_hpi.c | 1 + src/liblsquic/lsquic_packet_resize.c | 23 ++++++++++++++++------- src/liblsquic/lsquic_qenc_hdl.c | 3 ++- src/liblsquic/lsquic_send_ctl.c | 7 +++++-- src/liblsquic/lsquic_stream.c | 19 +++++++++++++------ 9 files changed, 46 insertions(+), 19 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c2218aa..71a3e06 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +2023-01-26 + - 3.3.1 + - Fix blocked header encoding stream due to connection flow control congestion. + - Fix qeh_write_headers bug for Windows. + - Fix corner case for packet resizing. + 2023-01-04 - 3.3.0 - Improve path validation logic to avoid sending padded packet to unverified diff --git a/docs/conf.py b/docs/conf.py index f46c5e4..48c6da9 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -26,7 +26,7 @@ author = u'LiteSpeed Technologies' # The short X.Y version version = u'3.3' # The full version, including alpha/beta/rc tags -release = u'3.3.0' +release = u'3.3.1' # -- General configuration --------------------------------------------------- diff --git a/include/lsquic.h b/include/lsquic.h index e4e02c3..389fbcc 100644 --- a/include/lsquic.h +++ b/include/lsquic.h @@ -27,7 +27,7 @@ extern "C" { #define LSQUIC_MAJOR_VERSION 3 #define LSQUIC_MINOR_VERSION 3 -#define LSQUIC_PATCH_VERSION 0 +#define LSQUIC_PATCH_VERSION 1 /** * Engine flags: diff --git a/src/liblsquic/ls-qpack b/src/liblsquic/ls-qpack index 60cae6e..bbd7070 160000 --- a/src/liblsquic/ls-qpack +++ b/src/liblsquic/ls-qpack @@ -1 +1 @@ -Subproject commit 60cae6e1564b01c2699c759b952523d5986671d1 +Subproject commit bbd707065f4547a1b5a25bbc1cf6c1963e86b8cf diff --git a/src/liblsquic/lsquic_hpi.c b/src/liblsquic/lsquic_hpi.c index 5ab9669..5ddd122 100644 --- a/src/liblsquic/lsquic_hpi.c +++ b/src/liblsquic/lsquic_hpi.c @@ -111,6 +111,7 @@ lsquic_hpi_init (void *iter_p, struct lsquic_stream *first, else while (1) { + HPI_DEBUG("add stream %"PRIu64, stream->id); add_stream_to_hpi(iter, stream); ++count; if (stream == last) diff --git a/src/liblsquic/lsquic_packet_resize.c b/src/liblsquic/lsquic_packet_resize.c index 58ff027..598c92d 100644 --- a/src/liblsquic/lsquic_packet_resize.c +++ b/src/liblsquic/lsquic_packet_resize.c @@ -61,14 +61,23 @@ packet_resize_next_frec (struct packet_resize_ctx *prctx) prctx->prc_cur_packet = NULL; /* Not necessary; just future-proofing */ } - prctx->prc_cur_packet = prctx->prc_pri->pri_next_packet(prctx->prc_data); - if (!prctx->prc_cur_packet) + do { - LSQ_DEBUG("out of input packets"); - return NULL; - } - frec = lsquic_pofi_first(&prctx->prc_pofi, prctx->prc_cur_packet); - assert(frec); + prctx->prc_cur_packet = prctx->prc_pri->pri_next_packet(prctx->prc_data); + if (!prctx->prc_cur_packet) + { + LSQ_DEBUG("out of input packets"); + return NULL; + } + frec = lsquic_pofi_first(&prctx->prc_pofi, prctx->prc_cur_packet); + if (frec == NULL) + { + LSQ_DEBUG("discard, no good frec from current packet %"PRIu64, + prctx->prc_cur_packet->po_packno); + prctx->prc_pri->pri_discard_packet(prctx->prc_data, + prctx->prc_cur_packet); + } + } while (frec == NULL); LSQ_DEBUG("return first frec from new current packet %"PRIu64, prctx->prc_cur_packet->po_packno); return frec; diff --git a/src/liblsquic/lsquic_qenc_hdl.c b/src/liblsquic/lsquic_qenc_hdl.c index 17edb0f..41ca45f 100644 --- a/src/liblsquic/lsquic_qenc_hdl.c +++ b/src/liblsquic/lsquic_qenc_hdl.c @@ -423,7 +423,7 @@ qeh_write_headers (struct qpack_enc_hdl *qeh, lsquic_stream_id_t stream_id, { if (headers->headers[i].buf == NULL) continue; - enc_sz = sizeof(enc_buf); + enc_sz = qeh->qeh_encoder.qpe_cur_max_capacity * 2; hea_sz = end - p; st = lsqpack_enc_encode(&qeh->qeh_encoder, enc_buf, &enc_sz, p, &hea_sz, &headers->headers[i], enc_flags); @@ -515,6 +515,7 @@ qeh_write_headers (struct qpack_enc_hdl *qeh, lsquic_stream_id_t stream_id, "%.3f", total_enc_sz, lsquic_frab_list_size(&qeh->qeh_fral), *headers_sz, lsqpack_enc_ratio(&qeh->qeh_encoder)); retval = QWH_PARTIAL; + lsquic_stream_wantwrite(qeh->qeh_enc_sm_out, 1); goto end; } diff --git a/src/liblsquic/lsquic_send_ctl.c b/src/liblsquic/lsquic_send_ctl.c index d6ce861..224c001 100644 --- a/src/liblsquic/lsquic_send_ctl.c +++ b/src/liblsquic/lsquic_send_ctl.c @@ -1643,9 +1643,12 @@ static int send_ctl_can_send (struct lsquic_send_ctl *ctl) { const unsigned n_out = send_ctl_all_bytes_out(ctl); - LSQ_DEBUG("%s: n_out: %u (unacked_all: %u); cwnd: %"PRIu64, __func__, + LSQ_DEBUG("%s: n_out: %u (unacked_all: %u); cwnd: %"PRIu64 + "; ccfc: %"PRIu64"/%"PRIu64, __func__, n_out, ctl->sc_bytes_unacked_all, - ctl->sc_ci->cci_get_cwnd(CGP(ctl))); + ctl->sc_ci->cci_get_cwnd(CGP(ctl)), + ctl->sc_conn_pub->conn_cap.cc_sent, + ctl->sc_conn_pub->conn_cap.cc_max); if (ctl->sc_flags & SC_PACE) { if (n_out >= ctl->sc_ci->cci_get_cwnd(CGP(ctl))) diff --git a/src/liblsquic/lsquic_stream.c b/src/liblsquic/lsquic_stream.c index 7502f5e..9788246 100644 --- a/src/liblsquic/lsquic_stream.c +++ b/src/liblsquic/lsquic_stream.c @@ -583,6 +583,9 @@ decr_conn_cap (struct lsquic_stream *stream, size_t incr) { assert(stream->conn_pub->conn_cap.cc_sent >= incr); stream->conn_pub->conn_cap.cc_sent -= incr; + LSQ_DEBUG("decrease cc_sent by %zd to %"PRIu64, incr, + stream->conn_pub->conn_cap.cc_sent); + } } @@ -2048,8 +2051,11 @@ maybe_put_onto_write_q (lsquic_stream_t *stream, enum stream_q_flags flag) { assert(SMQF_WRITE_Q_FLAGS & flag); if (!(stream->sm_qflags & SMQF_WRITE_Q_FLAGS)) + { + LSQ_DEBUG("put on write queue"); TAILQ_INSERT_TAIL(&stream->conn_pub->write_streams, stream, next_write_stream); + } stream->sm_qflags |= flag; } @@ -2402,6 +2408,8 @@ lsquic_stream_dispatch_write_events (lsquic_stream_t *stream) unsigned short n_buffered; enum stream_q_flags q_flags; + LSQ_DEBUG("dispatch_write_events"); + if (!(stream->sm_qflags & SMQF_WRITE_Q_FLAGS) || (stream->stream_flags & STREAM_FINISHED)) return; @@ -2761,6 +2769,8 @@ incr_conn_cap (struct lsquic_stream *stream, size_t incr) stream->conn_pub->conn_cap.cc_sent += incr; assert(stream->conn_pub->conn_cap.cc_sent <= stream->conn_pub->conn_cap.cc_max); + LSQ_DEBUG("increase cc_sent by %zd to %"PRIu64, incr, + stream->conn_pub->conn_cap.cc_sent); } } @@ -3976,8 +3986,7 @@ lsquic_stream_pwritev (struct lsquic_stream *stream, bits = p[1] >> 6; vint_write(p + 1, payload_sz - shortfall, bits, 1 << bits); decr = shortfall; - if (stream->sm_bflags & SMBF_CONN_LIMITED) - stream->conn_pub->conn_cap.cc_sent -= decr; + decr_conn_cap(stream, decr); stream->sm_payload -= decr; stream->tosend_off -= decr; shortfall = 0; @@ -3985,8 +3994,7 @@ lsquic_stream_pwritev (struct lsquic_stream *stream, else { decr = payload_sz + 2 + (p[1] >> 6); - if (stream->sm_bflags & SMBF_CONN_LIMITED) - stream->conn_pub->conn_cap.cc_sent -= decr; + decr_conn_cap(stream, decr); stream->sm_payload -= payload_sz; stream->tosend_off -= decr; shortfall -= payload_sz; @@ -3998,8 +4006,7 @@ lsquic_stream_pwritev (struct lsquic_stream *stream, else { const size_t shortfall = n_allocated - (size_t) nw; - if (stream->sm_bflags & SMBF_CONN_LIMITED) - stream->conn_pub->conn_cap.cc_sent -= shortfall; + decr_conn_cap(stream, shortfall); stream->sm_payload -= shortfall; stream->tosend_off -= shortfall; }