Skip to content

Commit

Permalink
TMP MEDIUM: quic: decount buffer ack for MUX Tx window
Browse files Browse the repository at this point in the history
  • Loading branch information
a-denoyelle committed Sep 27, 2024
1 parent 8dedeb6 commit 41caa21
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 8 deletions.
9 changes: 9 additions & 0 deletions src/quic_rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -353,12 +353,16 @@ static void qc_handle_newly_acked_frm(struct quic_conn *qc, struct quic_frame *f
qc_release_frm(qc, frm);
}
else {
uint64_t diff = strm_frm->len;

/* Loop until there is no overlap between current frame and a next entry. */
while (more_strm &&
strm_frm->offset.key + strm_frm->len >= more_strm->offset.key) {
struct quic_frame *more_frm;
struct eb64_node *next;

diff = diff - (strm_frm->offset.key + strm_frm->len - more_strm->offset.key);

more_frm = container_of(more_strm, struct quic_frame, stream);
if (strm_frm->offset.key + strm_frm->len < more_strm->offset.key + more_strm->len) {
/* Extend current frame to cover next entry. */
Expand All @@ -383,6 +387,8 @@ static void qc_handle_newly_acked_frm(struct quic_conn *qc, struct quic_frame *f
less_strm->offset.key + less_strm->len >= strm_frm->offset.key) {
struct quic_frame *less_frm;

diff = diff - (less_strm->offset.key + less_strm->len - strm_frm->offset.key);

/* Extend previous entry to cover fully the current frame. */
less_strm->len += (strm_frm->offset.key + strm_frm->len) -
(less_strm->offset.key + less_strm->len);
Expand All @@ -398,6 +404,9 @@ static void qc_handle_newly_acked_frm(struct quic_conn *qc, struct quic_frame *f
else {
eb64_insert(&stream_buf->acked_frms, &strm_frm->offset);
}

if (stream->notify_room && diff && stream->buf != stream_buf)
stream->notify_room(stream, diff);
}
}
}
Expand Down
60 changes: 52 additions & 8 deletions src/quic_stream.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@ struct qc_stream_desc *qc_stream_desc_new(uint64_t id, enum qcs_type type, void
void qc_stream_desc_release(struct qc_stream_desc *stream,
uint64_t final_size, void *new_ctx)
{
struct eb64_node *frm_node;
struct qf_stream *strm_frm;
uint64_t diff;

if (!stream)
return;

Expand All @@ -116,9 +120,18 @@ void qc_stream_desc_release(struct qc_stream_desc *stream,
if (final_size < tail_offset)
b_sub(buf, tail_offset - final_size);

if (stream->notify_room && b_room(buf)) {
if (stream->notify_room) {
/* notify MUX about available buffers. */
stream->notify_room(stream, b_room(buf));
diff = b_room(&stream->buf->buf);
frm_node = eb64_first(&stream->buf->acked_frms);
while (frm_node) {
strm_frm = eb64_entry(frm_node, struct qf_stream, offset);
diff += strm_frm->len;
frm_node = eb64_next(frm_node);
}

if (diff)
stream->notify_room(stream, diff);
}

if (!b_data(buf))
Expand Down Expand Up @@ -175,7 +188,27 @@ int qc_stream_desc_ack(struct qc_stream_desc *stream, size_t offset, size_t len,
}
else if (stream->buf != stream_buf) {
/* inactive buffer, notify immediately about newly acknowledged data. */
stream->notify_room(stream, diff);
struct qf_stream *strm_frm;
struct eb64_node *frm_node;
uint64_t diff_buffered = 0;

frm_node = eb64_lookup_le(&stream_buf->acked_frms, offset);
if (frm_node) {
strm_frm = eb64_entry(frm_node, struct qf_stream, offset);
if (strm_frm->offset.key + strm_frm->len > offset) {
if (strm_frm->offset.key + strm_frm->len >= offset + len) {
diff_buffered = diff;
}
else {
diff_buffered = strm_frm->offset.key + strm_frm->len - offset;
}
}
}

if (diff_buffered < diff) {
}

stream->notify_room(stream, diff - diff_buffered);
}
}

Expand Down Expand Up @@ -333,17 +366,28 @@ struct buffer *qc_stream_buf_realloc(struct qc_stream_desc *stream)
*/
void qc_stream_buf_release(struct qc_stream_desc *stream)
{
struct buffer *buf;
struct qc_stream_buf *stream_buf = stream->buf;
struct eb64_node *frm_node;
struct qf_stream *strm_frm;
size_t diff;

/* current buffer already released */
BUG_ON(!stream->buf);
BUG_ON(!stream_buf);

diff = b_room(&stream_buf->buf);
frm_node = eb64_first(&stream_buf->acked_frms);
while (frm_node) {
strm_frm = eb64_entry(frm_node, struct qf_stream, offset);
BUG_ON(strm_frm->offset.key < stream->ack_offset);
diff += strm_frm->len;
frm_node = eb64_next(frm_node);
}

buf = &stream->buf->buf;
stream->buf = NULL;
stream->buf_offset = 0;

if (stream->notify_room && b_room(buf))
stream->notify_room(stream, b_room(buf));
if (stream->notify_room && diff)
stream->notify_room(stream, diff);
}

static int create_sbuf_pool(void)
Expand Down

0 comments on commit 41caa21

Please sign in to comment.