diff --git a/src/core/net/ip6_mpl.cpp b/src/core/net/ip6_mpl.cpp index 34bfe9f5a..9e490a6ff 100644 --- a/src/core/net/ip6_mpl.cpp +++ b/src/core/net/ip6_mpl.cpp @@ -297,10 +297,10 @@ void Mpl::HandleSeedSetTimer(void) void Mpl::AddBufferedMessage(Message &aMessage, uint16_t aSeedId, uint8_t aSequence, bool aIsOutbound) { - otError error = OT_ERROR_NONE; - Message * messageCopy = NULL; - MplBufferedMessageMetadata messageMetadata; - uint8_t hopLimit = 0; + otError error = OT_ERROR_NONE; + Message *messageCopy = NULL; + Metadata metadata; + uint8_t hopLimit = 0; #if OPENTHREAD_CONFIG_MPL_DYNAMIC_INTERVAL_ENABLE // adjust the first MPL forward interval dynamically according to the network scale @@ -319,15 +319,16 @@ void Mpl::AddBufferedMessage(Message &aMessage, uint16_t aSeedId, uint8_t aSeque messageCopy->Write(Header::GetHopLimitOffset(), Header::GetHopLimitSize(), &hopLimit); } - messageMetadata.SetSeedId(aSeedId); - messageMetadata.SetSequence(aSequence); - messageMetadata.SetTransmissionCount(aIsOutbound ? 1 : 0); - messageMetadata.GenerateNextTransmissionTime(TimerMilli::GetNow(), interval); + metadata.mSeedId = aSeedId; + metadata.mSequence = aSequence; + metadata.mTransmissionCount = aIsOutbound ? 1 : 0; + metadata.mIntervalOffset = 0; + metadata.GenerateNextTransmissionTime(TimerMilli::GetNow(), interval); - SuccessOrExit(error = messageMetadata.AppendTo(*messageCopy)); + SuccessOrExit(error = metadata.AppendTo(*messageCopy)); mBufferedMessageSet.Enqueue(*messageCopy); - mRetransmissionTimer.FireAtIfEarlier(messageMetadata.GetTransmissionTime()); + mRetransmissionTimer.FireAtIfEarlier(metadata.mTransmissionTime); exit: @@ -337,16 +338,6 @@ exit: } } -void MplBufferedMessageMetadata::GenerateNextTransmissionTime(TimeMilli aCurrentTime, uint8_t aInterval) -{ - // Emulate Trickle timer behavior and set up the next retransmission within [0,I) range. - uint8_t t = (aInterval == 0) ? aInterval : Random::NonCrypto::GetUint8InRange(0, aInterval); - - // Set transmission time at the beginning of the next interval. - SetTransmissionTime(aCurrentTime + static_cast(GetIntervalOffset() + t)); - SetIntervalOffset(aInterval - t); -} - void Mpl::HandleRetransmissionTimer(Timer &aTimer) { aTimer.GetOwner().HandleRetransmissionTimer(); @@ -354,37 +345,37 @@ void Mpl::HandleRetransmissionTimer(Timer &aTimer) void Mpl::HandleRetransmissionTimer(void) { - TimeMilli now = TimerMilli::GetNow(); - TimeMilli nextTime = now.GetDistantFuture(); - MplBufferedMessageMetadata messageMetadata; - Message * message; - Message * nextMessage; + TimeMilli now = TimerMilli::GetNow(); + TimeMilli nextTime = now.GetDistantFuture(); + Metadata metadata; + Message * message; + Message * nextMessage; for (message = mBufferedMessageSet.GetHead(); message != NULL; message = nextMessage) { nextMessage = message->GetNext(); - messageMetadata.ReadFrom(*message); + metadata.ReadFrom(*message); - if (now < messageMetadata.GetTransmissionTime()) + if (now < metadata.mTransmissionTime) { - if (nextTime > messageMetadata.GetTransmissionTime()) + if (nextTime > metadata.mTransmissionTime) { - nextTime = messageMetadata.GetTransmissionTime(); + nextTime = metadata.mTransmissionTime; } } else { // Update the number of transmission timer expirations. - messageMetadata.SetTransmissionCount(messageMetadata.GetTransmissionCount() + 1); + metadata.mTransmissionCount++; - if (messageMetadata.GetTransmissionCount() < GetTimerExpirations()) + if (metadata.mTransmissionCount < GetTimerExpirations()) { - Message *messageCopy = message->Clone(message->GetLength() - sizeof(MplBufferedMessageMetadata)); + Message *messageCopy = message->Clone(message->GetLength() - sizeof(Metadata)); if (messageCopy != NULL) { - if (messageMetadata.GetTransmissionCount() > 1) + if (metadata.mTransmissionCount > 1) { messageCopy->SetSubType(Message::kSubTypeMplRetransmission); } @@ -392,27 +383,26 @@ void Mpl::HandleRetransmissionTimer(void) Get().EnqueueDatagram(*messageCopy); } - messageMetadata.GenerateNextTransmissionTime(now, kDataMessageInterval); - messageMetadata.UpdateIn(*message); + metadata.GenerateNextTransmissionTime(now, kDataMessageInterval); + metadata.UpdateIn(*message); - if (nextTime > messageMetadata.GetTransmissionTime()) + if (nextTime > metadata.mTransmissionTime) { - nextTime = messageMetadata.GetTransmissionTime(); + nextTime = metadata.mTransmissionTime; } } else { mBufferedMessageSet.Dequeue(*message); - if (messageMetadata.GetTransmissionCount() == GetTimerExpirations()) + if (metadata.mTransmissionCount == GetTimerExpirations()) { - if (messageMetadata.GetTransmissionCount() > 1) + if (metadata.mTransmissionCount > 1) { message->SetSubType(Message::kSubTypeMplRetransmission); } - // Remove the extra metadata from the MPL Data Message. - MplBufferedMessageMetadata::RemoveFrom(*message); + metadata.RemoveFrom(*message); Get().EnqueueDatagram(*message); } else @@ -430,6 +420,37 @@ void Mpl::HandleRetransmissionTimer(void) } } +void Mpl::Metadata::ReadFrom(const Message &aMessage) +{ + uint16_t length = aMessage.GetLength(); + + OT_ASSERT(length >= sizeof(*this)); + aMessage.Read(length - sizeof(*this), sizeof(*this), this); +} + +void Mpl::Metadata::RemoveFrom(Message &aMessage) const +{ + otError error = aMessage.SetLength(aMessage.GetLength() - sizeof(*this)); + + OT_ASSERT(error == OT_ERROR_NONE); + OT_UNUSED_VARIABLE(error); +} + +int Mpl::Metadata::UpdateIn(Message &aMessage) const +{ + return aMessage.Write(aMessage.GetLength() - sizeof(*this), sizeof(*this), this); +} + +void Mpl::Metadata::GenerateNextTransmissionTime(TimeMilli aCurrentTime, uint8_t aInterval) +{ + // Emulate Trickle timer behavior and set up the next retransmission within [0,I) range. + uint8_t t = (aInterval == 0) ? aInterval : Random::NonCrypto::GetUint8InRange(0, aInterval); + + // Set transmission time at the beginning of the next interval. + mTransmissionTime = aCurrentTime + static_cast(mIntervalOffset + t); + mIntervalOffset = aInterval - t; +} + #endif // OPENTHREAD_FTD } // namespace Ip6 diff --git a/src/core/net/ip6_mpl.hpp b/src/core/net/ip6_mpl.hpp index 9844e07a5..fb3ab8d04 100644 --- a/src/core/net/ip6_mpl.hpp +++ b/src/core/net/ip6_mpl.hpp @@ -243,172 +243,6 @@ private: uint8_t mLifetime; }; -#if OPENTHREAD_FTD -/** - * This class represents metadata required for MPL retransmissions. - * - */ -class MplBufferedMessageMetadata -{ -public: - /** - * Default constructor for the object. - * - */ - MplBufferedMessageMetadata(void) - : mSeedId(0) - , mSequence(0) - , mTransmissionCount(0) - , mTransmissionTime(0) - , mIntervalOffset(0){}; - - /** - * This method appends MPL Buffered Message metadata to the message. - * - * @param[in] aMessage A reference to the message. - * - * @retval OT_ERROR_NONE Successfully appended the bytes. - * @retval OT_ERROR_NO_BUFS Insufficient available buffers to grow the message. - * - */ - otError AppendTo(Message &aMessage) const { return aMessage.Append(this, sizeof(*this)); } - - /** - * This method reads request data from the message. - * - * @param[in] aMessage A reference to the message. - * - */ - void ReadFrom(const Message &aMessage) - { - uint16_t length = aMessage.Read(aMessage.GetLength() - sizeof(*this), sizeof(*this), this); - OT_ASSERT(length == sizeof(*this)); - OT_UNUSED_VARIABLE(length); - } - - /** - * This method removes MPL Buffered Message metadata from the message. - * - * @param[in] aMessage A reference to the message. - * - */ - static void RemoveFrom(Message &aMessage) - { - otError error = aMessage.SetLength(aMessage.GetLength() - sizeof(MplBufferedMessageMetadata)); - OT_ASSERT(error == OT_ERROR_NONE); - OT_UNUSED_VARIABLE(error); - } - - /** - * This method updates MPL Buffered Message metadata in the message. - * - * @param[in] aMessage A reference to the message. - * - * @returns The number of bytes that have been updated. - * - */ - int UpdateIn(Message &aMessage) const - { - return aMessage.Write(aMessage.GetLength() - sizeof(*this), sizeof(*this), this); - } - - /** - * This method returns the MPL Seed Id value. - * - * @returns The MPL Seed Id value. - * - */ - uint16_t GetSeedId(void) const { return mSeedId; } - - /** - * This method sets the MPL Seed Id value. - * - * @param[in] aSeedId The MPL Seed Id value. - * - */ - void SetSeedId(uint16_t aSeedId) { mSeedId = aSeedId; } - - /** - * This method returns the MPL Sequence value. - * - * @returns The MPL Sequence value. - * - */ - uint8_t GetSequence(void) const { return mSequence; } - - /** - * This method sets the MPL Sequence value. - * - * @param[in] aSequence The MPL Sequence value. - * - */ - void SetSequence(uint8_t aSequence) { mSequence = aSequence; } - - /** - * This method returns the number of already preformed transmissions. - * - * @returns The number of already preformed transmissions. - * - */ - uint8_t GetTransmissionCount(void) const { return mTransmissionCount; } - - /** - * This method sets the number of already performed transmissions. - * - * @param[in] aTransmissionCount The number of already performed transmissions. - * - */ - void SetTransmissionCount(uint8_t aTransmissionCount) { mTransmissionCount = aTransmissionCount; } - - /** - * This method returns the transmission timestamp of the message. - * - * @returns The transmission timestamp of the message. - * - */ - TimeMilli GetTransmissionTime(void) const { return mTransmissionTime; } - - /** - * This method sets the transmission timestamp of the message. - * - * @param[in] aTransmissionTime The transmission timestamp of the message. - * - */ - void SetTransmissionTime(TimeMilli aTransmissionTime) { mTransmissionTime = aTransmissionTime; } - - /** - * This method returns the offset from the transmission time to the end of trickle interval. - * - * @returns The offset from the transmission time to the end of trickle interval. - * - */ - uint8_t GetIntervalOffset(void) const { return mIntervalOffset; } - - /** - * This method sets the offset from the transmission time to the end of trickle interval. - * - * @param[in] aIntervalOffset The offset from the transmission time to the end of trickle interval. - * - */ - void SetIntervalOffset(uint8_t aIntervalOffset) { mIntervalOffset = aIntervalOffset; } - - /** - * This method generates the next transmission time for the MPL Data Message. - * - * @param[in] aCurrentTime Current time (in milliseconds). - * @param[in] aInterval The current interval size (in milliseconds). - */ - void GenerateNextTransmissionTime(TimeMilli aCurrentTime, uint8_t aInterval); - -private: - uint16_t mSeedId; - uint8_t mSequence; - uint8_t mTransmissionCount; - TimeMilli mTransmissionTime; - uint8_t mIntervalOffset; -}; -#endif // OPENTHREAD_FTD - /** * This class implements MPL message processing. * @@ -499,7 +333,7 @@ public: * */ const MessageQueue &GetBufferedMessageSet(void) const { return mBufferedMessageSet; } -#endif +#endif // OPENTHREAD_FTD private: enum @@ -522,6 +356,21 @@ private: uint8_t mSequence; #if OPENTHREAD_FTD + struct Metadata + { + otError AppendTo(Message &aMessage) const { return aMessage.Append(this, sizeof(*this)); } + void ReadFrom(const Message &aMessage); + void RemoveFrom(Message &aMessage) const; + int UpdateIn(Message &aMessage) const; + void GenerateNextTransmissionTime(TimeMilli aCurrentTime, uint8_t aInterval); + + TimeMilli mTransmissionTime; + uint16_t mSeedId; + uint8_t mSequence; + uint8_t mTransmissionCount; + uint8_t mIntervalOffset; + }; + static void HandleRetransmissionTimer(Timer &aTimer); void HandleRetransmissionTimer(void); @@ -530,7 +379,7 @@ private: MessageQueue mBufferedMessageSet; TimerMilli mRetransmissionTimer; uint8_t mTimerExpirations; -#endif +#endif // OPENTHREAD_FTD }; /**