diff --git a/src/core/diags/README.md b/src/core/diags/README.md
index 550223d02..9ec39c2cf 100644
--- a/src/core/diags/README.md
+++ b/src/core/diags/README.md
@@ -80,12 +80,13 @@ Done
### diag frame
-Usage: `diag frame [-c] [-s] `
+Usage: `diag frame [-c] [-p TX_POWER] [-s] `
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`.
- Specify `-s` to indicate that tx security is already processed so that it should be skipped in the radio layer.
- Specify `-c` to enable CSMA/CA for this frame in the radio layer.
+- Specify `-p` to specify the tx power in dBm for this frame.
```bash
> diag frame 11223344
diff --git a/src/core/diags/factory_diags.cpp b/src/core/diags/factory_diags.cpp
index e17cae27c..ab88579f3 100644
--- a/src/core/diags/factory_diags.cpp
+++ b/src/core/diags/factory_diags.cpp
@@ -232,6 +232,7 @@ Error Diags::ProcessFrame(uint8_t aArgsLength, char *aArgs[])
uint16_t size = OT_RADIO_FRAME_MAX_SIZE;
bool securityProcessed = false;
bool csmaCaEnabled = false;
+ int8_t txPower = OT_RADIO_POWER_INVALID;
while (aArgsLength > 1)
{
@@ -239,6 +240,17 @@ Error Diags::ProcessFrame(uint8_t aArgsLength, char *aArgs[])
{
securityProcessed = true;
}
+ else if (StringMatch(aArgs[0], "-p"))
+ {
+ long value;
+
+ aArgs++;
+ aArgsLength--;
+
+ VerifyOrExit(aArgsLength > 1, error = kErrorInvalidArgs);
+ SuccessOrExit(error = ParseLong(aArgs[0], value));
+ txPower = static_cast(value);
+ }
else if (StringMatch(aArgs[0], "-c"))
{
csmaCaEnabled = true;
@@ -261,6 +273,7 @@ Error Diags::ProcessFrame(uint8_t aArgsLength, char *aArgs[])
ResetTxPacket();
mTxPacket->mInfo.mTxInfo.mCsmaCaEnabled = csmaCaEnabled;
mTxPacket->mInfo.mTxInfo.mIsSecurityProcessed = securityProcessed;
+ mTxPacket->mInfo.mTxInfo.mTxPower = txPower;
mTxPacket->mLength = size;
mIsTxPacketSet = true;
diff --git a/tests/scripts/expect/cli-diags.exp b/tests/scripts/expect/cli-diags.exp
index 6f2a3f192..116412f8c 100755
--- a/tests/scripts/expect/cli-diags.exp
+++ b/tests/scripts/expect/cli-diags.exp
@@ -166,6 +166,13 @@ send "diag send 1\n"
expect "length 0x3"
expect "Done"
+send_user "send frame with tx power\n"
+send "diag frame -p 11 112233\n"
+expect "Done"
+send "diag send 1\n"
+expect "length 0x3"
+expect "Done"
+
send "diag repeat stop\n"
expect "Done"