{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE PatternSynonyms #-}
module Network.QUIC.Parameters (
Parameters(..)
, defaultParameters
, baseParameters
, encodeParameters
, decodeParameters
, AuthCIDs(..)
, defaultAuthCIDs
, setCIDsToParameters
, getCIDsToParameters
) where
import qualified Data.ByteString as BS
import qualified Data.ByteString.Short as Short
import System.IO.Unsafe (unsafeDupablePerformIO)
import Network.QUIC.Imports
import Network.QUIC.Types
encodeParameters :: Parameters -> ByteString
encodeParameters :: Parameters -> Value
encodeParameters = ParameterList -> Value
encodeParameterList forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parameters -> ParameterList
toParameterList
decodeParameters :: ByteString -> Maybe Parameters
decodeParameters :: Value -> Maybe Parameters
decodeParameters Value
bs = ParameterList -> Parameters
fromParameterList forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Maybe ParameterList
decodeParameterList Value
bs
newtype Key = Key Word32 deriving (Key -> Key -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Key -> Key -> Bool
$c/= :: Key -> Key -> Bool
== :: Key -> Key -> Bool
$c== :: Key -> Key -> Bool
Eq, Int -> Key -> ShowS
[Key] -> ShowS
Key -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Key] -> ShowS
$cshowList :: [Key] -> ShowS
show :: Key -> String
$cshow :: Key -> String
showsPrec :: Int -> Key -> ShowS
$cshowsPrec :: Int -> Key -> ShowS
Show)
type Value = ByteString
type ParameterList = [(Key,Value)]
pattern OriginalDestinationConnectionId :: Key
pattern $bOriginalDestinationConnectionId :: Key
$mOriginalDestinationConnectionId :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
OriginalDestinationConnectionId = Key 0x00
pattern MaxIdleTimeout :: Key
pattern $bMaxIdleTimeout :: Key
$mMaxIdleTimeout :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
MaxIdleTimeout = Key 0x01
pattern StateLessResetToken :: Key
pattern $bStateLessResetToken :: Key
$mStateLessResetToken :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
StateLessResetToken = Key 0x02
pattern MaxUdpPayloadSize :: Key
pattern $bMaxUdpPayloadSize :: Key
$mMaxUdpPayloadSize :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
MaxUdpPayloadSize = Key 0x03
pattern InitialMaxData :: Key
pattern $bInitialMaxData :: Key
$mInitialMaxData :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
InitialMaxData = Key 0x04
pattern InitialMaxStreamDataBidiLocal :: Key
pattern $bInitialMaxStreamDataBidiLocal :: Key
$mInitialMaxStreamDataBidiLocal :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
InitialMaxStreamDataBidiLocal = Key 0x05
pattern InitialMaxStreamDataBidiRemote :: Key
pattern $bInitialMaxStreamDataBidiRemote :: Key
$mInitialMaxStreamDataBidiRemote :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
InitialMaxStreamDataBidiRemote = Key 0x06
pattern InitialMaxStreamDataUni :: Key
pattern $bInitialMaxStreamDataUni :: Key
$mInitialMaxStreamDataUni :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
InitialMaxStreamDataUni = Key 0x07
pattern InitialMaxStreamsBidi :: Key
pattern $bInitialMaxStreamsBidi :: Key
$mInitialMaxStreamsBidi :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
InitialMaxStreamsBidi = Key 0x08
pattern InitialMaxStreamsUni :: Key
pattern $bInitialMaxStreamsUni :: Key
$mInitialMaxStreamsUni :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
InitialMaxStreamsUni = Key 0x09
pattern AckDelayExponent :: Key
pattern $bAckDelayExponent :: Key
$mAckDelayExponent :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
AckDelayExponent = Key 0x0a
pattern MaxAckDelay :: Key
pattern $bMaxAckDelay :: Key
$mMaxAckDelay :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
MaxAckDelay = Key 0x0b
pattern DisableActiveMigration :: Key
pattern $bDisableActiveMigration :: Key
$mDisableActiveMigration :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
DisableActiveMigration = Key 0x0c
pattern PreferredAddress :: Key
pattern $bPreferredAddress :: Key
$mPreferredAddress :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
PreferredAddress = Key 0x0d
pattern ActiveConnectionIdLimit :: Key
pattern $bActiveConnectionIdLimit :: Key
$mActiveConnectionIdLimit :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
ActiveConnectionIdLimit = Key 0x0e
pattern InitialSourceConnectionId :: Key
pattern $bInitialSourceConnectionId :: Key
$mInitialSourceConnectionId :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
InitialSourceConnectionId = Key 0x0f
pattern RetrySourceConnectionId :: Key
pattern $bRetrySourceConnectionId :: Key
$mRetrySourceConnectionId :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
RetrySourceConnectionId = Key 0x10
pattern VersionInformation :: Key
pattern $bVersionInformation :: Key
$mVersionInformation :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
VersionInformation = Key 0x11
pattern Grease :: Key
pattern $bGrease :: Key
$mGrease :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
Grease = Key 0xff
pattern GreaseQuicBit :: Key
pattern $bGreaseQuicBit :: Key
$mGreaseQuicBit :: forall {r}. Key -> ((# #) -> r) -> ((# #) -> r) -> r
GreaseQuicBit = Key 0x2ab2
data Parameters = Parameters {
Parameters -> Maybe CID
originalDestinationConnectionId :: Maybe CID
, Parameters -> Milliseconds
maxIdleTimeout :: Milliseconds
, Parameters -> Maybe StatelessResetToken
statelessResetToken :: Maybe StatelessResetToken
, Parameters -> Int
maxUdpPayloadSize :: Int
, Parameters -> Int
initialMaxData :: Int
, Parameters -> Int
initialMaxStreamDataBidiLocal :: Int
, Parameters -> Int
initialMaxStreamDataBidiRemote :: Int
, Parameters -> Int
initialMaxStreamDataUni :: Int
, Parameters -> Int
initialMaxStreamsBidi :: Int
, Parameters -> Int
initialMaxStreamsUni :: Int
, Parameters -> Int
ackDelayExponent :: Int
, Parameters -> Milliseconds
maxAckDelay :: Milliseconds
, Parameters -> Bool
disableActiveMigration :: Bool
, Parameters -> Maybe Value
preferredAddress :: Maybe ByteString
, Parameters -> Int
activeConnectionIdLimit :: Int
, Parameters -> Maybe CID
initialSourceConnectionId :: Maybe CID
, Parameters -> Maybe CID
retrySourceConnectionId :: Maybe CID
, Parameters -> Maybe Value
grease :: Maybe ByteString
, Parameters -> Bool
greaseQuicBit :: Bool
, Parameters -> Maybe VersionInfo
versionInformation :: Maybe VersionInfo
} deriving (Parameters -> Parameters -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Parameters -> Parameters -> Bool
$c/= :: Parameters -> Parameters -> Bool
== :: Parameters -> Parameters -> Bool
$c== :: Parameters -> Parameters -> Bool
Eq,Int -> Parameters -> ShowS
[Parameters] -> ShowS
Parameters -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Parameters] -> ShowS
$cshowList :: [Parameters] -> ShowS
show :: Parameters -> String
$cshow :: Parameters -> String
showsPrec :: Int -> Parameters -> ShowS
$cshowsPrec :: Int -> Parameters -> ShowS
Show)
baseParameters :: Parameters
baseParameters :: Parameters
baseParameters = Parameters {
originalDestinationConnectionId :: Maybe CID
originalDestinationConnectionId = forall a. Maybe a
Nothing
, maxIdleTimeout :: Milliseconds
maxIdleTimeout = Int64 -> Milliseconds
Milliseconds Int64
0
, statelessResetToken :: Maybe StatelessResetToken
statelessResetToken = forall a. Maybe a
Nothing
, maxUdpPayloadSize :: Int
maxUdpPayloadSize = Int
65527
, initialMaxData :: Int
initialMaxData = Int
0
, initialMaxStreamDataBidiLocal :: Int
initialMaxStreamDataBidiLocal = Int
0
, initialMaxStreamDataBidiRemote :: Int
initialMaxStreamDataBidiRemote = Int
0
, initialMaxStreamDataUni :: Int
initialMaxStreamDataUni = Int
0
, initialMaxStreamsBidi :: Int
initialMaxStreamsBidi = Int
0
, initialMaxStreamsUni :: Int
initialMaxStreamsUni = Int
0
, ackDelayExponent :: Int
ackDelayExponent = Int
3
, maxAckDelay :: Milliseconds
maxAckDelay = Int64 -> Milliseconds
Milliseconds Int64
25
, disableActiveMigration :: Bool
disableActiveMigration = Bool
False
, preferredAddress :: Maybe Value
preferredAddress = forall a. Maybe a
Nothing
, activeConnectionIdLimit :: Int
activeConnectionIdLimit = Int
2
, initialSourceConnectionId :: Maybe CID
initialSourceConnectionId = forall a. Maybe a
Nothing
, retrySourceConnectionId :: Maybe CID
retrySourceConnectionId = forall a. Maybe a
Nothing
, grease :: Maybe Value
grease = forall a. Maybe a
Nothing
, greaseQuicBit :: Bool
greaseQuicBit = Bool
False
, versionInformation :: Maybe VersionInfo
versionInformation = forall a. Maybe a
Nothing
}
decInt :: ByteString -> Int
decInt :: Value -> Int
decInt = forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Int64
decodeInt
encInt :: Int -> ByteString
encInt :: Int -> Value
encInt = Int64 -> Value
encodeInt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral
decMilliseconds :: ByteString -> Milliseconds
decMilliseconds :: Value -> Milliseconds
decMilliseconds = Int64 -> Milliseconds
Milliseconds forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Int64
decodeInt
encMilliseconds :: Milliseconds -> ByteString
encMilliseconds :: Milliseconds -> Value
encMilliseconds (Milliseconds Int64
n) = Int64 -> Value
encodeInt forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
n
fromVersionInfo :: Maybe VersionInfo -> Value
fromVersionInfo :: Maybe VersionInfo -> Value
fromVersionInfo Maybe VersionInfo
Nothing = Value
""
fromVersionInfo (Just VersionInfo{[Version]
Version
otherVersions :: VersionInfo -> [Version]
chosenVersion :: VersionInfo -> Version
otherVersions :: [Version]
chosenVersion :: Version
..}) = forall a. IO a -> a
unsafeDupablePerformIO forall a b. (a -> b) -> a -> b
$
Int -> (WriteBuffer -> IO ()) -> IO Value
withWriteBuffer Int
len forall a b. (a -> b) -> a -> b
$ \WriteBuffer
wbuf -> do
let putVersion :: Version -> IO ()
putVersion (Version Word32
ver) = WriteBuffer -> Word32 -> IO ()
write32 WriteBuffer
wbuf Word32
ver
Version -> IO ()
putVersion Version
chosenVersion
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Version -> IO ()
putVersion [Version]
otherVersions
where
len :: Int
len = Int
4 forall a. Num a => a -> a -> a
* (forall (t :: * -> *) a. Foldable t => t a -> Int
length [Version]
otherVersions forall a. Num a => a -> a -> a
+ Int
1)
toVersionInfo :: Value -> Maybe VersionInfo
toVersionInfo :: Value -> Maybe VersionInfo
toVersionInfo Value
bs
| Int
len forall a. Ord a => a -> a -> Bool
< Int
3 Bool -> Bool -> Bool
|| Int
remainder forall a. Eq a => a -> a -> Bool
/= Int
0 = forall a. a -> Maybe a
Just VersionInfo
brokenVersionInfo
| Bool
otherwise = forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall a. IO a -> a
unsafeDupablePerformIO forall a b. (a -> b) -> a -> b
$
forall a. Value -> (ReadBuffer -> IO a) -> IO a
withReadBuffer Value
bs forall a b. (a -> b) -> a -> b
$ \ReadBuffer
rbuf -> do
let getVersion :: IO Version
getVersion = Word32 -> Version
Version forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Readable a => a -> IO Word32
read32 ReadBuffer
rbuf
Version -> [Version] -> VersionInfo
VersionInfo forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO Version
getVersion forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM (Int
cnt forall a. Num a => a -> a -> a
- Int
1) IO Version
getVersion
where
len :: Int
len = Value -> Int
BS.length Value
bs
(Int
cnt,Int
remainder) = Int
len forall a. Integral a => a -> a -> (a, a)
`divMod` Int
4
fromParameterList :: ParameterList -> Parameters
fromParameterList :: ParameterList -> Parameters
fromParameterList ParameterList
kvs = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' Parameters -> (Key, Value) -> Parameters
update Parameters
params ParameterList
kvs
where
params :: Parameters
params = Parameters
baseParameters
update :: Parameters -> (Key, Value) -> Parameters
update Parameters
x (Key
OriginalDestinationConnectionId,Value
v)
= Parameters
x { originalDestinationConnectionId :: Maybe CID
originalDestinationConnectionId = forall a. a -> Maybe a
Just (Value -> CID
toCID Value
v) }
update Parameters
x (Key
MaxIdleTimeout,Value
v)
= Parameters
x { maxIdleTimeout :: Milliseconds
maxIdleTimeout = Value -> Milliseconds
decMilliseconds Value
v }
update Parameters
x (Key
StateLessResetToken,Value
v)
= Parameters
x { statelessResetToken :: Maybe StatelessResetToken
statelessResetToken = forall a. a -> Maybe a
Just (Bytes -> StatelessResetToken
StatelessResetToken forall a b. (a -> b) -> a -> b
$ Value -> Bytes
Short.toShort Value
v) }
update Parameters
x (Key
MaxUdpPayloadSize,Value
v)
= Parameters
x { maxUdpPayloadSize :: Int
maxUdpPayloadSize = Value -> Int
decInt Value
v }
update Parameters
x (Key
InitialMaxData,Value
v)
= Parameters
x { initialMaxData :: Int
initialMaxData = Value -> Int
decInt Value
v }
update Parameters
x (Key
InitialMaxStreamDataBidiLocal,Value
v)
= Parameters
x { initialMaxStreamDataBidiLocal :: Int
initialMaxStreamDataBidiLocal = Value -> Int
decInt Value
v }
update Parameters
x (Key
InitialMaxStreamDataBidiRemote,Value
v)
= Parameters
x { initialMaxStreamDataBidiRemote :: Int
initialMaxStreamDataBidiRemote = Value -> Int
decInt Value
v }
update Parameters
x (Key
InitialMaxStreamDataUni,Value
v)
= Parameters
x { initialMaxStreamDataUni :: Int
initialMaxStreamDataUni = Value -> Int
decInt Value
v }
update Parameters
x (Key
InitialMaxStreamsBidi,Value
v)
= Parameters
x { initialMaxStreamsBidi :: Int
initialMaxStreamsBidi = Value -> Int
decInt Value
v }
update Parameters
x (Key
InitialMaxStreamsUni,Value
v)
= Parameters
x { initialMaxStreamsUni :: Int
initialMaxStreamsUni = Value -> Int
decInt Value
v }
update Parameters
x (Key
AckDelayExponent,Value
v)
= Parameters
x { ackDelayExponent :: Int
ackDelayExponent = Value -> Int
decInt Value
v }
update Parameters
x (Key
MaxAckDelay,Value
v)
= Parameters
x { maxAckDelay :: Milliseconds
maxAckDelay = Value -> Milliseconds
decMilliseconds Value
v }
update Parameters
x (Key
DisableActiveMigration,Value
_)
= Parameters
x { disableActiveMigration :: Bool
disableActiveMigration = Bool
True }
update Parameters
x (Key
PreferredAddress,Value
v)
= Parameters
x { preferredAddress :: Maybe Value
preferredAddress = forall a. a -> Maybe a
Just Value
v }
update Parameters
x (Key
ActiveConnectionIdLimit,Value
v)
= Parameters
x { activeConnectionIdLimit :: Int
activeConnectionIdLimit = Value -> Int
decInt Value
v }
update Parameters
x (Key
InitialSourceConnectionId,Value
v)
= Parameters
x { initialSourceConnectionId :: Maybe CID
initialSourceConnectionId = forall a. a -> Maybe a
Just (Value -> CID
toCID Value
v) }
update Parameters
x (Key
RetrySourceConnectionId,Value
v)
= Parameters
x { retrySourceConnectionId :: Maybe CID
retrySourceConnectionId = forall a. a -> Maybe a
Just (Value -> CID
toCID Value
v) }
update Parameters
x (Key
Grease,Value
v)
= Parameters
x { grease :: Maybe Value
grease = forall a. a -> Maybe a
Just Value
v }
update Parameters
x (Key
GreaseQuicBit,Value
_)
= Parameters
x { greaseQuicBit :: Bool
greaseQuicBit = Bool
True }
update Parameters
x (Key
VersionInformation,Value
v)
= Parameters
x { versionInformation :: Maybe VersionInfo
versionInformation = Value -> Maybe VersionInfo
toVersionInfo Value
v }
update Parameters
x (Key, Value)
_ = Parameters
x
diff :: Eq a => Parameters -> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key,Value)
diff :: forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
params Parameters -> a
label Key
key a -> Value
enc
| a
val forall a. Eq a => a -> a -> Bool
== a
val0 = forall a. Maybe a
Nothing
| Bool
otherwise = forall a. a -> Maybe a
Just (Key
key, a -> Value
enc a
val)
where
val :: a
val = Parameters -> a
label Parameters
params
val0 :: a
val0 = Parameters -> a
label Parameters
baseParameters
toParameterList :: Parameters -> ParameterList
toParameterList :: Parameters -> ParameterList
toParameterList Parameters
p = forall a. [Maybe a] -> [a]
catMaybes [
forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Maybe CID
originalDestinationConnectionId
Key
OriginalDestinationConnectionId (CID -> Value
fromCID forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust)
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Milliseconds
maxIdleTimeout Key
MaxIdleTimeout Milliseconds -> Value
encMilliseconds
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Maybe StatelessResetToken
statelessResetToken Key
StateLessResetToken Maybe StatelessResetToken -> Value
encSRT
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Int
maxUdpPayloadSize Key
MaxUdpPayloadSize Int -> Value
encInt
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Int
initialMaxData Key
InitialMaxData Int -> Value
encInt
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Int
initialMaxStreamDataBidiLocal Key
InitialMaxStreamDataBidiLocal Int -> Value
encInt
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Int
initialMaxStreamDataBidiRemote Key
InitialMaxStreamDataBidiRemote Int -> Value
encInt
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Int
initialMaxStreamDataUni Key
InitialMaxStreamDataUni Int -> Value
encInt
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Int
initialMaxStreamsBidi Key
InitialMaxStreamsBidi Int -> Value
encInt
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Int
initialMaxStreamsUni Key
InitialMaxStreamsUni Int -> Value
encInt
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Int
ackDelayExponent Key
AckDelayExponent Int -> Value
encInt
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Milliseconds
maxAckDelay Key
MaxAckDelay Milliseconds -> Value
encMilliseconds
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Bool
disableActiveMigration Key
DisableActiveMigration (forall a b. a -> b -> a
const Value
"")
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Maybe Value
preferredAddress Key
PreferredAddress forall a. HasCallStack => Maybe a -> a
fromJust
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Int
activeConnectionIdLimit Key
ActiveConnectionIdLimit Int -> Value
encInt
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Maybe CID
initialSourceConnectionId
Key
InitialSourceConnectionId (CID -> Value
fromCID forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust)
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Maybe CID
retrySourceConnectionId
Key
RetrySourceConnectionId (CID -> Value
fromCID forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust)
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Bool
greaseQuicBit Key
GreaseQuicBit (forall a b. a -> b -> a
const Value
"")
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Maybe Value
grease Key
Grease forall a. HasCallStack => Maybe a -> a
fromJust
, forall a.
Eq a =>
Parameters
-> (Parameters -> a) -> Key -> (a -> Value) -> Maybe (Key, Value)
diff Parameters
p Parameters -> Maybe VersionInfo
versionInformation Key
VersionInformation Maybe VersionInfo -> Value
fromVersionInfo
]
encSRT :: Maybe StatelessResetToken -> ByteString
encSRT :: Maybe StatelessResetToken -> Value
encSRT (Just (StatelessResetToken Bytes
srt)) = Bytes -> Value
Short.fromShort Bytes
srt
encSRT Maybe StatelessResetToken
_ = forall a. HasCallStack => String -> a
error String
"encSRT"
encodeParameterList :: ParameterList -> ByteString
encodeParameterList :: ParameterList -> Value
encodeParameterList ParameterList
kvs = forall a. IO a -> a
unsafeDupablePerformIO forall a b. (a -> b) -> a -> b
$
Int -> (WriteBuffer -> IO ()) -> IO Value
withWriteBuffer Int
4096 forall a b. (a -> b) -> a -> b
$ \WriteBuffer
wbuf -> do
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (WriteBuffer -> (Key, Value) -> IO ()
put WriteBuffer
wbuf) ParameterList
kvs
where
put :: WriteBuffer -> (Key, Value) -> IO ()
put WriteBuffer
wbuf (Key Word32
k,Value
v) = do
WriteBuffer -> Int64 -> IO ()
encodeInt' WriteBuffer
wbuf forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
k
WriteBuffer -> Int64 -> IO ()
encodeInt' WriteBuffer
wbuf forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral forall a b. (a -> b) -> a -> b
$ Value -> Int
BS.length Value
v
WriteBuffer -> Value -> IO ()
copyByteString WriteBuffer
wbuf Value
v
decodeParameterList :: ByteString -> Maybe ParameterList
decodeParameterList :: Value -> Maybe ParameterList
decodeParameterList Value
bs = forall a. IO a -> a
unsafeDupablePerformIO forall a b. (a -> b) -> a -> b
$ forall a. Value -> (ReadBuffer -> IO a) -> IO a
withReadBuffer Value
bs (forall {c}. ReadBuffer -> (ParameterList -> c) -> IO (Maybe c)
`go` forall a. a -> a
id)
where
go :: ReadBuffer -> (ParameterList -> c) -> IO (Maybe c)
go ReadBuffer
rbuf ParameterList -> c
build = do
Int
rest1 <- forall a. Readable a => a -> IO Int
remainingSize ReadBuffer
rbuf
if Int
rest1 forall a. Eq a => a -> a -> Bool
== Int
0 then
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just (ParameterList -> c
build [])
else do
Word32
key <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBuffer -> IO Int64
decodeInt' ReadBuffer
rbuf
Int
len <- forall a b. (Integral a, Num b) => a -> b
fromIntegral forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReadBuffer -> IO Int64
decodeInt' ReadBuffer
rbuf
Value
val <- forall a. Readable a => a -> Int -> IO Value
extractByteString ReadBuffer
rbuf Int
len
ReadBuffer -> (ParameterList -> c) -> IO (Maybe c)
go ReadBuffer
rbuf (ParameterList -> c
build forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Word32 -> Key
Key Word32
key,Value
val)forall a. a -> [a] -> [a]
:))
defaultParameters :: Parameters
defaultParameters :: Parameters
defaultParameters = Parameters
baseParameters {
maxIdleTimeout :: Milliseconds
maxIdleTimeout = Microseconds -> Milliseconds
microToMilli Microseconds
idleTimeout
, maxUdpPayloadSize :: Int
maxUdpPayloadSize = Int
maximumUdpPayloadSize
, initialMaxData :: Int
initialMaxData = Int
1048576
, initialMaxStreamDataBidiLocal :: Int
initialMaxStreamDataBidiLocal = Int
262144
, initialMaxStreamDataBidiRemote :: Int
initialMaxStreamDataBidiRemote = Int
262144
, initialMaxStreamDataUni :: Int
initialMaxStreamDataUni = Int
262144
, initialMaxStreamsBidi :: Int
initialMaxStreamsBidi = Int
100
, initialMaxStreamsUni :: Int
initialMaxStreamsUni = Int
3
, activeConnectionIdLimit :: Int
activeConnectionIdLimit = Int
3
, greaseQuicBit :: Bool
greaseQuicBit = Bool
True
}
data AuthCIDs = AuthCIDs {
AuthCIDs -> Maybe CID
initSrcCID :: Maybe CID
, AuthCIDs -> Maybe CID
origDstCID :: Maybe CID
, AuthCIDs -> Maybe CID
retrySrcCID :: Maybe CID
} deriving (AuthCIDs -> AuthCIDs -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AuthCIDs -> AuthCIDs -> Bool
$c/= :: AuthCIDs -> AuthCIDs -> Bool
== :: AuthCIDs -> AuthCIDs -> Bool
$c== :: AuthCIDs -> AuthCIDs -> Bool
Eq, Int -> AuthCIDs -> ShowS
[AuthCIDs] -> ShowS
AuthCIDs -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AuthCIDs] -> ShowS
$cshowList :: [AuthCIDs] -> ShowS
show :: AuthCIDs -> String
$cshow :: AuthCIDs -> String
showsPrec :: Int -> AuthCIDs -> ShowS
$cshowsPrec :: Int -> AuthCIDs -> ShowS
Show)
defaultAuthCIDs :: AuthCIDs
defaultAuthCIDs :: AuthCIDs
defaultAuthCIDs = Maybe CID -> Maybe CID -> Maybe CID -> AuthCIDs
AuthCIDs forall a. Maybe a
Nothing forall a. Maybe a
Nothing forall a. Maybe a
Nothing
setCIDsToParameters :: AuthCIDs -> Parameters -> Parameters
setCIDsToParameters :: AuthCIDs -> Parameters -> Parameters
setCIDsToParameters AuthCIDs{Maybe CID
retrySrcCID :: Maybe CID
origDstCID :: Maybe CID
initSrcCID :: Maybe CID
retrySrcCID :: AuthCIDs -> Maybe CID
origDstCID :: AuthCIDs -> Maybe CID
initSrcCID :: AuthCIDs -> Maybe CID
..} Parameters
params = Parameters
params {
originalDestinationConnectionId :: Maybe CID
originalDestinationConnectionId = Maybe CID
origDstCID
, initialSourceConnectionId :: Maybe CID
initialSourceConnectionId = Maybe CID
initSrcCID
, retrySourceConnectionId :: Maybe CID
retrySourceConnectionId = Maybe CID
retrySrcCID
}
getCIDsToParameters :: Parameters -> AuthCIDs
getCIDsToParameters :: Parameters -> AuthCIDs
getCIDsToParameters Parameters{Bool
Int
Maybe Value
Maybe StatelessResetToken
Maybe CID
Maybe VersionInfo
Milliseconds
versionInformation :: Maybe VersionInfo
greaseQuicBit :: Bool
grease :: Maybe Value
retrySourceConnectionId :: Maybe CID
initialSourceConnectionId :: Maybe CID
activeConnectionIdLimit :: Int
preferredAddress :: Maybe Value
disableActiveMigration :: Bool
maxAckDelay :: Milliseconds
ackDelayExponent :: Int
initialMaxStreamsUni :: Int
initialMaxStreamsBidi :: Int
initialMaxStreamDataUni :: Int
initialMaxStreamDataBidiRemote :: Int
initialMaxStreamDataBidiLocal :: Int
initialMaxData :: Int
maxUdpPayloadSize :: Int
statelessResetToken :: Maybe StatelessResetToken
maxIdleTimeout :: Milliseconds
originalDestinationConnectionId :: Maybe CID
versionInformation :: Parameters -> Maybe VersionInfo
greaseQuicBit :: Parameters -> Bool
grease :: Parameters -> Maybe Value
retrySourceConnectionId :: Parameters -> Maybe CID
initialSourceConnectionId :: Parameters -> Maybe CID
activeConnectionIdLimit :: Parameters -> Int
preferredAddress :: Parameters -> Maybe Value
disableActiveMigration :: Parameters -> Bool
maxAckDelay :: Parameters -> Milliseconds
ackDelayExponent :: Parameters -> Int
initialMaxStreamsUni :: Parameters -> Int
initialMaxStreamsBidi :: Parameters -> Int
initialMaxStreamDataUni :: Parameters -> Int
initialMaxStreamDataBidiRemote :: Parameters -> Int
initialMaxStreamDataBidiLocal :: Parameters -> Int
initialMaxData :: Parameters -> Int
maxUdpPayloadSize :: Parameters -> Int
statelessResetToken :: Parameters -> Maybe StatelessResetToken
maxIdleTimeout :: Parameters -> Milliseconds
originalDestinationConnectionId :: Parameters -> Maybe CID
..} = AuthCIDs {
origDstCID :: Maybe CID
origDstCID = Maybe CID
originalDestinationConnectionId
, initSrcCID :: Maybe CID
initSrcCID = Maybe CID
initialSourceConnectionId
, retrySrcCID :: Maybe CID
retrySrcCID = Maybe CID
retrySourceConnectionId
}