mirror of
https://github.com/espressif/openthread.git
synced 2026-10-26 09:13:52 +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
|
```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
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user