mirror of
https://github.com/espressif/openthread.git
synced 2026-09-12 20:20:04 +00:00
filter out outdated MLE advertisement from old partition (#1155)
This commit is contained in:
@@ -461,6 +461,8 @@ ThreadError Mle::BecomeChild(otMleAttachFilter aFilter)
|
||||
if (aFilter == kMleAttachAnyPartition)
|
||||
{
|
||||
mParent.mState = Neighbor::kStateInvalid;
|
||||
mLastPartitionId = mMleRouter.GetPreviousPartitionId();
|
||||
mLastPartitionRouterIdSequence = mMleRouter.GetRouterIdSequence();
|
||||
}
|
||||
|
||||
mParentRequestTimer.Start(kParentRequestRouterTimeout);
|
||||
|
||||
@@ -1217,6 +1217,8 @@ protected:
|
||||
uint8_t mRouterSelectionJitter; ///< The variable to save the assigned jitter value.
|
||||
uint8_t mRouterSelectionJitterTimeout; ///< The Timeout prior to request/release Router ID.
|
||||
|
||||
uint8_t mLastPartitionRouterIdSequence;
|
||||
uint32_t mLastPartitionId;
|
||||
private:
|
||||
enum
|
||||
{
|
||||
|
||||
@@ -1285,6 +1285,12 @@ ThreadError MleRouter::HandleAdvertisement(const Message &aMessage, const Ip6::M
|
||||
leaderData.GetWeighting(), partitionId,
|
||||
mLeaderData.GetWeighting(), mLeaderData.GetPartitionId());
|
||||
|
||||
if (partitionId == mLastPartitionId && (mDeviceMode & ModeTlv::kModeFFD))
|
||||
{
|
||||
VerifyOrExit((static_cast<int8_t>(route.GetRouterIdSequence() - mLastPartitionRouterIdSequence) > 0),
|
||||
error = kThreadError_Drop);
|
||||
}
|
||||
|
||||
if (GetDeviceState() == kDeviceStateChild &&
|
||||
(memcmp(&mParent.mMacAddr, &macAddr, sizeof(mParent.mMacAddr)) == 0 || !(mDeviceMode & ModeTlv::kModeFFD)))
|
||||
{
|
||||
@@ -3268,6 +3274,11 @@ void MleRouter::SetPreviousPartitionId(uint32_t aPartitionId)
|
||||
mPreviousPartitionId = aPartitionId;
|
||||
}
|
||||
|
||||
uint32_t MleRouter::GetPreviousPartitionId(void) const
|
||||
{
|
||||
return mPreviousPartitionId;
|
||||
}
|
||||
|
||||
void MleRouter::SetRouterId(uint8_t aRouterId)
|
||||
{
|
||||
mRouterId = aRouterId;
|
||||
|
||||
@@ -298,6 +298,12 @@ public:
|
||||
*/
|
||||
ThreadError SetPreferredRouterId(uint8_t aRouterId);
|
||||
|
||||
/**
|
||||
* This method gets the Partition Id which the device joined successfully once.
|
||||
*
|
||||
*/
|
||||
uint32_t GetPreviousPartitionId(void) const;
|
||||
|
||||
/**
|
||||
* This method sets the Partition Id which the device joins successfully.
|
||||
*
|
||||
|
||||
@@ -69,6 +69,7 @@ public:
|
||||
void SetLeaderPartitionId(uint32_t) { }
|
||||
|
||||
ThreadError SetPreferredRouterId(uint8_t) { return kThreadError_NotImplemented; }
|
||||
uint32_t GetPreviousPartitionId(void) const { return 0; }
|
||||
void SetPreviousPartitionId(uint32_t) { }
|
||||
void SetRouterId(uint8_t) { }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user