[cli] update dataset to operate directly on TLVs (#8871)
diff --git a/src/cli/cli_dataset.cpp b/src/cli/cli_dataset.cpp
index 5d1c885..633fa5b 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 @@
 
     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<uint8_t>(size);
-
-        SuccessOrExit(error = otDatasetParseTlvs(&datasetTlvs, &sDataset));
+        SuccessOrExit(error = aArgs[1].ParseAsHexString(size, sDatasetTlvs.mTlvs));
+        sDatasetTlvs.mLength = static_cast<uint8_t>(size);
     }
 
 exit:
@@ -198,22 +204,23 @@
  */
 template <> otError Dataset::Process<Cmd("active")>(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 @@
 
 template <> otError Dataset::Process<Cmd("pending")>(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 @@
  */
 template <> otError Dataset::Process<Cmd("activetimestamp")>(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 @@
  */
 template <> otError Dataset::Process<Cmd("channel")>(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 @@
  */
 template <> otError Dataset::Process<Cmd("channelmask")>(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 @@
 {
     OT_UNUSED_VARIABLE(aArgs);
 
-    memset(&sDataset, 0, sizeof(sDataset));
+    memset(&sDatasetTlvs, 0, sizeof(sDatasetTlvs));
     return OT_ERROR_NONE;
 }
 
@@ -389,7 +409,7 @@
      */
     if (aArgs[0] == "active")
     {
-        error = otDatasetSetActive(GetInstancePtr(), &sDataset);
+        error = otDatasetSetActiveTlvs(GetInstancePtr(), &sDatasetTlvs);
     }
     /**
      * @cli dataset commit pending
@@ -404,7 +424,7 @@
      */
     else if (aArgs[0] == "pending")
     {
-        error = otDatasetSetPending(GetInstancePtr(), &sDataset);
+        error = otDatasetSetPendingTlvs(GetInstancePtr(), &sDatasetTlvs);
     }
 
     return error;
@@ -429,19 +449,23 @@
  */
 template <> otError Dataset::Process<Cmd("delay")>(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 @@
  */
 template <> otError Dataset::Process<Cmd("extpanid")>(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 @@
  */
 template <> otError Dataset::Process<Cmd("meshlocalprefix")>(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 @@
 
         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 @@
  */
 template <> otError Dataset::Process<Cmd("networkkey")>(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 @@
  */
 template <> otError Dataset::Process<Cmd("networkname")>(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 @@
  */
 template <> otError Dataset::Process<Cmd("panid")>(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 @@
  */
 template <> otError Dataset::Process<Cmd("pendingtimestamp")>(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 @@
  */
 template <> otError Dataset::Process<Cmd("pskc")>(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 @@
             SuccessOrExit(
                 error = otDatasetGeneratePskc(
                     aArgs[1].GetCString(),
-                    (sDataset.mComponents.mIsNetworkNamePresent
-                         ? &sDataset.mNetworkName
+                    (dataset.mComponents.mIsNetworkNamePresent
+                         ? &dataset.mNetworkName
                          : reinterpret_cast<const otNetworkName *>(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 @@
  */
 template <> otError Dataset::Process<Cmd("securitypolicy")>(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 @@
     }
 
     {
-        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<uint8_t>(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 @@
  */
 template <> otError Dataset::Process<Cmd("tlvs")>(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 @@
     }
     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 @@
         error = OT_ERROR_INVALID_ARGS;
     }
 
+exit:
     return error;
 }
 
@@ -1356,7 +1415,7 @@
 
     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 8a095db..7f11ec3 100644
--- a/src/cli/cli_dataset.hpp
+++ b/src/cli/cli_dataset.hpp
@@ -72,7 +72,7 @@
 
     template <CommandId kCommandId> 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 @@
     void    OutputSecurityPolicy(const otSecurityPolicy &aSecurityPolicy);
     otError ParseSecurityPolicy(otSecurityPolicy &aSecurityPolicy, Arg *&aArgs);
 
-    static otOperationalDataset sDataset;
+    static otOperationalDatasetTlvs sDatasetTlvs;
 };
 
 } // namespace Cli