mirror of
https://github.com/qdm12/gluetun.git
synced 2026-05-07 04:20:12 +02:00
hotfix(pmtud): increase TCP margin from 150 to 300 compared to ICMP found MTU
This commit is contained in:
@@ -13,7 +13,7 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/pmtud/tcp"
|
"github.com/qdm12/gluetun/internal/pmtud/tcp"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrPMTUDFailICMPAndTCP = errors.New("PMTUD failed with both ICMP and TCP")
|
var ErrPMTUDFailICMPAndTCP = errors.New("PMTUD succeeded with ICMP but failed with TCP")
|
||||||
|
|
||||||
// PathMTUDiscover discovers the maximum MTU using both ICMP and TCP.
|
// PathMTUDiscover discovers the maximum MTU using both ICMP and TCP.
|
||||||
// Multiple ICMP addresses and TCP addresses can be specified for redundancy.
|
// Multiple ICMP addresses and TCP addresses can be specified for redundancy.
|
||||||
@@ -66,7 +66,7 @@ func PathMTUDiscover(ctx context.Context, icmpAddrs []netip.Addr, tcpAddrs []net
|
|||||||
minMTU = constants.MinIPv6MTU
|
minMTU = constants.MinIPv6MTU
|
||||||
}
|
}
|
||||||
if icmpSuccess {
|
if icmpSuccess {
|
||||||
const mtuMargin = 150
|
const mtuMargin = 300
|
||||||
minMTU = max(maxPossibleMTU-mtuMargin, minMTU)
|
minMTU = max(maxPossibleMTU-mtuMargin, minMTU)
|
||||||
}
|
}
|
||||||
mtu, err = tcp.PathMTUDiscover(ctx, tcpAddrs, minMTU, maxPossibleMTU, tryTimeout, fw, logger)
|
mtu, err = tcp.PathMTUDiscover(ctx, tcpAddrs, minMTU, maxPossibleMTU, tryTimeout, fw, logger)
|
||||||
@@ -77,7 +77,8 @@ func PathMTUDiscover(ctx context.Context, icmpAddrs []netip.Addr, tcpAddrs []net
|
|||||||
return maxPossibleMTU, nil // only rely on ICMP PMTUD results
|
return maxPossibleMTU, nil // only rely on ICMP PMTUD results
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0, fmt.Errorf("%w", ErrPMTUDFailICMPAndTCP)
|
return 0, fmt.Errorf("%w - ignoring ICMP obtained MTU %d",
|
||||||
|
ErrPMTUDFailICMPAndTCP, maxPossibleMTU)
|
||||||
}
|
}
|
||||||
logger.Debugf("TCP path MTU discovery found maximum valid MTU %d", mtu)
|
logger.Debugf("TCP path MTU discovery found maximum valid MTU %d", mtu)
|
||||||
return mtu, nil
|
return mtu, nil
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
package test
|
package test
|
||||||
|
|
||||||
import "math"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
// MakeMTUsToTest determines a slice of MTU values to test
|
// MakeMTUsToTest determines a slice of MTU values to test
|
||||||
// between minMTU and maxMTU inclusive. It creates an MTU
|
// between minMTU and maxMTU inclusive. It creates an MTU
|
||||||
@@ -17,7 +20,7 @@ func MakeMTUsToTest(minMTU, maxMTU uint32) (mtus []uint32) {
|
|||||||
diff := maxMTU - minMTU
|
diff := maxMTU - minMTU
|
||||||
switch {
|
switch {
|
||||||
case minMTU > maxMTU:
|
case minMTU > maxMTU:
|
||||||
panic("minMTU > maxMTU")
|
panic(fmt.Sprintf("minMTU %d is greater than maxMTU %d", minMTU, maxMTU))
|
||||||
case diff <= mtusLength:
|
case diff <= mtusLength:
|
||||||
mtus = make([]uint32, 0, diff)
|
mtus = make([]uint32, 0, diff)
|
||||||
for mtu := minMTU; mtu <= maxMTU; mtu++ {
|
for mtu := minMTU; mtu <= maxMTU; mtu++ {
|
||||||
|
|||||||
Reference in New Issue
Block a user