tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mmodules/libpref/init/StaticPrefList.yaml | 7+++++++
Mnetwerk/socket/neqo_glue/src/lib.rs | 2++
Mtesting/web-platform/tests/webtransport/datagrams.https.any.js | 26+++++++++++++++++++-------
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.