[core] add separate neighbor.hpp, child.hpp, and router.hpp (#9376)

This commit adds separate files for `Neighbor`, `Child`, and `Router`
classes.
This commit is contained in:
Abtin Keshavarzian
2023-08-29 08:47:11 -07:00
committed by GitHub
parent 7b0fe821a3
commit 98292673fb
26 changed files with 1208 additions and 1019 deletions
+6 -2
View File
@@ -604,6 +604,8 @@ openthread_core_files = [
"thread/announce_sender.hpp",
"thread/anycast_locator.cpp",
"thread/anycast_locator.hpp",
"thread/child.cpp",
"thread/child.hpp",
"thread/child_mask.hpp",
"thread/child_supervision.cpp",
"thread/child_supervision.hpp",
@@ -646,6 +648,8 @@ openthread_core_files = [
"thread/mlr_manager.cpp",
"thread/mlr_manager.hpp",
"thread/mlr_types.hpp",
"thread/neighbor.cpp",
"thread/neighbor.hpp",
"thread/neighbor_table.cpp",
"thread/neighbor_table.hpp",
"thread/network_data.cpp",
@@ -674,6 +678,8 @@ openthread_core_files = [
"thread/panid_query_server.hpp",
"thread/radio_selector.cpp",
"thread/radio_selector.hpp",
"thread/router.cpp",
"thread/router.hpp",
"thread/router_table.cpp",
"thread/router_table.hpp",
"thread/src_match_controller.cpp",
@@ -685,8 +691,6 @@ openthread_core_files = [
"thread/time_sync_service.hpp",
"thread/tmf.cpp",
"thread/tmf.hpp",
"thread/topology.cpp",
"thread/topology.hpp",
"thread/uri_paths.cpp",
"thread/uri_paths.hpp",
"thread/version.hpp",
+3 -1
View File
@@ -195,6 +195,7 @@ set(COMMON_SOURCES
thread/announce_begin_server.cpp
thread/announce_sender.cpp
thread/anycast_locator.cpp
thread/child.cpp
thread/child_supervision.cpp
thread/child_table.cpp
thread/csl_tx_scheduler.cpp
@@ -215,6 +216,7 @@ set(COMMON_SOURCES
thread/mle_tlvs.cpp
thread/mle_types.cpp
thread/mlr_manager.cpp
thread/neighbor.cpp
thread/neighbor_table.cpp
thread/network_data.cpp
thread/network_data_leader.cpp
@@ -229,12 +231,12 @@ set(COMMON_SOURCES
thread/network_diagnostic_tlvs.cpp
thread/panid_query_server.cpp
thread/radio_selector.cpp
thread/router.cpp
thread/router_table.cpp
thread/src_match_controller.cpp
thread/thread_netif.cpp
thread/time_sync_service.cpp
thread/tmf.cpp
thread/topology.cpp
thread/uri_paths.cpp
utils/channel_manager.cpp
utils/channel_monitor.cpp
+1 -1
View File
@@ -42,7 +42,7 @@
#include "common/timer.hpp"
#include "mac/mac.hpp"
#include "mac/mac_frame.hpp"
#include "thread/topology.hpp"
#include "thread/neighbor.hpp"
namespace ot {
+2 -1
View File
@@ -48,11 +48,12 @@
#include "crypto/sha256.hpp"
#include "mac/mac_frame.hpp"
#include "radio/radio.hpp"
#include "thread/child.hpp"
#include "thread/child_table.hpp"
#include "thread/link_quality.hpp"
#include "thread/mle_router.hpp"
#include "thread/neighbor.hpp"
#include "thread/thread_netif.hpp"
#include "thread/topology.hpp"
namespace ot {
namespace Mac {
+1 -1
View File
@@ -38,7 +38,7 @@
#include "common/array.hpp"
#include "common/as_core_type.hpp"
#include "common/code_utils.hpp"
#include "thread/topology.hpp"
#include "thread/neighbor.hpp"
namespace ot {
namespace Mac {
@@ -28,10 +28,10 @@
/**
* @file
* This file includes definitions for maintaining Thread network topologies.
* This file includes definitions for a Thread `Child`.
*/
#include "topology.hpp"
#include "child.hpp"
#include "common/array.hpp"
#include "common/code_utils.hpp"
@@ -42,222 +42,6 @@
namespace ot {
void Neighbor::SetState(State aState)
{
VerifyOrExit(mState != aState);
mState = static_cast<uint8_t>(aState);
#if OPENTHREAD_CONFIG_UPTIME_ENABLE
if (mState == kStateValid)
{
mConnectionStart = Uptime::MsecToSec(Get<Uptime>().GetUptime());
}
#endif
exit:
return;
}
#if OPENTHREAD_CONFIG_UPTIME_ENABLE
uint32_t Neighbor::GetConnectionTime(void) const
{
return IsStateValid() ? Uptime::MsecToSec(Get<Uptime>().GetUptime()) - mConnectionStart : 0;
}
#endif
bool Neighbor::AddressMatcher::Matches(const Neighbor &aNeighbor) const
{
bool matches = false;
VerifyOrExit(aNeighbor.MatchesFilter(mStateFilter));
if (mShortAddress != Mac::kShortAddrInvalid)
{
VerifyOrExit(mShortAddress == aNeighbor.GetRloc16());
}
if (mExtAddress != nullptr)
{
VerifyOrExit(*mExtAddress == aNeighbor.GetExtAddress());
}
matches = true;
exit:
return matches;
}
void Neighbor::Info::SetFrom(const Neighbor &aNeighbor)
{
Clear();
mExtAddress = aNeighbor.GetExtAddress();
mAge = Time::MsecToSec(TimerMilli::GetNow() - aNeighbor.GetLastHeard());
mRloc16 = aNeighbor.GetRloc16();
mLinkFrameCounter = aNeighbor.GetLinkFrameCounters().GetMaximum();
mMleFrameCounter = aNeighbor.GetMleFrameCounter();
mLinkQualityIn = aNeighbor.GetLinkQualityIn();
mAverageRssi = aNeighbor.GetLinkInfo().GetAverageRss();
mLastRssi = aNeighbor.GetLinkInfo().GetLastRss();
mLinkMargin = aNeighbor.GetLinkInfo().GetLinkMargin();
mFrameErrorRate = aNeighbor.GetLinkInfo().GetFrameErrorRate();
mMessageErrorRate = aNeighbor.GetLinkInfo().GetMessageErrorRate();
mRxOnWhenIdle = aNeighbor.IsRxOnWhenIdle();
mFullThreadDevice = aNeighbor.IsFullThreadDevice();
mFullNetworkData = (aNeighbor.GetNetworkDataType() == NetworkData::kFullSet);
mVersion = aNeighbor.GetVersion();
#if OPENTHREAD_CONFIG_UPTIME_ENABLE
mConnectionTime = aNeighbor.GetConnectionTime();
#endif
}
void Neighbor::Init(Instance &aInstance)
{
InstanceLocatorInit::Init(aInstance);
mLinkInfo.Init(aInstance);
SetState(kStateInvalid);
}
bool Neighbor::IsStateValidOrAttaching(void) const
{
bool rval = false;
switch (GetState())
{
case kStateInvalid:
case kStateParentRequest:
case kStateParentResponse:
break;
case kStateRestored:
case kStateChildIdRequest:
case kStateLinkRequest:
case kStateChildUpdateRequest:
case kStateValid:
rval = true;
break;
}
return rval;
}
bool Neighbor::MatchesFilter(StateFilter aFilter) const
{
bool matches = false;
switch (aFilter)
{
case kInStateValid:
matches = IsStateValid();
break;
case kInStateValidOrRestoring:
matches = IsStateValidOrRestoring();
break;
case kInStateChildIdRequest:
matches = IsStateChildIdRequest();
break;
case kInStateValidOrAttaching:
matches = IsStateValidOrAttaching();
break;
case kInStateInvalid:
matches = IsStateInvalid();
break;
case kInStateAnyExceptInvalid:
matches = !IsStateInvalid();
break;
case kInStateAnyExceptValidOrRestoring:
matches = !IsStateValidOrRestoring();
break;
case kInStateAny:
matches = true;
break;
}
return matches;
}
#if OPENTHREAD_CONFIG_MULTI_RADIO
void Neighbor::SetLastRxFragmentTag(uint16_t aTag)
{
mLastRxFragmentTag = (aTag == 0) ? 0xffff : aTag;
mLastRxFragmentTagTime = TimerMilli::GetNow();
}
bool Neighbor::IsLastRxFragmentTagSet(void) const
{
return (mLastRxFragmentTag != 0) && (TimerMilli::GetNow() <= mLastRxFragmentTagTime + kLastRxFragmentTagTimeout);
}
#endif
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
void Neighbor::AggregateLinkMetrics(uint8_t aSeriesId, uint8_t aFrameType, uint8_t aLqi, int8_t aRss)
{
for (LinkMetrics::SeriesInfo &entry : mLinkMetricsSeriesInfoList)
{
if (aSeriesId == 0 || aSeriesId == entry.GetSeriesId())
{
entry.AggregateLinkMetrics(aFrameType, aLqi, aRss);
}
}
}
LinkMetrics::SeriesInfo *Neighbor::GetForwardTrackingSeriesInfo(const uint8_t &aSeriesId)
{
return mLinkMetricsSeriesInfoList.FindMatching(aSeriesId);
}
void Neighbor::AddForwardTrackingSeriesInfo(LinkMetrics::SeriesInfo &aSeriesInfo)
{
mLinkMetricsSeriesInfoList.Push(aSeriesInfo);
}
LinkMetrics::SeriesInfo *Neighbor::RemoveForwardTrackingSeriesInfo(const uint8_t &aSeriesId)
{
return mLinkMetricsSeriesInfoList.RemoveMatching(aSeriesId);
}
void Neighbor::RemoveAllForwardTrackingSeriesInfo(void)
{
while (!mLinkMetricsSeriesInfoList.IsEmpty())
{
LinkMetrics::SeriesInfo *seriesInfo = mLinkMetricsSeriesInfoList.Pop();
Get<LinkMetrics::Subject>().Free(*seriesInfo);
}
}
#endif // OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
const char *Neighbor::StateToString(State aState)
{
static const char *const kStateStrings[] = {
"Invalid", // (0) kStateInvalid
"Restored", // (1) kStateRestored
"ParentReq", // (2) kStateParentRequest
"ParentRes", // (3) kStateParentResponse
"ChildIdReq", // (4) kStateChildIdRequest
"LinkReq", // (5) kStateLinkRequest
"ChildUpdateReq", // (6) kStateChildUpdateRequest
"Valid", // (7) kStateValid
};
static_assert(0 == kStateInvalid, "kStateInvalid value is incorrect");
static_assert(1 == kStateRestored, "kStateRestored value is incorrect");
static_assert(2 == kStateParentRequest, "kStateParentRequest value is incorrect");
static_assert(3 == kStateParentResponse, "kStateParentResponse value is incorrect");
static_assert(4 == kStateChildIdRequest, "kStateChildIdRequest value is incorrect");
static_assert(5 == kStateLinkRequest, "kStateLinkRequest value is incorrect");
static_assert(6 == kStateChildUpdateRequest, "kStateChildUpdateRequest value is incorrect");
static_assert(7 == kStateValid, "kStateValid value is incorrect");
return kStateStrings[aState];
}
#if OPENTHREAD_FTD
void Child::Info::SetFrom(const Child &aChild)
@@ -533,79 +317,4 @@ void Child::SetAddressMlrState(const Ip6::Address &aAddress, MlrState aState)
#endif // OPENTHREAD_FTD
void Router::Info::SetFrom(const Router &aRouter)
{
Clear();
mRloc16 = aRouter.GetRloc16();
mRouterId = Mle::RouterIdFromRloc16(mRloc16);
mExtAddress = aRouter.GetExtAddress();
mAllocated = true;
mNextHop = aRouter.GetNextHop();
mLinkEstablished = aRouter.IsStateValid();
mPathCost = aRouter.GetCost();
mLinkQualityIn = aRouter.GetLinkQualityIn();
mLinkQualityOut = aRouter.GetLinkQualityOut();
mAge = static_cast<uint8_t>(Time::MsecToSec(TimerMilli::GetNow() - aRouter.GetLastHeard()));
mVersion = ClampToUint8(aRouter.GetVersion());
}
void Router::Info::SetFrom(const Parent &aParent)
{
SetFrom(static_cast<const Router &>(aParent));
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
mCslClockAccuracy = aParent.GetCslAccuracy().GetClockAccuracy();
mCslUncertainty = aParent.GetCslAccuracy().GetUncertainty();
#endif
}
void Router::Clear(void)
{
Instance &instance = GetInstance();
memset(reinterpret_cast<void *>(this), 0, sizeof(Router));
Init(instance);
}
LinkQuality Router::GetTwoWayLinkQuality(void) const { return Min(GetLinkQualityIn(), GetLinkQualityOut()); }
void Router::SetFrom(const Parent &aParent)
{
// We use an intermediate pointer to copy `aParent` to silence
// code checkers warning about object slicing (assigning a
// sub-class to base class instance).
const Router *parentAsRouter = &aParent;
*this = *parentAsRouter;
}
void Parent::Clear(void)
{
Instance &instance = GetInstance();
memset(reinterpret_cast<void *>(this), 0, sizeof(Parent));
Init(instance);
}
bool Router::SetNextHopAndCost(uint8_t aNextHop, uint8_t aCost)
{
bool changed = false;
if (mNextHop != aNextHop)
{
mNextHop = aNextHop;
changed = true;
}
if (mCost != aCost)
{
mCost = aCost;
changed = true;
}
return changed;
}
bool Router::SetNextHopToInvalid(void) { return SetNextHopAndCost(Mle::kInvalidRouterId, 0); }
} // namespace ot
+550
View File
@@ -0,0 +1,550 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for a Thread `Child`.
*/
#ifndef CHILD_HPP_
#define CHILD_HPP_
#include "openthread-core-config.h"
#include "thread/neighbor.hpp"
namespace ot {
#if OPENTHREAD_FTD
/**
* Represents a Thread Child.
*
*/
class Child : public Neighbor,
public IndirectSender::ChildInfo,
public DataPollHandler::ChildInfo
#if OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE
,
public CslTxScheduler::ChildInfo
#endif
{
class AddressIteratorBuilder;
public:
static constexpr uint8_t kMaxRequestTlvs = 6;
/**
* Represents diagnostic information for a Thread Child.
*
*/
class Info : public otChildInfo, public Clearable<Info>
{
public:
/**
* Sets the `Info` instance from a given `Child`.
*
* @param[in] aChild A neighbor.
*
*/
void SetFrom(const Child &aChild);
};
/**
* Defines an iterator used to go through IPv6 address entries of a child.
*
*/
class AddressIterator : public Unequatable<AddressIterator>
{
friend class AddressIteratorBuilder;
public:
/**
* Represents an index indicating the current IPv6 address entry to which the iterator is pointing.
*
*/
typedef otChildIp6AddressIterator Index;
/**
* Initializes the iterator associated with a given `Child` starting from beginning of the
* IPv6 address list.
*
* @param[in] aChild A reference to a child entry.
* @param[in] aFilter An IPv6 address type filter restricting iterator to certain type of addresses.
*
*/
explicit AddressIterator(const Child &aChild, Ip6::Address::TypeFilter aFilter = Ip6::Address::kTypeAny)
: AddressIterator(aChild, 0, aFilter)
{
}
/**
* Initializes the iterator associated with a given `Child` starting from a given index
*
* @param[in] aChild A reference to the child entry.
* @param[in] aIndex An index (`Index`) with which to initialize the iterator.
* @param[in] aFilter An IPv6 address type filter restricting iterator to certain type of addresses.
*
*/
AddressIterator(const Child &aChild, Index aIndex, Ip6::Address::TypeFilter aFilter = Ip6::Address::kTypeAny)
: mChild(aChild)
, mFilter(aFilter)
, mIndex(aIndex)
{
Update();
}
/**
* Converts the iterator into an index.
*
* @returns An index corresponding to the iterator.
*
*/
Index GetAsIndex(void) const { return mIndex; }
/**
* Gets the iterator's associated `Child` entry.
*
* @returns The associated child entry.
*
*/
const Child &GetChild(void) const { return mChild; }
/**
* Gets the current `Child` IPv6 Address to which the iterator is pointing.
*
* @returns A pointer to the associated IPv6 Address, or `nullptr` if iterator is done.
*
*/
const Ip6::Address *GetAddress(void) const;
/**
* Indicates whether the iterator has reached end of the list.
*
* @retval TRUE There are no more entries in the list (reached end of the list).
* @retval FALSE The current entry is valid.
*
*/
bool IsDone(void) const { return (mIndex >= kMaxIndex); }
/**
* Overloads `++` operator (pre-increment) to advance the iterator.
*
* The iterator is moved to point to the next `Address` entry. If there are no more `Ip6::Address` entries
* `IsDone()` returns `true`.
*
*/
void operator++(void) { mIndex++, Update(); }
/**
* Overloads `++` operator (post-increment) to advance the iterator.
*
* The iterator is moved to point to the next `Address` entry. If there are no more `Ip6::Address` entries
* `IsDone()` returns `true`.
*
*/
void operator++(int) { mIndex++, Update(); }
/**
* Overloads the `*` dereference operator and gets a reference to `Ip6::Address` to which the
* iterator is currently pointing.
*
* MUST be used when the iterator is not done (i.e., `IsDone()` returns `false`).
*
* @returns A reference to the `Ip6::Address` entry currently pointed by the iterator.
*
*/
const Ip6::Address &operator*(void) const { return *GetAddress(); }
/**
* Overloads operator `==` to evaluate whether or not two `Iterator` instances are equal.
*
* MUST be used when the two iterators are associated with the same `Child` entry.
*
* @param[in] aOther The other `Iterator` to compare with.
*
* @retval TRUE If the two `Iterator` objects are equal.
* @retval FALSE If the two `Iterator` objects are not equal.
*
*/
bool operator==(const AddressIterator &aOther) const { return (mIndex == aOther.mIndex); }
private:
enum IteratorType : uint8_t
{
kEndIterator,
};
static constexpr uint16_t kMaxIndex = OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD;
AddressIterator(const Child &aChild, IteratorType)
: mChild(aChild)
, mIndex(kMaxIndex)
{
}
void Update(void);
const Child &mChild;
Ip6::Address::TypeFilter mFilter;
Index mIndex;
Ip6::Address mMeshLocalAddress;
};
/**
* Initializes the `Child` object.
*
* @param[in] aInstance A reference to OpenThread instance.
*
*/
void Init(Instance &aInstance) { Neighbor::Init(aInstance); }
/**
* Clears the child entry.
*
*/
void Clear(void);
/**
* Clears the IPv6 address list for the child.
*
*/
void ClearIp6Addresses(void);
/**
* Sets the device mode flags.
*
* @param[in] aMode The device mode flags.
*
*/
void SetDeviceMode(Mle::DeviceMode aMode);
/**
* Gets the mesh-local IPv6 address.
*
* @param[out] aAddress A reference to an IPv6 address to provide address (if any).
*
* @retval kErrorNone Successfully found the mesh-local address and updated @p aAddress.
* @retval kErrorNotFound No mesh-local IPv6 address in the IPv6 address list.
*
*/
Error GetMeshLocalIp6Address(Ip6::Address &aAddress) const;
/**
* Returns the Mesh Local Interface Identifier.
*
* @returns The Mesh Local Interface Identifier.
*
*/
const Ip6::InterfaceIdentifier &GetMeshLocalIid(void) const { return mMeshLocalIid; }
/**
* Enables range-based `for` loop iteration over all (or a subset of) IPv6 addresses.
*
* Should be used as follows: to iterate over all addresses
*
* for (const Ip6::Address &address : child.IterateIp6Addresses()) { ... }
*
* or to iterate over a subset of IPv6 addresses determined by a given address type filter
*
* for (const Ip6::Address &address : child.IterateIp6Addresses(Ip6::Address::kTypeMulticast)) { ... }
*
* @param[in] aFilter An IPv6 address type filter restricting iteration to certain type of addresses (default is
* to accept any address type).
*
* @returns An IteratorBuilder instance.
*
*/
AddressIteratorBuilder IterateIp6Addresses(Ip6::Address::TypeFilter aFilter = Ip6::Address::kTypeAny) const
{
return AddressIteratorBuilder(*this, aFilter);
}
/**
* Adds an IPv6 address to the list.
*
* @param[in] aAddress A reference to IPv6 address to be added.
*
* @retval kErrorNone Successfully added the new address.
* @retval kErrorAlready Address is already in the list.
* @retval kErrorNoBufs Already at maximum number of addresses. No entry available to add the new address.
* @retval kErrorInvalidArgs Address is invalid (it is the Unspecified Address).
*
*/
Error AddIp6Address(const Ip6::Address &aAddress);
/**
* Removes an IPv6 address from the list.
*
* @param[in] aAddress A reference to IPv6 address to be removed.
*
* @retval kErrorNone Successfully removed the address.
* @retval kErrorNotFound Address was not found in the list.
* @retval kErrorInvalidArgs Address is invalid (it is the Unspecified Address).
*
*/
Error RemoveIp6Address(const Ip6::Address &aAddress);
/**
* Indicates whether an IPv6 address is in the list of IPv6 addresses of the child.
*
* @param[in] aAddress A reference to IPv6 address.
*
* @retval TRUE The address exists on the list.
* @retval FALSE Address was not found in the list.
*
*/
bool HasIp6Address(const Ip6::Address &aAddress) const;
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE
/**
* Retrieves the Domain Unicast Address registered by the child.
*
* @returns A pointer to Domain Unicast Address registered by the child if there is.
*
*/
const Ip6::Address *GetDomainUnicastAddress(void) const;
#endif
/**
* Gets the child timeout.
*
* @returns The child timeout.
*
*/
uint32_t GetTimeout(void) const { return mTimeout; }
/**
* Sets the child timeout.
*
* @param[in] aTimeout The child timeout.
*
*/
void SetTimeout(uint32_t aTimeout) { mTimeout = aTimeout; }
/**
* Gets the network data version.
*
* @returns The network data version.
*
*/
uint8_t GetNetworkDataVersion(void) const { return mNetworkDataVersion; }
/**
* Sets the network data version.
*
* @param[in] aVersion The network data version.
*
*/
void SetNetworkDataVersion(uint8_t aVersion) { mNetworkDataVersion = aVersion; }
/**
* Generates a new challenge value to use during a child attach.
*
*/
void GenerateChallenge(void) { mAttachChallenge.GenerateRandom(); }
/**
* Gets the current challenge value used during attach.
*
* @returns The current challenge value.
*
*/
const Mle::TxChallenge &GetChallenge(void) const { return mAttachChallenge; }
/**
* Clears the requested TLV list.
*
*/
void ClearRequestTlvs(void) { memset(mRequestTlvs, Mle::Tlv::kInvalid, sizeof(mRequestTlvs)); }
/**
* Returns the requested TLV at index @p aIndex.
*
* @param[in] aIndex The index into the requested TLV list.
*
* @returns The requested TLV at index @p aIndex.
*
*/
uint8_t GetRequestTlv(uint8_t aIndex) const { return mRequestTlvs[aIndex]; }
/**
* Sets the requested TLV at index @p aIndex.
*
* @param[in] aIndex The index into the requested TLV list.
* @param[in] aType The TLV type.
*
*/
void SetRequestTlv(uint8_t aIndex, uint8_t aType) { mRequestTlvs[aIndex] = aType; }
/**
* Returns the supervision interval (in seconds).
*
* @returns The supervision interval (in seconds).
*
*/
uint16_t GetSupervisionInterval(void) const { return mSupervisionInterval; }
/**
* Sets the supervision interval.
*
* @param[in] aInterval The supervision interval (in seconds).
*
*/
void SetSupervisionInterval(uint16_t aInterval) { mSupervisionInterval = aInterval; }
/**
* Increments the number of seconds since last supervision of the child.
*
*/
void IncrementSecondsSinceLastSupervision(void) { mSecondsSinceSupervision++; }
/**
* Returns the number of seconds since last supervision of the child (last message to the child)
*
* @returns Number of seconds since last supervision of the child.
*
*/
uint16_t GetSecondsSinceLastSupervision(void) const { return mSecondsSinceSupervision; }
/**
* Resets the number of seconds since last supervision of the child to zero.
*
*/
void ResetSecondsSinceLastSupervision(void) { mSecondsSinceSupervision = 0; }
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE
/**
* Returns MLR state of an IPv6 multicast address.
*
* @note The @p aAddress reference MUST be from `IterateIp6Addresses()` or `AddressIterator`.
*
* @param[in] aAddress The IPv6 multicast address.
*
* @returns MLR state of the IPv6 multicast address.
*
*/
MlrState GetAddressMlrState(const Ip6::Address &aAddress) const;
/**
* Sets MLR state of an IPv6 multicast address.
*
* @note The @p aAddress reference MUST be from `IterateIp6Addresses()` or `AddressIterator`.
*
* @param[in] aAddress The IPv6 multicast address.
* @param[in] aState The target MLR state.
*
*/
void SetAddressMlrState(const Ip6::Address &aAddress, MlrState aState);
/**
* Returns if the Child has IPv6 address @p aAddress of MLR state `kMlrStateRegistered`.
*
* @param[in] aAddress The IPv6 address.
*
* @retval true If the Child has IPv6 address @p aAddress of MLR state `kMlrStateRegistered`.
* @retval false If the Child does not have IPv6 address @p aAddress of MLR state `kMlrStateRegistered`.
*
*/
bool HasMlrRegisteredAddress(const Ip6::Address &aAddress) const;
/**
* Returns if the Child has any IPv6 address of MLR state `kMlrStateRegistered`.
*
* @retval true If the Child has any IPv6 address of MLR state `kMlrStateRegistered`.
* @retval false If the Child does not have any IPv6 address of MLR state `kMlrStateRegistered`.
*
*/
bool HasAnyMlrRegisteredAddress(void) const { return mMlrRegisteredMask.HasAny(); }
/**
* Returns if the Child has any IPv6 address of MLR state `kMlrStateToRegister`.
*
* @retval true If the Child has any IPv6 address of MLR state `kMlrStateToRegister`.
* @retval false If the Child does not have any IPv6 address of MLR state `kMlrStateToRegister`.
*
*/
bool HasAnyMlrToRegisterAddress(void) const { return mMlrToRegisterMask.HasAny(); }
#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE
private:
#if OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD < 2
#error OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD should be at least set to 2.
#endif
static constexpr uint16_t kNumIp6Addresses = OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD - 1;
typedef BitVector<kNumIp6Addresses> ChildIp6AddressMask;
class AddressIteratorBuilder
{
public:
AddressIteratorBuilder(const Child &aChild, Ip6::Address::TypeFilter aFilter)
: mChild(aChild)
, mFilter(aFilter)
{
}
AddressIterator begin(void) { return AddressIterator(mChild, mFilter); }
AddressIterator end(void) { return AddressIterator(mChild, AddressIterator::kEndIterator); }
private:
const Child &mChild;
Ip6::Address::TypeFilter mFilter;
};
Ip6::InterfaceIdentifier mMeshLocalIid; ///< IPv6 address IID for mesh-local address
Ip6::Address mIp6Address[kNumIp6Addresses]; ///< Registered IPv6 addresses
uint32_t mTimeout; ///< Child timeout
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE
ChildIp6AddressMask mMlrToRegisterMask;
ChildIp6AddressMask mMlrRegisteredMask;
#endif
uint8_t mNetworkDataVersion; ///< Current Network Data version
union
{
uint8_t mRequestTlvs[kMaxRequestTlvs]; ///< Requested MLE TLVs
Mle::TxChallenge mAttachChallenge; ///< The challenge value
};
uint16_t mSupervisionInterval; // Supervision interval for the child (in sec).
uint16_t mSecondsSinceSupervision; // Number of seconds since last supervision of the child.
static_assert(OPENTHREAD_CONFIG_NUM_MESSAGE_BUFFERS < 8192, "mQueuedMessageCount cannot fit max required!");
};
DefineCoreType(otChildInfo, Child::Info);
#endif // OPENTHREAD_FTD
} // namespace ot
#endif // CHILD_HPP_
+1 -2
View File
@@ -46,12 +46,11 @@
#include "common/time_ticker.hpp"
#include "common/timer.hpp"
#include "mac/mac_types.hpp"
#include "thread/topology.hpp"
#include "thread/child.hpp"
namespace ot {
class ThreadNetif;
class Child;
/**
*
+1 -1
View File
@@ -42,7 +42,7 @@
#include "common/iterator_utils.hpp"
#include "common/locator.hpp"
#include "common/non_copyable.hpp"
#include "thread/topology.hpp"
#include "thread/child.hpp"
namespace ot {
+1 -1
View File
@@ -56,9 +56,9 @@
#include "common/time_ticker.hpp"
#include "common/timer.hpp"
#include "net/netif.hpp"
#include "thread/child.hpp"
#include "thread/thread_tlvs.hpp"
#include "thread/tmf.hpp"
#include "thread/topology.hpp"
namespace ot {
+1 -1
View File
@@ -39,9 +39,9 @@
#include "common/instance.hpp"
#include "common/locator_getters.hpp"
#include "common/message.hpp"
#include "thread/child.hpp"
#include "thread/mesh_forwarder.hpp"
#include "thread/mle_tlvs.hpp"
#include "thread/topology.hpp"
namespace ot {
+1 -1
View File
@@ -50,10 +50,10 @@
#include "mac/mac_frame.hpp"
#include "net/ip6.hpp"
#include "thread/address_resolver.hpp"
#include "thread/child.hpp"
#include "thread/indirect_sender.hpp"
#include "thread/lowpan.hpp"
#include "thread/network_data_leader.hpp"
#include "thread/topology.hpp"
namespace ot {
+2 -1
View File
@@ -48,13 +48,14 @@
#include "meshcop/joiner_router.hpp"
#include "meshcop/meshcop.hpp"
#include "net/udp6.hpp"
#include "thread/child.hpp"
#include "thread/link_metrics.hpp"
#include "thread/link_metrics_tlvs.hpp"
#include "thread/mle_tlvs.hpp"
#include "thread/mle_types.hpp"
#include "thread/neighbor_table.hpp"
#include "thread/network_data_types.hpp"
#include "thread/topology.hpp"
#include "thread/router.hpp"
namespace ot {
+2 -1
View File
@@ -47,13 +47,14 @@
#include "meshcop/meshcop_tlvs.hpp"
#include "net/icmp6.hpp"
#include "net/udp6.hpp"
#include "thread/child.hpp"
#include "thread/child_table.hpp"
#include "thread/mle.hpp"
#include "thread/mle_tlvs.hpp"
#include "thread/router.hpp"
#include "thread/router_table.hpp"
#include "thread/thread_tlvs.hpp"
#include "thread/tmf.hpp"
#include "thread/topology.hpp"
namespace ot {
namespace Mle {
+1 -1
View File
@@ -51,8 +51,8 @@
#include "common/time_ticker.hpp"
#include "common/timer.hpp"
#include "net/netif.hpp"
#include "thread/child.hpp"
#include "thread/thread_tlvs.hpp"
#include "thread/topology.hpp"
namespace ot {
+261
View File
@@ -0,0 +1,261 @@
/*
* Copyright (c) 2016-2017, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for a Thread `Neighbor`.
*/
#include "neighbor.hpp"
#include "common/array.hpp"
#include "common/code_utils.hpp"
#include "common/debug.hpp"
#include "common/instance.hpp"
#include "common/locator_getters.hpp"
#include "common/num_utils.hpp"
namespace ot {
void Neighbor::SetState(State aState)
{
VerifyOrExit(mState != aState);
mState = static_cast<uint8_t>(aState);
#if OPENTHREAD_CONFIG_UPTIME_ENABLE
if (mState == kStateValid)
{
mConnectionStart = Uptime::MsecToSec(Get<Uptime>().GetUptime());
}
#endif
exit:
return;
}
#if OPENTHREAD_CONFIG_UPTIME_ENABLE
uint32_t Neighbor::GetConnectionTime(void) const
{
return IsStateValid() ? Uptime::MsecToSec(Get<Uptime>().GetUptime()) - mConnectionStart : 0;
}
#endif
bool Neighbor::AddressMatcher::Matches(const Neighbor &aNeighbor) const
{
bool matches = false;
VerifyOrExit(aNeighbor.MatchesFilter(mStateFilter));
if (mShortAddress != Mac::kShortAddrInvalid)
{
VerifyOrExit(mShortAddress == aNeighbor.GetRloc16());
}
if (mExtAddress != nullptr)
{
VerifyOrExit(*mExtAddress == aNeighbor.GetExtAddress());
}
matches = true;
exit:
return matches;
}
void Neighbor::Info::SetFrom(const Neighbor &aNeighbor)
{
Clear();
mExtAddress = aNeighbor.GetExtAddress();
mAge = Time::MsecToSec(TimerMilli::GetNow() - aNeighbor.GetLastHeard());
mRloc16 = aNeighbor.GetRloc16();
mLinkFrameCounter = aNeighbor.GetLinkFrameCounters().GetMaximum();
mMleFrameCounter = aNeighbor.GetMleFrameCounter();
mLinkQualityIn = aNeighbor.GetLinkQualityIn();
mAverageRssi = aNeighbor.GetLinkInfo().GetAverageRss();
mLastRssi = aNeighbor.GetLinkInfo().GetLastRss();
mLinkMargin = aNeighbor.GetLinkInfo().GetLinkMargin();
mFrameErrorRate = aNeighbor.GetLinkInfo().GetFrameErrorRate();
mMessageErrorRate = aNeighbor.GetLinkInfo().GetMessageErrorRate();
mRxOnWhenIdle = aNeighbor.IsRxOnWhenIdle();
mFullThreadDevice = aNeighbor.IsFullThreadDevice();
mFullNetworkData = (aNeighbor.GetNetworkDataType() == NetworkData::kFullSet);
mVersion = aNeighbor.GetVersion();
#if OPENTHREAD_CONFIG_UPTIME_ENABLE
mConnectionTime = aNeighbor.GetConnectionTime();
#endif
}
void Neighbor::Init(Instance &aInstance)
{
InstanceLocatorInit::Init(aInstance);
mLinkInfo.Init(aInstance);
SetState(kStateInvalid);
}
bool Neighbor::IsStateValidOrAttaching(void) const
{
bool rval = false;
switch (GetState())
{
case kStateInvalid:
case kStateParentRequest:
case kStateParentResponse:
break;
case kStateRestored:
case kStateChildIdRequest:
case kStateLinkRequest:
case kStateChildUpdateRequest:
case kStateValid:
rval = true;
break;
}
return rval;
}
bool Neighbor::MatchesFilter(StateFilter aFilter) const
{
bool matches = false;
switch (aFilter)
{
case kInStateValid:
matches = IsStateValid();
break;
case kInStateValidOrRestoring:
matches = IsStateValidOrRestoring();
break;
case kInStateChildIdRequest:
matches = IsStateChildIdRequest();
break;
case kInStateValidOrAttaching:
matches = IsStateValidOrAttaching();
break;
case kInStateInvalid:
matches = IsStateInvalid();
break;
case kInStateAnyExceptInvalid:
matches = !IsStateInvalid();
break;
case kInStateAnyExceptValidOrRestoring:
matches = !IsStateValidOrRestoring();
break;
case kInStateAny:
matches = true;
break;
}
return matches;
}
#if OPENTHREAD_CONFIG_MULTI_RADIO
void Neighbor::SetLastRxFragmentTag(uint16_t aTag)
{
mLastRxFragmentTag = (aTag == 0) ? 0xffff : aTag;
mLastRxFragmentTagTime = TimerMilli::GetNow();
}
bool Neighbor::IsLastRxFragmentTagSet(void) const
{
return (mLastRxFragmentTag != 0) && (TimerMilli::GetNow() <= mLastRxFragmentTagTime + kLastRxFragmentTagTimeout);
}
#endif
#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
void Neighbor::AggregateLinkMetrics(uint8_t aSeriesId, uint8_t aFrameType, uint8_t aLqi, int8_t aRss)
{
for (LinkMetrics::SeriesInfo &entry : mLinkMetricsSeriesInfoList)
{
if (aSeriesId == 0 || aSeriesId == entry.GetSeriesId())
{
entry.AggregateLinkMetrics(aFrameType, aLqi, aRss);
}
}
}
LinkMetrics::SeriesInfo *Neighbor::GetForwardTrackingSeriesInfo(const uint8_t &aSeriesId)
{
return mLinkMetricsSeriesInfoList.FindMatching(aSeriesId);
}
void Neighbor::AddForwardTrackingSeriesInfo(LinkMetrics::SeriesInfo &aSeriesInfo)
{
mLinkMetricsSeriesInfoList.Push(aSeriesInfo);
}
LinkMetrics::SeriesInfo *Neighbor::RemoveForwardTrackingSeriesInfo(const uint8_t &aSeriesId)
{
return mLinkMetricsSeriesInfoList.RemoveMatching(aSeriesId);
}
void Neighbor::RemoveAllForwardTrackingSeriesInfo(void)
{
while (!mLinkMetricsSeriesInfoList.IsEmpty())
{
LinkMetrics::SeriesInfo *seriesInfo = mLinkMetricsSeriesInfoList.Pop();
Get<LinkMetrics::Subject>().Free(*seriesInfo);
}
}
#endif // OPENTHREAD_CONFIG_MLE_LINK_METRICS_SUBJECT_ENABLE
const char *Neighbor::StateToString(State aState)
{
static const char *const kStateStrings[] = {
"Invalid", // (0) kStateInvalid
"Restored", // (1) kStateRestored
"ParentReq", // (2) kStateParentRequest
"ParentRes", // (3) kStateParentResponse
"ChildIdReq", // (4) kStateChildIdRequest
"LinkReq", // (5) kStateLinkRequest
"ChildUpdateReq", // (6) kStateChildUpdateRequest
"Valid", // (7) kStateValid
};
static_assert(0 == kStateInvalid, "kStateInvalid value is incorrect");
static_assert(1 == kStateRestored, "kStateRestored value is incorrect");
static_assert(2 == kStateParentRequest, "kStateParentRequest value is incorrect");
static_assert(3 == kStateParentResponse, "kStateParentResponse value is incorrect");
static_assert(4 == kStateChildIdRequest, "kStateChildIdRequest value is incorrect");
static_assert(5 == kStateLinkRequest, "kStateLinkRequest value is incorrect");
static_assert(6 == kStateChildUpdateRequest, "kStateChildUpdateRequest value is incorrect");
static_assert(7 == kStateValid, "kStateValid value is incorrect");
return kStateStrings[aState];
}
} // namespace ot
@@ -28,11 +28,11 @@
/**
* @file
* This file includes definitions for maintaining Thread network topologies.
* This file includes definitions for a Thread `Neighbor`.
*/
#ifndef TOPOLOGY_HPP_
#define TOPOLOGY_HPP_
#ifndef NEIGHBOR_HPP_
#define NEIGHBOR_HPP_
#include "openthread-core-config.h"
@@ -848,708 +848,8 @@ private:
#endif
};
#if OPENTHREAD_FTD
/**
* Represents a Thread Child.
*
*/
class Child : public Neighbor,
public IndirectSender::ChildInfo,
public DataPollHandler::ChildInfo
#if OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE
,
public CslTxScheduler::ChildInfo
#endif
{
class AddressIteratorBuilder;
public:
static constexpr uint8_t kMaxRequestTlvs = 6;
/**
* Represents diagnostic information for a Thread Child.
*
*/
class Info : public otChildInfo, public Clearable<Info>
{
public:
/**
* Sets the `Info` instance from a given `Child`.
*
* @param[in] aChild A neighbor.
*
*/
void SetFrom(const Child &aChild);
};
/**
* Defines an iterator used to go through IPv6 address entries of a child.
*
*/
class AddressIterator : public Unequatable<AddressIterator>
{
friend class AddressIteratorBuilder;
public:
/**
* Represents an index indicating the current IPv6 address entry to which the iterator is pointing.
*
*/
typedef otChildIp6AddressIterator Index;
/**
* Initializes the iterator associated with a given `Child` starting from beginning of the
* IPv6 address list.
*
* @param[in] aChild A reference to a child entry.
* @param[in] aFilter An IPv6 address type filter restricting iterator to certain type of addresses.
*
*/
explicit AddressIterator(const Child &aChild, Ip6::Address::TypeFilter aFilter = Ip6::Address::kTypeAny)
: AddressIterator(aChild, 0, aFilter)
{
}
/**
* Initializes the iterator associated with a given `Child` starting from a given index
*
* @param[in] aChild A reference to the child entry.
* @param[in] aIndex An index (`Index`) with which to initialize the iterator.
* @param[in] aFilter An IPv6 address type filter restricting iterator to certain type of addresses.
*
*/
AddressIterator(const Child &aChild, Index aIndex, Ip6::Address::TypeFilter aFilter = Ip6::Address::kTypeAny)
: mChild(aChild)
, mFilter(aFilter)
, mIndex(aIndex)
{
Update();
}
/**
* Converts the iterator into an index.
*
* @returns An index corresponding to the iterator.
*
*/
Index GetAsIndex(void) const { return mIndex; }
/**
* Gets the iterator's associated `Child` entry.
*
* @returns The associated child entry.
*
*/
const Child &GetChild(void) const { return mChild; }
/**
* Gets the current `Child` IPv6 Address to which the iterator is pointing.
*
* @returns A pointer to the associated IPv6 Address, or `nullptr` if iterator is done.
*
*/
const Ip6::Address *GetAddress(void) const;
/**
* Indicates whether the iterator has reached end of the list.
*
* @retval TRUE There are no more entries in the list (reached end of the list).
* @retval FALSE The current entry is valid.
*
*/
bool IsDone(void) const { return (mIndex >= kMaxIndex); }
/**
* Overloads `++` operator (pre-increment) to advance the iterator.
*
* The iterator is moved to point to the next `Address` entry. If there are no more `Ip6::Address` entries
* `IsDone()` returns `true`.
*
*/
void operator++(void) { mIndex++, Update(); }
/**
* Overloads `++` operator (post-increment) to advance the iterator.
*
* The iterator is moved to point to the next `Address` entry. If there are no more `Ip6::Address` entries
* `IsDone()` returns `true`.
*
*/
void operator++(int) { mIndex++, Update(); }
/**
* Overloads the `*` dereference operator and gets a reference to `Ip6::Address` to which the
* iterator is currently pointing.
*
* MUST be used when the iterator is not done (i.e., `IsDone()` returns `false`).
*
* @returns A reference to the `Ip6::Address` entry currently pointed by the iterator.
*
*/
const Ip6::Address &operator*(void) const { return *GetAddress(); }
/**
* Overloads operator `==` to evaluate whether or not two `Iterator` instances are equal.
*
* MUST be used when the two iterators are associated with the same `Child` entry.
*
* @param[in] aOther The other `Iterator` to compare with.
*
* @retval TRUE If the two `Iterator` objects are equal.
* @retval FALSE If the two `Iterator` objects are not equal.
*
*/
bool operator==(const AddressIterator &aOther) const { return (mIndex == aOther.mIndex); }
private:
enum IteratorType : uint8_t
{
kEndIterator,
};
static constexpr uint16_t kMaxIndex = OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD;
AddressIterator(const Child &aChild, IteratorType)
: mChild(aChild)
, mIndex(kMaxIndex)
{
}
void Update(void);
const Child &mChild;
Ip6::Address::TypeFilter mFilter;
Index mIndex;
Ip6::Address mMeshLocalAddress;
};
/**
* Initializes the `Child` object.
*
* @param[in] aInstance A reference to OpenThread instance.
*
*/
void Init(Instance &aInstance) { Neighbor::Init(aInstance); }
/**
* Clears the child entry.
*
*/
void Clear(void);
/**
* Clears the IPv6 address list for the child.
*
*/
void ClearIp6Addresses(void);
/**
* Sets the device mode flags.
*
* @param[in] aMode The device mode flags.
*
*/
void SetDeviceMode(Mle::DeviceMode aMode);
/**
* Gets the mesh-local IPv6 address.
*
* @param[out] aAddress A reference to an IPv6 address to provide address (if any).
*
* @retval kErrorNone Successfully found the mesh-local address and updated @p aAddress.
* @retval kErrorNotFound No mesh-local IPv6 address in the IPv6 address list.
*
*/
Error GetMeshLocalIp6Address(Ip6::Address &aAddress) const;
/**
* Returns the Mesh Local Interface Identifier.
*
* @returns The Mesh Local Interface Identifier.
*
*/
const Ip6::InterfaceIdentifier &GetMeshLocalIid(void) const { return mMeshLocalIid; }
/**
* Enables range-based `for` loop iteration over all (or a subset of) IPv6 addresses.
*
* Should be used as follows: to iterate over all addresses
*
* for (const Ip6::Address &address : child.IterateIp6Addresses()) { ... }
*
* or to iterate over a subset of IPv6 addresses determined by a given address type filter
*
* for (const Ip6::Address &address : child.IterateIp6Addresses(Ip6::Address::kTypeMulticast)) { ... }
*
* @param[in] aFilter An IPv6 address type filter restricting iteration to certain type of addresses (default is
* to accept any address type).
*
* @returns An IteratorBuilder instance.
*
*/
AddressIteratorBuilder IterateIp6Addresses(Ip6::Address::TypeFilter aFilter = Ip6::Address::kTypeAny) const
{
return AddressIteratorBuilder(*this, aFilter);
}
/**
* Adds an IPv6 address to the list.
*
* @param[in] aAddress A reference to IPv6 address to be added.
*
* @retval kErrorNone Successfully added the new address.
* @retval kErrorAlready Address is already in the list.
* @retval kErrorNoBufs Already at maximum number of addresses. No entry available to add the new address.
* @retval kErrorInvalidArgs Address is invalid (it is the Unspecified Address).
*
*/
Error AddIp6Address(const Ip6::Address &aAddress);
/**
* Removes an IPv6 address from the list.
*
* @param[in] aAddress A reference to IPv6 address to be removed.
*
* @retval kErrorNone Successfully removed the address.
* @retval kErrorNotFound Address was not found in the list.
* @retval kErrorInvalidArgs Address is invalid (it is the Unspecified Address).
*
*/
Error RemoveIp6Address(const Ip6::Address &aAddress);
/**
* Indicates whether an IPv6 address is in the list of IPv6 addresses of the child.
*
* @param[in] aAddress A reference to IPv6 address.
*
* @retval TRUE The address exists on the list.
* @retval FALSE Address was not found in the list.
*
*/
bool HasIp6Address(const Ip6::Address &aAddress) const;
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_DUA_ENABLE
/**
* Retrieves the Domain Unicast Address registered by the child.
*
* @returns A pointer to Domain Unicast Address registered by the child if there is.
*
*/
const Ip6::Address *GetDomainUnicastAddress(void) const;
#endif
/**
* Gets the child timeout.
*
* @returns The child timeout.
*
*/
uint32_t GetTimeout(void) const { return mTimeout; }
/**
* Sets the child timeout.
*
* @param[in] aTimeout The child timeout.
*
*/
void SetTimeout(uint32_t aTimeout) { mTimeout = aTimeout; }
/**
* Gets the network data version.
*
* @returns The network data version.
*
*/
uint8_t GetNetworkDataVersion(void) const { return mNetworkDataVersion; }
/**
* Sets the network data version.
*
* @param[in] aVersion The network data version.
*
*/
void SetNetworkDataVersion(uint8_t aVersion) { mNetworkDataVersion = aVersion; }
/**
* Generates a new challenge value to use during a child attach.
*
*/
void GenerateChallenge(void) { mAttachChallenge.GenerateRandom(); }
/**
* Gets the current challenge value used during attach.
*
* @returns The current challenge value.
*
*/
const Mle::TxChallenge &GetChallenge(void) const { return mAttachChallenge; }
/**
* Clears the requested TLV list.
*
*/
void ClearRequestTlvs(void) { memset(mRequestTlvs, Mle::Tlv::kInvalid, sizeof(mRequestTlvs)); }
/**
* Returns the requested TLV at index @p aIndex.
*
* @param[in] aIndex The index into the requested TLV list.
*
* @returns The requested TLV at index @p aIndex.
*
*/
uint8_t GetRequestTlv(uint8_t aIndex) const { return mRequestTlvs[aIndex]; }
/**
* Sets the requested TLV at index @p aIndex.
*
* @param[in] aIndex The index into the requested TLV list.
* @param[in] aType The TLV type.
*
*/
void SetRequestTlv(uint8_t aIndex, uint8_t aType) { mRequestTlvs[aIndex] = aType; }
/**
* Returns the supervision interval (in seconds).
*
* @returns The supervision interval (in seconds).
*
*/
uint16_t GetSupervisionInterval(void) const { return mSupervisionInterval; }
/**
* Sets the supervision interval.
*
* @param[in] aInterval The supervision interval (in seconds).
*
*/
void SetSupervisionInterval(uint16_t aInterval) { mSupervisionInterval = aInterval; }
/**
* Increments the number of seconds since last supervision of the child.
*
*/
void IncrementSecondsSinceLastSupervision(void) { mSecondsSinceSupervision++; }
/**
* Returns the number of seconds since last supervision of the child (last message to the child)
*
* @returns Number of seconds since last supervision of the child.
*
*/
uint16_t GetSecondsSinceLastSupervision(void) const { return mSecondsSinceSupervision; }
/**
* Resets the number of seconds since last supervision of the child to zero.
*
*/
void ResetSecondsSinceLastSupervision(void) { mSecondsSinceSupervision = 0; }
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE
/**
* Returns MLR state of an IPv6 multicast address.
*
* @note The @p aAddress reference MUST be from `IterateIp6Addresses()` or `AddressIterator`.
*
* @param[in] aAddress The IPv6 multicast address.
*
* @returns MLR state of the IPv6 multicast address.
*
*/
MlrState GetAddressMlrState(const Ip6::Address &aAddress) const;
/**
* Sets MLR state of an IPv6 multicast address.
*
* @note The @p aAddress reference MUST be from `IterateIp6Addresses()` or `AddressIterator`.
*
* @param[in] aAddress The IPv6 multicast address.
* @param[in] aState The target MLR state.
*
*/
void SetAddressMlrState(const Ip6::Address &aAddress, MlrState aState);
/**
* Returns if the Child has IPv6 address @p aAddress of MLR state `kMlrStateRegistered`.
*
* @param[in] aAddress The IPv6 address.
*
* @retval true If the Child has IPv6 address @p aAddress of MLR state `kMlrStateRegistered`.
* @retval false If the Child does not have IPv6 address @p aAddress of MLR state `kMlrStateRegistered`.
*
*/
bool HasMlrRegisteredAddress(const Ip6::Address &aAddress) const;
/**
* Returns if the Child has any IPv6 address of MLR state `kMlrStateRegistered`.
*
* @retval true If the Child has any IPv6 address of MLR state `kMlrStateRegistered`.
* @retval false If the Child does not have any IPv6 address of MLR state `kMlrStateRegistered`.
*
*/
bool HasAnyMlrRegisteredAddress(void) const { return mMlrRegisteredMask.HasAny(); }
/**
* Returns if the Child has any IPv6 address of MLR state `kMlrStateToRegister`.
*
* @retval true If the Child has any IPv6 address of MLR state `kMlrStateToRegister`.
* @retval false If the Child does not have any IPv6 address of MLR state `kMlrStateToRegister`.
*
*/
bool HasAnyMlrToRegisterAddress(void) const { return mMlrToRegisterMask.HasAny(); }
#endif // OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE
private:
#if OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD < 2
#error OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD should be at least set to 2.
#endif
static constexpr uint16_t kNumIp6Addresses = OPENTHREAD_CONFIG_MLE_IP_ADDRS_PER_CHILD - 1;
typedef BitVector<kNumIp6Addresses> ChildIp6AddressMask;
class AddressIteratorBuilder
{
public:
AddressIteratorBuilder(const Child &aChild, Ip6::Address::TypeFilter aFilter)
: mChild(aChild)
, mFilter(aFilter)
{
}
AddressIterator begin(void) { return AddressIterator(mChild, mFilter); }
AddressIterator end(void) { return AddressIterator(mChild, AddressIterator::kEndIterator); }
private:
const Child &mChild;
Ip6::Address::TypeFilter mFilter;
};
Ip6::InterfaceIdentifier mMeshLocalIid; ///< IPv6 address IID for mesh-local address
Ip6::Address mIp6Address[kNumIp6Addresses]; ///< Registered IPv6 addresses
uint32_t mTimeout; ///< Child timeout
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE
ChildIp6AddressMask mMlrToRegisterMask;
ChildIp6AddressMask mMlrRegisteredMask;
#endif
uint8_t mNetworkDataVersion; ///< Current Network Data version
union
{
uint8_t mRequestTlvs[kMaxRequestTlvs]; ///< Requested MLE TLVs
Mle::TxChallenge mAttachChallenge; ///< The challenge value
};
uint16_t mSupervisionInterval; // Supervision interval for the child (in sec).
uint16_t mSecondsSinceSupervision; // Number of seconds since last supervision of the child.
static_assert(OPENTHREAD_CONFIG_NUM_MESSAGE_BUFFERS < 8192, "mQueuedMessageCount cannot fit max required!");
};
#endif // OPENTHREAD_FTD
class Parent;
/**
* Represents a Thread Router
*
*/
class Router : public Neighbor
{
public:
/**
* Represents diagnostic information for a Thread Router.
*
*/
class Info : public otRouterInfo, public Clearable<Info>
{
public:
/**
* Sets the `Info` instance from a given `Router`.
*
* @param[in] aRouter A router.
*
*/
void SetFrom(const Router &aRouter);
/**
* Sets the `Info` instance from a given `Parent`.
*
* @param[in] aParent A parent.
*
*/
void SetFrom(const Parent &aParent);
};
/**
* Initializes the `Router` object.
*
* @param[in] aInstance A reference to OpenThread instance.
*
*/
void Init(Instance &aInstance) { Neighbor::Init(aInstance); }
/**
* Clears the router entry.
*
*/
void Clear(void);
/**
* Sets the `Router` entry from a `Parent`
*
*/
void SetFrom(const Parent &aParent);
/**
* Gets the router ID of the next hop to this router.
*
* @returns The router ID of the next hop to this router.
*
*/
uint8_t GetNextHop(void) const { return mNextHop; }
/**
* Gets the link quality out value for this router.
*
* @returns The link quality out value for this router.
*
*/
LinkQuality GetLinkQualityOut(void) const { return static_cast<LinkQuality>(mLinkQualityOut); }
/**
* Sets the link quality out value for this router.
*
* @param[in] aLinkQuality The link quality out value for this router.
*
*/
void SetLinkQualityOut(LinkQuality aLinkQuality) { mLinkQualityOut = aLinkQuality; }
/**
* Gets the two-way link quality value (minimum of link quality in and out).
*
* @returns The two-way link quality value.
*
*/
LinkQuality GetTwoWayLinkQuality(void) const;
/**
* Get the route cost to this router.
*
* @returns The route cost to this router.
*
*/
uint8_t GetCost(void) const { return mCost; }
/**
* Sets the next hop and cost to this router.
*
* @param[in] aNextHop The Router ID of the next hop to this router.
* @param[in] aCost The cost to this router.
*
* @retval TRUE If there was a change, i.e., @p aNextHop or @p aCost were different from their previous values.
* @retval FALSE If no change to next hop and cost values (new values are the same as before).
*
*/
bool SetNextHopAndCost(uint8_t aNextHop, uint8_t aCost);
/**
* Sets the next hop to this router as invalid and clears the cost.
*
* @retval TRUE If there was a change (next hop was valid before).
* @retval FALSE No change to next hop (next hop was invalid before).
*
*/
bool SetNextHopToInvalid(void);
private:
uint8_t mNextHop; ///< The next hop towards this router
uint8_t mLinkQualityOut : 2; ///< The link quality out for this router
#if OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
uint8_t mCost; ///< The cost to this router via neighbor router
#else
uint8_t mCost : 4; ///< The cost to this router via neighbor router
#endif
};
/**
* Represent parent of a child node.
*
*/
class Parent : public Router
{
public:
/**
* Initializes the `Parent`.
*
* @param[in] aInstance A reference to OpenThread instance.
*
*/
void Init(Instance &aInstance)
{
Neighbor::Init(aInstance);
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
mCslAccuracy.Init();
#endif
}
/**
* Clears the parent entry.
*
*/
void Clear(void);
/**
* Gets route cost from parent to leader.
*
* @returns The route cost from parent to leader
*
*/
uint8_t GetLeaderCost(void) const { return mLeaderCost; }
/**
* Sets route cost from parent to leader.
*
* @param[in] aLaderConst The route cost.
*
*/
void SetLeaderCost(uint8_t aLeaderCost) { mLeaderCost = aLeaderCost; }
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
/**
* Gets the CSL accuracy (clock accuracy and uncertainty).
*
* @returns The CSL accuracy.
*
*/
const Mac::CslAccuracy &GetCslAccuracy(void) const { return mCslAccuracy; }
/**
* Sets CSL accuracy.
*
* @param[in] aCslAccuracy The CSL accuracy.
*
*/
void SetCslAccuracy(const Mac::CslAccuracy &aCslAccuracy) { mCslAccuracy = aCslAccuracy; }
#endif
private:
uint8_t mLeaderCost;
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
Mac::CslAccuracy mCslAccuracy; // CSL accuracy (clock accuracy in ppm and uncertainty).
#endif
};
DefineCoreType(otNeighborInfo, Neighbor::Info);
#if OPENTHREAD_FTD
DefineCoreType(otChildInfo, Child::Info);
#endif
DefineCoreType(otRouterInfo, Router::Info);
} // namespace ot
#endif // TOPOLOGY_HPP_
#endif // NEIGHBOR_HPP_
+1 -1
View File
@@ -38,7 +38,7 @@
#include "common/locator.hpp"
#include "common/non_copyable.hpp"
#include "thread/topology.hpp"
#include "thread/neighbor.hpp"
namespace ot {
+2 -1
View File
@@ -45,10 +45,11 @@
#include "common/tlvs.hpp"
#include "net/ip6_address.hpp"
#include "radio/radio.hpp"
#include "thread/child.hpp"
#include "thread/link_quality.hpp"
#include "thread/mle_tlvs.hpp"
#include "thread/mle_types.hpp"
#include "thread/topology.hpp"
#include "thread/router.hpp"
namespace ot {
namespace NetworkDiagnostic {
+120
View File
@@ -0,0 +1,120 @@
/*
* Copyright (c) 2016-2017, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions for Thread `Router` and `Parent`.
*/
#include "router.hpp"
#include "common/array.hpp"
#include "common/code_utils.hpp"
#include "common/debug.hpp"
#include "common/instance.hpp"
#include "common/locator_getters.hpp"
#include "common/num_utils.hpp"
namespace ot {
void Router::Info::SetFrom(const Router &aRouter)
{
Clear();
mRloc16 = aRouter.GetRloc16();
mRouterId = Mle::RouterIdFromRloc16(mRloc16);
mExtAddress = aRouter.GetExtAddress();
mAllocated = true;
mNextHop = aRouter.GetNextHop();
mLinkEstablished = aRouter.IsStateValid();
mPathCost = aRouter.GetCost();
mLinkQualityIn = aRouter.GetLinkQualityIn();
mLinkQualityOut = aRouter.GetLinkQualityOut();
mAge = static_cast<uint8_t>(Time::MsecToSec(TimerMilli::GetNow() - aRouter.GetLastHeard()));
mVersion = ClampToUint8(aRouter.GetVersion());
}
void Router::Info::SetFrom(const Parent &aParent)
{
SetFrom(static_cast<const Router &>(aParent));
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
mCslClockAccuracy = aParent.GetCslAccuracy().GetClockAccuracy();
mCslUncertainty = aParent.GetCslAccuracy().GetUncertainty();
#endif
}
void Router::Clear(void)
{
Instance &instance = GetInstance();
memset(reinterpret_cast<void *>(this), 0, sizeof(Router));
Init(instance);
}
LinkQuality Router::GetTwoWayLinkQuality(void) const { return Min(GetLinkQualityIn(), GetLinkQualityOut()); }
void Router::SetFrom(const Parent &aParent)
{
// We use an intermediate pointer to copy `aParent` to silence
// code checkers warning about object slicing (assigning a
// sub-class to base class instance).
const Router *parentAsRouter = &aParent;
*this = *parentAsRouter;
}
void Parent::Clear(void)
{
Instance &instance = GetInstance();
memset(reinterpret_cast<void *>(this), 0, sizeof(Parent));
Init(instance);
}
bool Router::SetNextHopAndCost(uint8_t aNextHop, uint8_t aCost)
{
bool changed = false;
if (mNextHop != aNextHop)
{
mNextHop = aNextHop;
changed = true;
}
if (mCost != aCost)
{
mCost = aCost;
changed = true;
}
return changed;
}
bool Router::SetNextHopToInvalid(void) { return SetNextHopAndCost(Mle::kInvalidRouterId, 0); }
} // namespace ot
+240
View File
@@ -0,0 +1,240 @@
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* @file
* This file includes definitions Thread `Router` and `Parent`.
*/
#ifndef ROUTER_HPP_
#define ROUTER_HPP_
#include "openthread-core-config.h"
#include "thread/neighbor.hpp"
namespace ot {
class Parent;
/**
* Represents a Thread Router
*
*/
class Router : public Neighbor
{
public:
/**
* Represents diagnostic information for a Thread Router.
*
*/
class Info : public otRouterInfo, public Clearable<Info>
{
public:
/**
* Sets the `Info` instance from a given `Router`.
*
* @param[in] aRouter A router.
*
*/
void SetFrom(const Router &aRouter);
/**
* Sets the `Info` instance from a given `Parent`.
*
* @param[in] aParent A parent.
*
*/
void SetFrom(const Parent &aParent);
};
/**
* Initializes the `Router` object.
*
* @param[in] aInstance A reference to OpenThread instance.
*
*/
void Init(Instance &aInstance) { Neighbor::Init(aInstance); }
/**
* Clears the router entry.
*
*/
void Clear(void);
/**
* Sets the `Router` entry from a `Parent`
*
*/
void SetFrom(const Parent &aParent);
/**
* Gets the router ID of the next hop to this router.
*
* @returns The router ID of the next hop to this router.
*
*/
uint8_t GetNextHop(void) const { return mNextHop; }
/**
* Gets the link quality out value for this router.
*
* @returns The link quality out value for this router.
*
*/
LinkQuality GetLinkQualityOut(void) const { return static_cast<LinkQuality>(mLinkQualityOut); }
/**
* Sets the link quality out value for this router.
*
* @param[in] aLinkQuality The link quality out value for this router.
*
*/
void SetLinkQualityOut(LinkQuality aLinkQuality) { mLinkQualityOut = aLinkQuality; }
/**
* Gets the two-way link quality value (minimum of link quality in and out).
*
* @returns The two-way link quality value.
*
*/
LinkQuality GetTwoWayLinkQuality(void) const;
/**
* Get the route cost to this router.
*
* @returns The route cost to this router.
*
*/
uint8_t GetCost(void) const { return mCost; }
/**
* Sets the next hop and cost to this router.
*
* @param[in] aNextHop The Router ID of the next hop to this router.
* @param[in] aCost The cost to this router.
*
* @retval TRUE If there was a change, i.e., @p aNextHop or @p aCost were different from their previous values.
* @retval FALSE If no change to next hop and cost values (new values are the same as before).
*
*/
bool SetNextHopAndCost(uint8_t aNextHop, uint8_t aCost);
/**
* Sets the next hop to this router as invalid and clears the cost.
*
* @retval TRUE If there was a change (next hop was valid before).
* @retval FALSE No change to next hop (next hop was invalid before).
*
*/
bool SetNextHopToInvalid(void);
private:
uint8_t mNextHop; ///< The next hop towards this router
uint8_t mLinkQualityOut : 2; ///< The link quality out for this router
#if OPENTHREAD_CONFIG_MLE_LONG_ROUTES_ENABLE
uint8_t mCost; ///< The cost to this router via neighbor router
#else
uint8_t mCost : 4; ///< The cost to this router via neighbor router
#endif
};
/**
* Represent parent of a child node.
*
*/
class Parent : public Router
{
public:
/**
* Initializes the `Parent`.
*
* @param[in] aInstance A reference to OpenThread instance.
*
*/
void Init(Instance &aInstance)
{
Neighbor::Init(aInstance);
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
mCslAccuracy.Init();
#endif
}
/**
* Clears the parent entry.
*
*/
void Clear(void);
/**
* Gets route cost from parent to leader.
*
* @returns The route cost from parent to leader
*
*/
uint8_t GetLeaderCost(void) const { return mLeaderCost; }
/**
* Sets route cost from parent to leader.
*
* @param[in] aLeaderCost The route cost.
*
*/
void SetLeaderCost(uint8_t aLeaderCost) { mLeaderCost = aLeaderCost; }
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
/**
* Gets the CSL accuracy (clock accuracy and uncertainty).
*
* @returns The CSL accuracy.
*
*/
const Mac::CslAccuracy &GetCslAccuracy(void) const { return mCslAccuracy; }
/**
* Sets CSL accuracy.
*
* @param[in] aCslAccuracy The CSL accuracy.
*
*/
void SetCslAccuracy(const Mac::CslAccuracy &aCslAccuracy) { mCslAccuracy = aCslAccuracy; }
#endif
private:
uint8_t mLeaderCost;
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
Mac::CslAccuracy mCslAccuracy; // CSL accuracy (clock accuracy in ppm and uncertainty).
#endif
};
DefineCoreType(otRouterInfo, Router::Info);
} // namespace ot
#endif // ROUTER_HPP_
+1 -1
View File
@@ -44,8 +44,8 @@
#include "mac/mac_types.hpp"
#include "thread/mle_tlvs.hpp"
#include "thread/mle_types.hpp"
#include "thread/router.hpp"
#include "thread/thread_tlvs.hpp"
#include "thread/topology.hpp"
namespace ot {
+1 -1
View File
@@ -42,9 +42,9 @@
#include "common/log.hpp"
#include "mac/mac_types.hpp"
#include "radio/radio.hpp"
#include "thread/child.hpp"
#include "thread/mesh_forwarder.hpp"
#include "thread/thread_netif.hpp"
#include "thread/topology.hpp"
namespace ot {
+1 -1
View File
@@ -49,8 +49,8 @@
#include "mac/mac_frame.hpp"
#include "mac/mac_types.hpp"
#include "net/ip6_address.hpp"
#include "thread/neighbor.hpp"
#include "thread/neighbor_table.hpp"
#include "thread/topology.hpp"
namespace ot {
namespace Utils {
+1 -1
View File
@@ -33,7 +33,7 @@
#include "test_util.h"
#include "common/code_utils.hpp"
#include "common/instance.hpp"
#include "thread/topology.hpp"
#include "thread/child.hpp"
namespace ot {
+1 -1
View File
@@ -33,7 +33,7 @@
#include <openthread/platform/toolchain.h>
#include "test_util.h"
#include "thread/topology.hpp"
#include "thread/neighbor.hpp"
extern "C" {
uint32_t otNetifAddress_Size_c();