| /** @file |
| * |
| * A brief file description |
| * |
| * @section license License |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #pragma once |
| |
| #include <openssl/ssl.h> |
| |
| #include "ProxyConfig.h" |
| #include "P_SSLCertLookup.h" |
| |
| class QUICConfigParams : public ConfigInfo |
| { |
| public: |
| QUICConfigParams(){}; |
| ~QUICConfigParams(); |
| |
| void initialize(); |
| |
| uint32_t instance_id() const; |
| uint32_t stateless_retry() const; |
| uint32_t vn_exercise_enabled() const; |
| uint32_t cm_exercise_enabled() const; |
| |
| const char *server_supported_groups() const; |
| const char *client_supported_groups() const; |
| const char *client_session_file() const; |
| const char *client_keylog_file() const; |
| |
| shared_SSL_CTX client_ssl_ctx() const; |
| |
| // Transport Parameters |
| uint32_t no_activity_timeout_in() const; |
| uint32_t no_activity_timeout_out() const; |
| const IpEndpoint *preferred_address_ipv4() const; |
| const IpEndpoint *preferred_address_ipv6() const; |
| uint32_t initial_max_data_in() const; |
| uint32_t initial_max_data_out() const; |
| uint32_t initial_max_stream_data_bidi_local_in() const; |
| uint32_t initial_max_stream_data_bidi_local_out() const; |
| uint32_t initial_max_stream_data_bidi_remote_in() const; |
| uint32_t initial_max_stream_data_bidi_remote_out() const; |
| uint32_t initial_max_stream_data_uni_in() const; |
| uint32_t initial_max_stream_data_uni_out() const; |
| uint64_t initial_max_streams_bidi_in() const; |
| uint64_t initial_max_streams_bidi_out() const; |
| uint64_t initial_max_streams_uni_in() const; |
| uint64_t initial_max_streams_uni_out() const; |
| uint8_t ack_delay_exponent_in() const; |
| uint8_t ack_delay_exponent_out() const; |
| uint8_t max_ack_delay_in() const; |
| uint8_t max_ack_delay_out() const; |
| uint8_t active_cid_limit_in() const; |
| uint8_t active_cid_limit_out() const; |
| |
| // Loss Detection |
| uint32_t ld_packet_threshold() const; |
| float ld_time_threshold() const; |
| ink_hrtime ld_granularity() const; |
| ink_hrtime ld_initial_rtt() const; |
| |
| // Congestion Control |
| uint32_t cc_max_datagram_size() const; |
| uint32_t cc_initial_window() const; |
| uint32_t cc_minimum_window() const; |
| float cc_loss_reduction_factor() const; |
| uint32_t cc_persistent_congestion_threshold() const; |
| |
| static int connection_table_size(); |
| static uint8_t scid_len(); |
| |
| private: |
| static int _connection_table_size; |
| // TODO: make configurable |
| static const uint8_t _scid_len = 18; //< Length of Source Connection ID |
| |
| uint32_t _instance_id = 0; |
| uint32_t _stateless_retry = 0; |
| uint32_t _vn_exercise_enabled = 0; |
| uint32_t _cm_exercise_enabled = 0; |
| |
| char *_server_supported_groups = nullptr; |
| char *_client_supported_groups = nullptr; |
| char *_client_session_file = nullptr; |
| char *_client_keylog_file = nullptr; |
| |
| shared_SSL_CTX _client_ssl_ctx = nullptr; |
| |
| // Transport Parameters |
| uint32_t _no_activity_timeout_in = 0; |
| uint32_t _no_activity_timeout_out = 0; |
| const char *_preferred_address_ipv4 = nullptr; |
| const char *_preferred_address_ipv6 = nullptr; |
| IpEndpoint _preferred_endpoint_ipv4; |
| IpEndpoint _preferred_endpoint_ipv6; |
| uint32_t _initial_max_data_in = 0; |
| uint32_t _initial_max_data_out = 0; |
| uint32_t _initial_max_stream_data_bidi_local_in = 0; |
| uint32_t _initial_max_stream_data_bidi_local_out = 0; |
| uint32_t _initial_max_stream_data_bidi_remote_in = 0; |
| uint32_t _initial_max_stream_data_bidi_remote_out = 0; |
| uint32_t _initial_max_stream_data_uni_in = 0; |
| uint32_t _initial_max_stream_data_uni_out = 0; |
| uint32_t _initial_max_streams_bidi_in = 0; |
| uint32_t _initial_max_streams_bidi_out = 0; |
| uint32_t _initial_max_streams_uni_in = 0; |
| uint32_t _initial_max_streams_uni_out = 0; |
| uint32_t _ack_delay_exponent_in = 0; |
| uint32_t _ack_delay_exponent_out = 0; |
| uint32_t _max_ack_delay_in = 0; |
| uint32_t _max_ack_delay_out = 0; |
| uint32_t _active_cid_limit_in = 0; |
| uint32_t _active_cid_limit_out = 0; |
| |
| // [draft-17 recovery] 6.4.1. Constants of interest |
| uint32_t _ld_packet_threshold = 3; |
| float _ld_time_threshold = 1.25; |
| ink_hrtime _ld_granularity = HRTIME_MSECONDS(1); |
| ink_hrtime _ld_initial_rtt = HRTIME_MSECONDS(500); |
| |
| // [draft-11 recovery] 4.7.1. Constants of interest |
| uint32_t _cc_max_datagram_size = 1200; |
| uint32_t _cc_initial_window_scale = 10; // Actual initial window size is this value multiplied by the _cc_default_mss |
| uint32_t _cc_minimum_window_scale = 2; // Actual minimum window size is this value multiplied by the _cc_default_mss |
| float _cc_loss_reduction_factor = 0.5; |
| uint32_t _cc_persistent_congestion_threshold = 3; |
| }; |
| |
| class QUICConfig |
| { |
| public: |
| static void startup(); |
| static void reconfigure(); |
| static QUICConfigParams *acquire(); |
| static void release(QUICConfigParams *params); |
| |
| using scoped_config = ConfigProcessor::scoped_config<QUICConfig, QUICConfigParams>; |
| |
| private: |
| static int _config_id; |
| }; |
| |
| SSL_CTX *quic_new_ssl_ctx(); |