commit d673d2a47124bbf7f250cb86f6e1b5aafd76b6dd
parent e0b9d3d67032ec26a9ac82dc84dba9e924761de5
Author: Max Leonard Inden <mail@max-inden.de>
Date: Wed, 12 Nov 2025 09:36:04 +0000
Bug 1909910 - enable QUIC PMTUD r=necko-reviewers,kershaw
Differential Revision: https://phabricator.services.mozilla.com/D223575
Diffstat:
3 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
@@ -15422,6 +15422,13 @@
value: 30
mirror: always
+# Whether to enable Packetization Layer Path MTU Discovery.
+- name: network.http.http3.pmtud
+ type: RelaxedAtomicBool
+ value: true
+ mirror: always
+ rust: true
+
# When true, a http request will be upgraded to https when HTTPS RR is
# available.
- name: network.dns.upgrade_with_https_rr
diff --git a/netwerk/socket/neqo_glue/src/lib.rs b/netwerk/socket/neqo_glue/src/lib.rs
@@ -423,6 +423,8 @@ impl NeqoHttp3Conn {
let pmtud_enabled =
// Check if PMTUD is explicitly enabled,
pmtud_enabled
+ // or enabled via pref,
+ || static_prefs::pref!("network.http.http3.pmtud")
// but disable PMTUD if NSPR is used (socket == None) or
// transmitted UDP datagrams might get fragmented by the IP layer.
&& socket.as_ref().map_or(false, |s| !s.may_fragment());
diff --git a/testing/web-platform/tests/webtransport/datagrams.https.any.js b/testing/web-platform/tests/webtransport/datagrams.https.any.js
@@ -199,13 +199,25 @@ promise_test(async t => {
const writer = wt.datagrams.writable.getWriter();
const reader = wt.datagrams.readable.getReader();
- // Write and read max-size datagram.
- await writer.write(new Uint8Array(wt.datagrams.maxDatagramSize+1));
- // This should resolve with no datagram sent, which is hard to test for.
- // Wait for incoming datagrams to arrive, and if they do, fail.
- const result = await Promise.race([reader.read(), wait(500)]);
- assert_equals(result, undefined);
-}, 'Fail to transfer max-size+1 datagram');
+ let maxDatagramSize = wt.datagrams.maxDatagramSize;
+
+ while (true) {
+ // Write and read max-size datagram.
+ await writer.write(new Uint8Array(maxDatagramSize + 1));
+ // This should resolve with no datagram sent, which is hard to test for.
+ // Wait for incoming datagrams to arrive, and if they do, fail.
+ const result = await Promise.race([reader.read(), wait(500)]);
+ if (result === undefined) {
+ return; // Success, no datagram received, exit the test early.
+ }
+
+ // Maybe QUIC's PMTUD increased the max-size datagram in the meantime. If
+ // so, try again.
+ const currentMaxDatagramSize = wt.datagrams.maxDatagramSize;
+ assert_greater_than(currentMaxDatagramSize, maxDatagramSize);
+ maxDatagramSize = currentMaxDatagramSize;
+ }
+}, 'Fail to transfer max-size+1 datagram, handle PMTUD increases');
promise_test(async t => {
// Make a WebTransport connection, but session is not necessarily established.