# HG changeset patch # User Sergey Kandaurov # Date 1601550622 -3600 # Node ID 9588a2782c62225632d85488303e3e56f8294ea0 # Parent 0e12c4aca3ab1304ea88841b1d82786c33ef7d48 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. diff --git a/src/event/ngx_event_quic.c b/src/event/ngx_event_quic.c --- a/src/event/ngx_event_quic.c +++ b/src/event/ngx_event_quic.c @@ -2661,7 +2661,7 @@ ngx_quic_handle_ordered_frame(ngx_connec == 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_connect 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_connect 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; }