mirror of
https://github.com/openssl/openssl.git
synced 2024-12-03 05:41:46 +08:00
40c835dac7
Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Neil Horman <nhorman@openssl.org> (Merged from https://github.com/openssl/openssl/pull/22037)
136 lines
4.5 KiB
C
136 lines
4.5 KiB
C
/*
|
|
* Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
|
|
*
|
|
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
|
* this file except in compliance with the License. You can obtain a copy
|
|
* in the file LICENSE in the source distribution or at
|
|
* https://www.openssl.org/source/license.html
|
|
*/
|
|
|
|
#ifndef OSSL_QUIC_TXPIM_H
|
|
# define OSSL_QUIC_TXPIM_H
|
|
|
|
# include <openssl/ssl.h>
|
|
# include "internal/quic_types.h"
|
|
# include "internal/quic_predef.h"
|
|
# include "internal/quic_cfq.h"
|
|
# include "internal/quic_ackm.h"
|
|
|
|
# ifndef OPENSSL_NO_QUIC
|
|
|
|
/*
|
|
* QUIC Transmitted Packet Information Manager
|
|
* ===========================================
|
|
*/
|
|
|
|
typedef struct quic_txpim_pkt_st {
|
|
/* ACKM-specific data. Caller should fill this. */
|
|
OSSL_ACKM_TX_PKT ackm_pkt;
|
|
|
|
/* Linked list of CFQ items in this packet. */
|
|
QUIC_CFQ_ITEM *retx_head;
|
|
|
|
/* Reserved for FIFD use. */
|
|
QUIC_FIFD *fifd;
|
|
|
|
/* QUIC_PKT_TYPE value. For diagnostic use only. */
|
|
unsigned char pkt_type;
|
|
|
|
/* Regenerate-strategy frames. */
|
|
unsigned int had_handshake_done_frame : 1;
|
|
unsigned int had_max_data_frame : 1;
|
|
unsigned int had_max_streams_bidi_frame : 1;
|
|
unsigned int had_max_streams_uni_frame : 1;
|
|
unsigned int had_ack_frame : 1;
|
|
unsigned int had_conn_close : 1;
|
|
|
|
/* Private data follows. */
|
|
} QUIC_TXPIM_PKT;
|
|
|
|
/* Represents a range of bytes in an application or CRYPTO stream. */
|
|
typedef struct quic_txpim_chunk_st {
|
|
/* The stream ID, or UINT64_MAX for the CRYPTO stream. */
|
|
uint64_t stream_id;
|
|
/*
|
|
* The inclusive range of bytes in the stream. Exceptionally, if end <
|
|
* start, designates a frame of zero length (used for FIN-only frames). In
|
|
* this case end is the number of the final byte (i.e., one less than the
|
|
* final size of the stream).
|
|
*/
|
|
uint64_t start, end;
|
|
/*
|
|
* Whether a FIN was sent for this stream in the packet. Not valid for
|
|
* CRYPTO stream.
|
|
*/
|
|
unsigned int has_fin : 1;
|
|
/*
|
|
* If set, a STOP_SENDING frame was sent for this stream ID. (If no data was
|
|
* sent for the stream, set end < start.)
|
|
*/
|
|
unsigned int has_stop_sending : 1;
|
|
/*
|
|
* If set, a RESET_STREAM frame was sent for this stream ID. (If no data was
|
|
* sent for the stream, set end < start.)
|
|
*/
|
|
unsigned int has_reset_stream : 1;
|
|
} QUIC_TXPIM_CHUNK;
|
|
|
|
QUIC_TXPIM *ossl_quic_txpim_new(void);
|
|
|
|
/*
|
|
* Frees the TXPIM. All QUIC_TXPIM_PKTs which have been handed out by the TXPIM
|
|
* must be released via a call to ossl_quic_txpim_pkt_release() before calling
|
|
* this function.
|
|
*/
|
|
void ossl_quic_txpim_free(QUIC_TXPIM *txpim);
|
|
|
|
/*
|
|
* Allocates a new QUIC_TXPIM_PKT structure from the pool. Returns NULL on
|
|
* failure. The returned structure is cleared of all data and is in a fresh
|
|
* initial state.
|
|
*/
|
|
QUIC_TXPIM_PKT *ossl_quic_txpim_pkt_alloc(QUIC_TXPIM *txpim);
|
|
|
|
/*
|
|
* Releases the TXPIM packet, returning it to the pool.
|
|
*/
|
|
void ossl_quic_txpim_pkt_release(QUIC_TXPIM *txpim, QUIC_TXPIM_PKT *fpkt);
|
|
|
|
/* Clears the chunk list of the packet, removing all entries. */
|
|
void ossl_quic_txpim_pkt_clear_chunks(QUIC_TXPIM_PKT *fpkt);
|
|
|
|
/* Appends a chunk to the packet. The structure is copied. */
|
|
int ossl_quic_txpim_pkt_append_chunk(QUIC_TXPIM_PKT *fpkt,
|
|
const QUIC_TXPIM_CHUNK *chunk);
|
|
|
|
/* Adds a CFQ item to the packet by prepending it to the retx_head list. */
|
|
void ossl_quic_txpim_pkt_add_cfq_item(QUIC_TXPIM_PKT *fpkt,
|
|
QUIC_CFQ_ITEM *item);
|
|
|
|
/*
|
|
* Returns a pointer to an array of stream chunk information structures for the
|
|
* given packet. The caller must call ossl_quic_txpim_pkt_get_num_chunks() to
|
|
* determine the length of this array. The returned pointer is invalidated
|
|
* if the chunk list is mutated, for example via a call to
|
|
* ossl_quic_txpim_pkt_append_chunk() or ossl_quic_txpim_pkt_clear_chunks().
|
|
*
|
|
* The chunks are sorted by (stream_id, start) in ascending order.
|
|
*/
|
|
const QUIC_TXPIM_CHUNK *ossl_quic_txpim_pkt_get_chunks(const QUIC_TXPIM_PKT *fpkt);
|
|
|
|
/*
|
|
* Returns the number of entries in the array returned by
|
|
* ossl_quic_txpim_pkt_get_chunks().
|
|
*/
|
|
size_t ossl_quic_txpim_pkt_get_num_chunks(const QUIC_TXPIM_PKT *fpkt);
|
|
|
|
/*
|
|
* Returns the number of QUIC_TXPIM_PKTs allocated by the given TXPIM that have
|
|
* yet to be returned to the TXPIM.
|
|
*/
|
|
size_t ossl_quic_txpim_get_in_use(const QUIC_TXPIM *txpim);
|
|
|
|
# endif
|
|
|
|
#endif
|