hotfix(pmtud/tcp): fix timeout apply per network call, not globally

This commit is contained in:
Quentin McGaw
2026-02-19 17:02:14 +00:00
parent 56b9e108be
commit 1c43a045d1
+8 -8
View File
@@ -59,17 +59,17 @@ func PathMTUDiscover(ctx context.Context, dsts []netip.AddrPort,
} }
mssResultCh := make(chan mssResult) mssResultCh := make(chan mssResult)
ctx, cancel := context.WithTimeout(ctx, tryTimeout) mssCtx, mssCancel := context.WithTimeout(ctx, tryTimeout)
defer cancel() defer mssCancel()
go func() { go func() {
dst, mss, err := findHighestMSSDestination(ctx, fd, dsts, excludeMark, dst, mss, err := findHighestMSSDestination(mssCtx, fd, dsts, excludeMark,
maxPossibleMTU, tryTimeout, tracker, firewall, logger) maxPossibleMTU, tryTimeout, tracker, firewall, logger)
mssResultCh <- mssResult{dst: dst, mss: mss, err: err} mssResultCh <- mssResult{dst: dst, mss: mss, err: err}
}() }()
var highestMSSDst netip.AddrPort var highestMSSDst netip.AddrPort
select { select {
case err = <-trackerErrCh: case err = <-trackerErrCh:
cancel() mssCancel()
<-mssResultCh <-mssResultCh
return 0, fmt.Errorf("listening for TCP replies: %w", err) return 0, fmt.Errorf("listening for TCP replies: %w", err)
case result := <-mssResultCh: case result := <-mssResultCh:
@@ -88,17 +88,17 @@ func PathMTUDiscover(ctx context.Context, dsts []netip.AddrPort,
err error err error
} }
resultCh := make(chan pmtudResult) resultCh := make(chan pmtudResult)
ctx, cancel = context.WithCancel(ctx) pmtudCtx, pmtudCancel := context.WithCancel(ctx)
defer cancel() defer pmtudCancel()
go func() { go func() {
mtu, err := pathMTUDiscover(ctx, fd, highestMSSDst, minMTU, maxPossibleMTU, mtu, err := pathMTUDiscover(pmtudCtx, fd, highestMSSDst, minMTU, maxPossibleMTU,
excludeMark, tryTimeout, tracker, firewall, logger) excludeMark, tryTimeout, tracker, firewall, logger)
resultCh <- pmtudResult{mtu: mtu, err: err} resultCh <- pmtudResult{mtu: mtu, err: err}
}() }()
select { select {
case err = <-trackerErrCh: case err = <-trackerErrCh:
cancel() pmtudCancel()
<-resultCh <-resultCh
return 0, fmt.Errorf("listening for TCP replies: %w", err) return 0, fmt.Errorf("listening for TCP replies: %w", err)
case result := <-resultCh: case result := <-resultCh: