Provided by: openssl_3.5.0-2ubuntu1_amd64 bug

NAME

       openssl-quic - OpenSSL QUIC

DESCRIPTION

       OpenSSL 3.2 and later features support for the QUIC transport protocol.  You can use OpenSSL's QUIC
       capabilities for both client and server applications.  This man page describes how to let applications
       use the QUIC protocol using the libssl API.

       The QUIC protocol maps to 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 which use
       libssl API to bring QUIC protocol support in. QUIC clients can use OSSL_QUIC_client_method(3) or
       OSSL_QUIC_client_thread_method(3) with SSL_CTX_new(3). See below for more details about the difference
       between the two. For servers, there is only one option: SSL method OSSL_QUIC_server_method(3) with
       SSL_CTX_new(3).

       The remainder of this man page discusses, in order:

       •   Default stream mode versus multi-stream mode for clients;

       •   The  changes  to  existing  libssl APIs which are driven by QUIC-related implementation requirements,
           which existing applications should bear in mind;

       •   Aspects which must be considered by existing applications when  adopting  QUIC,  including  potential
           changes which may be needed.

       •   Recommended usage approaches for new applications.

       •   New, QUIC-specific APIs.

CLIENT MODES OF OPERATION

       When  a  client  creates  a  QUIC  connection,  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 SSL_read(3) and SSL_write(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 SSL_read(3) or SSL_write(3) is called first.

       Default  stream  mode  is  primarily  for compatibility with existing applications.  For new applications
       utilizing QUIC, it's recommended to disable this mode and instead adopt the  multi-stream  API.  See  the
       RECOMMENDATIONS FOR NEW APPLICATIONS section for more details.

   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.

       In default stream mode, a stream is implicitly created and bound  to  the  QUIC  connection  SSL  object;
       SSL_read(3)  and  SSL_write(3)  calls to the QUIC connection SSL object work by default and are mapped to
       that stream.

       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.

       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 SSL_read(3) first
       before any call to SSL_write(3) on the connection, it is assumed that the application protocol is using a
       server-initiated stream, and the  SSL_read(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 SSL_write(3) before any call to SSL_read(3) on the  connection,  it  is  assumed
       that a client-initiated stream is to be used and such a stream is created automatically.

       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.

       It   is  possible  to  use  additional  streams  in  default  stream  mode  using  SSL_new_stream(3)  and
       SSL_accept_stream(3); note that the default  incoming  stream  policy  will  need  to  be  changed  using
       SSL_set_incoming_stream_policy(3)   in   order   to  use  SSL_accept_stream(3)  in  this  case.  However,
       applications using additional streams are strongly recommended to use multi-stream mode instead.

       Calling SSL_new_stream(3) or SSL_accept_stream(3) before a default stream has been  associated  with  the
       QUIC connection SSL object will inhibit future creation of a default stream.

   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 SSL_read(3) and SSL_write(3) on
       the  QUIC  connection  SSL  object   fail.   Instead,   an   application   calls   SSL_new_stream(3)   or
       SSL_accept_stream(3)  to  create individual stream SSL objects for sending and receiving application data
       using SSL_read(3) and SSL_write(3).

       To   use   multi-stream   mode,    call    SSL_set_default_stream_mode(3)    with    an    argument    of
       SSL_DEFAULT_STREAM_MODE_NONE;  this  function  must  be  called  prior  to initiating the connection. The
       default stream mode cannot be changed after initiating a connection.

       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 SSL_write(3) or SSL_get_stream_id(3) will fail.

CHANGES TO EXISTING APIS

       Most SSL APIs, such as SSL_read(3) and SSL_write(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:

       •   Since QUIC uses UDP, SSL_set_bio(3), SSL_set0_rbio(3) and SSL_set0_wbio(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:

           •   BIO_s_datagram(3), recommended for most applications, replaces BIO_s_socket(3) and provides a UDP
               socket.

           •   BIO_s_dgram_pair(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.

           •   BIO_s_dgram_mem(3) provides a simple memory  BIO-like  interface  but  with  datagram  semantics.
               Unlike BIO_s_dgram_pair(3), it is unidirectional.

           •   An  application  may  also  choose  to  implement  a  custom  BIO.  The  new  BIO_sendmmsg(3) and
               BIO_recvmmsg(3) APIs must be supported.

       •   SSL_set_fd(3), SSL_set_rfd(3) and SSL_set_wfd(3) traditionally  instantiate  a  BIO_s_socket(3).  For
           QUIC,  these functions instead instantiate a BIO_s_datagram(3). This is equivalent to instantiating a
           BIO_s_datagram(3) and using SSL_set0_rbio(3) and SSL_set0_wbio(3).

       •   Traditionally, whether the application-level I/O APIs (such as SSL_read(3) and SSL_write(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    SSL_set_blocking_mode(3).    See
           SSL_set_blocking_mode(3) for details.

       •   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 SSL_read(3) and SSL_write(3),
           but  the  underlying network BIO provided to QUIC (such as a BIO_s_datagram(3)) must be configured in
           nonblocking mode. For application-level blocking functionality, see SSL_set_blocking_mode(3).

       •   BIO_new_ssl_connect(3) has been changed to automatically use a BIO_s_datagram(3) when used with QUIC,
           therefore applications which use this do not need to change the BIO they use.

       •   BIO_new_buffer_ssl_connect(3)  cannot  be  used  with  QUIC  and  applications  must  change  to  use
           BIO_new_ssl_connect(3) instead.

       •   SSL_shutdown(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 SSL_shutdown(3).

       •   SSL_want(3), SSL_want_read(3) and SSL_want_write(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.

           When used in nonblocking mode, SSL_ERROR_WANT_READ indicates that the receive part of a  QUIC  stream
           does  not  currently have any more data available to be read, and SSL_ERROR_WANT_WRITE indicates that
           the stream's internal buffer is full.

           To determine if the  QUIC  implementation  currently  wishes  to  be  informed  of  incoming  network
           datagrams,  use  the  new  function  SSL_net_read_desired(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 SSL_net_write_desired(3). Only applications which wish to  manage  their  own  event
           loops need to use these functions; see APPLICATION-DRIVEN EVENT LOOPS for further discussion.

       •   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 SSL_set_alpn_protos(3).

       •   Whether QUIC operates in a client or server mode is determined by the SSL_METHOD used, rather than by
           calls  to  SSL_set_connect_state(3) or SSL_set_accept_state(3). It is not necessary to call either of
           SSL_set_connect_state(3) or SSL_set_accept_state(3) before connecting, but if  either  of  these  are
           called, the function called must be congruent with the SSL_METHOD being used.

       •   The  SSL_set_min_proto_version(3)  and  SSL_set_max_proto_version(3) APIs are not used and the values
           passed to them are ignored, as OpenSSL QUIC currently always uses TLS 1.3.

       •   The following libssl functionality is not available when used with QUIC.

           •   Async functionality

           •   SSL_MODE_AUTO_RETRY

           •   Record Padding and Fragmentation (SSL_set_block_padding(3), etc.)

           •   SSL_stateless(3) support

           •   SRTP functionality

           •   TLSv1.3 Early Data

           •   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.

           •   Post-Handshake Client Authentication is not available as QUIC prohibits its use.

           •   QUIC  requires  the  use  of TLSv1.3 or later, therefore functionality only relevant to older TLS
               versions is not available.

           •   Some cipher suites which are generally available for TLSv1.3 are not available for QUIC, such  as
               TLS_AES_128_CCM_8_SHA256.  Your  application  may  need  to  adjust the list of acceptable cipher
               suites it passes to libssl.

           •   CCM mode is not currently supported.

           The following libssl functionality is also not available when  used  with  QUIC,  but  calls  to  the
           relevant functions are treated as no-ops:

           •   Readahead (SSL_set_read_ahead(3), etc.)

CONSIDERATIONS FOR EXISTING APPLICATIONS

       Existing  applications  seeking  to  adopt QUIC should apply the following list to determine what changes
       they will need to make:

       •   A   client   application   wishing   to   use   QUIC   must   use    OSSL_QUIC_client_method(3)    or
           OSSL_QUIC_client_thread_method(3)  as its SSL method. For more information on the differences between
           these two methods, see THREAD ASSISTED MODE.

       •   A server application wishing to use QUIC must use OSSL_QUIC_server_method(3).  The  server  can  then
           accept new connections with SSL_accept_connection(3).

       •   Determine  how  to  provide  QUIC  with  network  access. Determine which of the below apply for your
           application:

           •   Your application uses BIO_s_socket(3) to construct a BIO which is passed to  the  SSL  object  to
               provide it with network access.

               Changes  needed:  Change  your  application to use BIO_s_datagram(3) instead when using QUIC. The
               socket  must  be  configured  in  nonblocking  mode.  You  may   or   may   not   need   to   use
               SSL_set1_initial_peer_addr(3) to set the initial peer address; see the QUIC-SPECIFIC APIS section
               for details.

           •   Your application uses BIO_new_ssl_connect(3) to construct a BIO which is passed to the SSL object
               to provide it with network access.

               Changes needed: No changes needed. Use of QUIC is detected automatically and a datagram socket is
               created instead of a normal TCP socket.

           •   Your application uses any other I/O strategy in this list but combines it with a BIO_f_buffer(3),
               for example using BIO_push(3).

               Changes  needed:  Disable the usage of BIO_f_buffer(3) when using QUIC. Usage of such a buffer is
               incompatible with QUIC as QUIC requires datagram semantics in its interaction with the network.

           •   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.

               Changes  needed:  Switch from using a conventional BIO pair to using BIO_s_dgram_pair(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
               BIO_s_dgram_pair(3) instance.

           •   Your application uses a custom BIO method to provide the SSL object with network access.

               Changes needed: The custom BIO must be re-architected to have datagram semantics. BIO_sendmmsg(3)
               and BIO_recvmmsg(3) must be implemented. These calls  must  operate  in  a  nonblocking  fashion.
               Optionally,  implement the BIO_get_rpoll_descriptor(3) and BIO_get_wpoll_descriptor(3) methods if
               desired. Implementing these methods is required if blocking semantics at the SSL  API  level  are
               desired.

       •   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  can  be  explicitly
           configured  by  the  application  using  the  new  SSL_set_blocking_mode(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 SSL_set_blocking_mode(3) to disable blocking mode.

       •   If  your client 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, SSL_read(3) or SSL_write(3)),  or  the  new  function
           SSL_handle_events(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.

           Most applications will service the SSL object by calling SSL_read(3) or SSL_write(3) regularly. If an
           application does not do this, it should ensure that SSL_handle_events(3) is called regularly.

           SSL_get_event_timeout(3) can be used to determine when SSL_handle_events(3) must next be called.

           If the SSL object is  being  used  with  an  underlying  network  BIO  which  is  pollable  (such  as
           BIO_s_datagram(3)),  the application can use SSL_get_rpoll_descriptor(3), SSL_get_wpoll_descriptor(3)
           to obtain resources which can be used to determine when SSL_handle_events(3) should be called due  to
           network I/O.

           Client 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 THREAD ASSISTED
           MODE for details.

       •   Ensure  that  your  usage  of  SSL_want(3),  SSL_want_read(3)  and SSL_want_write(3) reflects the API
           changes described in CHANGES TO EXISTING APIS. 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.

       •   Evaluate your application's use of SSL_shutdown(3) in light of the changes discussed  in  CHANGES  TO
           EXISTING  APIS.  Depending  on whether your application wishes to prioritise RFC conformance or rapid
           shutdown, consider using the new SSL_shutdown_ex(3) API instead. See QUIC-SPECIFIC APIS for details.

RECOMMENDED USAGE IN NEW APPLICATIONS

       The recommended usage in new applications varies depending on three independent design decisions:

       •   Whether the application will use blocking or nonblocking I/O at  the  application  level  (configured
           using SSL_set_blocking_mode(3)).

           If  the  application  does  nonblocking  I/O at the application level it can choose to manage its own
           polling and event loop; see APPLICATION-DRIVEN EVENT LOOPS.

       •   Whether the application intends to give the QUIC implementation direct access  to  a  network  socket
           (e.g. via BIO_s_datagram(3)) or whether it intends to buffer transmitted and received datagrams via a
           BIO_s_dgram_pair(3) or custom BIO.

           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.

       •   Whether thread assisted mode will be used (see THREAD ASSISTED MODE).

       Simple   demos   for   QUIC   usage    under    these    various    scenarios    can    be    found    at
       <https://github.com/openssl/openssl/tree/master/doc/designs/ddd>.

       Applications  which  wish  to  implement QUIC-specific protocols should be aware of the APIs listed under
       QUIC-SPECIFIC   APIS   which   provide   access   to   QUIC-specific    functionality.    For    example,
       SSL_stream_conclude(3)  can  be  used  to  indicate  the  end  of  the  sending  part  of  a  stream, and
       SSL_shutdown_ex(3) can be used to provide a QUIC application error code when closing a connection.

       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 SSL_set_default_stream_mode(3); see the MODES
       OF OPERATION section for details.

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.

       The following SSL APIs are new but relevant to both QUIC and DTLS:

       SSL_get_event_timeout(3)
           Determines  when  the  QUIC implementation should next be woken up via a call to SSL_handle_events(3)
           (or another I/O function such as SSL_read(3) or SSL_write(3)), if ever.

           This can also be used with DTLS and supersedes DTLSv1_get_timeout(3) for new usage.

       SSL_handle_events(3)
           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 SSL_read(3) and SSL_write(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.

           This can also be used with DTLS and supersedes DTLSv1_handle_timeout(3) for new usage.

       The following SSL APIs are specific to QUIC:

       SSL_new_listener(3)
           Creates a listener SSL object, which differs from an ordinary SSL  object  in  that  it  is  used  to
           provide an abstraction for the acceptance of network connections in a protocol-agnostic manner.

           Currently,  listener  SSL  objects are only supported for QUIC server usage or client-only usage. The
           listener interface may expand to support additional protocols in the future.

       SSL_new_listener_from(3)
           Creates a  listener  SSL  object  which  is  subordinate  to  a  QUIC  domain  SSL  object  ssl.  See
           SSL_new_domain(3) and openssl-quic-concurrency(7) for details on QUIC domain SSL objects.

       SSL_is_listener(3)
           Returns 1 if and only if an SSL object is a listener SSL object.

       SSL_get0_listener(3)
           Returns an SSL object pointer (potentially to the same object on which it is called) or NULL.

       SSL_listen(3)
           Begin  listening  after a listener has been created. It is ordinarily not needed to call this because
           it will be called automatically on the first call to SSL_accept_connection(3).

       SSL_accept_connection(3)
           Accepts a new incoming connection for a listner  SSL  object.  A  new  SSL  object  representing  the
           accepted  connection  is  created and returned on success. If no incoming connection is available and
           the listener SSL object is configured in nonblocking mode, NULL is returned.

       SSL_get_accept_connection_queue_len(3)
           Returns an informational value listing the number of connections waiting to be popped from the  queue
           via calls to SSL_accept_connection().

       SSL_new_from_listener(3)
           Creates  a  client connection under a given listener SSL object. For QUIC, it is also possible to use
           SSL_new_from_listener() in conjunction with a listener which does accept incoming connections  (i.e.,
           which was not created using SSL_LISTENER_FLAG_NO_ACCEPT), leading to a UDP network endpoint which has
           both incoming and outgoing connections.

       SSL_new_domain(3)
           Creates  a  new  QUIC  event domain, represented as an SSL object. This is known as a QUIC domain SSL
           object. The concept of a QUIC event domain is discussed in detail in openssl-quic-concurrency(7).

       SSL_is_domain(3)
           Returns 1 if an SSL object is a QUIC domain SSL object.

       SSL_get0_domain(3)
           SSL_get0_domain() obtains a pointer to the QUIC domain SSL object in  an  SSL  object  hierarchy  (if
           any).

       SSL_set_blocking_mode(3), SSL_get_blocking_mode(3)
           Configures  whether  blocking  semantics  are  used at the application level. This determines whether
           calls to functions such as SSL_read(3) and SSL_write(3) will block.

       SSL_get_rpoll_descriptor(3), SSL_get_wpoll_descriptor(3)
           These functions facilitate operation in nonblocking mode.

           When an SSL object is being used  with  an  underlying  network  read  BIO  which  supports  polling,
           SSL_get_rpoll_descriptor(3)  outputs  an  OS  resource  which  can  be used to synchronise on network
           readability events which should result in a call to SSL_handle_events(3). SSL_get_wpoll_descriptor(3)
           works in an analogous fashion for the underlying network write BIO.

           The poll descriptors provided by these functions should be used only when SSL_net_read_desired(3) and
           SSL_net_write_desired(3) return 1, respectively.

       SSL_net_read_desired(3), SSL_net_write_desired(3)
           These  functions  facilitate  operation  in  nonblocking  mode  and  are  used  in  conjunction  with
           SSL_get_rpoll_descriptor(3)  and SSL_get_wpoll_descriptor(3) respectively. They determine whether the
           respective poll descriptor is currently relevant for the purposes of polling.

       SSL_set1_initial_peer_addr(3)
           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 SSL_set1_initial_peer_addr(3) for
           details.

       SSL_shutdown_ex(3)
           This augments SSL_shutdown(3) by allowing an application error code to be specified. It  also  allows
           an  application to decide how quickly it wants a shutdown to be performed, potentially by trading off
           strict RFC compliance.

       SSL_stream_conclude(3)
           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.

       SSL_stream_reset(3)
           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.

       SSL_get_stream_write_state(3) and SSL_get_stream_read_state(3)
           This allows an application to determine the current stream states for the sending and receiving parts
           of a stream respectively.

       SSL_get_stream_write_error_code(3) and SSL_get_stream_read_error_code(3)
           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.

       SSL_get_conn_close_info(3)
           This allows an application to determine the error code which was signalled when the local  or  remote
           endpoint terminated the QUIC connection.

       SSL_get0_connection(3)
           Gets the QUIC connection SSL object from a QUIC stream SSL object.

       SSL_is_connection(3)
           Returns 1 if an SSL object is not a QUIC stream SSL object.

       SSL_get_stream_type(3)
           Provides information on the kind of QUIC stream which is attached to the SSL object.

       SSL_get_stream_id(3)
           Returns the QUIC stream ID which the QUIC protocol has associated with a QUIC stream.

       SSL_new_stream(3)
           Creates a new QUIC stream SSL object representing a new, locally-initiated QUIC stream.

       SSL_accept_stream(3)
           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.

       SSL_get_accept_stream_queue_len(3)
           Provides information on the number of pending remotely-initiated streams.

       SSL_set_incoming_stream_policy(3)
           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
           SSL_accept_stream(3).

       SSL_set_default_stream_mode(3)
           Used to configure or disable default stream mode; see the MODES OF OPERATION section for details.

       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:

       BIO_s_dgram_pair(3)
           This is a new BIO method which is similar to a conventional BIO pair but provides datagram semantics.

       BIO_get_rpoll_descriptor(3), BIO_get_wpoll_descriptor(3)
           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 SSL_get_rpoll_descriptor(3) and SSL_get_wpoll_descriptor(3).

       BIO_sendmmsg(3), BIO_recvmmsg(3)
           This is a new BIO API which can be implemented by BIOs which  implement  datagram  semantics.  It  is
           implemented  by  BIO_s_datagram(3) and BIO_s_dgram_pair(3).  It is used by the QUIC implementation to
           send and receive UDP datagrams.

       BIO_dgram_set_no_trunc(3), BIO_dgram_get_no_trunc(3)
           By default, BIO_s_dgram_pair(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.

       BIO_dgram_set_caps(3), BIO_dgram_get_caps(3)
           These  functions  are  used  to  allow  the  user of one end of a BIO_s_dgram_pair(3) to indicate its
           capabilities to the other end of a BIO_s_dgram_pair(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.

       BIO_dgram_get_local_addr_cap(3), BIO_dgram_set_local_addr_enable(3), BIO_dgram_get_local_addr_enable(3)
           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.

       BIO_err_is_non_fatal(3)
           This  is  used to determine if an error while calling BIO_sendmmsg(3) or BIO_recvmmsg(3) is ephemeral
           in nature, such as "would block" errors.

THREAD ASSISTED MODE

       The optional thread assisted mode for clients can be used with OSSL_QUIC_client_thread_method(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 SSL_read(3) or SSL_write(3) is called by the application for a long time.

       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.

       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.

       The  implementation  may or may not use a common thread or thread pool to service multiple SSL objects in
       the same SSL_CTX.

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.

       This is supported via the concept of  poll  descriptors;  see  BIO_get_rpoll_descriptor(3)  for  details.
       Broadly,  a BIO_POLL_DESCRIPTOR 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 BIO_POLL_DESCRIPTOR 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.

       Broadly, an application which wishes to manage its own event loop should interact with the SSL object  as
       follows:

       •   It  should  provide  read  and write BIOs with nonblocking datagram semantics to the SSL object using
           SSL_set0_rbio(3) and SSL_set0_wbio(3). This could be a BIO  abstracting  a  network  socket  such  as
           BIO_s_datagram(3),  or  a BIO abstracting some kind of memory buffer such as BIO_s_dgram_pair(3). Use
           of a custom BIO is also possible.

       •   It should configure the SSL object into nonblocking mode by calling SSL_set_blocking_mode(3).

       •   It  should  configure  the  SSL  object  as  desired,  set  an   initial   peer   as   needed   using
           SSL_set1_initial_peer_addr(3), and trigger the connection process by calling SSL_connect(3).

       •   If  the  network  read  and write BIOs provided were pollable (for example, a BIO_s_datagram(3), or a
           custom BIO which implements BIO_get_rpoll_descriptor(3) and BIO_get_wpoll_descriptor(3)),  it  should
           perform the following steps repeatedly:

           •   The  application  should  call  SSL_get_rpoll_descriptor(3)  and  SSL_get_wpoll_descriptor(3)  to
               identify OS resources which can be used for synchronisation.

           •   It should call SSL_net_read_desired(3) and SSL_net_write_desired(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 SSL_get_event_timeout(3) to determine if any timeout
               event will become applicable in the future.

           •   It should wait until one of the following events occurs:

               •   The  poll  descriptor  returned   by   SSL_get_rpoll_descriptor(3)   becomes   readable   (if
                   SSL_net_read_desired(3) returned 1);

               •   The   poll   descriptor   returned   by   SSL_get_wpoll_descriptor(3)  becomes  writable  (if
                   SSL_net_write_desired(3) returned 1);

               •   The timeout returned by SSL_get_event_timeout(3) (if any) expires.

               Once any of these events occurs, SSL_handle_events(3) should be called.

       •   If the network read and write  BIOs  provided  were  not  pollable  (for  example,  in  the  case  of
           BIO_s_dgram_pair(3)),  the  application is responsible for managing and synchronising network I/O. It
           should call SSL_handle_events(3) after it writes data to a  BIO_s_dgram_pair(3)  or  otherwise  takes
           action  so  that  the QUIC implementation can read new datagrams via a call to BIO_recvmmsg(3) on the
           underlying network BIO. The QUIC implementation may output datagrams via a  call  to  BIO_sendmmsg(3)
           and the application is responsible for ensuring these are transmitted.

           The  application  must  call  SSL_get_event_timeout(3)  after  every call to SSL_handle_events(3) (or
           another I/O function on the SSL object), and ensure that a call to SSL_handle_events(3) is  performed
           after the specified timeout (if any).

SEE ALSO

       SSL_handle_events(3),    SSL_get_event_timeout(3),   SSL_net_read_desired(3),   SSL_net_write_desired(3),
       SSL_get_rpoll_descriptor(3), SSL_get_wpoll_descriptor(3),  SSL_set_blocking_mode(3),  SSL_shutdown_ex(3),
       SSL_set1_initial_peer_addr(3), SSL_stream_conclude(3), SSL_stream_reset(3), SSL_get_stream_read_state(3),
       SSL_get_stream_read_error_code(3),           SSL_get_conn_close_info(3),          SSL_get0_connection(3),
       SSL_get_stream_type(3),       SSL_get_stream_id(3),       SSL_new_stream(3),        SSL_accept_stream(3),
       SSL_set_incoming_stream_policy(3),          SSL_set_default_stream_mode(3),          SSL_new_listener(3),
       SSL_new_listener_from(3),        SSL_is_listener(3),         SSL_get0_listener(3),         SSL_listen(3),
       SSL_accept_connection(3),  SSL_get_accept_connection_queue_len(3),  SSL_new_domain(3),  SSL_is_domain(3),
       SSL_get0_domain(3)

COPYRIGHT

       Copyright 2022-2025 The OpenSSL Project Authors. All Rights Reserved.

       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>.

3.5.0                                              2025-06-04                                 OPENSSL-QUIC(7SSL)