Skip to content

Commit 60e732a

Browse files
[diag] Handle errors of TransmitPacket()
`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 <maciej.baczmanski@nordicsemi.no>
1 parent 5ddcb44 commit 60e732a

File tree

6 files changed

+46
-14
lines changed

6 files changed

+46
-14
lines changed

src/core/diags/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ received packets: 10
349349
sent success packets: 10
350350
sent error cca packets: 0
351351
sent error abort packets: 0
352+
sent error invalid state packets: 0
352353
sent error others packets: 0
353354
first received packet: rssi=-65, lqi=101
354355
last received packet: rssi=-64, lqi=98

src/core/diags/factory_diags.cpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ Error Diags::ProcessSend(uint8_t aArgsLength, char *aArgs[])
463463
VerifyOrExit(txLength >= OT_RADIO_FRAME_MIN_SIZE, error = kErrorInvalidArgs);
464464
mTxLen = txLength;
465465

466-
TransmitPacket();
466+
SuccessOrExit(error = TransmitPacket());
467467

468468
if (!mIsAsyncSend)
469469
{
@@ -507,12 +507,14 @@ void Diags::OutputStats(void)
507507
"sent success packets: %lu\r\n"
508508
"sent error cca packets: %lu\r\n"
509509
"sent error abort packets: %lu\r\n"
510+
"sent error invalid state packets: %lu\r\n"
510511
"sent error others packets: %lu\r\n"
511512
"first received packet: rssi=%d, lqi=%u\r\n"
512513
"last received packet: rssi=%d, lqi=%u\r\n",
513514
ToUlong(mStats.mReceivedPackets), ToUlong(mStats.mSentSuccessPackets), ToUlong(mStats.mSentErrorCcaPackets),
514-
ToUlong(mStats.mSentErrorAbortPackets), ToUlong(mStats.mSentErrorOthersPackets), mStats.mFirstRssi,
515-
mStats.mFirstLqi, mStats.mLastRssi, mStats.mLastLqi);
515+
ToUlong(mStats.mSentErrorAbortPackets), ToUlong(mStats.mSentErrorInvalidStatePackets),
516+
ToUlong(mStats.mSentErrorOthersPackets), mStats.mFirstRssi, mStats.mFirstLqi, mStats.mLastRssi,
517+
mStats.mLastLqi);
516518
}
517519

518520
Error Diags::ProcessStats(uint8_t aArgsLength, char *aArgs[])
@@ -546,8 +548,9 @@ Error Diags::ProcessStop(uint8_t aArgsLength, char *aArgs[])
546548
return kErrorNone;
547549
}
548550

549-
void Diags::TransmitPacket(void)
551+
Error Diags::TransmitPacket(void)
550552
{
553+
Error error = kErrorNone;
551554
mTxPacket->mChannel = mChannel;
552555

553556
if (mIsTxPacketSet)
@@ -568,7 +571,14 @@ void Diags::TransmitPacket(void)
568571
}
569572

570573
mDiagSendOn = true;
571-
IgnoreError(Get<Radio>().Transmit(*static_cast<Mac::TxFrame *>(mTxPacket)));
574+
error = Get<Radio>().Transmit(*static_cast<Mac::TxFrame *>(mTxPacket));
575+
576+
if (error == kErrorInvalidState)
577+
{
578+
mStats.mSentErrorInvalidStatePackets++;
579+
}
580+
581+
return error;
572582
}
573583

574584
Error Diags::ParseReceiveConfigFormat(const char *aFormat, ReceiveConfig &aConfig)
@@ -765,7 +775,7 @@ void Diags::AlarmFired(void)
765775
{
766776
uint32_t now = otPlatAlarmMilliGetNow();
767777

768-
TransmitPacket();
778+
IgnoreError(TransmitPacket());
769779
otPlatAlarmMilliStartAt(&GetInstance(), now, mTxPeriod);
770780
}
771781
else
@@ -875,7 +885,7 @@ void Diags::TransmitDone(Error aError)
875885
if (mTxPackets > 1)
876886
{
877887
mTxPackets--;
878-
TransmitPacket();
888+
IgnoreError(TransmitPacket());
879889
}
880890
else
881891
{

src/core/diags/factory_diags.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ class Diags : public InstanceLocator, private NonCopyable
138138
uint32_t mSentFailedPackets;
139139
uint32_t mSentErrorCcaPackets;
140140
uint32_t mSentErrorAbortPackets;
141+
uint32_t mSentErrorInvalidStatePackets;
141142
uint32_t mSentErrorOthersPackets;
142143
int8_t mFirstRssi;
143144
uint8_t mFirstLqi;
@@ -232,10 +233,10 @@ class Diags : public InstanceLocator, private NonCopyable
232233
Error GetPowerSettings(uint8_t aChannel, PowerSettings &aPowerSettings);
233234
Error ParseReceiveConfigFormat(const char *aFormat, ReceiveConfig &aConfig);
234235
Error RadioReceive(void);
236+
Error TransmitPacket(void);
235237
void OutputReceivedFrame(const otRadioFrame *aFrame);
236238
bool ShouldHandleReceivedFrame(const otRadioFrame &aFrame) const;
237239

238-
void TransmitPacket(void);
239240
void Output(const char *aFormat, ...);
240241
void ResetTxPacket(void);
241242
void OutputStats(void);

tests/scripts/expect/cli-diags.exp

+21-3
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ expect "received packets: 0"
6262
expect "sent success packets: 10"
6363
expect "sent error cca packets: 0"
6464
expect "sent error abort packets: 0"
65+
expect "sent error invalid state packets: 0"
6566
expect "sent error others packets: 0"
6667
expect "first received packet: rssi=0, lqi=0"
6768
expect "last received packet: rssi=0, lqi=0"
@@ -89,6 +90,7 @@ expect "received packets: 20"
8990
expect "sent success packets: 0"
9091
expect "sent error cca packets: 0"
9192
expect "sent error abort packets: 0"
93+
expect "sent error invalid state packets: 0"
9294
expect "sent error others packets: 0"
9395
expect "first received packet: rssi=-20, lqi=0"
9496
expect "last received packet: rssi=-20, lqi=0"
@@ -112,6 +114,7 @@ expect -r {received packets: \d+}
112114
expect "sent success packets: 0"
113115
expect "sent error cca packets: 0"
114116
expect "sent error abort packets: 0"
117+
expect "sent error invalid state packets: 0"
115118
expect "sent error others packets: 0"
116119
expect "first received packet: rssi=-20, lqi=0"
117120
expect "last received packet: rssi=-20, lqi=0"
@@ -140,6 +143,21 @@ send_user "input odd length test\n"
140143
send "diag frame 123\n"
141144
expect "Error"
142145

146+
send "diag radio sleep\n"
147+
expect_line "Done"
148+
149+
send "diag radio disable\n"
150+
expect_line "Done"
151+
152+
send "diag send 10 10\n"
153+
expect "Error 13: InvalidState"
154+
155+
send "diag radio enable\n"
156+
expect_line "Done"
157+
158+
send "diag radio receive\n"
159+
expect_line "Done"
160+
143161
send_user "shortest frame test\n"
144162
send "diag frame 112233\n"
145163
expect "Done"
@@ -151,6 +169,9 @@ send "diag frame 112233445566778899001122334455667788990011223344556677889900112
151169
expect "Done"
152170
send "diag repeat 1\n"
153171
expect "Done"
172+
sleep 3
173+
send "diag repeat stop\n"
174+
expect "Done"
154175

155176
send "diag repeat stop\n"
156177
expect "Done"
@@ -173,9 +194,6 @@ expect "Done"
173194
send "diag send 1\n"
174195
expect "Done"
175196

176-
send "diag repeat stop\n"
177-
expect "Done"
178-
179197
send "diag channel 11\n"
180198
expect_line "Done"
181199

tests/scripts/thread-cert/test_diag.py

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def test(self):
5858
'sent success packets: 0\r\n'
5959
'sent error cca packets: 0\r\n'
6060
'sent error abort packets: 0\r\n'
61+
'sent error invalid state packets: 0\r\n'
6162
'sent error others packets: 0\r\n'
6263
'first received packet: rssi=0, lqi=0\r\n'
6364
'last received packet: rssi=0, lqi=0\r\n',

tools/otci/otci/otci.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -2693,13 +2693,14 @@ def diag_get_stats(self) -> Dict[str, int]:
26932693
result['sent_success_packets'] = int(output[1].split(":")[1])
26942694
result['sent_error_cca_packets'] = int(output[2].split(":")[1])
26952695
result['sent_error_abort_packets'] = int(output[3].split(":")[1])
2696-
result['sent_error_others_packets'] = int(output[4].split(":")[1])
2696+
result['sent_error_invalid_state_packets'] = int(output[4].split(":")[1])
2697+
result['sent_error_others_packets'] = int(output[5].split(":")[1])
26972698

2698-
values = re.findall("\-?\d+", output[5])
2699+
values = re.findall("\-?\d+", output[6])
26992700
result['first_received_packet_rssi'] = int(values[0])
27002701
result['first_received_packet_lqi'] = int(values[1])
27012702

2702-
values = re.findall("\-?\d+", output[6])
2703+
values = re.findall("\-?\d+", output[7])
27032704
result['last_received_packet_rssi'] = int(values[0])
27042705
result['last_received_packet_lqi'] = int(values[1])
27052706

0 commit comments

Comments
 (0)