diff --git a/pkg/rawfile/rawfile_unsafe.go b/pkg/rawfile/rawfile_unsafe.go index 9443c19ab..4ec671ae4 100644 --- a/pkg/rawfile/rawfile_unsafe.go +++ b/pkg/rawfile/rawfile_unsafe.go @@ -69,8 +69,6 @@ func AppendIovecFromBytes(iovs []unix.Iovec, bs []byte, max int) []unix.Iovec { } // MMsgHdr represents the mmsg_hdr structure required by recvmmsg() on linux. -// -// +stateify savable type MMsgHdr struct { Msg unix.Msghdr Len uint32 diff --git a/pkg/tcpip/link/fdbased/BUILD b/pkg/tcpip/link/fdbased/BUILD index 2f8b0d998..f61365fce 100644 --- a/pkg/tcpip/link/fdbased/BUILD +++ b/pkg/tcpip/link/fdbased/BUILD @@ -15,6 +15,7 @@ go_library( "mmap_unsafe.go", "packet_dispatchers.go", "processors.go", + "save_restore.go", ], visibility = ["//visibility:public"], deps = [ diff --git a/pkg/tcpip/link/fdbased/packet_dispatchers.go b/pkg/tcpip/link/fdbased/packet_dispatchers.go index e324090a7..d11811ab7 100644 --- a/pkg/tcpip/link/fdbased/packet_dispatchers.go +++ b/pkg/tcpip/link/fdbased/packet_dispatchers.go @@ -227,7 +227,7 @@ type recvMMsgDispatcher struct { // reference an array of iovecs in the iovecs field defined above. This // array is passed as the parameter to recvmmsg call to retrieve // potentially more than 1 packet per unix. - msgHdrs []rawfile.MMsgHdr + msgHdrs []rawfile.MMsgHdr `state:"nosave"` // pkts is reused to avoid allocations. pkts stack.PacketBufferList diff --git a/pkg/tcpip/link/fdbased/save_restore.go b/pkg/tcpip/link/fdbased/save_restore.go new file mode 100644 index 000000000..cd1669760 --- /dev/null +++ b/pkg/tcpip/link/fdbased/save_restore.go @@ -0,0 +1,26 @@ +// Copyright 2024 The gVisor Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package fdbased + +import ( + "context" + + "gvisor.dev/gvisor/pkg/rawfile" +) + +// afterLoad is invoked by stateify. +func (r *recvMMsgDispatcher) afterLoad(context.Context) { + r.msgHdrs = make([]rawfile.MMsgHdr, MaxMsgsPerRecv) +}