]> git.kaiwu.me - nginx.git/commitdiff
QUIC: decoupled path state and limitation status.
authorVladimir Homutov <vl@nginx.com>
Mon, 13 Dec 2021 06:48:33 +0000 (09:48 +0300)
committerVladimir Homutov <vl@nginx.com>
Mon, 13 Dec 2021 06:48:33 +0000 (09:48 +0300)
The path validation status and anti-amplification limit status is actually
two different variables.  It is possible that validating path should not
be limited (for example, when re-validating former path).

src/event/quic/ngx_event_quic.c
src/event/quic/ngx_event_quic_connection.h
src/event/quic/ngx_event_quic_migration.c
src/event/quic/ngx_event_quic_output.c
src/event/quic/ngx_event_quic_socket.c

index cb71a16b15eaaac33271360a81593de01dc9f258..4a9526d613fde788e476fffc20e79e90bbe61ede 100644 (file)
@@ -1013,6 +1013,7 @@ ngx_quic_process_payload(ngx_connection_t *c, ngx_quic_header_t *pkt)
 
         if (qc->socket->path->state != NGX_QUIC_PATH_VALIDATED) {
             qc->socket->path->state = NGX_QUIC_PATH_VALIDATED;
+            qc->socket->path->limited = 0;
             ngx_post_event(&qc->push, &ngx_posted_events);
         }
     }
index 7b6afb123204623e47ff939f7e2038f05321eb43..73268ea0a3b8b590822413002ffab0ef369bf839 100644 (file)
@@ -85,6 +85,7 @@ struct ngx_quic_path_s {
     struct sockaddr                  *sockaddr;
     socklen_t                         socklen;
     ngx_uint_t                        state;
+    ngx_uint_t                        limited; /* unsigned  limited:1; */
     ngx_msec_t                        expires;
     ngx_msec_t                        last_seen;
     ngx_uint_t                        tries;
index 0bfee60584b85a69f666f1a320ba941cf16adf71..9b1ccafba97bf9d3f39ceaa20528918af690e33f 100644 (file)
@@ -158,6 +158,7 @@ valid:
                    "quic path #%uL successfully validated", path->seqnum);
 
     path->state = NGX_QUIC_PATH_VALIDATED;
+    path->limited = 0;
 
     return NGX_OK;
 }
@@ -215,6 +216,9 @@ ngx_quic_add_path(ngx_connection_t *c, struct sockaddr *sockaddr,
         return NULL;
     }
 
+    path->state = NGX_QUIC_PATH_NEW;
+    path->limited = 1;
+
     path->seqnum = qc->path_seqnum++;
     path->last_seen = ngx_current_msec;
 
@@ -332,6 +336,7 @@ update:
         /* force limits/revalidation for paths that were not seen recently */
         if (ngx_current_msec - path->last_seen > qc->tp.max_idle_timeout) {
             path->state = NGX_QUIC_PATH_NEW;
+            path->limited = 1;
             path->sent = 0;
             path->received = 0;
         }
@@ -350,11 +355,11 @@ update:
      */
     path->received += len;
 
-    ngx_log_debug6(NGX_LOG_DEBUG_EVENT, c->log, 0,
+    ngx_log_debug7(NGX_LOG_DEBUG_EVENT, c->log, 0,
                    "quic packet via #%uL:%uL:%uL"
-                   " size:%O path recvd:%O sent:%O",
+                   " size:%O path recvd:%O sent:%O limited:%ui",
                    qsock->sid.seqnum, qsock->cid->seqnum, path->seqnum,
-                   len, path->received, path->sent);
+                   len, path->received, path->sent, path->limited);
 
     return NGX_OK;
 }
@@ -607,6 +612,7 @@ ngx_quic_path_validation_handler(ngx_event_t *ev)
         /* found expired path */
 
         path->state = NGX_QUIC_PATH_NEW;
+        path->limited = 1;
 
         /*
          * RFC 9000, 9.4.  Loss Detection and Congestion Control
index 3d75e9c3939c6dcc2c6591dcbb980a83edd07a03..3963ef006aa8da963e92a0e04b6daa44e753fba2 100644 (file)
@@ -160,7 +160,7 @@ ngx_quic_create_datagrams(ngx_connection_t *c, ngx_quic_socket_t *qsock)
         len = ngx_min(qc->ctp.max_udp_payload_size,
                       NGX_QUIC_MAX_UDP_PAYLOAD_SIZE);
 
-        if (path->state != NGX_QUIC_PATH_VALIDATED) {
+        if (path->limited) {
             max = path->received * 3;
             max = (path->sent >= max) ? 0 : max - path->sent;
 
@@ -294,7 +294,7 @@ ngx_quic_allow_segmentation(ngx_connection_t *c, ngx_quic_socket_t *qsock)
         return 0;
     }
 
-    if (qsock->path->state != NGX_QUIC_PATH_VALIDATED) {
+    if (qsock->path->limited) {
         /* don't even try to be faster on non-validated paths */
         return 0;
     }
@@ -1229,7 +1229,7 @@ ngx_quic_frame_sendto(ngx_connection_t *c, ngx_quic_frame_t *frame,
     ngx_quic_init_packet(c, ctx, qc->socket, &pkt);
 
     /* account for anti-amplification limit: expand to allowed size */
-    if (path->state != NGX_QUIC_PATH_VALIDATED) {
+    if (path->limited) {
         max = path->received * 3;
         max = (path->sent >= max) ? 0 : max - path->sent;
         if ((off_t) min > max) {
index 2b9b0fed3b71c870502258ad52a3e02cd7d7dec1..a04ad620230132d6b48dee51acc5685a69462d6d 100644 (file)
@@ -82,6 +82,7 @@ ngx_quic_open_sockets(ngx_connection_t *c, ngx_quic_connection_t *qc,
 
     if (pkt->validated) {
         path->state = NGX_QUIC_PATH_VALIDATED;
+        path->limited = 0;
     }
 
     /* now bind socket to client and path */