Coverage Report

Created: 2026-08-31 06:56

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
/* 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 */