From 66a6659a244f9c1da301a675c6013db4db71d39e Mon Sep 17 00:00:00 2001 From: Hugo Landau Date: Tue, 13 Sep 2022 16:08:42 +0100 Subject: [PATCH] QUIC Frame-in-Flight Manager Design Reviewed-by: Tomas Mraz Reviewed-by: Matt Caswell (Merged from https://github.com/openssl/openssl/pull/19206) --- .../quic-design/images/quic-fifm-cfq.png | Bin 0 -> 11086 bytes .../quic-design/images/quic-fifm-overview.png | Bin 0 -> 16530 bytes .../quic-design/images/quic-fifm-txpim.png | Bin 0 -> 12338 bytes doc/designs/quic-design/quic-fifm.md | 504 ++++++++++++++++++ 4 files changed, 504 insertions(+) create mode 100644 doc/designs/quic-design/images/quic-fifm-cfq.png create mode 100644 doc/designs/quic-design/images/quic-fifm-overview.png create mode 100644 doc/designs/quic-design/images/quic-fifm-txpim.png create mode 100644 doc/designs/quic-design/quic-fifm.md diff --git a/doc/designs/quic-design/images/quic-fifm-cfq.png b/doc/designs/quic-design/images/quic-fifm-cfq.png new file mode 100644 index 0000000000000000000000000000000000000000..5959c448fd57d18ca466a2e1da142c717db1ea4b GIT binary patch literal 11086 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 NxNe~N@tSSK{{h(j_6`65 literal 0 Hc-jL100001 diff --git a/doc/designs/quic-design/images/quic-fifm-txpim.png b/doc/designs/quic-design/images/quic-fifm-txpim.png new file mode 100644 index 0000000000000000000000000000000000000000..a78cd3274162e78fce7c7544ea68d371420b7925 GIT binary patch literal 12338 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

Yhthf#)vwwA)7y4@$*1Y5vxA()=q8l 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 E7dKmF^Z)<= literal 0 Hc-jL100001 diff --git a/doc/designs/quic-design/quic-fifm.md b/doc/designs/quic-design/quic-fifm.md new file mode 100644 index 00000000000..1de81318f3b --- /dev/null +++ b/doc/designs/quic-design/quic-fifm.md @@ -0,0 +1,504 @@ +QUIC Frame-in-Flight Management +=============================== + +The QUIC frame-in-flight manager is responsible for tracking frames which were +sent which need to be regenerated if the packets they were placed into are +designated as lost by the ACK manager. The ACK manager works on the level of +packets, whereas the QUIC frame-in-flight manager (FIFM) works on the level of +frames. + +The FIFM comprises three components, collectively known as the FIFM: + + - the Control Frame Queue (CFQ); + - the Transmitted Packet Information Manager (TXPIM); and + - the Frame-in-Flight Dispatcher (FIFD). + +![](images/quic-fifm-overview.png "QUIC FIFM Overview") + +These are introduced in turn below, but first we discuss the various QUIC frame +types to establish the need for each component. + +Analysis of QUIC Frame Retransmission Requirements +-------------------------------------------------- + +### Frame Types + +Standard QUIC uses the following frame types: + +```plain +HANDSHAKE_DONE GCR / REGEN +MAX_DATA REGEN +DATA_BLOCKED REGEN +MAX_STREAMS REGEN +STREAMS_BLOCKED REGEN +NEW_CONNECTION_ID GCR +RETIRE_CONNECTION_ID GCR +PATH_CHALLENGE - +PATH_RESPONSE - +ACK - (non-ACK-eliciting) +CONNECTION_CLOSE special (non-ACK-eliciting) +NEW_TOKEN GCR +CRYPTO GCR or special +RESET_STREAM REGEN +STOP_SENDING REGEN +MAX_STREAM_DATA REGEN +STREAM_DATA_BLOCKED REGEN +STREAM special +PING - +PADDING - (non-ACK-eliciting) +``` + +The different frame types require various different ways of handling +retransmission in the event of loss: + + - **GCR** (Generic Control Frame Retransmission): The raw bytes of + the encoded frame can simply be sent again. This retransmission system does + not need to understand the specific frame type. A simple queue can be used, + with each queue entry being an octet string representing an encoded frame. + This queue can also be used for initial transmission of **GCR** frames, not + just retransmissions. + + - **REGEN** (Regenerate): These frames can be marked for dynamic regeneration + when a packet containing them is lost. This has the advantage of using + up-to-date data at the time of transmission, so is preferred over `GCR` when + possible. + + - Special — `STREAM`, `CRYPTO`: `STREAM` frame handling is handled as a + special case by the QUIC Send Stream Manager. `CRYPTO` frame retransmission + can also be handled using a QUIC Send Stream manager. (`CRYPTO` frames could + also be handled via GCR, though suboptimally. We choose to use proper send + stream management, just as for application data streams.) + + - Some frame types do not need to be retransmitted even if lost (`PING`, + `PADDING`, `PATH_CHALLENGE`, `PATH_RESPONSE`). + + - Special — `CONNECTION_CLOSE`: This frame is a special case and is not + retransmitted per se. + +### Requirements + +The following requirements are identified: + +- Need for a generic control queue which can store encoded control frames. + This control queue will handle both initial transmission and retransmission of + most control frames which do not have special requirements. + +- The ability to determine, when the ACK Manager determines that a packet has + been acknowledged, lost or discarded: + + - What stream IDs were sent in a packet, and the logical ranges of application + data bytes for each (which may not be one contiguous range). + + This is needed so that the QUIC Send Stream Manager for a given stream + can be informed of lost or acked ranges in the stream. + + - The logical ranges of the CRYPTO stream which were sent in the packet + (which may not be one contiguous range), for similar reasons. + + - Which stream IDs had a FIN bit set in the packet. + + This is needed so that the QUIC Send Stream Manager can be informed for a + given stream whether a FIN was lost or acked. + + - What control frames using the **GCR** strategy were sent in the packet + so that they can be requeued (if lost) or released (if acked or discarded). + + - For each type of frame using the **REGEN** strategy, a flag as to whether + that frame type was contained in the packet (so that the flag can be set + again if the packet was lost). + +The Control Frame Queue (CFQ) +----------------------------- + +![](images/quic-fifm-cfq.png "QUIC CFQ Overview") + +The CFQ (`QUIC_CFQ`) stores encoded frames which can be blindly retransmitted in +the event that they are lost. It facilitates the GCR retransmission strategy. +One logical CFQ instance will be needed per PN space per connection. As an +optimisation, these three CFQ instances per connection are all modelled by a +single `QUIC_CFQ` instance. + +Each frame in the CFQ is a simple opaque byte buffer, which has the following +metadata associated with it: + +- An integral priority value, used to maintain priority ordering. + +- The frame type, which is provided by the caller along with the buffer. + This can be determined from the encoded frame buffer, but this saves the + CFQ's users from needing to decode it. The CFQ itself does not use this + value. + +- A state, which is either `NEW` or `TX`. Frames added to the CFQ have + the `NEW` state initially. When the frame is transmitted, it is transitioned + to the `TX` state. If the packet it was sent in is subsequently lost, + it is transitioned back to the `NEW` state. + +Packets in the `NEW` state participate in a priority queue (the NEW queue) +according to their priority and the CFQ's NEW queue can be iterated in priority +order by callers. + +When a packet containing a CFQ item is acknowledged, the CFQ is informed and the +CFQ item is released. A free callback provided when the buffer was added to the +CFQ is called, providing an opportunity to free or reuse the buffer. Buffers +provided to the CFQ as part of a CFQ item must remain allocated for the duration +of their membership of the CFQ. The CFQ maintains memory allocation of CFQ items +themselves internally. + +### API + +```c +/* + * QUIC Control Frame Queue Item + * ============================= + * + * The CFQ item structure has a public and a private part. This structure + * documents the public part. + */ +typedef struct quic_cfq_item_st QUIC_CFQ_ITEM; + +struct quic_cfq_item_st { + /* + * These fields are not used by the CFQ, but are a convenience to assist the + * TXPIM in keeping a list of GCR control frames which were sent in a + * packet. They may be used for any purpose. + */ + QUIC_CFQ_ITEM *pkt_prev, *pkt_next; + + /* All other fields are private; use ossl_quic_cfq_item_* accessors. */ +}; + +#define QUIC_CFQ_STATE_NEW 0 +#define QUIC_CFQ_STATE_TX 1 + +/* Returns the frame type of a CFQ item. */ +uint64_t ossl_quic_cfq_item_get_frame_type(QUIC_CFQ_ITEM *item); + +/* Returns a pointer to the encoded buffer of a CFQ item. */ +const unsigned char *ossl_quic_cfq_item_get_encoded(QUIC_CFQ_ITEM *item); + +/* Returns the length of the encoded buffer in bytes. */ +size_t ossl_quic_cfq_item_get_encoded_len(QUIC_CFQ_ITEM *item); + +/* Returns the CFQ item state, a QUIC_CFQ_STATE_* value. */ +int ossl_quic_cfg_item_get_state(QUIC_CFQ_ITEM *item); + +/* Returns the PN space for the CFQ item. */ +int ossl_quic_cfg_item_get_pn_space(QUIC_CFQ_ITEM *item); + +/* + * QUIC Control Frame Queue + * ======================== + */ +typedef struct quic_cfq_st QUIC_CFQ; + +QUIC_CFQ *ossl_quic_cfq_new(void); +void ossl_quic_cfq_free(QUIC_CFQ *cfq); + +/* + * Input Side + * ---------- + */ + +/* + * Enqueue a frame to the CFQ. encoded points to the opaque encoded frame. + * + * free_cb is called by the CFQ when the buffer is no longer needed; + * free_cb_arg is an opaque value passed to free_cb. + * + * priority determines the relative ordering of control frames in a packet. + * Higher numerical values for priority mean that a frame should come earlier in + * a packet. pn_space is a QUIC_PN_SPACE_* value. + * + * On success, returns a QUIC_CFQ_ITEM pointer which acts as a handle to + * the queued frame. On failure, returns NULL. + * + * The frame is initially in the TX state, so there is no need to call + * ossl_quic_cfq_mark_tx() immediately after calling this function. + * + * The frame type is duplicated as the frame_type argument here, even though it + * is also encoded into the buffer. This allows the caller to determine the + * frame type if desired without having to decode the frame. + */ +typedef void (cfq_free_cb)(unsigned char *buf, size_t buf_len, void *arg); + +QUIC_CFQ_ITEM *ossl_quic_cfq_add_frame(QUIC_CFQ *cfq, + uint32_t priority, + uint32_t pn_space, + uint64_t frame_type, + const unsigned char *encoded, + size_t encoded_len, + cfq_free_cb *free_cb, + void *free_cb_arg); + +/* + * Effects an immediate transition of the given CFQ item to the TX state. + */ +void ossl_quic_cfq_mark_tx(QUIC_CFQ *cfq, QUIC_CFQ_ITEM *item); + +/* + * Effects an immediate transition of the given CFQ item to the NEW state, + * allowing the frame to be retransmitted. If priority is not UINT32_MAX, + * the priority is changed to the given value. + */ +void ossl_quic_cfq_mark_lost(QUIC_CFQ *cfq, QUIC_CFQ_ITEM *item, + uint32_t priority); + +/* + * Releases a CFQ item. The item may be in either state (NEW or TX) prior to the + * call. The QUIC_CFQ_ITEM pointer must not be used following this call. + */ +void ossl_quic_cfq_release(QUIC_CFQ *cfq, QUIC_CFQ_ITEM *item); + +/* + * Output Side + * ----------- + */ + +/* + * Gets the highest priority CFQ item in the given PN space awaiting + * transmission. If there are none, returns NULL. + */ +QUIC_CFQ_ITEM *ossl_quic_cfq_get_priority_head(QUIC_CFQ *cfq, uint32_t pn_space); + +/* + * Given a CFQ item, gets the next CFQ item awaiting transmission in priority + * order in the given PN space. In other words, given the return value of + * ossl_quic_cfq_get_priority_head(), returns the next-lower priority item. + * Returns NULL if the given item is the last item in priority order. + */ +QUIC_CFQ_ITEM *ossl_quic_cfq_item_get_priority_next(QUIC_CFQ_ITEM *item, + uint32_t pn_space); +``` + +The Transmitted Packet Information Manager (TXPIM) +-------------------------------------------------- + +![](images/quic-fifm-txpim.png "QUIC TXPIM Overview") + +The Transmitted Packet Information Manager (`QUIC_TXPIM`) is responsible for +allocating and keeping bookkeeping structures for packets which have been +transmitted, but not yet acknowledged, deemed lost or discarded. It is a +self-contained memory pool handing out `QUIC_TXPIM_PKT` structures. Each +`QUIC_TXPIM_PKT` is a self-contained data structure intended for consumption by +the FIFM. + +The `QUIC_TXPIM_PKT` structure can be used for: + + - Keeping track of all GCR control frames which were transmitted + in each packet, via a linked list of `QUIC_CFQ_ITEM`s. + + - Keeping track of all REGEN-strategy control frame types, via a flag + for each frame type indicating whether the packet contained + such a frame. + + - Keeping track of all stream IDs sent in a given packet, and + what ranges of the logical stream were sent, and whether + a FIN was sent. + + - Keeping track of what logical ranges of the CRYPTO stream were sent. + +In order to avoid unnecessary allocations, the FIFM also incorporates the ACK +Manager's `QUIC_ACKM_TX_PKT` structure into its per-packet bookkeeping +structure. The intention is for the `QUIC_TXPIM_PKT` to be the principal +allocation made per transmitted packet. The TX packetiser will obtain +a `QUIC_TXPIM_PKT` structure from the TXPIM, fill in the structure including +the ACK Manager data, and submit it via the FIFD which we introduce below. + +The TXPIM does not anything with the `QUIC_TXPIM_PKT` structure itself +other than managing its allocation and manipulation. Constructive +use of the data kept in the TXPIM is made by the FIFD. + +### API + +```c +/* + * QUIC Transmitted Packet Information Manager + * =========================================== + */ +typedef struct quic_txpim_st QUIC_TXPIM; + +typedef struct quic_txpim_pkt_st { + /* ACKM-specific data. Caller should fill this. */ + QUIC_ACKM_TX_PKT ackm_pkt; + + /* Linked list of CFQ items in this packet. */ + QUIC_CFQ_ITEM *retx_head; + + /* Reserved for FIFD use. */ + QUIC_FIFD *fifd; + + /* Regenerate-strategy frames. */ + unsigned int had_handshake_done : 1; + unsigned int had_max_data_frame : 1; + unsigned int had_max_streams_frame : 1; + unsigned int had_ack_frame : 1; + + /* Private data follows. */ +} QUIC_TXPIM_PKT; + +/* Represents a range of bytes in an application or CRYPTO stream. */ +typedef struct quic_txpim_chunk_st { + /* The stream ID, or UINT64_MAX for the CRYPTO stream. */ + uint64_t stream_id; + /* + * The inclusive range of bytes in the stream. Exceptionally, if end < + * start, designates a frame of zero length (used for FIN-only frames). + */ + uint64_t start, end; + /* + * Whether a FIN was sent for this stream in the packet. Not valid for + * CRYPTO stream. + */ + unsigned int has_fin : 1; +} QUIC_TXPIM_CHUNK; + +QUIC_TXPIM *ossl_quic_txpim_new(void); +void ossl_quic_txpim_free(QUIC_TXPIM *txpim); + +/* + * Allocates a new QUIC_TXPIM_PKT structure from the pool. Returns NULL on + * failure. The returned structure is cleared of all data and is in a fresh + * initial state. + */ +QUIC_TXPIM_PKT *ossl_quic_txpim_pkt_alloc(QUIC_TXPIM *txpim); + +/* + * Releases the TXPIM packet, returning it to the pool. + */ +void ossl_quic_txpim_pkt_release(QUIC_TXPIM *txpim, QUIC_TXPIM_PKT *fpkt); + +/* Clears the chunk list of the packet, removing all entries. */ +void ossl_quic_txpim_pkt_clear_chunks(QUIC_TXPIM_PKT *fpkt); + +/* Appends a chunk to the packet. The structure is copied. */ +int ossl_quic_txpim_pkt_append_chunk(QUIC_TXPIM_PKT *fpkt, + const QUIC_TXPIM_CHUNK *chunk); + +/* Adds a CFQ item to the packet by prepending it to the retx_head list. */ +void ossl_quic_txpim_pkt_add_cfq_item(QUIC_TXPIM_PKT *fpkt, + QUIC_CFQ_ITEM *item); + +/* + * Returns a pointer to an array of stream chunk information structures for the + * given packet. The caller must call ossl_quic_txpim_pkt_get_num_chunks() to + * determine the length of this array. + * + * The chunks are sorted by (stream_id, start) in ascending order. + */ +const QUIC_TXPIM_CHUNK *ossl_quic_txpim_pkt_get_chunks(QUIC_TXPIM_PKT *fpkt); + +/* + * Returns the number of entries in the array returned by + * ossl_quic_txpim_pkt_get_chunks(). + */ +size_t ossl_quic_txpim_pkt_get_num_chunks(QUIC_TXPIM_PKT *fpkt); +``` + +The Frame-in-Flight Dispatcher (FIFD) +------------------------------------- + +Finally, the CFQ, TXPIM and some interfaces to the ACKM are tied together via +the FIFD (`QUIC_FIFD`). The FIFD is completely stateless and provides reasonable +implementations for the on-loss, on-acked and on-discarded callbacks issued by +the ACK Manager. + +The FIFD is used by obtaining a packet structure from the TXPIM, filling it in, +and then calling `ossl_quic_fifd_pkt_commit()`. The FIFD submits the packet to +the ACK Manager as a transmitted packet and provides its own callback +implementations to the ACK Manager for the packet. Note that the +`QUIC_TXPIM_PKT` is returned to the free pool once any of these callbacks occur; +once a packet's fate is known (acked, lost or discarded), use is immediately +made of the information in the `QUIC_TXPIM_PKT` and the `QUIC_TXPIM_PKT` is +immediately released. CFQ items may be freed (on ACK or discard) or transitioned +back to the NEW state (on loss). + +The FIFD consumes various dependencies so that it can inform the appropriate +subsystems in the event of a packet being acked, lost or discarded. In +particular: + +- It references a CFQ used to manage CFQ items; +- It references an ACK manager which it informs of transmitted packets; +- It references a TXPIM which manages each `QUIC_TXPIM_PKT`; +- It is provided with a callback to obtain a QUIC Send Stream based on a stream + ID. Thus the caller of the FIFD may implement whatever strategy it likes + to map stream IDs to QUIC Send Stream instances. +- It is provided with a callback which is called when it thinks a frame + should be regenerated using the REGEN strategy. Some of these are specific + to a given stream, in which case a stream ID is specified. + +All of the state is in the dependencies referenced by the FIFD. The FIFD itself +simply glues all of these parts together. + +### API + +```c +typedef struct quic_fifm_st { + /* (internals) */ +} QUIC_FIFD; + +int ossl_quic_fifd_init(QUIC_FIFD *fifd, + QUIC_CFQ *cfq, + QUIC_ACKM *ackm, + QUIC_TXPIM *txpim, + /* stream_id is UINT64_MAX for the crypto stream */ + OSSL_QSS *(*get_qss_by_id)(uint64_t stream_id, + void *arg), + void *get_qss_by_id_arg, + /* stream_id is UINT64_MAX if not applicable */ + void (*regen_frame)(uint64_t frame_type, + uint64_t stream_id, + void *arg), + void *regen_frame_arg); +void ossl_quic_fifd_cleanup(QUIC_FIFD *fifd); /* (no-op) */ + +int ossl_quic_fifd_pkt_commit(QUIC_FIFD *fifd, QUIC_TXPIM_PKT *pkt); +``` + +Typical Intended TX Packetiser Usage +------------------------------------ + +- TX Packetiser maintains flags for each REGEN-strategy frame type. + It sets this flag when the regenerate callback is issued by the FIFD + and clears it when transmitting a packet containing such a frame. + +- TX Packetiser obtains a `QUIC_TXPIM_PKT` structure by calling + `ossl_quic_txpim_pkt_alloc()`. + +- TX Packetiser fills in the ACKM part of the `QUIC_TXPIM_PKT` + (`QUIC_ACKM_TX_PKT`), except for the callback fields, which are handled by the + FIFD. + +- TX Packetiser queries the ACK Manager to determine if an ACK frame + is desired, and if so adds it to the packet. + +- TX Packetiser queries the CFQ to determine what control frames it places + in a packet. It does this before adding STREAM or CRYPTO frames (i.e., + all CFQ frames are considered of higher priority). For each such frame + it places in a packet, it: + + - informs the CFQ that the CFQ item has been transmitted, causing a + transition of the CFQ item to the `TX` state; + + - calls `ossl_quic_txpim_pkt_add_cfq_item()` on the TXPIM to log the CFQ item + as having been transmitted in the given packet, so that the CFQ item can be + released or requeued depending on the ultimate fate of the packet. + +- For each STREAM or CRYPTO frame included in a packet, the TX Packetiser: + + - informs the QUIC Send Stream instance for that stream that a range of bytes + has been transmitted; + + - also informs the QUIC Send Stream instance if FIN was set on a STREAM frame. + + - calls `ossl_quic_txpim_pkt_append_chunk()` to log a logical range of + the given application or crypto stream as having been sent, so that it can + be subsequently marked as acknowledged or lost depending on the ultimate + fate of the packet. + +- TX Packetiser calls `ossl_quic_fifd_pkt_commit()`. The FIFD takes care + of submitting the packet to the ACK Manager and provides its own callback + implementation. + + In the event of packet loss, ACK or discard, the appropriate QUIC Send Stream, + CFQ and regenerate callback calls are made. Regardless of the outcome, the + TXPIM is released. -- 2.47.3