mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
[syserror] Split usermem package
Split usermem package to help remove syserror dependency in go_marshal. New hostarch package contains code not dependent on syserror. PiperOrigin-RevId: 365651233
This commit is contained in:
committed by
gVisor bot
parent
b125afba41
commit
8a2f7e716d
@@ -21,6 +21,7 @@ go_library(
|
||||
"//pkg/abi/linux",
|
||||
"//pkg/binary",
|
||||
"//pkg/context",
|
||||
"//pkg/hostarch",
|
||||
"//pkg/log",
|
||||
"//pkg/marshal",
|
||||
"//pkg/marshal/primitive",
|
||||
|
||||
@@ -37,6 +37,7 @@ import (
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/binary"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/log"
|
||||
"gvisor.dev/gvisor/pkg/marshal"
|
||||
"gvisor.dev/gvisor/pkg/marshal/primitive"
|
||||
@@ -600,7 +601,7 @@ func (s *socketOpsCommon) Bind(t *kernel.Task, sockaddr []byte) *syserr.Error {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
family := usermem.ByteOrder.Uint16(sockaddr)
|
||||
family := hostarch.ByteOrder.Uint16(sockaddr)
|
||||
var addr tcpip.FullAddress
|
||||
|
||||
// Bind for AF_PACKET requires only family, protocol and ifindex.
|
||||
@@ -611,7 +612,7 @@ func (s *socketOpsCommon) Bind(t *kernel.Task, sockaddr []byte) *syserr.Error {
|
||||
if len(sockaddr) < sockAddrLinkSize {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
binary.Unmarshal(sockaddr[:sockAddrLinkSize], usermem.ByteOrder, &a)
|
||||
binary.Unmarshal(sockaddr[:sockAddrLinkSize], hostarch.ByteOrder, &a)
|
||||
|
||||
if a.Protocol != uint16(s.protocol) {
|
||||
return syserr.ErrInvalidArgument
|
||||
@@ -757,7 +758,7 @@ func (s *socketOpsCommon) Shutdown(t *kernel.Task, how int) *syserr.Error {
|
||||
|
||||
// GetSockOpt implements the linux syscall getsockopt(2) for sockets backed by
|
||||
// tcpip.Endpoint.
|
||||
func (s *SocketOperations) GetSockOpt(t *kernel.Task, level, name int, outPtr usermem.Addr, outLen int) (marshal.Marshallable, *syserr.Error) {
|
||||
func (s *SocketOperations) GetSockOpt(t *kernel.Task, level, name int, outPtr hostarch.Addr, outLen int) (marshal.Marshallable, *syserr.Error) {
|
||||
// TODO(b/78348848): Unlike other socket options, SO_TIMESTAMP is
|
||||
// implemented specifically for netstack.SocketOperations rather than
|
||||
// commonEndpoint. commonEndpoint should be extended to support socket
|
||||
@@ -793,7 +794,7 @@ func (s *SocketOperations) GetSockOpt(t *kernel.Task, level, name int, outPtr us
|
||||
|
||||
// GetSockOpt can be used to implement the linux syscall getsockopt(2) for
|
||||
// sockets backed by a commonEndpoint.
|
||||
func GetSockOpt(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, family int, skType linux.SockType, level, name int, outPtr usermem.Addr, outLen int) (marshal.Marshallable, *syserr.Error) {
|
||||
func GetSockOpt(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, family int, skType linux.SockType, level, name int, outPtr hostarch.Addr, outLen int) (marshal.Marshallable, *syserr.Error) {
|
||||
switch level {
|
||||
case linux.SOL_SOCKET:
|
||||
return getSockOptSocket(t, s, ep, family, skType, name, outLen)
|
||||
@@ -1244,7 +1245,7 @@ func getSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name,
|
||||
}
|
||||
|
||||
// getSockOptIPv6 implements GetSockOpt when level is SOL_IPV6.
|
||||
func getSockOptIPv6(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name int, outPtr usermem.Addr, outLen int) (marshal.Marshallable, *syserr.Error) {
|
||||
func getSockOptIPv6(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name int, outPtr hostarch.Addr, outLen int) (marshal.Marshallable, *syserr.Error) {
|
||||
if _, ok := ep.(tcpip.Endpoint); !ok {
|
||||
log.Warningf("SOL_IPV6 options not supported on endpoints other than tcpip.Endpoint: option = %d", name)
|
||||
return nil, syserr.ErrUnknownProtocolOption
|
||||
@@ -1392,7 +1393,7 @@ func getSockOptIPv6(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name
|
||||
}
|
||||
|
||||
// getSockOptIP implements GetSockOpt when level is SOL_IP.
|
||||
func getSockOptIP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name int, outPtr usermem.Addr, outLen int, family int) (marshal.Marshallable, *syserr.Error) {
|
||||
func getSockOptIP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name int, outPtr hostarch.Addr, outLen int, family int) (marshal.Marshallable, *syserr.Error) {
|
||||
if _, ok := ep.(tcpip.Endpoint); !ok {
|
||||
log.Warningf("SOL_IP options not supported on endpoints other than tcpip.Endpoint: option = %d", name)
|
||||
return nil, syserr.ErrUnknownProtocolOption
|
||||
@@ -1602,7 +1603,7 @@ func (s *SocketOperations) SetSockOpt(t *kernel.Task, level int, name int, optVa
|
||||
}
|
||||
s.readMu.Lock()
|
||||
defer s.readMu.Unlock()
|
||||
s.sockOptTimestamp = usermem.ByteOrder.Uint32(optVal) != 0
|
||||
s.sockOptTimestamp = hostarch.ByteOrder.Uint32(optVal) != 0
|
||||
return nil
|
||||
}
|
||||
if level == linux.SOL_TCP && name == linux.TCP_INQ {
|
||||
@@ -1611,7 +1612,7 @@ func (s *SocketOperations) SetSockOpt(t *kernel.Task, level int, name int, optVa
|
||||
}
|
||||
s.readMu.Lock()
|
||||
defer s.readMu.Unlock()
|
||||
s.sockOptInq = usermem.ByteOrder.Uint32(optVal) != 0
|
||||
s.sockOptInq = hostarch.ByteOrder.Uint32(optVal) != 0
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1659,7 +1660,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetSendBufferSize(int64(v), true)
|
||||
return nil
|
||||
|
||||
@@ -1668,7 +1669,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.ReceiveBufferSizeOption, int(v)))
|
||||
|
||||
case linux.SO_REUSEADDR:
|
||||
@@ -1676,7 +1677,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetReuseAddress(v != 0)
|
||||
return nil
|
||||
|
||||
@@ -1685,7 +1686,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetReusePort(v != 0)
|
||||
return nil
|
||||
|
||||
@@ -1714,7 +1715,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetBroadcast(v != 0)
|
||||
return nil
|
||||
|
||||
@@ -1723,7 +1724,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetPassCred(v != 0)
|
||||
return nil
|
||||
|
||||
@@ -1732,7 +1733,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetKeepAlive(v != 0)
|
||||
return nil
|
||||
|
||||
@@ -1742,7 +1743,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
}
|
||||
|
||||
var v linux.Timeval
|
||||
binary.Unmarshal(optVal[:linux.SizeOfTimeval], usermem.ByteOrder, &v)
|
||||
binary.Unmarshal(optVal[:linux.SizeOfTimeval], hostarch.ByteOrder, &v)
|
||||
if v.Usec < 0 || v.Usec >= int64(time.Second/time.Microsecond) {
|
||||
return syserr.ErrDomain
|
||||
}
|
||||
@@ -1755,7 +1756,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
}
|
||||
|
||||
var v linux.Timeval
|
||||
binary.Unmarshal(optVal[:linux.SizeOfTimeval], usermem.ByteOrder, &v)
|
||||
binary.Unmarshal(optVal[:linux.SizeOfTimeval], hostarch.ByteOrder, &v)
|
||||
if v.Usec < 0 || v.Usec >= int64(time.Second/time.Microsecond) {
|
||||
return syserr.ErrDomain
|
||||
}
|
||||
@@ -1767,7 +1768,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
|
||||
if v == 0 {
|
||||
socket.SetSockOptEmitUnimplementedEvent(t, name)
|
||||
@@ -1781,7 +1782,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetNoChecksum(v != 0)
|
||||
return nil
|
||||
|
||||
@@ -1791,7 +1792,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
}
|
||||
|
||||
var v linux.Linger
|
||||
binary.Unmarshal(optVal[:linux.SizeOfLinger], usermem.ByteOrder, &v)
|
||||
binary.Unmarshal(optVal[:linux.SizeOfLinger], hostarch.ByteOrder, &v)
|
||||
|
||||
ep.SocketOptions().SetLinger(tcpip.LingerOption{
|
||||
Enabled: v.OnOff != 0,
|
||||
@@ -1824,7 +1825,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetDelayOption(v == 0)
|
||||
return nil
|
||||
|
||||
@@ -1833,7 +1834,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetCorkOption(v != 0)
|
||||
return nil
|
||||
|
||||
@@ -1842,7 +1843,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetQuickAck(v != 0)
|
||||
return nil
|
||||
|
||||
@@ -1851,7 +1852,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.MaxSegOption, int(v)))
|
||||
|
||||
case linux.TCP_KEEPIDLE:
|
||||
@@ -1859,7 +1860,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
if v < 1 || v > linux.MAX_TCP_KEEPIDLE {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
@@ -1871,7 +1872,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
if v < 1 || v > linux.MAX_TCP_KEEPINTVL {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
@@ -1883,7 +1884,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
if v < 1 || v > linux.MAX_TCP_KEEPCNT {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
@@ -1894,7 +1895,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := int32(usermem.ByteOrder.Uint32(optVal))
|
||||
v := int32(hostarch.ByteOrder.Uint32(optVal))
|
||||
if v < 0 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
@@ -1913,7 +1914,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v := int32(usermem.ByteOrder.Uint32(optVal))
|
||||
v := int32(hostarch.ByteOrder.Uint32(optVal))
|
||||
opt := tcpip.TCPLingerTimeoutOption(time.Second * time.Duration(v))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(&opt))
|
||||
|
||||
@@ -1921,7 +1922,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
v := int32(usermem.ByteOrder.Uint32(optVal))
|
||||
v := int32(hostarch.ByteOrder.Uint32(optVal))
|
||||
if v < 0 {
|
||||
v = 0
|
||||
}
|
||||
@@ -1932,7 +1933,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.TCPSynCountOption, int(v)))
|
||||
|
||||
@@ -1940,7 +1941,7 @@ func setSockOptTCP(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name i
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.TCPWindowClampOption, int(v)))
|
||||
|
||||
@@ -1978,7 +1979,7 @@ func setSockOptIPv6(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name
|
||||
return syserr.ErrInvalidEndpointState
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
v := hostarch.ByteOrder.Uint32(optVal)
|
||||
ep.SocketOptions().SetV6Only(v != 0)
|
||||
return nil
|
||||
|
||||
@@ -2024,7 +2025,7 @@ func setSockOptIPv6(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
v := int32(usermem.ByteOrder.Uint32(optVal))
|
||||
v := int32(hostarch.ByteOrder.Uint32(optVal))
|
||||
|
||||
ep.SocketOptions().SetReceiveOriginalDstAddress(v != 0)
|
||||
return nil
|
||||
@@ -2033,7 +2034,7 @@ func setSockOptIPv6(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, name
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
v := int32(usermem.ByteOrder.Uint32(optVal))
|
||||
v := int32(hostarch.ByteOrder.Uint32(optVal))
|
||||
if v < -1 || v > 255 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
@@ -2117,12 +2118,12 @@ func copyInMulticastRequest(optVal []byte, allowAddr bool) (linux.InetMulticastR
|
||||
|
||||
if len(optVal) >= inetMulticastRequestWithNICSize {
|
||||
var req linux.InetMulticastRequestWithNIC
|
||||
binary.Unmarshal(optVal[:inetMulticastRequestWithNICSize], usermem.ByteOrder, &req)
|
||||
binary.Unmarshal(optVal[:inetMulticastRequestWithNICSize], hostarch.ByteOrder, &req)
|
||||
return req, nil
|
||||
}
|
||||
|
||||
var req linux.InetMulticastRequestWithNIC
|
||||
binary.Unmarshal(optVal[:inetMulticastRequestSize], usermem.ByteOrder, &req.InetMulticastRequest)
|
||||
binary.Unmarshal(optVal[:inetMulticastRequestSize], hostarch.ByteOrder, &req.InetMulticastRequest)
|
||||
return req, nil
|
||||
}
|
||||
|
||||
@@ -2132,7 +2133,7 @@ func copyInMulticastV6Request(optVal []byte) (linux.Inet6MulticastRequest, *syse
|
||||
}
|
||||
|
||||
var req linux.Inet6MulticastRequest
|
||||
binary.Unmarshal(optVal[:inet6MulticastRequestSize], usermem.ByteOrder, &req)
|
||||
binary.Unmarshal(optVal[:inet6MulticastRequestSize], hostarch.ByteOrder, &req)
|
||||
return req, nil
|
||||
}
|
||||
|
||||
@@ -2145,7 +2146,7 @@ func parseIntOrChar(buf []byte) (int32, *syserr.Error) {
|
||||
}
|
||||
|
||||
if len(buf) >= sizeOfInt32 {
|
||||
return int32(usermem.ByteOrder.Uint32(buf)), nil
|
||||
return int32(hostarch.ByteOrder.Uint32(buf)), nil
|
||||
}
|
||||
|
||||
return int32(buf[0]), nil
|
||||
@@ -3007,7 +3008,7 @@ func interfaceIoctl(ctx context.Context, io usermem.IO, arg int, ifr *linux.IFRe
|
||||
if arg == linux.SIOCGIFNAME {
|
||||
// Gets the name of the interface given the interface index
|
||||
// stored in ifr_ifindex.
|
||||
index = int32(usermem.ByteOrder.Uint32(ifr.Data[:4]))
|
||||
index = int32(hostarch.ByteOrder.Uint32(ifr.Data[:4]))
|
||||
if iface, ok := stack.Interfaces()[index]; ok {
|
||||
ifr.SetName(iface.Name)
|
||||
return nil
|
||||
@@ -3029,7 +3030,7 @@ func interfaceIoctl(ctx context.Context, io usermem.IO, arg int, ifr *linux.IFRe
|
||||
switch arg {
|
||||
case linux.SIOCGIFINDEX:
|
||||
// Copy out the index to the data.
|
||||
usermem.ByteOrder.PutUint32(ifr.Data[:], uint32(index))
|
||||
hostarch.ByteOrder.PutUint32(ifr.Data[:], uint32(index))
|
||||
|
||||
case linux.SIOCGIFHWADDR:
|
||||
// Copy the hardware address out.
|
||||
@@ -3042,7 +3043,7 @@ func interfaceIoctl(ctx context.Context, io usermem.IO, arg int, ifr *linux.IFRe
|
||||
// sockaddr. sa_family contains the ARPHRD_* device type,
|
||||
// sa_data the L2 hardware address starting from byte 0. Setting
|
||||
// the hardware address is a privileged operation.
|
||||
usermem.ByteOrder.PutUint16(ifr.Data[:], iface.DeviceType)
|
||||
hostarch.ByteOrder.PutUint16(ifr.Data[:], iface.DeviceType)
|
||||
n := copy(ifr.Data[2:], iface.Addr)
|
||||
for i := 2 + n; i < len(ifr.Data); i++ {
|
||||
ifr.Data[i] = 0 // Clear padding.
|
||||
@@ -3055,7 +3056,7 @@ func interfaceIoctl(ctx context.Context, io usermem.IO, arg int, ifr *linux.IFRe
|
||||
}
|
||||
// Drop the flags that don't fit in the size that we need to return. This
|
||||
// matches Linux behavior.
|
||||
usermem.ByteOrder.PutUint16(ifr.Data[:2], uint16(f))
|
||||
hostarch.ByteOrder.PutUint16(ifr.Data[:2], uint16(f))
|
||||
|
||||
case linux.SIOCGIFADDR:
|
||||
// Copy the IPv4 address out.
|
||||
@@ -3071,11 +3072,11 @@ func interfaceIoctl(ctx context.Context, io usermem.IO, arg int, ifr *linux.IFRe
|
||||
case linux.SIOCGIFMETRIC:
|
||||
// Gets the metric of the device. As per netdevice(7), this
|
||||
// always just sets ifr_metric to 0.
|
||||
usermem.ByteOrder.PutUint32(ifr.Data[:4], 0)
|
||||
hostarch.ByteOrder.PutUint32(ifr.Data[:4], 0)
|
||||
|
||||
case linux.SIOCGIFMTU:
|
||||
// Gets the MTU of the device.
|
||||
usermem.ByteOrder.PutUint32(ifr.Data[:4], iface.MTU)
|
||||
hostarch.ByteOrder.PutUint32(ifr.Data[:4], iface.MTU)
|
||||
|
||||
case linux.SIOCGIFMAP:
|
||||
// Gets the hardware parameters of the device.
|
||||
@@ -3101,8 +3102,8 @@ func interfaceIoctl(ctx context.Context, io usermem.IO, arg int, ifr *linux.IFRe
|
||||
continue
|
||||
}
|
||||
// Populate ifr.ifr_netmask (type sockaddr).
|
||||
usermem.ByteOrder.PutUint16(ifr.Data[0:2], uint16(linux.AF_INET))
|
||||
usermem.ByteOrder.PutUint16(ifr.Data[2:4], 0)
|
||||
hostarch.ByteOrder.PutUint16(ifr.Data[0:2], uint16(linux.AF_INET))
|
||||
hostarch.ByteOrder.PutUint16(ifr.Data[2:4], 0)
|
||||
var mask uint32 = 0xffffffff << (32 - addr.PrefixLen)
|
||||
// Netmask is expected to be returned as a big endian
|
||||
// value.
|
||||
@@ -3157,14 +3158,14 @@ func ifconfIoctl(ctx context.Context, t *kernel.Task, io usermem.IO, ifc *linux.
|
||||
// Populate ifr.ifr_addr.
|
||||
ifr := linux.IFReq{}
|
||||
ifr.SetName(iface.Name)
|
||||
usermem.ByteOrder.PutUint16(ifr.Data[0:2], uint16(ifaceAddr.Family))
|
||||
usermem.ByteOrder.PutUint16(ifr.Data[2:4], 0)
|
||||
hostarch.ByteOrder.PutUint16(ifr.Data[0:2], uint16(ifaceAddr.Family))
|
||||
hostarch.ByteOrder.PutUint16(ifr.Data[2:4], 0)
|
||||
copy(ifr.Data[4:8], ifaceAddr.Addr[:4])
|
||||
|
||||
// Copy the ifr to userspace.
|
||||
dst := uintptr(ifc.Ptr) + uintptr(ifc.Len)
|
||||
ifc.Len += int32(linux.SizeOfIFReq)
|
||||
if _, err := ifr.CopyOut(t, usermem.Addr(dst)); err != nil {
|
||||
if _, err := ifr.CopyOut(t, hostarch.Addr(dst)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ package netstack
|
||||
import (
|
||||
"gvisor.dev/gvisor/pkg/abi/linux"
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/hostarch"
|
||||
"gvisor.dev/gvisor/pkg/marshal"
|
||||
"gvisor.dev/gvisor/pkg/marshal/primitive"
|
||||
"gvisor.dev/gvisor/pkg/sentry/arch"
|
||||
@@ -197,7 +198,7 @@ func (s *SocketVFS2) Ioctl(ctx context.Context, uio usermem.IO, args arch.Syscal
|
||||
|
||||
// GetSockOpt implements the linux syscall getsockopt(2) for sockets backed by
|
||||
// tcpip.Endpoint.
|
||||
func (s *SocketVFS2) GetSockOpt(t *kernel.Task, level, name int, outPtr usermem.Addr, outLen int) (marshal.Marshallable, *syserr.Error) {
|
||||
func (s *SocketVFS2) GetSockOpt(t *kernel.Task, level, name int, outPtr hostarch.Addr, outLen int) (marshal.Marshallable, *syserr.Error) {
|
||||
// TODO(b/78348848): Unlike other socket options, SO_TIMESTAMP is
|
||||
// implemented specifically for netstack.SocketVFS2 rather than
|
||||
// commonEndpoint. commonEndpoint should be extended to support socket
|
||||
@@ -245,7 +246,7 @@ func (s *SocketVFS2) SetSockOpt(t *kernel.Task, level int, name int, optVal []by
|
||||
}
|
||||
s.readMu.Lock()
|
||||
defer s.readMu.Unlock()
|
||||
s.sockOptTimestamp = usermem.ByteOrder.Uint32(optVal) != 0
|
||||
s.sockOptTimestamp = hostarch.ByteOrder.Uint32(optVal) != 0
|
||||
return nil
|
||||
}
|
||||
if level == linux.SOL_TCP && name == linux.TCP_INQ {
|
||||
@@ -254,7 +255,7 @@ func (s *SocketVFS2) SetSockOpt(t *kernel.Task, level int, name int, optVal []by
|
||||
}
|
||||
s.readMu.Lock()
|
||||
defer s.readMu.Unlock()
|
||||
s.sockOptInq = usermem.ByteOrder.Uint32(optVal) != 0
|
||||
s.sockOptInq = hostarch.ByteOrder.Uint32(optVal) != 0
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user