From 292fe60fcbc0f5d249d10981644f08765bab2d78 Mon Sep 17 00:00:00 2001 From: jinran-google Date: Thu, 12 Aug 2021 13:09:15 +0800 Subject: [PATCH] [dataset] add API `otDatasetParseTlvs` (#6877) Adds an API to parse a dataset from TLVs. --- include/openthread/dataset.h | 12 ++++++++++++ include/openthread/instance.h | 2 +- src/cli/README_DATASET.md | 2 +- src/cli/cli_dataset.cpp | 11 +++++++++++ src/core/api/dataset_api.cpp | 13 +++++++++++++ tests/scripts/expect/cli-dataset.exp | 28 ++++++++++++++++++++++++++++ 6 files changed, 66 insertions(+), 2 deletions(-) diff --git a/include/openthread/dataset.h b/include/openthread/dataset.h index c48e602dd..b2d20979e 100644 --- a/include/openthread/dataset.h +++ b/include/openthread/dataset.h @@ -557,6 +557,18 @@ otError otDatasetGeneratePskc(const char * aPassPhrase, */ otError otNetworkNameFromString(otNetworkName *aNetworkName, const char *aNameString); +/** + * This function parses an Operational Dataset from a `otOperationalDatasetTlvs`. + * + * @param[in] aDatasetTlvs A pointer to dataset TLVs. + * @param[out] aDataset A pointer to where the dataset will be placed. + * + * @retval OT_ERROR_NONE Successfully set @p aDataset from @p aDatasetTlvs. + * @retval OT_ERROR_INVALID_ARGS @p aDatasetTlvs is invalid. + * + */ +otError otDatasetParseTlvs(const otOperationalDatasetTlvs *aDatasetTlvs, otOperationalDataset *aDataset); + /** * @} * diff --git a/include/openthread/instance.h b/include/openthread/instance.h index cf496d58f..b87c9855f 100644 --- a/include/openthread/instance.h +++ b/include/openthread/instance.h @@ -53,7 +53,7 @@ extern "C" { * @note This number versions both OpenThread platform and user APIs. * */ -#define OPENTHREAD_API_VERSION (147) +#define OPENTHREAD_API_VERSION (148) /** * @addtogroup api-instance diff --git a/src/cli/README_DATASET.md b/src/cli/README_DATASET.md index ce7d7a60f..a9f678f0d 100644 --- a/src/cli/README_DATASET.md +++ b/src/cli/README_DATASET.md @@ -313,7 +313,7 @@ Done ### init -Usage: `dataset init ` +Usage: `dataset init >` Initialize operational dataset buffer. diff --git a/src/cli/cli_dataset.cpp b/src/cli/cli_dataset.cpp index acc519fe9..eea5ba36d 100644 --- a/src/cli/cli_dataset.cpp +++ b/src/cli/cli_dataset.cpp @@ -173,7 +173,18 @@ otError Dataset::ProcessInit(Arg aArgs[]) error = otDatasetCreateNewNetwork(mInterpreter.mInstance, &sDataset); } #endif + else if (aArgs[0] == "tlvs") + { + otOperationalDatasetTlvs datasetTlvs; + uint16_t size = sizeof(datasetTlvs.mTlvs); + SuccessOrExit(error = aArgs[1].ParseAsHexString(size, datasetTlvs.mTlvs)); + datasetTlvs.mLength = static_cast(size); + + SuccessOrExit(error = otDatasetParseTlvs(&datasetTlvs, &sDataset)); + } + +exit: return error; } diff --git a/src/core/api/dataset_api.cpp b/src/core/api/dataset_api.cpp index 209f61849..7f1ede12c 100644 --- a/src/core/api/dataset_api.cpp +++ b/src/core/api/dataset_api.cpp @@ -188,3 +188,16 @@ otError otNetworkNameFromString(otNetworkName *aNetworkName, const char *aNameSt return (error == OT_ERROR_ALREADY) ? OT_ERROR_NONE : error; } + +otError otDatasetParseTlvs(const otOperationalDatasetTlvs *aDatasetTlvs, otOperationalDataset *aDataset) +{ + Error error = kErrorNone; + MeshCoP::Dataset dataset; + + dataset.SetFrom(*aDatasetTlvs); + VerifyOrExit(dataset.IsValid(), error = kErrorInvalidArgs); + dataset.ConvertTo(*static_cast(aDataset)); + +exit: + return error; +} diff --git a/tests/scripts/expect/cli-dataset.exp b/tests/scripts/expect/cli-dataset.exp index 19d8ba185..a660c44dd 100755 --- a/tests/scripts/expect/cli-dataset.exp +++ b/tests/scripts/expect/cli-dataset.exp @@ -137,6 +137,32 @@ expect "PAN ID: 0xface" expect "PSKc: 00112233445566778899aabbccddeeff" expect "Security Policy: 678 onrcb" expect_line "Done" +send "dataset pending -x\n" +expect "dataset pending -x" +set dataset_tlvs [expect_line {([0-9a-f]+)}] +expect_line "Done" +send "dataset clear\n" +expect_line "Done" +send "dataset init tlvs $dataset_tlvs\n" +expect_line "Done" +send "dataset\n" +expect "Pending Timestamp: 100" +expect "Active Timestamp: 100" +if {$channel == 11} { + expect "Channel: 18" +} else { + expect "Channel: 11" +} +expect "Channel Mask: 0x03fff800" +expect -re {Delay: \d+} +expect "Ext PAN ID: aabbccddeeff0011" +expect "Mesh Local Prefix: fdde:4860:0:0::/64" +expect "Network Key: aabbccddeeff00112233445566778899" +expect "Network Name: OT-network" +expect "PAN ID: 0xface" +expect "PSKc: 00112233445566778899aabbccddeeff" +expect "Security Policy: 678 onrcb" +expect_line "Done" sleep 30 @@ -267,5 +293,7 @@ send "dataset securitypolicy 678 something_invalid\n" expect "Error 7: InvalidArgs" send "dataset set something_invalid 00\n" expect "Error 7: InvalidArgs" +send "dataset init tlvs something_invalid\n" +expect "Error 7: InvalidArgs" dispose_all