From 4caec455c396950cf314a48ccccad3e4ed254552 Mon Sep 17 00:00:00 2001 From: Xiao Ma Date: Thu, 27 Oct 2016 00:08:43 +0800 Subject: [PATCH] Optimizate orhpaned MLE Announce message. (#886) --- src/core/thread/announce_begin_server.cpp | 2 +- src/core/thread/mle.cpp | 21 +++++++++++++++++---- src/core/thread/mle.hpp | 5 +++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/core/thread/announce_begin_server.cpp b/src/core/thread/announce_begin_server.cpp index 59d6bbceb..b1677cf4e 100644 --- a/src/core/thread/announce_begin_server.cpp +++ b/src/core/thread/announce_begin_server.cpp @@ -166,7 +166,7 @@ void AnnounceBeginServer::HandleTimer(void *aContext) void AnnounceBeginServer::HandleTimer(void) { - mNetif.GetMle().SendAnnounce(mChannel++); + mNetif.GetMle().SendAnnounce(mChannel++, false); while (mCount > 0) { diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 4c7bb1da2..20c0ee6d1 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -1434,11 +1434,12 @@ exit: return error; } -ThreadError Mle::SendAnnounce(uint8_t aChannel) +ThreadError Mle::SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce) { ThreadError error = kThreadError_None; ChannelTlv channel; PanIdTlv panid; + ActiveTimestampTlv activeTimestamp; Ip6::Address destination; Message *message; @@ -1452,7 +1453,19 @@ ThreadError Mle::SendAnnounce(uint8_t aChannel) channel.SetChannel(mMac.GetChannel()); SuccessOrExit(error = message->Append(&channel, sizeof(channel))); - SuccessOrExit(error = AppendActiveTimestamp(*message)); + if (aOrphanAnnounce) + { + activeTimestamp.Init(); + activeTimestamp.SetSeconds(0); + activeTimestamp.SetTicks(0); + activeTimestamp.SetAuthoritative(true); + + SuccessOrExit(error = message->Append(&activeTimestamp, sizeof(activeTimestamp))); + } + else + { + SuccessOrExit(error = AppendActiveTimestamp(*message)); + } panid.Init(); panid.SetPanId(mMac.GetPanId()); @@ -1501,7 +1514,7 @@ void Mle::SendOrphanAnnounce(void) } // Send Annuonce message - SendAnnounce(channel); + SendAnnounce(channel, true); // Move to next channel mAnnounceChannel++; @@ -2488,7 +2501,7 @@ ThreadError Mle::HandleAnnounce(const Message &aMessage, const Ip6::MessageInfo } else { - SendAnnounce(static_cast(channel.GetChannel())); + SendAnnounce(static_cast(channel.GetChannel()), false); } exit: diff --git a/src/core/thread/mle.hpp b/src/core/thread/mle.hpp index f8fd8c589..1862bcabe 100644 --- a/src/core/thread/mle.hpp +++ b/src/core/thread/mle.hpp @@ -430,13 +430,14 @@ public: /** * This method generates an MLE Announce message. * - * @param[in] aChannel The channel to use when transmitting. + * @param[in] aChannel The channel to use when transmitting. + * @param[in] aOrphanAnnounce To indiciate if MLE Announce is sent from an orphan end device. * * @retval kThreadError_None Successfully generated an MLE Announce message. * @retval kThreadError_NoBufs Insufficient buffers to generate the MLE Announce message. * */ - ThreadError SendAnnounce(uint8_t aChannel); + ThreadError SendAnnounce(uint8_t aChannel, bool aOrphanAnnounce); /** * This method causes the Thread interface to detach from the Thread network.