Use common definition of SockType.
SockType isn't specific to unix domain sockets, and the current definition basically mirrors the linux ABI's definition. PiperOrigin-RevId: 251956740
This commit is contained in:
parent
6a4c006564
commit
315cf9a523
|
@ -102,15 +102,19 @@ const (
|
|||
SOL_NETLINK = 270
|
||||
)
|
||||
|
||||
// A SockType is a type (as opposed to family) of sockets. These are enumerated
|
||||
// below as SOCK_* constants.
|
||||
type SockType int
|
||||
|
||||
// Socket types, from linux/net.h.
|
||||
const (
|
||||
SOCK_STREAM = 1
|
||||
SOCK_DGRAM = 2
|
||||
SOCK_RAW = 3
|
||||
SOCK_RDM = 4
|
||||
SOCK_SEQPACKET = 5
|
||||
SOCK_DCCP = 6
|
||||
SOCK_PACKET = 10
|
||||
SOCK_STREAM SockType = 1
|
||||
SOCK_DGRAM = 2
|
||||
SOCK_RAW = 3
|
||||
SOCK_RDM = 4
|
||||
SOCK_SEQPACKET = 5
|
||||
SOCK_DCCP = 6
|
||||
SOCK_PACKET = 10
|
||||
)
|
||||
|
||||
// SOCK_TYPE_MASK covers all of the above socket types. The remaining bits are
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
package gofer
|
||||
|
||||
import (
|
||||
"gvisor.googlesource.com/gvisor/pkg/abi/linux"
|
||||
"gvisor.googlesource.com/gvisor/pkg/log"
|
||||
"gvisor.googlesource.com/gvisor/pkg/p9"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/fs"
|
||||
|
@ -61,13 +62,13 @@ type endpoint struct {
|
|||
path string
|
||||
}
|
||||
|
||||
func unixSockToP9(t transport.SockType) (p9.ConnectFlags, bool) {
|
||||
func sockTypeToP9(t linux.SockType) (p9.ConnectFlags, bool) {
|
||||
switch t {
|
||||
case transport.SockStream:
|
||||
case linux.SOCK_STREAM:
|
||||
return p9.StreamSocket, true
|
||||
case transport.SockSeqpacket:
|
||||
case linux.SOCK_SEQPACKET:
|
||||
return p9.SeqpacketSocket, true
|
||||
case transport.SockDgram:
|
||||
case linux.SOCK_DGRAM:
|
||||
return p9.DgramSocket, true
|
||||
}
|
||||
return 0, false
|
||||
|
@ -75,7 +76,7 @@ func unixSockToP9(t transport.SockType) (p9.ConnectFlags, bool) {
|
|||
|
||||
// BidirectionalConnect implements ConnectableEndpoint.BidirectionalConnect.
|
||||
func (e *endpoint) BidirectionalConnect(ce transport.ConnectingEndpoint, returnConnect func(transport.Receiver, transport.ConnectedEndpoint)) *syserr.Error {
|
||||
cf, ok := unixSockToP9(ce.Type())
|
||||
cf, ok := sockTypeToP9(ce.Type())
|
||||
if !ok {
|
||||
return syserr.ErrConnectionRefused
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ import (
|
|||
"sync"
|
||||
"syscall"
|
||||
|
||||
"gvisor.googlesource.com/gvisor/pkg/abi/linux"
|
||||
"gvisor.googlesource.com/gvisor/pkg/fd"
|
||||
"gvisor.googlesource.com/gvisor/pkg/fdnotifier"
|
||||
"gvisor.googlesource.com/gvisor/pkg/log"
|
||||
|
@ -56,7 +57,7 @@ type ConnectedEndpoint struct {
|
|||
srfd int `state:"wait"`
|
||||
|
||||
// stype is the type of Unix socket.
|
||||
stype transport.SockType
|
||||
stype linux.SockType
|
||||
|
||||
// sndbuf is the size of the send buffer.
|
||||
//
|
||||
|
@ -105,7 +106,7 @@ func (c *ConnectedEndpoint) init() *syserr.Error {
|
|||
return syserr.ErrInvalidEndpointState
|
||||
}
|
||||
|
||||
c.stype = transport.SockType(stype)
|
||||
c.stype = linux.SockType(stype)
|
||||
c.sndbuf = sndbuf
|
||||
|
||||
return nil
|
||||
|
@ -163,7 +164,7 @@ func NewSocketWithDirent(ctx context.Context, d *fs.Dirent, f *fd.FD, flags fs.F
|
|||
|
||||
ep := transport.NewExternal(e.stype, uniqueid.GlobalProviderFromContext(ctx), &q, e, e)
|
||||
|
||||
return unixsocket.NewWithDirent(ctx, d, ep, e.stype != transport.SockStream, flags), nil
|
||||
return unixsocket.NewWithDirent(ctx, d, ep, e.stype != linux.SOCK_STREAM, flags), nil
|
||||
}
|
||||
|
||||
// newSocket allocates a new unix socket with host endpoint.
|
||||
|
@ -195,7 +196,7 @@ func newSocket(ctx context.Context, orgfd int, saveable bool) (*fs.File, error)
|
|||
|
||||
ep := transport.NewExternal(e.stype, uniqueid.GlobalProviderFromContext(ctx), &q, e, e)
|
||||
|
||||
return unixsocket.New(ctx, ep, e.stype != transport.SockStream), nil
|
||||
return unixsocket.New(ctx, ep, e.stype != linux.SOCK_STREAM), nil
|
||||
}
|
||||
|
||||
// Send implements transport.ConnectedEndpoint.Send.
|
||||
|
@ -209,7 +210,7 @@ func (c *ConnectedEndpoint) Send(data [][]byte, controlMessages transport.Contro
|
|||
|
||||
// Since stream sockets don't preserve message boundaries, we can write
|
||||
// only as much of the message as fits in the send buffer.
|
||||
truncate := c.stype == transport.SockStream
|
||||
truncate := c.stype == linux.SOCK_STREAM
|
||||
|
||||
n, totalLen, err := fdWriteVec(c.file.FD(), data, c.sndbuf, truncate)
|
||||
if n < totalLen && err == nil {
|
||||
|
|
|
@ -32,7 +32,6 @@ go_library(
|
|||
"//pkg/sentry/kernel/time",
|
||||
"//pkg/sentry/safemem",
|
||||
"//pkg/sentry/socket",
|
||||
"//pkg/sentry/socket/unix/transport",
|
||||
"//pkg/sentry/unimpl",
|
||||
"//pkg/sentry/usermem",
|
||||
"//pkg/syserr",
|
||||
|
|
|
@ -44,7 +44,6 @@ import (
|
|||
ktime "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/safemem"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket/unix/transport"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/unimpl"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
|
||||
"gvisor.googlesource.com/gvisor/pkg/syserr"
|
||||
|
@ -228,7 +227,7 @@ type SocketOperations struct {
|
|||
|
||||
family int
|
||||
Endpoint tcpip.Endpoint
|
||||
skType transport.SockType
|
||||
skType linux.SockType
|
||||
|
||||
// readMu protects access to the below fields.
|
||||
readMu sync.Mutex `state:"nosave"`
|
||||
|
@ -253,8 +252,8 @@ type SocketOperations struct {
|
|||
}
|
||||
|
||||
// New creates a new endpoint socket.
|
||||
func New(t *kernel.Task, family int, skType transport.SockType, queue *waiter.Queue, endpoint tcpip.Endpoint) (*fs.File, *syserr.Error) {
|
||||
if skType == transport.SockStream {
|
||||
func New(t *kernel.Task, family int, skType linux.SockType, queue *waiter.Queue, endpoint tcpip.Endpoint) (*fs.File, *syserr.Error) {
|
||||
if skType == linux.SOCK_STREAM {
|
||||
if err := endpoint.SetSockOpt(tcpip.DelayOption(1)); err != nil {
|
||||
return nil, syserr.TranslateNetstackError(err)
|
||||
}
|
||||
|
@ -638,7 +637,7 @@ func (s *SocketOperations) GetSockOpt(t *kernel.Task, level, name, outLen int) (
|
|||
|
||||
// GetSockOpt can be used to implement the linux syscall getsockopt(2) for
|
||||
// sockets backed by a commonEndpoint.
|
||||
func GetSockOpt(t *kernel.Task, s socket.Socket, ep commonEndpoint, family int, skType transport.SockType, level, name, outLen int) (interface{}, *syserr.Error) {
|
||||
func GetSockOpt(t *kernel.Task, s socket.Socket, ep commonEndpoint, family int, skType linux.SockType, level, name, outLen int) (interface{}, *syserr.Error) {
|
||||
switch level {
|
||||
case linux.SOL_SOCKET:
|
||||
return getSockOptSocket(t, s, ep, family, skType, name, outLen)
|
||||
|
@ -664,7 +663,7 @@ func GetSockOpt(t *kernel.Task, s socket.Socket, ep commonEndpoint, family int,
|
|||
}
|
||||
|
||||
// getSockOptSocket implements GetSockOpt when level is SOL_SOCKET.
|
||||
func getSockOptSocket(t *kernel.Task, s socket.Socket, ep commonEndpoint, family int, skType transport.SockType, name, outLen int) (interface{}, *syserr.Error) {
|
||||
func getSockOptSocket(t *kernel.Task, s socket.Socket, ep commonEndpoint, family int, skType linux.SockType, name, outLen int) (interface{}, *syserr.Error) {
|
||||
// TODO(b/124056281): Stop rejecting short optLen values in getsockopt.
|
||||
switch name {
|
||||
case linux.SO_TYPE:
|
||||
|
|
|
@ -23,7 +23,6 @@ import (
|
|||
"gvisor.googlesource.com/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/kernel/auth"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket/unix/transport"
|
||||
"gvisor.googlesource.com/gvisor/pkg/syserr"
|
||||
"gvisor.googlesource.com/gvisor/pkg/tcpip"
|
||||
"gvisor.googlesource.com/gvisor/pkg/tcpip/header"
|
||||
|
@ -42,7 +41,7 @@ type provider struct {
|
|||
|
||||
// getTransportProtocol figures out transport protocol. Currently only TCP,
|
||||
// UDP, and ICMP are supported.
|
||||
func getTransportProtocol(ctx context.Context, stype transport.SockType, protocol int) (tcpip.TransportProtocolNumber, *syserr.Error) {
|
||||
func getTransportProtocol(ctx context.Context, stype linux.SockType, protocol int) (tcpip.TransportProtocolNumber, *syserr.Error) {
|
||||
switch stype {
|
||||
case linux.SOCK_STREAM:
|
||||
if protocol != 0 && protocol != syscall.IPPROTO_TCP {
|
||||
|
@ -80,7 +79,7 @@ func getTransportProtocol(ctx context.Context, stype transport.SockType, protoco
|
|||
}
|
||||
|
||||
// Socket creates a new socket object for the AF_INET or AF_INET6 family.
|
||||
func (p *provider) Socket(t *kernel.Task, stype transport.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
func (p *provider) Socket(t *kernel.Task, stype linux.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
// Fail right away if we don't have a stack.
|
||||
stack := t.NetworkContext()
|
||||
if stack == nil {
|
||||
|
@ -116,7 +115,7 @@ func (p *provider) Socket(t *kernel.Task, stype transport.SockType, protocol int
|
|||
}
|
||||
|
||||
// Pair just returns nil sockets (not supported).
|
||||
func (*provider) Pair(*kernel.Task, transport.SockType, int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
func (*provider) Pair(*kernel.Task, linux.SockType, int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
||||
|
|
|
@ -30,7 +30,6 @@ go_library(
|
|||
"//pkg/sentry/kernel/time",
|
||||
"//pkg/sentry/safemem",
|
||||
"//pkg/sentry/socket",
|
||||
"//pkg/sentry/socket/unix/transport",
|
||||
"//pkg/sentry/usermem",
|
||||
"//pkg/syserr",
|
||||
"//pkg/syserror",
|
||||
|
|
|
@ -30,7 +30,6 @@ import (
|
|||
ktime "gvisor.googlesource.com/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/safemem"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket/unix/transport"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
|
||||
"gvisor.googlesource.com/gvisor/pkg/syserr"
|
||||
"gvisor.googlesource.com/gvisor/pkg/syserror"
|
||||
|
@ -548,7 +547,7 @@ type socketProvider struct {
|
|||
}
|
||||
|
||||
// Socket implements socket.Provider.Socket.
|
||||
func (p *socketProvider) Socket(t *kernel.Task, stypeflags transport.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
func (p *socketProvider) Socket(t *kernel.Task, stypeflags linux.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
// Check that we are using the host network stack.
|
||||
stack := t.NetworkContext()
|
||||
if stack == nil {
|
||||
|
@ -590,7 +589,7 @@ func (p *socketProvider) Socket(t *kernel.Task, stypeflags transport.SockType, p
|
|||
}
|
||||
|
||||
// Pair implements socket.Provider.Pair.
|
||||
func (p *socketProvider) Pair(t *kernel.Task, stype transport.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
func (p *socketProvider) Pair(t *kernel.Task, stype linux.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
// Not supported by AF_INET/AF_INET6.
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@ import (
|
|||
"gvisor.googlesource.com/gvisor/pkg/sentry/fs"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/kernel"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket/unix/transport"
|
||||
"gvisor.googlesource.com/gvisor/pkg/syserr"
|
||||
)
|
||||
|
||||
|
@ -66,10 +65,10 @@ type socketProvider struct {
|
|||
}
|
||||
|
||||
// Socket implements socket.Provider.Socket.
|
||||
func (*socketProvider) Socket(t *kernel.Task, stype transport.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
func (*socketProvider) Socket(t *kernel.Task, stype linux.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
// Netlink sockets must be specified as datagram or raw, but they
|
||||
// behave the same regardless of type.
|
||||
if stype != transport.SockDgram && stype != transport.SockRaw {
|
||||
if stype != linux.SOCK_DGRAM && stype != linux.SOCK_RAW {
|
||||
return nil, syserr.ErrSocketNotSupported
|
||||
}
|
||||
|
||||
|
@ -94,7 +93,7 @@ func (*socketProvider) Socket(t *kernel.Task, stype transport.SockType, protocol
|
|||
}
|
||||
|
||||
// Pair implements socket.Provider.Pair by returning an error.
|
||||
func (*socketProvider) Pair(*kernel.Task, transport.SockType, int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
func (*socketProvider) Pair(*kernel.Task, linux.SockType, int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
// Netlink sockets never supports creating socket pairs.
|
||||
return nil, nil, syserr.ErrNotSupported
|
||||
}
|
||||
|
|
|
@ -31,7 +31,6 @@ go_library(
|
|||
"//pkg/sentry/socket/hostinet",
|
||||
"//pkg/sentry/socket/rpcinet/conn",
|
||||
"//pkg/sentry/socket/rpcinet/notifier",
|
||||
"//pkg/sentry/socket/unix/transport",
|
||||
"//pkg/sentry/unimpl",
|
||||
"//pkg/sentry/usermem",
|
||||
"//pkg/syserr",
|
||||
|
|
|
@ -32,7 +32,6 @@ import (
|
|||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket/rpcinet/conn"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket/rpcinet/notifier"
|
||||
pb "gvisor.googlesource.com/gvisor/pkg/sentry/socket/rpcinet/syscall_rpc_go_proto"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/socket/unix/transport"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/unimpl"
|
||||
"gvisor.googlesource.com/gvisor/pkg/sentry/usermem"
|
||||
"gvisor.googlesource.com/gvisor/pkg/syserr"
|
||||
|
@ -70,7 +69,7 @@ type socketOperations struct {
|
|||
var _ = socket.Socket(&socketOperations{})
|
||||
|
||||
// New creates a new RPC socket.
|
||||
func newSocketFile(ctx context.Context, stack *Stack, family int, skType int, protocol int) (*fs.File, *syserr.Error) {
|
||||
func newSocketFile(ctx context.Context, stack *Stack, family int, skType linux.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
id, c := stack.rpcConn.NewRequest(pb.SyscallRequest{Args: &pb.SyscallRequest_Socket{&pb.SocketRequest{Family: int64(family), Type: int64(skType | syscall.SOCK_NONBLOCK), Protocol: int64(protocol)}}}, false /* ignoreResult */)
|
||||
<-c
|
||||
|
||||
|
@ -841,7 +840,7 @@ type socketProvider struct {
|
|||
}
|
||||
|
||||
// Socket implements socket.Provider.Socket.
|
||||
func (p *socketProvider) Socket(t *kernel.Task, stypeflags transport.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
func (p *socketProvider) Socket(t *kernel.Task, stypeflags linux.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
// Check that we are using the RPC network stack.
|
||||
stack := t.NetworkContext()
|
||||
if stack == nil {
|
||||
|
@ -857,7 +856,7 @@ func (p *socketProvider) Socket(t *kernel.Task, stypeflags transport.SockType, p
|
|||
//
|
||||
// Try to restrict the flags we will accept to minimize backwards
|
||||
// incompatibility with netstack.
|
||||
stype := int(stypeflags) & linux.SOCK_TYPE_MASK
|
||||
stype := stypeflags & linux.SOCK_TYPE_MASK
|
||||
switch stype {
|
||||
case syscall.SOCK_STREAM:
|
||||
switch protocol {
|
||||
|
@ -881,7 +880,7 @@ func (p *socketProvider) Socket(t *kernel.Task, stypeflags transport.SockType, p
|
|||
}
|
||||
|
||||
// Pair implements socket.Provider.Pair.
|
||||
func (p *socketProvider) Pair(t *kernel.Task, stype transport.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
func (p *socketProvider) Pair(t *kernel.Task, stype linux.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
// Not supported by AF_INET/AF_INET6.
|
||||
return nil, nil, nil
|
||||
}
|
||||
|
|
|
@ -130,12 +130,12 @@ type Provider interface {
|
|||
// If a nil Socket _and_ a nil error is returned, it means that the
|
||||
// protocol is not supported. A non-nil error should only be returned
|
||||
// if the protocol is supported, but an error occurs during creation.
|
||||
Socket(t *kernel.Task, stype transport.SockType, protocol int) (*fs.File, *syserr.Error)
|
||||
Socket(t *kernel.Task, stype linux.SockType, protocol int) (*fs.File, *syserr.Error)
|
||||
|
||||
// Pair creates a pair of connected sockets.
|
||||
//
|
||||
// See Socket for error information.
|
||||
Pair(t *kernel.Task, stype transport.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error)
|
||||
Pair(t *kernel.Task, stype linux.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error)
|
||||
}
|
||||
|
||||
// families holds a map of all known address families and their providers.
|
||||
|
@ -149,7 +149,7 @@ func RegisterProvider(family int, provider Provider) {
|
|||
}
|
||||
|
||||
// New creates a new socket with the given family, type and protocol.
|
||||
func New(t *kernel.Task, family int, stype transport.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
func New(t *kernel.Task, family int, stype linux.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
for _, p := range families[family] {
|
||||
s, err := p.Socket(t, stype, protocol)
|
||||
if err != nil {
|
||||
|
@ -166,7 +166,7 @@ func New(t *kernel.Task, family int, stype transport.SockType, protocol int) (*f
|
|||
|
||||
// Pair creates a new connected socket pair with the given family, type and
|
||||
// protocol.
|
||||
func Pair(t *kernel.Task, family int, stype transport.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
func Pair(t *kernel.Task, family int, stype linux.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
providers, ok := families[family]
|
||||
if !ok {
|
||||
return nil, nil, syserr.ErrAddressFamilyNotSupported
|
||||
|
|
|
@ -45,7 +45,7 @@ type ConnectingEndpoint interface {
|
|||
// Type returns the socket type, typically either SockStream or
|
||||
// SockSeqpacket. The connection attempt must be aborted if this
|
||||
// value doesn't match the ConnectableEndpoint's type.
|
||||
Type() SockType
|
||||
Type() linux.SockType
|
||||
|
||||
// GetLocalAddress returns the bound path.
|
||||
GetLocalAddress() (tcpip.FullAddress, *tcpip.Error)
|
||||
|
@ -101,7 +101,7 @@ type connectionedEndpoint struct {
|
|||
// stype is used by connecting sockets to ensure that they are the
|
||||
// same type. The value is typically either tcpip.SockSeqpacket or
|
||||
// tcpip.SockStream.
|
||||
stype SockType
|
||||
stype linux.SockType
|
||||
|
||||
// acceptedChan is per the TCP endpoint implementation. Note that the
|
||||
// sockets in this channel are _already in the connected state_, and
|
||||
|
@ -112,7 +112,7 @@ type connectionedEndpoint struct {
|
|||
}
|
||||
|
||||
// NewConnectioned creates a new unbound connectionedEndpoint.
|
||||
func NewConnectioned(stype SockType, uid UniqueIDProvider) Endpoint {
|
||||
func NewConnectioned(stype linux.SockType, uid UniqueIDProvider) Endpoint {
|
||||
return &connectionedEndpoint{
|
||||
baseEndpoint: baseEndpoint{Queue: &waiter.Queue{}},
|
||||
id: uid.UniqueID(),
|
||||
|
@ -122,7 +122,7 @@ func NewConnectioned(stype SockType, uid UniqueIDProvider) Endpoint {
|
|||
}
|
||||
|
||||
// NewPair allocates a new pair of connected unix-domain connectionedEndpoints.
|
||||
func NewPair(stype SockType, uid UniqueIDProvider) (Endpoint, Endpoint) {
|
||||
func NewPair(stype linux.SockType, uid UniqueIDProvider) (Endpoint, Endpoint) {
|
||||
a := &connectionedEndpoint{
|
||||
baseEndpoint: baseEndpoint{Queue: &waiter.Queue{}},
|
||||
id: uid.UniqueID(),
|
||||
|
@ -139,7 +139,7 @@ func NewPair(stype SockType, uid UniqueIDProvider) (Endpoint, Endpoint) {
|
|||
q1 := &queue{ReaderQueue: a.Queue, WriterQueue: b.Queue, limit: initialLimit}
|
||||
q2 := &queue{ReaderQueue: b.Queue, WriterQueue: a.Queue, limit: initialLimit}
|
||||
|
||||
if stype == SockStream {
|
||||
if stype == linux.SOCK_STREAM {
|
||||
a.receiver = &streamQueueReceiver{queueReceiver: queueReceiver{q1}}
|
||||
b.receiver = &streamQueueReceiver{queueReceiver: queueReceiver{q2}}
|
||||
} else {
|
||||
|
@ -163,7 +163,7 @@ func NewPair(stype SockType, uid UniqueIDProvider) (Endpoint, Endpoint) {
|
|||
|
||||
// NewExternal creates a new externally backed Endpoint. It behaves like a
|
||||
// socketpair.
|
||||
func NewExternal(stype SockType, uid UniqueIDProvider, queue *waiter.Queue, receiver Receiver, connected ConnectedEndpoint) Endpoint {
|
||||
func NewExternal(stype linux.SockType, uid UniqueIDProvider, queue *waiter.Queue, receiver Receiver, connected ConnectedEndpoint) Endpoint {
|
||||
return &connectionedEndpoint{
|
||||
baseEndpoint: baseEndpoint{Queue: queue, receiver: receiver, connected: connected},
|
||||
id: uid.UniqueID(),
|
||||
|
@ -178,7 +178,7 @@ func (e *connectionedEndpoint) ID() uint64 {
|
|||
}
|
||||
|
||||
// Type implements ConnectingEndpoint.Type and Endpoint.Type.
|
||||
func (e *connectionedEndpoint) Type() SockType {
|
||||
func (e *connectionedEndpoint) Type() linux.SockType {
|
||||
return e.stype
|
||||
}
|
||||
|
||||
|
@ -294,7 +294,7 @@ func (e *connectionedEndpoint) BidirectionalConnect(ce ConnectingEndpoint, retur
|
|||
}
|
||||
|
||||
writeQueue := &queue{ReaderQueue: ne.Queue, WriterQueue: ce.WaiterQueue(), limit: initialLimit}
|
||||
if e.stype == SockStream {
|
||||
if e.stype == linux.SOCK_STREAM {
|
||||
ne.receiver = &streamQueueReceiver{queueReceiver: queueReceiver{readQueue: writeQueue}}
|
||||
} else {
|
||||
ne.receiver = &queueReceiver{readQueue: writeQueue}
|
||||
|
@ -309,7 +309,7 @@ func (e *connectionedEndpoint) BidirectionalConnect(ce ConnectingEndpoint, retur
|
|||
writeQueue: writeQueue,
|
||||
}
|
||||
readQueue.IncRef()
|
||||
if e.stype == SockStream {
|
||||
if e.stype == linux.SOCK_STREAM {
|
||||
returnConnect(&streamQueueReceiver{queueReceiver: queueReceiver{readQueue: readQueue}}, connected)
|
||||
} else {
|
||||
returnConnect(&queueReceiver{readQueue: readQueue}, connected)
|
||||
|
@ -429,7 +429,7 @@ func (e *connectionedEndpoint) Bind(addr tcpip.FullAddress, commit func() *syser
|
|||
func (e *connectionedEndpoint) SendMsg(data [][]byte, c ControlMessages, to BoundEndpoint) (uintptr, *syserr.Error) {
|
||||
// Stream sockets do not support specifying the endpoint. Seqpacket
|
||||
// sockets ignore the passed endpoint.
|
||||
if e.stype == SockStream && to != nil {
|
||||
if e.stype == linux.SOCK_STREAM && to != nil {
|
||||
return 0, syserr.ErrNotSupported
|
||||
}
|
||||
return e.baseEndpoint.SendMsg(data, c, to)
|
||||
|
|
|
@ -119,8 +119,8 @@ func (e *connectionlessEndpoint) SendMsg(data [][]byte, c ControlMessages, to Bo
|
|||
}
|
||||
|
||||
// Type implements Endpoint.Type.
|
||||
func (e *connectionlessEndpoint) Type() SockType {
|
||||
return SockDgram
|
||||
func (e *connectionlessEndpoint) Type() linux.SockType {
|
||||
return linux.SOCK_DGRAM
|
||||
}
|
||||
|
||||
// Connect attempts to connect directly to server.
|
||||
|
|
|
@ -19,6 +19,7 @@ import (
|
|||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
"gvisor.googlesource.com/gvisor/pkg/abi/linux"
|
||||
"gvisor.googlesource.com/gvisor/pkg/syserr"
|
||||
"gvisor.googlesource.com/gvisor/pkg/tcpip"
|
||||
"gvisor.googlesource.com/gvisor/pkg/tcpip/buffer"
|
||||
|
@ -28,21 +29,6 @@ import (
|
|||
// initialLimit is the starting limit for the socket buffers.
|
||||
const initialLimit = 16 * 1024
|
||||
|
||||
// A SockType is a type (as opposed to family) of sockets. These are enumerated
|
||||
// in the syscall package as syscall.SOCK_* constants.
|
||||
type SockType int
|
||||
|
||||
const (
|
||||
// SockStream corresponds to syscall.SOCK_STREAM.
|
||||
SockStream SockType = 1
|
||||
// SockDgram corresponds to syscall.SOCK_DGRAM.
|
||||
SockDgram SockType = 2
|
||||
// SockRaw corresponds to syscall.SOCK_RAW.
|
||||
SockRaw SockType = 3
|
||||
// SockSeqpacket corresponds to syscall.SOCK_SEQPACKET.
|
||||
SockSeqpacket SockType = 5
|
||||
)
|
||||
|
||||
// A RightsControlMessage is a control message containing FDs.
|
||||
type RightsControlMessage interface {
|
||||
// Clone returns a copy of the RightsControlMessage.
|
||||
|
@ -175,7 +161,7 @@ type Endpoint interface {
|
|||
|
||||
// Type return the socket type, typically either SockStream, SockDgram
|
||||
// or SockSeqpacket.
|
||||
Type() SockType
|
||||
Type() linux.SockType
|
||||
|
||||
// GetLocalAddress returns the address to which the endpoint is bound.
|
||||
GetLocalAddress() (tcpip.FullAddress, *tcpip.Error)
|
||||
|
@ -629,7 +615,7 @@ type connectedEndpoint struct {
|
|||
GetLocalAddress() (tcpip.FullAddress, *tcpip.Error)
|
||||
|
||||
// Type implements Endpoint.Type.
|
||||
Type() SockType
|
||||
Type() linux.SockType
|
||||
}
|
||||
|
||||
writeQueue *queue
|
||||
|
@ -653,7 +639,7 @@ func (e *connectedEndpoint) Send(data [][]byte, controlMessages ControlMessages,
|
|||
}
|
||||
|
||||
truncate := false
|
||||
if e.endpoint.Type() == SockStream {
|
||||
if e.endpoint.Type() == linux.SOCK_STREAM {
|
||||
// Since stream sockets don't preserve message boundaries, we
|
||||
// can write only as much of the message as fits in the queue.
|
||||
truncate = true
|
||||
|
|
|
@ -605,7 +605,7 @@ func (s *SocketOperations) State() uint32 {
|
|||
type provider struct{}
|
||||
|
||||
// Socket returns a new unix domain socket.
|
||||
func (*provider) Socket(t *kernel.Task, stype transport.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
func (*provider) Socket(t *kernel.Task, stype linux.SockType, protocol int) (*fs.File, *syserr.Error) {
|
||||
// Check arguments.
|
||||
if protocol != 0 && protocol != linux.AF_UNIX /* PF_UNIX */ {
|
||||
return nil, syserr.ErrProtocolNotSupported
|
||||
|
@ -631,7 +631,7 @@ func (*provider) Socket(t *kernel.Task, stype transport.SockType, protocol int)
|
|||
}
|
||||
|
||||
// Pair creates a new pair of AF_UNIX connected sockets.
|
||||
func (*provider) Pair(t *kernel.Task, stype transport.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
func (*provider) Pair(t *kernel.Task, stype linux.SockType, protocol int) (*fs.File, *fs.File, *syserr.Error) {
|
||||
// Check arguments.
|
||||
if protocol != 0 && protocol != linux.AF_UNIX /* PF_UNIX */ {
|
||||
return nil, nil, syserr.ErrProtocolNotSupported
|
||||
|
|
|
@ -76,13 +76,13 @@ var SocketFamily = abi.ValueSet{
|
|||
|
||||
// SocketType are the possible socket(2) types.
|
||||
var SocketType = abi.ValueSet{
|
||||
linux.SOCK_STREAM: "SOCK_STREAM",
|
||||
linux.SOCK_DGRAM: "SOCK_DGRAM",
|
||||
linux.SOCK_RAW: "SOCK_RAW",
|
||||
linux.SOCK_RDM: "SOCK_RDM",
|
||||
linux.SOCK_SEQPACKET: "SOCK_SEQPACKET",
|
||||
linux.SOCK_DCCP: "SOCK_DCCP",
|
||||
linux.SOCK_PACKET: "SOCK_PACKET",
|
||||
uint64(linux.SOCK_STREAM): "SOCK_STREAM",
|
||||
uint64(linux.SOCK_DGRAM): "SOCK_DGRAM",
|
||||
uint64(linux.SOCK_RAW): "SOCK_RAW",
|
||||
uint64(linux.SOCK_RDM): "SOCK_RDM",
|
||||
uint64(linux.SOCK_SEQPACKET): "SOCK_SEQPACKET",
|
||||
uint64(linux.SOCK_DCCP): "SOCK_DCCP",
|
||||
uint64(linux.SOCK_PACKET): "SOCK_PACKET",
|
||||
}
|
||||
|
||||
// SocketFlagSet are the possible socket(2) flags.
|
||||
|
|
|
@ -188,7 +188,7 @@ func Socket(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Syscal
|
|||
}
|
||||
|
||||
// Create the new socket.
|
||||
s, e := socket.New(t, domain, transport.SockType(stype&0xf), protocol)
|
||||
s, e := socket.New(t, domain, linux.SockType(stype&0xf), protocol)
|
||||
if e != nil {
|
||||
return 0, nil, e.ToError()
|
||||
}
|
||||
|
@ -227,7 +227,7 @@ func SocketPair(t *kernel.Task, args arch.SyscallArguments) (uintptr, *kernel.Sy
|
|||
}
|
||||
|
||||
// Create the socket pair.
|
||||
s1, s2, e := socket.Pair(t, domain, transport.SockType(stype&0xf), protocol)
|
||||
s1, s2, e := socket.Pair(t, domain, linux.SockType(stype&0xf), protocol)
|
||||
if e != nil {
|
||||
return 0, nil, e.ToError()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue