mirror of
https://github.com/espressif/openthread.git
synced 2026-08-15 23:27:47 +00:00
[mle] adding LeaderData class (#4679)
This commit adds `LeaderData` (subclass of `otLeaderData`) to store the info from Leader Data TLV. It also adds `ReadLeaderData()` to read Leader Data TLV from a message.
This commit is contained in:
committed by
Jonathan Hui
parent
54e884569b
commit
052047a15f
@@ -587,7 +587,6 @@ otDeviceRole otThreadGetDeviceRole(otInstance *aInstance);
|
||||
*
|
||||
* @retval OT_ERROR_NONE Successfully retrieved the leader data.
|
||||
* @retval OT_ERROR_DETACHED Not currently attached.
|
||||
* @retval OT_ERROR_INVALID_ARGS @p aLeaderData is NULL.
|
||||
*
|
||||
*/
|
||||
otError otThreadGetLeaderData(otInstance *aInstance, otLeaderData *aLeaderData);
|
||||
|
||||
@@ -94,12 +94,12 @@ uint8_t otNetDataGetVersion(otInstance *aInstance)
|
||||
{
|
||||
Instance &instance = *static_cast<Instance *>(aInstance);
|
||||
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderDataTlv().GetDataVersion();
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderData().GetDataVersion();
|
||||
}
|
||||
|
||||
uint8_t otNetDataGetStableVersion(otInstance *aInstance)
|
||||
{
|
||||
Instance &instance = *static_cast<Instance *>(aInstance);
|
||||
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderDataTlv().GetStableDataVersion();
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderData().GetStableDataVersion();
|
||||
}
|
||||
|
||||
@@ -264,31 +264,36 @@ otDeviceRole otThreadGetDeviceRole(otInstance *aInstance)
|
||||
otError otThreadGetLeaderData(otInstance *aInstance, otLeaderData *aLeaderData)
|
||||
{
|
||||
Instance &instance = *static_cast<Instance *>(aInstance);
|
||||
otError error = OT_ERROR_NONE;
|
||||
|
||||
OT_ASSERT(aLeaderData != NULL);
|
||||
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderData(*aLeaderData);
|
||||
VerifyOrExit(instance.Get<Mle::MleRouter>().IsAttached(), error = OT_ERROR_DETACHED);
|
||||
*aLeaderData = instance.Get<Mle::MleRouter>().GetLeaderData();
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
uint8_t otThreadGetLeaderRouterId(otInstance *aInstance)
|
||||
{
|
||||
Instance &instance = *static_cast<Instance *>(aInstance);
|
||||
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderDataTlv().GetLeaderRouterId();
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderId();
|
||||
}
|
||||
|
||||
uint8_t otThreadGetLeaderWeight(otInstance *aInstance)
|
||||
{
|
||||
Instance &instance = *static_cast<Instance *>(aInstance);
|
||||
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderDataTlv().GetWeighting();
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderData().GetWeighting();
|
||||
}
|
||||
|
||||
uint32_t otThreadGetPartitionId(otInstance *aInstance)
|
||||
{
|
||||
Instance &instance = *static_cast<Instance *>(aInstance);
|
||||
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderDataTlv().GetPartitionId();
|
||||
return instance.Get<Mle::MleRouter>().GetLeaderData().GetPartitionId();
|
||||
}
|
||||
|
||||
uint16_t otThreadGetRloc16(otInstance *aInstance)
|
||||
|
||||
+34
-38
@@ -1086,7 +1086,7 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
const LeaderDataTlv &Mle::GetLeaderDataTlv(void)
|
||||
const LeaderData &Mle::GetLeaderData(void)
|
||||
{
|
||||
mLeaderData.SetDataVersion(Get<NetworkData::Leader>().GetVersion());
|
||||
mLeaderData.SetStableDataVersion(Get<NetworkData::Leader>().GetStableVersion());
|
||||
@@ -1094,23 +1094,6 @@ const LeaderDataTlv &Mle::GetLeaderDataTlv(void)
|
||||
return mLeaderData;
|
||||
}
|
||||
|
||||
otError Mle::GetLeaderData(otLeaderData &aLeaderData)
|
||||
{
|
||||
const LeaderDataTlv &leaderData(GetLeaderDataTlv());
|
||||
otError error = OT_ERROR_NONE;
|
||||
|
||||
VerifyOrExit(mRole != OT_DEVICE_ROLE_DISABLED && mRole != OT_DEVICE_ROLE_DETACHED, error = OT_ERROR_DETACHED);
|
||||
|
||||
aLeaderData.mPartitionId = leaderData.GetPartitionId();
|
||||
aLeaderData.mWeighting = leaderData.GetWeighting();
|
||||
aLeaderData.mDataVersion = leaderData.GetDataVersion();
|
||||
aLeaderData.mStableDataVersion = leaderData.GetStableDataVersion();
|
||||
aLeaderData.mLeaderRouterId = leaderData.GetLeaderRouterId();
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
Message *Mle::NewMleMessage(void)
|
||||
{
|
||||
Message * message;
|
||||
@@ -1232,11 +1215,28 @@ otError Mle::AppendAddress16(Message &aMessage, uint16_t aRloc16)
|
||||
|
||||
otError Mle::AppendLeaderData(Message &aMessage)
|
||||
{
|
||||
mLeaderData.Init();
|
||||
LeaderDataTlv leaderDataTlv;
|
||||
|
||||
mLeaderData.SetDataVersion(Get<NetworkData::Leader>().GetVersion());
|
||||
mLeaderData.SetStableDataVersion(Get<NetworkData::Leader>().GetStableVersion());
|
||||
|
||||
return mLeaderData.AppendTo(aMessage);
|
||||
leaderDataTlv.Init();
|
||||
leaderDataTlv.Set(mLeaderData);
|
||||
|
||||
return leaderDataTlv.AppendTo(aMessage);
|
||||
}
|
||||
|
||||
otError Mle::ReadLeaderData(const Message &aMessage, LeaderData &aLeaderData)
|
||||
{
|
||||
otError error;
|
||||
LeaderDataTlv leaderDataTlv;
|
||||
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderDataTlv), leaderDataTlv));
|
||||
VerifyOrExit(leaderDataTlv.IsValid(), error = OT_ERROR_PARSE);
|
||||
leaderDataTlv.Get(aLeaderData);
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
otError Mle::AppendNetworkData(Message &aMessage, bool aStableOnly)
|
||||
@@ -2803,12 +2803,12 @@ exit:
|
||||
|
||||
otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, Neighbor *aNeighbor)
|
||||
{
|
||||
otError error = OT_ERROR_NONE;
|
||||
uint16_t sourceAddress;
|
||||
LeaderDataTlv leaderData;
|
||||
RouteTlv route;
|
||||
uint8_t tlvs[] = {Tlv::kNetworkData};
|
||||
uint16_t delay;
|
||||
otError error = OT_ERROR_NONE;
|
||||
uint16_t sourceAddress;
|
||||
LeaderData leaderData;
|
||||
RouteTlv route;
|
||||
uint8_t tlvs[] = {Tlv::kNetworkData};
|
||||
uint16_t delay;
|
||||
|
||||
// Source Address
|
||||
SuccessOrExit(error = Tlv::ReadUint16Tlv(aMessage, Tlv::kSourceAddress, sourceAddress));
|
||||
@@ -2816,8 +2816,7 @@ otError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo
|
||||
LogMleMessage("Receive Advertisement", aMessageInfo.GetPeerAddr(), sourceAddress);
|
||||
|
||||
// Leader Data
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
|
||||
|
||||
if (mRole != OT_DEVICE_ROLE_DETACHED)
|
||||
{
|
||||
@@ -2919,7 +2918,7 @@ exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
bool Mle::IsNetworkDataNewer(const LeaderDataTlv &aLeaderData)
|
||||
bool Mle::IsNetworkDataNewer(const LeaderData &aLeaderData)
|
||||
{
|
||||
int8_t diff;
|
||||
|
||||
@@ -2938,7 +2937,7 @@ bool Mle::IsNetworkDataNewer(const LeaderDataTlv &aLeaderData)
|
||||
otError Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
|
||||
{
|
||||
otError error = OT_ERROR_NONE;
|
||||
LeaderDataTlv leaderData;
|
||||
LeaderData leaderData;
|
||||
ActiveTimestampTlv activeTimestamp;
|
||||
PendingTimestampTlv pendingTimestamp;
|
||||
uint16_t networkDataOffset = 0;
|
||||
@@ -2948,8 +2947,7 @@ otError Mle::HandleLeaderData(const Message &aMessage, const Ip6::MessageInfo &a
|
||||
Tlv tlv;
|
||||
|
||||
// Leader Data
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
|
||||
|
||||
if ((leaderData.GetPartitionId() != mLeaderData.GetPartitionId()) ||
|
||||
(leaderData.GetWeighting() != mLeaderData.GetWeighting()) || (leaderData.GetLeaderRouterId() != GetLeaderId()))
|
||||
@@ -3159,7 +3157,7 @@ otError Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInf
|
||||
Challenge response;
|
||||
uint16_t version;
|
||||
uint16_t sourceAddress;
|
||||
LeaderDataTlv leaderData;
|
||||
LeaderData leaderData;
|
||||
uint8_t linkMarginFromTlv;
|
||||
uint8_t linkMargin;
|
||||
uint8_t linkQuality;
|
||||
@@ -3192,8 +3190,7 @@ otError Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInf
|
||||
}
|
||||
|
||||
// Leader Data
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
|
||||
|
||||
// Link Margin
|
||||
SuccessOrExit(error = Tlv::ReadUint8Tlv(aMessage, Tlv::kLinkMargin, linkMarginFromTlv));
|
||||
@@ -3364,7 +3361,7 @@ otError Mle::HandleChildIdResponse(const Message & aMessage,
|
||||
OT_UNUSED_VARIABLE(aMessageInfo);
|
||||
|
||||
otError error = OT_ERROR_NONE;
|
||||
LeaderDataTlv leaderData;
|
||||
LeaderData leaderData;
|
||||
uint16_t sourceAddress;
|
||||
uint16_t shortAddress;
|
||||
RouteTlv route;
|
||||
@@ -3384,8 +3381,7 @@ otError Mle::HandleChildIdResponse(const Message & aMessage,
|
||||
VerifyOrExit(mAttachState == kAttachStateChildIdRequest);
|
||||
|
||||
// Leader Data
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
|
||||
|
||||
// ShortAddress
|
||||
SuccessOrExit(error = Tlv::ReadUint16Tlv(aMessage, Tlv::kAddress16, shortAddress));
|
||||
|
||||
+22
-20
@@ -854,23 +854,12 @@ public:
|
||||
otError AddLeaderAloc(void);
|
||||
|
||||
/**
|
||||
* This method returns the most recently received Leader Data TLV.
|
||||
* This method returns the most recently received Leader Data.
|
||||
*
|
||||
* @returns A reference to the most recently received Leader Data TLV.
|
||||
* @returns A reference to the most recently received Leader Data.
|
||||
*
|
||||
*/
|
||||
const LeaderDataTlv &GetLeaderDataTlv(void);
|
||||
|
||||
/**
|
||||
* This method gets the Leader Data.
|
||||
*
|
||||
* @param[out] aLeaderData A reference to where the leader data is placed.
|
||||
*
|
||||
* @retval OT_ERROR_NONE Successfully retrieved the leader data.
|
||||
* @retval OT_ERROR_DETACHED Not currently attached.
|
||||
*
|
||||
*/
|
||||
otError GetLeaderData(otLeaderData &aLeaderData);
|
||||
const LeaderData &GetLeaderData(void);
|
||||
|
||||
/**
|
||||
* This method derives the Child ID from a given RLOC16.
|
||||
@@ -1334,6 +1323,19 @@ protected:
|
||||
*/
|
||||
otError AppendLeaderData(Message &aMessage);
|
||||
|
||||
/**
|
||||
* This method reads Leader Data TLV from a message.
|
||||
*
|
||||
* @param[in] aMessage A reference to the message.
|
||||
* @param[out] aLeaderData A reference to output the Leader Data.
|
||||
*
|
||||
* @retval OT_ERROR_NONE Successfully read the TLV.
|
||||
* @retval OT_ERROR_NOT_FOUND TLV was not found in the message.
|
||||
* @retval OT_ERROR_PARSE TLV was found but could not be parsed.
|
||||
*
|
||||
*/
|
||||
otError ReadLeaderData(const Message &aMessage, LeaderData &aLeaderData);
|
||||
|
||||
/**
|
||||
* This method appends a Scan Mask TLV to a message.
|
||||
*
|
||||
@@ -1680,7 +1682,7 @@ protected:
|
||||
static const char *ReattachStateToString(ReattachState aState);
|
||||
#endif
|
||||
|
||||
LeaderDataTlv mLeaderData; ///< Last received Leader Data TLV.
|
||||
LeaderData mLeaderData; ///< Last received Leader Data TLV.
|
||||
bool mRetrieveNewNetworkData; ///< Indicating new Network Data is needed if set.
|
||||
otDeviceRole mRole; ///< Current Thread role.
|
||||
Router mParent; ///< Parent information.
|
||||
@@ -1778,7 +1780,7 @@ private:
|
||||
uint8_t aLinkMargin,
|
||||
const ConnectivityTlv &aConnectivityTlv,
|
||||
uint8_t aVersion);
|
||||
bool IsNetworkDataNewer(const LeaderDataTlv &aLeaderData);
|
||||
bool IsNetworkDataNewer(const LeaderData &aLeaderData);
|
||||
|
||||
otError GetAlocAddress(Ip6::Address &aAddress, uint16_t aAloc16) const;
|
||||
#if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE
|
||||
@@ -1819,10 +1821,10 @@ private:
|
||||
|
||||
AddressRegistrationMode mAddressRegistrationMode;
|
||||
|
||||
uint8_t mParentLinkMargin;
|
||||
bool mParentIsSingleton;
|
||||
bool mReceivedResponseFromParent;
|
||||
LeaderDataTlv mParentLeaderData;
|
||||
uint8_t mParentLinkMargin;
|
||||
bool mParentIsSingleton;
|
||||
bool mReceivedResponseFromParent;
|
||||
LeaderData mParentLeaderData;
|
||||
|
||||
Router mParentCandidate;
|
||||
Challenge mParentCandidateChallenge;
|
||||
|
||||
@@ -561,7 +561,7 @@ otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Message
|
||||
Neighbor * neighbor = NULL;
|
||||
Challenge challenge;
|
||||
uint16_t version;
|
||||
LeaderDataTlv leaderData;
|
||||
LeaderData leaderData;
|
||||
uint16_t sourceAddress;
|
||||
RequestedTlvs requestedTlvs;
|
||||
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
|
||||
@@ -582,10 +582,15 @@ otError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Message
|
||||
VerifyOrExit(version >= OT_THREAD_VERSION_1_1, error = OT_ERROR_PARSE);
|
||||
|
||||
// Leader Data
|
||||
if (Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData) == OT_ERROR_NONE)
|
||||
switch (ReadLeaderData(aMessage, leaderData))
|
||||
{
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
case OT_ERROR_NONE:
|
||||
VerifyOrExit(leaderData.GetPartitionId() == mLeaderData.GetPartitionId(), error = OT_ERROR_INVALID_STATE);
|
||||
break;
|
||||
case OT_ERROR_NOT_FOUND:
|
||||
break;
|
||||
default:
|
||||
ExitNow(error = OT_ERROR_PARSE);
|
||||
}
|
||||
|
||||
// Source Address
|
||||
@@ -810,7 +815,7 @@ otError MleRouter::HandleLinkAccept(const Message & aMessage,
|
||||
uint8_t routerId;
|
||||
uint16_t address16;
|
||||
RouteTlv route;
|
||||
LeaderDataTlv leaderData;
|
||||
LeaderData leaderData;
|
||||
uint8_t linkMargin;
|
||||
|
||||
// Source Address
|
||||
@@ -903,8 +908,7 @@ otError MleRouter::HandleLinkAccept(const Message & aMessage,
|
||||
VerifyOrExit(GetRloc16() == address16, error = OT_ERROR_DROP);
|
||||
|
||||
// Leader Data
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
|
||||
SetLeaderData(leaderData.GetPartitionId(), leaderData.GetWeighting(), leaderData.GetLeaderRouterId());
|
||||
|
||||
// Route
|
||||
@@ -941,8 +945,7 @@ otError MleRouter::HandleLinkAccept(const Message & aMessage,
|
||||
VerifyOrExit(router != NULL);
|
||||
|
||||
// Leader Data
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
|
||||
VerifyOrExit(leaderData.GetPartitionId() == mLeaderData.GetPartitionId());
|
||||
|
||||
if (mRetrieveNewNetworkData ||
|
||||
@@ -1099,10 +1102,10 @@ exit:
|
||||
return rval;
|
||||
}
|
||||
|
||||
int MleRouter::ComparePartitions(bool aSingletonA,
|
||||
const LeaderDataTlv &aLeaderDataA,
|
||||
bool aSingletonB,
|
||||
const LeaderDataTlv &aLeaderDataB)
|
||||
int MleRouter::ComparePartitions(bool aSingletonA,
|
||||
const LeaderData &aLeaderDataA,
|
||||
bool aSingletonB,
|
||||
const LeaderData &aLeaderDataB)
|
||||
{
|
||||
int rval = 0;
|
||||
|
||||
@@ -1158,7 +1161,7 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage,
|
||||
uint8_t linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(Get<Mac::Mac>().GetNoiseFloor(), linkInfo->mRss);
|
||||
Mac::ExtAddress macAddr;
|
||||
uint16_t sourceAddress;
|
||||
LeaderDataTlv leaderData;
|
||||
LeaderData leaderData;
|
||||
RouteTlv route;
|
||||
uint32_t partitionId;
|
||||
Router * router;
|
||||
@@ -1171,8 +1174,7 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage,
|
||||
SuccessOrExit(error = Tlv::ReadUint16Tlv(aMessage, Tlv::kSourceAddress, sourceAddress));
|
||||
|
||||
// Leader Data
|
||||
SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData));
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
SuccessOrExit(error = ReadLeaderData(aMessage, leaderData));
|
||||
|
||||
// Route Data (optional)
|
||||
if (Tlv::GetTlv(aMessage, Tlv::kRoute, sizeof(route), route) == OT_ERROR_NONE)
|
||||
@@ -1189,8 +1191,7 @@ otError MleRouter::HandleAdvertisement(const Message & aMessage,
|
||||
|
||||
if (partitionId != mLeaderData.GetPartitionId())
|
||||
{
|
||||
otLogNoteMle("Different partition (peer:%u, local:%u)", leaderData.GetPartitionId(),
|
||||
mLeaderData.GetPartitionId());
|
||||
otLogNoteMle("Different partition (peer:%u, local:%u)", partitionId, mLeaderData.GetPartitionId());
|
||||
|
||||
VerifyOrExit(linkMargin >= OPENTHREAD_CONFIG_MLE_PARTITION_MERGE_MARGIN_MIN, error = OT_ERROR_LINK_MARGIN_LOW);
|
||||
|
||||
@@ -2262,7 +2263,7 @@ otError MleRouter::HandleChildUpdateRequest(const Message & aMessage,
|
||||
uint8_t modeBitmask;
|
||||
DeviceMode mode;
|
||||
Challenge challenge;
|
||||
LeaderDataTlv leaderData;
|
||||
LeaderData leaderData;
|
||||
uint32_t timeout;
|
||||
Child * child;
|
||||
DeviceMode oldMode;
|
||||
@@ -2333,9 +2334,13 @@ otError MleRouter::HandleChildUpdateRequest(const Message & aMessage,
|
||||
}
|
||||
|
||||
// Leader Data
|
||||
if (Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData) == OT_ERROR_NONE)
|
||||
switch (ReadLeaderData(aMessage, leaderData))
|
||||
{
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
case OT_ERROR_NONE:
|
||||
case OT_ERROR_NOT_FOUND:
|
||||
break;
|
||||
default:
|
||||
ExitNow(error = OT_ERROR_PARSE);
|
||||
}
|
||||
|
||||
// Timeout
|
||||
@@ -2433,7 +2438,7 @@ otError MleRouter::HandleChildUpdateResponse(const Message & aMessage,
|
||||
uint8_t status;
|
||||
uint32_t linkFrameCounter;
|
||||
uint32_t mleFrameCounter;
|
||||
LeaderDataTlv leaderData;
|
||||
LeaderData leaderData;
|
||||
Child * child;
|
||||
uint16_t addressRegistrationOffset = 0;
|
||||
|
||||
@@ -2535,10 +2540,9 @@ otError MleRouter::HandleChildUpdateResponse(const Message & aMessage,
|
||||
}
|
||||
|
||||
// Leader Data
|
||||
if (Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData) == OT_ERROR_NONE)
|
||||
switch (ReadLeaderData(aMessage, leaderData))
|
||||
{
|
||||
VerifyOrExit(leaderData.IsValid(), error = OT_ERROR_PARSE);
|
||||
|
||||
case OT_ERROR_NONE:
|
||||
if (child->IsFullNetworkData())
|
||||
{
|
||||
child->SetNetworkDataVersion(leaderData.GetDataVersion());
|
||||
@@ -2547,6 +2551,11 @@ otError MleRouter::HandleChildUpdateResponse(const Message & aMessage,
|
||||
{
|
||||
child->SetNetworkDataVersion(leaderData.GetStableDataVersion());
|
||||
}
|
||||
break;
|
||||
case OT_ERROR_NOT_FOUND:
|
||||
break;
|
||||
default:
|
||||
ExitNow(error = OT_ERROR_PARSE);
|
||||
}
|
||||
|
||||
SetChildStateToValid(*child);
|
||||
|
||||
@@ -475,10 +475,10 @@ public:
|
||||
* @retval -1 If partition B is preferred.
|
||||
*
|
||||
*/
|
||||
static int ComparePartitions(bool aSingletonA,
|
||||
const LeaderDataTlv &aLeaderDataA,
|
||||
bool aSingletonB,
|
||||
const LeaderDataTlv &aLeaderDataB);
|
||||
static int ComparePartitions(bool aSingletonA,
|
||||
const LeaderData &aLeaderDataA,
|
||||
bool aSingletonB,
|
||||
const LeaderData &aLeaderDataB);
|
||||
|
||||
/**
|
||||
* This method checks if the destination is reachable.
|
||||
|
||||
@@ -99,7 +99,7 @@ public:
|
||||
|
||||
otError GetNextNeighborInfo(otNeighborInfoIterator &, otNeighborInfo &) { return OT_ERROR_NOT_IMPLEMENTED; }
|
||||
|
||||
static int ComparePartitions(bool, const LeaderDataTlv &, bool, const LeaderDataTlv &) { return 0; }
|
||||
static int ComparePartitions(bool, const LeaderData &, bool, const LeaderData &) { return 0; }
|
||||
|
||||
void ResolveRoutingLoops(uint16_t, uint16_t) {}
|
||||
|
||||
|
||||
@@ -577,12 +577,6 @@ OT_TOOL_PACKED_BEGIN
|
||||
class LeaderDataTlv : public Tlv
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* This method clears the object (setting all fields to zero).
|
||||
*
|
||||
*/
|
||||
void Clear(void) { memset(this, 0, sizeof(*this)); }
|
||||
|
||||
/**
|
||||
* This method initializes the TLV.
|
||||
*
|
||||
@@ -603,84 +597,34 @@ public:
|
||||
bool IsValid(void) const { return GetLength() >= sizeof(*this) - sizeof(Tlv); }
|
||||
|
||||
/**
|
||||
* This method returns the Partition ID value.
|
||||
* This method gets the Leader Data info from TLV.
|
||||
*
|
||||
* @returns The Partition ID value.
|
||||
* @param[out] aLeaderData A reference to output Leader Data info.
|
||||
*
|
||||
*/
|
||||
uint32_t GetPartitionId(void) const { return HostSwap32(mPartitionId); }
|
||||
void Get(LeaderData &aLeaderData) const
|
||||
{
|
||||
aLeaderData.SetPartitionId(HostSwap32(mPartitionId));
|
||||
aLeaderData.SetWeighting(mWeighting);
|
||||
aLeaderData.SetDataVersion(mDataVersion);
|
||||
aLeaderData.SetStableDataVersion(mStableDataVersion);
|
||||
aLeaderData.SetLeaderRouterId(mLeaderRouterId);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method sets the Partition ID value.
|
||||
* This method sets the Leader Data.
|
||||
*
|
||||
* @param[in] aPartitionId The Partition ID value.
|
||||
* @param[in] aLeaderData A Leader Data.
|
||||
*
|
||||
*/
|
||||
void SetPartitionId(uint32_t aPartitionId) { mPartitionId = HostSwap32(aPartitionId); }
|
||||
|
||||
/**
|
||||
* This method returns the Weighting value.
|
||||
*
|
||||
* @returns The Weighting value.
|
||||
*
|
||||
*/
|
||||
uint8_t GetWeighting(void) const { return mWeighting; }
|
||||
|
||||
/**
|
||||
* This method sets the Weighting value.
|
||||
*
|
||||
* @param[in] aWeighting The Weighting value.
|
||||
*
|
||||
*/
|
||||
void SetWeighting(uint8_t aWeighting) { mWeighting = aWeighting; }
|
||||
|
||||
/**
|
||||
* This method returns the Data Version value.
|
||||
*
|
||||
* @returns The Data Version value.
|
||||
*
|
||||
*/
|
||||
uint8_t GetDataVersion(void) const { return mDataVersion; }
|
||||
|
||||
/**
|
||||
* This method sets the Data Version value.
|
||||
*
|
||||
* @param[in] aVersion The Data Version value.
|
||||
*
|
||||
*/
|
||||
void SetDataVersion(uint8_t aVersion) { mDataVersion = aVersion; }
|
||||
|
||||
/**
|
||||
* This method returns the Stable Data Version value.
|
||||
*
|
||||
* @returns The Stable Data Version value.
|
||||
*
|
||||
*/
|
||||
uint8_t GetStableDataVersion(void) const { return mStableDataVersion; }
|
||||
|
||||
/**
|
||||
* This method sets the Stable Data Version value.
|
||||
*
|
||||
* @param[in] aVersion The Stable Data Version value.
|
||||
*
|
||||
*/
|
||||
void SetStableDataVersion(uint8_t aVersion) { mStableDataVersion = aVersion; }
|
||||
|
||||
/**
|
||||
* This method returns the Leader Router ID value.
|
||||
*
|
||||
* @returns The Leader Router ID value.
|
||||
*
|
||||
*/
|
||||
uint8_t GetLeaderRouterId(void) const { return mLeaderRouterId; }
|
||||
|
||||
/**
|
||||
* This method sets the Leader Router ID value.
|
||||
*
|
||||
* @param[in] aRouterId The Leader Router ID value.
|
||||
*
|
||||
*/
|
||||
void SetLeaderRouterId(uint8_t aRouterId) { mLeaderRouterId = aRouterId; }
|
||||
void Set(const LeaderData &aLeaderData)
|
||||
{
|
||||
mPartitionId = HostSwap32(aLeaderData.GetPartitionId());
|
||||
mWeighting = aLeaderData.GetWeighting();
|
||||
mDataVersion = aLeaderData.GetDataVersion();
|
||||
mStableDataVersion = aLeaderData.GetStableDataVersion();
|
||||
mLeaderRouterId = aLeaderData.GetLeaderRouterId();
|
||||
}
|
||||
|
||||
private:
|
||||
uint32_t mPartitionId;
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include "openthread-core-config.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <openthread/thread.h>
|
||||
|
||||
@@ -402,6 +403,100 @@ private:
|
||||
uint8_t mMode;
|
||||
};
|
||||
|
||||
/**
|
||||
* This class represents the Thread Leader Data.
|
||||
*
|
||||
*/
|
||||
class LeaderData : public otLeaderData
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* This method clears the Leader Data (setting all the fields to zero).
|
||||
*
|
||||
*/
|
||||
void Clear(void) { memset(this, 0, sizeof(*this)); }
|
||||
|
||||
/**
|
||||
* This method returns the Partition ID value.
|
||||
*
|
||||
* @returns The Partition ID value.
|
||||
*
|
||||
*/
|
||||
uint32_t GetPartitionId(void) const { return mPartitionId; }
|
||||
|
||||
/**
|
||||
* This method sets the Partition ID value.
|
||||
*
|
||||
* @param[in] aPartitionId The Partition ID value.
|
||||
*
|
||||
*/
|
||||
void SetPartitionId(uint32_t aPartitionId) { mPartitionId = aPartitionId; }
|
||||
|
||||
/**
|
||||
* This method returns the Weighting value.
|
||||
*
|
||||
* @returns The Weighting value.
|
||||
*
|
||||
*/
|
||||
uint8_t GetWeighting(void) const { return mWeighting; }
|
||||
|
||||
/**
|
||||
* This method sets the Weighting value.
|
||||
*
|
||||
* @param[in] aWeighting The Weighting value.
|
||||
*
|
||||
*/
|
||||
void SetWeighting(uint8_t aWeighting) { mWeighting = aWeighting; }
|
||||
|
||||
/**
|
||||
* This method returns the Data Version value.
|
||||
*
|
||||
* @returns The Data Version value.
|
||||
*
|
||||
*/
|
||||
uint8_t GetDataVersion(void) const { return mDataVersion; }
|
||||
|
||||
/**
|
||||
* This method sets the Data Version value.
|
||||
*
|
||||
* @param[in] aVersion The Data Version value.
|
||||
*
|
||||
*/
|
||||
void SetDataVersion(uint8_t aVersion) { mDataVersion = aVersion; }
|
||||
|
||||
/**
|
||||
* This method returns the Stable Data Version value.
|
||||
*
|
||||
* @returns The Stable Data Version value.
|
||||
*
|
||||
*/
|
||||
uint8_t GetStableDataVersion(void) const { return mStableDataVersion; }
|
||||
|
||||
/**
|
||||
* This method sets the Stable Data Version value.
|
||||
*
|
||||
* @param[in] aVersion The Stable Data Version value.
|
||||
*
|
||||
*/
|
||||
void SetStableDataVersion(uint8_t aVersion) { mStableDataVersion = aVersion; }
|
||||
|
||||
/**
|
||||
* This method returns the Leader Router ID value.
|
||||
*
|
||||
* @returns The Leader Router ID value.
|
||||
*
|
||||
*/
|
||||
uint8_t GetLeaderRouterId(void) const { return mLeaderRouterId; }
|
||||
|
||||
/**
|
||||
* This method sets the Leader Router ID value.
|
||||
*
|
||||
* @param[in] aRouterId The Leader Router ID value.
|
||||
*
|
||||
*/
|
||||
void SetLeaderRouterId(uint8_t aRouterId) { mLeaderRouterId = aRouterId; }
|
||||
};
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
|
||||
@@ -370,8 +370,16 @@ otError NetworkDiagnostic::FillRequestedTlvs(Message & aRequest,
|
||||
|
||||
case NetworkDiagnosticTlv::kLeaderData:
|
||||
{
|
||||
LeaderDataTlv tlv(reinterpret_cast<const LeaderDataTlv &>(Get<Mle::MleRouter>().GetLeaderDataTlv()));
|
||||
LeaderDataTlv tlv;
|
||||
const Mle::LeaderData &leaderData = Get<Mle::MleRouter>().GetLeaderData();
|
||||
|
||||
tlv.Init();
|
||||
tlv.SetPartitionId(leaderData.GetPartitionId());
|
||||
tlv.SetWeighting(leaderData.GetWeighting());
|
||||
tlv.SetDataVersion(leaderData.GetDataVersion());
|
||||
tlv.SetStableDataVersion(leaderData.GetStableDataVersion());
|
||||
tlv.SetLeaderRouterId(leaderData.GetLeaderRouterId());
|
||||
|
||||
SuccessOrExit(error = tlv.AppendTo(aResponse));
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user