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:
committed by
Facebook GitHub Bot
parent
4f465f64f1
commit
4a75224cc9
@ -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;
|
||||||
|
@ -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,
|
||||||
|
Reference in New Issue
Block a user