HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Modulenetwork-control-0.1.7Haskell2010

Network.Control

Common parts to control network protocols. This library assumes that Int is 64bit.

  • 7 types
  • 22 values
valuedefaultMaxData :: Int
#

Default max data of a connection.

By default, this is set to defaultMaxStreams * defaultMaxStreamData. This ensures that streams that are not currently handled cannot exhaust the connection window.

If you use a smaller connection window size, you must ensure that if you are handling fewer concurrent streams than allowed by defaultMaxStreams, that the unhandled streams cannot exhaust the connection window, or risk the entire system deadlocking.

datadata TxFlow
#

Flow for sending

-------------------------------------->
       ^           ^
    txfSent    txfLimit

       |-----------| The size which this node can send
       txWindowSize

Constructors

Instances2Eq, Show
  • Eq TxFlowDefined in network-control-0.1.7 · Network.Control.Flow
  • Show TxFlowDefined in network-control-0.1.7 · Network.Control.Flow
datadata RxFlow
#

Flow for receiving.

The goal of RxFlow is to ensure that our network peer does not send us data faster than we can consume it. We therefore impose a maximum number of unconsumed bytes that we are willing to receive from the peer, which we refer to as the buffer size:

                   rxfBufSize
          |---------------------------|
-------------------------------------------->
          ^              ^
     rxfConsumed    rxvReceived

The peer does not know of course how many bytes we have consumed of the data that they sent us, so they keep track of their own limit of how much data they are allowed to send. We keep track of this limit also:

                   rxfBufSize
          |---------------------------|
-------------------------------------------->
          ^              ^       ^
     rxfConsumed    rxvReceived  |
                              rxfLimit

Each time we receive data from the peer, we check that they do not exceed the limit (checkRxLimit). When we consume data, we periodically send the peer an update (known as a _window update_) of what their new limit is (maybeOpenRxWindow). To decrease overhead, we only this if the window update is at least half the window size.

Constructors

  • RxFlow
    • rxfBufSize :: Int

      Maxinum number of unconsumed bytes the peer can send us

      See discussion above for details.

    • rxfConsumed :: Int

      How much of the data that the peer has sent us have we consumed?

      This is an absolute number: the total about of bytes consumed over the lifetime of the connection or stream (i.e., not relative to the window).

    • rxfReceived :: Int

      How much data have we received from the peer?

      Like rxfConsumed, this is an absolute number.

    • rxfLimit :: Int

      Current limit on how many bytes the peer is allowed to send us.

      Like 'rxfConsumed, this is an absolute number.

Instances2Eq, Show
  • Eq RxFlowDefined in network-control-0.1.7 · Network.Control.Flow
  • Show RxFlowDefined in network-control-0.1.7 · Network.Control.Flow
datadata LRUCache k v
#

Sized cache based on least recently used.

Instances2Eq, Show
  • (Ord k, Eq v) => Eq (LRUCache k v)Defined in network-control-0.1.7 · Network.Control.LRUCache
  • (Show v, Show k) => Show (LRUCache k v)Defined in network-control-0.1.7 · Network.Control.LRUCache
valuecached :: Ord k => LRUCacheRef k v -> k -> IO v -> IO (v, Bool)
#

Looking up a target and adjusting the LRU cache. If not found, a new value is inserted. A pair of value and "found" is returned.

newtypenewtype Rate
#

Type for rating.

valuegetRate :: Rate -> IO Int
#

Getting the current rate. If one or more seconds have passed since the previous call, the counter is re-initialized with 1 and it is returned. Otherwise, incremented counter number is returned.

valueaddRate :: Rate -> Int -> IO Int
#

Getting the current rate. If one or more seconds have passed since the previous call, the counter is re-initialized with the second argument and it is returned. Otherwise, increased counter number is returned.