Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
frame.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
7#include "frame_types.h"
9
10#include <span>
11#include <utility>
12#include <vector>
13
15{
16
25{
26public:
32 [[nodiscard]] static auto parse(std::span<const uint8_t> data)
34
40 [[nodiscard]] static auto parse_all(std::span<const uint8_t> data)
42
48 [[nodiscard]] static auto peek_type(std::span<const uint8_t> data)
50
51private:
52 // Individual frame parsers
53 [[nodiscard]] static auto parse_padding(std::span<const uint8_t> data)
55
56 [[nodiscard]] static auto parse_ping(std::span<const uint8_t> data)
58
59 [[nodiscard]] static auto parse_ack(std::span<const uint8_t> data, bool has_ecn)
61
62 [[nodiscard]] static auto parse_reset_stream(std::span<const uint8_t> data)
64
65 [[nodiscard]] static auto parse_stop_sending(std::span<const uint8_t> data)
67
68 [[nodiscard]] static auto parse_crypto(std::span<const uint8_t> data)
70
71 [[nodiscard]] static auto parse_new_token(std::span<const uint8_t> data)
73
74 [[nodiscard]] static auto parse_stream(std::span<const uint8_t> data, uint8_t flags)
76
77 [[nodiscard]] static auto parse_max_data(std::span<const uint8_t> data)
79
80 [[nodiscard]] static auto parse_max_stream_data(std::span<const uint8_t> data)
82
83 [[nodiscard]] static auto parse_max_streams(std::span<const uint8_t> data, bool bidi)
85
86 [[nodiscard]] static auto parse_data_blocked(std::span<const uint8_t> data)
88
89 [[nodiscard]] static auto parse_stream_data_blocked(std::span<const uint8_t> data)
91
92 [[nodiscard]] static auto parse_streams_blocked(std::span<const uint8_t> data, bool bidi)
94
95 [[nodiscard]] static auto parse_new_connection_id(std::span<const uint8_t> data)
97
98 [[nodiscard]] static auto parse_retire_connection_id(std::span<const uint8_t> data)
100
101 [[nodiscard]] static auto parse_path_challenge(std::span<const uint8_t> data)
103
104 [[nodiscard]] static auto parse_path_response(std::span<const uint8_t> data)
106
107 [[nodiscard]] static auto parse_connection_close(std::span<const uint8_t> data,
108 bool is_app)
110
111 [[nodiscard]] static auto parse_handshake_done(std::span<const uint8_t> data)
113};
114
122{
123public:
129 [[nodiscard]] static auto build(const frame& f) -> std::vector<uint8_t>;
130
136 [[nodiscard]] static auto build_padding(size_t count = 1) -> std::vector<uint8_t>;
137
142 [[nodiscard]] static auto build_ping() -> std::vector<uint8_t>;
143
149 [[nodiscard]] static auto build_ack(const ack_frame& f) -> std::vector<uint8_t>;
150
156 [[nodiscard]] static auto build_reset_stream(const reset_stream_frame& f)
157 -> std::vector<uint8_t>;
158
164 [[nodiscard]] static auto build_stop_sending(const stop_sending_frame& f)
165 -> std::vector<uint8_t>;
166
172 [[nodiscard]] static auto build_crypto(const crypto_frame& f) -> std::vector<uint8_t>;
173
179 [[nodiscard]] static auto build_new_token(const new_token_frame& f)
180 -> std::vector<uint8_t>;
181
188 [[nodiscard]] static auto build_stream(const stream_frame& f,
189 bool include_length = true)
190 -> std::vector<uint8_t>;
191
197 [[nodiscard]] static auto build_max_data(const max_data_frame& f)
198 -> std::vector<uint8_t>;
199
205 [[nodiscard]] static auto build_max_stream_data(const max_stream_data_frame& f)
206 -> std::vector<uint8_t>;
207
213 [[nodiscard]] static auto build_max_streams(const max_streams_frame& f)
214 -> std::vector<uint8_t>;
215
221 [[nodiscard]] static auto build_data_blocked(const data_blocked_frame& f)
222 -> std::vector<uint8_t>;
223
229 [[nodiscard]] static auto build_stream_data_blocked(const stream_data_blocked_frame& f)
230 -> std::vector<uint8_t>;
231
237 [[nodiscard]] static auto build_streams_blocked(const streams_blocked_frame& f)
238 -> std::vector<uint8_t>;
239
245 [[nodiscard]] static auto build_new_connection_id(const new_connection_id_frame& f)
246 -> std::vector<uint8_t>;
247
253 [[nodiscard]] static auto build_retire_connection_id(const retire_connection_id_frame& f)
254 -> std::vector<uint8_t>;
255
261 [[nodiscard]] static auto build_path_challenge(const path_challenge_frame& f)
262 -> std::vector<uint8_t>;
263
269 [[nodiscard]] static auto build_path_response(const path_response_frame& f)
270 -> std::vector<uint8_t>;
271
277 [[nodiscard]] static auto build_connection_close(const connection_close_frame& f)
278 -> std::vector<uint8_t>;
279
284 [[nodiscard]] static auto build_handshake_done() -> std::vector<uint8_t>;
285
286private:
287 // Helper to append varint-encoded value
288 static void append_varint(std::vector<uint8_t>& buffer, uint64_t value);
289
290 // Helper to append raw bytes
291 static void append_bytes(std::vector<uint8_t>& buffer,
292 std::span<const uint8_t> data);
293};
294
295} // namespace kcenon::network::protocols::quic
Builder for QUIC frames (RFC 9000 Section 12)
Definition frame.h:122
static auto build_path_response(const path_response_frame &f) -> std::vector< uint8_t >
Build PATH_RESPONSE frame.
Definition frame.cpp:1164
static auto build_streams_blocked(const streams_blocked_frame &f) -> std::vector< uint8_t >
Build STREAMS_BLOCKED frame.
Definition frame.cpp:1114
static auto build_reset_stream(const reset_stream_frame &f) -> std::vector< uint8_t >
Build RESET_STREAM frame.
Definition frame.cpp:994
static auto build_stream(const stream_frame &f, bool include_length=true) -> std::vector< uint8_t >
Build STREAM frame.
Definition frame.cpp:1035
static auto build_stop_sending(const stop_sending_frame &f) -> std::vector< uint8_t >
Build STOP_SENDING frame.
Definition frame.cpp:1005
static auto build_ack(const ack_frame &f) -> std::vector< uint8_t >
Build ACK frame.
Definition frame.cpp:950
static auto build_padding(size_t count=1) -> std::vector< uint8_t >
Build PADDING frame.
Definition frame.cpp:940
static auto build_max_stream_data(const max_stream_data_frame &f) -> std::vector< uint8_t >
Build MAX_STREAM_DATA frame.
Definition frame.cpp:1074
static auto build_data_blocked(const data_blocked_frame &f) -> std::vector< uint8_t >
Build DATA_BLOCKED frame.
Definition frame.cpp:1095
static auto build_new_token(const new_token_frame &f) -> std::vector< uint8_t >
Build NEW_TOKEN frame.
Definition frame.cpp:1025
static auto build_max_data(const max_data_frame &f) -> std::vector< uint8_t >
Build MAX_DATA frame.
Definition frame.cpp:1065
static auto build_ping() -> std::vector< uint8_t >
Build PING frame.
Definition frame.cpp:945
static auto build_new_connection_id(const new_connection_id_frame &f) -> std::vector< uint8_t >
Build NEW_CONNECTION_ID frame.
Definition frame.cpp:1125
static auto build_crypto(const crypto_frame &f) -> std::vector< uint8_t >
Build CRYPTO frame.
Definition frame.cpp:1015
static auto build(const frame &f) -> std::vector< uint8_t >
Build any frame from variant.
Definition frame.cpp:891
static void append_bytes(std::vector< uint8_t > &buffer, std::span< const uint8_t > data)
Definition frame.cpp:885
static auto build_path_challenge(const path_challenge_frame &f) -> std::vector< uint8_t >
Build PATH_CHALLENGE frame.
Definition frame.cpp:1155
static auto build_connection_close(const connection_close_frame &f) -> std::vector< uint8_t >
Build CONNECTION_CLOSE frame.
Definition frame.cpp:1173
static auto build_handshake_done() -> std::vector< uint8_t >
Build HANDSHAKE_DONE frame.
Definition frame.cpp:1198
static void append_varint(std::vector< uint8_t > &buffer, uint64_t value)
Definition frame.cpp:879
static auto build_stream_data_blocked(const stream_data_blocked_frame &f) -> std::vector< uint8_t >
Build STREAM_DATA_BLOCKED frame.
Definition frame.cpp:1104
static auto build_retire_connection_id(const retire_connection_id_frame &f) -> std::vector< uint8_t >
Build RETIRE_CONNECTION_ID frame.
Definition frame.cpp:1146
static auto build_max_streams(const max_streams_frame &f) -> std::vector< uint8_t >
Build MAX_STREAMS frame.
Definition frame.cpp:1084
Parser for QUIC frames (RFC 9000 Section 12)
Definition frame.h:25
static auto parse_connection_close(std::span< const uint8_t > data, bool is_app) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:825
static auto parse_path_response(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:810
static auto parse_max_stream_data(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:644
static auto parse_ack(std::span< const uint8_t > data, bool has_ecn) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:394
static auto peek_type(std::span< const uint8_t > data) -> Result< std::pair< uint64_t, size_t > >
Get the frame type from raw data without full parsing.
Definition frame.cpp:116
static auto parse_ping(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:387
static auto parse_all(std::span< const uint8_t > data) -> Result< std::vector< frame > >
Parse all frames from buffer.
Definition frame.cpp:343
static auto parse_reset_stream(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:476
static auto parse_data_blocked(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:679
static auto parse_retire_connection_id(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:782
static auto parse_max_streams(std::span< const uint8_t > data, bool bidi) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:665
static auto parse_stream_data_blocked(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:692
static auto parse_stream(std::span< const uint8_t > data, uint8_t flags) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:576
static auto parse_path_challenge(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:795
static auto parse_padding(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:367
static auto parse_new_connection_id(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:727
static auto parse_crypto(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:524
static auto parse_stop_sending(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:503
static auto parse_new_token(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:553
static auto parse(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Parse a single frame from buffer.
Definition frame.cpp:122
static auto parse_max_data(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:631
static auto parse_handshake_done(std::span< const uint8_t > data) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:869
static auto parse_streams_blocked(std::span< const uint8_t > data, bool bidi) -> Result< std::pair< frame, size_t > >
Definition frame.cpp:713
std::variant< padding_frame, ping_frame, ack_frame, reset_stream_frame, stop_sending_frame, crypto_frame, new_token_frame, stream_frame, max_data_frame, max_stream_data_frame, max_streams_frame, data_blocked_frame, stream_data_blocked_frame, streams_blocked_frame, new_connection_id_frame, retire_connection_id_frame, path_challenge_frame, path_response_frame, connection_close_frame, handshake_done_frame > frame
Variant type holding any QUIC frame.
Network-specific error and result type definitions.
ACK frame (RFC 9000 Section 19.3)
CONNECTION_CLOSE frame (RFC 9000 Section 19.19)
CRYPTO frame (RFC 9000 Section 19.6)
DATA_BLOCKED frame (RFC 9000 Section 19.12)
MAX_DATA frame (RFC 9000 Section 19.9)
MAX_STREAM_DATA frame (RFC 9000 Section 19.10)
MAX_STREAMS frame (RFC 9000 Section 19.11)
NEW_CONNECTION_ID frame (RFC 9000 Section 19.15)
NEW_TOKEN frame (RFC 9000 Section 19.7)
PATH_CHALLENGE frame (RFC 9000 Section 19.17)
PATH_RESPONSE frame (RFC 9000 Section 19.18)
RESET_STREAM frame (RFC 9000 Section 19.4)
RETIRE_CONNECTION_ID frame (RFC 9000 Section 19.16)
STOP_SENDING frame (RFC 9000 Section 19.5)
STREAM_DATA_BLOCKED frame (RFC 9000 Section 19.13)
STREAM frame (RFC 9000 Section 19.8)
STREAMS_BLOCKED frame (RFC 9000 Section 19.14)