quic-0.0.0: Network/QUIC/Recovery/PeerPacketNumbers.hs
{-# LANGUAGE RecordWildCards #-}
module Network.QUIC.Recovery.PeerPacketNumbers (
getPeerPacketNumbers
, addPeerPacketNumbers
, delPeerPacketNumbers
, clearPeerPacketNumbers
, reducePeerPacketNumbers
, setPreviousRTT1PPNs
, getPreviousRTT1PPNs
, nullPeerPacketNumbers
, fromPeerPacketNumbers
) where
import qualified Data.IntSet as IntSet
import Network.QUIC.Imports hiding (range)
import Network.QUIC.Recovery.Types
import Network.QUIC.Types
----------------------------------------------------------------
-- Peer's packet numbers
{-# INLINE getPeerPacketNumbers #-}
getPeerPacketNumbers :: LDCC -> EncryptionLevel -> IO PeerPacketNumbers
getPeerPacketNumbers LDCC{..} lvl = readIORef (peerPacketNumbers ! lvl)
{-# INLINE addPeerPacketNumbers #-}
addPeerPacketNumbers :: LDCC -> EncryptionLevel -> PacketNumber -> IO ()
addPeerPacketNumbers LDCC{..} lvl pn =
atomicModifyIORef'' (peerPacketNumbers ! lvl) add
where
add (PeerPacketNumbers pns) = PeerPacketNumbers $ IntSet.insert pn pns
{-# INLINE delPeerPacketNumbers #-}
delPeerPacketNumbers :: LDCC -> EncryptionLevel -> PacketNumber -> IO ()
delPeerPacketNumbers LDCC{..} lvl pn =
atomicModifyIORef'' (peerPacketNumbers ! lvl) del
where
del (PeerPacketNumbers pns) = PeerPacketNumbers $ IntSet.delete pn pns
{-# INLINE clearPeerPacketNumbers #-}
clearPeerPacketNumbers :: LDCC -> EncryptionLevel -> IO ()
clearPeerPacketNumbers LDCC{..} lvl =
atomicModifyIORef'' (peerPacketNumbers ! lvl) $ \_ -> emptyPeerPacketNumbers
{-# INLINE reducePeerPacketNumbers #-}
reducePeerPacketNumbers :: LDCC -> EncryptionLevel -> PeerPacketNumbers -> IO ()
reducePeerPacketNumbers LDCC{..} lvl (PeerPacketNumbers pns) =
atomicModifyIORef'' (peerPacketNumbers ! lvl) reduce
where
reduce (PeerPacketNumbers pns0) = PeerPacketNumbers (pns0 IntSet.\\ pns)
{-# INLINE setPreviousRTT1PPNs #-}
setPreviousRTT1PPNs :: LDCC -> PeerPacketNumbers -> IO ()
setPreviousRTT1PPNs LDCC{..} ppns = writeIORef previousRTT1PPNs ppns
{-# INLINE getPreviousRTT1PPNs #-}
getPreviousRTT1PPNs :: LDCC -> IO PeerPacketNumbers
getPreviousRTT1PPNs LDCC{..} = readIORef previousRTT1PPNs
----------------------------------------------------------------
{-# INLINE nullPeerPacketNumbers #-}
nullPeerPacketNumbers :: PeerPacketNumbers -> Bool
nullPeerPacketNumbers (PeerPacketNumbers pns) = IntSet.null pns
{-# INLINE fromPeerPacketNumbers #-}
fromPeerPacketNumbers :: PeerPacketNumbers -> [PacketNumber]
fromPeerPacketNumbers (PeerPacketNumbers pns) = IntSet.toDescList pns