{-# LINE 1 "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(..))



-- | 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         = 0
{-# LINE 62 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupLink         = 1
{-# LINE 63 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupNotify       = 2
{-# LINE 64 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupNeighbor     = 3
{-# LINE 65 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupTC           = 4
{-# LINE 66 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv4IfAddr   = 5
{-# LINE 67 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv4MRoute   = 6
{-# LINE 68 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv4Route    = 7
{-# LINE 69 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv4Rule     = 8
{-# LINE 70 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv6IfAddr   = 9
{-# LINE 71 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv6MRoute   = 10
{-# LINE 72 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv6Route    = 11
{-# LINE 73 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv6IfInfo   = 12
{-# LINE 74 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupDECnetIfAddr = 13
{-# LINE 75 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupDECnetRoute  = 15
{-# LINE 76 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupDECnetRule   = 16
{-# LINE 77 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv6Prefix   = 18
{-# LINE 78 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv6Rule     = 19
{-# LINE 79 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupNDUserOpt    = 20
{-# LINE 80 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupPhonetIfAddr = 21
{-# LINE 81 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupPhonetRoute  = 22
{-# LINE 82 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupDCB          = 23
{-# LINE 83 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv4Netconf  = 24
{-# LINE 84 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupIPv6Netconf  = 25
{-# LINE 85 "src/System/Socket/Protocol/RTNetlink.hsc" #-}
bit RTNetlinkGroupMDB          = 26
{-# LINE 86 "src/System/Socket/Protocol/RTNetlink.hsc" #-}