xref: /freebsd/crypto/openssl/include/internal/quic_strm_reas.h (revision f9bc005b8ef3b507a5ecbc2d7fe4411ef70eff38)
1*f9bc005bSEnji Cooper /*
2*f9bc005bSEnji Cooper  * Copyright 2022-2026 The OpenSSL Project Authors. All Rights Reserved.
3*f9bc005bSEnji Cooper  *
4*f9bc005bSEnji Cooper  * Licensed under the Apache License 2.0 (the "License").  You may not use
5*f9bc005bSEnji Cooper  * this file except in compliance with the License.  You can obtain a copy
6*f9bc005bSEnji Cooper  * in the file LICENSE in the source distribution or at
7*f9bc005bSEnji Cooper  * https://www.openssl.org/source/license.html
8*f9bc005bSEnji Cooper  */
9*f9bc005bSEnji Cooper 
10*f9bc005bSEnji Cooper #ifndef OSSL_QUIC_STRM_REAS_H
11*f9bc005bSEnji Cooper #define OSSL_QUIC_STRM_REAS_H
12*f9bc005bSEnji Cooper 
13*f9bc005bSEnji Cooper #include "internal/common.h"
14*f9bc005bSEnji Cooper #include "internal/uint_set.h"
15*f9bc005bSEnji Cooper #include "internal/quic_record_rx.h"
16*f9bc005bSEnji Cooper 
17*f9bc005bSEnji Cooper #ifndef OPENSSL_NO_QUIC
18*f9bc005bSEnji Cooper #include "internal/ossl_rbtree.h"
19*f9bc005bSEnji Cooper 
20*f9bc005bSEnji Cooper typedef struct sframe_set_t {
21*f9bc005bSEnji Cooper     OSSL_RBT_HEAD(srange, sframe_set_t)
22*f9bc005bSEnji Cooper     ranges;
23*f9bc005bSEnji Cooper     /* Is the tail frame final. */
24*f9bc005bSEnji Cooper     unsigned int fin;
25*f9bc005bSEnji Cooper     uint64_t fin_off;
26*f9bc005bSEnji Cooper     /* Number of stream frames in the list. */
27*f9bc005bSEnji Cooper     size_t stream_ranges;
28*f9bc005bSEnji Cooper     size_t stream_chunks;
29*f9bc005bSEnji Cooper     /* Offset of data not yet dropped */
30*f9bc005bSEnji Cooper     uint64_t offset;
31*f9bc005bSEnji Cooper     /* Cleanse data on release? */
32*f9bc005bSEnji Cooper     int cleanse;
33*f9bc005bSEnji Cooper     int move_buffers;
34*f9bc005bSEnji Cooper     QUIC_RSTREAM_QPARM *rsqp;
35*f9bc005bSEnji Cooper } SFRAME_SET;
36*f9bc005bSEnji Cooper 
37*f9bc005bSEnji Cooper /*
38*f9bc005bSEnji Cooper  * Initializes the stream frame list fs.
39*f9bc005bSEnji Cooper  */
40*f9bc005bSEnji Cooper void ossl_sframe_set_init(SFRAME_SET *fs, QUIC_RSTREAM_QPARM *rsqp);
41*f9bc005bSEnji Cooper 
42*f9bc005bSEnji Cooper /*
43*f9bc005bSEnji Cooper  * Destroys the stream frame list fs releasing any data
44*f9bc005bSEnji Cooper  * still present inside it.
45*f9bc005bSEnji Cooper  */
46*f9bc005bSEnji Cooper void ossl_sframe_set_destroy_ranges(SFRAME_SET *fs);
47*f9bc005bSEnji Cooper 
48*f9bc005bSEnji Cooper /*
49*f9bc005bSEnji Cooper  * Insert a stream frame data into the list.
50*f9bc005bSEnji Cooper  * The data covers an offset range (range.start is inclusive,
51*f9bc005bSEnji Cooper  * range.end is exclusive).
52*f9bc005bSEnji Cooper  * fin should be set if this is the final frame of the stream.
53*f9bc005bSEnji Cooper  * Returns an error if a frame cannot be inserted - due to
54*f9bc005bSEnji Cooper  * STREAM_FRAME allocation error, or in case of erroneous
55*f9bc005bSEnji Cooper  * fin flag.
56*f9bc005bSEnji Cooper  */
57*f9bc005bSEnji Cooper int ossl_sframe_set_insert(SFRAME_SET *fs, UINT_RANGE *range,
58*f9bc005bSEnji Cooper     OSSL_QRX_PKT *pkt,
59*f9bc005bSEnji Cooper     const unsigned char *data, int fin);
60*f9bc005bSEnji Cooper 
61*f9bc005bSEnji Cooper /*
62*f9bc005bSEnji Cooper  * Iterator to peek at the contiguous frames at the beginning
63*f9bc005bSEnji Cooper  * of the frame set (the first stream range).
64*f9bc005bSEnji Cooper  * The *data covers an offset range (range.start is inclusive,
65*f9bc005bSEnji Cooper  * range.end is exclusive).
66*f9bc005bSEnji Cooper  * *fin is set if this is the final frame of the stream.
67*f9bc005bSEnji Cooper  * Opaque iterator *iter can be used to peek at the subsequent
68*f9bc005bSEnji Cooper  * frame if there is any without any gap before it.
69*f9bc005bSEnji Cooper  * Returns 1 on success.
70*f9bc005bSEnji Cooper  * Returns 0 if there is no further contiguous frame. In that
71*f9bc005bSEnji Cooper  * case *fin is set, if the end of the stream is reached.
72*f9bc005bSEnji Cooper  */
73*f9bc005bSEnji Cooper int ossl_sframe_set_peek(SFRAME_SET *fs, void **iter,
74*f9bc005bSEnji Cooper     UINT_RANGE *range, const unsigned char **data,
75*f9bc005bSEnji Cooper     int *fin);
76*f9bc005bSEnji Cooper 
77*f9bc005bSEnji Cooper /*
78*f9bc005bSEnji Cooper  * moves reading offset to new position, discarding all consumed
79*f9bc005bSEnji Cooper  * chunks (which end offset is less than offset).
80*f9bc005bSEnji Cooper  */
81*f9bc005bSEnji Cooper int ossl_sframe_set_move_offset(SFRAME_SET *fs, uint64_t offset);
82*f9bc005bSEnji Cooper 
83*f9bc005bSEnji Cooper /*
84*f9bc005bSEnji Cooper  * returns how many bytes is available to read from stream.
85*f9bc005bSEnji Cooper  */
86*f9bc005bSEnji Cooper int ossl_sframe_set_avail(SFRAME_SET *fs, uint64_t *avail, int *fin);
87*f9bc005bSEnji Cooper 
88*f9bc005bSEnji Cooper #endif
89*f9bc005bSEnji Cooper 
90*f9bc005bSEnji Cooper #endif
91