diff --git a/quic/QuicConstants.cpp b/quic/QuicConstants.cpp index 74794563c..b795126fe 100644 --- a/quic/QuicConstants.cpp +++ b/quic/QuicConstants.cpp @@ -109,6 +109,8 @@ folly::StringPiece writeDataReasonString(WriteDataReason reason) { return "PathChallenge"; case WriteDataReason::PING: return "Ping"; + case WriteDataReason::DATAGRAM: + return "Datagram"; case WriteDataReason::NO_WRITE: return "NoWrite"; } diff --git a/quic/QuicConstants.h b/quic/QuicConstants.h index 27c65aa4f..98b692546 100644 --- a/quic/QuicConstants.h +++ b/quic/QuicConstants.h @@ -566,6 +566,7 @@ enum class WriteDataReason { RESET, PATHCHALLENGE, PING, + DATAGRAM, }; enum class NoWriteReason { diff --git a/quic/api/QuicTransportFunctions.cpp b/quic/api/QuicTransportFunctions.cpp index d1cfbbc4b..35f0e43b0 100644 --- a/quic/api/QuicTransportFunctions.cpp +++ b/quic/api/QuicTransportFunctions.cpp @@ -1595,6 +1595,9 @@ WriteDataReason hasNonAckDataToWrite(const QuicConnectionStateBase& conn) { if (conn.pendingEvents.sendPing) { return WriteDataReason::PING; } + if (!conn.datagramState.writeBuffer.empty()) { + return WriteDataReason::DATAGRAM; + } return WriteDataReason::NO_WRITE; } diff --git a/quic/api/test/QuicTransportFunctionsTest.cpp b/quic/api/test/QuicTransportFunctionsTest.cpp index c77ea0dab..3614c19df 100644 --- a/quic/api/test/QuicTransportFunctionsTest.cpp +++ b/quic/api/test/QuicTransportFunctionsTest.cpp @@ -2893,6 +2893,15 @@ TEST_F(QuicTransportFunctionsTest, HasAppDataToWrite) { EXPECT_EQ(WriteDataReason::STREAM, hasNonAckDataToWrite(*conn)); } +TEST_F(QuicTransportFunctionsTest, HasDatagramsToWrite) { + auto conn = createConn(); + conn->oneRttWriteCipher = test::createNoOpAead(); + EXPECT_EQ(WriteDataReason::NO_WRITE, hasNonAckDataToWrite(*conn)); + conn->datagramState.writeBuffer.emplace_back( + folly::IOBuf::copyBuffer("I'm an unreliable Datagram")); + EXPECT_EQ(WriteDataReason::DATAGRAM, hasNonAckDataToWrite(*conn)); +} + TEST_F(QuicTransportFunctionsTest, UpdateConnectionCloneCounterAppData) { auto conn = createConn(); ASSERT_EQ(