Support datagrams in QuicTransport. gfe-relnote: n/a (no functional change to production code) PiperOrigin-RevId: 288493541 Change-Id: I6d2a791ae062701ad4b9fb650ab267566373675f
diff --git a/quic/core/quic_datagram_queue.cc b/quic/core/quic_datagram_queue.cc index d9ed53f..073ee10 100644 --- a/quic/core/quic_datagram_queue.cc +++ b/quic/core/quic_datagram_queue.cc
@@ -5,6 +5,7 @@ #include "net/third_party/quiche/src/quic/core/quic_datagram_queue.h" #include "net/third_party/quiche/src/quic/core/quic_constants.h" +#include "net/third_party/quiche/src/quic/core/quic_session.h" #include "net/third_party/quiche/src/quic/core/quic_time.h" #include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice_span.h"
diff --git a/quic/core/quic_datagram_queue.h b/quic/core/quic_datagram_queue.h index 2cb8576..712a56e 100644 --- a/quic/core/quic_datagram_queue.h +++ b/quic/core/quic_datagram_queue.h
@@ -5,13 +5,16 @@ #ifndef QUICHE_QUIC_CORE_QUIC_DATAGRAM_QUEUE_H_ #define QUICHE_QUIC_CORE_QUIC_DATAGRAM_QUEUE_H_ -#include "net/third_party/quiche/src/quic/core/quic_session.h" #include "net/third_party/quiche/src/quic/core/quic_time.h" +#include "net/third_party/quiche/src/quic/core/quic_types.h" #include "net/third_party/quiche/src/quic/platform/api/quic_containers.h" #include "net/third_party/quiche/src/quic/platform/api/quic_mem_slice.h" +#include "net/third_party/quiche/src/quic/platform/api/quic_optional.h" namespace quic { +class QuicSession; + // Provides a way to buffer QUIC datagrams (messages) in case they cannot // be sent due to congestion control. Datagrams are buffered for a limited // amount of time, and deleted after that time passes. @@ -43,6 +46,8 @@ size_t queue_size() { return queue_.size(); } + bool empty() { return queue_.empty(); } + private: struct QUIC_EXPORT_PRIVATE Datagram { QuicMemSlice datagram;
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index c5fe37b..55ce02d 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -94,6 +94,7 @@ goaway_received_(false), control_frame_manager_(this), last_message_id_(0), + datagram_queue_(this), closed_streams_clean_up_alarm_(nullptr), supported_versions_(supported_versions), use_http2_priority_write_scheduler_(false), @@ -571,6 +572,7 @@ ? write_blocked_streams_.NumBlockedSpecialStreams() : write_blocked_streams_.NumBlockedStreams(); if (num_writes == 0 && !control_frame_manager_.WillingToWrite() && + datagram_queue_.empty() && (!QuicVersionUsesCryptoFrames(transport_version()) || !GetCryptoStream()->HasBufferedCryptoFrames())) { return; @@ -591,6 +593,15 @@ if (control_frame_manager_.WillingToWrite()) { control_frame_manager_.OnCanWrite(); } + // TODO(b/147146815): this makes all datagrams go before stream data. We + // should have a better priority scheme for this. + if (!datagram_queue_.empty()) { + size_t written = datagram_queue_.SendDatagrams(); + QUIC_DVLOG(1) << ENDPOINT << "Sent " << written << " datagrams"; + if (!datagram_queue_.empty()) { + return; + } + } for (size_t i = 0; i < num_writes; ++i) { if (!(write_blocked_streams_.HasWriteBlockedSpecialStream() || write_blocked_streams_.HasWriteBlockedDataStreams())) {
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index b818737..f10b548 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -19,6 +19,7 @@ #include "net/third_party/quiche/src/quic/core/quic_connection.h" #include "net/third_party/quiche/src/quic/core/quic_control_frame_manager.h" #include "net/third_party/quiche/src/quic/core/quic_crypto_stream.h" +#include "net/third_party/quiche/src/quic/core/quic_datagram_queue.h" #include "net/third_party/quiche/src/quic/core/quic_error_codes.h" #include "net/third_party/quiche/src/quic/core/quic_packet_creator.h" #include "net/third_party/quiche/src/quic/core/quic_packets.h" @@ -616,6 +617,8 @@ return stream_id_manager_; } + QuicDatagramQueue* datagram_queue() { return &datagram_queue_; } + // Processes the stream type information of |pending| depending on // different kinds of sessions' own rules. Returns true if the pending stream // is converted into a normal stream. @@ -788,6 +791,9 @@ // Id of latest successfully sent message. QuicMessageId last_message_id_; + // The buffer used to queue the DATAGRAM frames. + QuicDatagramQueue datagram_queue_; + // TODO(fayang): switch to linked_hash_set when chromium supports it. The bool // is not used here. // List of streams with pending retransmissions.