diff --git a/src/core/common/message.hpp b/src/core/common/message.hpp index 125d8de7c..868295913 100644 --- a/src/core/common/message.hpp +++ b/src/core/common/message.hpp @@ -214,6 +214,7 @@ public: kSubTypeMleDiscoverRequest = 2, ///< MLE Discover Request kSubTypeMleDiscoverResponse = 3, ///< MLE Discover Response kSubTypeJoinerEntrust = 4, ///< Joiner Entrust + kSubTypeMplRetransmission = 5, ///< MPL next retranmission message }; enum diff --git a/src/core/net/ip6_mpl.cpp b/src/core/net/ip6_mpl.cpp index 2eda0fdd8..dbd47f4d7 100644 --- a/src/core/net/ip6_mpl.cpp +++ b/src/core/net/ip6_mpl.cpp @@ -286,6 +286,11 @@ void Mpl::HandleRetransmissionTimer() if (messageCopy != NULL) { + if (messageMetadata.GetTransmissionCount() > 1) + { + messageCopy->SetSubType(Message::kSubTypeMplRetransmission); + } + mIp6.EnqueueDatagram(*messageCopy); } @@ -304,6 +309,11 @@ void Mpl::HandleRetransmissionTimer() if (messageMetadata.GetTransmissionCount() == GetTimerExpirations()) { + if (messageMetadata.GetTransmissionCount() > 1) + { + message->SetSubType(Message::kSubTypeMplRetransmission); + } + // Remove the extra metadata from the MPL Data Message. messageMetadata.RemoveFrom(*message); mIp6.EnqueueDatagram(*message); diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index be38e184e..8d88bca85 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -410,16 +410,19 @@ ThreadError MeshForwarder::SendMessage(Message &aMessage) // schedule direct transmission aMessage.SetDirectTransmission(); - // destined for all sleepy children - children = mMle.GetChildren(&numChildren); - - for (uint8_t i = 0; i < numChildren; i++) + if (aMessage.GetSubType() != Message::kSubTypeMplRetransmission) { - if (children[i].mState == Neighbor::kStateValid && (children[i].mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0) + // destined for all sleepy children + children = mMle.GetChildren(&numChildren); + + for (uint8_t i = 0; i < numChildren; i++) { - children[i].mQueuedIndirectMessageCnt++; - AddSrcMatchEntry(children[i]); - aMessage.SetChildMask(i); + if (children[i].mState == Neighbor::kStateValid && (children[i].mMode & Mle::ModeTlv::kModeRxOnWhenIdle) == 0) + { + children[i].mQueuedIndirectMessageCnt++; + AddSrcMatchEntry(children[i]); + aMessage.SetChildMask(i); + } } } }