From 01a3f7aea96d48bfc7770695b194903d9be33a90 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Wed, 17 Aug 2016 00:05:52 +0800 Subject: [PATCH] Add /c/ag and /c/pg URI (#378) * Add /c/ag and /c/pg URI --- src/core/thread/meshcop_dataset_manager.cpp | 98 +++++++++++++++++++-- src/core/thread/meshcop_dataset_manager.hpp | 13 ++- src/core/thread/meshcop_tlvs.hpp | 1 + src/core/thread/thread_uris.hpp | 16 ++++ 4 files changed, 116 insertions(+), 12 deletions(-) diff --git a/src/core/thread/meshcop_dataset_manager.cpp b/src/core/thread/meshcop_dataset_manager.cpp index e2f9250d1..ca81de5a3 100644 --- a/src/core/thread/meshcop_dataset_manager.cpp +++ b/src/core/thread/meshcop_dataset_manager.cpp @@ -48,16 +48,18 @@ namespace Thread { namespace MeshCoP { -DatasetManager::DatasetManager(ThreadNetif &aThreadNetif, const char *aUri): +DatasetManager::DatasetManager(ThreadNetif &aThreadNetif, const char *aUriSet, const char *aUriGet): mMle(aThreadNetif.GetMle()), mNetif(aThreadNetif), mNetworkDataLeader(aThreadNetif.GetNetworkDataLeader()), - mResource(aUri, &HandleSet, this), + mResourceSet(aUriSet, &HandleSet, this), + mResourceGet(aUriGet, &HandleGet, this), mTimer(&HandleTimer, this), - mUri(aUri), + mUriSet(aUriSet), mCoapServer(aThreadNetif.GetCoapServer()) { - mCoapServer.AddResource(mResource); + mCoapServer.AddResource(mResourceSet); + mCoapServer.AddResource(mResourceGet); } ThreadError DatasetManager::Set(const Dataset &aDataset, uint8_t &aFlags) @@ -168,7 +170,7 @@ ThreadError DatasetManager::Register(void) header.SetCode(Coap::Header::kCodePost); header.SetMessageId(++mCoapMessageId); header.SetToken(mCoapToken, sizeof(mCoapToken)); - header.AppendUriPathOptions(mUri); + header.AppendUriPathOptions(mUriSet); header.AppendContentFormatOption(Coap::Header::kApplicationOctetStream); header.Finalize(); @@ -240,7 +242,7 @@ void DatasetManager::HandleSet(Coap::Header &aHeader, Message &aMessage, const I VerifyOrExit(mMle.GetDeviceState() == Mle::kDeviceStateLeader, state = StateTlv::kReject); - type = strcmp(mUri, OPENTHREAD_URI_ACTIVE_SET) == 0 ? Tlv::kActiveTimestamp : Tlv::kPendingTimestamp; + type = strcmp(mUriSet, OPENTHREAD_URI_ACTIVE_SET) == 0 ? Tlv::kActiveTimestamp : Tlv::kPendingTimestamp; while (offset < aMessage.GetLength()) { @@ -273,6 +275,37 @@ exit: return; } +void DatasetManager::HandleGet(void *aContext, Coap::Header &aHeader, Message &aMessage, + const Ip6::MessageInfo &aMessageInfo) +{ + DatasetManager *obj = static_cast(aContext); + obj->HandleGet(aHeader, aMessage, aMessageInfo); +} + +void DatasetManager::HandleGet(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo) +{ + Tlv tlv; + uint16_t offset = aMessage.GetOffset(); + uint8_t tlvs[Dataset::kMaxSize]; + uint8_t length = 0; + + while (offset < aMessage.GetLength()) + { + aMessage.Read(offset, sizeof(tlv), &tlv); + + if (tlv.GetType() == Tlv::kGet) + { + length = tlv.GetLength(); + aMessage.Read(offset + sizeof(Tlv), length, tlvs); + break; + } + + offset += sizeof(tlv) + tlv.GetLength(); + } + + SendGetResponse(aHeader, aMessageInfo, tlvs, length); +} + void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, StateTlv::State aState) { @@ -297,7 +330,54 @@ void DatasetManager::SendSetResponse(const Coap::Header &aRequestHeader, const I SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo)); - otLogInfoMeshCoP("sent dataset response\n"); + otLogInfoMeshCoP("sent dataset set response\n"); + +exit: + + if (error != kThreadError_None && message != NULL) + { + Message::Free(*message); + } +} + +void DatasetManager::SendGetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, + uint8_t *aTlvs, uint8_t aLength) +{ + Tlv *tlv; + ThreadError error = kThreadError_None; + Coap::Header responseHeader; + Message *message; + uint8_t index; + + VerifyOrExit((message = Ip6::Udp::NewMessage(0)) != NULL, error = kThreadError_NoBufs); + responseHeader.Init(); + responseHeader.SetVersion(1); + responseHeader.SetType(Coap::Header::kTypeAcknowledgment); + responseHeader.SetCode(Coap::Header::kCodeChanged); + responseHeader.SetMessageId(aRequestHeader.GetMessageId()); + responseHeader.SetToken(aRequestHeader.GetToken(), aRequestHeader.GetTokenLength()); + responseHeader.AppendContentFormatOption(Coap::Header::kApplicationOctetStream); + responseHeader.Finalize(); + SuccessOrExit(error = message->Append(responseHeader.GetBytes(), responseHeader.GetLength())); + + if (aLength == 0) + { + SuccessOrExit(error = message->Append(mNetwork.GetBytes(), mNetwork.GetSize())); + } + else + { + for (index = 0; index < aLength; index++) + { + if ((tlv = mNetwork.Get((Tlv::Type)aTlvs[index])) != NULL) + { + SuccessOrExit(error = message->Append(tlv, sizeof(Tlv) + tlv->GetLength())); + } + } + } + + SuccessOrExit(error = mCoapServer.SendMessage(*message, aMessageInfo)); + + otLogInfoMeshCoP("sent dataset get response\n"); exit: @@ -308,7 +388,7 @@ exit: } ActiveDataset::ActiveDataset(ThreadNetif &aThreadNetif): - DatasetManager(aThreadNetif, OPENTHREAD_URI_ACTIVE_SET) + DatasetManager(aThreadNetif, OPENTHREAD_URI_ACTIVE_SET, OPENTHREAD_URI_ACTIVE_GET) { } @@ -428,7 +508,7 @@ ThreadError ActiveDataset::ApplyConfiguration(void) } PendingDataset::PendingDataset(ThreadNetif &aThreadNetif): - DatasetManager(aThreadNetif, OPENTHREAD_URI_PENDING_SET), + DatasetManager(aThreadNetif, OPENTHREAD_URI_PENDING_SET, OPENTHREAD_URI_PENDING_GET), mTimer(HandleTimer, this) { } diff --git a/src/core/thread/meshcop_dataset_manager.hpp b/src/core/thread/meshcop_dataset_manager.hpp index 84f200e3f..4f62f11f0 100644 --- a/src/core/thread/meshcop_dataset_manager.hpp +++ b/src/core/thread/meshcop_dataset_manager.hpp @@ -66,7 +66,7 @@ protected: kFlagNetworkUpdated = 1 << 1, }; - DatasetManager(ThreadNetif &aThreadNetif, const char *aUri); + DatasetManager(ThreadNetif &aThreadNetif, const char *aUriSet, const char *aUriGet); ThreadError Set(const Dataset &aDataset, uint8_t &aFlags); @@ -88,20 +88,27 @@ private: const Ip6::MessageInfo &aMessageInfo); void HandleSet(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); + static void HandleGet(void *aContext, Coap::Header &aHeader, Message &aMessage, + const Ip6::MessageInfo &aMessageInfo); + void HandleGet(Coap::Header &aHeader, Message &aMessage, const Ip6::MessageInfo &aMessageInfo); + static void HandleTimer(void *aContext); void HandleTimer(void); ThreadError Register(void); void SendSetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, StateTlv::State aState); + void SendGetResponse(const Coap::Header &aRequestHeader, const Ip6::MessageInfo &aMessageInfo, + uint8_t *aTlvs, uint8_t aLength); - Coap::Resource mResource; + Coap::Resource mResourceSet; + Coap::Resource mResourceGet; Timer mTimer; Ip6::UdpSocket mSocket; uint8_t mCoapToken[2]; uint16_t mCoapMessageId; - const char *mUri; + const char *mUriSet; Coap::Server &mCoapServer; }; diff --git a/src/core/thread/meshcop_tlvs.hpp b/src/core/thread/meshcop_tlvs.hpp index b8e09c19e..6ecb4ee67 100644 --- a/src/core/thread/meshcop_tlvs.hpp +++ b/src/core/thread/meshcop_tlvs.hpp @@ -68,6 +68,7 @@ public: kNetworkMasterKey = 5, ///< Network Master Key TLV kMeshLocalPrefix = 7, ///< Mesh Local Prefix TLV kSecurityPolicy = 12, ///< Security Policy TLV + kGet = 13, ///< Get TLV kActiveTimestamp = 14, ///< Active Timestamp TLV kState = 16, ///< State TLV kPendingTimestamp = 51, ///< Pending Timestamp TLV diff --git a/src/core/thread/thread_uris.hpp b/src/core/thread/thread_uris.hpp index a3fc11132..137beca6a 100644 --- a/src/core/thread/thread_uris.hpp +++ b/src/core/thread/thread_uris.hpp @@ -74,6 +74,14 @@ namespace Thread { */ #define OPENTHREAD_URI_ADDRESS_SOLICIT "a/as" +/** + * @def OPENTHREAD_URI_ACTIVE_GET + * + * The URI Path for MGMT_ACTIVE_GET + * + */ +#define OPENTHREAD_URI_ACTIVE_GET "c/ag" + /** * @def OPENTHREAD_URI_ACTIVE_SET * @@ -82,6 +90,14 @@ namespace Thread { */ #define OPENTHREAD_URI_ACTIVE_SET "c/as" +/** + * @def OPENTHREAD_URI_PENDING_GET + * + * The URI Path for MGMT_PENDING_GET + * + */ +#define OPENTHREAD_URI_PENDING_GET "c/pg" + /** * @def OPENTHREAD_URI_PENDING_SET *