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