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