From a5c3fb6aaf0fa3452370393b8c97789f4a78075c Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Tue, 11 Apr 2017 13:25:11 -0700 Subject: [PATCH] Add accessor methods to neighbor/child/router objects. (#1577) --- src/core/api/thread_api.cpp | 24 +- src/core/mac/mac.cpp | 26 +- src/core/thread/address_resolver.cpp | 28 +- src/core/thread/key_manager.cpp | 18 +- src/core/thread/mesh_forwarder.cpp | 108 ++-- src/core/thread/mle.cpp | 96 +-- src/core/thread/mle_router.cpp | 754 +++++++++++------------ src/core/thread/network_diagnostic.cpp | 10 +- src/core/thread/src_match_controller.cpp | 34 +- src/core/thread/thread_tlvs.hpp | 13 +- src/core/thread/topology.hpp | 667 ++++++++++++++++++-- tests/unit/test_toolchain.cpp | 4 +- 12 files changed, 1176 insertions(+), 606 deletions(-) diff --git a/src/core/api/thread_api.cpp b/src/core/api/thread_api.cpp index 51d46c480..5eec0299e 100644 --- a/src/core/api/thread_api.cpp +++ b/src/core/api/thread_api.cpp @@ -479,17 +479,17 @@ ThreadError otThreadGetParentInfo(otInstance *aInstance, otRouterInfo *aParentIn VerifyOrExit(aParentInfo != NULL, error = kThreadError_InvalidArgs); parent = aInstance->mThreadNetif.GetMle().GetParent(); - memcpy(aParentInfo->mExtAddress.m8, parent->mMacAddr.m8, OT_EXT_ADDRESS_SIZE); + memcpy(aParentInfo->mExtAddress.m8, &parent->GetExtAddress(), sizeof(aParentInfo->mExtAddress)); - aParentInfo->mRloc16 = parent->mValid.mRloc16; - aParentInfo->mRouterId = Mle::Mle::GetRouterId(parent->mValid.mRloc16); - aParentInfo->mNextHop = parent->mNextHop; - aParentInfo->mPathCost = parent->mCost; - aParentInfo->mLinkQualityIn = parent->mLinkInfo.GetLinkQuality(aInstance->mThreadNetif.GetMac().GetNoiseFloor()); - aParentInfo->mLinkQualityOut = parent->mLinkQualityOut; - aParentInfo->mAge = static_cast(Timer::MsecToSec(Timer::GetNow() - parent->mLastHeard)); - aParentInfo->mAllocated = parent->mAllocated; - aParentInfo->mLinkEstablished = parent->mState == Neighbor::kStateValid; + aParentInfo->mRloc16 = parent->GetRloc16(); + aParentInfo->mRouterId = Mle::Mle::GetRouterId(parent->GetRloc16()); + aParentInfo->mNextHop = parent->GetNextHop(); + aParentInfo->mPathCost = parent->GetCost(); + aParentInfo->mLinkQualityIn = parent->GetLinkInfo().GetLinkQuality(aInstance->mThreadNetif.GetMac().GetNoiseFloor()); + aParentInfo->mLinkQualityOut = parent->GetLinkQualityOut(); + aParentInfo->mAge = static_cast(Timer::MsecToSec(Timer::GetNow() - parent->GetLastHeard())); + aParentInfo->mAllocated = parent->IsAllocated(); + aParentInfo->mLinkEstablished = parent->GetState() == Neighbor::kStateValid; exit: return error; @@ -503,7 +503,7 @@ ThreadError otThreadGetParentAverageRssi(otInstance *aInstance, int8_t *aParentR VerifyOrExit(aParentRssi != NULL, error = kThreadError_InvalidArgs); parent = aInstance->mThreadNetif.GetMle().GetParent(); - *aParentRssi = parent->mLinkInfo.GetAverageRss(); + *aParentRssi = parent->GetLinkInfo().GetAverageRss(); VerifyOrExit(*aParentRssi != LinkQualityInfo::kUnknownRss, error = kThreadError_Failed); @@ -519,7 +519,7 @@ ThreadError otThreadGetParentLastRssi(otInstance *aInstance, int8_t *aLastRssi) VerifyOrExit(aLastRssi != NULL, error = kThreadError_InvalidArgs); parent = aInstance->mThreadNetif.GetMle().GetParent(); - *aLastRssi = parent->mLinkInfo.GetLastRss(); + *aLastRssi = parent->GetLinkInfo().GetLastRss(); VerifyOrExit(*aLastRssi != LinkQualityInfo::kUnknownRss, error = kThreadError_Failed); diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index ae111c055..a257f235d 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -1182,19 +1182,19 @@ ThreadError Mac::ProcessReceiveSecurity(Frame &aFrame, const Address &aSrcAddr, // the tag/MIC. Such a frame is later filtered in `RxDoneTask` which only allows MAC // Data Request frames from a child being restored. - if (aNeighbor->mState == Neighbor::kStateValid) + if (aNeighbor->GetState() == Neighbor::kStateValid) { - if (keySequence < aNeighbor->mKeySequence) + if (keySequence < aNeighbor->GetKeySequence()) { ExitNow(error = kThreadError_Security); } - else if (keySequence == aNeighbor->mKeySequence) + else if (keySequence == aNeighbor->GetKeySequence()) { - if ((frameCounter + 1) < aNeighbor->mValid.mLinkFrameCounter) + if ((frameCounter + 1) < aNeighbor->GetLinkFrameCounter()) { ExitNow(error = kThreadError_Security); } - else if ((frameCounter + 1) == aNeighbor->mValid.mLinkFrameCounter) + else if ((frameCounter + 1) == aNeighbor->GetLinkFrameCounter()) { // drop duplicated packets ExitNow(error = kThreadError_Duplicated); @@ -1227,15 +1227,15 @@ ThreadError Mac::ProcessReceiveSecurity(Frame &aFrame, const Address &aSrcAddr, VerifyOrExit(memcmp(tag, aFrame.GetFooter(), tagLength) == 0, error = kThreadError_Security); - if ((keyIdMode == Frame::kKeyIdMode1) && (aNeighbor->mState == Neighbor::kStateValid)) + if ((keyIdMode == Frame::kKeyIdMode1) && (aNeighbor->GetState() == Neighbor::kStateValid)) { - if (aNeighbor->mKeySequence != keySequence) + if (aNeighbor->GetKeySequence() != keySequence) { - aNeighbor->mKeySequence = keySequence; - aNeighbor->mValid.mMleFrameCounter = 0; + aNeighbor->SetKeySequence(keySequence); + aNeighbor->SetMleFrameCounter(0); } - aNeighbor->mValid.mLinkFrameCounter = frameCounter + 1; + aNeighbor->SetLinkFrameCounter(frameCounter + 1); if (keySequence > mNetif.GetKeyManager().GetCurrentKeySequence()) { @@ -1316,7 +1316,7 @@ void Mac::ReceiveDoneTask(Frame *aFrame, ThreadError aError) } srcaddr.mLength = sizeof(srcaddr.mExtAddress); - memcpy(&srcaddr.mExtAddress, &neighbor->mMacAddr, sizeof(srcaddr.mExtAddress)); + srcaddr.mExtAddress = neighbor->GetExtAddress(); break; case sizeof(ExtAddress): @@ -1390,11 +1390,11 @@ void Mac::ReceiveDoneTask(Frame *aFrame, ThreadError aError) if (neighbor != NULL) { - neighbor->mLinkInfo.AddRss(mNoiseFloor, aFrame->mPower); + neighbor->GetLinkInfo().AddRss(mNoiseFloor, aFrame->mPower); if (aFrame->GetSecurityEnabled() == true) { - switch (neighbor->mState) + switch (neighbor->GetState()) { case Neighbor::kStateValid: break; diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index 99d52a8ee..87e5d2b8a 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -462,22 +462,22 @@ void AddressResolver::HandleAddressError(Coap::Header &aHeader, Message &aMessag for (int i = 0; i < numChildren; i++) { - if (children[i].mState != Neighbor::kStateValid || (children[i].mMode & Mle::ModeTlv::kModeFFD) != 0) + if (children[i].GetState() != Neighbor::kStateValid || children[i].IsFullThreadDevice()) { continue; } - for (int j = 0; j < Child::kMaxIp6AddressPerChild; j++) + for (uint8_t j = 0; j < Child::kMaxIp6AddressPerChild; j++) { - if (memcmp(&children[i].mIp6Address[j], targetTlv.GetTarget(), sizeof(children[i].mIp6Address[j])) == 0 && - memcmp(&children[i].mMacAddr, &macAddr, sizeof(children[i].mMacAddr))) + if (children[i].GetIp6Address(j) == *targetTlv.GetTarget() && + memcmp(&children[i].GetExtAddress(), &macAddr, sizeof(macAddr))) { // Target EID matches child address and Mesh Local EID differs on child - memset(&children[i].mIp6Address[j], 0, sizeof(children[i].mIp6Address[j])); + memset(&children[i].GetIp6Address(j), 0, sizeof(children[i].GetIp6Address(j))); memset(&destination, 0, sizeof(destination)); destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(children[i].mMacAddr); + destination.SetIid(children[i].GetExtAddress()); SendAddressError(targetTlv, mlIidTlv, &destination); ExitNow(); @@ -529,24 +529,22 @@ void AddressResolver::HandleAddressQuery(Coap::Header &aHeader, Message &aMessag for (int i = 0; i < numChildren; i++) { - if (children[i].mState != Neighbor::kStateValid || - (children[i].mMode & Mle::ModeTlv::kModeFFD) != 0 || - children[i].mLinkFailures >= Mle::kFailedChildTransmissions) + if (children[i].GetState() != Neighbor::kStateValid || + children[i].IsFullThreadDevice() || + children[i].GetLinkFailures() >= Mle::kFailedChildTransmissions) { continue; } - for (int j = 0; j < Child::kMaxIp6AddressPerChild; j++) + for (uint8_t j = 0; j < Child::kMaxIp6AddressPerChild; j++) { - if (memcmp(&children[i].mIp6Address[j], targetTlv.GetTarget(), sizeof(children[i].mIp6Address[j]))) + if (children[i].GetIp6Address(j) != *targetTlv.GetTarget()) { continue; } - children[i].mMacAddr.m8[0] ^= 0x2; - mlIidTlv.SetIid(children[i].mMacAddr.m8); - children[i].mMacAddr.m8[0] ^= 0x2; - lastTransactionTimeTlv.SetTime(Timer::GetNow() - children[i].mLastHeard); + mlIidTlv.SetIid(children[i].GetExtAddress()); + lastTransactionTimeTlv.SetTime(Timer::GetNow() - children[i].GetLastHeard()); SendAddressQueryResponse(targetTlv, mlIidTlv, &lastTransactionTimeTlv, aMessageInfo.GetPeerAddr()); ExitNow(); } diff --git a/src/core/thread/key_manager.cpp b/src/core/thread/key_manager.cpp index e6faacdc8..dc2249a24 100644 --- a/src/core/thread/key_manager.cpp +++ b/src/core/thread/key_manager.cpp @@ -100,18 +100,18 @@ ThreadError KeyManager::SetMasterKey(const void *aKey, uint8_t aKeyLength) // reset parent frame counters routers = mNetif.GetMle().GetParent(); - routers->mKeySequence = 0; - routers->mValid.mLinkFrameCounter = 0; - routers->mValid.mMleFrameCounter = 0; + routers->SetKeySequence(0); + routers->SetLinkFrameCounter(0); + routers->SetMleFrameCounter(0); // reset router frame counters routers = mNetif.GetMle().GetRouters(&num); for (uint8_t i = 0; i < num; i++) { - routers[i].mKeySequence = 0; - routers[i].mValid.mLinkFrameCounter = 0; - routers[i].mValid.mMleFrameCounter = 0; + routers[i].SetKeySequence(0); + routers[i].SetLinkFrameCounter(0); + routers[i].SetMleFrameCounter(0); } // reset child frame counters @@ -119,9 +119,9 @@ ThreadError KeyManager::SetMasterKey(const void *aKey, uint8_t aKeyLength) for (uint8_t i = 0; i < num; i++) { - children[i].mKeySequence = 0; - children[i].mValid.mLinkFrameCounter = 0; - children[i].mValid.mMleFrameCounter = 0; + children[i].SetKeySequence(0); + children[i].SetLinkFrameCounter(0); + children[i].SetMleFrameCounter(0); } mNetif.SetStateChangedFlags(OT_NET_KEY_SEQUENCE_COUNTER); diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index b5a12a084..fd1d73de2 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -185,7 +185,7 @@ void MeshForwarder::ClearChildIndirectMessages(Child &aChild) { Message *nextMessage; - VerifyOrExit(aChild.GetQueuedMessageCount() > 0); + VerifyOrExit(aChild.GetIndirectMessageCount() > 0); for (Message *message = mSendQueue.GetHead(); message; message = nextMessage) { @@ -222,7 +222,7 @@ void MeshForwarder::UpdateIndirectMessages(void) { Child *child = &children[i]; - if (child->IsStateValidOrRestoring() || (child->GetQueuedMessageCount() == 0)) + if (child->IsStateValidOrRestoring() || (child->GetIndirectMessageCount() == 0)) { continue; } @@ -254,12 +254,12 @@ void MeshForwarder::ScheduleTransmissionTask(void) { Child &child = children[i]; - if (!child.IsStateValidOrRestoring() || !child.mDataRequest) + if (!child.IsStateValidOrRestoring() || !child.IsDataRequestPending()) { continue; } - mSendMessage = child.mIndirectSendInfo.mMessage; + mSendMessage = child.GetIndirectMessage(); mSendMessageMaxMacTxAttempts = Mac::kIndirectFrameMacTxAttempts; if (mSendMessage == NULL) @@ -275,13 +275,13 @@ void MeshForwarder::ScheduleTransmissionTask(void) { // A NULL `mSendMessage` triggers an empty frame to be sent to the child. - if (child.ShouldUseShortAddress()) + if (child.IsIndirectSourceMatchShort()) { mMacSource.mLength = sizeof(mMacSource.mShortAddress); mMacSource.mShortAddress = mNetif.GetMac().GetShortAddress(); mMacDest.mLength = sizeof(mMacDest.mShortAddress); - mMacDest.mShortAddress = child.mValid.mRloc16; + mMacDest.mShortAddress = child.GetRloc16(); } else { @@ -289,7 +289,7 @@ void MeshForwarder::ScheduleTransmissionTask(void) memcpy(mMacSource.mExtAddress.m8, mNetif.GetMac().GetExtAddress(), sizeof(mMacDest.mExtAddress)); mMacDest.mLength = sizeof(mMacDest.mExtAddress); - memcpy(mMacDest.mExtAddress.m8, child.mMacAddr.m8, sizeof(mMacDest.mExtAddress)); + mMacDest.mExtAddress = child.GetExtAddress(); } } @@ -339,8 +339,7 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage) for (uint8_t i = 0; i < numChildren; i++, child++) { - if (child->IsStateValidOrRestoring() && - (child->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0) + if (child->IsStateValidOrRestoring() && !child->IsRxOnWhenIdle()) { aMessage.SetChildMask(i); mSourceMatchController.IncrementMessageCount(*child); @@ -349,7 +348,7 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage) } } else if ((neighbor = mNetif.GetMle().GetNeighbor(ip6Header.GetDestination())) != NULL && - (neighbor->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0 && + !neighbor->IsRxOnWhenIdle() && !aMessage.GetDirectTransmission()) { // destined for a sleepy child @@ -373,7 +372,7 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage) IgnoreReturnValue(meshHeader.Init(aMessage)); if ((neighbor = mNetif.GetMle().GetNeighbor(meshHeader.GetDestination())) != NULL && - (neighbor->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0) + !neighbor->IsRxOnWhenIdle()) { // destined for a sleepy child child = static_cast(neighbor); @@ -470,24 +469,24 @@ Message *MeshForwarder::GetIndirectTransmission(Child &aChild) } } - aChild.mIndirectSendInfo.mMessage = message; - aChild.mIndirectSendInfo.mFragmentOffset = 0; - aChild.mIndirectSendInfo.mTxAttemptCounter = 0; + aChild.SetIndirectMessage(message); + aChild.SetIndirectFragmentOffset(0); + aChild.ResetIndirectTxAttempts(); return message; } void MeshForwarder::PrepareIndirectTransmission(Message &aMessage, const Child &aChild) { - if (aChild.mIndirectSendInfo.mTxAttemptCounter > 0) + if (aChild.GetIndirectTxAttempts() > 0) { mSendMessageIsARetransmission = true; - mSendMessageFrameCounter = aChild.mIndirectSendInfo.mFrameCounter; - mSendMessageKeyId = aChild.mIndirectSendInfo.mKeyId; - mSendMessageDataSequenceNumber = aChild.mIndirectSendInfo.mDataSequenceNumber; + mSendMessageFrameCounter = aChild.GetIndirectFrameCounter(); + mSendMessageKeyId = aChild.GetIndirectKeyId(); + mSendMessageDataSequenceNumber = aChild.GetIndirectDataSequenceNumber(); } - aMessage.SetOffset(aChild.mIndirectSendInfo.mFragmentOffset); + aMessage.SetOffset(aChild.GetIndirectFragmentOffset()); switch (aMessage.GetType()) { @@ -506,15 +505,15 @@ void MeshForwarder::PrepareIndirectTransmission(Message &aMessage, const Child & } else { - if (aChild.ShouldUseShortAddress()) + if (aChild.IsIndirectSourceMatchShort()) { mMacDest.mLength = sizeof(mMacDest.mShortAddress); - mMacDest.mShortAddress = aChild.mValid.mRloc16; + mMacDest.mShortAddress = aChild.GetRloc16(); } else { mMacDest.mLength = sizeof(mMacDest.mExtAddress); - memcpy(mMacDest.mExtAddress.m8, aChild.mMacAddr.m8, sizeof(mMacDest.mExtAddress)); + mMacDest.mExtAddress = aChild.GetExtAddress(); } } @@ -568,7 +567,7 @@ ThreadError MeshForwarder::UpdateMeshRoute(Message &aMessage) } mMacDest.mLength = sizeof(mMacDest.mShortAddress); - mMacDest.mShortAddress = neighbor->mValid.mRloc16; + mMacDest.mShortAddress = neighbor->GetRloc16(); mMacSource.mLength = sizeof(mMacSource.mShortAddress); mMacSource.mShortAddress = mNetif.GetMac().GetShortAddress(); @@ -696,7 +695,7 @@ ThreadError MeshForwarder::UpdateIp6Route(Message &aMessage) } else if ((neighbor = mNetif.GetMle().GetNeighbor(ip6Header.GetDestination())) != NULL) { - mMeshDest = neighbor->mValid.mRloc16; + mMeshDest = neighbor->GetRloc16(); } else if (mNetif.GetNetworkDataLeader().IsOnMesh(ip6Header.GetDestination())) { @@ -911,8 +910,8 @@ ThreadError MeshForwarder::HandleFrameRequest(Mac::Frame &aFrame) // already checked and handled in `SendFragment()` method. if (((child = mNetif.GetMle().GetChild(macDest)) != NULL) - && ((child->mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0) - && (child->GetQueuedMessageCount() > 1)) + && !child->IsRxOnWhenIdle() + && (child->GetIndirectMessageCount() > 1)) { aFrame.SetFramePending(true); } @@ -979,12 +978,12 @@ ThreadError MeshForwarder::SendPoll(Message &aMessage, Mac::Frame &aFrame) if (macSource.mLength == 2) { - aFrame.SetDstAddr(neighbor->mValid.mRloc16); + aFrame.SetDstAddr(neighbor->GetRloc16()); aFrame.SetSrcAddr(macSource.mShortAddress); } else { - aFrame.SetDstAddr(neighbor->mMacAddr); + aFrame.SetDstAddr(neighbor->GetExtAddress()); aFrame.SetSrcAddr(macSource.mExtAddress); } @@ -1353,7 +1352,7 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError) case kThreadError_None: if (aFrame.GetAckRequest()) { - neighbor->mLinkFailures = 0; + neighbor->ResetLinkFailures(); } break; @@ -1363,11 +1362,11 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError) break; case kThreadError_NoAck: - neighbor->mLinkFailures++; + neighbor->IncrementLinkFailures(); - if (mNetif.GetMle().IsActiveRouter(neighbor->mValid.mRloc16)) + if (mNetif.GetMle().IsActiveRouter(neighbor->GetRloc16())) { - if (neighbor->mLinkFailures >= Mle::kFailedRouterTransmissions) + if (neighbor->GetLinkFailures() >= Mle::kFailedRouterTransmissions) { mNetif.GetMle().RemoveNeighbor(*neighbor); } @@ -1383,22 +1382,22 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError) if ((child = mNetif.GetMle().GetChild(macDest)) != NULL) { - child->mDataRequest = false; + child->SetDataRequestPending(false); VerifyOrExit(mSendMessage != NULL); - if (mSendMessage == child->mIndirectSendInfo.mMessage) + if (mSendMessage == child->GetIndirectMessage()) { switch (aError) { case kThreadError_None: - child->mIndirectSendInfo.mTxAttemptCounter = 0; + child->ResetIndirectTxAttempts(); break; default: - child->mIndirectSendInfo.mTxAttemptCounter++; + child->IncrementIndirectTxAttempts(); - if (child->mIndirectSendInfo.mTxAttemptCounter < kMaxPollTriggeredTxAttempts) + if (child->GetIndirectTxAttempts() < kMaxPollTriggeredTxAttempts) { // We save the frame counter, key id, and data sequence number of // current frame so we use the same values for the retransmission @@ -1407,15 +1406,22 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError) if (aFrame.GetSecurityEnabled()) { - aFrame.GetFrameCounter(child->mIndirectSendInfo.mFrameCounter); - aFrame.GetKeyId(child->mIndirectSendInfo.mKeyId); - child->mIndirectSendInfo.mDataSequenceNumber = aFrame.GetSequence(); + uint32_t frameCounter; + uint8_t keyId; + + aFrame.GetFrameCounter(frameCounter); + child->SetIndirectFrameCounter(frameCounter); + + aFrame.GetKeyId(keyId); + child->SetIndirectKeyId(keyId); + + child->SetIndirectDataSequenceNumber(aFrame.GetSequence()); } ExitNow(); } - child->mIndirectSendInfo.mTxAttemptCounter = 0; + child->ResetIndirectTxAttempts(); // We set the NextOffset to end of message, since there is no need to // send any remaining fragments in the message to the child, if all tx @@ -1429,17 +1435,17 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError) if (mMessageNextOffset < mSendMessage->GetLength()) { - if (mSendMessage == child->mIndirectSendInfo.mMessage) + if (mSendMessage == child->GetIndirectMessage()) { - child->mIndirectSendInfo.mFragmentOffset = mMessageNextOffset; + child->SetIndirectFragmentOffset(mMessageNextOffset); } } else { - if (mSendMessage == child->mIndirectSendInfo.mMessage) + if (mSendMessage == child->GetIndirectMessage()) { - child->mIndirectSendInfo.mFragmentOffset = 0; - child->mIndirectSendInfo.mMessage = NULL; + child->SetIndirectFragmentOffset(0); + child->SetIndirectMessage(NULL); // add short address for subsequent indirect messages after // one indirect message to valid sleepy devices is sent out successfully @@ -1485,7 +1491,7 @@ void MeshForwarder::HandleSentFrame(Mac::Frame &aFrame, ThreadError aError) { neighbor = mNetif.GetMle().GetParent(); - if (neighbor->mState == Neighbor::kStateInvalid) + if (neighbor->GetState() == Neighbor::kStateInvalid) { mDataPollManager.StopPolling(); mNetif.GetMle().BecomeDetached(); @@ -1957,12 +1963,12 @@ void MeshForwarder::HandleDataRequest(const Mac::Address &aMacSource, const Thre VerifyOrExit(mNetif.GetMle().GetDeviceState() != Mle::kDeviceStateDetached); VerifyOrExit((child = mNetif.GetMle().GetChild(aMacSource)) != NULL); - child->mLastHeard = Timer::GetNow(); - child->mLinkFailures = 0; + child->SetLastHeard(Timer::GetNow()); + child->ResetLinkFailures(); - if (!mSourceMatchController.IsEnabled() || (child->GetQueuedMessageCount() > 0)) + if (!mSourceMatchController.IsEnabled() || (child->GetIndirectMessageCount() > 0)) { - child->mDataRequest = true; + child->SetDataRequestPending(true); } mScheduleTransmissionTask.Post(); diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 15935dd6e..b15aa7156 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -501,7 +501,7 @@ ThreadError Mle::BecomeChild(otMleAttachFilter aFilter) if (aFilter == kMleAttachAnyPartition) { - mParent.mState = Neighbor::kStateInvalid; + mParent.SetState(Neighbor::kStateInvalid); mLastPartitionId = mNetif.GetMle().GetPreviousPartitionId(); mLastPartitionRouterIdSequence = mNetif.GetMle().GetRouterIdSequence(); } @@ -1267,7 +1267,7 @@ void Mle::HandleParentRequestTimer(void) switch (mParentRequestState) { case kParentIdle: - if (mParent.mState == Neighbor::kStateValid) + if (mParent.GetState() == Neighbor::kStateValid) { SendChildUpdateRequest(); } @@ -1285,14 +1285,14 @@ void Mle::HandleParentRequestTimer(void) case kParentRequestStart: mParentRequestState = kParentRequestRouter; - mParentCandidate.mState = Neighbor::kStateInvalid; + mParentCandidate.SetState(Neighbor::kStateInvalid); SendParentRequest(); break; case kParentRequestRouter: mParentRequestState = kParentRequestChild; - if (mParentCandidate.mState == Neighbor::kStateValid) + if (mParentCandidate.GetState() == Neighbor::kStateValid) { SendChildIdRequest(); mParentRequestState = kChildIdRequest; @@ -1308,7 +1308,7 @@ void Mle::HandleParentRequestTimer(void) case kParentRequestChild: mParentRequestState = kParentRequestChild; - if (mParentCandidate.mState == Neighbor::kStateValid) + if (mParentCandidate.GetState() == Neighbor::kStateValid) { SendChildIdRequest(); mParentRequestState = kChildIdRequest; @@ -1566,7 +1566,7 @@ ThreadError Mle::SendChildIdRequest(void) memset(&destination, 0, sizeof(destination)); destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(mParentCandidate.mMacAddr); + destination.SetIid(mParentCandidate.GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); otLogInfoMle(GetInstance(), "Sent Child ID Request"); @@ -1695,7 +1695,7 @@ ThreadError Mle::SendChildUpdateRequest(void) memset(&destination, 0, sizeof(destination)); destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(mParent.mMacAddr); + destination.SetIid(mParent.GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); otLogInfoMle(GetInstance(), "Sent Child Update Request to parent"); @@ -1763,7 +1763,7 @@ ThreadError Mle::SendChildUpdateResponse(const uint8_t *aTlvs, uint8_t aNumTlvs, memset(&destination, 0, sizeof(destination)); destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(mParent.mMacAddr); + destination.SetIid(mParent.GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); otLogInfoMle(GetInstance(), "Sent Child Update Response to parent"); @@ -2101,11 +2101,11 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn break; } - if (neighbor != NULL && neighbor->mState == Neighbor::kStateValid) + if (neighbor != NULL && neighbor->GetState() == Neighbor::kStateValid) { - if (keySequence == neighbor->mKeySequence) + if (keySequence == neighbor->GetKeySequence()) { - if (frameCounter < neighbor->mValid.mMleFrameCounter) + if (frameCounter < neighbor->GetMleFrameCounter()) { otLogDebgMle(GetInstance(), "mle frame reject 1"); ExitNow(); @@ -2113,17 +2113,17 @@ void Mle::HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageIn } else { - if (keySequence <= neighbor->mKeySequence) + if (keySequence <= neighbor->GetKeySequence()) { otLogDebgMle(GetInstance(), "mle frame reject 2"); ExitNow(); } - neighbor->mKeySequence = keySequence; - neighbor->mValid.mLinkFrameCounter = 0; + neighbor->SetKeySequence(keySequence); + neighbor->SetLinkFrameCounter(0); } - neighbor->mValid.mMleFrameCounter = frameCounter + 1; + neighbor->SetMleFrameCounter(frameCounter + 1); } else { @@ -2256,12 +2256,12 @@ ThreadError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::Message break; case kDeviceStateChild: - if (memcmp(&mParent.mMacAddr, &macAddr, sizeof(mParent.mMacAddr))) + if (memcmp(&mParent.GetExtAddress(), &macAddr, sizeof(macAddr))) { break; } - if ((mParent.mValid.mRloc16 == sourceAddress.GetRloc16()) && + if ((mParent.GetRloc16() == sourceAddress.GetRloc16()) && (leaderData.GetPartitionId() != mLeaderData.GetPartitionId() || leaderData.GetLeaderRouterId() != GetLeaderId())) { @@ -2279,13 +2279,13 @@ ThreadError Mle::HandleAdvertisement(const Message &aMessage, const Ip6::Message } isNeighbor = true; - mParent.mLastHeard = mParentRequestTimer.GetNow(); + mParent.SetLastHeard(Timer::GetNow()); break; case kDeviceStateRouter: case kDeviceStateLeader: if ((neighbor = mNetif.GetMle().GetNeighbor(macAddr)) != NULL && - neighbor->mState == Neighbor::kStateValid) + neighbor->GetState() == Neighbor::kStateValid) { isNeighbor = true; } @@ -2480,16 +2480,16 @@ bool Mle::IsBetterParent(uint16_t aRloc16, uint8_t aLinkQuality, ConnectivityTlv { bool rval = false; - uint8_t candidateLinkQualityIn = mParentCandidate.mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); - uint8_t candidateTwoWayLinkQuality = (candidateLinkQualityIn < mParentCandidate.mLinkQualityOut) - ? candidateLinkQualityIn : mParentCandidate.mLinkQualityOut; + uint8_t candidateLinkQualityIn = mParentCandidate.GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); + uint8_t candidateTwoWayLinkQuality = (candidateLinkQualityIn < mParentCandidate.GetLinkQualityOut()) + ? candidateLinkQualityIn : mParentCandidate.GetLinkQualityOut(); if (aLinkQuality != candidateTwoWayLinkQuality) { ExitNow(rval = (aLinkQuality > candidateTwoWayLinkQuality)); } - if (IsActiveRouter(aRloc16) != IsActiveRouter(mParentCandidate.mValid.mRloc16)) + if (IsActiveRouter(aRloc16) != IsActiveRouter(mParentCandidate.GetRloc16())) { ExitNow(rval = IsActiveRouter(aRloc16)); } @@ -2521,7 +2521,7 @@ exit: void Mle::ResetParentCandidate(void) { memset(&mParentCandidate, 0, sizeof(mParentCandidate)); - mParentCandidate.mState = Neighbor::kStateInvalid; + mParentCandidate.SetState(Neighbor::kStateInvalid); } ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, @@ -2602,7 +2602,7 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag } // if already have a candidate parent, only seek a better parent - if (mParentCandidate.mState == Neighbor::kStateValid) + if (mParentCandidate.GetState() == Neighbor::kStateValid) { int compare = 0; @@ -2639,17 +2639,17 @@ ThreadError Mle::HandleParentResponse(const Message &aMessage, const Ip6::Messag memcpy(mChildIdRequest.mChallenge, challenge.GetChallenge(), challenge.GetLength()); mChildIdRequest.mChallengeLength = challenge.GetLength(); - mParentCandidate.mMacAddr.Set(aMessageInfo.GetPeerAddr()); - mParentCandidate.mValid.mRloc16 = sourceAddress.GetRloc16(); - mParentCandidate.mValid.mLinkFrameCounter = linkFrameCounter.GetFrameCounter(); - mParentCandidate.mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter(); - mParentCandidate.mMode = ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData; - mParentCandidate.mLinkInfo.Clear(); - mParentCandidate.mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); - mParentCandidate.mLinkFailures = 0; - mParentCandidate.mLinkQualityOut = LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMarginTlv.GetLinkMargin()); - mParentCandidate.mState = Neighbor::kStateValid; - mParentCandidate.mKeySequence = aKeySequence; + mParentCandidate.GetExtAddress().Set(aMessageInfo.GetPeerAddr()); + mParentCandidate.SetRloc16(sourceAddress.GetRloc16()); + mParentCandidate.SetLinkFrameCounter(linkFrameCounter.GetFrameCounter()); + mParentCandidate.SetMleFrameCounter(mleFrameCounter.GetFrameCounter()); + mParentCandidate.SetDeviceMode(ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData); + mParentCandidate.GetLinkInfo().Clear(); + mParentCandidate.GetLinkInfo().AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); + mParentCandidate.ResetLinkFailures(); + mParentCandidate.SetLinkQualityOut(LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMarginTlv.GetLinkMargin())); + mParentCandidate.SetState(Neighbor::kStateValid); + mParentCandidate.SetKeySequence(aKeySequence); mParentPriority = connectivity.GetParentPriority(); mParentLinkQuality3 = connectivity.GetLinkQuality3(); @@ -2769,7 +2769,7 @@ ThreadError Mle::HandleChildIdResponse(const Message &aMessage, const Ip6::Messa mParent = mParentCandidate; ResetParentCandidate(); - mParent.mValid.mRloc16 = sourceAddress.GetRloc16(); + mParent.SetRloc16(sourceAddress.GetRloc16()); mNetif.GetNetworkDataLeader().SetNetworkData(leaderData.GetDataVersion(), leaderData.GetStableDataVersion(), (mDeviceMode & ModeTlv::kModeFullNetworkData) == 0, @@ -2809,7 +2809,7 @@ ThreadError Mle::HandleChildUpdateRequest(const Message &aMessage, const Ip6::Me // Source Address SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress)); VerifyOrExit(sourceAddress.IsValid(), error = kThreadError_Parse); - VerifyOrExit(mParent.mValid.mRloc16 == sourceAddress.GetRloc16(), error = kThreadError_Drop); + VerifyOrExit(mParent.GetRloc16() == sourceAddress.GetRloc16(), error = kThreadError_Drop); // Leader Data if (Tlv::GetTlv(aMessage, Tlv::kLeaderData, sizeof(leaderData), leaderData) == kThreadError_None) @@ -2915,8 +2915,8 @@ ThreadError Mle::HandleChildUpdateResponse(const Message &aMessage, const Ip6::M mleFrameCounter.SetFrameCounter(linkFrameCounter.GetFrameCounter()); } - mParent.mValid.mLinkFrameCounter = linkFrameCounter.GetFrameCounter(); - mParent.mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter(); + mParent.SetLinkFrameCounter(linkFrameCounter.GetFrameCounter()); + mParent.SetMleFrameCounter(mleFrameCounter.GetFrameCounter()); SetStateChild(GetRloc16()); @@ -3122,12 +3122,12 @@ exit: Neighbor *Mle::GetNeighbor(uint16_t aAddress) { - if ((mParent.mState == Neighbor::kStateValid) && (mParent.mValid.mRloc16 == aAddress)) + if ((mParent.GetState() == Neighbor::kStateValid) && (mParent.GetRloc16() == aAddress)) { return &mParent; } - if ((mParentCandidate.mState == Neighbor::kStateValid) && (mParentCandidate.mValid.mRloc16 == aAddress)) + if ((mParentCandidate.GetState() == Neighbor::kStateValid) && (mParentCandidate.GetRloc16() == aAddress)) { return &mParentCandidate; } @@ -3137,14 +3137,14 @@ Neighbor *Mle::GetNeighbor(uint16_t aAddress) Neighbor *Mle::GetNeighbor(const Mac::ExtAddress &aAddress) { - if ((mParent.mState == Neighbor::kStateValid) && - (memcmp(&mParent.mMacAddr, &aAddress, sizeof(mParent.mMacAddr)) == 0)) + if ((mParent.GetState() == Neighbor::kStateValid) && + (memcmp(&mParent.GetExtAddress(), &aAddress, sizeof(aAddress)) == 0)) { return &mParent; } - if ((mParentCandidate.mState == Neighbor::kStateValid) && - (memcmp(&mParentCandidate.mMacAddr, &aAddress, sizeof(mParentCandidate.mMacAddr)) == 0)) + if ((mParentCandidate.GetState() == Neighbor::kStateValid) && + (memcmp(&mParentCandidate.GetExtAddress(), &aAddress, sizeof(aAddress)) == 0)) { return &mParentCandidate; } @@ -3173,7 +3173,7 @@ Neighbor *Mle::GetNeighbor(const Mac::Address &aAddress) uint16_t Mle::GetNextHop(uint16_t aDestination) const { (void)aDestination; - return (mParent.mState == Neighbor::kStateValid) ? mParent.mValid.mRloc16 : static_cast + return (mParent.GetState() == Neighbor::kStateValid) ? mParent.GetRloc16() : static_cast (Mac::kShortAddrInvalid); } @@ -3189,7 +3189,7 @@ bool Mle::IsAnycastLocator(const Ip6::Address &aAddress) const Router *Mle::GetParent() { - if ((mParent.mState != Neighbor::kStateValid) && (mParentCandidate.mState == Neighbor::kStateValid)) + if ((mParent.GetState() != Neighbor::kStateValid) && (mParentCandidate.GetState() == Neighbor::kStateValid)) { return &mParentCandidate; } diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 76c1f5868..919b23e50 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -106,11 +106,11 @@ uint8_t MleRouter::AllocateRouterId(void) for (int i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mAllocated) + if (mRouters[i].IsAllocated()) { numAllocated++; } - else if (mRouters[i].mReclaimDelay == false) + else if (mRouters[i].IsReclaimDelay() == false) { numAvailable++; } @@ -125,7 +125,7 @@ uint8_t MleRouter::AllocateRouterId(void) // allocate router id for (uint8_t i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mAllocated || mRouters[i].mReclaimDelay) + if (mRouters[i].IsAllocated() || mRouters[i].IsReclaimDelay()) { continue; } @@ -151,12 +151,12 @@ uint8_t MleRouter::AllocateRouterId(uint8_t aRouterId) router = GetRouter(aRouterId); assert(router != NULL); - VerifyOrExit(!router->mAllocated, rval = kInvalidRouterId); + VerifyOrExit(!router->IsAllocated(), rval = kInvalidRouterId); // init router state - router->mAllocated = true; - router->mLastHeard = Timer::GetNow(); - memset(&router->mMacAddr, 0, sizeof(router->mMacAddr)); + router->SetAllocated(true); + router->SetLastHeard(Timer::GetNow()); + router->ClearExtAddress(); // bump sequence number mRouterIdSequence++; @@ -178,17 +178,17 @@ ThreadError MleRouter::ReleaseRouterId(uint8_t aRouterId) VerifyOrExit(mDeviceState == kDeviceStateLeader, error = kThreadError_InvalidState); otLogInfoMle(GetInstance(), "delete router id %d", aRouterId); - router->mAllocated = false; - router->mReclaimDelay = true; - router->mState = Neighbor::kStateInvalid; - router->mNextHop = kInvalidRouterId; + router->SetAllocated(false); + router->SetReclaimDelay(true); + router->SetState(Neighbor::kStateInvalid); + router->SetNextHop(kInvalidRouterId); for (uint8_t i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mNextHop == aRouterId) + if (mRouters[i].GetNextHop() == aRouterId) { - mRouters[i].mNextHop = kInvalidRouterId; - mRouters[i].mCost = 0; + mRouters[i].SetNextHop(kInvalidRouterId); + mRouters[i].SetCost(0); } } @@ -217,10 +217,10 @@ ThreadError MleRouter::BecomeRouter(ThreadStatusTlv::Status aStatus) for (int i = 0; i <= kMaxRouterId; i++) { - mRouters[i].mAllocated = false; - mRouters[i].mReclaimDelay = false; - mRouters[i].mState = Neighbor::kStateInvalid; - mRouters[i].mNextHop = kInvalidRouterId; + mRouters[i].SetAllocated(false); + mRouters[i].SetReclaimDelay(false); + mRouters[i].SetState(Neighbor::kStateInvalid); + mRouters[i].SetNextHop(kInvalidRouterId); } mAdvertiseTimer.Stop(); @@ -260,10 +260,10 @@ ThreadError MleRouter::BecomeLeader(void) for (int i = 0; i <= kMaxRouterId; i++) { - mRouters[i].mAllocated = false; - mRouters[i].mReclaimDelay = false; - mRouters[i].mState = Neighbor::kStateInvalid; - mRouters[i].mNextHop = kInvalidRouterId; + mRouters[i].SetAllocated(false); + mRouters[i].SetReclaimDelay(false); + mRouters[i].SetState(Neighbor::kStateInvalid); + mRouters[i].SetNextHop(kInvalidRouterId); } routerId = IsRouterIdValid(mPreviousRouterId) ? AllocateRouterId(mPreviousRouterId) : AllocateRouterId(); @@ -272,7 +272,7 @@ ThreadError MleRouter::BecomeLeader(void) SetRouterId(routerId); - memcpy(&router->mMacAddr, mNetif.GetMac().GetExtAddress(), sizeof(router->mMacAddr)); + router->SetExtAddress(*mNetif.GetMac().GetExtAddress()); mAdvertiseTimer.Stop(); mNetif.GetAddressResolver().Clear(); @@ -312,7 +312,7 @@ ThreadError MleRouter::HandleDetachStart(void) for (int i = 0; i <= kMaxRouterId; i++) { - mRouters[i].mState = Neighbor::kStateInvalid; + mRouters[i].SetState(Neighbor::kStateInvalid); } StopLeader(); @@ -395,7 +395,7 @@ ThreadError MleRouter::SetStateRouter(uint16_t aRloc16) ResetAdvertiseInterval(); mNetif.SubscribeAllRoutersMulticast(); - mRouters[mRouterId].mNextHop = mRouterId; + mRouters[mRouterId].SetNextHop(mRouterId); mPreviousPartitionId = mLeaderData.GetPartitionId(); mNetif.GetNetworkDataLeader().Stop(); mStateUpdateTimer.Start(kStateUpdatePeriod); @@ -404,7 +404,7 @@ ThreadError MleRouter::SetStateRouter(uint16_t aRloc16) for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState == Neighbor::kStateRestored) + if (mChildren[i].GetState() == Neighbor::kStateRestored) { mChildUpdateRequestTimer.Start(kChildUpdateRequestPeriod); break; @@ -430,10 +430,10 @@ ThreadError MleRouter::SetStateLeader(uint16_t aRloc16) AddLeaderAloc(); mNetif.SubscribeAllRoutersMulticast(); - mRouters[mRouterId].mNextHop = mRouterId; + mRouters[mRouterId].SetNextHop(mRouterId); mPreviousPartitionId = mLeaderData.GetPartitionId(); mStateUpdateTimer.Start(kStateUpdatePeriod); - mRouters[mRouterId].mLastHeard = Timer::GetNow(); + mRouters[mRouterId].SetLastHeard(Timer::GetNow()); mNetif.GetNetworkDataLeader().Start(); mNetif.GetActiveDataset().StartLeader(); @@ -445,7 +445,7 @@ ThreadError MleRouter::SetStateLeader(uint16_t aRloc16) for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState == Neighbor::kStateRestored) + if (mChildren[i].GetState() == Neighbor::kStateRestored) { mChildUpdateRequestTimer.Start(kChildUpdateRequestPeriod); break; @@ -594,15 +594,11 @@ ThreadError MleRouter::SendLinkRequest(Neighbor *aNeighbor) } else { - for (uint8_t i = 0; i < sizeof(aNeighbor->mPending.mChallenge); i++) - { - aNeighbor->mPending.mChallenge[i] = static_cast(otPlatRandomGet()); - } + aNeighbor->GenerateChallenge(); - SuccessOrExit(error = AppendChallenge(*message, aNeighbor->mPending.mChallenge, - sizeof(aNeighbor->mPending.mChallenge))); + SuccessOrExit(error = AppendChallenge(*message, aNeighbor->GetChallenge(), aNeighbor->GetChallengeSize())); destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(aNeighbor->mMacAddr); + destination.SetIid(aNeighbor->GetExtAddress()); } SuccessOrExit(error = SendMessage(*message, destination)); @@ -662,7 +658,7 @@ ThreadError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Mes rloc16 = sourceAddress.GetRloc16(); - if ((neighbor = GetNeighbor(macAddr)) != NULL && neighbor->mValid.mRloc16 != rloc16) + if ((neighbor = GetNeighbor(macAddr)) != NULL && neighbor->GetRloc16() != rloc16) { // remove stale neighbors RemoveNeighbor(*neighbor); @@ -675,20 +671,20 @@ ThreadError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Mes neighbor = GetRouter(GetRouterId(rloc16)); VerifyOrExit(neighbor != NULL, error = kThreadError_Parse); - if (neighbor->mState != Neighbor::kStateValid) + if (neighbor->GetState() != Neighbor::kStateValid) { const ThreadMessageInfo *threadMessageInfo = static_cast(aMessageInfo.GetLinkInfo()); - memcpy(&neighbor->mMacAddr, &macAddr, sizeof(neighbor->mMacAddr)); - neighbor->mLinkInfo.Clear(); - neighbor->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); - neighbor->mLinkFailures = 0; - neighbor->mState = Neighbor::kStateLinkRequest; + neighbor->SetExtAddress(macAddr); + neighbor->GetLinkInfo().Clear(); + neighbor->GetLinkInfo().AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); + neighbor->ResetLinkFailures(); + neighbor->SetState(Neighbor::kStateLinkRequest); } else { - VerifyOrExit(memcmp(&neighbor->mMacAddr, &macAddr, sizeof(neighbor->mMacAddr)) == 0); + VerifyOrExit(memcmp(&neighbor->GetExtAddress(), &macAddr, sizeof(macAddr)) == 0); } } else @@ -701,8 +697,8 @@ ThreadError MleRouter::HandleLinkRequest(const Message &aMessage, const Ip6::Mes { // lack of source address indicates router coming out of reset VerifyOrExit((neighbor = GetNeighbor(macAddr)) != NULL && - neighbor->mState == Neighbor::kStateValid && - IsActiveRouter(neighbor->mValid.mRloc16), + neighbor->GetState() == Neighbor::kStateValid && + IsActiveRouter(neighbor->GetRloc16()), error = kThreadError_Drop); } @@ -732,7 +728,7 @@ ThreadError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neig Header::Command command; uint8_t linkMargin; - command = (aNeighbor == NULL || aNeighbor->mState == Neighbor::kStateValid) ? + command = (aNeighbor == NULL || aNeighbor->GetState() == Neighbor::kStateValid) ? Header::kCommandLinkAccept : Header::kCommandLinkAcceptAndRequest; VerifyOrExit((message = NewMleMessage()) != NULL); @@ -747,15 +743,15 @@ ThreadError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neig linkMargin = LinkQualityInfo::ConvertRssToLinkMargin(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); // add for certification testing - if (isAssignLinkQuality && - (memcmp(aNeighbor->mMacAddr.m8, mAddr64.m8, OT_EXT_ADDRESS_SIZE) == 0)) + if (isAssignLinkQuality && aNeighbor != NULL && + (memcmp(&aNeighbor->GetExtAddress(), mAddr64.m8, OT_EXT_ADDRESS_SIZE) == 0)) { linkMargin = mAssignLinkMargin; } SuccessOrExit(error = AppendLinkMargin(*message, linkMargin)); - if (aNeighbor != NULL && IsActiveRouter(aNeighbor->mValid.mRloc16)) + if (aNeighbor != NULL && IsActiveRouter(aNeighbor->GetRloc16())) { SuccessOrExit(error = AppendLeaderData(*message)); } @@ -770,7 +766,7 @@ ThreadError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neig case Tlv::kAddress16: VerifyOrExit(aNeighbor != NULL, error = kThreadError_Drop); - SuccessOrExit(error = AppendAddress16(*message, aNeighbor->mValid.mRloc16)); + SuccessOrExit(error = AppendAddress16(*message, aNeighbor->GetRloc16())); break; case Tlv::kLinkMargin: @@ -781,17 +777,13 @@ ThreadError MleRouter::SendLinkAccept(const Ip6::MessageInfo &aMessageInfo, Neig } } - if (aNeighbor != NULL && aNeighbor->mState != Neighbor::kStateValid) + if (aNeighbor != NULL && aNeighbor->GetState() != Neighbor::kStateValid) { - for (uint8_t i = 0; i < sizeof(aNeighbor->mPending.mChallenge); i++) - { - aNeighbor->mPending.mChallenge[i] = static_cast(otPlatRandomGet()); - } + aNeighbor->GenerateChallenge(); - SuccessOrExit(error = AppendChallenge(*message, aNeighbor->mPending.mChallenge, - sizeof(aNeighbor->mPending.mChallenge))); + SuccessOrExit(error = AppendChallenge(*message, aNeighbor->GetChallenge(), aNeighbor->GetChallengeSize())); SuccessOrExit(error = AppendTlvRequest(*message, routerTlvs, sizeof(routerTlvs))); - aNeighbor->mState = Neighbor::kStateLinkRequest; + aNeighbor->SetState(Neighbor::kStateLinkRequest); } if (aMessageInfo.GetSockAddr().IsMulticast()) @@ -869,7 +861,7 @@ ThreadError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::Mess // Remove stale neighbors if ((neighbor = GetNeighbor(macAddr)) != NULL && - neighbor->mValid.mRloc16 != sourceAddress.GetRloc16()) + neighbor->GetRloc16() != sourceAddress.GetRloc16()) { RemoveNeighbor(*neighbor); } @@ -898,10 +890,10 @@ ThreadError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::Mess VerifyOrExit(router != NULL, error = kThreadError_Parse); // verify response - switch (router->mState) + switch (router->GetState()) { case Neighbor::kStateLinkRequest: - VerifyOrExit(memcmp(router->mPending.mChallenge, response.GetResponse(), sizeof(router->mPending.mChallenge)) == 0, + VerifyOrExit(memcmp(router->GetChallenge(), response.GetResponse(), router->GetChallengeSize()) == 0, error = kThreadError_Error); break; @@ -954,7 +946,7 @@ ThreadError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::Mess case kDeviceStateChild: SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLinkMargin, sizeof(linkMargin), linkMargin)); VerifyOrExit(linkMargin.IsValid(), error = kThreadError_Parse); - router->mLinkQualityOut = LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMargin.GetLinkMargin()); + router->SetLinkQualityOut(LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMargin.GetLinkMargin())); break; case kDeviceStateRouter: @@ -967,10 +959,10 @@ ThreadError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::Mess // Link Margin SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLinkMargin, sizeof(linkMargin), linkMargin)); VerifyOrExit(linkMargin.IsValid(), error = kThreadError_Parse); - router->mLinkQualityOut = LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMargin.GetLinkMargin()); + router->SetLinkQualityOut(LinkQualityInfo::ConvertLinkMarginToLinkQuality(linkMargin.GetLinkMargin())); // update routing table - if (routerId != mRouterId && !IsRouterIdValid(router->mNextHop)) + if (routerId != mRouterId && !IsRouterIdValid(router->GetNextHop())) { ResetAdvertiseInterval(); } @@ -979,17 +971,17 @@ ThreadError MleRouter::HandleLinkAccept(const Message &aMessage, const Ip6::Mess } // finish link synchronization - memcpy(&router->mMacAddr, &macAddr, sizeof(router->mMacAddr)); - router->mValid.mRloc16 = sourceAddress.GetRloc16(); - router->mValid.mLinkFrameCounter = linkFrameCounter.GetFrameCounter(); - router->mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter(); - router->mLastHeard = Timer::GetNow(); - router->mMode = ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData; - router->mLinkInfo.Clear(); - router->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); - router->mLinkFailures = 0; - router->mState = Neighbor::kStateValid; - router->mKeySequence = aKeySequence; + router->SetExtAddress(macAddr); + router->SetRloc16(sourceAddress.GetRloc16()); + router->SetLinkFrameCounter(linkFrameCounter.GetFrameCounter()); + router->SetMleFrameCounter(mleFrameCounter.GetFrameCounter()); + router->SetLastHeard(Timer::GetNow()); + router->SetDeviceMode(ModeTlv::kModeFFD | ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeFullNetworkData); + router->GetLinkInfo().Clear(); + router->GetLinkInfo().AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); + router->ResetLinkFailures(); + router->SetState(Neighbor::kStateValid); + router->SetKeySequence(aKeySequence); if (aRequest) { @@ -1018,7 +1010,7 @@ Child *MleRouter::NewChild(void) { for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState == Neighbor::kStateInvalid) + if (mChildren[i].GetState() == Neighbor::kStateInvalid) { return &mChildren[i]; } @@ -1033,8 +1025,8 @@ Child *MleRouter::FindChild(uint16_t aChildId) for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState != Neighbor::kStateInvalid && - GetChildId(mChildren[i].mValid.mRloc16) == aChildId) + if (mChildren[i].GetState() != Neighbor::kStateInvalid && + GetChildId(mChildren[i].GetRloc16()) == aChildId) { ExitNow(rval = &mChildren[i]); } @@ -1050,8 +1042,8 @@ Child *MleRouter::FindChild(const Mac::ExtAddress &aAddress) for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState != Neighbor::kStateInvalid && - memcmp(&mChildren[i].mMacAddr, &aAddress, sizeof(mChildren[i].mMacAddr)) == 0) + if (mChildren[i].GetState() != Neighbor::kStateInvalid && + memcmp(&mChildren[i].GetExtAddress(), &aAddress, sizeof(mChildren[i].GetExtAddress())) == 0) { ExitNow(rval = &mChildren[i]); } @@ -1087,17 +1079,17 @@ uint8_t MleRouter::GetLinkCost(uint8_t aRouterId) router = GetRouter(aRouterId); // NULL aRouterId indicates non-existing next hop, hence return kMaxRouteCost for it. - VerifyOrExit(aRouterId != mRouterId && router != NULL && router->mState == Neighbor::kStateValid); + VerifyOrExit(aRouterId != mRouterId && router != NULL && router->GetState() == Neighbor::kStateValid); - rval = router->mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); + rval = router->GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); - if (rval > router->mLinkQualityOut) + if (rval > router->GetLinkQualityOut()) { - rval = router->mLinkQualityOut; + rval = router->GetLinkQualityOut(); } // add for certification testing - if (isAssignLinkQuality && (memcmp(router->mMacAddr.m8, mAddr64.m8, OT_EXT_ADDRESS_SIZE) == 0)) + if (isAssignLinkQuality && (memcmp(&router->GetExtAddress(), mAddr64.m8, OT_EXT_ADDRESS_SIZE) == 0)) { rval = mAssignLinkQuality; } @@ -1117,17 +1109,17 @@ ThreadError MleRouter::ProcessRouteTlv(const RouteTlv &aRoute) for (uint8_t i = 0; i <= kMaxRouterId; i++) { - bool old = mRouters[i].mAllocated; - mRouters[i].mAllocated = aRoute.IsRouterIdSet(i); + bool old = mRouters[i].IsAllocated(); + mRouters[i].SetAllocated(aRoute.IsRouterIdSet(i)); - if (old && !mRouters[i].mAllocated) + if (old && !mRouters[i].IsAllocated()) { - mRouters[i].mNextHop = kInvalidRouterId; + mRouters[i].SetNextHop(kInvalidRouterId); mNetif.GetAddressResolver().Remove(i); } } - if (GetDeviceState() == kDeviceStateRouter && !mRouters[mRouterId].mAllocated) + if (GetDeviceState() == kDeviceStateRouter && !mRouters[mRouterId].IsAllocated()) { BecomeDetached(); ExitNow(error = kThreadError_NoRoute); @@ -1161,7 +1153,7 @@ bool MleRouter::IsSingleton(void) // not a singleton if any other routers exist for (int i = 0; i <= kMaxRouterId; i++) { - if (i != mRouterId && mRouters[i].mAllocated) + if (i != mRouterId && mRouters[i].IsAllocated()) { ExitNow(rval = false); } @@ -1170,7 +1162,7 @@ bool MleRouter::IsSingleton(void) // not a singleton if any children are REEDs for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState == Neighbor::kStateValid && (mChildren[i].mMode & ModeTlv::kModeFFD)) + if (mChildren[i].GetState() == Neighbor::kStateValid && mChildren[i].IsFullThreadDevice()) { ExitNow(rval = false); } @@ -1213,7 +1205,7 @@ uint8_t MleRouter::GetActiveRouterCount(void) const for (int i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mAllocated) + if (mRouters[i].IsAllocated()) { rval++; } @@ -1244,7 +1236,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M // Remove stale neighbors if ((neighbor = GetNeighbor(macAddr)) != NULL && - neighbor->mValid.mRloc16 != sourceAddress.GetRloc16()) + neighbor->GetRloc16() != sourceAddress.GetRloc16()) { RemoveNeighbor(*neighbor); } @@ -1272,7 +1264,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M } if (GetDeviceState() == kDeviceStateChild && - (memcmp(&mParent.mMacAddr, &macAddr, sizeof(mParent.mMacAddr)) == 0 || !(mDeviceMode & ModeTlv::kModeFFD))) + (memcmp(&mParent.GetExtAddress(), &macAddr, sizeof(macAddr)) == 0 || !(mDeviceMode & ModeTlv::kModeFFD))) { ExitNow(); } @@ -1323,8 +1315,8 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M break; case kDeviceStateChild: - if ((sourceAddress.GetRloc16() == mParent.mValid.mRloc16) || - (router->mState == Neighbor::kStateValid)) + if ((sourceAddress.GetRloc16() == mParent.GetRloc16()) || + (router->GetState() == Neighbor::kStateValid)) { processRouteTlv = true; } @@ -1350,7 +1342,7 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M ExitNow(); case kDeviceStateChild: - if ((sourceAddress.GetRloc16() == mParent.mValid.mRloc16 || router->mState == Neighbor::kStateValid) && + if ((sourceAddress.GetRloc16() == mParent.GetRloc16() || router->GetState() == Neighbor::kStateValid) && (mDeviceMode & ModeTlv::kModeFFD) && (mRouterSelectionJitterTimeout == 0) && (GetActiveRouterCount() < mRouterUpgradeThreshold)) @@ -1359,11 +1351,11 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M ExitNow(); } - if (memcmp(&mParent.mMacAddr, &macAddr, sizeof(mParent.mMacAddr)) == 0) + if (memcmp(&mParent.GetExtAddress(), &macAddr, sizeof(mParent.GetExtAddress())) == 0) { router = &mParent; - if (mParent.mValid.mRloc16 != sourceAddress.GetRloc16()) + if (mParent.GetRloc16() != sourceAddress.GetRloc16()) { BecomeDetached(); ExitNow(error = kThreadError_NoRoute); @@ -1386,31 +1378,31 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M if (route.GetRouteCost(routeCount) > 0) { - mRouters[GetLeaderId()].mNextHop = routerId; - mRouters[GetLeaderId()].mCost = route.GetRouteCost(routeCount); + mRouters[GetLeaderId()].SetNextHop(routerId); + mRouters[GetLeaderId()].SetCost(route.GetRouteCost(routeCount)); } else { - mRouters[GetLeaderId()].mNextHop = kInvalidRouterId; - mRouters[GetLeaderId()].mCost = 0; + mRouters[GetLeaderId()].SetNextHop(kInvalidRouterId); + mRouters[GetLeaderId()].SetCost(0); } break; } } } - else if ((mDeviceMode & ModeTlv::kModeFFD) && (router->mState != Neighbor::kStateValid)) + else if ((mDeviceMode & ModeTlv::kModeFFD) && (router->GetState() != Neighbor::kStateValid)) { - memcpy(&router->mMacAddr, &macAddr, sizeof(router->mMacAddr)); - router->mLinkInfo.Clear(); - router->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); - router->mLinkFailures = 0; - router->mState = Neighbor::kStateLinkRequest; + router->SetExtAddress(macAddr); + router->GetLinkInfo().Clear(); + router->GetLinkInfo().AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); + router->ResetLinkFailures(); + router->SetState(Neighbor::kStateLinkRequest); SendLinkRequest(router); ExitNow(error = kThreadError_NoRoute); } - router->mLastHeard = Timer::GetNow(); + router->SetLastHeard(Timer::GetNow()); ExitNow(); @@ -1440,25 +1432,25 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M case kDeviceStateLeader: // router is not in list, reject - if (!router->mAllocated) + if (!router->IsAllocated()) { ExitNow(error = kThreadError_NoRoute); } // Send link request if no link to router - if (router->mState != Neighbor::kStateValid) + if (router->GetState() != Neighbor::kStateValid) { - memcpy(&router->mMacAddr, &macAddr, sizeof(router->mMacAddr)); - router->mLinkInfo.Clear(); - router->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); - router->mLinkFailures = 0; - router->mState = Neighbor::kStateLinkRequest; - router->mDataRequest = false; + router->SetExtAddress(macAddr); + router->GetLinkInfo().Clear(); + router->GetLinkInfo().AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); + router->ResetLinkFailures(); + router->SetState(Neighbor::kStateLinkRequest); + router->SetDataRequestPending(false); SendLinkRequest(router); ExitNow(error = kThreadError_NoRoute); } - router->mLastHeard = Timer::GetNow(); + router->SetLastHeard(Timer::GetNow()); break; } @@ -1491,7 +1483,7 @@ void MleRouter::UpdateRoutes(const RouteTlv &aRoute, uint8_t aRouterId) continue; } - if (mRouters[i].mAllocated == false) + if (mRouters[i].IsAllocated() == false) { routeCount++; continue; @@ -1501,15 +1493,15 @@ void MleRouter::UpdateRoutes(const RouteTlv &aRoute, uint8_t aRouterId) { lqi = aRoute.GetLinkQualityIn(routeCount); - if (mRouters[aRouterId].mLinkQualityOut != lqi) + if (mRouters[aRouterId].GetLinkQualityOut() != lqi) { - mRouters[aRouterId].mLinkQualityOut = lqi; + mRouters[aRouterId].SetLinkQualityOut(lqi); update = true; } } else { - oldNextHop = mRouters[i].mNextHop; + oldNextHop = mRouters[i].GetNextHop(); if (i == aRouterId) { @@ -1525,7 +1517,7 @@ void MleRouter::UpdateRoutes(const RouteTlv &aRoute, uint8_t aRouterId) } } - if (!IsRouterIdValid(mRouters[i].mNextHop) || mRouters[i].mNextHop == aRouterId) + if (!IsRouterIdValid(mRouters[i].GetNextHop()) || mRouters[i].GetNextHop() == aRouterId) { // route has no nexthop or nexthop is neighbor (sender) @@ -1533,40 +1525,40 @@ void MleRouter::UpdateRoutes(const RouteTlv &aRoute, uint8_t aRouterId) { if (cost + GetLinkCost(aRouterId) <= kMaxRouteCost) { - if (!IsRouterIdValid(mRouters[i].mNextHop) && GetLinkCost(i) >= kMaxRouteCost) + if (!IsRouterIdValid(mRouters[i].GetNextHop()) && GetLinkCost(i) >= kMaxRouteCost) { ResetAdvertiseInterval(); } - mRouters[i].mNextHop = aRouterId; - mRouters[i].mCost = cost; + mRouters[i].SetNextHop(aRouterId); + mRouters[i].SetCost(cost); } - else if (mRouters[i].mNextHop == aRouterId) + else if (mRouters[i].GetNextHop() == aRouterId) { if (GetLinkCost(i) >= kMaxRouteCost) { ResetAdvertiseInterval(); } - mRouters[i].mNextHop = kInvalidRouterId; - mRouters[i].mCost = 0; - mRouters[i].mLastHeard = Timer::GetNow(); + mRouters[i].SetNextHop(kInvalidRouterId); + mRouters[i].SetCost(0); + mRouters[i].SetLastHeard(Timer::GetNow()); } } } else { - curCost = mRouters[i].mCost + GetLinkCost(mRouters[i].mNextHop); + curCost = mRouters[i].GetCost() + GetLinkCost(mRouters[i].GetNextHop()); newCost = cost + GetLinkCost(aRouterId); if (newCost < curCost && i != aRouterId) { - mRouters[i].mNextHop = aRouterId; - mRouters[i].mCost = cost; + mRouters[i].SetNextHop(aRouterId); + mRouters[i].SetCost(cost); } } - update |= mRouters[i].mNextHop != oldNextHop; + update |= mRouters[i].GetNextHop() != oldNextHop; } routeCount++; @@ -1578,7 +1570,7 @@ void MleRouter::UpdateRoutes(const RouteTlv &aRoute, uint8_t aRouterId) for (uint8_t i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mAllocated == false || !IsRouterIdValid(mRouters[i].mNextHop)) + if (mRouters[i].IsAllocated() == false || !IsRouterIdValid(mRouters[i].GetNextHop())) { continue; } @@ -1586,10 +1578,10 @@ void MleRouter::UpdateRoutes(const RouteTlv &aRoute, uint8_t aRouterId) otLogDebgMle(GetInstance(), "%x: %x %d %d %d %d", GetRloc16(i), - GetRloc16(mRouters[i].mNextHop), - mRouters[i].mCost, - GetLinkCost(i), mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()), - mRouters[i].mLinkQualityOut); + GetRloc16(mRouters[i].GetNextHop()), + mRouters[i].GetCost(), + GetLinkCost(i), mRouters[i].GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor()), + mRouters[i].GetLinkQualityOut()); } #endif @@ -1621,8 +1613,8 @@ ThreadError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::M // 3. Its current routing path cost to the Leader is infinite. VerifyOrExit(GetDeviceState() == kDeviceStateLeader || GetLinkCost(GetLeaderId()) < kMaxRouteCost || - (GetDeviceState() == kDeviceStateChild && mRouters[GetLeaderId()].mCost + 1 < kMaxRouteCost) || - (mRouters[GetLeaderId()].mCost + GetLinkCost(mRouters[GetLeaderId()].mNextHop) < kMaxRouteCost), + (GetDeviceState() == kDeviceStateChild && mRouters[GetLeaderId()].GetCost() + 1 < kMaxRouteCost) || + (mRouters[GetLeaderId()].GetCost() + GetLinkCost(mRouters[GetLeaderId()].GetNextHop()) < kMaxRouteCost), error = kThreadError_Drop); macAddr.Set(aMessageInfo.GetPeerAddr()); @@ -1657,7 +1649,7 @@ ThreadError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::M child = FindChild(macAddr); - if (child != NULL && !(child->mMode & ModeTlv::kModeFFD)) + if (child != NULL && !child->IsFullThreadDevice()) { // Parent Request from a MTD child means that the child had detached. It can be safely removed. RemoveNeighbor(*child); @@ -1671,15 +1663,15 @@ ThreadError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::M memset(child, 0, sizeof(*child)); // MAC Address - memcpy(&child->mMacAddr, &macAddr, sizeof(child->mMacAddr)); - child->mLinkInfo.Clear(); - child->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); - child->mLinkFailures = 0; - child->mState = Neighbor::kStateParentRequest; - child->mDataRequest = false; + child->SetExtAddress(macAddr); + child->GetLinkInfo().Clear(); + child->GetLinkInfo().AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); + child->ResetLinkFailures(); + child->SetState(Neighbor::kStateParentRequest); + child->SetDataRequestPending(false); - child->mLastHeard = Timer::GetNow(); - child->mTimeout = Timer::MsecToSec(kMaxChildIdRequestTimeout); + child->SetLastHeard(Timer::GetNow()); + child->SetTimeout(Timer::MsecToSec(kMaxChildIdRequestTimeout)); } SuccessOrExit(error = SendParentResponse(child, challenge, !scanMask.IsEndDeviceFlagSet())); @@ -1779,7 +1771,7 @@ void MleRouter::HandleStateUpdateTimer(void) { uint32_t timeout = 0; - switch (mChildren[i].mState) + switch (mChildren[i].GetState()) { case Neighbor::kStateInvalid: case Neighbor::kStateChildIdRequest: @@ -1789,7 +1781,7 @@ void MleRouter::HandleStateUpdateTimer(void) case Neighbor::kStateValid: case Neighbor::kStateRestored: case Neighbor::kStateChildUpdateRequest: - timeout = Timer::SecToMsec(mChildren[i].mTimeout); + timeout = Timer::SecToMsec(mChildren[i].GetTimeout()); break; case Neighbor::kStateLinkRequest: @@ -1797,7 +1789,7 @@ void MleRouter::HandleStateUpdateTimer(void) break; } - if ((Timer::GetNow() - mChildren[i].mLastHeard) >= timeout) + if ((Timer::GetNow() - mChildren[i].GetLastHeard()) >= timeout) { RemoveNeighbor(mChildren[i]); } @@ -1806,9 +1798,9 @@ void MleRouter::HandleStateUpdateTimer(void) // update router state for (uint8_t i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mState == Neighbor::kStateValid) + if (mRouters[i].GetState() == Neighbor::kStateValid) { - if ((Timer::GetNow() - mRouters[i].mLastHeard) >= Timer::SecToMsec(kMaxNeighborAge)) + if ((Timer::GetNow() - mRouters[i].GetLastHeard()) >= Timer::SecToMsec(kMaxNeighborAge)) { RemoveNeighbor(mRouters[i]); } @@ -1816,21 +1808,21 @@ void MleRouter::HandleStateUpdateTimer(void) if (GetDeviceState() == kDeviceStateLeader) { - if (mRouters[i].mAllocated) + if (mRouters[i].IsAllocated()) { - if (!IsRouterIdValid(mRouters[i].mNextHop) && + if (!IsRouterIdValid(mRouters[i].GetNextHop()) && GetLinkCost(i) >= kMaxRouteCost && - (Timer::GetNow() - mRouters[i].mLastHeard) >= Timer::SecToMsec(kMaxLeaderToRouterTimeout)) + (Timer::GetNow() - mRouters[i].GetLastHeard()) >= Timer::SecToMsec(kMaxLeaderToRouterTimeout)) { ReleaseRouterId(i); } } - else if (mRouters[i].mReclaimDelay) + else if (mRouters[i].IsReclaimDelay()) { - if ((Timer::GetNow() - mRouters[i].mLastHeard) >= + if ((Timer::GetNow() - mRouters[i].GetLastHeard()) >= Timer::SecToMsec((kMaxLeaderToRouterTimeout + kRouterIdReuseDelay))) { - mRouters[i].mReclaimDelay = false; + mRouters[i].SetReclaimDelay(false); } } } @@ -1853,14 +1845,14 @@ void MleRouter::HandleChildUpdateRequestTimer(void) for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState == Neighbor::kStateRestored) + if (mChildren[i].GetState() == Neighbor::kStateRestored) { SendChildUpdateRequest(&mChildren[i]); - mChildren[i].mState = Neighbor::kStateChildUpdateRequest; + mChildren[i].SetState(Neighbor::kStateChildUpdateRequest); - if ((mChildren[i].mMode & ModeTlv::kModeRxOnWhenIdle) != 0) + if (mChildren[i].IsRxOnWhenIdle()) { - mChildren[i].mTimeout = Timer::MsecToSec(kMaxChildUpdateResponseTimeout); + mChildren[i].SetTimeout(Timer::MsecToSec(kMaxChildUpdateResponseTimeout)); } mChildUpdateRequestTimer.Start(kChildUpdateRequestPeriod); @@ -1887,22 +1879,19 @@ ThreadError MleRouter::SendParentResponse(Child *aChild, const ChallengeTlv &cha SuccessOrExit(error = AppendMleFrameCounter(*message)); SuccessOrExit(error = AppendResponse(*message, challenge.GetChallenge(), challenge.GetLength())); - for (uint8_t i = 0; i < sizeof(aChild->mAttachChallenge); i++) - { - aChild->mAttachChallenge[i] = static_cast(otPlatRandomGet()); - } + aChild->GenerateChallenge(); - SuccessOrExit(error = AppendChallenge(*message, aChild->mAttachChallenge, sizeof(aChild->mAttachChallenge))); + SuccessOrExit(error = AppendChallenge(*message, aChild->GetChallenge(), aChild->GetChallengeSize())); if (isAssignLinkQuality && - (memcmp(mAddr64.m8, aChild->mMacAddr.m8, OT_EXT_ADDRESS_SIZE) == 0)) + (memcmp(mAddr64.m8, &aChild->GetExtAddress(), OT_EXT_ADDRESS_SIZE) == 0)) { // use assigned one to ensure the link quality SuccessOrExit(error = AppendLinkMargin(*message, mAssignLinkMargin)); } else { - error = AppendLinkMargin(*message, aChild->mLinkInfo.GetLinkMargin(mNetif.GetMac().GetNoiseFloor())); + error = AppendLinkMargin(*message, aChild->GetLinkInfo().GetLinkMargin(mNetif.GetMac().GetNoiseFloor())); SuccessOrExit(error); } @@ -1911,7 +1900,7 @@ ThreadError MleRouter::SendParentResponse(Child *aChild, const ChallengeTlv &cha memset(&destination, 0, sizeof(destination)); destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(aChild->mMacAddr); + destination.SetIid(aChild->GetExtAddress()); if (aRoutersOnlyRequest) { @@ -1941,9 +1930,9 @@ ThreadError MleRouter::UpdateChildAddresses(const AddressRegistrationTlv &aTlv, const AddressRegistrationEntry *entry; Lowpan::Context context; - memset(aChild.mIp6Address, 0, sizeof(aChild.mIp6Address)); + aChild.ClearIp6Addresses(); - for (uint8_t count = 0; count < sizeof(aChild.mIp6Address) / sizeof(aChild.mIp6Address[0]); count++) + for (uint8_t count = 0; count < Child::kMaxIp6AddressPerChild; count++) { if ((entry = aTlv.GetAddressEntry(count)) == NULL) { @@ -1954,12 +1943,12 @@ ThreadError MleRouter::UpdateChildAddresses(const AddressRegistrationTlv &aTlv, { // xxx check if context id exists mNetif.GetNetworkDataLeader().GetContext(entry->GetContextId(), context); - memcpy(&aChild.mIp6Address[count], context.mPrefix, BitVectorBytes(context.mPrefixLength)); - aChild.mIp6Address[count].SetIid(entry->GetIid()); + memcpy(&aChild.GetIp6Address(count), context.mPrefix, BitVectorBytes(context.mPrefixLength)); + aChild.GetIp6Address(count).SetIid(entry->GetIid()); } else { - memcpy(&aChild.mIp6Address[count], entry->GetIp6Address(), sizeof(aChild.mIp6Address[count])); + aChild.GetIp6Address(count) = *entry->GetIp6Address(); } } @@ -1997,7 +1986,7 @@ ThreadError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6:: // Response SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kResponse, sizeof(response), response)); VerifyOrExit(response.IsValid() && - memcmp(response.GetResponse(), child->mAttachChallenge, sizeof(child->mAttachChallenge)) == 0); + memcmp(response.GetResponse(), child->GetChallenge(), child->GetChallengeSize()) == 0); // Link-Layer Frame Counter SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kLinkFrameCounter, sizeof(linkFrameCounter), @@ -2034,7 +2023,7 @@ ThreadError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6:: // TLV Request SuccessOrExit(error = Tlv::GetTlv(aMessage, Tlv::kTlvRequest, sizeof(tlvRequest), tlvRequest)); - VerifyOrExit(tlvRequest.IsValid() && tlvRequest.GetLength() <= sizeof(child->mRequestTlvs), + VerifyOrExit(tlvRequest.IsValid() && tlvRequest.GetLength() <= Child::kMaxRequestTlvs, error = kThreadError_Parse); // Active Timestamp @@ -2056,64 +2045,67 @@ ThreadError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6:: // Remove from router table for (int i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mState != Neighbor::kStateInvalid && - memcmp(&mRouters[i].mMacAddr, &macAddr, sizeof(mRouters[i].mMacAddr)) == 0) + if (mRouters[i].GetState() != Neighbor::kStateInvalid && + memcmp(&mRouters[i].GetExtAddress(), &macAddr, sizeof(macAddr)) == 0) { RemoveNeighbor(mRouters[i]); break; } } - if (child->mState != Neighbor::kStateValid) + if (child->GetState() != Neighbor::kStateValid) { - child->mState = Neighbor::kStateChildIdRequest; + child->SetState(Neighbor::kStateChildIdRequest); } else { - RemoveStoredChild(child->mValid.mRloc16); + RemoveStoredChild(child->GetRloc16()); - if (!(child->mMode & ModeTlv::kModeRxOnWhenIdle)) + if (!child->IsRxOnWhenIdle()) { mNetif.GetMeshForwarder().ClearChildIndirectMessages(*child); } } - child->mLastHeard = Timer::GetNow(); - child->mValid.mLinkFrameCounter = linkFrameCounter.GetFrameCounter(); - child->mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter(); - child->mKeySequence = aKeySequence; - child->mMode = mode.GetMode(); - child->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); - child->mTimeout = timeout.GetTimeout(); + child->SetLastHeard(Timer::GetNow()); + child->SetLinkFrameCounter(linkFrameCounter.GetFrameCounter()); + child->SetMleFrameCounter(mleFrameCounter.GetFrameCounter()); + child->SetKeySequence(aKeySequence); + child->SetDeviceMode(mode.GetMode()); + child->GetLinkInfo().AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); + child->SetTimeout(timeout.GetTimeout()); if (mode.GetMode() & ModeTlv::kModeFullNetworkData) { - child->mNetworkDataVersion = mLeaderData.GetDataVersion(); + child->SetNetworkDataVersion(mLeaderData.GetDataVersion()); } else { - child->mNetworkDataVersion = mLeaderData.GetStableDataVersion(); + child->SetNetworkDataVersion(mLeaderData.GetStableDataVersion()); } UpdateChildAddresses(address, *child); - memset(child->mRequestTlvs, Tlv::kInvalid, sizeof(child->mRequestTlvs)); - memcpy(child->mRequestTlvs, tlvRequest.GetTlvs(), tlvRequest.GetLength()); - numTlvs = tlvRequest.GetLength(); + child->ClearRequestTlvs(); + + for (numTlvs = 0; numTlvs < tlvRequest.GetLength(); numTlvs++) + { + child->SetRequestTlv(numTlvs, tlvRequest.GetTlvs()[numTlvs]); + } if (activeTimestamp.GetLength() == 0 || mNetif.GetActiveDataset().GetNetwork().GetTimestamp() == NULL || mNetif.GetActiveDataset().GetNetwork().GetTimestamp()->Compare(activeTimestamp) != 0) { - child->mRequestTlvs[numTlvs++] = Tlv::kActiveDataset; + child->SetRequestTlv(numTlvs++, Tlv::kActiveDataset); } if (pendingTimestamp.GetLength() == 0 || mNetif.GetPendingDataset().GetNetwork().GetTimestamp() == NULL || mNetif.GetPendingDataset().GetNetwork().GetTimestamp()->Compare(pendingTimestamp) != 0) { - child->mRequestTlvs[numTlvs++] = Tlv::kPendingDataset; + child->SetRequestTlv(numTlvs++, Tlv::kPendingDataset); } switch (GetDeviceState()) @@ -2124,7 +2116,7 @@ ThreadError MleRouter::HandleChildIdRequest(const Message &aMessage, const Ip6:: break; case kDeviceStateChild: - child->mState = Neighbor::kStateChildIdRequest; + child->SetState(Neighbor::kStateChildIdRequest); BecomeRouter(ThreadStatusTlv::kHaveChildIdRequest); break; @@ -2165,7 +2157,7 @@ ThreadError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const I tlvs[tlvslength++] = Tlv::kSourceAddress; - if ((child == NULL) || (child->mState != Neighbor::kStateValid)) + if ((child == NULL) || (child->GetState() != Neighbor::kStateValid)) { // Send Child Update Response with status TLV(error) for invalid non-sleepy child // No Child Update Response for invalid sleepy child @@ -2178,7 +2170,7 @@ ThreadError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const I ExitNow(); } - child->mMode = mode.GetMode(); + child->SetDeviceMode(mode.GetMode()); tlvs[tlvslength++] = Tlv::kMode; tlvs[tlvslength++] = Tlv::kLeaderData; @@ -2205,10 +2197,10 @@ ThreadError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const I { VerifyOrExit(leaderData.IsValid(), error = kThreadError_Parse); - if (child->mMode & ModeTlv::kModeFullNetworkData) + if (child->IsFullNetworkData()) { // full network data - child->mNetworkDataVersion = leaderData.GetDataVersion(); + child->SetNetworkDataVersion(leaderData.GetDataVersion()); if (leaderData.GetDataVersion() != mNetif.GetNetworkDataLeader().GetVersion()) { @@ -2218,7 +2210,7 @@ ThreadError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const I else { // stable network data - child->mNetworkDataVersion = leaderData.GetStableDataVersion(); + child->SetNetworkDataVersion(leaderData.GetStableDataVersion()); if (leaderData.GetStableDataVersion() != mNetif.GetNetworkDataLeader().GetStableVersion()) { @@ -2235,11 +2227,11 @@ ThreadError MleRouter::HandleChildUpdateRequest(const Message &aMessage, const I if (Tlv::GetTlv(aMessage, Tlv::kTimeout, sizeof(timeout), timeout) == kThreadError_None) { VerifyOrExit(timeout.IsValid(), error = kThreadError_Parse); - child->mTimeout = timeout.GetTimeout(); + child->SetTimeout(timeout.GetTimeout()); tlvs[tlvslength++] = Tlv::kTimeout; } - child->mLastHeard = Timer::GetNow(); + child->SetLastHeard(Timer::GetNow()); SendChildUpdateResponse(child, aMessageInfo, tlvs, tlvslength, &challenge); @@ -2273,35 +2265,35 @@ ThreadError MleRouter::HandleChildUpdateResponse(const Message &aMessage, const if (Tlv::GetTlv(aMessage, Tlv::kSourceAddress, sizeof(sourceAddress), sourceAddress) == kThreadError_None) { VerifyOrExit(sourceAddress.IsValid(), error = kThreadError_Parse); - VerifyOrExit(child->mValid.mRloc16 == sourceAddress.GetRloc16(), error = kThreadError_Parse); + VerifyOrExit(child->GetRloc16() == sourceAddress.GetRloc16(), error = kThreadError_Parse); } // Response if (Tlv::GetTlv(aMessage, Tlv::kResponse, sizeof(response), response) == kThreadError_None) { VerifyOrExit(response.IsValid() && - memcmp(response.GetResponse(), child->mAttachChallenge, sizeof(child->mAttachChallenge)) == 0); + memcmp(response.GetResponse(), child->GetChallenge(), child->GetChallengeSize()) == 0); } // Link-Layer Frame Counter if (Tlv::GetTlv(aMessage, Tlv::kLinkFrameCounter, sizeof(linkFrameCounter), linkFrameCounter) == kThreadError_None) { VerifyOrExit(linkFrameCounter.IsValid(), error = kThreadError_Parse); - child->mValid.mLinkFrameCounter = linkFrameCounter.GetFrameCounter(); + child->SetLinkFrameCounter(linkFrameCounter.GetFrameCounter()); } // MLE Frame Counter if (Tlv::GetTlv(aMessage, Tlv::kMleFrameCounter, sizeof(mleFrameCounter), mleFrameCounter) == kThreadError_None) { VerifyOrExit(mleFrameCounter.IsValid(), error = kThreadError_Parse); - child->mValid.mMleFrameCounter = mleFrameCounter.GetFrameCounter(); + child->SetMleFrameCounter(mleFrameCounter.GetFrameCounter()); } // Timeout if (Tlv::GetTlv(aMessage, Tlv::kTimeout, sizeof(timeout), timeout) == kThreadError_None) { VerifyOrExit(timeout.IsValid(), error = kThreadError_Parse); - child->mTimeout = timeout.GetTimeout(); + child->SetTimeout(timeout.GetTimeout()); } // Ip6 Address @@ -2316,20 +2308,20 @@ ThreadError MleRouter::HandleChildUpdateResponse(const Message &aMessage, const { VerifyOrExit(leaderData.IsValid(), error = kThreadError_Parse); - if (child->mMode & ModeTlv::kModeFullNetworkData) + if (child->IsFullNetworkData()) { - child->mNetworkDataVersion = leaderData.GetDataVersion(); + child->SetNetworkDataVersion(leaderData.GetDataVersion()); } else { - child->mNetworkDataVersion = leaderData.GetStableDataVersion(); + child->SetNetworkDataVersion(leaderData.GetStableDataVersion()); } } SetChildStateToValid(child); - child->mLastHeard = Timer::GetNow(); - child->mKeySequence = aKeySequence; - child->mLinkInfo.AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); + child->SetLastHeard(Timer::GetNow()); + child->SetKeySequence(aKeySequence); + child->GetLinkInfo().AddRss(mNetif.GetMac().GetNoiseFloor(), threadMessageInfo->mRss); exit: return error; @@ -2409,25 +2401,25 @@ ThreadError MleRouter::HandleNetworkDataUpdateRouter(void) { Child *child = &mChildren[i]; - if (child->mState != Neighbor::kStateValid || (child->mMode & ModeTlv::kModeRxOnWhenIdle) != 0) + if (child->GetState() != Neighbor::kStateValid || child->IsRxOnWhenIdle()) { continue; } memset(&destination, 0, sizeof(destination)); destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(child->mMacAddr); + destination.SetIid(child->GetExtAddress()); - if (child->mMode & ModeTlv::kModeFullNetworkData) + if (child->IsFullNetworkData()) { - if (child->mNetworkDataVersion != mNetif.GetNetworkDataLeader().GetVersion()) + if (child->GetNetworkDataVersion() != mNetif.GetNetworkDataLeader().GetVersion()) { SendDataResponse(destination, tlvs, sizeof(tlvs), 0); } } else { - if (child->mNetworkDataVersion != mNetif.GetNetworkDataLeader().GetStableVersion()) + if (child->GetNetworkDataVersion() != mNetif.GetNetworkDataLeader().GetStableVersion()) { SendDataResponse(destination, tlvs, sizeof(tlvs), 0); } @@ -2605,7 +2597,7 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild) SuccessOrExit(error = AppendActiveTimestamp(*message, false)); SuccessOrExit(error = AppendPendingTimestamp(*message)); - if (aChild->mState != Neighbor::kStateValid) + if (aChild->GetState() != Neighbor::kStateValid) { // pick next Child ID that is not being used do @@ -2620,17 +2612,17 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild) while (FindChild(mNextChildId) != NULL); // allocate Child ID - aChild->mValid.mRloc16 = mNetif.GetMac().GetShortAddress() | mNextChildId; + aChild->SetRloc16(mNetif.GetMac().GetShortAddress() | mNextChildId); } - SuccessOrExit(error = AppendAddress16(*message, aChild->mValid.mRloc16)); + SuccessOrExit(error = AppendAddress16(*message, aChild->GetRloc16())); - for (uint8_t i = 0; i < sizeof(aChild->mRequestTlvs); i++) + for (uint8_t i = 0; i < Child::kMaxRequestTlvs; i++) { - switch (aChild->mRequestTlvs[i]) + switch (aChild->GetRequestTlv(i)) { case Tlv::kNetworkData: - SuccessOrExit(error = AppendNetworkData(*message, (aChild->mMode & ModeTlv::kModeFullNetworkData) == 0)); + SuccessOrExit(error = AppendNetworkData(*message, !aChild->IsFullNetworkData())); break; case Tlv::kRoute: @@ -2650,21 +2642,21 @@ ThreadError MleRouter::SendChildIdResponse(Child *aChild) } } - if ((aChild->mMode & ModeTlv::kModeFFD) == 0) + if (!aChild->IsFullThreadDevice()) { SuccessOrExit(error = AppendChildAddresses(*message, *aChild)); } SetChildStateToValid(aChild); - if ((aChild->mMode & ModeTlv::kModeRxOnWhenIdle) == 0) + if (!aChild->IsRxOnWhenIdle()) { mNetif.GetMeshForwarder().GetSourceMatchController().SetSrcMatchAsShort(*aChild, false); } memset(&destination, 0, sizeof(destination)); destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(aChild->mMacAddr); + destination.SetIid(aChild->GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); otLogInfoMle(GetInstance(), "Sent Child ID Response"); @@ -2690,22 +2682,18 @@ ThreadError MleRouter::SendChildUpdateRequest(Child *aChild) SuccessOrExit(error = AppendHeader(*message, Header::kCommandChildUpdateRequest)); SuccessOrExit(error = AppendSourceAddress(*message)); SuccessOrExit(error = AppendLeaderData(*message)); - SuccessOrExit(error = AppendNetworkData(*message, (aChild->mMode & ModeTlv::kModeFullNetworkData) == 0)); + SuccessOrExit(error = AppendNetworkData(*message, !aChild->IsFullNetworkData())); SuccessOrExit(error = AppendActiveTimestamp(*message, false)); SuccessOrExit(error = AppendPendingTimestamp(*message)); SuccessOrExit(error = AppendTlvRequest(*message, tlvs, sizeof(tlvs))); - for (uint8_t i = 0; i < sizeof(aChild->mAttachChallenge); i++) - { - aChild->mAttachChallenge[i] = static_cast(otPlatRandomGet()); - } + aChild->GenerateChallenge(); - SuccessOrExit(error = AppendChallenge(*message, aChild->mAttachChallenge, - sizeof(aChild->mAttachChallenge))); + SuccessOrExit(error = AppendChallenge(*message, aChild->GetChallenge(), aChild->GetChallengeSize())); memset(&destination, 0, sizeof(destination)); destination.mFields.m16[0] = HostSwap16(0xfe80); - destination.SetIid(aChild->mMacAddr); + destination.SetIid(aChild->GetExtAddress()); SuccessOrExit(error = SendMessage(*message, destination)); otLogInfoMle(GetInstance(), "Sent Child Update Request to child"); @@ -2747,11 +2735,11 @@ ThreadError MleRouter::SendChildUpdateResponse(Child *aChild, const Ip6::Message break; case Tlv::kMode: - SuccessOrExit(error = AppendMode(*message, aChild->mMode)); + SuccessOrExit(error = AppendMode(*message, aChild->GetDeviceMode())); break; case Tlv::kNetworkData: - SuccessOrExit(error = AppendNetworkData(*message, (aChild->mMode & ModeTlv::kModeFullNetworkData) == 0)); + SuccessOrExit(error = AppendNetworkData(*message, !aChild->IsFullNetworkData())); SuccessOrExit(error = AppendActiveTimestamp(*message, false)); SuccessOrExit(error = AppendPendingTimestamp(*message)); break; @@ -2765,7 +2753,7 @@ ThreadError MleRouter::SendChildUpdateResponse(Child *aChild, const Ip6::Message break; case Tlv::kTimeout: - SuccessOrExit(error = AppendTimeout(*message, aChild->mTimeout)); + SuccessOrExit(error = AppendTimeout(*message, aChild->GetTimeout())); break; case Tlv::kMleFrameCounter: @@ -2813,7 +2801,7 @@ ThreadError MleRouter::SendDataResponse(const Ip6::Address &aDestination, const { case Tlv::kNetworkData: neighbor = GetNeighbor(aDestination); - stableOnly = neighbor != NULL ? (neighbor->mMode & ModeTlv::kModeFullNetworkData) == 0 : false; + stableOnly = neighbor != NULL ? !neighbor->IsFullNetworkData() : false; SuccessOrExit(error = AppendNetworkData(*message, stableOnly)); break; @@ -2852,7 +2840,7 @@ Child *MleRouter::GetChild(uint16_t aAddress) { for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].IsStateValidOrRestoring() && mChildren[i].mValid.mRloc16 == aAddress) + if (mChildren[i].IsStateValidOrRestoring() && mChildren[i].GetRloc16() == aAddress) { return &mChildren[i]; } @@ -2866,7 +2854,7 @@ Child *MleRouter::GetChild(const Mac::ExtAddress &aAddress) for (int i = 0; i < mMaxChildrenAllowed; i++) { if (mChildren[i].IsStateValidOrRestoring() && - memcmp(&mChildren[i].mMacAddr, &aAddress, sizeof(mChildren[i].mMacAddr)) == 0) + memcmp(&mChildren[i].GetExtAddress(), &aAddress, sizeof(aAddress)) == 0) { return &mChildren[i]; } @@ -2951,27 +2939,27 @@ ThreadError MleRouter::RemoveNeighbor(Neighbor &aNeighbor) case kDeviceStateRouter: case kDeviceStateLeader: - if (aNeighbor.IsStateValidOrRestoring() && !IsActiveRouter(aNeighbor.mValid.mRloc16)) + if (aNeighbor.IsStateValidOrRestoring() && !IsActiveRouter(aNeighbor.GetRloc16())) { - aNeighbor.mState = Neighbor::kStateInvalid; + aNeighbor.SetState(Neighbor::kStateInvalid); mNetif.GetMeshForwarder().UpdateIndirectMessages(); mNetif.SetStateChangedFlags(OT_THREAD_CHILD_REMOVED); - mNetif.GetNetworkDataLeader().SendServerDataNotification(aNeighbor.mValid.mRloc16); - RemoveStoredChild(aNeighbor.mValid.mRloc16); + mNetif.GetNetworkDataLeader().SendServerDataNotification(aNeighbor.GetRloc16()); + RemoveStoredChild(aNeighbor.GetRloc16()); } - else if ((aNeighbor.mState == Neighbor::kStateValid) && IsActiveRouter(aNeighbor.mValid.mRloc16)) + else if ((aNeighbor.GetState() == Neighbor::kStateValid) && IsActiveRouter(aNeighbor.GetRloc16())) { Router &routerToRemove = static_cast(aNeighbor); - routerToRemove.mLinkQualityOut = 0; - routerToRemove.mLastHeard = Timer::GetNow(); + routerToRemove.SetLinkQualityOut(0); + routerToRemove.SetLastHeard(Timer::GetNow()); for (uint8_t j = 0; j <= kMaxRouterId; j++) { - if (mRouters[j].mNextHop == GetRouterId(routerToRemove.mValid.mRloc16)) + if (mRouters[j].GetNextHop() == GetRouterId(routerToRemove.GetRloc16())) { - mRouters[j].mNextHop = kInvalidRouterId; - mRouters[j].mCost = 0; + mRouters[j].SetNextHop(kInvalidRouterId); + mRouters[j].SetCost(0); if (GetLinkCost(j) >= kMaxRouteCost) { @@ -2980,7 +2968,7 @@ ThreadError MleRouter::RemoveNeighbor(Neighbor &aNeighbor) } } - if (routerToRemove.mNextHop == kInvalidRouterId) + if (routerToRemove.GetNextHop() == kInvalidRouterId) { ResetAdvertiseInterval(); } @@ -2989,8 +2977,8 @@ ThreadError MleRouter::RemoveNeighbor(Neighbor &aNeighbor) break; } - aNeighbor.mLinkInfo.Clear(); - aNeighbor.mState = Neighbor::kStateInvalid; + aNeighbor.GetLinkInfo().Clear(); + aNeighbor.SetState(Neighbor::kStateInvalid); return kThreadError_None; } @@ -3018,7 +3006,7 @@ Neighbor *MleRouter::GetNeighbor(uint16_t aAddress) case kDeviceStateLeader: for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].IsStateValidOrRestoring() && mChildren[i].mValid.mRloc16 == aAddress) + if (mChildren[i].IsStateValidOrRestoring() && mChildren[i].GetRloc16() == aAddress) { ExitNow(rval = &mChildren[i]); } @@ -3026,7 +3014,7 @@ Neighbor *MleRouter::GetNeighbor(uint16_t aAddress) for (int i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mState == Neighbor::kStateValid && mRouters[i].mValid.mRloc16 == aAddress) + if (mRouters[i].GetState() == Neighbor::kStateValid && mRouters[i].GetRloc16() == aAddress) { ExitNow(rval = &mRouters[i]); } @@ -3058,7 +3046,7 @@ Neighbor *MleRouter::GetNeighbor(const Mac::ExtAddress &aAddress) for (int i = 0; i < mMaxChildrenAllowed; i++) { if (mChildren[i].IsStateValidOrRestoring() && - memcmp(&mChildren[i].mMacAddr, &aAddress, sizeof(mChildren[i].mMacAddr)) == 0) + memcmp(&mChildren[i].GetExtAddress(), &aAddress, sizeof(aAddress)) == 0) { ExitNow(rval = &mChildren[i]); } @@ -3066,8 +3054,8 @@ Neighbor *MleRouter::GetNeighbor(const Mac::ExtAddress &aAddress) for (int i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mState == Neighbor::kStateValid && - memcmp(&mRouters[i].mMacAddr, &aAddress, sizeof(mRouters[i].mMacAddr)) == 0) + if (mRouters[i].GetState() == Neighbor::kStateValid && + memcmp(&mRouters[i].GetExtAddress(), &aAddress, sizeof(aAddress)) == 0) { ExitNow(rval = &mRouters[i]); } @@ -3150,14 +3138,14 @@ Neighbor *MleRouter::GetNeighbor(const Ip6::Address &aAddress) aAddress.mFields.m16[4] == HostSwap16(0x0000) && aAddress.mFields.m16[5] == HostSwap16(0x00ff) && aAddress.mFields.m16[6] == HostSwap16(0xfe00) && - aAddress.mFields.m16[7] == HostSwap16(child->mValid.mRloc16)) + aAddress.mFields.m16[7] == HostSwap16(child->GetRloc16())) { ExitNow(rval = child); } - for (int j = 0; j < Child::kMaxIp6AddressPerChild; j++) + for (uint8_t j = 0; j < Child::kMaxIp6AddressPerChild; j++) { - if (memcmp(&child->mIp6Address[j], aAddress.mFields.m8, sizeof(child->mIp6Address[j])) == 0) + if (child->GetIp6Address(j) == aAddress) { ExitNow(rval = child); } @@ -3170,7 +3158,7 @@ Neighbor *MleRouter::GetNeighbor(const Ip6::Address &aAddress) { router = &mRouters[i]; - if (router->mState != Neighbor::kStateValid) + if (router->GetState() != Neighbor::kStateValid) { continue; } @@ -3178,7 +3166,7 @@ Neighbor *MleRouter::GetNeighbor(const Ip6::Address &aAddress) if (aAddress.mFields.m16[4] == HostSwap16(0x0000) && aAddress.mFields.m16[5] == HostSwap16(0x00ff) && aAddress.mFields.m16[6] == HostSwap16(0xfe00) && - aAddress.mFields.m16[7] == HostSwap16(router->mValid.mRloc16)) + aAddress.mFields.m16[7] == HostSwap16(router->GetRloc16())) { ExitNow(rval = router); } @@ -3214,12 +3202,12 @@ uint16_t MleRouter::GetNextHop(uint16_t aDestination) linkCost = GetLinkCost(destinationId); routeCost = GetRouteCost(aDestination); - if ((routeCost + GetLinkCost(router->mNextHop)) < linkCost) + if ((routeCost + GetLinkCost(router->GetNextHop())) < linkCost) { - nextHop = GetRouter(router->mNextHop); - VerifyOrExit(nextHop != NULL && nextHop->mState != Neighbor::kStateInvalid); + nextHop = GetRouter(router->GetNextHop()); + VerifyOrExit(nextHop != NULL && nextHop->GetState() != Neighbor::kStateInvalid); - rval = GetRloc16(router->mNextHop); + rval = GetRloc16(router->GetNextHop()); } else if (linkCost < kMaxRouteCost) { @@ -3236,9 +3224,9 @@ uint8_t MleRouter::GetRouteCost(uint16_t aRloc16) const const Router *router; router = GetRouter(GetRouterId(aRloc16)); - VerifyOrExit(router != NULL && GetRouter(router->mNextHop) != NULL); + VerifyOrExit(router != NULL && GetRouter(router->GetNextHop()) != NULL); - rval = router->mCost; + rval = router->GetCost(); exit: return rval; @@ -3345,15 +3333,15 @@ ThreadError MleRouter::RestoreChildren(void) VerifyOrExit((child = NewChild()) != NULL, error = kThreadError_NoBufs); memset(child, 0, sizeof(*child)); - memcpy(&child->mMacAddr, &childInfo.mExtAddress, sizeof(child->mMacAddr)); - child->mValid.mRloc16 = childInfo.mRloc16; - child->mTimeout = childInfo.mTimeout; - child->mMode = (childInfo.mRxOnWhenIdle ? ModeTlv::kModeRxOnWhenIdle : 0) | - (childInfo.mSecureDataRequest ? ModeTlv::kModeSecureDataRequest : 0) | - (childInfo.mFullFunction ? ModeTlv::kModeFFD : 0) | - (childInfo.mFullNetworkData ? ModeTlv::kModeFullNetworkData : 0); - child->mState = Neighbor::kStateRestored; - child->mLastHeard = Timer::GetNow(); + child->SetExtAddress(*static_cast(&childInfo.mExtAddress)); + child->SetRloc16(childInfo.mRloc16); + child->SetTimeout(childInfo.mTimeout); + child->SetDeviceMode((childInfo.mRxOnWhenIdle ? ModeTlv::kModeRxOnWhenIdle : 0) | + (childInfo.mSecureDataRequest ? ModeTlv::kModeSecureDataRequest : 0) | + (childInfo.mFullFunction ? ModeTlv::kModeFFD : 0) | + (childInfo.mFullNetworkData ? ModeTlv::kModeFullNetworkData : 0)); + child->SetState(Neighbor::kStateRestored); + child->SetLastHeard(Timer::GetNow()); mNetif.GetMeshForwarder().GetSourceMatchController().SetSrcMatchAsShort(*child, true); } @@ -3409,9 +3397,9 @@ ThreadError MleRouter::RefreshStoredChildren(void) for (uint8_t i = 0; i < kMaxChildren; i++) { - if (mChildren[i].mState != Neighbor::kStateInvalid) + if (mChildren[i].GetState() != Neighbor::kStateInvalid) { - SuccessOrExit(error = StoreChild(mChildren[i].mValid.mRloc16)); + SuccessOrExit(error = StoreChild(mChildren[i].GetRloc16())); } } @@ -3423,24 +3411,24 @@ ThreadError MleRouter::GetChildInfo(Child &aChild, otChildInfo &aChildInfo) { ThreadError error = kThreadError_None; - VerifyOrExit(aChild.mState == Neighbor::kStateValid, error = kThreadError_NotFound); + VerifyOrExit(aChild.GetState() == Neighbor::kStateValid, error = kThreadError_NotFound); memset(&aChildInfo, 0, sizeof(aChildInfo)); - memcpy(&aChildInfo.mExtAddress, &aChild.mMacAddr, sizeof(aChildInfo.mExtAddress)); + memcpy(&aChildInfo.mExtAddress, &aChild.GetExtAddress(), sizeof(aChildInfo.mExtAddress)); - aChildInfo.mTimeout = aChild.mTimeout; - aChildInfo.mRloc16 = aChild.mValid.mRloc16; - aChildInfo.mChildId = GetChildId(aChild.mValid.mRloc16); - aChildInfo.mNetworkDataVersion = aChild.mNetworkDataVersion; - aChildInfo.mAge = Timer::MsecToSec(Timer::GetNow() - aChild.mLastHeard); - aChildInfo.mLinkQualityIn = aChild.mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); - aChildInfo.mAverageRssi = aChild.mLinkInfo.GetAverageRss(); - aChildInfo.mLastRssi = aChild.mLinkInfo.GetLastRss(); + aChildInfo.mTimeout = aChild.GetTimeout(); + aChildInfo.mRloc16 = aChild.GetRloc16(); + aChildInfo.mChildId = GetChildId(aChild.GetRloc16()); + aChildInfo.mNetworkDataVersion = aChild.GetNetworkDataVersion(); + aChildInfo.mAge = Timer::MsecToSec(Timer::GetNow() - aChild.GetLastHeard()); + aChildInfo.mLinkQualityIn = aChild.GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); + aChildInfo.mAverageRssi = aChild.GetLinkInfo().GetAverageRss(); + aChildInfo.mLastRssi = aChild.GetLinkInfo().GetLastRss(); - aChildInfo.mRxOnWhenIdle = (aChild.mMode & ModeTlv::kModeRxOnWhenIdle) != 0; - aChildInfo.mSecureDataRequest = (aChild.mMode & ModeTlv::kModeSecureDataRequest) != 0; - aChildInfo.mFullFunction = (aChild.mMode & ModeTlv::kModeFFD) != 0; - aChildInfo.mFullNetworkData = (aChild.mMode & ModeTlv::kModeFullNetworkData) != 0; + aChildInfo.mRxOnWhenIdle = aChild.IsRxOnWhenIdle(); + aChildInfo.mSecureDataRequest = aChild.IsSecureDataRequest(); + aChildInfo.mFullFunction = aChild.IsFullThreadDevice(); + aChildInfo.mFullNetworkData = aChild.IsFullNetworkData(); exit: return error; @@ -3464,17 +3452,17 @@ ThreadError MleRouter::GetRouterInfo(uint16_t aRouterId, otRouterInfo &aRouterIn router = GetRouter(routerId); VerifyOrExit(router != NULL, error = kThreadError_InvalidArgs); - memcpy(&aRouterInfo.mExtAddress, &router->mMacAddr, sizeof(aRouterInfo.mExtAddress)); + memcpy(&aRouterInfo.mExtAddress, &router->GetExtAddress(), sizeof(aRouterInfo.mExtAddress)); - aRouterInfo.mAllocated = router->mAllocated; + aRouterInfo.mAllocated = router->IsAllocated(); aRouterInfo.mRouterId = routerId; aRouterInfo.mRloc16 = GetRloc16(routerId); - aRouterInfo.mNextHop = router->mNextHop; - aRouterInfo.mLinkEstablished = router->mState == Neighbor::kStateValid; - aRouterInfo.mPathCost = router->mCost; - aRouterInfo.mLinkQualityIn = router->mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); - aRouterInfo.mLinkQualityOut = router->mLinkQualityOut; - aRouterInfo.mAge = static_cast(Timer::MsecToSec(Timer::GetNow() - router->mLastHeard)); + aRouterInfo.mNextHop = router->GetNextHop(); + aRouterInfo.mLinkEstablished = router->GetState() == Neighbor::kStateValid; + aRouterInfo.mPathCost = router->GetCost(); + aRouterInfo.mLinkQualityIn = router->GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); + aRouterInfo.mLinkQualityOut = router->GetLinkQualityOut(); + aRouterInfo.mAge = static_cast(Timer::MsecToSec(Timer::GetNow() - router->GetLastHeard())); exit: return error; @@ -3494,7 +3482,7 @@ ThreadError MleRouter::GetNextNeighborInfo(otNeighborInfoIterator &aIterator, ot { for (index = aIterator; index < mMaxChildrenAllowed; index++) { - if (mChildren[index].mState == Neighbor::kStateValid) + if (mChildren[index].GetState() == Neighbor::kStateValid) { neighbor = &mChildren[index]; aNeighInfo.mIsChild = true; @@ -3511,7 +3499,7 @@ ThreadError MleRouter::GetNextNeighborInfo(otNeighborInfoIterator &aIterator, ot for (index = -aIterator; index <= kMaxRouterId; index++) { - if (mRouters[index].mState == Neighbor::kStateValid) + if (mRouters[index].GetState() == Neighbor::kStateValid) { neighbor = &mRouters[index]; aNeighInfo.mIsChild = false; @@ -3528,18 +3516,18 @@ exit: if (neighbor != NULL) { - memcpy(&aNeighInfo.mExtAddress, &neighbor->mMacAddr, sizeof(aNeighInfo.mExtAddress)); - aNeighInfo.mAge = Timer::MsecToSec(Timer::GetNow() - neighbor->mLastHeard); - aNeighInfo.mRloc16 = neighbor->mValid.mRloc16; - aNeighInfo.mLinkFrameCounter = neighbor->mValid.mLinkFrameCounter; - aNeighInfo.mMleFrameCounter = neighbor->mValid.mMleFrameCounter; - aNeighInfo.mLinkQualityIn = neighbor->mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); - aNeighInfo.mAverageRssi = neighbor->mLinkInfo.GetAverageRss(); - aNeighInfo.mLastRssi = neighbor->mLinkInfo.GetLastRss(); - aNeighInfo.mRxOnWhenIdle = (neighbor->mMode & ModeTlv::kModeRxOnWhenIdle) != 0; - aNeighInfo.mSecureDataRequest = (neighbor->mMode & ModeTlv::kModeSecureDataRequest) != 0; - aNeighInfo.mFullFunction = (neighbor->mMode & ModeTlv::kModeFFD) != 0; - aNeighInfo.mFullNetworkData = (neighbor->mMode & ModeTlv::kModeFullNetworkData) != 0; + memcpy(&aNeighInfo.mExtAddress, &neighbor->GetExtAddress(), sizeof(aNeighInfo.mExtAddress)); + aNeighInfo.mAge = Timer::MsecToSec(Timer::GetNow() - neighbor->GetLastHeard()); + aNeighInfo.mRloc16 = neighbor->GetRloc16(); + aNeighInfo.mLinkFrameCounter = neighbor->GetLinkFrameCounter(); + aNeighInfo.mMleFrameCounter = neighbor->GetMleFrameCounter(); + aNeighInfo.mLinkQualityIn = neighbor->GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); + aNeighInfo.mAverageRssi = neighbor->GetLinkInfo().GetAverageRss(); + aNeighInfo.mLastRssi = neighbor->GetLinkInfo().GetLastRss(); + aNeighInfo.mRxOnWhenIdle = neighbor->IsRxOnWhenIdle(); + aNeighInfo.mSecureDataRequest = neighbor->IsSecureDataRequest(); + aNeighInfo.mFullFunction = neighbor->IsFullThreadDevice(); + aNeighInfo.mFullNetworkData = neighbor->IsFullNetworkData(); } return error; @@ -3554,7 +3542,7 @@ void MleRouter::ResolveRoutingLoops(uint16_t aSourceMac, uint16_t aDestRloc16) assert(router != NULL); // invalidate next hop - router->mNextHop = kInvalidRouterId; + router->SetNextHop(kInvalidRouterId); ResetAdvertiseInterval(); } } @@ -3768,7 +3756,7 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Header *aHeader, Message *aMe SuccessOrExit(SetStateRouter(GetRloc16(mRouterId))); - router->mCost = 0; + router->SetCost(0); // copy router id information mRouterIdSequence = routerMaskTlv.GetIdSequence(); @@ -3776,26 +3764,26 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Header *aHeader, Message *aMe for (uint8_t i = 0; i <= kMaxRouterId; i++) { - old = mRouters[i].mAllocated; - mRouters[i].mAllocated = routerMaskTlv.IsAssignedRouterIdSet(i); + old = mRouters[i].IsAllocated(); + mRouters[i].SetAllocated(routerMaskTlv.IsAssignedRouterIdSet(i)); - if (old && !mRouters[i].mAllocated) + if (old && !mRouters[i].IsAllocated()) { mNetif.GetAddressResolver().Remove(i); } } // Keep route path to the Leader reported by the parent before it is updated. - if (mRouters[GetLeaderId()].mCost == 0) + if (mRouters[GetLeaderId()].GetCost() == 0) { - mRouters[GetLeaderId()].mCost = mParentLeaderCost; + mRouters[GetLeaderId()].SetCost(mParentLeaderCost); } - mRouters[GetLeaderId()].mNextHop = GetRouterId(mParent.mValid.mRloc16); + mRouters[GetLeaderId()].SetNextHop(GetRouterId(mParent.GetRloc16())); // Keep link to the parent in order to response to Parent Requests before new link is established. - mRouters[GetRouterId(mParent.mValid.mRloc16)] = mParent; - mRouters[GetRouterId(mParent.mValid.mRloc16)].mAllocated = true; + mRouters[GetRouterId(mParent.GetRloc16())] = mParent; + mRouters[GetRouterId(mParent.GetRloc16())].SetAllocated(true); // send link request SendLinkRequest(NULL); @@ -3803,7 +3791,7 @@ void MleRouter::HandleAddressSolicitResponse(Coap::Header *aHeader, Message *aMe // send child id responses for (int i = 0; i < mMaxChildrenAllowed; i++) { - switch (mChildren[i].mState) + switch (mChildren[i].GetState()) { case Neighbor::kStateChildIdRequest: SendChildIdResponse(&mChildren[i]); @@ -3857,8 +3845,8 @@ void MleRouter::HandleAddressSolicit(Coap::Header &aHeader, Message &aMessage, c // see if allocation already exists for (uint8_t i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mAllocated && - memcmp(&mRouters[i].mMacAddr, macAddr64Tlv.GetMacAddr(), sizeof(mRouters[i].mMacAddr)) == 0) + if (mRouters[i].IsAllocated() && + memcmp(&mRouters[i].GetExtAddress(), macAddr64Tlv.GetMacAddr(), sizeof(mRouters[i].GetExtAddress())) == 0) { ExitNow(routerId = i); } @@ -3889,12 +3877,13 @@ void MleRouter::HandleAddressSolicit(Coap::Header &aHeader, Message &aMessage, c if (router != NULL) { - if (router->mAllocated && memcmp(&router->mMacAddr, macAddr64Tlv.GetMacAddr(), sizeof(router->mMacAddr))) + if (router->IsAllocated() && + memcmp(&router->GetExtAddress(), macAddr64Tlv.GetMacAddr(), sizeof(router->GetExtAddress()))) { // requested Router ID is allocated to another device routerId = kInvalidRouterId; } - else if (!router->mAllocated && router->mReclaimDelay) + else if (!router->IsAllocated() && router->IsReclaimDelay()) { // requested Router ID is deallocated but within ID_REUSE_DELAY period routerId = kInvalidRouterId; @@ -3920,7 +3909,7 @@ void MleRouter::HandleAddressSolicit(Coap::Header &aHeader, Message &aMessage, c if (router != NULL) { - memcpy(&router->mMacAddr, macAddr64Tlv.GetMacAddr(), sizeof(router->mMacAddr)); + router->SetExtAddress(*macAddr64Tlv.GetMacAddr()); } else { @@ -3968,7 +3957,7 @@ void MleRouter::SendAddressSolicitResponse(const Coap::Header &aRequestHeader, u for (uint8_t i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mAllocated) + if (mRouters[i].IsAllocated()) { routerMaskTlv.SetAssignedRouterId(i); } @@ -4020,7 +4009,7 @@ void MleRouter::HandleAddressRelease(Coap::Header &aHeader, Message &aMessage, router = GetRouter(routerId); VerifyOrExit(router != NULL && - memcmp(&router->mMacAddr, macAddr64Tlv.GetMacAddr(), sizeof(router->mMacAddr)) == 0); + memcmp(&router->GetExtAddress(), macAddr64Tlv.GetMacAddr(), sizeof(router->GetExtAddress())) == 0); ReleaseRouterId(routerId); @@ -4041,7 +4030,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) for (int i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState == Neighbor::kStateValid) + if (mChildren[i].GetState() == Neighbor::kStateValid) { numChildren++; } @@ -4061,7 +4050,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) tlv.SetLinkQuality2(0); tlv.SetLinkQuality3(0); - cost = mRouters[GetLeaderId()].mCost; + cost = mRouters[GetLeaderId()].GetCost(); switch (GetDeviceState()) { @@ -4071,7 +4060,7 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) break; case kDeviceStateChild: - switch (mParent.mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor())) + switch (mParent.GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor())) { case 1: tlv.SetLinkQuality1(tlv.GetLinkQuality1() + 1); @@ -4086,13 +4075,13 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) break; } - cost += LqiToCost(mParent.mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor())); + cost += LqiToCost(mParent.GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor())); break; case kDeviceStateRouter: - cost += GetLinkCost(mRouters[GetLeaderId()].mNextHop); + cost += GetLinkCost(mRouters[GetLeaderId()].GetNextHop()); - if (!IsRouterIdValid(mRouters[GetLeaderId()].mNextHop) || GetLinkCost(GetLeaderId()) < cost) + if (!IsRouterIdValid(mRouters[GetLeaderId()].GetNextHop()) || GetLinkCost(GetLeaderId()) < cost) { cost = GetLinkCost(GetLeaderId()); } @@ -4108,21 +4097,21 @@ void MleRouter::FillConnectivityTlv(ConnectivityTlv &aTlv) for (int i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mAllocated) + if (mRouters[i].IsAllocated()) { tlv.SetActiveRouters(tlv.GetActiveRouters() + 1); } - if (mRouters[i].mState != Neighbor::kStateValid || i == mRouterId) + if (mRouters[i].GetState() != Neighbor::kStateValid || i == mRouterId) { continue; } - lqi = mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); + lqi = mRouters[i].GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); - if (lqi > mRouters[i].mLinkQualityOut) + if (lqi > mRouters[i].GetLinkQualityOut()) { - lqi = mRouters[i].mLinkQualityOut; + lqi = mRouters[i].GetLinkQualityOut(); } switch (lqi) @@ -4173,24 +4162,24 @@ ThreadError MleRouter::AppendChildAddresses(Message &aMessage, Child &aChild) tlv.SetType(Tlv::kAddressRegistration); SuccessOrExit(error = aMessage.Append(&tlv, sizeof(tlv))); - for (size_t i = 0; i < sizeof(aChild.mIp6Address) / sizeof(aChild.mIp6Address[0]); i++) + for (uint8_t i = 0; i < Child::kMaxIp6AddressPerChild; i++) { - if (aChild.mIp6Address[i].IsUnspecified()) + if (aChild.GetIp6Address(i).IsUnspecified()) { break; } - if (mNetif.GetNetworkDataLeader().GetContext(aChild.mIp6Address[i], context) == kThreadError_None) + if (mNetif.GetNetworkDataLeader().GetContext(aChild.GetIp6Address(i), context) == kThreadError_None) { // compressed entry entry.SetContextId(context.mContextId); - entry.SetIid(aChild.mIp6Address[i].GetIid()); + entry.SetIid(aChild.GetIp6Address(i).GetIid()); } else { // uncompressed entry entry.SetUncompressed(); - entry.SetIp6Address(aChild.mIp6Address[i]); + entry.SetIp6Address(aChild.GetIp6Address(i)); } SuccessOrExit(error = aMessage.Append(&entry, entry.GetLength())); @@ -4215,7 +4204,7 @@ void MleRouter::FillRouteTlv(RouteTlv &tlv) for (uint8_t i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mAllocated == false) + if (mRouters[i].IsAllocated() == false) { continue; } @@ -4232,13 +4221,13 @@ void MleRouter::FillRouteTlv(RouteTlv &tlv) { linkCost = GetLinkCost(i); - if (!IsRouterIdValid(mRouters[i].mNextHop)) + if (!IsRouterIdValid(mRouters[i].GetNextHop())) { cost = linkCost; } else { - cost = mRouters[i].mCost + GetLinkCost(mRouters[i].mNextHop); + cost = mRouters[i].GetCost() + GetLinkCost(mRouters[i].GetNextHop()); if (linkCost < cost) { @@ -4252,17 +4241,17 @@ void MleRouter::FillRouteTlv(RouteTlv &tlv) } tlv.SetRouteCost(routeCount, cost); - tlv.SetLinkQualityOut(routeCount, mRouters[i].mLinkQualityOut); + tlv.SetLinkQualityOut(routeCount, mRouters[i].GetLinkQualityOut()); if (isAssignLinkQuality && - (memcmp(mRouters[i].mMacAddr.m8, mAddr64.m8, OT_EXT_ADDRESS_SIZE) == 0)) + (memcmp(&mRouters[i].GetExtAddress(), mAddr64.m8, OT_EXT_ADDRESS_SIZE) == 0)) { tlv.SetLinkQualityIn(routeCount, mAssignLinkQuality); } else { tlv.SetLinkQualityIn(routeCount, - mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor())); + mRouters[i].GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor())); } } @@ -4330,7 +4319,7 @@ bool MleRouter::HasOneNeighborwithComparableConnectivity(const RouteTlv &aRoute, } // check if neighbor is valid - if (mRouters[i].mState == Neighbor::kStateValid) + if (mRouters[i].GetState() == Neighbor::kStateValid) { // if neighbor is just peer if (i == aRouterId) @@ -4339,11 +4328,11 @@ bool MleRouter::HasOneNeighborwithComparableConnectivity(const RouteTlv &aRoute, continue; } - localLqi = mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); + localLqi = mRouters[i].GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); - if (localLqi > mRouters[i].mLinkQualityOut) + if (localLqi > mRouters[i].GetLinkQualityOut()) { - localLqi = mRouters[i].mLinkQualityOut; + localLqi = mRouters[i].GetLinkQualityOut(); } if (localLqi >= 2) @@ -4384,11 +4373,11 @@ exit: void MleRouter::SetChildStateToValid(Child *aChild) { - VerifyOrExit(aChild->mState != Neighbor::kStateValid); + VerifyOrExit(aChild->GetState() != Neighbor::kStateValid); - aChild->mState = Neighbor::kStateValid; + aChild->SetState(Neighbor::kStateValid); mNetif.SetStateChangedFlags(OT_THREAD_CHILD_ADDED); - StoreChild(aChild->mValid.mRloc16); + StoreChild(aChild->GetRloc16()); exit: return; @@ -4400,7 +4389,8 @@ bool MleRouter::HasChildren(void) for (uint8_t i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState == Neighbor::kStateRestored || mChildren[i].mState >= Neighbor::kStateChildIdRequest) + if (mChildren[i].GetState() == Neighbor::kStateRestored || + mChildren[i].GetState() >= Neighbor::kStateChildIdRequest) { ExitNow(hasChildren = true); } @@ -4414,7 +4404,7 @@ void MleRouter::RemoveChildren(void) { for (uint8_t i = 0; i < mMaxChildrenAllowed; i++) { - switch (mChildren[i].mState) + switch (mChildren[i].GetState()) { case Neighbor::kStateValid: mNetif.SetStateChangedFlags(OT_THREAD_CHILD_REMOVED); @@ -4423,14 +4413,14 @@ void MleRouter::RemoveChildren(void) case Neighbor::kStateChildUpdateRequest: case Neighbor::kStateRestored: - RemoveStoredChild(mChildren[i].mValid.mRloc16); + RemoveStoredChild(mChildren[i].GetRloc16()); break; default: break; } - mChildren[i].mState = Neighbor::kStateInvalid; + mChildren[i].SetState(Neighbor::kStateInvalid); } } @@ -4443,7 +4433,7 @@ bool MleRouter::HasSmallNumberOfChildren(void) for (uint8_t i = 0; i < mMaxChildrenAllowed; i++) { - if (mChildren[i].mState == Neighbor::kStateValid) + if (mChildren[i].GetState() == Neighbor::kStateValid) { numChildren++; } @@ -4462,16 +4452,16 @@ uint8_t MleRouter::GetMinDowngradeNeighborRouters(void) for (uint8_t i = 0; i <= kMaxRouterId; i++) { - if (mRouters[i].mState != Neighbor::kStateValid) + if (mRouters[i].GetState() != Neighbor::kStateValid) { continue; } - lqi = mRouters[i].mLinkInfo.GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); + lqi = mRouters[i].GetLinkInfo().GetLinkQuality(mNetif.GetMac().GetNoiseFloor()); - if (lqi > mRouters[i].mLinkQualityOut) + if (lqi > mRouters[i].GetLinkQualityOut()) { - lqi = mRouters[i].mLinkQualityOut; + lqi = mRouters[i].GetLinkQualityOut(); } if (lqi >= 2) diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index 67f568597..8f604384e 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -230,7 +230,7 @@ ThreadError NetworkDiagnostic::AppendChildTable(Message &aMessage) for (int i = 0; i < numChildren; i++) { - if (children[i].mState == Neighbor::kStateValid) + if (children[i].GetState() == Neighbor::kStateValid) { count++; } @@ -242,16 +242,16 @@ ThreadError NetworkDiagnostic::AppendChildTable(Message &aMessage) for (int i = 0; i < numChildren; i++) { - if (children[i].mState == Neighbor::kStateValid) + if (children[i].GetState() == Neighbor::kStateValid) { timeout = 0; - while (static_cast(1 << timeout) < children[i].mTimeout) { timeout++; } + while (static_cast(1 << timeout) < children[i].GetTimeout()) { timeout++; } entry.SetReserved(0); entry.SetTimeout(timeout + 4); - entry.SetChildId(mNetif.GetMle().GetChildId(children[i].mValid.mRloc16)); - entry.SetMode(children[i].mMode); + entry.SetChildId(mNetif.GetMle().GetChildId(children[i].GetRloc16())); + entry.SetMode(children[i].GetDeviceMode()); SuccessOrExit(error = aMessage.Append(&entry, sizeof(ChildTableEntry))); } diff --git a/src/core/thread/src_match_controller.cpp b/src/core/thread/src_match_controller.cpp index a92db6af2..8bfca5d18 100644 --- a/src/core/thread/src_match_controller.cpp +++ b/src/core/thread/src_match_controller.cpp @@ -56,7 +56,9 @@ otInstance *SourceMatchController::GetInstance(void) void SourceMatchController::IncrementMessageCount(Child &aChild) { - if (aChild.mQueuedMessageCount++ == 0) + aChild.IncrementIndirectMessageCount(); + + if (aChild.GetIndirectMessageCount() == 0) { AddEntry(aChild); } @@ -64,14 +66,16 @@ void SourceMatchController::IncrementMessageCount(Child &aChild) void SourceMatchController::DecrementMessageCount(Child &aChild) { - if (aChild.mQueuedMessageCount == 0) + if (aChild.GetIndirectMessageCount() == 0) { otLogWarnMac(GetInstance(), "DecrementMessageCount(child 0x%04x) called when already at zero count.", - aChild.mValid.mRloc16); + aChild.GetRloc16()); ExitNow(); } - if (--aChild.mQueuedMessageCount == 0) + aChild.DecrementIndirectMessageCount(); + + if (aChild.GetIndirectMessageCount() == 0) { ClearEntry(aChild); } @@ -82,7 +86,7 @@ exit: void SourceMatchController::ResetMessageCount(Child &aChild) { - aChild.mQueuedMessageCount = 0; + aChild.ResetIndirectMessageCount(); ClearEntry(aChild); } @@ -90,7 +94,7 @@ void SourceMatchController::SetSrcMatchAsShort(Child &aChild, bool aUseShortAddr { VerifyOrExit(aChild.mUseShortAddress != aUseShortAddress); - if (aChild.mQueuedMessageCount > 0) + if (aChild.GetIndirectMessageCount() > 0) { ClearEntry(aChild); aChild.mUseShortAddress = aUseShortAddress; @@ -144,18 +148,18 @@ ThreadError SourceMatchController::AddAddress(const Child &aChild) if (aChild.mUseShortAddress) { - error = otPlatRadioAddSrcMatchShortEntry(GetInstance(), aChild.mValid.mRloc16); + error = otPlatRadioAddSrcMatchShortEntry(GetInstance(), aChild.GetRloc16()); otLogDebgMac(GetInstance(), "SrcAddrMatch - Adding short addr: 0x%04x -- %s (%d)", - aChild.mValid.mRloc16, otThreadErrorToString(error), error); + aChild.GetRloc16(), otThreadErrorToString(error), error); } else { - uint8_t addr[sizeof(aChild.mMacAddr)]; + uint8_t addr[sizeof(aChild.GetExtAddress())]; for (uint8_t i = 0; i < sizeof(addr); i++) { - addr[i] = aChild.mMacAddr.m8[sizeof(addr) - 1 - i]; + addr[i] = aChild.GetExtAddress().m8[sizeof(addr) - 1 - i]; } error = otPlatRadioAddSrcMatchExtEntry(GetInstance(), addr); @@ -174,25 +178,25 @@ void SourceMatchController::ClearEntry(Child &aChild) if (aChild.mSourceMatchPending) { - otLogDebgMac(GetInstance(), "SrcAddrMatch - Clearing pending flag for 0x%04x", aChild.mValid.mRloc16); + otLogDebgMac(GetInstance(), "SrcAddrMatch - Clearing pending flag for 0x%04x", aChild.GetRloc16()); aChild.mSourceMatchPending = false; ExitNow(); } if (aChild.mUseShortAddress) { - error = otPlatRadioClearSrcMatchShortEntry(GetInstance(), aChild.mValid.mRloc16); + error = otPlatRadioClearSrcMatchShortEntry(GetInstance(), aChild.GetRloc16()); otLogDebgMac(GetInstance(), "SrcAddrMatch - Clearing short address: 0x%04x -- %s (%d)", - aChild.mValid.mRloc16, otThreadErrorToString(error), error); + aChild.GetRloc16(), otThreadErrorToString(error), error); } else { - uint8_t addr[sizeof(aChild.mMacAddr)]; + uint8_t addr[sizeof(aChild.GetExtAddress())]; for (uint8_t i = 0; i < sizeof(addr); i++) { - addr[i] = aChild.mMacAddr.m8[sizeof(aChild.mMacAddr) - 1 - i]; + addr[i] = aChild.GetExtAddress().m8[sizeof(aChild.GetExtAddress()) - 1 - i]; } error = otPlatRadioClearSrcMatchExtEntry(GetInstance(), addr); diff --git a/src/core/thread/thread_tlvs.hpp b/src/core/thread/thread_tlvs.hpp index d6e84fd08..08731f3ae 100644 --- a/src/core/thread/thread_tlvs.hpp +++ b/src/core/thread/thread_tlvs.hpp @@ -274,11 +274,22 @@ public: /** * This method sets the ML-EID IID. * - * @param[in] aIid A pointer to the ML-EID IID.. + * @param[in] aIid A pointer to the ML-EID IID. * */ void SetIid(const uint8_t *aIid) { memcpy(mIid, aIid, sizeof(mIid)); } + /** + * This method sets the ML-EID IID. + * + * @param[in] aExtAddress A reference to the MAC Extended Address. + * + */ + void SetIid(const Mac::ExtAddress &aExtAddress) { + memcpy(mIid, aExtAddress.m8, sizeof(mIid)); + mIid[0] ^= 0x2; + } + private: uint8_t mIid[8]; } OT_TOOL_PACKED_END; diff --git a/src/core/thread/topology.hpp b/src/core/thread/topology.hpp index 9ce6d89bf..368d7c020 100644 --- a/src/core/thread/topology.hpp +++ b/src/core/thread/topology.hpp @@ -35,6 +35,7 @@ #define TOPOLOGY_HPP_ #include +#include #include #include #include @@ -50,33 +51,11 @@ namespace Thread { class Neighbor { public: - Mac::ExtAddress mMacAddr; ///< The IEEE 802.15.4 Extended Address - uint32_t mLastHeard; ///< Time when last heard. - union - { - struct - { - uint32_t mLinkFrameCounter; ///< The Link Frame Counter - uint32_t mMleFrameCounter; ///< The MLE Frame Counter - uint16_t mRloc16; ///< The RLOC16 - } mValid; - struct - { - uint8_t mChallenge[Mle::ChallengeTlv::kMaxSize]; ///< The challenge value - uint8_t mChallengeLength; ///< The challenge length - } mPending; - }; - - uint32_t mKeySequence; ///< Current key sequence - /** * Neighbor link states. * */ enum State -#if _WIN32 - : unsigned int -#endif { kStateInvalid, ///< Neighbor link is invalid kStateRestored, ///< Neighbor is restored from non-volatile memory @@ -87,11 +66,21 @@ public: kStateValid, ///< Link is valid }; - State mState : 3; ///< The link state - uint8_t mMode : 4; ///< The MLE device mode - bool mDataRequest : 1; ///< Indicates whether or not a Data Poll was received - uint8_t mLinkFailures; ///< Consecutive link failure count - LinkQualityInfo mLinkInfo; ///< Link quality info (contains average RSS, link margin and link quality) + /** + * This method returns the current state. + * + * @returns The current state. + * + */ + State GetState(void) const { return static_cast(mState); } + + /** + * This method sets the current state. + * + * @param[in] aState The state value. + * + */ + void SetState(State aState) { mState = static_cast(aState); } /** * Check if the neighbor/child is in valid state or if it is being restored. @@ -112,6 +101,258 @@ public: } } + /** + * This method gets the device mode flags. + * + * @returns The device mode flags. + * + */ + uint8_t GetDeviceMode(void) const { return mMode; } + + /** + * This method sets the device mode flags. + * + * @param[in] aMode The device mode flags. + * + */ + void SetDeviceMode(uint8_t aMode) { mMode = aMode; } + + /** + * This method indicates whether or not the device is rx-on-when-idle. + * + * @returns TRUE if rx-on-when-idle, FALSE otherwise. + * + */ + bool IsRxOnWhenIdle(void) const { return (mMode & Mle::ModeTlv::kModeRxOnWhenIdle) != 0; } + + /** + * This method indicates whether or not the device is a Full Thread Device. + * + * @returns TRUE if a Full Thread Device, FALSE otherwise. + * + */ + bool IsFullThreadDevice(void) const { return (mMode & Mle::ModeTlv::kModeFFD) != 0; } + + /** + * This method indicates whether or not the device uses secure IEEE 802.15.4 Data Request messages. + * + * @returns TRUE if using secure IEEE 802.15.4 Data Request messages, FALSE otherwise. + * + */ + bool IsSecureDataRequest(void) const { return (mMode & Mle::ModeTlv::kModeSecureDataRequest) != 0; } + + /** + * This method indicates whether or not the device requests Full Network Data. + * + * @returns TRUE if requests Full Network Data, FALSE otherwise. + * + */ + bool IsFullNetworkData(void) const { return (mMode & Mle::ModeTlv::kModeFullNetworkData) != 0; } + + /** + * This method sets all bytes of the Extended Address to zero. + * + */ + void ClearExtAddress(void) { memset(&mMacAddr, 0, sizeof(mMacAddr)); } + + /** + * This method returns the Extended Address. + * + * @returns A reference to the Extended Address. + * + */ + Mac::ExtAddress &GetExtAddress(void) { return mMacAddr; } + + /** + * This method returns the Extended Address. + * + * @returns A reference to the Extended Address. + * + */ + const Mac::ExtAddress &GetExtAddress(void) const { return mMacAddr; } + + /** + * This method sets the Extended Address. + * + * @param[in] aAddress The Extended Address value to set. + * + */ + void SetExtAddress(const Mac::ExtAddress &aAddress) { mMacAddr = aAddress; } + + /** + * This method gets the key sequence value. + * + * @returns The key sequence value. + * + */ + uint32_t GetKeySequence(void) const { return mKeySequence; } + + /** + * This method sets the key sequence value. + * + * @parma[in] aKeySequence The key sequence value. + * + */ + void SetKeySequence(uint32_t aKeySequence) { mKeySequence = aKeySequence; } + + /** + * This method returns the last heard time. + * + * @returns The last heard time. + * + */ + uint32_t GetLastHeard(void) const { return mLastHeard; } + + /** + * This method sets the last heard time. + * + * @param[in] aLastHeard The last heard time. + * + */ + void SetLastHeard(uint32_t aLastHeard) { mLastHeard = aLastHeard; } + + /** + * This method gets the link frame counter value. + * + * @returns The link frame counter value. + * + */ + uint32_t GetLinkFrameCounter(void) const { return mValid.mLinkFrameCounter; } + + /** + * This method sets the link frame counter value. + * + * @param[in] aFrameCounter The link frame counter value. + * + */ + void SetLinkFrameCounter(uint32_t aFrameCounter) { mValid.mLinkFrameCounter = aFrameCounter; } + + /** + * This method gets the MLE frame counter value. + * + * @returns The MLE frame counter value. + * + */ + uint32_t GetMleFrameCounter(void) const { return mValid.mMleFrameCounter; } + + /** + * This method sets the MLE frame counter value. + * + * @param[in] aFrameCounter The MLE frame counter value. + * + */ + void SetMleFrameCounter(uint32_t aFrameCounter) { mValid.mMleFrameCounter = aFrameCounter; } + + /** + * This method gets the RLOC16 value. + * + * @returns The RLOC16 value. + * + */ + uint16_t GetRloc16(void) const { return mValid.mRloc16; } + + /** + * This method sets the RLOC16 value. + * + * @param[in] aRloc16 The RLOC16 value. + * + */ + void SetRloc16(uint16_t aRloc16) { mValid.mRloc16 = aRloc16; } + + /** + * This method indicates whether an IEEE 802.15.4 Data Request message was received. + * + * @returns TRUE if an IEEE 802.15.4 Data Request message was received, FALSE otherwise. + * + */ + bool IsDataRequestPending(void) const { return mDataRequest; } + + /** + * This method sets the indicator for whether an IEEE 802.15.4 Data Request message was received. + * + * @param[in] aPending TRUE if an IEEE 802.15.4 Data Request message was received, FALSE otherwise. + * + */ + void SetDataRequestPending(bool aPending) { mDataRequest = aPending; } + + /** + * This method gets the number of consecutive link failures. + * + * @returns The number of consecutive link failures. + * + */ + uint8_t GetLinkFailures(void) const { return mLinkFailures; } + + /** + * This method increments the number of consecutive link failures. + * + */ + void IncrementLinkFailures(void) { mLinkFailures++; } + + /** + * This method resets the number of consecutive link failures to zero. + * + */ + void ResetLinkFailures(void) { mLinkFailures = 0; } + + /** + * This method returns the LinkQualityInfo object. + * + * @returns The LinkQualityInfo object. + * + */ + LinkQualityInfo &GetLinkInfo(void) { return mLinkInfo; } + + /** + * This method generates a new challenge value for MLE Link Request/Response exchanges. + * + */ + void GenerateChallenge(void) { + for (uint8_t i = 0; i < sizeof(mPending.mChallenge); i++) { + mPending.mChallenge[i] = static_cast(otPlatRandomGet()); + } + } + + /** + * This method returns the current challenge value for MLE Link Request/Response exchanges. + * + * @returns The current challenge value. + * + */ + const uint8_t *GetChallenge(void) const { return mPending.mChallenge; } + + /** + * This method returns the size (byets) of the challenge value for MLE Link Request/Response exchanges. + * + * @returns The size (byets) of the challenge value for MLE Link Request/Response exchanges. + * + */ + uint8_t GetChallengeSize(void) const { return sizeof(mPending.mChallenge); } + +private: + Mac::ExtAddress mMacAddr; ///< The IEEE 802.15.4 Extended Address + uint32_t mLastHeard; ///< Time when last heard. + union + { + struct + { + uint32_t mLinkFrameCounter; ///< The Link Frame Counter + uint32_t mMleFrameCounter; ///< The MLE Frame Counter + uint16_t mRloc16; ///< The RLOC16 + } mValid; + struct + { + uint8_t mChallenge[Mle::ChallengeTlv::kMaxSize]; ///< The challenge value + uint8_t mChallengeLength; ///< The challenge length + } mPending; + }; + + uint32_t mKeySequence; ///< Current key sequence + uint8_t mState : 3; ///< The link state + uint8_t mMode : 4; ///< The MLE device mode + bool mDataRequest : 1; ///< Indicates whether or not a Data Poll was received + uint8_t mLinkFailures; ///< Consecutive link failure count + LinkQualityInfo mLinkInfo; ///< Link quality info (contains average RSS, link margin and link quality) }; /** @@ -129,31 +370,211 @@ public: kMaxRequestTlvs = 5, }; - Ip6::Address mIp6Address[kMaxIp6AddressPerChild]; ///< Registered IPv6 addresses - uint32_t mTimeout; ///< Child timeout - struct - { - uint32_t mFrameCounter; ///< Frame counter for current indirect message (used fore retx). - Message *mMessage; ///< Current indirect message. - uint16_t mFragmentOffset; ///< 6LoWPAN fragment offset for the indirect message. - uint8_t mKeyId; ///< Key Id for current indirect message (used for retx). - uint8_t mTxAttemptCounter; ///< Number of data poll triggered tx attempts. - uint8_t mDataSequenceNumber; ///< MAC level Data Sequence Number (DSN) for retx attempts. - } mIndirectSendInfo; ///< Info about current outbound indirect message. - union - { - uint8_t mRequestTlvs[kMaxRequestTlvs]; ///< Requested MLE TLVs - uint8_t mAttachChallenge[Mle::ChallengeTlv::kMaxSize]; ///< The challenge value - }; - uint8_t mNetworkDataVersion; ///< Current Network Data version - /** - * This method checks if a short or extended address should be used. - * - * @returns `true` if a short address should be used, `false` for extended address. + * This method clears the IPv6 addresses for the child. * */ - bool ShouldUseShortAddress(void) const { return mUseShortAddress; } + void ClearIp6Addresses(void) { memset(mIp6Address, 0, sizeof(mIp6Address)); } + + /** + * This method gets the IPv6 address at index @p aIndex. + * + * @param[in] aIndex The index into the IPv6 address list. + * + * @returns A reference to the IPv6 address entry at index @p aIndex. + * + */ + Ip6::Address &GetIp6Address(uint8_t aIndex) { return mIp6Address[aIndex]; } + + /** + * This method gets the child timeout. + * + * @returns The child timeout. + * + */ + uint32_t GetTimeout(void) const { return mTimeout; } + + /** + * This method sets the child timeout. + * + * @param[in] aTimeout The child timeout. + * + */ + void SetTimeout(uint32_t aTimeout) { mTimeout = aTimeout; } + + /** + * This method gets the network data version. + * + * @returns The network data version. + * + */ + uint8_t GetNetworkDataVersion(void) const { return mNetworkDataVersion; } + + /** + * This method sets the network data version. + * + * @param[in] aVersion The network data version. + * + */ + void SetNetworkDataVersion(uint8_t aVersion) { mNetworkDataVersion = aVersion; } + + /** + * This method generates a new challenge value to use during a child attach. + * + */ + void GenerateChallenge(void) { + for (uint8_t i = 0; i < sizeof(mAttachChallenge); i++) { + mAttachChallenge[i] = static_cast(otPlatRandomGet()); + } + } + + /** + * This method gets the current challenge value used during attach. + * + * @returns The current challenge value. + * + */ + const uint8_t *GetChallenge(void) const { return mAttachChallenge; } + + /** + * This method gets the challenge size (bytes) used during attach. + * + * @returns The challenge size (bytes). + * + */ + uint8_t GetChallengeSize(void) const { return sizeof(mAttachChallenge); } + + /** + * This method gets the IEEE 802.15.4 Frame Counter used during indirect retransmissions. + * + * @returns The IEEE 802.15.4 Frame Counter value. + * + */ + uint32_t GetIndirectFrameCounter(void) const { return mIndirectFrameCounter; } + + /** + * This method sets the IEEE 802.15.4 Frame Counter to use during indirect retransmissions. + * + * @param[in] aFrameCounter The IEEE 802.15.4 Frame Counter value. + * + */ + void SetIndirectFrameCounter(uint32_t aFrameCounter) { mIndirectFrameCounter = aFrameCounter; } + + /** + * This method gets the message buffer to use for indirect transmissions. + * + * @returns The message buffer. + * + */ + Message *GetIndirectMessage(void) { return mIndirectMessage; } + + /** + * This method sets the message buffer to use for indirect transmissions. + * + * @param[in] aMessage The message buffer. + * + */ + void SetIndirectMessage(Message *aMessage) { mIndirectMessage = aMessage; } + + /** + * This method gets the 6LoWPAN Fragment Offset to use for indirect transmissions. + * + * @returns The 6LoWPAN Fragment Offset value. + * + */ + uint16_t GetIndirectFragmentOffset(void) const { return mIndirectFragmentOffset; } + + /** + * This method sets the 6LoWPAN Fragment Offset to use for indirect transmissions. + * + * @param[in] aFragmentOffset The 6LoWPAN Fragment Offset value to use. + * + */ + void SetIndirectFragmentOffset(uint16_t aFragmentOffset) { mIndirectFragmentOffset = aFragmentOffset; } + + /** + * This method gets the IEEE 802.15.4 Key ID to use for indirect retransmissions. + * + * @returns The IEEE 802.15.4 Key ID value. + * + */ + uint8_t GetIndirectKeyId(void) const { return mIndirectKeyId; } + + /** + * This method sets the IEEE 802.15.4 Key ID value to use for indirect retransmissions. + * + * @param[in] aKeyId The IEEE 802.15.4 Key ID value. + * + */ + void SetIndirectKeyId(uint8_t aKeyId) { mIndirectKeyId = aKeyId; } + + /** + * This method gets the number of indirect transmission attempts for the current message. + * + * @returns The number of indirect transmission attempts. + * + */ + uint8_t GetIndirectTxAttempts(void) const { return mIndirectTxAttempts; } + + /** + * This method resets the number of indirect transmission attempts to zero. + * + */ + void ResetIndirectTxAttempts(void) { mIndirectTxAttempts = 0; } + + /** + * This method increments the number of indirect transmission attempts. + * + */ + void IncrementIndirectTxAttempts(void) { mIndirectTxAttempts++; } + + /** + * This method gets the IEEE 802.15.4 Data Sequence Number to use during indirect retransmissions. + * + * @returns The IEEE 802.15.4 Data Sequence Number value. + * + */ + uint8_t GetIndirectDataSequenceNumber(void) const { return mIndirectDsn; } + + /** + * This method sets the IEEE 802.15.4 Data Sequence Number to use during indirect retransmissions. + * + * @param[in] aDsn The IEEE 802.15.4 Data Sequence Number value. + * + */ + void SetIndirectDataSequenceNumber(uint8_t aDsn) { mIndirectDsn = aDsn; } + + /** + * This method indicates whether or not to source match on the source address. + * + * @returns TRUE if using the short address, FALSE if using the extended address. + * + */ + bool IsIndirectSourceMatchShort(void) const { return mUseShortAddress; } + + /** + * This method sets whether or not to source match on the source address. + * + * @param[in] aShort TRUE if using the short address, FALSE if using the extended address. + * + */ + void SetIndirectSourceMatchShort(bool aShort) { mUseShortAddress = aShort; } + + /** + * This method indicates whether or not the child needs to be added to the source match table. + * + * @returns TRUE if the child needs to be added to the source match table, FALSE otherwise. + * + */ + bool IsIndirectSourceMatchPending(void) const { return mSourceMatchPending; } + + /** + * This method sets whether or not the child needs to be added to the source match table. + * + * @param[in] aPending TRUE if the child needs to be added to the source match table, FALSE otherwise. + * + */ + void SetIndirectSourceMatchPending(bool aPending) { mSourceMatchPending = aPending; } /** * This method returns the number of queued message(s) for the child @@ -161,12 +582,71 @@ public: * @returns Number of queues message(s). * */ - uint16_t GetQueuedMessageCount(void) const { return mQueuedMessageCount; } + uint16_t GetIndirectMessageCount(void) const { return mQueuedMessageCount; } + + /** + * This method increments the indirect message count. + * + */ + void IncrementIndirectMessageCount(void) { mQueuedMessageCount++; } + + /** + * This method decrements the indirect message count. + * + */ + void DecrementIndirectMessageCount(void) { mQueuedMessageCount--; } + + /** + * This method resets the indirect message count to zero. + * + */ + void ResetIndirectMessageCount(void) { mQueuedMessageCount = 0; } + + /** + * This method clears the requested TLV list. + * + */ + void ClearRequestTlvs(void) { memset(mRequestTlvs, Mle::Tlv::kInvalid, sizeof(mRequestTlvs)); } + + /** + * This method 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]; } + + /** + * This method 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; } private: - uint16_t mQueuedMessageCount : 13; ///< Number of queued indirect messages for the child. - bool mUseShortAddress : 1; ///< Indicates whether to use short or extended address. - bool mSourceMatchPending : 1; ///< Indicates whether or not pending to add to src match table. + Ip6::Address mIp6Address[kMaxIp6AddressPerChild]; ///< Registered IPv6 addresses + uint32_t mTimeout; ///< Child timeout + + union + { + uint8_t mRequestTlvs[kMaxRequestTlvs]; ///< Requested MLE TLVs + uint8_t mAttachChallenge[Mle::ChallengeTlv::kMaxSize]; ///< The challenge value + }; + + uint32_t mIndirectFrameCounter; ///< Frame counter for current indirect message (used fore retx). + Message *mIndirectMessage; ///< Current indirect message. + uint16_t mIndirectFragmentOffset; ///< 6LoWPAN fragment offset for the indirect message. + uint8_t mIndirectKeyId; ///< Key Id for current indirect message (used for retx). + uint8_t mIndirectTxAttempts; ///< Number of data poll triggered tx attempts. + uint8_t mIndirectDsn; ///< MAC level Data Sequence Number (DSN) for retx attempts. + uint8_t mNetworkDataVersion; ///< Current Network Data version + uint16_t mQueuedMessageCount : 13; ///< Number of queued indirect messages for the child. + bool mUseShortAddress : 1; ///< Indicates whether to use short or extended address. + bool mSourceMatchPending : 1; ///< Indicates whether or not pending to add to src match table. }; /** @@ -176,6 +656,87 @@ private: class Router : public Neighbor { public: + /** + * This method 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; } + + /** + * This method sets the router ID of the next hop to this router. + * + * @param[in] aRouterId The router ID of the next hop to this router. + * + */ + void SetNextHop(uint8_t aRouterId) { mNextHop = aRouterId; } + + /** + * This method gets the link quality out value for this router. + * + * @returns The link quality out value for this router. + * + */ + uint8_t GetLinkQualityOut(void) const { return mLinkQualityOut; } + + /** + * This method sets the link quality out value for this router. + * + * @param[in] aLinkQuality The link quality out value for this router. + * + */ + void SetLinkQualityOut(uint8_t aLinkQuality) { mLinkQualityOut = aLinkQuality; } + + /** + * This method get the route cost to this router. + * + * @returns The route cost to this router. + * + */ + uint8_t GetCost(void) const { return mCost; } + + /** + * This method sets the router cost to this router. + * + * @param[in] aCost The router cost to this router. + * + */ + void SetCost(uint8_t aCost) { mCost = aCost; } + + /** + * This method indicates whether or not this router ID has been allocated. + * + * @returns TRUE if this router ID has been allocated, FALSE otherwise. + * + */ + bool IsAllocated(void) const { return mAllocated; } + + /** + * This method sets whether or not this router ID has been allocated. + * + * @param[in] aAllocated TRUE if this router ID has been allocated, FALSE otherwise. + * + */ + void SetAllocated(bool aAllocated) { mAllocated = aAllocated; } + + /** + * This method indicates whether the reclaim delay is in effect for this router ID. + * + * @returns TRUE if the reclaim delay is in effect, FALSE otherwise. + * + */ + bool IsReclaimDelay(void) const { return mReclaimDelay; } + + /** + * This method sets whether the reclaim delay is in effect for this router ID. + * + * @param[in] aReclaimDelay TRUE if the reclaim delay is in effect, FALSE otherwise. + * + */ + void SetReclaimDelay(bool aReclaimDelay) { mReclaimDelay = aReclaimDelay; } + +private: uint8_t mNextHop; ///< The next hop towards this router uint8_t mLinkQualityOut : 2; ///< The link quality out for this router uint8_t mCost : 4; ///< The cost to this router via neighbor router diff --git a/tests/unit/test_toolchain.cpp b/tests/unit/test_toolchain.cpp index 3e8e5f735..af3c5cf56 100644 --- a/tests/unit/test_toolchain.cpp +++ b/tests/unit/test_toolchain.cpp @@ -95,10 +95,10 @@ void test_packed_union() void test_packed_enum() { Thread::Neighbor neighbor; - neighbor.mState = Thread::Neighbor::kStateValid; + neighbor.SetState(Thread::Neighbor::kStateValid); // Make sure that when we read the 3 bit field it is read as unsigned, so it return '4' - VerifyOrQuit(neighbor.mState == Thread::Neighbor::kStateValid, "Toolchain::OT_TOOL_PACKED failed 4\n"); + VerifyOrQuit(neighbor.GetState() == Thread::Neighbor::kStateValid, "Toolchain::OT_TOOL_PACKED failed 4\n"); } void test_addr_sizes()