{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Network.QUIC.Recovery.Types (
SentPacket (..),
mkSentPacket,
fixSentPacket,
LostPacket (..),
SentPackets (..),
emptySentPackets,
RTT (..),
initialRTT,
CCMode (..),
CC (..),
initialCC,
LossDetection (..),
initialLossDetection,
MetricsDiff (..),
TimerType (..),
TimerInfo (..),
TimerInfoQ (..),
TimerCancelled,
TimerExpired,
makeSentPackets,
makeLossDetection,
LDCC (..),
newLDCC,
qlogSent,
qlogMetricsUpdated,
qlogPacketLost,
qlogContestionStateUpdated,
qlogLossTimerUpdated,
qlogLossTimerCancelled,
qlogLossTimerExpired,
) where
import Data.IORef
import Data.List (intersperse)
import Data.Sequence (Seq)
import qualified Data.Sequence as Seq
import Network.QUIC.Event
import System.Log.FastLogger
import UnliftIO.STM
import Network.QUIC.Connector
import Network.QUIC.Imports
import Network.QUIC.Qlog
import Network.QUIC.Types
data SentPacket = SentPacket
{ SentPacket -> PlainPacket
spPlainPacket :: PlainPacket
, SentPacket -> TimeMicrosecond
spTimeSent :: TimeMicrosecond
, SentPacket -> Int
spSentBytes :: Int
, SentPacket -> EncryptionLevel
spEncryptionLevel :: EncryptionLevel
, SentPacket -> Int
spPacketNumber :: PacketNumber
, SentPacket -> PeerPacketNumbers
spPeerPacketNumbers :: PeerPacketNumbers
, SentPacket -> Bool
spAckEliciting :: Bool
}
deriving (SentPacket -> SentPacket -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SentPacket -> SentPacket -> Bool
$c/= :: SentPacket -> SentPacket -> Bool
== :: SentPacket -> SentPacket -> Bool
$c== :: SentPacket -> SentPacket -> Bool
Eq, Int -> SentPacket -> ShowS
[SentPacket] -> ShowS
SentPacket -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SentPacket] -> ShowS
$cshowList :: [SentPacket] -> ShowS
show :: SentPacket -> String
$cshow :: SentPacket -> String
showsPrec :: Int -> SentPacket -> ShowS
$cshowsPrec :: Int -> SentPacket -> ShowS
Show)
instance Ord SentPacket where
SentPacket
x <= :: SentPacket -> SentPacket -> Bool
<= SentPacket
y = SentPacket -> Int
spPacketNumber SentPacket
x forall a. Ord a => a -> a -> Bool
<= SentPacket -> Int
spPacketNumber SentPacket
y
newtype LostPacket = LostPacket SentPacket
mkSentPacket
:: PacketNumber
-> EncryptionLevel
-> PlainPacket
-> PeerPacketNumbers
-> Bool
-> SentPacket
mkSentPacket :: Int
-> EncryptionLevel
-> PlainPacket
-> PeerPacketNumbers
-> Bool
-> SentPacket
mkSentPacket Int
mypn EncryptionLevel
lvl PlainPacket
ppkt PeerPacketNumbers
ppns Bool
ackeli =
SentPacket
{ spPlainPacket :: PlainPacket
spPlainPacket = PlainPacket
ppkt
, spTimeSent :: TimeMicrosecond
spTimeSent = TimeMicrosecond
timeMicrosecond0
, spSentBytes :: Int
spSentBytes = Int
0
, spEncryptionLevel :: EncryptionLevel
spEncryptionLevel = EncryptionLevel
lvl
, spPacketNumber :: Int
spPacketNumber = Int
mypn
, spPeerPacketNumbers :: PeerPacketNumbers
spPeerPacketNumbers = PeerPacketNumbers
ppns
, spAckEliciting :: Bool
spAckEliciting = Bool
ackeli
}
fixSentPacket :: SentPacket -> Int -> Int -> SentPacket
fixSentPacket :: SentPacket -> Int -> Int -> SentPacket
fixSentPacket SentPacket
spkt Int
bytes Int
padLen =
SentPacket
spkt
{ spPlainPacket :: PlainPacket
spPlainPacket =
if Int
padLen forall a. Eq a => a -> a -> Bool
/= Int
0
then Int -> PlainPacket -> PlainPacket
addPadding Int
padLen forall a b. (a -> b) -> a -> b
$ SentPacket -> PlainPacket
spPlainPacket SentPacket
spkt
else SentPacket -> PlainPacket
spPlainPacket SentPacket
spkt
, spSentBytes :: Int
spSentBytes = Int
bytes
}
addPadding :: Int -> PlainPacket -> PlainPacket
addPadding :: Int -> PlainPacket -> PlainPacket
addPadding Int
n (PlainPacket Header
hdr Plain
plain) = Header -> Plain -> PlainPacket
PlainPacket Header
hdr Plain
plain'
where
plain' :: Plain
plain' =
Plain
plain
{ plainFrames :: [Frame]
plainFrames = Plain -> [Frame]
plainFrames Plain
plain forall a. [a] -> [a] -> [a]
++ [Int -> Frame
Padding Int
n]
}
newtype SentPackets = SentPackets (Seq SentPacket) deriving (SentPackets -> SentPackets -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SentPackets -> SentPackets -> Bool
$c/= :: SentPackets -> SentPackets -> Bool
== :: SentPackets -> SentPackets -> Bool
$c== :: SentPackets -> SentPackets -> Bool
Eq)
emptySentPackets :: SentPackets
emptySentPackets :: SentPackets
emptySentPackets = Seq SentPacket -> SentPackets
SentPackets forall a. Seq a
Seq.empty
data RTT = RTT
{ RTT -> Microseconds
latestRTT :: Microseconds
, RTT -> Microseconds
smoothedRTT :: Microseconds
, RTT -> Microseconds
rttvar :: Microseconds
, RTT -> Microseconds
minRTT :: Microseconds
, RTT -> Microseconds
maxAckDelay1RTT :: Microseconds
, RTT -> Int
ptoCount :: Int
}
deriving (Int -> RTT -> ShowS
[RTT] -> ShowS
RTT -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RTT] -> ShowS
$cshowList :: [RTT] -> ShowS
show :: RTT -> String
$cshow :: RTT -> String
showsPrec :: Int -> RTT -> ShowS
$cshowsPrec :: Int -> RTT -> ShowS
Show)
kInitialRTT :: Microseconds
kInitialRTT :: Microseconds
kInitialRTT = Int -> Microseconds
Microseconds Int
333000
initialRTT :: RTT
initialRTT :: RTT
initialRTT =
RTT
{ latestRTT :: Microseconds
latestRTT = Int -> Microseconds
Microseconds Int
0
, smoothedRTT :: Microseconds
smoothedRTT = Microseconds
kInitialRTT
, rttvar :: Microseconds
rttvar = Microseconds
kInitialRTT forall a. Bits a => a -> Int -> a
!>>. Int
1
, minRTT :: Microseconds
minRTT = Int -> Microseconds
Microseconds Int
0
, maxAckDelay1RTT :: Microseconds
maxAckDelay1RTT = Int -> Microseconds
Microseconds Int
0
, ptoCount :: Int
ptoCount = Int
0
}
data CCMode
= SlowStart
| Avoidance
| Recovery
deriving (CCMode -> CCMode -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CCMode -> CCMode -> Bool
$c/= :: CCMode -> CCMode -> Bool
== :: CCMode -> CCMode -> Bool
$c== :: CCMode -> CCMode -> Bool
Eq)
instance Show CCMode where
show :: CCMode -> String
show CCMode
SlowStart = String
"slow_start"
show CCMode
Avoidance = String
"avoidance"
show CCMode
Recovery = String
"recovery"
data CC = CC
{ CC -> Int
bytesInFlight :: Int
, CC -> Int
congestionWindow :: Int
, CC -> Maybe TimeMicrosecond
congestionRecoveryStartTime :: Maybe TimeMicrosecond
, CC -> Int
ssthresh :: Int
, CC -> Int
bytesAcked :: Int
, CC -> Int
numOfAckEliciting :: Int
, CC -> CCMode
ccMode :: CCMode
}
deriving (Int -> CC -> ShowS
[CC] -> ShowS
CC -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CC] -> ShowS
$cshowList :: [CC] -> ShowS
show :: CC -> String
$cshow :: CC -> String
showsPrec :: Int -> CC -> ShowS
$cshowsPrec :: Int -> CC -> ShowS
Show)
initialCC :: CC
initialCC :: CC
initialCC =
CC
{ bytesInFlight :: Int
bytesInFlight = Int
0
, congestionWindow :: Int
congestionWindow = Int
0
, congestionRecoveryStartTime :: Maybe TimeMicrosecond
congestionRecoveryStartTime = forall a. Maybe a
Nothing
, ssthresh :: Int
ssthresh = forall a. Bounded a => a
maxBound
, bytesAcked :: Int
bytesAcked = Int
0
, numOfAckEliciting :: Int
numOfAckEliciting = Int
0
, ccMode :: CCMode
ccMode = CCMode
SlowStart
}
data LossDetection = LossDetection
{ LossDetection -> Int
largestAckedPacket :: PacketNumber
, LossDetection -> AckInfo
previousAckInfo :: AckInfo
, LossDetection -> TimeMicrosecond
timeOfLastAckElicitingPacket :: TimeMicrosecond
, LossDetection -> Maybe TimeMicrosecond
lossTime :: Maybe TimeMicrosecond
}
deriving (Int -> LossDetection -> ShowS
[LossDetection] -> ShowS
LossDetection -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [LossDetection] -> ShowS
$cshowList :: [LossDetection] -> ShowS
show :: LossDetection -> String
$cshow :: LossDetection -> String
showsPrec :: Int -> LossDetection -> ShowS
$cshowsPrec :: Int -> LossDetection -> ShowS
Show)
initialLossDetection :: LossDetection
initialLossDetection :: LossDetection
initialLossDetection = Int
-> AckInfo
-> TimeMicrosecond
-> Maybe TimeMicrosecond
-> LossDetection
LossDetection (-Int
1) AckInfo
ackInfo0 TimeMicrosecond
timeMicrosecond0 forall a. Maybe a
Nothing
newtype MetricsDiff = MetricsDiff [(String, Int)]
data TimerType
= LossTime
| PTO
deriving (TimerType -> TimerType -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TimerType -> TimerType -> Bool
$c/= :: TimerType -> TimerType -> Bool
== :: TimerType -> TimerType -> Bool
$c== :: TimerType -> TimerType -> Bool
Eq)
instance Show TimerType where
show :: TimerType -> String
show TimerType
LossTime = String
"loss_time"
show TimerType
PTO = String
"pto"
data TimerExpired = TimerExpired
data TimerCancelled = TimerCancelled
data TimerInfo = TimerInfo
{ TimerInfo -> TimeMicrosecond
timerTime :: TimeMicrosecond
, TimerInfo -> EncryptionLevel
timerLevel :: EncryptionLevel
, TimerInfo -> TimerType
timerType :: TimerType
}
deriving (TimerInfo -> TimerInfo -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TimerInfo -> TimerInfo -> Bool
$c/= :: TimerInfo -> TimerInfo -> Bool
== :: TimerInfo -> TimerInfo -> Bool
$c== :: TimerInfo -> TimerInfo -> Bool
Eq, Int -> TimerInfo -> ShowS
[TimerInfo] -> ShowS
TimerInfo -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TimerInfo] -> ShowS
$cshowList :: [TimerInfo] -> ShowS
show :: TimerInfo -> String
$cshow :: TimerInfo -> String
showsPrec :: Int -> TimerInfo -> ShowS
$cshowsPrec :: Int -> TimerInfo -> ShowS
Show)
data TimerInfoQ
= Empty
| Next TimerInfo
deriving (TimerInfoQ -> TimerInfoQ -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TimerInfoQ -> TimerInfoQ -> Bool
$c/= :: TimerInfoQ -> TimerInfoQ -> Bool
== :: TimerInfoQ -> TimerInfoQ -> Bool
$c== :: TimerInfoQ -> TimerInfoQ -> Bool
Eq)
makeSpaceDiscarded :: IO (Array EncryptionLevel (IORef Bool))
makeSpaceDiscarded :: IO (Array EncryptionLevel (IORef Bool))
makeSpaceDiscarded = do
IORef Bool
i1 <- forall a. a -> IO (IORef a)
newIORef Bool
False
IORef Bool
i2 <- forall a. a -> IO (IORef a)
newIORef Bool
False
IORef Bool
i3 <- forall a. a -> IO (IORef a)
newIORef Bool
False
IORef Bool
i4 <- forall a. a -> IO (IORef a)
newIORef Bool
False
let lst :: [(EncryptionLevel, IORef Bool)]
lst = [(EncryptionLevel
InitialLevel, IORef Bool
i1), (EncryptionLevel
RTT0Level, IORef Bool
i2), (EncryptionLevel
HandshakeLevel, IORef Bool
i3), (EncryptionLevel
RTT1Level, IORef Bool
i4)]
arr :: Array EncryptionLevel (IORef Bool)
arr = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (EncryptionLevel
InitialLevel, EncryptionLevel
RTT1Level) [(EncryptionLevel, IORef Bool)]
lst
forall (m :: * -> *) a. Monad m => a -> m a
return Array EncryptionLevel (IORef Bool)
arr
makeSentPackets :: IO (Array EncryptionLevel (IORef SentPackets))
makeSentPackets :: IO (Array EncryptionLevel (IORef SentPackets))
makeSentPackets = do
IORef SentPackets
i1 <- forall a. a -> IO (IORef a)
newIORef SentPackets
emptySentPackets
IORef SentPackets
i2 <- forall a. a -> IO (IORef a)
newIORef SentPackets
emptySentPackets
IORef SentPackets
i3 <- forall a. a -> IO (IORef a)
newIORef SentPackets
emptySentPackets
let lst :: [(EncryptionLevel, IORef SentPackets)]
lst = [(EncryptionLevel
InitialLevel, IORef SentPackets
i1), (EncryptionLevel
HandshakeLevel, IORef SentPackets
i2), (EncryptionLevel
RTT1Level, IORef SentPackets
i3)]
arr :: Array EncryptionLevel (IORef SentPackets)
arr = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (EncryptionLevel
InitialLevel, EncryptionLevel
RTT1Level) [(EncryptionLevel, IORef SentPackets)]
lst
forall (m :: * -> *) a. Monad m => a -> m a
return Array EncryptionLevel (IORef SentPackets)
arr
makeLossDetection :: IO (Array EncryptionLevel (IORef LossDetection))
makeLossDetection :: IO (Array EncryptionLevel (IORef LossDetection))
makeLossDetection = do
IORef LossDetection
i1 <- forall a. a -> IO (IORef a)
newIORef LossDetection
initialLossDetection
IORef LossDetection
i2 <- forall a. a -> IO (IORef a)
newIORef LossDetection
initialLossDetection
IORef LossDetection
i3 <- forall a. a -> IO (IORef a)
newIORef LossDetection
initialLossDetection
let lst :: [(EncryptionLevel, IORef LossDetection)]
lst = [(EncryptionLevel
InitialLevel, IORef LossDetection
i1), (EncryptionLevel
HandshakeLevel, IORef LossDetection
i2), (EncryptionLevel
RTT1Level, IORef LossDetection
i3)]
arr :: Array EncryptionLevel (IORef LossDetection)
arr = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (EncryptionLevel
InitialLevel, EncryptionLevel
RTT1Level) [(EncryptionLevel, IORef LossDetection)]
lst
forall (m :: * -> *) a. Monad m => a -> m a
return Array EncryptionLevel (IORef LossDetection)
arr
data LDCC = LDCC
{ LDCC -> ConnState
ldccState :: ConnState
, LDCC -> QLogger
ldccQlogger :: QLogger
, LDCC -> PlainPacket -> IO ()
putRetrans :: PlainPacket -> IO ()
, LDCC -> IORef RTT
recoveryRTT :: IORef RTT
, LDCC -> TVar CC
recoveryCC :: TVar CC
, LDCC -> Array EncryptionLevel (IORef Bool)
spaceDiscarded :: Array EncryptionLevel (IORef Bool)
, LDCC -> Array EncryptionLevel (IORef SentPackets)
sentPackets :: Array EncryptionLevel (IORef SentPackets)
, LDCC -> Array EncryptionLevel (IORef LossDetection)
lossDetection :: Array EncryptionLevel (IORef LossDetection)
,
LDCC -> IORef (Maybe TimeoutKey)
timerKey :: IORef (Maybe TimeoutKey)
,
LDCC -> IORef (Maybe TimerInfo)
timerInfo :: IORef (Maybe TimerInfo)
, LDCC -> TVar SentPackets
lostCandidates :: TVar SentPackets
, LDCC -> TVar (Maybe EncryptionLevel)
ptoPing :: TVar (Maybe EncryptionLevel)
, LDCC -> IORef Bool
speedingUp :: IORef Bool
, LDCC -> IORef Int
pktNumPersistent :: IORef PacketNumber
, LDCC -> Array EncryptionLevel (IORef PeerPacketNumbers)
peerPacketNumbers :: Array EncryptionLevel (IORef PeerPacketNumbers)
, LDCC -> IORef PeerPacketNumbers
previousRTT1PPNs :: IORef PeerPacketNumbers
, LDCC -> TVar TimerInfoQ
timerInfoQ :: TVar TimerInfoQ
}
makePPN :: IO (Array EncryptionLevel (IORef PeerPacketNumbers))
makePPN :: IO (Array EncryptionLevel (IORef PeerPacketNumbers))
makePPN = do
IORef PeerPacketNumbers
ref1 <- forall a. a -> IO (IORef a)
newIORef PeerPacketNumbers
emptyPeerPacketNumbers
IORef PeerPacketNumbers
ref2 <- forall a. a -> IO (IORef a)
newIORef PeerPacketNumbers
emptyPeerPacketNumbers
IORef PeerPacketNumbers
ref3 <- forall a. a -> IO (IORef a)
newIORef PeerPacketNumbers
emptyPeerPacketNumbers
let lst :: [(EncryptionLevel, IORef PeerPacketNumbers)]
lst =
[ (EncryptionLevel
InitialLevel, IORef PeerPacketNumbers
ref1)
, (EncryptionLevel
RTT0Level, IORef PeerPacketNumbers
ref3)
, (EncryptionLevel
HandshakeLevel, IORef PeerPacketNumbers
ref2)
, (EncryptionLevel
RTT1Level, IORef PeerPacketNumbers
ref3)
]
arr :: Array EncryptionLevel (IORef PeerPacketNumbers)
arr = forall i e. Ix i => (i, i) -> [(i, e)] -> Array i e
array (EncryptionLevel
InitialLevel, EncryptionLevel
RTT1Level) [(EncryptionLevel, IORef PeerPacketNumbers)]
lst
forall (m :: * -> *) a. Monad m => a -> m a
return Array EncryptionLevel (IORef PeerPacketNumbers)
arr
newLDCC :: ConnState -> QLogger -> (PlainPacket -> IO ()) -> IO LDCC
newLDCC :: ConnState -> QLogger -> (PlainPacket -> IO ()) -> IO LDCC
newLDCC ConnState
cs QLogger
qLog PlainPacket -> IO ()
put =
ConnState
-> QLogger
-> (PlainPacket -> IO ())
-> IORef RTT
-> TVar CC
-> Array EncryptionLevel (IORef Bool)
-> Array EncryptionLevel (IORef SentPackets)
-> Array EncryptionLevel (IORef LossDetection)
-> IORef (Maybe TimeoutKey)
-> IORef (Maybe TimerInfo)
-> TVar SentPackets
-> TVar (Maybe EncryptionLevel)
-> IORef Bool
-> IORef Int
-> Array EncryptionLevel (IORef PeerPacketNumbers)
-> IORef PeerPacketNumbers
-> TVar TimerInfoQ
-> LDCC
LDCC ConnState
cs QLogger
qLog PlainPacket -> IO ()
put
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. a -> IO (IORef a)
newIORef RTT
initialRTT
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *) a. MonadIO m => a -> m (TVar a)
newTVarIO CC
initialCC
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IO (Array EncryptionLevel (IORef Bool))
makeSpaceDiscarded
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IO (Array EncryptionLevel (IORef SentPackets))
makeSentPackets
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IO (Array EncryptionLevel (IORef LossDetection))
makeLossDetection
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. a -> IO (IORef a)
newIORef forall a. Maybe a
Nothing
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. a -> IO (IORef a)
newIORef forall a. Maybe a
Nothing
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *) a. MonadIO m => a -> m (TVar a)
newTVarIO SentPackets
emptySentPackets
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *) a. MonadIO m => a -> m (TVar a)
newTVarIO forall a. Maybe a
Nothing
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. a -> IO (IORef a)
newIORef Bool
False
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. a -> IO (IORef a)
newIORef forall a. Bounded a => a
maxBound
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> IO (Array EncryptionLevel (IORef PeerPacketNumbers))
makePPN
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall a. a -> IO (IORef a)
newIORef PeerPacketNumbers
emptyPeerPacketNumbers
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *) a. MonadIO m => a -> m (TVar a)
newTVarIO TimerInfoQ
Empty
instance KeepQlog LDCC where
keepQlog :: LDCC -> QLogger
keepQlog = LDCC -> QLogger
ldccQlogger
instance Connector LDCC where
getRole :: LDCC -> Role
getRole = ConnState -> Role
role forall b c a. (b -> c) -> (a -> b) -> a -> c
. LDCC -> ConnState
ldccState
getEncryptionLevel :: LDCC -> IO EncryptionLevel
getEncryptionLevel = forall (m :: * -> *) a. MonadIO m => TVar a -> m a
readTVarIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConnState -> TVar EncryptionLevel
encryptionLevel forall b c a. (b -> c) -> (a -> b) -> a -> c
. LDCC -> ConnState
ldccState
getMaxPacketSize :: LDCC -> IO Int
getMaxPacketSize = forall a. IORef a -> IO a
readIORef forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConnState -> IORef Int
maxPacketSize forall b c a. (b -> c) -> (a -> b) -> a -> c
. LDCC -> ConnState
ldccState
getConnectionState :: LDCC -> IO ConnectionState
getConnectionState = forall (m :: * -> *) a. MonadIO m => TVar a -> m a
readTVarIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConnState -> TVar ConnectionState
connectionState forall b c a. (b -> c) -> (a -> b) -> a -> c
. LDCC -> ConnState
ldccState
getPacketNumber :: LDCC -> IO Int
getPacketNumber = forall a. IORef a -> IO a
readIORef forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConnState -> IORef Int
packetNumber forall b c a. (b -> c) -> (a -> b) -> a -> c
. LDCC -> ConnState
ldccState
getAlive :: LDCC -> IO Bool
getAlive = forall a. IORef a -> IO a
readIORef forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConnState -> IORef Bool
connectionAlive forall b c a. (b -> c) -> (a -> b) -> a -> c
. LDCC -> ConnState
ldccState
instance Qlog SentPacket where
qlog :: SentPacket -> LogStr
qlog SentPacket{Bool
Int
TimeMicrosecond
PeerPacketNumbers
EncryptionLevel
PlainPacket
spAckEliciting :: Bool
spPeerPacketNumbers :: PeerPacketNumbers
spPacketNumber :: Int
spEncryptionLevel :: EncryptionLevel
spSentBytes :: Int
spTimeSent :: TimeMicrosecond
spPlainPacket :: PlainPacket
spAckEliciting :: SentPacket -> Bool
spPeerPacketNumbers :: SentPacket -> PeerPacketNumbers
spPacketNumber :: SentPacket -> Int
spEncryptionLevel :: SentPacket -> EncryptionLevel
spSentBytes :: SentPacket -> Int
spTimeSent :: SentPacket -> TimeMicrosecond
spPlainPacket :: SentPacket -> PlainPacket
..} =
LogStr
"{\"raw\":{\"length\":"
forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> LogStr
sw Int
spSentBytes
forall a. Semigroup a => a -> a -> a
<> LogStr
"},\"header\":{\"packet_type\":\""
forall a. Semigroup a => a -> a -> a
<> forall msg. ToLogStr msg => msg -> LogStr
toLogStr (Header -> LogStr
packetType Header
hdr)
forall a. Semigroup a => a -> a -> a
<> LogStr
"\",\"packet_number\":\""
forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> LogStr
sw Int
plainPacketNumber
forall a. Semigroup a => a -> a -> a
<> LogStr
"\",\"dcid\":\""
forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> LogStr
sw (Header -> CID
headerMyCID Header
hdr)
forall a. Semigroup a => a -> a -> a
<> LogStr
"\"},\"frames\":"
forall a. Semigroup a => a -> a -> a
<> LogStr
"["
forall a. Semigroup a => a -> a -> a
<> forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall a. Semigroup a => a -> a -> a
(<>) LogStr
"" (forall a. a -> [a] -> [a]
intersperse LogStr
"," (forall a b. (a -> b) -> [a] -> [b]
map forall a. Qlog a => a -> LogStr
qlog [Frame]
plainFrames))
forall a. Semigroup a => a -> a -> a
<> LogStr
"]"
forall a. Semigroup a => a -> a -> a
<> LogStr
"}"
where
PlainPacket Header
hdr Plain{Int
[Frame]
Flags Raw
plainMarks :: Plain -> Int
plainPacketNumber :: Plain -> Int
plainFlags :: Plain -> Flags Raw
plainMarks :: Int
plainFlags :: Flags Raw
plainFrames :: [Frame]
plainPacketNumber :: Int
plainFrames :: Plain -> [Frame]
..} = PlainPacket
spPlainPacket
instance Qlog LostPacket where
qlog :: LostPacket -> LogStr
qlog (LostPacket SentPacket{Bool
Int
TimeMicrosecond
PeerPacketNumbers
EncryptionLevel
PlainPacket
spAckEliciting :: Bool
spPeerPacketNumbers :: PeerPacketNumbers
spPacketNumber :: Int
spEncryptionLevel :: EncryptionLevel
spSentBytes :: Int
spTimeSent :: TimeMicrosecond
spPlainPacket :: PlainPacket
spAckEliciting :: SentPacket -> Bool
spPeerPacketNumbers :: SentPacket -> PeerPacketNumbers
spPacketNumber :: SentPacket -> Int
spEncryptionLevel :: SentPacket -> EncryptionLevel
spSentBytes :: SentPacket -> Int
spTimeSent :: SentPacket -> TimeMicrosecond
spPlainPacket :: SentPacket -> PlainPacket
..}) =
LogStr
"{\"header\":{\"packet_type\":\""
forall a. Semigroup a => a -> a -> a
<> forall msg. ToLogStr msg => msg -> LogStr
toLogStr (Header -> LogStr
packetType Header
hdr)
forall a. Semigroup a => a -> a -> a
<> LogStr
"\""
forall a. Semigroup a => a -> a -> a
<> LogStr
",\"packet_number\":"
forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> LogStr
sw Int
spPacketNumber
forall a. Semigroup a => a -> a -> a
<> LogStr
"}}"
where
PlainPacket Header
hdr Plain
_ = PlainPacket
spPlainPacket
instance Qlog MetricsDiff where
qlog :: MetricsDiff -> LogStr
qlog (MetricsDiff []) = LogStr
"{}"
qlog (MetricsDiff ((String, Int)
x : [(String, Int)]
xs)) = LogStr
"{" forall a. Semigroup a => a -> a -> a
<> forall {msg} {a}. (ToLogStr msg, Show a) => (msg, a) -> LogStr
tv0 (String, Int)
x forall a. Semigroup a => a -> a -> a
<> forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall {msg} {a}.
(ToLogStr msg, Show a) =>
(msg, a) -> LogStr -> LogStr
tv LogStr
"" [(String, Int)]
xs forall a. Semigroup a => a -> a -> a
<> LogStr
"}"
where
tv0 :: (msg, a) -> LogStr
tv0 (msg
tag, a
val) = LogStr
"\"" forall a. Semigroup a => a -> a -> a
<> forall msg. ToLogStr msg => msg -> LogStr
toLogStr msg
tag forall a. Semigroup a => a -> a -> a
<> LogStr
"\":" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> LogStr
sw a
val
tv :: (msg, a) -> LogStr -> LogStr
tv (msg
tag, a
val) LogStr
pre = LogStr
",\"" forall a. Semigroup a => a -> a -> a
<> forall msg. ToLogStr msg => msg -> LogStr
toLogStr msg
tag forall a. Semigroup a => a -> a -> a
<> LogStr
"\":" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> LogStr
sw a
val forall a. Semigroup a => a -> a -> a
<> LogStr
pre
instance Qlog CCMode where
qlog :: CCMode -> LogStr
qlog CCMode
mode = LogStr
"{\"new\":\"" forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> LogStr
sw CCMode
mode forall a. Semigroup a => a -> a -> a
<> LogStr
"\"}"
instance Qlog TimerCancelled where
qlog :: TimerCancelled -> LogStr
qlog TimerCancelled
TimerCancelled = LogStr
"{\"event_type\":\"cancelled\"}"
instance Qlog TimerExpired where
qlog :: TimerExpired -> LogStr
qlog TimerExpired
TimerExpired = LogStr
"{\"event_type\":\"expired\"}"
instance Qlog (TimerInfo, Microseconds) where
qlog :: (TimerInfo, Microseconds) -> LogStr
qlog (TimerInfo{TimeMicrosecond
EncryptionLevel
TimerType
timerType :: TimerType
timerLevel :: EncryptionLevel
timerTime :: TimeMicrosecond
timerType :: TimerInfo -> TimerType
timerLevel :: TimerInfo -> EncryptionLevel
timerTime :: TimerInfo -> TimeMicrosecond
..}, Microseconds
us) =
LogStr
"{\"event_type\":\"set\""
forall a. Semigroup a => a -> a -> a
<> LogStr
",\"timer_type\":\""
forall a. Semigroup a => a -> a -> a
<> forall a. Show a => a -> LogStr
sw TimerType
timerType
forall a. Semigroup a => a -> a -> a
<> LogStr
"\""
forall a. Semigroup a => a -> a -> a
<> LogStr
",\"packet_number_space\":\""
forall a. Semigroup a => a -> a -> a
<> EncryptionLevel -> LogStr
packetNumberSpace EncryptionLevel
timerLevel
forall a. Semigroup a => a -> a -> a
<> LogStr
"\""
forall a. Semigroup a => a -> a -> a
<> LogStr
",\"delta\":"
forall a. Semigroup a => a -> a -> a
<> Microseconds -> LogStr
delta Microseconds
us
forall a. Semigroup a => a -> a -> a
<> LogStr
"}"
packetNumberSpace :: EncryptionLevel -> LogStr
packetNumberSpace :: EncryptionLevel -> LogStr
packetNumberSpace EncryptionLevel
InitialLevel = LogStr
"initial"
packetNumberSpace EncryptionLevel
RTT0Level = LogStr
"application_data"
packetNumberSpace EncryptionLevel
HandshakeLevel = LogStr
"handshake"
packetNumberSpace EncryptionLevel
RTT1Level = LogStr
"application_data"
delta :: Microseconds -> LogStr
delta :: Microseconds -> LogStr
delta (Microseconds Int
n) = forall a. Show a => a -> LogStr
sw Int
n
qlogSent :: (KeepQlog q, Qlog pkt) => q -> pkt -> TimeMicrosecond -> IO ()
qlogSent :: forall q pkt.
(KeepQlog q, Qlog pkt) =>
q -> pkt -> TimeMicrosecond -> IO ()
qlogSent q
q pkt
pkt TimeMicrosecond
tim = forall a. KeepQlog a => a -> QLogger
keepQlog q
q forall a b. (a -> b) -> a -> b
$ LogStr -> TimeMicrosecond -> QlogMsg
QSent (forall a. Qlog a => a -> LogStr
qlog pkt
pkt) TimeMicrosecond
tim
qlogMetricsUpdated :: KeepQlog q => q -> MetricsDiff -> IO ()
qlogMetricsUpdated :: forall q. KeepQlog q => q -> MetricsDiff -> IO ()
qlogMetricsUpdated q
q MetricsDiff
m = do
TimeMicrosecond
tim <- IO TimeMicrosecond
getTimeMicrosecond
forall a. KeepQlog a => a -> QLogger
keepQlog q
q forall a b. (a -> b) -> a -> b
$ LogStr -> TimeMicrosecond -> QlogMsg
QMetricsUpdated (forall a. Qlog a => a -> LogStr
qlog MetricsDiff
m) TimeMicrosecond
tim
qlogPacketLost :: KeepQlog q => q -> LostPacket -> IO ()
qlogPacketLost :: forall q. KeepQlog q => q -> LostPacket -> IO ()
qlogPacketLost q
q LostPacket
lpkt = do
TimeMicrosecond
tim <- IO TimeMicrosecond
getTimeMicrosecond
forall a. KeepQlog a => a -> QLogger
keepQlog q
q forall a b. (a -> b) -> a -> b
$ LogStr -> TimeMicrosecond -> QlogMsg
QPacketLost (forall a. Qlog a => a -> LogStr
qlog LostPacket
lpkt) TimeMicrosecond
tim
qlogContestionStateUpdated :: KeepQlog q => q -> CCMode -> IO ()
qlogContestionStateUpdated :: forall q. KeepQlog q => q -> CCMode -> IO ()
qlogContestionStateUpdated q
q CCMode
mode = do
TimeMicrosecond
tim <- IO TimeMicrosecond
getTimeMicrosecond
forall a. KeepQlog a => a -> QLogger
keepQlog q
q forall a b. (a -> b) -> a -> b
$ LogStr -> TimeMicrosecond -> QlogMsg
QCongestionStateUpdated (forall a. Qlog a => a -> LogStr
qlog CCMode
mode) TimeMicrosecond
tim
qlogLossTimerUpdated :: KeepQlog q => q -> (TimerInfo, Microseconds) -> IO ()
qlogLossTimerUpdated :: forall q. KeepQlog q => q -> (TimerInfo, Microseconds) -> IO ()
qlogLossTimerUpdated q
q (TimerInfo, Microseconds)
tmi = do
TimeMicrosecond
tim <- IO TimeMicrosecond
getTimeMicrosecond
forall a. KeepQlog a => a -> QLogger
keepQlog q
q forall a b. (a -> b) -> a -> b
$ LogStr -> TimeMicrosecond -> QlogMsg
QLossTimerUpdated (forall a. Qlog a => a -> LogStr
qlog (TimerInfo, Microseconds)
tmi) TimeMicrosecond
tim
qlogLossTimerCancelled :: KeepQlog q => q -> IO ()
qlogLossTimerCancelled :: forall q. KeepQlog q => q -> IO ()
qlogLossTimerCancelled q
q = do
TimeMicrosecond
tim <- IO TimeMicrosecond
getTimeMicrosecond
forall a. KeepQlog a => a -> QLogger
keepQlog q
q forall a b. (a -> b) -> a -> b
$ LogStr -> TimeMicrosecond -> QlogMsg
QLossTimerUpdated (forall a. Qlog a => a -> LogStr
qlog TimerCancelled
TimerCancelled) TimeMicrosecond
tim
qlogLossTimerExpired :: KeepQlog q => q -> IO ()
qlogLossTimerExpired :: forall q. KeepQlog q => q -> IO ()
qlogLossTimerExpired q
q = do
TimeMicrosecond
tim <- IO TimeMicrosecond
getTimeMicrosecond
forall a. KeepQlog a => a -> QLogger
keepQlog q
q forall a b. (a -> b) -> a -> b
$ LogStr -> TimeMicrosecond -> QlogMsg
QLossTimerUpdated (forall a. Qlog a => a -> LogStr
qlog TimerExpired
TimerExpired) TimeMicrosecond
tim