QUIC: return written size from ngx_quic_write_chain().

This allows to escape calculating it before calling the function.
This commit is contained in:
Roman Arutyunyan 2022-01-13 11:34:42 +03:00
parent 2f28342e08
commit 2ba20e3451
4 changed files with 16 additions and 17 deletions

View File

@ -478,13 +478,17 @@ ngx_quic_copy_buf(ngx_connection_t *c, u_char *data, size_t len)
ngx_chain_t * ngx_chain_t *
ngx_quic_write_chain(ngx_connection_t *c, ngx_chain_t **chain, ngx_chain_t *in, ngx_quic_write_chain(ngx_connection_t *c, ngx_chain_t **chain, ngx_chain_t *in,
off_t limit, off_t offset) off_t limit, off_t offset, size_t *size)
{ {
off_t n; off_t n;
u_char *p; u_char *p;
ngx_buf_t *b; ngx_buf_t *b;
ngx_chain_t *cl, *sl; ngx_chain_t *cl, *sl;
if (size) {
*size = 0;
}
while (in && limit) { while (in && limit) {
cl = *chain; cl = *chain;
@ -549,6 +553,10 @@ ngx_quic_write_chain(ngx_connection_t *c, ngx_chain_t **chain, ngx_chain_t *in,
in->buf->pos += n; in->buf->pos += n;
offset += n; offset += n;
limit -= n; limit -= n;
if (size) {
*size += n;
}
} }
if (b->sync && p == b->last) { if (b->sync && p == b->last) {

View File

@ -31,7 +31,7 @@ void ngx_quic_free_chain(ngx_connection_t *c, ngx_chain_t *in);
ngx_chain_t *ngx_quic_read_chain(ngx_connection_t *c, ngx_chain_t **chain, ngx_chain_t *ngx_quic_read_chain(ngx_connection_t *c, ngx_chain_t **chain,
off_t limit); off_t limit);
ngx_chain_t *ngx_quic_write_chain(ngx_connection_t *c, ngx_chain_t **chain, ngx_chain_t *ngx_quic_write_chain(ngx_connection_t *c, ngx_chain_t **chain,
ngx_chain_t *in, off_t limit, off_t offset); ngx_chain_t *in, off_t limit, off_t offset, size_t *size);
#if (NGX_DEBUG) #if (NGX_DEBUG)
void ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx); void ngx_quic_log_frame(ngx_log_t *log, ngx_quic_frame_t *f, ngx_uint_t tx);

View File

@ -370,7 +370,7 @@ ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
if (f->offset > ctx->crypto_received) { if (f->offset > ctx->crypto_received) {
if (ngx_quic_write_chain(c, &ctx->crypto, frame->data, f->length, if (ngx_quic_write_chain(c, &ctx->crypto, frame->data, f->length,
f->offset - ctx->crypto_received) f->offset - ctx->crypto_received, NULL)
== NGX_CHAIN_ERROR) == NGX_CHAIN_ERROR)
{ {
return NGX_ERROR; return NGX_ERROR;

View File

@ -824,9 +824,10 @@ ngx_quic_stream_send(ngx_connection_t *c, u_char *buf, size_t size)
static ngx_chain_t * static ngx_chain_t *
ngx_quic_stream_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit) ngx_quic_stream_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
{ {
off_t n, flow; off_t flow;
size_t n;
ngx_event_t *wev; ngx_event_t *wev;
ngx_chain_t *out, *cl; ngx_chain_t *out;
ngx_connection_t *pc; ngx_connection_t *pc;
ngx_quic_frame_t *frame; ngx_quic_frame_t *frame;
ngx_quic_stream_t *qs; ngx_quic_stream_t *qs;
@ -851,17 +852,7 @@ ngx_quic_stream_send_chain(ngx_connection_t *c, ngx_chain_t *in, off_t limit)
limit = flow; limit = flow;
} }
n = 0; in = ngx_quic_write_chain(pc, &qs->out, in, limit, 0, &n);
for (cl = in; cl; cl = cl->next) {
n += cl->buf->last - cl->buf->pos;
if (n >= limit) {
n = limit;
break;
}
}
in = ngx_quic_write_chain(pc, &qs->out, in, limit, 0);
if (in == NGX_CHAIN_ERROR) { if (in == NGX_CHAIN_ERROR) {
return NGX_CHAIN_ERROR; return NGX_CHAIN_ERROR;
} }
@ -1099,7 +1090,7 @@ ngx_quic_handle_stream_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
} }
if (ngx_quic_write_chain(c, &qs->in, frame->data, f->length, if (ngx_quic_write_chain(c, &qs->in, frame->data, f->length,
f->offset - qs->recv_offset) f->offset - qs->recv_offset, NULL)
== NGX_CHAIN_ERROR) == NGX_CHAIN_ERROR)
{ {
return NGX_ERROR; return NGX_ERROR;