mirror of
https://github.com/espressif/openthread.git
synced 2026-06-05 21:14:49 +00:00
[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:
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user