diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 64dc3bd87..1bc30b042 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -767,11 +767,18 @@ void Commissioner::HandleMgmtCommissionerSetResponse(Coap::Message *aMe { OT_UNUSED_VARIABLE(aMessageInfo); - VerifyOrExit(aResult == kErrorNone && aMessage->GetCode() == Coap::kCodeChanged); - LogInfo("Received %s response", UriToString()); + Error error; + uint8_t state; + SuccessOrExit(error = aResult); + VerifyOrExit(aMessage->GetCode() == Coap::kCodeChanged && Tlv::Find(*aMessage, state) == kErrorNone && + state != StateTlv::kPending, + error = kErrorParse); + + OT_UNUSED_VARIABLE(error); exit: - return; + LogInfo("Received %s response: %s", UriToString(), + error == kErrorNone ? StateTlv::StateToString(static_cast(state)) : ErrorToString(error)); } Error Commissioner::SendPetition(void) diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index b95b99ea9..043f88c2a 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -315,23 +315,12 @@ void DatasetManager::HandleMgmtSetResponse(Coap::Message *aMessage, const Ip6::M uint8_t state; SuccessOrExit(error = aError); - VerifyOrExit(Tlv::Find(*aMessage, state) == kErrorNone, error = kErrorParse); - - switch (state) - { - case StateTlv::kReject: - error = kErrorRejected; - break; - case StateTlv::kAccept: - error = kErrorNone; - break; - default: - error = kErrorParse; - break; - } + VerifyOrExit(Tlv::Find(*aMessage, state) == kErrorNone && state != StateTlv::kPending, + error = kErrorParse); exit: - LogInfo("MGMT_SET finished: %s", ErrorToString(error)); + LogInfo("MGMT_SET finished: %s", + error == kErrorNone ? StateTlv::StateToString(static_cast(state)) : ErrorToString(error)); mMgmtPending = false; diff --git a/src/core/meshcop/meshcop_tlvs.cpp b/src/core/meshcop/meshcop_tlvs.cpp index 399b7102d..0e643ac03 100644 --- a/src/core/meshcop/meshcop_tlvs.cpp +++ b/src/core/meshcop/meshcop_tlvs.cpp @@ -211,6 +211,20 @@ void ChannelTlv::SetChannel(uint16_t aChannel) mChannel = HostSwap16(aChannel); } +const char *StateTlv::StateToString(State aState) +{ + static const char *const kStateStrings[] = { + "Pending", // (0) kPending, + "Accept", // (1) kAccept + "Reject", // (2) kReject, + }; + + static_assert(0 == kPending, "kPending value is incorrect"); + static_assert(1 == kAccept, "kAccept value is incorrect"); + + return aState == kReject ? kStateStrings[2] : kStateStrings[aState]; +} + bool ChannelMaskBaseTlv::IsValid(void) const { const ChannelMaskEntryBase *cur = GetFirstEntry(); diff --git a/src/core/meshcop/meshcop_tlvs.hpp b/src/core/meshcop/meshcop_tlvs.hpp index 0b04a4ff0..3eca8dc35 100644 --- a/src/core/meshcop/meshcop_tlvs.hpp +++ b/src/core/meshcop/meshcop_tlvs.hpp @@ -1087,6 +1087,16 @@ public: kPending = 0, ///< Pending kAccept = 1, ///< Accept }; + + /** + * Converts a `State` to a string. + * + * @param[in] aState An item state. + * + * @returns A string representation of @p aState. + * + */ + static const char *StateToString(State aState); }; /**