From 17e81f2cd1843f01838245eae7b5ed5edf83d6be Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 28 Apr 2024 09:30:55 +0200 Subject: Adding upstream version 0.12.1+dfsg. Signed-off-by: Daniel Baumann --- examples/client_base.h | 212 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 examples/client_base.h (limited to 'examples/client_base.h') diff --git a/examples/client_base.h b/examples/client_base.h new file mode 100644 index 0000000..ef364ea --- /dev/null +++ b/examples/client_base.h @@ -0,0 +1,212 @@ +/* + * ngtcp2 + * + * Copyright (c) 2020 ngtcp2 contributors + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#ifndef CLIENT_BASE_H +#define CLIENT_BASE_H + +#ifdef HAVE_CONFIG_H +# include +#endif // HAVE_CONFIG_H + +#include +#include +#include +#include +#include + +#include + +#include "tls_client_session.h" +#include "network.h" +#include "shared.h" + +using namespace ngtcp2; + +struct Request { + std::string_view scheme; + std::string authority; + std::string path; +}; + +struct Config { + ngtcp2_cid dcid; + ngtcp2_cid scid; + bool scid_present; + // tx_loss_prob is probability of losing outgoing packet. + double tx_loss_prob; + // rx_loss_prob is probability of losing incoming packet. + double rx_loss_prob; + // fd is a file descriptor to read input for streams. + int fd; + // ciphers is the list of enabled ciphers. + const char *ciphers; + // groups is the list of supported groups. + const char *groups; + // nstreams is the number of streams to open. + size_t nstreams; + // data is the pointer to memory region which maps file denoted by + // fd. + uint8_t *data; + // datalen is the length of file denoted by fd. + size_t datalen; + // version is a QUIC version to use. + uint32_t version; + // quiet suppresses the output normally shown except for the error + // messages. + bool quiet; + // timeout is an idle timeout for QUIC connection. + ngtcp2_duration timeout; + // session_file is a path to a file to write, and read TLS session. + const char *session_file; + // tp_file is a path to a file to write, and read QUIC transport + // parameters. + const char *tp_file; + // show_secret is true if transport secrets should be printed out. + bool show_secret; + // change_local_addr is the duration after which client changes + // local address. + ngtcp2_duration change_local_addr; + // key_update is the duration after which client initiates key + // update. + ngtcp2_duration key_update; + // delay_stream is the duration after which client sends the first + // 1-RTT stream. + ngtcp2_duration delay_stream; + // nat_rebinding is true if simulated NAT rebinding is enabled. + bool nat_rebinding; + // no_preferred_addr is true if client do not follow preferred + // address offered by server. + bool no_preferred_addr; + std::string_view http_method; + // download is a path to a directory where a downloaded file is + // saved. If it is empty, no file is saved. + std::string_view download; + // requests contains URIs to request. + std::vector requests; + // no_quic_dump is true if hexdump of QUIC STREAM and CRYPTO data + // should be disabled. + bool no_quic_dump; + // no_http_dump is true if hexdump of HTTP response body should be + // disabled. + bool no_http_dump; + // qlog_file is the path to write qlog. + std::string_view qlog_file; + // qlog_dir is the path to directory where qlog is stored. qlog_dir + // and qlog_file are mutually exclusive. + std::string_view qlog_dir; + // max_data is the initial connection-level flow control window. + uint64_t max_data; + // max_stream_data_bidi_local is the initial stream-level flow + // control window for a bidirectional stream that the local endpoint + // initiates. + uint64_t max_stream_data_bidi_local; + // max_stream_data_bidi_remote is the initial stream-level flow + // control window for a bidirectional stream that the remote + // endpoint initiates. + uint64_t max_stream_data_bidi_remote; + // max_stream_data_uni is the initial stream-level flow control + // window for a unidirectional stream. + uint64_t max_stream_data_uni; + // max_streams_bidi is the number of the concurrent bidirectional + // streams. + uint64_t max_streams_bidi; + // max_streams_uni is the number of the concurrent unidirectional + // streams. + uint64_t max_streams_uni; + // max_window is the maximum connection-level flow control window + // size if auto-tuning is enabled. + uint64_t max_window; + // max_stream_window is the maximum stream-level flow control window + // size if auto-tuning is enabled. + uint64_t max_stream_window; + // exit_on_first_stream_close is the flag that if it is true, client + // exits when a first HTTP stream gets closed. It is not + // necessarily the same time when the underlying QUIC stream closes + // due to the QPACK synchronization. + bool exit_on_first_stream_close; + // exit_on_all_streams_close is the flag that if it is true, client + // exits when all HTTP streams get closed. + bool exit_on_all_streams_close; + // disable_early_data disables early data. + bool disable_early_data; + // static_secret is used to derive keying materials for Stateless + // Retry token. + std::array static_secret; + // cc_algo is the congestion controller algorithm. + ngtcp2_cc_algo cc_algo; + // token_file is a path to file to read or write token from + // NEW_TOKEN frame. + std::string_view token_file; + // sni is the value sent in TLS SNI, overriding DNS name of the + // remote host. + std::string_view sni; + // initial_rtt is an initial RTT. + ngtcp2_duration initial_rtt; + // max_udp_payload_size is the maximum UDP payload size that client + // transmits. + size_t max_udp_payload_size; + // handshake_timeout is the period of time before giving up QUIC + // connection establishment. + ngtcp2_duration handshake_timeout; + // preferred_versions includes QUIC versions in the order of + // preference. Client uses this field to select a version from the + // version set offered in Version Negotiation packet. + std::vector preferred_versions; + // other_versions includes QUIC versions that are sent in + // other_versions field of version_information transport_parameter. + std::vector other_versions; + // no_pmtud disables Path MTU Discovery. + bool no_pmtud; + // ack_thresh is the minimum number of the received ACK eliciting + // packets that triggers immediate acknowledgement. + size_t ack_thresh; +}; + +class ClientBase { +public: + ClientBase(); + ~ClientBase(); + + ngtcp2_conn *conn() const; + + int write_transport_params(const char *path, + const ngtcp2_transport_params *params); + int read_transport_params(const char *path, ngtcp2_transport_params *params); + + void write_qlog(const void *data, size_t datalen); + + ngtcp2_crypto_conn_ref *conn_ref(); + +protected: + ngtcp2_crypto_conn_ref conn_ref_; + TLSClientSession tls_session_; + FILE *qlog_; + ngtcp2_conn *conn_; + ngtcp2_connection_close_error last_error_; +}; + +void qlog_write_cb(void *user_data, uint32_t flags, const void *data, + size_t datalen); + +#endif // CLIENT_BASE_H -- cgit v1.2.3