diff --git a/quic/api/QuicTransportFunctions.cpp b/quic/api/QuicTransportFunctions.cpp index 5bc07c165..1c6b2cc91 100644 --- a/quic/api/QuicTransportFunctions.cpp +++ b/quic/api/QuicTransportFunctions.cpp @@ -787,6 +787,7 @@ void updateConnection( if (conn.transportSettings.ptoPingFrames) { retransmittable = true; } + conn.numPingFramesSent++; break; case QuicWriteFrame::Type::QuicSimpleFrame: { const QuicSimpleFrame& simpleFrame = *frame.asQuicSimpleFrame(); diff --git a/quic/api/test/QuicTransportFunctionsTest.cpp b/quic/api/test/QuicTransportFunctionsTest.cpp index 845fd04a9..b37ab4c54 100644 --- a/quic/api/test/QuicTransportFunctionsTest.cpp +++ b/quic/api/test/QuicTransportFunctionsTest.cpp @@ -1762,6 +1762,21 @@ TEST_F(QuicTransportFunctionsTest, StreamDetailsNoStreamsInPacket) { EXPECT_THAT(detailsPerStream, IsEmpty()); } +TEST_F(QuicTransportFunctionsTest, TestPingFrameCounter) { + auto conn = createConn(); + auto packet = buildEmptyPacket(*conn, PacketNumberSpace::AppData); + packet.packet.frames.push_back(PingFrame()); + updateConnection( + *conn, + none, + packet.packet, + TimePoint(), + getEncodedSize(packet), + getEncodedBodySize(packet), + false /* isDSRPacket */); + ASSERT_EQ(1, conn->numPingFramesSent); +} + TEST_F(QuicTransportFunctionsTest, StreamDetailsSingleStream) { uint64_t frameOffset = 0; uint64_t frameLen = 10; diff --git a/quic/client/QuicClientTransport.cpp b/quic/client/QuicClientTransport.cpp index 3d8b4a96b..b509ac649 100644 --- a/quic/client/QuicClientTransport.cpp +++ b/quic/client/QuicClientTransport.cpp @@ -1877,4 +1877,8 @@ uint64_t QuicClientTransport::getNumFlowControlFramesSent() const { return conn_->numWindowUpdateFramesSent; } +uint64_t QuicClientTransport::getNumPingFramesSent() const { + return conn_->numPingFramesSent; +} + } // namespace quic diff --git a/quic/client/QuicClientTransport.h b/quic/client/QuicClientTransport.h index e5cb1db9d..6cb4a95d9 100644 --- a/quic/client/QuicClientTransport.h +++ b/quic/client/QuicClientTransport.h @@ -220,6 +220,8 @@ class QuicClientTransport uint64_t getNumFlowControlFramesSent() const; + uint64_t getNumPingFramesSent() const; + class HappyEyeballsConnAttemptDelayTimeout : public QuicTimerCallback { public: explicit HappyEyeballsConnAttemptDelayTimeout( diff --git a/quic/state/StateData.h b/quic/state/StateData.h index 0863099b7..2c1f45bfa 100644 --- a/quic/state/StateData.h +++ b/quic/state/StateData.h @@ -499,6 +499,8 @@ struct QuicConnectionStateBase : public folly::DelayedDestruction { // connection wide). uint64_t numWindowUpdateFramesSent{0}; + uint64_t numPingFramesSent{0}; + struct ConnectionFlowControlState { // The size of the connection flow control window. uint64_t windowSize{0};