16void quic_tp_defaults(QuicTransportParams *tp)
18 memset(tp, 0,
sizeof(*tp));
19 tp->max_udp_payload_size = 65527;
20 tp->ack_delay_exponent = 3;
21 tp->max_ack_delay = 25;
22 tp->active_connection_id_limit = 2;
28bool put_param(uint8_t *out,
size_t cap,
size_t *p, uint64_t
id,
const uint8_t *val,
size_t val_len)
30 size_t n = quic_varint_encode(out + *p, cap - *p,
id);
34 n = quic_varint_encode(out + *p, cap - *p, val_len);
42 if (val_len > cap - *p)
44 memcpy(out + *p, val, val_len);
51bool put_varint_param(uint8_t *out,
size_t cap,
size_t *p, uint64_t
id, uint64_t value)
54 size_t vlen = quic_varint_encode(v,
sizeof(v), value);
57 return put_param(out, cap, p,
id, v, vlen);
61size_t quic_tp_encode(
const QuicTransportParams *tp, uint8_t *out,
size_t cap)
65 if (tp->has_original_dcid)
66 ok = ok && put_param(out, cap, &p, QuicTp::QUIC_TP_ORIGINAL_DCID, tp->original_dcid, tp->original_dcid_len);
67 if (tp->has_initial_scid)
68 ok = ok && put_param(out, cap, &p, QuicTp::QUIC_TP_INITIAL_SCID, tp->initial_scid, tp->initial_scid_len);
69 if (tp->has_retry_scid)
70 ok = ok && put_param(out, cap, &p, QuicTp::QUIC_TP_RETRY_SCID, tp->retry_scid, tp->retry_scid_len);
72 ok = ok && put_varint_param(out, cap, &p, QuicTp::QUIC_TP_INITIAL_MAX_DATA, tp->initial_max_data);
73 ok = ok && put_varint_param(out, cap, &p, QuicTp::QUIC_TP_INITIAL_MAX_SD_BIDI_LOCAL, tp->initial_max_sd_bidi_local);
75 put_varint_param(out, cap, &p, QuicTp::QUIC_TP_INITIAL_MAX_SD_BIDI_REMOTE, tp->initial_max_sd_bidi_remote);
76 ok = ok && put_varint_param(out, cap, &p, QuicTp::QUIC_TP_INITIAL_MAX_SD_UNI, tp->initial_max_sd_uni);
77 ok = ok && put_varint_param(out, cap, &p, QuicTp::QUIC_TP_INITIAL_MAX_STREAMS_BIDI, tp->initial_max_streams_bidi);
78 ok = ok && put_varint_param(out, cap, &p, QuicTp::QUIC_TP_INITIAL_MAX_STREAMS_UNI, tp->initial_max_streams_uni);
79 ok = ok && put_varint_param(out, cap, &p, QuicTp::QUIC_TP_MAX_IDLE_TIMEOUT, tp->max_idle_timeout);
80 ok = ok && put_varint_param(out, cap, &p, QuicTp::QUIC_TP_MAX_UDP_PAYLOAD_SIZE, tp->max_udp_payload_size);
81 ok = ok && put_varint_param(out, cap, &p, QuicTp::QUIC_TP_ACTIVE_CID_LIMIT, tp->active_connection_id_limit);
82 if (tp->disable_active_migration)
83 ok = ok && put_param(out, cap, &p, QuicTp::QUIC_TP_DISABLE_ACTIVE_MIGRATION,
nullptr, 0);
91bool value_varint(
const uint8_t *val,
size_t len, uint64_t *out)
94 if (!quic_varint_decode(val, len, out, &consumed))
96 return consumed == len;
100bool copy_cid(
const uint8_t *val,
size_t len, uint8_t *dst, uint8_t *dst_len,
bool *has)
102 if (len > QUIC_MAX_CID_LEN)
104 memcpy(dst, val, len);
105 *dst_len = (uint8_t)len;
112bool quic_tp_apply_cid(uint64_t
id,
const uint8_t *val,
size_t vlen, QuicTransportParams *tp,
bool *handled)
117 case QuicTp::QUIC_TP_ORIGINAL_DCID:
118 return copy_cid(val, vlen, tp->original_dcid, &tp->original_dcid_len, &tp->has_original_dcid);
119 case QuicTp::QUIC_TP_INITIAL_SCID:
120 return copy_cid(val, vlen, tp->initial_scid, &tp->initial_scid_len, &tp->has_initial_scid);
121 case QuicTp::QUIC_TP_RETRY_SCID:
122 return copy_cid(val, vlen, tp->retry_scid, &tp->retry_scid_len, &tp->has_retry_scid);
130bool quic_tp_apply_varint(uint64_t
id,
const uint8_t *val,
size_t vlen, QuicTransportParams *tp,
bool *handled)
135 case QuicTp::QUIC_TP_MAX_IDLE_TIMEOUT:
136 return value_varint(val, vlen, &tp->max_idle_timeout);
137 case QuicTp::QUIC_TP_MAX_UDP_PAYLOAD_SIZE:
138 return value_varint(val, vlen, &tp->max_udp_payload_size) && tp->max_udp_payload_size >= 1200;
139 case QuicTp::QUIC_TP_INITIAL_MAX_DATA:
140 return value_varint(val, vlen, &tp->initial_max_data);
141 case QuicTp::QUIC_TP_INITIAL_MAX_SD_BIDI_LOCAL:
142 return value_varint(val, vlen, &tp->initial_max_sd_bidi_local);
143 case QuicTp::QUIC_TP_INITIAL_MAX_SD_BIDI_REMOTE:
144 return value_varint(val, vlen, &tp->initial_max_sd_bidi_remote);
145 case QuicTp::QUIC_TP_INITIAL_MAX_SD_UNI:
146 return value_varint(val, vlen, &tp->initial_max_sd_uni);
147 case QuicTp::QUIC_TP_INITIAL_MAX_STREAMS_BIDI:
148 return value_varint(val, vlen, &tp->initial_max_streams_bidi);
149 case QuicTp::QUIC_TP_INITIAL_MAX_STREAMS_UNI:
150 return value_varint(val, vlen, &tp->initial_max_streams_uni);
151 case QuicTp::QUIC_TP_ACK_DELAY_EXPONENT:
152 return value_varint(val, vlen, &tp->ack_delay_exponent) && tp->ack_delay_exponent <= 20;
153 case QuicTp::QUIC_TP_MAX_ACK_DELAY:
154 return value_varint(val, vlen, &tp->max_ack_delay) && tp->max_ack_delay < (1u << 14);
155 case QuicTp::QUIC_TP_ACTIVE_CID_LIMIT:
156 return value_varint(val, vlen, &tp->active_connection_id_limit) && tp->active_connection_id_limit >= 2;
165bool quic_tp_apply(uint64_t
id,
const uint8_t *val,
size_t vlen, QuicTransportParams *tp)
167 bool handled =
false;
168 if (!quic_tp_apply_cid(
id, val, vlen, tp, &handled))
172 if (!quic_tp_apply_varint(
id, val, vlen, tp, &handled))
176 if (
id == QuicTp::QUIC_TP_DISABLE_ACTIVE_MIGRATION)
180 tp->disable_active_migration =
true;
186bool quic_tp_parse(
const uint8_t *buf,
size_t len, QuicTransportParams *tp)
188 quic_tp_defaults(tp);
197 if (!quic_varint_decode(buf + off, len - off, &
id, &c))
200 if (!quic_varint_decode(buf + off, len - off, &vlen, &c))
203 if (off + vlen > len)
205 const uint8_t *val = buf + off;
210 uint32_t bit = 1u << id;
216 if (!quic_tp_apply(
id, val, vlen, tp))
QUIC transport parameters (RFC 9000 sec 18) carried in the TLS quic_transport_parameters extension (R...
QUIC variable-length integer coding (RFC 9000 sec 16).