Skip to content

quiche: Runtime-created paths do not inherit PMTUD configuration #2572

Description

@idy

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

Code Changes Tree

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions