[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-04 08: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
> diag stats
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
last received packet: rssi=-64, lqi=98
Done
@@ -417,7 +420,10 @@ Stop diagnostics mode and print statistics.
```bash
> diag stop
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
last received packet: rssi=-61, lqi=98
+35 -23
View File
@@ -492,6 +492,20 @@ exit:
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 error = kErrorNone;
@@ -504,12 +518,7 @@ Error Diags::ProcessStats(uint8_t aArgsLength, char *aArgs[])
else
{
VerifyOrExit(aArgsLength == 0, error = kErrorInvalidArgs);
Output("received packets: %d\r\nsent packets: %d\r\n"
"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));
OutputStats();
}
exit:
@@ -526,13 +535,8 @@ Error Diags::ProcessStop(uint8_t aArgsLength, char *aArgs[])
Get<Radio>().SetPromiscuous(false);
Get<Mac::SubMac>().SetRxOnWhenIdle(false);
Output("received packets: %d\r\nsent packets: %d\r\n"
"first received packet: rssi=%d, lqi=%d\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));
OutputStats();
Output("\nstop diagnostics mode\r\n");
return kErrorNone;
}
@@ -844,21 +848,29 @@ void Diags::TransmitDone(Error aError)
VerifyOrExit(mDiagSendOn);
mDiagSendOn = false;
if (aError == kErrorNone)
switch (aError)
{
mStats.mSentPackets++;
case kErrorNone:
mStats.mSentSuccessPackets++;
break;
if (mTxPackets > 1)
{
mTxPackets--;
}
else
{
ExitNow();
}
case kErrorChannelAccessFailure:
mStats.mSentErrorCcaPackets++;
break;
case kErrorAbort:
mStats.mSentErrorAbortPackets++;
break;
default:
mStats.mSentErrorOthersPackets++;
break;
}
VerifyOrExit(!mRepeatActive);
VerifyOrExit(mTxPackets > 1);
mTxPackets--;
TransmitPacket();
exit:
+6 -1
View File
@@ -134,7 +134,11 @@ private:
struct Stats : public Clearable<Stats>
{
uint32_t mReceivedPackets;
uint32_t mSentPackets;
uint32_t mSentSuccessPackets;
uint32_t mSentFailedPackets;
uint32_t mSentErrorCcaPackets;
uint32_t mSentErrorAbortPackets;
uint32_t mSentErrorOthersPackets;
int8_t mFirstRssi;
uint8_t mFirstLqi;
int8_t mLastRssi;
@@ -235,6 +239,7 @@ private:
void Output(const char *aFormat, ...);
void AppendErrorResult(Error aError);
void ResetTxPacket(void);
void OutputStats(void);
static bool IsChannelValid(uint8_t aChannel);
+12 -3
View File
@@ -68,7 +68,10 @@ sleep 2
send "diag stats\n"
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 "last received packet: rssi=0, lqi=0"
expect_line "Done"
@@ -77,7 +80,10 @@ switch_node 1
send "diag stats\n"
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 "last received packet: rssi=-20, lqi=0"
expect_line "Done"
@@ -100,7 +106,10 @@ switch_node 1
send "diag stats\n"
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 "last received packet: rssi=-20, lqi=0"
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 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'
'last received packet: rssi=0, lqi=0\r\n',
),
@@ -76,7 +80,11 @@ class TestDiag(thread_cert.TestCase):
),
(
'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'
'last received packet: rssi=0, lqi=0\r\n\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()
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:
ret = False
@@ -578,7 +578,7 @@ class RcpCaps(object):
dut_stats = self.__dut.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:
ret = False
@@ -612,7 +612,7 @@ class RcpCaps(object):
sender_stats = sender.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:
ret = False
+6 -3
View File
@@ -2603,13 +2603,16 @@ class OTCI(object):
result = {}
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_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_lqi'] = int(values[1])