2 * Copyright 2022 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
10 #ifndef OSSL_QUIC_TXPIM_H
11 # define OSSL_QUIC_TXPIM_H
13 # include <openssl/ssl.h>
14 # include "internal/quic_types.h"
15 # include "internal/quic_cfq.h"
16 # include "internal/quic_ackm.h"
18 # ifndef OPENSSL_NO_QUIC
21 * QUIC Transmitted Packet Information Manager
22 * ===========================================
24 typedef struct quic_txpim_st QUIC_TXPIM;
25 typedef struct quic_fifd_st QUIC_FIFD;
27 typedef struct quic_txpim_pkt_st {
28 /* ACKM-specific data. Caller should fill this. */
29 OSSL_ACKM_TX_PKT ackm_pkt;
31 /* Linked list of CFQ items in this packet. */
32 QUIC_CFQ_ITEM *retx_head;
34 /* Reserved for FIFD use. */
37 /* Regenerate-strategy frames. */
38 unsigned int had_handshake_done_frame : 1;
39 unsigned int had_max_data_frame : 1;
40 unsigned int had_max_streams_bidi_frame : 1;
41 unsigned int had_max_streams_uni_frame : 1;
42 unsigned int had_ack_frame : 1;
43 unsigned int had_conn_close : 1;
45 /* Private data follows. */
48 /* Represents a range of bytes in an application or CRYPTO stream. */
49 typedef struct quic_txpim_chunk_st {
50 /* The stream ID, or UINT64_MAX for the CRYPTO stream. */
53 * The inclusive range of bytes in the stream. Exceptionally, if end <
54 * start, designates a frame of zero length (used for FIN-only frames). In
55 * this case end is the number of the final byte (i.e., one less than the
56 * final size of the stream).
60 * Whether a FIN was sent for this stream in the packet. Not valid for
63 unsigned int has_fin : 1;
65 * If set, a STOP_SENDING frame was sent for this stream ID. (If no data was
66 * sent for the stream, set end < start.)
68 unsigned int has_stop_sending : 1;
70 * If set, a RESET_STREAM frame was sent for this stream ID. (If no data was
71 * sent for the stream, set end < start.)
73 unsigned int has_reset_stream : 1;
76 QUIC_TXPIM *ossl_quic_txpim_new(void);
79 * Frees the TXPIM. All QUIC_TXPIM_PKTs which have been handed out by the TXPIM
80 * must be released via a call to ossl_quic_txpim_pkt_release() before calling
83 void ossl_quic_txpim_free(QUIC_TXPIM *txpim);
86 * Allocates a new QUIC_TXPIM_PKT structure from the pool. Returns NULL on
87 * failure. The returned structure is cleared of all data and is in a fresh
90 QUIC_TXPIM_PKT *ossl_quic_txpim_pkt_alloc(QUIC_TXPIM *txpim);
93 * Releases the TXPIM packet, returning it to the pool.
95 void ossl_quic_txpim_pkt_release(QUIC_TXPIM *txpim, QUIC_TXPIM_PKT *fpkt);
97 /* Clears the chunk list of the packet, removing all entries. */
98 void ossl_quic_txpim_pkt_clear_chunks(QUIC_TXPIM_PKT *fpkt);
100 /* Appends a chunk to the packet. The structure is copied. */
101 int ossl_quic_txpim_pkt_append_chunk(QUIC_TXPIM_PKT *fpkt,
102 const QUIC_TXPIM_CHUNK *chunk);
104 /* Adds a CFQ item to the packet by prepending it to the retx_head list. */
105 void ossl_quic_txpim_pkt_add_cfq_item(QUIC_TXPIM_PKT *fpkt,
106 QUIC_CFQ_ITEM *item);
109 * Returns a pointer to an array of stream chunk information structures for the
110 * given packet. The caller must call ossl_quic_txpim_pkt_get_num_chunks() to
111 * determine the length of this array. The returned pointer is invalidated
112 * if the chunk list is mutated, for example via a call to
113 * ossl_quic_txpim_pkt_append_chunk() or ossl_quic_txpim_pkt_clear_chunks().
115 * The chunks are sorted by (stream_id, start) in ascending order.
117 const QUIC_TXPIM_CHUNK *ossl_quic_txpim_pkt_get_chunks(const QUIC_TXPIM_PKT *fpkt);
120 * Returns the number of entries in the array returned by
121 * ossl_quic_txpim_pkt_get_chunks().
123 size_t ossl_quic_txpim_pkt_get_num_chunks(const QUIC_TXPIM_PKT *fpkt);
126 * Returns the number of QUIC_TXPIM_PKTs allocated by the given TXPIM that have
127 * yet to be returned to the TXPIM.
129 size_t ossl_quic_txpim_get_in_use(const QUIC_TXPIM *txpim);