mirror of
https://github.com/espressif/openthread.git
synced 2026-08-13 22:27:47 +00:00
[mle] add Mle::RxMessage::ReadAndSetNetworkDataTlv() (#10358)
This commit adds `ReadAndSetNetworkDataTlv()` to `Mle::RxMessage` to read the Network Data TLV from a received MLE message and set it in `NetworkData::Leader`.
This commit is contained in:
+25
-18
@@ -2902,8 +2902,6 @@ Error Mle::HandleLeaderData(RxInfo &aRxInfo)
|
||||
bool saveActiveDataset = false;
|
||||
bool savePendingDataset = false;
|
||||
bool dataRequest = false;
|
||||
uint16_t offset;
|
||||
uint16_t length;
|
||||
|
||||
SuccessOrExit(error = aRxInfo.mMessage.ReadLeaderDataTlv(leaderData));
|
||||
|
||||
@@ -2977,16 +2975,15 @@ Error Mle::HandleLeaderData(RxInfo &aRxInfo)
|
||||
ExitNow(error = kErrorParse);
|
||||
}
|
||||
|
||||
if (Tlv::FindTlvValueOffset(aRxInfo.mMessage, Tlv::kNetworkData, offset, length) == kErrorNone)
|
||||
switch (error = aRxInfo.mMessage.ReadAndSetNetworkDataTlv(leaderData))
|
||||
{
|
||||
error = Get<NetworkData::Leader>().SetNetworkData(leaderData.GetDataVersion(NetworkData::kFullSet),
|
||||
leaderData.GetDataVersion(NetworkData::kStableSubset),
|
||||
GetNetworkDataType(), aRxInfo.mMessage, offset, length);
|
||||
SuccessOrExit(error);
|
||||
}
|
||||
else
|
||||
{
|
||||
ExitNow(dataRequest = true);
|
||||
case kErrorNone:
|
||||
break;
|
||||
case kErrorNotFound:
|
||||
dataRequest = true;
|
||||
OT_FALL_THROUGH;
|
||||
default:
|
||||
ExitNow();
|
||||
}
|
||||
|
||||
#if OPENTHREAD_FTD
|
||||
@@ -3308,8 +3305,6 @@ void Mle::HandleChildIdResponse(RxInfo &aRxInfo)
|
||||
uint16_t sourceAddress;
|
||||
uint16_t shortAddress;
|
||||
MeshCoP::Timestamp timestamp;
|
||||
uint16_t networkDataOffset;
|
||||
uint16_t networkDataLength;
|
||||
|
||||
SuccessOrExit(error = Tlv::Find<SourceAddressTlv>(aRxInfo.mMessage, sourceAddress));
|
||||
|
||||
@@ -3324,8 +3319,7 @@ void Mle::HandleChildIdResponse(RxInfo &aRxInfo)
|
||||
|
||||
SuccessOrExit(error = aRxInfo.mMessage.ReadLeaderDataTlv(leaderData));
|
||||
|
||||
SuccessOrExit(
|
||||
error = Tlv::FindTlvValueOffset(aRxInfo.mMessage, Tlv::kNetworkData, networkDataOffset, networkDataLength));
|
||||
VerifyOrExit(aRxInfo.mMessage.ContainsTlv(Tlv::kNetworkData));
|
||||
|
||||
switch (Tlv::Find<ActiveTimestampTlv>(aRxInfo.mMessage, timestamp))
|
||||
{
|
||||
@@ -3388,9 +3382,7 @@ void Mle::HandleChildIdResponse(RxInfo &aRxInfo)
|
||||
|
||||
mParent.SetRloc16(sourceAddress);
|
||||
|
||||
IgnoreError(Get<NetworkData::Leader>().SetNetworkData(
|
||||
leaderData.GetDataVersion(NetworkData::kFullSet), leaderData.GetDataVersion(NetworkData::kStableSubset),
|
||||
GetNetworkDataType(), aRxInfo.mMessage, networkDataOffset, networkDataLength));
|
||||
IgnoreError(aRxInfo.mMessage.ReadAndSetNetworkDataTlv(leaderData));
|
||||
|
||||
SetStateChild(shortAddress);
|
||||
|
||||
@@ -5064,6 +5056,21 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
Error Mle::RxMessage::ReadAndSetNetworkDataTlv(const LeaderData &aLeaderData) const
|
||||
{
|
||||
Error error;
|
||||
uint16_t offset;
|
||||
uint16_t length;
|
||||
|
||||
SuccessOrExit(error = Tlv::FindTlvValueOffset(*this, Tlv::kNetworkData, offset, length));
|
||||
|
||||
error = Get<NetworkData::Leader>().SetNetworkData(aLeaderData.GetDataVersion(NetworkData::kFullSet),
|
||||
aLeaderData.GetDataVersion(NetworkData::kStableSubset),
|
||||
Get<Mle>().GetNetworkDataType(), *this, offset, length);
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
Error Mle::RxMessage::ReadAndSaveActiveDataset(const MeshCoP::Timestamp &aActiveTimestamp) const
|
||||
{
|
||||
return ReadAndSaveDataset(MeshCoP::Dataset::kActive, aActiveTimestamp);
|
||||
|
||||
@@ -1072,6 +1072,7 @@ private:
|
||||
Error ReadFrameCounterTlvs(uint32_t &aLinkFrameCounter, uint32_t &aMleFrameCounter) const;
|
||||
Error ReadTlvRequestTlv(TlvList &aTlvList) const;
|
||||
Error ReadLeaderDataTlv(LeaderData &aLeaderData) const;
|
||||
Error ReadAndSetNetworkDataTlv(const LeaderData &aLeaderData) const;
|
||||
Error ReadAndSaveActiveDataset(const MeshCoP::Timestamp &aActiveTimestamp) const;
|
||||
Error ReadAndSavePendingDataset(const MeshCoP::Timestamp &aPendingTimestamp) const;
|
||||
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
|
||||
|
||||
Reference in New Issue
Block a user