diff --git a/src/core/diags/README.md b/src/core/diags/README.md
index 7af2f6084..550223d02 100644
--- a/src/core/diags/README.md
+++ b/src/core/diags/README.md
@@ -80,11 +80,12 @@ Done
### diag frame
-Usage: `diag frame [-s] `
+Usage: `diag frame [-c] [-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 skip security processing in radio layer.
+- 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.
```bash
> diag frame 11223344
diff --git a/src/core/diags/factory_diags.cpp b/src/core/diags/factory_diags.cpp
index 1c1a28c28..0ae249fbc 100644
--- a/src/core/diags/factory_diags.cpp
+++ b/src/core/diags/factory_diags.cpp
@@ -236,15 +236,25 @@ Error Diags::ProcessFrame(uint8_t aArgsLength, char *aArgs[])
Error error = kErrorNone;
uint16_t size = OT_RADIO_FRAME_MAX_SIZE;
bool securityProcessed = false;
+ bool csmaCaEnabled = false;
- if (aArgsLength >= 1)
+ while (aArgsLength > 1)
{
if (StringMatch(aArgs[0], "-s"))
{
securityProcessed = true;
- aArgs++;
- aArgsLength--;
}
+ else if (StringMatch(aArgs[0], "-c"))
+ {
+ csmaCaEnabled = true;
+ }
+ else
+ {
+ ExitNow(error = kErrorInvalidArgs);
+ }
+
+ aArgs++;
+ aArgsLength--;
}
VerifyOrExit(aArgsLength == 1, error = kErrorInvalidArgs);
@@ -254,6 +264,7 @@ Error Diags::ProcessFrame(uint8_t aArgsLength, char *aArgs[])
VerifyOrExit(size >= OT_RADIO_FRAME_MIN_SIZE, error = kErrorInvalidArgs);
ResetTxPacket();
+ mTxPacket->mInfo.mTxInfo.mCsmaCaEnabled = csmaCaEnabled;
mTxPacket->mInfo.mTxInfo.mIsSecurityProcessed = securityProcessed;
mTxPacket->mLength = size;
mIsTxPacketSet = true;
diff --git a/tests/scripts/expect/cli-diags.exp b/tests/scripts/expect/cli-diags.exp
index 3f26628d0..6f2a3f192 100755
--- a/tests/scripts/expect/cli-diags.exp
+++ b/tests/scripts/expect/cli-diags.exp
@@ -159,6 +159,13 @@ send "diag send 1\n"
expect "length 0x3"
expect "Done"
+send_user "send frame with CSMA/CA enabled\n"
+send "diag frame -c 112233\n"
+expect "Done"
+send "diag send 1\n"
+expect "length 0x3"
+expect "Done"
+
send "diag repeat stop\n"
expect "Done"