Coverage Report

Created: 2026-05-24 07:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl34/include/internal/quic_stream_map.h
Line
Count
Source
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_INTERNAL_QUIC_STREAM_MAP_H
11
#define OSSL_INTERNAL_QUIC_STREAM_MAP_H
12
#pragma once
13
14
#include "internal/e_os.h"
15
#include "internal/time.h"
16
#include "internal/common.h"
17
#include "internal/quic_types.h"
18
#include "internal/quic_predef.h"
19
#include "internal/quic_stream.h"
20
#include "internal/quic_fc.h"
21
#include <openssl/lhash.h>
22
23
#ifndef OPENSSL_NO_QUIC
24
25
/*
26
 * QUIC Stream
27
 * ===========
28
 *
29
 * Logical QUIC stream composing all relevant send and receive components.
30
 */
31
32
typedef struct quic_stream_list_node_st QUIC_STREAM_LIST_NODE;
33
34
struct quic_stream_list_node_st {
35
    QUIC_STREAM_LIST_NODE *prev, *next;
36
};
37
38
/*
39
 * QUIC Send Stream States
40
 * -----------------------
41
 *
42
 * These correspond to the states defined in RFC 9000 s. 3.1, with the
43
 * exception of the NONE state which represents the absence of a send stream
44
 * part.
45
 *
46
 * Invariants in each state are noted in comments below. In particular, once all
47
 * data has been acknowledged received, or we have reset the stream, we don't
48
 * need to keep the QUIC_SSTREAM and data buffers around. Of course, we also
49
 * don't have a QUIC_SSTREAM on a receive-only stream.
50
 */
51
376k
#define QUIC_SSTREAM_STATE_NONE 0 /* --- sstream == NULL  */
52
195k
#define QUIC_SSTREAM_STATE_READY 1 /* \                    */
53
1.52M
#define QUIC_SSTREAM_STATE_SEND 2 /* |-- sstream != NULL  */
54
2.72M
#define QUIC_SSTREAM_STATE_DATA_SENT 3 /* /                    */
55
0
#define QUIC_SSTREAM_STATE_DATA_RECVD 4 /* \                    */
56
157k
#define QUIC_SSTREAM_STATE_RESET_SENT 5 /* |-- sstream == NULL  */
57
104k
#define QUIC_SSTREAM_STATE_RESET_RECVD 6 /* /                    */
58
59
/*
60
 * QUIC Receive Stream States
61
 * --------------------------
62
 *
63
 * These correspond to the states defined in RFC 9000 s. 3.2, with the exception
64
 * of the NONE state which represents the absence of a receive stream part.
65
 *
66
 * Invariants in each state are noted in comments below. In particular, once all
67
 * data has been read by the application, we don't need to keep the QUIC_RSTREAM
68
 * and data buffers around. If the receive part is instead reset before it is
69
 * finished, we also don't need to keep the QUIC_RSTREAM around. Finally, we
70
 * don't need a QUIC_RSTREAM on a send-only stream.
71
 */
72
1.47M
#define QUIC_RSTREAM_STATE_NONE 0 /* --- rstream == NULL  */
73
19.9M
#define QUIC_RSTREAM_STATE_RECV 1 /* \                    */
74
35.3M
#define QUIC_RSTREAM_STATE_SIZE_KNOWN 2 /* |-- rstream != NULL  */
75
35.1M
#define QUIC_RSTREAM_STATE_DATA_RECVD 3 /* /                    */
76
27.1k
#define QUIC_RSTREAM_STATE_DATA_READ 4 /* \                    */
77
2.48M
#define QUIC_RSTREAM_STATE_RESET_RECVD 5 /* |-- rstream == NULL  */
78
1.22M
#define QUIC_RSTREAM_STATE_RESET_READ 6 /* /                    */
79
80
struct quic_stream_st {
81
    QUIC_STREAM_LIST_NODE active_node; /* for use by QUIC_STREAM_MAP */
82
    QUIC_STREAM_LIST_NODE accept_node; /* accept queue of remotely-created streams */
83
    QUIC_STREAM_LIST_NODE ready_for_gc_node; /* queue of streams now ready for GC */
84
85
    /* Temporary link used by TXP. */
86
    QUIC_STREAM *txp_next;
87
88
    /*
89
     * QUIC Stream ID. Do not assume that this encodes a type as this is a
90
     * version-specific property and may change between QUIC versions; instead,
91
     * use the type field.
92
     */
93
    uint64_t id;
94
95
    /*
96
     * Application Error Code (AEC) used for STOP_SENDING frame.
97
     * This is only valid if stop_sending is 1.
98
     */
99
    uint64_t stop_sending_aec;
100
101
    /*
102
     * Application Error Code (AEC) used for RESET_STREAM frame.
103
     * This is only valid if reset_stream is 1.
104
     */
105
    uint64_t reset_stream_aec;
106
107
    /*
108
     * Application Error Code (AEC) for incoming STOP_SENDING frame.
109
     * This is only valid if peer_stop_sending is 1.
110
     */
111
    uint64_t peer_stop_sending_aec;
112
113
    /*
114
     * Application Error Code (AEC) for incoming RESET_STREAM frame.
115
     * This is only valid if peer_reset_stream is 1.
116
     */
117
    uint64_t peer_reset_stream_aec;
118
119
    /* Temporary value used by TXP. */
120
    uint64_t txp_txfc_new_credit_consumed;
121
122
    /*
123
     * The final size of the send stream. Although this information can be
124
     * discerned from a QUIC_SSTREAM, it is stored separately as we need to keep
125
     * track of this even if we have thrown away the QUIC_SSTREAM. Use
126
     * ossl_quic_stream_send_get_final_size to determine if this contain a
127
     * valid value or if there is no final size yet for a sending part.
128
     *
129
     * For the receive part, the final size is tracked by the stream-level RXFC;
130
     * use ossl_quic_stream_recv_get_final_size or
131
     * ossl_quic_rxfc_get_final_size.
132
     */
133
    uint64_t send_final_size;
134
135
    /*
136
     * Send stream part and receive stream part buffer management objects.
137
     *
138
     * DO NOT test these pointers (sstream, rstream) for NULL. Determine the
139
     * state of the send or receive stream part first using the appropriate
140
     * function; then the invariant of that state guarantees that sstream or
141
     * rstream either is or is not NULL respectively, therefore there is no
142
     * valid use case for testing these pointers for NULL. In particular, a
143
     * stream with a send part can still have sstream as NULL, and a stream with
144
     * a receive part can still have rstream as NULL. QUIC_SSTREAM and
145
     * QUIC_RSTREAM are stream buffer resource management objects which exist
146
     * only when they need to for buffer management purposes. The existence or
147
     * non-existence of a QUIC_SSTREAM or QUIC_RSTREAM object does not
148
     * correspond with whether a stream's respective send or receive part
149
     * logically exists or not.
150
     */
151
    QUIC_SSTREAM *sstream; /* NULL if RX-only */
152
    QUIC_RSTREAM *rstream; /* NULL if TX only */
153
154
    /* Stream-level flow control managers. */
155
    QUIC_TXFC txfc; /* NULL if RX-only */
156
    QUIC_RXFC rxfc; /* NULL if TX-only */
157
158
    unsigned int type : 8; /* QUIC_STREAM_INITIATOR_*, QUIC_STREAM_DIR_* */
159
160
    unsigned int send_state : 8; /* QUIC_SSTREAM_STATE_* */
161
    unsigned int recv_state : 8; /* QUIC_RSTREAM_STATE_* */
162
163
    /* 1 iff this QUIC_STREAM is on the active queue (invariant). */
164
    unsigned int active : 1;
165
166
    /*
167
     * This is a copy of the QUIC connection as_server value, indicating
168
     * whether we are locally operating as a server or not. Having this
169
     * significantly simplifies stream type determination relative to our
170
     * perspective. It never changes after a QUIC_STREAM is created and is the
171
     * same for all QUIC_STREAMS under a QUIC_STREAM_MAP.
172
     */
173
    unsigned int as_server : 1;
174
175
    /*
176
     * Has STOP_SENDING been requested (by us)? Note that this is not the same
177
     * as want_stop_sending below, as a STOP_SENDING frame may already have been
178
     * sent and fully acknowledged.
179
     */
180
    unsigned int stop_sending : 1;
181
182
    /*
183
     * Has RESET_STREAM been requested (by us)? Works identically to
184
     * STOP_SENDING for transmission purposes.
185
     */
186
    /* Has our peer sent a STOP_SENDING frame? */
187
    unsigned int peer_stop_sending : 1;
188
189
    /* Temporary flags used by TXP. */
190
    unsigned int txp_sent_fc : 1;
191
    unsigned int txp_sent_stop_sending : 1;
192
    unsigned int txp_sent_reset_stream : 1;
193
    unsigned int txp_drained : 1;
194
    unsigned int txp_blocked : 1;
195
196
    /* Frame regeneration flags. */
197
    unsigned int want_max_stream_data : 1; /* used for regen only */
198
    unsigned int want_stop_sending : 1; /* used for gen or regen */
199
    unsigned int want_reset_stream : 1; /* used for gen or regen */
200
201
    /* Flags set when frames *we* sent were acknowledged. */
202
    unsigned int acked_stop_sending : 1;
203
204
    /*
205
     * The stream's XSO has been deleted. Pending GC.
206
     *
207
     * Here is how stream deletion works:
208
     *
209
     *   - A QUIC_STREAM cannot be deleted until it is neither in the accept
210
     *     queue nor has an associated XSO. This condition occurs when and only
211
     *     when deleted is true.
212
     *
213
     *   - Once this is the case (i.e., no user-facing API object exposing the
214
     *     stream), we can delete the stream once we determine that all of our
215
     *     protocol obligations requiring us to keep the QUIC_STREAM around have
216
     *     been met.
217
     *
218
     *     The following frames relate to the streams layer for a specific
219
     *     stream:
220
     *
221
     *          STREAM
222
     *
223
     *              RX Obligations:
224
     *                  Ignore for a deleted stream.
225
     *
226
     *                  (This is different from our obligation for a
227
     *                  locally-initiated stream ID we have not created yet,
228
     *                  which we must treat as a protocol error. This can be
229
     *                  distinguished via a simple monotonic counter.)
230
     *
231
     *              TX Obligations:
232
     *                  None, once we've decided to (someday) delete the stream.
233
     *
234
     *          STOP_SENDING
235
     *
236
     *              We cannot delete the stream until we have finished informing
237
     *              the peer that we are not going to be listening to it
238
     *              anymore.
239
     *
240
     *              RX Obligations:
241
     *                  When we delete a stream we must have already had a FIN
242
     *                  or RESET_STREAM we transmitted acknowledged by the peer.
243
     *                  Thus we can ignore STOP_SENDING frames for deleted
244
     *                  streams (if they occur, they are probably just
245
     *                  retransmissions).
246
     *
247
     *              TX Obligations:
248
     *                  _Acknowledged_ receipt of a STOP_SENDING frame by the
249
     *                  peer (unless the peer's send part has already FIN'd).
250
     *
251
     *          RESET_STREAM
252
     *
253
     *              We cannot delete the stream until we have finished informing
254
     *              the peer that we are not going to be transmitting on it
255
     *              anymore.
256
     *
257
     *              RX Obligations:
258
     *                  This indicates the peer is not going to send any more
259
     *                  data on the stream. We don't need to care about this
260
     *                  since once a stream is marked for deletion we don't care
261
     *                  about any data it does send. We can ignore this for
262
     *                  deleted streams. The important criterion is that the
263
     *                  peer has been successfully delivered our STOP_SENDING
264
     *                  frame.
265
     *
266
     *              TX Obligations:
267
     *                  _Acknowledged_ receipt of a RESET_STREAM frame or FIN by
268
     *                  the peer.
269
     *
270
     *          MAX_STREAM_DATA
271
     *
272
     *              RX Obligations:
273
     *                 Ignore. Since we are not going to be sending any more
274
     *                 data on a stream once it has been marked for deletion,
275
     *                 we don't need to care about flow control information.
276
     *
277
     *              TX Obligations:
278
     *                  None.
279
     *
280
     *     In other words, our protocol obligation is simply:
281
     *
282
     *       - either:
283
     *         - the peer has acknowledged receipt of a STOP_SENDING frame sent
284
     *            by us; -or-
285
     *         - we have received a FIN and all preceding segments from the peer
286
     *
287
     *            [NOTE: The actual criterion required here is simply 'we have
288
     *            received a FIN from the peer'. However, due to reordering and
289
     *            retransmissions we might subsequently receive non-FIN segments
290
     *            out of order. The FIN means we know the peer will stop
291
     *            transmitting on the stream at *some* point, but by sending
292
     *            STOP_SENDING we can avoid these needless retransmissions we
293
     *            will just ignore anyway. In actuality we could just handle all
294
     *            cases by sending a STOP_SENDING. The strategy we choose is to
295
     *            only avoid sending a STOP_SENDING and rely on a received FIN
296
     *            when we have received all preceding data, as this makes it
297
     *            reasonably certain no benefit would be gained by sending
298
     *            STOP_SENDING.]
299
     *
300
     *            TODO(QUIC FUTURE): Implement the latter case (currently we
301
     *                               just always do STOP_SENDING).
302
     *
303
     *         and;
304
     *
305
     *       - we have drained our send stream (for a finished send stream)
306
     *         and got acknowledgement all parts of it including the FIN, or
307
     *         sent a RESET_STREAM frame and got acknowledgement of that frame.
308
     *
309
     *      Once these conditions are met, we can GC the QUIC_STREAM.
310
     *
311
     */
312
    unsigned int deleted : 1;
313
    /* Set to 1 once the above conditions are actually met. */
314
    unsigned int ready_for_gc : 1;
315
    /* Set to 1 if this is currently counted in the shutdown flush stream count. */
316
    unsigned int shutdown_flush : 1;
317
    unsigned int have_final_size : 1;
318
};
319
320
10.2k
#define QUIC_STREAM_INITIATOR_CLIENT 0
321
7.17M
#define QUIC_STREAM_INITIATOR_SERVER 1
322
2.14M
#define QUIC_STREAM_INITIATOR_MASK 1
323
324
3.88M
#define QUIC_STREAM_DIR_BIDI 0
325
2.74M
#define QUIC_STREAM_DIR_UNI 2
326
1.76M
#define QUIC_STREAM_DIR_MASK 2
327
328
void ossl_quic_stream_check(const QUIC_STREAM *s);
329
330
/*
331
 * Returns 1 if the QUIC_STREAM was initiated by the endpoint with the server
332
 * role.
333
 */
334
static ossl_inline ossl_unused int ossl_quic_stream_is_server_init(const QUIC_STREAM *s)
335
1.68M
{
336
1.68M
    return (s->type & QUIC_STREAM_INITIATOR_MASK) == QUIC_STREAM_INITIATOR_SERVER;
337
1.68M
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_method.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_port.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_is_server_init
quic_stream_map.c:ossl_quic_stream_is_server_init
Line
Count
Source
335
1.53M
{
336
1.53M
    return (s->type & QUIC_STREAM_INITIATOR_MASK) == QUIC_STREAM_INITIATOR_SERVER;
337
1.53M
}
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: tls_common.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: extensions.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: statem.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: methods.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: pqueue.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_is_server_init
quic_channel.c:ossl_quic_stream_is_server_init
Line
Count
Source
335
153k
{
336
153k
    return (s->type & QUIC_STREAM_INITIATOR_MASK) == QUIC_STREAM_INITIATOR_SERVER;
337
153k
}
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_rx_depack.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: quic_txp.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_is_server_init
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_is_server_init
338
339
/*
340
 * Returns 1 if the QUIC_STREAM is bidirectional and 0 if it is unidirectional.
341
 */
342
static ossl_inline ossl_unused int ossl_quic_stream_is_bidi(const QUIC_STREAM *s)
343
1.30M
{
344
1.30M
    return (s->type & QUIC_STREAM_DIR_MASK) == QUIC_STREAM_DIR_BIDI;
345
1.30M
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: quic_method.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: quic_port.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_is_bidi
quic_stream_map.c:ossl_quic_stream_is_bidi
Line
Count
Source
343
382k
{
344
382k
    return (s->type & QUIC_STREAM_DIR_MASK) == QUIC_STREAM_DIR_BIDI;
345
382k
}
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: tls_common.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: extensions.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: statem.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: methods.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: pqueue.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_is_bidi
quic_channel.c:ossl_quic_stream_is_bidi
Line
Count
Source
343
153k
{
344
153k
    return (s->type & QUIC_STREAM_DIR_MASK) == QUIC_STREAM_DIR_BIDI;
345
153k
}
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_is_bidi
quic_rx_depack.c:ossl_quic_stream_is_bidi
Line
Count
Source
343
766k
{
344
766k
    return (s->type & QUIC_STREAM_DIR_MASK) == QUIC_STREAM_DIR_BIDI;
345
766k
}
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: quic_txp.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_is_bidi
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_is_bidi
346
347
/* Returns 1 if the QUIC_STREAM was locally initiated. */
348
static ossl_inline ossl_unused int ossl_quic_stream_is_local_init(const QUIC_STREAM *s)
349
306k
{
350
306k
    return ossl_quic_stream_is_server_init(s) == s->as_server;
351
306k
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_method.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_port.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_is_local_init
quic_stream_map.c:ossl_quic_stream_is_local_init
Line
Count
Source
349
306k
{
350
306k
    return ossl_quic_stream_is_server_init(s) == s->as_server;
351
306k
}
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: tls_common.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: extensions.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: statem.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: methods.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: pqueue.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_rx_depack.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: quic_txp.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_is_local_init
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_is_local_init
352
353
/*
354
 * Returns 1 if the QUIC_STREAM has a sending part, based on its stream type.
355
 *
356
 * Do NOT use (s->sstream != NULL) to test this; use this function. Note that
357
 * even if this function returns 1, s->sstream might be NULL if the QUIC_SSTREAM
358
 * has been deemed no longer needed, for example due to a RESET_STREAM.
359
 */
360
static ossl_inline ossl_unused int ossl_quic_stream_has_send(const QUIC_STREAM *s)
361
115k
{
362
115k
    return s->send_state != QUIC_SSTREAM_STATE_NONE;
363
115k
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_has_send
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_has_send
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_has_send
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_has_send
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_has_send
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_has_send
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_method.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_port.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_has_send
quic_stream_map.c:ossl_quic_stream_has_send
Line
Count
Source
361
12.6k
{
362
12.6k
    return s->send_state != QUIC_SSTREAM_STATE_NONE;
363
12.6k
}
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_has_send
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_has_send
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_has_send
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_has_send
Unexecuted instantiation: tls_common.c:ossl_quic_stream_has_send
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_has_send
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_has_send
Unexecuted instantiation: extensions.c:ossl_quic_stream_has_send
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_has_send
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_has_send
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_has_send
Unexecuted instantiation: statem.c:ossl_quic_stream_has_send
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_has_send
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_has_send
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_has_send
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_has_send
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_has_send
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_has_send
Unexecuted instantiation: methods.c:ossl_quic_stream_has_send
Unexecuted instantiation: pqueue.c:ossl_quic_stream_has_send
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_has_send
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_has_send
quic_rx_depack.c:ossl_quic_stream_has_send
Line
Count
Source
361
103k
{
362
103k
    return s->send_state != QUIC_SSTREAM_STATE_NONE;
363
103k
}
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_has_send
Unexecuted instantiation: quic_txp.c:ossl_quic_stream_has_send
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_has_send
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_has_send
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_has_send
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_has_send
364
365
/*
366
 * Returns 1 if the QUIC_STREAM has a receiving part, based on its stream type.
367
 *
368
 * Do NOT use (s->rstream != NULL) to test this; use this function. Note that
369
 * even if this function returns 1, s->rstream might be NULL if the QUIC_RSTREAM
370
 * has been deemed no longer needed, for example if the receive stream is
371
 * completely finished with.
372
 */
373
static ossl_inline ossl_unused int ossl_quic_stream_has_recv(const QUIC_STREAM *s)
374
1.31M
{
375
1.31M
    return s->recv_state != QUIC_RSTREAM_STATE_NONE;
376
1.31M
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_has_recv
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_has_recv
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_has_recv
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_has_recv
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_has_recv
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_has_recv
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_method.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_port.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_has_recv
quic_stream_map.c:ossl_quic_stream_has_recv
Line
Count
Source
374
1.23M
{
375
1.23M
    return s->recv_state != QUIC_RSTREAM_STATE_NONE;
376
1.23M
}
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_has_recv
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_has_recv
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_has_recv
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_has_recv
Unexecuted instantiation: tls_common.c:ossl_quic_stream_has_recv
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_has_recv
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_has_recv
Unexecuted instantiation: extensions.c:ossl_quic_stream_has_recv
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_has_recv
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_has_recv
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_has_recv
Unexecuted instantiation: statem.c:ossl_quic_stream_has_recv
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_has_recv
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_has_recv
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_has_recv
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_has_recv
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_has_recv
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_has_recv
Unexecuted instantiation: methods.c:ossl_quic_stream_has_recv
Unexecuted instantiation: pqueue.c:ossl_quic_stream_has_recv
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_has_recv
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_has_recv
quic_rx_depack.c:ossl_quic_stream_has_recv
Line
Count
Source
374
79.9k
{
375
79.9k
    return s->recv_state != QUIC_RSTREAM_STATE_NONE;
376
79.9k
}
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_has_recv
Unexecuted instantiation: quic_txp.c:ossl_quic_stream_has_recv
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_has_recv
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_has_recv
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_has_recv
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_has_recv
377
378
/*
379
 * Returns 1 if the QUIC_STREAM has a QUIC_SSTREAM send buffer associated with
380
 * it. If this returns 1, s->sstream is guaranteed to be non-NULL. The converse
381
 * is not necessarily true; erasure of a send stream buffer which is no longer
382
 * required is an optimisation which the QSM may, but is not obliged, to
383
 * perform.
384
 *
385
 * This call should be used where it is desired to do something with the send
386
 * stream buffer but there is no more specific send state restriction which is
387
 * applicable.
388
 *
389
 * Note: This does NOT indicate whether it is suitable to allow an application
390
 * to append to the buffer. DATA_SENT indicates all data (including FIN) has
391
 * been *sent*; the absence of DATA_SENT does not mean a FIN has not been queued
392
 * (meaning no more application data can be appended). This is enforced by
393
 * QUIC_SSTREAM.
394
 */
395
static ossl_inline ossl_unused int ossl_quic_stream_has_send_buffer(const QUIC_STREAM *s)
396
31.0k
{
397
31.0k
    switch (s->send_state) {
398
0
    case QUIC_SSTREAM_STATE_READY:
399
18.0k
    case QUIC_SSTREAM_STATE_SEND:
400
18.0k
    case QUIC_SSTREAM_STATE_DATA_SENT:
401
18.0k
        return 1;
402
13.0k
    default:
403
13.0k
        return 0;
404
31.0k
    }
405
31.0k
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_method.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_port.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_stream_map.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: tls_common.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: extensions.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: statem.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: methods.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: pqueue.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_rx_depack.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_has_send_buffer
quic_txp.c:ossl_quic_stream_has_send_buffer
Line
Count
Source
396
31.0k
{
397
31.0k
    switch (s->send_state) {
398
0
    case QUIC_SSTREAM_STATE_READY:
399
18.0k
    case QUIC_SSTREAM_STATE_SEND:
400
18.0k
    case QUIC_SSTREAM_STATE_DATA_SENT:
401
18.0k
        return 1;
402
13.0k
    default:
403
13.0k
        return 0;
404
31.0k
    }
405
31.0k
}
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_has_send_buffer
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_has_send_buffer
406
407
/*
408
 * Returns 1 if the QUIC_STREAM has a sending part which is in one of the reset
409
 * states.
410
 */
411
static ossl_inline ossl_unused int ossl_quic_stream_send_is_reset(const QUIC_STREAM *s)
412
23.3k
{
413
23.3k
    return s->send_state == QUIC_SSTREAM_STATE_RESET_SENT
414
11.3k
        || s->send_state == QUIC_SSTREAM_STATE_RESET_RECVD;
415
23.3k
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_method.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_port.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_send_is_reset
quic_stream_map.c:ossl_quic_stream_send_is_reset
Line
Count
Source
412
11.9k
{
413
11.9k
    return s->send_state == QUIC_SSTREAM_STATE_RESET_SENT
414
0
        || s->send_state == QUIC_SSTREAM_STATE_RESET_RECVD;
415
11.9k
}
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: tls_common.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: extensions.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: statem.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: methods.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: pqueue.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_rx_depack.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_send_is_reset
quic_txp.c:ossl_quic_stream_send_is_reset
Line
Count
Source
412
11.3k
{
413
11.3k
    return s->send_state == QUIC_SSTREAM_STATE_RESET_SENT
414
11.3k
        || s->send_state == QUIC_SSTREAM_STATE_RESET_RECVD;
415
11.3k
}
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_send_is_reset
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_send_is_reset
416
417
/*
418
 * Returns 1 if the QUIC_STREAM has a QUIC_RSTREAM receive buffer associated
419
 * with it. If this returns 1, s->rstream is guaranteed to be non-NULL. The
420
 * converse is not necessarily true; erasure of a receive stream buffer which is
421
 * no longer required is an optimisation which the QSM may, but is not obliged,
422
 * to perform.
423
 *
424
 * This call should be used where it is desired to do something with the receive
425
 * stream buffer but there is no more specific receive state restriction which is
426
 * applicable.
427
 */
428
static ossl_inline ossl_unused int ossl_quic_stream_has_recv_buffer(const QUIC_STREAM *s)
429
0
{
430
0
    switch (s->recv_state) {
431
0
    case QUIC_RSTREAM_STATE_RECV:
432
0
    case QUIC_RSTREAM_STATE_SIZE_KNOWN:
433
0
    case QUIC_RSTREAM_STATE_DATA_RECVD:
434
0
        return 1;
435
0
    default:
436
0
        return 0;
437
0
    }
438
0
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_method.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_port.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_stream_map.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: tls_common.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: extensions.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: statem.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: methods.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: pqueue.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_rx_depack.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: quic_txp.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_has_recv_buffer
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_has_recv_buffer
439
440
/*
441
 * Returns 1 if the QUIC_STREAM has a receiving part which is in one of the
442
 * reset states.
443
 */
444
static ossl_inline ossl_unused int ossl_quic_stream_recv_is_reset(const QUIC_STREAM *s)
445
1.22M
{
446
1.22M
    return s->recv_state == QUIC_RSTREAM_STATE_RESET_RECVD
447
1.19M
        || s->recv_state == QUIC_RSTREAM_STATE_RESET_READ;
448
1.22M
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_method.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_port.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_recv_is_reset
quic_stream_map.c:ossl_quic_stream_recv_is_reset
Line
Count
Source
445
1.22M
{
446
1.22M
    return s->recv_state == QUIC_RSTREAM_STATE_RESET_RECVD
447
1.19M
        || s->recv_state == QUIC_RSTREAM_STATE_RESET_READ;
448
1.22M
}
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: tls_common.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: extensions.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: statem.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: methods.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: pqueue.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_rx_depack.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: quic_txp.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_recv_is_reset
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_recv_is_reset
449
450
/*
451
 * Returns 1 if the stream has a send part and that part has a final size.
452
 *
453
 * If final_size is non-NULL, *final_size is the final size (on success) or an
454
 * undefined value otherwise.
455
 */
456
static ossl_inline ossl_unused int ossl_quic_stream_send_get_final_size(const QUIC_STREAM *s,
457
    uint64_t *final_size)
458
6.68k
{
459
6.68k
    switch (s->send_state) {
460
0
    default:
461
0
    case QUIC_SSTREAM_STATE_NONE:
462
0
        return 0;
463
0
    case QUIC_SSTREAM_STATE_SEND:
464
        /*
465
         * SEND may or may not have had a FIN - even if we have a FIN we do not
466
         * move to DATA_SENT until we have actually sent all the data. So
467
         * ask the QUIC_SSTREAM.
468
         */
469
0
        return ossl_quic_sstream_get_final_size(s->sstream, final_size);
470
0
    case QUIC_SSTREAM_STATE_DATA_SENT:
471
0
    case QUIC_SSTREAM_STATE_DATA_RECVD:
472
6.68k
    case QUIC_SSTREAM_STATE_RESET_SENT:
473
6.68k
    case QUIC_SSTREAM_STATE_RESET_RECVD:
474
6.68k
        if (final_size != NULL)
475
6.68k
            *final_size = s->send_final_size;
476
6.68k
        return 1;
477
6.68k
    }
478
6.68k
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_method.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_port.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_stream_map.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: tls_common.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: extensions.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: statem.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: methods.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: pqueue.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_rx_depack.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_send_get_final_size
quic_txp.c:ossl_quic_stream_send_get_final_size
Line
Count
Source
458
6.68k
{
459
6.68k
    switch (s->send_state) {
460
0
    default:
461
0
    case QUIC_SSTREAM_STATE_NONE:
462
0
        return 0;
463
0
    case QUIC_SSTREAM_STATE_SEND:
464
        /*
465
         * SEND may or may not have had a FIN - even if we have a FIN we do not
466
         * move to DATA_SENT until we have actually sent all the data. So
467
         * ask the QUIC_SSTREAM.
468
         */
469
0
        return ossl_quic_sstream_get_final_size(s->sstream, final_size);
470
0
    case QUIC_SSTREAM_STATE_DATA_SENT:
471
0
    case QUIC_SSTREAM_STATE_DATA_RECVD:
472
6.68k
    case QUIC_SSTREAM_STATE_RESET_SENT:
473
6.68k
    case QUIC_SSTREAM_STATE_RESET_RECVD:
474
6.68k
        if (final_size != NULL)
475
6.68k
            *final_size = s->send_final_size;
476
6.68k
        return 1;
477
6.68k
    }
478
6.68k
}
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_send_get_final_size
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_send_get_final_size
479
480
/*
481
 * Returns 1 if the stream has a receive part and that part has a final size.
482
 *
483
 * If final_size is non-NULL, *final_size is the final size (on success) or an
484
 * undefined value otherwise.
485
 */
486
static ossl_inline ossl_unused int ossl_quic_stream_recv_get_final_size(const QUIC_STREAM *s,
487
    uint64_t *final_size)
488
20.0k
{
489
20.0k
    switch (s->recv_state) {
490
0
    default:
491
0
    case QUIC_RSTREAM_STATE_NONE:
492
4.33k
    case QUIC_RSTREAM_STATE_RECV:
493
4.33k
        return 0;
494
495
15.7k
    case QUIC_RSTREAM_STATE_SIZE_KNOWN:
496
15.7k
    case QUIC_RSTREAM_STATE_DATA_RECVD:
497
15.7k
    case QUIC_RSTREAM_STATE_DATA_READ:
498
15.7k
    case QUIC_RSTREAM_STATE_RESET_RECVD:
499
15.7k
    case QUIC_RSTREAM_STATE_RESET_READ:
500
15.7k
        if (!ossl_assert(ossl_quic_rxfc_get_final_size(&s->rxfc, final_size)))
501
0
            return 0;
502
503
15.7k
        return 1;
504
20.0k
    }
505
20.0k
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_method.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_port.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_recv_get_final_size
quic_stream_map.c:ossl_quic_stream_recv_get_final_size
Line
Count
Source
488
790
{
489
790
    switch (s->recv_state) {
490
0
    default:
491
0
    case QUIC_RSTREAM_STATE_NONE:
492
781
    case QUIC_RSTREAM_STATE_RECV:
493
781
        return 0;
494
495
4
    case QUIC_RSTREAM_STATE_SIZE_KNOWN:
496
9
    case QUIC_RSTREAM_STATE_DATA_RECVD:
497
9
    case QUIC_RSTREAM_STATE_DATA_READ:
498
9
    case QUIC_RSTREAM_STATE_RESET_RECVD:
499
9
    case QUIC_RSTREAM_STATE_RESET_READ:
500
9
        if (!ossl_assert(ossl_quic_rxfc_get_final_size(&s->rxfc, final_size)))
501
0
            return 0;
502
503
9
        return 1;
504
790
    }
505
790
}
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: tls_common.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: extensions.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: statem.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: methods.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: pqueue.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_recv_get_final_size
quic_rx_depack.c:ossl_quic_stream_recv_get_final_size
Line
Count
Source
488
19.2k
{
489
19.2k
    switch (s->recv_state) {
490
0
    default:
491
0
    case QUIC_RSTREAM_STATE_NONE:
492
3.55k
    case QUIC_RSTREAM_STATE_RECV:
493
3.55k
        return 0;
494
495
15.7k
    case QUIC_RSTREAM_STATE_SIZE_KNOWN:
496
15.7k
    case QUIC_RSTREAM_STATE_DATA_RECVD:
497
15.7k
    case QUIC_RSTREAM_STATE_DATA_READ:
498
15.7k
    case QUIC_RSTREAM_STATE_RESET_RECVD:
499
15.7k
    case QUIC_RSTREAM_STATE_RESET_READ:
500
15.7k
        if (!ossl_assert(ossl_quic_rxfc_get_final_size(&s->rxfc, final_size)))
501
0
            return 0;
502
503
15.7k
        return 1;
504
19.2k
    }
505
19.2k
}
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: quic_txp.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_recv_get_final_size
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_recv_get_final_size
506
507
/*
508
 * Determines the number of bytes available still to be read, and (if
509
 * include_fin is 1) whether a FIN or reset has yet to be read.
510
 */
511
static ossl_inline ossl_unused int ossl_quic_stream_recv_pending(const QUIC_STREAM *s,
512
    int include_fin)
513
0
{
514
0
    size_t avail;
515
0
    int fin = 0;
516
517
0
    switch (s->recv_state) {
518
0
    default:
519
0
    case QUIC_RSTREAM_STATE_NONE:
520
0
        return 0;
521
522
0
    case QUIC_RSTREAM_STATE_RECV:
523
0
    case QUIC_RSTREAM_STATE_SIZE_KNOWN:
524
0
    case QUIC_RSTREAM_STATE_DATA_RECVD:
525
0
        if (!ossl_quic_rstream_available(s->rstream, &avail, &fin))
526
0
            avail = 0;
527
528
0
        if (avail == 0 && include_fin && fin)
529
0
            avail = 1;
530
531
0
        return avail;
532
533
0
    case QUIC_RSTREAM_STATE_RESET_RECVD:
534
0
        return include_fin;
535
536
0
    case QUIC_RSTREAM_STATE_DATA_READ:
537
0
    case QUIC_RSTREAM_STATE_RESET_READ:
538
0
        return 0;
539
0
    }
540
0
}
Unexecuted instantiation: ssl_init.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: s3_lib.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: s3_msg.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl_cert.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl_ciph.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl_lib.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl_mcnf.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl_sess.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: t1_lib.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: tls13_enc.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: tls_depr.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: tls_srp.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_impl.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_method.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_port.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_record_rx.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_record_shared.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_record_tx.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_record_util.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_stream_map.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_thread_assist.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: rec_layer_s3.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: dtls_meth.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: tls1_meth.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: tls_common.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: tls_multib.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: tlsany_meth.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: extensions.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: extensions_clnt.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: extensions_cust.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: extensions_srvr.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: statem.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: statem_clnt.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: statem_dtls.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: statem_lib.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: statem_srvr.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: d1_lib.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: d1_srtp.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: methods.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: pqueue.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: s3_enc.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl_asn1.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl_conf.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl_rsa.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: t1_enc.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_channel.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_engine.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_rx_depack.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_tls.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: quic_txp.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: rec_layer_d1.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl3_meth.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: tls13_meth.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: d1_msg.c:ossl_quic_stream_recv_pending
Unexecuted instantiation: ssl_txt.c:ossl_quic_stream_recv_pending
541
542
/*
543
 * QUIC Stream Map
544
 * ===============
545
 *
546
 * The QUIC stream map:
547
 *
548
 *   - maps stream IDs to QUIC_STREAM objects;
549
 *   - tracks which streams are 'active' (currently have data for transmission);
550
 *   - allows iteration over the active streams only.
551
 *
552
 */
553
struct quic_stream_map_st {
554
    LHASH_OF(QUIC_STREAM) *map;
555
    QUIC_STREAM_LIST_NODE active_list;
556
    QUIC_STREAM_LIST_NODE accept_list;
557
    QUIC_STREAM_LIST_NODE ready_for_gc_list;
558
    size_t rr_stepping, rr_counter;
559
    size_t num_accept_bidi, num_accept_uni, num_shutdown_flush;
560
    QUIC_STREAM *rr_cur;
561
    uint64_t (*get_stream_limit_cb)(int uni, void *arg);
562
    void *get_stream_limit_cb_arg;
563
    QUIC_RXFC *max_streams_bidi_rxfc;
564
    QUIC_RXFC *max_streams_uni_rxfc;
565
    int is_server;
566
};
567
568
/*
569
 * get_stream_limit is a callback which is called to retrieve the current stream
570
 * limit for streams created by us. This mechanism is not used for
571
 * peer-initiated streams. If a stream's stream ID is x, a stream is allowed if
572
 * (x >> 2) < returned limit value; i.e., the returned value is exclusive.
573
 *
574
 * If uni is 1, get the limit for locally-initiated unidirectional streams, else
575
 * get the limit for locally-initiated bidirectional streams.
576
 *
577
 * If the callback is NULL, stream limiting is not applied.
578
 * Stream limiting is used to determine if frames can currently be produced for
579
 * a stream.
580
 */
581
int ossl_quic_stream_map_init(QUIC_STREAM_MAP *qsm,
582
    uint64_t (*get_stream_limit_cb)(int uni, void *arg),
583
    void *get_stream_limit_cb_arg,
584
    QUIC_RXFC *max_streams_bidi_rxfc,
585
    QUIC_RXFC *max_streams_uni_rxfc,
586
    int is_server);
587
588
/*
589
 * Any streams still in the map will be released as though
590
 * ossl_quic_stream_map_release was called on them.
591
 */
592
void ossl_quic_stream_map_cleanup(QUIC_STREAM_MAP *qsm);
593
594
/*
595
 * Allocate a new stream. type is a combination of one QUIC_STREAM_INITIATOR_*
596
 * value and one QUIC_STREAM_DIR_* value. Note that clients can e.g. allocate
597
 * server-initiated streams as they will need to allocate a QUIC_STREAM
598
 * structure to track any stream created by the server, etc.
599
 *
600
 * stream_id must be a valid value. Returns NULL if a stream already exists
601
 * with the given ID.
602
 */
603
QUIC_STREAM *ossl_quic_stream_map_alloc(QUIC_STREAM_MAP *qsm,
604
    uint64_t stream_id,
605
    int type);
606
607
/*
608
 * Releases a stream object. Note that this must only be done once the teardown
609
 * process is entirely complete and the object will never be referenced again.
610
 */
611
void ossl_quic_stream_map_release(QUIC_STREAM_MAP *qsm, QUIC_STREAM *stream);
612
613
/*
614
 * Calls visit_cb() for each stream in the map. visit_cb_arg is an opaque
615
 * argument which is passed through.
616
 */
617
void ossl_quic_stream_map_visit(QUIC_STREAM_MAP *qsm,
618
    void (*visit_cb)(QUIC_STREAM *stream, void *arg),
619
    void *visit_cb_arg);
620
621
/*
622
 * Retrieves a stream by stream ID. Returns NULL if it does not exist.
623
 */
624
QUIC_STREAM *ossl_quic_stream_map_get_by_id(QUIC_STREAM_MAP *qsm,
625
    uint64_t stream_id);
626
627
/*
628
 * Marks the given stream as active or inactive based on its state. Idempotent.
629
 *
630
 * When a stream is marked active, it becomes available in the iteration list,
631
 * and when a stream is marked inactive, it no longer appears in the iteration
632
 * list.
633
 *
634
 * Calling this function invalidates any iterator currently pointing at the
635
 * given stream object, but iterators not currently pointing at the given stream
636
 * object are not invalidated.
637
 */
638
void ossl_quic_stream_map_update_state(QUIC_STREAM_MAP *qsm, QUIC_STREAM *s);
639
640
/*
641
 * Sets the RR stepping value, n. The RR rotation will be advanced every n
642
 * packets. The default value is 1.
643
 */
644
void ossl_quic_stream_map_set_rr_stepping(QUIC_STREAM_MAP *qsm, size_t stepping);
645
646
/*
647
 * Returns 1 if the stream ordinal given is allowed by the current stream count
648
 * flow control limit, assuming a locally initiated stream of a type described
649
 * by is_uni.
650
 *
651
 * Note that stream_ordinal is a stream ordinal, not a stream ID.
652
 */
653
int ossl_quic_stream_map_is_local_allowed_by_stream_limit(QUIC_STREAM_MAP *qsm,
654
    uint64_t stream_ordinal,
655
    int is_uni);
656
657
/*
658
 * Stream Send Part
659
 * ================
660
 */
661
662
/*
663
 * Ensures that the sending part has transitioned out of the READY state (i.e.,
664
 * to SEND, or a subsequent state). This function is named as it is because,
665
 * while on paper the distinction between READY and SEND is whether we have
666
 * started transmitting application data, in practice the meaningful distinction
667
 * between the two states is whether we have allocated a stream ID to the stream
668
 * or not. QUIC permits us to defer stream ID allocation until first STREAM (or
669
 * STREAM_DATA_BLOCKED) frame transmission for locally-initiated streams.
670
 *
671
 * Our implementation does not currently do this and we allocate stream IDs up
672
 * front, however we may revisit this in the future. Calling this represents a
673
 * demand for a stream ID by the caller and ensures one has been allocated to
674
 * the stream, and causes us to transition to SEND if we are still in the READY
675
 * state.
676
 *
677
 * Returns 0 if there is no send part (caller error) and 1 otherwise.
678
 */
679
int ossl_quic_stream_map_ensure_send_part_id(QUIC_STREAM_MAP *qsm,
680
    QUIC_STREAM *qs);
681
682
/*
683
 * Transitions from SEND to the DATA_SENT state. Note that this is NOT the same
684
 * as the point in time at which the final size of the stream becomes known
685
 * (i.e., the time at which ossl_quic_sstream_fin()) is called as it occurs when
686
 * we have SENT all data on a given stream send part, not merely buffered it.
687
 * Note that this transition is NOT reversed in the event of some of that data
688
 * being lost.
689
 *
690
 * Returns 1 if the state transition was successfully taken. Returns 0 if there
691
 * is no send part (caller error) or if the state transition cannot be taken
692
 * because the send part is not in the SEND state.
693
 */
694
int ossl_quic_stream_map_notify_all_data_sent(QUIC_STREAM_MAP *qsm,
695
    QUIC_STREAM *qs);
696
697
/*
698
 * Transitions from the DATA_SENT to DATA_RECVD state; should be called
699
 * when all transmitted stream data is ACKed by the peer.
700
 *
701
 * Returns 1 if the state transition was successfully taken. Returns 0 if there
702
 * is no send part (caller error) or the state transition cannot be taken
703
 * because the send part is not in the DATA_SENT state. Because
704
 * ossl_quic_stream_map_notify_all_data_sent() should always be called prior to
705
 * this function, the send state must already be in DATA_SENT in order for this
706
 * function to succeed.
707
 */
708
int ossl_quic_stream_map_notify_totally_acked(QUIC_STREAM_MAP *qsm,
709
    QUIC_STREAM *qs);
710
711
/*
712
 * Resets the sending part of a stream. This is a transition from the READY,
713
 * SEND or DATA_SENT send stream states to the RESET_SENT state.
714
 *
715
 * This function returns 1 if the transition is taken (i.e., if the send stream
716
 * part was in one of the states above), or if it is already in the RESET_SENT
717
 * state (idempotent operation), or if it has reached the RESET_RECVD state.
718
 *
719
 * It returns 0 if in the DATA_RECVD state, as a send stream cannot be reset
720
 * in this state. It also returns 0 if there is no send part (caller error).
721
 */
722
int ossl_quic_stream_map_reset_stream_send_part(QUIC_STREAM_MAP *qsm,
723
    QUIC_STREAM *qs,
724
    uint64_t aec);
725
726
/*
727
 * Transitions from the RESET_SENT to the RESET_RECVD state. This should be
728
 * called when a sent RESET_STREAM frame has been acknowledged by the peer.
729
 *
730
 * This function returns 1 if the transition is taken (i.e., if the send stream
731
 * part was in one of the states above) or if it is already in the RESET_RECVD
732
 * state (idempotent operation).
733
 *
734
 * It returns 0 if not in the RESET_SENT or RESET_RECVD states, as this function
735
 * should only be called after we have already sent a RESET_STREAM frame and
736
 * entered the RESET_SENT state. It also returns 0 if there is no send part
737
 * (caller error).
738
 */
739
int ossl_quic_stream_map_notify_reset_stream_acked(QUIC_STREAM_MAP *qsm,
740
    QUIC_STREAM *qs);
741
742
/*
743
 * Stream Receive Part
744
 * ===================
745
 */
746
747
/*
748
 * Transitions from the RECV receive stream state to the SIZE_KNOWN state. This
749
 * should be called once a STREAM frame is received for the stream with the FIN
750
 * bit set. final_size should be the final size of the stream in bytes.
751
 *
752
 * Returns 1 if the transition was taken.
753
 */
754
int ossl_quic_stream_map_notify_size_known_recv_part(QUIC_STREAM_MAP *qsm,
755
    QUIC_STREAM *qs,
756
    uint64_t final_size);
757
758
/*
759
 * Transitions from the SIZE_KNOWN receive stream state to the DATA_RECVD state.
760
 * This should be called once all data for a receive stream is received.
761
 *
762
 * Returns 1 if the transition was taken.
763
 */
764
int ossl_quic_stream_map_notify_totally_received(QUIC_STREAM_MAP *qsm,
765
    QUIC_STREAM *qs);
766
767
/*
768
 * Transitions from the DATA_RECVD receive stream state to the DATA_READ state.
769
 * This should be called once all data for a receive stream is read by the
770
 * application.
771
 *
772
 * Returns 1 if the transition was taken.
773
 */
774
int ossl_quic_stream_map_notify_totally_read(QUIC_STREAM_MAP *qsm,
775
    QUIC_STREAM *qs);
776
777
/*
778
 * Transitions from the RECV, SIZE_KNOWN or DATA_RECVD receive stream state to
779
 * the RESET_RECVD state. This should be called on RESET_STREAM.
780
 *
781
 * Returns 1 if the transition was taken.
782
 */
783
int ossl_quic_stream_map_notify_reset_recv_part(QUIC_STREAM_MAP *qsm,
784
    QUIC_STREAM *qs,
785
    uint64_t app_error_code,
786
    uint64_t final_size);
787
788
/*
789
 * Transitions from the RESET_RECVD receive stream state to the RESET_READ
790
 * receive stream state. This should be called when the application is notified
791
 * of a stream reset.
792
 */
793
int ossl_quic_stream_map_notify_app_read_reset_recv_part(QUIC_STREAM_MAP *qsm,
794
    QUIC_STREAM *qs);
795
796
/*
797
 * Marks the receiving part of a stream for STOP_SENDING. This is orthogonal to
798
 * receive stream state as it does not affect it directly.
799
 *
800
 * Returns 1 if the receiving part of a stream was not already marked for
801
 * STOP_SENDING.
802
 * Returns 0 otherwise, which need not be considered an error.
803
 */
804
int ossl_quic_stream_map_stop_sending_recv_part(QUIC_STREAM_MAP *qsm,
805
    QUIC_STREAM *qs,
806
    uint64_t aec);
807
808
/*
809
 * Marks the stream as wanting a STOP_SENDING frame transmitted. It is not valid
810
 * to call this if ossl_quic_stream_map_stop_sending_recv_part() has not been
811
 * called. For TXP use.
812
 */
813
int ossl_quic_stream_map_schedule_stop_sending(QUIC_STREAM_MAP *qsm,
814
    QUIC_STREAM *qs);
815
816
/*
817
 * Accept Queue Management
818
 * =======================
819
 */
820
821
/*
822
 * Adds a stream to the accept queue.
823
 */
824
void ossl_quic_stream_map_push_accept_queue(QUIC_STREAM_MAP *qsm,
825
    QUIC_STREAM *s);
826
827
/*
828
 * Returns the next item to be popped from the accept queue, or NULL if it is
829
 * empty.
830
 */
831
QUIC_STREAM *ossl_quic_stream_map_peek_accept_queue(QUIC_STREAM_MAP *qsm);
832
833
/*
834
 * Removes a stream from the accept queue. rtt is the estimated connection RTT.
835
 * The stream is retired for the purposes of MAX_STREAMS RXFC.
836
 *
837
 * Precondition: s is in the accept queue.
838
 */
839
void ossl_quic_stream_map_remove_from_accept_queue(QUIC_STREAM_MAP *qsm,
840
    QUIC_STREAM *s,
841
    OSSL_TIME rtt);
842
843
/* Returns the length of the accept queue for the given stream type. */
844
size_t ossl_quic_stream_map_get_accept_queue_len(QUIC_STREAM_MAP *qsm, int is_uni);
845
846
/* Returns the total length of the accept queues for all stream types. */
847
size_t ossl_quic_stream_map_get_total_accept_queue_len(QUIC_STREAM_MAP *qsm);
848
849
/*
850
 * Shutdown Flush and GC
851
 * =====================
852
 */
853
854
/*
855
 * Delete streams ready for GC. Pointers to those QUIC_STREAM objects become
856
 * invalid.
857
 */
858
void ossl_quic_stream_map_gc(QUIC_STREAM_MAP *qsm);
859
860
/*
861
 * Begins shutdown stream flush triage. Analyses all streams, including deleted
862
 * but not yet GC'd streams, to determine if we should wait for that stream to
863
 * be fully flushed before shutdown. After calling this, call
864
 * ossl_quic_stream_map_is_shutdown_flush_finished() to determine if all
865
 * shutdown flush eligible streams have been flushed.
866
 */
867
void ossl_quic_stream_map_begin_shutdown_flush(QUIC_STREAM_MAP *qsm);
868
869
/*
870
 * Returns 1 if all shutdown flush eligible streams have finished flushing,
871
 * or if ossl_quic_stream_map_begin_shutdown_flush() has not been called.
872
 */
873
int ossl_quic_stream_map_is_shutdown_flush_finished(QUIC_STREAM_MAP *qsm);
874
875
/*
876
 * QUIC Stream Iterator
877
 * ====================
878
 *
879
 * Allows the current set of active streams to be walked using a RR-based
880
 * algorithm. Each time ossl_quic_stream_iter_init is called, the RR algorithm
881
 * is stepped. The RR algorithm rotates the iteration order such that the next
882
 * active stream is returned first after n calls to ossl_quic_stream_iter_init,
883
 * where n is the stepping value configured via
884
 * ossl_quic_stream_map_set_rr_stepping.
885
 *
886
 * Suppose there are three active streams and the configured stepping is n:
887
 *
888
 *   Iteration 0n:  [Stream 1] [Stream 2] [Stream 3]
889
 *   Iteration 1n:  [Stream 2] [Stream 3] [Stream 1]
890
 *   Iteration 2n:  [Stream 3] [Stream 1] [Stream 2]
891
 *
892
 */
893
typedef struct quic_stream_iter_st {
894
    QUIC_STREAM_MAP *qsm;
895
    QUIC_STREAM *first_stream, *stream;
896
} QUIC_STREAM_ITER;
897
898
/*
899
 * Initialise an iterator, advancing the RR algorithm as necessary (if
900
 * advance_rr is 1). After calling this, it->stream will be the first stream in
901
 * the iteration sequence, or NULL if there are no active streams.
902
 */
903
void ossl_quic_stream_iter_init(QUIC_STREAM_ITER *it, QUIC_STREAM_MAP *qsm,
904
    int advance_rr);
905
906
/*
907
 * Advances to next stream in iteration sequence. You do not need to call this
908
 * immediately after calling ossl_quic_stream_iter_init(). If the end of the
909
 * list is reached, it->stream will be NULL after calling this.
910
 */
911
void ossl_quic_stream_iter_next(QUIC_STREAM_ITER *it);
912
913
#endif
914
915
#endif