Loading...
Searching...
No Matches
connection.h
Go to the documentation of this file.
1
12
13#ifndef IMQUIC_CONNECTION_H
14#define IMQUIC_CONNECTION_H
15
16#include <stdint.h>
17
18#include <glib.h>
19
20#include "stream.h"
21#include "buffer.h"
22#include "crypto.h"
23#include "network.h"
24#include "http3.h"
25#include "error.h"
26#include "qlog.h"
27#include "utils.h"
28#include "listmap.h"
29#include "refcount.h"
30
32typedef struct imquic_connection_id {
34 uint64_t seq;
36 uint8_t id[20];
38 size_t len;
40 uint8_t token[16];
47const char *imquic_connection_id_str(imquic_connection_id *cid, char *buffer, size_t blen);
59gboolean imquic_connection_id_equal(const void *a, const void *b);
64guint imquic_connection_id_hash(gconstpointer v);
65
86
88typedef struct imquic_connection_rtt {
90 uint16_t latest;
92 uint16_t smoothed;
94 uint16_t rttvar;
96 uint16_t min;
98 int64_t first_sample;
100
112
116 char *name;
118 gboolean is_server;
120 gboolean just_started;
122 gboolean have_params;
136 enum ssl_encryption_level_t level;
140 uint64_t pkn[4];
154 GHashTable *streams, *streams_done;
169 volatile gint wakeup;
177 GList *recvd[4];
179 uint64_t largest[4];
186 int64_t largest_time[4];
189 int64_t loss_time[4];
193 uint64_t largest_acked[4];
195 gboolean send_ack[5];
201 SSL *ssl;
206 gboolean send_crypto;
224 uint8_t pto_count;
229#ifdef HAVE_QLOG
232#endif
238 gboolean should_close;
240 volatile gint closed;
242 volatile gint destroyed;
245};
246
254
258
262void imquic_connection_change_level(imquic_connection *conn, enum ssl_encryption_level_t level);
267void imquic_connection_update_rtt(imquic_connection *conn, int64_t sent_time, uint16_t ack_delay);
279gboolean imquic_connection_loss_detection_timeout(gpointer user_data);
281
285
290int imquic_connection_new_stream_id(imquic_connection *conn, gboolean bidirectional, uint64_t *stream_id);
299int imquic_connection_send_on_datagram(imquic_connection *conn, uint8_t *bytes, uint64_t length);
311int imquic_connection_send_on_stream(imquic_connection *conn, uint64_t stream_id,
312 uint8_t *bytes, uint64_t length, gboolean complete);
317void imquic_connection_notify_datagram_incoming(imquic_connection *conn, uint8_t *data, uint64_t length);
323void imquic_connection_notify_stream_incoming(imquic_connection *conn, imquic_stream *stream, uint8_t *data, uint64_t length);
327void imquic_connection_flush_stream(imquic_connection *conn, uint64_t stream_id);
332void imquic_connection_reset_stream(imquic_connection *conn, uint64_t stream_id, uint64_t error_code);
338void imquic_connection_close(imquic_connection *conn, uint64_t error_code, uint64_t frame_type, const char *reason);
340
341#endif
Buffer abstraction (headers)
void imquic_connection_change_level(imquic_connection *conn, enum ssl_encryption_level_t level)
Helper to change the current encryption level of a connection.
Definition connection.c:267
void imquic_connection_destroy(imquic_connection *conn)
Helper method to destroy an existing imquic_connection instance.
Definition connection.c:237
const char * imquic_connection_id_str(imquic_connection_id *cid, char *buffer, size_t blen)
Helper method to stringify a imquic_connection_id instance.
Definition connection.c:20
int imquic_connection_send_on_datagram(imquic_connection *conn, uint8_t *bytes, uint64_t length)
Helper method to send data on a QUIC DATAGRAM.
Definition connection.c:561
void imquic_connection_notify_stream_incoming(imquic_connection *conn, imquic_stream *stream, uint8_t *data, uint64_t length)
Helper to notify incoming STREAM data to the application.
Definition connection.c:625
GList * imquic_connection_detect_lost(imquic_connection *conn)
Helper method to detect lost packets.
Definition connection.c:469
void imquic_connection_update_rtt(imquic_connection *conn, int64_t sent_time, uint16_t ack_delay)
Helper method to update the RTT of a connection, when parsing ACKs.
Definition connection.c:286
gboolean imquic_connection_id_equal(const void *a, const void *b)
Helper method to check if two imquic_connection_id instances are actually the same Connection ID.
Definition connection.c:45
void imquic_connection_flush_stream(imquic_connection *conn, uint64_t stream_id)
Helper to flush a stream, in order to send data right away.
Definition connection.c:635
guint imquic_connection_id_hash(gconstpointer v)
Helper method to return a hash associated to a imquic_connection_id instance.
Definition connection.c:57
void imquic_connection_reset_stream(imquic_connection *conn, uint64_t stream_id, uint64_t error_code)
Helper to reset a stream, sending a RESET_STREAM.
Definition connection.c:648
imquic_connection * imquic_connection_create(imquic_network_endpoint *socket)
Helper method to create a new imquic_connection instance owned by a specific imquic_network_endpoint ...
Definition connection.c:129
int imquic_connection_send_on_stream(imquic_connection *conn, uint64_t stream_id, uint8_t *bytes, uint64_t length, gboolean complete)
Helper method to send data on a QUIC STREAM.
Definition connection.c:582
void imquic_connection_close(imquic_connection *conn, uint64_t error_code, uint64_t frame_type, const char *reason)
Helpers to close connections.
Definition connection.c:679
int imquic_connection_new_stream_id(imquic_connection *conn, gboolean bidirectional, uint64_t *stream_id)
Helper to generate a new stream ID for this connection.
Definition connection.c:513
void imquic_connection_parameters_init(imquic_connection_parameters *params)
Helper method to reset/initialize a imquic_connection_parameters instance.
Definition connection.c:67
gboolean imquic_connection_loss_detection_timeout(gpointer user_data)
Callback invoked when the loss detection timer fires.
Definition connection.c:400
void imquic_connection_notify_datagram_incoming(imquic_connection *conn, uint8_t *data, uint64_t length)
Helper to notify incoming DATAGRAM data to the application.
Definition connection.c:615
void imquic_connection_update_loss_timer(imquic_connection *conn)
Helper method to update the loss detection timer.
Definition connection.c:348
imquic_connection_id * imquic_connection_id_dup(imquic_connection_id *cid)
Helper method to duplicate (copy) a imquic_connection_id instance.
Definition connection.c:37
QUIC cryptographic utilities (headers)
QUIC errors definitions (headers)
HTTP/3 stack (WebTransport only) (headers)
Combined list and map utility (headers)
GMutex imquic_mutex
imquic mutex implementation
Definition mutex.h:18
Networking utilities (headers)
QLOG support (headers)
Reference counter mechanism.
QUIC STREAM abstraction (headers)
Buffer made of multiple chunks (possibly with gaps)
Definition buffer.h:41
Flow control tracking.
Definition connection.h:102
uint64_t remote_max_data
Definition connection.h:104
uint64_t remote_max_streams_uni
Definition connection.h:108
uint64_t in_size
Size of incoming and outgoing stream data so far.
Definition connection.h:110
uint64_t local_max_data
Current values of local and remote max_data.
Definition connection.h:104
uint64_t out_size
Definition connection.h:110
uint64_t local_max_streams_uni
Current values of local and remote unidirectional max_streams.
Definition connection.h:108
uint64_t remote_max_streams_bidi
Definition connection.h:106
uint64_t local_max_streams_bidi
Current values of local and remote bidirectional max_streams.
Definition connection.h:106
QUIC Connection ID.
Definition connection.h:32
size_t len
Size of the Connection ID.
Definition connection.h:38
uint8_t token[16]
Stateless reset token (FIXME currently unused)
Definition connection.h:40
uint64_t seq
Sequence number (FIXME currently unused)
Definition connection.h:34
QUIC Transport parameters.
Definition connection.h:67
gboolean disable_active_migration
Definition connection.h:79
uint16_t max_datagram_frame_size
Definition connection.h:70
uint16_t max_ack_delay
Definition connection.h:78
uint8_t ack_delay_exponent
Definition connection.h:77
uint64_t initial_max_stream_data_uni
Definition connection.h:74
uint64_t initial_max_data
Definition connection.h:71
uint64_t initial_max_stream_data_bidi_local
Definition connection.h:72
uint64_t initial_max_streams_uni
Definition connection.h:76
uint64_t initial_max_streams_bidi
Definition connection.h:75
uint32_t max_idle_timeout
Definition connection.h:68
uint64_t initial_max_stream_data_bidi_remote
Definition connection.h:73
uint16_t active_connection_id_limit
Definition connection.h:80
uint16_t max_udp_payload_size
Definition connection.h:69
Round Trip Time (RTT) tracking.
Definition connection.h:88
uint16_t latest
Latest RTT, in milliseconds.
Definition connection.h:90
uint16_t smoothed
Smoothed RTT.
Definition connection.h:92
uint16_t min
Minimum RTT.
Definition connection.h:96
int64_t first_sample
Monotonic time of when we we obtained the first RTT sample.
Definition connection.h:98
uint16_t rttvar
RTT variation.
Definition connection.h:94
QUIC Connection.
Definition connection.h:114
GHashTable * streams_done
Definition connection.h:154
int64_t loss_time[4]
Monotonic time of when the next packet can be considered, lost, per each encryption level.
Definition connection.h:189
gboolean current_phase
Current value of the key phase bit.
Definition connection.h:199
imquic_data alpn
ALPN.
Definition connection.h:144
imquic_source * ld_timer
Loss detection timer.
Definition connection.h:218
gboolean connected
Whether this connection has been established.
Definition connection.h:210
gboolean alpn_negotiated
Whether an ALPN has been negotiated.
Definition connection.h:208
GList * connection_ids
List of Connection IDs our peer has used.
Definition connection.h:134
imquic_listmap * blocked_streams
Listmap of blocked streams, in case we're waiting for credits.
Definition connection.h:166
gboolean should_close
Whether this connection should be closed.
Definition connection.h:238
imquic_source * loop_source
Loop source.
Definition connection.h:226
size_t ack_eliciting_in_flight[4]
Number of ACK eliciting packets in flight, for each encryption level.
Definition connection.h:181
volatile gint closed
Whether this connection has been closed.
Definition connection.h:240
imquic_network_endpoint * socket
Networking instance for this connection.
Definition connection.h:212
imquic_listmap * sent_pkts[4]
Sent packets, per each encryption level.
Definition connection.h:191
char * chosen_wt_protocol
Negotiated WebTransport protocol.
Definition connection.h:148
imquic_network_address peer
Network address of the peer.
Definition connection.h:214
imquic_http3_connection * http3
WebTransport context, if any.
Definition connection.h:216
imquic_connection_flow_control flow_control
Flow control state.
Definition connection.h:173
enum ssl_encryption_level_t level
Current encryption level.
Definition connection.h:136
char client_initial_cid_str[41]
Client Initial Connection ID as a string.
Definition connection.h:127
imquic_connection_parameters local_params
Transport parameters (local and remote)
Definition connection.h:142
imquic_connection_id remote_cid
Definition connection.h:129
uint64_t stream_next_bidi
Definition connection.h:150
imquic_buffer * crypto_out[4]
Definition connection.h:204
uint64_t largest[4]
Largest received packet numbers, for each encryption level.
Definition connection.h:179
imquic_qlog * qlog
QLOG instance, if any.
Definition connection.h:231
gboolean established
Definition connection.h:210
imquic_refcount ref
Reference counter.
Definition connection.h:244
uint64_t largest_acked[4]
Largest acked packet numbers, for each encryption level.
Definition connection.h:193
gboolean have_params
Whether we already received the peer QUIC transport parameters.
Definition connection.h:122
GHashTable * streams
Map of streams we're handling, and map of streams that are now done.
Definition connection.h:154
volatile gint wakeup
Trigger to wake the loop for this connection as part of the imquic_connection_source management.
Definition connection.h:169
imquic_connection_id new_remote_cid
New remote Connection ID.
Definition connection.h:132
imquic_protection keys[4]
Keys (protection, encryption) for each encryption level.
Definition connection.h:197
imquic_buffer * crypto_in[4]
Buffers for incoming and outgoing CRYPTO exchanges, at each encryption level.
Definition connection.h:204
uint64_t pkn[4]
Current outgoing packet number for each encryption level.
Definition connection.h:140
gboolean is_server
Whether this is a server or a client connection (inherited from the endpoint)
Definition connection.h:118
GQueue * outgoing_data
Queued data to send.
Definition connection.h:161
GList * recvd[4]
List of received packet numbers, for each encryption level.
Definition connection.h:177
int64_t largest_time[4]
Monotonic time of when we received the largest packet numbers, per each encryption level (for ACK del...
Definition connection.h:186
SSL * ssl
Encryption instance.
Definition connection.h:201
volatile gint destroyed
Whether this instance has been destroyed (reference counting)
Definition connection.h:242
uint64_t stream_next_uni
Next unidirectional and bidirectional stream we can create (as actual ID, not QUIC one)
Definition connection.h:150
imquic_data_fixed retry_token
Retry token, if any.
Definition connection.h:138
gboolean send_ack[5]
Whether we have ACKs to send for a specific encryption level.
Definition connection.h:195
gboolean send_crypto
Whether we have CRYPTO frames to send.
Definition connection.h:206
char * name
Name of this connection (for logging purposes)
Definition connection.h:116
imquic_connection_id initial_cid
Initial Connection ID.
Definition connection.h:124
imquic_connection_parameters remote_params
Definition connection.h:142
char * chosen_alpn
Negotiated ALPN.
Definition connection.h:146
gboolean just_started
Whether this connection has just started (e.g., to decide whether we need to derive initial secrets)
Definition connection.h:120
imquic_connection_id local_cid
Local and remote Connection ID.
Definition connection.h:129
GQueue * incoming_data
Queued streams to process.
Definition connection.h:156
GQueue * outgoing_datagram
Definition connection.h:161
void * user_data
User data associated to the connection (opaque to the library)
Definition connection.h:234
int64_t last_ack_eliciting_time[4]
Monotonic time of when we sent the last ACK eliciting packet, for each encryption level.
Definition connection.h:183
imquic_connection_rtt rtt
Different RTTs for this connection.
Definition connection.h:171
imquic_mutex mutex
Mutex.
Definition connection.h:236
uint32_t dgram_id_in
Incoming and outgoing datagram IDs.
Definition connection.h:228
imquic_source * idle_timer
Idle timer.
Definition connection.h:222
int64_t last_activity
Monotonic time of when we last got activity.
Definition connection.h:220
uint32_t dgram_id_out
Definition connection.h:228
uint8_t pto_count
PTO count.
Definition connection.h:224
Generic fixed size data buffer.
Definition utils.h:162
Generic data buffer.
Definition utils.h:141
HTTP/3 connection abstraction.
Definition http3.h:140
Utility that implements a list and a map at the same time.
Definition listmap.h:30
Abstraction of a network address.
Definition network.h:34
Abstraction of a network endpoint (client or server)
Definition network.h:53
Protection context in both directions for a specific encryption level in a QUIC connection.
Definition crypto.h:102
QLOG instance.
Definition qlog.h:49
Definition refcount.h:77
Event source base.
Definition loop.h:34
QUIC stream.
Definition stream.h:41
Generic utilities (headers)