quic 0.2.12 → 0.2.13
raw patch · 8 files changed
+179/−122 lines, 8 files
Files
- ChangeLog.md +4/−0
- Network/QUIC/Client/Run.hs +1/−0
- Network/QUIC/Connection/Misc.hs +17/−0
- Network/QUIC/Connection/Role.hs +21/−0
- Network/QUIC/Connection/Types.hs +116/−118
- Network/QUIC/Handshake.hs +5/−3
- Network/QUIC/Types/Resumption.hs +14/−0
- quic.cabal +1/−1
ChangeLog.md view
@@ -1,5 +1,9 @@ # ChangeLog +## 0.2.13++* Necessary transport parameters are now stored in ResumptionInfo.+ ## 0.2.12 * Dont' send UDP packets of size 0. (Cloudfare)
Network/QUIC/Client/Run.hs view
@@ -153,6 +153,7 @@ genSRT setSockConnected conn ccSockConnected addResource conn qclean+ modifytPeerParameters conn ccResumption let ver = chosenVersion verInfo initializeCoder conn InitialLevel $ initialSecrets ver peerCID setupCryptoStreams conn -- fixme: cleanup
Network/QUIC/Connection/Misc.hs view
@@ -19,6 +19,7 @@ getMyParameters, getPeerParameters, setPeerParameters,+ modifytPeerParameters, delayedAck, resetDealyedAck, setMaxPacketSize,@@ -132,6 +133,22 @@ setPeerParameters :: Connection -> Parameters -> IO () setPeerParameters Connection{..} params = writeIORef peerParameters params++modifytPeerParameters :: Connection -> ResumptionInfo -> IO ()+modifytPeerParameters Connection{..} ri =+ atomicModifyIORef'' peerParameters $ resumptionToParameters ri++resumptionToParameters :: ResumptionInfo -> Parameters -> Parameters+resumptionToParameters ResumptionInfo{..} params =+ params+ { activeConnectionIdLimit = resumptionActiveConnectionIdLimit+ , initialMaxData = resumptionInitialMaxData+ , initialMaxStreamDataBidiLocal = resumptionInitialMaxStreamDataBidiLocal+ , initialMaxStreamDataBidiRemote = resumptionInitialMaxStreamDataBidiRemote+ , initialMaxStreamDataUni = resumptionInitialMaxStreamDataUni+ , initialMaxStreamsBidi = resumptionInitialMaxStreamsBidi+ , initialMaxStreamsUni = resumptionInitialMaxStreamsUni+ } ----------------------------------------------------------------
Network/QUIC/Connection/Role.hs view
@@ -11,6 +11,7 @@ getIncompatibleVN, setResumptionSession, setNewToken,+ setResumptionParameters, setRegister, getRegister, getUnregister,@@ -31,6 +32,7 @@ import Network.QUIC.Connection.Types import Network.QUIC.Connector import Network.QUIC.Imports+import Network.QUIC.Parameters import Network.QUIC.Types ----------------------------------------------------------------@@ -107,6 +109,25 @@ , resumptionToken = token } }++setResumptionParameters :: Connection -> Parameters -> IO ()+setResumptionParameters Connection{..} params = do+ atomicModifyIORef'' roleInfo $ \ci ->+ ci+ { resumptionInfo = parametersToResumption (resumptionInfo ci) params+ }++parametersToResumption :: ResumptionInfo -> Parameters -> ResumptionInfo+parametersToResumption ri Parameters{..} =+ ri+ { resumptionActiveConnectionIdLimit = activeConnectionIdLimit+ , resumptionInitialMaxData = initialMaxData+ , resumptionInitialMaxStreamDataBidiLocal = initialMaxStreamDataBidiLocal+ , resumptionInitialMaxStreamDataBidiRemote = initialMaxStreamDataBidiRemote+ , resumptionInitialMaxStreamDataUni = initialMaxStreamDataUni+ , resumptionInitialMaxStreamsBidi = initialMaxStreamsBidi+ , resumptionInitialMaxStreamsUni = initialMaxStreamsUni+ } ----------------------------------------------------------------
Network/QUIC/Connection/Types.hs view
@@ -224,74 +224,76 @@ ---------------------------------------------------------------- +{- FOURMOLU_DISABLE -} -- | A quic connection to carry multiple streams. data Connection = Connection- { connState :: ConnState+ { connState :: ConnState , -- Actions- connDebugLog :: DebugLogger+ connDebugLog :: DebugLogger -- ^ A logger for debugging.- , connQLog :: QLogger- , connHooks :: Hooks- , connSend :: ~Send -- ~ for testing- , connRecv :: ~Recv -- ~ for testing+ , connQLog :: QLogger+ , connHooks :: Hooks+ , connSend :: ~Send -- ~ for testing+ , connRecv :: ~Recv -- ~ for testing -- Manage- , connRecvQ :: RecvQ- , connSocket :: IORef Socket+ , connRecvQ :: RecvQ+ , connSocket :: IORef Socket , genStatelessResetToken :: CID -> StatelessResetToken- , readers :: IORef (Map Word64 (Weak ThreadId))- , mainThreadId :: ThreadId- , controlRate :: Rate+ , readers :: IORef (Map Word64 (Weak ThreadId))+ , mainThreadId :: ThreadId+ , controlRate :: Rate , -- Info- roleInfo :: IORef RoleInfo- , quicVersionInfo :: IORef VersionInfo- , origVersionInfo :: VersionInfo -- chosenVersion is client's ver in Initial+ roleInfo :: IORef RoleInfo+ , quicVersionInfo :: IORef VersionInfo+ , origVersionInfo :: VersionInfo -- chosenVersion is client's ver in Initial -- Mine- , myParameters :: Parameters- , myCIDDB :: IORef CIDDB+ , myParameters :: Parameters+ , myCIDDB :: IORef CIDDB , -- Peer- peerParameters :: IORef Parameters- , peerCIDDB :: TVar CIDDB- , peerInfo :: IORef PeerInfo+ peerParameters :: IORef Parameters+ , peerCIDDB :: TVar CIDDB+ , peerInfo :: IORef PeerInfo , -- Queues- inputQ :: InputQ- , cryptoQ :: CryptoQ- , outputQ :: OutputQ- , outputRate :: Rate- , shared :: Shared- , delayedAckCount :: IORef Int- , delayedAckCancel :: IORef (IO ())+ inputQ :: InputQ+ , cryptoQ :: CryptoQ+ , outputQ :: OutputQ+ , outputRate :: Rate+ , shared :: Shared+ , delayedAckCount :: IORef Int+ , delayedAckCancel :: IORef (IO ()) , -- State- peerPacketNumber :: IORef PacketNumber -- for RTT1- , streamTable :: IORef StreamTable- , myStreamId :: TVar Concurrency -- C:0 S:1- , myUniStreamId :: TVar Concurrency -- C:2 S:3- , peerStreamId :: IORef Concurrency -- C:1 S:0- , peerUniStreamId :: IORef Concurrency -- C:3 S:2- , flowTx :: TVar TxFlow- , flowRx :: IORef RxFlow- , migrationState :: TVar MigrationState+ peerPacketNumber :: IORef PacketNumber -- for RTT1+ , streamTable :: IORef StreamTable+ , myStreamId :: TVar Concurrency -- C:0 S:1+ , myUniStreamId :: TVar Concurrency -- C:2 S:3+ , peerStreamId :: IORef Concurrency -- C:1 S:0+ , peerUniStreamId :: IORef Concurrency -- C:3 S:2+ , flowTx :: TVar TxFlow+ , flowRx :: IORef RxFlow+ , migrationState :: TVar MigrationState , sentRetirePriorTo :: IORef Bool- , minIdleTimeout :: IORef Microseconds- , bytesTx :: IORef Int- , bytesRx :: IORef Int+ , minIdleTimeout :: IORef Microseconds+ , bytesTx :: IORef Int+ , bytesRx :: IORef Int , -- TLS- pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])- , ciphers :: IOArray EncryptionLevel Cipher- , coders :: IOArray EncryptionLevel Coder- , coders1RTT :: IOArray Bool Coder1RTT- , protectors :: IOArray EncryptionLevel Protector- , currentKeyPhase :: IORef (Bool, PacketNumber)- , negotiated :: IORef Negotiated- , connMyAuthCIDs :: IORef AuthCIDs- , connPeerAuthCIDs :: IORef AuthCIDs+ pendingQ :: Array EncryptionLevel (TVar [ReceivedPacket])+ , ciphers :: IOArray EncryptionLevel Cipher+ , coders :: IOArray EncryptionLevel Coder+ , coders1RTT :: IOArray Bool Coder1RTT+ , protectors :: IOArray EncryptionLevel Protector+ , currentKeyPhase :: IORef (Bool, PacketNumber)+ , negotiated :: IORef Negotiated+ , connMyAuthCIDs :: IORef AuthCIDs+ , connPeerAuthCIDs :: IORef AuthCIDs , -- Resources- connResources :: IORef (IO ())- , encodeBuf :: Buffer- , encryptRes :: SizedBuffer- , decryptBuf :: Buffer+ encodeBuf :: Buffer+ , encryptRes :: SizedBuffer+ , decryptBuf :: Buffer+ , connResources :: IORef (IO ()) , -- Recovery- connLDCC :: LDCC+ connLDCC :: LDCC }+{- FOURMOLU_ENABLE -} instance KeepQlog Connection where keepQlog conn = connQLog conn@@ -316,6 +318,7 @@ arr = array (RTT0Level, RTT1Level) lst return arr +{- FOURMOLU_DISABLE -} newConnection :: Role -> Parameters@@ -332,72 +335,65 @@ -> Recv -> (CID -> StatelessResetToken) -> IO Connection-newConnection rl myparams verInfo myAuthCIDs peerAuthCIDs debugLog qLog hooks sref piref recvQ ~send ~recv genSRT = do- -- ~ for testing- outQ <- newTQueueIO- let put x = atomically $ writeTQueue outQ $ OutRetrans x- connstate <- newConnState rl- let bufsiz = maximumUdpPayloadSize- encBuf <- mallocBytes bufsiz- ecrptBuf <- mallocBytes bufsiz- dcrptBuf <- mallocBytes bufsiz- Connection connstate debugLog qLog hooks send recv recvQ sref genSRT- <$> newIORef Map.empty- <*> myThreadId- <*> newRate- -- Info- <*> newIORef initialRoleInfo- <*> newIORef verInfo- <*> return verInfo- -- Mine- <*> return myparams- <*> newIORef (newCIDDB myCID)- -- Peer- <*> newIORef baseParameters- <*> newTVarIO (newCIDDB peerCID)- <*> return piref- -- Queues- <*> newTQueueIO- <*> newTQueueIO- <*> return outQ- <*> newRate- <*> newShared- <*> newIORef 0- <*> newIORef (return ())- -- State- <*> newIORef 0- <*> newIORef emptyStreamTable- <*> newTVarIO (newConcurrency rl Bidirectional 0)- <*> newTVarIO (newConcurrency rl Unidirectional 0)- <*> newIORef peerConcurrency- <*> newIORef peerUniConcurrency- <*> newTVarIO (newTxFlow 0) -- limit is set in Handshake- <*> newIORef (newRxFlow $ initialMaxData myparams)- <*> newTVarIO NonMigration- <*> newIORef False- <*> newIORef (milliToMicro $ maxIdleTimeout myparams)- <*> newIORef 0- <*> newIORef 0- -- TLS- <*> makePendingQ- <*> newArray (InitialLevel, RTT1Level) defaultCipher- <*> newArray (InitialLevel, HandshakeLevel) initialCoder- <*> newArray (False, True) initialCoder1RTT- <*> newArray (InitialLevel, RTT1Level) initialProtector- <*> newIORef (False, 0)- <*> newIORef initialNegotiated- <*> newIORef myAuthCIDs- <*> newIORef peerAuthCIDs- -- Resources- <*> newIORef (free encBuf >> free ecrptBuf >> free dcrptBuf)- <*> return encBuf -- used sender or closere- <*> return (SizedBuffer ecrptBuf bufsiz) -- used sender- <*> return dcrptBuf -- used receiver- -- Recovery- <*> newLDCC connstate qLog put+newConnection rl myParameters origVersionInfo myAuthCIDs peerAuthCIDs connDebugLog connQLog connHooks connSocket peerInfo connRecvQ ~connSend ~connRecv genStatelessResetToken = do+ connState <- newConnState rl+ -- Manage+ readers <- newIORef Map.empty+ mainThreadId <- myThreadId+ controlRate <- newRate+ -- Info+ roleInfo <- newIORef roleinfo+ quicVersionInfo <- newIORef origVersionInfo+ -- Mine+ myCIDDB <- newIORef (newCIDDB myCID)+ -- Peer+ peerParameters <- newIORef baseParameters+ peerCIDDB <- newTVarIO (newCIDDB peerCID)+ -- Queus+ inputQ <- newTQueueIO+ cryptoQ <- newTQueueIO+ outputQ <- newTQueueIO+ outputRate <- newRate+ shared <- newShared+ delayedAckCount <- newIORef 0+ delayedAckCancel <- newIORef (return ())+ -- State+ peerPacketNumber <- newIORef 0+ streamTable <- newIORef emptyStreamTable+ myStreamId <- newTVarIO (newConcurrency rl Bidirectional 0)+ myUniStreamId <- newTVarIO (newConcurrency rl Unidirectional 0)+ peerStreamId <- newIORef peerConcurrency+ peerUniStreamId <- newIORef peerUniConcurrency+ flowTx <- newTVarIO (newTxFlow 0) -- limit is set in Handshake+ flowRx <- newIORef (newRxFlow $ initialMaxData myParameters)+ migrationState <- newTVarIO NonMigration+ sentRetirePriorTo <- newIORef False+ minIdleTimeout <- newIORef (milliToMicro $ maxIdleTimeout myParameters)+ bytesTx <- newIORef 0+ bytesRx <- newIORef 0+ -- TLS+ pendingQ <- makePendingQ+ ciphers <- newArray (InitialLevel, RTT1Level) defaultCipher+ coders <- newArray (InitialLevel, HandshakeLevel) initialCoder+ coders1RTT <- newArray (False, True) initialCoder1RTT+ protectors <- newArray (InitialLevel, RTT1Level) initialProtector+ currentKeyPhase <- newIORef (False, 0)+ negotiated <- newIORef initialNegotiated+ connMyAuthCIDs <- newIORef myAuthCIDs+ connPeerAuthCIDs <- newIORef peerAuthCIDs+ -- Resources+ encodeBuf <- mallocBytes bufsiz -- used sender or closere+ encryptBuf <- mallocBytes bufsiz+ let encryptRes = SizedBuffer encryptBuf bufsiz -- used sender+ decryptBuf <- mallocBytes bufsiz -- used receiver+ connResources <- newIORef (free encodeBuf >> free encryptBuf >> free decryptBuf)+ -- Recovery+ let put x = atomically $ writeTQueue outputQ $ OutRetrans x+ connLDCC <- newLDCC connState connQLog put+ return Connection{..} where isclient = rl == Client- initialRoleInfo+ roleinfo | isclient = defaultClientRoleInfo | otherwise = defaultServerRoleInfo myCID = fromJust $ initSrcCID myAuthCIDs@@ -405,8 +401,10 @@ peer | isclient = Server | otherwise = Client- peerConcurrency = newConcurrency peer Bidirectional (initialMaxStreamsBidi myparams)- peerUniConcurrency = newConcurrency peer Unidirectional (initialMaxStreamsUni myparams)+ peerConcurrency = newConcurrency peer Bidirectional (initialMaxStreamsBidi myParameters)+ peerUniConcurrency = newConcurrency peer Unidirectional (initialMaxStreamsUni myParameters)+ bufsiz = maximumUdpPayloadSize+{- FOURMOLU_ENABLE -} defaultTrafficSecrets :: (ClientTrafficSecret a, ServerTrafficSecret a) defaultTrafficSecrets = (ClientTrafficSecret "", ServerTrafficSecret "")
Network/QUIC/Handshake.hs view
@@ -248,9 +248,11 @@ checkInvalid params setParams params qlogParamsSet conn (params, "remote")- when (isServer conn) $- serverVersionNegotiation $- versionInformation params+ if isClient conn+ then+ setResumptionParameters conn params+ else+ serverVersionNegotiation $ versionInformation params checkAuthCIDs params = do peerAuthCIDs <- getPeerAuthCIDs conn
Network/QUIC/Types/Resumption.hs view
@@ -19,6 +19,13 @@ , resumptionSession :: [(SessionID, SessionData)] , resumptionToken :: Token , resumptionRetry :: Bool+ , resumptionActiveConnectionIdLimit :: Int+ , resumptionInitialMaxData :: Int+ , resumptionInitialMaxStreamDataBidiLocal :: Int+ , resumptionInitialMaxStreamDataBidiRemote :: Int+ , resumptionInitialMaxStreamDataUni :: Int+ , resumptionInitialMaxStreamsBidi :: Int+ , resumptionInitialMaxStreamsUni :: Int } deriving (Eq, Show, Generic) @@ -31,6 +38,13 @@ , resumptionSession = [] , resumptionToken = emptyToken , resumptionRetry = False+ , resumptionActiveConnectionIdLimit = 2 -- see baseParameters+ , resumptionInitialMaxData = 0+ , resumptionInitialMaxStreamDataBidiLocal = 0+ , resumptionInitialMaxStreamDataBidiRemote = 0+ , resumptionInitialMaxStreamDataUni = 0+ , resumptionInitialMaxStreamsBidi = 0+ , resumptionInitialMaxStreamsUni = 0 } -- | Is 0RTT possible?
quic.cabal view
@@ -1,6 +1,6 @@ cabal-version: >=1.10 name: quic-version: 0.2.12+version: 0.2.13 license: BSD3 license-file: LICENSE maintainer: kazu@iij.ad.jp