From 0c77d6b943cab4661ba4d8a921874da96bcfd2dd Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 16 May 2022 21:20:40 +0900 Subject: [PATCH] Better pack UDP packets in one GSO write --- src/h2load_quic.cc | 8 ++++++-- src/shrpx_http3_upstream.cc | 10 ++++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/h2load_quic.cc b/src/h2load_quic.cc index 437f5754..0e9a210c 100644 --- a/src/h2load_quic.cc +++ b/src/h2load_quic.cc @@ -711,6 +711,8 @@ int Client::write_quic() { std::array vec; size_t pktcnt = 0; auto max_udp_payload_size = ngtcp2_conn_get_max_udp_payload_size(quic.conn); + auto path_max_udp_payload_size = + ngtcp2_conn_get_path_max_udp_payload_size(quic.conn); size_t max_pktcnt = #ifdef UDP_SEGMENT worker->config->no_udp_gso @@ -803,7 +805,9 @@ int Client::write_quic() { if (pktcnt == 0) { gso_size = nwrite; - } else if (static_cast(nwrite) != gso_size) { + } else if (static_cast(nwrite) > gso_size || + (gso_size > path_max_udp_payload_size && + static_cast(nwrite) != gso_size)) { auto data = quic.tx.data.get(); auto datalen = bufpos - quic.tx.data.get() - nwrite; rv = write_udp(ps.path.remote.addr, ps.path.remote.addrlen, data, datalen, @@ -825,7 +829,7 @@ int Client::write_quic() { } // Assume that the path does not change. - if (++pktcnt == max_pktcnt) { + if (++pktcnt == max_pktcnt || static_cast(nwrite) < gso_size) { auto data = quic.tx.data.get(); auto datalen = bufpos - quic.tx.data.get(); rv = write_udp(ps.path.remote.addr, ps.path.remote.addrlen, data, datalen, diff --git a/src/shrpx_http3_upstream.cc b/src/shrpx_http3_upstream.cc index f8e6048f..0232728b 100644 --- a/src/shrpx_http3_upstream.cc +++ b/src/shrpx_http3_upstream.cc @@ -706,6 +706,10 @@ int Http3Upstream::on_write() { int Http3Upstream::write_streams() { std::array vec; auto max_udp_payload_size = ngtcp2_conn_get_max_udp_payload_size(conn_); +#ifdef UDP_SEGMENT + auto path_max_udp_payload_size = + ngtcp2_conn_get_path_max_udp_payload_size(conn_); +#endif // UDP_SEGMENT size_t max_pktcnt = std::min(static_cast(64_k), ngtcp2_conn_get_send_quantum(conn_)) / max_udp_payload_size; @@ -860,7 +864,9 @@ int Http3Upstream::write_streams() { gso_size = nwrite; } else if (!ngtcp2_path_eq(&prev_ps.path, &ps.path) || prev_pi.ecn != pi.ecn || - static_cast(nwrite) != gso_size) { + static_cast(nwrite) > gso_size || + (gso_size > path_max_udp_payload_size && + static_cast(nwrite) != gso_size)) { auto faddr = static_cast(prev_ps.path.user_data); auto data = tx_.data.get(); auto datalen = bufpos - data - nwrite; @@ -902,7 +908,7 @@ int Http3Upstream::write_streams() { return 0; } - if (++pktcnt == max_pktcnt) { + if (++pktcnt == max_pktcnt || static_cast(nwrite) < gso_size) { auto faddr = static_cast(ps.path.user_data); auto data = tx_.data.get(); auto datalen = bufpos - data;