[mle] add `RxInfo` struct and pass in `Handle{MleMsg}()` methods (#7627)
This commit adds a new struct `RxInfo` which includes a received
MLE `Message` along with additional info about it such as the
`Ip6::MessageInfo` and key sequence from security header and
pointer to `Neighbor` from which the message was received.
The `RxInfo` is used as the input parameter in different MLE
`Handle{MleMsg}`()` methods.
diff --git a/src/core/thread/discover_scanner.cpp b/src/core/thread/discover_scanner.cpp
index 3a9fb9d..f8db1c5 100644
--- a/src/core/thread/discover_scanner.cpp
+++ b/src/core/thread/discover_scanner.cpp
@@ -285,10 +285,10 @@
return;
}
-void DiscoverScanner::HandleDiscoveryResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo) const
+void DiscoverScanner::HandleDiscoveryResponse(Mle::RxInfo &aRxInfo) const
{
Error error = kErrorNone;
- const ThreadLinkInfo * linkInfo = aMessageInfo.GetThreadLinkInfo();
+ const ThreadLinkInfo * linkInfo = aRxInfo.mMessageInfo.GetThreadLinkInfo();
Tlv tlv;
MeshCoP::Tlv meshcopTlv;
MeshCoP::DiscoveryResponseTlv discoveryResponse;
@@ -298,13 +298,13 @@
uint16_t end;
bool didCheckSteeringData = false;
- Mle::Log(Mle::kMessageReceive, Mle::kTypeDiscoveryResponse, aMessageInfo.GetPeerAddr());
+ Mle::Log(Mle::kMessageReceive, Mle::kTypeDiscoveryResponse, aRxInfo.mMessageInfo.GetPeerAddr());
VerifyOrExit(mState == kStateScanning, error = kErrorDrop);
// Find MLE Discovery TLV
- VerifyOrExit(Tlv::FindTlvOffset(aMessage, Tlv::kDiscovery, offset) == kErrorNone, error = kErrorParse);
- IgnoreError(aMessage.Read(offset, tlv));
+ VerifyOrExit(Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kDiscovery, offset) == kErrorNone, error = kErrorParse);
+ IgnoreError(aRxInfo.mMessage.Read(offset, tlv));
offset += sizeof(tlv);
end = offset + tlv.GetLength();
@@ -316,29 +316,29 @@
result.mRssi = linkInfo->mRss;
result.mLqi = linkInfo->mLqi;
- aMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(AsCoreType(&result.mExtAddress));
+ aRxInfo.mMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(AsCoreType(&result.mExtAddress));
// Process MeshCoP TLVs
while (offset < end)
{
- IgnoreError(aMessage.Read(offset, meshcopTlv));
+ IgnoreError(aRxInfo.mMessage.Read(offset, meshcopTlv));
switch (meshcopTlv.GetType())
{
case MeshCoP::Tlv::kDiscoveryResponse:
- IgnoreError(aMessage.Read(offset, discoveryResponse));
+ IgnoreError(aRxInfo.mMessage.Read(offset, discoveryResponse));
VerifyOrExit(discoveryResponse.IsValid(), error = kErrorParse);
result.mVersion = discoveryResponse.GetVersion();
result.mIsNative = discoveryResponse.IsNativeCommissioner();
break;
case MeshCoP::Tlv::kExtendedPanId:
- SuccessOrExit(
- error = Tlv::Read<MeshCoP::ExtendedPanIdTlv>(aMessage, offset, AsCoreType(&result.mExtendedPanId)));
+ SuccessOrExit(error = Tlv::Read<MeshCoP::ExtendedPanIdTlv>(aRxInfo.mMessage, offset,
+ AsCoreType(&result.mExtendedPanId)));
break;
case MeshCoP::Tlv::kNetworkName:
- IgnoreError(aMessage.Read(offset, networkName));
+ IgnoreError(aRxInfo.mMessage.Read(offset, networkName));
if (networkName.IsValid())
{
IgnoreError(AsCoreType(&result.mNetworkName).Set(networkName.GetNetworkName()));
@@ -358,7 +358,7 @@
steeringData.Init(dataLength);
- SuccessOrExit(error = Tlv::ReadTlv(aMessage, offset, steeringData.GetData(), dataLength));
+ SuccessOrExit(error = Tlv::ReadTlv(aRxInfo.mMessage, offset, steeringData.GetData(), dataLength));
if (mEnableFiltering)
{
@@ -370,7 +370,8 @@
break;
case MeshCoP::Tlv::kJoinerUdpPort:
- SuccessOrExit(error = Tlv::Read<MeshCoP::JoinerUdpPortTlv>(aMessage, offset, result.mJoinerUdpPort));
+ SuccessOrExit(error =
+ Tlv::Read<MeshCoP::JoinerUdpPortTlv>(aRxInfo.mMessage, offset, result.mJoinerUdpPort));
break;
default:
diff --git a/src/core/thread/discover_scanner.hpp b/src/core/thread/discover_scanner.hpp
index d854a19..061aa2f 100644
--- a/src/core/thread/discover_scanner.hpp
+++ b/src/core/thread/discover_scanner.hpp
@@ -167,7 +167,7 @@
void Stop(void) { HandleDiscoverComplete(); }
// Methods used from `Mle`
- void HandleDiscoveryResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo) const;
+ void HandleDiscoveryResponse(Mle::RxInfo &aRxInfo) const;
void HandleDiscoverComplete(void);
static void HandleTimer(Timer &aTimer);
diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp
index d0008dc..418fcd4 100644
--- a/src/core/thread/mle.cpp
+++ b/src/core/thread/mle.cpp
@@ -2766,6 +2766,7 @@
void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{
Error error = kErrorNone;
+ RxInfo rxInfo(aMessage, aMessageInfo);
uint8_t securitySuite;
SecurityHeader header;
uint32_t keySequence;
@@ -2796,11 +2797,11 @@
{
#if OPENTHREAD_FTD
case kCommandDiscoveryRequest:
- Get<MleRouter>().HandleDiscoveryRequest(aMessage, aMessageInfo);
+ Get<MleRouter>().HandleDiscoveryRequest(rxInfo);
break;
#endif
case kCommandDiscoveryResponse:
- Get<DiscoverScanner>().HandleDiscoveryResponse(aMessage, aMessageInfo);
+ Get<DiscoverScanner>().HandleDiscoveryResponse(rxInfo);
break;
default:
@@ -2916,38 +2917,42 @@
}
#endif
+ rxInfo.mKeySequence = keySequence;
+ rxInfo.mFrameCounter = frameCounter;
+ rxInfo.mNeighbor = neighbor;
+
switch (command)
{
case kCommandAdvertisement:
- HandleAdvertisement(aMessage, aMessageInfo, neighbor);
+ HandleAdvertisement(rxInfo);
break;
case kCommandDataResponse:
- HandleDataResponse(aMessage, aMessageInfo, neighbor);
+ HandleDataResponse(rxInfo);
break;
case kCommandParentResponse:
- HandleParentResponse(aMessage, aMessageInfo, keySequence);
+ HandleParentResponse(rxInfo);
break;
case kCommandChildIdResponse:
- HandleChildIdResponse(aMessage, aMessageInfo, neighbor);
+ HandleChildIdResponse(rxInfo);
break;
case kCommandAnnounce:
- HandleAnnounce(aMessage, aMessageInfo);
+ HandleAnnounce(rxInfo);
break;
case kCommandChildUpdateRequest:
#if OPENTHREAD_FTD
if (IsRouterOrLeader())
{
- Get<MleRouter>().HandleChildUpdateRequest(aMessage, aMessageInfo);
+ Get<MleRouter>().HandleChildUpdateRequest(rxInfo);
}
else
#endif
{
- HandleChildUpdateRequest(aMessage, aMessageInfo, neighbor);
+ HandleChildUpdateRequest(rxInfo);
}
break;
@@ -2956,63 +2961,63 @@
#if OPENTHREAD_FTD
if (IsRouterOrLeader())
{
- Get<MleRouter>().HandleChildUpdateResponse(aMessage, aMessageInfo, keySequence, neighbor);
+ Get<MleRouter>().HandleChildUpdateResponse(rxInfo);
}
else
#endif
{
- HandleChildUpdateResponse(aMessage, aMessageInfo, neighbor);
+ HandleChildUpdateResponse(rxInfo);
}
break;
#if OPENTHREAD_FTD
case kCommandLinkRequest:
- Get<MleRouter>().HandleLinkRequest(aMessage, aMessageInfo, neighbor);
+ Get<MleRouter>().HandleLinkRequest(rxInfo);
break;
case kCommandLinkAccept:
- Get<MleRouter>().HandleLinkAccept(aMessage, aMessageInfo, keySequence, neighbor);
+ Get<MleRouter>().HandleLinkAccept(rxInfo);
break;
case kCommandLinkAcceptAndRequest:
- Get<MleRouter>().HandleLinkAcceptAndRequest(aMessage, aMessageInfo, keySequence, neighbor);
+ Get<MleRouter>().HandleLinkAcceptAndRequest(rxInfo);
break;
case kCommandDataRequest:
- Get<MleRouter>().HandleDataRequest(aMessage, aMessageInfo, neighbor);
+ Get<MleRouter>().HandleDataRequest(rxInfo);
break;
case kCommandParentRequest:
- Get<MleRouter>().HandleParentRequest(aMessage, aMessageInfo);
+ Get<MleRouter>().HandleParentRequest(rxInfo);
break;
case kCommandChildIdRequest:
- Get<MleRouter>().HandleChildIdRequest(aMessage, aMessageInfo, keySequence);
+ Get<MleRouter>().HandleChildIdRequest(rxInfo);
break;
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
case kCommandTimeSync:
- Get<MleRouter>().HandleTimeSync(aMessage, aMessageInfo, neighbor);
+ Get<MleRouter>().HandleTimeSync(rxInfo);
break;
#endif
#endif // OPENTHREAD_FTD
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
case kCommandLinkMetricsManagementRequest:
- HandleLinkMetricsManagementRequest(aMessage, aMessageInfo, neighbor);
+ HandleLinkMetricsManagementRequest(rxInfo);
break;
#endif
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
case kCommandLinkMetricsManagementResponse:
- HandleLinkMetricsManagementResponse(aMessage, aMessageInfo, neighbor);
+ HandleLinkMetricsManagementResponse(rxInfo);
break;
#endif
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
case kCommandLinkProbe:
- HandleLinkProbe(aMessage, aMessageInfo, neighbor);
+ HandleLinkProbe(rxInfo);
break;
#endif
@@ -3048,7 +3053,7 @@
}
}
-void Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor)
+void Mle::HandleAdvertisement(RxInfo &aRxInfo)
{
Error error = kErrorNone;
uint16_t sourceAddress;
@@ -3057,24 +3062,24 @@
uint16_t delay;
// Source Address
- SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aMessage, sourceAddress));
+ SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress));
- Log(kMessageReceive, kTypeAdvertisement, aMessageInfo.GetPeerAddr(), sourceAddress);
+ Log(kMessageReceive, kTypeAdvertisement, aRxInfo.mMessageInfo.GetPeerAddr(), sourceAddress);
// Leader Data
- SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
+ SuccessOrExit(error = ReadLeaderData(aRxInfo.mMessage, leaderData));
if (!IsDetached())
{
#if OPENTHREAD_FTD
if (IsFullThreadDevice())
{
- SuccessOrExit(error = Get<MleRouter>().HandleAdvertisement(aMessage, aMessageInfo, aNeighbor));
+ SuccessOrExit(error = Get<MleRouter>().HandleAdvertisement(aRxInfo));
}
else
#endif
{
- if ((aNeighbor == &mParent) && (mParent.GetRloc16() != sourceAddress))
+ if ((aRxInfo.mNeighbor == &mParent) && (mParent.GetRloc16() != sourceAddress))
{
// Remove stale parent.
IgnoreError(BecomeDetached());
@@ -3089,7 +3094,7 @@
ExitNow();
case kRoleChild:
- VerifyOrExit(aNeighbor == &mParent);
+ VerifyOrExit(aRxInfo.mNeighbor == &mParent);
if ((mParent.GetRloc16() == sourceAddress) && (leaderData.GetPartitionId() != mLeaderData.GetPartitionId() ||
leaderData.GetLeaderRouterId() != GetLeaderId()))
@@ -3101,7 +3106,7 @@
{
RouteTlv route;
- if ((Tlv::FindTlv(aMessage, route) == kErrorNone) && route.IsValid())
+ if ((Tlv::FindTlv(aRxInfo.mMessage, route) == kErrorNone) && route.IsValid())
{
// Overwrite Route Data
IgnoreError(Get<MleRouter>().ProcessRouteTlv(route));
@@ -3117,21 +3122,21 @@
case kRoleRouter:
case kRoleLeader:
- VerifyOrExit(aNeighbor && aNeighbor->IsStateValid());
+ VerifyOrExit(aRxInfo.mNeighbor && aRxInfo.mNeighbor->IsStateValid());
break;
}
if (mRetrieveNewNetworkData || IsNetworkDataNewer(leaderData))
{
delay = Random::NonCrypto::GetUint16InRange(0, kMleMaxResponseDelay);
- IgnoreError(SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs), delay));
+ IgnoreError(SendDataRequest(aRxInfo.mMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs), delay));
}
exit:
LogProcessError(kTypeAdvertisement, error);
}
-void Mle::HandleDataResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, const Neighbor *aNeighbor)
+void Mle::HandleDataResponse(RxInfo &aRxInfo)
{
Error error;
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
@@ -3139,19 +3144,20 @@
uint16_t length;
#endif
- Log(kMessageReceive, kTypeDataResponse, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeDataResponse, aRxInfo.mMessageInfo.GetPeerAddr());
- VerifyOrExit(aNeighbor && aNeighbor->IsStateValid(), error = kErrorDrop);
+ VerifyOrExit(aRxInfo.mNeighbor && aRxInfo.mNeighbor->IsStateValid(), error = kErrorDrop);
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
- if (Tlv::FindTlvValueOffset(aMessage, Tlv::kLinkMetricsReport, metricsReportValueOffset, length) == kErrorNone)
+ if (Tlv::FindTlvValueOffset(aRxInfo.mMessage, Tlv::kLinkMetricsReport, metricsReportValueOffset, length) ==
+ kErrorNone)
{
- Get<LinkMetrics::LinkMetrics>().HandleReport(aMessage, metricsReportValueOffset, length,
- aMessageInfo.GetPeerAddr());
+ Get<LinkMetrics::LinkMetrics>().HandleReport(aRxInfo.mMessage, metricsReportValueOffset, length,
+ aRxInfo.mMessageInfo.GetPeerAddr());
}
#endif
- error = HandleLeaderData(aMessage, aMessageInfo);
+ error = HandleLeaderData(aRxInfo);
if (mDataRequestState == kDataRequestNone && !IsRxOnWhenIdle())
{
@@ -3173,7 +3179,7 @@
Get<NetworkData::Leader>().GetVersion(GetNetworkDataType()));
}
-Error Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
+Error Mle::HandleLeaderData(RxInfo &aRxInfo)
{
Error error = kErrorNone;
LeaderData leaderData;
@@ -3189,7 +3195,7 @@
Tlv tlv;
// Leader Data
- SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
+ SuccessOrExit(error = ReadLeaderData(aRxInfo.mMessage, leaderData));
if ((leaderData.GetPartitionId() != mLeaderData.GetPartitionId()) ||
(leaderData.GetWeighting() != mLeaderData.GetWeighting()) || (leaderData.GetLeaderRouterId() != GetLeaderId()))
@@ -3210,7 +3216,7 @@
}
// Active Timestamp
- switch (Tlv::Find<ActiveTimestampTlv>(aMessage, activeTimestamp))
+ switch (Tlv::Find<ActiveTimestampTlv>(aRxInfo.mMessage, activeTimestamp))
{
case kErrorNone:
hasActiveTimestamp = true;
@@ -3220,7 +3226,7 @@
// if received timestamp does not match the local value and message does not contain the dataset,
// send MLE Data Request
if (!IsLeader() && (MeshCoP::Timestamp::Compare(&activeTimestamp, timestamp) != 0) &&
- (Tlv::FindTlvOffset(aMessage, Tlv::kActiveDataset, activeDatasetOffset) != kErrorNone))
+ (Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kActiveDataset, activeDatasetOffset) != kErrorNone))
{
ExitNow(dataRequest = true);
}
@@ -3235,7 +3241,7 @@
}
// Pending Timestamp
- switch (Tlv::Find<PendingTimestampTlv>(aMessage, pendingTimestamp))
+ switch (Tlv::Find<PendingTimestampTlv>(aRxInfo.mMessage, pendingTimestamp))
{
case kErrorNone:
hasPendingTimestamp = true;
@@ -3245,7 +3251,7 @@
// if received timestamp does not match the local value and message does not contain the dataset,
// send MLE Data Request
if (!IsLeader() && (MeshCoP::Timestamp::Compare(&pendingTimestamp, timestamp) != 0) &&
- (Tlv::FindTlvOffset(aMessage, Tlv::kPendingDataset, pendingDatasetOffset) != kErrorNone))
+ (Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kPendingDataset, pendingDatasetOffset) != kErrorNone))
{
ExitNow(dataRequest = true);
}
@@ -3259,11 +3265,11 @@
ExitNow(error = kErrorParse);
}
- if (Tlv::FindTlvOffset(aMessage, Tlv::kNetworkData, networkDataOffset) == kErrorNone)
+ if (Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kNetworkData, networkDataOffset) == kErrorNone)
{
error = Get<NetworkData::Leader>().SetNetworkData(leaderData.GetDataVersion(NetworkData::kFullSet),
leaderData.GetDataVersion(NetworkData::kStableSubset),
- GetNetworkDataType(), aMessage, networkDataOffset);
+ GetNetworkDataType(), aRxInfo.mMessage, networkDataOffset);
SuccessOrExit(error);
}
else
@@ -3284,8 +3290,8 @@
{
if (activeDatasetOffset > 0)
{
- IgnoreError(aMessage.Read(activeDatasetOffset, tlv));
- IgnoreError(Get<MeshCoP::ActiveDataset>().Save(activeTimestamp, aMessage,
+ IgnoreError(aRxInfo.mMessage.Read(activeDatasetOffset, tlv));
+ IgnoreError(Get<MeshCoP::ActiveDataset>().Save(activeTimestamp, aRxInfo.mMessage,
activeDatasetOffset + sizeof(tlv), tlv.GetLength()));
}
}
@@ -3295,8 +3301,8 @@
{
if (pendingDatasetOffset > 0)
{
- IgnoreError(aMessage.Read(pendingDatasetOffset, tlv));
- IgnoreError(Get<MeshCoP::PendingDataset>().Save(pendingTimestamp, aMessage,
+ IgnoreError(aRxInfo.mMessage.Read(pendingDatasetOffset, tlv));
+ IgnoreError(Get<MeshCoP::PendingDataset>().Save(pendingTimestamp, aRxInfo.mMessage,
pendingDatasetOffset + sizeof(tlv), tlv.GetLength()));
}
}
@@ -3311,7 +3317,7 @@
static const uint8_t tlvs[] = {Tlv::kNetworkData};
uint16_t delay;
- if (aMessageInfo.GetSockAddr().IsMulticast())
+ if (aRxInfo.mMessageInfo.GetSockAddr().IsMulticast())
{
delay = Random::NonCrypto::GetUint16InRange(0, kMleMaxResponseDelay);
}
@@ -3323,7 +3329,7 @@
delay = 10;
}
- IgnoreError(SendDataRequest(aMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs), delay));
+ IgnoreError(SendDataRequest(aRxInfo.mMessageInfo.GetPeerAddr(), tlvs, sizeof(tlvs), delay));
}
else if (error == kErrorNone)
{
@@ -3432,10 +3438,10 @@
return rval;
}
-void Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, uint32_t aKeySequence)
+void Mle::HandleParentResponse(RxInfo &aRxInfo)
{
Error error = kErrorNone;
- const ThreadLinkInfo *linkInfo = aMessageInfo.GetThreadLinkInfo();
+ const ThreadLinkInfo *linkInfo = aRxInfo.mMessageInfo.GetThreadLinkInfo();
Challenge response;
uint16_t version;
uint16_t sourceAddress;
@@ -3455,19 +3461,19 @@
#endif
// Source Address
- SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aMessage, sourceAddress));
+ SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress));
- Log(kMessageReceive, kTypeParentResponse, aMessageInfo.GetPeerAddr(), sourceAddress);
+ Log(kMessageReceive, kTypeParentResponse, aRxInfo.mMessageInfo.GetPeerAddr(), sourceAddress);
// Version
- SuccessOrExit(error = Tlv::Find<VersionTlv>(aMessage, version));
+ SuccessOrExit(error = Tlv::Find<VersionTlv>(aRxInfo.mMessage, version));
VerifyOrExit(version >= OT_THREAD_VERSION_1_1, error = kErrorParse);
// Response
- SuccessOrExit(error = ReadResponse(aMessage, response));
+ SuccessOrExit(error = ReadResponse(aRxInfo.mMessage, response));
VerifyOrExit(response == mParentRequestChallenge, error = kErrorParse);
- aMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddress);
+ aRxInfo.mMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddress);
if (IsChild() && mParent.GetExtAddress() == extAddress)
{
@@ -3475,10 +3481,10 @@
}
// Leader Data
- SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
+ SuccessOrExit(error = ReadLeaderData(aRxInfo.mMessage, leaderData));
// Link Margin
- SuccessOrExit(error = Tlv::Find<LinkMarginTlv>(aMessage, linkMarginFromTlv));
+ SuccessOrExit(error = Tlv::Find<LinkMarginTlv>(aRxInfo.mMessage, linkMarginFromTlv));
linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(Get<Mac::Mac>().GetNoiseFloor(), linkInfo->GetRss());
@@ -3490,12 +3496,12 @@
linkQuality = LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMargin);
// Connectivity
- SuccessOrExit(error = Tlv::FindTlv(aMessage, connectivity));
+ SuccessOrExit(error = Tlv::FindTlv(aRxInfo.mMessage, connectivity));
VerifyOrExit(connectivity.IsValid(), error = kErrorParse);
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
// CSL Accuracy
- if (Tlv::FindTlv(aMessage, clockAccuracy) != kErrorNone)
+ if (Tlv::FindTlv(aRxInfo.mMessage, clockAccuracy) != kErrorNone)
{
clockAccuracy.SetCslClockAccuracy(kCslWorstCrystalPpm);
clockAccuracy.SetCslUncertainty(kCslWorstUncertainty);
@@ -3585,12 +3591,12 @@
}
// Link/MLE Frame Counters
- SuccessOrExit(error = ReadFrameCounters(aMessage, linkFrameCounter, mleFrameCounter));
+ SuccessOrExit(error = ReadFrameCounters(aRxInfo.mMessage, linkFrameCounter, mleFrameCounter));
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
// Time Parameter
- if (Tlv::FindTlv(aMessage, timeParameter) == kErrorNone)
+ if (Tlv::FindTlv(aRxInfo.mMessage, timeParameter) == kErrorNone)
{
VerifyOrExit(timeParameter.IsValid());
@@ -3609,7 +3615,7 @@
#endif // OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
// Challenge
- SuccessOrExit(error = ReadChallenge(aMessage, mParentCandidateChallenge));
+ SuccessOrExit(error = ReadChallenge(aRxInfo.mMessage, mParentCandidateChallenge));
mParentCandidate.SetExtAddress(extAddress);
mParentCandidate.SetRloc16(sourceAddress);
@@ -3624,7 +3630,7 @@
mParentCandidate.ResetLinkFailures();
mParentCandidate.SetLinkQualityOut(LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMarginFromTlv));
mParentCandidate.SetState(Neighbor::kStateParentResponse);
- mParentCandidate.SetKeySequence(aKeySequence);
+ mParentCandidate.SetKeySequence(aRxInfo.mKeySequence);
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
mParentCandidate.SetCslClockAccuracy(clockAccuracy.GetCslClockAccuracy());
mParentCandidate.SetCslClockUncertainty(clockAccuracy.GetCslUncertainty());
@@ -3645,9 +3651,7 @@
LogProcessError(kTypeParentResponse, error);
}
-void Mle::HandleChildIdResponse(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- const Neighbor * aNeighbor)
+void Mle::HandleChildIdResponse(RxInfo &aRxInfo)
{
Error error = kErrorNone;
LeaderData leaderData;
@@ -3659,35 +3663,35 @@
uint16_t offset;
// Source Address
- SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aMessage, sourceAddress));
+ SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress));
- Log(kMessageReceive, kTypeChildIdResponse, aMessageInfo.GetPeerAddr(), sourceAddress);
+ Log(kMessageReceive, kTypeChildIdResponse, aRxInfo.mMessageInfo.GetPeerAddr(), sourceAddress);
- VerifyOrExit(aNeighbor && aNeighbor->IsStateValid(), error = kErrorSecurity);
+ VerifyOrExit(aRxInfo.mNeighbor && aRxInfo.mNeighbor->IsStateValid(), error = kErrorSecurity);
VerifyOrExit(mAttachState == kAttachStateChildIdRequest);
// ShortAddress
- SuccessOrExit(error = Tlv::Find<Address16Tlv>(aMessage, shortAddress));
+ SuccessOrExit(error = Tlv::Find<Address16Tlv>(aRxInfo.mMessage, shortAddress));
VerifyOrExit(RouterIdMatch(sourceAddress, shortAddress), error = kErrorRejected);
// Leader Data
- SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
+ SuccessOrExit(error = ReadLeaderData(aRxInfo.mMessage, leaderData));
// Network Data
- error = Tlv::FindTlvOffset(aMessage, Tlv::kNetworkData, networkDataOffset);
+ error = Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kNetworkData, networkDataOffset);
SuccessOrExit(error);
// Active Timestamp
- switch (Tlv::Find<ActiveTimestampTlv>(aMessage, timestamp))
+ switch (Tlv::Find<ActiveTimestampTlv>(aRxInfo.mMessage, timestamp))
{
case kErrorNone:
// Active Dataset
- if (Tlv::FindTlvOffset(aMessage, Tlv::kActiveDataset, offset) == kErrorNone)
+ if (Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kActiveDataset, offset) == kErrorNone)
{
- IgnoreError(aMessage.Read(offset, tlv));
- SuccessOrExit(
- error = Get<MeshCoP::ActiveDataset>().Save(timestamp, aMessage, offset + sizeof(tlv), tlv.GetLength()));
+ IgnoreError(aRxInfo.mMessage.Read(offset, tlv));
+ SuccessOrExit(error = Get<MeshCoP::ActiveDataset>().Save(timestamp, aRxInfo.mMessage, offset + sizeof(tlv),
+ tlv.GetLength()));
}
break;
@@ -3705,15 +3709,15 @@
}
// Pending Timestamp
- switch (Tlv::Find<PendingTimestampTlv>(aMessage, timestamp))
+ switch (Tlv::Find<PendingTimestampTlv>(aRxInfo.mMessage, timestamp))
{
case kErrorNone:
// Pending Dataset
- if (Tlv::FindTlvOffset(aMessage, Tlv::kPendingDataset, offset) == kErrorNone)
+ if (Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kPendingDataset, offset) == kErrorNone)
{
- IgnoreError(aMessage.Read(offset, tlv));
- IgnoreError(
- Get<MeshCoP::PendingDataset>().Save(timestamp, aMessage, offset + sizeof(tlv), tlv.GetLength()));
+ IgnoreError(aRxInfo.mMessage.Read(offset, tlv));
+ IgnoreError(Get<MeshCoP::PendingDataset>().Save(timestamp, aRxInfo.mMessage, offset + sizeof(tlv),
+ tlv.GetLength()));
}
break;
@@ -3727,9 +3731,9 @@
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
// Sync to Thread network time
- if (aMessage.GetTimeSyncSeq() != OT_TIME_SYNC_INVALID_SEQ)
+ if (aRxInfo.mMessage.GetTimeSyncSeq() != OT_TIME_SYNC_INVALID_SEQ)
{
- Get<TimeSync>().HandleTimeSyncMessage(aMessage);
+ Get<TimeSync>().HandleTimeSyncMessage(aRxInfo.mMessage);
}
#endif
@@ -3744,7 +3748,7 @@
{
RouteTlv route;
- if (Tlv::FindTlv(aMessage, route) == kErrorNone)
+ if (Tlv::FindTlv(aRxInfo.mMessage, route) == kErrorNone)
{
SuccessOrExit(error = Get<MleRouter>().ProcessRouteTlv(route));
}
@@ -3763,7 +3767,7 @@
IgnoreError(Get<NetworkData::Leader>().SetNetworkData(leaderData.GetDataVersion(NetworkData::kFullSet),
leaderData.GetDataVersion(NetworkData::kStableSubset),
- GetNetworkDataType(), aMessage, networkDataOffset));
+ GetNetworkDataType(), aRxInfo.mMessage, networkDataOffset));
SetStateChild(shortAddress);
@@ -3781,7 +3785,7 @@
LogProcessError(kTypeChildIdResponse, error);
}
-void Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor)
+void Mle::HandleChildUpdateRequest(RxInfo &aRxInfo)
{
static const uint8_t kMaxResponseTlvs = 6;
@@ -3793,12 +3797,12 @@
uint8_t numTlvs = 0;
// Source Address
- SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aMessage, sourceAddress));
+ SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress));
- Log(kMessageReceive, kTypeChildUpdateRequestOfParent, aMessageInfo.GetPeerAddr(), sourceAddress);
+ Log(kMessageReceive, kTypeChildUpdateRequestOfParent, aRxInfo.mMessageInfo.GetPeerAddr(), sourceAddress);
// Challenge
- switch (ReadChallenge(aMessage, challenge))
+ switch (ReadChallenge(aRxInfo.mMessage, challenge))
{
case kErrorNone:
tlvs[numTlvs++] = Tlv::kResponse;
@@ -3812,11 +3816,11 @@
ExitNow(error = kErrorParse);
}
- if (aNeighbor == &mParent)
+ if (aRxInfo.mNeighbor == &mParent)
{
uint8_t status;
- switch (Tlv::Find<StatusTlv>(aMessage, status))
+ switch (Tlv::Find<StatusTlv>(aRxInfo.mMessage, status))
{
case kErrorNone:
VerifyOrExit(status != StatusTlv::kError, IgnoreError(BecomeDetached()));
@@ -3834,11 +3838,11 @@
}
// Leader Data, Network Data, Active Timestamp, Pending Timestamp
- SuccessOrExit(error = HandleLeaderData(aMessage, aMessageInfo));
+ SuccessOrExit(error = HandleLeaderData(aRxInfo));
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
CslClockAccuracyTlv cslClockAccuracyTlv;
- if (Tlv::FindTlv(aMessage, cslClockAccuracyTlv) == kErrorNone)
+ if (Tlv::FindTlv(aRxInfo.mMessage, cslClockAccuracyTlv) == kErrorNone)
{
// MUST include CSL timeout TLV when request includes CSL accuracy
tlvs[numTlvs++] = Tlv::kCslTimeout;
@@ -3852,7 +3856,7 @@
}
// TLV Request
- switch (FindTlvRequest(aMessage, requestedTlvs))
+ switch (FindTlvRequest(aRxInfo.mMessage, requestedTlvs))
{
case kErrorNone:
for (uint8_t i = 0; i < requestedTlvs.mNumTlvs; i++)
@@ -3873,9 +3877,9 @@
}
#if OPENTHREAD_CONFIG_MULTI_RADIO
- if ((aNeighbor != nullptr) && (challenge.mLength != 0))
+ if ((aRxInfo.mNeighbor != nullptr) && (challenge.mLength != 0))
{
- aNeighbor->ClearLastRxFragmentTag();
+ aRxInfo.mNeighbor->ClearLastRxFragmentTag();
}
#endif
@@ -3885,9 +3889,7 @@
LogProcessError(kTypeChildUpdateRequestOfParent, error);
}
-void Mle::HandleChildUpdateResponse(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- const Neighbor * aNeighbor)
+void Mle::HandleChildUpdateResponse(RxInfo &aRxInfo)
{
Error error = kErrorNone;
uint8_t status;
@@ -3901,17 +3903,17 @@
CslClockAccuracyTlv clockAccuracy;
#endif
- Log(kMessageReceive, kTypeChildUpdateResponseOfParent, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeChildUpdateResponseOfParent, aRxInfo.mMessageInfo.GetPeerAddr());
switch (mRole)
{
case kRoleDetached:
- SuccessOrExit(error = ReadResponse(aMessage, response));
+ SuccessOrExit(error = ReadResponse(aRxInfo.mMessage, response));
VerifyOrExit(response == mParentRequestChallenge, error = kErrorSecurity);
break;
case kRoleChild:
- VerifyOrExit((aNeighbor == &mParent) && mParent.IsStateValid(), error = kErrorSecurity);
+ VerifyOrExit((aRxInfo.mNeighbor == &mParent) && mParent.IsStateValid(), error = kErrorSecurity);
break;
default:
@@ -3920,20 +3922,20 @@
}
// Status
- if (Tlv::Find<StatusTlv>(aMessage, status) == kErrorNone)
+ if (Tlv::Find<StatusTlv>(aRxInfo.mMessage, status) == kErrorNone)
{
IgnoreError(BecomeDetached());
ExitNow();
}
// Mode
- SuccessOrExit(error = Tlv::Find<ModeTlv>(aMessage, mode));
+ SuccessOrExit(error = Tlv::Find<ModeTlv>(aRxInfo.mMessage, mode));
VerifyOrExit(DeviceMode(mode) == mDeviceMode, error = kErrorDrop);
switch (mRole)
{
case kRoleDetached:
- SuccessOrExit(error = ReadFrameCounters(aMessage, linkFrameCounter, mleFrameCounter));
+ SuccessOrExit(error = ReadFrameCounters(aRxInfo.mMessage, linkFrameCounter, mleFrameCounter));
mParent.GetLinkFrameCounters().SetAll(linkFrameCounter);
mParent.SetLinkAckFrameCounter(linkFrameCounter);
@@ -3948,7 +3950,7 @@
case kRoleChild:
// Source Address
- SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aMessage, sourceAddress));
+ SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress));
if (RouterIdFromRloc16(sourceAddress) != RouterIdFromRloc16(GetRloc16()))
{
@@ -3957,10 +3959,10 @@
}
// Leader Data, Network Data, Active Timestamp, Pending Timestamp
- SuccessOrExit(error = HandleLeaderData(aMessage, aMessageInfo));
+ SuccessOrExit(error = HandleLeaderData(aRxInfo));
// Timeout optional
- switch (Tlv::Find<TimeoutTlv>(aMessage, timeout))
+ switch (Tlv::Find<TimeoutTlv>(aRxInfo.mMessage, timeout))
{
case kErrorNone:
mTimeout = timeout;
@@ -3973,7 +3975,7 @@
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
// CSL Accuracy
- if (Tlv::FindTlv(aMessage, clockAccuracy) != kErrorNone)
+ if (Tlv::FindTlv(aRxInfo.mMessage, clockAccuracy) != kErrorNone)
{
Get<Mac::Mac>().SetCslParentClockAccuracy(clockAccuracy.GetCslClockAccuracy());
Get<Mac::Mac>().SetCslParentUncertainty(clockAccuracy.GetCslUncertainty());
@@ -4012,7 +4014,7 @@
LogProcessError(kTypeChildUpdateResponseOfParent, error);
}
-void Mle::HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
+void Mle::HandleAnnounce(RxInfo &aRxInfo)
{
Error error = kErrorNone;
ChannelTlv channelTlv;
@@ -4021,15 +4023,15 @@
uint8_t channel;
uint16_t panId;
- Log(kMessageReceive, kTypeAnnounce, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeAnnounce, aRxInfo.mMessageInfo.GetPeerAddr());
- SuccessOrExit(error = Tlv::FindTlv(aMessage, channelTlv));
+ SuccessOrExit(error = Tlv::FindTlv(aRxInfo.mMessage, channelTlv));
VerifyOrExit(channelTlv.IsValid(), error = kErrorParse);
channel = static_cast<uint8_t>(channelTlv.GetChannel());
- SuccessOrExit(error = Tlv::Find<ActiveTimestampTlv>(aMessage, timestamp));
- SuccessOrExit(error = Tlv::Find<PanIdTlv>(aMessage, panId));
+ SuccessOrExit(error = Tlv::Find<ActiveTimestampTlv>(aRxInfo.mMessage, timestamp));
+ SuccessOrExit(error = Tlv::Find<PanIdTlv>(aRxInfo.mMessage, panId));
localTimestamp = Get<MeshCoP::ActiveDataset>().GetTimestamp();
@@ -4061,7 +4063,7 @@
SendAnnounce(channel);
#if OPENTHREAD_CONFIG_MLE_SEND_UNICAST_ANNOUNCE_RESPONSE
- SendAnnounce(channel, aMessageInfo.GetPeerAddr());
+ SendAnnounce(channel, aRxInfo.mMessageInfo.GetPeerAddr());
#endif
}
else
@@ -4081,19 +4083,18 @@
}
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
-void Mle::HandleLinkMetricsManagementRequest(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- Neighbor * aNeighbor)
+void Mle::HandleLinkMetricsManagementRequest(RxInfo &aRxInfo)
{
Error error = kErrorNone;
LinkMetrics::Status status;
- Log(kMessageReceive, kTypeLinkMetricsManagementRequest, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeLinkMetricsManagementRequest, aRxInfo.mMessageInfo.GetPeerAddr());
- VerifyOrExit(aNeighbor != nullptr, error = kErrorInvalidState);
+ VerifyOrExit(aRxInfo.mNeighbor != nullptr, error = kErrorInvalidState);
- SuccessOrExit(error = Get<LinkMetrics::LinkMetrics>().HandleManagementRequest(aMessage, *aNeighbor, status));
- error = SendLinkMetricsManagementResponse(aMessageInfo.GetPeerAddr(), status);
+ SuccessOrExit(
+ error = Get<LinkMetrics::LinkMetrics>().HandleManagementRequest(aRxInfo.mMessage, *aRxInfo.mNeighbor, status));
+ error = SendLinkMetricsManagementResponse(aRxInfo.mMessageInfo.GetPeerAddr(), status);
exit:
LogProcessError(kTypeLinkMetricsManagementRequest, error);
@@ -4102,17 +4103,16 @@
#endif // OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
-void Mle::HandleLinkMetricsManagementResponse(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- Neighbor * aNeighbor)
+void Mle::HandleLinkMetricsManagementResponse(RxInfo &aRxInfo)
{
Error error = kErrorNone;
- Log(kMessageReceive, kTypeLinkMetricsManagementResponse, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeLinkMetricsManagementResponse, aRxInfo.mMessageInfo.GetPeerAddr());
- VerifyOrExit(aNeighbor != nullptr, error = kErrorInvalidState);
+ VerifyOrExit(aRxInfo.mNeighbor != nullptr, error = kErrorInvalidState);
- error = Get<LinkMetrics::LinkMetrics>().HandleManagementResponse(aMessage, aMessageInfo.GetPeerAddr());
+ error =
+ Get<LinkMetrics::LinkMetrics>().HandleManagementResponse(aRxInfo.mMessage, aRxInfo.mMessageInfo.GetPeerAddr());
exit:
LogProcessError(kTypeLinkMetricsManagementResponse, error);
@@ -4120,16 +4120,16 @@
#endif // OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
-void Mle::HandleLinkProbe(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor)
+void Mle::HandleLinkProbe(RxInfo &aRxInfo)
{
Error error = kErrorNone;
uint8_t seriesId;
- Log(kMessageReceive, kTypeLinkProbe, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeLinkProbe, aRxInfo.mMessageInfo.GetPeerAddr());
- SuccessOrExit(error = Get<LinkMetrics::LinkMetrics>().HandleLinkProbe(aMessage, seriesId));
- aNeighbor->AggregateLinkMetrics(seriesId, LinkMetrics::SeriesInfo::kSeriesTypeLinkProbe, aMessage.GetAverageLqi(),
- aMessage.GetAverageRss());
+ SuccessOrExit(error = Get<LinkMetrics::LinkMetrics>().HandleLinkProbe(aRxInfo.mMessage, seriesId));
+ aRxInfo.mNeighbor->AggregateLinkMetrics(seriesId, LinkMetrics::SeriesInfo::kSeriesTypeLinkProbe,
+ aRxInfo.mMessage.GetAverageLqi(), aRxInfo.mMessage.GetAverageRss());
exit:
LogProcessError(kTypeLinkProbe, error);
diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp
index 417f2d4..be2a1a2 100644
--- a/src/core/thread/mle.hpp
+++ b/src/core/thread/mle.hpp
@@ -944,6 +944,36 @@
};
/**
+ * This structure represents a received MLE message containing additional information about the message (e.g.
+ * key sequence, neighbor from which it was received).
+ *
+ */
+ struct RxInfo
+ {
+ /**
+ * This constructor initializes the `RxInfo`
+ *
+ * @param[in] aMessage The received MLE message.
+ * @param[in] aMessageInfo The `Ip6::MessageInfo` associated with message.
+ *
+ */
+ RxInfo(Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
+ : mMessage(aMessage)
+ , mMessageInfo(aMessageInfo)
+ , mFrameCounter(0)
+ , mKeySequence(0)
+ , mNeighbor(nullptr)
+ {
+ }
+
+ Message & mMessage; ///< The MLE message.
+ const Ip6::MessageInfo &mMessageInfo; ///< The `MessageInfo` associated with the message.
+ uint32_t mFrameCounter; ///< The frame counter from aux security header.
+ uint32_t mKeySequence; ///< The key sequence from the aux security header.
+ Neighbor * mNeighbor; ///< Neighbor from which message was received (can be `nullptr`).
+ };
+
+ /**
* This method allocates a new message buffer for preparing an MLE message.
*
* @returns A pointer to the message or `nullptr` if insufficient message buffers are available.
@@ -1753,31 +1783,23 @@
void ScheduleMessageTransmissionTimer(void);
Error ReadChallengeOrResponse(const Message &aMessage, uint8_t aTlvType, Challenge &aBuffer);
- void HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor);
- void HandleChildIdResponse(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- const Neighbor * aNeighbor);
- void HandleChildUpdateRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor);
- void HandleChildUpdateResponse(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- const Neighbor * aNeighbor);
- void HandleDataResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, const Neighbor *aNeighbor);
- void HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, uint32_t aKeySequence);
- void HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
+ void HandleAdvertisement(RxInfo &aRxInfo);
+ void HandleChildIdResponse(RxInfo &aRxInfo);
+ void HandleChildUpdateRequest(RxInfo &aRxInfo);
+ void HandleChildUpdateResponse(RxInfo &aRxInfo);
+ void HandleDataResponse(RxInfo &aRxInfo);
+ void HandleParentResponse(RxInfo &aRxInfo);
+ void HandleAnnounce(RxInfo &aRxInfo);
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
- void HandleLinkMetricsManagementRequest(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- Neighbor * aNeighbor);
+ void HandleLinkMetricsManagementRequest(RxInfo &aRxInfo);
#endif
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE
- void HandleLinkMetricsManagementResponse(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- Neighbor * aNeighbor);
+ void HandleLinkMetricsManagementResponse(RxInfo &aRxInfo);
#endif
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
- void HandleLinkProbe(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor);
+ void HandleLinkProbe(RxInfo &aRxInfo);
#endif
- Error HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
+ Error HandleLeaderData(RxInfo &aRxInfo);
void ProcessAnnounce(void);
bool HasUnregisteredAddress(void);
diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp
index da8703f..28c63dc 100644
--- a/src/core/thread/mle_router.cpp
+++ b/src/core/thread/mle_router.cpp
@@ -612,7 +612,7 @@
return error;
}
-void MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor)
+void MleRouter::HandleLinkRequest(RxInfo &aRxInfo)
{
Error error = kErrorNone;
Neighbor * neighbor = nullptr;
@@ -622,21 +622,21 @@
uint16_t sourceAddress;
RequestedTlvs requestedTlvs;
- Log(kMessageReceive, kTypeLinkRequest, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeLinkRequest, aRxInfo.mMessageInfo.GetPeerAddr());
VerifyOrExit(IsRouterOrLeader(), error = kErrorInvalidState);
VerifyOrExit(!IsAttaching(), error = kErrorInvalidState);
// Challenge
- SuccessOrExit(error = ReadChallenge(aMessage, challenge));
+ SuccessOrExit(error = ReadChallenge(aRxInfo.mMessage, challenge));
// Version
- SuccessOrExit(error = Tlv::Find<VersionTlv>(aMessage, version));
+ SuccessOrExit(error = Tlv::Find<VersionTlv>(aRxInfo.mMessage, version));
VerifyOrExit(version >= OT_THREAD_VERSION_1_1, error = kErrorParse);
// Leader Data
- switch (ReadLeaderData(aMessage, leaderData))
+ switch (ReadLeaderData(aRxInfo.mMessage, leaderData))
{
case kErrorNone:
VerifyOrExit(leaderData.GetPartitionId() == mLeaderData.GetPartitionId(), error = kErrorInvalidState);
@@ -648,14 +648,14 @@
}
// Source Address
- switch (Tlv::Find<SourceAddressTlv>(aMessage, sourceAddress))
+ switch (Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress))
{
case kErrorNone:
if (IsActiveRouter(sourceAddress))
{
Mac::ExtAddress extAddr;
- aMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
+ aRxInfo.mMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
neighbor = mRouterTable.GetRouter(RouterIdFromRloc16(sourceAddress));
VerifyOrExit(neighbor != nullptr, error = kErrorParse);
@@ -665,7 +665,7 @@
{
neighbor->SetExtAddress(extAddr);
neighbor->GetLinkInfo().Clear();
- neighbor->GetLinkInfo().AddRss(aMessageInfo.GetThreadLinkInfo()->GetRss());
+ neighbor->GetLinkInfo().AddRss(aRxInfo.mMessageInfo.GetThreadLinkInfo()->GetRss());
neighbor->ResetLinkFailures();
neighbor->SetLastHeard(TimerMilli::GetNow());
neighbor->SetState(Neighbor::kStateLinkRequest);
@@ -680,9 +680,10 @@
case kErrorNotFound:
// lack of source address indicates router coming out of reset
- VerifyOrExit(aNeighbor && aNeighbor->IsStateValid() && IsActiveRouter(aNeighbor->GetRloc16()),
+ VerifyOrExit(aRxInfo.mNeighbor && aRxInfo.mNeighbor->IsStateValid() &&
+ IsActiveRouter(aRxInfo.mNeighbor->GetRloc16()),
error = kErrorDrop);
- neighbor = aNeighbor;
+ neighbor = aRxInfo.mNeighbor;
break;
default:
@@ -690,7 +691,7 @@
}
// TLV Request
- switch (FindTlvRequest(aMessage, requestedTlvs))
+ switch (FindTlvRequest(aRxInfo.mMessage, requestedTlvs))
{
case kErrorNone:
break;
@@ -704,7 +705,7 @@
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
if (neighbor != nullptr)
{
- neighbor->SetTimeSyncEnabled(Tlv::Find<TimeRequestTlv>(aMessage, nullptr, 0) == kErrorNone);
+ neighbor->SetTimeSyncEnabled(Tlv::Find<TimeRequestTlv>(aRxInfo.mMessage, nullptr, 0) == kErrorNone);
}
#endif
@@ -715,7 +716,7 @@
}
#endif
- SuccessOrExit(error = SendLinkAccept(aMessageInfo, neighbor, requestedTlvs, challenge));
+ SuccessOrExit(error = SendLinkAccept(aRxInfo.mMessageInfo, neighbor, requestedTlvs, challenge));
exit:
LogProcessError(kTypeLinkRequest, error);
@@ -810,31 +811,21 @@
return error;
}
-void MleRouter::HandleLinkAccept(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- uint32_t aKeySequence,
- Neighbor * aNeighbor)
+void MleRouter::HandleLinkAccept(RxInfo &aRxInfo)
{
- Error error = HandleLinkAccept(aMessage, aMessageInfo, aKeySequence, aNeighbor, false);
+ Error error = HandleLinkAccept(aRxInfo, false);
LogProcessError(kTypeLinkAccept, error);
}
-void MleRouter::HandleLinkAcceptAndRequest(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- uint32_t aKeySequence,
- Neighbor * aNeighbor)
+void MleRouter::HandleLinkAcceptAndRequest(RxInfo &aRxInfo)
{
- Error error = HandleLinkAccept(aMessage, aMessageInfo, aKeySequence, aNeighbor, true);
+ Error error = HandleLinkAccept(aRxInfo, true);
LogProcessError(kTypeLinkAcceptAndRequest, error);
}
-Error MleRouter::HandleLinkAccept(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- uint32_t aKeySequence,
- Neighbor * aNeighbor,
- bool aRequest)
+Error MleRouter::HandleLinkAccept(RxInfo &aRxInfo, bool aRequest)
{
static const uint8_t dataRequestTlvs[] = {Tlv::kNetworkData};
@@ -854,9 +845,9 @@
uint8_t linkMargin;
// Source Address
- SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aMessage, sourceAddress));
+ SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress));
- Log(kMessageReceive, aRequest ? kTypeLinkAcceptAndRequest : kTypeLinkAccept, aMessageInfo.GetPeerAddr(),
+ Log(kMessageReceive, aRequest ? kTypeLinkAcceptAndRequest : kTypeLinkAccept, aRxInfo.mMessageInfo.GetPeerAddr(),
sourceAddress);
VerifyOrExit(IsActiveRouter(sourceAddress), error = kErrorParse);
@@ -866,7 +857,7 @@
neighborState = (router != nullptr) ? router->GetState() : Neighbor::kStateInvalid;
// Response
- SuccessOrExit(error = ReadResponse(aMessage, response));
+ SuccessOrExit(error = ReadResponse(aRxInfo.mMessage, response));
// verify response
switch (neighborState)
@@ -888,20 +879,20 @@
}
// Remove stale neighbors
- if (aNeighbor && aNeighbor->GetRloc16() != sourceAddress)
+ if (aRxInfo.mNeighbor && aRxInfo.mNeighbor->GetRloc16() != sourceAddress)
{
- RemoveNeighbor(*aNeighbor);
+ RemoveNeighbor(*aRxInfo.mNeighbor);
}
// Version
- SuccessOrExit(error = Tlv::Find<VersionTlv>(aMessage, version));
+ SuccessOrExit(error = Tlv::Find<VersionTlv>(aRxInfo.mMessage, version));
VerifyOrExit(version >= OT_THREAD_VERSION_1_1, error = kErrorParse);
// Link and MLE Frame Counters
- SuccessOrExit(error = ReadFrameCounters(aMessage, linkFrameCounter, mleFrameCounter));
+ SuccessOrExit(error = ReadFrameCounters(aRxInfo.mMessage, linkFrameCounter, mleFrameCounter));
// Link Margin
- switch (Tlv::Find<LinkMarginTlv>(aMessage, linkMargin))
+ switch (Tlv::Find<LinkMarginTlv>(aRxInfo.mMessage, linkMargin))
{
case kErrorNone:
break;
@@ -923,15 +914,15 @@
case kRoleDetached:
// Address16
- SuccessOrExit(error = Tlv::Find<Address16Tlv>(aMessage, address16));
+ SuccessOrExit(error = Tlv::Find<Address16Tlv>(aRxInfo.mMessage, address16));
VerifyOrExit(GetRloc16() == address16, error = kErrorDrop);
// Leader Data
- SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
+ SuccessOrExit(error = ReadLeaderData(aRxInfo.mMessage, leaderData));
SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId());
// Route
- SuccessOrExit(error = Tlv::FindTlv(aMessage, Tlv::kRoute, sizeof(route), route));
+ SuccessOrExit(error = Tlv::FindTlv(aRxInfo.mMessage, Tlv::kRoute, sizeof(route), route));
VerifyOrExit(route.IsValid(), error = kErrorParse);
mRouterTable.Clear();
SuccessOrExit(error = ProcessRouteTlv(route));
@@ -948,10 +939,10 @@
}
mRetrieveNewNetworkData = true;
- IgnoreError(SendDataRequest(aMessageInfo.GetPeerAddr(), dataRequestTlvs, sizeof(dataRequestTlvs), 0));
+ IgnoreError(SendDataRequest(aRxInfo.mMessageInfo.GetPeerAddr(), dataRequestTlvs, sizeof(dataRequestTlvs), 0));
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
- Get<TimeSync>().HandleTimeSyncMessage(aMessage);
+ Get<TimeSync>().HandleTimeSyncMessage(aRxInfo.mMessage);
#endif
break;
@@ -964,18 +955,19 @@
VerifyOrExit(router != nullptr);
// Leader Data
- SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
+ SuccessOrExit(error = ReadLeaderData(aRxInfo.mMessage, leaderData));
VerifyOrExit(leaderData.GetPartitionId() == mLeaderData.GetPartitionId());
if (mRetrieveNewNetworkData ||
SerialNumber::IsGreater(leaderData.GetDataVersion(NetworkData::kFullSet),
Get<NetworkData::Leader>().GetVersion(NetworkData::kFullSet)))
{
- IgnoreError(SendDataRequest(aMessageInfo.GetPeerAddr(), dataRequestTlvs, sizeof(dataRequestTlvs), 0));
+ IgnoreError(
+ SendDataRequest(aRxInfo.mMessageInfo.GetPeerAddr(), dataRequestTlvs, sizeof(dataRequestTlvs), 0));
}
// Route (optional)
- if (Tlv::FindTlv(aMessage, route) == kErrorNone)
+ if (Tlv::FindTlv(aRxInfo.mMessage, route) == kErrorNone)
{
VerifyOrExit(route.IsValid(), error = kErrorParse);
SuccessOrExit(error = ProcessRouteTlv(route));
@@ -995,7 +987,7 @@
}
// finish link synchronization
- aMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
+ aRxInfo.mMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
router->SetExtAddress(extAddr);
router->SetRloc16(sourceAddress);
router->GetLinkFrameCounters().SetAll(linkFrameCounter);
@@ -1006,11 +998,11 @@
router->SetDeviceMode(DeviceMode(DeviceMode::kModeFullThreadDevice | DeviceMode::kModeRxOnWhenIdle |
DeviceMode::kModeFullNetworkData));
router->GetLinkInfo().Clear();
- router->GetLinkInfo().AddRss(aMessageInfo.GetThreadLinkInfo()->GetRss());
+ router->GetLinkInfo().AddRss(aRxInfo.mMessageInfo.GetThreadLinkInfo()->GetRss());
router->SetLinkQualityOut(LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMargin));
router->ResetLinkFailures();
router->SetState(Neighbor::kStateValid);
- router->SetKeySequence(aKeySequence);
+ router->SetKeySequence(aRxInfo.mKeySequence);
mNeighborTable.Signal(NeighborTable::kRouterAdded, *router);
@@ -1020,10 +1012,10 @@
RequestedTlvs requestedTlvs;
// Challenge
- SuccessOrExit(error = ReadChallenge(aMessage, challenge));
+ SuccessOrExit(error = ReadChallenge(aRxInfo.mMessage, challenge));
// TLV Request
- switch (FindTlvRequest(aMessage, requestedTlvs))
+ switch (FindTlvRequest(aRxInfo.mMessage, requestedTlvs))
{
case kErrorNone:
break;
@@ -1034,7 +1026,7 @@
ExitNow(error = kErrorParse);
}
- SuccessOrExit(error = SendLinkAccept(aMessageInfo, router, requestedTlvs, challenge));
+ SuccessOrExit(error = SendLinkAccept(aRxInfo.mMessageInfo, router, requestedTlvs, challenge));
}
exit:
@@ -1177,10 +1169,10 @@
return rval;
}
-Error MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor)
+Error MleRouter::HandleAdvertisement(RxInfo &aRxInfo)
{
Error error = kErrorNone;
- const ThreadLinkInfo *linkInfo = aMessageInfo.GetThreadLinkInfo();
+ const ThreadLinkInfo *linkInfo = aRxInfo.mMessageInfo.GetThreadLinkInfo();
uint8_t linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(Get<Mac::Mac>().GetNoiseFloor(), linkInfo->GetRss());
Mac::ExtAddress extAddr;
uint16_t sourceAddress = Mac::kShortAddrInvalid;
@@ -1191,16 +1183,16 @@
uint8_t routerId;
uint8_t routerCount;
- aMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
+ aRxInfo.mMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
// Source Address
- SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aMessage, sourceAddress));
+ SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress));
// Leader Data
- SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
+ SuccessOrExit(error = ReadLeaderData(aRxInfo.mMessage, leaderData));
// Route Data (optional)
- if (Tlv::FindTlv(aMessage, route) == kErrorNone)
+ if (Tlv::FindTlv(aRxInfo.mMessage, route) == kErrorNone)
{
VerifyOrExit(route.IsValid(), error = kErrorParse);
}
@@ -1225,7 +1217,7 @@
error = kErrorDrop);
}
- if (IsChild() && (aNeighbor == &mParent || !IsFullThreadDevice()))
+ if (IsChild() && (aRxInfo.mNeighbor == &mParent || !IsFullThreadDevice()))
{
ExitNow();
}
@@ -1233,7 +1225,7 @@
if (ComparePartitions(IsSingleton(route), leaderData, IsSingleton(), mLeaderData) > 0
#if OPENTHREAD_CONFIG_TIME_SYNC_REQUIRED
// if time sync is required, it will only migrate to a better network which also enables time sync.
- && aMessage.GetTimeSyncSeq() != OT_TIME_SYNC_INVALID_SEQ
+ && aRxInfo.mMessage.GetTimeSyncSeq() != OT_TIME_SYNC_INVALID_SEQ
#endif
)
{
@@ -1244,7 +1236,7 @@
}
else if (leaderData.GetLeaderRouterId() != GetLeaderId())
{
- VerifyOrExit(aNeighbor && aNeighbor->IsStateValid());
+ VerifyOrExit(aRxInfo.mNeighbor && aRxInfo.mNeighbor->IsStateValid());
if (!IsChild())
{
@@ -1260,10 +1252,10 @@
routerId = RouterIdFromRloc16(sourceAddress);
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
- Get<TimeSync>().HandleTimeSyncMessage(aMessage);
+ Get<TimeSync>().HandleTimeSyncMessage(aRxInfo.mMessage);
#endif
- if (IsFullThreadDevice() && (aNeighbor && aNeighbor->IsStateValid()) &&
+ if (IsFullThreadDevice() && (aRxInfo.mNeighbor && aRxInfo.mNeighbor->IsStateValid()) &&
((mRouterTable.GetActiveRouterCount() == 0) ||
SerialNumber::IsGreater(route.GetRouterIdSequence(), mRouterTable.GetRouterIdSequence())))
{
@@ -1301,9 +1293,9 @@
if (processRouteTlv)
{
SuccessOrExit(error = ProcessRouteTlv(route));
- if (Get<RouterTable>().Contains(*aNeighbor))
+ if (Get<RouterTable>().Contains(*aRxInfo.mNeighbor))
{
- aNeighbor = nullptr; // aNeighbor is no longer valid after `ProcessRouteTlv`
+ aRxInfo.mNeighbor = nullptr; // aRxInfo.mNeighbor is no longer valid after `ProcessRouteTlv`
}
}
}
@@ -1315,7 +1307,7 @@
ExitNow();
case kRoleChild:
- if (aNeighbor == &mParent)
+ if (aRxInfo.mNeighbor == &mParent)
{
// MLE Advertisement from parent
router = &mParent;
@@ -1443,10 +1435,10 @@
UpdateRoutes(route, routerId);
exit:
- if (aNeighbor && aNeighbor->GetRloc16() != sourceAddress)
+ if (aRxInfo.mNeighbor && aRxInfo.mNeighbor->GetRloc16() != sourceAddress)
{
// Remove stale neighbors
- RemoveNeighbor(*aNeighbor);
+ RemoveNeighbor(*aRxInfo.mNeighbor);
}
return error;
@@ -1611,7 +1603,7 @@
return changed;
}
-void MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
+void MleRouter::HandleParentRequest(RxInfo &aRxInfo)
{
Error error = kErrorNone;
Mac::ExtAddress extAddr;
@@ -1623,7 +1615,7 @@
uint8_t modeBitmask;
DeviceMode mode;
- Log(kMessageReceive, kTypeParentRequest, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeParentRequest, aRxInfo.mMessageInfo.GetPeerAddr());
VerifyOrExit(IsRouterEligible(), error = kErrorInvalidState);
@@ -1654,14 +1646,14 @@
// the network (because Leader would reject any further address solicit).
// ==> Verified below when checking the scan mask.
- aMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
+ aRxInfo.mMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
// Version
- SuccessOrExit(error = Tlv::Find<VersionTlv>(aMessage, version));
+ SuccessOrExit(error = Tlv::Find<VersionTlv>(aRxInfo.mMessage, version));
VerifyOrExit(version >= OT_THREAD_VERSION_1_1, error = kErrorParse);
// Scan Mask
- SuccessOrExit(error = Tlv::Find<ScanMaskTlv>(aMessage, scanMask));
+ SuccessOrExit(error = Tlv::Find<ScanMaskTlv>(aRxInfo.mMessage, scanMask));
switch (mRole)
{
@@ -1681,7 +1673,7 @@
}
// Challenge
- SuccessOrExit(error = ReadChallenge(aMessage, challenge));
+ SuccessOrExit(error = ReadChallenge(aRxInfo.mMessage, challenge));
child = mChildTable.FindChild(extAddr, Child::kInStateAnyExceptInvalid);
@@ -1692,13 +1684,13 @@
// MAC Address
child->SetExtAddress(extAddr);
child->GetLinkInfo().Clear();
- child->GetLinkInfo().AddRss(aMessageInfo.GetThreadLinkInfo()->GetRss());
+ child->GetLinkInfo().AddRss(aRxInfo.mMessageInfo.GetThreadLinkInfo()->GetRss());
child->ResetLinkFailures();
child->SetState(Neighbor::kStateParentRequest);
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
- child->SetTimeSyncEnabled(Tlv::Find<TimeRequestTlv>(aMessage, nullptr, 0) == kErrorNone);
+ child->SetTimeSyncEnabled(Tlv::Find<TimeRequestTlv>(aRxInfo.mMessage, nullptr, 0) == kErrorNone);
#endif
- if (Tlv::Find<ModeTlv>(aMessage, modeBitmask) == kErrorNone)
+ if (Tlv::Find<ModeTlv>(aRxInfo.mMessage, modeBitmask) == kErrorNone)
{
mode.Set(modeBitmask);
child->SetDeviceMode(mode);
@@ -2236,9 +2228,7 @@
return error;
}
-void MleRouter::HandleChildIdRequest(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- uint32_t aKeySequence)
+void MleRouter::HandleChildIdRequest(RxInfo &aRxInfo)
{
Error error = kErrorNone;
Mac::ExtAddress extAddr;
@@ -2258,7 +2248,7 @@
uint8_t numTlvs;
uint16_t addressRegistrationOffset = 0;
- Log(kMessageReceive, kTypeChildIdRequest, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeChildIdRequest, aRxInfo.mMessageInfo.GetPeerAddr());
VerifyOrExit(IsRouterEligible(), error = kErrorInvalidState);
@@ -2266,17 +2256,17 @@
VerifyOrExit(IsAttached(), error = kErrorInvalidState);
// Find Child
- aMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
+ aRxInfo.mMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
child = mChildTable.FindChild(extAddr, Child::kInStateAnyExceptInvalid);
VerifyOrExit(child != nullptr, error = kErrorAlready);
// Version
- SuccessOrExit(error = Tlv::Find<VersionTlv>(aMessage, version));
+ SuccessOrExit(error = Tlv::Find<VersionTlv>(aRxInfo.mMessage, version));
VerifyOrExit(version >= OT_THREAD_VERSION_1_1, error = kErrorParse);
// Response
- SuccessOrExit(error = ReadResponse(aMessage, response));
+ SuccessOrExit(error = ReadResponse(aRxInfo.mMessage, response));
VerifyOrExit(response.Matches(child->GetChallenge(), child->GetChallengeSize()), error = kErrorSecurity);
// Remove existing MLE messages
@@ -2286,22 +2276,22 @@
Get<MeshForwarder>().RemoveMessages(*child, Message::kSubTypeMleDataResponse);
// Link-Layer and MLE Frame Counters
- SuccessOrExit(error = ReadFrameCounters(aMessage, linkFrameCounter, mleFrameCounter));
+ SuccessOrExit(error = ReadFrameCounters(aRxInfo.mMessage, linkFrameCounter, mleFrameCounter));
// Mode
- SuccessOrExit(error = Tlv::Find<ModeTlv>(aMessage, modeBitmask));
+ SuccessOrExit(error = Tlv::Find<ModeTlv>(aRxInfo.mMessage, modeBitmask));
mode.Set(modeBitmask);
// Timeout
- SuccessOrExit(error = Tlv::Find<TimeoutTlv>(aMessage, timeout));
+ SuccessOrExit(error = Tlv::Find<TimeoutTlv>(aRxInfo.mMessage, timeout));
// TLV Request
- SuccessOrExit(error = FindTlvRequest(aMessage, requestedTlvs));
+ SuccessOrExit(error = FindTlvRequest(aRxInfo.mMessage, requestedTlvs));
VerifyOrExit(requestedTlvs.mNumTlvs <= Child::kMaxRequestTlvs, error = kErrorParse);
// Active Timestamp
needsActiveDatasetTlv = true;
- switch (Tlv::Find<ActiveTimestampTlv>(aMessage, timestamp))
+ switch (Tlv::Find<ActiveTimestampTlv>(aRxInfo.mMessage, timestamp))
{
case kErrorNone:
needsActiveDatasetTlv =
@@ -2315,7 +2305,7 @@
// Pending Timestamp
needsPendingDatasetTlv = true;
- switch (Tlv::Find<PendingTimestampTlv>(aMessage, timestamp))
+ switch (Tlv::Find<PendingTimestampTlv>(aRxInfo.mMessage, timestamp))
{
case kErrorNone:
needsPendingDatasetTlv =
@@ -2329,8 +2319,9 @@
if (!mode.IsFullThreadDevice())
{
- SuccessOrExit(error = Tlv::FindTlvOffset(aMessage, Tlv::kAddressRegistration, addressRegistrationOffset));
- SuccessOrExit(error = UpdateChildAddresses(aMessage, addressRegistrationOffset, *child));
+ SuccessOrExit(error =
+ Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kAddressRegistration, addressRegistrationOffset));
+ SuccessOrExit(error = UpdateChildAddresses(aRxInfo.mMessage, addressRegistrationOffset, *child));
}
// Remove from router table
@@ -2354,10 +2345,10 @@
child->GetLinkFrameCounters().SetAll(linkFrameCounter);
child->SetLinkAckFrameCounter(linkFrameCounter);
child->SetMleFrameCounter(mleFrameCounter);
- child->SetKeySequence(aKeySequence);
+ child->SetKeySequence(aRxInfo.mKeySequence);
child->SetDeviceMode(mode);
child->SetVersion(static_cast<uint8_t>(version));
- child->GetLinkInfo().AddRss(aMessageInfo.GetThreadLinkInfo()->GetRss());
+ child->GetLinkInfo().AddRss(aRxInfo.mMessageInfo.GetThreadLinkInfo()->GetRss());
child->SetTimeout(timeout);
#if OPENTHREAD_CONFIG_MULTI_RADIO
child->ClearLastRxFragmentTag();
@@ -2403,7 +2394,7 @@
LogProcessError(kTypeChildIdRequest, error);
}
-void MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
+void MleRouter::HandleChildUpdateRequest(RxInfo &aRxInfo)
{
static const uint8_t kMaxResponseTlvs = 10;
@@ -2422,14 +2413,14 @@
uint16_t addressRegistrationOffset = 0;
bool childDidChange = false;
- Log(kMessageReceive, kTypeChildUpdateRequestOfChild, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeChildUpdateRequestOfChild, aRxInfo.mMessageInfo.GetPeerAddr());
// Mode
- SuccessOrExit(error = Tlv::Find<ModeTlv>(aMessage, modeBitmask));
+ SuccessOrExit(error = Tlv::Find<ModeTlv>(aRxInfo.mMessage, modeBitmask));
mode.Set(modeBitmask);
// Challenge
- switch (ReadChallenge(aMessage, challenge))
+ switch (ReadChallenge(aRxInfo.mMessage, challenge))
{
case kErrorNone:
tlvs[tlvslength++] = Tlv::kResponse;
@@ -2443,7 +2434,7 @@
tlvs[tlvslength++] = Tlv::kSourceAddress;
- aMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
+ aRxInfo.mMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(extAddr);
child = mChildTable.FindChild(extAddr, Child::kInStateAnyExceptInvalid);
if (child == nullptr)
@@ -2453,7 +2444,7 @@
if (mode.IsRxOnWhenIdle())
{
tlvs[tlvslength++] = Tlv::kStatus;
- SendChildUpdateResponse(nullptr, aMessageInfo, tlvs, tlvslength, challenge);
+ SendChildUpdateResponse(nullptr, aRxInfo.mMessageInfo, tlvs, tlvslength, challenge);
}
ExitNow();
@@ -2482,14 +2473,14 @@
}
// IPv6 Address TLV
- if (Tlv::FindTlvOffset(aMessage, Tlv::kAddressRegistration, addressRegistrationOffset) == kErrorNone)
+ if (Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kAddressRegistration, addressRegistrationOffset) == kErrorNone)
{
- SuccessOrExit(error = UpdateChildAddresses(aMessage, addressRegistrationOffset, *child));
+ SuccessOrExit(error = UpdateChildAddresses(aRxInfo.mMessage, addressRegistrationOffset, *child));
tlvs[tlvslength++] = Tlv::kAddressRegistration;
}
// Leader Data
- switch (ReadLeaderData(aMessage, leaderData))
+ switch (ReadLeaderData(aRxInfo.mMessage, leaderData))
{
case kErrorNone:
child->SetNetworkDataVersion(leaderData.GetDataVersion(child->GetNetworkDataType()));
@@ -2501,7 +2492,7 @@
}
// Timeout
- switch (Tlv::Find<TimeoutTlv>(aMessage, timeout))
+ switch (Tlv::Find<TimeoutTlv>(aRxInfo.mMessage, timeout))
{
case kErrorNone:
if (child->GetTimeout() != timeout)
@@ -2521,7 +2512,7 @@
}
// TLV Request
- switch (FindTlvRequest(aMessage, requestedTlvs))
+ switch (FindTlvRequest(aRxInfo.mMessage, requestedTlvs))
{
case kErrorNone:
VerifyOrExit(requestedTlvs.mNumTlvs <= (kMaxResponseTlvs - tlvslength), error = kErrorParse);
@@ -2546,14 +2537,14 @@
CslChannelTlv cslChannel;
uint32_t cslTimeout;
- if (Tlv::Find<CslTimeoutTlv>(aMessage, cslTimeout) == kErrorNone)
+ if (Tlv::Find<CslTimeoutTlv>(aRxInfo.mMessage, cslTimeout) == kErrorNone)
{
child->SetCslTimeout(cslTimeout);
// MUST include CSL accuracy TLV when request includes CSL timeout
tlvs[tlvslength++] = Tlv::kCslClockAccuracy;
}
- if (Tlv::FindTlv(aMessage, cslChannel) == kErrorNone)
+ if (Tlv::FindTlv(aRxInfo.mMessage, cslChannel) == kErrorNone)
{
child->SetCslChannel(static_cast<uint8_t>(cslChannel.GetChannel()));
}
@@ -2606,16 +2597,13 @@
}
#endif
- SendChildUpdateResponse(child, aMessageInfo, tlvs, tlvslength, challenge);
+ SendChildUpdateResponse(child, aRxInfo.mMessageInfo, tlvs, tlvslength, challenge);
exit:
LogProcessError(kTypeChildUpdateRequestOfChild, error);
}
-void MleRouter::HandleChildUpdateResponse(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- uint32_t aKeySequence,
- Neighbor * aNeighbor)
+void MleRouter::HandleChildUpdateResponse(RxInfo &aRxInfo)
{
Error error = kErrorNone;
uint16_t sourceAddress;
@@ -2628,16 +2616,16 @@
Child * child;
uint16_t addressRegistrationOffset = 0;
- if ((aNeighbor == nullptr) || IsActiveRouter(aNeighbor->GetRloc16()))
+ if ((aRxInfo.mNeighbor == nullptr) || IsActiveRouter(aRxInfo.mNeighbor->GetRloc16()))
{
- Log(kMessageReceive, kTypeChildUpdateResponseOfUnknownChild, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeChildUpdateResponseOfUnknownChild, aRxInfo.mMessageInfo.GetPeerAddr());
ExitNow(error = kErrorNotFound);
}
- child = static_cast<Child *>(aNeighbor);
+ child = static_cast<Child *>(aRxInfo.mNeighbor);
// Response
- switch (ReadResponse(aMessage, response))
+ switch (ReadResponse(aRxInfo.mMessage, response))
{
case kErrorNone:
VerifyOrExit(response.Matches(child->GetChallenge(), child->GetChallengeSize()), error = kErrorSecurity);
@@ -2649,10 +2637,10 @@
ExitNow(error = kErrorNone);
}
- Log(kMessageReceive, kTypeChildUpdateResponseOfChild, aMessageInfo.GetPeerAddr(), child->GetRloc16());
+ Log(kMessageReceive, kTypeChildUpdateResponseOfChild, aRxInfo.mMessageInfo.GetPeerAddr(), child->GetRloc16());
// Source Address
- switch (Tlv::Find<SourceAddressTlv>(aMessage, sourceAddress))
+ switch (Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress))
{
case kErrorNone:
if (child->GetRloc16() != sourceAddress)
@@ -2671,7 +2659,7 @@
}
// Status
- switch (Tlv::Find<ThreadStatusTlv>(aMessage, status))
+ switch (Tlv::Find<ThreadStatusTlv>(aRxInfo.mMessage, status))
{
case kErrorNone:
VerifyOrExit(status != StatusTlv::kError, RemoveNeighbor(*child));
@@ -2684,7 +2672,7 @@
// Link-Layer Frame Counter
- switch (Tlv::Find<LinkFrameCounterTlv>(aMessage, linkFrameCounter))
+ switch (Tlv::Find<LinkFrameCounterTlv>(aRxInfo.mMessage, linkFrameCounter))
{
case kErrorNone:
child->GetLinkFrameCounters().SetAll(linkFrameCounter);
@@ -2697,7 +2685,7 @@
}
// MLE Frame Counter
- switch (Tlv::Find<MleFrameCounterTlv>(aMessage, mleFrameCounter))
+ switch (Tlv::Find<MleFrameCounterTlv>(aRxInfo.mMessage, mleFrameCounter))
{
case kErrorNone:
child->SetMleFrameCounter(mleFrameCounter);
@@ -2709,7 +2697,7 @@
}
// Timeout
- switch (Tlv::Find<TimeoutTlv>(aMessage, timeout))
+ switch (Tlv::Find<TimeoutTlv>(aRxInfo.mMessage, timeout))
{
case kErrorNone:
child->SetTimeout(timeout);
@@ -2721,13 +2709,13 @@
}
// IPv6 Address
- if (Tlv::FindTlvOffset(aMessage, Tlv::kAddressRegistration, addressRegistrationOffset) == kErrorNone)
+ if (Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kAddressRegistration, addressRegistrationOffset) == kErrorNone)
{
- SuccessOrExit(error = UpdateChildAddresses(aMessage, addressRegistrationOffset, *child));
+ SuccessOrExit(error = UpdateChildAddresses(aRxInfo.mMessage, addressRegistrationOffset, *child));
}
// Leader Data
- switch (ReadLeaderData(aMessage, leaderData))
+ switch (ReadLeaderData(aRxInfo.mMessage, leaderData))
{
case kErrorNone:
child->SetNetworkDataVersion(leaderData.GetDataVersion(child->GetNetworkDataType()));
@@ -2740,16 +2728,14 @@
SetChildStateToValid(*child);
child->SetLastHeard(TimerMilli::GetNow());
- child->SetKeySequence(aKeySequence);
- child->GetLinkInfo().AddRss(aMessageInfo.GetThreadLinkInfo()->GetRss());
+ child->SetKeySequence(aRxInfo.mKeySequence);
+ child->GetLinkInfo().AddRss(aRxInfo.mMessageInfo.GetThreadLinkInfo()->GetRss());
exit:
LogProcessError(kTypeChildUpdateResponseOfChild, error);
}
-void MleRouter::HandleDataRequest(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- const Neighbor * aNeighbor)
+void MleRouter::HandleDataRequest(RxInfo &aRxInfo)
{
Error error = kErrorNone;
RequestedTlvs requestedTlvs;
@@ -2757,12 +2743,12 @@
uint8_t tlvs[4];
uint8_t numTlvs;
- Log(kMessageReceive, kTypeDataRequest, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeDataRequest, aRxInfo.mMessageInfo.GetPeerAddr());
- VerifyOrExit(aNeighbor && aNeighbor->IsStateValid(), error = kErrorSecurity);
+ VerifyOrExit(aRxInfo.mNeighbor && aRxInfo.mNeighbor->IsStateValid(), error = kErrorSecurity);
// TLV Request
- SuccessOrExit(error = FindTlvRequest(aMessage, requestedTlvs));
+ SuccessOrExit(error = FindTlvRequest(aRxInfo.mMessage, requestedTlvs));
VerifyOrExit(requestedTlvs.mNumTlvs <= sizeof(tlvs), error = kErrorParse);
memset(tlvs, Tlv::kInvalid, sizeof(tlvs));
@@ -2770,7 +2756,7 @@
numTlvs = requestedTlvs.mNumTlvs;
// Active Timestamp
- switch (Tlv::Find<ActiveTimestampTlv>(aMessage, timestamp))
+ switch (Tlv::Find<ActiveTimestampTlv>(aRxInfo.mMessage, timestamp))
{
case kErrorNone:
if (MeshCoP::Timestamp::Compare(×tamp, Get<MeshCoP::ActiveDataset>().GetTimestamp()) == 0)
@@ -2789,7 +2775,7 @@
}
// Pending Timestamp
- switch (Tlv::Find<PendingTimestampTlv>(aMessage, timestamp))
+ switch (Tlv::Find<PendingTimestampTlv>(aRxInfo.mMessage, timestamp))
{
case kErrorNone:
if (MeshCoP::Timestamp::Compare(×tamp, Get<MeshCoP::PendingDataset>().GetTimestamp()) == 0)
@@ -2807,7 +2793,7 @@
ExitNow(error = kErrorParse);
}
- SendDataResponse(aMessageInfo.GetPeerAddr(), tlvs, numTlvs, 0, &aMessage);
+ SendDataResponse(aRxInfo.mMessageInfo.GetPeerAddr(), tlvs, numTlvs, 0, &aRxInfo.mMessage);
exit:
LogProcessError(kTypeDataRequest, error);
@@ -2883,7 +2869,7 @@
}
#endif // OPENTHREAD_CONFIG_MLE_STEERING_DATA_SET_OOB_ENABLE
-void MleRouter::HandleDiscoveryRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
+void MleRouter::HandleDiscoveryRequest(RxInfo &aRxInfo)
{
Error error = kErrorNone;
Tlv tlv;
@@ -2893,7 +2879,7 @@
uint16_t offset;
uint16_t end;
- Log(kMessageReceive, kTypeDiscoveryRequest, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeDiscoveryRequest, aRxInfo.mMessageInfo.GetPeerAddr());
discoveryRequest.SetLength(0);
@@ -2901,26 +2887,26 @@
VerifyOrExit(IsRouterEligible(), error = kErrorInvalidState);
// find MLE Discovery TLV
- VerifyOrExit(Tlv::FindTlvOffset(aMessage, Tlv::kDiscovery, offset) == kErrorNone, error = kErrorParse);
- IgnoreError(aMessage.Read(offset, tlv));
+ VerifyOrExit(Tlv::FindTlvOffset(aRxInfo.mMessage, Tlv::kDiscovery, offset) == kErrorNone, error = kErrorParse);
+ IgnoreError(aRxInfo.mMessage.Read(offset, tlv));
offset += sizeof(tlv);
end = offset + sizeof(tlv) + tlv.GetLength();
while (offset < end)
{
- IgnoreError(aMessage.Read(offset, meshcopTlv));
+ IgnoreError(aRxInfo.mMessage.Read(offset, meshcopTlv));
switch (meshcopTlv.GetType())
{
case MeshCoP::Tlv::kDiscoveryRequest:
- IgnoreError(aMessage.Read(offset, discoveryRequest));
+ IgnoreError(aRxInfo.mMessage.Read(offset, discoveryRequest));
VerifyOrExit(discoveryRequest.IsValid(), error = kErrorParse);
break;
case MeshCoP::Tlv::kExtendedPanId:
- SuccessOrExit(error = Tlv::Read<MeshCoP::ExtendedPanIdTlv>(aMessage, offset, extPanId));
+ SuccessOrExit(error = Tlv::Read<MeshCoP::ExtendedPanIdTlv>(aRxInfo.mMessage, offset, extPanId));
VerifyOrExit(Get<MeshCoP::ExtendedPanIdManager>().GetExtPanId() != extPanId, error = kErrorDrop);
break;
@@ -2938,7 +2924,7 @@
{
otThreadDiscoveryRequestInfo info;
- aMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(AsCoreType(&info.mExtAddress));
+ aRxInfo.mMessageInfo.GetPeerAddr().GetIid().ConvertToExtAddress(AsCoreType(&info.mExtAddress));
info.mVersion = discoveryRequest.GetVersion();
info.mIsJoiner = discoveryRequest.IsJoiner();
@@ -2959,7 +2945,7 @@
}
}
- error = SendDiscoveryResponse(aMessageInfo.GetPeerAddr(), aMessage);
+ error = SendDiscoveryResponse(aRxInfo.mMessageInfo.GetPeerAddr(), aRxInfo.mMessage);
exit:
LogProcessError(kTypeDiscoveryRequest, error);
@@ -4440,13 +4426,13 @@
}
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
-void MleRouter::HandleTimeSync(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, const Neighbor *aNeighbor)
+void MleRouter::HandleTimeSync(RxInfo &aRxInfo)
{
- Log(kMessageReceive, kTypeTimeSync, aMessageInfo.GetPeerAddr());
+ Log(kMessageReceive, kTypeTimeSync, aRxInfo.mMessageInfo.GetPeerAddr());
- VerifyOrExit(aNeighbor && aNeighbor->IsStateValid());
+ VerifyOrExit(aRxInfo.mNeighbor && aRxInfo.mNeighbor->IsStateValid());
- Get<TimeSync>().HandleTimeSyncMessage(aMessage);
+ Get<TimeSync>().HandleTimeSyncMessage(aRxInfo.mMessage);
exit:
return;
diff --git a/src/core/thread/mle_router.hpp b/src/core/thread/mle_router.hpp
index 3de8268..1a2df96 100644
--- a/src/core/thread/mle_router.hpp
+++ b/src/core/thread/mle_router.hpp
@@ -587,33 +587,20 @@
Error AppendPendingDataset(Message &aMessage);
void HandleDetachStart(void);
void HandleChildStart(AttachMode aMode);
- void HandleLinkRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor);
- void HandleLinkAccept(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- uint32_t aKeySequence,
- Neighbor * aNeighbor);
- Error HandleLinkAccept(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- uint32_t aKeySequence,
- Neighbor * aNeighbor,
- bool aRequest);
- void HandleLinkAcceptAndRequest(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- uint32_t aKeySequence,
- Neighbor * aNeighbor);
- Error HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *);
- void HandleParentRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
- void HandleChildIdRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, uint32_t aKeySequence);
- void HandleChildUpdateRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
- void HandleChildUpdateResponse(const Message & aMessage,
- const Ip6::MessageInfo &aMessageInfo,
- uint32_t aKeySequence,
- Neighbor * aNeighbor);
- void HandleDataRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, const Neighbor *aNeighbor);
+ void HandleLinkRequest(RxInfo &aRxInfo);
+ void HandleLinkAccept(RxInfo &aRxInfo);
+ Error HandleLinkAccept(RxInfo &aRxInfo, bool aRequest);
+ void HandleLinkAcceptAndRequest(RxInfo &aRxInfo);
+ Error HandleAdvertisement(RxInfo &aRxInfo);
+ void HandleParentRequest(RxInfo &aRxInfo);
+ void HandleChildIdRequest(RxInfo &aRxInfo);
+ void HandleChildUpdateRequest(RxInfo &aRxInfo);
+ void HandleChildUpdateResponse(RxInfo &aRxInfo);
+ void HandleDataRequest(RxInfo &aRxInfo);
void HandleNetworkDataUpdateRouter(void);
- void HandleDiscoveryRequest(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
+ void HandleDiscoveryRequest(RxInfo &aRxInfo);
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
- void HandleTimeSync(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, const Neighbor *aNeighbor);
+ void HandleTimeSync(RxInfo &aRxInfo);
#endif
Error ProcessRouteTlv(const RouteTlv &aRoute);