4#ifndef PROTOCORE_QUIC_FRAME_H
5#define PROTOCORE_QUIC_FRAME_H
36#define QUIC_FT_PADDING 0x00
37#define QUIC_FT_PING 0x01
38#define QUIC_FT_ACK 0x02
39#define QUIC_FT_ACK_ECN 0x03
40#define QUIC_FT_CRYPTO 0x06
41#define QUIC_FT_STREAM 0x08
42#define QUIC_FT_MAX_DATA 0x10
43#define QUIC_FT_CONNECTION_CLOSE 0x1c
44#define QUIC_FT_CONNECTION_CLOSE_APP 0x1d
45#define QUIC_FT_HANDSHAKE_DONE 0x1e
52#define QUIC_FT_RESET_STREAM 0x04
53#define QUIC_FT_STOP_SENDING 0x05
54#define QUIC_FT_NEW_TOKEN 0x07
55#define QUIC_FT_MAX_STREAM_DATA 0x11
56#define QUIC_FT_MAX_STREAMS_BIDI 0x12
57#define QUIC_FT_MAX_STREAMS_UNI 0x13
58#define QUIC_FT_DATA_BLOCKED 0x14
59#define QUIC_FT_STREAM_DATA_BLOCKED 0x15
60#define QUIC_FT_STREAMS_BLOCKED_BIDI 0x16
61#define QUIC_FT_STREAMS_BLOCKED_UNI 0x17
62#define QUIC_FT_NEW_CONNECTION_ID 0x18
63#define QUIC_FT_RETIRE_CONNECTION_ID 0x19
64#define QUIC_FT_PATH_CHALLENGE 0x1a
65#define QUIC_FT_PATH_RESPONSE 0x1b
68#define QUIC_STREAM_FIN 0x01
69#define QUIC_STREAM_LEN 0x02
70#define QUIC_STREAM_OFF 0x04
73#define QUIC_ERR_NO_ERROR 0x00
74#define QUIC_ERR_INTERNAL 0x01
75#define QUIC_ERR_FLOW_CONTROL 0x03
76#define QUIC_ERR_STREAM_LIMIT 0x04
77#define QUIC_ERR_FRAME_ENCODING 0x07
78#define QUIC_ERR_PROTOCOL_VIOLATION 0x0a
79#define QUIC_ERR_APPLICATION 0x0c
80#define QUIC_ERR_CRYPTO_BASE 0x0100
142 size_t (*build_padding)(uint8_t *, uint8_t *, size_t, size_t);
143 size_t (*build_ping)(uint8_t *, uint8_t *, size_t);
144 size_t (*build_handshake_done)(uint8_t *, uint8_t *, size_t);
145 size_t (*build_ack)(uint8_t *, uint8_t *, size_t, uint64_t, uint64_t, uint64_t);
146 size_t (*build_crypto)(uint8_t *, uint8_t *, size_t, uint64_t,
const uint8_t *, size_t);
147 size_t (*build_stream)(uint8_t *, uint8_t *, size_t, uint64_t, uint64_t,
const uint8_t *, size_t,
proto_bool);
148 size_t (*build_max_data)(uint8_t *, uint8_t *, size_t, uint64_t);
149 size_t (*build_connection_close)(uint8_t *, uint8_t *, size_t,
proto_bool, uint64_t, uint64_t,
const char *,
153 build_stream, build_max_data, build_connection_close);
200 uint64_t first_range);
226 const uint8_t *data,
size_t len,
proto_bool fin);
249 uint64_t error_code, uint64_t frame_type,
const char *reason,
#define PROTOCORE_NS_LAYOUT(T,...)
Pin every dispatch slot of a table that is nothing but function pointers.
#define PROTOCORE_NS
Storage for a dispatch table. The const is load bearing.
size_t protocore_quic_frame_build_stream(uint8_t *work, uint8_t *out, size_t cap, uint64_t id, uint64_t offset, const uint8_t *data, size_t len, proto_bool fin)
A STREAM frame (LEN always set; OFF set when offset > 0; FIN per .
PROTOCORE_NS QuicFrameNs QuicFrame PROTOCORE_UNUSED
Module namespace.
size_t protocore_quic_frame_build_ack(uint8_t *work, uint8_t *out, size_t cap, uint64_t largest, uint64_t delay, uint64_t first_range)
A single-range ACK frame (ACK Range Count 0): Largest, ACK Delay, .
size_t protocore_quic_frame_build_crypto(uint8_t *work, uint8_t *out, size_t cap, uint64_t offset, const uint8_t *data, size_t len)
A CRYPTO frame carrying len bytes at stream offset.
size_t protocore_quic_frame_build_max_data(uint8_t *work, uint8_t *out, size_t cap, uint64_t max)
A MAX_DATA frame.
size_t protocore_quic_frame_build_padding(uint8_t *work, uint8_t *out, size_t cap, size_t n)
N PADDING frames (n zero bytes). n, or 0 if it does not fit.
size_t protocore_quic_frame_parse(uint8_t *work, const uint8_t *buf, size_t len, QuicFrameHeader *out)
Parse one frame at buf. bytes consumed, or 0 on malformed / .
size_t protocore_quic_frame_build_handshake_done(uint8_t *work, uint8_t *out, size_t cap)
A HANDSHAKE_DONE frame.
size_t protocore_quic_frame_build_ping(uint8_t *work, uint8_t *out, size_t cap)
A PING frame.
size_t protocore_quic_frame_build_connection_close(uint8_t *work, uint8_t *out, size_t cap, proto_bool app, uint64_t error_code, uint64_t frame_type, const char *reason, size_t reason_len)
A CONNECTION_CLOSE with a reason phrase. app selects the .
ACK payload (RFC 9000 sec 19.3).
uint64_t delay
ACK Delay (encoded units)
uint64_t range_count
number of additional ACK Ranges (skipped, but counted)
uint64_t largest
Largest Acknowledged.
uint64_t first_range
First ACK Range.
CONNECTION_CLOSE payload (RFC 9000 sec 19.19). reason aliases the input buffer.
uint64_t frame_type
0 for the application-level variant (0x1d)
uint8_t app
1 if this was the application-level close (0x1d)
CRYPTO payload (RFC 9000 sec 19.6). data aliases the input buffer.
Dispatch table. Addressed by offset, so the layout is asserted below.
size_t(* parse)(uint8_t *, const uint8_t *, size_t, QuicFrameHeader *)
MAX_DATA payload (RFC 9000 sec 19.9).
STREAM payload (RFC 9000 sec 19.8). data aliases the input buffer.
uint64_t offset
0 when the OFF bit is clear
#define PROTOCORE_BEGIN_DECLS
Give a header's declarations C linkage, so their symbol names carry no parameter types.
_Bool proto_bool
The truth value.
#define PROTOCORE_END_DECLS