summaryrefslogtreecommitdiffstats
path: root/upstream/archlinux/man7/openssl-quic.7ssl
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/archlinux/man7/openssl-quic.7ssl')
-rw-r--r--upstream/archlinux/man7/openssl-quic.7ssl713
1 files changed, 713 insertions, 0 deletions
diff --git a/upstream/archlinux/man7/openssl-quic.7ssl b/upstream/archlinux/man7/openssl-quic.7ssl
new file mode 100644
index 00000000..e9fa9759
--- /dev/null
+++ b/upstream/archlinux/man7/openssl-quic.7ssl
@@ -0,0 +1,713 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "OPENSSL-QUIC 7ssl"
+.TH OPENSSL-QUIC 7ssl 2024-01-30 3.2.1 OpenSSL
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+openssl\-quic \- OpenSSL QUIC
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+OpenSSL 3.2 and later features support for the QUIC transport protocol.
+Currently, only client connectivity is supported. This man page describes the
+usage of QUIC client functionality for both existing and new applications.
+.PP
+QUIC functionality uses the standard SSL API. A QUIC connection is represented
+by an SSL object in the same way that a TLS connection is. Only minimal changes
+are needed to existing applications making use of the libssl APIs to make use of
+QUIC client functionality. To make use of QUIC, use the SSL method
+\&\fBOSSL_QUIC_client_method\fR\|(3) or \fBOSSL_QUIC_client_thread_method\fR\|(3) with
+\&\fBSSL_CTX_new\fR\|(3).
+.PP
+When a QUIC connection is created, by default, it operates in default stream
+mode, which is intended to provide compatibility with existing non-QUIC
+application usage patterns. In this mode, the connection has a single
+stream associated with it. Calls to \fBSSL_read\fR\|(3) and
+\&\fBSSL_write\fR\|(3) on the QUIC connection SSL object read and write from that
+stream. Whether the stream is client-initiated or server-initiated from a QUIC
+perspective depends on whether \fBSSL_read\fR\|(3) or \fBSSL_write\fR\|(3) is called
+first. See the MODES OF OPERATION section for more information.
+.PP
+The default stream mode is intended for compatibility with existing
+applications. New applications using QUIC are recommended to disable default
+stream mode and use the multi-stream API; see the MODES OF OPERATION section and
+the RECOMMENDATIONS FOR NEW APPLICATIONS section for more information.
+.PP
+The remainder of this man page discusses, in order:
+.IP \(bu 4
+Default stream mode versus multi-stream mode;
+.IP \(bu 4
+The changes to existing libssl APIs which are driven by QUIC-related implementation
+requirements, which existing applications should bear in mind;
+.IP \(bu 4
+Aspects which must be considered by existing applications when adopting QUIC,
+including potential changes which may be needed.
+.IP \(bu 4
+Recommended usage approaches for new applications.
+.IP \(bu 4
+New, QUIC-specific APIs.
+.SH "MODES OF OPERATION"
+.IX Header "MODES OF OPERATION"
+.SS "Default Stream Mode"
+.IX Subsection "Default Stream Mode"
+A QUIC client connection can be used in either default stream mode or
+multi-stream mode. By default, a newly created QUIC connection SSL object uses
+default stream mode.
+.PP
+In default stream mode, a stream is implicitly created and bound to the QUIC
+connection SSL object; \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3) calls to the QUIC
+connection SSL object work by default and are mapped to that stream.
+.PP
+When default stream mode is used, any API function which can be called on a QUIC
+stream SSL object can also be called on a QUIC connection SSL object, in which
+case it affects the default stream bound to the connection.
+.PP
+The identity of a QUIC stream, including its stream ID, varies depending on
+whether a stream is client-initiated or server-initiated. In default stream
+mode, if a client application calls \fBSSL_read\fR\|(3) first before any call to
+\&\fBSSL_write\fR\|(3) on the connection, it is assumed that the application protocol
+is using a server-initiated stream, and the \fBSSL_read\fR\|(3) call will not
+complete (either blocking, or failing appropriately if nonblocking mode is
+configured) until the server initiates a stream. Conversely, if the client
+application calls \fBSSL_write\fR\|(3) before any call to \fBSSL_read\fR\|(3) on the
+connection, it is assumed that a client-initiated stream is to be used
+and such a stream is created automatically.
+.PP
+Default stream mode is intended to aid compatibility with legacy applications.
+New applications adopting QUIC should use multi-stream mode, described below,
+and avoid use of the default stream functionality.
+.PP
+It is possible to use additional streams in default stream mode using
+\&\fBSSL_new_stream\fR\|(3) and \fBSSL_accept_stream\fR\|(3); note that the default incoming
+stream policy will need to be changed using \fBSSL_set_incoming_stream_policy\fR\|(3)
+in order to use \fBSSL_accept_stream\fR\|(3) in this case. However, applications
+using additional streams are strongly recommended to use multi-stream mode
+instead.
+.PP
+Calling \fBSSL_new_stream\fR\|(3) or \fBSSL_accept_stream\fR\|(3) before a default stream
+has been associated with the QUIC connection SSL object will inhibit future
+creation of a default stream.
+.SS "Multi-Stream Mode"
+.IX Subsection "Multi-Stream Mode"
+The recommended usage mode for new applications adopting QUIC is multi-stream
+mode, in which no default stream is attached to the QUIC connection SSL object
+and attempts to call \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3) on the QUIC connection
+SSL object fail. Instead, an application calls \fBSSL_new_stream\fR\|(3) or
+\&\fBSSL_accept_stream\fR\|(3) to create individual stream SSL objects for sending and
+receiving application data using \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3).
+.PP
+To use multi-stream mode, call \fBSSL_set_default_stream_mode\fR\|(3) with an
+argument of \fBSSL_DEFAULT_STREAM_MODE_NONE\fR; this function must be called prior
+to initiating the connection. The default stream mode cannot be changed after
+initiating a connection.
+.PP
+When multi-stream mode is used, meaning that no default stream is associated
+with the connection, calls to API functions which are defined as operating on a
+QUIC stream fail if called on the QUIC connection SSL object. For example, calls
+such as \fBSSL_write\fR\|(3) or \fBSSL_get_stream_id\fR\|(3) will fail.
+.SH "CHANGES TO EXISTING APIS"
+.IX Header "CHANGES TO EXISTING APIS"
+Most SSL APIs, such as \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3), function as they do
+for TLS connections and do not have changed semantics, with some exceptions. The
+changes to the semantics of existing APIs are as follows:
+.IP \(bu 4
+Since QUIC uses UDP, \fBSSL_set_bio\fR\|(3), \fBSSL_set0_rbio\fR\|(3) and
+\&\fBSSL_set0_wbio\fR\|(3) function as before, but must now receive a BIO with datagram
+semantics. There are broadly four options for applications to use as a network
+BIO:
+.RS 4
+.IP \(bu 4
+\&\fBBIO_s_datagram\fR\|(3), recommended for most applications, replaces
+\&\fBBIO_s_socket\fR\|(3) and provides a UDP socket.
+.IP \(bu 4
+\&\fBBIO_s_dgram_pair\fR\|(3) provides BIO pair-like functionality but with datagram
+semantics, and is recommended for existing applications which use a BIO pair or
+memory BIO to manage libssl's communication with the network.
+.IP \(bu 4
+\&\fBBIO_s_dgram_mem\fR\|(3) provides a simple memory BIO-like interface but with
+datagram semantics. Unlike \fBBIO_s_dgram_pair\fR\|(3), it is unidirectional.
+.IP \(bu 4
+An application may also choose to implement a custom BIO. The new
+\&\fBBIO_sendmmsg\fR\|(3) and \fBBIO_recvmmsg\fR\|(3) APIs must be supported.
+.RE
+.RS 4
+.RE
+.IP \(bu 4
+\&\fBSSL_set_fd\fR\|(3), \fBSSL_set_rfd\fR\|(3) and \fBSSL_set_wfd\fR\|(3) traditionally
+instantiate a \fBBIO_s_socket\fR\|(3). For QUIC, these functions instead instantiate
+a \fBBIO_s_datagram\fR\|(3). This is equivalent to instantiating a
+\&\fBBIO_s_datagram\fR\|(3) and using \fBSSL_set0_rbio\fR\|(3) and \fBSSL_set0_wbio\fR\|(3).
+.IP \(bu 4
+Traditionally, whether the application-level I/O APIs (such as \fBSSL_read\fR\|(3)
+and \fBSSL_write\fR\|(3) operated in a blocking fashion was directly correlated with
+whether the underlying network socket was configured in a blocking fashion. This
+is no longer the case; applications must explicitly configure the desired
+application-level blocking mode using \fBSSL_set_blocking_mode\fR\|(3). See
+\&\fBSSL_set_blocking_mode\fR\|(3) for details.
+.IP \(bu 4
+Network-level I/O must always be performed in a nonblocking manner. The
+application can still enjoy blocking semantics for calls to application-level
+I/O functions such as \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3), but the underlying
+network BIO provided to QUIC (such as a \fBBIO_s_datagram\fR\|(3)) must be configured
+in nonblocking mode. For application-level blocking functionality, see
+\&\fBSSL_set_blocking_mode\fR\|(3).
+.IP \(bu 4
+\&\fBBIO_new_ssl_connect\fR\|(3) has been changed to automatically use a
+\&\fBBIO_s_datagram\fR\|(3) when used with QUIC, therefore applications which use this
+do not need to change the BIO they use.
+.IP \(bu 4
+\&\fBBIO_new_buffer_ssl_connect\fR\|(3) cannot be used with QUIC and applications must
+change to use \fBBIO_new_ssl_connect\fR\|(3) instead.
+.IP \(bu 4
+\&\fBSSL_shutdown\fR\|(3) has significant changes in relation to how QUIC connections
+must be shut down. In particular, applications should be advised that the full
+RFC-conformant QUIC shutdown process may take an extended amount of time. This
+may not be suitable for short-lived processes which should exit immediately
+after their usage of a QUIC connection is completed. A rapid shutdown mode
+is available for such applications. For details, see \fBSSL_shutdown\fR\|(3).
+.IP \(bu 4
+\&\fBSSL_want\fR\|(3), \fBSSL_want_read\fR\|(3) and \fBSSL_want_write\fR\|(3) no longer reflect
+the I/O state of the network BIO passed to the QUIC SSL object, but instead
+reflect the flow control state of the QUIC stream associated with the SSL
+object.
+.Sp
+When used in nonblocking mode, \fBSSL_ERROR_WANT_READ\fR indicates that the
+receive part of a QUIC stream does not currently have any more data available to
+be read, and \fBSSL_ERROR_WANT_WRITE\fR indicates that the stream's internal buffer
+is full.
+.Sp
+To determine if the QUIC implementation currently wishes to be informed of
+incoming network datagrams, use the new function \fBSSL_net_read_desired\fR\|(3);
+likewise, to determine if the QUIC implementation currently wishes to be
+informed when it is possible to transmit network datagrams, use the new function
+\&\fBSSL_net_write_desired\fR\|(3). Only applications which wish to manage their own event
+loops need to use these functions; see \fBAPPLICATION-DRIVEN EVENT LOOPS\fR for
+further discussion.
+.IP \(bu 4
+The use of ALPN is mandatory when using QUIC. Attempts to connect without
+configuring ALPN will fail. For information on how to configure ALPN, see
+\&\fBSSL_set_alpn_protos\fR\|(3).
+.IP \(bu 4
+Whether QUIC operates in a client or server mode is determined by the
+\&\fBSSL_METHOD\fR used, rather than by calls to \fBSSL_set_connect_state\fR\|(3) or
+\&\fBSSL_set_accept_state\fR\|(3). It is not necessary to call either of
+\&\fBSSL_set_connect_state\fR\|(3) or \fBSSL_set_accept_state\fR\|(3) before connecting, but
+if either of these are called, the function called must be congruent with the
+\&\fBSSL_METHOD\fR being used. Currently, only client mode is supported.
+.IP \(bu 4
+The \fBSSL_set_min_proto_version\fR\|(3) and \fBSSL_set_max_proto_version\fR\|(3) APIs are
+not used and the values passed to them are ignored, as OpenSSL QUIC currently
+always uses TLS 1.3.
+.IP \(bu 4
+The following libssl functionality is not available when used with QUIC.
+.RS 4
+.IP \(bu 4
+Async functionality
+.IP \(bu 4
+\&\fBSSL_MODE_AUTO_RETRY\fR
+.IP \(bu 4
+Record Padding and Fragmentation (\fBSSL_set_block_padding\fR\|(3), etc.)
+.IP \(bu 4
+\&\fBSSL_stateless\fR\|(3) support
+.IP \(bu 4
+SRTP functionality
+.IP \(bu 4
+TLSv1.3 Early Data
+.IP \(bu 4
+TLS Next Protocol Negotiation cannot be used and is superseded by ALPN, which
+must be used instead. The use of ALPN is mandatory with QUIC.
+.IP \(bu 4
+Post-Handshake Client Authentication is not available as QUIC prohibits its use.
+.IP \(bu 4
+QUIC requires the use of TLSv1.3 or later, therefore functionality only relevant
+to older TLS versions is not available.
+.IP \(bu 4
+Some cipher suites which are generally available for TLSv1.3 are not available
+for QUIC, such as \fBTLS_AES_128_CCM_8_SHA256\fR. Your application may need to
+adjust the list of acceptable cipher suites it passes to libssl.
+.IP \(bu 4
+CCM mode is not currently supported.
+.RE
+.RS 4
+.Sp
+The following libssl functionality is also not available when used with QUIC,
+but calls to the relevant functions are treated as no-ops:
+.IP \(bu 4
+Readahead (\fBSSL_set_read_ahead\fR\|(3), etc.)
+.RE
+.RS 4
+.RE
+.SH "CONSIDERATIONS FOR EXISTING APPLICATIONS"
+.IX Header "CONSIDERATIONS FOR EXISTING APPLICATIONS"
+Existing applications seeking to adopt QUIC should apply the following list to
+determine what changes they will need to make:
+.IP \(bu 4
+An application wishing to use QUIC must use \fBOSSL_QUIC_client_method\fR\|(3) or
+\&\fBOSSL_QUIC_client_thread_method\fR\|(3) as its SSL method. For more information
+on the differences between these two methods, see \fBTHREAD ASSISTED MODE\fR.
+.IP \(bu 4
+Determine how to provide QUIC with network access. Determine which of the below
+apply for your application:
+.RS 4
+.IP \(bu 4
+Your application uses \fBBIO_s_socket\fR\|(3) to construct a BIO which is passed to
+the SSL object to provide it with network access.
+.Sp
+Changes needed: Change your application to use \fBBIO_s_datagram\fR\|(3) instead when
+using QUIC. The socket must be configured in nonblocking mode. You may or may
+not need to use \fBSSL_set1_initial_peer_addr\fR\|(3) to set the initial peer
+address; see the \fBQUIC-SPECIFIC APIS\fR section for details.
+.IP \(bu 4
+Your application uses \fBBIO_new_ssl_connect\fR\|(3) to
+construct a BIO which is passed to the SSL object to provide it with network
+access.
+.Sp
+Changes needed: No changes needed. Use of QUIC is detected automatically and a
+datagram socket is created instead of a normal TCP socket.
+.IP \(bu 4
+Your application uses any other I/O strategy in this list but combines it with a
+\&\fBBIO_f_buffer\fR\|(3), for example using \fBBIO_push\fR\|(3).
+.Sp
+Changes needed: Disable the usage of \fBBIO_f_buffer\fR\|(3) when using QUIC. Usage
+of such a buffer is incompatible with QUIC as QUIC requires datagram semantics
+in its interaction with the network.
+.IP \(bu 4
+Your application uses a BIO pair to cause the SSL object to read and write
+network traffic to a memory buffer. Your application manages the transmission
+and reception of buffered data itself in a way unknown to libssl.
+.Sp
+Changes needed: Switch from using a conventional BIO pair to using
+\&\fBBIO_s_dgram_pair\fR\|(3) instead, which has the necessary datagram semantics. You
+will need to modify your application to transmit and receive using a UDP socket
+and to use datagram semantics when interacting with the \fBBIO_s_dgram_pair\fR\|(3)
+instance.
+.IP \(bu 4
+Your application uses a custom BIO method to provide the SSL object with network
+access.
+.Sp
+Changes needed: The custom BIO must be re-architected to have datagram
+semantics. \fBBIO_sendmmsg\fR\|(3) and \fBBIO_recvmmsg\fR\|(3) must be implemented. These
+calls must operate in a nonblocking fashion. Optionally, implement the
+\&\fBBIO_get_rpoll_descriptor\fR\|(3) and \fBBIO_get_wpoll_descriptor\fR\|(3) methods if
+desired. Implementing these methods is required if blocking semantics at the SSL
+API level are desired.
+.RE
+.RS 4
+.RE
+.IP \(bu 4
+An application must explicitly configure whether it wishes to use the SSL APIs
+in blocking mode or not. Traditionally, an SSL object has automatically operated
+in blocking or nonblocking mode based on whether the underlying network BIO
+operates in blocking or nonblocking mode. QUIC requires the use of a
+nonblocking network BIO, therefore the blocking mode at the application level
+must be explicitly configured by the application using the new
+\&\fBSSL_set_blocking_mode\fR\|(3) API. The default mode is blocking. If an application
+wishes to use the SSL object APIs at application level in a nonblocking manner,
+it must add a call to \fBSSL_set_blocking_mode\fR\|(3) to disable blocking mode.
+.IP \(bu 4
+If your application does not choose to use thread assisted mode, it must ensure
+that it calls an I/O function on the SSL object (for example, \fBSSL_read\fR\|(3) or
+\&\fBSSL_write\fR\|(3)), or the new function \fBSSL_handle_events\fR\|(3), regularly. If the
+SSL object is used in blocking mode, an ongoing blocking call to an I/O function
+satisfies this requirement. This is required to ensure that timer events
+required by QUIC are handled in a timely fashion.
+.Sp
+Most applications will service the SSL object by calling \fBSSL_read\fR\|(3) or
+\&\fBSSL_write\fR\|(3) regularly. If an application does not do this, it should ensure
+that \fBSSL_handle_events\fR\|(3) is called regularly.
+.Sp
+\&\fBSSL_get_event_timeout\fR\|(3) can be used to determine when
+\&\fBSSL_handle_events\fR\|(3) must next be called.
+.Sp
+If the SSL object is being used with an underlying network BIO which is pollable
+(such as \fBBIO_s_datagram\fR\|(3)), the application can use
+\&\fBSSL_get_rpoll_descriptor\fR\|(3), \fBSSL_get_wpoll_descriptor\fR\|(3) to obtain
+resources which can be used to determine when \fBSSL_handle_events\fR\|(3) should be
+called due to network I/O.
+.Sp
+Applications which use thread assisted mode do not need to be concerned
+with this requirement, as the QUIC implementation ensures timeout events
+are handled in a timely manner. See \fBTHREAD ASSISTED MODE\fR for details.
+.IP \(bu 4
+Ensure that your usage of \fBSSL_want\fR\|(3), \fBSSL_want_read\fR\|(3) and
+\&\fBSSL_want_write\fR\|(3) reflects the API changes described in \fBCHANGES TO EXISTING
+APIS\fR. In particular, you should use these APIs to determine the ability of a
+QUIC stream to receive or provide application data, not to to determine if
+network I/O is required.
+.IP \(bu 4
+Evaluate your application's use of \fBSSL_shutdown\fR\|(3) in light of the changes
+discussed in \fBCHANGES TO EXISTING APIS\fR. Depending on whether your application
+wishes to prioritise RFC conformance or rapid shutdown, consider using the new
+\&\fBSSL_shutdown_ex\fR\|(3) API instead. See \fBQUIC-SPECIFIC APIS\fR for details.
+.SH "RECOMMENDED USAGE IN NEW APPLICATIONS"
+.IX Header "RECOMMENDED USAGE IN NEW APPLICATIONS"
+The recommended usage in new applications varies depending on three independent
+design decisions:
+.IP \(bu 4
+Whether the application will use blocking or nonblocking I/O at the application
+level (configured using \fBSSL_set_blocking_mode\fR\|(3)).
+.Sp
+If the application does nonblocking I/O at the application level it can choose
+to manage its own polling and event loop; see \fBAPPLICATION-DRIVEN EVENT LOOPS\fR.
+.IP \(bu 4
+Whether the application intends to give the QUIC implementation direct access to
+a network socket (e.g. via \fBBIO_s_datagram\fR\|(3)) or whether it intends to buffer
+transmitted and received datagrams via a \fBBIO_s_dgram_pair\fR\|(3) or custom BIO.
+.Sp
+The former is preferred where possible as it reduces latency to the network,
+which enables QUIC to achieve higher performance and more accurate connection
+round trip time (RTT) estimation.
+.IP \(bu 4
+Whether thread assisted mode will be used (see \fBTHREAD ASSISTED MODE\fR).
+.PP
+Simple demos for QUIC usage under these various scenarios can be found at
+<https://github.com/openssl/openssl/tree/master/doc/designs/ddd>.
+.PP
+Applications which wish to implement QUIC-specific protocols should be aware of
+the APIs listed under \fBQUIC-SPECIFIC APIS\fR which provide access to
+QUIC-specific functionality. For example, \fBSSL_stream_conclude\fR\|(3) can be used
+to indicate the end of the sending part of a stream, and \fBSSL_shutdown_ex\fR\|(3)
+can be used to provide a QUIC application error code when closing a connection.
+.PP
+Regardless of the design decisions chosen above, it is recommended that new
+applications avoid use of the default stream mode and use the multi-stream API
+by calling \fBSSL_set_default_stream_mode\fR\|(3); see the MODES OF OPERATION section
+for details.
+.SH "QUIC-SPECIFIC APIS"
+.IX Header "QUIC-SPECIFIC APIS"
+This section details new APIs which are directly or indirectly related to QUIC.
+For details on the operation of each API, see the referenced man pages.
+.PP
+The following SSL APIs are new but relevant to both QUIC and DTLS:
+.IP \fBSSL_get_event_timeout\fR\|(3) 4
+.IX Item "SSL_get_event_timeout"
+Determines when the QUIC implementation should next be woken up via a call to
+\&\fBSSL_handle_events\fR\|(3) (or another I/O function such as \fBSSL_read\fR\|(3) or
+\&\fBSSL_write\fR\|(3)), if ever.
+.Sp
+This can also be used with DTLS and supersedes \fBDTLSv1_get_timeout\fR\|(3) for new
+usage.
+.IP \fBSSL_handle_events\fR\|(3) 4
+.IX Item "SSL_handle_events"
+This is a non-specific I/O operation which makes a best effort attempt to
+perform any pending I/O or timeout processing. It can be used to advance the
+QUIC state machine by processing incoming network traffic, generating outgoing
+network traffic and handling any expired timeout events. Most other I/O
+functions on an SSL object, such as \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3)
+implicitly perform event handling on the SSL object, so calling this function is
+only needed if no other I/O function is to be called.
+.Sp
+This can also be used with DTLS and supersedes \fBDTLSv1_handle_timeout\fR\|(3) for
+new usage.
+.PP
+The following SSL APIs are specific to QUIC:
+.IP "\fBSSL_set_blocking_mode\fR\|(3), \fBSSL_get_blocking_mode\fR\|(3)" 4
+.IX Item "SSL_set_blocking_mode, SSL_get_blocking_mode"
+Configures whether blocking semantics are used at the application level. This
+determines whether calls to functions such as \fBSSL_read\fR\|(3) and \fBSSL_write\fR\|(3)
+will block.
+.IP "\fBSSL_get_rpoll_descriptor\fR\|(3), \fBSSL_get_wpoll_descriptor\fR\|(3)" 4
+.IX Item "SSL_get_rpoll_descriptor, SSL_get_wpoll_descriptor"
+These functions facilitate operation in nonblocking mode.
+.Sp
+When an SSL object is being used with an underlying network read BIO which
+supports polling, \fBSSL_get_rpoll_descriptor\fR\|(3) outputs an OS resource which
+can be used to synchronise on network readability events which should result in
+a call to \fBSSL_handle_events\fR\|(3). \fBSSL_get_wpoll_descriptor\fR\|(3) works in an
+analogous fashion for the underlying network write BIO.
+.Sp
+The poll descriptors provided by these functions need only be used when
+\&\fBSSL_net_read_desired\fR\|(3) and \fBSSL_net_write_desired\fR\|(3) return 1, respectively.
+.IP "\fBSSL_net_read_desired\fR\|(3), \fBSSL_net_write_desired\fR\|(3)" 4
+.IX Item "SSL_net_read_desired, SSL_net_write_desired"
+These functions facilitate operation in nonblocking mode and are used in
+conjunction with \fBSSL_get_rpoll_descriptor\fR\|(3) and
+\&\fBSSL_get_wpoll_descriptor\fR\|(3) respectively. They determine whether the
+respective poll descriptor is currently relevant for the purposes of polling.
+.IP \fBSSL_set1_initial_peer_addr\fR\|(3) 4
+.IX Item "SSL_set1_initial_peer_addr"
+This function can be used to set the initial peer address for an outgoing QUIC
+connection. This function must be used in the general case when creating an
+outgoing QUIC connection; however, the correct initial peer address can be
+autodetected in some cases. See \fBSSL_set1_initial_peer_addr\fR\|(3) for details.
+.IP \fBSSL_shutdown_ex\fR\|(3) 4
+.IX Item "SSL_shutdown_ex"
+This augments \fBSSL_shutdown\fR\|(3) by allowing an application error code to be
+specified. It also allows a client to decide how quickly it wants a shutdown to
+be performed, potentially by trading off strict RFC compliance.
+.IP \fBSSL_stream_conclude\fR\|(3) 4
+.IX Item "SSL_stream_conclude"
+This allows an application to indicate the normal end of the sending part of a
+QUIC stream. This corresponds to the FIN flag in the QUIC RFC. The receiving
+part of a stream remains usable.
+.IP \fBSSL_stream_reset\fR\|(3) 4
+.IX Item "SSL_stream_reset"
+This allows an application to indicate the non-normal termination of the sending
+part of a stream. This corresponds to the RESET_STREAM frame in the QUIC RFC.
+.IP "\fBSSL_get_stream_write_state\fR\|(3) and \fBSSL_get_stream_read_state\fR\|(3)" 4
+.IX Item "SSL_get_stream_write_state and SSL_get_stream_read_state"
+This allows an application to determine the current stream states for the
+sending and receiving parts of a stream respectively.
+.IP "\fBSSL_get_stream_write_error_code\fR\|(3) and \fBSSL_get_stream_read_error_code\fR\|(3)" 4
+.IX Item "SSL_get_stream_write_error_code and SSL_get_stream_read_error_code"
+This allows an application to determine the application error code which was
+signalled by a peer which has performed a non-normal stream termination of the
+respective sending or receiving part of a stream, if any.
+.IP \fBSSL_get_conn_close_info\fR\|(3) 4
+.IX Item "SSL_get_conn_close_info"
+This allows an application to determine the error code which was signalled when
+the local or remote endpoint terminated the QUIC connection.
+.IP \fBSSL_get0_connection\fR\|(3) 4
+.IX Item "SSL_get0_connection"
+Gets the QUIC connection SSL object from a QUIC stream SSL object.
+.IP \fBSSL_is_connection\fR\|(3) 4
+.IX Item "SSL_is_connection"
+Returns 1 if a SSL object is not a QUIC stream SSL object.
+.IP \fBSSL_get_stream_type\fR\|(3) 4
+.IX Item "SSL_get_stream_type"
+Provides information on the kind of QUIC stream which is attached
+to the SSL object.
+.IP \fBSSL_get_stream_id\fR\|(3) 4
+.IX Item "SSL_get_stream_id"
+Returns the QUIC stream ID which the QUIC protocol has associated with a QUIC
+stream.
+.IP \fBSSL_new_stream\fR\|(3) 4
+.IX Item "SSL_new_stream"
+Creates a new QUIC stream SSL object representing a new, locally-initiated QUIC
+stream.
+.IP \fBSSL_accept_stream\fR\|(3) 4
+.IX Item "SSL_accept_stream"
+Potentially yields a new QUIC stream SSL object representing a new
+remotely-initiated QUIC stream, blocking until one is available if the
+connection is configured to do so.
+.IP \fBSSL_get_accept_stream_queue_len\fR\|(3) 4
+.IX Item "SSL_get_accept_stream_queue_len"
+Provides information on the number of pending remotely-initiated streams.
+.IP \fBSSL_set_incoming_stream_policy\fR\|(3) 4
+.IX Item "SSL_set_incoming_stream_policy"
+Configures how incoming, remotely-initiated streams are handled. The incoming
+stream policy can be used to automatically reject streams created by the peer,
+or allow them to be handled using \fBSSL_accept_stream\fR\|(3).
+.IP \fBSSL_set_default_stream_mode\fR\|(3) 4
+.IX Item "SSL_set_default_stream_mode"
+Used to configure or disable default stream mode; see the MODES OF OPERATION
+section for details.
+.PP
+The following BIO APIs are not specific to QUIC but have been added to
+facilitate QUIC-specific requirements and are closely associated with its use:
+.IP \fBBIO_s_dgram_pair\fR\|(3) 4
+.IX Item "BIO_s_dgram_pair"
+This is a new BIO method which is similar to a conventional BIO pair but
+provides datagram semantics.
+.IP "\fBBIO_get_rpoll_descriptor\fR\|(3), \fBBIO_get_wpoll_descriptor\fR\|(3)" 4
+.IX Item "BIO_get_rpoll_descriptor, BIO_get_wpoll_descriptor"
+This is a new BIO API which allows a BIO to expose a poll descriptor. This API
+is used to implement the corresponding SSL APIs \fBSSL_get_rpoll_descriptor\fR\|(3)
+and \fBSSL_get_wpoll_descriptor\fR\|(3).
+.IP "\fBBIO_sendmmsg\fR\|(3), \fBBIO_recvmmsg\fR\|(3)" 4
+.IX Item "BIO_sendmmsg, BIO_recvmmsg"
+This is a new BIO API which can be implemented by BIOs which implement datagram
+semantics. It is implemented by \fBBIO_s_datagram\fR\|(3) and \fBBIO_s_dgram_pair\fR\|(3).
+It is used by the QUIC implementation to send and receive UDP datagrams.
+.IP "\fBBIO_dgram_set_no_trunc\fR\|(3), \fBBIO_dgram_get_no_trunc\fR\|(3)" 4
+.IX Item "BIO_dgram_set_no_trunc, BIO_dgram_get_no_trunc"
+By default, \fBBIO_s_dgram_pair\fR\|(3) has semantics comparable to those of Berkeley
+sockets being used with datagram semantics. This allows an alternative mode
+to be enabled in which datagrams will not be silently truncated if they are
+too large.
+.IP "\fBBIO_dgram_set_caps\fR\|(3), \fBBIO_dgram_get_caps\fR\|(3)" 4
+.IX Item "BIO_dgram_set_caps, BIO_dgram_get_caps"
+These functions are used to allow the user of one end of a
+\&\fBBIO_s_dgram_pair\fR\|(3) to indicate its capabilities to the other end of a
+\&\fBBIO_s_dgram_pair\fR\|(3). In particular, this allows an application to inform the
+QUIC implementation of whether it is prepared to handle local and/or peer
+addresses in transmitted datagrams and to provide the applicable information in
+received datagrams.
+.IP "\fBBIO_dgram_get_local_addr_cap\fR\|(3), \fBBIO_dgram_set_local_addr_enable\fR\|(3), \fBBIO_dgram_get_local_addr_enable\fR\|(3)" 4
+.IX Item "BIO_dgram_get_local_addr_cap, BIO_dgram_set_local_addr_enable, BIO_dgram_get_local_addr_enable"
+Local addressing support refers to the ability of a BIO with datagram semantics
+to allow a source address to be specified on transmission and to report the
+destination address on reception. These functions can be used to determine if a
+BIO can support local addressing and to enable local addressing support if it
+can.
+.IP \fBBIO_err_is_non_fatal\fR\|(3) 4
+.IX Item "BIO_err_is_non_fatal"
+This is used to determine if an error while calling \fBBIO_sendmmsg\fR\|(3) or
+\&\fBBIO_recvmmsg\fR\|(3) is ephemeral in nature, such as "would block" errors.
+.SH "THREAD ASSISTED MODE"
+.IX Header "THREAD ASSISTED MODE"
+The optional thread assisted mode can be used with
+\&\fBOSSL_QUIC_client_thread_method\fR\|(3). In this mode, a background thread is
+created automatically. The OpenSSL QUIC implementation then takes responsibility
+for ensuring that timeout events are handled on a timely basis even if no SSL
+I/O function such as \fBSSL_read\fR\|(3) or \fBSSL_write\fR\|(3) is called by the
+application for a long time.
+.PP
+All necessary locking is handled automatically internally, but the thread safety
+guarantees for the public SSL API are unchanged. Therefore, an application must
+still do its own locking if it wishes to make concurrent use of the public SSL
+APIs.
+.PP
+Because this method relies on threads, it is not available on platforms where
+threading support is not available or not supported by OpenSSL. However, it
+does provide the simplest mode of usage for an application.
+.PP
+The implementation may or may not use a common thread or thread pool to service
+multiple SSL objects in the same \fBSSL_CTX\fR.
+.SH "APPLICATION-DRIVEN EVENT LOOPS"
+.IX Header "APPLICATION-DRIVEN EVENT LOOPS"
+OpenSSL's QUIC implementation is designed to facilitate applications which wish
+to use the SSL APIs in a blocking fashion, but is also designed to facilitate
+applications which wish to use the SSL APIs in a nonblocking fashion and manage
+their own event loops and polling directly. This is useful when it is desirable
+to host OpenSSL's QUIC implementation on top of an application's existing
+nonblocking I/O infrastructure.
+.PP
+This is supported via the concept of poll descriptors; see
+\&\fBBIO_get_rpoll_descriptor\fR\|(3) for details. Broadly, a \fBBIO_POLL_DESCRIPTOR\fR is
+a structure which expresses some kind of OS resource which can be used to
+synchronise on I/O events. The QUIC implementation provides a
+\&\fBBIO_POLL_DESCRIPTOR\fR based on the poll descriptor provided by the underlying
+network BIO. This is typically an OS socket handle, though custom BIOs could
+choose to implement their own custom poll descriptor format.
+.PP
+Broadly, an application which wishes to manage its own event loop should
+interact with the SSL object as follows:
+.IP \(bu 4
+It should provide read and write BIOs with nonblocking datagram semantics to
+the SSL object using \fBSSL_set0_rbio\fR\|(3) and \fBSSL_set0_wbio\fR\|(3). This could be
+a BIO abstracting a network socket such as \fBBIO_s_datagram\fR\|(3), or a BIO
+abstracting some kind of memory buffer such as \fBBIO_s_dgram_pair\fR\|(3). Use of a
+custom BIO is also possible.
+.IP \(bu 4
+It should configure the SSL object into nonblocking mode by calling
+\&\fBSSL_set_blocking_mode\fR\|(3).
+.IP \(bu 4
+It should configure the SSL object as desired, set an initial peer as needed
+using \fBSSL_set1_initial_peer_addr\fR\|(3), and trigger the connection process by
+calling \fBSSL_connect\fR\|(3).
+.IP \(bu 4
+If the network read and write BIOs provided were pollable (for example,
+a \fBBIO_s_datagram\fR\|(3), or a custom BIO which implements
+\&\fBBIO_get_rpoll_descriptor\fR\|(3) and \fBBIO_get_wpoll_descriptor\fR\|(3)), it should
+perform the following steps repeatedly:
+.RS 4
+.IP \(bu 4
+The application should call \fBSSL_get_rpoll_descriptor\fR\|(3) and
+\&\fBSSL_get_wpoll_descriptor\fR\|(3) to identify OS resources which can be used for
+synchronisation.
+.IP \(bu 4
+It should call \fBSSL_net_read_desired\fR\|(3) and \fBSSL_net_write_desired\fR\|(3) to determine
+whether the QUIC implementation is currently interested in readability and
+writability events on the underlying network BIO which was provided, and call
+\&\fBSSL_get_event_timeout\fR\|(3) to determine if any timeout event will become
+applicable in the future.
+.IP \(bu 4
+It should wait until one of the following events occurs:
+.RS 4
+.IP \(bu 4
+The poll descriptor returned by \fBSSL_get_rpoll_descriptor\fR\|(3) becomes readable
+(if \fBSSL_net_read_desired\fR\|(3) returned 1);
+.IP \(bu 4
+The poll descriptor returned by \fBSSL_get_wpoll_descriptor\fR\|(3) becomes writable
+(if \fBSSL_net_write_desired\fR\|(3) returned 1);
+.IP \(bu 4
+The timeout returned by \fBSSL_get_event_timeout\fR\|(3) (if any) expires.
+.RE
+.RS 4
+.Sp
+Once any of these events occurs, \fBSSL_handle_events\fR\|(3) should be called.
+.RE
+.RE
+.RS 4
+.RE
+.IP \(bu 4
+If the network read and write BIOs provided were not pollable (for example, in
+the case of \fBBIO_s_dgram_pair\fR\|(3)), the application is responsible for managing
+and synchronising network I/O. It should call \fBSSL_handle_events\fR\|(3) after it
+writes data to a \fBBIO_s_dgram_pair\fR\|(3) or otherwise takes action so that the
+QUIC implementation can read new datagrams via a call to \fBBIO_recvmmsg\fR\|(3) on
+the underlying network BIO. The QUIC implementation may output datagrams via a
+call to \fBBIO_sendmmsg\fR\|(3) and the application is responsible for ensuring these
+are transmitted.
+.Sp
+The application must call \fBSSL_get_event_timeout\fR\|(3) after every call to
+\&\fBSSL_handle_events\fR\|(3) (or another I/O function on the SSL object), and ensure
+that a call to \fBSSL_handle_events\fR\|(3) is performed after the specified timeout
+(if any).
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\fBSSL_handle_events\fR\|(3), \fBSSL_get_event_timeout\fR\|(3),
+\&\fBSSL_net_read_desired\fR\|(3), \fBSSL_net_write_desired\fR\|(3),
+\&\fBSSL_get_rpoll_descriptor\fR\|(3), \fBSSL_get_wpoll_descriptor\fR\|(3),
+\&\fBSSL_set_blocking_mode\fR\|(3), \fBSSL_shutdown_ex\fR\|(3),
+\&\fBSSL_set1_initial_peer_addr\fR\|(3), \fBSSL_stream_conclude\fR\|(3),
+\&\fBSSL_stream_reset\fR\|(3), \fBSSL_get_stream_read_state\fR\|(3),
+\&\fBSSL_get_stream_read_error_code\fR\|(3), \fBSSL_get_conn_close_info\fR\|(3),
+\&\fBSSL_get0_connection\fR\|(3), \fBSSL_get_stream_type\fR\|(3), \fBSSL_get_stream_id\fR\|(3),
+\&\fBSSL_new_stream\fR\|(3), \fBSSL_accept_stream\fR\|(3),
+\&\fBSSL_set_incoming_stream_policy\fR\|(3), \fBSSL_set_default_stream_mode\fR\|(3)
+.SH COPYRIGHT
+.IX Header "COPYRIGHT"
+Copyright 2022\-2023 The OpenSSL Project Authors. All Rights Reserved.
+.PP
+Licensed under the Apache License 2.0 (the "License"). You may not use
+this file except in compliance with the License. You can obtain a copy
+in the file LICENSE in the source distribution or at
+<https://www.openssl.org/source/license.html>.