diff --git a/src/core/api/commissioner_api.cpp b/src/core/api/commissioner_api.cpp index 83eaf4b89..4f5aa4bcc 100644 --- a/src/core/api/commissioner_api.cpp +++ b/src/core/api/commissioner_api.cpp @@ -52,7 +52,7 @@ otError otCommissionerStart(otInstance * aInstance, otError otCommissionerStop(otInstance *aInstance) { - return AsCoreType(aInstance).Get().Stop(/* aResign */ true); + return AsCoreType(aInstance).Get().Stop(); } otError otCommissionerAddJoiner(otInstance *aInstance, const otExtAddress *aEui64, const char *aPskd, uint32_t aTimeout) @@ -161,7 +161,8 @@ otError otCommissionerSendMgmtSet(otInstance * aInstance, const uint8_t * aTlvs, uint8_t aLength) { - return AsCoreType(aInstance).Get().SendMgmtCommissionerSetRequest(*aDataset, aTlvs, aLength); + return AsCoreType(aInstance).Get().SendMgmtCommissionerSetRequest(AsCoreType(aDataset), + aTlvs, aLength); } uint16_t otCommissionerGetSessionId(otInstance *aInstance) diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index d52d5f741..81b2d7590 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -129,8 +129,7 @@ void Commissioner::SignalJoinerEvent(JoinerEvent aEvent, const Joiner *aJoiner) noJoinerId = true; } - mJoinerCallback(static_cast(aEvent), &joinerInfo, noJoinerId ? nullptr : &joinerId, - mCallbackContext); + mJoinerCallback(MapEnum(aEvent), &joinerInfo, noJoinerId ? nullptr : &joinerId, mCallbackContext); exit: return; @@ -295,9 +294,7 @@ void Commissioner::RemoveJoinerEntry(Commissioner::Joiner &aJoiner) SignalJoinerEvent(kJoinerEventRemoved, &joinerCopy); } -Error Commissioner::Start(otCommissionerStateCallback aStateCallback, - otCommissionerJoinerCallback aJoinerCallback, - void * aCallbackContext) +Error Commissioner::Start(StateCallback aStateCallback, JoinerCallback aJoinerCallback, void *aCallbackContext) { Error error = kErrorNone; @@ -329,7 +326,7 @@ exit: return error; } -Error Commissioner::Stop(bool aResign) +Error Commissioner::Stop(ResignMode aResignMode) { Error error = kErrorNone; bool needResign = false; @@ -354,7 +351,7 @@ Error Commissioner::Stop(bool aResign) SetState(kStateDisabled); - if (needResign && aResign) + if (needResign && (aResignMode == kSendKeepAliveToResign)) { SendKeepAlive(); } @@ -402,18 +399,15 @@ exit: void Commissioner::SendCommissionerSet(void) { - Error error = kErrorNone; - otCommissioningDataset dataset; + Error error = kErrorNone; + Dataset dataset; VerifyOrExit(mState == kStateActive, error = kErrorInvalidState); - memset(&dataset, 0, sizeof(dataset)); + dataset.Clear(); - dataset.mSessionId = mSessionId; - dataset.mIsSessionIdSet = true; - - ComputeBloomFilter(AsCoreType(&dataset.mSteeringData)); - dataset.mIsSteeringDataSet = true; + dataset.SetSessionId(mSessionId); + ComputeBloomFilter(dataset.UpdateSteeringData()); error = SendMgmtCommissionerSetRequest(dataset, nullptr, 0); @@ -745,9 +739,7 @@ exit: return; } -Error Commissioner::SendMgmtCommissionerSetRequest(const otCommissioningDataset &aDataset, - const uint8_t * aTlvs, - uint8_t aLength) +Error Commissioner::SendMgmtCommissionerSetRequest(const Dataset &aDataset, const uint8_t *aTlvs, uint8_t aLength) { Error error = kErrorNone; Coap::Message * message; @@ -758,25 +750,26 @@ Error Commissioner::SendMgmtCommissionerSetRequest(const otCommissioningDataset SuccessOrExit(error = message->InitAsConfirmablePost(UriPath::kCommissionerSet)); SuccessOrExit(error = message->SetPayloadMarker()); - if (aDataset.mIsLocatorSet) + if (aDataset.IsLocatorSet()) { - SuccessOrExit(error = Tlv::Append(*message, aDataset.mLocator)); + SuccessOrExit(error = Tlv::Append(*message, aDataset.GetLocator())); } - if (aDataset.mIsSessionIdSet) + if (aDataset.IsSessionIdSet()) { - SuccessOrExit(error = Tlv::Append(*message, aDataset.mSessionId)); + SuccessOrExit(error = Tlv::Append(*message, aDataset.GetSessionId())); } - if (aDataset.mIsSteeringDataSet) + if (aDataset.IsSteeringDataSet()) { - SuccessOrExit( - error = Tlv::Append(*message, aDataset.mSteeringData.m8, aDataset.mSteeringData.mLength)); + const SteeringData &steeringData = aDataset.GetSteeringData(); + + SuccessOrExit(error = Tlv::Append(*message, steeringData.GetData(), steeringData.GetLength())); } - if (aDataset.mIsJoinerUdpPortSet) + if (aDataset.IsJoinerUdpPortSet()) { - SuccessOrExit(error = Tlv::Append(*message, aDataset.mJoinerUdpPort)); + SuccessOrExit(error = Tlv::Append(*message, aDataset.GetJoinerUdpPort())); } if (aLength > 0) @@ -876,7 +869,7 @@ void Commissioner::HandleLeaderPetitionResponse(Coap::Message * aMessage otLogInfoMeshCoP("received Leader Petition response"); SuccessOrExit(Tlv::Find(*aMessage, state)); - VerifyOrExit(state == StateTlv::kAccept, IgnoreError(Stop(/* aResign */ false))); + VerifyOrExit(state == StateTlv::kAccept, IgnoreError(Stop(kDoNotSendKeepAlive))); SuccessOrExit(Tlv::Find(*aMessage, mSessionId)); @@ -903,7 +896,7 @@ exit: { if (mTransmitAttempts >= kPetitionRetryCount) { - IgnoreError(Stop(/* aResign */ false)); + IgnoreError(Stop(kDoNotSendKeepAlive)); } else { @@ -965,12 +958,12 @@ void Commissioner::HandleLeaderKeepAliveResponse(Coap::Message * aMessag VerifyOrExit(mState == kStateActive); VerifyOrExit(aResult == kErrorNone && aMessage->GetCode() == Coap::kCodeChanged, - IgnoreError(Stop(/* aResign */ false))); + IgnoreError(Stop(kDoNotSendKeepAlive))); otLogInfoMeshCoP("received Leader keep-alive response"); SuccessOrExit(Tlv::Find(*aMessage, state)); - VerifyOrExit(state == StateTlv::kAccept, IgnoreError(Stop(/* aResign */ false))); + VerifyOrExit(state == StateTlv::kAccept, IgnoreError(Stop(kDoNotSendKeepAlive))); mTimer.Start(Time::SecToMsec(kKeepAliveTimeout) / 2); diff --git a/src/core/meshcop/commissioner.hpp b/src/core/meshcop/commissioner.hpp index e5c910a21..ea910609d 100644 --- a/src/core/meshcop/commissioner.hpp +++ b/src/core/meshcop/commissioner.hpp @@ -43,6 +43,7 @@ #include "coap/coap.hpp" #include "coap/coap_secure.hpp" #include "common/as_core_type.hpp" +#include "common/clearable.hpp" #include "common/locator.hpp" #include "common/non_copyable.hpp" #include "common/timer.hpp" @@ -74,6 +75,150 @@ public: kStateActive = OT_COMMISSIONER_STATE_ACTIVE, ///< Active Commissioner. }; + /** + * This enumeration type represents Joiner Event. + * + */ + enum JoinerEvent : uint8_t + { + kJoinerEventStart = OT_COMMISSIONER_JOINER_START, + kJoinerEventConnected = OT_COMMISSIONER_JOINER_CONNECTED, + kJoinerEventFinalize = OT_COMMISSIONER_JOINER_FINALIZE, + kJoinerEventEnd = OT_COMMISSIONER_JOINER_END, + kJoinerEventRemoved = OT_COMMISSIONER_JOINER_REMOVED, + }; + + typedef otCommissionerStateCallback StateCallback; ///< State change callback function pointer type. + typedef otCommissionerJoinerCallback JoinerCallback; ///< Joiner state change callback function pointer type. + + /** + * This type represents a Commissioning Dataset. + * + */ + class Dataset : public otCommissioningDataset, public Clearable + { + public: + /** + * This method indicates whether or not the Border Router RLOC16 Locator is set in the Dataset. + * + * @returns TRUE if Border Router RLOC16 Locator is set, FALSE otherwise. + * + */ + bool IsLocatorSet(void) const { return mIsLocatorSet; } + + /** + * This method gets the Border Router RLOC16 Locator in the Dataset. + * + * This method MUST be used when Locator is set in the Dataset, otherwise its behavior is undefined. + * + * @returns The Border Router RLOC16 Locator in the Dataset. + * + */ + uint16_t GetLocator(void) const { return mLocator; } + + /** + * This method sets the Border Router RLOCG16 Locator in the Dataset. + * + * @param[in] aLocator A Locator. + * + */ + void SetLocator(uint16_t aLocator) + { + mIsLocatorSet = true; + mLocator = aLocator; + } + + /** + * This method indicates whether or not the Session ID is set in the Dataset. + * + * @returns TRUE if Session ID is set, FALSE otherwise. + * + */ + bool IsSessionIdSet(void) const { return mIsSessionIdSet; } + + /** + * This method gets the Session ID in the Dataset. + * + * This method MUST be used when Session ID is set in the Dataset, otherwise its behavior is undefined. + * + * @returns The Session ID in the Dataset. + * + */ + uint16_t GetSessionId(void) const { return mSessionId; } + + /** + * This method sets the Session ID in the Dataset. + * + * @param[in] aSessionId The Session ID. + * + */ + void SetSessionId(uint16_t aSessionId) + { + mIsSessionIdSet = true; + mSessionId = aSessionId; + } + + /** + * This method indicates whether or not the Steering Data is set in the Dataset. + * + * @returns TRUE if Steering Data is set, FALSE otherwise. + * + */ + bool IsSteeringDataSet(void) const { return mIsSteeringDataSet; } + + /** + * This method gets the Steering Data in the Dataset. + * + * This method MUST be used when Steering Data is set in the Dataset, otherwise its behavior is undefined. + * + * @returns The Steering Data in the Dataset. + * + */ + const SteeringData &GetSteeringData(void) const { return AsCoreType(&mSteeringData); } + + /** + * This method returns a reference to the Steering Data in the Dataset to be updated by caller. + * + * @returns A reference to the Steering Data in the Dataset. + * + */ + SteeringData &UpdateSteeringData(void) + { + mIsSteeringDataSet = true; + return AsCoreType(&mSteeringData); + } + + /** + * This method indicates whether or not the Joiner UDP port is set in the Dataset. + * + * @returns TRUE if Joiner UDP port is set, FALSE otherwise. + * + */ + bool IsJoinerUdpPortSet(void) const { return mIsJoinerUdpPortSet; } + + /** + * This method gets the Joiner UDP port in the Dataset. + * + * This method MUST be used when Joiner UDP port is set in the Dataset, otherwise its behavior is undefined. + * + * @returns The Joiner UDP port in the Dataset. + * + */ + uint16_t GetJoinerUdpPort(void) const { return mJoinerUdpPort; } + + /** + * This method sets the Joiner UDP Port in the Dataset. + * + * @param[in] aJoinerUdpPort The Joiner UDP Port. + * + */ + void SetJoinerUdpPort(uint16_t aJoinerUdpPort) + { + mIsJoinerUdpPortSet = true; + mJoinerUdpPort = aJoinerUdpPort; + } + }; + /** * This constructor initializes the Commissioner object. * @@ -94,20 +239,16 @@ public: * @retval kErrorInvalidState Device is not currently attached to a network. * */ - Error Start(otCommissionerStateCallback aStateCallback, - otCommissionerJoinerCallback aJoinerCallback, - void * aCallbackContext); + Error Start(StateCallback aStateCallback, JoinerCallback aJoinerCallback, void *aCallbackContext); /** * This method stops the Commissioner service. * - * @param[in] aResign Whether send LEAD_KA.req to resign as Commissioner - * * @retval kErrorNone Successfully stopped the Commissioner service. * @retval kErrorAlready Commissioner is already stopped. * */ - Error Stop(bool aResign); + Error Stop(void) { return Stop(kSendKeepAliveToResign); } /** * This method clears all Joiner entries. @@ -294,7 +435,7 @@ public: * @retval kErrorInvalidState Commissioner service is not started. * */ - Error SendMgmtCommissionerSetRequest(const otCommissioningDataset &aDataset, const uint8_t *aTlvs, uint8_t aLength); + Error SendMgmtCommissionerSetRequest(const Dataset &aDataset, const uint8_t *aTlvs, uint8_t aLength); /** * This method returns a reference to the AnnounceBeginClient instance. @@ -333,13 +474,10 @@ private: static constexpr uint32_t kKeepAliveTimeout = 50; // TIMEOUT_COMM_PET (seconds) static constexpr uint32_t kRemoveJoinerDelay = 20; // Delay to remove successfully joined joiner - enum JoinerEvent : uint8_t + enum ResignMode : uint8_t { - kJoinerEventStart = OT_COMMISSIONER_JOINER_START, - kJoinerEventConnected = OT_COMMISSIONER_JOINER_CONNECTED, - kJoinerEventFinalize = OT_COMMISSIONER_JOINER_FINALIZE, - kJoinerEventEnd = OT_COMMISSIONER_JOINER_END, - kJoinerEventRemoved = OT_COMMISSIONER_JOINER_REMOVED, + kSendKeepAliveToResign, + kDoNotSendKeepAlive, }; struct Joiner @@ -366,6 +504,7 @@ private: void CopyToJoinerInfo(otJoinerInfo &aJoiner) const; }; + Error Stop(ResignMode aResignMode); Joiner *GetUnusedJoinerEntry(void); Joiner *FindJoinerEntry(const Mac::ExtAddress *aEui64); Joiner *FindJoinerEntry(const JoinerDiscerner &aDiscerner); @@ -469,14 +608,16 @@ private: State mState; - otCommissionerStateCallback mStateCallback; - otCommissionerJoinerCallback mJoinerCallback; - void * mCallbackContext; + StateCallback mStateCallback; + JoinerCallback mJoinerCallback; + void * mCallbackContext; }; } // namespace MeshCoP DefineMapEnum(otCommissionerState, MeshCoP::Commissioner::State); +DefineMapEnum(otCommissionerJoinerEvent, MeshCoP::Commissioner::JoinerEvent); +DefineCoreType(otCommissioningDataset, MeshCoP::Commissioner::Dataset); } // namespace ot