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
|
---|