mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Convert int and bool socket options to use GetSockOptInt and GetSockOptBool
PiperOrigin-RevId: 305699233
This commit is contained in:
@@ -300,7 +300,7 @@ type SocketOperations struct {
|
||||
// New creates a new endpoint socket.
|
||||
func New(t *kernel.Task, family int, skType linux.SockType, protocol int, queue *waiter.Queue, endpoint tcpip.Endpoint) (*fs.File, *syserr.Error) {
|
||||
if skType == linux.SOCK_STREAM {
|
||||
if err := endpoint.SetSockOptInt(tcpip.DelayOption, 1); err != nil {
|
||||
if err := endpoint.SetSockOptBool(tcpip.DelayOption, true); err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
}
|
||||
@@ -965,6 +965,13 @@ func GetSockOpt(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, family in
|
||||
return nil, syserr.ErrProtocolNotAvailable
|
||||
}
|
||||
|
||||
func boolToInt32(v bool) int32 {
|
||||
if v {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// getSockOptSocket implements GetSockOpt when level is SOL_SOCKET.
|
||||
func getSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, family int, skType linux.SockType, name, outLen int) (interface{}, *syserr.Error) {
|
||||
// TODO(b/124056281): Stop rejecting short optLen values in getsockopt.
|
||||
@@ -998,12 +1005,11 @@ func getSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, fam
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.PasscredOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptBool(tcpip.PasscredOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
return int32(v), nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.SO_SNDBUF:
|
||||
if outLen < sizeOfInt32 {
|
||||
@@ -1042,24 +1048,22 @@ func getSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, fam
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.ReuseAddressOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptBool(tcpip.ReuseAddressOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
return int32(v), nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.SO_REUSEPORT:
|
||||
if outLen < sizeOfInt32 {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.ReusePortOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptBool(tcpip.ReusePortOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
return int32(v), nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.SO_BINDTODEVICE:
|
||||
var v tcpip.BindToDeviceOption
|
||||
@@ -1089,24 +1093,22 @@ func getSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, fam
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.BroadcastOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptBool(tcpip.BroadcastOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
return int32(v), nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.SO_KEEPALIVE:
|
||||
if outLen < sizeOfInt32 {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.KeepaliveEnabledOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptBool(tcpip.KeepaliveEnabledOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
return int32(v), nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.SO_LINGER:
|
||||
if outLen < linux.SizeOfLinger {
|
||||
@@ -1156,47 +1158,41 @@ func getSockOptTCP(t *kernel.Task, ep commonEndpoint, name, outLen int) (interfa
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
v, err := ep.GetSockOptInt(tcpip.DelayOption)
|
||||
v, err := ep.GetSockOptBool(tcpip.DelayOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
if v == 0 {
|
||||
return int32(1), nil
|
||||
}
|
||||
return int32(0), nil
|
||||
return boolToInt32(!v), nil
|
||||
|
||||
case linux.TCP_CORK:
|
||||
if outLen < sizeOfInt32 {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.CorkOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptBool(tcpip.CorkOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
return int32(v), nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.TCP_QUICKACK:
|
||||
if outLen < sizeOfInt32 {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.QuickAckOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptBool(tcpip.QuickAckOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
return int32(v), nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.TCP_MAXSEG:
|
||||
if outLen < sizeOfInt32 {
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.MaxSegOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptInt(tcpip.MaxSegOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
@@ -1328,11 +1324,7 @@ func getSockOptIPv6(t *kernel.Task, ep commonEndpoint, name, outLen int) (interf
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
var o int32
|
||||
if v {
|
||||
o = 1
|
||||
}
|
||||
return o, nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.IPV6_PATHMTU:
|
||||
t.Kernel().EmitUnimplementedEvent(t)
|
||||
@@ -1342,8 +1334,8 @@ func getSockOptIPv6(t *kernel.Task, ep commonEndpoint, name, outLen int) (interf
|
||||
if outLen == 0 {
|
||||
return make([]byte, 0), nil
|
||||
}
|
||||
var v tcpip.IPv6TrafficClassOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptInt(tcpip.IPv6TrafficClassOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
@@ -1365,12 +1357,7 @@ func getSockOptIPv6(t *kernel.Task, ep commonEndpoint, name, outLen int) (interf
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
var o int32
|
||||
if v {
|
||||
o = 1
|
||||
}
|
||||
return o, nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
default:
|
||||
emitUnimplementedEventIPv6(t, name)
|
||||
@@ -1386,8 +1373,8 @@ func getSockOptIP(t *kernel.Task, ep commonEndpoint, name, outLen int, family in
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.TTLOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptInt(tcpip.TTLOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
@@ -1403,8 +1390,8 @@ func getSockOptIP(t *kernel.Task, ep commonEndpoint, name, outLen int, family in
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.MulticastTTLOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptInt(tcpip.MulticastTTLOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
@@ -1429,23 +1416,19 @@ func getSockOptIP(t *kernel.Task, ep commonEndpoint, name, outLen int, family in
|
||||
return nil, syserr.ErrInvalidArgument
|
||||
}
|
||||
|
||||
var v tcpip.MulticastLoopOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptBool(tcpip.MulticastLoopOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
||||
if v {
|
||||
return int32(1), nil
|
||||
}
|
||||
return int32(0), nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.IP_TOS:
|
||||
// Length handling for parity with Linux.
|
||||
if outLen == 0 {
|
||||
return []byte(nil), nil
|
||||
}
|
||||
var v tcpip.IPv4TOSOption
|
||||
if err := ep.GetSockOpt(&v); err != nil {
|
||||
v, err := ep.GetSockOptInt(tcpip.IPv4TOSOption)
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
if outLen < sizeOfInt32 {
|
||||
@@ -1462,11 +1445,7 @@ func getSockOptIP(t *kernel.Task, ep commonEndpoint, name, outLen int, family in
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
var o int32
|
||||
if v {
|
||||
o = 1
|
||||
}
|
||||
return o, nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
case linux.IP_PKTINFO:
|
||||
if outLen < sizeOfInt32 {
|
||||
@@ -1477,11 +1456,7 @@ func getSockOptIP(t *kernel.Task, ep commonEndpoint, name, outLen int, family in
|
||||
if err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
var o int32
|
||||
if v {
|
||||
o = 1
|
||||
}
|
||||
return o, nil
|
||||
return boolToInt32(v), nil
|
||||
|
||||
default:
|
||||
emitUnimplementedEventIP(t, name)
|
||||
@@ -1592,7 +1567,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.ReuseAddressOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptBool(tcpip.ReuseAddressOption, v != 0))
|
||||
|
||||
case linux.SO_REUSEPORT:
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
@@ -1600,7 +1575,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.ReusePortOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptBool(tcpip.ReusePortOption, v != 0))
|
||||
|
||||
case linux.SO_BINDTODEVICE:
|
||||
n := bytes.IndexByte(optVal, 0)
|
||||
@@ -1628,7 +1603,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.BroadcastOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptBool(tcpip.BroadcastOption, v != 0))
|
||||
|
||||
case linux.SO_PASSCRED:
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
@@ -1636,7 +1611,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.PasscredOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptBool(tcpip.PasscredOption, v != 0))
|
||||
|
||||
case linux.SO_KEEPALIVE:
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
@@ -1644,7 +1619,7 @@ func setSockOptSocket(t *kernel.Task, s socket.SocketOps, ep commonEndpoint, nam
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.KeepaliveEnabledOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptBool(tcpip.KeepaliveEnabledOption, v != 0))
|
||||
|
||||
case linux.SO_SNDTIMEO:
|
||||
if len(optVal) < linux.SizeOfTimeval {
|
||||
@@ -1716,11 +1691,7 @@ func setSockOptTCP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
var o int
|
||||
if v == 0 {
|
||||
o = 1
|
||||
}
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.DelayOption, o))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptBool(tcpip.DelayOption, v == 0))
|
||||
|
||||
case linux.TCP_CORK:
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
@@ -1728,7 +1699,7 @@ func setSockOptTCP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.CorkOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptBool(tcpip.CorkOption, v != 0))
|
||||
|
||||
case linux.TCP_QUICKACK:
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
@@ -1736,7 +1707,7 @@ func setSockOptTCP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.QuickAckOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptBool(tcpip.QuickAckOption, v != 0))
|
||||
|
||||
case linux.TCP_MAXSEG:
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
@@ -1744,7 +1715,7 @@ func setSockOptTCP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *
|
||||
}
|
||||
|
||||
v := usermem.ByteOrder.Uint32(optVal)
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.MaxSegOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.MaxSegOption, int(v)))
|
||||
|
||||
case linux.TCP_KEEPIDLE:
|
||||
if len(optVal) < sizeOfInt32 {
|
||||
@@ -1855,7 +1826,7 @@ func setSockOptIPv6(t *kernel.Task, ep commonEndpoint, name int, optVal []byte)
|
||||
if v == -1 {
|
||||
v = 0
|
||||
}
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.IPv6TrafficClassOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.IPv6TrafficClassOption, int(v)))
|
||||
|
||||
case linux.IPV6_RECVTCLASS:
|
||||
v, err := parseIntOrChar(optVal)
|
||||
@@ -1940,7 +1911,7 @@ func setSockOptIP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *s
|
||||
if v < 0 || v > 255 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.MulticastTTLOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.MulticastTTLOption, int(v)))
|
||||
|
||||
case linux.IP_ADD_MEMBERSHIP:
|
||||
req, err := copyInMulticastRequest(optVal, false /* allowAddr */)
|
||||
@@ -1987,9 +1958,7 @@ func setSockOptIP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *s
|
||||
return err
|
||||
}
|
||||
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(
|
||||
tcpip.MulticastLoopOption(v != 0),
|
||||
))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptBool(tcpip.MulticastLoopOption, v != 0))
|
||||
|
||||
case linux.MCAST_JOIN_GROUP:
|
||||
// FIXME(b/124219304): Implement MCAST_JOIN_GROUP.
|
||||
@@ -2008,7 +1977,7 @@ func setSockOptIP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *s
|
||||
} else if v < 1 || v > 255 {
|
||||
return syserr.ErrInvalidArgument
|
||||
}
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.TTLOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.TTLOption, int(v)))
|
||||
|
||||
case linux.IP_TOS:
|
||||
if len(optVal) == 0 {
|
||||
@@ -2018,7 +1987,7 @@ func setSockOptIP(t *kernel.Task, ep commonEndpoint, name int, optVal []byte) *s
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return syserr.TranslateNetstackError(ep.SetSockOpt(tcpip.IPv4TOSOption(v)))
|
||||
return syserr.TranslateNetstackError(ep.SetSockOptInt(tcpip.IPv4TOSOption, int(v)))
|
||||
|
||||
case linux.IP_RECVTOS:
|
||||
v, err := parseIntOrChar(optVal)
|
||||
|
||||
Reference in New Issue
Block a user