summaryrefslogtreecommitdiffhomepage
path: root/src/event/quic/ngx_event_quic_migration.c
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2023-11-29 10:58:21 +0400
committerRoman Arutyunyan <arut@nginx.com>2023-11-29 10:58:21 +0400
commitc1efb3a725c189dc0f011753561bf34ff650d773 (patch)
tree5e81c6bf0bc6ce798e7289fb4748cd333162861d /src/event/quic/ngx_event_quic_migration.c
parent209e8bc0c04f852605919ed766d25ee777f4b52b (diff)
downloadnginx-c1efb3a725c189dc0f011753561bf34ff650d773.tar.gz
nginx-c1efb3a725c189dc0f011753561bf34ff650d773.tar.bz2
QUIC: path revalidation after expansion failure.
As per RFC 9000, Section 8.2.1: When an endpoint is unable to expand the datagram size to 1200 bytes due to the anti-amplification limit, the path MTU will not be validated. To ensure that the path MTU is large enough, the endpoint MUST perform a second path validation by sending a PATH_CHALLENGE frame in a datagram of at least 1200 bytes.
Diffstat (limited to 'src/event/quic/ngx_event_quic_migration.c')
-rw-r--r--src/event/quic/ngx_event_quic_migration.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/event/quic/ngx_event_quic_migration.c b/src/event/quic/ngx_event_quic_migration.c
index 7819ae2f9..be8e0e304 100644
--- a/src/event/quic/ngx_event_quic_migration.c
+++ b/src/event/quic/ngx_event_quic_migration.c
@@ -169,6 +169,7 @@ valid:
path->mtu = prev->mtu;
path->max_mtu = prev->max_mtu;
+ path->mtu_unvalidated = 0;
}
}
@@ -182,6 +183,13 @@ valid:
qc->congestion.recovery_start = ngx_current_msec;
}
+ path->validated = 1;
+
+ if (path->mtu_unvalidated) {
+ path->mtu_unvalidated = 0;
+ return ngx_quic_validate_path(c, path);
+ }
+
/*
* RFC 9000, 9.3. Responding to Connection Migration
*
@@ -199,8 +207,6 @@ valid:
ngx_quic_path_dbg(c, "is validated", path);
- path->validated = 1;
-
ngx_quic_discover_path_mtu(c, path);
return NGX_OK;
@@ -578,7 +584,15 @@ ngx_quic_send_path_challenge(ngx_connection_t *c, ngx_quic_path_t *path)
* sending a datagram of this size.
*/
- min = (ngx_quic_path_limit(c, path, 1200) < 1200) ? 0 : 1200;
+ if (path->mtu_unvalidated
+ || ngx_quic_path_limit(c, path, 1200) < 1200)
+ {
+ min = 0;
+ path->mtu_unvalidated = 1;
+
+ } else {
+ min = 1200;
+ }
if (ngx_quic_frame_sendto(c, frame, min, path) == NGX_ERROR) {
return NGX_ERROR;