Home | History | Annotate | Line # | Download | only in internal
      1 /*
      2  * Copyright 2022-2026 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 #define QUIC_SSTREAM_STATE_NONE 0 /* --- sstream == NULL  */
     52 #define QUIC_SSTREAM_STATE_READY 1 /* \                    */
     53 #define QUIC_SSTREAM_STATE_SEND 2 /* |-- sstream != NULL  */
     54 #define QUIC_SSTREAM_STATE_DATA_SENT 3 /* /                    */
     55 #define QUIC_SSTREAM_STATE_DATA_RECVD 4 /* \                    */
     56 #define QUIC_SSTREAM_STATE_RESET_SENT 5 /* |-- sstream == NULL  */
     57 #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 #define QUIC_RSTREAM_STATE_NONE 0 /* --- rstream == NULL  */
     73 #define QUIC_RSTREAM_STATE_RECV 1 /* \                    */
     74 #define QUIC_RSTREAM_STATE_SIZE_KNOWN 2 /* |-- rstream != NULL  */
     75 #define QUIC_RSTREAM_STATE_DATA_RECVD 3 /* /                    */
     76 #define QUIC_RSTREAM_STATE_DATA_READ 4 /* \                    */
     77 #define QUIC_RSTREAM_STATE_RESET_RECVD 5 /* |-- rstream == NULL  */
     78 #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 #define QUIC_STREAM_INITIATOR_CLIENT 0
    321 #define QUIC_STREAM_INITIATOR_SERVER 1
    322 #define QUIC_STREAM_INITIATOR_MASK 1
    323 
    324 #define QUIC_STREAM_DIR_BIDI 0
    325 #define QUIC_STREAM_DIR_UNI 2
    326 #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 {
    336     return (s->type & QUIC_STREAM_INITIATOR_MASK) == QUIC_STREAM_INITIATOR_SERVER;
    337 }
    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 {
    344     return (s->type & QUIC_STREAM_DIR_MASK) == QUIC_STREAM_DIR_BIDI;
    345 }
    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 {
    350     return ossl_quic_stream_is_server_init(s) == s->as_server;
    351 }
    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 {
    362     return s->send_state != QUIC_SSTREAM_STATE_NONE;
    363 }
    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 {
    375     return s->recv_state != QUIC_RSTREAM_STATE_NONE;
    376 }
    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 {
    397     switch (s->send_state) {
    398     case QUIC_SSTREAM_STATE_READY:
    399     case QUIC_SSTREAM_STATE_SEND:
    400     case QUIC_SSTREAM_STATE_DATA_SENT:
    401         return 1;
    402     default:
    403         return 0;
    404     }
    405 }
    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 {
    413     return s->send_state == QUIC_SSTREAM_STATE_RESET_SENT
    414         || s->send_state == QUIC_SSTREAM_STATE_RESET_RECVD;
    415 }
    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 {
    430     switch (s->recv_state) {
    431     case QUIC_RSTREAM_STATE_RECV:
    432     case QUIC_RSTREAM_STATE_SIZE_KNOWN:
    433     case QUIC_RSTREAM_STATE_DATA_RECVD:
    434         return 1;
    435     default:
    436         return 0;
    437     }
    438 }
    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 {
    446     return s->recv_state == QUIC_RSTREAM_STATE_RESET_RECVD
    447         || s->recv_state == QUIC_RSTREAM_STATE_RESET_READ;
    448 }
    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 {
    459     switch (s->send_state) {
    460     default:
    461     case QUIC_SSTREAM_STATE_NONE:
    462         return 0;
    463     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         return ossl_quic_sstream_get_final_size(s->sstream, final_size);
    470     case QUIC_SSTREAM_STATE_DATA_SENT:
    471     case QUIC_SSTREAM_STATE_DATA_RECVD:
    472     case QUIC_SSTREAM_STATE_RESET_SENT:
    473     case QUIC_SSTREAM_STATE_RESET_RECVD:
    474         if (final_size != NULL)
    475             *final_size = s->send_final_size;
    476         return 1;
    477     }
    478 }
    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 {
    489     switch (s->recv_state) {
    490     default:
    491         assert(0);
    492     case QUIC_RSTREAM_STATE_NONE:
    493     case QUIC_RSTREAM_STATE_RECV:
    494         return 0;
    495 
    496     case QUIC_RSTREAM_STATE_SIZE_KNOWN:
    497     case QUIC_RSTREAM_STATE_DATA_RECVD:
    498     case QUIC_RSTREAM_STATE_DATA_READ:
    499     case QUIC_RSTREAM_STATE_RESET_RECVD:
    500     case QUIC_RSTREAM_STATE_RESET_READ:
    501         if (!ossl_assert(ossl_quic_rxfc_get_final_size(&s->rxfc, final_size)))
    502             return 0;
    503 
    504         return 1;
    505     }
    506 }
    507 
    508 /*
    509  * Determines the number of bytes available still to be read, and (if
    510  * include_fin is 1) whether a FIN or reset has yet to be read.
    511  */
    512 static ossl_inline ossl_unused int ossl_quic_stream_recv_pending(const QUIC_STREAM *s,
    513     int include_fin)
    514 {
    515     size_t avail;
    516     int fin = 0;
    517 
    518     switch (s->recv_state) {
    519     default:
    520         assert(0);
    521     case QUIC_RSTREAM_STATE_NONE:
    522         return 0;
    523 
    524     case QUIC_RSTREAM_STATE_RECV:
    525     case QUIC_RSTREAM_STATE_SIZE_KNOWN:
    526     case QUIC_RSTREAM_STATE_DATA_RECVD:
    527         if (!ossl_quic_rstream_available(s->rstream, &avail, &fin))
    528             avail = 0;
    529 
    530         if (avail == 0 && include_fin && fin)
    531             avail = 1;
    532 
    533         return avail;
    534 
    535     case QUIC_RSTREAM_STATE_RESET_RECVD:
    536         return include_fin;
    537 
    538     case QUIC_RSTREAM_STATE_DATA_READ:
    539     case QUIC_RSTREAM_STATE_RESET_READ:
    540         return 0;
    541     }
    542 }
    543 
    544 /*
    545  * QUIC Stream Map
    546  * ===============
    547  *
    548  * The QUIC stream map:
    549  *
    550  *   - maps stream IDs to QUIC_STREAM objects;
    551  *   - tracks which streams are 'active' (currently have data for transmission);
    552  *   - allows iteration over the active streams only.
    553  *
    554  */
    555 struct quic_stream_map_st {
    556     LHASH_OF(QUIC_STREAM) *map;
    557     QUIC_STREAM_LIST_NODE active_list;
    558     QUIC_STREAM_LIST_NODE accept_list;
    559     QUIC_STREAM_LIST_NODE ready_for_gc_list;
    560     size_t rr_stepping, rr_counter;
    561     size_t num_accept_bidi, num_accept_uni, num_shutdown_flush;
    562     QUIC_STREAM *rr_cur;
    563     uint64_t (*get_stream_limit_cb)(int uni, void *arg);
    564     void *get_stream_limit_cb_arg;
    565     QUIC_RXFC *max_streams_bidi_rxfc;
    566     QUIC_RXFC *max_streams_uni_rxfc;
    567     int is_server;
    568 };
    569 
    570 /*
    571  * get_stream_limit is a callback which is called to retrieve the current stream
    572  * limit for streams created by us. This mechanism is not used for
    573  * peer-initiated streams. If a stream's stream ID is x, a stream is allowed if
    574  * (x >> 2) < returned limit value; i.e., the returned value is exclusive.
    575  *
    576  * If uni is 1, get the limit for locally-initiated unidirectional streams, else
    577  * get the limit for locally-initiated bidirectional streams.
    578  *
    579  * If the callback is NULL, stream limiting is not applied.
    580  * Stream limiting is used to determine if frames can currently be produced for
    581  * a stream.
    582  */
    583 int ossl_quic_stream_map_init(QUIC_STREAM_MAP *qsm,
    584     uint64_t (*get_stream_limit_cb)(int uni, void *arg),
    585     void *get_stream_limit_cb_arg,
    586     QUIC_RXFC *max_streams_bidi_rxfc,
    587     QUIC_RXFC *max_streams_uni_rxfc,
    588     int is_server);
    589 
    590 /*
    591  * Any streams still in the map will be released as though
    592  * ossl_quic_stream_map_release was called on them.
    593  */
    594 void ossl_quic_stream_map_cleanup(QUIC_STREAM_MAP *qsm);
    595 
    596 /*
    597  * Allocate a new stream. type is a combination of one QUIC_STREAM_INITIATOR_*
    598  * value and one QUIC_STREAM_DIR_* value. Note that clients can e.g. allocate
    599  * server-initiated streams as they will need to allocate a QUIC_STREAM
    600  * structure to track any stream created by the server, etc.
    601  *
    602  * stream_id must be a valid value. Returns NULL if a stream already exists
    603  * with the given ID.
    604  */
    605 QUIC_STREAM *ossl_quic_stream_map_alloc(QUIC_STREAM_MAP *qsm,
    606     uint64_t stream_id,
    607     int type);
    608 
    609 /*
    610  * Releases a stream object. Note that this must only be done once the teardown
    611  * process is entirely complete and the object will never be referenced again.
    612  */
    613 void ossl_quic_stream_map_release(QUIC_STREAM_MAP *qsm, QUIC_STREAM *stream);
    614 
    615 /*
    616  * Calls visit_cb() for each stream in the map. visit_cb_arg is an opaque
    617  * argument which is passed through.
    618  */
    619 void ossl_quic_stream_map_visit(QUIC_STREAM_MAP *qsm,
    620     void (*visit_cb)(QUIC_STREAM *stream, void *arg),
    621     void *visit_cb_arg);
    622 
    623 /*
    624  * Retrieves a stream by stream ID. Returns NULL if it does not exist.
    625  */
    626 QUIC_STREAM *ossl_quic_stream_map_get_by_id(QUIC_STREAM_MAP *qsm,
    627     uint64_t stream_id);
    628 
    629 /*
    630  * Marks the given stream as active or inactive based on its state. Idempotent.
    631  *
    632  * When a stream is marked active, it becomes available in the iteration list,
    633  * and when a stream is marked inactive, it no longer appears in the iteration
    634  * list.
    635  *
    636  * Calling this function invalidates any iterator currently pointing at the
    637  * given stream object, but iterators not currently pointing at the given stream
    638  * object are not invalidated.
    639  */
    640 void ossl_quic_stream_map_update_state(QUIC_STREAM_MAP *qsm, QUIC_STREAM *s);
    641 
    642 /*
    643  * Sets the RR stepping value, n. The RR rotation will be advanced every n
    644  * packets. The default value is 1.
    645  */
    646 void ossl_quic_stream_map_set_rr_stepping(QUIC_STREAM_MAP *qsm, size_t stepping);
    647 
    648 /*
    649  * Returns 1 if the stream ordinal given is allowed by the current stream count
    650  * flow control limit, assuming a locally initiated stream of a type described
    651  * by is_uni.
    652  *
    653  * Note that stream_ordinal is a stream ordinal, not a stream ID.
    654  */
    655 int ossl_quic_stream_map_is_local_allowed_by_stream_limit(QUIC_STREAM_MAP *qsm,
    656     uint64_t stream_ordinal,
    657     int is_uni);
    658 
    659 /*
    660  * Stream Send Part
    661  * ================
    662  */
    663 
    664 /*
    665  * Ensures that the sending part has transitioned out of the READY state (i.e.,
    666  * to SEND, or a subsequent state). This function is named as it is because,
    667  * while on paper the distinction between READY and SEND is whether we have
    668  * started transmitting application data, in practice the meaningful distinction
    669  * between the two states is whether we have allocated a stream ID to the stream
    670  * or not. QUIC permits us to defer stream ID allocation until first STREAM (or
    671  * STREAM_DATA_BLOCKED) frame transmission for locally-initiated streams.
    672  *
    673  * Our implementation does not currently do this and we allocate stream IDs up
    674  * front, however we may revisit this in the future. Calling this represents a
    675  * demand for a stream ID by the caller and ensures one has been allocated to
    676  * the stream, and causes us to transition to SEND if we are still in the READY
    677  * state.
    678  *
    679  * Returns 0 if there is no send part (caller error) and 1 otherwise.
    680  */
    681 int ossl_quic_stream_map_ensure_send_part_id(QUIC_STREAM_MAP *qsm,
    682     QUIC_STREAM *qs);
    683 
    684 /*
    685  * Transitions from SEND to the DATA_SENT state. Note that this is NOT the same
    686  * as the point in time at which the final size of the stream becomes known
    687  * (i.e., the time at which ossl_quic_sstream_fin()) is called as it occurs when
    688  * we have SENT all data on a given stream send part, not merely buffered it.
    689  * Note that this transition is NOT reversed in the event of some of that data
    690  * being lost.
    691  *
    692  * Returns 1 if the state transition was successfully taken. Returns 0 if there
    693  * is no send part (caller error) or if the state transition cannot be taken
    694  * because the send part is not in the SEND state.
    695  */
    696 int ossl_quic_stream_map_notify_all_data_sent(QUIC_STREAM_MAP *qsm,
    697     QUIC_STREAM *qs);
    698 
    699 /*
    700  * Transitions from the DATA_SENT to DATA_RECVD state; should be called
    701  * when all transmitted stream data is ACKed by the peer.
    702  *
    703  * Returns 1 if the state transition was successfully taken. Returns 0 if there
    704  * is no send part (caller error) or the state transition cannot be taken
    705  * because the send part is not in the DATA_SENT state. Because
    706  * ossl_quic_stream_map_notify_all_data_sent() should always be called prior to
    707  * this function, the send state must already be in DATA_SENT in order for this
    708  * function to succeed.
    709  */
    710 int ossl_quic_stream_map_notify_totally_acked(QUIC_STREAM_MAP *qsm,
    711     QUIC_STREAM *qs);
    712 
    713 /*
    714  * Resets the sending part of a stream. This is a transition from the READY,
    715  * SEND or DATA_SENT send stream states to the RESET_SENT state.
    716  *
    717  * This function returns 1 if the transition is taken (i.e., if the send stream
    718  * part was in one of the states above), or if it is already in the RESET_SENT
    719  * state (idempotent operation), or if it has reached the RESET_RECVD state.
    720  *
    721  * It returns 0 if in the DATA_RECVD state, as a send stream cannot be reset
    722  * in this state. It also returns 0 if there is no send part (caller error).
    723  */
    724 int ossl_quic_stream_map_reset_stream_send_part(QUIC_STREAM_MAP *qsm,
    725     QUIC_STREAM *qs,
    726     uint64_t aec);
    727 
    728 /*
    729  * Transitions from the RESET_SENT to the RESET_RECVD state. This should be
    730  * called when a sent RESET_STREAM frame has been acknowledged by the peer.
    731  *
    732  * This function returns 1 if the transition is taken (i.e., if the send stream
    733  * part was in one of the states above) or if it is already in the RESET_RECVD
    734  * state (idempotent operation).
    735  *
    736  * It returns 0 if not in the RESET_SENT or RESET_RECVD states, as this function
    737  * should only be called after we have already sent a RESET_STREAM frame and
    738  * entered the RESET_SENT state. It also returns 0 if there is no send part
    739  * (caller error).
    740  */
    741 int ossl_quic_stream_map_notify_reset_stream_acked(QUIC_STREAM_MAP *qsm,
    742     QUIC_STREAM *qs);
    743 
    744 /*
    745  * Stream Receive Part
    746  * ===================
    747  */
    748 
    749 /*
    750  * Transitions from the RECV receive stream state to the SIZE_KNOWN state. This
    751  * should be called once a STREAM frame is received for the stream with the FIN
    752  * bit set. final_size should be the final size of the stream in bytes.
    753  *
    754  * Returns 1 if the transition was taken.
    755  */
    756 int ossl_quic_stream_map_notify_size_known_recv_part(QUIC_STREAM_MAP *qsm,
    757     QUIC_STREAM *qs,
    758     uint64_t final_size);
    759 
    760 /*
    761  * Transitions from the SIZE_KNOWN receive stream state to the DATA_RECVD state.
    762  * This should be called once all data for a receive stream is received.
    763  *
    764  * Returns 1 if the transition was taken.
    765  */
    766 int ossl_quic_stream_map_notify_totally_received(QUIC_STREAM_MAP *qsm,
    767     QUIC_STREAM *qs);
    768 
    769 /*
    770  * Transitions from the DATA_RECVD receive stream state to the DATA_READ state.
    771  * This should be called once all data for a receive stream is read by the
    772  * application.
    773  *
    774  * Returns 1 if the transition was taken.
    775  */
    776 int ossl_quic_stream_map_notify_totally_read(QUIC_STREAM_MAP *qsm,
    777     QUIC_STREAM *qs);
    778 
    779 /*
    780  * Transitions from the RECV, SIZE_KNOWN or DATA_RECVD receive stream state to
    781  * the RESET_RECVD state. This should be called on RESET_STREAM.
    782  *
    783  * Returns 1 if the transition was taken.
    784  */
    785 int ossl_quic_stream_map_notify_reset_recv_part(QUIC_STREAM_MAP *qsm,
    786     QUIC_STREAM *qs,
    787     uint64_t app_error_code,
    788     uint64_t final_size);
    789 
    790 /*
    791  * Transitions from the RESET_RECVD receive stream state to the RESET_READ
    792  * receive stream state. This should be called when the application is notified
    793  * of a stream reset.
    794  */
    795 int ossl_quic_stream_map_notify_app_read_reset_recv_part(QUIC_STREAM_MAP *qsm,
    796     QUIC_STREAM *qs);
    797 
    798 /*
    799  * Marks the receiving part of a stream for STOP_SENDING. This is orthogonal to
    800  * receive stream state as it does not affect it directly.
    801  *
    802  * Returns 1 if the receiving part of a stream was not already marked for
    803  * STOP_SENDING.
    804  * Returns 0 otherwise, which need not be considered an error.
    805  */
    806 int ossl_quic_stream_map_stop_sending_recv_part(QUIC_STREAM_MAP *qsm,
    807     QUIC_STREAM *qs,
    808     uint64_t aec);
    809 
    810 /*
    811  * Marks the stream as wanting a STOP_SENDING frame transmitted. It is not valid
    812  * to call this if ossl_quic_stream_map_stop_sending_recv_part() has not been
    813  * called. For TXP use.
    814  */
    815 int ossl_quic_stream_map_schedule_stop_sending(QUIC_STREAM_MAP *qsm,
    816     QUIC_STREAM *qs);
    817 
    818 /*
    819  * Accept Queue Management
    820  * =======================
    821  */
    822 
    823 /*
    824  * Adds a stream to the accept queue.
    825  */
    826 void ossl_quic_stream_map_push_accept_queue(QUIC_STREAM_MAP *qsm,
    827     QUIC_STREAM *s);
    828 
    829 /*
    830  * Returns the next item to be popped from the accept queue, or NULL if it is
    831  * empty.
    832  */
    833 QUIC_STREAM *ossl_quic_stream_map_peek_accept_queue(QUIC_STREAM_MAP *qsm);
    834 
    835 /*
    836  * Removes a stream from the accept queue. rtt is the estimated connection RTT.
    837  * The stream is retired for the purposes of MAX_STREAMS RXFC.
    838  *
    839  * Precondition: s is in the accept queue.
    840  */
    841 void ossl_quic_stream_map_remove_from_accept_queue(QUIC_STREAM_MAP *qsm,
    842     QUIC_STREAM *s,
    843     OSSL_TIME rtt);
    844 
    845 /* Returns the length of the accept queue for the given stream type. */
    846 size_t ossl_quic_stream_map_get_accept_queue_len(QUIC_STREAM_MAP *qsm, int is_uni);
    847 
    848 /* Returns the total length of the accept queues for all stream types. */
    849 size_t ossl_quic_stream_map_get_total_accept_queue_len(QUIC_STREAM_MAP *qsm);
    850 
    851 /*
    852  * Shutdown Flush and GC
    853  * =====================
    854  */
    855 
    856 /*
    857  * Delete streams ready for GC. Pointers to those QUIC_STREAM objects become
    858  * invalid.
    859  */
    860 void ossl_quic_stream_map_gc(QUIC_STREAM_MAP *qsm);
    861 
    862 /*
    863  * Begins shutdown stream flush triage. Analyses all streams, including deleted
    864  * but not yet GC'd streams, to determine if we should wait for that stream to
    865  * be fully flushed before shutdown. After calling this, call
    866  * ossl_quic_stream_map_is_shutdown_flush_finished() to determine if all
    867  * shutdown flush eligible streams have been flushed.
    868  */
    869 void ossl_quic_stream_map_begin_shutdown_flush(QUIC_STREAM_MAP *qsm);
    870 
    871 /*
    872  * Returns 1 if all shutdown flush eligible streams have finished flushing,
    873  * or if ossl_quic_stream_map_begin_shutdown_flush() has not been called.
    874  */
    875 int ossl_quic_stream_map_is_shutdown_flush_finished(QUIC_STREAM_MAP *qsm);
    876 
    877 /*
    878  * QUIC Stream Iterator
    879  * ====================
    880  *
    881  * Allows the current set of active streams to be walked using a RR-based
    882  * algorithm. Each time ossl_quic_stream_iter_init is called, the RR algorithm
    883  * is stepped. The RR algorithm rotates the iteration order such that the next
    884  * active stream is returned first after n calls to ossl_quic_stream_iter_init,
    885  * where n is the stepping value configured via
    886  * ossl_quic_stream_map_set_rr_stepping.
    887  *
    888  * Suppose there are three active streams and the configured stepping is n:
    889  *
    890  *   Iteration 0n:  [Stream 1] [Stream 2] [Stream 3]
    891  *   Iteration 1n:  [Stream 2] [Stream 3] [Stream 1]
    892  *   Iteration 2n:  [Stream 3] [Stream 1] [Stream 2]
    893  *
    894  */
    895 typedef struct quic_stream_iter_st {
    896     QUIC_STREAM_MAP *qsm;
    897     QUIC_STREAM *first_stream, *stream;
    898 } QUIC_STREAM_ITER;
    899 
    900 /*
    901  * Initialise an iterator, advancing the RR algorithm as necessary (if
    902  * advance_rr is 1). After calling this, it->stream will be the first stream in
    903  * the iteration sequence, or NULL if there are no active streams.
    904  */
    905 void ossl_quic_stream_iter_init(QUIC_STREAM_ITER *it, QUIC_STREAM_MAP *qsm,
    906     int advance_rr);
    907 
    908 /*
    909  * Advances to next stream in iteration sequence. You do not need to call this
    910  * immediately after calling ossl_quic_stream_iter_init(). If the end of the
    911  * list is reached, it->stream will be NULL after calling this.
    912  */
    913 void ossl_quic_stream_iter_next(QUIC_STREAM_ITER *it);
    914 
    915 #endif
    916 
    917 #endif
    918