From c3b565d550e5733d5a8030af2eb519000a5b22fd Mon Sep 17 00:00:00 2001 From: Buke Po Date: Tue, 11 Apr 2017 12:35:58 +0800 Subject: [PATCH] disable commissioner related CoAP resource before accepted (#1573) * disable commissioner related coap before accepted --- src/core/meshcop/commissioner.cpp | 28 +++++++++++++++++++++++++--- src/core/meshcop/commissioner.hpp | 3 +++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 80a6545ec..d5be2c5bb 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -79,9 +79,6 @@ Commissioner::Commissioner(ThreadNetif &aThreadNetif): mNetif(aThreadNetif) { memset(mJoiners, 0, sizeof(mJoiners)); - mNetif.GetCoapServer().AddResource(mRelayReceive); - mNetif.GetCoapServer().AddResource(mDatasetChanged); - mNetif.GetSecureCoapServer().AddResource(mJoinerFinalize); } otInstance *Commissioner::GetInstance(void) @@ -89,6 +86,20 @@ otInstance *Commissioner::GetInstance(void) return mNetif.GetInstance(); } +void Commissioner::AddCoapResources(void) +{ + mNetif.GetCoapServer().AddResource(mRelayReceive); + mNetif.GetCoapServer().AddResource(mDatasetChanged); + mNetif.GetSecureCoapServer().AddResource(mJoinerFinalize); +} + +void Commissioner::RemoveCoapResources(void) +{ + mNetif.GetCoapServer().RemoveResource(mRelayReceive); + mNetif.GetCoapServer().AddResource(mDatasetChanged); + mNetif.GetSecureCoapServer().AddResource(mJoinerFinalize); +} + ThreadError Commissioner::Start(void) { ThreadError error = kThreadError_None; @@ -118,6 +129,7 @@ ThreadError Commissioner::Stop(void) mNetif.GetSecureCoapServer().Stop(); mState = kCommissionerStateDisabled; + RemoveCoapResources(); mTransmitAttempts = 0; mTimer.Stop(); @@ -642,7 +654,9 @@ void Commissioner::HandleLeaderPetitionResponse(Coap::Header *aHeader, Message * VerifyOrExit(sessionId.IsValid()); mSessionId = sessionId.GetCommissionerSessionId(); + AddCoapResources(); mState = kCommissionerStateActive; + mTransmitAttempts = 0; mTimer.Start(Timer::SecToMsec(kKeepAliveTimeout) / 2); @@ -740,6 +754,12 @@ void Commissioner::HandleLeaderKeepAliveResponse(Coap::Header *aHeader, Message mTimer.Start(Timer::SecToMsec(kKeepAliveTimeout) / 2); exit: + + if (mState != kCommissionerStateActive) + { + RemoveCoapResources(); + } + otLogFuncExit(); } @@ -764,6 +784,8 @@ void Commissioner::HandleRelayReceive(Coap::Header &aHeader, Message &aMessage, otLogFuncEntry(); + VerifyOrExit(mState == kCommissionerStateActive, error = kThreadError_InvalidState); + VerifyOrExit(aHeader.GetType() == kCoapTypeNonConfirmable && aHeader.GetCode() == kCoapRequestPost); diff --git a/src/core/meshcop/commissioner.hpp b/src/core/meshcop/commissioner.hpp index 045cd8d7a..033f1b6b5 100644 --- a/src/core/meshcop/commissioner.hpp +++ b/src/core/meshcop/commissioner.hpp @@ -209,6 +209,9 @@ private: kRemoveJoinerDelay = 20, ///< Delay to remove successfully joined joiner }; + void AddCoapResources(void); + void RemoveCoapResources(void); + static void HandleTimer(void *aContext); void HandleTimer(void);