-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Manipulate network devices, addresses, and routes on Linux -- -- A high-level, extensible, pure-Haskell interface to the ROUTE_NETLINK -- subsystem of netlink for manipulating network devices on Linux. -- RTNetlink provides the RTNL monad to simplify sending and receiving -- messages, pre-built types for manipulating devices and addresses, and -- typeclasses for creating your own messages, based on linux/netlink.h, -- linux/rtnetlink.h, et al. @package rtnetlink @version 0.2.0.0 module System.Linux.RTNetlink.Packet -- | ADT corresponding to struct nlmsghdr from -- linux/netlink.h. data NLMsgHdr NLMsgHdr :: Word32 -> Word16 -> Word16 -> Word32 -> Word32 -> NLMsgHdr -- | Total message length (nlmsg_len). [nlMsgLength] :: NLMsgHdr -> Word32 -- | Message type (nlmsg_type). [nlMsgType] :: NLMsgHdr -> Word16 -- | Top-level flags (nlmsg_flags). [nlMsgFlags] :: NLMsgHdr -> Word16 -- | Sequence number (nlmsg_seq). [nlMsgSeqNum] :: NLMsgHdr -> Word32 -- | Destination address (nlmsg_pid). [nlMsgPid] :: NLMsgHdr -> Word32 -- | Return True iff the message is an error, assuming the -- provided ByteString is headed by an NLMsgHdr. nlMsgHdrIsError :: ByteString -> Bool -- | Split a ByteString into multiple messages using their -- NLMsgHdrs. splitMessages :: ByteString -> [ByteString] -- | ADT representing a possibly nested netlink attribute. data Attribute -- | Simple attribute. Attribute :: AttributeType -> ByteString -> Attribute -- | Nested attribute. AttributeNest :: AttributeType -> [Attribute] -> Attribute -- | Composable attribute. AttributePart :: AttributeType -> ByteString -> ByteString -> Attribute -- | A collection of netlink attributes. newtype AttributeList AttributeList :: [Attribute] -> AttributeList -- | Type identifier for an Attribute. type AttributeType = Word16 -- | Get the type of an Attribute. attributeType :: Attribute -> AttributeType -- | Get the data from a simple Attribute. attributeData :: Attribute -> Maybe ByteString -- | Search for an Attribute in a possibly nested list using the -- AttributeType to look for at each level. Unfortunately, the -- kernel does not presently seem to set NLA_F_NESTED on nested attribute -- types. Until this is changed in the kernel, we need to traverse nested -- elements manually. findAttribute :: [AttributeType] -> AttributeList -> Maybe Attribute -- | Search for an Attribute and return its data field. findAttributeData :: [AttributeType] -> AttributeList -> Maybe ByteString -- | Search for an Attribute; decode and return its data field. findAttributeDecode :: Serialize a => [AttributeType] -> AttributeList -> Maybe a -- | Search for an Attribute, run a getter on it, and return the -- result. findAttributeGet :: Get a -> [AttributeType] -> AttributeList -> Maybe a -- | Search for an Attribute and return its data field, minus any -- null bytes. findAttributeCString :: [AttributeType] -> AttributeList -> Maybe ByteString -- | Construct an Attribute with a null-byte-terminated string as -- data. cStringAttr :: AttributeType -> ByteString -> Attribute -- | Construct an Attribute with a 32-bit word in host byte-order as -- data. word32Attr :: AttributeType -> Word32 -> Attribute -- | Composable Attribute with a 32-bit word in host byte-order as -- data. The second Word32 argument is a mask of bits we care -- about so that this attribute can be combined with others of the same -- type. word32AttrPart :: AttributeType -> Word32 -> Word32 -> Attribute -- | Construct an Attribute with a 16-bit word in host byte-order as -- data. word16Attr :: AttributeType -> Word16 -> Attribute -- | Composable Attribute with a 16-bit word in host byte-order as -- data. The second Word16 argument is a mask of bits we care -- about so that this attribute can be combined with others of the same -- type. word16AttrPart :: AttributeType -> Word16 -> Word16 -> Attribute -- | Typeclass for data with a defined size. This lets us get sizes to use -- for constructing headers. class Sized s -- | Size of data. size :: (Sized s, Integral i) => s -> i -- | Size of data with alignment padding added. sizeAligned :: (Sized s, Integral a) => a -> s -> a -- | Pad a ByteString to a given alignment. putAligned :: Integral a => a -> Putter ByteString -- | A flags bitfield encoded as a set of changes to an initial value, -- which can can be combined using the Monoid instance. This -- Monoid instance is *not* commutative. Flags set or cleared on -- the right will override those on the left. data ChangeFlags a ChangeFlags :: a -> a -> ChangeFlags a -- | Flag bits [cfFlags] :: ChangeFlags a -> a -- | Mask of flag bits to use. Other bits will be ignored. [cfMask] :: ChangeFlags a -> a -- | Apply a change to an existing flags bitfield. applyChangeFlags :: Bits a => ChangeFlags a -> a -> a -- | Apply a change to the all-zeroes bit field. applyChangeFlags' :: Bits a => ChangeFlags a -> a -- | Set cfFlags and cfMask to the same value. setChangeFlags :: Bits a => a -> ChangeFlags a instance GHC.Show.Show a => GHC.Show.Show (System.Linux.RTNetlink.Packet.ChangeFlags a) instance GHC.Classes.Eq System.Linux.RTNetlink.Packet.AttributeList instance GHC.Show.Show System.Linux.RTNetlink.Packet.AttributeList instance GHC.Classes.Eq System.Linux.RTNetlink.Packet.Attribute instance GHC.Show.Show System.Linux.RTNetlink.Packet.Attribute instance GHC.Classes.Eq System.Linux.RTNetlink.Packet.NLMsgHdr instance GHC.Show.Show System.Linux.RTNetlink.Packet.NLMsgHdr instance Data.Bits.Bits a => GHC.Classes.Eq (System.Linux.RTNetlink.Packet.ChangeFlags a) instance (Data.Bits.Bits a, Data.Bits.FiniteBits a) => GHC.Base.Semigroup (System.Linux.RTNetlink.Packet.ChangeFlags a) instance (Data.Bits.Bits a, Data.Bits.FiniteBits a) => GHC.Base.Monoid (System.Linux.RTNetlink.Packet.ChangeFlags a) instance System.Linux.RTNetlink.Packet.Sized System.Linux.RTNetlink.Packet.Attribute instance Data.Serialize.Serialize System.Linux.RTNetlink.Packet.Attribute instance GHC.Base.Semigroup System.Linux.RTNetlink.Packet.AttributeList instance GHC.Base.Monoid System.Linux.RTNetlink.Packet.AttributeList instance System.Linux.RTNetlink.Packet.Sized System.Linux.RTNetlink.Packet.AttributeList instance Data.Serialize.Serialize System.Linux.RTNetlink.Packet.AttributeList instance GHC.Classes.Ord System.Linux.RTNetlink.Packet.Attribute instance System.Linux.RTNetlink.Packet.Sized System.Linux.RTNetlink.Packet.NLMsgHdr instance System.Linux.RTNetlink.Packet.Sized () instance System.Linux.RTNetlink.Packet.Sized Data.ByteString.Internal.ByteString instance Data.Serialize.Serialize System.Linux.RTNetlink.Packet.NLMsgHdr -- | 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. module System.Linux.RTNetlink.Message -- | Sequence number for an NlMsgHdr. type SequenceNumber = Word32 -- | Get the sequence number of a message started by an NLMsgHdr. sequenceNumber :: ByteString -> SequenceNumber -- | 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. data NLMsgErr NLMsgErr :: Int32 -> NLMsgHdr -> NLMsgErr -- | Negated numeric error code. [nleError] :: NLMsgErr -> Int32 -- | The header of the offending message. [nleHeader] :: NLMsgErr -> NLMsgHdr -- | Class of things that can be used as second-level netlink headers. class (Show h, Eq h, Sized h, Serialize h) => Header h where { -- | Components for a Header, so they can be combined. type family HeaderPart h; } -- | How to construct a Header from a list of HeaderParts. -- An empty list should correspond to emptyHeader. fromHeaderParts :: Header h => [HeaderPart h] -> h -- | Default header for a message, if none is specified. emptyHeader :: Header h => h -- | Class of headers that can be used to create things. class Header h => CreateMessageHeader h -- | The top-level type number associated with create messages with this -- header. createTypeNumber :: CreateMessageHeader h => h -> TypeNumber -- | Class of headers that can be used to destroy things. class Header h => DestroyMessageHeader h -- | The top-level type number associated with destroy messages with this -- header. destroyTypeNumber :: DestroyMessageHeader h => h -> TypeNumber -- | Class of headers that can be used to change things. class Header h => ChangeMessageHeader h -- | The top-level type number associated with change messages with this -- header. changeTypeNumber :: ChangeMessageHeader h => h -> TypeNumber -- | Class of headers that can be used to request things. class Header h => RequestMessageHeader h -- | The top-level type number associated with request messages with this -- header. requestTypeNumber :: RequestMessageHeader h => h -> TypeNumber -- | Class of headers that can be received in reply messages. class Header h => ReplyMessageHeader h -- | The expected top-level type number(s) that mark a packet replies with -- this header can be parsed from. replyTypeNumbers :: ReplyMessageHeader h => h -> [TypeNumber] -- | Class of things that can be sent as messages. class Header (MessageHeader m) => Message m where { -- | The type of header to attach to the message. type family MessageHeader m; } -- | Parts to construct a header corresponding to a message. Defaults to -- []. messageHeaderParts :: Message m => m -> [HeaderPart (MessageHeader m)] -- | Construct netlink attributes corresponding to a message. Defaults to -- []. messageAttrs :: Message m => m -> AttributeList -- | Produce a MessageHeader from a Message using -- messageHeaderParts. messageHeader :: Message m => m -> MessageHeader m -- | Produce an NLMessage suitable for sending over the wire. toNLMessage :: Message m => m -> (MessageHeader m -> TypeNumber) -> NLFlags -> SequenceNumber -> NLMessage (MessageHeader m) -- | Class of Messages representing things that can be created. class (Message c, CreateMessageHeader (MessageHeader c)) => Create c -- | Produce an NLMessage suitable for sending over the wire. createNLMessage :: Create c => c -> SequenceNumber -> NLMessage (MessageHeader c) -- | Class of Messages representing things that can be destroyed. class (Message d, DestroyMessageHeader (MessageHeader d)) => Destroy d -- | Produce an NLMessage suitable for sending over the wire. destroyNLMessage :: Destroy d => d -> SequenceNumber -> NLMessage (MessageHeader d) -- | Class of Messages representing pairs of identifying messages -- and quality that can be modified. class (Message id, ChangeMessageHeader (MessageHeader id)) => Change id c -- | Construct a list of HeaderParts from an identifier and a -- quality. By default, use the identifying message's -- messageHeaderParts. changeHeaderParts :: Change id c => id -> c -> [HeaderPart (MessageHeader id)] -- | Construct an AttributeList from an identifier and a quality. By -- default, use the identifying message's messageAttrs. changeAttrs :: Change id c => id -> c -> AttributeList -- | Produce an NLMessage suitable for sending over the wire. changeNLMessage :: Change id c => id -> c -> SequenceNumber -> NLMessage (MessageHeader id) -- | Class of Messages that can serve as requests. class (Message r, RequestMessageHeader (MessageHeader r)) => Request r -- | The top-level flags associated with this request. requestNLFlags :: Request r => r -> ChangeFlags NLFlags -- | Produce an NLMessage suitable for sending over the wire. requestNLMessage :: Request r => r -> SequenceNumber -> NLMessage (MessageHeader r) -- | Top-level flags to indicate that calling dump is expected to -- yield a single Reply. dumpOne :: a -> ChangeFlags NLFlags -- | Top-level flags to indicate that calling dump is expected to -- yield a multiple Replys. dumpMany :: a -> ChangeFlags NLFlags -- | Class of things that can be received. class ReplyMessageHeader (ReplyHeader r) => Reply r where { -- | The type of header associated with this Reply. type family ReplyHeader r; } -- | Interpret a received NLMessage. fromNLMessage :: Reply r => NLMessage (ReplyHeader r) -> Maybe r instance GHC.Classes.Eq System.Linux.RTNetlink.Message.NLMsgErrPart instance GHC.Show.Show System.Linux.RTNetlink.Message.NLMsgErrPart instance GHC.Classes.Eq System.Linux.RTNetlink.Message.NLMsgErr instance GHC.Show.Show System.Linux.RTNetlink.Message.NLMsgErr instance GHC.Classes.Eq header => GHC.Classes.Eq (System.Linux.RTNetlink.Message.NLMessage header) instance GHC.Show.Show header => GHC.Show.Show (System.Linux.RTNetlink.Message.NLMessage header) instance System.Linux.RTNetlink.Message.Request q => System.Linux.RTNetlink.Message.Dump q () instance System.Linux.RTNetlink.Message.Request q => System.Linux.RTNetlink.Message.Dump q Foreign.C.Error.Errno instance (System.Linux.RTNetlink.Message.Request r, System.Linux.RTNetlink.Message.Reply r) => System.Linux.RTNetlink.Message.Dump r r instance System.Linux.RTNetlink.Message.Dump q r => System.Linux.RTNetlink.Message.Dump q (GHC.Maybe.Maybe r) instance (System.Linux.RTNetlink.Message.Dump q r, System.Linux.RTNetlink.Message.Dump q s, System.Linux.RTNetlink.Message.ReplyHeader r Data.Type.Equality.~ System.Linux.RTNetlink.Message.ReplyHeader s) => System.Linux.RTNetlink.Message.Dump q (Data.Either.Either r s) instance (System.Linux.RTNetlink.Message.Dump q r1, System.Linux.RTNetlink.Message.Dump q r2, System.Linux.RTNetlink.Message.ReplyHeader r1 Data.Type.Equality.~ System.Linux.RTNetlink.Message.ReplyHeader r2) => System.Linux.RTNetlink.Message.Dump q (r1, r2) instance (System.Linux.RTNetlink.Message.Dump q1 r, System.Linux.RTNetlink.Message.Dump q2 r, System.Linux.RTNetlink.Message.MessageHeader q1 Data.Type.Equality.~ System.Linux.RTNetlink.Message.MessageHeader q2) => System.Linux.RTNetlink.Message.Dump (q1, q2) r instance (System.Linux.RTNetlink.Message.Dump q1 r1, System.Linux.RTNetlink.Message.Dump q2 r2, System.Linux.RTNetlink.Message.MessageHeader q1 Data.Type.Equality.~ System.Linux.RTNetlink.Message.MessageHeader q2, System.Linux.RTNetlink.Message.ReplyHeader r1 Data.Type.Equality.~ System.Linux.RTNetlink.Message.ReplyHeader r2) => System.Linux.RTNetlink.Message.Dump (q1, q2) (r1, r2) instance (System.Linux.RTNetlink.Message.Request q, System.Linux.RTNetlink.Message.Reply r, System.Linux.RTNetlink.Message.MessageHeader q Data.Type.Equality.~ System.Linux.RTNetlink.Message.ReplyHeader r) => System.Linux.RTNetlink.Message.Dump q r instance System.Linux.RTNetlink.Message.Reply () instance System.Linux.RTNetlink.Message.Reply Foreign.C.Error.Errno instance System.Linux.RTNetlink.Message.Reply r => System.Linux.RTNetlink.Message.Reply (GHC.Maybe.Maybe r) instance (System.Linux.RTNetlink.Message.Reply r, System.Linux.RTNetlink.Message.Reply s, System.Linux.RTNetlink.Message.ReplyHeader r Data.Type.Equality.~ System.Linux.RTNetlink.Message.ReplyHeader s) => System.Linux.RTNetlink.Message.Reply (Data.Either.Either r s) instance (System.Linux.RTNetlink.Message.Reply r, System.Linux.RTNetlink.Message.Reply s, System.Linux.RTNetlink.Message.ReplyHeader r Data.Type.Equality.~ System.Linux.RTNetlink.Message.ReplyHeader s) => System.Linux.RTNetlink.Message.Reply (r, s) instance (System.Linux.RTNetlink.Message.Request r, System.Linux.RTNetlink.Message.Request s, System.Linux.RTNetlink.Message.MessageHeader r Data.Type.Equality.~ System.Linux.RTNetlink.Message.MessageHeader s) => System.Linux.RTNetlink.Message.Request (r, s) instance (System.Linux.RTNetlink.Message.Change id c, System.Linux.RTNetlink.Message.Change id d) => System.Linux.RTNetlink.Message.Change id (c, d) instance (System.Linux.RTNetlink.Message.Change id1 c, System.Linux.RTNetlink.Message.Change id2 c, System.Linux.RTNetlink.Message.MessageHeader id1 Data.Type.Equality.~ System.Linux.RTNetlink.Message.MessageHeader id2) => System.Linux.RTNetlink.Message.Change (id1, id2) c instance (System.Linux.RTNetlink.Message.Destroy d, System.Linux.RTNetlink.Message.Destroy e, System.Linux.RTNetlink.Message.MessageHeader d Data.Type.Equality.~ System.Linux.RTNetlink.Message.MessageHeader e) => System.Linux.RTNetlink.Message.Destroy (d, e) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.Create d, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Message.MessageHeader d) => System.Linux.RTNetlink.Message.Create (c, d) instance (System.Linux.RTNetlink.Message.Message m, System.Linux.RTNetlink.Message.Message n, System.Linux.RTNetlink.Message.MessageHeader m Data.Type.Equality.~ System.Linux.RTNetlink.Message.MessageHeader n) => System.Linux.RTNetlink.Message.Message (m, n) instance System.Linux.RTNetlink.Message.ReplyMessageHeader System.Linux.RTNetlink.Message.NLMsgErr instance System.Linux.RTNetlink.Message.ReplyMessageHeader () instance System.Linux.RTNetlink.Message.Header System.Linux.RTNetlink.Message.NLMsgErr instance System.Linux.RTNetlink.Message.Header () instance System.Linux.RTNetlink.Packet.Sized System.Linux.RTNetlink.Message.NLMsgErr instance Data.Serialize.Serialize System.Linux.RTNetlink.Message.NLMsgErr instance System.Linux.RTNetlink.Packet.Sized header => System.Linux.RTNetlink.Packet.Sized (System.Linux.RTNetlink.Message.NLMessage header) instance (System.Linux.RTNetlink.Packet.Sized header, Data.Serialize.Serialize header) => Data.Serialize.Serialize (System.Linux.RTNetlink.Message.NLMessage header) module System.Linux.RTNetlink.Link -- | A link identified by its index. newtype LinkIndex LinkIndex :: Int -> LinkIndex -- | A link identified by its name. newtype LinkName LinkName :: ByteString -> LinkName -- | An ethernet address. data LinkEther LinkEther :: Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> LinkEther -- | An ethernet broadcast address. data LinkBroadcastEther LinkBroadcastEther :: Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> Word8 -> LinkBroadcastEther -- | Link wildcard. data AnyLink AnyLink :: AnyLink -- | The type of a link. data LinkType -- | A dummy interface. Dummy :: LinkType -- | A bridge interface. Bridge :: LinkType -- | An 802.1Q vlan interface. Dot1QVlan :: LinkIndex -> VlanId -> LinkType -- | An 802.1ad vlan interface. Dot1adVlan :: LinkIndex -> VlanId -> LinkType -- | Specify the link type name as a string. NamedLinkType :: ByteString -> LinkType -- | Tag id for a vlan interface. newtype VlanId VlanId :: Word16 -> VlanId -- | The master interface for this interface for this one. For example, a -- bridge interface. data LinkMaster Master :: LinkIndex -> LinkMaster NoMaster :: LinkMaster -- | The state of a link. data LinkState Up :: LinkState Down :: LinkState -- | A Promiscuous link accepts all frames at layer 2; a -- Chaste one accepts just those addressed to it and possibly ones -- sent to the broadcast address. data LinkPromiscuity Promiscuous :: LinkPromiscuity Chaste :: LinkPromiscuity -- | Whether to use ARP on the interface to resolve L3 addresses to L2 -- ones. data LinkArp Arp :: LinkArp NoArp :: LinkArp -- | Internal debug flag. If this is supported by the driver, it will -- generally spew some extra information into dmesg. data LinkDebug Debug :: LinkDebug NoDebug :: LinkDebug -- | Maximum transmission unit for a link. Note that some interface types, -- such as Bridges, don't allow this to be changed. newtype LinkMTU LinkMTU :: Word32 -> LinkMTU newtype LinkGroup LinkGroup :: Word32 -> LinkGroup data LinkStats LinkStats :: Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> Word64 -> LinkStats -- | Total packets received. [lsRxPackets] :: LinkStats -> Word64 -- | Total packets transmitted. [lsTxPackets] :: LinkStats -> Word64 -- | Total bytes received. [lsRxBytes] :: LinkStats -> Word64 -- | Total bytes transmitted. [lsTxBytes] :: LinkStats -> Word64 -- | Bad packets received. [lsRxErrors] :: LinkStats -> Word64 -- | Packet transmission problems. [lsTxErrors] :: LinkStats -> Word64 -- | Dropped due to full buffers. [lsRxDropped] :: LinkStats -> Word64 -- | Out of memory. [lsTxDropped] :: LinkStats -> Word64 -- | Multicast packets received. [lsMulticast] :: LinkStats -> Word64 -- | Packet collisions. [lsCollisions] :: LinkStats -> Word64 -- | Size/header mismatch. [lsRxLengthErrors] :: LinkStats -> Word64 -- | Receive ring-buffer overflow. [lsRxOverErrors] :: LinkStats -> Word64 -- | CRC errors. [lsRxCRCErrors] :: LinkStats -> Word64 -- | Frame-alignment errors. [lsRxFrameErrors] :: LinkStats -> Word64 -- | Receiver FIFO overrun. [lsRxFIFOErrors] :: LinkStats -> Word64 -- | Receiver missed packets. [lsRxMissedErrors] :: LinkStats -> Word64 [lsTxAbortedErrors] :: LinkStats -> Word64 [lsTxCarrierErrors] :: LinkStats -> Word64 [lsTxFIFOErrors] :: LinkStats -> Word64 [lsTxHeartbeatErrors] :: LinkStats -> Word64 [lsTxWindowErrors] :: LinkStats -> Word64 [lsRxCompressed] :: LinkStats -> Word64 [lsTxCompressed] :: LinkStats -> Word64 -- | Dropped due to lack of handler. [lsRxNoHandler] :: LinkStats -> Word64 -- | The header corresponding to link messages, based on struct -- ifinfomsg from linux/if_link.h. data IfInfoMsg IfInfoMsg :: Int32 -> Word32 -> IfInfoMsg -- | The index of the link. [ifIndex] :: IfInfoMsg -> Int32 -- | Operational flags of the link. [ifFlags] :: IfInfoMsg -> Word32 -- | Combinable components of an IfInfoMsg. data IfInfoMsgPart IfInfoMsgIndex :: Int32 -> IfInfoMsgPart IfInfoMsgFlags :: ChangeFlags Word32 -> IfInfoMsgPart instance GHC.Classes.Eq System.Linux.RTNetlink.Link.IfInfoMsgPart instance GHC.Show.Show System.Linux.RTNetlink.Link.IfInfoMsgPart instance GHC.Classes.Eq System.Linux.RTNetlink.Link.IfInfoMsg instance GHC.Show.Show System.Linux.RTNetlink.Link.IfInfoMsg instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkStats instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkStats instance GHC.Real.Integral System.Linux.RTNetlink.Link.LinkGroup instance GHC.Real.Real System.Linux.RTNetlink.Link.LinkGroup instance GHC.Enum.Enum System.Linux.RTNetlink.Link.LinkGroup instance GHC.Classes.Ord System.Linux.RTNetlink.Link.LinkGroup instance GHC.Num.Num System.Linux.RTNetlink.Link.LinkGroup instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkGroup instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkGroup instance GHC.Real.Integral System.Linux.RTNetlink.Link.LinkMTU instance GHC.Real.Real System.Linux.RTNetlink.Link.LinkMTU instance GHC.Enum.Enum System.Linux.RTNetlink.Link.LinkMTU instance GHC.Classes.Ord System.Linux.RTNetlink.Link.LinkMTU instance GHC.Num.Num System.Linux.RTNetlink.Link.LinkMTU instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkMTU instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkMTU instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkDebug instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkDebug instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkArp instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkArp instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkPromiscuity instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkPromiscuity instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkState instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkState instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkMaster instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkMaster instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkType instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkType instance GHC.Real.Integral System.Linux.RTNetlink.Link.VlanId instance GHC.Enum.Enum System.Linux.RTNetlink.Link.VlanId instance GHC.Real.Real System.Linux.RTNetlink.Link.VlanId instance GHC.Classes.Ord System.Linux.RTNetlink.Link.VlanId instance GHC.Num.Num System.Linux.RTNetlink.Link.VlanId instance GHC.Classes.Eq System.Linux.RTNetlink.Link.VlanId instance GHC.Show.Show System.Linux.RTNetlink.Link.VlanId instance GHC.Classes.Eq System.Linux.RTNetlink.Link.AnyLink instance GHC.Show.Show System.Linux.RTNetlink.Link.AnyLink instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkBroadcastEther instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkEther instance Data.String.IsString System.Linux.RTNetlink.Link.LinkName instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkName instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkName instance GHC.Real.Integral System.Linux.RTNetlink.Link.LinkIndex instance GHC.Real.Real System.Linux.RTNetlink.Link.LinkIndex instance GHC.Enum.Enum System.Linux.RTNetlink.Link.LinkIndex instance GHC.Classes.Ord System.Linux.RTNetlink.Link.LinkIndex instance GHC.Num.Num System.Linux.RTNetlink.Link.LinkIndex instance GHC.Classes.Eq System.Linux.RTNetlink.Link.LinkIndex instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkIndex instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Link.LinkIndex instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkName System.Linux.RTNetlink.Link.LinkState instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkState instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkName System.Linux.RTNetlink.Link.LinkPromiscuity instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkPromiscuity instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkName System.Linux.RTNetlink.Link.LinkArp instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkArp instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkName System.Linux.RTNetlink.Link.LinkDebug instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkDebug instance System.Linux.RTNetlink.Message.Header System.Linux.RTNetlink.Link.IfInfoMsg instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Link.IfInfoMsg) => System.Linux.RTNetlink.Message.Create (c, System.Linux.RTNetlink.Link.LinkIndex) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Link.IfInfoMsg) => System.Linux.RTNetlink.Message.Create (System.Linux.RTNetlink.Link.LinkIndex, c) instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkIndex instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Link.LinkName instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Link.IfInfoMsg) => System.Linux.RTNetlink.Message.Create (c, System.Linux.RTNetlink.Link.LinkName) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Link.IfInfoMsg) => System.Linux.RTNetlink.Message.Create (System.Linux.RTNetlink.Link.LinkName, c) instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkName instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Link.LinkEther instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Link.IfInfoMsg) => System.Linux.RTNetlink.Message.Create (c, System.Linux.RTNetlink.Link.LinkEther) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Link.IfInfoMsg) => System.Linux.RTNetlink.Message.Create (System.Linux.RTNetlink.Link.LinkEther, c) instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkEther instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Link.LinkBroadcastEther instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Link.IfInfoMsg) => System.Linux.RTNetlink.Message.Create (c, System.Linux.RTNetlink.Link.LinkBroadcastEther) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Link.IfInfoMsg) => System.Linux.RTNetlink.Message.Create (System.Linux.RTNetlink.Link.LinkBroadcastEther, c) instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkBroadcastEther instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Link.AnyLink instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Link.LinkType instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkType instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Link.VlanId instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.VlanId instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Link.LinkMaster instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkMaster instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkState instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkPromiscuity instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkArp instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkDebug instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Link.LinkMTU instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkMTU instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkGroup instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Link.LinkStats instance System.Linux.RTNetlink.Packet.Sized System.Linux.RTNetlink.Link.IfInfoMsg instance Data.Serialize.Serialize System.Linux.RTNetlink.Link.IfInfoMsg instance System.Linux.RTNetlink.Message.CreateMessageHeader System.Linux.RTNetlink.Link.IfInfoMsg instance System.Linux.RTNetlink.Message.DestroyMessageHeader System.Linux.RTNetlink.Link.IfInfoMsg instance System.Linux.RTNetlink.Message.ChangeMessageHeader System.Linux.RTNetlink.Link.IfInfoMsg instance System.Linux.RTNetlink.Message.RequestMessageHeader System.Linux.RTNetlink.Link.IfInfoMsg instance System.Linux.RTNetlink.Message.ReplyMessageHeader System.Linux.RTNetlink.Link.IfInfoMsg instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkName System.Linux.RTNetlink.Link.LinkGroup instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkGroup instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkName System.Linux.RTNetlink.Link.LinkMTU instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkMTU instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkName System.Linux.RTNetlink.Link.LinkMaster instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkMaster instance System.Linux.RTNetlink.Message.Create System.Linux.RTNetlink.Link.LinkType instance System.Linux.RTNetlink.Message.Request System.Linux.RTNetlink.Link.LinkType instance System.Linux.RTNetlink.Message.Request System.Linux.RTNetlink.Link.AnyLink instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkBroadcastEther instance Data.Serialize.Serialize System.Linux.RTNetlink.Link.LinkBroadcastEther instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkName System.Linux.RTNetlink.Link.LinkBroadcastEther instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkBroadcastEther instance GHC.Show.Show System.Linux.RTNetlink.Link.LinkEther instance Data.Serialize.Serialize System.Linux.RTNetlink.Link.LinkEther instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkName System.Linux.RTNetlink.Link.LinkEther instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkEther instance System.Linux.RTNetlink.Message.Change System.Linux.RTNetlink.Link.LinkIndex System.Linux.RTNetlink.Link.LinkName instance System.Linux.RTNetlink.Message.Destroy System.Linux.RTNetlink.Link.LinkName instance System.Linux.RTNetlink.Message.Request System.Linux.RTNetlink.Link.LinkName instance Data.Serialize.Serialize System.Linux.RTNetlink.Link.LinkIndex instance System.Linux.RTNetlink.Message.Destroy System.Linux.RTNetlink.Link.LinkIndex instance System.Linux.RTNetlink.Message.Request System.Linux.RTNetlink.Link.LinkIndex module System.Linux.RTNetlink.Address -- | An ipv4 address and netmask associated with an interface. data IfInetAddress IfInetAddress :: InetAddress -> IfPrefix -> IfIndex -> IfInetAddress -- | The ip4v address itself. [ifInetAddress] :: IfInetAddress -> InetAddress -- | The netmask in CIDR notation. [ifInetPrefix] :: IfInetAddress -> IfPrefix -- | Index of the associated interface. [ifInetIfIndex] :: IfInetAddress -> IfIndex -- | An ipv6 address and netmask associated with an interface. data IfInet6Address IfInet6Address :: Inet6Address -> IfPrefix -> IfIndex -> IfInet6Address -- | The ip4v address itself. [ifInet6Address] :: IfInet6Address -> Inet6Address -- | The netmask in CIDR notation. [ifInet6Prefix] :: IfInet6Address -> IfPrefix -- | Index of the associated interface. [ifInet6IfIndex] :: IfInet6Address -> IfIndex -- | The index of a layer-3 interface. newtype IfIndex IfIndex :: Int -> IfIndex [ifIndex] :: IfIndex -> Int -- | A netmask in CIDR notation. newtype IfPrefix IfPrefix :: Word8 -> IfPrefix data IfScope -- | Destination located anywhere (default). IfUniverse :: IfScope -- | User-defined scope; 0, 200, and 253-5 are reserved. IfUserScope :: Word8 -> IfScope -- | IPv6 address valid inside this site. Deprecated. IfSite :: IfScope -- | Destination on attached link. IfLink :: IfScope -- | Local address. IfHost :: IfScope -- | Destination doesn't exist. IfNowhere :: IfScope -- | A textual label applied to an IPv4 address. Defaults to the -- LinkName of the parent link. Note that this is ignored/absent -- for IPv6 addresses. newtype IfLabel IfLabel :: ByteString -> IfLabel -- | Precedence for address on its link. The first address created on a -- subnet is Primary, and each subsequent one is Secondary. -- (This is similar to an "alias" address in ifconfig.) By -- default, linux has the (maybe counterintuitive) behavior that, when -- the primary address on a subnet is deleted, all secondary interfaces -- are deleted as well. To change this behavior, you can set -- net.ipv{4|6}.conf.dev.promote_secondaries = 1 in -- sysctl. data Precedence Primary :: Precedence Secondary :: Precedence -- | Whether this IPv6 address should send duplicate address detection -- packets (see RFC2462). Default is DadEnabled. This flag only -- makes sense for IPv6 addresses, but the kernel is perfectly happy to -- let you set it on IPv4 ones, with no effect. data DuplicateAddressDetection DadEnabled :: DuplicateAddressDetection DadDisabled :: DuplicateAddressDetection -- | Flags for IPv6 duplicate address detection. See RFC4862. data DuplicateAddressDetectionFlags DuplicateAddressDetectionFlags :: Bool -> Bool -> Bool -> DuplicateAddressDetectionFlags -- | Whether to use this address for neighbor dicovery and receiving frames -- when it is in a tentative state (i.e., DAD has not yet succeeded). It -- is dis-preferred for source address selection, like a deprecated -- address. See RFC4429. [dadOptimistic] :: DuplicateAddressDetectionFlags -> Bool -- | Indicates that DAD has not yet succeeded. This address will not be -- used for neighbor discovery unless dadOptimistic is also set. [dadTentative] :: DuplicateAddressDetectionFlags -> Bool -- | Indicates that duplicate address detection failed on this address. [dadFailed] :: DuplicateAddressDetectionFlags -> Bool -- | Home address for IPv6. Used in Mobility for IPv6 (MIP6), which allows -- a device to use its home address on mobile networks. See RFC6275. data Mip6Homing Home :: Mip6Homing NotHome :: Mip6Homing -- | Indicates an address that is past its preferred lifetime. A deprecated -- address will be dis-preferred for source address selection. data Preference Prefered :: Preference Deprecated :: Preference -- | A Permanent IPv6 address is one that was explicitly created. A -- Dynamic address is one that was auto-generated, e.g. by SLAAC. data Permanence Permanent :: Permanence Dynamic :: Permanence -- | Whether to automatically add a route based on the prefix when the -- address is added. data PrefixRoute PREnabled :: PrefixRoute PRDisabled :: PrefixRoute -- | Enable joining multicast groups when connected to a switch that does -- IGMP snooping. Only sensible on multicast addresses. data MulticastAutoJoin AutoJoin :: MulticastAutoJoin NoAutoJoin :: MulticastAutoJoin data IfSeconds IfSeconds :: Word32 -> IfSeconds IfForever :: IfSeconds -- | The lifetime of this address. The address will be in a Prefered -- state for ifPrefered seconds, after which it will be -- Deprecated. After ifValid seconds, the address will be -- removed. data IfLifetime IfLifetime :: IfSeconds -> IfSeconds -> IfLifetime [ifPrefered] :: IfLifetime -> IfSeconds [ifValid] :: IfLifetime -> IfSeconds -- | Interface wildcard. Use this to get information about all layer-3 -- interfaces. data AnyInterface AnyInterface :: AnyInterface -- | The header corresponding to address messages, based on 'struct -- ifaddrmsg' from 'linux/if_addr.h'. data IfAddrMsg IfAddrMsg :: Word8 -> Word8 -> Word8 -> Word8 -> Word32 -> IfAddrMsg -- | Address family (AF_* from sys/socket.h) [addrFamily] :: IfAddrMsg -> Word8 -- | CIDR netmask for this address. [addrPrefix] :: IfAddrMsg -> Word8 -- | Operational flags for this address. [addrFlags] :: IfAddrMsg -> Word8 -- | Address scope. [addrScope] :: IfAddrMsg -> Word8 -- | Index of the associated interface. [addrIndex] :: IfAddrMsg -> Word32 -- | To avoid errors with endianess it was decided to keep this type -- abstract. -- -- Use inetAddressFromTuple and inetAddressToTuple for -- constructing and deconstructing custom addresses. -- -- Hint: Use the Storable instance. It exposes it exactly as found -- within an IP packet (big endian if you insist on interpreting it as a -- number). -- -- Another hint: Use getAddressInfo for parsing and suppress -- nameserver lookups: -- --
--   > getAddressInfo (Just "127.0.0.1") Nothing aiNumericHost :: IO [AddressInfo Inet Stream TCP]
--   [AddressInfo {addressInfoFlags = AddressInfoFlags 4, socketAddress = SocketAddressInet {inetAddress = InetAddress 127.0.0.1, inetPort = InetPort 0}, canonicalName = Nothing}]
--   
data InetAddress -- | Constructs a custom InetAddress. -- --
--   inetAddressFromTuple (127,0,0,1) == inetLoopback
--   
inetAddressFromTuple :: (Word8, Word8, Word8, Word8) -> InetAddress -- | Deconstructs an InetAddress. inetAddressToTuple :: InetAddress -> (Word8, Word8, Word8, Word8) -- | To avoid errors with endianess it was decided to keep this type -- abstract. -- -- Use inet6AddressFromTuple and inet6AddressToTuple for -- constructing and deconstructing custom addresses. -- -- Hint: Use the Storable instance. It exposes it exactly as found -- within an IP packet (big endian if you insist on interpreting it as a -- number). -- -- Another hint: Use getAddressInfo for parsing and suppress -- nameserver lookups: -- --
--   > getAddressInfo (Just "::1") Nothing aiNumericHost :: IO [AddressInfo SocketAddressInet6 Stream TCP]
--   [AddressInfo {
--      addressInfoFlags = AddressInfoFlags 4,
--      socketAddress    = SocketAddressInet6 {inet6Address = Inet6Address 0000:0000:0000:0000:0000:0000:0000:0001, inet6Port = Inet6Port 0, inet6FlowInfo = Inet6FlowInfo 0, inet6ScopeId = Inet6ScopeId 0},
--      canonicalName    = Nothing }]
--   
data Inet6Address -- | Constructs a custom Inet6Address. -- --
--   inet6AddressFromTuple (0,0,0,0,0,0,0,1) == inet6Loopback
--   
inet6AddressFromTuple :: (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16) -> Inet6Address -- | Deconstructs an Inet6Address. inet6AddressToTuple :: Inet6Address -> (Word16, Word16, Word16, Word16, Word16, Word16, Word16, Word16) instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfAddrMsgPart instance GHC.Show.Show System.Linux.RTNetlink.Address.IfAddrMsgPart instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfAddrMsg instance GHC.Show.Show System.Linux.RTNetlink.Address.IfAddrMsg instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfInet6Address instance GHC.Show.Show System.Linux.RTNetlink.Address.IfInet6Address instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfInetAddress instance GHC.Show.Show System.Linux.RTNetlink.Address.IfInetAddress instance Data.String.IsString System.Linux.RTNetlink.Address.IfLabel instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfLabel instance GHC.Show.Show System.Linux.RTNetlink.Address.IfLabel instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfScope instance GHC.Show.Show System.Linux.RTNetlink.Address.IfScope instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfLifetime instance GHC.Show.Show System.Linux.RTNetlink.Address.IfLifetime instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfSeconds instance GHC.Show.Show System.Linux.RTNetlink.Address.IfSeconds instance GHC.Classes.Eq System.Linux.RTNetlink.Address.MulticastAutoJoin instance GHC.Show.Show System.Linux.RTNetlink.Address.MulticastAutoJoin instance GHC.Classes.Eq System.Linux.RTNetlink.Address.PrefixRoute instance GHC.Show.Show System.Linux.RTNetlink.Address.PrefixRoute instance GHC.Classes.Eq System.Linux.RTNetlink.Address.Permanence instance GHC.Show.Show System.Linux.RTNetlink.Address.Permanence instance GHC.Classes.Eq System.Linux.RTNetlink.Address.Preference instance GHC.Show.Show System.Linux.RTNetlink.Address.Preference instance GHC.Classes.Eq System.Linux.RTNetlink.Address.Mip6Homing instance GHC.Show.Show System.Linux.RTNetlink.Address.Mip6Homing instance GHC.Classes.Eq System.Linux.RTNetlink.Address.DuplicateAddressDetectionFlags instance GHC.Show.Show System.Linux.RTNetlink.Address.DuplicateAddressDetectionFlags instance GHC.Classes.Eq System.Linux.RTNetlink.Address.DuplicateAddressDetection instance GHC.Show.Show System.Linux.RTNetlink.Address.DuplicateAddressDetection instance GHC.Classes.Eq System.Linux.RTNetlink.Address.Precedence instance GHC.Show.Show System.Linux.RTNetlink.Address.Precedence instance GHC.Real.Integral System.Linux.RTNetlink.Address.IfPrefix instance GHC.Enum.Enum System.Linux.RTNetlink.Address.IfPrefix instance GHC.Real.Real System.Linux.RTNetlink.Address.IfPrefix instance GHC.Classes.Ord System.Linux.RTNetlink.Address.IfPrefix instance GHC.Num.Num System.Linux.RTNetlink.Address.IfPrefix instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfPrefix instance GHC.Show.Show System.Linux.RTNetlink.Address.IfPrefix instance GHC.Real.Integral System.Linux.RTNetlink.Address.IfIndex instance GHC.Enum.Enum System.Linux.RTNetlink.Address.IfIndex instance GHC.Real.Real System.Linux.RTNetlink.Address.IfIndex instance GHC.Classes.Ord System.Linux.RTNetlink.Address.IfIndex instance GHC.Num.Num System.Linux.RTNetlink.Address.IfIndex instance GHC.Classes.Eq System.Linux.RTNetlink.Address.IfIndex instance GHC.Show.Show System.Linux.RTNetlink.Address.IfIndex instance GHC.Classes.Eq System.Linux.RTNetlink.Address.AnyInterface instance GHC.Show.Show System.Linux.RTNetlink.Address.AnyInterface instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.IfIndex instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.IfPrefix instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.DuplicateAddressDetection instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.Mip6Homing instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.IfScope instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.IfInetAddress instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.IfInet6Address instance System.Linux.RTNetlink.Message.Header System.Linux.RTNetlink.Address.IfAddrMsg instance System.Linux.RTNetlink.Message.Message System.Socket.Family.Inet.InetAddress instance System.Linux.RTNetlink.Message.Reply System.Socket.Family.Inet.InetAddress instance System.Linux.RTNetlink.Message.Message System.Socket.Family.Inet6.Inet6Address instance System.Linux.RTNetlink.Message.Reply System.Socket.Family.Inet6.Inet6Address instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.AnyInterface instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.IfIndex instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.IfPrefix instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.Precedence instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.DuplicateAddressDetection instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (c, System.Linux.RTNetlink.Address.DuplicateAddressDetection) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (System.Linux.RTNetlink.Address.DuplicateAddressDetection, c) instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.DuplicateAddressDetectionFlags instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.Mip6Homing instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.Preference instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.Permanence instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.PrefixRoute instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.PrefixRoute instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (c, System.Linux.RTNetlink.Address.PrefixRoute) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (System.Linux.RTNetlink.Address.PrefixRoute, c) instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.MulticastAutoJoin instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.MulticastAutoJoin instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.IfLifetime instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.IfLifetime instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (c, System.Linux.RTNetlink.Address.IfLifetime) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (System.Linux.RTNetlink.Address.IfLifetime, c) instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.IfScope instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (c, System.Linux.RTNetlink.Address.IfScope) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (System.Linux.RTNetlink.Address.IfScope, c) instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.IfLabel instance System.Linux.RTNetlink.Message.Message System.Linux.RTNetlink.Address.IfLabel instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (c, System.Linux.RTNetlink.Address.IfLabel) instance (System.Linux.RTNetlink.Message.Create c, System.Linux.RTNetlink.Message.MessageHeader c Data.Type.Equality.~ System.Linux.RTNetlink.Address.IfAddrMsg) => System.Linux.RTNetlink.Message.Create (System.Linux.RTNetlink.Address.IfLabel, c) instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.IfInetAddress instance System.Linux.RTNetlink.Message.Reply System.Linux.RTNetlink.Address.IfInet6Address instance System.Linux.RTNetlink.Packet.Sized System.Linux.RTNetlink.Address.IfAddrMsg instance Data.Serialize.Serialize System.Linux.RTNetlink.Address.IfAddrMsg instance System.Linux.RTNetlink.Message.CreateMessageHeader System.Linux.RTNetlink.Address.IfAddrMsg instance System.Linux.RTNetlink.Message.DestroyMessageHeader System.Linux.RTNetlink.Address.IfAddrMsg instance System.Linux.RTNetlink.Message.RequestMessageHeader System.Linux.RTNetlink.Address.IfAddrMsg instance System.Linux.RTNetlink.Message.ReplyMessageHeader System.Linux.RTNetlink.Address.IfAddrMsg instance System.Linux.RTNetlink.Message.Create System.Linux.RTNetlink.Address.IfInet6Address instance System.Linux.RTNetlink.Message.Destroy System.Linux.RTNetlink.Address.IfInet6Address instance System.Linux.RTNetlink.Message.Create System.Linux.RTNetlink.Address.IfInetAddress instance System.Linux.RTNetlink.Message.Destroy System.Linux.RTNetlink.Address.IfInetAddress instance GHC.Classes.Ord System.Linux.RTNetlink.Address.IfSeconds instance Data.Serialize.Serialize System.Linux.RTNetlink.Address.IfSeconds instance System.Linux.RTNetlink.Message.Request System.Linux.RTNetlink.Address.AnyInterface module System.Socket.Family.Netlink -- | Netlink socket family. data Netlink -- | The SocketAddress type is a data family. This allows to -- provide different data constructors depending on the socket family -- without knowing all of them in advance or the need to extend this core -- library. -- --
--   SocketAddressInet  inetLoopback  8080     :: SocketAddress Inet
--   SocketAddressInet6 inet6Loopback 8080 0 0 :: SocketAddress Inet6
--   
data family SocketAddress f :: Type -- | Class of netlink groups. This is extensible because groups vary by -- netlink subsystem. class NetlinkGroup g netlinkGroupNumber :: NetlinkGroup g => g -> Word32 -- | Construct a netlink socket from a collection of groups. netlinkAddress :: NetlinkGroup g => [g] -> IO (SocketAddress Netlink) -- | Like netlinkAddress, but with a configurable source address. netlinkAddressPid :: NetlinkGroup g => Word32 -> [g] -> SocketAddress Netlink -- | The kernel's address. netlinkKernel :: SocketAddress Netlink instance GHC.Classes.Eq (System.Socket.Internal.Socket.SocketAddress System.Socket.Family.Netlink.Netlink) instance GHC.Show.Show (System.Socket.Internal.Socket.SocketAddress System.Socket.Family.Netlink.Netlink) instance GHC.Read.Read (System.Socket.Internal.Socket.SocketAddress System.Socket.Family.Netlink.Netlink) instance System.Socket.Internal.Socket.Family System.Socket.Family.Netlink.Netlink instance Data.Serialize.Serialize (System.Socket.Internal.Socket.SocketAddress System.Socket.Family.Netlink.Netlink) instance Foreign.Storable.Storable (System.Socket.Internal.Socket.SocketAddress System.Socket.Family.Netlink.Netlink) module System.Socket.Protocol.RTNetlink -- | Protocol for the ROUTE_NETLINK subsystem of netlink. data RTNetlink -- | Multicast groups the user of an RTNetlink socket can subscribe to. data RTNetlinkGroup RTNetlinkGroupNone :: RTNetlinkGroup RTNetlinkGroupLink :: RTNetlinkGroup RTNetlinkGroupNotify :: RTNetlinkGroup RTNetlinkGroupNeighbor :: RTNetlinkGroup RTNetlinkGroupTC :: RTNetlinkGroup RTNetlinkGroupIPv4IfAddr :: RTNetlinkGroup RTNetlinkGroupIPv4MRoute :: RTNetlinkGroup RTNetlinkGroupIPv4Route :: RTNetlinkGroup RTNetlinkGroupIPv4Rule :: RTNetlinkGroup RTNetlinkGroupIPv6IfAddr :: RTNetlinkGroup RTNetlinkGroupIPv6MRoute :: RTNetlinkGroup RTNetlinkGroupIPv6Route :: RTNetlinkGroup RTNetlinkGroupIPv6IfInfo :: RTNetlinkGroup RTNetlinkGroupDECnetIfAddr :: RTNetlinkGroup RTNetlinkGroupDECnetRoute :: RTNetlinkGroup RTNetlinkGroupDECnetRule :: RTNetlinkGroup RTNetlinkGroupIPv6Prefix :: RTNetlinkGroup RTNetlinkGroupIPv6Rule :: RTNetlinkGroup RTNetlinkGroupNDUserOpt :: RTNetlinkGroup RTNetlinkGroupPhonetIfAddr :: RTNetlinkGroup RTNetlinkGroupPhonetRoute :: RTNetlinkGroup RTNetlinkGroupDCB :: RTNetlinkGroup RTNetlinkGroupIPv4Netconf :: RTNetlinkGroup RTNetlinkGroupIPv6Netconf :: RTNetlinkGroup RTNetlinkGroupMDB :: RTNetlinkGroup instance GHC.Classes.Eq System.Socket.Protocol.RTNetlink.RTNetlinkGroup instance GHC.Show.Show System.Socket.Protocol.RTNetlink.RTNetlinkGroup instance GHC.Read.Read System.Socket.Protocol.RTNetlink.RTNetlinkGroup instance System.Socket.Family.Netlink.NetlinkGroup System.Socket.Protocol.RTNetlink.RTNetlinkGroup instance System.Socket.Internal.Socket.Protocol System.Socket.Protocol.RTNetlink.RTNetlink -- | RTNetlink is an extensible, high-level, pure Haskell interface for -- manipulating network interfaces on Linux: creating and destroying -- interfaces, changing and dumping interface settings, adding and -- removing addresses. -- -- The core interface of RTNetlink is the RTNL monad. RTNL -- handles the heavy lifting of opening and closing netlink sockets, -- incrementing sequence numbers, and getting the responses for the -- current sequence number behind the scenes. Messages not that are not -- responses to a sent message, such as those sent to group subscribers, -- are stored in the backlog and can be retrieved with getBacklog. -- -- The basic way to use RTNL is to use the create, -- destroy, dump, and change convenience functions. -- If you want more control, you can use talk and talk_. -- Import modules like System.Linux.RTNetlink.Link to get access -- to prefab instances of Create and Destroy messages, etc. -- Or import System.Linux.RTNetlink.Message to get access to the -- core typeclasses and create your own messages. -- System.Linux.RTNetlink.Packet has a number of functions to make -- this easier. -- --

Example:

-- --
--   
--   module Main where
--   
--   import System.Linux.RTNetlink
--   import System.Linux.RTNetlink.Link
--   import Control.Monad (when)
--   
--   main :: IO ()
--   main = runRTNL $ do
--       let mybridge = LinkName "mybridge"
--       create (Bridge mybridge)
--       change mybridge Up
--       state <- dump mybridge
--       when (head state == Up) $
--           liftIO (putStrLn "I did it, mom!")
--       destroy mybridge
--   
module System.Linux.RTNetlink -- | RTNL monad to simplify netlink communication. data RTNL a -- | Run an RTNL function and catch all IOErrors. This means that -- functions in this module are guaranteed not to throw uncaught -- exceptions. tryRTNL :: RTNL a -> IO (Either String a) -- | Run an RTNL function. RTNL functions in this module throw exclusively -- IOErrors. runRTNL :: RTNL a -> IO a -- | Run an RTNL function and specify some groups to subscribe to. runRTNLGroups :: [RTNetlinkGroup] -> RTNL a -> IO a -- | Send a Create message and ignore non-error Replys. create :: Create c => c -> RTNL () -- | Send a Destroy message and ignore non-error Replys. destroy :: Destroy d => d -> RTNL () -- | Send a Request and receive the associated Replys. dump :: Dump q r => q -> RTNL [r] -- | Link dump, but throws IOError if the Reply list -- does not have exactly one element. dump' :: Dump q r => q -> RTNL r -- | Send a Change message and ignore non-error Replys. change :: Change id c => id -> c -> RTNL () -- | Get all the Replys of a particular type in the backlog and -- queued on the socket. getBacklog :: Reply r => RTNL [r] -- | Clear the backlog. clearBacklog :: RTNL () -- | Send any NLMessage and receive a list of Replys. -- -- If the ReplyTypeNumbers of the return type do not include -- NLM_ERROR, any non-zero error messages received will be thrown as -- IOErrors. Responses that don't parse as the return type will -- be ignored. talk :: (Header h, Reply r) => (SequenceNumber -> NLMessage h) -> RTNL [r] -- | Like talk, but discards non-error Replys. talk_ :: Header h => (SequenceNumber -> NLMessage h) -> RTNL () -- | Lowest-level RTNL function. Send a BytsString and receive all -- responses and queued messages as ByteStrings. -- -- _Note:_ This function does nothing to manage sequence numbers or -- distinguish between responses and queued messages. Nothing will be -- added to the backlog. talkRaw :: ByteString -> RTNL [ByteString] -- | Lift a computation from the IO monad. liftIO :: MonadIO m => IO a -> m a instance Control.Monad.Catch.MonadMask System.Linux.RTNetlink.RTNL instance Control.Monad.Catch.MonadThrow System.Linux.RTNetlink.RTNL instance Control.Monad.Catch.MonadCatch System.Linux.RTNetlink.RTNL instance Control.Monad.IO.Class.MonadIO System.Linux.RTNetlink.RTNL instance GHC.Base.Monad System.Linux.RTNetlink.RTNL instance GHC.Base.Applicative System.Linux.RTNetlink.RTNL instance GHC.Base.Functor System.Linux.RTNetlink.RTNL