Documentation ¶
Overview ¶
Package netlink provides core functionality for netlink sockets.
Index ¶
- func ExtractSockAddr(b []byte) (*linux.SockAddrNetlink, *syserr.Error)
- func RegisterProvider(protocol int, provider Provider)
- type AttrsView
- type BytesView
- type Message
- func (m *Message) Finalize() []byte
- func (m *Message) GetData(msg marshal.Marshallable) (AttrsView, bool)
- func (m *Message) Header() linux.NetlinkMessageHeader
- func (m *Message) Put(v marshal.Marshallable)
- func (m *Message) PutAttr(atype uint16, v marshal.Marshallable)
- func (m *Message) PutAttrString(atype uint16, s string)
- type MessageSet
- type Protocol
- type Provider
- type Socket
- func (s *Socket) Accept(t *kernel.Task, peerRequested bool, flags int, blocking bool) (int32, linux.SockAddr, uint32, *syserr.Error)
- func (s *Socket) Bind(t *kernel.Task, sockaddr []byte) *syserr.Error
- func (s *Socket) Connect(t *kernel.Task, sockaddr []byte, blocking bool) *syserr.Error
- func (s *Socket) ConnectedPasscred() bool
- func (s *Socket) EventRegister(e *waiter.Entry, mask waiter.EventMask)
- func (s *Socket) EventUnregister(e *waiter.Entry)
- func (s *Socket) GetPeerName(t *kernel.Task) (linux.SockAddr, uint32, *syserr.Error)
- func (s *Socket) GetSockName(t *kernel.Task) (linux.SockAddr, uint32, *syserr.Error)
- func (s *Socket) GetSockOpt(t *kernel.Task, level int, name int, outPtr hostarch.Addr, outLen int) (marshal.Marshallable, *syserr.Error)
- func (*Socket) Ioctl(context.Context, *fs.File, usermem.IO, arch.SyscallArguments) (uintptr, error)
- func (s *Socket) Listen(t *kernel.Task, backlog int) *syserr.Error
- func (s *Socket) Passcred() bool
- func (s *Socket) Read(ctx context.Context, _ *fs.File, dst usermem.IOSequence, _ int64) (int64, error)
- func (s *Socket) Readiness(mask waiter.EventMask) waiter.EventMask
- func (s *Socket) RecvMsg(t *kernel.Task, dst usermem.IOSequence, flags int, haveDeadline bool, ...) (int, int, linux.SockAddr, uint32, socket.ControlMessages, *syserr.Error)
- func (s *Socket) Release(ctx context.Context)
- func (s *Socket) SendMsg(t *kernel.Task, src usermem.IOSequence, to []byte, flags int, ...) (int, *syserr.Error)
- func (s *Socket) SetSockOpt(t *kernel.Task, level int, name int, opt []byte) *syserr.Error
- func (s *Socket) Shutdown(t *kernel.Task, how int) *syserr.Error
- func (s *Socket) State() uint32
- func (s *Socket) StateFields() []string
- func (s *Socket) StateLoad(stateSourceObject state.Source)
- func (s *Socket) StateSave(stateSinkObject state.Sink)
- func (s *Socket) StateTypeName() string
- func (s *Socket) Type() (family int, skType linux.SockType, protocol int)
- func (s *Socket) Write(ctx context.Context, _ *fs.File, src usermem.IOSequence, _ int64) (int64, error)
- type SocketVFS2
- func (s *SocketVFS2) Accept(t *kernel.Task, peerRequested bool, flags int, blocking bool) (int32, linux.SockAddr, uint32, *syserr.Error)
- func (s *SocketVFS2) Bind(t *kernel.Task, sockaddr []byte) *syserr.Error
- func (s *SocketVFS2) Connect(t *kernel.Task, sockaddr []byte, blocking bool) *syserr.Error
- func (s *SocketVFS2) ConnectedPasscred() bool
- func (s *SocketVFS2) EventRegister(e *waiter.Entry, mask waiter.EventMask)
- func (s *SocketVFS2) EventUnregister(e *waiter.Entry)
- func (s *SocketVFS2) GetPeerName(t *kernel.Task) (linux.SockAddr, uint32, *syserr.Error)
- func (s *SocketVFS2) GetSockName(t *kernel.Task) (linux.SockAddr, uint32, *syserr.Error)
- func (s *SocketVFS2) GetSockOpt(t *kernel.Task, level int, name int, outPtr hostarch.Addr, outLen int) (marshal.Marshallable, *syserr.Error)
- func (*SocketVFS2) Ioctl(context.Context, usermem.IO, arch.SyscallArguments) (uintptr, error)
- func (s *SocketVFS2) Listen(t *kernel.Task, backlog int) *syserr.Error
- func (s *SocketVFS2) PRead(ctx context.Context, dst usermem.IOSequence, offset int64, ...) (int64, error)
- func (s *SocketVFS2) PWrite(ctx context.Context, src usermem.IOSequence, offset int64, ...) (int64, error)
- func (s *SocketVFS2) Passcred() bool
- func (s *SocketVFS2) Read(ctx context.Context, dst usermem.IOSequence, opts vfs.ReadOptions) (int64, error)
- func (s *SocketVFS2) Readiness(mask waiter.EventMask) waiter.EventMask
- func (s *SocketVFS2) RecvMsg(t *kernel.Task, dst usermem.IOSequence, flags int, haveDeadline bool, ...) (int, int, linux.SockAddr, uint32, socket.ControlMessages, *syserr.Error)
- func (s *SocketVFS2) Release(ctx context.Context)
- func (s *SocketVFS2) SendMsg(t *kernel.Task, src usermem.IOSequence, to []byte, flags int, ...) (int, *syserr.Error)
- func (s *SocketVFS2) SetSockOpt(t *kernel.Task, level int, name int, opt []byte) *syserr.Error
- func (s *SocketVFS2) Shutdown(t *kernel.Task, how int) *syserr.Error
- func (s *SocketVFS2) State() uint32
- func (s *SocketVFS2) StateFields() []string
- func (s *SocketVFS2) StateLoad(stateSourceObject state.Source)
- func (s *SocketVFS2) StateSave(stateSinkObject state.Sink)
- func (s *SocketVFS2) StateTypeName() string
- func (s *SocketVFS2) Type() (family int, skType linux.SockType, protocol int)
- func (s *SocketVFS2) Write(ctx context.Context, src usermem.IOSequence, opts vfs.WriteOptions) (int64, error)
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ExtractSockAddr ¶
func ExtractSockAddr(b []byte) (*linux.SockAddrNetlink, *syserr.Error)
ExtractSockAddr extracts the SockAddrNetlink from b.
func RegisterProvider ¶
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 AttrsView ¶
type AttrsView []byte
AttrsView is a view into the attributes portion of a netlink message.
func (AttrsView) ParseFirst ¶
func (v AttrsView) ParseFirst() (hdr linux.NetlinkAttrHeader, value []byte, rest AttrsView, ok bool)
ParseFirst parses first netlink attribute at the beginning of v.
type BytesView ¶
type BytesView []byte
BytesView supports extracting data from a byte slice with bounds checking.
type Message ¶
type Message struct {
// contains filtered or unexported fields
}
Message contains a complete serialized netlink message.
func NewMessage ¶
func NewMessage(hdr linux.NetlinkMessageHeader) *Message
NewMessage creates a new Message containing the passed header.
The header length will be updated by Finalize.
func ParseMessage ¶
ParseMessage parses the first message seen at buf, returning the rest of the buffer. If message is malformed, ok of false is returned. For last message, padding check is loose, if there isn't enought padding, whole buf is consumed and ok is set to true.
func (*Message) Finalize ¶
Finalize returns the []byte containing the entire message, with the total length set in the message header. The Message must not be modified after calling Finalize.
func (*Message) GetData ¶
func (m *Message) GetData(msg marshal.Marshallable) (AttrsView, bool)
GetData unmarshals the payload message header from this netlink message, and returns the attributes portion.
func (*Message) Header ¶
func (m *Message) Header() linux.NetlinkMessageHeader
Header returns the header of this message.
func (*Message) Put ¶
func (m *Message) Put(v marshal.Marshallable)
Put serializes v into the message.
func (*Message) PutAttr ¶
func (m *Message) PutAttr(atype uint16, v marshal.Marshallable)
PutAttr adds v to the message as a netlink attribute.
Preconditions: The serialized attribute (linux.NetlinkAttrHeaderSize + v.SizeBytes()) fits in math.MaxUint16 bytes.
func (*Message) PutAttrString ¶
PutAttrString adds s to the message as a netlink attribute.
type MessageSet ¶
type MessageSet struct { // Multi indicates that this a multi-part message, to be terminated by // NLMSG_DONE. NLMSG_DONE is sent even if the set contains only one // Message. // // If Multi is set, all added messages will have NLM_F_MULTI set. Multi bool // PortID is the destination port for all messages. PortID int32 // Seq is the sequence counter for all messages in the set. Seq uint32 // Messages contains the messages in the set. Messages []*Message }
MessageSet contains a series of netlink messages.
func NewMessageSet ¶
func NewMessageSet(portID int32, seq uint32) *MessageSet
NewMessageSet creates a new MessageSet.
portID is the destination port to set as PortID in all messages.
seq is the sequence counter to set as seq in all messages in the set.
func (*MessageSet) AddMessage ¶
func (ms *MessageSet) AddMessage(hdr linux.NetlinkMessageHeader) *Message
AddMessage adds a new message to the set and returns it for further additions.
The passed header will have Seq, PortID and the multi flag set automatically.
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, msg *Message, ms *MessageSet) *syserr.Error }
Protocol is the implementation of a netlink socket protocol.
type Provider ¶
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 { fsutil.FilePipeSeek `state:"nosave"` fsutil.FileNotDirReaddir `state:"nosave"` fsutil.FileNoFsync `state:"nosave"` fsutil.FileNoMMap `state:"nosave"` fsutil.FileNoSplice `state:"nosave"` fsutil.FileNoopFlush `state:"nosave"` fsutil.FileUseInodeUnstableAttr `state:"nosave"` // 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 (*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) ConnectedPasscred ¶
func (s *Socket) ConnectedPasscred() bool
ConnectedPasscred implements transport.Credentialer.ConnectedPasscred.
func (*Socket) EventRegister ¶
EventRegister implements waiter.Waitable.EventRegister.
func (*Socket) EventUnregister ¶
EventUnregister implements waiter.Waitable.EventUnregister.
func (*Socket) GetPeerName ¶
GetPeerName implements socket.Socket.GetPeerName.
func (*Socket) GetSockName ¶
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) Passcred ¶
func (s *Socket) Passcred() bool
Passcred implements transport.Credentialer.Passcred.
func (*Socket) Read ¶
func (s *Socket) Read(ctx context.Context, _ *fs.File, dst usermem.IOSequence, _ int64) (int64, error)
Read implements fs.FileOperations.Read.
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) 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 ¶
SetSockOpt implements socket.Socket.SetSockOpt.
func (*Socket) StateFields ¶
func (*Socket) StateTypeName ¶
type SocketVFS2 ¶
type SocketVFS2 struct { vfs.FileDescriptionDefaultImpl vfs.DentryMetadataFileDescriptionImpl vfs.LockFD // contains filtered or unexported fields }
SocketVFS2 is the base VFS2 socket type for netlink sockets.
This implementation only supports userspace sending and receiving messages to/from the kernel.
SocketVFS2 implements socket.SocketVFS2 and transport.Credentialer.
+stateify savable
func (*SocketVFS2) Accept ¶
func (s *SocketVFS2) Accept(t *kernel.Task, peerRequested bool, flags int, blocking bool) (int32, linux.SockAddr, uint32, *syserr.Error)
Accept implements socket.Socket.Accept.
func (*SocketVFS2) ConnectedPasscred ¶
func (s *SocketVFS2) ConnectedPasscred() bool
ConnectedPasscred implements transport.Credentialer.ConnectedPasscred.
func (*SocketVFS2) EventRegister ¶
func (s *SocketVFS2) EventRegister(e *waiter.Entry, mask waiter.EventMask)
EventRegister implements waiter.Waitable.EventRegister.
func (*SocketVFS2) EventUnregister ¶
func (s *SocketVFS2) EventUnregister(e *waiter.Entry)
EventUnregister implements waiter.Waitable.EventUnregister.
func (*SocketVFS2) GetPeerName ¶
GetPeerName implements socket.Socket.GetPeerName.
func (*SocketVFS2) GetSockName ¶
GetSockName implements socket.Socket.GetSockName.
func (*SocketVFS2) GetSockOpt ¶
func (s *SocketVFS2) GetSockOpt(t *kernel.Task, level int, name int, outPtr hostarch.Addr, outLen int) (marshal.Marshallable, *syserr.Error)
GetSockOpt implements socket.Socket.GetSockOpt.
func (*SocketVFS2) Ioctl ¶
func (*SocketVFS2) Ioctl(context.Context, usermem.IO, arch.SyscallArguments) (uintptr, error)
Ioctl implements vfs.FileDescriptionImpl.
func (*SocketVFS2) PRead ¶
func (s *SocketVFS2) PRead(ctx context.Context, dst usermem.IOSequence, offset int64, opts vfs.ReadOptions) (int64, error)
PRead implements vfs.FileDescriptionImpl.
func (*SocketVFS2) PWrite ¶
func (s *SocketVFS2) PWrite(ctx context.Context, src usermem.IOSequence, offset int64, opts vfs.WriteOptions) (int64, error)
PWrite implements vfs.FileDescriptionImpl.
func (*SocketVFS2) Passcred ¶
func (s *SocketVFS2) Passcred() bool
Passcred implements transport.Credentialer.Passcred.
func (*SocketVFS2) Read ¶
func (s *SocketVFS2) Read(ctx context.Context, dst usermem.IOSequence, opts vfs.ReadOptions) (int64, error)
Read implements vfs.FileDescriptionImpl.
func (*SocketVFS2) Readiness ¶
func (s *SocketVFS2) Readiness(mask waiter.EventMask) waiter.EventMask
Readiness implements waiter.Waitable.Readiness.
func (*SocketVFS2) RecvMsg ¶
func (s *SocketVFS2) 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 (*SocketVFS2) Release ¶
func (s *SocketVFS2) Release(ctx context.Context)
Release implements vfs.FileDescriptionImpl.Release.
func (*SocketVFS2) SendMsg ¶
func (s *SocketVFS2) 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 (*SocketVFS2) SetSockOpt ¶
SetSockOpt implements socket.Socket.SetSockOpt.
func (*SocketVFS2) State ¶
func (s *SocketVFS2) State() uint32
State implements socket.Socket.State.
func (*SocketVFS2) StateFields ¶
func (s *SocketVFS2) StateFields() []string
func (*SocketVFS2) StateLoad ¶
func (s *SocketVFS2) StateLoad(stateSourceObject state.Source)
+checklocksignore
func (*SocketVFS2) StateSave ¶
func (s *SocketVFS2) StateSave(stateSinkObject state.Sink)
+checklocksignore
func (*SocketVFS2) StateTypeName ¶
func (s *SocketVFS2) StateTypeName() string
func (*SocketVFS2) Write ¶
func (s *SocketVFS2) Write(ctx context.Context, src usermem.IOSequence, opts vfs.WriteOptions) (int64, error)
Write implements vfs.FileDescriptionImpl.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package port provides port ID allocation for netlink sockets.
|
Package port provides port ID allocation for netlink sockets. |
Package route provides a NETLINK_ROUTE socket protocol.
|
Package route provides a NETLINK_ROUTE socket protocol. |
Package uevent provides a NETLINK_KOBJECT_UEVENT socket protocol.
|
Package uevent provides a NETLINK_KOBJECT_UEVENT socket protocol. |