[simulation] use the CSL receiver's peer address to include CSL IE (#11905)

The description of the method `otPlatRadioEnableCsl()` requires the platform
to include the CSL IE in the enhanced ACK when the received data frame's source
address matches the CSL receiver's peer address. This commit implements this
requirement in the simulation radio.
This commit is contained in:
Zhanglong Xia
2025-09-29 18:24:38 -07:00
committed by GitHub
parent e72d19387e
commit fab01a7f0f
3 changed files with 74 additions and 11 deletions
+24 -8
View File
@@ -98,7 +98,9 @@ static void radioSendMessage(otInstance *aInstance);
static void radioSendAck(void);
static void radioProcessFrame(otInstance *aInstance);
#if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2
static uint8_t generateAckIeData(uint8_t *aLinkMetricsIeData, uint8_t aLinkMetricsIeDataLen);
static uint8_t generateAckIeData(uint8_t *aLinkMetricsIeData,
uint8_t aLinkMetricsIeDataLen,
const struct otRadioFrame *aReceivedFrame);
#endif
static otRadioState sState = OT_RADIO_STATE_DISABLED;
@@ -643,6 +645,7 @@ void radioSendMessage(otInstance *aInstance)
{
uint64_t sfdTxTime = otPlatTimeGet();
sRadioContext.mCslPresent = sTransmitFrame.mInfo.mTxInfo.mCslPresent;
otEXPECT(otMacFrameProcessTxSfd(&sTransmitFrame, sfdTxTime, &sRadioContext) == OT_ERROR_NONE);
}
@@ -802,7 +805,7 @@ void radioSendAck(void)
}
#endif
sAckIeDataLength = generateAckIeData(dataPtr, linkMetricsDataLen);
sAckIeDataLength = generateAckIeData(dataPtr, linkMetricsDataLen, &sReceiveFrame);
otEXPECT(otMacFrameGenerateEnhAck(&sReceiveFrame, sReceiveFrame.mInfo.mRxInfo.mAckedWithFramePending,
sAckIeData, sAckIeDataLength, &sAckFrame) == OT_ERROR_NONE);
@@ -1047,15 +1050,21 @@ uint64_t otPlatRadioGetNow(otInstance *aInstance)
}
#if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2
static uint8_t generateAckIeData(uint8_t *aLinkMetricsIeData, uint8_t aLinkMetricsIeDataLen)
static uint8_t generateAckIeData(uint8_t *aLinkMetricsIeData,
uint8_t aLinkMetricsIeDataLen,
const struct otRadioFrame *aReceivedFrame)
{
OT_UNUSED_VARIABLE(aLinkMetricsIeData);
OT_UNUSED_VARIABLE(aLinkMetricsIeDataLen);
OT_UNUSED_VARIABLE(aReceivedFrame);
uint8_t offset = 0;
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
if (sRadioContext.mCslPeriod > 0)
sRadioContext.mCslPresent =
(sRadioContext.mCslPeriod > 0) && otMacFrameSrcAddrMatchCslReceiverPeer(aReceivedFrame, &sRadioContext);
if (sRadioContext.mCslPresent)
{
offset += otMacFrameGenerateCslIeTemplate(sAckIeData);
}
@@ -1079,13 +1088,20 @@ otError otPlatRadioEnableCsl(otInstance *aInstance,
const otExtAddress *aExtAddr)
{
OT_UNUSED_VARIABLE(aInstance);
OT_UNUSED_VARIABLE(aShortAddr);
OT_UNUSED_VARIABLE(aExtAddr);
otError error = OT_ERROR_NONE;
assert(aCslPeriod < UINT16_MAX);
sRadioContext.mCslPeriod = (uint16_t)aCslPeriod;
otEXPECT_ACTION((aShortAddr != OT_RADIO_BROADCAST_SHORT_ADDR) && (aShortAddr != OT_RADIO_INVALID_SHORT_ADDR),
error = OT_ERROR_FAILED);
otEXPECT_ACTION(aExtAddr != NULL, error = OT_ERROR_FAILED);
return OT_ERROR_NONE;
sRadioContext.mCslPeriod = (uint16_t)aCslPeriod;
sRadioContext.mCslShortAddress = aShortAddr;
ReverseExtAddress(&sRadioContext.mCslExtAddress, aExtAddr);
exit:
return error;
}
otError otPlatRadioResetCsl(otInstance *aInstance)