{"id":20614362,"url":"https://github.com/devincarr/pmtu-failure-quic-go-repro","last_synced_at":"2025-10-24T23:44:20.021Z","repository":{"id":185250424,"uuid":"666167257","full_name":"DevinCarr/pmtu-failure-quic-go-repro","owner":"DevinCarr","description":null,"archived":false,"fork":false,"pushed_at":"2023-07-13T22:18:02.000Z","size":6,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-17T04:12:36.618Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DevinCarr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-07-13T21:50:47.000Z","updated_at":"2023-07-13T22:18:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"8c522c00-3050-4ea2-9d65-80cbc08abaa3","html_url":"https://github.com/DevinCarr/pmtu-failure-quic-go-repro","commit_stats":null,"previous_names":["devincarr/pmtu-failure-quic-go-repro"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevinCarr%2Fpmtu-failure-quic-go-repro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevinCarr%2Fpmtu-failure-quic-go-repro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevinCarr%2Fpmtu-failure-quic-go-repro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevinCarr%2Fpmtu-failure-quic-go-repro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DevinCarr","download_url":"https://codeload.github.com/DevinCarr/pmtu-failure-quic-go-repro/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242268904,"owners_count":20100069,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-16T11:12:32.000Z","updated_at":"2025-10-24T23:44:14.988Z","avatar_url":"https://github.com/DevinCarr.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"This repo tests a failure case that happens when the PMTU is reduced during an active connection in quic-go.\n\nThe quic-go library does use an MTU discovery process after the handshake is completed between the client and the\nserver. You can see this code here: https://github.com/quic-go/quic-go/blob/master/mtu_discoverer.go. This code does\nnot handle the case that the PMTU is lowered below the \"current\" byte size. So if you have a long-lived connection\nbetween a server and a client that is sending ping frames but no other payloads, a PMTU reduction will not cause any\nissues until either side attempts to send a payload that would normally fill the QUIC packet size. Afterwhich, a payload\nthat would exceed the currently calculated PMTU will be dropped by along the path where the reduction occurred.\n\nNormal operation to trigger the failure can be done as followed:\n 0. Set the `addr` to two IPs that can be reached between two separate machines for both `client.go` and `server/server.go`.\n\n    This needs to be done between two machines as I believe there is some WriteTo/ReadFrom's that will not\n    reproduce the problem; there needs to be a PMTU that can be adjusted.\n    A network interface shared between both the client and the server will use a 65K MTU. Similarly, this will not work \n    if you attempt to create a dummy link as the kernel will again just pipe between the two processes instead of assigning \n    to the network interface the adjusted MTU.\n    Addtionally, this cannot be done on localhost as the kernel treats it differently than a network interface and \n    typically has a 65536 MTU that should (loose guideline) not be adjusted; in either case, localhost doesn't exhibit\n    this problem.\n\n 1. Start echo server (`go run server/server.go`)\n\n 2. Start the client (`go run client.go`)\n\n 3. Hit enter on the client process to send the first payload normally\n\n 4. Adjust MTU on interface link that is used: `sudo ip link dev \u003cdev\u003e set mtu 1350`\n\n    If between two machines, either side should work, but I did my testing by adjusting the client's network link MTU.\n    1439 is the typical value reached on my machine during the PMTU discovery process, your machine may vary. The\n    goal is to adjust the MTU to be at least one byte less than the current PMTU set by quic-go; 1350 worked reliably for\n    my testing.\n\n 5. Hit enter on the client process again to see the payload fail to send and timeout.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevincarr%2Fpmtu-failure-quic-go-repro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevincarr%2Fpmtu-failure-quic-go-repro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevincarr%2Fpmtu-failure-quic-go-repro/lists"}