mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
tcp: change the limit of TCP_LINGER2
It was changed in the Linux kernel: commit f0628c524fd188c3f9418e12478dfdfadacba815 Date: Fri Apr 24 16:06:16 2020 +0800 net: Replace the limit of TCP_LINGER2 with TCP_FIN_TIMEOUT_MAX PiperOrigin-RevId: 325493859
This commit is contained in:
@@ -1777,15 +1777,8 @@ func (e *endpoint) SetSockOpt(opt interface{}) *tcpip.Error {
|
||||
// Same as effectively disabling TCPLinger timeout.
|
||||
v = 0
|
||||
}
|
||||
var stkTCPLingerTimeout tcpip.TCPLingerTimeoutOption
|
||||
if err := e.stack.TransportProtocolOption(header.TCPProtocolNumber, &stkTCPLingerTimeout); err != nil {
|
||||
// We were unable to retrieve a stack config, just use
|
||||
// the DefaultTCPLingerTimeout.
|
||||
if v > tcpip.TCPLingerTimeoutOption(DefaultTCPLingerTimeout) {
|
||||
stkTCPLingerTimeout = tcpip.TCPLingerTimeoutOption(DefaultTCPLingerTimeout)
|
||||
}
|
||||
}
|
||||
// Cap it to the stack wide TCPLinger timeout.
|
||||
// Cap it to MaxTCPLingerTimeout.
|
||||
stkTCPLingerTimeout := tcpip.TCPLingerTimeoutOption(MaxTCPLingerTimeout)
|
||||
if v > stkTCPLingerTimeout {
|
||||
v = stkTCPLingerTimeout
|
||||
}
|
||||
|
||||
@@ -62,6 +62,10 @@ const (
|
||||
// FIN_WAIT_2 state before being marked closed.
|
||||
DefaultTCPLingerTimeout = 60 * time.Second
|
||||
|
||||
// MaxTCPLingerTimeout is the maximum amount of time that sockets
|
||||
// linger in FIN_WAIT_2 state before being marked closed.
|
||||
MaxTCPLingerTimeout = 120 * time.Second
|
||||
|
||||
// DefaultTCPTimeWaitTimeout is the amount of time that sockets linger
|
||||
// in TIME_WAIT state before being marked closed.
|
||||
DefaultTCPTimeWaitTimeout = 60 * time.Second
|
||||
|
||||
@@ -6112,7 +6112,7 @@ func TestTCPLingerTimeout(t *testing.T) {
|
||||
{"InRangeLingerTimeout", 10 * time.Second, 10 * time.Second},
|
||||
// Values > stack's TCPLingerTimeout are capped to the stack's
|
||||
// value. Defaults to tcp.DefaultTCPLingerTimeout(60 seconds)
|
||||
{"AboveMaxLingerTimeout", 65 * time.Second, 60 * time.Second},
|
||||
{"AboveMaxLingerTimeout", 125 * time.Second, 120 * time.Second},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
|
||||
@@ -34,6 +34,9 @@
|
||||
namespace gvisor {
|
||||
namespace testing {
|
||||
|
||||
using ::testing::AnyOf;
|
||||
using ::testing::Eq;
|
||||
|
||||
TEST_P(TCPSocketPairTest, TcpInfoSucceeds) {
|
||||
auto sockets = ASSERT_NO_ERRNO_AND_VALUE(NewSocketPair());
|
||||
|
||||
@@ -800,6 +803,9 @@ TEST_P(TCPSocketPairTest, SetCongestionControlFailsForUnsupported) {
|
||||
|
||||
// Linux and Netstack both default to a 60s TCP_LINGER2 timeout.
|
||||
constexpr int kDefaultTCPLingerTimeout = 60;
|
||||
// On Linux, the maximum linger2 timeout was changed from 60sec to 120sec.
|
||||
constexpr int kMaxTCPLingerTimeout = 120;
|
||||
constexpr int kOldMaxTCPLingerTimeout = 60;
|
||||
|
||||
TEST_P(TCPSocketPairTest, TCPLingerTimeoutDefault) {
|
||||
auto sockets = ASSERT_NO_ERRNO_AND_VALUE(NewSocketPair());
|
||||
@@ -827,12 +833,12 @@ TEST_P(TCPSocketPairTest, SetTCPLingerTimeoutZeroOrLess) {
|
||||
SyscallSucceedsWithValue(0));
|
||||
}
|
||||
|
||||
TEST_P(TCPSocketPairTest, SetTCPLingerTimeoutAboveDefault) {
|
||||
TEST_P(TCPSocketPairTest, SetTCPLingerTimeoutAboveMax) {
|
||||
auto sockets = ASSERT_NO_ERRNO_AND_VALUE(NewSocketPair());
|
||||
|
||||
// Values above the net.ipv4.tcp_fin_timeout are capped to tcp_fin_timeout
|
||||
// on linux (defaults to 60 seconds on linux).
|
||||
constexpr int kAboveDefault = kDefaultTCPLingerTimeout + 1;
|
||||
constexpr int kAboveDefault = kMaxTCPLingerTimeout + 1;
|
||||
EXPECT_THAT(setsockopt(sockets->first_fd(), IPPROTO_TCP, TCP_LINGER2,
|
||||
&kAboveDefault, sizeof(kAboveDefault)),
|
||||
SyscallSucceedsWithValue(0));
|
||||
@@ -843,7 +849,12 @@ TEST_P(TCPSocketPairTest, SetTCPLingerTimeoutAboveDefault) {
|
||||
getsockopt(sockets->first_fd(), IPPROTO_TCP, TCP_LINGER2, &get, &get_len),
|
||||
SyscallSucceedsWithValue(0));
|
||||
EXPECT_EQ(get_len, sizeof(get));
|
||||
EXPECT_EQ(get, kDefaultTCPLingerTimeout);
|
||||
if (IsRunningOnGvisor()) {
|
||||
EXPECT_EQ(get, kMaxTCPLingerTimeout);
|
||||
} else {
|
||||
EXPECT_THAT(get,
|
||||
AnyOf(Eq(kMaxTCPLingerTimeout), Eq(kOldMaxTCPLingerTimeout)));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_P(TCPSocketPairTest, SetTCPLingerTimeout) {
|
||||
|
||||
Reference in New Issue
Block a user