VirtualBox

source: vbox/trunk/src/libs/openssl-3.3.2/include/internal/quic_txp.h@ 108403

最後變更 在這個檔案從108403是 108206,由 vboxsync 提交於 5 週 前

openssl-3.3.2: Exported all files to OSE and removed .scm-settings ​bugref:10757

  • 屬性 svn:eol-style 設為 native
  • 屬性 svn:keywords 設為 Author Date Id Revision
檔案大小: 9.4 KB
 
1/*
2 * Copyright 2022-2024 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_QUIC_TXP_H
11# define OSSL_QUIC_TXP_H
12
13# include <openssl/ssl.h>
14# include "internal/quic_types.h"
15# include "internal/quic_predef.h"
16# include "internal/quic_record_tx.h"
17# include "internal/quic_cfq.h"
18# include "internal/quic_txpim.h"
19# include "internal/quic_stream.h"
20# include "internal/quic_stream_map.h"
21# include "internal/quic_fc.h"
22# include "internal/bio_addr.h"
23# include "internal/time.h"
24# include "internal/qlog.h"
25
26# ifndef OPENSSL_NO_QUIC
27
28/*
29 * QUIC TX Packetiser
30 * ==================
31 */
32typedef struct ossl_quic_tx_packetiser_args_st {
33 /* Configuration Settings */
34 QUIC_CONN_ID cur_scid; /* Current Source Connection ID we use. */
35 QUIC_CONN_ID cur_dcid; /* Current Destination Connection ID we use. */
36 BIO_ADDR peer; /* Current destination L4 address we use. */
37 uint32_t ack_delay_exponent; /* ACK delay exponent used when encoding. */
38
39 /* Injected Dependencies */
40 OSSL_QTX *qtx; /* QUIC Record Layer TX we are using */
41 QUIC_TXPIM *txpim; /* QUIC TX'd Packet Information Manager */
42 QUIC_CFQ *cfq; /* QUIC Control Frame Queue */
43 OSSL_ACKM *ackm; /* QUIC Acknowledgement Manager */
44 QUIC_STREAM_MAP *qsm; /* QUIC Streams Map */
45 QUIC_TXFC *conn_txfc; /* QUIC Connection-Level TX Flow Controller */
46 QUIC_RXFC *conn_rxfc; /* QUIC Connection-Level RX Flow Controller */
47 QUIC_RXFC *max_streams_bidi_rxfc; /* QUIC RXFC for MAX_STREAMS generation */
48 QUIC_RXFC *max_streams_uni_rxfc;
49 const OSSL_CC_METHOD *cc_method; /* QUIC Congestion Controller */
50 OSSL_CC_DATA *cc_data; /* QUIC Congestion Controller Instance */
51 OSSL_TIME (*now)(void *arg); /* Callback to get current time. */
52 void *now_arg;
53 QLOG *(*get_qlog_cb)(void *arg); /* Optional QLOG retrieval func */
54 void *get_qlog_cb_arg;
55
56 /*
57 * Injected dependencies - crypto streams.
58 *
59 * Note: There is no crypto stream for the 0-RTT EL.
60 * crypto[QUIC_PN_SPACE_APP] is the 1-RTT crypto stream.
61 */
62 QUIC_SSTREAM *crypto[QUIC_PN_SPACE_NUM];
63
64 } OSSL_QUIC_TX_PACKETISER_ARGS;
65
66OSSL_QUIC_TX_PACKETISER *ossl_quic_tx_packetiser_new(const OSSL_QUIC_TX_PACKETISER_ARGS *args);
67
68typedef void (ossl_quic_initial_token_free_fn)(const unsigned char *buf,
69 size_t buf_len, void *arg);
70
71void ossl_quic_tx_packetiser_free(OSSL_QUIC_TX_PACKETISER *txp);
72
73/*
74 * When in the closing state we need to maintain a count of received bytes
75 * so that we can limit the number of close connection frames we send.
76 * Refer RFC 9000 s. 10.2.1 Closing Connection State.
77 */
78void ossl_quic_tx_packetiser_record_received_closing_bytes(
79 OSSL_QUIC_TX_PACKETISER *txp, size_t n);
80
81/*
82 * Generates a datagram by polling the various ELs to determine if they want to
83 * generate any frames, and generating a datagram which coalesces packets for
84 * any ELs which do.
85 *
86 * Returns 0 on failure (e.g. allocation error or other errors), 1 otherwise.
87 *
88 * *status is filled with status information about the generated packet.
89 * It is always filled even in case of failure. In particular, packets can be
90 * sent even if failure is later returned.
91 * See QUIC_TXP_STATUS for details.
92 */
93typedef struct quic_txp_status_st {
94 int sent_ack_eliciting; /* Was an ACK-eliciting packet sent? */
95 int sent_handshake; /* Was a Handshake packet sent? */
96 size_t sent_pkt; /* Number of packets sent (0 if nothing was sent) */
97} QUIC_TXP_STATUS;
98
99int ossl_quic_tx_packetiser_generate(OSSL_QUIC_TX_PACKETISER *txp,
100 QUIC_TXP_STATUS *status);
101
102/*
103 * Returns a deadline after which a call to ossl_quic_tx_packetiser_generate()
104 * might succeed even if it did not previously. This may return
105 * ossl_time_infinite() if there is no such deadline currently applicable. It
106 * returns ossl_time_zero() if there is (potentially) more data to be generated
107 * immediately. The value returned is liable to change after any call to
108 * ossl_quic_tx_packetiser_generate() (or after ACKM or CC state changes). Note
109 * that ossl_quic_tx_packetiser_generate() can also start to succeed for other
110 * non-chronological reasons, such as changes to send stream buffers, etc.
111 */
112OSSL_TIME ossl_quic_tx_packetiser_get_deadline(OSSL_QUIC_TX_PACKETISER *txp);
113
114/*
115 * Set the token used in Initial packets. The callback is called when the buffer
116 * is no longer needed; for example, when the TXP is freed or when this function
117 * is called again with a new buffer. Fails returning 0 if the token is too big
118 * to ever be reasonably encapsulated in an outgoing packet based on our current
119 * understanding of our PMTU.
120 */
121int ossl_quic_tx_packetiser_set_initial_token(OSSL_QUIC_TX_PACKETISER *txp,
122 const unsigned char *token,
123 size_t token_len,
124 ossl_quic_initial_token_free_fn *free_cb,
125 void *free_cb_arg);
126
127/* Change the DCID the TXP uses to send outgoing packets. */
128int ossl_quic_tx_packetiser_set_cur_dcid(OSSL_QUIC_TX_PACKETISER *txp,
129 const QUIC_CONN_ID *dcid);
130
131/* Change the SCID the TXP uses to send outgoing (long) packets. */
132int ossl_quic_tx_packetiser_set_cur_scid(OSSL_QUIC_TX_PACKETISER *txp,
133 const QUIC_CONN_ID *scid);
134
135/*
136 * Change the destination L4 address the TXP uses to send datagrams. Specify
137 * NULL (or AF_UNSPEC) to disable use of addressed mode.
138 */
139int ossl_quic_tx_packetiser_set_peer(OSSL_QUIC_TX_PACKETISER *txp,
140 const BIO_ADDR *peer);
141
142/*
143 * Change the QLOG instance retrieval function in use after instantiation.
144 */
145void ossl_quic_tx_packetiser_set_qlog_cb(OSSL_QUIC_TX_PACKETISER *txp,
146 QLOG *(*get_qlog_cb)(void *arg),
147 void *get_qlog_cb_arg);
148
149/*
150 * Inform the TX packetiser that an EL has been discarded. Idempotent.
151 *
152 * This does not inform the QTX as well; the caller must also inform the QTX.
153 *
154 * The TXP will no longer reference the crypto[enc_level] QUIC_SSTREAM which was
155 * provided in the TXP arguments. However, it is the callers responsibility to
156 * free that QUIC_SSTREAM if desired.
157 */
158int ossl_quic_tx_packetiser_discard_enc_level(OSSL_QUIC_TX_PACKETISER *txp,
159 uint32_t enc_level);
160
161/*
162 * Informs the TX packetiser that the handshake is complete. The TX packetiser
163 * will not send 1-RTT application data until the handshake is complete,
164 * as the authenticity of the peer is not confirmed until the handshake
165 * complete event occurs.
166 */
167void ossl_quic_tx_packetiser_notify_handshake_complete(OSSL_QUIC_TX_PACKETISER *txp);
168
169/* Asks the TXP to generate a HANDSHAKE_DONE frame in the next 1-RTT packet. */
170void ossl_quic_tx_packetiser_schedule_handshake_done(OSSL_QUIC_TX_PACKETISER *txp);
171
172/* Asks the TXP to ensure the next packet in the given PN space is ACK-eliciting. */
173void ossl_quic_tx_packetiser_schedule_ack_eliciting(OSSL_QUIC_TX_PACKETISER *txp,
174 uint32_t pn_space);
175
176/*
177 * Asks the TXP to ensure an ACK is put in the next packet in the given PN
178 * space.
179 */
180void ossl_quic_tx_packetiser_schedule_ack(OSSL_QUIC_TX_PACKETISER *txp,
181 uint32_t pn_space);
182
183/*
184 * Schedules a connection close. *f and f->reason are copied. This operation is
185 * irreversible and causes all further packets generated by the TXP to contain a
186 * CONNECTION_CLOSE frame. This function fails if it has already been called
187 * successfully; the information in *f cannot be changed after the first
188 * successful call to this function.
189 */
190int ossl_quic_tx_packetiser_schedule_conn_close(OSSL_QUIC_TX_PACKETISER *txp,
191 const OSSL_QUIC_FRAME_CONN_CLOSE *f);
192
193/* Setters for the msg_callback and msg_callback_arg */
194void ossl_quic_tx_packetiser_set_msg_callback(OSSL_QUIC_TX_PACKETISER *txp,
195 ossl_msg_cb msg_callback,
196 SSL *msg_callback_ssl);
197void ossl_quic_tx_packetiser_set_msg_callback_arg(OSSL_QUIC_TX_PACKETISER *txp,
198 void *msg_callback_arg);
199
200/*
201 * Determines the next PN which will be used for a given PN space.
202 */
203QUIC_PN ossl_quic_tx_packetiser_get_next_pn(OSSL_QUIC_TX_PACKETISER *txp,
204 uint32_t pn_space);
205
206/*
207 * Sets a callback which is called whenever TXP sends an ACK frame. The callee
208 * must not modify the ACK frame data. Can be used to snoop on PNs being ACKed.
209 */
210void ossl_quic_tx_packetiser_set_ack_tx_cb(OSSL_QUIC_TX_PACKETISER *txp,
211 void (*cb)(const OSSL_QUIC_FRAME_ACK *ack,
212 uint32_t pn_space,
213 void *arg),
214 void *cb_arg);
215
216# endif
217
218#endif
注意: 瀏覽 TracBrowser 來幫助您使用儲存庫瀏覽器

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette