diff --git a/src/core/thread/meshcop_dataset.cpp b/src/core/thread/meshcop_dataset.cpp index 24024ea12..d001facb4 100644 --- a/src/core/thread/meshcop_dataset.cpp +++ b/src/core/thread/meshcop_dataset.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include namespace Thread { @@ -482,6 +483,34 @@ exit: return; } +ThreadError Dataset::AppendMleDatasetTlv(Message &aMessage) +{ + ThreadError error = kThreadError_None; + Mle::Tlv tlv; + Mle::Tlv::Type type; + Tlv *cur = reinterpret_cast(mTlvs); + Tlv *end = reinterpret_cast(mTlvs + mLength); + + type = (mType == Tlv::kActiveTimestamp ? Mle::Tlv::kActiveDataset : Mle::Tlv::kPendingDataset); + + tlv.SetType(type); + tlv.SetLength(static_cast(mLength) - sizeof(Tlv) - sizeof(Timestamp)); + SuccessOrExit(error = aMessage.Append(&tlv, sizeof(Tlv))); + + while (cur < end) + { + if (cur->GetType() != mType) + { + SuccessOrExit(error = aMessage.Append(cur, sizeof(Tlv) + cur->GetLength())); + } + + cur = cur->GetNext(); + } + +exit: + return error; +} + void Dataset::Remove(uint8_t *aStart, uint8_t aLength) { memmove(aStart, aStart + aLength, mLength - (static_cast(aStart - mTlvs) + aLength)); diff --git a/src/core/thread/meshcop_dataset.hpp b/src/core/thread/meshcop_dataset.hpp index 821bba999..9fedc8553 100644 --- a/src/core/thread/meshcop_dataset.hpp +++ b/src/core/thread/meshcop_dataset.hpp @@ -166,8 +166,23 @@ public: ThreadError Set(const otOperationalDataset &aDataset); + /** + * This method removes a TLV from the Dataset. + * + * @param[in] aType The type of a specific TLV. + * + */ void Remove(Tlv::Type aType); + /** + * This method appends the MLE Dataset TLV but excluding MeshCoP Sub Timestamp TLV. + * + * @retval kThreadError_None Successfully append MLE Dataset TLV without MeshCoP Sub Timestamp TLV. + * @retval kThreadError_NoBufs Insufficient available buffers to append the message with MLE Dataset TLV. + * + */ + ThreadError AppendMleDatasetTlv(Message &aMessage); + private: void Remove(uint8_t *aStart, uint8_t aLength); diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 1d0745a35..43f5f1b9f 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -3729,12 +3729,10 @@ exit: ThreadError MleRouter::AppendActiveDataset(Message &aMessage) { ThreadError error = kThreadError_None; - Tlv tlv; - tlv.SetType(Tlv::kActiveDataset); - tlv.SetLength(static_cast(mNetif.GetActiveDataset().GetNetwork().GetSize())); - SuccessOrExit(error = aMessage.Append(&tlv, sizeof(tlv))); - SuccessOrExit(error = aMessage.Append(mNetif.GetActiveDataset().GetNetwork().GetBytes(), tlv.GetLength())); + VerifyOrExit(mNetif.GetActiveDataset().GetNetwork().GetSize() > 0,); + + SuccessOrExit(error = mNetif.GetActiveDataset().GetNetwork().AppendMleDatasetTlv(aMessage)); exit: return error; @@ -3743,13 +3741,11 @@ exit: ThreadError MleRouter::AppendPendingDataset(Message &aMessage) { ThreadError error = kThreadError_None; - Tlv tlv; - tlv.SetType(Tlv::kPendingDataset); - tlv.SetLength(static_cast(mNetif.GetPendingDataset().GetNetwork().GetSize())); - SuccessOrExit(error = aMessage.Append(&tlv, sizeof(tlv))); + VerifyOrExit(mNetif.GetPendingDataset().GetNetwork().GetSize() > 0,); + mNetif.GetPendingDataset().UpdateDelayTimer(); - SuccessOrExit(error = aMessage.Append(mNetif.GetPendingDataset().GetNetwork().GetBytes(), tlv.GetLength())); + SuccessOrExit(error = mNetif.GetPendingDataset().GetNetwork().AppendMleDatasetTlv(aMessage)); exit: return error;