Coverage Report

Created: 2026-10-16 07:31

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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 */