1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-08-01 01:44:22 +03:00

Don't drop datagrams if the frame has no room for them

Reviewed By: afrind, mjoras

Differential Revision: D32608442

fbshipit-source-id: fbd5de333571a2855d8243e7987b5e98ded527fb
This commit is contained in:
Luca Niccolini
2021-12-01 00:11:16 -08:00
committed by Facebook GitHub Bot
parent 4f465f64f1
commit 4a75224cc9
2 changed files with 47 additions and 24 deletions

View File

@ -632,9 +632,6 @@ bool DatagramFrameScheduler::writeDatagramFrames(
if (writeFrame(datagramFrame, builder) > 0) { if (writeFrame(datagramFrame, builder) > 0) {
conn_.datagramState.writeBuffer.pop_front(); conn_.datagramState.writeBuffer.pop_front();
sent = true; sent = true;
} else {
payload = datagramFrame.data.move();
break;
} }
if (conn_.transportSettings.datagramConfig.framePerPacket) { if (conn_.transportSettings.datagramConfig.framePerPacket) {
break; break;

View File

@ -1850,18 +1850,18 @@ TEST_F(QuicPacketSchedulerTest, DatagramFrameSchedulerMultipleFramesPerPacket) {
conn.transportSettings.datagramConfig.framePerPacket = false; conn.transportSettings.datagramConfig.framePerPacket = false;
DatagramFrameScheduler scheduler(conn); DatagramFrameScheduler scheduler(conn);
// Add datagrams // Add datagrams
conn.datagramState.writeBuffer.emplace_back( std::string s1(conn.udpSendPacketLen / 3, '*');
folly::IOBuf::createChain(conn.udpSendPacketLen / 3, 4096)); conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s1));
conn.datagramState.writeBuffer.emplace_back( std::string s2(conn.udpSendPacketLen / 3, '%');
folly::IOBuf::createChain(conn.udpSendPacketLen / 3, 4096)); conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s2));
NiceMock<MockQuicPacketBuilder> builder2; NiceMock<MockQuicPacketBuilder> builder;
EXPECT_CALL(builder2, remainingSpaceInPkt()).WillRepeatedly(Return(4096)); EXPECT_CALL(builder, remainingSpaceInPkt()).WillRepeatedly(Return(4096));
EXPECT_CALL(builder2, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) { EXPECT_CALL(builder, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) {
builder2.frames_.push_back(f); builder.frames_.push_back(f);
})); }));
// Call scheduler // Call scheduler
auto& frames = builder2.frames_; auto& frames = builder.frames_;
scheduler.writeDatagramFrames(builder2); scheduler.writeDatagramFrames(builder);
ASSERT_EQ(frames.size(), 2); ASSERT_EQ(frames.size(), 2);
} }
@ -1873,23 +1873,49 @@ TEST_F(QuicPacketSchedulerTest, DatagramFrameSchedulerOneFramePerPacket) {
conn.transportSettings.datagramConfig.framePerPacket = true; conn.transportSettings.datagramConfig.framePerPacket = true;
DatagramFrameScheduler scheduler(conn); DatagramFrameScheduler scheduler(conn);
// Add datagrams // Add datagrams
conn.datagramState.writeBuffer.emplace_back( std::string s1(conn.udpSendPacketLen / 3, '*');
folly::IOBuf::createChain(conn.udpSendPacketLen / 3, 4096)); conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s1));
conn.datagramState.writeBuffer.emplace_back( std::string s2(conn.udpSendPacketLen / 3, '%');
folly::IOBuf::createChain(conn.udpSendPacketLen / 3, 4096)); conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s2));
NiceMock<MockQuicPacketBuilder> builder2; NiceMock<MockQuicPacketBuilder> builder;
EXPECT_CALL(builder2, remainingSpaceInPkt()).WillRepeatedly(Return(4096)); EXPECT_CALL(builder, remainingSpaceInPkt()).WillRepeatedly(Return(4096));
EXPECT_CALL(builder2, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) { EXPECT_CALL(builder, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) {
builder2.frames_.push_back(f); builder.frames_.push_back(f);
})); }));
// Call scheduler // Call scheduler
auto& frames = builder2.frames_; auto& frames = builder.frames_;
scheduler.writeDatagramFrames(builder2); scheduler.writeDatagramFrames(builder);
ASSERT_EQ(frames.size(), 1); ASSERT_EQ(frames.size(), 1);
scheduler.writeDatagramFrames(builder2); scheduler.writeDatagramFrames(builder);
ASSERT_EQ(frames.size(), 2); ASSERT_EQ(frames.size(), 2);
} }
TEST_F(QuicPacketSchedulerTest, DatagramFrameWriteWhenRoomAvailable) {
QuicClientConnectionState conn(
FizzClientQuicHandshakeContext::Builder().build());
conn.datagramState.maxReadFrameSize = std::numeric_limits<uint16_t>::max();
conn.datagramState.maxReadBufferSize = 10;
conn.transportSettings.datagramConfig.framePerPacket = true;
DatagramFrameScheduler scheduler(conn);
// Add datagram
std::string s(conn.udpSendPacketLen / 3, '*');
conn.datagramState.writeBuffer.emplace_back(folly::IOBuf::copyBuffer(s));
NiceMock<MockQuicPacketBuilder> builder;
EXPECT_CALL(builder, remainingSpaceInPkt())
.WillRepeatedly(Return(conn.udpSendPacketLen / 4));
EXPECT_CALL(builder, appendFrame(_)).WillRepeatedly(Invoke([&](auto f) {
builder.frames_.push_back(f);
}));
// Call scheduler
auto& frames = builder.frames_;
scheduler.writeDatagramFrames(builder);
ASSERT_EQ(frames.size(), 0);
EXPECT_CALL(builder, remainingSpaceInPkt())
.WillRepeatedly(Return(conn.udpSendPacketLen / 2));
scheduler.writeDatagramFrames(builder);
ASSERT_EQ(frames.size(), 1);
}
INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P(
QuicPacketSchedulerTests, QuicPacketSchedulerTests,
QuicPacketSchedulerTest, QuicPacketSchedulerTest,