blob: 67106e65ffb254ce12a9554e4c09bb90833726b7 [file] [log] [blame]
/** @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();