Skip to main content

C++ QUIC API Reference

Preliminaries

The declarations are all in tquic.h, so you just need to include it in each source file:

#include <tquic.h>

Common types

The TQUIC library defines several types that are commonly used by its public functions.

TypesDescription
quic_config_tThe behavior of the library can be managed through various settings specified in the quic_config_t.
quic_endpoint_tEndpoint is an entity that can participate in a QUIC connection by generating, receiving, and processing QUIC packets. Endpoint may maintain one or more QUIC connections.
quic_connection_tQUIC connection.
quic_transport_handler_tThe context provided by the user's code.
quic_transport_methods_tThe structure lists the callbacks used by the endpoint for interaction with the user code.
quic_packet_out_specData and metadata of a outbound packet.

Configurations

QUIC configurations initialization

quic_config_new

struct quic_config_t *quic_config_new(void);
  • Create an instance of quic_config_t and initialize it with default configuration. The caller is responsible for the memory of the Config and should properly destroy it by calling quic_config_free.

quic_config_free

void quic_config_free(struct quic_config_t *config);
  • Destroy QUIC configuration

QUIC configurations customization

quic_config_set_max_idle_timeout

void quic_config_set_max_idle_timeout(struct quic_config_t *config,
uint64_t v);
  • Set the max_idle_timeout transport parameter in milliseconds.
  • The default value is set to 0, which means that idle timeout is disabled by default.

quic_config_set_max_udp_payload_size

void quic_config_set_max_udp_payload_size(struct quic_config_t *config,
uint16_t v);
  • Set the max_udp_payload_size transport parameter in bytes. It limits the size of UDP payloads that the endpoint is willing to receive.
  • The default value is 65527.

quic_config_set_initial_max_data

void quic_config_set_initial_max_data(struct quic_config_t *config,
uint64_t v);
  • Set the initial_max_data transport parameter in bytes. It means the initial value for the maximum amount of data that can be sent on the connection.
  • The value is capped by the setting max_connection_window.
  • The default value is 10485760 (10 MB).

quic_config_set_initial_max_stream_data_bidi_local

void quic_config_set_initial_max_stream_data_bidi_local(struct quic_config_t *config,
uint64_t v);
  • Set the initial_max_stream_data_bidi_local transport parameter in bytes.
  • The value is capped by the setting max_stream_window.
  • The default value is 5242880 (5 MB).

quic_config_set_initial_max_stream_data_bidi_remote

void quic_config_set_initial_max_stream_data_bidi_remote(struct quic_config_t *config,
uint64_t v);
  • Set the initial_max_stream_data_bidi_remote transport parameter in bytes.
  • The value is capped by the setting max_stream_window.
  • The default value is 2097152 (2 MB).

quic_config_set_initial_max_stream_data_uni

void quic_config_set_initial_max_stream_data_uni(struct quic_config_t *config,
uint64_t v);
  • Set the initial_max_stream_data_uni transport parameter in bytes.
  • The value is capped by the setting max_stream_window.
  • The default value is 1048576 (1 MB).

quic_config_set_initial_max_streams_bidi

void quic_config_set_initial_max_streams_bidi(struct quic_config_t *config,
uint64_t v);
  • Set the initial_max_streams_bidi transport parameter.
  • The default value is 200.

quic_config_set_initial_max_streams_uni

void quic_config_set_initial_max_streams_uni(struct quic_config_t *config,
uint64_t v);
  • Set the initial_max_streams_uni transport parameter.
  • The default value is 100.

quic_config_set_ack_delay_exponent

void quic_config_set_ack_delay_exponent(struct quic_config_t *config,
uint64_t v);
  • Set the ack_delay_exponent transport parameter.
  • The default value is 3.

quic_config_set_max_ack_delay

void quic_config_set_max_ack_delay(struct quic_config_t *config,
uint64_t v);
  • Set the max_ack_delay transport parameter in milliseconds.
  • The default value is 25.

quic_config_set_congestion_control_algorithm

void quic_config_set_congestion_control_algorithm(struct quic_config_t *config,
enum quic_congestion_control_algorithm v);
  • Set congestion control algorithm that the connection would use.
  • The default value is QUIC_CONGESTION_CONTROL_ALGORITHM_CUBIC.

quic_config_set_initial_congestion_window

void quic_config_set_initial_congestion_window(struct quic_config_t *config, uint64_t v);
  • Set the initial congestion window in packets.
  • The default value is 10.

quic_config_set_min_congestion_window

void quic_config_set_min_congestion_window(struct quic_config_t *config, uint64_t v);
  • Set the minimal congestion window in packets.
  • The default value is 2.

quic_config_set_slow_start_thresh

void quic_config_set_slow_start_thresh(struct quic_config_t *config, uint64_t v);
  • Set the threshold for slow start in packets.
  • The default value is the maximum value of u64.

quic_config_set_bbr_probe_rtt_duration

void quic_config_set_bbr_probe_rtt_duration(struct quic_config_t *config, uint64_t v);
  • Set the minimum duration for BBR ProbeRTT state in milliseconds.
  • The default value is 200 milliseconds.

quic_config_enable_bbr_probe_rtt_based_on_bdp

void quic_config_enable_bbr_probe_rtt_based_on_bdp(struct quic_config_t *config, bool v);
  • Enable using a cwnd based on bdp during ProbeRTT state.
  • The default value is false.

quic_config_set_bbr_probe_bw_cwnd_gain

void quic_config_set_bbr_probe_rtt_cwnd_gain(struct quic_config_t *config, double v);
  • Set the cwnd gain for BBR ProbeRTT state.
  • The default value is 0.75.

quic_config_set_bbr_rtprop_filter_len

void quic_config_set_bbr_rtprop_filter_len(struct quic_config_t *config, uint64_t v);
  • Set the length of the BBR RTProp min filter window in milliseconds.
  • The default value is 10000 milliseconds.

quic_config_set_bbr_probe_bw_cwnd_gain

void quic_config_set_bbr_probe_bw_cwnd_gain(struct quic_config_t *config, double v);
  • Set the cwnd gain for BBR ProbeBW state.
  • The default value is 2.0.

quic_config_set_copa_slow_start_delta

void quic_config_set_copa_slow_start_delta(struct quic_config_t *config, double v);
  • Set the delta in copa slow start state.

quic_config_set_copa_steady_delta

void quic_config_set_copa_steady_delta(struct quic_config_t *config, double v);
  • Set the delta in coap steady state.

quic_config_enable_copa_use_standing_rtt

void quic_config_enable_copa_use_standing_rtt(struct quic_config_t *config, bool v);
  • Enable Using the RTT Standing instead of the latest RTT to calculate queueing delay.

quic_config_set_initial_rtt

void quic_config_set_initial_rtt(struct quic_config_t *config, uint64_t v);
  • Set the initial RTT in milliseconds.
  • The default value is 333 ms.
note

The configuration should be changed with caution. Setting a value less than the default will cause retransmission of handshake packets to be more aggressive.

quic_config_set_pto_linear_factor

void quic_config_set_pto_linear_factor(struct quic_config_t *config, uint64_t v);
  • Set the linear factor for calculating the probe timeout. The endpoint do not backoff the first v consecutive probe timeouts.
  • The default value is 0.

quic_config_set_max_pto

void quic_config_set_max_pto(struct quic_config_t *config, uint64_t v);
  • Set the upper limit of probe timeout in milliseconds. A Probe Timeout (PTO) triggers the sending of one or two probe datagrams and enables a connection to recover from loss of tail packets or acknowledgments. See RFC 9002 Section 6.2.
  • The probe timeout value has no limit by default.

quic_config_set_active_connection_id_limit

void quic_config_set_active_connection_id_limit(struct quic_config_t *config,
uint64_t v);
  • Set the active_connection_id_limit transport parameter.
  • The default value is 2. Lower values will be ignored.

quic_config_enable_multipath

void quic_config_enable_multipath(struct quic_config_t *config, bool enabled);
  • Set the enable_multipath transport parameter.
  • The default value is false. (Experimental)

quic_config_set_multipath_algorithm

void quic_config_set_multipath_algorithm(struct quic_config_t *config, enum MultipathAlgorithm v);
  • Set the multipath scheduling algorithm
  • The default value is MultipathAlgorithm::MinRtt

quic_config_set_max_connection_window

void quic_config_set_max_connection_window(struct quic_config_t *config,
uint64_t v);
  • Set the maximum size of the connection flow control window in bytes.
  • The default value is 25165824 (24 MB).

quic_config_set_max_stream_window

void quic_config_set_max_stream_window(struct quic_config_t *config,
uint64_t v);
  • Set the maximum size of the stream flow control window in bytes.
  • The value should not be greater than the setting max_connection_window.
  • The default value is 16777216 (16MB).

quic_config_set_max_concurrent_conns

void quic_config_set_max_concurrent_conns(struct quic_config_t *config,
uint32_t v);
  • Set the Maximum number of concurrent connections.
  • The default value is 1000000

quic_config_set_reset_token_key

int quic_config_set_reset_token_key(struct quic_config_t *config,
const uint8_t *token_key,
size_t token_key_len);
  • Set the key for reset token generation. The token_key_len should be not less than 64.
  • The default value is random bytes

quic_config_set_address_token_lifetime

void quic_config_set_address_token_lifetime(struct quic_config_t *config,
uint64_t seconds);
  • Set the lifetime in seconds of address token.
  • The default value is 86400 (1 Day)

quic_config_set_address_token_key

int quic_config_set_address_token_key(struct quic_config_t *config,
const uint8_t *token_keys,
size_t token_keys_len);
  • Set the key for address token generation. The token_key_len should be a multiple of 16.
  • The default value is random bytes

quic_config_enable_retry

void quic_config_enable_retry(struct quic_config_t *config,
bool enabled);
  • Set whether stateless retry is allowed.
  • Default is not allowed.

quic_config_set_cid_len

void quic_config_set_cid_len(struct quic_config_t *config,
uint8_t v);
  • Set the length of source cid. The length should not be greater than 20.
  • The default value is 8.

quic_config_set_send_batch_size

void quic_config_set_send_batch_size(struct quic_config_t *config,
uint16_t v);
  • Set the batch size for sending packets.
  • The default value is 64.

quic_config_set_zerortt_buffer_size

void quic_config_set_zerortt_buffer_size(struct quic_config_t *config, uint16_t v);
  • Set the buffer size for disordered zerortt packets on the server.
  • The default value is 1000. A value of 0 will be treated as default value.
  • Applicable to Server only.

quic_config_set_max_undecryptable_packets

void quic_config_set_max_undecryptable_packets(struct quic_config_t *config, uint16_t v);
  • Set the maximum number of undecryptable packets that can be stored by one connection.
  • The default value is 10. A value of 0 will be treated as default value.

quic_config_enable_encryption

void quic_config_enable_encryption(struct quic_config_t *config, bool v);
  • Enable or disable encryption on 1-RTT packets. (Experimental)
  • The default value is true.
note

The The disable_1rtt_encryption extension is not meant to be used for any practical application protocol on the open internet.

quic_config_set_tls_config

void quic_config_set_tls_config(struct quic_config_t *config, struct quic_tls_config_t *tls_config);
  • Set TLS config.

quic_config_set_tls_selector

void quic_config_set_tls_selector(struct quic_config_t *config,
const struct quic_tls_config_select_methods_t *methods,
quic_tls_config_select_context_t context);
  • Set TLS config selector.

TLS configurations initialization

quic_tls_config_new

struct quic_tls_config_t *quic_tls_config_new(void);
  • Create a new TlsConfig.
  • The caller is responsible for the memory of the TlsConfig and should properly destroy it by calling quic_tls_config_free.

quic_tls_config_new_with_ssl_ctx

struct quic_tls_config_t *quic_tls_config_new_with_ssl_ctx(SSL_CTX *ssl_ctx);
  • Create a new TlsConfig with SSL_CTX.
  • The caller is responsible for the memory of TlsConfig and SSL_CTX when use this function.
tip

It is recommended to use quic_tls_config_new to create a TLS configuration.

note

When create a TlsConfig from raw SSL_CTX, quic_conn_session() and quic_conn_set_keylog() won't take effect. Instead, you should use BoringSSL's SSL_CTX_sess_set_new_cb() and SSL_CTX_set_keylog_callback().

quic_tls_config_free

void quic_tls_config_free(struct quic_tls_config_t *tls_config);
  • Destroy a TlsConfig instance.

TLS configurations customization

quic_tls_config_set_certificate_file

int quic_tls_config_set_certificate_file(struct quic_tls_config_t *tls_config,
const char *cert_file);
  • Set the PEM-encoded certificate file.

quic_tls_config_set_private_key_file

int quic_tls_config_set_private_key_file(struct quic_tls_config_t *tls_config,
const char *key_file);
  • Set the PEM-encoded private key file.

quic_tls_config_set_ca_certs

int quic_tls_config_set_ca_certs(struct quic_tls_config_t *tls_config, const char *ca_path);
  • Set CA certificates.

quic_tls_config_set_verify

void quic_tls_config_set_verify(struct quic_tls_config_t *tls_config, bool verify);
  • Set the certificate verification behavior.

quic_tls_config_set_early_data_enabled

void quic_tls_config_set_early_data_enabled(struct quic_tls_config_t *tls_config, bool enable);
  • Set whether early data is allowed.

quic_tls_config_set_application_protos

int quic_tls_config_set_application_protos(struct quic_tls_config_t *tls_config,
const char *const *protos,
intptr_t proto_num);
  • Set the list of supported application protocols.

quic_tls_config_set_ticket_key

int quic_tls_config_set_ticket_key(struct quic_tls_config_t *tls_config,
const uint8_t *ticket_key,
size_t ticket_key_len);
  • Set session ticket key for server.

Endpoint

Instantiation and destruction

quic_endpoint_new

struct quic_endpoint_t *quic_endpoint_new(struct quic_config_t *config,
bool is_server,
const struct quic_transport_methods_t *handler_methods,
quic_transport_context_t handler_ctx,
const struct quic_packet_send_methods_t *sender_methods,
quic_packet_send_context_t sender_ctx);
  • Create a QUIC endpoint. The caller is responsible for the memory of the Endpoint and properly destroy it by calling quic_endpoint_free.
note

The endpoint doesn't own the underlying resources provided by the C caller. It is the responsibility of the caller to ensure that these resources outlive the endpoint and release them correctly.

quic_endpoint_free

void quic_endpoint_free(struct quic_endpoint_t *endpoint);
  • Destroy a QUIC endpoint.

Receiving Packets

quic_endpoint_recv

int quic_endpoint_recv(struct quic_endpoint_t *endpoint,
uint8_t *buf,
size_t buf_len,
const struct quic_packet_info_t *info);
  • Incoming UDP datagrams are supplied to the endpoint using quic_endpoint_recv(). The endpoint may find an existing connection for the packet and deliver it to the connection, create a new connection, or respond with a version negotiation packet or stateless reset packet.

Sending Packets

on_packets_send

typedef struct quic_packet_send_methods_t {
int (*on_packets_send)(void *psctx,
struct quic_packet_out_spec_t *pkts,
unsigned int count);
} quic_packet_send_methods_t;
  • The user specifies a mandatory callback, on_packets_send, in the quic_packet_send_methods_t structure that the endpoint utilizes for sending packets.

  • The callback is called when the connection is sending packets out.

  • On success, it returns the number of packets sent. If this is less than count, the connection will retry with a further on_packets_send() call to send the remaining packets.

Timeout events

quic_endpoint_timeout

uint64_t quic_endpoint_timeout(const struct quic_endpoint_t *endpoint);
  • Return the amount of time in milliseconds until the next timeout event.

quic_endpoint_on_timeout

void quic_endpoint_on_timeout(struct quic_endpoint_t *endpoint);
  • Process timeout events on the endpoint.

Internal events

quic_endpoint_process_connections

int quic_endpoint_process_connections(struct quic_endpoint_t *endpoint);
  • Process internal events of all tickable connections.

Transport Callbacks

The quic_transport_methods_t lists the callbacks used by the endpoint to communicate with the user code.

on_conn_created

typedef struct quic_transport_methods_t {
void (*on_conn_created)(void *tctx,
struct quic_conn_t *conn);
/* ... */
} quic_transport_methods_t;
  • on_conn_created is called when a new connection has been created. This callback is called as soon as connection object is created inside the endpoint, but before the handshake is done. This callback is optional.

on_conn_established

typedef struct quic_transport_methods_t {
void (*on_conn_established)(void *tctx,
struct quic_conn_t *conn);
/* ... */
} quic_transport_methods_t;
  • on_conn_established is called when the handshake is completed. This callback is optional.

on_conn_closed

typedef struct quic_transport_methods_t {
void (*on_conn_closed)(void *tctx,
struct quic_conn_t *conn);
/* ... */
} quic_transport_methods_t;
  • on_conn_closed is called when the connection is closed. The connection is no longer accessible after this callback returns. It is a good time to clean up the connection context. This callback is optional.

on_stream_created

typedef struct quic_transport_methods_t {
void (*on_stream_created)(void *tctx,
struct quic_conn_t *conn,
uint64_t stream_id);
/* ... */
} quic_transport_methods_t;
  • on_stream_created is called when the stream is created. This callback is optional.

on_stream_readable

typedef struct quic_transport_methods_t {
void (*on_stream_readable)(void *tctx,
struct quic_conn_t *conn,
uint64_t stream_id);
/* ... */
} quic_transport_methods_t;
  • on_stream_readable is called when the stream is readable. This callback is called when either there are bytes to be read or an error is ready to be collected. This callback is optional.

on_stream_writable

typedef struct quic_transport_methods_t {
void (*on_stream_writable)(void *tctx,
struct quic_conn_t *conn,
uint64_t stream_id);
/* ... */
} quic_transport_methods_t;
  • on_stream_writable is called when the stream is writable. This callback is optional.

on_stream_closed

typedef struct quic_transport_methods_t {
void (*on_conn_closed)(void *tctx,
struct quic_conn_t *conn);
/* ... */
} quic_transport_methods_t;
  • on_stream_closed is called when the stream is closed. The stream is no longer accessible after this callback returns. It is a good time to clean up the stream context. This callback is optional.

on_new_token

typedef struct quic_transport_methods_t {
void (*on_new_token)(void *tctx,
struct quic_conn_t *conn,
const uint8_t *token,
size_t token_len);
/* ... */
} quic_transport_methods_t;
  • on_new_token is called when client receives a token in NEW_TOKEN frame. This callback is optional.

Miscellaneous functions

quic_endpoint_set_cid_generator

void quic_endpoint_set_cid_generator(struct quic_endpoint_t *endpoint,
const struct ConnectionIdGeneratorMethods *cid_gen_methods,
ConnectionIdGeneratorContext cid_gen_ctx);
  • Set the connection id generator for the endpoint.
  • By default, the random connection id generator is used.

quic_endpoint_exist_connection

bool quic_endpoint_exist_connection(struct quic_endpoint_t *endpoint,
const uint8_t *cid,
size_t cid_len);
  • Check whether the given connection exists.

quic_endpoint_get_connection

struct quic_conn_t *quic_endpoint_get_connection(struct quic_endpoint_t *endpoint, uint64_t index);
  • Get the connection by index

quic_endpoint_close

void quic_endpoint_close(struct quic_endpoint_t *endpoint, bool force);
  • Gracefully or forcibly shutdown the endpoint.
  • If force is false, cease creating new connections and wait for all active connections to close. Otherwise, forcibly close all the active connections.

Connection

Create connections

quic_endpoint_connect

int quic_endpoint_connect(struct quic_endpoint_t *endpoint,
const struct sockaddr *local,
socklen_t local_len,
const struct sockaddr *remote,
socklen_t remote_len,
const char *server_name,
const uint8_t *session,
size_t session_len,
const uint8_t *token,
size_t token_len,
uint64_t *index);
  • Create a client connection. If success, the output parameter index carrys the index of the connection.

Closing connections

quic_conn_close

int quic_conn_close(struct quic_conn_t *conn,
bool app,
uint64_t err,
const uint8_t *reason,
size_t reason_len);
  • Close the connection.

Connection Context

quic_conn_set_context

void quic_conn_set_context(struct quic_conn_t *conn,
void *data);
  • Set user context for the connection.

quic_conn_context

void *quic_conn_context(struct quic_conn_t *conn);
  • Get user context for the connection.

Connection logging and tracing

quic_conn_set_keylog

void quic_conn_set_keylog(struct quic_conn_t *conn, void (*cb)(const uint8_t *data,
size_t data_len,
void *argp), void *argp);
  • Set the callback for writing keylog.
  • cb is a callback function that will be called for each keylog.
  • data is a keylog message and argp is user-defined data that will be passed to the callback.

quic_conn_set_keylog_fd

void quic_conn_set_keylog_fd(struct quic_conn_t *conn,
int fd);
  • Set keylog file

quic_conn_set_qlog

void quic_conn_set_qlog(struct quic_conn_t *conn,
void (*cb)(const uint8_t *data, size_t data_len, void *argp),
void *argp,
const char *title,
const char *desc);
  • Set the callback for writing qlog.
  • cb is a callback function that will be called for each qlog.
  • data is a qlog message and argp is user-defined data that will be passed to the callback.
  • title and desc respectively refer to the "title" and "description" sections of qlog.

quic_conn_set_qlog_fd

void quic_conn_set_qlog_fd(struct quic_conn_t *conn,
int fd,
const char *title,
const char *desc);
  • Set qlog file

quic_conn_trace_id

void quic_conn_trace_id(struct quic_conn_t *conn,
const uint8_t **out,
size_t *out_len);
  • Return the trace id of the connection

Miscellaneous functions

quic_conn_index

uint64_t quic_conn_index(struct quic_conn_t *conn);
  • Get index of the connection.

quic_conn_is_server

bool quic_conn_is_server(struct quic_conn_t *conn);
  • Check whether the connection is a server connection.

quic_conn_is_established

bool quic_conn_is_established(struct quic_conn_t *conn);
  • Check whether the connection handshake is complete.

quic_conn_is_resumed

bool quic_conn_is_resumed(struct quic_conn_t *conn);
  • Check whether the connection is created by a resumed handshake.

quic_conn_is_in_early_data

bool quic_conn_is_in_early_data(struct quic_conn_t *conn);
  • Check whether the connection has a pending handshake that has progressed enough to send or receive early data.

quic_conn_is_multipath

bool quic_conn_is_multipath(struct quic_conn_t *conn);
  • Check whether the established connection works in multipath mode.

quic_conn_application_proto

void quic_conn_application_proto(struct quic_conn_t *conn,
const uint8_t **out,
size_t *out_len);
  • Return the negotiated application level protocol.

quic_conn_server_name

void quic_conn_server_name(struct quic_conn_t *conn,
const uint8_t **out,
size_t *out_len);
  • Return the server name in the TLS SNI extension.

quic_conn_session

void quic_conn_session(struct quic_conn_t *conn,
const uint8_t **out,
size_t *out_len);
  • Return the session data used by resumption.

quic_conn_early_data_reason

int quic_conn_early_data_reason(struct quic_conn_t *conn,
const uint8_t **out,
size_t *out_len);
  • Return details why 0-RTT was accepted or rejected.

quic_conn_is_closing

bool quic_conn_is_closing(struct quic_conn_t *conn);
  • Check whether the connection is closing.

quic_conn_is_draining

bool quic_conn_is_draining(struct quic_conn_t *conn);
  • Check whether the connection is draining.

quic_conn_is_closed

bool quic_conn_is_closed(struct quic_conn_t *conn);
  • Check whether the connection is closing.

quic_conn_is_handshake_timeout

bool quic_conn_is_handshake_timeout(struct quic_conn_t *conn);
  • Check whether the connection was closed due to handshake timeout.

quic_conn_is_idle_timeout

bool quic_conn_is_idle_timeout(struct quic_conn_t *conn);
  • Check whether the connection was closed due to idle timeout.

quic_conn_is_reset

bool quic_conn_is_reset(struct quic_conn_t *conn);
  • Check whether the connection was closed due to stateless reset.

quic_conn_peer_error

bool quic_conn_peer_error(struct quic_conn_t *conn,
bool *is_app,
uint64_t *error_code,
const uint8_t **reason,
size_t *reason_len);
  • Returns the error from the peer, if any.

quic_conn_local_error

bool quic_conn_local_error(struct quic_conn_t *conn,
bool *is_app,
uint64_t *error_code,
const uint8_t **reason,
size_t *reason_len);
  • Returns the local error, if any.

quic_conn_stats

const struct quic_conn_stats_t *quic_conn_stats(struct quic_conn_t *conn);
  • Return statistics about the connection.
typedef struct quic_conn_stats_t {
uint64_t recv_count;
uint64_t recv_bytes;
uint64_t sent_count;
uint64_t sent_bytes;
uint64_t lost_count;
uint64_t lost_bytes;
} quic_conn_stats_t;
ItemDescription
recv_countTotal number of received packets on the connection
recv_bytesTotal number of bytes received on the connection
sent_countTotal number of sent packets on the connection
sent_bytesTotal number of bytes sent on the connection
lost_countTotal number of lost packets on the connection
lost_bytesTotal number of bytes lost on the connection

Stream

Create streams

quic_stream_new

int quic_stream_new(struct quic_conn_t *conn,
uint64_t stream_id,
uint8_t urgency,
bool incremental);
  • Create a stream with specified priority.
tip

This is a low-level API for stream creation. It is recommended to use quic_stream_bidi_new for bidirectional streams or quic_stream_uni_new for unidrectional streams.

quic_stream_bidi_new

int quic_stream_bidi_new(struct quic_conn_t *conn,
uint8_t urgency,
bool incremental,
uint64_t *stream_id);
  • Create a new quic bidiectional stream with the given priority.
  • If success, the output parameter stream_id carrys the id of the created stream.

quic_stream_uni_new

int quic_stream_uni_new(struct quic_conn_t *conn,
uint8_t urgency,
bool incremental,
uint64_t *stream_id);
  • Create a new quic uniectional stream with the given priority.
  • If success, the output parameter stream_id carrys the id of the created stream.

Stream priorities

quic_stream_set_priority

int quic_stream_set_priority(struct quic_conn_t *conn,
uint64_t stream_id,
uint8_t urgency,
bool incremental);
  • Set the priority for a stream.

Stream events

To register or unregister an interest in a read or write event, use the following functions:

quic_stream_wantwrite

int quic_stream_wantwrite(struct quic_conn_t *conn,
uint64_t stream_id,
bool want);
  • Set want write flag for a stream.

quic_stream_wantread

int quic_stream_wantread(struct quic_conn_t *conn,
uint64_t stream_id,
bool want);
  • Set want read flag for a stream.

Reading from streams

quic_stream_read

ssize_t quic_stream_read(struct quic_conn_t *conn,
uint64_t stream_id,
uint8_t *out,
size_t out_len,
bool *fin);
  • Read data from a stream.

Writing to streams

quic_stream_write

ssize_t quic_stream_write(struct quic_conn_t *conn,
uint64_t stream_id,
const uint8_t *buf,
size_t buf_len,
bool fin);
  • Write data to a stream.

Closing streams

quic_stream_shutdown

int quic_stream_shutdown(struct quic_conn_t *conn,
uint64_t stream_id,
enum quic_shutdown direction,
uint64_t err);
  • Shutdown stream reading or writing.

Stream context

quic_stream_set_context

int quic_stream_set_context(struct quic_conn_t *conn,
uint64_t stream_id,
void *data);
  • Set user context for a stream.

quic_stream_context

void *quic_stream_context(struct quic_conn_t *conn,
uint64_t stream_id);

  • Return the stream’s user context.

Miscellaneous functions

quic_stream_capacity

ssize_t quic_stream_capacity(struct quic_conn_t *conn,
uint64_t stream_id);
  • Return the stream’s send capacity in bytes.

quic_stream_finished

bool quic_stream_finished(struct quic_conn_t *conn,
uint64_t stream_id);
  • Return true if all the data has been read from the stream.

Path

Create paths

quic_conn_add_path

int quic_conn_add_path(struct quic_conn_t *conn,
const struct sockaddr *local,
socklen_t local_len,
const struct sockaddr *remote,
socklen_t remote_len,
uint64_t *index);
  • Add a new path on the client connection.

Miscellaneous functions

quic_conn_active_path

bool quic_conn_active_path(const struct quic_conn_t *conn,
struct quic_path_address_t *a);
  • Return the address of the active path

quic_path_address_iter_t

struct quic_path_address_iter_t *quic_conn_paths(struct quic_conn_t *conn);
  • Return an iterator over path addresses. The caller should properly destroy it by calling quic_four_tuple_iter_free.

quic_conn_path_iter_next

bool quic_conn_path_iter_next(struct quic_path_address_iter_t *iter,
struct quic_path_address_t *a);
  • Return the address of the next path.

quic_conn_path_iter_free

void quic_conn_path_iter_free(struct quic_path_address_iter_t *iter);
  • Destroy the FourTupleIter

quic_conn_path_stats

const struct quic_path_stats_t *quic_conn_path_stats(struct quic_conn_t *conn,
const struct sockaddr *local,
socklen_t local_len,
const struct sockaddr *remote,
socklen_t remote_len);
  • Return the latest statistics about the specified path.
typedef struct quic_path_stats_t {
uint64_t recv_count;
uint64_t recv_bytes;
uint64_t sent_count;
uint64_t sent_bytes;
uint64_t lost_count;
uint64_t lost_bytes;
uint64_t acked_count;
uint64_t acked_bytes;
uint64_t init_cwnd;
uint64_t final_cwnd;
uint64_t max_cwnd;
uint64_t min_cwnd;
uint64_t max_inflight;
uint64_t loss_event_count;
uint64_t cwnd_limited_count;
uint64_t cwnd_limited_duration;
uint64_t min_rtt;
uint64_t max_rtt;
uint64_t srtt;
uint64_t rttvar;
bool in_slow_start;
uint64_t pacing_rate;
} quic_path_stats_t;
ItemDescription
recv_countThe number of QUIC packets received
recv_bytesThe number of received bytes
sent_countThe number of QUIC packets sent
sent_bytesThe number of sent bytes
lost_countThe number of QUIC packets lost
lost_bytesThe number of lost bytes
acked_countTotal number of packets acked
acked_bytesTotal number of bytes acked
init_cwndInitial congestion window in bytes
final_cwndFinal congestion window in bytes
max_cwndMaximum congestion window in bytes
min_cwndMinimum congestion window in bytes
max_inflightMaximum inflight data in bytes
loss_event_countTotal loss events
cwnd_limited_countTotal congestion window limited events
cwnd_limited_durationTotal duration of congestion windowlimited events in microseconds
min_rttMinimum roundtrip time in microseconds
max_rttMaximum roundtrip time in microseconds
srttSmoothed roundtrip time in microseconds
rttvarRoundtrip time variation in microseconds
in_slow_startWhether the congestion controller is in slow start status
pacing_ratePacing rate estimated by congestion control algorithm

Miscellaneous types and functions

Miscellaneous types

quic_transport_handler_t

typedef void *quic_transport_context_t;

typedef struct quic_transport_handler_t {
const struct quic_transport_methods_t *methods;
quic_transport_context_t context;
} quic_transport_handler_t;

quic_packet_out_spec_t

typedef struct quic_packet_out_spec_t {
const struct iovec *iov;
size_t iovlen;
const void *src_addr;
socklen_t src_addr_len;
const void *dst_addr;
socklen_t dst_addr_len;
} quic_packet_out_spec_t;
  • Outgoing packets.

quic_shutdown

typedef enum quic_shutdown {
QUIC_SHUTDOWN_READ = 0,
QUIC_SHUTDOWN_WRITE = 1,
} quic_shutdown;

  • The stream's side to shutdown.

quic_path_address_iter_t

typedef struct quic_path_address_iter_t quic_path_address_iter_t;
  • An iterator over FourTuple.

quic_congestion_control_algorithm

typedef enum quic_congestion_control_algorithm {
QUIC_CONGESTION_CONTROL_ALGORITHM_CUBIC,
QUIC_CONGESTION_CONTROL_ALGORITHM_BBR,
QUIC_CONGESTION_CONTROL_ALGORITHM_BBR3,
QUIC_CONGESTION_CONTROL_ALGORITHM_COPA,
} quic_congestion_control_algorithm;
  • Congestion control algorithms.
AlgorithmDescription
CUBICCUBIC uses a cubic function instead of a linear window increase function of the current TCP standards to improve scalability and stability under fast and long-distance networks.
BBRBBR uses recent measurements of a transport connection's delivery rate, round-trip time, and packet loss rate to build an explicit model of the network path. The model is then used to control data transmission speed and the maximum volume of data allowed in flight in the network at any time.
BBR3BBRv3 is the latest version of BBR, including various fixes and algorithm updates that reduce packet re-transmit rate and slightly improve latency. (Experimental)
COPACOPA is a tunable delay-based congestion control algorithm. COPA is based on an objective function where the trade-off between throughput and delay can be configured via a user-specified parameter. (Experimental)

quic_multipath_algorithm

typedef enum quic_multipath_algorithm {
QUIC_MULTIPATH_ALGORITHM_MIN_RTT,
QUIC_MULTIPATH_ALGORITHM_REDUNDANT,
QUIC_MULTIPATH_ALGORITHM_ROUND_ROBIN,
} quic_multipath_algorithm;
  • Multipath scheduling algorithms.
AlgorithmDescription
MIN_RTTThe scheduler sends packets over the path with the lowest smoothed RTT among all available paths. It aims to optimize throughput and achieve load balancing, making it particularly advantageous for bulk transfer applications.
REDUNDANTThe scheduler sends all packets redundantly on all available paths. It utilizes additional bandwidth to minimize latency, thereby reducing the overall flow completion time for applications with bounded bandwidth requirements that can be met by a single path. In scenarios where two paths with varying available bandwidths are present, it ensures a goodput at least equivalent to the best single path.
ROUND_ROBINThe scheduler sends packets over available paths in a round robin manner. It is only used for testing purposes.

Miscellaneous functions

quic_set_logger

void quic_set_logger(void (*cb)(const uint8_t *data, size_t data_len, void *argp),
void *argp,
const char *level);
  • Set callback for logging.
  • cb is a callback function that will be called for each log message.
  • data is a \n terminated log message and argp is user-defined data that will be passed to the callback.
  • level is a case-insensitive string used for specifying the log level. Valid values are "OFF", "ERROR", "WARN", "INFO", "DEBUG", and "TRACE". If its value is NULL or invalid, the default log level is "OFF".

quic_packet_header_info

int quic_packet_header_info(uint8_t *buf,
size_t buf_len,
uint8_t dcid_len,
bool *long_header,
uint32_t *version,
struct ConnectionId *dcid);
  • Extract the header form, version and destination connection id from the QUIC packet.