[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:
Abtin Keshavarzian
2020-03-13 22:06:04 -07:00
committed by Jonathan Hui
parent 54e884569b
commit 052047a15f
11 changed files with 229 additions and 171 deletions
-1
View File
@@ -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);
+2 -2
View File
@@ -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();
}
+9 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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;
+33 -24
View File
@@ -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);
+4 -4
View File
@@ -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.
+1 -1
View File
@@ -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) {}
+20 -76
View File
@@ -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;
+95
View File
@@ -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; }
};
/**
* @}
*
+9 -1
View File
@@ -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;
}