Skip to content

Commit

Permalink
Enable netstack save/restore in cloud/gvisor by default.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 712978128
  • Loading branch information
nybidari authored and gvisor-bot committed Jan 7, 2025
1 parent bf9d60d commit cd31d05
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 29 deletions.
13 changes: 10 additions & 3 deletions pkg/tcpip/stack/stack.go
Original file line number Diff line number Diff line change
Expand Up @@ -1966,6 +1966,14 @@ func (s *Stack) Pause() {
}
}

func (s *Stack) getNICs() map[tcpip.NICID]*nic {
s.mu.RLock()
defer s.mu.RUnlock()

nics := s.nics
return nics
}

// ReplaceConfig replaces config in the loaded stack.
func (s *Stack) ReplaceConfig(st *Stack) {
if st == nil {
Expand All @@ -1976,12 +1984,11 @@ func (s *Stack) ReplaceConfig(st *Stack) {
s.SetRouteTable(st.GetRouteTable())

// Update NICs.
st.mu.Lock()
defer st.mu.Unlock()
nics := st.getNICs()
s.mu.Lock()
defer s.mu.Unlock()
s.nics = make(map[tcpip.NICID]*nic)
for id, nic := range st.nics {
for id, nic := range nics {
nic.stack = s
s.nics[id] = nic
_ = s.NextNICID()
Expand Down
3 changes: 0 additions & 3 deletions test/syscalls/linux/partial_bad_buffer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -321,9 +321,6 @@ PosixErrorOr<sockaddr_storage> InetLoopbackAddr(int family) {
// pages one valid and one guard page succeeds as long as the write is
// for exactly the size of 1 page.
TEST_F(PartialBadBufferTest, SendMsgTCP) {
// FIXME(b/171436815): Netstack save/restore is broken.
const DisableSave ds;

auto listen_socket =
ASSERT_NO_ERRNO_AND_VALUE(Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP));

Expand Down
41 changes: 18 additions & 23 deletions test/syscalls/linux/tcp_socket.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

#include <fcntl.h>

#include <memory>

#ifdef __linux__
#include <linux/filter.h>
#include <sys/epoll.h>
Expand Down Expand Up @@ -1317,23 +1319,22 @@ TEST_P(SimpleTcpSocketTest, ListenConnectParallel) {
std::vector<std::unique_ptr<ScopedThread>> threads;
threads.reserve(num_threads);
for (int i = 0; i < num_threads; i++) {
threads.push_back(
std::make_unique<ScopedThread>([&addr, &addrlen, family]() {
const FileDescriptor c = ASSERT_NO_ERRNO_AND_VALUE(
Socket(family, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP));

// Now connect to the bound address and this should fail as nothing
// is listening on the bound address.
EXPECT_THAT(RetryEINTR(connect)(c.get(), AsSockAddr(&addr), addrlen),
SyscallFailsWithErrno(EINPROGRESS));
// Wait for the connect to fail or succeed as it can race with the
// socket listening.
struct pollfd poll_fd = {c.get(), POLLERR | POLLOUT, 0};
const int timeout =
GvisorPlatform() == Platform::kFuchsia ? -1 : 1000;
EXPECT_THAT(RetryEINTR(poll)(&poll_fd, 1, timeout),
SyscallSucceedsWithValue(1));
}));
threads.push_back(std::make_unique<ScopedThread>([&addr, &addrlen,
family]() {
const FileDescriptor c = ASSERT_NO_ERRNO_AND_VALUE(
Socket(family, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP));

// Now connect to the bound address and this should fail as nothing
// is listening on the bound address.
EXPECT_THAT(RetryEINTR(connect)(c.get(), AsSockAddr(&addr), addrlen),
SyscallFailsWithErrno(EINPROGRESS));
// Wait for the connect to fail or succeed as it can race with the
// socket listening.
struct pollfd poll_fd = {c.get(), POLLERR | POLLOUT, 0};
const int timeout = GvisorPlatform() == Platform::kFuchsia ? -1 : 1000;
EXPECT_THAT(RetryEINTR(poll)(&poll_fd, 1, timeout),
SyscallSucceedsWithValue(1));
}));
}
}

Expand Down Expand Up @@ -2458,24 +2459,18 @@ void ShutdownConnectingSocket(int domain, int shutdown_mode) {
}

TEST_P(SimpleTcpSocketTest, ShutdownReadConnectingSocket) {
// TODO(b/171436815): Re-enable when S/R is fixed.
const DisableSave disable_save;
// TODO(b/175409607): Fix this test for hostinet.
SKIP_IF(IsRunningWithHostinet());
ShutdownConnectingSocket(GetParam(), SHUT_RD);
}

TEST_P(SimpleTcpSocketTest, ShutdownWriteConnectingSocket) {
// TODO(b/171436815): Re-enable when S/R is fixed.
const DisableSave disable_save;
// TODO(b/175409607): Fix this test for hostinet.
SKIP_IF(IsRunningWithHostinet());
ShutdownConnectingSocket(GetParam(), SHUT_WR);
}

TEST_P(SimpleTcpSocketTest, ShutdownReadWriteConnectingSocket) {
// TODO(b/171436815): Re-enable when S/R is fixed.
const DisableSave disable_save;
// TODO(b/175409607): Fix this test for hostinet.
SKIP_IF(IsRunningWithHostinet());
ShutdownConnectingSocket(GetParam(), SHUT_RDWR);
Expand Down

0 comments on commit cd31d05

Please sign in to comment.