package netlink

import "gvisor.dev/gvisor/pkg/sentry/socket/netlink"

Package netlink provides core functionality for netlink sockets.

Index

Functions

func ExtractSockAddr

func ExtractSockAddr(b []byte) (*linux.SockAddrNetlink, *syserr.Error)

ExtractSockAddr extracts the SockAddrNetlink from b.

func RegisterProvider

func RegisterProvider(protocol int, provider Provider)

RegisterProvider registers the provider of a given address protocol so that netlink sockets of that type can be created via socket(2).

Preconditions: May only be called before any netlink sockets are created.

Types

type Protocol

type Protocol interface {
	// Protocol returns the Linux netlink protocol value.
	Protocol() int

	// CanSend returns true if this protocol may ever send messages.
	//
	// TODO(gvisor.dev/issue/1119): This is a workaround to allow
	// advertising support for otherwise unimplemented features on sockets
	// that will never send messages, thus making those features no-ops.
	CanSend() bool

	// ProcessMessage processes a single message from userspace.
	//
	// If err == nil, any messages added to ms will be sent back to the
	// other end of the socket. Setting ms.Multi will cause an NLMSG_DONE
	// message to be sent even if ms contains no messages.
	ProcessMessage(ctx context.Context, s *Socket, msg *nlmsg.Message, ms *nlmsg.MessageSet) *syserr.Error
}

Protocol is the implementation of a netlink socket protocol.

type Provider

type Provider func(t *kernel.Task) (Protocol, *syserr.Error)

Provider is a function that creates a new Protocol for a specific netlink protocol.

Note that this is distinct from socket.Provider, which is used for all socket families.

type Socket

type Socket struct {
	vfs.FileDescriptionDefaultImpl
	vfs.DentryMetadataFileDescriptionImpl
	vfs.LockFD
	socket.SendReceiveTimeout
	// contains filtered or unexported fields
}

Socket is the base socket type for netlink sockets.

This implementation only supports userspace sending and receiving messages to/from the kernel.

Socket implements socket.Socket and transport.Credentialer.

+stateify savable

func New

func New(t *kernel.Task, skType linux.SockType, protocol Protocol) (*Socket, *syserr.Error)

New creates a new Socket.

func (*Socket) Accept

func (s *Socket) Accept(t *kernel.Task, peerRequested bool, flags int, blocking bool) (int32, linux.SockAddr, uint32, *syserr.Error)

Accept implements socket.Socket.Accept.

func (*Socket) Bind

func (s *Socket) Bind(t *kernel.Task, sockaddr []byte) *syserr.Error

Bind implements socket.Socket.Bind.

func (*Socket) Connect

func (s *Socket) Connect(t *kernel.Task, sockaddr []byte, blocking bool) *syserr.Error

Connect implements socket.Socket.Connect.

func (*Socket) ConnectedPasscred

func (s *Socket) ConnectedPasscred() bool

ConnectedPasscred implements transport.Credentialer.ConnectedPasscred.

func (*Socket) Epollable

func (s *Socket) Epollable() bool

Epollable implements FileDescriptionImpl.Epollable.

func (*Socket) EventRegister

func (s *Socket) EventRegister(e *waiter.Entry) error

EventRegister implements waiter.Waitable.EventRegister.

func (*Socket) EventUnregister

func (s *Socket) EventUnregister(e *waiter.Entry)

EventUnregister implements waiter.Waitable.EventUnregister.

func (*Socket) GetPeerName

func (s *Socket) GetPeerName(t *kernel.Task) (linux.SockAddr, uint32, *syserr.Error)

GetPeerName implements socket.Socket.GetPeerName.

func (*Socket) GetSockName

func (s *Socket) GetSockName(t *kernel.Task) (linux.SockAddr, uint32, *syserr.Error)

GetSockName implements socket.Socket.GetSockName.

func (*Socket) GetSockOpt

func (s *Socket) GetSockOpt(t *kernel.Task, level int, name int, outPtr hostarch.Addr, outLen int) (marshal.Marshallable, *syserr.Error)

GetSockOpt implements socket.Socket.GetSockOpt.

func (*Socket) Ioctl

func (*Socket) Ioctl(ctx context.Context, uio usermem.IO, sysno uintptr, args arch.SyscallArguments) (uintptr, error)

Ioctl implements vfs.FileDescriptionImpl.

func (*Socket) Listen

func (s *Socket) Listen(t *kernel.Task, backlog int) *syserr.Error

Listen implements socket.Socket.Listen.

func (*Socket) PRead

func (s *Socket) PRead(ctx context.Context, dst usermem.IOSequence, offset int64, opts vfs.ReadOptions) (int64, error)

PRead implements vfs.FileDescriptionImpl.

func (*Socket) PWrite

func (s *Socket) PWrite(ctx context.Context, src usermem.IOSequence, offset int64, opts vfs.WriteOptions) (int64, error)

PWrite implements vfs.FileDescriptionImpl.

func (*Socket) Passcred

func (s *Socket) Passcred() bool

Passcred implements transport.Credentialer.Passcred.

func (*Socket) Read

func (s *Socket) Read(ctx context.Context, dst usermem.IOSequence, opts vfs.ReadOptions) (int64, error)

Read implements vfs.FileDescriptionImpl.

func (*Socket) Readiness

func (s *Socket) Readiness(mask waiter.EventMask) waiter.EventMask

Readiness implements waiter.Waitable.Readiness.

func (*Socket) RecvMsg

func (s *Socket) RecvMsg(t *kernel.Task, dst usermem.IOSequence, flags int, haveDeadline bool, deadline ktime.Time, senderRequested bool, controlDataLen uint64) (int, int, linux.SockAddr, uint32, socket.ControlMessages, *syserr.Error)

RecvMsg implements socket.Socket.RecvMsg.

func (*Socket) Release

func (s *Socket) Release(ctx context.Context)

Release implements vfs.FileDescriptionImpl.Release.

func (*Socket) SendMsg

func (s *Socket) SendMsg(t *kernel.Task, src usermem.IOSequence, to []byte, flags int, haveDeadline bool, deadline ktime.Time, controlMessages socket.ControlMessages) (int, *syserr.Error)

SendMsg implements socket.Socket.SendMsg.

func (*Socket) SetSockOpt

func (s *Socket) SetSockOpt(t *kernel.Task, level int, name int, opt []byte) *syserr.Error

SetSockOpt implements socket.Socket.SetSockOpt.

func (*Socket) Shutdown

func (s *Socket) Shutdown(t *kernel.Task, how int) *syserr.Error

Shutdown implements socket.Socket.Shutdown.

func (*Socket) Stack

func (s *Socket) Stack() inet.Stack

Stack returns the network stack associated with the socket.

func (*Socket) State

func (s *Socket) State() uint32

State implements socket.Socket.State.

func (*Socket) Type

func (s *Socket) Type() (family int, skType linux.SockType, protocol int)

Type implements socket.Socket.Type.

func (*Socket) Write

func (s *Socket) Write(ctx context.Context, src usermem.IOSequence, opts vfs.WriteOptions) (int64, error)

Write implements vfs.FileDescriptionImpl.

Source Files

provider.go socket.go

Directories

PathSynopsis
pkg/sentry/socket/netlink/nlmsgPackage nlmsg provides helpers to parse and construct netlink messages.
pkg/sentry/socket/netlink/portPackage port provides port ID allocation for netlink sockets.
pkg/sentry/socket/netlink/routePackage route provides a NETLINK_ROUTE socket protocol.
pkg/sentry/socket/netlink/ueventPackage uevent provides a NETLINK_KOBJECT_UEVENT socket protocol.
Version
v0.0.0-20250605235530-a6711d1e1dc6 (latest)
Published
Jun 5, 2025
Platform
linux/amd64
Imports
27 packages
Last checked
4 hours ago

Tools for package owners.