From 8282e7830bd9f9ee626c49ce50d7355abc9c5c64 Mon Sep 17 00:00:00 2001 From: Jing Zhang Date: Fri, 15 Apr 2022 15:59:34 -0700 Subject: [PATCH] Keep incrementing sequence number when link prober is suspended and shutdown #55 (#65) ### Description of PR Unable to cherry-pick the commit below cleanly from master branch: 13f4879 Jing Zhang Sun Apr 3 21:56:33 2022 -0700 Keep incrementing sequence number when link prober is suspended and shutdown (#55) Summary: Fixes # (issue) This PR is fix the issue when both sides' link prober is suspended, LinkManager still appears to be healthy. When HB suspends, TX sequence number is not updated either, hence link prober won't post an `unknown` event. sign-off: Jing Zhang zhangjing@microsoft.com ### Type of change - [x] Bug fix ### Approach #### What is the motivation for this PR? Make sure link prober is reporting `unknown` event when it's suspended or shutdown on both sides. #### How did you do it? Increment sequence number even when HB is not sent. #### How did you verify/test it? Tested on dualToR testbed. --- src/link_prober/LinkProber.cpp | 3 ++- test/LinkProberTest.cpp | 11 +++++++++++ test/LinkProberTest.h | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/link_prober/LinkProber.cpp b/src/link_prober/LinkProber.cpp index 5d21f94c..390aa21f 100644 --- a/src/link_prober/LinkProber.cpp +++ b/src/link_prober/LinkProber.cpp @@ -271,9 +271,10 @@ void LinkProber::sendHeartbeat() { MUXLOGTRACE(mMuxPortConfig.getPortName()); + updateIcmpSequenceNo(); + // check if suspend timer is running if ((!mSuspendTx) && (!mShutdownTx)) { - updateIcmpSequenceNo(); boost::system::error_code errorCode; mStream.write_some(boost::asio::buffer(mTxBuffer.data(), mTxPacketSize), errorCode); diff --git a/test/LinkProberTest.cpp b/test/LinkProberTest.cpp index c2316c31..63be331f 100644 --- a/test/LinkProberTest.cpp +++ b/test/LinkProberTest.cpp @@ -160,6 +160,17 @@ TEST_F(LinkProberTest, UpdateSequenceNo) EXPECT_TRUE(getRxSelfSeqNo() + 1 == ntohs(icmpHeader->un.echo.sequence)); EXPECT_TRUE(getRxPeerSeqNo() + 1 == ntohs(icmpHeader->un.echo.sequence)); + + // sequence number should still be updated when heartbeat is suspended + EXPECT_EQ(getRxSelfSeqNo(), 0); + EXPECT_EQ(getRxPeerSeqNo(), 0); + + handleSuspendTxProbes(); + EXPECT_TRUE(getSuspendTx()); + + handleSendHeartbeat(); + EXPECT_EQ(getRxSelfSeqNo(), 1); + EXPECT_EQ(getRxPeerSeqNo(), 1); } TEST_F(LinkProberTest, GenerateGuid) diff --git a/test/LinkProberTest.h b/test/LinkProberTest.h index 137b4343..9c5ef03c 100644 --- a/test/LinkProberTest.h +++ b/test/LinkProberTest.h @@ -42,6 +42,8 @@ class LinkProberTest: public ::testing::Test void initializeSendBuffer() {mLinkProber.initializeSendBuffer();}; void handleUpdateEthernetFrame() {mLinkProber.handleUpdateEthernetFrame();}; void handleUpdateSequenceNumber() {mLinkProber.updateIcmpSequenceNo();}; + void handleSuspendTxProbes() {mLinkProber.suspendTxProbes(300);}; + void handleSendHeartbeat() {mLinkProber.sendHeartbeat();}; void resetTxBufferTlv() {mLinkProber.resetTxBufferTlv();}; size_t getTxPacketSize() {return mLinkProber.mTxPacketSize;}; size_t appendTlvCommand(link_prober::Command commandType); @@ -54,6 +56,7 @@ class LinkProberTest: public ::testing::Test uint16_t getRxSelfSeqNo() {return mLinkProber.mRxSelfSeqNo;}; uint16_t getRxPeerSeqNo() {return mLinkProber.mRxPeerSeqNo;}; + bool getSuspendTx() {return mLinkProber.mSuspendTx;}; boost::asio::io_service mIoService; common::MuxConfig mMuxConfig;