[radio] fix alternate short address initialization and matching (#13700)

When a router-eligible Child transitions to Router (e.g. during
TestCoapObserve when Leader notifies an upgraded child at its former
child RLOC16), OpenThread calls otPlatRadioSetAlternateShortAddress(),
which stores the previous short address in mRadioContext.mAlternateShortAddress.

Fix alternate short address handling consistently across Nexus,
simulation radio, and MAC frame utils:
- Advertise OT_RADIO_CAPS_ALT_SHORT_ADDR in both Nexus otPlatRadioGetCaps()
  and simulation gRadioCaps.
- Initialize mCslShortAddress, mShortAddress, and mAlternateShortAddress
  in otRadioContext to OT_RADIO_INVALID_SHORT_ADDR in both
  Nexus::Radio::Reset() and simulation platformRadioInit().
- Drop duplicate Radio::mShortAddress and Radio::mExtAddress from
  Nexus::Radio and use mRadioContext consistently.
- Simplify Nexus::Radio::Radio(void) to call Reset().
- Guard against Mac::kShortAddrInvalid and match both short addresses in
  Nexus::Radio::Matches() and otMacFrameDoesAddrMatchAny().
This commit is contained in:
Yakun Xu
2026-10-09 23:21:19 -07:00
committed by GitHub
parent 1096b060e6
commit 90224407f0
4 changed files with 27 additions and 35 deletions
+6 -2
View File
@@ -144,9 +144,9 @@ static bool sRadioCoexEnabled = true;
otRadioCaps gRadioCaps =
#if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2
OT_RADIO_CAPS_TRANSMIT_SEC;
OT_RADIO_CAPS_ALT_SHORT_ADDR | OT_RADIO_CAPS_TRANSMIT_SEC;
#else
OT_RADIO_CAPS_NONE;
OT_RADIO_CAPS_ALT_SHORT_ADDR;
#endif
static otRadioContext sRadioContext;
@@ -417,6 +417,10 @@ void platformRadioInit(void)
sTransmitFrame.mPsdu = sTransmitMessage.mPsdu;
sAckFrame.mPsdu = sAckMessage.mPsdu;
sRadioContext.mCslShortAddress = OT_RADIO_INVALID_SHORT_ADDR;
sRadioContext.mShortAddress = OT_RADIO_INVALID_SHORT_ADDR;
sRadioContext.mAlternateShortAddress = OT_RADIO_INVALID_SHORT_ADDR;
#if OPENTHREAD_CONFIG_MAC_HEADER_IE_SUPPORT
sTransmitFrame.mInfo.mTxInfo.mIeInfo = &sTransmitIeInfo;
#else
+6 -4
View File
@@ -108,12 +108,14 @@ bool otMacFrameDoesAddrMatchAny(const otRadioFrame *aFrame,
switch (frameInfo.mAddrs.mDestination.GetType())
{
case Mac::Address::kTypeShort:
VerifyOrExit(frameInfo.mAddrs.mDestination.GetShort() == Mac::kShortAddrBroadcast ||
frameInfo.mAddrs.mDestination.GetShort() == aShortAddress ||
(aAltShortAddress != Mac::kShortAddrInvalid &&
frameInfo.mAddrs.mDestination.GetShort() == aAltShortAddress),
{
Mac::ShortAddress dstAddr = frameInfo.mAddrs.mDestination.GetShort();
VerifyOrExit(dstAddr != Mac::kShortAddrInvalid, rval = false);
VerifyOrExit(dstAddr == Mac::kShortAddrBroadcast || dstAddr == aShortAddress || dstAddr == aAltShortAddress,
rval = false);
break;
}
case Mac::Address::kTypeExtended:
VerifyOrExit(frameInfo.mAddrs.mDestination.GetExtended() == *static_cast<const Mac::ExtAddress *>(aExtAddress),
+15 -27
View File
@@ -42,7 +42,7 @@ extern "C" {
otRadioCaps otPlatRadioGetCaps(otInstance *aInstance)
{
OT_UNUSED_VARIABLE(aInstance);
return OT_RADIO_CAPS_TRANSMIT_SEC;
return OT_RADIO_CAPS_TRANSMIT_SEC | OT_RADIO_CAPS_ALT_SHORT_ADDR;
}
int8_t otPlatRadioGetReceiveSensitivity(otInstance *aInstance)
@@ -65,18 +65,13 @@ void otPlatRadioSetPanId(otInstance *aInstance, otPanId aPanId) { AsNode(aInstan
void otPlatRadioSetExtendedAddress(otInstance *aInstance, const otExtAddress *aExtAddress)
{
Radio &radio = AsNode(aInstance).mRadio;
radio.mExtAddress.Set(aExtAddress->m8, Mac::ExtAddress::kReverseByteOrder);
AsCoreType(&radio.mRadioContext.mExtAddress).Set(aExtAddress->m8, Mac::ExtAddress::kReverseByteOrder);
AsCoreType(&AsNode(aInstance).mRadio.mRadioContext.mExtAddress)
.Set(aExtAddress->m8, Mac::ExtAddress::kReverseByteOrder);
}
void otPlatRadioSetShortAddress(otInstance *aInstance, otShortAddress aShortAddress)
{
Radio &radio = AsNode(aInstance).mRadio;
radio.mShortAddress = aShortAddress;
radio.mRadioContext.mShortAddress = aShortAddress;
AsNode(aInstance).mRadio.mRadioContext.mShortAddress = aShortAddress;
}
void otPlatRadioSetAlternateShortAddress(otInstance *aInstance, otShortAddress aShortAddress)
@@ -362,19 +357,7 @@ otError otPlatRadioConfigureEnhAckProbing(otInstance *aInstance,
//---------------------------------------------------------------------------------------------------------------------
// Radio
Radio::Radio(void)
: mState(kStateDisabled)
, mPromiscuous(false)
, mSrcMatchEnabled(false)
, mMacFrameCounterReset(false)
, mChannel(0)
, mPanId(0)
, mShortAddress(Mac::kShortAddrInvalid)
{
mExtAddress.Clear();
ClearAllBytes(mRadioContext);
mTxFrame.mInfo.mTxInfo.mIeInfo = &mTxIeInfo;
}
Radio::Radio(void) { Reset(); }
void Radio::Reset(void)
{
@@ -384,13 +367,14 @@ void Radio::Reset(void)
mMacFrameCounterReset = false;
mChannel = 0;
mPanId = 0;
mShortAddress = Mac::kShortAddrInvalid;
mExtAddress.Clear();
mSrcMatchShortEntries.Clear();
mSrcMatchExtEntries.Clear();
mLinkMetricsEntries.Clear();
ClearAllBytes(mRadioContext);
mTxFrame.mInfo.mTxInfo.mIeInfo = &mTxIeInfo;
mRadioContext.mCslShortAddress = Mac::kShortAddrInvalid;
mRadioContext.mShortAddress = Mac::kShortAddrInvalid;
mRadioContext.mAlternateShortAddress = Mac::kShortAddrInvalid;
mTxFrame.mInfo.mTxInfo.mIeInfo = &mTxIeInfo;
}
Error Radio::ConfigureEnhAckProbing(Mac::ShortAddress aShortAddress,
@@ -506,11 +490,15 @@ bool Radio::Matches(const Mac::Address &aAddress, Mac::PanId aPanId) const
if (aAddress.IsShort())
{
VerifyOrExit(aAddress.IsBroadcast() || aAddress.GetShort() == mShortAddress);
Mac::ShortAddress shortAddr = aAddress.GetShort();
VerifyOrExit(shortAddr != Mac::kShortAddrInvalid);
VerifyOrExit(aAddress.IsBroadcast() || (shortAddr == mRadioContext.mShortAddress) ||
(shortAddr == mRadioContext.mAlternateShortAddress));
}
else if (aAddress.IsExtended())
{
VerifyOrExit(aAddress.GetExtended() == mExtAddress);
VerifyOrExit(aAddress.GetExtended() == AsCoreType(&mRadioContext.mExtAddress));
}
if ((aPanId != Mac::kPanIdBroadcast) && (mPanId != Mac::kPanIdBroadcast))
-2
View File
@@ -96,8 +96,6 @@ struct Radio
bool mMacFrameCounterReset : 1;
uint8_t mChannel;
Mac::PanId mPanId;
Mac::ShortAddress mShortAddress;
Mac::ExtAddress mExtAddress;
Frame mTxFrame;
otRadioIeInfo mTxIeInfo;
otRadioContext mRadioContext;