[mpl] support dynamic MPL interval according to the network scale (#2220)

This commit is contained in:
Shu Chen
2017-09-26 23:10:15 -07:00
committed by Jonathan Hui
parent 831bd7cb07
commit f1789623a8
5 changed files with 47 additions and 2 deletions
+10 -2
View File
@@ -48,7 +48,7 @@ namespace Ip6 {
void MplBufferedMessageMetadata::GenerateNextTransmissionTime(uint32_t aCurrentTime, uint8_t aInterval)
{
// Emulate Trickle timer behavior and set up the next retransmission within [0,I) range.
uint8_t t = otPlatRandomGet() % aInterval;
uint8_t t = aInterval == 0 ? aInterval : otPlatRandomGet() % aInterval;
// Set transmission time at the beginning of the next interval.
SetTransmissionTime(aCurrentTime + GetIntervalOffset() + t);
@@ -171,6 +171,14 @@ void Mpl::AddBufferedMessage(Message &aMessage, uint16_t aSeedId, uint8_t aSeque
uint32_t nextTransmissionTime;
uint8_t hopLimit = 0;
#if OPENTHREAD_CONFIG_ENABLE_DYNAMIC_MPL_INTERVAL
// adjust the first MPL forward interval dynamically according to the network scale
uint8_t interval = (kDataMessageInterval / Mle::kMaxRouters) *
GetInstance().mThreadNetif.GetMle().GetActiveNeighborRouterCount();
#else
uint8_t interval = kDataMessageInterval;
#endif
VerifyOrExit(GetTimerExpirations() > 0);
VerifyOrExit((messageCopy = aMessage.Clone()) != NULL, error = OT_ERROR_NO_BUFS);
@@ -184,7 +192,7 @@ void Mpl::AddBufferedMessage(Message &aMessage, uint16_t aSeedId, uint8_t aSeque
messageMetadata.SetSeedId(aSeedId);
messageMetadata.SetSequence(aSequence);
messageMetadata.SetTransmissionCount(aIsOutbound ? 1 : 0);
messageMetadata.GenerateNextTransmissionTime(now, kDataMessageInterval);
messageMetadata.GenerateNextTransmissionTime(now, interval);
// Append the message with MplBufferedMessageMetadata and add it to the queue.
SuccessOrExit(error = messageMetadata.AppendTo(*messageCopy));
+13
View File
@@ -985,4 +985,17 @@
#define OPENTHREAD_CONFIG_ENABLE_DEBUG_UART 0
#endif
/**
* @def OPENTHREAD_CONFIG_ENABLE_DYNAMIC_MPL_INTERVAL
*
* Define as 1 to enable dynamic MPL interval feature.
*
* If this feature is enabled, the MPL forward interval will be adjusted dynamically according to
* the network scale, which helps to reduce multicast latency.
*
*/
#ifndef OPENTHREAD_CONFIG_ENABLE_DYNAMIC_MPL_INTERVAL
#define OPENTHREAD_CONFIG_ENABLE_DYNAMIC_MPL_INTERVAL 0
#endif
#endif // OPENTHREAD_CORE_DEFAULT_CONFIG_H_
+15
View File
@@ -1272,6 +1272,21 @@ uint8_t MleRouter::GetActiveRouterCount(void) const
return rval;
}
uint8_t MleRouter::GetActiveNeighborRouterCount(void) const
{
uint8_t rval = 0;
for (int i = 0; i <= kMaxRouterId; i++)
{
if (mRouters[i].GetState() == Neighbor::kStateValid)
{
rval++;
}
}
return rval;
}
otError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{
ThreadNetif &netif = GetNetif();
+8
View File
@@ -141,6 +141,14 @@ public:
*/
uint8_t GetActiveRouterCount(void) const;
/**
* This method returns the number of active neighbor routers.
*
* @returns The number of active neighbor routers.
*
*/
uint8_t GetActiveNeighborRouterCount(void) const;
/**
* This method returns the time in seconds since the last Router ID Sequence update.
*
+1
View File
@@ -56,6 +56,7 @@ public:
otError BecomeLeader(void) { return OT_ERROR_NOT_CAPABLE; }
uint8_t GetActiveRouterCount(void) const { return 0; }
uint8_t GetActiveNeighborRouterCount(void) const { return 0; }
uint32_t GetLeaderAge(void) const { return 0; }