Only send Child Update Request message when no more state changes are pending. (#476)

This commit is contained in:
Jonathan Hui
2016-08-25 22:56:14 -07:00
committed by GitHub
parent fcff3cb018
commit 83348b5afd
4 changed files with 40 additions and 10 deletions
+5
View File
@@ -453,6 +453,11 @@ exit:
return rval;
}
bool Netif::IsStateChangedCallbackPending(void)
{
return mStateChangedFlags != 0;
}
void Netif::SetStateChangedFlags(uint32_t aFlags)
{
mStateChangedFlags |= aFlags;
+8
View File
@@ -317,6 +317,14 @@ public:
*/
ThreadError RegisterCallback(NetifCallback &aCallback);
/**
* This method indicates whether or not a state changed callback is pending.
*
* @retval TRUE if a state changed callback is pending, FALSE otherwise.
*
*/
bool IsStateChangedCallbackPending(void);
/**
* This method schedules notification of @p aFlags.
*
+23 -10
View File
@@ -61,7 +61,8 @@ Mle::Mle(ThreadNetif &aThreadNetif) :
mMesh(aThreadNetif.GetMeshForwarder()),
mMleRouter(aThreadNetif.GetMle()),
mNetworkData(aThreadNetif.GetNetworkDataLeader()),
mParentRequestTimer(&HandleParentRequestTimer, this)
mParentRequestTimer(&HandleParentRequestTimer, this),
mSendChildUpdateRequest(&HandleSendChildUpdateRequest, this)
{
mDeviceState = kDeviceStateDisabled;
mDeviceMode = ModeTlv::kModeRxOnWhenIdle | ModeTlv::kModeSecureDataRequest | ModeTlv::kModeFFD |
@@ -930,8 +931,6 @@ void Mle::HandleNetifStateChanged(uint32_t aFlags, void *aContext)
void Mle::HandleNetifStateChanged(uint32_t aFlags)
{
bool sendChildUpdateRequest = false;
if ((aFlags & (OT_IP6_ADDRESS_ADDED | OT_IP6_ADDRESS_REMOVED)) != 0)
{
if (!mNetif.IsUnicastAddress(mMeshLocal64.GetAddress()))
@@ -948,7 +947,7 @@ void Mle::HandleNetifStateChanged(uint32_t aFlags)
if (mDeviceState == kDeviceStateChild && (mDeviceMode & ModeTlv::kModeFFD) == 0)
{
sendChildUpdateRequest = true;
mSendChildUpdateRequest.Post();
}
}
@@ -960,14 +959,9 @@ void Mle::HandleNetifStateChanged(uint32_t aFlags)
}
else
{
sendChildUpdateRequest = true;
mSendChildUpdateRequest.Post();
}
}
if (sendChildUpdateRequest)
{
SendChildUpdateRequest();
}
}
void Mle::HandleParentRequestTimer(void *aContext)
@@ -1217,6 +1211,25 @@ exit:
return error;
}
void Mle::HandleSendChildUpdateRequest(void *aContext)
{
static_cast<Mle *>(aContext)->SendChildUpdateRequest();
}
void Mle::HandleSendChildUpdateRequest(void)
{
// a Network Data udpate can cause a change to the IPv6 address configuration
// only send a Child Update Request after we know there are no more pending changes
if (mNetif.IsStateChangedCallbackPending())
{
mSendChildUpdateRequest.Post();
}
else
{
SendChildUpdateRequest();
}
}
ThreadError Mle::SendChildUpdateRequest(void)
{
ThreadError error = kThreadError_None;
+4
View File
@@ -1082,6 +1082,8 @@ private:
void HandleParentRequestTimer(void);
static void HandleUdpReceive(void *aContext, otMessage aMessage, const otMessageInfo *aMessageInfo);
void HandleUdpReceive(Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
static void HandleSendChildUpdateRequest(void *aContext);
void HandleSendChildUpdateRequest(void);
ThreadError HandleAdvertisement(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
ThreadError HandleChildIdResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
@@ -1121,6 +1123,8 @@ private:
Ip6::UdpSocket mSocket;
uint32_t mTimeout;
Tasklet mSendChildUpdateRequest;
DiscoverHandler mDiscoverHandler;
void *mDiscoverContext;
bool mIsDiscoverInProgress;