diff --git a/quic/api/QuicGsoBatchWriters.cpp b/quic/api/QuicGsoBatchWriters.cpp index 900364105..9a2feef58 100644 --- a/quic/api/QuicGsoBatchWriters.cpp +++ b/quic/api/QuicGsoBatchWriters.cpp @@ -72,13 +72,13 @@ bool GSOPacketBatchWriter::append( ssize_t GSOPacketBatchWriter::write( QuicAsyncUDPSocketType& sock, const folly::SocketAddress& address) { - return (currBufs_ > 1) - ? sock.writeGSO( - address, - buf_, - folly::AsyncUDPSocket::WriteOptions( - static_cast(prevSize_) /*gsoVal*/, false /* zerocopyVal*/)) - : sock.write(address, buf_); + // Even though it's called writeGSO, it can handle individual writes by + // setting gsoVal = 0. + int gsoVal = currBufs_ > 1 ? static_cast(prevSize_) : 0; + return sock.writeGSO( + address, + buf_, + folly::AsyncUDPSocket::WriteOptions(gsoVal, false /* zerocopyVal */)); } GSOInplacePacketBatchWriter::GSOInplacePacketBatchWriter( @@ -155,13 +155,13 @@ ssize_t GSOInplacePacketBatchWriter::write( } uint64_t diffToStart = lastPacketEnd_ - buf->data(); buf->trimEnd(diffToEnd); - auto bytesWritten = (numPackets_ > 1) - ? sock.writeGSO( - address, - buf, - folly::AsyncUDPSocket::WriteOptions( - static_cast(prevSize_) /*gsoVal*/, false /* zerocopyVal*/)) - : sock.write(address, buf); + // Even though it's called writeGSO, it can handle individual writes by + // setting gsoVal = 0. + int gsoVal = numPackets_ > 1 ? static_cast(prevSize_) : 0; + auto bytesWritten = sock.writeGSO( + address, + buf, + folly::AsyncUDPSocket::WriteOptions(gsoVal, false /* zerocopyVal */)); /** * If there is one more bytes after lastPacketEnd_, that means there is a * packet we choose not to write in this batch (e.g., it has a size larger diff --git a/quic/api/test/QuicBatchWriterTest.cpp b/quic/api/test/QuicBatchWriterTest.cpp index 3cafa6d16..ad5daa9fc 100644 --- a/quic/api/test/QuicBatchWriterTest.cpp +++ b/quic/api/test/QuicBatchWriterTest.cpp @@ -515,10 +515,11 @@ TEST_P(QuicBatchWriterTest, InplaceWriterWriteOne) { ASSERT_FALSE( batchWriter->append(nullptr, 1000, folly::SocketAddress(), nullptr)); - EXPECT_CALL(sock, write(_, _)) + EXPECT_CALL(sock, writeGSO(_, _, _)) .Times(1) .WillOnce(Invoke([&](const auto& /* addr */, - const std::unique_ptr& buf) { + const std::unique_ptr& buf, + auto) { EXPECT_EQ(1000, buf->length()); return 1000; })); @@ -606,10 +607,11 @@ TEST_P(QuicBatchWriterTest, InplaceWriterBufResidueCheck) { rawBuf->append(packetSizeBig); EXPECT_TRUE(batchWriter->needsFlush(packetSizeBig)); - EXPECT_CALL(sock, write(_, _)) + EXPECT_CALL(sock, writeGSO(_, _, _)) .Times(1) .WillOnce(Invoke([&](const auto& /* addr */, - const std::unique_ptr& buf) { + const std::unique_ptr& buf, + auto) { EXPECT_EQ(700, buf->length()); return 700; })); diff --git a/quic/api/test/QuicTransportFunctionsTest.cpp b/quic/api/test/QuicTransportFunctionsTest.cpp index e60053c27..ea241aa40 100644 --- a/quic/api/test/QuicTransportFunctionsTest.cpp +++ b/quic/api/test/QuicTransportFunctionsTest.cpp @@ -4351,10 +4351,11 @@ TEST_F(QuicTransportFunctionsTest, WriteWithInplaceBuilder) { auto stream = conn->streamManager->createNextBidirectionalStream().value(); auto buf = folly::IOBuf::copyBuffer("Andante in C minor"); writeDataToQuicStream(*stream, buf->clone(), true); - EXPECT_CALL(mockSock, write(_, _)) + EXPECT_CALL(mockSock, writeGSO(_, _, _)) .Times(1) .WillOnce(Invoke([&](const SocketAddress&, - const std::unique_ptr& sockBuf) { + const std::unique_ptr& sockBuf, + auto) { EXPECT_GT(bufPtr->length(), 0); EXPECT_GE(sockBuf->length(), buf->length()); EXPECT_EQ(sockBuf.get(), bufPtr); @@ -4499,10 +4500,11 @@ TEST_F(QuicTransportFunctionsTest, WriteProbingWithInplaceBuilder) { conn->outstandings.packets.front().metadata.encodedSize; auto outstandingPacketsCount = conn->outstandings.packets.size(); ASSERT_EQ(firstPacketSize, conn->udpSendPacketLen); - EXPECT_CALL(mockSock, write(_, _)) + EXPECT_CALL(mockSock, writeGSO(_, _, _)) .Times(1) .WillOnce(Invoke([&](const folly::SocketAddress&, - const std::unique_ptr& buf) { + const std::unique_ptr& buf, + auto) { EXPECT_FALSE(buf->isChained()); EXPECT_EQ(buf->length(), firstPacketSize); return buf->length();