{-# LANGUAGE BinaryLiterals #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Network.QUIC.Connection.Stream (
getMyStreamId,
possibleMyStreams,
waitMyNewStreamId,
waitMyNewUniStreamId,
setTxMaxStreams,
setTxUniMaxStreams,
checkRxMaxStreams,
updatePeerStreamId,
checkStreamIdRoom,
) where
import UnliftIO.STM
import Network.QUIC.Connection.Misc
import Network.QUIC.Connection.Types
import Network.QUIC.Connector
import Network.QUIC.Imports
import Network.QUIC.Parameters
import Network.QUIC.Types
getMyStreamId :: Connection -> IO Int
getMyStreamId :: Connection -> IO StreamId
getMyStreamId Connection{Recv
Buffer
Array EncryptionLevel (TVar [ReceivedPacket])
IOArray Bool Coder1RTT
IOArray EncryptionLevel Cipher
IOArray EncryptionLevel Protector
IOArray EncryptionLevel Coder
ThreadId
TVar Bool
TVar StreamId
TVar TxFlow
TVar Concurrency
TVar MigrationState
TVar CIDDB
IORef StreamId
IORef (IO ())
IORef (Bool, StreamId)
IORef RxFlow
IORef UDPSocket
IORef Microseconds
IORef VersionInfo
IORef StreamTable
IORef AuthCIDs
IORef Parameters
IORef Concurrency
IORef Negotiated
IORef CIDDB
IORef RoleInfo
Rate
MigrationQ
OutputQ
CryptoQ
InputQ
OutputQ1
VersionInfo
RecvQ
SizedBuffer
ConnState
Parameters
LDCC
Hooks
Shared
Send
DebugLogger
QLogger
connLDCC :: Connection -> LDCC
decryptBuf :: Connection -> Buffer
encryptRes :: Connection -> SizedBuffer
encodeBuf :: Connection -> Buffer
connResources :: Connection -> IORef (IO ())
connPeerAuthCIDs :: Connection -> IORef AuthCIDs
connMyAuthCIDs :: Connection -> IORef AuthCIDs
negotiated :: Connection -> IORef Negotiated
currentKeyPhase :: Connection -> IORef (Bool, StreamId)
protectors :: Connection -> IOArray EncryptionLevel Protector
coders1RTT :: Connection -> IOArray Bool Coder1RTT
coders :: Connection -> IOArray EncryptionLevel Coder
ciphers :: Connection -> IOArray EncryptionLevel Cipher
pendingQ :: Connection -> Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: Connection -> TVar Bool
bytesRx :: Connection -> TVar StreamId
bytesTx :: Connection -> TVar StreamId
minIdleTimeout :: Connection -> IORef Microseconds
migrationState :: Connection -> TVar MigrationState
flowRx :: Connection -> IORef RxFlow
flowTx :: Connection -> TVar TxFlow
peerUniStreamId :: Connection -> IORef Concurrency
peerStreamId :: Connection -> IORef Concurrency
myUniStreamId :: Connection -> TVar Concurrency
myStreamId :: Connection -> TVar Concurrency
streamTable :: Connection -> IORef StreamTable
peerPacketNumber :: Connection -> IORef StreamId
delayedAckCancel :: Connection -> IORef (IO ())
delayedAckCount :: Connection -> IORef StreamId
shared :: Connection -> Shared
migrationQ :: Connection -> MigrationQ
outputQ1 :: Connection -> OutputQ1
outputQ :: Connection -> OutputQ
cryptoQ :: Connection -> CryptoQ
inputQ :: Connection -> InputQ
peerCIDDB :: Connection -> TVar CIDDB
peerParameters :: Connection -> IORef Parameters
myCIDDB :: Connection -> IORef CIDDB
myParameters :: Connection -> Parameters
origVersionInfo :: Connection -> VersionInfo
quicVersionInfo :: Connection -> IORef VersionInfo
roleInfo :: Connection -> IORef RoleInfo
controlRate :: Connection -> Rate
mainThreadId :: Connection -> ThreadId
readers :: Connection -> IORef (IO ())
udpSocket :: Connection -> IORef UDPSocket
connRecvQ :: Connection -> RecvQ
connRecv :: Connection -> Recv
connSend :: Connection -> Send
connHooks :: Connection -> Hooks
connQLog :: Connection -> QLogger
connDebugLog :: Connection -> DebugLogger
connState :: Connection -> ConnState
connLDCC :: LDCC
decryptBuf :: Buffer
encryptRes :: SizedBuffer
encodeBuf :: Buffer
connResources :: IORef (IO ())
connPeerAuthCIDs :: IORef AuthCIDs
connMyAuthCIDs :: IORef AuthCIDs
negotiated :: IORef Negotiated
currentKeyPhase :: IORef (Bool, StreamId)
protectors :: IOArray EncryptionLevel Protector
coders1RTT :: IOArray Bool Coder1RTT
coders :: IOArray EncryptionLevel Coder
ciphers :: IOArray EncryptionLevel Cipher
pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: TVar Bool
bytesRx :: TVar StreamId
bytesTx :: TVar StreamId
minIdleTimeout :: IORef Microseconds
migrationState :: TVar MigrationState
flowRx :: IORef RxFlow
flowTx :: TVar TxFlow
peerUniStreamId :: IORef Concurrency
peerStreamId :: IORef Concurrency
myUniStreamId :: TVar Concurrency
myStreamId :: TVar Concurrency
streamTable :: IORef StreamTable
peerPacketNumber :: IORef StreamId
delayedAckCancel :: IORef (IO ())
delayedAckCount :: IORef StreamId
shared :: Shared
migrationQ :: MigrationQ
outputQ1 :: OutputQ1
outputQ :: OutputQ
cryptoQ :: CryptoQ
inputQ :: InputQ
peerCIDDB :: TVar CIDDB
peerParameters :: IORef Parameters
myCIDDB :: IORef CIDDB
myParameters :: Parameters
origVersionInfo :: VersionInfo
quicVersionInfo :: IORef VersionInfo
roleInfo :: IORef RoleInfo
controlRate :: Rate
mainThreadId :: ThreadId
readers :: IORef (IO ())
udpSocket :: IORef UDPSocket
connRecvQ :: RecvQ
connRecv :: Recv
connSend :: Send
connHooks :: Hooks
connQLog :: QLogger
connDebugLog :: DebugLogger
connState :: ConnState
..} = do
StreamId
next <- Concurrency -> StreamId
currentStream forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) a. MonadIO m => TVar a -> m a
readTVarIO TVar Concurrency
myStreamId
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ StreamId
next forall a. Num a => a -> a -> a
- StreamId
4
possibleMyStreams :: Connection -> IO Int
possibleMyStreams :: Connection -> IO StreamId
possibleMyStreams Connection{Recv
Buffer
Array EncryptionLevel (TVar [ReceivedPacket])
IOArray Bool Coder1RTT
IOArray EncryptionLevel Cipher
IOArray EncryptionLevel Protector
IOArray EncryptionLevel Coder
ThreadId
TVar Bool
TVar StreamId
TVar TxFlow
TVar Concurrency
TVar MigrationState
TVar CIDDB
IORef StreamId
IORef (IO ())
IORef (Bool, StreamId)
IORef RxFlow
IORef UDPSocket
IORef Microseconds
IORef VersionInfo
IORef StreamTable
IORef AuthCIDs
IORef Parameters
IORef Concurrency
IORef Negotiated
IORef CIDDB
IORef RoleInfo
Rate
MigrationQ
OutputQ
CryptoQ
InputQ
OutputQ1
VersionInfo
RecvQ
SizedBuffer
ConnState
Parameters
LDCC
Hooks
Shared
Send
DebugLogger
QLogger
connLDCC :: LDCC
decryptBuf :: Buffer
encryptRes :: SizedBuffer
encodeBuf :: Buffer
connResources :: IORef (IO ())
connPeerAuthCIDs :: IORef AuthCIDs
connMyAuthCIDs :: IORef AuthCIDs
negotiated :: IORef Negotiated
currentKeyPhase :: IORef (Bool, StreamId)
protectors :: IOArray EncryptionLevel Protector
coders1RTT :: IOArray Bool Coder1RTT
coders :: IOArray EncryptionLevel Coder
ciphers :: IOArray EncryptionLevel Cipher
pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: TVar Bool
bytesRx :: TVar StreamId
bytesTx :: TVar StreamId
minIdleTimeout :: IORef Microseconds
migrationState :: TVar MigrationState
flowRx :: IORef RxFlow
flowTx :: TVar TxFlow
peerUniStreamId :: IORef Concurrency
peerStreamId :: IORef Concurrency
myUniStreamId :: TVar Concurrency
myStreamId :: TVar Concurrency
streamTable :: IORef StreamTable
peerPacketNumber :: IORef StreamId
delayedAckCancel :: IORef (IO ())
delayedAckCount :: IORef StreamId
shared :: Shared
migrationQ :: MigrationQ
outputQ1 :: OutputQ1
outputQ :: OutputQ
cryptoQ :: CryptoQ
inputQ :: InputQ
peerCIDDB :: TVar CIDDB
peerParameters :: IORef Parameters
myCIDDB :: IORef CIDDB
myParameters :: Parameters
origVersionInfo :: VersionInfo
quicVersionInfo :: IORef VersionInfo
roleInfo :: IORef RoleInfo
controlRate :: Rate
mainThreadId :: ThreadId
readers :: IORef (IO ())
udpSocket :: IORef UDPSocket
connRecvQ :: RecvQ
connRecv :: Recv
connSend :: Send
connHooks :: Hooks
connQLog :: QLogger
connDebugLog :: DebugLogger
connState :: ConnState
connLDCC :: Connection -> LDCC
decryptBuf :: Connection -> Buffer
encryptRes :: Connection -> SizedBuffer
encodeBuf :: Connection -> Buffer
connResources :: Connection -> IORef (IO ())
connPeerAuthCIDs :: Connection -> IORef AuthCIDs
connMyAuthCIDs :: Connection -> IORef AuthCIDs
negotiated :: Connection -> IORef Negotiated
currentKeyPhase :: Connection -> IORef (Bool, StreamId)
protectors :: Connection -> IOArray EncryptionLevel Protector
coders1RTT :: Connection -> IOArray Bool Coder1RTT
coders :: Connection -> IOArray EncryptionLevel Coder
ciphers :: Connection -> IOArray EncryptionLevel Cipher
pendingQ :: Connection -> Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: Connection -> TVar Bool
bytesRx :: Connection -> TVar StreamId
bytesTx :: Connection -> TVar StreamId
minIdleTimeout :: Connection -> IORef Microseconds
migrationState :: Connection -> TVar MigrationState
flowRx :: Connection -> IORef RxFlow
flowTx :: Connection -> TVar TxFlow
peerUniStreamId :: Connection -> IORef Concurrency
peerStreamId :: Connection -> IORef Concurrency
myUniStreamId :: Connection -> TVar Concurrency
myStreamId :: Connection -> TVar Concurrency
streamTable :: Connection -> IORef StreamTable
peerPacketNumber :: Connection -> IORef StreamId
delayedAckCancel :: Connection -> IORef (IO ())
delayedAckCount :: Connection -> IORef StreamId
shared :: Connection -> Shared
migrationQ :: Connection -> MigrationQ
outputQ1 :: Connection -> OutputQ1
outputQ :: Connection -> OutputQ
cryptoQ :: Connection -> CryptoQ
inputQ :: Connection -> InputQ
peerCIDDB :: Connection -> TVar CIDDB
peerParameters :: Connection -> IORef Parameters
myCIDDB :: Connection -> IORef CIDDB
myParameters :: Connection -> Parameters
origVersionInfo :: Connection -> VersionInfo
quicVersionInfo :: Connection -> IORef VersionInfo
roleInfo :: Connection -> IORef RoleInfo
controlRate :: Connection -> Rate
mainThreadId :: Connection -> ThreadId
readers :: Connection -> IORef (IO ())
udpSocket :: Connection -> IORef UDPSocket
connRecvQ :: Connection -> RecvQ
connRecv :: Connection -> Recv
connSend :: Connection -> Send
connHooks :: Connection -> Hooks
connQLog :: Connection -> QLogger
connDebugLog :: Connection -> DebugLogger
connState :: Connection -> ConnState
..} = do
Concurrency{StreamId
StreamIdBase
maxStreams :: Concurrency -> StreamIdBase
maxStreams :: StreamIdBase
currentStream :: StreamId
currentStream :: Concurrency -> StreamId
..} <- forall (m :: * -> *) a. MonadIO m => TVar a -> m a
readTVarIO TVar Concurrency
myStreamId
let StreamIdBase StreamId
base = StreamIdBase
maxStreams
forall (m :: * -> *) a. Monad m => a -> m a
return (StreamId
base forall a. Num a => a -> a -> a
- (StreamId
currentStream forall a. Bits a => a -> StreamId -> a
!>>. StreamId
2))
waitMyNewStreamId :: Connection -> IO StreamId
waitMyNewStreamId :: Connection -> IO StreamId
waitMyNewStreamId Connection{Recv
Buffer
Array EncryptionLevel (TVar [ReceivedPacket])
IOArray Bool Coder1RTT
IOArray EncryptionLevel Cipher
IOArray EncryptionLevel Protector
IOArray EncryptionLevel Coder
ThreadId
TVar Bool
TVar StreamId
TVar TxFlow
TVar Concurrency
TVar MigrationState
TVar CIDDB
IORef StreamId
IORef (IO ())
IORef (Bool, StreamId)
IORef RxFlow
IORef UDPSocket
IORef Microseconds
IORef VersionInfo
IORef StreamTable
IORef AuthCIDs
IORef Parameters
IORef Concurrency
IORef Negotiated
IORef CIDDB
IORef RoleInfo
Rate
MigrationQ
OutputQ
CryptoQ
InputQ
OutputQ1
VersionInfo
RecvQ
SizedBuffer
ConnState
Parameters
LDCC
Hooks
Shared
Send
DebugLogger
QLogger
connLDCC :: LDCC
decryptBuf :: Buffer
encryptRes :: SizedBuffer
encodeBuf :: Buffer
connResources :: IORef (IO ())
connPeerAuthCIDs :: IORef AuthCIDs
connMyAuthCIDs :: IORef AuthCIDs
negotiated :: IORef Negotiated
currentKeyPhase :: IORef (Bool, StreamId)
protectors :: IOArray EncryptionLevel Protector
coders1RTT :: IOArray Bool Coder1RTT
coders :: IOArray EncryptionLevel Coder
ciphers :: IOArray EncryptionLevel Cipher
pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: TVar Bool
bytesRx :: TVar StreamId
bytesTx :: TVar StreamId
minIdleTimeout :: IORef Microseconds
migrationState :: TVar MigrationState
flowRx :: IORef RxFlow
flowTx :: TVar TxFlow
peerUniStreamId :: IORef Concurrency
peerStreamId :: IORef Concurrency
myUniStreamId :: TVar Concurrency
myStreamId :: TVar Concurrency
streamTable :: IORef StreamTable
peerPacketNumber :: IORef StreamId
delayedAckCancel :: IORef (IO ())
delayedAckCount :: IORef StreamId
shared :: Shared
migrationQ :: MigrationQ
outputQ1 :: OutputQ1
outputQ :: OutputQ
cryptoQ :: CryptoQ
inputQ :: InputQ
peerCIDDB :: TVar CIDDB
peerParameters :: IORef Parameters
myCIDDB :: IORef CIDDB
myParameters :: Parameters
origVersionInfo :: VersionInfo
quicVersionInfo :: IORef VersionInfo
roleInfo :: IORef RoleInfo
controlRate :: Rate
mainThreadId :: ThreadId
readers :: IORef (IO ())
udpSocket :: IORef UDPSocket
connRecvQ :: RecvQ
connRecv :: Recv
connSend :: Send
connHooks :: Hooks
connQLog :: QLogger
connDebugLog :: DebugLogger
connState :: ConnState
connLDCC :: Connection -> LDCC
decryptBuf :: Connection -> Buffer
encryptRes :: Connection -> SizedBuffer
encodeBuf :: Connection -> Buffer
connResources :: Connection -> IORef (IO ())
connPeerAuthCIDs :: Connection -> IORef AuthCIDs
connMyAuthCIDs :: Connection -> IORef AuthCIDs
negotiated :: Connection -> IORef Negotiated
currentKeyPhase :: Connection -> IORef (Bool, StreamId)
protectors :: Connection -> IOArray EncryptionLevel Protector
coders1RTT :: Connection -> IOArray Bool Coder1RTT
coders :: Connection -> IOArray EncryptionLevel Coder
ciphers :: Connection -> IOArray EncryptionLevel Cipher
pendingQ :: Connection -> Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: Connection -> TVar Bool
bytesRx :: Connection -> TVar StreamId
bytesTx :: Connection -> TVar StreamId
minIdleTimeout :: Connection -> IORef Microseconds
migrationState :: Connection -> TVar MigrationState
flowRx :: Connection -> IORef RxFlow
flowTx :: Connection -> TVar TxFlow
peerUniStreamId :: Connection -> IORef Concurrency
peerStreamId :: Connection -> IORef Concurrency
myUniStreamId :: Connection -> TVar Concurrency
myStreamId :: Connection -> TVar Concurrency
streamTable :: Connection -> IORef StreamTable
peerPacketNumber :: Connection -> IORef StreamId
delayedAckCancel :: Connection -> IORef (IO ())
delayedAckCount :: Connection -> IORef StreamId
shared :: Connection -> Shared
migrationQ :: Connection -> MigrationQ
outputQ1 :: Connection -> OutputQ1
outputQ :: Connection -> OutputQ
cryptoQ :: Connection -> CryptoQ
inputQ :: Connection -> InputQ
peerCIDDB :: Connection -> TVar CIDDB
peerParameters :: Connection -> IORef Parameters
myCIDDB :: Connection -> IORef CIDDB
myParameters :: Connection -> Parameters
origVersionInfo :: Connection -> VersionInfo
quicVersionInfo :: Connection -> IORef VersionInfo
roleInfo :: Connection -> IORef RoleInfo
controlRate :: Connection -> Rate
mainThreadId :: Connection -> ThreadId
readers :: Connection -> IORef (IO ())
udpSocket :: Connection -> IORef UDPSocket
connRecvQ :: Connection -> RecvQ
connRecv :: Connection -> Recv
connSend :: Connection -> Send
connHooks :: Connection -> Hooks
connQLog :: Connection -> QLogger
connDebugLog :: Connection -> DebugLogger
connState :: Connection -> ConnState
..} = TVar Concurrency -> IO StreamId
get TVar Concurrency
myStreamId
waitMyNewUniStreamId :: Connection -> IO StreamId
waitMyNewUniStreamId :: Connection -> IO StreamId
waitMyNewUniStreamId Connection{Recv
Buffer
Array EncryptionLevel (TVar [ReceivedPacket])
IOArray Bool Coder1RTT
IOArray EncryptionLevel Cipher
IOArray EncryptionLevel Protector
IOArray EncryptionLevel Coder
ThreadId
TVar Bool
TVar StreamId
TVar TxFlow
TVar Concurrency
TVar MigrationState
TVar CIDDB
IORef StreamId
IORef (IO ())
IORef (Bool, StreamId)
IORef RxFlow
IORef UDPSocket
IORef Microseconds
IORef VersionInfo
IORef StreamTable
IORef AuthCIDs
IORef Parameters
IORef Concurrency
IORef Negotiated
IORef CIDDB
IORef RoleInfo
Rate
MigrationQ
OutputQ
CryptoQ
InputQ
OutputQ1
VersionInfo
RecvQ
SizedBuffer
ConnState
Parameters
LDCC
Hooks
Shared
Send
DebugLogger
QLogger
connLDCC :: LDCC
decryptBuf :: Buffer
encryptRes :: SizedBuffer
encodeBuf :: Buffer
connResources :: IORef (IO ())
connPeerAuthCIDs :: IORef AuthCIDs
connMyAuthCIDs :: IORef AuthCIDs
negotiated :: IORef Negotiated
currentKeyPhase :: IORef (Bool, StreamId)
protectors :: IOArray EncryptionLevel Protector
coders1RTT :: IOArray Bool Coder1RTT
coders :: IOArray EncryptionLevel Coder
ciphers :: IOArray EncryptionLevel Cipher
pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: TVar Bool
bytesRx :: TVar StreamId
bytesTx :: TVar StreamId
minIdleTimeout :: IORef Microseconds
migrationState :: TVar MigrationState
flowRx :: IORef RxFlow
flowTx :: TVar TxFlow
peerUniStreamId :: IORef Concurrency
peerStreamId :: IORef Concurrency
myUniStreamId :: TVar Concurrency
myStreamId :: TVar Concurrency
streamTable :: IORef StreamTable
peerPacketNumber :: IORef StreamId
delayedAckCancel :: IORef (IO ())
delayedAckCount :: IORef StreamId
shared :: Shared
migrationQ :: MigrationQ
outputQ1 :: OutputQ1
outputQ :: OutputQ
cryptoQ :: CryptoQ
inputQ :: InputQ
peerCIDDB :: TVar CIDDB
peerParameters :: IORef Parameters
myCIDDB :: IORef CIDDB
myParameters :: Parameters
origVersionInfo :: VersionInfo
quicVersionInfo :: IORef VersionInfo
roleInfo :: IORef RoleInfo
controlRate :: Rate
mainThreadId :: ThreadId
readers :: IORef (IO ())
udpSocket :: IORef UDPSocket
connRecvQ :: RecvQ
connRecv :: Recv
connSend :: Send
connHooks :: Hooks
connQLog :: QLogger
connDebugLog :: DebugLogger
connState :: ConnState
connLDCC :: Connection -> LDCC
decryptBuf :: Connection -> Buffer
encryptRes :: Connection -> SizedBuffer
encodeBuf :: Connection -> Buffer
connResources :: Connection -> IORef (IO ())
connPeerAuthCIDs :: Connection -> IORef AuthCIDs
connMyAuthCIDs :: Connection -> IORef AuthCIDs
negotiated :: Connection -> IORef Negotiated
currentKeyPhase :: Connection -> IORef (Bool, StreamId)
protectors :: Connection -> IOArray EncryptionLevel Protector
coders1RTT :: Connection -> IOArray Bool Coder1RTT
coders :: Connection -> IOArray EncryptionLevel Coder
ciphers :: Connection -> IOArray EncryptionLevel Cipher
pendingQ :: Connection -> Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: Connection -> TVar Bool
bytesRx :: Connection -> TVar StreamId
bytesTx :: Connection -> TVar StreamId
minIdleTimeout :: Connection -> IORef Microseconds
migrationState :: Connection -> TVar MigrationState
flowRx :: Connection -> IORef RxFlow
flowTx :: Connection -> TVar TxFlow
peerUniStreamId :: Connection -> IORef Concurrency
peerStreamId :: Connection -> IORef Concurrency
myUniStreamId :: Connection -> TVar Concurrency
myStreamId :: Connection -> TVar Concurrency
streamTable :: Connection -> IORef StreamTable
peerPacketNumber :: Connection -> IORef StreamId
delayedAckCancel :: Connection -> IORef (IO ())
delayedAckCount :: Connection -> IORef StreamId
shared :: Connection -> Shared
migrationQ :: Connection -> MigrationQ
outputQ1 :: Connection -> OutputQ1
outputQ :: Connection -> OutputQ
cryptoQ :: Connection -> CryptoQ
inputQ :: Connection -> InputQ
peerCIDDB :: Connection -> TVar CIDDB
peerParameters :: Connection -> IORef Parameters
myCIDDB :: Connection -> IORef CIDDB
myParameters :: Connection -> Parameters
origVersionInfo :: Connection -> VersionInfo
quicVersionInfo :: Connection -> IORef VersionInfo
roleInfo :: Connection -> IORef RoleInfo
controlRate :: Connection -> Rate
mainThreadId :: Connection -> ThreadId
readers :: Connection -> IORef (IO ())
udpSocket :: Connection -> IORef UDPSocket
connRecvQ :: Connection -> RecvQ
connRecv :: Connection -> Recv
connSend :: Connection -> Send
connHooks :: Connection -> Hooks
connQLog :: Connection -> QLogger
connDebugLog :: Connection -> DebugLogger
connState :: Connection -> ConnState
..} = TVar Concurrency -> IO StreamId
get TVar Concurrency
myUniStreamId
get :: TVar Concurrency -> IO Int
get :: TVar Concurrency -> IO StreamId
get TVar Concurrency
tvar = forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically forall a b. (a -> b) -> a -> b
$ do
conc :: Concurrency
conc@Concurrency{StreamId
StreamIdBase
maxStreams :: StreamIdBase
currentStream :: StreamId
maxStreams :: Concurrency -> StreamIdBase
currentStream :: Concurrency -> StreamId
..} <- forall a. TVar a -> STM a
readTVar TVar Concurrency
tvar
let streamType :: StreamId
streamType = StreamId
currentStream forall a. Bits a => a -> a -> a
.&. StreamId
0b11
StreamIdBase StreamId
base = StreamIdBase
maxStreams
Bool -> STM ()
checkSTM (StreamId
currentStream forall a. Ord a => a -> a -> Bool
< StreamId
base forall a. Num a => a -> a -> a
* StreamId
4 forall a. Num a => a -> a -> a
+ StreamId
streamType)
let currentStream' :: StreamId
currentStream' = StreamId
currentStream forall a. Num a => a -> a -> a
+ StreamId
4
forall a. TVar a -> a -> STM ()
writeTVar TVar Concurrency
tvar Concurrency
conc{currentStream :: StreamId
currentStream = StreamId
currentStream'}
forall (m :: * -> *) a. Monad m => a -> m a
return StreamId
currentStream
setTxMaxStreams :: Connection -> Int -> IO ()
setTxMaxStreams :: Connection -> StreamId -> IO ()
setTxMaxStreams Connection{Recv
Buffer
Array EncryptionLevel (TVar [ReceivedPacket])
IOArray Bool Coder1RTT
IOArray EncryptionLevel Cipher
IOArray EncryptionLevel Protector
IOArray EncryptionLevel Coder
ThreadId
TVar Bool
TVar StreamId
TVar TxFlow
TVar Concurrency
TVar MigrationState
TVar CIDDB
IORef StreamId
IORef (IO ())
IORef (Bool, StreamId)
IORef RxFlow
IORef UDPSocket
IORef Microseconds
IORef VersionInfo
IORef StreamTable
IORef AuthCIDs
IORef Parameters
IORef Concurrency
IORef Negotiated
IORef CIDDB
IORef RoleInfo
Rate
MigrationQ
OutputQ
CryptoQ
InputQ
OutputQ1
VersionInfo
RecvQ
SizedBuffer
ConnState
Parameters
LDCC
Hooks
Shared
Send
DebugLogger
QLogger
connLDCC :: LDCC
decryptBuf :: Buffer
encryptRes :: SizedBuffer
encodeBuf :: Buffer
connResources :: IORef (IO ())
connPeerAuthCIDs :: IORef AuthCIDs
connMyAuthCIDs :: IORef AuthCIDs
negotiated :: IORef Negotiated
currentKeyPhase :: IORef (Bool, StreamId)
protectors :: IOArray EncryptionLevel Protector
coders1RTT :: IOArray Bool Coder1RTT
coders :: IOArray EncryptionLevel Coder
ciphers :: IOArray EncryptionLevel Cipher
pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: TVar Bool
bytesRx :: TVar StreamId
bytesTx :: TVar StreamId
minIdleTimeout :: IORef Microseconds
migrationState :: TVar MigrationState
flowRx :: IORef RxFlow
flowTx :: TVar TxFlow
peerUniStreamId :: IORef Concurrency
peerStreamId :: IORef Concurrency
myUniStreamId :: TVar Concurrency
myStreamId :: TVar Concurrency
streamTable :: IORef StreamTable
peerPacketNumber :: IORef StreamId
delayedAckCancel :: IORef (IO ())
delayedAckCount :: IORef StreamId
shared :: Shared
migrationQ :: MigrationQ
outputQ1 :: OutputQ1
outputQ :: OutputQ
cryptoQ :: CryptoQ
inputQ :: InputQ
peerCIDDB :: TVar CIDDB
peerParameters :: IORef Parameters
myCIDDB :: IORef CIDDB
myParameters :: Parameters
origVersionInfo :: VersionInfo
quicVersionInfo :: IORef VersionInfo
roleInfo :: IORef RoleInfo
controlRate :: Rate
mainThreadId :: ThreadId
readers :: IORef (IO ())
udpSocket :: IORef UDPSocket
connRecvQ :: RecvQ
connRecv :: Recv
connSend :: Send
connHooks :: Hooks
connQLog :: QLogger
connDebugLog :: DebugLogger
connState :: ConnState
connLDCC :: Connection -> LDCC
decryptBuf :: Connection -> Buffer
encryptRes :: Connection -> SizedBuffer
encodeBuf :: Connection -> Buffer
connResources :: Connection -> IORef (IO ())
connPeerAuthCIDs :: Connection -> IORef AuthCIDs
connMyAuthCIDs :: Connection -> IORef AuthCIDs
negotiated :: Connection -> IORef Negotiated
currentKeyPhase :: Connection -> IORef (Bool, StreamId)
protectors :: Connection -> IOArray EncryptionLevel Protector
coders1RTT :: Connection -> IOArray Bool Coder1RTT
coders :: Connection -> IOArray EncryptionLevel Coder
ciphers :: Connection -> IOArray EncryptionLevel Cipher
pendingQ :: Connection -> Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: Connection -> TVar Bool
bytesRx :: Connection -> TVar StreamId
bytesTx :: Connection -> TVar StreamId
minIdleTimeout :: Connection -> IORef Microseconds
migrationState :: Connection -> TVar MigrationState
flowRx :: Connection -> IORef RxFlow
flowTx :: Connection -> TVar TxFlow
peerUniStreamId :: Connection -> IORef Concurrency
peerStreamId :: Connection -> IORef Concurrency
myUniStreamId :: Connection -> TVar Concurrency
myStreamId :: Connection -> TVar Concurrency
streamTable :: Connection -> IORef StreamTable
peerPacketNumber :: Connection -> IORef StreamId
delayedAckCancel :: Connection -> IORef (IO ())
delayedAckCount :: Connection -> IORef StreamId
shared :: Connection -> Shared
migrationQ :: Connection -> MigrationQ
outputQ1 :: Connection -> OutputQ1
outputQ :: Connection -> OutputQ
cryptoQ :: Connection -> CryptoQ
inputQ :: Connection -> InputQ
peerCIDDB :: Connection -> TVar CIDDB
peerParameters :: Connection -> IORef Parameters
myCIDDB :: Connection -> IORef CIDDB
myParameters :: Connection -> Parameters
origVersionInfo :: Connection -> VersionInfo
quicVersionInfo :: Connection -> IORef VersionInfo
roleInfo :: Connection -> IORef RoleInfo
controlRate :: Connection -> Rate
mainThreadId :: Connection -> ThreadId
readers :: Connection -> IORef (IO ())
udpSocket :: Connection -> IORef UDPSocket
connRecvQ :: Connection -> RecvQ
connRecv :: Connection -> Recv
connSend :: Connection -> Send
connHooks :: Connection -> Hooks
connQLog :: Connection -> QLogger
connDebugLog :: Connection -> DebugLogger
connState :: Connection -> ConnState
..} = TVar Concurrency -> StreamId -> IO ()
set TVar Concurrency
myStreamId
setTxUniMaxStreams :: Connection -> Int -> IO ()
setTxUniMaxStreams :: Connection -> StreamId -> IO ()
setTxUniMaxStreams Connection{Recv
Buffer
Array EncryptionLevel (TVar [ReceivedPacket])
IOArray Bool Coder1RTT
IOArray EncryptionLevel Cipher
IOArray EncryptionLevel Protector
IOArray EncryptionLevel Coder
ThreadId
TVar Bool
TVar StreamId
TVar TxFlow
TVar Concurrency
TVar MigrationState
TVar CIDDB
IORef StreamId
IORef (IO ())
IORef (Bool, StreamId)
IORef RxFlow
IORef UDPSocket
IORef Microseconds
IORef VersionInfo
IORef StreamTable
IORef AuthCIDs
IORef Parameters
IORef Concurrency
IORef Negotiated
IORef CIDDB
IORef RoleInfo
Rate
MigrationQ
OutputQ
CryptoQ
InputQ
OutputQ1
VersionInfo
RecvQ
SizedBuffer
ConnState
Parameters
LDCC
Hooks
Shared
Send
DebugLogger
QLogger
connLDCC :: LDCC
decryptBuf :: Buffer
encryptRes :: SizedBuffer
encodeBuf :: Buffer
connResources :: IORef (IO ())
connPeerAuthCIDs :: IORef AuthCIDs
connMyAuthCIDs :: IORef AuthCIDs
negotiated :: IORef Negotiated
currentKeyPhase :: IORef (Bool, StreamId)
protectors :: IOArray EncryptionLevel Protector
coders1RTT :: IOArray Bool Coder1RTT
coders :: IOArray EncryptionLevel Coder
ciphers :: IOArray EncryptionLevel Cipher
pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: TVar Bool
bytesRx :: TVar StreamId
bytesTx :: TVar StreamId
minIdleTimeout :: IORef Microseconds
migrationState :: TVar MigrationState
flowRx :: IORef RxFlow
flowTx :: TVar TxFlow
peerUniStreamId :: IORef Concurrency
peerStreamId :: IORef Concurrency
myUniStreamId :: TVar Concurrency
myStreamId :: TVar Concurrency
streamTable :: IORef StreamTable
peerPacketNumber :: IORef StreamId
delayedAckCancel :: IORef (IO ())
delayedAckCount :: IORef StreamId
shared :: Shared
migrationQ :: MigrationQ
outputQ1 :: OutputQ1
outputQ :: OutputQ
cryptoQ :: CryptoQ
inputQ :: InputQ
peerCIDDB :: TVar CIDDB
peerParameters :: IORef Parameters
myCIDDB :: IORef CIDDB
myParameters :: Parameters
origVersionInfo :: VersionInfo
quicVersionInfo :: IORef VersionInfo
roleInfo :: IORef RoleInfo
controlRate :: Rate
mainThreadId :: ThreadId
readers :: IORef (IO ())
udpSocket :: IORef UDPSocket
connRecvQ :: RecvQ
connRecv :: Recv
connSend :: Send
connHooks :: Hooks
connQLog :: QLogger
connDebugLog :: DebugLogger
connState :: ConnState
connLDCC :: Connection -> LDCC
decryptBuf :: Connection -> Buffer
encryptRes :: Connection -> SizedBuffer
encodeBuf :: Connection -> Buffer
connResources :: Connection -> IORef (IO ())
connPeerAuthCIDs :: Connection -> IORef AuthCIDs
connMyAuthCIDs :: Connection -> IORef AuthCIDs
negotiated :: Connection -> IORef Negotiated
currentKeyPhase :: Connection -> IORef (Bool, StreamId)
protectors :: Connection -> IOArray EncryptionLevel Protector
coders1RTT :: Connection -> IOArray Bool Coder1RTT
coders :: Connection -> IOArray EncryptionLevel Coder
ciphers :: Connection -> IOArray EncryptionLevel Cipher
pendingQ :: Connection -> Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: Connection -> TVar Bool
bytesRx :: Connection -> TVar StreamId
bytesTx :: Connection -> TVar StreamId
minIdleTimeout :: Connection -> IORef Microseconds
migrationState :: Connection -> TVar MigrationState
flowRx :: Connection -> IORef RxFlow
flowTx :: Connection -> TVar TxFlow
peerUniStreamId :: Connection -> IORef Concurrency
peerStreamId :: Connection -> IORef Concurrency
myUniStreamId :: Connection -> TVar Concurrency
myStreamId :: Connection -> TVar Concurrency
streamTable :: Connection -> IORef StreamTable
peerPacketNumber :: Connection -> IORef StreamId
delayedAckCancel :: Connection -> IORef (IO ())
delayedAckCount :: Connection -> IORef StreamId
shared :: Connection -> Shared
migrationQ :: Connection -> MigrationQ
outputQ1 :: Connection -> OutputQ1
outputQ :: Connection -> OutputQ
cryptoQ :: Connection -> CryptoQ
inputQ :: Connection -> InputQ
peerCIDDB :: Connection -> TVar CIDDB
peerParameters :: Connection -> IORef Parameters
myCIDDB :: Connection -> IORef CIDDB
myParameters :: Connection -> Parameters
origVersionInfo :: Connection -> VersionInfo
quicVersionInfo :: Connection -> IORef VersionInfo
roleInfo :: Connection -> IORef RoleInfo
controlRate :: Connection -> Rate
mainThreadId :: Connection -> ThreadId
readers :: Connection -> IORef (IO ())
udpSocket :: Connection -> IORef UDPSocket
connRecvQ :: Connection -> RecvQ
connRecv :: Connection -> Recv
connSend :: Connection -> Send
connHooks :: Connection -> Hooks
connQLog :: Connection -> QLogger
connDebugLog :: Connection -> DebugLogger
connState :: Connection -> ConnState
..} = TVar Concurrency -> StreamId -> IO ()
set TVar Concurrency
myUniStreamId
set :: TVar Concurrency -> Int -> IO ()
set :: TVar Concurrency -> StreamId -> IO ()
set TVar Concurrency
tvar StreamId
mx = forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically forall a b. (a -> b) -> a -> b
$ forall a. TVar a -> (a -> a) -> STM ()
modifyTVar TVar Concurrency
tvar forall a b. (a -> b) -> a -> b
$ \Concurrency
c -> Concurrency
c{maxStreams :: StreamIdBase
maxStreams = StreamId -> StreamIdBase
StreamIdBase StreamId
mx}
updatePeerStreamId :: Connection -> StreamId -> IO ()
updatePeerStreamId :: Connection -> StreamId -> IO ()
updatePeerStreamId Connection
conn StreamId
sid = do
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when
( (forall a. Connector a => a -> Bool
isClient Connection
conn Bool -> Bool -> Bool
&& StreamId -> Bool
isServerInitiatedBidirectional StreamId
sid)
Bool -> Bool -> Bool
|| (forall a. Connector a => a -> Bool
isServer Connection
conn Bool -> Bool -> Bool
&& StreamId -> Bool
isClientInitiatedBidirectional StreamId
sid)
)
forall a b. (a -> b) -> a -> b
$ do
forall a. IORef a -> (a -> a) -> IO ()
atomicModifyIORef'' (Connection -> IORef Concurrency
peerStreamId Connection
conn) Concurrency -> Concurrency
check
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when
( (forall a. Connector a => a -> Bool
isClient Connection
conn Bool -> Bool -> Bool
&& StreamId -> Bool
isServerInitiatedUnidirectional StreamId
sid)
Bool -> Bool -> Bool
|| (forall a. Connector a => a -> Bool
isServer Connection
conn Bool -> Bool -> Bool
&& StreamId -> Bool
isClientInitiatedUnidirectional StreamId
sid)
)
forall a b. (a -> b) -> a -> b
$ do
forall a. IORef a -> (a -> a) -> IO ()
atomicModifyIORef'' (Connection -> IORef Concurrency
peerUniStreamId Connection
conn) Concurrency -> Concurrency
check
where
check :: Concurrency -> Concurrency
check conc :: Concurrency
conc@Concurrency{StreamId
StreamIdBase
maxStreams :: StreamIdBase
currentStream :: StreamId
maxStreams :: Concurrency -> StreamIdBase
currentStream :: Concurrency -> StreamId
..}
| StreamId
currentStream forall a. Ord a => a -> a -> Bool
< StreamId
sid = Concurrency
conc{currentStream :: StreamId
currentStream = StreamId
sid}
| Bool
otherwise = Concurrency
conc
checkRxMaxStreams :: Connection -> StreamId -> IO Bool
checkRxMaxStreams :: Connection -> StreamId -> IO Bool
checkRxMaxStreams conn :: Connection
conn@Connection{Recv
Buffer
Array EncryptionLevel (TVar [ReceivedPacket])
IOArray Bool Coder1RTT
IOArray EncryptionLevel Cipher
IOArray EncryptionLevel Protector
IOArray EncryptionLevel Coder
ThreadId
TVar Bool
TVar StreamId
TVar TxFlow
TVar Concurrency
TVar MigrationState
TVar CIDDB
IORef StreamId
IORef (IO ())
IORef (Bool, StreamId)
IORef RxFlow
IORef UDPSocket
IORef Microseconds
IORef VersionInfo
IORef StreamTable
IORef AuthCIDs
IORef Parameters
IORef Concurrency
IORef Negotiated
IORef CIDDB
IORef RoleInfo
Rate
MigrationQ
OutputQ
CryptoQ
InputQ
OutputQ1
VersionInfo
RecvQ
SizedBuffer
ConnState
Parameters
LDCC
Hooks
Shared
Send
DebugLogger
QLogger
connLDCC :: LDCC
decryptBuf :: Buffer
encryptRes :: SizedBuffer
encodeBuf :: Buffer
connResources :: IORef (IO ())
connPeerAuthCIDs :: IORef AuthCIDs
connMyAuthCIDs :: IORef AuthCIDs
negotiated :: IORef Negotiated
currentKeyPhase :: IORef (Bool, StreamId)
protectors :: IOArray EncryptionLevel Protector
coders1RTT :: IOArray Bool Coder1RTT
coders :: IOArray EncryptionLevel Coder
ciphers :: IOArray EncryptionLevel Cipher
pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: TVar Bool
bytesRx :: TVar StreamId
bytesTx :: TVar StreamId
minIdleTimeout :: IORef Microseconds
migrationState :: TVar MigrationState
flowRx :: IORef RxFlow
flowTx :: TVar TxFlow
peerUniStreamId :: IORef Concurrency
peerStreamId :: IORef Concurrency
myUniStreamId :: TVar Concurrency
myStreamId :: TVar Concurrency
streamTable :: IORef StreamTable
peerPacketNumber :: IORef StreamId
delayedAckCancel :: IORef (IO ())
delayedAckCount :: IORef StreamId
shared :: Shared
migrationQ :: MigrationQ
outputQ1 :: OutputQ1
outputQ :: OutputQ
cryptoQ :: CryptoQ
inputQ :: InputQ
peerCIDDB :: TVar CIDDB
peerParameters :: IORef Parameters
myCIDDB :: IORef CIDDB
myParameters :: Parameters
origVersionInfo :: VersionInfo
quicVersionInfo :: IORef VersionInfo
roleInfo :: IORef RoleInfo
controlRate :: Rate
mainThreadId :: ThreadId
readers :: IORef (IO ())
udpSocket :: IORef UDPSocket
connRecvQ :: RecvQ
connRecv :: Recv
connSend :: Send
connHooks :: Hooks
connQLog :: QLogger
connDebugLog :: DebugLogger
connState :: ConnState
connLDCC :: Connection -> LDCC
decryptBuf :: Connection -> Buffer
encryptRes :: Connection -> SizedBuffer
encodeBuf :: Connection -> Buffer
connResources :: Connection -> IORef (IO ())
connPeerAuthCIDs :: Connection -> IORef AuthCIDs
connMyAuthCIDs :: Connection -> IORef AuthCIDs
negotiated :: Connection -> IORef Negotiated
currentKeyPhase :: Connection -> IORef (Bool, StreamId)
protectors :: Connection -> IOArray EncryptionLevel Protector
coders1RTT :: Connection -> IOArray Bool Coder1RTT
coders :: Connection -> IOArray EncryptionLevel Coder
ciphers :: Connection -> IOArray EncryptionLevel Cipher
pendingQ :: Connection -> Array EncryptionLevel (TVar [ReceivedPacket])
addressValidated :: Connection -> TVar Bool
bytesRx :: Connection -> TVar StreamId
bytesTx :: Connection -> TVar StreamId
minIdleTimeout :: Connection -> IORef Microseconds
migrationState :: Connection -> TVar MigrationState
flowRx :: Connection -> IORef RxFlow
flowTx :: Connection -> TVar TxFlow
peerUniStreamId :: Connection -> IORef Concurrency
peerStreamId :: Connection -> IORef Concurrency
myUniStreamId :: Connection -> TVar Concurrency
myStreamId :: Connection -> TVar Concurrency
streamTable :: Connection -> IORef StreamTable
peerPacketNumber :: Connection -> IORef StreamId
delayedAckCancel :: Connection -> IORef (IO ())
delayedAckCount :: Connection -> IORef StreamId
shared :: Connection -> Shared
migrationQ :: Connection -> MigrationQ
outputQ1 :: Connection -> OutputQ1
outputQ :: Connection -> OutputQ
cryptoQ :: Connection -> CryptoQ
inputQ :: Connection -> InputQ
peerCIDDB :: Connection -> TVar CIDDB
peerParameters :: Connection -> IORef Parameters
myCIDDB :: Connection -> IORef CIDDB
myParameters :: Connection -> Parameters
origVersionInfo :: Connection -> VersionInfo
quicVersionInfo :: Connection -> IORef VersionInfo
roleInfo :: Connection -> IORef RoleInfo
controlRate :: Connection -> Rate
mainThreadId :: Connection -> ThreadId
readers :: Connection -> IORef (IO ())
udpSocket :: Connection -> IORef UDPSocket
connRecvQ :: Connection -> RecvQ
connRecv :: Connection -> Recv
connSend :: Connection -> Send
connHooks :: Connection -> Hooks
connQLog :: Connection -> QLogger
connDebugLog :: Connection -> DebugLogger
connState :: Connection -> ConnState
..} StreamId
sid = do
Concurrency{StreamId
StreamIdBase
maxStreams :: StreamIdBase
currentStream :: StreamId
maxStreams :: Concurrency -> StreamIdBase
currentStream :: Concurrency -> StreamId
..} <- if forall a. Connector a => a -> Bool
isClient Connection
conn then IO Concurrency
readForClient else IO Concurrency
readForServer
let StreamIdBase StreamId
base = StreamIdBase
maxStreams
ok :: Bool
ok = StreamId
sid forall a. Ord a => a -> a -> Bool
< StreamId
base forall a. Num a => a -> a -> a
* StreamId
4 forall a. Num a => a -> a -> a
+ StreamId
streamType
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
ok
where
streamType :: StreamId
streamType = StreamId
sid forall a. Bits a => a -> a -> a
.&. StreamId
0b11
readForClient :: IO Concurrency
readForClient = case StreamId
streamType of
StreamId
0 -> forall (m :: * -> *) a. MonadIO m => TVar a -> m a
readTVarIO TVar Concurrency
myStreamId
StreamId
1 -> forall a. IORef a -> IO a
readIORef IORef Concurrency
peerStreamId
StreamId
2 -> forall (m :: * -> *) a. MonadIO m => TVar a -> m a
readTVarIO TVar Concurrency
myUniStreamId
StreamId
3 -> forall a. IORef a -> IO a
readIORef IORef Concurrency
peerUniStreamId
StreamId
_ -> forall a. HasCallStack => [Char] -> a
error [Char]
"never reach"
readForServer :: IO Concurrency
readForServer = case StreamId
streamType of
StreamId
0 -> forall a. IORef a -> IO a
readIORef IORef Concurrency
peerStreamId
StreamId
1 -> forall (m :: * -> *) a. MonadIO m => TVar a -> m a
readTVarIO TVar Concurrency
myStreamId
StreamId
2 -> forall a. IORef a -> IO a
readIORef IORef Concurrency
peerUniStreamId
StreamId
3 -> forall (m :: * -> *) a. MonadIO m => TVar a -> m a
readTVarIO TVar Concurrency
myUniStreamId
StreamId
_ -> forall a. HasCallStack => [Char] -> a
error [Char]
"never reach"
checkStreamIdRoom :: Connection -> Direction -> IO (Maybe Int)
checkStreamIdRoom :: Connection -> Direction -> IO (Maybe StreamId)
checkStreamIdRoom Connection
conn Direction
dir = do
let ref :: IORef Concurrency
ref
| Direction
dir forall a. Eq a => a -> a -> Bool
== Direction
Bidirectional = Connection -> IORef Concurrency
peerStreamId Connection
conn
| Bool
otherwise = Connection -> IORef Concurrency
peerUniStreamId Connection
conn
forall a b. IORef a -> (a -> (a, b)) -> IO b
atomicModifyIORef' IORef Concurrency
ref Concurrency -> (Concurrency, Maybe StreamId)
check
where
check :: Concurrency -> (Concurrency, Maybe StreamId)
check conc :: Concurrency
conc@Concurrency{StreamId
StreamIdBase
maxStreams :: StreamIdBase
currentStream :: StreamId
maxStreams :: Concurrency -> StreamIdBase
currentStream :: Concurrency -> StreamId
..} =
let StreamIdBase StreamId
base = StreamIdBase
maxStreams
initialStreams :: StreamId
initialStreams = Parameters -> StreamId
initialMaxStreamsBidi forall a b. (a -> b) -> a -> b
$ Connection -> Parameters
getMyParameters Connection
conn
cbase :: StreamId
cbase = StreamId
currentStream forall a. Bits a => a -> StreamId -> a
!>>. StreamId
2
in if (StreamId
base forall a. Num a => a -> a -> a
- StreamId
cbase forall a. Ord a => a -> a -> Bool
< (StreamId
initialStreams forall a. Bits a => a -> StreamId -> a
!>>. StreamId
3))
then
let base' :: StreamId
base' = StreamId
cbase forall a. Num a => a -> a -> a
+ StreamId
initialStreams
in (Concurrency
conc{maxStreams :: StreamIdBase
maxStreams = StreamId -> StreamIdBase
StreamIdBase StreamId
base'}, forall a. a -> Maybe a
Just StreamId
base')
else (Concurrency
conc, forall a. Maybe a
Nothing)