From b656f577193cbb552fa249786f61469fca764030 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Tue, 16 Aug 2016 11:23:12 +0800 Subject: [PATCH] Add MeshCoP State TLV (#377) * Add MeshCoP State TLV --- src/core/thread/meshcop_dataset_manager.cpp | 22 ++++++--- src/core/thread/meshcop_dataset_manager.hpp | 2 +- src/core/thread/meshcop_tlvs.hpp | 54 +++++++++++++++++++++ 3 files changed, 71 insertions(+), 7 deletions(-) diff --git a/src/core/thread/meshcop_dataset_manager.cpp b/src/core/thread/meshcop_dataset_manager.cpp index 0e499887b..e2f9250d1 100644 --- a/src/core/thread/meshcop_dataset_manager.cpp +++ b/src/core/thread/meshcop_dataset_manager.cpp @@ -28,7 +28,7 @@ /** * @file - * This file implements common methods for manipulating MeshCoP Datasets. + * This file implements MeshCoP Datasets manager to process commands. * */ @@ -236,8 +236,9 @@ void DatasetManager::HandleSet(Coap::Header &aHeader, Message &aMessage, const I Timestamp timestamp; uint16_t offset = aMessage.GetOffset(); uint8_t type; + StateTlv::State state = StateTlv::kAccept; - VerifyOrExit(mMle.GetDeviceState() == Mle::kDeviceStateLeader, ;); + VerifyOrExit(mMle.GetDeviceState() == Mle::kDeviceStateLeader, state = StateTlv::kReject); type = strcmp(mUri, OPENTHREAD_URI_ACTIVE_SET) == 0 ? Tlv::kActiveTimestamp : Tlv::kPendingTimestamp; @@ -255,24 +256,30 @@ void DatasetManager::HandleSet(Coap::Header &aHeader, Message &aMessage, const I } // verify the request includes a timestamp that is ahead of the locally stored value - VerifyOrExit(offset < aMessage.GetLength() && mLocal.GetTimestamp().Compare(timestamp) > 0, ;); + VerifyOrExit(offset < aMessage.GetLength() && mLocal.GetTimestamp().Compare(timestamp) > 0, state = StateTlv::kReject); mLocal.Set(aMessage, aMessage.GetOffset(), static_cast(aMessage.GetLength() - aMessage.GetOffset())); mNetwork = mLocal; mNetworkDataLeader.IncrementVersion(); mNetworkDataLeader.IncrementStableVersion(); - SendSetResponse(aHeader, aMessageInfo); - exit: + + if (mMle.GetDeviceState() == Mle::kDeviceStateLeader) + { + SendSetResponse(aHeader, aMessageInfo, state); + } + return; } -void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo) +void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, + StateTlv::State aState) { ThreadError error = kThreadError_None; Coap::Header responseHeader; Message *message; + StateTlv state; VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs); responseHeader.Init(); @@ -285,6 +292,9 @@ void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const I responseHeader.Finalize(); SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); + state.SetState(aState); + SuccessOrExit(error = message->Append(&state, sizeof(state))); + SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo)); otLogInfoMeshCoP("sent dataset response\n"); diff --git a/src/core/thread/meshcop_dataset_manager.hpp b/src/core/thread/meshcop_dataset_manager.hpp index bff9ffba9..84f200e3f 100644 --- a/src/core/thread/meshcop_dataset_manager.hpp +++ b/src/core/thread/meshcop_dataset_manager.hpp @@ -92,7 +92,7 @@ private: void HandleTimer(void); ThreadError Register(void); - void SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo); + void SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, StateTlv::State aState); Coap::Resource mResource; Timer mTimer; diff --git a/src/core/thread/meshcop_tlvs.hpp b/src/core/thread/meshcop_tlvs.hpp index 73354bd0f..b8e09c19e 100644 --- a/src/core/thread/meshcop_tlvs.hpp +++ b/src/core/thread/meshcop_tlvs.hpp @@ -69,6 +69,7 @@ public: kMeshLocalPrefix = 7, ///< Mesh Local Prefix TLV kSecurityPolicy = 12, ///< Security Policy TLV kActiveTimestamp = 14, ///< Active Timestamp TLV + kState = 16, ///< State TLV kPendingTimestamp = 51, ///< Pending Timestamp TLV kDelayTimer = 52, ///< Delay Timer TLV kChannelMask = 53, ///< Channel Mask TLV @@ -659,6 +660,59 @@ public: bool IsValid(void) const { return GetLength() == sizeof(*this) - sizeof(Tlv); } } OT_TOOL_PACKED_END; +/** + * This class implements State TLV generation and parsing. + * + */ +OT_TOOL_PACKED_BEGIN +class StateTlv: public Tlv +{ +public: + /** + * State TLV values. + */ + enum State + { + kReject = -1, ///< Reject + kPending = 0, ///< Pending + kAccept = 1, ///< Accept + }; + + /** + * This method initializes the TLV. + * + */ + void Init(void) { SetType(kState); SetLength(sizeof(*this) - sizeof(Tlv)); } + + /** + * This method indicates whether or not the TLV appears to be well-formed. + * + * @retval TRUE If the TLV appears to be well-formed. + * @retval FALSE If the TLV does not appear to be well-formed. + * + */ + bool IsValid(void) const { return GetLength() == sizeof(*this) - sizeof(Tlv); } + + /** + * This method returns the State value. + * + * @returns The State value. + * + */ + State GetState(void) const { return static_cast(mState); } + + /** + * This method sets the State value. + * + * @param[in] aState The State value. + * + */ + void SetState(State aState) { mState = static_cast(aState); } + +private: + uint8_t mState; +} OT_TOOL_PACKED_END; + /** * This class implements Pending Timestamp TLV generation and parsing. *