/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 | | /* List structure tracking a queue of URXEs. */ |
108 | 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 |
109 | 0 | typedef OSSL_LIST(urxe) DGRAM_URXE_LIST; |
110 | 0 |
|
111 | 0 | /* |
112 | 0 | * List management helpers. These are used by the demuxer but can also be used |
113 | 0 | * by users of the demuxer to manage URXEs. |
114 | 0 | */ |
115 | 0 | void ossl_dgram_urxe_remove(DGRAM_URXE_LIST *l, DGRAM_URXE *e); |
116 | 0 | void ossl_dgram_urxe_insert_head(DGRAM_URXE_LIST *l, DGRAM_URXE *e); |
117 | 0 | void ossl_dgram_urxe_insert_tail(DGRAM_URXE_LIST *l, DGRAM_URXE *e); |
118 | 0 |
|
119 | 0 | /* |
120 | 0 | * Callback function type for datagram routing. |
121 | 0 | * |
122 | 0 | * Called when a datagram is received. e is a URXE containing the datagram |
123 | 0 | * payload. It is permissible for the callee to mutate this buffer; once the |
124 | 0 | * demuxer calls this callback, it will never read the buffer again. |
125 | 0 | * |
126 | 0 | * The callee must arrange for ossl_dgram_demux_release_urxe or |
127 | 0 | * ossl_dgram_demux_reinject_urxe to be called on the URXE at some point in the |
128 | 0 | * future (this need not be before the callback returns). |
129 | 0 | * |
130 | 0 | * At the time the callback is made, the URXE will not be in any queue, |
131 | 0 | * therefore the callee can use the prev and next fields as it wishes. |
132 | 0 | */ |
133 | 0 | typedef void(ossl_dgram_demux_cb_fn)(DGRAM_URXE *e, void *arg); |
134 | 0 |
|
135 | 0 | /* |
136 | 0 | * Creates a new demuxer. The given BIO is used to receive datagrams from the |
137 | 0 | * network using BIO_recvmmsg. |
138 | 0 | * |
139 | 0 | * threadsafe: If non-zero, enables internal locking for thread safety. Use this |
140 | 0 | * when the demux may be accessed from multiple threads (DTLS |
141 | 0 | * where connections share a demux). Pass 0 if thread safety is |
142 | 0 | * handled at a higher level (QUIC). |
143 | 0 | * |
144 | 0 | * now is an optional function used to determine the time a datagram was |
145 | 0 | * received. now_arg is an opaque argument passed to the function. If now is |
146 | 0 | * NULL, ossl_time_zero() is used as the datagram reception time. |
147 | 0 | */ |
148 | 0 | DGRAM_DEMUX *ossl_dgram_demux_new(BIO *net_bio, |
149 | 0 | int threadsafe, |
150 | 0 | OSSL_TIME (*now)(void *arg), |
151 | 0 | void *now_arg); |
152 | 0 |
|
153 | 0 | /* |
154 | 0 | * Destroy a demuxer. All URXEs must have been released back to the demuxer |
155 | 0 | * before calling this. No-op if demux is NULL. |
156 | 0 | */ |
157 | 0 | void ossl_dgram_demux_free(DGRAM_DEMUX *demux); |
158 | 0 |
|
159 | 0 | /* |
160 | 0 | * Changes the BIO which the demuxer reads from. This also sets the MTU if the |
161 | 0 | * BIO supports querying the MTU. |
162 | 0 | */ |
163 | 0 | void ossl_dgram_demux_set_bio(DGRAM_DEMUX *demux, BIO *net_bio); |
164 | 0 |
|
165 | 0 | /* |
166 | 0 | * Changes the MTU in bytes we use to receive datagrams. |
167 | 0 | * Returns 1 on success, 0 if mtu is below minimum. |
168 | 0 | */ |
169 | 0 | int ossl_dgram_demux_set_mtu(DGRAM_DEMUX *demux, unsigned int mtu); |
170 | 0 |
|
171 | 0 | /* |
172 | 0 | * Set the default packet handler. This is called for every incoming datagram. |
173 | 0 | * If a default packet handler is not set, received datagrams are silently |
174 | 0 | * dropped. A default packet handler may be unset by passing NULL. |
175 | 0 | * |
176 | 0 | * The handler is responsible for ensuring that ossl_dgram_demux_reinject_urxe |
177 | 0 | * or ossl_dgram_demux_release_urxe is called on the passed packet at some |
178 | 0 | * point in the future, which may or may not be before the handler returns. |
179 | 0 | */ |
180 | 0 | void ossl_dgram_demux_set_default_handler(DGRAM_DEMUX *demux, |
181 | 0 | ossl_dgram_demux_cb_fn *cb, |
182 | 0 | void *cb_arg); |
183 | 0 |
|
184 | 0 | /* |
185 | 0 | * Releases a URXE back to the demuxer. No reference must be made to the URXE or |
186 | 0 | * its buffer after calling this function. The URXE must not be in any queue; |
187 | 0 | * that is, its prev and next pointers must be NULL. |
188 | 0 | */ |
189 | 0 | void ossl_dgram_demux_release_urxe(DGRAM_DEMUX *demux, DGRAM_URXE *e); |
190 | 0 |
|
191 | 0 | /* |
192 | 0 | * Reinjects a URXE back into the pending queue. This is useful when a packet |
193 | 0 | * needs to be reprocessed. Once this has been called, the caller must not |
194 | 0 | * touch the URXE anymore and must not also call ossl_dgram_demux_release_urxe(). |
195 | 0 | * |
196 | 0 | * The URXE is reinjected at the head of the queue, so it will be reprocessed |
197 | 0 | * immediately. |
198 | 0 | */ |
199 | 0 | void ossl_dgram_demux_reinject_urxe(DGRAM_DEMUX *demux, DGRAM_URXE *e); |
200 | 0 |
|
201 | 0 | /* |
202 | 0 | * Process any unprocessed RX'd datagrams, by calling registered callbacks, |
203 | 0 | * reading more datagrams from the BIO if necessary. |
204 | 0 | * |
205 | 0 | * Returns one of the following values: |
206 | 0 | * |
207 | 0 | * DGRAM_DEMUX_PUMP_RES_OK |
208 | 0 | * At least one incoming datagram was processed. |
209 | 0 | * |
210 | 0 | * DGRAM_DEMUX_PUMP_RES_TRANSIENT_FAIL |
211 | 0 | * No more incoming datagrams are currently available. |
212 | 0 | * Call again later. |
213 | 0 | * |
214 | 0 | * DGRAM_DEMUX_PUMP_RES_PERMANENT_FAIL |
215 | 0 | * Either the network read BIO has failed in a non-transient fashion, or |
216 | 0 | * an internal state, assertion or allocation error occurred. The caller |
217 | 0 | * should tear down the connection. |
218 | 0 | */ |
219 | 0 | #define DGRAM_DEMUX_PUMP_RES_OK 1 |
220 | 0 | #define DGRAM_DEMUX_PUMP_RES_TRANSIENT_FAIL (-1) |
221 | 0 | #define DGRAM_DEMUX_PUMP_RES_PERMANENT_FAIL (-2) |
222 | | |
223 | | int ossl_dgram_demux_pump(DGRAM_DEMUX *demux); |
224 | | |
225 | | /* |
226 | | * Artificially inject a packet into the demuxer for testing purposes. The |
227 | | * buffer must not exceed the URXE size being used by the demuxer. |
228 | | * |
229 | | * If peer or local are NULL, their respective fields are zeroed in the injected |
230 | | * URXE. |
231 | | * |
232 | | * Returns 1 on success or 0 on failure. |
233 | | */ |
234 | | int ossl_dgram_demux_inject(DGRAM_DEMUX *demux, |
235 | | const unsigned char *buf, |
236 | | size_t buf_len, |
237 | | const BIO_ADDR *peer, |
238 | | const BIO_ADDR *local); |
239 | | |
240 | | /* |
241 | | * Returns 1 if there are any pending URXEs. |
242 | | */ |
243 | | int ossl_dgram_demux_has_pending(const DGRAM_DEMUX *demux); |
244 | | |
245 | | /* |
246 | | * Accessor for URXE data buffer. This returns a pointer to the data buffer |
247 | | * that follows the URXE structure. |
248 | | */ |
249 | | static ossl_unused ossl_inline unsigned char * |
250 | | ossl_dgram_urxe_data(const DGRAM_URXE *e) |
251 | 0 | { |
252 | 0 | return (unsigned char *)&e[1]; |
253 | 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_sf_list.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_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 |
254 | | |
255 | | static ossl_unused ossl_inline unsigned char * |
256 | | ossl_dgram_urxe_data_end(const DGRAM_URXE *e) |
257 | 0 | { |
258 | 0 | return ossl_dgram_urxe_data(e) + e->data_len; |
259 | 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_sf_list.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_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 |
260 | | |
261 | | #endif /* !OPENSSL_NO_QUIC || !OPENSSL_NO_DTLS */ |
262 | | #endif /* OSSL_DGRAM_DEMUX_H */ |