Skip to content

fix: handle network changes in multipath#383

Merged
divagant-martian merged 30 commits intomainfrom
handle-network-changes
Feb 10, 2026
Merged

fix: handle network changes in multipath#383
divagant-martian merged 30 commits intomainfrom
handle-network-changes

Conversation

@divagant-martian
Copy link
Copy Markdown
Collaborator

@divagant-martian divagant-martian commented Jan 29, 2026

Description

Adds proto an quinn level apis for dealing with netwokr changes.

Adds Connection::handle_network_change(hint, now) to let applications signal
that the underlying network has changed.

Behavior:

  • Non-multipath: Rotates the remote CID and pings for liveness (RFC9000
    migration) This might require more love but RFC9000 migrations are out of
    scope for this PR
  • Multipath, client-side: Classifies each path as recoverable or
    non-recoverable. In multipath the standard behaviour is to consider paths non
    recoverable and move then to new PathIds. The optional NetworkChangeHint
    gives special treatment to paths that survive the network change so that
    these retain the RFC9000 migration behaviour.
  • Multipath, server-side: Always attempts recovery (servers have stable
    addresses in theory and should not migrate).
  • During handshake: Just updates the remote CID and pings.
  • All cases: local ip of the path is cleared. We need to figure it out from
    scratch.

Public API:

  • Adds NetworkChangeHint
  • Connection::handle_network_change at proto level is added.
  • Endpoint::handle_network_change is added in quinn. This just broadcasts to
    all connections using the above.

Also includes:

  • Bugfix: don't emit PathOpened events for non-multipath connections. This has
    some pending discussions but seemed the best choice right now.
  • Tests for single-path recovery, multipath replacement, selective hints.

Breaking Changes

in proto::Connection local_address_changed is gone, and it's replaced with
handle_network_change.

Notes & open questions

n/a

@divagant-martian divagant-martian added the multipath QUIC Multipath extension label Jan 29, 2026
@divagant-martian divagant-martian self-assigned this Jan 29, 2026
@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 29, 2026

Performance Comparison Report

cdeb5e79319d77850ef0a9db2cc8d1fc894dae87 - artifacts

No results available

---
f14566eb40cbf7fde8a26bc4f40b73f7cd924bf6 - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5303.4 Mbps 7897.0 Mbps -32.8% 92.6% / 97.5%
medium-concurrent 5546.9 Mbps 7903.1 Mbps -29.8% 96.9% / 122.0%
medium-single 4040.9 Mbps 4476.5 Mbps -9.7% 94.8% / 122.0%
small-concurrent 3637.2 Mbps 5182.3 Mbps -29.8% 92.6% / 100.0%
small-single 3494.8 Mbps 4690.7 Mbps -25.5% 95.4% / 126.0%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 2911.9 Mbps 3643.4 Mbps -20.1%
lan 768.9 Mbps 796.4 Mbps -3.4%
lossy 69.8 Mbps 69.8 Mbps ~0%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 25.6% slower on average

---
21c45f304150b4893695759731af69bbb9608a07 - artifacts

No results available

---
284690ed7799ab3c9c5defe17d4d9caf810475c8 - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5338.1 Mbps 7713.4 Mbps -30.8% 91.9% / 97.2%
medium-concurrent 5255.7 Mbps 7606.4 Mbps -30.9% 92.9% / 97.6%
medium-single 4071.3 Mbps 4189.9 Mbps -2.8% 95.6% / 112.0%
small-concurrent 3681.2 Mbps 5120.1 Mbps -28.1% 97.5% / 116.0%
small-single 3341.3 Mbps 4408.4 Mbps -24.2% 91.4% / 99.0%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 2992.8 Mbps 3687.6 Mbps -18.8%
lan 782.4 Mbps 796.4 Mbps -1.8%
lossy 69.8 Mbps 55.9 Mbps +24.9%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 23.9% slower on average

---
2a4ec09a13dee967107f307fea859c547fee5b4f - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5291.7 Mbps 7835.9 Mbps -32.5% 93.7% / 98.3%
medium-concurrent 5386.5 Mbps 7661.3 Mbps -29.7% 98.3% / 177.0%
medium-single 3813.7 Mbps 4100.7 Mbps -7.0% 87.1% / 96.5%
small-concurrent 3791.6 Mbps 5061.0 Mbps -25.1% 96.3% / 128.0%
small-single 3475.0 Mbps 4377.8 Mbps -20.6% 96.9% / 126.0%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 2835.6 Mbps 3939.1 Mbps -28.0%
lan 768.4 Mbps 801.7 Mbps -4.2%
lossy 69.8 Mbps 55.9 Mbps +25.0%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 24.8% slower on average

---
dd78fc69458144461b072070ed8ef5f1f47019b1 - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5309.8 Mbps 8012.5 Mbps -33.7% 90.3% / 97.0%
medium-concurrent 5346.0 Mbps 7665.7 Mbps -30.3% 99.0% / 189.0%
medium-single 3548.0 Mbps 4748.6 Mbps -25.3% 85.7% / 95.6%
small-concurrent 3736.5 Mbps 5392.5 Mbps -30.7% 88.0% / 97.8%
small-single 3363.4 Mbps 4733.5 Mbps -28.9% 97.1% / 133.0%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 3006.7 Mbps N/A N/A
lan 782.4 Mbps N/A N/A
lossy 69.8 Mbps N/A N/A
wan 83.8 Mbps N/A N/A

Summary

iroh-quinn is 30.3% slower on average

---
1a4f55324b3e2da13c940ff5ca01f0dbf3227258 - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5345.3 Mbps 7940.6 Mbps -32.7% 97.1% / 149.0%
medium-concurrent 5428.9 Mbps 7919.1 Mbps -31.4% 96.5% / 149.0%
medium-single 4261.3 Mbps 4749.7 Mbps -10.3% 91.9% / 101.0%
small-concurrent 3872.7 Mbps 4920.5 Mbps -21.3% 95.1% / 103.0%
small-single 3516.8 Mbps 4799.7 Mbps -26.7% 97.6% / 153.0%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal N/A 3701.8 Mbps N/A
lan N/A 796.5 Mbps N/A
lossy N/A 58.8 Mbps N/A
wan N/A 83.8 Mbps N/A

Summary

iroh-quinn is 26.1% slower on average

---
1e9e567583f5e924185ab6a0d67174147636f197 - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5385.5 Mbps 7732.1 Mbps -30.3% 96.3% / 98.2%
medium-concurrent 5134.5 Mbps 7460.9 Mbps -31.2% 95.0% / 97.0%
medium-single 4089.1 Mbps 4072.2 Mbps ~0% 96.2% / 98.4%
small-concurrent 3585.0 Mbps 5098.4 Mbps -29.7% 94.9% / 97.3%
small-single 3453.1 Mbps 4431.5 Mbps -22.1% 96.9% / 98.7%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 2835.5 Mbps 4057.9 Mbps -30.1%
lan 782.5 Mbps 810.4 Mbps -3.4%
lossy 69.9 Mbps 69.9 Mbps ~0%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 24.8% slower on average

---
218441309342d61fa655f0c6929ced7804e317d1 - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5440.6 Mbps 7898.7 Mbps -31.1% 95.7% / 101.0%
medium-concurrent 5424.5 Mbps 7890.6 Mbps -31.3% 94.7% / 101.0%
medium-single 4086.1 Mbps 4742.2 Mbps -13.8% 99.1% / 153.0%
small-concurrent 3668.4 Mbps 5246.6 Mbps -30.1% 90.8% / 98.8%
small-single 3564.5 Mbps 4797.3 Mbps -25.7% 95.2% / 104.0%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 2835.3 Mbps 3882.9 Mbps -27.0%
lan 772.2 Mbps 796.4 Mbps -3.0%
lossy 69.9 Mbps 55.9 Mbps +25.0%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 26.7% slower on average

---
adb3c993738d022cb12ecf667fbfb539dc619aa3 - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5601.9 Mbps 7652.7 Mbps -26.8% 96.8% / 98.5%
medium-concurrent 5343.5 Mbps 7874.9 Mbps -32.1% 95.6% / 97.6%
medium-single 3833.8 Mbps 4652.4 Mbps -17.6% 95.2% / 97.7%
small-concurrent 3592.7 Mbps 5236.1 Mbps -31.4% 95.2% / 99.3%
small-single 3536.2 Mbps 4779.8 Mbps -26.0% 95.5% / 97.9%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 3042.7 Mbps 3701.5 Mbps -17.8%
lan 782.4 Mbps 796.4 Mbps -1.8%
lossy 69.9 Mbps 63.5 Mbps +9.9%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 25.7% slower on average

---
c456958584d19f87849daca43d719131f6fcfebe - artifacts

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal N/A 3687.7 Mbps N/A
---
e84b1821ea761aa5cd9153b28c075a4a77d0f45e - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5911.2 Mbps 8028.6 Mbps -26.4% 96.4% / 98.2%
medium-concurrent 5669.7 Mbps 7669.1 Mbps -26.1% 96.3% / 98.0%
medium-single 4228.0 Mbps 4623.5 Mbps -8.6% 96.4% / 98.1%
small-concurrent 3681.1 Mbps 5097.3 Mbps -27.8% 96.0% / 100.0%
small-single 3581.8 Mbps 4669.5 Mbps -23.3% 96.9% / 99.3%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 2779.1 Mbps 4136.3 Mbps -32.8%
lan 774.8 Mbps 810.4 Mbps -4.4%
lossy 69.8 Mbps 55.9 Mbps +25.0%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 23.9% slower on average

---
eb650b604b67d2492e015799d58ba16b3eb44d39 - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 6000.0 Mbps 7897.6 Mbps -24.0% 97.4% / 98.7%
medium-concurrent 5540.2 Mbps 7969.0 Mbps -30.5% 95.3% / 97.2%
medium-single 4024.2 Mbps 4712.3 Mbps -14.6% 95.8% / 98.2%
small-concurrent 3647.1 Mbps 5168.7 Mbps -29.4% 95.1% / 97.6%
small-single 3547.3 Mbps 4693.2 Mbps -24.4% 96.0% / 98.4%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 2849.0 Mbps 4104.7 Mbps -30.6%
lan 771.3 Mbps 810.3 Mbps -4.8%
lossy 69.9 Mbps 69.8 Mbps ~0%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 25.3% slower on average

---
4be21998c085b16dec8ec9fd5830bd0cda45e9a0 - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5571.6 Mbps 7873.6 Mbps -29.2% 96.0% / 150.0%
medium-concurrent 5516.2 Mbps 7864.8 Mbps -29.9% 96.3% / 151.0%
medium-single 4124.2 Mbps 4749.0 Mbps -13.2% 90.8% / 100.0%
small-concurrent 3778.8 Mbps 5026.7 Mbps -24.8% 95.3% / 104.0%
small-single 3494.0 Mbps 4760.8 Mbps -26.6% 97.9% / 154.0%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 2898.5 Mbps 4078.6 Mbps -28.9%
lan 772.2 Mbps 810.3 Mbps -4.7%
lossy 69.9 Mbps 55.9 Mbps +25.1%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 25.5% slower on average

---
424fc3668bf4865ef8d6b439dff43eac2e04212d - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5481.2 Mbps 7795.3 Mbps -29.7% 96.1% / 104.0%
medium-concurrent 5334.3 Mbps 7139.6 Mbps -25.3% 95.7% / 104.0%
medium-single 4149.2 Mbps 4155.5 Mbps ~0% 98.9% / 155.0%
small-concurrent 3842.4 Mbps 5028.5 Mbps -23.6% 92.9% / 107.0%
small-single 3475.4 Mbps 4358.4 Mbps -20.3% 95.7% / 105.0%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal N/A 4080.5 Mbps N/A
lan N/A 810.3 Mbps N/A
lossy N/A 55.9 Mbps N/A
wan N/A 83.8 Mbps N/A

Summary

iroh-quinn is 21.8% slower on average

---
4c4996d46e85b24c4b94439021785bf1bf09191a - artifacts

Raw Benchmarks (localhost)

Scenario iroh-quinn upstream Delta CPU (avg/max)
large-single 5583.5 Mbps 7786.0 Mbps -28.3% 96.8% / 98.3%
medium-concurrent 5479.7 Mbps 7888.2 Mbps -30.5% 95.2% / 97.0%
medium-single 4346.6 Mbps 4602.9 Mbps -5.6% 96.8% / 99.2%
small-concurrent 3634.1 Mbps 5164.7 Mbps -29.6% 96.1% / 98.7%
small-single 3477.6 Mbps 4707.4 Mbps -26.1% 98.5% / 100.0%

Netsim Benchmarks (network simulation)

Condition iroh-quinn upstream Delta
ideal 2855.5 Mbps 3705.1 Mbps -22.9%
lan 782.4 Mbps 796.5 Mbps -1.8%
lossy 69.8 Mbps 55.9 Mbps +25.0%
wan 83.8 Mbps 83.8 Mbps ~0%

Summary

iroh-quinn is 24.4% slower on average

@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 29, 2026

Documentation for this PR has been generated and is available at: https://n0-computer.github.io/quinn/pr/383/docs/iroh_quinn/

Last updated: 2026-02-10T18:48:32Z

@n0bot n0bot bot added this to iroh Jan 29, 2026
@github-project-automation github-project-automation bot moved this to 🚑 Needs Triage in iroh Jan 29, 2026
@dignifiedquire dignifiedquire moved this from 🚑 Needs Triage to 🏗 In progress in iroh Jan 30, 2026
@dignifiedquire dignifiedquire added this to the quinn: iroh 0.97 milestone Jan 30, 2026
@divagant-martian divagant-martian linked an issue Feb 3, 2026 that may be closed by this pull request
@codecov-commenter
Copy link
Copy Markdown

codecov-commenter commented Feb 3, 2026

Codecov Report

❌ Patch coverage is 66.66667% with 31 lines in your changes missing coverage. Please review.
✅ Project coverage is 77.03%. Comparing base (d29726a) to head (4c4996d).

Files with missing lines Patch % Lines
quinn-proto/src/connection/mod.rs 76.92% 18 Missing ⚠️
quinn/src/endpoint.rs 0.00% 10 Missing ⚠️
quinn/src/connection.rs 40.00% 3 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #383      +/-   ##
==========================================
- Coverage   77.24%   77.03%   -0.22%     
==========================================
  Files          81       81              
  Lines       23142    23228      +86     
==========================================
+ Hits        17877    17893      +16     
- Misses       5265     5335      +70     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Copy Markdown
Collaborator

@flub flub left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know it's still in draft, but you said you were only really working on tests so I already had a look at the non-test code... hope that's helpful.

@divagant-martian divagant-martian marked this pull request as ready for review February 5, 2026 19:15
@divagant-martian divagant-martian requested a review from flub February 5, 2026 19:16
Copy link
Copy Markdown
Collaborator

@flub flub left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, I think this all makes sense. The wording of the comments is better now as well.

@divagant-martian divagant-martian added this pull request to the merge queue Feb 10, 2026
Merged via the queue into main with commit d5580a5 Feb 10, 2026
36 checks passed
@divagant-martian divagant-martian deleted the handle-network-changes branch February 10, 2026 19:15
@github-project-automation github-project-automation bot moved this from 🏗 In progress to ✅ Done in iroh Feb 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

multipath QUIC Multipath extension

Projects

Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

bug: deal with network changes in multipath

4 participants