From 2542cabc204dd3ae07ac67be0543cb85b17564ba Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Wed, 15 Mar 2023 20:10:21 -0700 Subject: [PATCH] [cli] update dataset to operate directly on TLVs (#8871) --- src/cli/cli_dataset.cpp | 339 +++++++++++++++++++++++----------------- src/cli/cli_dataset.hpp | 4 +- 2 files changed, 201 insertions(+), 142 deletions(-) diff --git a/src/cli/cli_dataset.cpp b/src/cli/cli_dataset.cpp index 5d1c885f9..633fa5b12 100644 --- a/src/cli/cli_dataset.cpp +++ b/src/cli/cli_dataset.cpp @@ -45,79 +45,85 @@ namespace ot { namespace Cli { -otOperationalDataset Dataset::sDataset; +otOperationalDatasetTlvs Dataset::sDatasetTlvs; -otError Dataset::Print(otOperationalDataset &aDataset) +otError Dataset::Print(otOperationalDatasetTlvs &aDatasetTlvs) { - if (aDataset.mComponents.mIsPendingTimestampPresent) + otError error; + otOperationalDataset dataset; + + SuccessOrExit(error = otDatasetParseTlvs(&aDatasetTlvs, &dataset)); + + if (dataset.mComponents.mIsPendingTimestampPresent) { OutputFormat("Pending Timestamp: "); - OutputUint64Line(aDataset.mPendingTimestamp.mSeconds); + OutputUint64Line(dataset.mPendingTimestamp.mSeconds); } - if (aDataset.mComponents.mIsActiveTimestampPresent) + if (dataset.mComponents.mIsActiveTimestampPresent) { OutputFormat("Active Timestamp: "); - OutputUint64Line(aDataset.mActiveTimestamp.mSeconds); + OutputUint64Line(dataset.mActiveTimestamp.mSeconds); } - if (aDataset.mComponents.mIsChannelPresent) + if (dataset.mComponents.mIsChannelPresent) { - OutputLine("Channel: %d", aDataset.mChannel); + OutputLine("Channel: %d", dataset.mChannel); } - if (aDataset.mComponents.mIsChannelMaskPresent) + if (dataset.mComponents.mIsChannelMaskPresent) { - OutputLine("Channel Mask: 0x%08lx", ToUlong(aDataset.mChannelMask)); + OutputLine("Channel Mask: 0x%08lx", ToUlong(dataset.mChannelMask)); } - if (aDataset.mComponents.mIsDelayPresent) + if (dataset.mComponents.mIsDelayPresent) { - OutputLine("Delay: %lu", ToUlong(aDataset.mDelay)); + OutputLine("Delay: %lu", ToUlong(dataset.mDelay)); } - if (aDataset.mComponents.mIsExtendedPanIdPresent) + if (dataset.mComponents.mIsExtendedPanIdPresent) { OutputFormat("Ext PAN ID: "); - OutputBytesLine(aDataset.mExtendedPanId.m8); + OutputBytesLine(dataset.mExtendedPanId.m8); } - if (aDataset.mComponents.mIsMeshLocalPrefixPresent) + if (dataset.mComponents.mIsMeshLocalPrefixPresent) { OutputFormat("Mesh Local Prefix: "); - OutputIp6PrefixLine(aDataset.mMeshLocalPrefix); + OutputIp6PrefixLine(dataset.mMeshLocalPrefix); } - if (aDataset.mComponents.mIsNetworkKeyPresent) + if (dataset.mComponents.mIsNetworkKeyPresent) { OutputFormat("Network Key: "); - OutputBytesLine(aDataset.mNetworkKey.m8); + OutputBytesLine(dataset.mNetworkKey.m8); } - if (aDataset.mComponents.mIsNetworkNamePresent) + if (dataset.mComponents.mIsNetworkNamePresent) { OutputFormat("Network Name: "); - OutputLine("%s", aDataset.mNetworkName.m8); + OutputLine("%s", dataset.mNetworkName.m8); } - if (aDataset.mComponents.mIsPanIdPresent) + if (dataset.mComponents.mIsPanIdPresent) { - OutputLine("PAN ID: 0x%04x", aDataset.mPanId); + OutputLine("PAN ID: 0x%04x", dataset.mPanId); } - if (aDataset.mComponents.mIsPskcPresent) + if (dataset.mComponents.mIsPskcPresent) { OutputFormat("PSKc: "); - OutputBytesLine(aDataset.mPskc.m8); + OutputBytesLine(dataset.mPskc.m8); } - if (aDataset.mComponents.mIsSecurityPolicyPresent) + if (dataset.mComponents.mIsSecurityPolicyPresent) { OutputFormat("Security Policy: "); - OutputSecurityPolicy(aDataset.mSecurityPolicy); + OutputSecurityPolicy(dataset.mSecurityPolicy); } - return OT_ERROR_NONE; +exit: + return error; } /** @@ -141,27 +147,27 @@ template <> otError Dataset::Process(Arg aArgs[]) if (aArgs[0] == "active") { - error = otDatasetGetActive(GetInstancePtr(), &sDataset); + error = otDatasetGetActiveTlvs(GetInstancePtr(), &sDatasetTlvs); } else if (aArgs[0] == "pending") { - error = otDatasetGetPending(GetInstancePtr(), &sDataset); + error = otDatasetGetPendingTlvs(GetInstancePtr(), &sDatasetTlvs); } #if OPENTHREAD_FTD else if (aArgs[0] == "new") { - error = otDatasetCreateNewNetwork(GetInstancePtr(), &sDataset); + otOperationalDataset dataset; + + SuccessOrExit(error = otDatasetCreateNewNetwork(GetInstancePtr(), &dataset)); + SuccessOrExit(error = otDatasetConvertToTlvs(&dataset, &sDatasetTlvs)); } #endif else if (aArgs[0] == "tlvs") { - otOperationalDatasetTlvs datasetTlvs; - uint16_t size = sizeof(datasetTlvs.mTlvs); + uint16_t size = sizeof(sDatasetTlvs.mTlvs); - SuccessOrExit(error = aArgs[1].ParseAsHexString(size, datasetTlvs.mTlvs)); - datasetTlvs.mLength = static_cast(size); - - SuccessOrExit(error = otDatasetParseTlvs(&datasetTlvs, &sDataset)); + SuccessOrExit(error = aArgs[1].ParseAsHexString(size, sDatasetTlvs.mTlvs)); + sDatasetTlvs.mLength = static_cast(size); } exit: @@ -198,22 +204,23 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_INVALID_ARGS; + otError error; + otOperationalDatasetTlvs dataset; + + SuccessOrExit(error = otDatasetGetActiveTlvs(GetInstancePtr(), &dataset)); if (aArgs[0].IsEmpty()) { - otOperationalDataset dataset; - - SuccessOrExit(error = otDatasetGetActive(GetInstancePtr(), &dataset)); error = Print(dataset); } else if (aArgs[0] == "-x") { - otOperationalDatasetTlvs dataset; - - SuccessOrExit(error = otDatasetGetActiveTlvs(GetInstancePtr(), &dataset)); OutputBytesLine(dataset.mTlvs, dataset.mLength); } + else + { + error = OT_ERROR_INVALID_ARGS; + } exit: return error; @@ -221,21 +228,22 @@ exit: template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_INVALID_ARGS; + otError error; + otOperationalDatasetTlvs datasetTlvs; + + SuccessOrExit(error = otDatasetGetPendingTlvs(GetInstancePtr(), &datasetTlvs)); if (aArgs[0].IsEmpty()) { - otOperationalDataset dataset; - - SuccessOrExit(error = otDatasetGetPending(GetInstancePtr(), &dataset)); - error = Print(dataset); + error = Print(datasetTlvs); } else if (aArgs[0] == "-x") { - otOperationalDatasetTlvs dataset; - - SuccessOrExit(error = otDatasetGetPendingTlvs(GetInstancePtr(), &dataset)); - OutputBytesLine(dataset.mTlvs, dataset.mLength); + OutputBytesLine(datasetTlvs.mTlvs, datasetTlvs.mLength); + } + else + { + error = OT_ERROR_INVALID_ARGS; } exit: @@ -260,21 +268,25 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsActiveTimestampPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsActiveTimestampPresent) { - OutputUint64Line(sDataset.mActiveTimestamp.mSeconds); + OutputUint64Line(dataset.mActiveTimestamp.mSeconds); } } else { - SuccessOrExit(error = aArgs[0].ParseAsUint64(sDataset.mActiveTimestamp.mSeconds)); - sDataset.mActiveTimestamp.mTicks = 0; - sDataset.mActiveTimestamp.mAuthoritative = false; - sDataset.mComponents.mIsActiveTimestampPresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = aArgs[0].ParseAsUint64(dataset.mActiveTimestamp.mSeconds)); + dataset.mActiveTimestamp.mTicks = 0; + dataset.mActiveTimestamp.mAuthoritative = false; + dataset.mComponents.mIsActiveTimestampPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -299,19 +311,23 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsChannelPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsChannelPresent) { - OutputLine("%d", sDataset.mChannel); + OutputLine("%d", dataset.mChannel); } } else { - SuccessOrExit(error = aArgs[0].ParseAsUint16(sDataset.mChannel)); - sDataset.mComponents.mIsChannelPresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = aArgs[0].ParseAsUint16(dataset.mChannel)); + dataset.mComponents.mIsChannelPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -336,19 +352,23 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsChannelMaskPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsChannelMaskPresent) { - OutputLine("0x%08lx", ToUlong(sDataset.mChannelMask)); + OutputLine("0x%08lx", ToUlong(dataset.mChannelMask)); } } else { - SuccessOrExit(error = aArgs[0].ParseAsUint32(sDataset.mChannelMask)); - sDataset.mComponents.mIsChannelMaskPresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = aArgs[0].ParseAsUint32(dataset.mChannelMask)); + dataset.mComponents.mIsChannelMaskPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -368,7 +388,7 @@ template <> otError Dataset::Process(Arg aArgs[]) { OT_UNUSED_VARIABLE(aArgs); - memset(&sDataset, 0, sizeof(sDataset)); + memset(&sDatasetTlvs, 0, sizeof(sDatasetTlvs)); return OT_ERROR_NONE; } @@ -389,7 +409,7 @@ template <> otError Dataset::Process(Arg aArgs[]) */ if (aArgs[0] == "active") { - error = otDatasetSetActive(GetInstancePtr(), &sDataset); + error = otDatasetSetActiveTlvs(GetInstancePtr(), &sDatasetTlvs); } /** * @cli dataset commit pending @@ -404,7 +424,7 @@ template <> otError Dataset::Process(Arg aArgs[]) */ else if (aArgs[0] == "pending") { - error = otDatasetSetPending(GetInstancePtr(), &sDataset); + error = otDatasetSetPendingTlvs(GetInstancePtr(), &sDatasetTlvs); } return error; @@ -429,19 +449,23 @@ template <> otError Dataset::Process(Arg aArgs[]) */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsDelayPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsDelayPresent) { - OutputLine("%lu", ToUlong(sDataset.mDelay)); + OutputLine("%lu", ToUlong(dataset.mDelay)); } } else { - SuccessOrExit(error = aArgs[0].ParseAsUint32(sDataset.mDelay)); - sDataset.mComponents.mIsDelayPresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = aArgs[0].ParseAsUint32(dataset.mDelay)); + dataset.mComponents.mIsDelayPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -469,19 +493,23 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsExtendedPanIdPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsExtendedPanIdPresent) { - OutputBytesLine(sDataset.mExtendedPanId.m8); + OutputBytesLine(dataset.mExtendedPanId.m8); } } else { - SuccessOrExit(error = aArgs[0].ParseAsHexString(sDataset.mExtendedPanId.m8)); - sDataset.mComponents.mIsExtendedPanIdPresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = aArgs[0].ParseAsHexString(dataset.mExtendedPanId.m8)); + dataset.mComponents.mIsExtendedPanIdPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -506,14 +534,16 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsMeshLocalPrefixPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsMeshLocalPrefixPresent) { OutputFormat("Mesh Local Prefix: "); - OutputIp6PrefixLine(sDataset.mMeshLocalPrefix); + OutputIp6PrefixLine(dataset.mMeshLocalPrefix); } } else @@ -522,8 +552,10 @@ template <> otError Dataset::Process(Arg aArgs[]) SuccessOrExit(error = aArgs[0].ParseAsIp6Address(prefix)); - memcpy(sDataset.mMeshLocalPrefix.m8, prefix.mFields.m8, sizeof(sDataset.mMeshLocalPrefix.m8)); - sDataset.mComponents.mIsMeshLocalPrefixPresent = true; + memset(&dataset, 0, sizeof(dataset)); + memcpy(dataset.mMeshLocalPrefix.m8, prefix.mFields.m8, sizeof(dataset.mMeshLocalPrefix.m8)); + dataset.mComponents.mIsMeshLocalPrefixPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -548,19 +580,23 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsNetworkKeyPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsNetworkKeyPresent) { - OutputBytesLine(sDataset.mNetworkKey.m8); + OutputBytesLine(dataset.mNetworkKey.m8); } } else { - SuccessOrExit(error = aArgs[0].ParseAsHexString(sDataset.mNetworkKey.m8)); - sDataset.mComponents.mIsNetworkKeyPresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = aArgs[0].ParseAsHexString(dataset.mNetworkKey.m8)); + dataset.mComponents.mIsNetworkKeyPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -588,19 +624,23 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsNetworkNamePresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsNetworkNamePresent) { - OutputLine("%s", sDataset.mNetworkName.m8); + OutputLine("%s", dataset.mNetworkName.m8); } } else { - SuccessOrExit(error = otNetworkNameFromString(&sDataset.mNetworkName, aArgs[0].GetCString())); - sDataset.mComponents.mIsNetworkNamePresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = otNetworkNameFromString(&dataset.mNetworkName, aArgs[0].GetCString())); + dataset.mComponents.mIsNetworkNamePresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -625,19 +665,23 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsPanIdPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsPanIdPresent) { - OutputLine("0x%04x", sDataset.mPanId); + OutputLine("0x%04x", dataset.mPanId); } } else { - SuccessOrExit(error = aArgs[0].ParseAsUint16(sDataset.mPanId)); - sDataset.mComponents.mIsPanIdPresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = aArgs[0].ParseAsUint16(dataset.mPanId)); + dataset.mComponents.mIsPanIdPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -662,21 +706,25 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsPendingTimestampPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsPendingTimestampPresent) { - OutputUint64Line(sDataset.mPendingTimestamp.mSeconds); + OutputUint64Line(dataset.mPendingTimestamp.mSeconds); } } else { - SuccessOrExit(error = aArgs[0].ParseAsUint64(sDataset.mPendingTimestamp.mSeconds)); - sDataset.mPendingTimestamp.mTicks = 0; - sDataset.mPendingTimestamp.mAuthoritative = false; - sDataset.mComponents.mIsPendingTimestampPresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = aArgs[0].ParseAsUint64(dataset.mPendingTimestamp.mSeconds)); + dataset.mPendingTimestamp.mTicks = 0; + dataset.mPendingTimestamp.mAuthoritative = false; + dataset.mComponents.mIsPendingTimestampPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -998,19 +1046,22 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - // sDataset holds the key as a literal string, we don't + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + // dataset holds the key as a literal string, we don't // need to export it from PSA ITS. - if (sDataset.mComponents.mIsPskcPresent) + if (dataset.mComponents.mIsPskcPresent) { - OutputBytesLine(sDataset.mPskc.m8); + OutputBytesLine(dataset.mPskc.m8); } } else { + memset(&dataset, 0, sizeof(dataset)); #if OPENTHREAD_FTD if (aArgs[0] == "-p") { @@ -1019,20 +1070,21 @@ template <> otError Dataset::Process(Arg aArgs[]) SuccessOrExit( error = otDatasetGeneratePskc( aArgs[1].GetCString(), - (sDataset.mComponents.mIsNetworkNamePresent - ? &sDataset.mNetworkName + (dataset.mComponents.mIsNetworkNamePresent + ? &dataset.mNetworkName : reinterpret_cast(otThreadGetNetworkName(GetInstancePtr()))), - (sDataset.mComponents.mIsExtendedPanIdPresent ? &sDataset.mExtendedPanId - : otThreadGetExtendedPanId(GetInstancePtr())), - &sDataset.mPskc)); + (dataset.mComponents.mIsExtendedPanIdPresent ? &dataset.mExtendedPanId + : otThreadGetExtendedPanId(GetInstancePtr())), + &dataset.mPskc)); } else #endif { - SuccessOrExit(error = aArgs[0].ParseAsHexString(sDataset.mPskc.m8)); + SuccessOrExit(error = aArgs[0].ParseAsHexString(dataset.mPskc.m8)); } - sDataset.mComponents.mIsPskcPresent = true; + dataset.mComponents.mIsPskcPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -1172,21 +1224,25 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error = OT_ERROR_NONE; + otError error = OT_ERROR_NONE; + otOperationalDataset dataset; if (aArgs[0].IsEmpty()) { - if (sDataset.mComponents.mIsSecurityPolicyPresent) + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + if (dataset.mComponents.mIsSecurityPolicyPresent) { - OutputSecurityPolicy(sDataset.mSecurityPolicy); + OutputSecurityPolicy(dataset.mSecurityPolicy); } } else { Arg *arg = &aArgs[0]; - SuccessOrExit(error = ParseSecurityPolicy(sDataset.mSecurityPolicy, arg)); - sDataset.mComponents.mIsSecurityPolicyPresent = true; + memset(&dataset, 0, sizeof(dataset)); + SuccessOrExit(error = ParseSecurityPolicy(dataset.mSecurityPolicy, arg)); + dataset.mComponents.mIsSecurityPolicyPresent = true; + SuccessOrExit(error = otDatasetUpdateTlvs(&dataset, &sDatasetTlvs)); } exit: @@ -1228,22 +1284,22 @@ template <> otError Dataset::Process(Arg aArgs[]) } { - MeshCoP::Dataset dataset; - MeshCoP::Dataset::Info datasetInfo; - uint16_t tlvsLength = MeshCoP::Dataset::kMaxSize; + otOperationalDataset dataset; + otOperationalDatasetTlvs datasetTlvs; + uint16_t tlvsLength = MeshCoP::Dataset::kMaxSize; - SuccessOrExit(error = aArgs[1].ParseAsHexString(tlvsLength, dataset.GetBytes())); - dataset.SetSize(tlvsLength); - VerifyOrExit(dataset.IsValid(), error = OT_ERROR_INVALID_ARGS); - dataset.ConvertTo(datasetInfo); + SuccessOrExit(error = aArgs[1].ParseAsHexString(tlvsLength, datasetTlvs.mTlvs)); + datasetTlvs.mLength = static_cast(tlvsLength); + + SuccessOrExit(error = otDatasetParseTlvs(&datasetTlvs, &dataset)); switch (datasetType) { case MeshCoP::Dataset::Type::kActive: - SuccessOrExit(error = otDatasetSetActive(GetInstancePtr(), &datasetInfo)); + SuccessOrExit(error = otDatasetSetActiveTlvs(GetInstancePtr(), &datasetTlvs)); break; case MeshCoP::Dataset::Type::kPending: - SuccessOrExit(error = otDatasetSetPending(GetInstancePtr(), &datasetInfo)); + SuccessOrExit(error = otDatasetSetPendingTlvs(GetInstancePtr(), &datasetTlvs)); break; } } @@ -1264,12 +1320,10 @@ exit: */ template <> otError Dataset::Process(Arg aArgs[]) { - otError error; - otOperationalDatasetTlvs datasetTlvs; + otError error = OT_ERROR_NONE; VerifyOrExit(aArgs[0].IsEmpty(), error = OT_ERROR_INVALID_ARGS); - SuccessOrExit(error = otDatasetConvertToTlvs(&sDataset, &datasetTlvs)); - OutputBytesLine(datasetTlvs.mTlvs, datasetTlvs.mLength); + OutputBytesLine(sDatasetTlvs.mTlvs, sDatasetTlvs.mLength); exit: return error; @@ -1287,7 +1341,11 @@ template <> otError Dataset::Process(Arg aArgs[]) } else if (aArgs[0] == "start") { - error = otDatasetUpdaterRequestUpdate(GetInstancePtr(), &sDataset, &Dataset::HandleDatasetUpdater, this); + otOperationalDataset dataset; + + SuccessOrExit(error = otDatasetParseTlvs(&sDatasetTlvs, &dataset)); + SuccessOrExit( + error = otDatasetUpdaterRequestUpdate(GetInstancePtr(), &dataset, &Dataset::HandleDatasetUpdater, this)); } else if (aArgs[0] == "cancel") { @@ -1298,6 +1356,7 @@ template <> otError Dataset::Process(Arg aArgs[]) error = OT_ERROR_INVALID_ARGS; } +exit: return error; } @@ -1356,7 +1415,7 @@ otError Dataset::Process(Arg aArgs[]) if (aArgs[0].IsEmpty()) { - ExitNow(error = Print(sDataset)); + ExitNow(error = Print(sDatasetTlvs)); } /** diff --git a/src/cli/cli_dataset.hpp b/src/cli/cli_dataset.hpp index 8a095dbd5..7f11ec302 100644 --- a/src/cli/cli_dataset.hpp +++ b/src/cli/cli_dataset.hpp @@ -72,7 +72,7 @@ private: template otError Process(Arg aArgs[]); - otError Print(otOperationalDataset &aDataset); + otError Print(otOperationalDatasetTlvs &aDatasetTlvs); #if OPENTHREAD_CONFIG_DATASET_UPDATER_ENABLE && OPENTHREAD_FTD otError ProcessUpdater(Arg aArgs[]); @@ -83,7 +83,7 @@ private: void OutputSecurityPolicy(const otSecurityPolicy &aSecurityPolicy); otError ParseSecurityPolicy(otSecurityPolicy &aSecurityPolicy, Arg *&aArgs); - static otOperationalDataset sDataset; + static otOperationalDatasetTlvs sDatasetTlvs; }; } // namespace Cli