Support datagrams in QuicTransport.
gfe-relnote: n/a (no functional change to production code)
PiperOrigin-RevId: 288493541
Change-Id: I6d2a791ae062701ad4b9fb650ab267566373675f
diff --git a/quic/quic_transport/quic_transport_client_session.cc b/quic/quic_transport/quic_transport_client_session.cc
index 7bc0473..d1f6e4c 100644
--- a/quic/quic_transport/quic_transport_client_session.cc
+++ b/quic/quic_transport/quic_transport_client_session.cc
@@ -7,9 +7,11 @@
#include <cstdint>
#include <limits>
#include <memory>
+#include <string>
#include <utility>
#include "url/gurl.h"
+#include "net/third_party/quiche/src/quic/core/quic_constants.h"
#include "net/third_party/quiche/src/quic/core/quic_crypto_client_stream.h"
#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
#include "net/third_party/quiche/src/quic/core/quic_error_codes.h"
@@ -18,6 +20,7 @@
#include "net/third_party/quiche/src/quic/core/quic_versions.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_optional.h"
#include "net/third_party/quiche/src/quic/quic_transport/quic_transport_protocol.h"
#include "net/third_party/quiche/src/quic/quic_transport/quic_transport_stream.h"
#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
@@ -35,6 +38,9 @@
void OnProofVerifyDetailsAvailable(
const ProofVerifyDetails& /*verify_details*/) override {}
};
+
+constexpr float kIncomingDatagramBufferSizeInCwnds = 2;
+
} // namespace
QuicTransportClientSession::QuicTransportClientSession(
@@ -255,4 +261,27 @@
visitor_->OnSessionReady();
}
+void QuicTransportClientSession::OnMessageReceived(
+ quiche::QuicheStringPiece message) {
+ max_incoming_datagrams_ = std::max<size_t>(
+ max_incoming_datagrams_,
+ kIncomingDatagramBufferSizeInCwnds *
+ connection()->sent_packet_manager().GetCongestionWindowInBytes());
+ if (incoming_datagrams_.size() >= max_incoming_datagrams_) {
+ return;
+ }
+
+ incoming_datagrams_.push_back(std::string(message));
+ visitor_->OnIncomingDatagramAvailable();
+}
+
+QuicOptional<std::string> QuicTransportClientSession::ReadDatagram() {
+ if (incoming_datagrams_.empty()) {
+ return QuicOptional<std::string>();
+ }
+ std::string datagram = std::move(incoming_datagrams_.front());
+ incoming_datagrams_.pop_front();
+ return datagram;
+}
+
} // namespace quic