cloudflare / cloudflare/quiche

quiche: Runtime-created paths do not inherit PMTUD configuration

Open
#2,572 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Rust
Stars
11.8k
Forks
1.1k
Avg merge
21h 9m
Merged PRs (30d)
6

Description

## Background

When `Config::discover_pmtu(true)` is enabled, the initial path receives a
`Pmtud` instance because it is created with `Some(config)`. Paths created after
the handshake do not: both the client `probe_path()` path and a server path
created for a newly observed 4-tuple call `Path::new(..., None)`.

As a result, a connection that migrates to a new local or peer address cannot
run PMTU discovery or `revalidate_pmtu()` on that replacement path. This is
independent from #2565, which concerns selecting the wrong existing path's
PMTUD state while sending.

## Goal

Make runtime-created client and server paths inherit the connection's effective
PMTUD enablement and probe-attempt configuration, while keeping PMTU probes off
an unvalidated path until QUIC path validation succeeds.

### Non-goals

- Do not change the PMTUD search algorithm.
- Do not change path selection or active-path switching.
- Do not duplicate the send-path state correction proposed in #2566.

## Code Changes Tree

```text
quiche/
└── src/
├── lib.rs # retain effective PMTUD settings and apply them to runtime-created paths
├── path.rs # defer PMTU probes until a path has completed validation
└── tests.rs # cover PMTUD inheritance on client- and server-created runtime paths
```

## Design

The connection retains the effective `discover_pmtu` and
`pmtud_max_probes` values, including values applied by the TLS configuration
callback. Each later client or server path receives a fresh path-scoped
`Pmtud` instance with those settings.

An unvalidated path still sends the normal bounded PATH_CHALLENGE/
PATH_RESPONSE traffic. PMTUD probing starts only after that path becomes
validated, so an oversized candidate probe cannot interfere with path
validation.

## Test And Acceptance Criteria

### Acceptance Criteria

- A client path created by `probe_path()` has PMTUD state when the connection
enables PMTUD.
- The corresponding server runtime path also has independent PMTUD state.
- A runtime path does not send a PMTU probe before validation.
- Existing initial-path PMTUD behavior is unchanged.

### Validation

- `cargo +nightly fmt --all -- --check`
- `cargo test -p quiche runtime_paths_inherit_pmtud_configuration --lib`

Contributor guide

Open the contributing guide

Research direction

Start in quiche/src/lib.rs to trace how effective discover_pmtu and pmtud_max_probes values are retained and how probe_path() and server runtime paths are created. Read quiche/src/path.rs for validation and PMTU probe behavior, then use quiche/src/tests.rs and run the specified nightly fmt check and runtime_paths_inherit_pmtud_configuration test. Done means both runtime path types inherit independent PMTUD state, probes wait for validation, and initial-path behavior remains unchanged.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
networking
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.