quic draft-24
This commit is contained in:
parent
f8528c5080
commit
2d80acfdbb
|
@ -24,12 +24,12 @@ ngtcp2, nghttp3 and my patched OpenSSL.
|
||||||
https://github.com/ngtcp2/ngtcp2/tree/draft-22#build-from-git
|
https://github.com/ngtcp2/ngtcp2/tree/draft-22#build-from-git
|
||||||
describes how to build these three software.
|
describes how to build these three software.
|
||||||
|
|
||||||
To run h2load against HTTP/3 server, specify h3-23 ALPN with
|
To run h2load against HTTP/3 server, specify h3-24 ALPN with
|
||||||
``--npn-list`` option like so:
|
``--npn-list`` option like so:
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
$ h2load --npn-list h3-23 https://127.0.0.1:4433
|
$ h2load --npn-list h3-24 https://127.0.0.1:4433
|
||||||
|
|
||||||
You can use Dockerfile to skip the tedious build steps to manually
|
You can use Dockerfile to skip the tedious build steps to manually
|
||||||
pull and build dependencies. In order to build Docker image, do this:
|
pull and build dependencies. In order to build Docker image, do this:
|
||||||
|
@ -43,7 +43,7 @@ Run h2load:
|
||||||
|
|
||||||
.. code-block:: text
|
.. code-block:: text
|
||||||
|
|
||||||
$ docker run --rm -it --network=host nghttp2-quic /usr/local/bin/h2load --npn-list h3-23 https://127.0.0.1:4433
|
$ docker run --rm -it --network=host nghttp2-quic /usr/local/bin/h2load --npn-list h3-24 https://127.0.0.1:4433
|
||||||
|
|
||||||
Development Status
|
Development Status
|
||||||
------------------
|
------------------
|
||||||
|
|
|
@ -5,13 +5,13 @@ RUN /usr/local/bin/clean-install git g++ make binutils autoconf automake autotoo
|
||||||
zlib1g libev4 libjemalloc1 libc-ares2 \
|
zlib1g libev4 libjemalloc1 libc-ares2 \
|
||||||
ca-certificates psmisc \
|
ca-certificates psmisc \
|
||||||
python && \
|
python && \
|
||||||
git clone --depth 1 -b openssl-quic-draft-23 https://github.com/tatsuhiro-t/openssl && \
|
git clone --depth 1 -b openssl-quic-draft-24 https://github.com/tatsuhiro-t/openssl && \
|
||||||
cd openssl && ./config enable-tls1_3 --openssldir=/etc/ssl && make -j$(nproc) && make install_sw && cd .. && rm -rf openssl && \
|
cd openssl && ./config enable-tls1_3 --openssldir=/etc/ssl && make -j$(nproc) && make install_sw && cd .. && rm -rf openssl && \
|
||||||
git clone --depth 1 https://github.com/ngtcp2/nghttp3 && \
|
git clone --depth 1 https://github.com/ngtcp2/nghttp3 && \
|
||||||
cd nghttp3 && autoreconf -i && \
|
cd nghttp3 && autoreconf -i && \
|
||||||
./configure --enable-lib-only && \
|
./configure --enable-lib-only && \
|
||||||
make -j$(nproc) && make install-strip && cd .. && rm -rf nghttp3 && \
|
make -j$(nproc) && make install-strip && cd .. && rm -rf nghttp3 && \
|
||||||
git clone --depth 1 -b master https://github.com/ngtcp2/ngtcp2 && \
|
git clone --depth 1 https://github.com/ngtcp2/ngtcp2 && \
|
||||||
cd ngtcp2 && autoreconf -i && \
|
cd ngtcp2 && autoreconf -i && \
|
||||||
./configure && \
|
./configure && \
|
||||||
make -j$(nproc) && make install-strip && cd .. && rm -rf ngtcp2 && \
|
make -j$(nproc) && make install-strip && cd .. && rm -rf ngtcp2 && \
|
||||||
|
|
|
@ -332,6 +332,8 @@ struct Client {
|
||||||
std::array<Crypto, 2> crypto;
|
std::array<Crypto, 2> crypto;
|
||||||
size_t max_pktlen;
|
size_t max_pktlen;
|
||||||
bool close_requested;
|
bool close_requested;
|
||||||
|
std::vector<uint8_t> rx_secret;
|
||||||
|
std::vector<uint8_t> tx_secret;
|
||||||
} quic;
|
} quic;
|
||||||
ev_timer request_timeout_watcher;
|
ev_timer request_timeout_watcher;
|
||||||
addrinfo *next_addr;
|
addrinfo *next_addr;
|
||||||
|
@ -465,6 +467,7 @@ struct Client {
|
||||||
int quic_stream_close(int64_t stream_id, uint64_t app_error_code);
|
int quic_stream_close(int64_t stream_id, uint64_t app_error_code);
|
||||||
int quic_stream_reset(int64_t stream_id, uint64_t app_error_code);
|
int quic_stream_reset(int64_t stream_id, uint64_t app_error_code);
|
||||||
int quic_extend_max_local_streams();
|
int quic_extend_max_local_streams();
|
||||||
|
int quic_update_key();
|
||||||
|
|
||||||
int quic_on_key(ngtcp2_crypto_level level, const uint8_t *rx_secret,
|
int quic_on_key(ngtcp2_crypto_level level, const uint8_t *rx_secret,
|
||||||
const uint8_t *tx_secret, size_t secretlen);
|
const uint8_t *tx_secret, size_t secretlen);
|
||||||
|
|
|
@ -113,7 +113,7 @@ int stream_close(nghttp3_conn *conn, int64_t stream_id, uint64_t app_error_code,
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
int Http3Session::stream_close(int64_t stream_id, uint64_t app_error_code) {
|
int Http3Session::stream_close(int64_t stream_id, uint64_t app_error_code) {
|
||||||
client_->on_stream_close(stream_id, app_error_code == NGHTTP3_HTTP_NO_ERROR);
|
client_->on_stream_close(stream_id, app_error_code == NGHTTP3_H3_NO_ERROR);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,7 @@ int stream_close(ngtcp2_conn *conn, int64_t stream_id, uint64_t app_error_code,
|
||||||
|
|
||||||
int Client::quic_stream_close(int64_t stream_id, uint64_t app_error_code) {
|
int Client::quic_stream_close(int64_t stream_id, uint64_t app_error_code) {
|
||||||
auto s = static_cast<Http3Session *>(session.get());
|
auto s = static_cast<Http3Session *>(session.get());
|
||||||
if (s->close_stream(stream_id, app_error_code == 0 ? NGHTTP3_HTTP_NO_ERROR
|
if (s->close_stream(stream_id, app_error_code == 0 ? NGHTTP3_H3_NO_ERROR
|
||||||
: app_error_code) != 0) {
|
: app_error_code) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -222,6 +222,36 @@ int get_new_connection_id(ngtcp2_conn *conn, ngtcp2_cid *cid, uint8_t *token,
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
int update_key(ngtcp2_conn *conn, void *user_data) {
|
||||||
|
auto c = static_cast<Client *>(user_data);
|
||||||
|
|
||||||
|
if (c->quic_update_key() != 0) {
|
||||||
|
return NGTCP2_ERR_CALLBACK_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
int Client::quic_update_key() {
|
||||||
|
std::array<uint8_t, 64> rx_secret, tx_secret;
|
||||||
|
|
||||||
|
if (ngtcp2_crypto_update_and_install_key(
|
||||||
|
quic.conn, rx_secret.data(), tx_secret.data(), nullptr, nullptr,
|
||||||
|
nullptr, nullptr, quic.rx_secret.data(), quic.tx_secret.data(),
|
||||||
|
quic.rx_secret.size()) != 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
quic.rx_secret.assign(std::begin(rx_secret),
|
||||||
|
std::begin(rx_secret) + quic.rx_secret.size());
|
||||||
|
quic.tx_secret.assign(std::begin(tx_secret),
|
||||||
|
std::begin(tx_secret) + quic.tx_secret.size());
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
void debug_log_printf(void *user_data, const char *fmt, ...) {
|
void debug_log_printf(void *user_data, const char *fmt, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
@ -362,7 +392,7 @@ int Client::quic_init(const sockaddr *local_addr, socklen_t local_addrlen,
|
||||||
nullptr, // rand
|
nullptr, // rand
|
||||||
get_new_connection_id,
|
get_new_connection_id,
|
||||||
nullptr, // remove_connection_id
|
nullptr, // remove_connection_id
|
||||||
nullptr, // update_key
|
update_key,
|
||||||
nullptr, // path_validation
|
nullptr, // path_validation
|
||||||
select_preferred_addr,
|
select_preferred_addr,
|
||||||
h2load::stream_reset,
|
h2load::stream_reset,
|
||||||
|
@ -497,6 +527,9 @@ int Client::quic_on_key(ngtcp2_crypto_level level, const uint8_t *rx_secret,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
session = std::move(s);
|
session = std::move(s);
|
||||||
|
|
||||||
|
quic.rx_secret.assign(rx_secret, rx_secret + secretlen);
|
||||||
|
quic.tx_secret.assign(tx_secret, tx_secret + secretlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue