Skip to content

Commit

Permalink
ngtcp2: increase QUIC window size when data is consumed
Browse files Browse the repository at this point in the history
Assisted-by: Javier Blazquez
Ref #4525 (partial fix)
  • Loading branch information
bagder committed Nov 15, 2019
1 parent c6b70de commit f954f4c
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 19 deletions.
1 change: 1 addition & 0 deletions lib/http.h
Expand Up @@ -198,6 +198,7 @@ struct HTTP {
bool upload_done;
#endif
#ifdef USE_NGHTTP3
size_t unacked_window;
struct h3out *h3out; /* per-stream buffers for upload */
#endif
};
Expand Down
52 changes: 33 additions & 19 deletions lib/vquic/ngtcp2.c
Expand Up @@ -336,6 +336,16 @@ static int cb_handshake_completed(ngtcp2_conn *tconn, void *user_data)
return 0;
}

static void extend_stream_window(ngtcp2_conn *tconn,
struct HTTP *stream)
{
size_t thismuch = stream->unacked_window;
ngtcp2_conn_extend_max_stream_offset(tconn, stream->stream3_id, thismuch);
ngtcp2_conn_extend_max_offset(tconn, thismuch);
stream->unacked_window = 0;
}


static int cb_recv_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
int fin, uint64_t offset,
const uint8_t *buf, size_t buflen,
Expand All @@ -344,10 +354,7 @@ static int cb_recv_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
struct quicsocket *qs = (struct quicsocket *)user_data;
ssize_t nconsumed;
(void)offset;
(void)stream_user_data;

infof(qs->conn->data, "Received %ld bytes data on stream %u\n",
buflen, stream_id);
(void)tconn;

nconsumed =
nghttp3_conn_read_stream(qs->h3conn, stream_id, buf, buflen, fin);
Expand All @@ -357,8 +364,16 @@ static int cb_recv_stream_data(ngtcp2_conn *tconn, int64_t stream_id,
return NGTCP2_ERR_CALLBACK_FAILURE;
}

ngtcp2_conn_extend_max_stream_offset(tconn, stream_id, nconsumed);
ngtcp2_conn_extend_max_offset(tconn, nconsumed);
if(stream_user_data) {
struct Curl_easy *data = stream_user_data;
struct HTTP *stream = data->req.protop;
stream->unacked_window += buflen;
}
else {
/* probably QPACK stream or similar */
ngtcp2_conn_extend_max_stream_offset(tconn, stream_id, nconsumed);
ngtcp2_conn_extend_max_offset(tconn, nconsumed);
}

return 0;
}
Expand Down Expand Up @@ -711,17 +726,19 @@ static int cb_h3_recv_data(nghttp3_conn *conn, int64_t stream_id,
const uint8_t *buf, size_t buflen,
void *user_data, void *stream_user_data)
{
struct quicsocket *qs = user_data;
size_t ncopy;
struct Curl_easy *data = stream_user_data;
struct HTTP *stream = data->req.protop;
(void)conn;
H3BUGF(infof(data, "cb_h3_recv_data CALLED with %d bytes\n", buflen));

/* TODO: this needs to be handled properly */
DEBUGASSERT(buflen <= stream->len);
if(buflen > stream->len) {
fprintf(stderr, "!! got %zd bytes, buffer has room for %zd bytes\n",
buflen, stream->len);
DEBUGASSERT(0);
}

ncopy = CURLMIN(stream->len, buflen);
ncopy = buflen;
memcpy(stream->mem, buf, ncopy);
stream->len -= ncopy;
stream->memlen += ncopy;
Expand All @@ -736,10 +753,8 @@ static int cb_h3_recv_data(nghttp3_conn *conn, int64_t stream_id,
}
#endif
stream->mem += ncopy;

ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, buflen);
ngtcp2_conn_extend_max_offset(qs->qconn, buflen);

(void)stream_id;
(void)user_data;
return 0;
}

Expand All @@ -750,10 +765,10 @@ static int cb_h3_deferred_consume(nghttp3_conn *conn, int64_t stream_id,
struct quicsocket *qs = user_data;
(void)conn;
(void)stream_user_data;
(void)stream_id;
(void)consumed;

ngtcp2_conn_extend_max_stream_offset(qs->qconn, stream_id, consumed);
ngtcp2_conn_extend_max_offset(qs->qconn, consumed);

extend_stream_window(qs->qconn, stream_user_data);
return 0;
}

Expand Down Expand Up @@ -969,8 +984,7 @@ static ssize_t ngh3_stream_recv(struct connectdata *conn,
stream->memlen = 0;
stream->mem = buf;
stream->len = buffersize;
H3BUGF(infof(conn->data, "!! ngh3_stream_recv returns %zd bytes at %p\n",
memlen, buf));
extend_stream_window(qs->qconn, stream);
return memlen;
}

Expand Down

0 comments on commit f954f4c

Please sign in to comment.