Skip to content

Commit c70f942

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 3470934 commit c70f942

File tree

6 files changed

+45
-13
lines changed

6 files changed

+45
-13
lines changed

src/core/diags/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ received packets: 10
346346
sent success packets: 10
347347
sent error cca packets: 0
348348
sent error abort packets: 0
349+
sent error invalid state packets: 0
349350
sent error others packets: 0
350351
first received packet: rssi=-65, lqi=101
351352
last received packet: rssi=-64, lqi=98

src/core/diags/factory_diags.cpp

+16-6
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ Error Diags::ProcessSend(uint8_t aArgsLength, char *aArgs[])
450450
VerifyOrExit(txLength >= OT_RADIO_FRAME_MIN_SIZE, error = kErrorInvalidArgs);
451451
mTxLen = txLength;
452452

453-
TransmitPacket();
453+
SuccessOrExit(error = TransmitPacket());
454454

455455
exit:
456456
return error;
@@ -489,11 +489,13 @@ void Diags::OutputStats(void)
489489
"sent success packets: %lu\r\n"
490490
"sent error cca packets: %lu\r\n"
491491
"sent error abort packets: %lu\r\n"
492+
"sent error invalid state packets: %lu\r\n"
492493
"sent error others packets: %lu\r\n"
493494
"first received packet: rssi=%d, lqi=%u\r\n"
494495
"last received packet: rssi=%d, lqi=%u\r\n",
495496
ToUlong(mStats.mReceivedPackets), ToUlong(mStats.mSentSuccessPackets), ToUlong(mStats.mSentErrorCcaPackets),
496-
ToUlong(mStats.mSentErrorAbortPackets), ToUlong(mStats.mSentErrorOthersPackets), mStats.mFirstRssi,
497+
ToUlong(mStats.mSentErrorAbortPackets), ToUlong(mStats.mSentErrorInvalidStatePackets),
498+
ToUlong(mStats.mSentErrorOthersPackets), mStats.mFirstRssi,
497499
mStats.mFirstLqi, mStats.mLastRssi, mStats.mLastLqi);
498500
}
499501

@@ -528,8 +530,9 @@ Error Diags::ProcessStop(uint8_t aArgsLength, char *aArgs[])
528530
return kErrorNone;
529531
}
530532

531-
void Diags::TransmitPacket(void)
533+
Error Diags::TransmitPacket(void)
532534
{
535+
Error error = kErrorNone;
533536
mTxPacket->mChannel = mChannel;
534537

535538
if (mIsTxPacketSet)
@@ -550,7 +553,14 @@ void Diags::TransmitPacket(void)
550553
}
551554

552555
mDiagSendOn = true;
553-
IgnoreError(Get<Radio>().Transmit(*static_cast<Mac::TxFrame *>(mTxPacket)));
556+
error = Get<Radio>().Transmit(*static_cast<Mac::TxFrame *>(mTxPacket));
557+
558+
if(error == kErrorInvalidState)
559+
{
560+
mStats.mSentErrorInvalidStatePackets++;
561+
}
562+
563+
return error;
554564
}
555565

556566
Error Diags::ParseReceiveConfigFormat(const char *aFormat, ReceiveConfig &aConfig)
@@ -747,7 +757,7 @@ void Diags::AlarmFired(void)
747757
{
748758
uint32_t now = otPlatAlarmMilliGetNow();
749759

750-
TransmitPacket();
760+
IgnoreError(TransmitPacket());
751761
otPlatAlarmMilliStartAt(&GetInstance(), now, mTxPeriod);
752762
}
753763
else
@@ -856,7 +866,7 @@ void Diags::TransmitDone(Error aError)
856866
VerifyOrExit(mTxPackets > 1);
857867
mTxPackets--;
858868

859-
TransmitPacket();
869+
IgnoreError(TransmitPacket());
860870

861871
exit:
862872
return;

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
@@ -64,6 +64,7 @@ expect "received packets: 0"
6464
expect "sent success packets: 10"
6565
expect "sent error cca packets: 0"
6666
expect "sent error abort packets: 0"
67+
expect "sent error invalid state packets: 0"
6768
expect "sent error others packets: 0"
6869
expect "first received packet: rssi=0, lqi=0"
6970
expect "last received packet: rssi=0, lqi=0"
@@ -76,6 +77,7 @@ expect "received packets: 10"
7677
expect "sent success packets: 0"
7778
expect "sent error cca packets: 0"
7879
expect "sent error abort packets: 0"
80+
expect "sent error invalid state packets: 0"
7981
expect "sent error others packets: 0"
8082
expect "first received packet: rssi=-20, lqi=0"
8183
expect "last received packet: rssi=-20, lqi=0"
@@ -99,6 +101,7 @@ expect -r {received packets: \d+}
99101
expect "sent success packets: 0"
100102
expect "sent error cca packets: 0"
101103
expect "sent error abort packets: 0"
104+
expect "sent error invalid state packets: 0"
102105
expect "sent error others packets: 0"
103106
expect "first received packet: rssi=-20, lqi=0"
104107
expect "last received packet: rssi=-20, lqi=0"
@@ -127,6 +130,21 @@ send_user "input odd length test\n"
127130
send "diag frame 123\n"
128131
expect "Error"
129132

133+
send "diag radio sleep\n"
134+
expect_line "Done"
135+
136+
send "diag radio disable\n"
137+
expect_line "Done"
138+
139+
send "diag send 10 10\n"
140+
expect "Error 13: InvalidState"
141+
142+
send "diag radio enable\n"
143+
expect_line "Done"
144+
145+
send "diag radio receive\n"
146+
expect_line "Done"
147+
130148
send_user "shortest frame test\n"
131149
send "diag frame 112233\n"
132150
expect "Done"
@@ -138,6 +156,9 @@ send "diag frame 112233445566778899001122334455667788990011223344556677889900112
138156
expect "Done"
139157
send "diag repeat 1\n"
140158
expect "Done"
159+
sleep 3
160+
send "diag repeat stop\n"
161+
expect "Done"
141162

142163
send_user "send frame with security processed\n"
143164
send "diag frame -s 112233\n"
@@ -157,9 +178,6 @@ expect "Done"
157178
send "diag send 1\n"
158179
expect "Done"
159180

160-
send "diag repeat stop\n"
161-
expect "Done"
162-
163181
send "diag channel 11\n"
164182
expect_line "Done"
165183

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
@@ -2692,13 +2692,14 @@ def diag_get_stats(self) -> Dict[str, int]:
26922692
result['sent_success_packets'] = int(output[1].split(":")[1])
26932693
result['sent_error_cca_packets'] = int(output[2].split(":")[1])
26942694
result['sent_error_abort_packets'] = int(output[3].split(":")[1])
2695-
result['sent_error_others_packets'] = int(output[4].split(":")[1])
2695+
result['sent_error_invalid_state_packets'] = int(output[4].split(":")[1])
2696+
result['sent_error_others_packets'] = int(output[5].split(":")[1])
26962697

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

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

0 commit comments

Comments
 (0)