lsquic_trans_params.h revision 1bdb91d1
1/* Copyright (c) 2017 - 2020 LiteSpeed Technologies Inc. See LICENSE. */ 2/* 3 * lsquic_trans_params.h -- Transport parameters types and functions. 4 */ 5 6#ifndef LSQUIC_TRANS_PARAMS_H 7#define LSQUIC_TRANS_PARAMS_H 1 8 9/* Transport parameters are grouped by the type of their values: numeric, 10 * empty, and custom. 11 * 12 * The enum values are arbitrary. The literal transport parameter ID 13 * *values* (e.g. 0x1057 for loss bits) are not exposed by the API. 14 */ 15enum transport_param_id 16{ 17 /* 18 * Numeric transport parameters that have default values: 19 */ 20 TPI_MAX_IDLE_TIMEOUT, 21 TPI_MAX_PACKET_SIZE, 22 TPI_INIT_MAX_DATA, 23 TPI_INIT_MAX_STREAM_DATA_BIDI_LOCAL, 24 TPI_INIT_MAX_STREAM_DATA_BIDI_REMOTE, 25 TPI_INIT_MAX_STREAM_DATA_UNI, 26 TPI_INIT_MAX_STREAMS_BIDI, 27 TPI_INIT_MAX_STREAMS_UNI, 28 TPI_ACK_DELAY_EXPONENT, 29 TPI_MAX_ACK_DELAY, 30 TPI_ACTIVE_CONNECTION_ID_LIMIT, MAX_NUM_WITH_DEF_TPI = TPI_ACTIVE_CONNECTION_ID_LIMIT, 31 32 /* 33 * Numeric transport parameters without default values: 34 */ 35 TPI_LOSS_BITS, MAX_NUMERIC_TPI = TPI_LOSS_BITS, 36 37 /* 38 * Empty transport parameters: 39 */ 40 TPI_DISABLE_ACTIVE_MIGRATION, MAX_EMPTY_TPI = TPI_DISABLE_ACTIVE_MIGRATION, 41 42 /* 43 * Custom handlers: 44 */ 45 TPI_PREFERRED_ADDRESS, 46 TPI_ORIGINAL_CONNECTION_ID, 47#if LSQUIC_TEST_QUANTUM_READINESS 48 /* https://github.com/quicwg/base-drafts/wiki/Quantum-Readiness-test */ 49#define QUANTUM_READY_SZ 1200 50 TPI_QUANTUM_READINESS, 51#endif 52 TPI_STATELESS_RESET_TOKEN, LAST_TPI = TPI_STATELESS_RESET_TOKEN 53}; 54 55 56struct transport_params 57{ 58 /* Which transport parameters values are set: */ 59 unsigned tp_set; 60 61 /* Which transport parameters were present (set by the decoder): */ 62 unsigned tp_decoded; 63 64 uint64_t tp_numerics[MAX_NUMERIC_TPI + 1]; 65 66#define tp_init_max_stream_data_bidi_local tp_numerics[TPI_INIT_MAX_STREAM_DATA_BIDI_LOCAL] 67#define tp_init_max_stream_data_bidi_remote tp_numerics[TPI_INIT_MAX_STREAM_DATA_BIDI_REMOTE] 68#define tp_init_max_stream_data_uni tp_numerics[TPI_INIT_MAX_STREAM_DATA_UNI] 69#define tp_init_max_data tp_numerics[TPI_INIT_MAX_DATA] 70#define tp_max_idle_timeout tp_numerics[TPI_MAX_IDLE_TIMEOUT] 71#define tp_init_max_streams_bidi tp_numerics[TPI_INIT_MAX_STREAMS_BIDI] 72#define tp_init_max_streams_uni tp_numerics[TPI_INIT_MAX_STREAMS_UNI] 73#define tp_max_packet_size tp_numerics[TPI_MAX_PACKET_SIZE] 74#define tp_ack_delay_exponent tp_numerics[TPI_ACK_DELAY_EXPONENT] 75#define tp_max_ack_delay tp_numerics[TPI_MAX_ACK_DELAY] 76#define tp_active_connection_id_limit tp_numerics[TPI_ACTIVE_CONNECTION_ID_LIMIT] 77#define tp_loss_bits tp_numerics[TPI_LOSS_BITS] 78 79 uint8_t tp_stateless_reset_token[IQUIC_SRESET_TOKEN_SZ]; 80 struct { 81 uint8_t ipv4_addr[4]; 82 uint16_t ipv4_port; 83 uint8_t ipv6_addr[16]; 84 uint16_t ipv6_port; 85 lsquic_cid_t cid; 86 uint8_t srst[IQUIC_SRESET_TOKEN_SZ]; 87 } tp_preferred_address; 88 lsquic_cid_t tp_original_cid; 89}; 90 91#define TP_DEF_MAX_PACKET_SIZE 65527 92#define TP_DEF_ACK_DELAY_EXP 3 93#define TP_DEF_INIT_MAX_STREAMS_UNI 0 94#define TP_DEF_INIT_MAX_STREAMS_BIDI 0 95#define TP_DEF_INIT_MAX_DATA 0 96#define TP_DEF_DISABLE_ACTIVE_MIGRATION 0 97#define TP_DEF_INIT_MAX_STREAM_DATA_BIDI_LOCAL 0 98#define TP_DEF_INIT_MAX_STREAM_DATA_BIDI_REMOTE 0 99#define TP_DEF_INIT_MAX_STREAM_DATA_UNI 0 100#define TP_DEF_MAX_IDLE_TIMEOUT 0 101#define TP_DEF_MAX_ACK_DELAY 25 102#define TP_DEF_ACTIVE_CONNECTION_ID_LIMIT 2 103 104/* [draft-ietf-quic-transport-18], Section 18.1 */ 105#define TP_MAX_MAX_ACK_DELAY ((1u << 14) - 1) 106 107#define TP_DEFAULT_VALUES \ 108 .tp_set = ((1 << (MAX_NUM_WITH_DEF_TPI + 1)) - 1), \ 109 .tp_active_connection_id_limit = TP_DEF_ACTIVE_CONNECTION_ID_LIMIT, \ 110 .tp_max_idle_timeout = TP_DEF_MAX_IDLE_TIMEOUT, \ 111 .tp_max_ack_delay = TP_DEF_MAX_ACK_DELAY, \ 112 .tp_max_packet_size = TP_DEF_MAX_PACKET_SIZE, \ 113 .tp_ack_delay_exponent = TP_DEF_ACK_DELAY_EXP, \ 114 .tp_init_max_streams_bidi = TP_DEF_INIT_MAX_STREAMS_BIDI, \ 115 .tp_init_max_streams_uni = TP_DEF_INIT_MAX_STREAMS_UNI, \ 116 .tp_init_max_data = TP_DEF_INIT_MAX_DATA, \ 117 .tp_init_max_stream_data_bidi_local = TP_DEF_INIT_MAX_STREAM_DATA_BIDI_LOCAL, \ 118 .tp_init_max_stream_data_bidi_remote = TP_DEF_INIT_MAX_STREAM_DATA_BIDI_REMOTE, \ 119 .tp_init_max_stream_data_uni = TP_DEF_INIT_MAX_STREAM_DATA_UNI 120 121#define TP_INITIALIZER() (struct transport_params) { TP_DEFAULT_VALUES } 122 123int 124lsquic_tp_encode (const struct transport_params *, int is_server, 125 unsigned char *buf, size_t bufsz); 126 127int 128lsquic_tp_decode (const unsigned char *buf, size_t bufsz, 129 /* This argument specifies whose transport parameters we are parsing. If 130 * true, we are parsing parameters sent by the server; if false, we are 131 * parsing parameteres sent by the client. 132 */ 133 int is_server, 134 struct transport_params *); 135 136void 137lsquic_tp_to_str (const struct transport_params *params, char *buf, size_t sz); 138 139int 140lsquic_tp_has_pref_ipv4 (const struct transport_params *); 141 142int 143lsquic_tp_has_pref_ipv6 (const struct transport_params *); 144 145#endif 146