diff --git a/include/openthread/dataset.h b/include/openthread/dataset.h index 077cbf33d0f..50b174a0e6f 100644 --- a/include/openthread/dataset.h +++ b/include/openthread/dataset.h @@ -380,12 +380,15 @@ otError otDatasetGetActiveTlvs(otInstance *aInstance, otOperationalDatasetTlvs * * its Parent. Note that a router-capable device will not transition to the Router or Leader roles until it has a * complete Active Dataset. * + * This function consistently returns `OT_ERROR_NONE` and can effectively be treated as having a `void` return type. + * Previously, other errors (e.g., `OT_ERROR_NOT_IMPLEMENTED`) were allowed for legacy reasons. However, as + * non-volatile storage is now mandatory for Thread operation, any failure to save the dataset will trigger an + * assertion. The `otError` return type is retained for backward compatibility. + * * @param[in] aInstance A pointer to an OpenThread instance. * @param[in] aDataset A pointer to the Active Operational Dataset. * - * @retval OT_ERROR_NONE Successfully set the Active Operational Dataset. - * @retval OT_ERROR_NO_BUFS Insufficient buffer space to set the Active Operational Dataset. - * @retval OT_ERROR_NOT_IMPLEMENTED The platform does not implement settings functionality. + * @retval OT_ERROR_NONE Successfully set the Active Operational Dataset. * */ otError otDatasetSetActive(otInstance *aInstance, const otOperationalDataset *aDataset); @@ -409,9 +412,8 @@ otError otDatasetSetActive(otInstance *aInstance, const otOperationalDataset *aD * @param[in] aInstance A pointer to an OpenThread instance. * @param[in] aDataset A pointer to the Active Operational Dataset. * - * @retval OT_ERROR_NONE Successfully set the Active Operational Dataset. - * @retval OT_ERROR_NO_BUFS Insufficient buffer space to set the Active Operational Dataset. - * @retval OT_ERROR_NOT_IMPLEMENTED The platform does not implement settings functionality. + * @retval OT_ERROR_NONE Successfully set the Active Operational Dataset. + * @retval OT_ERROR_INVALID_ARGS The @p aDataset is invalid. It is too long or contains incorrect TLV formatting. * */ otError otDatasetSetActiveTlvs(otInstance *aInstance, const otOperationalDatasetTlvs *aDataset); @@ -443,12 +445,15 @@ otError otDatasetGetPendingTlvs(otInstance *aInstance, otOperationalDatasetTlvs /** * Sets the Pending Operational Dataset. * + * This function consistently returns `OT_ERROR_NONE` and can effectively be treated as having a `void` return type. + * Previously, other errors (e.g., `OT_ERROR_NOT_IMPLEMENTED`) were allowed for legacy reasons. However, as + * non-volatile storage is now mandatory for Thread operation, any failure to save the dataset will trigger an + * assertion. The `otError` return type is retained for backward compatibility. + * * @param[in] aInstance A pointer to an OpenThread instance. * @param[in] aDataset A pointer to the Pending Operational Dataset. * - * @retval OT_ERROR_NONE Successfully set the Pending Operational Dataset. - * @retval OT_ERROR_NO_BUFS Insufficient buffer space to set the Pending Operational Dataset. - * @retval OT_ERROR_NOT_IMPLEMENTED The platform does not implement settings functionality. + * @retval OT_ERROR_NONE Successfully set the Pending Operational Dataset. * */ otError otDatasetSetPending(otInstance *aInstance, const otOperationalDataset *aDataset); @@ -459,9 +464,8 @@ otError otDatasetSetPending(otInstance *aInstance, const otOperationalDataset *a * @param[in] aInstance A pointer to an OpenThread instance. * @param[in] aDataset A pointer to the Pending Operational Dataset. * - * @retval OT_ERROR_NONE Successfully set the Pending Operational Dataset. - * @retval OT_ERROR_NO_BUFS Insufficient buffer space to set the Pending Operational Dataset. - * @retval OT_ERROR_NOT_IMPLEMENTED The platform does not implement settings functionality. + * @retval OT_ERROR_NONE Successfully set the Pending Operational Dataset. + * @retval OT_ERROR_INVALID_ARGS The @p aDataset is invalid. It is too long or contains incorrect TLV formatting. * */ otError otDatasetSetPendingTlvs(otInstance *aInstance, const otOperationalDatasetTlvs *aDataset); diff --git a/include/openthread/instance.h b/include/openthread/instance.h index caf7ea94ec1..8e912e66c6b 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 (412) +#define OPENTHREAD_API_VERSION (413) /** * @addtogroup api-instance diff --git a/src/core/api/dataset_api.cpp b/src/core/api/dataset_api.cpp index fe08d2057d7..8e27fe151b7 100644 --- a/src/core/api/dataset_api.cpp +++ b/src/core/api/dataset_api.cpp @@ -61,7 +61,9 @@ otError otDatasetGetActiveTlvs(otInstance *aInstance, otOperationalDatasetTlvs * otError otDatasetSetActive(otInstance *aInstance, const otOperationalDataset *aDataset) { - return AsCoreType(aInstance).Get().SaveLocal(AsCoreType(aDataset)); + AsCoreType(aInstance).Get().SaveLocal(AsCoreType(aDataset)); + + return OT_ERROR_NONE; } otError otDatasetSetActiveTlvs(otInstance *aInstance, const otOperationalDatasetTlvs *aDataset) @@ -85,7 +87,9 @@ otError otDatasetGetPendingTlvs(otInstance *aInstance, otOperationalDatasetTlvs otError otDatasetSetPending(otInstance *aInstance, const otOperationalDataset *aDataset) { - return AsCoreType(aInstance).Get().SaveLocal(AsCoreType(aDataset)); + AsCoreType(aInstance).Get().SaveLocal(AsCoreType(aDataset)); + + return OT_ERROR_NONE; } otError otDatasetSetPendingTlvs(otInstance *aInstance, const otOperationalDatasetTlvs *aDataset) diff --git a/src/core/common/settings.cpp b/src/core/common/settings.cpp index df8226b9320..1451b7a90d6 100644 --- a/src/core/common/settings.cpp +++ b/src/core/common/settings.cpp @@ -35,6 +35,7 @@ #include "common/array.hpp" #include "common/code_utils.hpp" +#include "common/debug.hpp" #include "common/locator_getters.hpp" #include "common/num_utils.hpp" #include "instance/instance.hpp" @@ -221,14 +222,14 @@ Settings::Key Settings::KeyForDatasetType(MeshCoP::Dataset::Type aType) return (aType == MeshCoP::Dataset::kActive) ? kKeyActiveDataset : kKeyPendingDataset; } -Error Settings::SaveOperationalDataset(MeshCoP::Dataset::Type aType, const MeshCoP::Dataset &aDataset) +void Settings::SaveOperationalDataset(MeshCoP::Dataset::Type aType, const MeshCoP::Dataset &aDataset) { Key key = KeyForDatasetType(aType); Error error = Get().Set(key, aDataset.GetBytes(), aDataset.GetLength()); Log(kActionSave, error, key); - return error; + SuccessOrAssert(error); } Error Settings::ReadOperationalDataset(MeshCoP::Dataset::Type aType, MeshCoP::Dataset &aDataset) const @@ -242,17 +243,17 @@ Error Settings::ReadOperationalDataset(MeshCoP::Dataset::Type aType, MeshCoP::Da aDataset.SetLength(static_cast(length)); exit: + OT_ASSERT(error != kErrorNotImplemented); return error; } -Error Settings::DeleteOperationalDataset(MeshCoP::Dataset::Type aType) +void Settings::DeleteOperationalDataset(MeshCoP::Dataset::Type aType) { Key key = KeyForDatasetType(aType); Error error = Get().Delete(key); Log(kActionDelete, error, key); - - return error; + OT_ASSERT(error != kErrorNotImplemented); } #if OPENTHREAD_FTD diff --git a/src/core/common/settings.hpp b/src/core/common/settings.hpp index 1f5a33adb90..c98829c3408 100644 --- a/src/core/common/settings.hpp +++ b/src/core/common/settings.hpp @@ -881,11 +881,8 @@ class Settings : public SettingsBase, private NonCopyable * @param[in] aType The Dataset type (active or pending) to save. * @param[in] aDataset A reference to a `Dataset` object to be saved. * - * @retval kErrorNone Successfully saved the Dataset. - * @retval kErrorNotImplemented The platform does not implement settings functionality. - * */ - Error SaveOperationalDataset(MeshCoP::Dataset::Type aType, const MeshCoP::Dataset &aDataset); + void SaveOperationalDataset(MeshCoP::Dataset::Type aType, const MeshCoP::Dataset &aDataset); /** * Reads the Operational Dataset (active or pending). @@ -895,7 +892,6 @@ class Settings : public SettingsBase, private NonCopyable * * @retval kErrorNone Successfully read the Dataset. * @retval kErrorNotFound No corresponding value in the setting store. - * @retval kErrorNotImplemented The platform does not implement settings functionality. * */ Error ReadOperationalDataset(MeshCoP::Dataset::Type aType, MeshCoP::Dataset &aDataset) const; @@ -905,11 +901,8 @@ class Settings : public SettingsBase, private NonCopyable * * @param[in] aType The Dataset type (active or pending) to delete. * - * @retval kErrorNone Successfully deleted the Dataset. - * @retval kErrorNotImplemented The platform does not implement settings functionality. - * */ - Error DeleteOperationalDataset(MeshCoP::Dataset::Type aType); + void DeleteOperationalDataset(MeshCoP::Dataset::Type aType); /** * Reads a specified settings entry. diff --git a/src/core/meshcop/dataset_local.cpp b/src/core/meshcop/dataset_local.cpp index e93e9b704db..add800ab77f 100644 --- a/src/core/meshcop/dataset_local.cpp +++ b/src/core/meshcop/dataset_local.cpp @@ -66,7 +66,7 @@ void DatasetLocal::Clear(void) #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE DestroySecurelyStoredKeys(); #endif - IgnoreError(Get().DeleteOperationalDataset(mType)); + Get().DeleteOperationalDataset(mType); mTimestamp.Clear(); mTimestampPresent = false; mSaved = false; @@ -146,18 +146,15 @@ Error DatasetLocal::Read(Dataset::Tlvs &aDatasetTlvs) const return error; } -Error DatasetLocal::Save(const Dataset &aDataset) +void DatasetLocal::Save(const Dataset &aDataset) { - Error error = kErrorNone; - #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE DestroySecurelyStoredKeys(); #endif if (aDataset.GetLength() == 0) { - // do not propagate error back - IgnoreError(Get().DeleteOperationalDataset(mType)); + Get().DeleteOperationalDataset(mType); mSaved = false; LogInfo("%s dataset deleted", Dataset::TypeToString(mType)); } @@ -169,9 +166,9 @@ Error DatasetLocal::Save(const Dataset &aDataset) dataset.SetFrom(aDataset); MoveKeysToSecureStorage(dataset); - SuccessOrExit(error = Get().SaveOperationalDataset(mType, dataset)); + Get().SaveOperationalDataset(mType, dataset); #else - SuccessOrExit(error = Get().SaveOperationalDataset(mType, aDataset)); + Get().SaveOperationalDataset(mType, aDataset); #endif mSaved = true; @@ -180,9 +177,6 @@ Error DatasetLocal::Save(const Dataset &aDataset) mTimestampPresent = (aDataset.ReadTimestamp(mType, mTimestamp) == kErrorNone); mUpdateTime = TimerMilli::GetNow(); - -exit: - return error; } #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE @@ -239,7 +233,7 @@ void DatasetLocal::EmplaceSecurelyStoredKeys(Dataset &aDataset) const dataset.SetFrom(aDataset); MoveKeysToSecureStorage(dataset); - SuccessOrAssert(Get().SaveOperationalDataset(mType, dataset)); + Get().SaveOperationalDataset(mType, dataset); } } diff --git a/src/core/meshcop/dataset_local.hpp b/src/core/meshcop/dataset_local.hpp index 36f492f3c7f..89407aa0d95 100644 --- a/src/core/meshcop/dataset_local.hpp +++ b/src/core/meshcop/dataset_local.hpp @@ -155,11 +155,8 @@ class DatasetLocal : public InstanceLocator * * @param[in] aDataset The Dataset to save. * - * @retval kErrorNone Successfully saved the dataset. - * @retval kErrorNotImplemented The platform does not implement settings functionality. - * */ - Error Save(const Dataset &aDataset); + void Save(const Dataset &aDataset); private: #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index ee32b8fae11..56d0838fb60 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -163,7 +163,7 @@ Error DatasetManager::Save(const Dataset &aDataset) if (isNetworkKeyUpdated || compare > 0) { - SuccessOrExit(error = mLocal.Save(aDataset)); + mLocal.Save(aDataset); #if OPENTHREAD_FTD Get().IncrementVersionAndStableVersion(); @@ -180,32 +180,31 @@ Error DatasetManager::Save(const Dataset &aDataset) return error; } -Error DatasetManager::SaveLocal(const Dataset::Info &aDatasetInfo) +void DatasetManager::SaveLocal(const Dataset::Info &aDatasetInfo) { Dataset dataset; dataset.SetFrom(aDatasetInfo); - - return SaveLocal(dataset); + SaveLocal(dataset); } Error DatasetManager::SaveLocal(const Dataset::Tlvs &aDatasetTlvs) { - Error error; + Error error = kErrorInvalidArgs; Dataset dataset; - SuccessOrExit(error = dataset.SetFrom(aDatasetTlvs)); - error = SaveLocal(dataset); + SuccessOrExit(dataset.SetFrom(aDatasetTlvs)); + SuccessOrExit(dataset.ValidateTlvs()); + SaveLocal(dataset); + error = kErrorNone; exit: return error; } -Error DatasetManager::SaveLocal(const Dataset &aDataset) +void DatasetManager::SaveLocal(const Dataset &aDataset) { - Error error; - - SuccessOrExit(error = mLocal.Save(aDataset)); + mLocal.Save(aDataset); if (IsPendingDataset()) { @@ -237,9 +236,6 @@ Error DatasetManager::SaveLocal(const Dataset &aDataset) } SignalDatasetChange(); - -exit: - return error; } void DatasetManager::SignalDatasetChange(void) const diff --git a/src/core/meshcop/dataset_manager.hpp b/src/core/meshcop/dataset_manager.hpp index f909a61efe2..eb0b8c5d05e 100644 --- a/src/core/meshcop/dataset_manager.hpp +++ b/src/core/meshcop/dataset_manager.hpp @@ -115,30 +115,24 @@ class DatasetManager : public InstanceLocator * * @param[in] aDataset The Operational Dataset. * - * @retval kErrorNone Successfully applied configuration. - * @retval kErrorParse The dataset has at least one TLV with invalid format. - * */ - Error SaveLocal(const Dataset &aDataset); + void SaveLocal(const Dataset &aDataset); /** * Saves the Operational Dataset in non-volatile memory. * * @param[in] aDatasetInfo The Operational Dataset as `Dataset::Info`. * - * @retval kErrorNone Successfully saved the dataset. - * @retval kErrorNotImplemented The platform does not implement settings functionality. - * */ - Error SaveLocal(const Dataset::Info &aDatasetInfo); + void SaveLocal(const Dataset::Info &aDatasetInfo); /** * Saves the Operational Dataset in non-volatile memory. * * @param[in] aDatasetTlvs The Operational Dataset as `Dataset::Tlvs`. * - * @retval kErrorNone Successfully saved the dataset. - * @retval kErrorNotImplemented The platform does not implement settings functionality. + * @retval kErrorNone Successfully saved the dataset. + * @retval kErrorInvalidArgs The @p aDatasetTlvs is invalid. It is too long or contains incorrect TLV formatting. * */ Error SaveLocal(const Dataset::Tlvs &aDatasetTlvs); diff --git a/src/core/meshcop/dataset_manager_ftd.cpp b/src/core/meshcop/dataset_manager_ftd.cpp index 72a5dbc100c..8ca169e8eeb 100644 --- a/src/core/meshcop/dataset_manager_ftd.cpp +++ b/src/core/meshcop/dataset_manager_ftd.cpp @@ -376,7 +376,7 @@ Error ActiveDatasetManager::GenerateLocal(void) IgnoreError(dataset.WriteTlv(tlv)); } - SuccessOrExit(error = mLocal.Save(dataset)); + mLocal.Save(dataset); IgnoreError(Restore()); LogInfo("Generated local dataset"); diff --git a/src/core/meshcop/dataset_updater.cpp b/src/core/meshcop/dataset_updater.cpp index 36fd28a17bb..3f2f582b3e8 100644 --- a/src/core/meshcop/dataset_updater.cpp +++ b/src/core/meshcop/dataset_updater.cpp @@ -149,7 +149,7 @@ void DatasetUpdater::PreparePendingDataset(void) IgnoreError(dataset.Write(timestamp)); } - SuccessOrExit(error = Get().SaveLocal(dataset)); + Get().SaveLocal(dataset); exit: if (error != kErrorNone) diff --git a/src/core/meshcop/joiner.cpp b/src/core/meshcop/joiner.cpp index ce0b6a167cc..a1ff9bf1c57 100644 --- a/src/core/meshcop/joiner.cpp +++ b/src/core/meshcop/joiner.cpp @@ -533,7 +533,7 @@ template <> void Joiner::HandleTmf(Coap::Message &aMessage, c datasetInfo.Set(Get().GetPanChannel()); datasetInfo.Set(Get().GetPanId()); - IgnoreError(Get().SaveLocal(datasetInfo)); + Get().SaveLocal(datasetInfo); LogInfo("Joiner successful!");