From d7a266856f41930379fae5967f06f750c6a617fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Baczma=C5=84ski?= Date: Thu, 9 Jan 2025 19:47:40 +0100 Subject: [PATCH] [diag] handle errors of `TransmitPacket()` (#11076) `TransmitPacket()` should return an error from platform Radio implementation, as for example Radio can be in incorrect state. If error occurs, increase `mSentErrorInvalidStatePackets` stat. Add wrong state case to tests and fix `diag repeat stop` called too lata. Signed-off-by: Maciej Baczmanski --- src/core/diags/README.md | 1 + src/core/diags/factory_diags.cpp | 24 +++++++++++++++++------- src/core/diags/factory_diags.hpp | 3 ++- tests/scripts/expect/cli-diags.exp | 24 +++++++++++++++++++++--- tests/scripts/thread-cert/test_diag.py | 1 + tools/otci/otci/otci.py | 7 ++++--- 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/core/diags/README.md b/src/core/diags/README.md index 810069805..0e8896865 100644 --- a/src/core/diags/README.md +++ b/src/core/diags/README.md @@ -349,6 +349,7 @@ received packets: 10 sent success packets: 10 sent error cca packets: 0 sent error abort packets: 0 +sent error invalid state packets: 0 sent error others packets: 0 first received packet: rssi=-65, lqi=101 last received packet: rssi=-64, lqi=98 diff --git a/src/core/diags/factory_diags.cpp b/src/core/diags/factory_diags.cpp index 204a80b4e..e315e65fb 100644 --- a/src/core/diags/factory_diags.cpp +++ b/src/core/diags/factory_diags.cpp @@ -463,7 +463,7 @@ Error Diags::ProcessSend(uint8_t aArgsLength, char *aArgs[]) VerifyOrExit(txLength >= OT_RADIO_FRAME_MIN_SIZE, error = kErrorInvalidArgs); mTxLen = txLength; - TransmitPacket(); + SuccessOrExit(error = TransmitPacket()); if (!mIsAsyncSend) { @@ -507,12 +507,14 @@ void Diags::OutputStats(void) "sent success packets: %lu\r\n" "sent error cca packets: %lu\r\n" "sent error abort packets: %lu\r\n" + "sent error invalid state packets: %lu\r\n" "sent error others packets: %lu\r\n" "first received packet: rssi=%d, lqi=%u\r\n" "last received packet: rssi=%d, lqi=%u\r\n", ToUlong(mStats.mReceivedPackets), ToUlong(mStats.mSentSuccessPackets), ToUlong(mStats.mSentErrorCcaPackets), - ToUlong(mStats.mSentErrorAbortPackets), ToUlong(mStats.mSentErrorOthersPackets), mStats.mFirstRssi, - mStats.mFirstLqi, mStats.mLastRssi, mStats.mLastLqi); + ToUlong(mStats.mSentErrorAbortPackets), ToUlong(mStats.mSentErrorInvalidStatePackets), + ToUlong(mStats.mSentErrorOthersPackets), mStats.mFirstRssi, mStats.mFirstLqi, mStats.mLastRssi, + mStats.mLastLqi); } Error Diags::ProcessStats(uint8_t aArgsLength, char *aArgs[]) @@ -546,8 +548,9 @@ Error Diags::ProcessStop(uint8_t aArgsLength, char *aArgs[]) return kErrorNone; } -void Diags::TransmitPacket(void) +Error Diags::TransmitPacket(void) { + Error error = kErrorNone; mTxPacket->mChannel = mChannel; if (mIsTxPacketSet) @@ -568,7 +571,14 @@ void Diags::TransmitPacket(void) } mDiagSendOn = true; - IgnoreError(Get().Transmit(*static_cast(mTxPacket))); + error = Get().Transmit(*static_cast(mTxPacket)); + + if (error == kErrorInvalidState) + { + mStats.mSentErrorInvalidStatePackets++; + } + + return error; } Error Diags::ParseReceiveConfigFormat(const char *aFormat, ReceiveConfig &aConfig) @@ -765,7 +775,7 @@ void Diags::AlarmFired(void) { uint32_t now = otPlatAlarmMilliGetNow(); - TransmitPacket(); + IgnoreError(TransmitPacket()); otPlatAlarmMilliStartAt(&GetInstance(), now, mTxPeriod); } else @@ -875,7 +885,7 @@ void Diags::TransmitDone(Error aError) if (mTxPackets > 1) { mTxPackets--; - TransmitPacket(); + IgnoreError(TransmitPacket()); } else { diff --git a/src/core/diags/factory_diags.hpp b/src/core/diags/factory_diags.hpp index f06cafeeb..51dc03335 100644 --- a/src/core/diags/factory_diags.hpp +++ b/src/core/diags/factory_diags.hpp @@ -138,6 +138,7 @@ private: uint32_t mSentFailedPackets; uint32_t mSentErrorCcaPackets; uint32_t mSentErrorAbortPackets; + uint32_t mSentErrorInvalidStatePackets; uint32_t mSentErrorOthersPackets; int8_t mFirstRssi; uint8_t mFirstLqi; @@ -232,10 +233,10 @@ private: Error GetPowerSettings(uint8_t aChannel, PowerSettings &aPowerSettings); Error ParseReceiveConfigFormat(const char *aFormat, ReceiveConfig &aConfig); Error RadioReceive(void); + Error TransmitPacket(void); void OutputReceivedFrame(const otRadioFrame *aFrame); bool ShouldHandleReceivedFrame(const otRadioFrame &aFrame) const; - void TransmitPacket(void); void Output(const char *aFormat, ...); void ResetTxPacket(void); void OutputStats(void); diff --git a/tests/scripts/expect/cli-diags.exp b/tests/scripts/expect/cli-diags.exp index f7c8be8f2..ac30c6089 100755 --- a/tests/scripts/expect/cli-diags.exp +++ b/tests/scripts/expect/cli-diags.exp @@ -62,6 +62,7 @@ expect "received packets: 0" expect "sent success packets: 10" expect "sent error cca packets: 0" expect "sent error abort packets: 0" +expect "sent error invalid state packets: 0" expect "sent error others packets: 0" expect "first received packet: rssi=0, lqi=0" expect "last received packet: rssi=0, lqi=0" @@ -89,6 +90,7 @@ expect "received packets: 20" expect "sent success packets: 0" expect "sent error cca packets: 0" expect "sent error abort packets: 0" +expect "sent error invalid state packets: 0" expect "sent error others packets: 0" expect "first received packet: rssi=-20, lqi=0" expect "last received packet: rssi=-20, lqi=0" @@ -112,6 +114,7 @@ expect -r {received packets: \d+} expect "sent success packets: 0" expect "sent error cca packets: 0" expect "sent error abort packets: 0" +expect "sent error invalid state packets: 0" expect "sent error others packets: 0" expect "first received packet: rssi=-20, lqi=0" expect "last received packet: rssi=-20, lqi=0" @@ -140,6 +143,21 @@ send_user "input odd length test\n" send "diag frame 123\n" expect "Error" +send "diag radio sleep\n" +expect_line "Done" + +send "diag radio disable\n" +expect_line "Done" + +send "diag send 10 10\n" +expect "Error 13: InvalidState" + +send "diag radio enable\n" +expect_line "Done" + +send "diag radio receive\n" +expect_line "Done" + send_user "shortest frame test\n" send "diag frame 112233\n" expect "Done" @@ -151,6 +169,9 @@ send "diag frame 112233445566778899001122334455667788990011223344556677889900112 expect "Done" send "diag repeat 1\n" expect "Done" +sleep 3 +send "diag repeat stop\n" +expect "Done" send "diag repeat stop\n" expect "Done" @@ -173,9 +194,6 @@ expect "Done" send "diag send 1\n" expect "Done" -send "diag repeat stop\n" -expect "Done" - send "diag channel 11\n" expect_line "Done" diff --git a/tests/scripts/thread-cert/test_diag.py b/tests/scripts/thread-cert/test_diag.py index df8df42cf..801bd6044 100755 --- a/tests/scripts/thread-cert/test_diag.py +++ b/tests/scripts/thread-cert/test_diag.py @@ -58,6 +58,7 @@ class TestDiag(thread_cert.TestCase): 'sent success packets: 0\r\n' 'sent error cca packets: 0\r\n' 'sent error abort packets: 0\r\n' + 'sent error invalid state packets: 0\r\n' 'sent error others packets: 0\r\n' 'first received packet: rssi=0, lqi=0\r\n' 'last received packet: rssi=0, lqi=0\r\n', diff --git a/tools/otci/otci/otci.py b/tools/otci/otci/otci.py index 948919f72..9ef224eac 100644 --- a/tools/otci/otci/otci.py +++ b/tools/otci/otci/otci.py @@ -2693,13 +2693,14 @@ class OTCI(object): result['sent_success_packets'] = int(output[1].split(":")[1]) result['sent_error_cca_packets'] = int(output[2].split(":")[1]) result['sent_error_abort_packets'] = int(output[3].split(":")[1]) - result['sent_error_others_packets'] = int(output[4].split(":")[1]) + result['sent_error_invalid_state_packets'] = int(output[4].split(":")[1]) + result['sent_error_others_packets'] = int(output[5].split(":")[1]) - values = re.findall("\-?\d+", output[5]) + values = re.findall("\-?\d+", output[6]) result['first_received_packet_rssi'] = int(values[0]) result['first_received_packet_lqi'] = int(values[1]) - values = re.findall("\-?\d+", output[6]) + values = re.findall("\-?\d+", output[7]) result['last_received_packet_rssi'] = int(values[0]) result['last_received_packet_lqi'] = int(values[1])