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