mirror of
https://github.com/espressif/openthread.git
synced 2026-09-12 12:10:07 +00:00
[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:
@@ -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:
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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(×tamp, 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(×tamp, 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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user