1 /* 2 * Copyright 2022-2024 The OpenSSL Project Authors. All Rights Reserved. 3 * 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 8 */ 9 10 #ifndef OSSL_QUIC_TXPIM_H 11 # define OSSL_QUIC_TXPIM_H 12 13 # include <openssl/ssl.h> 14 # include "internal/quic_types.h" 15 # include "internal/quic_predef.h" 16 # include "internal/quic_cfq.h" 17 # include "internal/quic_ackm.h" 18 19 # ifndef OPENSSL_NO_QUIC 20 21 /* 22 * QUIC Transmitted Packet Information Manager 23 * =========================================== 24 */ 25 26 typedef struct quic_txpim_pkt_st { 27 /* ACKM-specific data. Caller should fill this. */ 28 OSSL_ACKM_TX_PKT ackm_pkt; 29 30 /* Linked list of CFQ items in this packet. */ 31 QUIC_CFQ_ITEM *retx_head; 32 33 /* Reserved for FIFD use. */ 34 QUIC_FIFD *fifd; 35 36 /* QUIC_PKT_TYPE value. For diagnostic use only. */ 37 unsigned char pkt_type; 38 39 /* Regenerate-strategy frames. */ 40 unsigned int had_handshake_done_frame : 1; 41 unsigned int had_max_data_frame : 1; 42 unsigned int had_max_streams_bidi_frame : 1; 43 unsigned int had_max_streams_uni_frame : 1; 44 unsigned int had_ack_frame : 1; 45 unsigned int had_conn_close : 1; 46 47 /* Private data follows. */ 48 } QUIC_TXPIM_PKT; 49 50 /* Represents a range of bytes in an application or CRYPTO stream. */ 51 typedef struct quic_txpim_chunk_st { 52 /* The stream ID, or UINT64_MAX for the CRYPTO stream. */ 53 uint64_t stream_id; 54 /* 55 * The inclusive range of bytes in the stream. Exceptionally, if end < 56 * start, designates a frame of zero length (used for FIN-only frames). In 57 * this case end is the number of the final byte (i.e., one less than the 58 * final size of the stream). 59 */ 60 uint64_t start, end; 61 /* 62 * Whether a FIN was sent for this stream in the packet. Not valid for 63 * CRYPTO stream. 64 */ 65 unsigned int has_fin : 1; 66 /* 67 * If set, a STOP_SENDING frame was sent for this stream ID. (If no data was 68 * sent for the stream, set end < start.) 69 */ 70 unsigned int has_stop_sending : 1; 71 /* 72 * If set, a RESET_STREAM frame was sent for this stream ID. (If no data was 73 * sent for the stream, set end < start.) 74 */ 75 unsigned int has_reset_stream : 1; 76 } QUIC_TXPIM_CHUNK; 77 78 QUIC_TXPIM *ossl_quic_txpim_new(void); 79 80 /* 81 * Frees the TXPIM. All QUIC_TXPIM_PKTs which have been handed out by the TXPIM 82 * must be released via a call to ossl_quic_txpim_pkt_release() before calling 83 * this function. 84 */ 85 void ossl_quic_txpim_free(QUIC_TXPIM *txpim); 86 87 /* 88 * Allocates a new QUIC_TXPIM_PKT structure from the pool. Returns NULL on 89 * failure. The returned structure is cleared of all data and is in a fresh 90 * initial state. 91 */ 92 QUIC_TXPIM_PKT *ossl_quic_txpim_pkt_alloc(QUIC_TXPIM *txpim); 93 94 /* 95 * Releases the TXPIM packet, returning it to the pool. 96 */ 97 void ossl_quic_txpim_pkt_release(QUIC_TXPIM *txpim, QUIC_TXPIM_PKT *fpkt); 98 99 /* Clears the chunk list of the packet, removing all entries. */ 100 void ossl_quic_txpim_pkt_clear_chunks(QUIC_TXPIM_PKT *fpkt); 101 102 /* Appends a chunk to the packet. The structure is copied. */ 103 int ossl_quic_txpim_pkt_append_chunk(QUIC_TXPIM_PKT *fpkt, 104 const QUIC_TXPIM_CHUNK *chunk); 105 106 /* Adds a CFQ item to the packet by prepending it to the retx_head list. */ 107 void ossl_quic_txpim_pkt_add_cfq_item(QUIC_TXPIM_PKT *fpkt, 108 QUIC_CFQ_ITEM *item); 109 110 /* 111 * Returns a pointer to an array of stream chunk information structures for the 112 * given packet. The caller must call ossl_quic_txpim_pkt_get_num_chunks() to 113 * determine the length of this array. The returned pointer is invalidated 114 * if the chunk list is mutated, for example via a call to 115 * ossl_quic_txpim_pkt_append_chunk() or ossl_quic_txpim_pkt_clear_chunks(). 116 * 117 * The chunks are sorted by (stream_id, start) in ascending order. 118 */ 119 const QUIC_TXPIM_CHUNK *ossl_quic_txpim_pkt_get_chunks(const QUIC_TXPIM_PKT *fpkt); 120 121 /* 122 * Returns the number of entries in the array returned by 123 * ossl_quic_txpim_pkt_get_chunks(). 124 */ 125 size_t ossl_quic_txpim_pkt_get_num_chunks(const QUIC_TXPIM_PKT *fpkt); 126 127 /* 128 * Returns the number of QUIC_TXPIM_PKTs allocated by the given TXPIM that have 129 * yet to be returned to the TXPIM. 130 */ 131 size_t ossl_quic_txpim_get_in_use(const QUIC_TXPIM *txpim); 132 133 # endif 134 135 #endif 136