15#include <sys/socket.h>
QUIC connection abstraction (headers)
imquic_error_code
QUIC error codes.
Definition error.h:14
imquic public interface (headers)
gboolean imquic_handle_event(imquic_connection *conn)
Callback fired when the event loop has an event for a specific connection.
Definition quic.c:3958
int imquic_parse_packet(imquic_network_endpoint *socket, imquic_network_address *sender, imquic_connection **pconn, imquic_packet *pkt, uint8_t *quic, size_t bytes, size_t tot)
Parse a QUIC packet from an incoming buffer and handle it.
Definition quic.c:269
size_t imquic_payload_add_max_data(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint64_t max_data)
Helper method to add a MAX_DATA frame to a buffer.
Definition quic.c:2187
int imquic_send_keepalive(imquic_connection *conn, imquic_connection_id *dest)
Helper method to generate a packet containing a PING and send it.
Definition quic.c:2967
void imquic_sent_packet_destroy(imquic_sent_packet *sent_pkt)
Helper method to destroy an existing imquic_sent_packet instance.
Definition quic.c:261
size_t imquic_payload_parse_connection_close(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a CONNECTION_CLOSE frame, and handle it accordingly by closing the connectio...
Definition quic.c:1856
size_t imquic_payload_parse_crypto(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, enum ssl_encryption_level_t level)
Helper method to process a CRYPTO frame, and in case add all chunks to the buffer associated with the...
Definition quic.c:1252
int imquic_send_pending_datagram(imquic_connection *conn, imquic_connection_id *dest)
Helper method to generate one or more packets containing one or more DATAGRAM frames and send them.
Definition quic.c:3382
size_t imquic_payload_parse_reset_stream(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a RESET_STREAM frame.
Definition quic.c:1182
size_t imquic_transport_parameter_add_connection_id(uint8_t *bytes, size_t blen, imquic_transport_parameter param, imquic_connection_id *cid)
Helper to add a QUIC transport parameter with a Connection ID to a buffer.
Definition quic.c:2493
size_t imquic_payload_parse_ack(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, enum ssl_encryption_level_t level)
Helper method to process an ACK frame.
Definition quic.c:1035
size_t imquic_payload_parse_stop_sending(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a STOP_SENDING frame.
Definition quic.c:1219
size_t imquic_transport_parameter_add_int(uint8_t *bytes, size_t blen, imquic_transport_parameter param, uint64_t number)
Helper to add a QUIC transport parameter with a numeric value to a buffer.
Definition quic.c:2464
int imquic_send_packet(imquic_connection *conn, imquic_packet *pkt)
Send a QUIC packet to the peer.
Definition quic.c:3681
size_t imquic_payload_parse_datagram(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a DATAGRAM frame, and notify the stack about it via internal callbacks.
Definition quic.c:1907
size_t imquic_payload_add_path_response(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint8_t *data)
Helper method to add a PATH_RESPONSE frame to a buffer.
Definition quic.c:2368
int imquic_parse_transport_parameters(imquic_connection *conn, uint8_t *bytes, size_t blen)
Helper to parse a buffer containing QUIC transport parameters, and update the associated imquic_conne...
Definition quic.c:2509
size_t imquic_payload_add_crypto(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint8_t *crypto, size_t crypto_offset, size_t crypto_length)
Helper method to add a CRYPTO frame to a buffer.
Definition quic.c:2116
size_t imquic_payload_add_datagram(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint8_t *datagram, size_t datagram_length, gboolean last)
Helper method to add a DATAGRAM frame to a buffer.
Definition quic.c:2436
size_t imquic_payload_add_data_blocked(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint64_t max_data)
Helper method to add a DATA_BLOCKED frame to a buffer.
Definition quic.c:2244
const char * imquic_frame_type_str(imquic_frame_type type)
Helper function to serialize to string the name of a imquic_frame_type value.
Definition quic.c:61
void imquic_process_message(imquic_network_endpoint *socket, imquic_network_address *sender, uint8_t *quic, size_t bytes)
Process incoming data from the network we've made aware of.
Definition quic.c:3757
const char * imquic_long_packet_type_str(imquic_long_packet_type type)
Helper function to serialize to string the name of a imquic_long_packet_type value.
Definition quic.c:46
size_t imquic_payload_add_padding(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, size_t padding)
Helper method to add a PADDING frame to a buffer.
Definition quic.c:1940
int imquic_send_credits(imquic_connection *conn, imquic_connection_id *dest, imquic_frame_type type, uint64_t stream_id)
Helper method to generate a packet containing more flow control credits and send it.
Definition quic.c:2996
size_t imquic_payload_add_new_connection_id(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint64_t seqnum, uint64_t retire_prior_to, imquic_connection_id *cid, uint8_t *reset_token)
Helper method to add a NEW_CONNECTION_ID frame to a buffer.
Definition quic.c:2301
void imquic_check_incoming_stream(imquic_connection *conn)
Helper method to check if we received STREAM frames we need to go process, and handle ourselves or pa...
imquic_packet * imquic_packet_create(void)
Helper method to create a imquic_packet instance.
Definition quic.c:194
size_t imquic_payload_parse_new_token(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a NEW_TOKEN frame.
Definition quic.c:1287
void imquic_quic_deinit(void)
Uninitialize the QUIC stack.
Definition quic.c:41
int imquic_send_pending_crypto(imquic_connection *conn, imquic_connection_id *src, imquic_connection_id *dest)
Helper method to generate one or more packets containing one or more CRYPTO frames and send them.
Definition quic.c:2843
int imquic_send_ack(imquic_connection *conn, enum ssl_encryption_level_t level, imquic_connection_id *src, imquic_connection_id *dest)
Helper method to generate a packet containing an ACK and send it.
Definition quic.c:2814
void imquic_quic_init(void)
Initialize the QUIC stack at startup.
Definition quic.c:36
int imquic_packet_long_init(imquic_packet *pkt, imquic_long_packet_type type, imquic_connection_id *src, imquic_connection_id *dest)
Initialize a imquic_packet instance as a long header packet.
Definition quic.c:199
size_t imquic_payload_add_handshake_done(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to add a HANDSHAKE_DONE frame to a buffer.
Definition quic.c:2422
int imquic_send_blocked(imquic_connection *conn, imquic_connection_id *dest, imquic_frame_type type, uint64_t stream_id)
Helper method to generate a packet containing a request for more flow control credits and send it.
Definition quic.c:3094
size_t imquic_payload_add_stream_data_blocked(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint64_t stream_id, uint64_t max_data)
Helper method to add a STREAM_DATA_BLOCKED frame to a buffer.
Definition quic.c:2262
void imquic_quic_connection_remove(imquic_connection_id *cid)
Stop tracking a Connection ID associated to a connection.
Definition quic.c:29
int imquic_packet_short_init(imquic_packet *pkt, imquic_connection_id *dest)
Initialize a imquic_packet instance as a short header packet.
Definition quic.c:227
void imquic_frame_destroy(imquic_frame *frame)
Helper method to destroy an existing imquic_frame instance.
Definition quic.c:182
imquic_frame * imquic_frame_create(imquic_frame_type type, uint8_t *buffer, size_t size)
Helper method to create a imquic_frame instance.
Definition quic.c:165
size_t imquic_payload_add_stop_sending(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint64_t stream_id, uint64_t error_code)
Helper method to add a STOP_SENDING frame to a buffer.
Definition quic.c:2096
void imquic_packet_destroy(imquic_packet *pkt)
Helper method to destroy an existing imquic_packet instance.
Definition quic.c:248
imquic_transport_parameter
QUIC transport parameters.
Definition quic.h:119
@ IMQUIC_INITIAL_SOURCE_CONNECTION_ID
Definition quic.h:135
@ IMQUIC_DISABLE_ACTIVE_MIGRATION
Definition quic.h:132
@ IMQUIC_MAX_ACK_DELAY
Definition quic.h:131
@ IMQUIC_MAX_UDP_PAYLOAD_SIZE
Definition quic.h:123
@ IMQUIC_ACTIVE_CONNECTION_ID_LIMIT
Definition quic.h:134
@ IMQUIC_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL
Definition quic.h:125
@ IMQUIC_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE
Definition quic.h:126
@ IMQUIC_MAX_DATAGRAM_FRAME_SIZE
Definition quic.h:137
@ IMQUIC_INITIAL_MAX_STREAM_DATA_UNI
Definition quic.h:127
@ IMQUIC_MAX_IDLE_TIMEOUT
Definition quic.h:121
@ IMQUIC_STATELESS_RESET_TOKEN
Definition quic.h:122
@ IMQUIC_INITIAL_MAX_STREAMS_UNI
Definition quic.h:129
@ IMQUIC_INITIAL_MAX_STREAMS_BIDI
Definition quic.h:128
@ IMQUIC_PREFERRED_ADDRESS
Definition quic.h:133
@ IMQUIC_ORIGINAL_DESTINATION_CONNECTION_ID
Definition quic.h:120
@ IMQUIC_INITIAL_MAX_DATA
Definition quic.h:124
@ IMQUIC_RETRY_SOURCE_CONNECTION_ID
Definition quic.h:136
@ IMQUIC_ACK_DELAY_EXPONENT
Definition quic.h:130
size_t imquic_payload_add_retire_connection_id(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint64_t seqnum)
Helper method to add a RETIRE_CONNECTION_ID frame to a buffer.
Definition quic.c:2333
size_t imquic_payload_parse_max_data(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a MAX_DATA frame.
Definition quic.c:1508
size_t imquic_payload_add_new_token(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint8_t *token, size_t token_length)
Helper method to add a NEW_TOKEN frame to a buffer.
Definition quic.c:2138
void imquic_check_incoming_crypto(imquic_connection *conn)
Helper method to check if we received CRYPTO frames we need to go through, and in case pass them to t...
Definition quic.c:3790
int imquic_send_pending_stream(imquic_connection *conn, imquic_connection_id *dest)
Helper method to generate one or more packets containing one or more STREAM frames and send them.
Definition quic.c:3188
size_t imquic_payload_parse_stream_data_blocked(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a STREAM_DATA_BLOCKED frame.
Definition quic.c:1676
size_t imquic_payload_add_max_stream_data(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint64_t stream_id, uint64_t max_data)
Helper method to add a MAX_STREAM_DATA frame to a buffer.
Definition quic.c:2205
size_t imquic_payload_add_ping(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to add a PING frame to a buffer.
Definition quic.c:1959
size_t imquic_payload_parse_stream(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a STREAM frame, and handle it accordingly, e.g., by creating the stream loca...
Definition quic.c:1312
struct imquic_frame imquic_frame
A serialized QUIC frame.
size_t imquic_payload_add_connection_close(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, imquic_error_code error_code, imquic_frame_type frame_type, const char *reason)
Helper method to add a CONNECTION_CLOSE frame to a buffer.
Definition quic.c:2385
size_t imquic_transport_parameter_add_novalue(uint8_t *bytes, size_t blen, imquic_transport_parameter param)
Helper to add a QUIC transport parameter with no value to a buffer.
Definition quic.c:2459
int imquic_send_close_connection(imquic_connection *conn, imquic_error_code error_code, imquic_frame_type frame_type, const char *reason)
Helper method to generate a packet containing a CONNECTION_CLOSE and send it.
Definition quic.c:3456
int imquic_start_quic_client(imquic_network_endpoint *socket)
Helper to start a new client endpoint, and so attempt a connection.
Definition quic.c:3984
size_t imquic_payload_parse_path_challenge(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a PATH_CHALLENGE frame.
Definition quic.c:1820
size_t imquic_payload_parse_max_stream_data(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a MAX_STREAM_DATA frame.
Definition quic.c:1557
int imquic_retransmit_packet(imquic_connection *conn, imquic_sent_packet *sent_pkt)
Retransmit a previously sent packet.
Definition quic.c:3729
int imquic_serialize_packet(imquic_connection *conn, imquic_packet *pkt)
Serialize an imquic packet object to a QUIC packet ready to be sent, taking care of header protection...
Definition quic.c:3501
size_t imquic_payload_add_path_challenge(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint8_t *data)
Helper method to add a PATH_CHALLENGE frame to a buffer.
Definition quic.c:2351
imquic_long_packet_type
QUIC long packet types.
Definition quic.h:41
@ IMQUIC_INITIAL
Definition quic.h:42
@ IMQUIC_RETRY
Definition quic.h:45
@ IMQUIC_0RTT
Definition quic.h:43
@ IMQUIC_HANDSHAKE
Definition quic.h:44
size_t imquic_payload_parse_data_blocked(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a DATA_BLOCKED frame.
Definition quic.c:1649
size_t imquic_payload_add_stream(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint64_t stream_id, uint8_t *stream, size_t stream_offset, size_t stream_length, gboolean complete, gboolean last)
Helper method to add a STREAM frame to a buffer.
Definition quic.c:2158
size_t imquic_payload_parse_new_connection_id(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a NEW_CONNECTION_ID frame.
Definition quic.c:1751
const char * imquic_transport_parameter_str(imquic_transport_parameter param)
Helper function to serialize to string the name of a imquic_transport_parameter value.
Definition quic.c:121
struct imquic_packet imquic_packet
Abstraction of a QUIC packet.
size_t imquic_payload_parse_streams_blocked(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a STREAMS_BLOCKED frame.
Definition quic.c:1714
size_t imquic_payload_parse_retire_connection_id(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a RETIRE_CONNECTION_ID frame.
Definition quic.c:1800
int imquic_parse_frames(imquic_connection *conn, imquic_packet *pkt)
Parse QUIC frames in a QUIC message payload.
Definition quic.c:849
size_t imquic_payload_parse_max_streams(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a MAX_STREAMS frame.
Definition quic.c:1604
size_t imquic_transport_parameter_add_data(uint8_t *bytes, size_t blen, imquic_transport_parameter param, uint8_t *buf, size_t buflen)
Helper to add a QUIC transport parameter with generic data to a buffer.
Definition quic.c:2479
size_t imquic_payload_parse_path_response(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen)
Helper method to process a PATH_RESPONSE frame.
Definition quic.c:1838
size_t imquic_payload_add_ack(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, GList *received, uint64_t delay, uint64_t *ecn_counts)
Helper method to add a ACK frame to a buffer.
Definition quic.c:1973
void imquic_quic_connection_add(imquic_connection *conn, imquic_connection_id *cid)
Track a Connection ID and map it to a connection.
Definition quic.c:22
struct imquic_sent_packet imquic_sent_packet
Info on a sent packet.
size_t imquic_payload_add_max_streams(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, gboolean bidirectional, uint64_t max_streams)
Helper method to add a MAX_STREAMS frame to a buffer.
Definition quic.c:2225
size_t imquic_payload_add_reset_stream(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, uint64_t stream_id, uint64_t error_code, uint64_t final_size)
Helper method to add a RESET_STREAM frame to a buffer.
Definition quic.c:2074
size_t imquic_payload_add_streams_blocked(imquic_connection *conn, imquic_packet *pkt, uint8_t *bytes, size_t blen, gboolean bidirectional, uint64_t max_streams)
Helper method to add a STREAMS_BLOCKED frame to a buffer.
Definition quic.c:2282
imquic_frame_type
QUIC frame types.
Definition quic.h:53
@ IMQUIC_PING
Definition quic.h:55
@ IMQUIC_PATH_CHALLENGE
Definition quic.h:80
@ IMQUIC_PADDING
Definition quic.h:54
@ IMQUIC_STREAMS_BLOCKED_UNI
Definition quic.h:77
@ IMQUIC_STREAM_OF
Definition quic.h:67
@ IMQUIC_STOP_SENDING
Definition quic.h:59
@ IMQUIC_MAX_STREAM_DATA
Definition quic.h:71
@ IMQUIC_NEW_CONNECTION_ID
Definition quic.h:78
@ IMQUIC_ACK_WITH_ECN
Definition quic.h:57
@ IMQUIC_MAX_DATA
Definition quic.h:70
@ IMQUIC_STREAM_OLF
Definition quic.h:69
@ IMQUIC_RESET_STREAM
Definition quic.h:58
@ IMQUIC_ACK
Definition quic.h:56
@ IMQUIC_STREAM_DATA_BLOCKED
Definition quic.h:75
@ IMQUIC_STREAM
Definition quic.h:62
@ IMQUIC_STREAM_F
Definition quic.h:63
@ IMQUIC_STREAM_O
Definition quic.h:66
@ IMQUIC_CONNECTION_CLOSE
Definition quic.h:82
@ IMQUIC_HANDSHAKE_DONE
Definition quic.h:84
@ IMQUIC_STREAMS_BLOCKED
Definition quic.h:76
@ IMQUIC_CONNECTION_CLOSE_APP
Definition quic.h:83
@ IMQUIC_MAX_STREAMS
Definition quic.h:72
@ IMQUIC_STREAM_OL
Definition quic.h:68
@ IMQUIC_STREAM_LF
Definition quic.h:65
@ IMQUIC_DATAGRAM_L
Definition quic.h:86
@ IMQUIC_STREAM_L
Definition quic.h:64
@ IMQUIC_RETIRE_CONNECTION_ID
Definition quic.h:79
@ IMQUIC_MAX_STREAMS_UNI
Definition quic.h:73
@ IMQUIC_NEW_TOKEN
Definition quic.h:61
@ IMQUIC_DATAGRAM
Definition quic.h:85
@ IMQUIC_CRYPTO
Definition quic.h:60
@ IMQUIC_DATA_BLOCKED
Definition quic.h:74
@ IMQUIC_PATH_RESPONSE
Definition quic.h:81
QUIC STREAM abstraction (headers)
QUIC Connection ID.
Definition connection.h:32
QUIC Connection.
Definition connection.h:114
Generic fixed size data buffer.
Definition utils.h:162
A serialized QUIC frame.
Definition quic.h:96
uint8_t * buffer
Content of the frame.
Definition quic.h:100
size_t size
Size of the frame.
Definition quic.h:102
imquic_frame_type type
Frame type.
Definition quic.h:98
json_t * qlog_frame
QLOG serialization of this frame.
Definition quic.h:105
Abstraction of a network address.
Definition network.h:34
Abstraction of a network endpoint (client or server)
Definition network.h:53
Abstraction of a QUIC packet.
Definition quic.h:145
size_t frames_size
Cumulative size of all the frames.
Definition quic.h:170
json_t * qlog_frame
Last frame serialized for QLOG purposes, if needed.
Definition quic.h:175
gboolean spin_bit
Whether ths spin bit and/or the key phase bit are set in this packet (only in case longheader is FALS...
Definition quic.h:153
imquic_long_packet_type type
Type of long header packet (only in case longheader is TRUE)
Definition quic.h:155
imquic_data_fixed payload
Buffers.
Definition quic.h:182
uint64_t packet_number
QUIC packet number.
Definition quic.h:163
json_t * qlog_frames
Frames serialized for QLOG purposes, if needed.
Definition quic.h:173
imquic_connection_id destination
Destination Connection ID.
Definition quic.h:159
size_t length_offset
Offsets in the packet data to where the lenght, packet number and payload are.
Definition quic.h:165
imquic_connection_id source
Source Connection ID (only in case longheader is TRUE)
Definition quic.h:161
gboolean ack_eliciting
Whether this packet contains ACK-eliciting frames.
Definition quic.h:178
GList * frames
List of serialized frames in this packet.
Definition quic.h:168
imquic_data_fixed data
Definition quic.h:182
gboolean is_protected
Definition quic.h:147
size_t payload_offset
Definition quic.h:165
gboolean retransmit_if_lost
Whether this packet should be retransmitted if lost.
Definition quic.h:180
enum ssl_encryption_level_t level
The encryption level of this packet.
Definition quic.h:149
gboolean is_valid
Whether the packet is valid, (still) protected, and (still) encrypted.
Definition quic.h:147
gboolean longheader
Whether this packet uses a long or short header.
Definition quic.h:151
gboolean key_phase
Definition quic.h:153
uint32_t version
QUIC version in the packet (only in case longheader is TRUE)
Definition quic.h:157
size_t pkn_offset
Definition quic.h:165
gboolean is_encrypted
Definition quic.h:147
Info on a sent packet.
Definition quic.h:206
int64_t sent_time
Monotonic time of when this packet was sent.
Definition quic.h:218
uint64_t packet_number
Packet number.
Definition quic.h:214
size_t packet_size
Packet size in bytes.
Definition quic.h:216
enum ssl_encryption_level_t level
The encryption level of this packet.
Definition quic.h:212
gboolean ack_eliciting
Whether this packet contained ACK-eliciting frames.
Definition quic.h:220
imquic_connection * conn
Connection this packet was sent on.
Definition quic.h:208
imquic_packet * packet
imquic_packet instance, in case we need it for retransmissions
Definition quic.h:210
Generic utilities (headers)