draft-28
This commit is contained in:
parent
b68c931f18
commit
a77031df80
|
@ -134,7 +134,7 @@ bool Config::is_rate_mode() const { return (this->rate != 0); }
|
|||
bool Config::is_timing_based_mode() const { return (this->duration > 0); }
|
||||
bool Config::has_base_uri() const { return (!this->base_uri.empty()); }
|
||||
bool Config::is_quic() const {
|
||||
return !npn_list.empty() && npn_list[0] == NGTCP2_ALPN_H3;
|
||||
return !npn_list.empty() && npn_list[0] == NGHTTP3_ALPN_H3;
|
||||
}
|
||||
Config config;
|
||||
|
||||
|
@ -974,7 +974,7 @@ int Client::connection_made() {
|
|||
auto proto = StringRef{next_proto, next_proto_len};
|
||||
if (config.is_quic()) {
|
||||
assert(session);
|
||||
if (!util::streq(StringRef{&NGTCP2_ALPN_H3[1]}, proto)) {
|
||||
if (!util::streq(StringRef{&NGHTTP3_ALPN_H3[1]}, proto)) {
|
||||
return -1;
|
||||
}
|
||||
} else if (util::check_h2_is_selected(proto)) {
|
||||
|
|
|
@ -437,7 +437,6 @@ struct Client {
|
|||
int write_udp(const sockaddr *addr, socklen_t addrlen, const uint8_t *data,
|
||||
size_t datalen);
|
||||
void quic_close_connection();
|
||||
int quic_setup_initial_crypto();
|
||||
|
||||
int quic_recv_crypto_data(ngtcp2_crypto_level crypto_level,
|
||||
const uint8_t *data, size_t datalen);
|
||||
|
|
|
@ -36,18 +36,6 @@ namespace {
|
|||
auto randgen = util::make_mt19937();
|
||||
} // namespace
|
||||
|
||||
namespace {
|
||||
int client_initial(ngtcp2_conn *conn, void *user_data) {
|
||||
auto c = static_cast<Client *>(user_data);
|
||||
|
||||
if (c->quic_recv_crypto_data(NGTCP2_CRYPTO_LEVEL_INITIAL, nullptr, 0) != 0) {
|
||||
return NGTCP2_ERR_CALLBACK_FAILURE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
namespace {
|
||||
int recv_crypto_data(ngtcp2_conn *conn, ngtcp2_crypto_level crypto_level,
|
||||
uint64_t offset, const uint8_t *data, size_t datalen,
|
||||
|
@ -82,21 +70,6 @@ int handshake_completed(ngtcp2_conn *conn, void *user_data) {
|
|||
|
||||
int Client::quic_handshake_completed() { return connection_made(); }
|
||||
|
||||
namespace {
|
||||
int recv_retry(ngtcp2_conn *conn, const ngtcp2_pkt_hd *hd,
|
||||
const ngtcp2_pkt_retry *retry, void *user_data) {
|
||||
// Re-generate handshake secrets here because connection ID might
|
||||
// change.
|
||||
auto c = static_cast<Client *>(user_data);
|
||||
|
||||
if (c->quic_setup_initial_crypto() != 0) {
|
||||
return NGTCP2_ERR_CALLBACK_FAILURE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
namespace {
|
||||
int recv_stream_data(ngtcp2_conn *conn, int64_t stream_id, int fin,
|
||||
uint64_t offset, const uint8_t *data, size_t datalen,
|
||||
|
@ -346,7 +319,7 @@ int Client::quic_init(const sockaddr *local_addr, socklen_t local_addrlen,
|
|||
}
|
||||
|
||||
auto callbacks = ngtcp2_conn_callbacks{
|
||||
h2load::client_initial,
|
||||
ngtcp2_crypto_client_initial_cb,
|
||||
nullptr, // recv_client_initial
|
||||
h2load::recv_crypto_data,
|
||||
h2load::handshake_completed,
|
||||
|
@ -360,7 +333,7 @@ int Client::quic_init(const sockaddr *local_addr, socklen_t local_addrlen,
|
|||
nullptr, // stream_open
|
||||
h2load::stream_close,
|
||||
nullptr, // recv_stateless_reset
|
||||
h2load::recv_retry,
|
||||
ngtcp2_crypto_recv_retry_cb,
|
||||
h2load::extend_max_local_streams_bidi,
|
||||
nullptr, // extend_max_local_streams_uni
|
||||
nullptr, // rand
|
||||
|
@ -394,6 +367,7 @@ int Client::quic_init(const sockaddr *local_addr, socklen_t local_addrlen,
|
|||
params.initial_max_streams_bidi = 0;
|
||||
params.initial_max_streams_uni = 100;
|
||||
params.max_idle_timeout = 30 * NGTCP2_SECONDS;
|
||||
params.max_udp_payload_size = quic.max_pktlen;
|
||||
|
||||
auto path = ngtcp2_path{
|
||||
{local_addrlen,
|
||||
|
@ -408,28 +382,7 @@ int Client::quic_init(const sockaddr *local_addr, socklen_t local_addrlen,
|
|||
return -1;
|
||||
}
|
||||
|
||||
std::array<uint8_t, 64> buf;
|
||||
|
||||
auto nwrite = ngtcp2_encode_transport_params(
|
||||
buf.data(), buf.size(), NGTCP2_TRANSPORT_PARAMS_TYPE_CLIENT_HELLO,
|
||||
¶ms);
|
||||
if (nwrite < 0) {
|
||||
std::cerr << "ngtcp2_encode_transport_params: " << ngtcp2_strerror(nwrite)
|
||||
<< std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (SSL_set_quic_transport_params(ssl, buf.data(), nwrite) != 1) {
|
||||
std::cerr << "SSL_set_quic_transport_params failed" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
rv = quic_setup_initial_crypto();
|
||||
if (rv != 0) {
|
||||
ngtcp2_conn_del(quic.conn);
|
||||
quic.conn = nullptr;
|
||||
return -1;
|
||||
}
|
||||
ngtcp2_conn_set_tls(quic.conn, ssl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -471,24 +424,9 @@ void Client::quic_close_connection() {
|
|||
ps.path.remote.addrlen, buf.data(), nwrite);
|
||||
}
|
||||
|
||||
int Client::quic_setup_initial_crypto() {
|
||||
auto dcid = ngtcp2_conn_get_dcid(quic.conn);
|
||||
|
||||
if (ngtcp2_crypto_derive_and_install_initial_key(
|
||||
quic.conn, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
|
||||
nullptr, nullptr, nullptr, dcid) != 0) {
|
||||
std::cerr << "ngtcp2_crypto_derive_and_install_initial_key() failed"
|
||||
<< std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Client::quic_on_key(ngtcp2_crypto_level level, const uint8_t *rx_secret,
|
||||
const uint8_t *tx_secret, size_t secretlen) {
|
||||
if (level != NGTCP2_CRYPTO_LEVEL_EARLY &&
|
||||
ngtcp2_crypto_derive_and_install_rx_key(quic.conn, ssl, nullptr, nullptr,
|
||||
if (ngtcp2_crypto_derive_and_install_rx_key(quic.conn, ssl, nullptr, nullptr,
|
||||
nullptr, level, rx_secret,
|
||||
secretlen) != 0) {
|
||||
std::cerr << "ngtcp2_crypto_derive_and_install_rx_key() failed"
|
||||
|
|
Loading…
Reference in New Issue