11#include " source/common/quic/envoy_quic_server_connection.h"
22
3+ #include < memory>
4+
35#include " source/common/network/listen_socket_impl.h"
46#include " source/common/quic/envoy_quic_utils.h"
57#include " source/common/quic/quic_io_handle_wrapper.h"
68
9+ #include " quiche/quic/core/quic_packet_writer_wrapper.h"
710#include " quiche/quic/core/quic_packets.h"
811
912namespace Envoy {
1013namespace Quic {
1114
15+ namespace {
16+ std::unique_ptr<quic::QuicPacketWriterWrapper>
17+ wrapWriter (quic::QuicPacketWriter* writer, bool owns_writer,
18+ quic::QuicPacketWriterWrapper::OnWriteDoneCallback on_write_done) {
19+ auto wrapper = std::make_unique<quic::QuicPacketWriterWrapper>();
20+ if (owns_writer) {
21+ wrapper->set_writer (writer);
22+ } else {
23+ wrapper->set_non_owning_writer (writer);
24+ }
25+ wrapper->set_on_write_done (std::move (on_write_done));
26+ return wrapper;
27+ }
28+ } // namespace
29+
1230EnvoyQuicServerConnection::EnvoyQuicServerConnection (
1331 const quic::QuicConnectionId& server_connection_id,
1432 quic::QuicSocketAddress initial_self_address, quic::QuicSocketAddress initial_peer_address,
@@ -17,9 +35,15 @@ EnvoyQuicServerConnection::EnvoyQuicServerConnection(
1735 const quic::ParsedQuicVersionVector& supported_versions,
1836 Network::ConnectionSocketPtr connection_socket, quic::ConnectionIdGeneratorInterface& generator,
1937 std::unique_ptr<QuicListenerFilterManagerImpl> listener_filter_manager)
20- : quic::QuicConnection(server_connection_id, initial_self_address, initial_peer_address,
21- &helper, &alarm_factory, writer, owns_writer,
22- quic::Perspective::IS_SERVER, supported_versions, generator),
38+ : quic::QuicConnection(
39+ server_connection_id, initial_self_address, initial_peer_address, &helper, &alarm_factory,
40+ // Wrap the packet writer to get notified when a packet is written.
41+ wrapWriter (writer, owns_writer,
42+ [this ](size_t packet_size, const quic::WriteResult& result) {
43+ OnWritePacketDone (packet_size, result);
44+ })
45+ .release(),
46+ /* owns_writer=*/ true , quic::Perspective::IS_SERVER, supported_versions, generator),
2347 QuicNetworkConnection (std::move(connection_socket)),
2448 listener_filter_manager_(std::move(listener_filter_manager)) {
2549#ifndef WIN32
@@ -47,6 +71,13 @@ bool EnvoyQuicServerConnection::OnPacketHeader(const quic::QuicPacketHeader& hea
4771 return true ;
4872}
4973
74+ void EnvoyQuicServerConnection::OnWritePacketDone (size_t packet_size,
75+ const quic::WriteResult& /* result*/ ) {
76+ if (hasConnectionStats ()) {
77+ connectionStats ().write_total_ .add (packet_size);
78+ }
79+ }
80+
5081void EnvoyQuicServerConnection::OnCanWrite () {
5182 quic::QuicConnection::OnCanWrite ();
5283 onWriteEventDone ();
0 commit comments