mirror of
https://github.com/espressif/openthread.git
synced 2026-06-06 05:24:51 +00:00
[mesh-forwarder] fix bug when stopping discover request (#2795)
This commit fixes a bug when calling `MeshForwarder::Stop()` while the discover operation is ongoing. In particular, while the send queue is flushed, `mDiscoverTimer` is not stopped, resulting in a NULL pointer dereference in the timer handler. This commit also moves common cleanup code for the discover operation into a single method.
This commit is contained in:
@@ -121,14 +121,7 @@ otError MeshForwarder::Stop(void)
|
||||
|
||||
if (mScanning)
|
||||
{
|
||||
if (mMacRadioAcquisitionId)
|
||||
{
|
||||
netif.GetMac().ReleaseRadioChannel();
|
||||
mMacRadioAcquisitionId = 0;
|
||||
}
|
||||
|
||||
mScanning = false;
|
||||
netif.GetMle().HandleDiscoverComplete();
|
||||
HandleDiscoverComplete();
|
||||
}
|
||||
|
||||
while ((message = mSendQueue.GetHead()) != NULL)
|
||||
@@ -213,6 +206,8 @@ otError MeshForwarder::PrepareDiscoverRequest(void)
|
||||
|
||||
SuccessOrExit(error = netif.GetMac().AcquireRadioChannel(&mMacRadioAcquisitionId));
|
||||
|
||||
mScanning = true;
|
||||
|
||||
while ((mScanChannels & 1) == 0)
|
||||
{
|
||||
mScanChannels >>= 1;
|
||||
@@ -220,19 +215,11 @@ otError MeshForwarder::PrepareDiscoverRequest(void)
|
||||
|
||||
if (mScanChannel > OT_RADIO_CHANNEL_MAX)
|
||||
{
|
||||
if (mMacRadioAcquisitionId)
|
||||
{
|
||||
netif.GetMac().ReleaseRadioChannel();
|
||||
mMacRadioAcquisitionId = 0;
|
||||
}
|
||||
|
||||
netif.GetMle().HandleDiscoverComplete();
|
||||
HandleDiscoverComplete();
|
||||
ExitNow(error = OT_ERROR_DROP);
|
||||
}
|
||||
}
|
||||
|
||||
mScanning = true;
|
||||
|
||||
exit:
|
||||
return error;
|
||||
}
|
||||
@@ -1054,8 +1041,6 @@ void MeshForwarder::HandleDiscoverTimer(Timer &aTimer)
|
||||
|
||||
void MeshForwarder::HandleDiscoverTimer(void)
|
||||
{
|
||||
ThreadNetif &netif = GetNetif();
|
||||
|
||||
do
|
||||
{
|
||||
mScanChannels >>= 1;
|
||||
@@ -1067,15 +1052,7 @@ void MeshForwarder::HandleDiscoverTimer(void)
|
||||
mSendMessage->Free();
|
||||
mSendMessage = NULL;
|
||||
|
||||
if (mMacRadioAcquisitionId)
|
||||
{
|
||||
netif.GetMac().ReleaseRadioChannel();
|
||||
mMacRadioAcquisitionId = 0;
|
||||
}
|
||||
|
||||
netif.GetMac().SetPanId(mRestorePanId);
|
||||
mScanning = false;
|
||||
netif.GetMle().HandleDiscoverComplete();
|
||||
HandleDiscoverComplete();
|
||||
ExitNow();
|
||||
}
|
||||
} while ((mScanChannels & 1) == 0);
|
||||
@@ -1087,6 +1064,24 @@ exit:
|
||||
mScheduleTransmissionTask.Post();
|
||||
}
|
||||
|
||||
void MeshForwarder::HandleDiscoverComplete(void)
|
||||
{
|
||||
ThreadNetif &netif = GetNetif();
|
||||
|
||||
assert(mScanning);
|
||||
|
||||
if (mMacRadioAcquisitionId)
|
||||
{
|
||||
netif.GetMac().ReleaseRadioChannel();
|
||||
mMacRadioAcquisitionId = 0;
|
||||
}
|
||||
|
||||
netif.GetMac().SetPanId(mRestorePanId);
|
||||
mScanning = false;
|
||||
netif.GetMle().HandleDiscoverComplete();
|
||||
mDiscoverTimer.Stop();
|
||||
}
|
||||
|
||||
void MeshForwarder::HandleReceivedFrame(Mac::Receiver &aReceiver, Mac::Frame &aFrame)
|
||||
{
|
||||
aReceiver.GetOwner<MeshForwarder>().HandleReceivedFrame(aFrame);
|
||||
|
||||
@@ -307,6 +307,7 @@ private:
|
||||
void ClearReassemblyList(void);
|
||||
otError RemoveMessageFromSleepyChild(Message &aMessage, Child &aChild);
|
||||
void RemoveMessage(Message &aMessage);
|
||||
void HandleDiscoverComplete(void);
|
||||
|
||||
static void HandleReceivedFrame(Mac::Receiver &aReceiver, Mac::Frame &aFrame);
|
||||
void HandleReceivedFrame(Mac::Frame &aFrame);
|
||||
|
||||
Reference in New Issue
Block a user