Modify the visitor to allow it to interact with packets written by the packet exchanger. PiperOrigin-RevId: 651483615
diff --git a/quiche/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc b/quiche/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc index e6cb919..988b00e 100644 --- a/quiche/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc +++ b/quiche/quic/qbone/bonnet/tun_device_packet_exchanger_test.cc
@@ -6,6 +6,8 @@ #include <string> +#include "absl/status/status.h" +#include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/qbone/bonnet/mock_packet_exchanger_stats_interface.h" #include "quiche/quic/qbone/mock_qbone_client.h" @@ -27,6 +29,7 @@ public: MOCK_METHOD(void, OnReadError, (const std::string&), (override)); MOCK_METHOD(void, OnWriteError, (const std::string&), (override)); + MOCK_METHOD(absl::Status, OnWrite, (absl::string_view), (override)); }; class TunDevicePacketExchangerTest : public QuicTest { @@ -56,6 +59,7 @@ })); EXPECT_CALL(mock_visitor_, OnWriteError(_)); + EXPECT_CALL(mock_visitor_, OnWrite(StrEq(packet))).Times(1); exchanger_.WritePacketToNetwork(packet.data(), packet.size()); } @@ -69,6 +73,7 @@ })); EXPECT_CALL(mock_stats_, OnWriteError(_)).Times(1); + EXPECT_CALL(mock_visitor_, OnWrite(StrEq(packet))).Times(1); exchanger_.WritePacketToNetwork(packet.data(), packet.size()); } @@ -81,6 +86,7 @@ })); EXPECT_CALL(mock_stats_, OnPacketWritten(_)).Times(1); + EXPECT_CALL(mock_visitor_, OnWrite(StrEq(packet))).Times(1); exchanger_.WritePacketToNetwork(packet.data(), packet.size()); }
diff --git a/quiche/quic/qbone/qbone_packet_exchanger.cc b/quiche/quic/qbone/qbone_packet_exchanger.cc index aa99a78..f82292c 100644 --- a/quiche/quic/qbone/qbone_packet_exchanger.cc +++ b/quiche/quic/qbone/qbone_packet_exchanger.cc
@@ -8,6 +8,8 @@ #include <string> #include <utility> +#include "absl/status/status.h" + namespace quic { bool QbonePacketExchanger::ReadAndDeliverPacket( @@ -27,6 +29,13 @@ void QbonePacketExchanger::WritePacketToNetwork(const char* packet, size_t size) { + if (visitor_) { + absl::Status status = visitor_->OnWrite(packet); + if (!status.ok()) { + QUIC_LOG_EVERY_N_SEC(ERROR, 60) << status; + } + } + bool blocked = false; std::string error; if (packet_queue_.empty() && !write_blocked_) {
diff --git a/quiche/quic/qbone/qbone_packet_exchanger.h b/quiche/quic/qbone/qbone_packet_exchanger.h index 4fd617b..c69f9b8 100644 --- a/quiche/quic/qbone/qbone_packet_exchanger.h +++ b/quiche/quic/qbone/qbone_packet_exchanger.h
@@ -5,6 +5,8 @@ #ifndef QUICHE_QUIC_QBONE_QBONE_PACKET_EXCHANGER_H_ #define QUICHE_QUIC_QBONE_QBONE_PACKET_EXCHANGER_H_ +#include "absl/status/status.h" +#include "absl/strings/string_view.h" #include "quiche/quic/core/quic_packets.h" #include "quiche/quic/qbone/qbone_client_interface.h" #include "quiche/quic/qbone/qbone_packet_writer.h" @@ -21,6 +23,9 @@ virtual ~Visitor() {} virtual void OnReadError(const std::string& error) {} virtual void OnWriteError(const std::string& error) {} + virtual absl::Status OnWrite(absl::string_view packet) { + return absl::OkStatus(); + } }; // Does not take ownership of visitor. QbonePacketExchanger(Visitor* visitor, size_t max_pending_packets)
diff --git a/quiche/quic/qbone/qbone_packet_exchanger_test.cc b/quiche/quic/qbone/qbone_packet_exchanger_test.cc index 1663907..e9371e4 100644 --- a/quiche/quic/qbone/qbone_packet_exchanger_test.cc +++ b/quiche/quic/qbone/qbone_packet_exchanger_test.cc
@@ -10,6 +10,8 @@ #include <utility> #include <vector> +#include "absl/status/status.h" +#include "absl/strings/string_view.h" #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/qbone/mock_qbone_client.h" @@ -25,6 +27,7 @@ public: MOCK_METHOD(void, OnReadError, (const std::string&), (override)); MOCK_METHOD(void, OnWriteError, (const std::string&), (override)); + MOCK_METHOD(absl::Status, OnWrite, (absl::string_view), (override)); }; class FakeQbonePacketExchanger : public QbonePacketExchanger {