From f15dbd67fd0d535a8e37d140bcdd69b6f0d9019f Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 16 May 2024 13:19:10 -0700 Subject: [PATCH] [dataset] add `ContainsAllTlvs()` helper method (#10249) This commit introduces the `ContainsAllTlvs()` method to `Dataset`, which checks if a dataset contains all the specified TLVs. This new method simplifies the implementation of `IsCommissioned()` and `ContainsAllRequiredTlvsFor(Type)` --- src/core/meshcop/dataset.cpp | 54 +++++++++++++++++----------- src/core/meshcop/dataset.hpp | 12 +++++++ src/core/meshcop/dataset_manager.cpp | 13 +++---- 3 files changed, 53 insertions(+), 26 deletions(-) diff --git a/src/core/meshcop/dataset.cpp b/src/core/meshcop/dataset.cpp index 6ff0eac33..6ed478e93 100644 --- a/src/core/meshcop/dataset.cpp +++ b/src/core/meshcop/dataset.cpp @@ -238,36 +238,50 @@ exit: return isValid; } -bool Dataset::ContainsAllRequiredTlvsFor(Type aType) const +bool Dataset::ContainsAllTlvs(const Tlv::Type aTlvTypes[], uint8_t aLength) const { - static const Tlv::Type kActiveDatasetTlvs[] = { - Tlv::kActiveTimestamp, Tlv::kChannel, Tlv::kChannelMask, Tlv::kExtendedPanId, Tlv::kMeshLocalPrefix, - Tlv::kNetworkKey, Tlv::kNetworkName, Tlv::kPanId, Tlv::kPskc, Tlv::kSecurityPolicy, - }; + bool containsAll = true; - static const Tlv::Type kPendingDatasetExtraTlvs[] = {Tlv::kPendingTimestamp, Tlv::kDelayTimer}; - - bool containsAll = false; - - for (Tlv::Type tlvType : kActiveDatasetTlvs) + for (uint8_t index = 0; index < aLength; index++) { - VerifyOrExit(ContainsTlv(tlvType)); - } - - if (aType == kPending) - { - for (Tlv::Type tlvType : kPendingDatasetExtraTlvs) + if (!ContainsTlv(aTlvTypes[index])) { - VerifyOrExit(ContainsTlv(tlvType)); + containsAll = false; + break; } } - containsAll = true; - -exit: return containsAll; } +bool Dataset::ContainsAllRequiredTlvsFor(Type aType) const +{ + static const Tlv::Type kDatasetTlvs[] = { + Tlv::kActiveTimestamp, + Tlv::kChannel, + Tlv::kChannelMask, + Tlv::kExtendedPanId, + Tlv::kMeshLocalPrefix, + Tlv::kNetworkKey, + Tlv::kNetworkName, + Tlv::kPanId, + Tlv::kPskc, + Tlv::kSecurityPolicy, + // The last two TLVs are for Pending Dataset + Tlv::kPendingTimestamp, + Tlv::kDelayTimer, + }; + + uint8_t length = sizeof(kDatasetTlvs); + + if (aType == kActive) + { + length -= 2; + } + + return ContainsAllTlvs(kDatasetTlvs, length); +} + const Tlv *Dataset::FindTlv(Tlv::Type aType) const { return As(Tlv::FindTlv(mTlvs, mLength, aType)); } void Dataset::ConvertTo(Info &aDatasetInfo) const diff --git a/src/core/meshcop/dataset.hpp b/src/core/meshcop/dataset.hpp index ac350a65c..a35d98ea2 100644 --- a/src/core/meshcop/dataset.hpp +++ b/src/core/meshcop/dataset.hpp @@ -296,6 +296,18 @@ public: return ContainsTlv(static_cast(TlvType::kType)); } + /** + * Indicates whether or not the Dataset contains all the TLVs from a given array. + * + * @param[in] aTlvTypes An array of TLV types. + * @param[in] aLength Length of @p aTlvTypes array. + * + * @retval TRUE The Dataset contains all the TLVs in @p aTlvTypes array. + * @retval FALSE The Dataset does not contain all the TLVs in @p aTlvTypes array. + * + */ + bool ContainsAllTlvs(const Tlv::Type aTlvTypes[], uint8_t aLength) const; + /** * Indicates whether or not the Dataset contains all the required TLVs for an Active or Pending Dataset. * diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index 56d0838fb..6c3f0b6c7 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -593,14 +593,15 @@ bool ActiveDatasetManager::IsComplete(void) const { return mLocal.IsSaved() && m bool ActiveDatasetManager::IsCommissioned(void) const { - Dataset::Info datasetInfo; - bool isValid = false; + static const Tlv::Type kRequiredTlvs[] = { + Tlv::kNetworkKey, Tlv::kNetworkName, Tlv::kExtendedPanId, Tlv::kPanId, Tlv::kChannel, + }; - SuccessOrExit(Read(datasetInfo)); + Dataset dataset; + bool isValid = false; - isValid = (datasetInfo.IsPresent() && datasetInfo.IsPresent() && - datasetInfo.IsPresent() && datasetInfo.IsPresent() && - datasetInfo.IsPresent()); + SuccessOrExit(Read(dataset)); + isValid = dataset.ContainsAllTlvs(kRequiredTlvs, sizeof(kRequiredTlvs)); exit: return isValid;