changeset 8732:db58c7ef1d7c quic

QUIC: do not handle empty dcid. When a QUIC datagram arrives, its DCID is never empty. Previously, the case of empty DCID was handled. Now this code is simplified.
author Roman Arutyunyan <arut@nginx.com>
date Tue, 30 Mar 2021 14:33:47 +0300
parents d62a16fff3a4
children 385d511b5064
files src/event/ngx_event_udp.c
diffstat 1 files changed, 31 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/ngx_event_udp.c
+++ b/src/event/ngx_event_udp.c
@@ -17,8 +17,7 @@ static ssize_t ngx_udp_shared_recv(ngx_c
     size_t size);
 static ngx_int_t ngx_create_udp_connection(ngx_connection_t *c);
 static ngx_connection_t *ngx_lookup_udp_connection(ngx_listening_t *ls,
-    ngx_str_t *key, struct sockaddr *sockaddr, socklen_t socklen,
-    struct sockaddr *local_sockaddr, socklen_t local_socklen);
+    ngx_str_t *key, struct sockaddr *local_sockaddr, socklen_t local_socklen);
 
 
 void
@@ -224,7 +223,24 @@ ngx_event_recvmsg(ngx_event_t *ev)
 
 #endif
 
-        ngx_str_null(&key);
+        key.data = (u_char *) sockaddr;
+        key.len = socklen;
+
+#if (NGX_HAVE_UNIX_DOMAIN)
+
+        if (sockaddr->sa_family == AF_UNIX) {
+            struct sockaddr_un *saun = (struct sockaddr_un *) sockaddr;
+
+            if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path)
+                || saun->sun_path[0] == '\0')
+            {
+                ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,
+                               "unbound unix socket");
+                key.len = 0;
+            }
+        }
+
+#endif
 
 #if (NGX_QUIC)
         if (ls->quic) {
@@ -234,8 +250,7 @@ ngx_event_recvmsg(ngx_event_t *ev)
         }
 #endif
 
-        c = ngx_lookup_udp_connection(ls, &key, sockaddr, socklen,
-                                      local_sockaddr, local_socklen);
+        c = ngx_lookup_udp_connection(ls, &key, local_sockaddr, local_socklen);
 
         if (c) {
 
@@ -253,6 +268,13 @@ ngx_event_recvmsg(ngx_event_t *ev)
             }
 #endif
 
+#if (NGX_QUIC)
+            if (ls->quic) {
+                c->socklen = socklen;
+                ngx_memcpy(c->sockaddr, sockaddr, socklen);
+            }
+#endif
+
             ngx_memzero(&buf, sizeof(ngx_buf_t));
 
             buf.pos = buffer;
@@ -508,11 +530,6 @@ ngx_udp_rbtree_insert_value(ngx_rbtree_n
             rc = ngx_memn2cmp(udp->key.data, udpt->key.data,
                               udp->key.len, udpt->key.len);
 
-            if (rc == 0 && udp->key.len == 0) {
-                rc = ngx_cmp_sockaddr(c->sockaddr, c->socklen,
-                                      ct->sockaddr, ct->socklen, 1);
-            }
-
             if (rc == 0 && c->listening->wildcard) {
                 rc = ngx_cmp_sockaddr(c->local_sockaddr, c->local_socklen,
                                       ct->local_sockaddr, ct->local_socklen, 1);
@@ -566,7 +583,8 @@ ngx_create_udp_connection(ngx_connection
     cln->data = c;
     cln->handler = ngx_delete_udp_connection;
 
-    key.len = 0;
+    key.data = (u_char *) c->sockaddr;
+    key.len = c->socklen;
 
     ngx_insert_udp_connection(c, udp, &key);
 
@@ -586,10 +604,6 @@ ngx_insert_udp_connection(ngx_connection
 
     ngx_crc32_update(&hash, key->data, key->len);
 
-    if (key->len == 0) {
-        ngx_crc32_update(&hash, (u_char *) c->sockaddr, c->socklen);
-    }
-
     if (c->listening->wildcard) {
         ngx_crc32_update(&hash, (u_char *) c->local_sockaddr, c->local_socklen);
     }
@@ -621,7 +635,6 @@ ngx_delete_udp_connection(void *data)
 
 static ngx_connection_t *
 ngx_lookup_udp_connection(ngx_listening_t *ls, ngx_str_t *key,
-    struct sockaddr *sockaddr, socklen_t socklen,
     struct sockaddr *local_sockaddr, socklen_t local_socklen)
 {
     uint32_t               hash;
@@ -630,33 +643,16 @@ ngx_lookup_udp_connection(ngx_listening_
     ngx_rbtree_node_t     *node, *sentinel;
     ngx_udp_connection_t  *udp;
 
-#if (NGX_HAVE_UNIX_DOMAIN)
-
-    if (sockaddr->sa_family == AF_UNIX) {
-        struct sockaddr_un *saun = (struct sockaddr_un *) sockaddr;
-
-        if (socklen <= (socklen_t) offsetof(struct sockaddr_un, sun_path)
-            || saun->sun_path[0] == '\0')
-        {
-            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,
-                           "unbound unix socket");
-            return NULL;
-        }
+    if (key->len == 0) {
+        return NULL;
     }
 
-#endif
-
     node = ls->rbtree.root;
     sentinel = ls->rbtree.sentinel;
 
     ngx_crc32_init(hash);
-
     ngx_crc32_update(&hash, key->data, key->len);
 
-    if (key->len == 0) {
-        ngx_crc32_update(&hash, (u_char *) sockaddr, socklen);
-    }
-
     if (ls->wildcard) {
         ngx_crc32_update(&hash, (u_char *) local_sockaddr, local_socklen);
     }
@@ -683,41 +679,12 @@ ngx_lookup_udp_connection(ngx_listening_
 
         rc = ngx_memn2cmp(key->data, udp->key.data, key->len, udp->key.len);
 
-        if (rc == 0 && key->len == 0) {
-            rc = ngx_cmp_sockaddr(sockaddr, socklen,
-                                  c->sockaddr, c->socklen, 1);
-        }
-
         if (rc == 0 && ls->wildcard) {
             rc = ngx_cmp_sockaddr(local_sockaddr, local_socklen,
                                   c->local_sockaddr, c->local_socklen, 1);
         }
 
         if (rc == 0) {
-            if (key->len) {
-                rc = ngx_cmp_sockaddr(sockaddr, socklen,
-                                      c->sockaddr, c->socklen, 1);
-
-                if (rc) {
-#if (NGX_DEBUG)
-                    if (c->log->log_level & NGX_LOG_DEBUG_EVENT) {
-                        ngx_str_t  addr;
-                        u_char     text[NGX_SOCKADDR_STRLEN];
-
-                        addr.data = text;
-                        addr.len = ngx_sock_ntop(sockaddr, socklen, text,
-                                                 NGX_SOCKADDR_STRLEN, 1);
-
-                        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
-                                       "client migrated to %V", &addr);
-                    }
-#endif
-
-                    ngx_memcpy(c->sockaddr, sockaddr, socklen);
-                    c->socklen = socklen;
-                }
-            }
-
             return c;
         }