rtnetlink-0.1.0.4: src/System/Socket/Protocol/RTNetlink.hsc
{-|
Module : System.Socket.Protocol.RTNetlink
Description : Extends System.Socket with the ROUTE_NETLINK socket protocol.
Copyright : (c) Formaltech Inc. 2017
License : BSD3
Maintainer : protob3n@gmail.com
Stability : experimental
Portability : Linux
-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE CPP #-}
module System.Socket.Protocol.RTNetlink
( RTNetlink
, RTNetlinkGroup(..)
) where
import Data.Bits (shift)
import System.Socket (Protocol(..))
import System.Socket.Family.Netlink (NetlinkGroup(..))
#include <linux/rtnetlink.h>
-- | Protocol for the ROUTE_NETLINK subsystem of netlink.
data RTNetlink
instance Protocol RTNetlink where
protocolNumber _ = 0
-- | Multicast groups the user of an RTNetlink socket can subscribe to.
data RTNetlinkGroup
= RTNetlinkGroupNone
| RTNetlinkGroupLink
| RTNetlinkGroupNotify
| RTNetlinkGroupNeighbor
| RTNetlinkGroupTC
| RTNetlinkGroupIPv4IfAddr
| RTNetlinkGroupIPv4MRoute
| RTNetlinkGroupIPv4Route
| RTNetlinkGroupIPv4Rule
| RTNetlinkGroupIPv6IfAddr
| RTNetlinkGroupIPv6MRoute
| RTNetlinkGroupIPv6Route
| RTNetlinkGroupIPv6IfInfo
| RTNetlinkGroupDECnetIfAddr
| RTNetlinkGroupDECnetRoute
| RTNetlinkGroupDECnetRule
| RTNetlinkGroupIPv6Prefix
| RTNetlinkGroupIPv6Rule
| RTNetlinkGroupNDUserOpt
| RTNetlinkGroupPhonetIfAddr
| RTNetlinkGroupPhonetRoute
| RTNetlinkGroupDCB
| RTNetlinkGroupIPv4Netconf
| RTNetlinkGroupIPv6Netconf
| RTNetlinkGroupMDB
deriving (Read, Show, Eq)
instance NetlinkGroup RTNetlinkGroup where
netlinkGroupNumber g = shift 1 $ bit g - 1
bit :: RTNetlinkGroup -> Int
bit RTNetlinkGroupNone = #const RTNLGRP_NONE
bit RTNetlinkGroupLink = #const RTNLGRP_LINK
bit RTNetlinkGroupNotify = #const RTNLGRP_NOTIFY
bit RTNetlinkGroupNeighbor = #const RTNLGRP_NEIGH
bit RTNetlinkGroupTC = #const RTNLGRP_TC
bit RTNetlinkGroupIPv4IfAddr = #const RTNLGRP_IPV4_IFADDR
bit RTNetlinkGroupIPv4MRoute = #const RTNLGRP_IPV4_MROUTE
bit RTNetlinkGroupIPv4Route = #const RTNLGRP_IPV4_ROUTE
bit RTNetlinkGroupIPv4Rule = #const RTNLGRP_IPV4_RULE
bit RTNetlinkGroupIPv6IfAddr = #const RTNLGRP_IPV6_IFADDR
bit RTNetlinkGroupIPv6MRoute = #const RTNLGRP_IPV6_MROUTE
bit RTNetlinkGroupIPv6Route = #const RTNLGRP_IPV6_ROUTE
bit RTNetlinkGroupIPv6IfInfo = #const RTNLGRP_IPV6_IFINFO
bit RTNetlinkGroupDECnetIfAddr = #const RTNLGRP_DECnet_IFADDR
bit RTNetlinkGroupDECnetRoute = #const RTNLGRP_DECnet_ROUTE
bit RTNetlinkGroupDECnetRule = #const RTNLGRP_DECnet_RULE
bit RTNetlinkGroupIPv6Prefix = #const RTNLGRP_IPV6_PREFIX
bit RTNetlinkGroupIPv6Rule = #const RTNLGRP_IPV6_RULE
bit RTNetlinkGroupNDUserOpt = #const RTNLGRP_ND_USEROPT
bit RTNetlinkGroupPhonetIfAddr = #const RTNLGRP_PHONET_IFADDR
bit RTNetlinkGroupPhonetRoute = #const RTNLGRP_PHONET_ROUTE
bit RTNetlinkGroupDCB = #const RTNLGRP_DCB
bit RTNetlinkGroupIPv4Netconf = #const RTNLGRP_IPV4_NETCONF
bit RTNetlinkGroupIPv6Netconf = #const RTNLGRP_IPV6_NETCONF
bit RTNetlinkGroupMDB = #const RTNLGRP_MDB