aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Kandaurov <pluknet@nginx.com>2020-10-01 12:10:22 +0100
committerSergey Kandaurov <pluknet@nginx.com>2020-10-01 12:10:22 +0100
commit7bd3868715b57f339ea5d61372bbca449509102f (patch)
treea07531bdff8eb4f7c9abeebf5f0c2752c7e3f595 /src
parentb64446f6f9e1b91e6d805cc56a72c1ad8e42a049 (diff)
downloadnginx-7bd3868715b57f339ea5d61372bbca449509102f.tar.gz
nginx-7bd3868715b57f339ea5d61372bbca449509102f.zip
QUIC: speeding up handshake completion.
As per quic-recovery draft, section-6.2.3: resend CRYPTO frames when receiving an Initial packet containing duplicate CRYPTO data.
Diffstat (limited to 'src')
-rw-r--r--src/event/ngx_event_quic.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c
index 82bb8902d..f223f5d7f 100644
--- a/src/event/ngx_event_quic.c
+++ b/src/event/ngx_event_quic.c
@@ -2661,7 +2661,7 @@ ngx_quic_handle_ordered_frame(ngx_connection_t *c, ngx_quic_frames_stream_t *fs,
== NGX_DONE)
{
/* old/duplicate data range */
- return NGX_OK;
+ return handler == ngx_quic_crypto_input ? NGX_DECLINED : NGX_OK;
}
/* intersecting data range, frame modified */
@@ -2844,6 +2844,7 @@ ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
ngx_quic_frame_t *frame)
{
uint64_t last;
+ ngx_int_t rc;
ngx_quic_connection_t *qc;
ngx_quic_crypto_frame_t *f;
ngx_quic_frames_stream_t *fs;
@@ -2860,8 +2861,19 @@ ngx_quic_handle_crypto_frame(ngx_connection_t *c, ngx_quic_header_t *pkt,
return NGX_ERROR;
}
- return ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_crypto_input,
- NULL);
+ rc = ngx_quic_handle_ordered_frame(c, fs, frame, ngx_quic_crypto_input,
+ NULL);
+ if (rc != NGX_DECLINED) {
+ return rc;
+ }
+
+ /* speeding up handshake completion */
+
+ if (pkt->level == ssl_encryption_initial) {
+ ngx_quic_resend_frames(c, ngx_quic_get_send_ctx(qc, pkt->level));
+ }
+
+ return NGX_OK;
}