diff --git a/src/core/meshcop/dataset_local.cpp b/src/core/meshcop/dataset_local.cpp index 6eca12afd..5cb2602b3 100644 --- a/src/core/meshcop/dataset_local.cpp +++ b/src/core/meshcop/dataset_local.cpp @@ -55,14 +55,42 @@ DatasetLocal::DatasetLocal(Instance &aInstance, const Tlv::Type aType) : InstanceLocator(aInstance) , mUpdateTime(0) , mType(aType) + , mTimestampPresent(false) { + mTimestamp.Init(); } void DatasetLocal::Clear(void) { + mTimestamp.Init(); + mTimestampPresent = false; otPlatSettingsDelete(&GetInstance(), GetSettingsKey(), -1); } +otError DatasetLocal::Restore(Dataset &aDataset) +{ + const Timestamp *timestamp; + otError error; + + error = Get(aDataset); + SuccessOrExit(error); + + timestamp = aDataset.GetTimestamp(); + + if (timestamp != NULL) + { + mTimestamp = *timestamp; + mTimestampPresent = true; + } + else + { + mTimestampPresent = false; + } + +exit: + return error; +} + otError DatasetLocal::Get(Dataset &aDataset) const { DelayTimerTlv *delayTimer; @@ -131,8 +159,9 @@ exit: otError DatasetLocal::Set(const Dataset &aDataset) { - Dataset dataset(aDataset); - otError error; + Dataset dataset(aDataset); + const Timestamp *timestamp; + otError error; if (mType == Tlv::kActiveTimestamp) { @@ -153,6 +182,18 @@ otError DatasetLocal::Set(const Dataset &aDataset) SuccessOrExit(error); + timestamp = dataset.GetTimestamp(); + + if (timestamp != NULL) + { + mTimestamp = *timestamp; + mTimestampPresent = true; + } + else + { + mTimestampPresent = false; + } + mUpdateTime = TimerMilli::GetNow(); exit: @@ -177,32 +218,31 @@ uint16_t DatasetLocal::GetSettingsKey(void) const int DatasetLocal::Compare(const Timestamp *aCompareTimestamp) { - const Timestamp *thisTimestamp; - Dataset dataset(mType); - int rval = 1; + int rval = 1; - SuccessOrExit(Get(dataset)); - - thisTimestamp = dataset.GetTimestamp(); - - if (aCompareTimestamp == NULL && thisTimestamp == NULL) + if (aCompareTimestamp == NULL) { - rval = 0; - } - else if (aCompareTimestamp == NULL && thisTimestamp != NULL) - { - rval = -1; - } - else if (aCompareTimestamp != NULL && thisTimestamp == NULL) - { - rval = 1; + if (!mTimestampPresent) + { + rval = 0; + } + else + { + rval = -1; + } } else { - rval = thisTimestamp->Compare(*aCompareTimestamp); + if (!mTimestampPresent) + { + rval = 1; + } + else + { + rval = mTimestamp.Compare(*aCompareTimestamp); + } } -exit: return rval; } diff --git a/src/core/meshcop/dataset_local.hpp b/src/core/meshcop/dataset_local.hpp index aa7965538..16d9e37a2 100644 --- a/src/core/meshcop/dataset_local.hpp +++ b/src/core/meshcop/dataset_local.hpp @@ -71,6 +71,19 @@ public: */ void Clear(void); + /** + * This method restores and retrieves the dataset from non-volatile memory. + * + * This method also sets the memory-cached timestamp for subsequent calls to `Compare()`. + * + * @param[out] aDataset Where to place the dataset. + * + * @retval OT_ERROR_NONE Successfully retrieved the dataset. + * @retval OT_ERROR_NOT_FOUND There is no corresponding dataset stored in non-volatile memory. + * + */ + otError Restore(Dataset &aDataset); + /** * This method retrieves the dataset from non-volatile memory. * @@ -135,8 +148,10 @@ private: uint16_t GetSettingsKey(void) const; void SetTimestamp(const Dataset &aDataset); - uint32_t mUpdateTime; ///< Local time last updated - Tlv::Type mType; ///< Active or Pending + Timestamp mTimestamp; ///< Active or Pending Timestamp + uint32_t mUpdateTime; ///< Local time last updated + Tlv::Type mType; ///< Active or Pending + bool mTimestampPresent : 1; ///< Whether or not timestamp is present }; } // namespace MeshCoP diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index 41269f3eb..197ebfe22 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -111,7 +111,7 @@ otError DatasetManager::Restore(void) mTimer.Stop(); - SuccessOrExit(error = mLocal.Get(dataset)); + SuccessOrExit(error = mLocal.Restore(dataset)); timestamp = dataset.GetTimestamp();