packages feed

quic 0.2.12 → 0.2.13

raw patch · 8 files changed

+179/−122 lines, 8 files

Files

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