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:
committed by
Facebook GitHub Bot
parent
cc14fe8d55
commit
1dad9543b9
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user