[diag] specify sending frame (#10359)

This commit adds an extra command `diag frame` to specify the frame
used for `diag send` and `diag repeat`, so that we can use this
command to send arbitrary 802.15.4 frames.
This commit is contained in:
Yakun Xu
2024-06-13 07:53:48 -07:00
committed by GitHub
parent cb1220d79b
commit fa71a8afa3
4 changed files with 104 additions and 12 deletions
+14 -5
View File
@@ -77,6 +77,15 @@ Stop transmitting continuous carrier wave.
Done Done
``` ```
### diag frame \<frame\>
Set the frame (hex encoded) to be used by `diag send` and `diag repeat`. The frame may be overwritten by `diag send` and `diag repeat`.
```bash
> diag frame 11223344
Done
```
### diag stream start ### diag stream start
Start transmitting a stream of characters. Start transmitting a stream of characters.
@@ -143,11 +152,11 @@ RawPowerSetting: 223344
Done Done
``` ```
### diag send \<packets\> \<length\> ### diag send \<packets\> [length]
Transmit a fixed number of packets with fixed length. Transmit a fixed number of packets.
Length parameter has to be in range [3, 127]. Send the frame set by `diag frame` if length is omitted. Otherwise overwrite the frame set by `diag frame` and send a frame of the given length(MUST be in range [3, 127]).
```bash ```bash
> diag send 20 100 > diag send 20 100
@@ -155,11 +164,11 @@ sending 0x14 packet(s), length 0x64
status 0x00 status 0x00
``` ```
### diag repeat \<delay\> \<length\> ### diag repeat \<delay\> [length]
Transmit packets repeatedly with a fixed interval. Transmit packets repeatedly with a fixed interval.
Length parameter has to be in range [3, 127]. Send the frame set by `diag frame` if length is omitted. Otherwise overwrite the frame set by `diag frame` and send a frame of the given length (MUST be in range [3, 127]).
```bash ```bash
> diag repeat 100 100 > diag repeat 100 100
+59 -7
View File
@@ -32,6 +32,7 @@
*/ */
#include "factory_diags.hpp" #include "factory_diags.hpp"
#include "common/error.hpp"
#if OPENTHREAD_CONFIG_DIAG_ENABLE #if OPENTHREAD_CONFIG_DIAG_ENABLE
@@ -187,6 +188,7 @@ extern "C" void otPlatDiagAlarmFired(otInstance *aInstance) { otPlatDiagAlarmCal
const struct Diags::Command Diags::sCommands[] = { const struct Diags::Command Diags::sCommands[] = {
{"channel", &Diags::ProcessChannel}, {"channel", &Diags::ProcessChannel},
{"cw", &Diags::ProcessContinuousWave}, {"cw", &Diags::ProcessContinuousWave},
{"frame", &Diags::ProcessFrame},
{"gpio", &Diags::ProcessGpio}, {"gpio", &Diags::ProcessGpio},
{"power", &Diags::ProcessPower}, {"power", &Diags::ProcessPower},
{"powersettings", &Diags::ProcessPowerSettings}, {"powersettings", &Diags::ProcessPowerSettings},
@@ -208,12 +210,31 @@ Diags::Diags(Instance &aInstance)
, mChannel(20) , mChannel(20)
, mTxPower(0) , mTxPower(0)
, mTxLen(0) , mTxLen(0)
, mIsTxPacketSet(false)
, mRepeatActive(false) , mRepeatActive(false)
, mDiagSendOn(false) , mDiagSendOn(false)
{ {
mStats.Clear(); mStats.Clear();
} }
Error Diags::ProcessFrame(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen)
{
Error error = kErrorNone;
uint16_t size = OT_RADIO_FRAME_MAX_SIZE;
VerifyOrExit(aArgsLength == 1, error = kErrorInvalidArgs);
SuccessOrExit(error = Utils::CmdLineParser::ParseAsHexString(aArgs[0], size, mTxPacket->mPsdu));
VerifyOrExit(size <= OT_RADIO_FRAME_MAX_SIZE, error = kErrorInvalidArgs);
VerifyOrExit(size >= OT_RADIO_FRAME_MIN_SIZE, error = kErrorInvalidArgs);
mTxPacket->mLength = size;
mIsTxPacketSet = true;
exit:
AppendErrorResult(error, aOutput, aOutputMaxLen);
return error;
}
Error Diags::ProcessChannel(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen) Error Diags::ProcessChannel(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen)
{ {
Error error = kErrorNone; Error error = kErrorNone;
@@ -288,12 +309,25 @@ Error Diags::ProcessRepeat(uint8_t aArgsLength, char *aArgs[], char *aOutput, si
{ {
long value; long value;
VerifyOrExit(aArgsLength == 2, error = kErrorInvalidArgs); VerifyOrExit(aArgsLength >= 1, error = kErrorInvalidArgs);
SuccessOrExit(error = ParseLong(aArgs[0], value)); SuccessOrExit(error = ParseLong(aArgs[0], value));
mTxPeriod = static_cast<uint32_t>(value); mTxPeriod = static_cast<uint32_t>(value);
SuccessOrExit(error = ParseLong(aArgs[1], value)); if (aArgsLength >= 2)
{
SuccessOrExit(error = ParseLong(aArgs[1], value));
mIsTxPacketSet = false;
}
else if (mIsTxPacketSet)
{
value = mTxPacket->mLength;
}
else
{
ExitNow(error = kErrorInvalidArgs);
}
VerifyOrExit(value <= OT_RADIO_FRAME_MAX_SIZE, error = kErrorInvalidArgs); VerifyOrExit(value <= OT_RADIO_FRAME_MAX_SIZE, error = kErrorInvalidArgs);
VerifyOrExit(value >= OT_RADIO_FRAME_MIN_SIZE, error = kErrorInvalidArgs); VerifyOrExit(value >= OT_RADIO_FRAME_MIN_SIZE, error = kErrorInvalidArgs);
mTxLen = static_cast<uint8_t>(value); mTxLen = static_cast<uint8_t>(value);
@@ -316,12 +350,25 @@ Error Diags::ProcessSend(uint8_t aArgsLength, char *aArgs[], char *aOutput, size
long value; long value;
VerifyOrExit(otPlatDiagModeGet(), error = kErrorInvalidState); VerifyOrExit(otPlatDiagModeGet(), error = kErrorInvalidState);
VerifyOrExit(aArgsLength == 2, error = kErrorInvalidArgs); VerifyOrExit(aArgsLength >= 1, error = kErrorInvalidArgs);
SuccessOrExit(error = ParseLong(aArgs[0], value)); SuccessOrExit(error = ParseLong(aArgs[0], value));
mTxPackets = static_cast<uint32_t>(value); mTxPackets = static_cast<uint32_t>(value);
SuccessOrExit(error = ParseLong(aArgs[1], value)); if (aArgsLength >= 2)
{
SuccessOrExit(ParseLong(aArgs[1], value));
mIsTxPacketSet = false;
}
else if (mIsTxPacketSet)
{
value = mTxPacket->mLength;
}
else
{
ExitNow(error = kErrorInvalidArgs);
}
VerifyOrExit(value <= OT_RADIO_FRAME_MAX_SIZE, error = kErrorInvalidArgs); VerifyOrExit(value <= OT_RADIO_FRAME_MAX_SIZE, error = kErrorInvalidArgs);
VerifyOrExit(value >= OT_RADIO_FRAME_MIN_SIZE, error = kErrorInvalidArgs); VerifyOrExit(value >= OT_RADIO_FRAME_MIN_SIZE, error = kErrorInvalidArgs);
mTxLen = static_cast<uint8_t>(value); mTxLen = static_cast<uint8_t>(value);
@@ -420,12 +467,16 @@ exit:
void Diags::TransmitPacket(void) void Diags::TransmitPacket(void)
{ {
mTxPacket->mLength = mTxLen;
mTxPacket->mChannel = mChannel; mTxPacket->mChannel = mChannel;
for (uint8_t i = 0; i < mTxLen; i++) if (!mIsTxPacketSet)
{ {
mTxPacket->mPsdu[i] = i; mTxPacket->mLength = mTxLen;
for (uint8_t i = 0; i < mTxLen; i++)
{
mTxPacket->mPsdu[i] = i;
}
} }
mDiagSendOn = true; mDiagSendOn = true;
@@ -986,4 +1037,5 @@ OT_TOOL_WEAK otError otPlatDiagRadioGetPowerSettings(otInstance *aInstance,
return OT_ERROR_NOT_IMPLEMENTED; return OT_ERROR_NOT_IMPLEMENTED;
} }
#endif // OPENTHREAD_CONFIG_DIAG_ENABLE #endif // OPENTHREAD_CONFIG_DIAG_ENABLE
+2
View File
@@ -181,6 +181,7 @@ private:
Error ParseCmd(char *aString, uint8_t &aArgsLength, char *aArgs[]); Error ParseCmd(char *aString, uint8_t &aArgsLength, char *aArgs[]);
Error ProcessChannel(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen); Error ProcessChannel(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen);
Error ProcessFrame(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen);
Error ProcessContinuousWave(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen); Error ProcessContinuousWave(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen);
Error ProcessGpio(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen); Error ProcessGpio(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen);
Error ProcessPower(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen); Error ProcessPower(uint8_t aArgsLength, char *aArgs[], char *aOutput, size_t aOutputMaxLen);
@@ -217,6 +218,7 @@ private:
uint8_t mChannel; uint8_t mChannel;
int8_t mTxPower; int8_t mTxPower;
uint8_t mTxLen; uint8_t mTxLen;
bool mIsTxPacketSet;
bool mRepeatActive; bool mRepeatActive;
bool mDiagSendOn; bool mDiagSendOn;
#endif #endif
+29
View File
@@ -126,6 +126,35 @@ expect "start diagnostics mode"
expect "status 0x00" expect "status 0x00"
expect_line "Done" expect_line "Done"
send_user "input too short test\n"
send "diag frame 11\n"
expect "Error"
send_user "input too long test\n"
send "diag frame 11223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900\n"
expect "Error"
send_user "input odd length test\n"
send "diag frame 123\n"
expect "Error"
send_user "shortest frame test\n"
send "diag frame 112233\n"
expect "Done"
send "diag send 1\n"
expect "length 0x3"
expect "Done"
send_user "longest frame test\n"
send "diag frame 11223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677889900112233445566778899001122334455667788990011223344556677\n"
expect "Done"
send "diag repeat 1\n"
expect "length 0x7f"
expect "Done"
send "diag repeat stop\n"
expect "Done"
send "diag channel 11\n" send "diag channel 11\n"
expect "set channel to 11" expect "set channel to 11"
expect "status 0x00" expect "status 0x00"