Send padding if there's nothing to retransmit in Quartc's SendProbingData().
If there is anything to retransmit, Quartc will use it for probing. If not,
Quartc will simply send a packet full of padding. (The latter will be useful
when Quartc only sends datagram frames.)
gfe-relnote: n/a (probing retransmissions only used by Quartc)
PiperOrigin-RevId: 245822135
Change-Id: Ia9ef50ba6cc649fc70530b64031d5ea19fcc9d24
diff --git a/quic/quartc/quartc_session.cc b/quic/quartc/quartc_session.cc
index 80031dd..38e1c62 100644
--- a/quic/quartc/quartc_session.cc
+++ b/quic/quartc/quartc_session.cc
@@ -64,6 +64,8 @@
}
void QuartcSession::ProcessSendMessageQueue() {
+ QuicConnection::ScopedPacketFlusher flusher(
+ connection(), QuicConnection::AckBundling::NO_ACK);
while (!send_message_queue_.empty()) {
struct iovec iov = {const_cast<char*>(send_message_queue_.front().data()),
send_message_queue_.front().length()};
@@ -120,6 +122,17 @@
QuicSession::OnCanWrite();
}
+bool QuartcSession::SendProbingData() {
+ if (QuicSession::SendProbingData()) {
+ return true;
+ }
+
+ SetTransmissionType(PROBING_RETRANSMISSION);
+ SendPing();
+ WriteControlFrame(QuicFrame(QuicPaddingFrame()));
+ return true;
+}
+
void QuartcSession::OnCryptoHandshakeEvent(CryptoHandshakeEvent event) {
QuicSession::OnCryptoHandshakeEvent(event);
switch (event) {
@@ -197,7 +210,7 @@
void QuartcSession::SetDelegate(Delegate* session_delegate) {
if (session_delegate_) {
- LOG(WARNING) << "The delegate for the session has already been set.";
+ QUIC_LOG(WARNING) << "The delegate for the session has already been set.";
}
session_delegate_ = session_delegate;
DCHECK(session_delegate_);
@@ -337,7 +350,7 @@
std::vector<std::string>{kDummyCertName}, /*cert_sct=*/"",
/*chlo_hash=*/"", /*signature=*/"anything");
} else {
- LOG(DFATAL) << "Unable to set server config, error=" << error;
+ QUIC_LOG(DFATAL) << "Unable to set server config, error=" << error;
}
}
diff --git a/quic/quartc/quartc_session.h b/quic/quartc/quartc_session.h
index 29e6306..9da306e 100644
--- a/quic/quartc/quartc_session.h
+++ b/quic/quartc/quartc_session.h
@@ -67,6 +67,7 @@
bool ShouldKeepConnectionAlive() const override;
void OnCanWrite() override;
+ bool SendProbingData() override;
void OnConnectionClosed(QuicErrorCode error,
const std::string& error_details,
diff --git a/quic/quartc/test/quartc_peer.cc b/quic/quartc/test/quartc_peer.cc
index 8aa1c1a..036ba03 100644
--- a/quic/quartc/test/quartc_peer.cc
+++ b/quic/quartc/test/quartc_peer.cc
@@ -71,7 +71,6 @@
void QuartcPeer::OnCryptoHandshakeComplete() {
SetEnabled(true);
- session_->SendPing(); // Hack to make probing work.
}
void QuartcPeer::OnConnectionWritable() {
diff --git a/quic/quartc/test/quartc_peer_test.cc b/quic/quartc/test/quartc_peer_test.cc
index 9b4f3fb..9f76fe6 100644
--- a/quic/quartc/test/quartc_peer_test.cc
+++ b/quic/quartc/test/quartc_peer_test.cc
@@ -10,6 +10,7 @@
#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
#include "net/third_party/quiche/src/quic/quartc/quartc_endpoint.h"
#include "net/third_party/quiche/src/quic/quartc/simulated_packet_transport.h"
+#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
#include "net/third_party/quiche/src/quic/test_tools/simulator/link.h"
#include "net/third_party/quiche/src/quic/test_tools/simulator/simulator.h"
@@ -31,7 +32,9 @@
client_server_link_(&client_transport_,
&server_transport_,
QuicBandwidth::FromKBitsPerSecond(512),
- QuicTime::Delta::FromMilliseconds(100)) {}
+ QuicTime::Delta::FromMilliseconds(100)) {
+ simulator_.set_random_generator(&rng_);
+ }
void CreatePeers(const std::vector<QuartcDataSource::Config>& configs) {
client_peer_ = QuicMakeUnique<QuartcPeer>(
@@ -59,6 +62,7 @@
client_endpoint_->Connect(&client_transport_);
}
+ SimpleRandom rng_;
simulator::Simulator simulator_;
simulator::SimulatedQuartcPacketTransport client_transport_;
simulator::SimulatedQuartcPacketTransport server_transport_;
@@ -124,7 +128,7 @@
Connect();
// Run long enough for the bandwidth estimate to ramp up.
- simulator_.RunFor(QuicTime::Delta::FromSeconds(15));
+ simulator_.RunFor(QuicTime::Delta::FromSeconds(10));
// The peers generate frames that fit in one packet.
EXPECT_LT(client_peer_->received_messages().back().frame.size,
@@ -143,7 +147,7 @@
Connect();
// Run long enough for the bandwidth estimate to ramp up.
- simulator_.RunFor(QuicTime::Delta::FromSeconds(15));
+ simulator_.RunFor(QuicTime::Delta::FromSeconds(10));
// The peers generate frames that fit in one packet.
EXPECT_LT(client_peer_->received_messages().back().frame.size,
@@ -164,10 +168,7 @@
Connect();
// Run long enough for the bandwidth estimate to ramp up.
- // Note that the ramp-up time is longer for this test because of the long
- // frame_interval. This seems especially true when QUIC enables all flags for
- // testing.
- simulator_.RunFor(QuicTime::Delta::FromSeconds(30));
+ simulator_.RunFor(QuicTime::Delta::FromSeconds(10));
EXPECT_EQ(client_peer_->received_messages().back().frame.size, 100);
EXPECT_EQ(server_peer_->received_messages().back().frame.size, 100);
@@ -182,7 +183,7 @@
Connect();
// Run long enough for the bandwidth estimate to ramp up.
- simulator_.RunFor(QuicTime::Delta::FromSeconds(15));
+ simulator_.RunFor(QuicTime::Delta::FromSeconds(10));
// Max frame sizes smaller than the header are ignored, and the frame size is
// limited by packet size.
@@ -271,7 +272,7 @@
// Run for long enough that bandwidth ramps up and meets the requirements of
// all three sources.
- simulator_.RunFor(QuicTime::Delta::FromSeconds(15));
+ simulator_.RunFor(QuicTime::Delta::FromSeconds(10));
// The last message from each source should be the size allowed by that
// source's maximum bandwidth and frame interval.
@@ -323,7 +324,7 @@
Connect();
// Run for long enough that bandwidth ramps up to link capacity.
- simulator_.RunFor(QuicTime::Delta::FromSeconds(15));
+ simulator_.RunFor(QuicTime::Delta::FromSeconds(10));
const std::vector<ReceivedMessage>& client_messages =
client_peer_->received_messages();
@@ -371,7 +372,7 @@
CreatePeers({config});
Connect();
- simulator_.RunFor(QuicTime::Delta::FromSeconds(15));
+ simulator_.RunFor(QuicTime::Delta::FromSeconds(10));
// After these calls, we should observe no new messages.
server_peer_->SetEnabled(false);
@@ -382,7 +383,7 @@
std::map<int32_t, int64_t> last_sent_by_server =
server_peer_->GetLastSequenceNumbers();
- simulator_.RunFor(QuicTime::Delta::FromSeconds(15));
+ simulator_.RunFor(QuicTime::Delta::FromSeconds(10));
ASSERT_FALSE(client_peer_->received_messages().empty());
EXPECT_EQ(client_peer_->received_messages().back().frame.sequence_number,