Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
transport_params.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2024, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5#pragma once
6
9
10#include <array>
11#include <cstdint>
12#include <optional>
13#include <span>
14#include <vector>
15
17{
18
22namespace transport_param_id
23{
24 constexpr uint64_t original_destination_connection_id = 0x00;
25 constexpr uint64_t max_idle_timeout = 0x01;
26 constexpr uint64_t stateless_reset_token = 0x02;
27 constexpr uint64_t max_udp_payload_size = 0x03;
28 constexpr uint64_t initial_max_data = 0x04;
29 constexpr uint64_t initial_max_stream_data_bidi_local = 0x05;
30 constexpr uint64_t initial_max_stream_data_bidi_remote = 0x06;
31 constexpr uint64_t initial_max_stream_data_uni = 0x07;
32 constexpr uint64_t initial_max_streams_bidi = 0x08;
33 constexpr uint64_t initial_max_streams_uni = 0x09;
34 constexpr uint64_t ack_delay_exponent = 0x0a;
35 constexpr uint64_t max_ack_delay = 0x0b;
36 constexpr uint64_t disable_active_migration = 0x0c;
37 constexpr uint64_t preferred_address = 0x0d;
38 constexpr uint64_t active_connection_id_limit = 0x0e;
39 constexpr uint64_t initial_source_connection_id = 0x0f;
40 constexpr uint64_t retry_source_connection_id = 0x10;
41} // namespace transport_param_id
42
46namespace transport_param_error
47{
48 constexpr int invalid_parameter = -720;
49 constexpr int decode_error = -721;
50 constexpr int duplicate_parameter = -722;
51 constexpr int missing_required_parameter = -723;
52 constexpr int invalid_value = -724;
53} // namespace transport_param_error
54
60{
61 std::array<uint8_t, 4> ipv4_address{};
62 uint16_t ipv4_port{0};
63 std::array<uint8_t, 16> ipv6_address{};
64 uint16_t ipv6_port{0};
66 std::array<uint8_t, 16> stateless_reset_token{};
67
69 [[nodiscard]] auto operator==(const preferred_address_info& other) const -> bool
70 {
71 return ipv4_address == other.ipv4_address && ipv4_port == other.ipv4_port &&
72 ipv6_address == other.ipv6_address && ipv6_port == other.ipv6_port &&
74 stateless_reset_token == other.stateless_reset_token;
75 }
76};
77
86{
87 // ========================================================================
88 // Connection IDs (only set by server or during retry)
89 // ========================================================================
90
92 std::optional<connection_id> original_destination_connection_id;
93
95 std::optional<connection_id> initial_source_connection_id;
96
98 std::optional<connection_id> retry_source_connection_id;
99
101 std::optional<std::array<uint8_t, 16>> stateless_reset_token;
102
103 // ========================================================================
104 // Timing Parameters
105 // ========================================================================
106
108 uint64_t max_idle_timeout{0};
109
112
114 uint64_t max_ack_delay{25};
115
116 // ========================================================================
117 // Flow Control Parameters
118 // ========================================================================
119
121 uint64_t max_udp_payload_size{65527};
122
124 uint64_t initial_max_data{0};
125
128
131
134
135 // ========================================================================
136 // Stream Limits
137 // ========================================================================
138
141
144
145 // ========================================================================
146 // Connection Options
147 // ========================================================================
148
151
154
156 std::optional<preferred_address_info> preferred_address;
157
158 // ========================================================================
159 // Encoding / Decoding
160 // ========================================================================
161
166 [[nodiscard]] auto encode() const -> std::vector<uint8_t>;
167
173 [[nodiscard]] static auto decode(std::span<const uint8_t> data)
175
176 // ========================================================================
177 // Validation
178 // ========================================================================
179
185 [[nodiscard]] auto validate(bool is_server) const -> VoidResult;
186
190 void apply_defaults();
191
192 // ========================================================================
193 // Comparison
194 // ========================================================================
195
196 [[nodiscard]] auto operator==(const transport_parameters& other) const -> bool = default;
197};
198
204
210
211} // namespace kcenon::network::protocols::quic
QUIC Connection ID (RFC 9000 Section 5.1)
connection_id()=default
Default constructor creates an empty connection ID.
QUIC connection identifier type.
auto make_default_client_params() -> transport_parameters
Create default client transport parameters.
auto make_default_server_params() -> transport_parameters
Create default server transport parameters.
Network-specific error and result type definitions.
QUIC preferred address transport parameter (RFC 9000 Section 18.2)
auto operator==(const preferred_address_info &other) const -> bool
Equality comparison.
QUIC transport parameters (RFC 9000 Section 18)
std::optional< connection_id > retry_source_connection_id
Retry Source Connection ID (server only, after Retry)
uint64_t max_idle_timeout
Maximum idle timeout in milliseconds (0 = disabled)
uint64_t initial_max_data
Initial maximum data for connection (default: 0)
uint64_t ack_delay_exponent
ACK delay exponent (default: 3, meaning 8 microseconds)
uint64_t initial_max_streams_uni
Initial maximum unidirectional streams.
std::optional< std::array< uint8_t, 16 > > stateless_reset_token
Stateless reset token (server only, 16 bytes)
void apply_defaults()
Apply default values for unset parameters.
auto encode() const -> std::vector< uint8_t >
Encode transport parameters to binary format.
bool disable_active_migration
Whether active connection migration is disabled.
auto validate(bool is_server) const -> VoidResult
Validate transport parameters.
uint64_t initial_max_streams_bidi
Initial maximum bidirectional streams.
uint64_t max_udp_payload_size
Maximum UDP payload size (default: 65527)
uint64_t initial_max_stream_data_bidi_remote
Initial maximum data for remotely-initiated bidirectional streams.
std::optional< preferred_address_info > preferred_address
Preferred address for migration (server only)
static auto decode(std::span< const uint8_t > data) -> Result< transport_parameters >
Decode transport parameters from binary format.
std::optional< connection_id > initial_source_connection_id
Initial Source Connection ID.
uint64_t max_ack_delay
Maximum ACK delay in milliseconds (default: 25)
uint64_t active_connection_id_limit
Maximum number of connection IDs from the peer.
std::optional< connection_id > original_destination_connection_id
Original Destination Connection ID (server only)
uint64_t initial_max_stream_data_bidi_local
Initial maximum data for locally-initiated bidirectional streams.
uint64_t initial_max_stream_data_uni
Initial maximum data for unidirectional streams.