[mle] enhance RLOC and ALOC address generation (#10391)

This commit enhances the generation of RLOC and ALOC addresses in the
`Mle` class.

Methods retrieving RLOC/ALOC addresses no longer return an `Error` and
are now `void`. The previous check for a valid `GetRloc16()` value,
which returned `kErrorDetach` if unset, is removed because this
scenario only occurred before the device's initial attachment.
Post-attachment, the RLOC16 remains valid even if the device is
detached. This change simplifies the code since RLOC/ALOC address
retrieval happens after the initial attachment.

Additional enhancements include:

-   Changing the input parameter order in `GetCommissionerAloc()` to
    match `GetServiceAloc()`.
-   Using `Ip6::Address::SetToRoutingLocator()` to construct RLOC
    addresses, harmonizing address generation and improving code
    readability.
This commit is contained in:
Abtin Keshavarzian
2024-06-17 09:23:43 -07:00
committed by GitHub
parent 8a8a4d8e31
commit 5127e7e5c0
18 changed files with 63 additions and 107 deletions
+14 -2
View File
@@ -79,7 +79,13 @@ exit:
otError otThreadGetLeaderRloc(otInstance *aInstance, otIp6Address *aLeaderRloc)
{
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetLeaderAddress(AsCoreType(aLeaderRloc));
Error error = kErrorNone;
VerifyOrExit(AsCoreType(aInstance).Get<Mle::Mle>().GetRloc16() != Mac::kShortAddrInvalid, error = kErrorDetached);
AsCoreType(aInstance).Get<Mle::Mle>().GetLeaderRloc(AsCoreType(aLeaderRloc));
exit:
return error;
}
otLinkModeConfig otThreadGetLinkMode(otInstance *aInstance)
@@ -189,7 +195,13 @@ const otIp6Address *otThreadGetRealmLocalAllThreadNodesMulticastAddress(otInstan
otError otThreadGetServiceAloc(otInstance *aInstance, uint8_t aServiceId, otIp6Address *aServiceAloc)
{
return AsCoreType(aInstance).Get<Mle::MleRouter>().GetServiceAloc(aServiceId, AsCoreType(aServiceAloc));
Error error = kErrorNone;
VerifyOrExit(AsCoreType(aInstance).Get<Mle::Mle>().GetRloc16() != Mac::kShortAddrInvalid, error = kErrorDetached);
AsCoreType(aInstance).Get<Mle::Mle>().GetServiceAloc(aServiceId, AsCoreType(aServiceAloc));
exit:
return error;
}
const char *otThreadGetNetworkName(otInstance *aInstance)
+2 -2
View File
@@ -200,7 +200,7 @@ void BorderAgent::HandleCoapResponse(const ForwardContext &aForwardContext,
SuccessOrExit(error = Tlv::Find<CommissionerSessionIdTlv>(*aResponse, sessionId));
IgnoreError(Get<Mle::MleRouter>().GetCommissionerAloc(mCommissionerAloc.GetAddress(), sessionId));
Get<Mle::Mle>().GetCommissionerAloc(sessionId, mCommissionerAloc.GetAddress());
Get<ThreadNetif>().AddUnicastAddress(mCommissionerAloc);
IgnoreError(Get<Ip6::Udp>().AddReceiver(mUdpReceiver));
@@ -561,7 +561,7 @@ Error BorderAgent::ForwardToLeader(const Coap::Message &aMessage, const Ip6::Mes
SuccessOrExit(error = message->AppendBytesFromMessage(aMessage, aMessage.GetOffset(),
aMessage.GetLength() - aMessage.GetOffset()));
SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
messageInfo.SetSockPortToTmf();
SuccessOrExit(error =
+5 -5
View File
@@ -639,7 +639,7 @@ Error Commissioner::SendMgmtCommissionerGetRequest(const uint8_t *aTlvs, uint8_t
SuccessOrExit(error = message->AppendBytes(aTlvs, aLength));
}
SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo,
Commissioner::HandleMgmtCommissionerGetResponse, this));
@@ -710,7 +710,7 @@ Error Commissioner::SendMgmtCommissionerSetRequest(const CommissioningDataset &a
SuccessOrExit(error = message->AppendBytes(aTlvs, aLength));
}
SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo,
Commissioner::HandleMgmtCommissionerSetResponse, this));
@@ -763,7 +763,7 @@ Error Commissioner::SendPetition(void)
SuccessOrExit(error = Tlv::Append<CommissionerIdTlv>(*message, mCommissionerId));
SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
SuccessOrExit(
error = Get<Tmf::Agent>().SendMessage(*message, messageInfo, Commissioner::HandleLeaderPetitionResponse, this));
@@ -811,7 +811,7 @@ void Commissioner::HandleLeaderPetitionResponse(Coap::Message *aMessage
ExitNow();
}
IgnoreError(Get<Mle::MleRouter>().GetCommissionerAloc(mCommissionerAloc.GetAddress(), mSessionId));
Get<Mle::Mle>().GetCommissionerAloc(mSessionId, mCommissionerAloc.GetAddress());
Get<ThreadNetif>().AddUnicastAddress(mCommissionerAloc);
SetState(kStateActive);
@@ -850,7 +850,7 @@ void Commissioner::SendKeepAlive(uint16_t aSessionId)
SuccessOrExit(error = Tlv::Append<CommissionerSessionIdTlv>(*message, aSessionId));
SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo,
Commissioner::HandleLeaderKeepAliveResponse, this));
+2 -2
View File
@@ -483,7 +483,7 @@ Error DatasetManager::SendSetRequest(const Dataset &aDataset)
VerifyOrExit(message != nullptr, error = kErrorNoBufs);
SuccessOrExit(error = message->AppendBytes(aDataset.GetBytes(), aDataset.GetLength()));
IgnoreError(messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo, HandleMgmtSetResponse, this));
mMgmtPending = true;
@@ -708,7 +708,7 @@ Error DatasetManager::SendGetRequest(const Dataset::Components &aDatasetComponen
SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kGet, tlvList.GetArrayBuffer(), tlvList.GetLength()));
}
IgnoreError(messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
if (aAddress != nullptr)
{
+1 -1
View File
@@ -241,7 +241,7 @@ Error DatasetManager::HandleSetOrReplace(MgmtCommand aCommand,
Ip6::Address destination;
SuccessOrExit(Get<NetworkData::Leader>().FindCommissioningSessionId(localSessionId));
SuccessOrExit(Get<Mle::MleRouter>().GetCommissionerAloc(destination, localSessionId));
Get<Mle::Mle>().GetCommissionerAloc(localSessionId, destination);
Get<Leader>().SendDatasetChanged(destination);
}
+2 -2
View File
@@ -101,10 +101,10 @@ void Agent::UpdateService(void)
if (error == kErrorNone)
{
uint16_t rloc = Mle::kAloc16NeighborDiscoveryAgentStart + lowpanContext.mContextId - 1;
uint16_t aloc16 = Mle::kAloc16NeighborDiscoveryAgentStart + lowpanContext.mContextId - 1;
mAloc.InitAsThreadOrigin();
mAloc.GetAddress().SetToAnycastLocator(Get<Mle::MleRouter>().GetMeshLocalPrefix(), rloc);
mAloc.GetAddress().SetToAnycastLocator(Get<Mle::MleRouter>().GetMeshLocalPrefix(), aloc16);
mAloc.mMeshLocal = true;
Get<ThreadNetif>().AddUnicastAddress(mAloc);
ExitNow();
+1 -1
View File
@@ -822,7 +822,7 @@ void AddressResolver::HandleTmf<kUriAddressError>(Coap::Message &aMessage, const
if (child.RemoveIp6Address(target) == kErrorNone)
{
SuccessOrExit(error = Get<Mle::Mle>().GetLocatorAddress(destination, child.GetRloc16()));
destination.SetToRoutingLocator(Get<Mle::Mle>().GetMeshLocalPrefix(), child.GetRloc16());
SendAddressError(target, meshLocalIid, &destination);
ExitNow();
+1 -1
View File
@@ -512,7 +512,7 @@ void DuaManager::PerformNextRegistration(void)
uint8_t pbbrServiceId;
SuccessOrExit(error = Get<BackboneRouter::Leader>().GetServiceId(pbbrServiceId));
SuccessOrExit(error = mle.GetServiceAloc(pbbrServiceId, messageInfo.GetPeerAddr()));
mle.GetServiceAloc(pbbrServiceId, messageInfo.GetPeerAddr());
}
else
{
+1 -2
View File
@@ -654,8 +654,7 @@ void MeshForwarder::SendDestinationUnreachable(uint16_t aMeshSource, const Ip6::
{
Ip6::MessageInfo messageInfo;
messageInfo.GetPeerAddr() = Get<Mle::MleRouter>().GetMeshLocalRloc();
messageInfo.GetPeerAddr().GetIid().SetLocator(aMeshSource);
messageInfo.GetPeerAddr().SetToRoutingLocator(Get<Mle::Mle>().GetMeshLocalPrefix(), aMeshSource);
IgnoreError(Get<Ip6::Icmp>().SendError(Ip6::Icmp::Header::kTypeDstUnreach,
Ip6::Icmp::Header::kCodeDstUnreachNoRoute, messageInfo, aIp6Headers));
+7 -27
View File
@@ -998,40 +998,21 @@ void Mle::SetLeaderData(uint32_t aPartitionId, uint8_t aWeighting, uint8_t aLead
mLeaderData.SetLeaderRouterId(aLeaderRouterId);
}
Error Mle::GetLeaderAddress(Ip6::Address &aAddress) const
void Mle::GetLeaderRloc(Ip6::Address &aAddress) const
{
Error error = kErrorNone;
VerifyOrExit(GetRloc16() != Mac::kShortAddrInvalid, error = kErrorDetached);
aAddress.SetToRoutingLocator(mMeshLocalPrefix, GetLeaderRloc16());
exit:
return error;
}
Error Mle::GetLocatorAddress(Ip6::Address &aAddress, uint16_t aLocator) const
void Mle::GetLeaderAloc(Ip6::Address &aAddress) const { aAddress.SetToAnycastLocator(mMeshLocalPrefix, kAloc16Leader); }
void Mle::GetCommissionerAloc(uint16_t aSessionId, Ip6::Address &aAddress) const
{
Error error = kErrorNone;
VerifyOrExit(GetRloc16() != Mac::kShortAddrInvalid, error = kErrorDetached);
memcpy(&aAddress, &mMeshLocalRloc.GetAddress(), 14);
aAddress.GetIid().SetLocator(aLocator);
exit:
return error;
aAddress.SetToAnycastLocator(mMeshLocalPrefix, CommissionerAloc16FromId(aSessionId));
}
Error Mle::GetServiceAloc(uint8_t aServiceId, Ip6::Address &aAddress) const
void Mle::GetServiceAloc(uint8_t aServiceId, Ip6::Address &aAddress) const
{
Error error = kErrorNone;
VerifyOrExit(GetRloc16() != Mac::kShortAddrInvalid, error = kErrorDetached);
aAddress.SetToAnycastLocator(mMeshLocalPrefix, ServiceAlocFromId(aServiceId));
exit:
return error;
}
const LeaderData &Mle::GetLeaderData(void)
@@ -3884,8 +3865,7 @@ void Mle::InformPreviousParent(void)
SuccessOrExit(error = message->SetLength(0));
messageInfo.SetSockAddr(GetMeshLocalEid());
messageInfo.SetPeerAddr(GetMeshLocalRloc());
messageInfo.GetPeerAddr().GetIid().SetLocator(mPreviousParentRloc);
messageInfo.GetPeerAddr().SetToRoutingLocator(mMeshLocalPrefix, mPreviousParentRloc);
SuccessOrExit(error = Get<Ip6::Ip6>().SendDatagram(*message, messageInfo, Ip6::kProtoNone));
+9 -36
View File
@@ -558,51 +558,36 @@ public:
/**
* Retrieves the Leader's RLOC.
*
* @param[out] aAddress A reference to the Leader's RLOC.
*
* @retval kErrorNone Successfully retrieved the Leader's RLOC.
* @retval kErrorDetached The Thread interface is not currently attached to a Thread Partition.
* @param[out] aAddress A reference to an address to return the Leader's RLOC.
*
*/
Error GetLeaderAddress(Ip6::Address &aAddress) const;
void GetLeaderRloc(Ip6::Address &aAddress) const;
/**
* Retrieves the Leader's ALOC.
*
* @param[out] aAddress A reference to the Leader's ALOC.
*
* @retval kErrorNone Successfully retrieved the Leader's ALOC.
* @retval kErrorDetached The Thread interface is not currently attached to a Thread Partition.
* @param[out] aAddress A reference to an address to return the Leader's ALOC.
*
*/
Error GetLeaderAloc(Ip6::Address &aAddress) const { return GetLocatorAddress(aAddress, kAloc16Leader); }
void GetLeaderAloc(Ip6::Address &aAddress) const;
/**
* Computes the Commissioner's ALOC.
* Retrieves the Commissioner's ALOC for a given session ID.
*
* @param[out] aAddress A reference to the Commissioner's ALOC.
* @param[in] aSessionId Commissioner session id.
*
* @retval kErrorNone Successfully retrieved the Commissioner's ALOC.
* @retval kErrorDetached The Thread interface is not currently attached to a Thread Partition.
* @param[out] aAddress A reference to an address to return the Commissioner's ALOC.
*
*/
Error GetCommissionerAloc(Ip6::Address &aAddress, uint16_t aSessionId) const
{
return GetLocatorAddress(aAddress, CommissionerAloc16FromId(aSessionId));
}
void GetCommissionerAloc(uint16_t aSessionId, Ip6::Address &aAddress) const;
/**
* Retrieves the Service ALOC for given Service ID.
*
* @param[in] aServiceId Service ID to get ALOC for.
* @param[out] aAddress A reference to the Service ALOC.
*
* @retval kErrorNone Successfully retrieved the Service ALOC.
* @retval kErrorDetached The Thread interface is not currently attached to a Thread Partition.
* @param[out] aAddress A reference to an address to return the Service ALOC.
*
*/
Error GetServiceAloc(uint8_t aServiceId, Ip6::Address &aAddress) const;
void GetServiceAloc(uint8_t aServiceId, Ip6::Address &aAddress) const;
/**
* Returns the most recently received Leader Data.
@@ -677,18 +662,6 @@ public:
*/
void RequestShorterChildIdRequest(void);
/**
* Gets the RLOC or ALOC of a given RLOC16 or ALOC16.
*
* @param[out] aAddress A reference to the RLOC or ALOC.
* @param[in] aLocator RLOC16 or ALOC16.
*
* @retval kErrorNone If got the RLOC or ALOC successfully.
* @retval kErrorDetached If device is detached.
*
*/
Error GetLocatorAddress(Ip6::Address &aAddress, uint16_t aLocator) const;
/**
* Schedules a Child Update Request.
*
+3 -3
View File
@@ -450,7 +450,7 @@ void MleRouter::SetStateRouterOrLeader(DeviceRole aRole, uint16_t aRloc16, Leade
if (aRole == kRoleLeader)
{
IgnoreError(GetLeaderAloc(mLeaderAloc.GetAddress()));
GetLeaderAloc(mLeaderAloc.GetAddress());
Get<ThreadNetif>().AddUnicastAddress(mLeaderAloc);
Get<TimeTicker>().RegisterReceiver(TimeTicker::kMleRouter);
Get<NetworkData::Leader>().Start(aStartMode);
@@ -3293,7 +3293,7 @@ Error MleRouter::SendAddressSolicit(ThreadStatusTlv::Status aStatus)
SuccessOrExit(error = Tlv::Append<XtalAccuracyTlv>(*message, otPlatTimeGetXtalAccuracy()));
#endif
SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderRloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderRloc();
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo, &HandleAddressSolicitResponse, this));
mAddressSolicitPending = true;
@@ -3317,7 +3317,7 @@ void MleRouter::SendAddressRelease(void)
SuccessOrExit(error = Tlv::Append<ThreadRloc16Tlv>(*message, Rloc16FromRouterId(mRouterId)));
SuccessOrExit(error = Tlv::Append<ThreadExtMacAddressTlv>(*message, Get<Mac::Mac>().GetExtAddress()));
SuccessOrExit(error = messageInfo.SetSockAddrToRlocPeerAddrToLeaderRloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderRloc();
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo));
+1 -1
View File
@@ -401,7 +401,7 @@ Error MlrManager::SendMlrMessage(const Ip6::Address *aAddresses,
uint8_t pbbrServiceId;
SuccessOrExit(error = Get<BackboneRouter::Leader>().GetServiceId(pbbrServiceId));
SuccessOrExit(error = mle.GetServiceAloc(pbbrServiceId, messageInfo.GetPeerAddr()));
mle.GetServiceAloc(pbbrServiceId, messageInfo.GetPeerAddr());
}
else
{
+1 -1
View File
@@ -216,7 +216,7 @@ Error Notifier::SendServerDataNotification(uint16_t aOldRloc16, const NetworkDat
SuccessOrExit(error = Tlv::Append<ThreadRloc16Tlv>(*message, aOldRloc16));
}
IgnoreError(messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc());
messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc();
SuccessOrExit(error = Get<Tmf::Agent>().SendMessage(*message, messageInfo, HandleCoapResponse, this));
LogInfo("Sent %s", UriToString<kUriServerData>());
+3 -2
View File
@@ -182,8 +182,9 @@ Error Manager::GetNextDnsSrpAnycastInfo(Iterator &aIterator, DnsSrpAnycast::Info
} while (tlv->GetServiceDataLength() < sizeof(DnsSrpAnycast::ServiceData));
tlv->GetServiceData(serviceData);
aInfo.mAnycastAddress.SetToAnycastLocator(Get<Mle::Mle>().GetMeshLocalPrefix(),
Mle::ServiceAlocFromId(tlv->GetServiceId()));
Get<Mle::Mle>().GetServiceAloc(tlv->GetServiceId(), aInfo.mAnycastAddress);
aInfo.mSequenceNumber =
reinterpret_cast<const DnsSrpAnycast::ServiceData *>(serviceData.GetBytes())->GetSequenceNumber();
+5 -6
View File
@@ -44,16 +44,16 @@ namespace Tmf {
void MessageInfo::SetSockAddrToRloc(void) { SetSockAddr(Get<Mle::MleRouter>().GetMeshLocalRloc()); }
Error MessageInfo::SetSockAddrToRlocPeerAddrToLeaderAloc(void)
void MessageInfo::SetSockAddrToRlocPeerAddrToLeaderAloc(void)
{
SetSockAddrToRloc();
return Get<Mle::MleRouter>().GetLeaderAloc(GetPeerAddr());
Get<Mle::MleRouter>().GetLeaderAloc(GetPeerAddr());
}
Error MessageInfo::SetSockAddrToRlocPeerAddrToLeaderRloc(void)
void MessageInfo::SetSockAddrToRlocPeerAddrToLeaderRloc(void)
{
SetSockAddrToRloc();
return Get<Mle::MleRouter>().GetLeaderAddress(GetPeerAddr());
Get<Mle::MleRouter>().GetLeaderRloc(GetPeerAddr());
}
void MessageInfo::SetSockAddrToRlocPeerAddrToRealmLocalAllRoutersMulticast(void)
@@ -65,8 +65,7 @@ void MessageInfo::SetSockAddrToRlocPeerAddrToRealmLocalAllRoutersMulticast(void)
void MessageInfo::SetSockAddrToRlocPeerAddrTo(uint16_t aRloc16)
{
SetSockAddrToRloc();
SetPeerAddr(Get<Mle::MleRouter>().GetMeshLocalRloc());
GetPeerAddr().GetIid().SetLocator(aRloc16);
GetPeerAddr().SetToRoutingLocator(Get<Mle::Mle>().GetMeshLocalPrefix(), aRloc16);
}
void MessageInfo::SetSockAddrToRlocPeerAddrTo(const Ip6::Address &aPeerAddress)
+3 -9
View File
@@ -99,20 +99,14 @@ public:
/**
* Sets the local socket address to RLOC address and the peer socket address to leader ALOC.
*
* @retval kErrorNone Successfully set the addresses.
* @retval kErrorDetached Cannot set leader ALOC since device is currently detached.
*
*/
Error SetSockAddrToRlocPeerAddrToLeaderAloc(void);
void SetSockAddrToRlocPeerAddrToLeaderAloc(void);
/**
* Sets the local socket address to RLOC address and the peer socket address to leader RLOC.
*
* @retval kErrorNone Successfully set the addresses.
* @retval kErrorDetached Cannot set leader RLOC since device is currently detached.
*
q *
*/
Error SetSockAddrToRlocPeerAddrToLeaderRloc(void);
void SetSockAddrToRlocPeerAddrToLeaderRloc(void);
/**
* Sets the local socket address to RLOC address and the peer socket address to realm-local all
+2 -4
View File
@@ -98,8 +98,7 @@ Error MeshDiag::DiscoverTopology(const DiscoverConfig &aConfig, DiscoverCallback
continue;
}
destination = Get<Mle::MleRouter>().GetMeshLocalRloc();
destination.GetIid().SetLocator(Mle::Rloc16FromRouterId(routerId));
destination.SetToRoutingLocator(Get<Mle::Mle>().GetMeshLocalPrefix(), Mle::Rloc16FromRouterId(routerId));
SuccessOrExit(error = Get<Client>().SendCommand(kUriDiagnosticGetRequest, Message::kPriorityLow, destination,
tlvs, tlvsLength, HandleDiagGetResponse, this));
@@ -176,8 +175,7 @@ Error MeshDiag::SendQuery(uint16_t aRloc16, const uint8_t *aTlvs, uint8_t aTlvsL
VerifyOrExit(Mle::IsActiveRouter(aRloc16), error = kErrorInvalidArgs);
VerifyOrExit(Get<RouterTable>().IsAllocated(Mle::RouterIdFromRloc16(aRloc16)), error = kErrorNotFound);
destination = Get<Mle::MleRouter>().GetMeshLocalRloc();
destination.GetIid().SetLocator(aRloc16);
destination.SetToRoutingLocator(Get<Mle::Mle>().GetMeshLocalPrefix(), aRloc16);
SuccessOrExit(error = Get<Client>().SendCommand(kUriDiagnosticGetQuery, Message::kPriorityNormal, destination,
aTlvs, aTlvsLength));