[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.
This commit is contained in:
Abtin Keshavarzian
2022-04-25 06:37:25 -07:00
committed by GitHub
parent 4365f505f3
commit 092be22333
6 changed files with 339 additions and 343 deletions
+14 -13
View File
@@ -285,10 +285,10 @@ exit:
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 @@ void DiscoverScanner::HandleDiscoveryResponse(const Message &aMessage, const Ip6
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 @@ void DiscoverScanner::HandleDiscoveryResponse(const Message &aMessage, const Ip6
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 @@ void DiscoverScanner::HandleDiscoveryResponse(const Message &aMessage, const Ip6
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 @@ void DiscoverScanner::HandleDiscoveryResponse(const Message &aMessage, const Ip6
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:
+1 -1
View File
@@ -167,7 +167,7 @@ private:
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);
+138 -138
View File
@@ -2766,6 +2766,7 @@ void Mle::HandleUdpReceive(void *aContext, otMessage *aMessage, const otMessageI
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 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
{
#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 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
}
#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 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn
#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 @@ exit:
}
}
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 @@ void Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &a
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 @@ void Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &a
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 @@ void Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &a
{
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 @@ void Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &a
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 @@ void Mle::HandleDataResponse(const Message &aMessage, const Ip6::MessageInfo &aM
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 @@ bool Mle::IsNetworkDataNewer(const LeaderData &aLeaderData)
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 @@ Error Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMe
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 @@ Error Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMe
}
// Active Timestamp
switch (Tlv::Find<ActiveTimestampTlv>(aMessage, activeTimestamp))
switch (Tlv::Find<ActiveTimestampTlv>(aRxInfo.mMessage, activeTimestamp))
{
case kErrorNone:
hasActiveTimestamp = true;
@@ -3220,7 +3226,7 @@ Error Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMe
// 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 @@ Error Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMe
}
// Pending Timestamp
switch (Tlv::Find<PendingTimestampTlv>(aMessage, pendingTimestamp))
switch (Tlv::Find<PendingTimestampTlv>(aRxInfo.mMessage, pendingTimestamp))
{
case kErrorNone:
hasPendingTimestamp = true;
@@ -3245,7 +3251,7 @@ Error Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMe
// 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 @@ Error Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMe
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 @@ Error Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMe
{
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 @@ Error Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMe
{
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 @@ exit:
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 @@ exit:
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 @@ exit:
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 @@ void Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &
#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 @@ void Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &
}
// 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 @@ void Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &
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 @@ void Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &
}
// 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 @@ void Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &
#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 @@ void Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &
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 @@ exit:
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 @@ void Mle::HandleChildIdResponse(const Message & aMessage,
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 @@ void Mle::HandleChildIdResponse(const Message & aMessage,
}
// 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 @@ void Mle::HandleChildIdResponse(const Message & aMessage,
#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 @@ void Mle::HandleChildIdResponse(const Message & aMessage,
{
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 @@ void Mle::HandleChildIdResponse(const Message & aMessage,
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 @@ exit:
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 @@ void Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::MessageIn
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 @@ void Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::MessageIn
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 @@ void Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::MessageIn
}
// 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 @@ void Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::MessageIn
}
// 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 @@ void Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::MessageIn
}
#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 @@ exit:
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 @@ void Mle::HandleChildUpdateResponse(const Message & aMessage,
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 @@ void Mle::HandleChildUpdateResponse(const Message & aMessage,
}
// 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 @@ void Mle::HandleChildUpdateResponse(const Message & aMessage,
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 @@ void Mle::HandleChildUpdateResponse(const Message & aMessage,
}
// 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 @@ void Mle::HandleChildUpdateResponse(const Message & aMessage,
#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 @@ exit:
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 @@ void Mle::HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo &aMessa
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 @@ void Mle::HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo &aMessa
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 @@ exit:
}
#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 @@ exit:
#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 @@ exit:
#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);
+41 -19
View File
@@ -943,6 +943,36 @@ protected:
uint8_t mNumTlvs; ///< Number of TLVs in the array.
};
/**
* 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.
*
@@ -1753,31 +1783,23 @@ private:
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);
+133 -147
View File
@@ -612,7 +612,7 @@ exit:
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 @@ void MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInf
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 @@ void MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInf
}
// 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 @@ void MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInf
{
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 @@ void MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInf
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 @@ void MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInf
}
// TLV Request
switch (FindTlvRequest(aMessage, requestedTlvs))
switch (FindTlvRequest(aRxInfo.mMessage, requestedTlvs))
{
case kErrorNone:
break;
@@ -704,7 +705,7 @@ void MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInf
#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 @@ void MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::MessageInf
}
#endif
SuccessOrExit(error = SendLinkAccept(aMessageInfo, neighbor, requestedTlvs, challenge));
SuccessOrExit(error = SendLinkAccept(aRxInfo.mMessageInfo, neighbor, requestedTlvs, challenge));
exit:
LogProcessError(kTypeLinkRequest, error);
@@ -810,31 +811,21 @@ exit:
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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
}
// 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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
}
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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
}
// 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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
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 @@ Error MleRouter::HandleLinkAccept(const Message & aMessage,
ExitNow(error = kErrorParse);
}
SuccessOrExit(error = SendLinkAccept(aMessageInfo, router, requestedTlvs, challenge));
SuccessOrExit(error = SendLinkAccept(aRxInfo.mMessageInfo, router, requestedTlvs, challenge));
}
exit:
@@ -1177,10 +1169,10 @@ exit:
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 @@ Error MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Message
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 MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Message
error = kErrorDrop);
}
if (IsChild() && (aNeighbor == &mParent || !IsFullThreadDevice()))
if (IsChild() && (aRxInfo.mNeighbor == &mParent || !IsFullThreadDevice()))
{
ExitNow();
}
@@ -1233,7 +1225,7 @@ Error MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Message
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 @@ Error MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Message
}
else if (leaderData.GetLeaderRouterId() != GetLeaderId())
{
VerifyOrExit(aNeighbor && aNeighbor->IsStateValid());
VerifyOrExit(aRxInfo.mNeighbor && aRxInfo.mNeighbor->IsStateValid());
if (!IsChild())
{
@@ -1260,10 +1252,10 @@ Error MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Message
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 @@ Error MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Message
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 @@ Error MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Message
ExitNow();
case kRoleChild:
if (aNeighbor == &mParent)
if (aRxInfo.mNeighbor == &mParent)
{
// MLE Advertisement from parent
router = &mParent;
@@ -1443,10 +1435,10 @@ Error MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::Message
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 @@ exit:
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 @@ void MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::MessageI
uint8_t modeBitmask;
DeviceMode mode;
Log(kMessageReceive, kTypeParentRequest, aMessageInfo.GetPeerAddr());
Log(kMessageReceive, kTypeParentRequest, aRxInfo.mMessageInfo.GetPeerAddr());
VerifyOrExit(IsRouterEligible(), error = kErrorInvalidState);
@@ -1654,14 +1646,14 @@ void MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::MessageI
// 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 @@ void MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::MessageI
}
// Challenge
SuccessOrExit(error = ReadChallenge(aMessage, challenge));
SuccessOrExit(error = ReadChallenge(aRxInfo.mMessage, challenge));
child = mChildTable.FindChild(extAddr, Child::kInStateAnyExceptInvalid);
@@ -1692,13 +1684,13 @@ void MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::MessageI
// 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 @@ exit:
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 @@ void MleRouter::HandleChildIdRequest(const Message & aMessage,
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 @@ void MleRouter::HandleChildIdRequest(const Message & aMessage,
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 @@ void MleRouter::HandleChildIdRequest(const Message & aMessage,
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 @@ void MleRouter::HandleChildIdRequest(const Message & aMessage,
// Pending Timestamp
needsPendingDatasetTlv = true;
switch (Tlv::Find<PendingTimestampTlv>(aMessage, timestamp))
switch (Tlv::Find<PendingTimestampTlv>(aRxInfo.mMessage, timestamp))
{
case kErrorNone:
needsPendingDatasetTlv =
@@ -2329,8 +2319,9 @@ void MleRouter::HandleChildIdRequest(const Message & aMessage,
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 @@ void MleRouter::HandleChildIdRequest(const Message & aMessage,
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 @@ exit:
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 @@ void MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Mes
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 @@ void MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Mes
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 @@ void MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Mes
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 @@ void MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Mes
}
// 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 @@ void MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Mes
}
// Timeout
switch (Tlv::Find<TimeoutTlv>(aMessage, timeout))
switch (Tlv::Find<TimeoutTlv>(aRxInfo.mMessage, timeout))
{
case kErrorNone:
if (child->GetTimeout() != timeout)
@@ -2521,7 +2512,7 @@ void MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Mes
}
// TLV Request
switch (FindTlvRequest(aMessage, requestedTlvs))
switch (FindTlvRequest(aRxInfo.mMessage, requestedTlvs))
{
case kErrorNone:
VerifyOrExit(requestedTlvs.mNumTlvs <= (kMaxResponseTlvs - tlvslength), error = kErrorParse);
@@ -2546,14 +2537,14 @@ void MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Mes
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 @@ void MleRouter::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Mes
}
#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 @@ void MleRouter::HandleChildUpdateResponse(const Message & aMessage,
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 @@ void MleRouter::HandleChildUpdateResponse(const Message & aMessage,
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 @@ void MleRouter::HandleChildUpdateResponse(const Message & aMessage,
}
// 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 @@ void MleRouter::HandleChildUpdateResponse(const Message & aMessage,
// 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 @@ void MleRouter::HandleChildUpdateResponse(const Message & aMessage,
}
// 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 @@ void MleRouter::HandleChildUpdateResponse(const Message & aMessage,
}
// Timeout
switch (Tlv::Find<TimeoutTlv>(aMessage, timeout))
switch (Tlv::Find<TimeoutTlv>(aRxInfo.mMessage, timeout))
{
case kErrorNone:
child->SetTimeout(timeout);
@@ -2721,13 +2709,13 @@ void MleRouter::HandleChildUpdateResponse(const Message & aMessage,
}
// 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 @@ void MleRouter::HandleChildUpdateResponse(const Message & aMessage,
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 @@ void MleRouter::HandleDataRequest(const Message & aMessage,
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 @@ void MleRouter::HandleDataRequest(const Message & aMessage,
numTlvs = requestedTlvs.mNumTlvs;
// Active Timestamp
switch (Tlv::Find<ActiveTimestampTlv>(aMessage, timestamp))
switch (Tlv::Find<ActiveTimestampTlv>(aRxInfo.mMessage, timestamp))
{
case kErrorNone:
if (MeshCoP::Timestamp::Compare(&timestamp, Get<MeshCoP::ActiveDataset>().GetTimestamp()) == 0)
@@ -2789,7 +2775,7 @@ void MleRouter::HandleDataRequest(const Message & aMessage,
}
// Pending Timestamp
switch (Tlv::Find<PendingTimestampTlv>(aMessage, timestamp))
switch (Tlv::Find<PendingTimestampTlv>(aRxInfo.mMessage, timestamp))
{
case kErrorNone:
if (MeshCoP::Timestamp::Compare(&timestamp, Get<MeshCoP::PendingDataset>().GetTimestamp()) == 0)
@@ -2807,7 +2793,7 @@ void MleRouter::HandleDataRequest(const Message & aMessage,
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 @@ void MleRouter::SetSteeringData(const Mac::ExtAddress *aExtAddress)
}
#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 @@ void MleRouter::HandleDiscoveryRequest(const Message &aMessage, const Ip6::Messa
uint16_t offset;
uint16_t end;
Log(kMessageReceive, kTypeDiscoveryRequest, aMessageInfo.GetPeerAddr());
Log(kMessageReceive, kTypeDiscoveryRequest, aRxInfo.mMessageInfo.GetPeerAddr());
discoveryRequest.SetLength(0);
@@ -2901,26 +2887,26 @@ void MleRouter::HandleDiscoveryRequest(const Message &aMessage, const Ip6::Messa
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 @@ void MleRouter::HandleDiscoveryRequest(const Message &aMessage, const Ip6::Messa
{
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 @@ void MleRouter::HandleDiscoveryRequest(const Message &aMessage, const Ip6::Messa
}
}
error = SendDiscoveryResponse(aMessageInfo.GetPeerAddr(), aMessage);
error = SendDiscoveryResponse(aRxInfo.mMessageInfo.GetPeerAddr(), aRxInfo.mMessage);
exit:
LogProcessError(kTypeDiscoveryRequest, error);
@@ -4440,13 +4426,13 @@ exit:
}
#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;
+12 -25
View File
@@ -587,33 +587,20 @@ private:
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);