git: 311d8adb04e3 - main - www/nginx-devel: update HTTPv3/QUIC patch to the recent commit
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 31 Jan 2023 17:45:15 UTC
The branch main has been updated by osa:
URL: https://cgit.FreeBSD.org/ports/commit/?id=311d8adb04e3c55143f10ff16ec4fed35fc667fd
commit 311d8adb04e3c55143f10ff16ec4fed35fc667fd
Author: Sergey A. Osokin <osa@FreeBSD.org>
AuthorDate: 2023-01-31 17:43:21 +0000
Commit: Sergey A. Osokin <osa@FreeBSD.org>
CommitDate: 2023-01-31 17:43:57 +0000
www/nginx-devel: update HTTPv3/QUIC patch to the recent commit
Bump PORTREVISION.
---
www/nginx-devel/Makefile | 2 +-
www/nginx-devel/files/extra-patch-httpv3 | 771 +++++++++++++++++--------------
2 files changed, 435 insertions(+), 338 deletions(-)
diff --git a/www/nginx-devel/Makefile b/www/nginx-devel/Makefile
index 70e180825ba4..0a0ee6b1bf6e 100644
--- a/www/nginx-devel/Makefile
+++ b/www/nginx-devel/Makefile
@@ -1,6 +1,6 @@
PORTNAME?= nginx
PORTVERSION= 1.23.3
-PORTREVISION= 2
+PORTREVISION= 3
CATEGORIES= www
MASTER_SITES= https://nginx.org/download/ \
LOCAL/osa
diff --git a/www/nginx-devel/files/extra-patch-httpv3 b/www/nginx-devel/files/extra-patch-httpv3
index bc3ae99cef43..60e9f2e85e04 100644
--- a/www/nginx-devel/files/extra-patch-httpv3
+++ b/www/nginx-devel/files/extra-patch-httpv3
@@ -1,7 +1,7 @@
-diff -r aa901551a7eb README
+diff -r ff3afd1ce6a6 README
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/README Tue Dec 13 12:15:22 2022 -0500
-@@ -0,0 +1,251 @@
++++ b/README Tue Jan 31 11:41:14 2023 -0500
+@@ -0,0 +1,250 @@
+Experimental QUIC support for nginx
+-----------------------------------
+
@@ -19,8 +19,8 @@ diff -r aa901551a7eb README
+
+ The code is developed in a separate "quic" branch available
+ at https://hg.nginx.org/nginx-quic. Currently it is based
-+ on nginx mainline 1.23.x. NGINX Development team merges new
-+ nginx releases into this branch regularly.
++ on nginx mainline 1.23.x. We merge new nginx releases into
++ this branch regularly.
+
+ The project code base is under the same BSD license as nginx.
+
@@ -131,7 +131,7 @@ diff -r aa901551a7eb README
+ quic_host_key <filename>;
+
+
-+ By default, GSO Linux-specific optimization [11] is disabled.
++ By default, GSO Linux-specific optimization [10] is disabled.
+ Enable it in case a corresponding network interface is configured to
+ support GSO.
+
@@ -217,12 +217,12 @@ diff -r aa901551a7eb README
+ + Ensure a client is actually sending requests over QUIC
+ (see "Clients" section about browsers and cache)
+
-+ Please start with a simple console client such as ngtcp2 [9]
++ We recommend to start with simple console client like ngtcp2
+ to ensure the server is configured properly before trying
+ with real browsers that may be very picky with certificates,
+ for example.
+
-+ + Build nginx with debug support [10] and check the debug log.
++ + Build nginx with debug support [9] and check the debug log.
+ It should contain all details about connection and why it
+ failed. All related messages contain "quic " prefix and can
+ be easily filtered out.
@@ -250,12 +250,11 @@ diff -r aa901551a7eb README
+ [6] https://github.com/quictls/openssl
+ [7] https://github.com/libressl-portable/portable/releases/tag/v3.6.0
+ [8] https://nginx.org/en/docs/http/ngx_http_core_module.html#listen
-+ [9] https://github.com/ngtcp2/ngtcp2
-+ [10] https://nginx.org/en/docs/debugging_log.html
-+ [11] http://vger.kernel.org/lpc_net2018_talks/willemdebruijn-lpc2018-udpgso-paper-DRAFT-1.pdf
-diff -r aa901551a7eb auto/lib/openssl/conf
---- a/auto/lib/openssl/conf Wed Oct 19 10:56:20 2022 +0300
-+++ b/auto/lib/openssl/conf Tue Dec 13 12:15:22 2022 -0500
++ [9] https://nginx.org/en/docs/debugging_log.html
++ [10] http://vger.kernel.org/lpc_net2018_talks/willemdebruijn-lpc2018-udpgso-paper-DRAFT-1.pdf
+diff -r ff3afd1ce6a6 auto/lib/openssl/conf
+--- a/auto/lib/openssl/conf Tue Dec 13 18:53:53 2022 +0300
++++ b/auto/lib/openssl/conf Tue Jan 31 11:41:14 2023 -0500
@@ -5,12 +5,16 @@
if [ $OPENSSL != NONE ]; then
@@ -315,9 +314,9 @@ diff -r aa901551a7eb auto/lib/openssl/conf
+ fi
+ fi
fi
-diff -r aa901551a7eb auto/make
---- a/auto/make Wed Oct 19 10:56:20 2022 +0300
-+++ b/auto/make Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 auto/make
+--- a/auto/make Tue Dec 13 18:53:53 2022 +0300
++++ b/auto/make Tue Jan 31 11:41:14 2023 -0500
@@ -6,9 +6,10 @@
echo "creating $NGX_MAKEFILE"
@@ -331,9 +330,9 @@ diff -r aa901551a7eb auto/make
$NGX_OBJS/src/mail \
$NGX_OBJS/src/stream \
$NGX_OBJS/src/misc
-diff -r aa901551a7eb auto/modules
---- a/auto/modules Wed Oct 19 10:56:20 2022 +0300
-+++ b/auto/modules Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 auto/modules
+--- a/auto/modules Tue Dec 13 18:53:53 2022 +0300
++++ b/auto/modules Tue Jan 31 11:41:14 2023 -0500
@@ -102,7 +102,7 @@ if [ $HTTP = YES ]; then
fi
@@ -494,9 +493,9 @@ diff -r aa901551a7eb auto/modules
if [ $USE_PCRE = YES ]; then
ngx_module_type=CORE
ngx_module_name=ngx_regex_module
-diff -r aa901551a7eb auto/options
---- a/auto/options Wed Oct 19 10:56:20 2022 +0300
-+++ b/auto/options Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 auto/options
+--- a/auto/options Tue Dec 13 18:53:53 2022 +0300
++++ b/auto/options Tue Jan 31 11:41:14 2023 -0500
@@ -45,6 +45,8 @@ USE_THREADS=NO
NGX_FILE_AIO=NO
@@ -584,9 +583,9 @@ diff -r aa901551a7eb auto/options
--with-stream_realip_module enable ngx_stream_realip_module
--with-stream_geoip_module enable ngx_stream_geoip_module
--with-stream_geoip_module=dynamic enable dynamic ngx_stream_geoip_module
-diff -r aa901551a7eb auto/os/linux
---- a/auto/os/linux Wed Oct 19 10:56:20 2022 +0300
-+++ b/auto/os/linux Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 auto/os/linux
+--- a/auto/os/linux Tue Dec 13 18:53:53 2022 +0300
++++ b/auto/os/linux Tue Jan 31 11:41:14 2023 -0500
@@ -232,6 +232,50 @@ ngx_feature_test="struct crypt_data cd;
ngx_include="sys/vfs.h"; . auto/include
@@ -622,7 +621,7 @@ diff -r aa901551a7eb auto/os/linux
+ngx_feature_name="NGX_HAVE_SO_COOKIE"
+ngx_feature_run=no
+ngx_feature_incs="#include <sys/socket.h>
-+ #include <stdint.h>"
++ $NGX_INCLUDE_INTTYPES_H"
+ngx_feature_path=
+ngx_feature_libs=
+ngx_feature_test="socklen_t optlen = sizeof(uint64_t);
@@ -638,9 +637,9 @@ diff -r aa901551a7eb auto/os/linux
# UDP segmentation offloading
ngx_feature="UDP_SEGMENT"
-diff -r aa901551a7eb auto/sources
---- a/auto/sources Wed Oct 19 10:56:20 2022 +0300
-+++ b/auto/sources Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 auto/sources
+--- a/auto/sources Tue Dec 13 18:53:53 2022 +0300
++++ b/auto/sources Tue Jan 31 11:41:14 2023 -0500
@@ -83,7 +83,7 @@ CORE_SRCS="src/core/nginx.c \
EVENT_MODULES="ngx_events_module ngx_event_core_module"
@@ -650,9 +649,9 @@ diff -r aa901551a7eb auto/sources
EVENT_DEPS="src/event/ngx_event.h \
src/event/ngx_event_timer.h \
-diff -r aa901551a7eb src/core/nginx.c
---- a/src/core/nginx.c Wed Oct 19 10:56:20 2022 +0300
-+++ b/src/core/nginx.c Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 src/core/nginx.c
+--- a/src/core/nginx.c Tue Dec 13 18:53:53 2022 +0300
++++ b/src/core/nginx.c Tue Jan 31 11:41:14 2023 -0500
@@ -680,6 +680,9 @@ ngx_exec_new_binary(ngx_cycle_t *cycle,
ls = cycle->listening.elts;
@@ -663,9 +662,9 @@ diff -r aa901551a7eb src/core/nginx.c
p = ngx_sprintf(p, "%ud;", ls[i].fd);
}
-diff -r aa901551a7eb src/core/ngx_bpf.c
+diff -r ff3afd1ce6a6 src/core/ngx_bpf.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/core/ngx_bpf.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/core/ngx_bpf.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,143 @@
+
+/*
@@ -810,9 +809,9 @@ diff -r aa901551a7eb src/core/ngx_bpf.c
+
+ return ngx_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr));
+}
-diff -r aa901551a7eb src/core/ngx_bpf.h
+diff -r ff3afd1ce6a6 src/core/ngx_bpf.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/core/ngx_bpf.h Tue Dec 13 12:15:22 2022 -0500
++++ b/src/core/ngx_bpf.h Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,43 @@
+
+/*
@@ -857,9 +856,23 @@ diff -r aa901551a7eb src/core/ngx_bpf.h
+int ngx_bpf_map_lookup(int fd, const void *key, void *value);
+
+#endif /* _NGX_BPF_H_INCLUDED_ */
-diff -r aa901551a7eb src/core/ngx_connection.c
---- a/src/core/ngx_connection.c Wed Oct 19 10:56:20 2022 +0300
-+++ b/src/core/ngx_connection.c Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 src/core/ngx_conf_file.c
+--- a/src/core/ngx_conf_file.c Tue Dec 13 18:53:53 2022 +0300
++++ b/src/core/ngx_conf_file.c Tue Jan 31 11:41:14 2023 -0500
+@@ -544,8 +544,8 @@ ngx_conf_read_token(ngx_conf_t *cf)
+ }
+
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+- "unexpected end of file, "
+- "expecting \";\" or \"}\"");
++ "unexpected end of file, "
++ "expecting \";\" or \"}\"");
+ return NGX_ERROR;
+ }
+
+diff -r ff3afd1ce6a6 src/core/ngx_connection.c
+--- a/src/core/ngx_connection.c Tue Dec 13 18:53:53 2022 +0300
++++ b/src/core/ngx_connection.c Tue Jan 31 11:41:14 2023 -0500
@@ -72,10 +72,6 @@ ngx_create_listening(ngx_conf_t *cf, str
ngx_memcpy(ls->addr_text.data, text, len);
@@ -871,6 +884,15 @@ diff -r aa901551a7eb src/core/ngx_connection.c
ls->fd = (ngx_socket_t) -1;
ls->type = SOCK_STREAM;
+@@ -660,7 +656,7 @@ ngx_open_listening_sockets(ngx_cycle_t *
+ /*
+ * on OpenVZ after suspend/resume EADDRINUSE
+ * may be returned by listen() instead of bind(), see
+- * https://bugzilla.openvz.org/show_bug.cgi?id=2470
++ * https://bugs.openvz.org/browse/OVZ-5587
+ */
+
+ if (err != NGX_EADDRINUSE || !ngx_test_config) {
@@ -1037,6 +1033,12 @@ ngx_close_listening_sockets(ngx_cycle_t
ls = cycle->listening.elts;
for (i = 0; i < cycle->listening.nelts; i++) {
@@ -884,9 +906,9 @@ diff -r aa901551a7eb src/core/ngx_connection.c
c = ls[i].connection;
if (c) {
-diff -r aa901551a7eb src/core/ngx_connection.h
---- a/src/core/ngx_connection.h Wed Oct 19 10:56:20 2022 +0300
-+++ b/src/core/ngx_connection.h Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 src/core/ngx_connection.h
+--- a/src/core/ngx_connection.h Tue Dec 13 18:53:53 2022 +0300
++++ b/src/core/ngx_connection.h Tue Jan 31 11:41:14 2023 -0500
@@ -73,6 +73,7 @@ struct ngx_listening_s {
unsigned reuseport:1;
unsigned add_reuseport:1;
@@ -906,9 +928,9 @@ diff -r aa901551a7eb src/core/ngx_connection.h
#if (NGX_SSL || NGX_COMPAT)
ngx_ssl_connection_t *ssl;
#endif
-diff -r aa901551a7eb src/core/ngx_core.h
---- a/src/core/ngx_core.h Wed Oct 19 10:56:20 2022 +0300
-+++ b/src/core/ngx_core.h Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 src/core/ngx_core.h
+--- a/src/core/ngx_core.h Tue Dec 13 18:53:53 2022 +0300
++++ b/src/core/ngx_core.h Tue Jan 31 11:41:14 2023 -0500
@@ -27,6 +27,7 @@ typedef struct ngx_connection_s ngx
typedef struct ngx_thread_task_s ngx_thread_task_t;
typedef struct ngx_ssl_s ngx_ssl_t;
@@ -937,9 +959,9 @@ diff -r aa901551a7eb src/core/ngx_core.h
#define LF (u_char) '\n'
-diff -r aa901551a7eb src/event/ngx_event.c
---- a/src/event/ngx_event.c Wed Oct 19 10:56:20 2022 +0300
-+++ b/src/event/ngx_event.c Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 src/event/ngx_event.c
+--- a/src/event/ngx_event.c Tue Dec 13 18:53:53 2022 +0300
++++ b/src/event/ngx_event.c Tue Jan 31 11:41:14 2023 -0500
@@ -267,6 +267,18 @@ ngx_process_events_and_timers(ngx_cycle_
ngx_int_t
ngx_handle_read_event(ngx_event_t *rev, ngx_uint_t flags)
@@ -951,7 +973,7 @@ diff -r aa901551a7eb src/event/ngx_event.c
+ c = rev->data;
+
+ if (c->quic) {
-+ return ngx_quic_handle_read_event(rev, flags);
++ return NGX_OK;
+ }
+
+#endif
@@ -967,7 +989,7 @@ diff -r aa901551a7eb src/event/ngx_event.c
+
+#if (NGX_QUIC)
+ if (c->quic) {
-+ return ngx_quic_handle_write_event(wev, lowat);
++ return NGX_OK;
+ }
+#endif
+
@@ -977,7 +999,7 @@ diff -r aa901551a7eb src/event/ngx_event.c
if (ngx_send_lowat(c, lowat) == NGX_ERROR) {
return NGX_ERROR;
}
-@@ -868,8 +886,16 @@ ngx_event_process_init(ngx_cycle_t *cycl
+@@ -873,8 +891,16 @@ ngx_event_process_init(ngx_cycle_t *cycl
#else
@@ -996,10 +1018,10 @@ diff -r aa901551a7eb src/event/ngx_event.c
#if (NGX_HAVE_REUSEPORT)
-diff -r aa901551a7eb src/event/ngx_event_openssl.c
---- a/src/event/ngx_event_openssl.c Wed Oct 19 10:56:20 2022 +0300
-+++ b/src/event/ngx_event_openssl.c Tue Dec 13 12:15:22 2022 -0500
-@@ -3197,6 +3197,13 @@ ngx_ssl_shutdown(ngx_connection_t *c)
+diff -r ff3afd1ce6a6 src/event/ngx_event_openssl.c
+--- a/src/event/ngx_event_openssl.c Tue Dec 13 18:53:53 2022 +0300
++++ b/src/event/ngx_event_openssl.c Tue Jan 31 11:41:14 2023 -0500
+@@ -3202,6 +3202,13 @@ ngx_ssl_shutdown(ngx_connection_t *c)
ngx_err_t err;
ngx_uint_t tries;
@@ -1013,9 +1035,9 @@ diff -r aa901551a7eb src/event/ngx_event_openssl.c
rc = NGX_OK;
ngx_ssl_ocsp_cleanup(c);
-diff -r aa901551a7eb src/event/ngx_event_openssl.h
---- a/src/event/ngx_event_openssl.h Wed Oct 19 10:56:20 2022 +0300
-+++ b/src/event/ngx_event_openssl.h Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 src/event/ngx_event_openssl.h
+--- a/src/event/ngx_event_openssl.h Tue Dec 13 18:53:53 2022 +0300
++++ b/src/event/ngx_event_openssl.h Tue Jan 31 11:41:14 2023 -0500
@@ -24,6 +24,14 @@
#include <openssl/engine.h>
#endif
@@ -1031,9 +1053,9 @@ diff -r aa901551a7eb src/event/ngx_event_openssl.h
#include <openssl/hmac.h>
#ifndef OPENSSL_NO_OCSP
#include <openssl/ocsp.h>
-diff -r aa901551a7eb src/event/ngx_event_udp.c
---- a/src/event/ngx_event_udp.c Wed Oct 19 10:56:20 2022 +0300
-+++ b/src/event/ngx_event_udp.c Tue Dec 13 12:15:22 2022 -0500
+diff -r ff3afd1ce6a6 src/event/ngx_event_udp.c
+--- a/src/event/ngx_event_udp.c Tue Dec 13 18:53:53 2022 +0300
++++ b/src/event/ngx_event_udp.c Tue Jan 31 11:41:14 2023 -0500
@@ -12,13 +12,6 @@
#if !(NGX_WIN32)
@@ -1048,9 +1070,18 @@ diff -r aa901551a7eb src/event/ngx_event_udp.c
static void ngx_close_accepted_udp_connection(ngx_connection_t *c);
static ssize_t ngx_udp_shared_recv(ngx_connection_t *c, u_char *buf,
size_t size);
-diff -r aa901551a7eb src/event/ngx_event_udp.h
---- a/src/event/ngx_event_udp.h Wed Oct 19 10:56:20 2022 +0300
-+++ b/src/event/ngx_event_udp.h Tue Dec 13 12:15:22 2022 -0500
+@@ -88,7 +81,7 @@ ngx_event_recvmsg(ngx_event_t *ev)
+ msg.msg_controllen = sizeof(msg_control);
+
+ ngx_memzero(&msg_control, sizeof(msg_control));
+- }
++ }
+ #endif
+
+ n = recvmsg(lc->fd, &msg, 0);
+diff -r ff3afd1ce6a6 src/event/ngx_event_udp.h
+--- a/src/event/ngx_event_udp.h Tue Dec 13 18:53:53 2022 +0300
++++ b/src/event/ngx_event_udp.h Tue Jan 31 11:41:14 2023 -0500
@@ -23,6 +23,13 @@
#endif
@@ -1065,9 +1096,9 @@ diff -r aa901551a7eb src/event/ngx_event_udp.h
#if (NGX_HAVE_ADDRINFO_CMSG)
typedef union {
-diff -r aa901551a7eb src/event/quic/bpf/bpfgen.sh
+diff -r ff3afd1ce6a6 src/event/quic/bpf/bpfgen.sh
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/bpf/bpfgen.sh Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/bpf/bpfgen.sh Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,113 @@
+#!/bin/bash
+
@@ -1182,9 +1213,9 @@ diff -r aa901551a7eb src/event/quic/bpf/bpfgen.sh
+process_section
+generate_tail
+
-diff -r aa901551a7eb src/event/quic/bpf/makefile
+diff -r ff3afd1ce6a6 src/event/quic/bpf/makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/bpf/makefile Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/bpf/makefile Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,30 @@
+CFLAGS=-O2 -Wall
+
@@ -1216,9 +1247,9 @@ diff -r aa901551a7eb src/event/quic/bpf/makefile
+ llvm-objdump -S -no-show-raw-insn $<
+
+.DELETE_ON_ERROR:
-diff -r aa901551a7eb src/event/quic/bpf/ngx_quic_reuseport_helper.c
+diff -r ff3afd1ce6a6 src/event/quic/bpf/ngx_quic_reuseport_helper.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/bpf/ngx_quic_reuseport_helper.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/bpf/ngx_quic_reuseport_helper.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,140 @@
+#include <errno.h>
+#include <linux/string.h>
@@ -1360,9 +1391,9 @@ diff -r aa901551a7eb src/event/quic/bpf/ngx_quic_reuseport_helper.c
+ */
+ return SK_PASS;
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,1444 @@
+
+/*
@@ -2808,10 +2839,10 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic.c
+ ngx_quic_finalize_connection(c, qc->shutdown_code, qc->shutdown_reason);
+ }
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic.h Tue Dec 13 12:15:22 2022 -0500
-@@ -0,0 +1,133 @@
++++ b/src/event/quic/ngx_event_quic.h Tue Jan 31 11:41:14 2023 -0500
+@@ -0,0 +1,131 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
@@ -2937,17 +2968,15 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic.h
+ngx_int_t ngx_quic_reset_stream(ngx_connection_t *c, ngx_uint_t err);
+ngx_int_t ngx_quic_shutdown_stream(ngx_connection_t *c, int how);
+void ngx_quic_cancelable_stream(ngx_connection_t *c);
-+ngx_int_t ngx_quic_handle_read_event(ngx_event_t *rev, ngx_uint_t flags);
-+ngx_int_t ngx_quic_handle_write_event(ngx_event_t *wev, size_t lowat);
+ngx_int_t ngx_quic_get_packet_dcid(ngx_log_t *log, u_char *data, size_t len,
+ ngx_str_t *dcid);
+ngx_int_t ngx_quic_derive_key(ngx_log_t *log, const char *label,
+ ngx_str_t *secret, ngx_str_t *salt, u_char *out, size_t len);
+
+#endif /* _NGX_EVENT_QUIC_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_ack.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_ack.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_ack.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_ack.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,1194 @@
+
+/*
@@ -4143,9 +4172,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_ack.c
+
+ return NGX_OK;
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_ack.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_ack.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_ack.h Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_ack.h Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,30 @@
+
+/*
@@ -4177,9 +4206,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_ack.h
+ ngx_quic_send_ctx_t *ctx);
+
+#endif /* _NGX_EVENT_QUIC_ACK_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_bpf.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_bpf.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_bpf.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_bpf.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,657 @@
+
+/*
@@ -4838,9 +4867,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_bpf.c
+
+ return NGX_OK;
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_bpf_code.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_bpf_code.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_bpf_code.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_bpf_code.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,88 @@
+/* AUTO-GENERATED, DO NOT EDIT. */
+
@@ -4930,9 +4959,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_bpf_code.c
+ .license = "BSD",
+ .type = BPF_PROG_TYPE_SK_REUSEPORT,
+};
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_connection.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_connection.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_connection.h Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_connection.h Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) Nginx, Inc.
@@ -5210,9 +5239,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_connection.h
+#endif
+
+#endif /* _NGX_EVENT_QUIC_CONNECTION_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_connid.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_connid.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_connid.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_connid.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,502 @@
+
+/*
@@ -5716,9 +5745,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_connid.c
+
+ return NGX_OK;
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_connid.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_connid.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_connid.h Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_connid.h Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,29 @@
+
+/*
@@ -5749,10 +5778,10 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_connid.h
+ ngx_quic_client_id_t *cid);
+
+#endif /* _NGX_EVENT_QUIC_CONNID_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_frames.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_frames.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_frames.c Tue Dec 13 12:15:22 2022 -0500
-@@ -0,0 +1,844 @@
++++ b/src/event/quic/ngx_event_quic_frames.c Tue Jan 31 11:41:14 2023 -0500
+@@ -0,0 +1,891 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
@@ -6142,6 +6171,39 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_frames.c
+
+
+ngx_chain_t *
++ngx_quic_copy_buffer(ngx_connection_t *c, u_char *data, size_t len)
++{
++ ngx_buf_t buf;
++ ngx_chain_t cl, *out;
++ ngx_quic_buffer_t qb;
++
++ ngx_memzero(&buf, sizeof(ngx_buf_t));
++
++ buf.pos = data;
++ buf.last = buf.pos + len;
++ buf.temporary = 1;
++
++ cl.buf = &buf;
++ cl.next = NULL;
++
++ ngx_memzero(&qb, sizeof(ngx_quic_buffer_t));
++
++ if (ngx_quic_write_buffer(c, &qb, &cl, len, 0) == NGX_CHAIN_ERROR) {
++ return NGX_CHAIN_ERROR;
++ }
++
++ out = ngx_quic_read_buffer(c, &qb, len);
++ if (out == NGX_CHAIN_ERROR) {
++ return NGX_CHAIN_ERROR;
++ }
++
++ ngx_quic_free_buffer(c, &qb);
++
++ return out;
++}
++
++
++ngx_chain_t *
+ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb, uint64_t limit)
+{
+ uint64_t n;
@@ -6580,6 +6642,20 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_frames.c
+
+ case NGX_QUIC_FT_NEW_TOKEN:
+ p = ngx_slprintf(p, last, "NEW_TOKEN");
++
++#ifdef NGX_QUIC_DEBUG_FRAMES
++ {
++ ngx_chain_t *cl;
++
++ p = ngx_slprintf(p, last, " token:");
++
++ for (cl = f->data; cl; cl = cl->next) {
++ p = ngx_slprintf(p, last, "%*xs",
++ cl->buf->last - cl->buf->pos, cl->buf->pos);
++ }
++ }
++#endif
++
+ break;
+
+ case NGX_QUIC_FT_HANDSHAKE_DONE:
@@ -6597,10 +6673,10 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_frames.c
+}
+
+#endif
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_frames.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_frames.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_frames.h Tue Dec 13 12:15:22 2022 -0500
-@@ -0,0 +1,43 @@
++++ b/src/event/quic/ngx_event_quic_frames.h Tue Jan 31 11:41:14 2023 -0500
+@@ -0,0 +1,45 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
@@ -6629,6 +6705,8 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_frames.h
+ngx_chain_t *ngx_quic_alloc_chain(ngx_connection_t *c);
+void ngx_quic_free_chain(ngx_connection_t *c, ngx_chain_t *in);
+
++ngx_chain_t *ngx_quic_copy_buffer(ngx_connection_t *c, u_char *data,
++ size_t len);
+ngx_chain_t *ngx_quic_read_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
+ uint64_t limit);
+ngx_chain_t *ngx_quic_write_buffer(ngx_connection_t *c, ngx_quic_buffer_t *qb,
@@ -6644,9 +6722,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_frames.h
+#endif
+
+#endif /* _NGX_EVENT_QUIC_FRAMES_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_migration.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_migration.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_migration.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_migration.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,671 @@
+
+/*
@@ -7319,9 +7397,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_migration.c
+ ngx_add_timer(&qc->path_validation, next);
+ }
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_migration.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_migration.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_migration.h Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_migration.h Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,42 @@
+
+/*
@@ -7365,10 +7443,10 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_migration.h
+void ngx_quic_path_validation_handler(ngx_event_t *ev);
+
+#endif /* _NGX_EVENT_QUIC_MIGRATION_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_output.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_output.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_output.c Tue Dec 13 12:15:22 2022 -0500
-@@ -0,0 +1,1292 @@
++++ b/src/event/quic/ngx_event_quic_output.c Tue Jan 31 11:41:14 2023 -0500
+@@ -0,0 +1,1298 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
@@ -8447,6 +8525,7 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_output.c
+{
+ time_t expires;
+ ngx_str_t token;
++ ngx_chain_t *out;
+ ngx_quic_frame_t *frame;
+ ngx_quic_connection_t *qc;
+
@@ -8466,6 +8545,11 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_output.c
+ return NGX_ERROR;
+ }
+
++ out = ngx_quic_copy_buffer(c, token.data, token.len);
++ if (out == NGX_CHAIN_ERROR) {
++ return NGX_ERROR;
++ }
++
+ frame = ngx_quic_alloc_frame(c);
+ if (frame == NULL) {
+ return NGX_ERROR;
@@ -8473,8 +8557,8 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_output.c
+
+ frame->level = ssl_encryption_application;
+ frame->type = NGX_QUIC_FT_NEW_TOKEN;
++ frame->data = out;
+ frame->u.token.length = token.len;
-+ frame->u.token.data = token.data;
+
+ ngx_quic_queue_frame(qc, frame);
+
@@ -8661,9 +8745,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_output.c
+
+ return size;
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_output.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_output.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_output.h Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_output.h Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,40 @@
+
+/*
@@ -8705,9 +8789,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_output.h
+ size_t min, ngx_quic_path_t *path);
+
+#endif /* _NGX_EVENT_QUIC_OUTPUT_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_protection.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_protection.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_protection.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_protection.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,1126 @@
+
+/*
@@ -9835,9 +9919,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_protection.c
+
+ return NGX_OK;
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_protection.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_protection.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_protection.h Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_protection.h Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,75 @@
+
+/*
@@ -9914,9 +9998,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_protection.h
+
+
+#endif /* _NGX_EVENT_QUIC_PROTECTION_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_socket.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_socket.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_socket.c Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_socket.c Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,237 @@
+
+/*
@@ -10155,9 +10239,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_socket.c
+
+ return NULL;
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_socket.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_socket.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_socket.h Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_socket.h Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,28 @@
+
+/*
@@ -10187,10 +10271,10 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_socket.h
+
+
+#endif /* _NGX_EVENT_QUIC_SOCKET_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_ssl.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_ssl.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_ssl.c Tue Dec 13 12:15:22 2022 -0500
-@@ -0,0 +1,610 @@
++++ b/src/event/quic/ngx_event_quic_ssl.c Tue Jan 31 11:41:14 2023 -0500
+@@ -0,0 +1,587 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
@@ -10260,12 +10344,6 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_ssl.c
+ return 0;
+ }
+
-+ if (level == ssl_encryption_early_data) {
-+ if (ngx_quic_init_streams(c) != NGX_OK) {
-+ return 0;
-+ }
-+ }
-+
+ return 1;
+}
+
@@ -10331,10 +10409,6 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_ssl.c
+ }
+
+ if (level == ssl_encryption_early_data) {
-+ if (ngx_quic_init_streams(c) != NGX_OK) {
-+ return 0;
-+ }
-+
+ return 1;
+ }
+
@@ -10363,13 +10437,11 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_ssl.c
+{
+ u_char *p, *end;
+ size_t client_params_len;
-+ ngx_buf_t buf;
-+ ngx_chain_t *out, cl;
++ ngx_chain_t *out;
+ const uint8_t *client_params;
+ ngx_quic_tp_t ctp;
+ ngx_quic_frame_t *frame;
+ ngx_connection_t *c;
-+ ngx_quic_buffer_t qb;
+ ngx_quic_send_ctx_t *ctx;
+ ngx_quic_connection_t *qc;
+#if defined(TLSEXT_TYPE_application_layer_protocol_negotiation)
@@ -10446,28 +10518,11 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_ssl.c
+
+ ctx = ngx_quic_get_send_ctx(qc, level);
+
-+ ngx_memzero(&buf, sizeof(ngx_buf_t));
-+
-+ buf.pos = (u_char *) data;
-+ buf.last = buf.pos + len;
-+ buf.temporary = 1;
-+
-+ cl.buf = &buf;
-+ cl.next = NULL;
-+
-+ ngx_memzero(&qb, sizeof(ngx_quic_buffer_t));
-+
-+ if (ngx_quic_write_buffer(c, &qb, &cl, len, 0) == NGX_CHAIN_ERROR) {
-+ return 0;
-+ }
-+
-+ out = ngx_quic_read_buffer(c, &qb, len);
++ out = ngx_quic_copy_buffer(c, (u_char *) data, len);
+ if (out == NGX_CHAIN_ERROR) {
+ return 0;
+ }
+
-+ ngx_quic_free_buffer(c, &qb);
-+
+ frame = ngx_quic_alloc_frame(c);
+ if (frame == NULL) {
+ return 0;
@@ -10648,11 +10703,17 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_ssl.c
+ qc->error_reason = "handshake failed";
+ return NGX_ERROR;
+ }
-+
-+ return NGX_OK;
+ }
+
-+ if (SSL_in_init(ssl_conn)) {
++ if (n <= 0 || SSL_in_init(ssl_conn)) {
++ if (ngx_quic_keys_available(qc->keys, ssl_encryption_early_data)
++ && qc->client_tp_done)
++ {
++ if (ngx_quic_init_streams(c) != NGX_OK) {
++ return NGX_ERROR;
++ }
++ }
++
+ return NGX_OK;
+ }
+
@@ -10801,9 +10862,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_ssl.c
+
+ return NGX_OK;
+}
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_ssl.h
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_ssl.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_ssl.h Tue Dec 13 12:15:22 2022 -0500
++++ b/src/event/quic/ngx_event_quic_ssl.h Tue Jan 31 11:41:14 2023 -0500
@@ -0,0 +1,19 @@
+
+/*
@@ -10824,10 +10885,10 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_ssl.h
+ ngx_quic_header_t *pkt, ngx_quic_frame_t *frame);
+
+#endif /* _NGX_EVENT_QUIC_SSL_H_INCLUDED_ */
-diff -r aa901551a7eb src/event/quic/ngx_event_quic_streams.c
+diff -r ff3afd1ce6a6 src/event/quic/ngx_event_quic_streams.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/src/event/quic/ngx_event_quic_streams.c Tue Dec 13 12:15:22 2022 -0500
-@@ -0,0 +1,1775 @@
++++ b/src/event/quic/ngx_event_quic_streams.c Tue Jan 31 11:41:14 2023 -0500
+@@ -0,0 +1,1768 @@
+
+/*
+ * Copyright (C) Nginx, Inc.
@@ -10876,8 +10937,8 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_streams.c
+ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi)
+{
+ uint64_t id;
-+ ngx_connection_t *pc;
-+ ngx_quic_stream_t *nqs;
++ ngx_connection_t *pc, *sc;
++ ngx_quic_stream_t *qs;
+ ngx_quic_connection_t *qc;
+
+ pc = c->quic ? c->quic->parent : c;
@@ -10931,12 +10992,21 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_streams.c
+ qc->streams.server_streams_uni++;
+ }
+
-+ nqs = ngx_quic_create_stream(pc, id);
-+ if (nqs == NULL) {
++ qs = ngx_quic_create_stream(pc, id);
++ if (qs == NULL) {
+ return NULL;
+ }
+
-+ return nqs->connection;
++ sc = qs->connection;
++
++ sc->write->active = 1;
++ sc->write->ready = 1;
++
++ if (bidi) {
++ sc->read->active = 1;
++ }
++
++ return sc;
+}
+
+
@@ -11033,6 +11103,9 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_streams.c
+ continue;
+ }
+
++ sc->read->error = 1;
++ sc->write->error = 1;
++
+ ngx_quic_set_event(sc->read);
+ ngx_quic_set_event(sc->write);
+
@@ -11075,6 +11148,10 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_streams.c
+ qs->send_state = NGX_QUIC_STREAM_SEND_RESET_SENT;
+ qs->send_final_size = qs->send_offset;
+
++ if (qs->connection) {
++ qs->connection->write->error = 1;
++ }
++
+ pc = qs->parent;
+ qc = ngx_quic_get_connection(pc);
+
@@ -11357,6 +11434,13 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_streams.c
+
+ ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "quic init stream");
+
++ if ((qs->id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0) {
++ c->write->active = 1;
++ c->write->ready = 1;
++ }
++
++ c->read->active = 1;
++
+ ngx_queue_remove(&qs->queue);
+
+ c->listening->handler(c);
@@ -11512,6 +11596,7 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_streams.c
+ sc->local_sockaddr = c->local_sockaddr;
+ sc->local_socklen = c->local_socklen;
+ sc->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);
++ sc->start_time = c->start_time;
+ sc->tcp_nodelay = NGX_TCP_NODELAY_DISABLED;
+
+ sc->recv = ngx_quic_stream_recv;
@@ -11526,12 +11611,6 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_streams.c
+
+ log->connection = sc->number;
+
-+ if ((id & NGX_QUIC_STREAM_UNIDIRECTIONAL) == 0
-+ || (id & NGX_QUIC_STREAM_SERVER_INITIATED))
-+ {
-+ sc->write->ready = 1;
-+ }
-+
+ if (id & NGX_QUIC_STREAM_UNIDIRECTIONAL) {
+ if (id & NGX_QUIC_STREAM_SERVER_INITIATED) {
+ qs->send_max_data = qc->ctp.initial_max_stream_data_uni;
@@ -11627,7 +11706,6 @@ diff -r aa901551a7eb src/event/quic/ngx_event_quic_streams.c
+ || qs->recv_state == NGX_QUIC_STREAM_RECV_RESET_READ)
+ {
+ qs->recv_state = NGX_QUIC_STREAM_RECV_RESET_READ;
*** 790 LINES SKIPPED ***