/src/openssl/include/internal/dgram_demux.h
Line | Count | Source |
1 | | /* |
2 | | * Copyright 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_DGRAM_DEMUX_H |
11 | | #define OSSL_DGRAM_DEMUX_H |
12 | | #pragma once |
13 | | |
14 | | #include <openssl/ssl.h> |
15 | | #include "internal/bio_addr.h" |
16 | | #include "internal/time.h" |
17 | | #include "internal/list.h" |
18 | | |
19 | | #if !defined(OPENSSL_NO_QUIC) || !defined(OPENSSL_NO_DTLS) |
20 | | |
21 | | /* |
22 | | * Generic Datagram Demuxer |
23 | | * ======================== |
24 | | * |
25 | | * The datagram demuxer is responsible for receiving datagrams from the network |
26 | | * via a datagram BIO. It maintains a pool of Unprocessed RX Entries (URXEs) |
27 | | * for efficient batch receiving via BIO_recvmmsg(). |
28 | | * |
29 | | * The demuxer is protocol-agnostic. It receives datagrams and invokes a |
30 | | * callback for each one. The callback is responsible for routing the datagram |
31 | | * to the appropriate connection (e.g., by DCID for QUIC, or by peer address |
32 | | * for DTLS). |
33 | | */ |
34 | | |
35 | | /* Forward declarations */ |
36 | | typedef struct dgram_demux_st DGRAM_DEMUX; |
37 | | typedef struct dgram_urxe_st DGRAM_URXE; |
38 | | |
39 | | /* |
40 | | * URXE (Unprocessed RX Entry) structure. |
41 | | * |
42 | | * This structure is exposed so that callers can manage URXEs in their own |
43 | | * queues when needed. The data buffer follows immediately after this structure. |
44 | | * |
45 | | * This structure includes fields used by QUIC (processed, hpr_removed, deferred) |
46 | | * which are unused by DTLS. This allows QUIC_URXE to be a simple typedef to |
47 | | * DGRAM_URXE, enabling QUIC_DEMUX to wrap DGRAM_DEMUX without list type issues. |
48 | | */ |
49 | | struct dgram_urxe_st { |
50 | | OSSL_LIST_MEMBER(urxe, DGRAM_URXE); |
51 | | |
52 | | /* |
53 | | * The URXE data starts after this structure so we don't need a pointer. |
54 | | * data_len stores the current length (i.e., the length of the received |
55 | | * datagram) and alloc_len stores the allocation length. The URXE will be |
56 | | * reallocated if we need a larger allocation than is available, though this |
57 | | * should not be common as we will have a good idea of worst-case MTUs up |
58 | | * front. |
59 | | */ |
60 | | size_t data_len, alloc_len; |
61 | | |
62 | | /* |
63 | | * Bitfields per packet. processed indicates the packet has been processed |
64 | | * and must not be processed again, hpr_removed indicates header protection |
65 | | * has already been removed. Used by QUIC QRX only; not used by the demuxer |
66 | | * or DTLS. |
67 | | */ |
68 | | uint64_t processed, hpr_removed; |
69 | | |
70 | | /* |
71 | | * This monotonically increases with each datagram received. It is used for |
72 | | * diagnostic purposes only. |
73 | | */ |
74 | | uint64_t datagram_id; |
75 | | |
76 | | /* |
77 | | * Address of peer we received the datagram from, and the local interface |
78 | | * address we received it on. If local address support is not enabled, local |
79 | | * is zeroed. |
80 | | */ |
81 | | BIO_ADDR peer, local; |
82 | | |
83 | | /* |
84 | | * Time at which datagram was received (or ossl_time_zero()) if a now |
85 | | * function was not provided). |
86 | | */ |
87 | | OSSL_TIME time; |
88 | | |
89 | | /* |
90 | | * Used by the QUIC QRX to mark whether a datagram has been deferred. |
91 | | * Not used by the demuxer or DTLS. |
92 | | */ |
93 | | char deferred; |
94 | | |
95 | | /* |
96 | | * Used by the DEMUX to track if a URXE has been handed out. Used primarily |
97 | | * for debugging purposes. |
98 | | */ |
99 | | char demux_state; |
100 | | }; |
101 | | |
102 | | /* Values for demux_state field */ |
103 | 0 | #define URXE_DEMUX_STATE_FREE 0 /* on urx_free list */ |
104 | 0 | #define URXE_DEMUX_STATE_PENDING 1 /* on urx_pending list */ |
105 | 0 | #define URXE_DEMUX_STATE_ISSUED 2 /* on neither list */ |
106 | | |
107 | | /* Maximum number of datagrams received in a single call (one batch). */ |
108 | 0 | #define DEMUX_MAX_MSGS_PER_CALL 32 |
109 | | |
110 | | /* |
111 | | * Free-list limit used by the DTLS listener: two receive batches, so one |
112 | | * full batch can always be cached. Enforced by |
113 | | * ossl_dgram_demux_release_urxe() once set with |
114 | | * ossl_dgram_demux_set_max_free_urxe(); the default 0 is unbounded. |
115 | | */ |
116 | 0 | #define DEMUX_MAX_FREE_URXE (2 * DEMUX_MAX_MSGS_PER_CALL) |
117 | | |
118 | | /* List structure tracking a queue of URXEs. */ |
119 | 0 | DEFINE_LIST_OF(urxe, DGRAM_URXE); Unexecuted instantiation: quic_record_rx.c:ossl_list_urxe_head Unexecuted instantiation: quic_record_rx.c:ossl_list_urxe_next Unexecuted instantiation: quic_record_rx.c:ossl_list_urxe_remove Unexecuted instantiation: quic_record_rx.c:ossl_list_urxe_insert_tail Unexecuted instantiation: dgram_demux.c:ossl_list_urxe_remove Unexecuted instantiation: dgram_demux.c:ossl_list_urxe_insert_head Unexecuted instantiation: dgram_demux.c:ossl_list_urxe_insert_tail Unexecuted instantiation: dgram_demux.c:ossl_list_urxe_next Unexecuted instantiation: dgram_demux.c:ossl_list_urxe_head Unexecuted instantiation: dgram_demux.c:ossl_list_urxe_prev Unexecuted instantiation: dgram_demux.c:ossl_list_urxe_insert_after Unexecuted instantiation: dtls_record_rx.c:ossl_list_urxe_head Unexecuted instantiation: dtls_record_rx.c:ossl_list_urxe_next Unexecuted instantiation: dtls_record_rx.c:ossl_list_urxe_remove Unexecuted instantiation: dtls_record_rx.c:ossl_list_urxe_insert_tail |
120 | 0 | typedef OSSL_LIST(urxe) DGRAM_URXE_LIST; |
121 | 0 |
|
122 | 0 | /* |
123 | 0 | * List management helpers. These are used by the demuxer but can also be used |
124 | 0 | * by users of the demuxer to manage URXEs. |
125 | 0 | */ |
126 | 0 | void ossl_dgram_urxe_remove(DGRAM_URXE_LIST *l, DGRAM_URXE *e); |
127 | 0 | void ossl_dgram_urxe_insert_head(DGRAM_URXE_LIST *l, DGRAM_URXE *e); |
128 | 0 | void ossl_dgram_urxe_insert_tail(DGRAM_URXE_LIST *l, DGRAM_URXE *e); |
129 | 0 |
|
130 | 0 | /* |
131 | 0 | * Callback function type for datagram routing. |
132 | 0 | * |
133 | 0 | * Called when a datagram is received. e is a URXE containing the datagram |
134 | 0 | * payload. It is permissible for the callee to mutate this buffer; once the |
135 | 0 | * demuxer calls this callback, it will never read the buffer again. |
136 | 0 | * |
137 | 0 | * The callee must arrange for ossl_dgram_demux_release_urxe or |
138 | 0 | * ossl_dgram_demux_reinject_urxe to be called on the URXE at some point in the |
139 | 0 | * future (this need not be before the callback returns). |
140 | 0 | * |
141 | 0 | * At the time the callback is made, the URXE will not be in any queue, |
142 | 0 | * therefore the callee can use the prev and next fields as it wishes. |
143 | 0 | */ |
144 | 0 | typedef void(ossl_dgram_demux_cb_fn)(DGRAM_URXE *e, void *arg); |
145 | 0 |
|
146 | 0 | /* |
147 | 0 | * Creates a new demuxer. The given BIO is used to receive datagrams from the |
148 | 0 | * network using BIO_recvmmsg. |
149 | 0 | * |
150 | 0 | * threadsafe: If non-zero, enables internal locking for thread safety. Use this |
151 | 0 | * when the demux may be accessed from multiple threads (DTLS |
152 | 0 | * where connections share a demux). Pass 0 if thread safety is |
153 | 0 | * handled at a higher level (QUIC). |
154 | 0 | * |
155 | 0 | * now is an optional function used to determine the time a datagram was |
156 | 0 | * received. now_arg is an opaque argument passed to the function. If now is |
157 | 0 | * NULL, ossl_time_zero() is used as the datagram reception time. |
158 | 0 | */ |
159 | 0 | DGRAM_DEMUX *ossl_dgram_demux_new(BIO *net_bio, |
160 | 0 | int threadsafe, |
161 | 0 | OSSL_TIME (*now)(void *arg), |
162 | 0 | void *now_arg); |
163 | 0 |
|
164 | 0 | /* |
165 | 0 | * Destroy a demuxer. All URXEs must have been released back to the demuxer |
166 | 0 | * before calling this. No-op if demux is NULL. |
167 | 0 | */ |
168 | 0 | void ossl_dgram_demux_free(DGRAM_DEMUX *demux); |
169 | 0 |
|
170 | 0 | /* |
171 | 0 | * Changes the BIO which the demuxer reads from. This also sets the MTU if the |
172 | 0 | * BIO supports querying the MTU. |
173 | 0 | */ |
174 | 0 | void ossl_dgram_demux_set_bio(DGRAM_DEMUX *demux, BIO *net_bio); |
175 | 0 |
|
176 | 0 | /* |
177 | 0 | * Changes the MTU in bytes we use to receive datagrams. |
178 | 0 | * Returns 1 on success, 0 if mtu is below minimum. |
179 | 0 | */ |
180 | 0 | int ossl_dgram_demux_set_mtu(DGRAM_DEMUX *demux, unsigned int mtu); |
181 | 0 |
|
182 | 0 | /* |
183 | 0 | * Sets the maximum number of URXEs cached on the free list; 0 (the |
184 | 0 | * default) leaves it unbounded. |
185 | 0 | */ |
186 | 0 | void ossl_dgram_demux_set_max_free_urxe(DGRAM_DEMUX *demux, size_t max_free); |
187 | 0 |
|
188 | 0 | /* |
189 | 0 | * Returns the number of URXEs currently cached on the free list. |
190 | 0 | */ |
191 | 0 | size_t ossl_dgram_demux_get_free_list_len(DGRAM_DEMUX *demux); |
192 | 0 |
|
193 | 0 | /* |
194 | 0 | * Set the default packet handler. This is called for every incoming datagram. |
195 | 0 | * If a default packet handler is not set, received datagrams are silently |
196 | 0 | * dropped. A default packet handler may be unset by passing NULL. |
197 | 0 | * |
198 | 0 | * The handler is responsible for ensuring that ossl_dgram_demux_reinject_urxe |
199 | 0 | * or ossl_dgram_demux_release_urxe is called on the passed packet at some |
200 | 0 | * point in the future, which may or may not be before the handler returns. |
201 | 0 | */ |
202 | 0 | void ossl_dgram_demux_set_default_handler(DGRAM_DEMUX *demux, |
203 | 0 | ossl_dgram_demux_cb_fn *cb, |
204 | 0 | void *cb_arg); |
205 | 0 |
|
206 | 0 | /* |
207 | 0 | * Releases a URXE back to the demuxer. No reference must be made to the URXE or |
208 | 0 | * its buffer after calling this function. The URXE must not be in any queue; |
209 | 0 | * that is, its prev and next pointers must be NULL. |
210 | 0 | */ |
211 | 0 | void ossl_dgram_demux_release_urxe(DGRAM_DEMUX *demux, DGRAM_URXE *e); |
212 | 0 |
|
213 | 0 | /* |
214 | 0 | * Reinjects a URXE back into the pending queue. This is useful when a packet |
215 | 0 | * needs to be reprocessed. Once this has been called, the caller must not |
216 | 0 | * touch the URXE anymore and must not also call ossl_dgram_demux_release_urxe(). |
217 | 0 | * |
218 | 0 | * The URXE is reinjected at the head of the queue, so it will be reprocessed |
219 | 0 | * immediately. |
220 | 0 | */ |
221 | 0 | void ossl_dgram_demux_reinject_urxe(DGRAM_DEMUX *demux, DGRAM_URXE *e); |
222 | 0 |
|
223 | 0 | /* |
224 | 0 | * Process any unprocessed RX'd datagrams, by calling registered callbacks, |
225 | 0 | * reading more datagrams from the BIO if necessary. |
226 | 0 | * |
227 | 0 | * Returns one of the following values: |
228 | 0 | * |
229 | 0 | * DGRAM_DEMUX_PUMP_RES_OK |
230 | 0 | * At least one incoming datagram was processed. |
231 | 0 | * |
232 | 0 | * DGRAM_DEMUX_PUMP_RES_TRANSIENT_FAIL |
233 | 0 | * No more incoming datagrams are currently available. |
234 | 0 | * Call again later. |
235 | 0 | * |
236 | 0 | * DGRAM_DEMUX_PUMP_RES_PERMANENT_FAIL |
237 | 0 | * Either the network read BIO has failed in a non-transient fashion, or |
238 | 0 | * an internal state, assertion or allocation error occurred. The caller |
239 | 0 | * should tear down the connection. |
240 | 0 | */ |
241 | 0 | #define DGRAM_DEMUX_PUMP_RES_OK 1 |
242 | 0 | #define DGRAM_DEMUX_PUMP_RES_TRANSIENT_FAIL (-1) |
243 | 0 | #define DGRAM_DEMUX_PUMP_RES_PERMANENT_FAIL (-2) |
244 | | |
245 | | int ossl_dgram_demux_pump(DGRAM_DEMUX *demux); |
246 | | |
247 | | /* |
248 | | * Artificially inject a packet into the demuxer for testing purposes. The |
249 | | * buffer must not exceed the URXE size being used by the demuxer. |
250 | | * |
251 | | * If peer or local are NULL, their respective fields are zeroed in the injected |
252 | | * URXE. |
253 | | * |
254 | | * Returns 1 on success or 0 on failure. |
255 | | */ |
256 | | int ossl_dgram_demux_inject(DGRAM_DEMUX *demux, |
257 | | const unsigned char *buf, |
258 | | size_t buf_len, |
259 | | const BIO_ADDR *peer, |
260 | | const BIO_ADDR *local); |
261 | | |
262 | | /* |
263 | | * Returns 1 if there are any pending URXEs. |
264 | | */ |
265 | | int ossl_dgram_demux_has_pending(const DGRAM_DEMUX *demux); |
266 | | |
267 | | /* |
268 | | * Accessor for URXE data buffer. This returns a pointer to the data buffer |
269 | | * that follows the URXE structure. |
270 | | */ |
271 | | static ossl_unused ossl_inline unsigned char * |
272 | | ossl_dgram_urxe_data(const DGRAM_URXE *e) |
273 | 0 | { |
274 | 0 | return (unsigned char *)&e[1]; |
275 | 0 | } Unexecuted instantiation: methods.c:ossl_dgram_urxe_data Unexecuted instantiation: s3_lib.c:ossl_dgram_urxe_data Unexecuted instantiation: s3_msg.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_cert.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_ciph.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_init.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_lib.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_mcnf.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_rsa.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_sess.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_stat.c:ossl_dgram_urxe_data Unexecuted instantiation: t1_lib.c:ossl_dgram_urxe_data Unexecuted instantiation: tls13_enc.c:ossl_dgram_urxe_data Unexecuted instantiation: tls_depr.c:ossl_dgram_urxe_data Unexecuted instantiation: tls_srp.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_impl.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_method.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_obj.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_port.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_record_rx.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_record_shared.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_record_tx.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_record_util.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_rstream.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_sstream.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_stream_map.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_strm_reas.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_thread_assist.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_tls.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_txp.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_wire.c:ossl_dgram_urxe_data Unexecuted instantiation: rec_layer_d1.c:ossl_dgram_urxe_data Unexecuted instantiation: rec_layer_s3.c:ossl_dgram_urxe_data Unexecuted instantiation: dtls_meth.c:ossl_dgram_urxe_data Unexecuted instantiation: tls13_meth.c:ossl_dgram_urxe_data Unexecuted instantiation: tls1_meth.c:ossl_dgram_urxe_data Unexecuted instantiation: tls_common.c:ossl_dgram_urxe_data Unexecuted instantiation: tls_multib.c:ossl_dgram_urxe_data Unexecuted instantiation: tlsany_meth.c:ossl_dgram_urxe_data Unexecuted instantiation: extensions.c:ossl_dgram_urxe_data Unexecuted instantiation: extensions_clnt.c:ossl_dgram_urxe_data Unexecuted instantiation: extensions_cust.c:ossl_dgram_urxe_data Unexecuted instantiation: extensions_srvr.c:ossl_dgram_urxe_data Unexecuted instantiation: statem.c:ossl_dgram_urxe_data Unexecuted instantiation: statem_clnt.c:ossl_dgram_urxe_data Unexecuted instantiation: statem_dtls.c:ossl_dgram_urxe_data Unexecuted instantiation: statem_lib.c:ossl_dgram_urxe_data Unexecuted instantiation: statem_srvr.c:ossl_dgram_urxe_data Unexecuted instantiation: ech_helper.c:ossl_dgram_urxe_data Unexecuted instantiation: ech_internal.c:ossl_dgram_urxe_data Unexecuted instantiation: ech_store.c:ossl_dgram_urxe_data Unexecuted instantiation: d1_lib.c:ossl_dgram_urxe_data Unexecuted instantiation: d1_msg.c:ossl_dgram_urxe_data Unexecuted instantiation: d1_srtp.c:ossl_dgram_urxe_data Unexecuted instantiation: d1_transcript.c:ossl_dgram_urxe_data Unexecuted instantiation: dgram_demux.c:ossl_dgram_urxe_data Unexecuted instantiation: dtls_conn_lookup.c:ossl_dgram_urxe_data Unexecuted instantiation: dtls_record_rx.c:ossl_dgram_urxe_data Unexecuted instantiation: pqueue.c:ossl_dgram_urxe_data Unexecuted instantiation: s3_enc.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_asn1.c:ossl_dgram_urxe_data Unexecuted instantiation: ssl_conf.c:ossl_dgram_urxe_data Unexecuted instantiation: t1_enc.c:ossl_dgram_urxe_data Unexecuted instantiation: qlog_event_helpers.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_cfq.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_channel.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_demux.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_engine.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_fifd.c:ossl_dgram_urxe_data Unexecuted instantiation: quic_rx_depack.c:ossl_dgram_urxe_data Unexecuted instantiation: poll_immediate.c:ossl_dgram_urxe_data |
276 | | |
277 | | static ossl_unused ossl_inline unsigned char * |
278 | | ossl_dgram_urxe_data_end(const DGRAM_URXE *e) |
279 | 0 | { |
280 | 0 | return ossl_dgram_urxe_data(e) + e->data_len; |
281 | 0 | } Unexecuted instantiation: methods.c:ossl_dgram_urxe_data_end Unexecuted instantiation: s3_lib.c:ossl_dgram_urxe_data_end Unexecuted instantiation: s3_msg.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_cert.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_ciph.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_init.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_lib.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_mcnf.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_rsa.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_sess.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_stat.c:ossl_dgram_urxe_data_end Unexecuted instantiation: t1_lib.c:ossl_dgram_urxe_data_end Unexecuted instantiation: tls13_enc.c:ossl_dgram_urxe_data_end Unexecuted instantiation: tls_depr.c:ossl_dgram_urxe_data_end Unexecuted instantiation: tls_srp.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_impl.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_method.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_obj.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_port.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_record_rx.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_record_shared.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_record_tx.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_record_util.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_rstream.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_sstream.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_stream_map.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_strm_reas.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_thread_assist.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_tls.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_txp.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_wire.c:ossl_dgram_urxe_data_end Unexecuted instantiation: rec_layer_d1.c:ossl_dgram_urxe_data_end Unexecuted instantiation: rec_layer_s3.c:ossl_dgram_urxe_data_end Unexecuted instantiation: dtls_meth.c:ossl_dgram_urxe_data_end Unexecuted instantiation: tls13_meth.c:ossl_dgram_urxe_data_end Unexecuted instantiation: tls1_meth.c:ossl_dgram_urxe_data_end Unexecuted instantiation: tls_common.c:ossl_dgram_urxe_data_end Unexecuted instantiation: tls_multib.c:ossl_dgram_urxe_data_end Unexecuted instantiation: tlsany_meth.c:ossl_dgram_urxe_data_end Unexecuted instantiation: extensions.c:ossl_dgram_urxe_data_end Unexecuted instantiation: extensions_clnt.c:ossl_dgram_urxe_data_end Unexecuted instantiation: extensions_cust.c:ossl_dgram_urxe_data_end Unexecuted instantiation: extensions_srvr.c:ossl_dgram_urxe_data_end Unexecuted instantiation: statem.c:ossl_dgram_urxe_data_end Unexecuted instantiation: statem_clnt.c:ossl_dgram_urxe_data_end Unexecuted instantiation: statem_dtls.c:ossl_dgram_urxe_data_end Unexecuted instantiation: statem_lib.c:ossl_dgram_urxe_data_end Unexecuted instantiation: statem_srvr.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ech_helper.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ech_internal.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ech_store.c:ossl_dgram_urxe_data_end Unexecuted instantiation: d1_lib.c:ossl_dgram_urxe_data_end Unexecuted instantiation: d1_msg.c:ossl_dgram_urxe_data_end Unexecuted instantiation: d1_srtp.c:ossl_dgram_urxe_data_end Unexecuted instantiation: d1_transcript.c:ossl_dgram_urxe_data_end Unexecuted instantiation: dgram_demux.c:ossl_dgram_urxe_data_end Unexecuted instantiation: dtls_conn_lookup.c:ossl_dgram_urxe_data_end Unexecuted instantiation: dtls_record_rx.c:ossl_dgram_urxe_data_end Unexecuted instantiation: pqueue.c:ossl_dgram_urxe_data_end Unexecuted instantiation: s3_enc.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_asn1.c:ossl_dgram_urxe_data_end Unexecuted instantiation: ssl_conf.c:ossl_dgram_urxe_data_end Unexecuted instantiation: t1_enc.c:ossl_dgram_urxe_data_end Unexecuted instantiation: qlog_event_helpers.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_cfq.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_channel.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_demux.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_engine.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_fifd.c:ossl_dgram_urxe_data_end Unexecuted instantiation: quic_rx_depack.c:ossl_dgram_urxe_data_end Unexecuted instantiation: poll_immediate.c:ossl_dgram_urxe_data_end |
282 | | |
283 | | #endif /* !OPENSSL_NO_QUIC || !OPENSSL_NO_DTLS */ |
284 | | #endif /* OSSL_DGRAM_DEMUX_H */ |