From 30f20f3fbc51b96d666496977b4d67cc1eedbefd Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Fri, 8 Jun 2018 10:13:23 -0700 Subject: [PATCH] [mesh-forwarder] do not treat CCA failures the same as no-ack (#2765) Thread 1.1.1 Section 5.9.4 states: "Note that failures to transmit due to failed clear channel assessments do not count as a failure to receive an ACK." --- src/core/thread/data_poll_manager.cpp | 6 ++++++ src/core/thread/mesh_forwarder.cpp | 2 +- src/core/thread/mesh_forwarder_ftd.cpp | 20 +++++++++++++++----- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/core/thread/data_poll_manager.cpp b/src/core/thread/data_poll_manager.cpp index ec2437501..bcba9033c 100644 --- a/src/core/thread/data_poll_manager.cpp +++ b/src/core/thread/data_poll_manager.cpp @@ -217,6 +217,12 @@ void DataPollManager::HandlePollSent(otError aError) break; + case OT_ERROR_CHANNEL_ACCESS_FAILURE: + case OT_ERROR_ABORT: + mRetxMode = true; + shouldRecalculatePollPeriod = true; + break; + default: mPollTxFailureCounter++; diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 1342f8ea0..dee6b56b3 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -957,7 +957,7 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, otError aError) if (mSendMessage->GetDirectTransmission()) { - if (aError != OT_ERROR_NONE) + if (aError == OT_ERROR_NO_ACK) { // If the transmission of any fragment frame fails, // the overall message transmission is considered diff --git a/src/core/thread/mesh_forwarder_ftd.cpp b/src/core/thread/mesh_forwarder_ftd.cpp index 8315434b5..257caf1f8 100644 --- a/src/core/thread/mesh_forwarder_ftd.cpp +++ b/src/core/thread/mesh_forwarder_ftd.cpp @@ -592,14 +592,18 @@ void MeshForwarder::HandleSentFrameToChild(const Mac::Frame &aFrame, otError aEr iter.Advance(); mIndirectStartingChild = iter.GetChild(); - if (aError == OT_ERROR_NONE) + switch (aError) { + case OT_ERROR_NONE: child->ResetIndirectTxAttempts(); - } - else - { - child->IncrementIndirectTxAttempts(); + break; + case OT_ERROR_NO_ACK: + child->IncrementIndirectTxAttempts(); + // fall through + + case OT_ERROR_CHANNEL_ACCESS_FAILURE: + case OT_ERROR_ABORT: if (child->GetIndirectTxAttempts() < kMaxPollTriggeredTxAttempts) { // We save the frame counter, key id, and data sequence number of @@ -634,6 +638,12 @@ void MeshForwarder::HandleSentFrameToChild(const Mac::Frame &aFrame, otError aEr mMessageNextOffset = mSendMessage->GetLength(); #endif + + break; + + default: + assert(false); + break; } }