packages feed

mptcp-pm-0.0.5: src/Net/Mptcp/Netlink.hs

module Net.Mptcp.Netlink
where

import System.Linux.Netlink.Constants
import System.Linux.Netlink.GeNetlink

import Data.Word (Word8, Word16, Word32)
import System.Linux.Netlink
-- import System.Linux.Netlink.Constants
import Net.IP
-- import Net.Mptcp.Types
-- import Net.Mptcp.Constants
import Data.Bits ((.|.))
-- import qualified Data.Map as Map

data MptcpSocket = MptcpSocket NetlinkSocket Word16

-- |Represents every possible setting sent/received on the netlink channel
data MptcpAttribute =
    MptcpAttrToken Word32 |
    -- v4 or v6, AddressFamily is a netlink def
    SubflowFamily AddressFamily | -- ^ should be Word16 too
    -- remote/local ?
    RemoteLocatorId Word8 |
    LocalLocatorId Word8 |
    SubflowSourceAddress IP |
    SubflowDestAddress IP |
    SubflowSourcePort Word16 |
    SubflowDestPort Word16 |
    SubflowMaxCwnd Word32 |
    SubflowBackup Word8 |
    SubflowInterface Word32
    deriving (Show, Eq)


-- instance Show MptcpSocket where
--
showMptcpSocket :: MptcpSocket -> String
showMptcpSocket  (MptcpSocket _ fid) = "Mptcp netlink socket: " ++ show fid

type MptcpPacket = GenlPacket NoData


--
-- The message type/ flag / sequence number / pid  (0 => from the kernel)
-- https://elixir.bootlin.com/linux/latest/source/include/uapi/linux/netlink.h#L54
fixHeader :: MptcpSocket -> Bool -> MptcpPacket -> MptcpPacket
fixHeader _ dump pkt = let
    myHeader = Header 0 (flags .|. fNLM_F_ACK) 0 0
    flags = if dump then fNLM_F_REQUEST .|. fNLM_F_MATCH .|. fNLM_F_ROOT else fNLM_F_REQUEST
  in
    pkt { packetHeader = myHeader }