]> git.kaiwu.me - nginx.git/commitdiff
QUIC: multiple versions support in ALPN.
authorSergey Kandaurov <pluknet@nginx.com>
Mon, 9 Nov 2020 21:32:56 +0000 (00:32 +0300)
committerSergey Kandaurov <pluknet@nginx.com>
Mon, 9 Nov 2020 21:32:56 +0000 (00:32 +0300)
Previously, a version based on NGX_QUIC_DRAFT_VERSION was always set.
Now it is taken from the negotiated QUIC version that may differ.

src/event/ngx_event_quic.c
src/event/ngx_event_quic.h
src/http/modules/ngx_http_quic_module.h
src/http/modules/ngx_http_ssl_module.c
src/http/v3/ngx_http_v3.h

index a7e4748032cb536d8441e697528ce909e454fc84..49ed8f7ba79079a81db50524a41e882cd12fbaa6 100644 (file)
@@ -5813,3 +5813,14 @@ ngx_quic_free_frame(ngx_connection_t *c, ngx_quic_frame_t *frame)
                    "quic free frame n:%ui", qc->nframes);
 #endif
 }
+
+
+uint32_t
+ngx_quic_version(ngx_connection_t *c)
+{
+    uint32_t  version;
+
+    version = c->quic->version;
+
+    return (version & 0xff000000) == 0xff000000 ? version & 0xff : version;
+}
index e8bf926a04d47d70886b078da101d4f25f5c9666..fc41e0ce6b698280c5825ebae4dde7a7e3837662 100644 (file)
@@ -122,6 +122,7 @@ void ngx_quic_run(ngx_connection_t *c, ngx_quic_conf_t *conf);
 ngx_connection_t *ngx_quic_open_stream(ngx_connection_t *c, ngx_uint_t bidi);
 void ngx_quic_finalize_connection(ngx_connection_t *c, ngx_uint_t err,
     const char *reason);
+uint32_t ngx_quic_version(ngx_connection_t *c);
 
 
 /********************************* DEBUG *************************************/
index e744eb197220596d5250014f0f3e3188aa305b1c..bd4930f8a2beb3c9d29f9ab05b09db215edb8b67 100644 (file)
@@ -14,9 +14,8 @@
 #include <ngx_http.h>
 
 
-#define NGX_HTTP_QUIC_ALPN(s)         NGX_HTTP_QUIC_ALPN_DRAFT(s)
-#define NGX_HTTP_QUIC_ALPN_DRAFT(s)   "\x05hq-" #s
-#define NGX_HTTP_QUIC_ALPN_ADVERTISE  NGX_HTTP_QUIC_ALPN(NGX_QUIC_DRAFT_VERSION)
+#define NGX_HTTP_QUIC_ALPN_ADVERTISE  "\x02hq"
+#define NGX_HTTP_QUIC_ALPN_DRAFT_FMT  "\x05hq-%02uD"
 
 
 extern ngx_module_t  ngx_http_quic_module;
index a2db307f705655f36c2b5fd32d14c3e6c509ca9a..111de479b8659346850807c6c146ec2574d37a8b 100644 (file)
@@ -418,6 +418,9 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out,
     unsigned char *outlen, const unsigned char *in, unsigned int inlen,
     void *arg)
 {
+#if (NGX_HTTP_QUIC)
+    const char             *fmt;
+#endif
     unsigned int            srvlen;
     unsigned char          *srv;
 #if (NGX_DEBUG)
@@ -452,16 +455,32 @@ ngx_http_ssl_alpn_select(ngx_ssl_conn_t *ssl_conn, const unsigned char **out,
 
     } else
 #endif
-#if (NGX_HTTP_V3)
-    if (hc->addr_conf->http3) {
-        srv = (unsigned char *) NGX_HTTP_V3_ALPN_ADVERTISE;
-        srvlen = sizeof(NGX_HTTP_V3_ALPN_ADVERTISE) - 1;
-    } else
-#endif
 #if (NGX_HTTP_QUIC)
     if (hc->addr_conf->quic) {
-        srv = (unsigned char *) NGX_HTTP_QUIC_ALPN_ADVERTISE;
-        srvlen = sizeof(NGX_HTTP_QUIC_ALPN_ADVERTISE) - 1;
+#if (NGX_HTTP_V3)
+        if (hc->addr_conf->http3) {
+            srv = (unsigned char *) NGX_HTTP_V3_ALPN_ADVERTISE;
+            srvlen = sizeof(NGX_HTTP_V3_ALPN_ADVERTISE) - 1;
+            fmt = NGX_HTTP_V3_ALPN_DRAFT_FMT;
+
+        } else
+#endif
+        {
+            srv = (unsigned char *) NGX_HTTP_QUIC_ALPN_ADVERTISE;
+            srvlen = sizeof(NGX_HTTP_QUIC_ALPN_ADVERTISE) - 1;
+            fmt = NGX_HTTP_QUIC_ALPN_DRAFT_FMT;
+        }
+
+        /* QUIC draft */
+
+        if (ngx_quic_version(c) > 1) {
+            srv = ngx_pnalloc(c->pool, sizeof("\x05h3-xx") - 1);
+            if (srv == NULL) {
+                return SSL_TLSEXT_ERR_NOACK;
+            }
+            srvlen = ngx_sprintf(srv, fmt, ngx_quic_version(c)) - srv;
+        }
+
     } else
 #endif
     {
index aab27b3ac5174b7133a0941a96a170757d6ddaea..c244ab8614ae1dd80d98d313d488ddc0904a9db4 100644 (file)
@@ -15,9 +15,8 @@
 #include <ngx_http_v3_parse.h>
 
 
-#define NGX_HTTP_V3_ALPN(s)         NGX_HTTP_V3_ALPN_DRAFT(s)
-#define NGX_HTTP_V3_ALPN_DRAFT(s)   "\x05h3-" #s
-#define NGX_HTTP_V3_ALPN_ADVERTISE  NGX_HTTP_V3_ALPN(NGX_QUIC_DRAFT_VERSION)
+#define NGX_HTTP_V3_ALPN_ADVERTISE                 "\x02h3"
+#define NGX_HTTP_V3_ALPN_DRAFT_FMT                 "\x05h3-%02uD"
 
 #define NGX_HTTP_V3_VARLEN_INT_LEN                 4
 #define NGX_HTTP_V3_PREFIX_INT_LEN                 11