From 95601d3179065afb96649b93251a13ab5e196221 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 31 Aug 2021 12:13:06 +0900 Subject: [PATCH] nghttpx: Utilize the latest ngtcp2 features --- src/shrpx_http3_upstream.cc | 25 +++++++++++++------------ src/shrpx_quic.h | 2 +- src/shrpx_quic_connection_handler.cc | 6 +++--- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/shrpx_http3_upstream.cc b/src/shrpx_http3_upstream.cc index 60d979ff..c6b3f612 100644 --- a/src/shrpx_http3_upstream.cc +++ b/src/shrpx_http3_upstream.cc @@ -507,7 +507,8 @@ int Http3Upstream::init(const UpstreamAddr *faddr, const Address &remote_addr, settings.cc_algo = NGTCP2_CC_ALGO_BBR; settings.max_window = http3conf.upstream.max_connection_window_size; settings.max_stream_window = http3conf.upstream.max_window_size; - settings.max_udp_payload_size = SHRPX_MAX_UDP_PAYLOAD_SIZE; + settings.max_udp_payload_size = SHRPX_QUIC_MAX_UDP_PAYLOAD_SIZE; + settings.assume_symmetric_path = 1; settings.rand_ctx.native_handle = &worker->get_randgen(); settings.token = ngtcp2_vec{const_cast(token), tokenlen}; @@ -581,9 +582,10 @@ int Http3Upstream::on_write() { int Http3Upstream::write_streams() { std::array vec; std::array buf; + auto max_udp_payload_size = ngtcp2_conn_get_path_max_udp_payload_size(conn_); size_t max_pktcnt = std::min(static_cast(64_k), ngtcp2_conn_get_send_quantum(conn_)) / - SHRPX_MAX_UDP_PAYLOAD_SIZE; + max_udp_payload_size; ngtcp2_pkt_info pi; uint8_t *bufpos = buf.data(); ngtcp2_path_storage ps, prev_ps; @@ -620,8 +622,8 @@ int Http3Upstream::write_streams() { } auto nwrite = ngtcp2_conn_writev_stream( - conn_, &ps.path, &pi, bufpos, SHRPX_MAX_UDP_PAYLOAD_SIZE, &ndatalen, - flags, stream_id, reinterpret_cast(v), vcnt, ts); + conn_, &ps.path, &pi, bufpos, max_udp_payload_size, &ndatalen, flags, + stream_id, reinterpret_cast(v), vcnt, ts); if (nwrite < 0) { switch (nwrite) { case NGTCP2_ERR_STREAM_DATA_BLOCKED: @@ -678,8 +680,7 @@ int Http3Upstream::write_streams() { quic_send_packet(static_cast(prev_ps.path.user_data), prev_ps.path.remote.addr, prev_ps.path.remote.addrlen, prev_ps.path.local.addr, prev_ps.path.local.addrlen, - buf.data(), bufpos - buf.data(), - SHRPX_MAX_UDP_PAYLOAD_SIZE); + buf.data(), bufpos - buf.data(), max_udp_payload_size); ngtcp2_conn_update_pkt_tx_time(conn_, ts); reset_idle_timer(); @@ -700,12 +701,12 @@ int Http3Upstream::write_streams() { prev_ps.path.remote.addr, prev_ps.path.remote.addrlen, prev_ps.path.local.addr, prev_ps.path.local.addrlen, buf.data(), bufpos - buf.data() - nwrite, - SHRPX_MAX_UDP_PAYLOAD_SIZE); + max_udp_payload_size); quic_send_packet(static_cast(ps.path.user_data), ps.path.remote.addr, ps.path.remote.addrlen, ps.path.local.addr, ps.path.local.addrlen, - bufpos - nwrite, nwrite, SHRPX_MAX_UDP_PAYLOAD_SIZE); + bufpos - nwrite, nwrite, max_udp_payload_size); ngtcp2_conn_update_pkt_tx_time(conn_, ts); reset_idle_timer(); @@ -716,11 +717,11 @@ int Http3Upstream::write_streams() { } if (++pktcnt == max_pktcnt || - static_cast(nwrite) < SHRPX_MAX_UDP_PAYLOAD_SIZE) { + static_cast(nwrite) < max_udp_payload_size) { quic_send_packet(static_cast(ps.path.user_data), ps.path.remote.addr, ps.path.remote.addrlen, ps.path.local.addr, ps.path.local.addrlen, buf.data(), - bufpos - buf.data(), SHRPX_MAX_UDP_PAYLOAD_SIZE); + bufpos - buf.data(), max_udp_payload_size); ngtcp2_conn_update_pkt_tx_time(conn_, ts); reset_idle_timer(); @@ -1241,7 +1242,7 @@ void Http3Upstream::on_handler_delete() { !ngtcp2_conn_is_in_draining_period(conn_)) { ngtcp2_path_storage ps; ngtcp2_pkt_info pi; - std::array buf; + std::array buf; ngtcp2_path_storage_zero(&ps); @@ -1529,7 +1530,7 @@ int Http3Upstream::handle_error() { auto ts = quic_timestamp(); - std::array buf; + std::array buf; ngtcp2_ssize nwrite; if (last_error_.type == quic::ErrorType::Transport) { diff --git a/src/shrpx_quic.h b/src/shrpx_quic.h index 8fd64245..a03d260e 100644 --- a/src/shrpx_quic.h +++ b/src/shrpx_quic.h @@ -37,7 +37,7 @@ struct UpstreamAddr; constexpr size_t SHRPX_QUIC_SCIDLEN = 20; constexpr size_t SHRPX_QUIC_CID_PREFIXLEN = 8; -constexpr size_t SHRPX_MAX_UDP_PAYLOAD_SIZE = NGTCP2_MAX_PKTLEN_IPV4; +constexpr size_t SHRPX_QUIC_MAX_UDP_PAYLOAD_SIZE = 1472; constexpr size_t SHRPX_QUIC_STATELESS_RESET_SECRETLEN = 32; constexpr size_t SHRPX_QUIC_TOKEN_SECRETLEN = 32; constexpr size_t SHRPX_QUIC_TOKEN_RAND_DATALEN = 16; diff --git a/src/shrpx_quic_connection_handler.cc b/src/shrpx_quic_connection_handler.cc index b71b8588..5f7bdfcd 100644 --- a/src/shrpx_quic_connection_handler.cc +++ b/src/shrpx_quic_connection_handler.cc @@ -315,7 +315,7 @@ int QUICConnectionHandler::send_retry( return -1; } - std::array buf; + std::array buf; auto nwrite = ngtcp2_crypto_write_retry(buf.data(), buf.size(), version, &iscid, @@ -339,7 +339,7 @@ int QUICConnectionHandler::send_version_negotiation( sv[0] = generate_reserved_version(remote_addr, version); sv[1] = NGTCP2_PROTO_VER_V1; - std::array buf; + std::array buf; uint8_t rand_byte; util::random_bytes(&rand_byte, &rand_byte + 1, worker_->get_randgen()); @@ -384,7 +384,7 @@ int QUICConnectionHandler::send_stateless_reset(const UpstreamAddr *faddr, return -1; } - std::array buf; + std::array buf; auto nwrite = ngtcp2_pkt_write_stateless_reset(buf.data(), buf.size(), token.data(),