1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-08 09:42:06 +03:00

Immediately retransmit initial packets in writeCryptoAndAckDataToSocket

Summary: In `writeCryptoAndAckDataToSocket`, add an additional `writeProbingDataToSocket` call at the end that is limited to the number of CRYPTO frame-containing packets just written, gated by the new `TransportSetttings` field `immediatelyRetransmitInitialPackets`.

Reviewed By: mjoras

Differential Revision: D64485616

fbshipit-source-id: f0927a3796767700fd46673195e1cd4e1bbbcbeb
This commit is contained in:
Jolene Tan
2024-10-24 15:30:20 -07:00
committed by Facebook GitHub Bot
parent cc14fe8d55
commit 1dad9543b9
3 changed files with 55 additions and 1 deletions

View File

@@ -1107,7 +1107,7 @@ WriteQuicDataResult writeCryptoAndAckDataToSocket(
connection, connection,
srcConnId, srcConnId,
dstConnId, dstConnId,
std::move(builder), builder,
LongHeader::typeToPacketNumberSpace(packetType), LongHeader::typeToPacketNumberSpace(packetType),
scheduler, scheduler,
congestionControlWritableBytes, congestionControlWritableBytes,
@@ -1121,6 +1121,27 @@ WriteQuicDataResult writeCryptoAndAckDataToSocket(
packetsWritten += writeResult.packetsWritten; packetsWritten += writeResult.packetsWritten;
bytesWritten += writeResult.bytesWritten; bytesWritten += writeResult.bytesWritten;
if (connection.transportSettings.immediatelyRetransmitInitialPackets &&
packetsWritten > 0 && packetsWritten < packetLimit) {
auto remainingLimit = packetLimit - packetsWritten;
auto cloneResult = writeProbingDataToSocket(
sock,
connection,
srcConnId,
dstConnId,
builder,
encryptionLevel,
LongHeader::typeToPacketNumberSpace(packetType),
scheduler,
packetsWritten < remainingLimit ? packetsWritten : remainingLimit,
cleartextCipher,
headerCipher,
version,
token);
probesWritten += cloneResult.probesWritten;
bytesWritten += cloneResult.bytesWritten;
}
VLOG_IF(10, packetsWritten || probesWritten) VLOG_IF(10, packetsWritten || probesWritten)
<< nodeToString(connection.nodeType) << nodeToString(connection.nodeType)
<< " written crypto and acks data type=" << packetType << " written crypto and acks data type=" << packetType

View File

@@ -3372,6 +3372,38 @@ TEST_F(QuicTransportFunctionsTest, NoCryptoProbeWriteIfNoProbeCredit) {
EXPECT_EQ(0, res.probesWritten); EXPECT_EQ(0, res.probesWritten);
} }
TEST_F(QuicTransportFunctionsTest, ImmediatelyRetransmitInitialPackets) {
auto conn = createConn();
conn->transportSettings.immediatelyRetransmitInitialPackets = true;
auto cryptoStream = &conn->cryptoState->initialStream;
auto buf = buildRandomInputData(1600);
writeDataToQuicStream(*cryptoStream, buf->clone());
EventBase evb;
std::shared_ptr<FollyQuicEventBase> qEvb =
std::make_shared<FollyQuicEventBase>(&evb);
auto socket =
std::make_unique<NiceMock<quic::test::MockAsyncUDPSocket>>(qEvb);
auto rawSocket = socket.get();
auto res = writeCryptoAndAckDataToSocket(
*rawSocket,
*conn,
*conn->clientConnectionId,
*conn->serverConnectionId,
LongHeader::Types::Initial,
*conn->initialWriteCipher,
*conn->initialHeaderCipher,
getVersion(*conn),
conn->transportSettings.writeConnectionDataPacketsLimit);
EXPECT_GE(res.bytesWritten, buf->computeChainDataLength());
EXPECT_EQ(2, res.packetsWritten);
EXPECT_EQ(2, res.probesWritten);
EXPECT_EQ(conn->udpSendPacketLen * 4, res.bytesWritten);
ASSERT_EQ(4, conn->outstandings.packets.size());
ASSERT_EQ(2, cryptoStream->retransmissionBuffer.size());
ASSERT_TRUE(cryptoStream->pendingWrites.empty());
}
TEST_F(QuicTransportFunctionsTest, ResetNumProbePackets) { TEST_F(QuicTransportFunctionsTest, ResetNumProbePackets) {
auto conn = createConn(); auto conn = createConn();
EventBase evb; EventBase evb;

View File

@@ -415,6 +415,7 @@ struct TransportSettings {
// Raise read callbacks for all unidirectional streams first on data // Raise read callbacks for all unidirectional streams first on data
// reception. // reception.
bool unidirectionalStreamsReadCallbacksFirst{false}; bool unidirectionalStreamsReadCallbacksFirst{false};
bool immediatelyRetransmitInitialPackets{false};
}; };
} // namespace quic } // namespace quic