diff --git a/src/core/coap/coap_server.cpp b/src/core/coap/coap_server.cpp index c18ebb458..2c9d2aff7 100644 --- a/src/core/coap/coap_server.cpp +++ b/src/core/coap/coap_server.cpp @@ -78,6 +78,28 @@ exit: return error; } +void Server::RemoveResource(Resource &aResource) +{ + if (mResources == &aResource) + { + mResources = aResource.mNext; + } + else + { + for (Resource *cur = mResources; cur; cur = cur->mNext) + { + if (cur->mNext == &aResource) + { + cur->mNext = aResource.mNext; + ExitNow(); + } + } + } + +exit: + aResource.mNext = NULL; +} + void Server::HandleUdpReceive(void *aContext, otMessage aMessage, const otMessageInfo *aMessageInfo) { Server *obj = reinterpret_cast(aContext); diff --git a/src/core/coap/coap_server.hpp b/src/core/coap/coap_server.hpp index 9a157dd5a..cd2de0232 100644 --- a/src/core/coap/coap_server.hpp +++ b/src/core/coap/coap_server.hpp @@ -137,6 +137,14 @@ public: */ ThreadError AddResource(Resource &aResource); + /** + * This method removes a resource from the CoAP server. + * + * @param[in] aResource A reference to the resource. + * + */ + void RemoveResource(Resource &aResource); + /** * This method returns a new UDP message with sufficient header space reserved. * diff --git a/src/core/thread/meshcop_dataset_manager.cpp b/src/core/thread/meshcop_dataset_manager.cpp index ed55c1ecd..56a56c14f 100644 --- a/src/core/thread/meshcop_dataset_manager.cpp +++ b/src/core/thread/meshcop_dataset_manager.cpp @@ -64,10 +64,21 @@ DatasetManager::DatasetManager(ThreadNetif &aThreadNetif, const Tlv::Type aType, mUriGet(aUriGet), mCoapServer(aThreadNetif.GetCoapServer()) { +} + +void DatasetManager::StartLeader(void) +{ + mNetwork = mLocal; mCoapServer.AddResource(mResourceSet); mCoapServer.AddResource(mResourceGet); } +void DatasetManager::StopLeader(void) +{ + mCoapServer.RemoveResource(mResourceSet); + mCoapServer.RemoveResource(mResourceGet); +} + ThreadError DatasetManager::Set(const Dataset &aDataset, uint8_t &aFlags) { ThreadError error = kThreadError_None; @@ -133,12 +144,6 @@ exit: return error; } -ThreadError DatasetManager::ApplyLocalToNetwork(void) -{ - mNetwork = mLocal; - return kThreadError_None; -} - void DatasetManager::HandleTimer(void *aContext) { DatasetManager *obj = static_cast(aContext); @@ -737,9 +742,9 @@ exit: return error; } -void PendingDataset::ApplyLocalToNetwork(void) +void PendingDataset::StartLeader(void) { - DatasetManager::ApplyLocalToNetwork(); + DatasetManager::StartLeader(); mNetworkTime = mLocalTime; } diff --git a/src/core/thread/meshcop_dataset_manager.hpp b/src/core/thread/meshcop_dataset_manager.hpp index 28baa7add..2338e6fc8 100644 --- a/src/core/thread/meshcop_dataset_manager.hpp +++ b/src/core/thread/meshcop_dataset_manager.hpp @@ -53,7 +53,8 @@ namespace MeshCoP { class DatasetManager { public: - ThreadError ApplyLocalToNetwork(void); + void StartLeader(void); + void StopLeader(void); Dataset &GetLocal(void) { return mLocal; } @@ -138,6 +139,8 @@ class PendingDataset: public DatasetManager public: PendingDataset(ThreadNetif &aThreadNetif); + void StartLeader(void); + void Get(otOperationalDataset &aDataset); ThreadError Set(const Dataset &aDataset); @@ -146,8 +149,6 @@ public: ThreadError Set(const Timestamp &aTimestamp, const Message &aMessage, uint16_t aOffset, uint8_t aLength); - void ApplyLocalToNetwork(void); - void UpdateDelayTimer(void); private: diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index b0a47b948..f885d3634 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -271,6 +271,17 @@ exit: return error; } +void MleRouter::StopLeader(void) +{ + mCoapServer.RemoveResource(mAddressSolicit); + mCoapServer.RemoveResource(mAddressRelease); + mNetif.GetActiveDataset().StopLeader(); + mNetif.GetPendingDataset().StopLeader(); + mAdvertiseTimer.Stop(); + mNetworkData.Stop(); + mNetif.UnsubscribeAllRoutersMulticast(); +} + ThreadError MleRouter::HandleDetachStart(void) { ThreadError error = kThreadError_None; @@ -280,10 +291,8 @@ ThreadError MleRouter::HandleDetachStart(void) mRouters[i].mState = Neighbor::kStateInvalid; } - mAdvertiseTimer.Stop(); + StopLeader(); mStateUpdateTimer.Stop(); - mNetworkData.Stop(); - mNetif.UnsubscribeAllRoutersMulticast(); return error; } @@ -294,9 +303,8 @@ ThreadError MleRouter::HandleChildStart(otMleAttachFilter aFilter) mRouterIdSequenceLastUpdated = Timer::GetNow(); - mAdvertiseTimer.Stop(); + StopLeader(); mStateUpdateTimer.Start(kStateUpdatePeriod); - mNetworkData.Stop(); switch (aFilter) { @@ -321,7 +329,7 @@ ThreadError MleRouter::HandleChildStart(otMleAttachFilter aFilter) } else { - mNetif.UnsubscribeAllRoutersMulticast(); + } return kThreadError_None; @@ -366,8 +374,8 @@ ThreadError MleRouter::SetStateLeader(uint16_t aRloc16) mRouters[mRouterId].mLastHeard = Timer::GetNow(); mNetworkData.Start(); - mNetif.GetActiveDataset().ApplyLocalToNetwork(); - mNetif.GetPendingDataset().ApplyLocalToNetwork(); + mNetif.GetActiveDataset().StartLeader(); + mNetif.GetPendingDataset().StartLeader(); mCoapServer.AddResource(mAddressSolicit); mCoapServer.AddResource(mAddressRelease); mNetif.GetIp6().SetForwardingEnabled(true); diff --git a/src/core/thread/mle_router.hpp b/src/core/thread/mle_router.hpp index aa896a11c..048e81a17 100644 --- a/src/core/thread/mle_router.hpp +++ b/src/core/thread/mle_router.hpp @@ -518,6 +518,7 @@ private: ThreadError SetStateRouter(uint16_t aRloc16); ThreadError SetStateLeader(uint16_t aRloc16); + void StopLeader(void); ThreadError UpdateChildAddresses(const AddressRegistrationTlv &aTlv, Child &aChild); void UpdateRoutes(const RouteTlv &aTlv, uint8_t aRouterId); diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index 3a183a1bc..2b03c8f03 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -79,6 +79,7 @@ void Leader::Start(void) void Leader::Stop(void) { + mCoapServer.RemoveResource(mServerData); } uint8_t Leader::GetVersion(void) const