Copyright | (c) Formaltech Inc. 2017 |
---|---|
License | BSD3 |
Maintainer | protob3n@gmail.com |
Stability | experimental |
Portability | Linux |
Safe Haskell | None |
Language | Haskell2010 |
A netlink packet contains a top-level header (struct nlmsghdr
from
linux/netlink.h
), a second-level header that depends on the message type
(e.g., struct ifinfomsg
from linux/if_link.h
), and a possibly nested
collection of attributes (see System.Linux.RTNetlink.Packet).
The way to create a netlink packet in RTNetlink is to instantiate either the
Message
or the Reply
class, which entails specifying what the header type
should be. You can then instantiate any of the Create
, Destroy
, Change
,
or Request
classes to indicate which kinds of actions the message can be used
to perform.
Synopsis
- type SequenceNumber = Word32
- sequenceNumber :: ByteString -> SequenceNumber
- data NLMsgErr = NLMsgErr {}
- class (Show h, Eq h, Sized h, Serialize h) => Header h where
- type HeaderPart h
- fromHeaderParts :: [HeaderPart h] -> h
- emptyHeader :: h
- class Header h => CreateMessageHeader h where
- createTypeNumber :: h -> TypeNumber
- class Header h => DestroyMessageHeader h where
- destroyTypeNumber :: h -> TypeNumber
- class Header h => ChangeMessageHeader h where
- changeTypeNumber :: h -> TypeNumber
- class Header h => RequestMessageHeader h where
- requestTypeNumber :: h -> TypeNumber
- class Header h => ReplyMessageHeader h where
- replyTypeNumbers :: h -> [TypeNumber]
- class Header (MessageHeader m) => Message m where
- type MessageHeader m
- messageHeaderParts :: m -> [HeaderPart (MessageHeader m)]
- messageAttrs :: m -> AttributeList
- messageHeader :: Message m => m -> MessageHeader m
- toNLMessage :: Message m => m -> (MessageHeader m -> TypeNumber) -> NLFlags -> SequenceNumber -> NLMessage (MessageHeader m)
- class (Message c, CreateMessageHeader (MessageHeader c)) => Create c
- createNLMessage :: Create c => c -> SequenceNumber -> NLMessage (MessageHeader c)
- class (Message d, DestroyMessageHeader (MessageHeader d)) => Destroy d
- destroyNLMessage :: Destroy d => d -> SequenceNumber -> NLMessage (MessageHeader d)
- class (Message id, ChangeMessageHeader (MessageHeader id)) => Change id c where
- changeHeaderParts :: id -> c -> [HeaderPart (MessageHeader id)]
- changeAttrs :: id -> c -> AttributeList
- changeNLMessage :: Change id c => id -> c -> SequenceNumber -> NLMessage (MessageHeader id)
- class (Message r, RequestMessageHeader (MessageHeader r)) => Request r where
- requestNLFlags :: r -> ChangeFlags NLFlags
- requestNLMessage :: Request r => r -> SequenceNumber -> NLMessage (MessageHeader r)
- dumpOne :: a -> ChangeFlags NLFlags
- dumpMany :: a -> ChangeFlags NLFlags
- class ReplyMessageHeader (ReplyHeader r) => Reply r where
- type ReplyHeader r
- fromNLMessage :: NLMessage (ReplyHeader r) -> Maybe r
Documentation
type SequenceNumber = Word32 Source #
Sequence number for an NlMsgHdr
.
sequenceNumber :: ByteString -> SequenceNumber Source #
Get the sequence number of a message started by an NLMsgHdr
.
The header of an error sent in response to a bad netlink message. The
numeric values correspond to negated values from Foreign.C.Error. Try
running man 3 errno
for more information.
Instances
Eq NLMsgErr Source # | |
Show NLMsgErr Source # | |
Serialize NLMsgErr Source # | |
Sized NLMsgErr Source # | |
ReplyMessageHeader NLMsgErr Source # | |
Defined in System.Linux.RTNetlink.Message replyTypeNumbers :: NLMsgErr -> [TypeNumber] Source # | |
Header NLMsgErr Source # | |
Defined in System.Linux.RTNetlink.Message type HeaderPart NLMsgErr :: Type Source # fromHeaderParts :: [HeaderPart NLMsgErr] -> NLMsgErr Source # | |
type HeaderPart NLMsgErr Source # | |
Defined in System.Linux.RTNetlink.Message |
class (Show h, Eq h, Sized h, Serialize h) => Header h where Source #
Class of things that can be used as second-level netlink headers.
type HeaderPart h Source #
Components for a Header
, so they can be combined.
fromHeaderParts :: [HeaderPart h] -> h Source #
How to construct a Header
from a list of HeaderPart
s. An empty list
should correspond to emptyHeader
.
emptyHeader :: h Source #
Default header for a message, if none is specified.
Instances
Header () Source # | |
Defined in System.Linux.RTNetlink.Message type HeaderPart () :: Type Source # fromHeaderParts :: [HeaderPart ()] -> () Source # emptyHeader :: () Source # | |
Header NLMsgErr Source # | |
Defined in System.Linux.RTNetlink.Message type HeaderPart NLMsgErr :: Type Source # fromHeaderParts :: [HeaderPart NLMsgErr] -> NLMsgErr Source # | |
Header IfInfoMsg Source # | |
Defined in System.Linux.RTNetlink.Link type HeaderPart IfInfoMsg :: Type Source # | |
Header IfAddrMsg Source # | |
Defined in System.Linux.RTNetlink.Address type HeaderPart IfAddrMsg :: Type Source # |
class Header h => CreateMessageHeader h where Source #
Class of headers that can be used to create things.
createTypeNumber :: h -> TypeNumber Source #
The top-level type number associated with create messages with this header.
Instances
CreateMessageHeader IfInfoMsg Source # | |
Defined in System.Linux.RTNetlink.Link | |
CreateMessageHeader IfAddrMsg Source # | |
Defined in System.Linux.RTNetlink.Address |
class Header h => DestroyMessageHeader h where Source #
Class of headers that can be used to destroy things.
destroyTypeNumber :: h -> TypeNumber Source #
The top-level type number associated with destroy messages with this header.
Instances
DestroyMessageHeader IfInfoMsg Source # | |
Defined in System.Linux.RTNetlink.Link | |
DestroyMessageHeader IfAddrMsg Source # | |
Defined in System.Linux.RTNetlink.Address |
class Header h => ChangeMessageHeader h where Source #
Class of headers that can be used to change things.
changeTypeNumber :: h -> TypeNumber Source #
The top-level type number associated with change messages with this header.
Instances
ChangeMessageHeader IfInfoMsg Source # | |
Defined in System.Linux.RTNetlink.Link |
class Header h => RequestMessageHeader h where Source #
Class of headers that can be used to request things.
requestTypeNumber :: h -> TypeNumber Source #
The top-level type number associated with request messages with this header.
Instances
RequestMessageHeader IfInfoMsg Source # | |
Defined in System.Linux.RTNetlink.Link | |
RequestMessageHeader IfAddrMsg Source # | |
Defined in System.Linux.RTNetlink.Address |
class Header h => ReplyMessageHeader h where Source #
Class of headers that can be received in reply messages.
replyTypeNumbers :: h -> [TypeNumber] Source #
The expected top-level type number(s) that mark a packet replies with this header can be parsed from.
Instances
ReplyMessageHeader () Source # | |
Defined in System.Linux.RTNetlink.Message replyTypeNumbers :: () -> [TypeNumber] Source # | |
ReplyMessageHeader NLMsgErr Source # | |
Defined in System.Linux.RTNetlink.Message replyTypeNumbers :: NLMsgErr -> [TypeNumber] Source # | |
ReplyMessageHeader IfInfoMsg Source # | |
Defined in System.Linux.RTNetlink.Link replyTypeNumbers :: IfInfoMsg -> [TypeNumber] Source # | |
ReplyMessageHeader IfAddrMsg Source # | |
Defined in System.Linux.RTNetlink.Address replyTypeNumbers :: IfAddrMsg -> [TypeNumber] Source # |
class Header (MessageHeader m) => Message m where Source #
Class of things that can be sent as messages.
Nothing
type MessageHeader m Source #
The type of header to attach to the message.
messageHeaderParts :: m -> [HeaderPart (MessageHeader m)] Source #
Parts to construct a header corresponding to a message. Defaults
to []
.
messageAttrs :: m -> AttributeList Source #
Construct netlink attributes corresponding to a message. Defaults
to []
.
Instances
messageHeader :: Message m => m -> MessageHeader m Source #
Produce a MessageHeader
from a Message
using messageHeaderParts
.
toNLMessage :: Message m => m -> (MessageHeader m -> TypeNumber) -> NLFlags -> SequenceNumber -> NLMessage (MessageHeader m) Source #
Produce an NLMessage
suitable for sending over the wire.
class (Message c, CreateMessageHeader (MessageHeader c)) => Create c Source #
Class of Message
s representing things that can be created.
Instances
createNLMessage :: Create c => c -> SequenceNumber -> NLMessage (MessageHeader c) Source #
Produce an NLMessage suitable for sending over the wire.
class (Message d, DestroyMessageHeader (MessageHeader d)) => Destroy d Source #
Class of Message
s representing things that can be destroyed.
Instances
Destroy LinkName Source # | |
Defined in System.Linux.RTNetlink.Link | |
Destroy LinkIndex Source # | |
Defined in System.Linux.RTNetlink.Link | |
Destroy IfInet6Address Source # | |
Defined in System.Linux.RTNetlink.Address | |
Destroy IfInetAddress Source # | |
Defined in System.Linux.RTNetlink.Address | |
(Destroy d, Destroy e, MessageHeader d ~ MessageHeader e) => Destroy (d, e) Source # | |
Defined in System.Linux.RTNetlink.Message |
destroyNLMessage :: Destroy d => d -> SequenceNumber -> NLMessage (MessageHeader d) Source #
Produce an NLMessage suitable for sending over the wire.
class (Message id, ChangeMessageHeader (MessageHeader id)) => Change id c where Source #
Class of Message
s representing pairs of identifying messages and
quality that can be modified.
Nothing
changeHeaderParts :: id -> c -> [HeaderPart (MessageHeader id)] Source #
Construct a list of HeaderPart
s from an identifier and a quality. By
default, use the identifying message's messageHeaderParts
.
changeAttrs :: id -> c -> AttributeList Source #
Construct an AttributeList
from an identifier and a quality. By
default, use the identifying message's messageAttrs
.
Instances
changeNLMessage :: Change id c => id -> c -> SequenceNumber -> NLMessage (MessageHeader id) Source #
Produce an NLMessage suitable for sending over the wire.
class (Message r, RequestMessageHeader (MessageHeader r)) => Request r where Source #
Class of Message
s that can serve as requests.
requestNLFlags :: r -> ChangeFlags NLFlags Source #
The top-level flags associated with this request.
Instances
Request LinkType Source # | |
Defined in System.Linux.RTNetlink.Link | |
Request AnyLink Source # | |
Defined in System.Linux.RTNetlink.Link | |
Request LinkName Source # | |
Defined in System.Linux.RTNetlink.Link | |
Request LinkIndex Source # | |
Defined in System.Linux.RTNetlink.Link | |
Request AnyInterface Source # | |
Defined in System.Linux.RTNetlink.Address | |
(Request r, Request s, MessageHeader r ~ MessageHeader s) => Request (r, s) Source # | |
Defined in System.Linux.RTNetlink.Message requestNLFlags :: (r, s) -> ChangeFlags NLFlags Source # |
requestNLMessage :: Request r => r -> SequenceNumber -> NLMessage (MessageHeader r) Source #
Produce an NLMessage
suitable for sending over the wire.
dumpOne :: a -> ChangeFlags NLFlags Source #
Top-level flags to indicate that calling dump
is expected to yield a
single Reply
.
dumpMany :: a -> ChangeFlags NLFlags Source #
Top-level flags to indicate that calling dump
is expected to yield a
multiple Reply
s.
class ReplyMessageHeader (ReplyHeader r) => Reply r where Source #
Class of things that can be received.
type ReplyHeader r Source #
The type of header associated with this Reply
.
fromNLMessage :: NLMessage (ReplyHeader r) -> Maybe r Source #
Interpret a received NLMessage.