[diag] count the number of packets that are sent succeed and failed (#11108)

When using the `diag frame -c xxxx` command to enable the CSMA-CA when
transmitting the frame, the command `diag send` won't output any message
the CCA failure happens. It is difficult for users to know whether
the CSMA-CA is actually effective via diag commands.

This commit counts the number of packets that are sent succeed and failed,
outputs the transmision failure reason and do not re-transmit the frame
after it fails to send.
This commit is contained in:
Zhanglong Xia
2025-01-03 16:44:02 -08:00
committed by GitHub
parent 0e7039599c
commit 173cb61379
7 changed files with 80 additions and 37 deletions
+8 -2
View File
@@ -345,7 +345,10 @@ Print statistics during diagnostics mode.
```bash ```bash
> diag stats > diag stats
received packets: 10 received packets: 10
sent packets: 10 sent success packets: 10
sent error cca packets: 0
sent error abort packets: 0
sent error others packets: 0
first received packet: rssi=-65, lqi=101 first received packet: rssi=-65, lqi=101
last received packet: rssi=-64, lqi=98 last received packet: rssi=-64, lqi=98
Done Done
@@ -417,7 +420,10 @@ Stop diagnostics mode and print statistics.
```bash ```bash
> diag stop > diag stop
received packets: 10 received packets: 10
sent packets: 10 sent success packets: 10
sent error cca packets: 0
sent error abort packets: 0
sent error others packets: 0
first received packet: rssi=-65, lqi=101 first received packet: rssi=-65, lqi=101
last received packet: rssi=-61, lqi=98 last received packet: rssi=-61, lqi=98
+35 -23
View File
@@ -492,6 +492,20 @@ exit:
return error; return error;
} }
void Diags::OutputStats(void)
{
Output("received packets: %lu\r\n"
"sent success packets: %lu\r\n"
"sent error cca packets: %lu\r\n"
"sent error abort 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);
}
Error Diags::ProcessStats(uint8_t aArgsLength, char *aArgs[]) Error Diags::ProcessStats(uint8_t aArgsLength, char *aArgs[])
{ {
Error error = kErrorNone; Error error = kErrorNone;
@@ -504,12 +518,7 @@ Error Diags::ProcessStats(uint8_t aArgsLength, char *aArgs[])
else else
{ {
VerifyOrExit(aArgsLength == 0, error = kErrorInvalidArgs); VerifyOrExit(aArgsLength == 0, error = kErrorInvalidArgs);
Output("received packets: %d\r\nsent packets: %d\r\n" OutputStats();
"first received packet: rssi=%d, lqi=%d\r\n"
"last received packet: rssi=%d, lqi=%d\r\n",
static_cast<int>(mStats.mReceivedPackets), static_cast<int>(mStats.mSentPackets),
static_cast<int>(mStats.mFirstRssi), static_cast<int>(mStats.mFirstLqi),
static_cast<int>(mStats.mLastRssi), static_cast<int>(mStats.mLastLqi));
} }
exit: exit:
@@ -526,13 +535,8 @@ Error Diags::ProcessStop(uint8_t aArgsLength, char *aArgs[])
Get<Radio>().SetPromiscuous(false); Get<Radio>().SetPromiscuous(false);
Get<Mac::SubMac>().SetRxOnWhenIdle(false); Get<Mac::SubMac>().SetRxOnWhenIdle(false);
Output("received packets: %d\r\nsent packets: %d\r\n" OutputStats();
"first received packet: rssi=%d, lqi=%d\r\n" Output("\nstop diagnostics mode\r\n");
"last received packet: rssi=%d, lqi=%d\r\n"
"\nstop diagnostics mode\r\n",
static_cast<int>(mStats.mReceivedPackets), static_cast<int>(mStats.mSentPackets),
static_cast<int>(mStats.mFirstRssi), static_cast<int>(mStats.mFirstLqi), static_cast<int>(mStats.mLastRssi),
static_cast<int>(mStats.mLastLqi));
return kErrorNone; return kErrorNone;
} }
@@ -844,21 +848,29 @@ void Diags::TransmitDone(Error aError)
VerifyOrExit(mDiagSendOn); VerifyOrExit(mDiagSendOn);
mDiagSendOn = false; mDiagSendOn = false;
if (aError == kErrorNone) switch (aError)
{ {
mStats.mSentPackets++; case kErrorNone:
mStats.mSentSuccessPackets++;
break;
if (mTxPackets > 1) case kErrorChannelAccessFailure:
{ mStats.mSentErrorCcaPackets++;
mTxPackets--; break;
}
else case kErrorAbort:
{ mStats.mSentErrorAbortPackets++;
ExitNow(); break;
}
default:
mStats.mSentErrorOthersPackets++;
break;
} }
VerifyOrExit(!mRepeatActive); VerifyOrExit(!mRepeatActive);
VerifyOrExit(mTxPackets > 1);
mTxPackets--;
TransmitPacket(); TransmitPacket();
exit: exit:
+6 -1
View File
@@ -134,7 +134,11 @@ private:
struct Stats : public Clearable<Stats> struct Stats : public Clearable<Stats>
{ {
uint32_t mReceivedPackets; uint32_t mReceivedPackets;
uint32_t mSentPackets; uint32_t mSentSuccessPackets;
uint32_t mSentFailedPackets;
uint32_t mSentErrorCcaPackets;
uint32_t mSentErrorAbortPackets;
uint32_t mSentErrorOthersPackets;
int8_t mFirstRssi; int8_t mFirstRssi;
uint8_t mFirstLqi; uint8_t mFirstLqi;
int8_t mLastRssi; int8_t mLastRssi;
@@ -235,6 +239,7 @@ private:
void Output(const char *aFormat, ...); void Output(const char *aFormat, ...);
void AppendErrorResult(Error aError); void AppendErrorResult(Error aError);
void ResetTxPacket(void); void ResetTxPacket(void);
void OutputStats(void);
static bool IsChannelValid(uint8_t aChannel); static bool IsChannelValid(uint8_t aChannel);
+12 -3
View File
@@ -68,7 +68,10 @@ sleep 2
send "diag stats\n" send "diag stats\n"
expect "received packets: 0" expect "received packets: 0"
expect "sent packets: 10" expect "sent success packets: 10"
expect "sent error cca packets: 0"
expect "sent error abort packets: 0"
expect "sent error others packets: 0"
expect "first received packet: rssi=0, lqi=0" expect "first received packet: rssi=0, lqi=0"
expect "last received packet: rssi=0, lqi=0" expect "last received packet: rssi=0, lqi=0"
expect_line "Done" expect_line "Done"
@@ -77,7 +80,10 @@ switch_node 1
send "diag stats\n" send "diag stats\n"
expect "received packets: 10" expect "received packets: 10"
expect "sent packets: 0" expect "sent success packets: 0"
expect "sent error cca packets: 0"
expect "sent error abort packets: 0"
expect "sent error others packets: 0"
expect "first received packet: rssi=-20, lqi=0" expect "first received packet: rssi=-20, lqi=0"
expect "last received packet: rssi=-20, lqi=0" expect "last received packet: rssi=-20, lqi=0"
expect_line "Done" expect_line "Done"
@@ -100,7 +106,10 @@ switch_node 1
send "diag stats\n" send "diag stats\n"
expect -r {received packets: \d+} expect -r {received packets: \d+}
expect "sent packets: 0" expect "sent success packets: 0"
expect "sent error cca packets: 0"
expect "sent error abort packets: 0"
expect "sent error others packets: 0"
expect "first received packet: rssi=-20, lqi=0" expect "first received packet: rssi=-20, lqi=0"
expect "last received packet: rssi=-20, lqi=0" expect "last received packet: rssi=-20, lqi=0"
expect_line "Done" expect_line "Done"
+10 -2
View File
@@ -54,7 +54,11 @@ class TestDiag(thread_cert.TestCase):
('diag power', 'tx power: -10 dBm\r\n'), ('diag power', 'tx power: -10 dBm\r\n'),
( (
'diag stats', 'diag stats',
'received packets: 0\r\nsent packets: 0\r\n' 'received packets: 0\r\n'
'sent success packets: 0\r\n'
'sent error cca packets: 0\r\n'
'sent error abort packets: 0\r\n'
'sent error others packets: 0\r\n'
'first received packet: rssi=0, lqi=0\r\n' 'first received packet: rssi=0, lqi=0\r\n'
'last received packet: rssi=0, lqi=0\r\n', 'last received packet: rssi=0, lqi=0\r\n',
), ),
@@ -76,7 +80,11 @@ class TestDiag(thread_cert.TestCase):
), ),
( (
'diag stop', 'diag stop',
r'received packets: 0\r\nsent packets: ([1-9]\d*)\r\n' 'received packets: 0\r\n'
r'sent success packets: ([1-9]\d*)\r\n'
r'sent error cca packets: ([0-9]\d*)\r\n'
r'sent error abort packets: ([0-9]\d*)\r\n'
r'sent error others packets: ([0-9]\d*)\r\n'
'first received packet: rssi=0, lqi=0\r\n' 'first received packet: rssi=0, lqi=0\r\n'
'last received packet: rssi=0, lqi=0\r\n\n' 'last received packet: rssi=0, lqi=0\r\n\n'
r'stop diagnostics mode\r\n', r'stop diagnostics mode\r\n',
+3 -3
View File
@@ -549,7 +549,7 @@ class RcpCaps(object):
dut_stats = self.__dut.diag_get_stats() dut_stats = self.__dut.diag_get_stats()
ref_stats = self.__ref.diag_get_stats() ref_stats = self.__ref.diag_get_stats()
ret = dut_stats['sent_packets'] == packets and ref_stats['received_packets'] > threshold ret = dut_stats['sent_success_packets'] == packets and ref_stats['received_packets'] > threshold
else: else:
ret = False ret = False
@@ -578,7 +578,7 @@ class RcpCaps(object):
dut_stats = self.__dut.diag_get_stats() dut_stats = self.__dut.diag_get_stats()
ref_stats = self.__ref.diag_get_stats() ref_stats = self.__ref.diag_get_stats()
ret = dut_stats['sent_packets'] > threshold and ref_stats['received_packets'] > threshold ret = dut_stats['sent_success_packets'] > threshold and ref_stats['received_packets'] > threshold
else: else:
ret = False ret = False
@@ -612,7 +612,7 @@ class RcpCaps(object):
sender_stats = sender.diag_get_stats() sender_stats = sender.diag_get_stats()
receiver_stats = receiver.diag_get_stats() receiver_stats = receiver.diag_get_stats()
ret = sender_stats['sent_packets'] == packets and receiver_stats['received_packets'] > threshold ret = sender_stats['sent_success_packets'] == packets and receiver_stats['received_packets'] > threshold
else: else:
ret = False ret = False
+6 -3
View File
@@ -2603,13 +2603,16 @@ class OTCI(object):
result = {} result = {}
result['received_packets'] = int(output[0].split(":")[1]) result['received_packets'] = int(output[0].split(":")[1])
result['sent_packets'] = int(output[1].split(":")[1]) 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])
values = re.findall("\-?\d+", output[2]) values = re.findall("\-?\d+", output[5])
result['first_received_packet_rssi'] = int(values[0]) result['first_received_packet_rssi'] = int(values[0])
result['first_received_packet_lqi'] = int(values[1]) result['first_received_packet_lqi'] = int(values[1])
values = re.findall("\-?\d+", output[3]) values = re.findall("\-?\d+", output[6])
result['last_received_packet_rssi'] = int(values[0]) result['last_received_packet_rssi'] = int(values[0])
result['last_received_packet_lqi'] = int(values[1]) result['last_received_packet_lqi'] = int(values[1])