From 3ba1c799102ae8dba0d0591db12538f575d1e380 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Fri, 8 Feb 2019 08:42:29 -0800 Subject: [PATCH] [mac] use ot::Instance reference in scan callback handlers (#3568) This commit changes the scan callback handlers to use `ot::Instance` as a parameter replacing a given `void *` context. --- src/core/api/link_api.cpp | 26 ++++++++++---------------- src/core/mac/mac.cpp | 21 ++++++++++----------- src/core/mac/mac.hpp | 17 +++++++---------- src/core/thread/energy_scan_server.cpp | 6 +++--- src/core/thread/energy_scan_server.hpp | 2 +- src/core/thread/panid_query_server.cpp | 6 +++--- src/core/thread/panid_query_server.hpp | 2 +- src/core/utils/channel_monitor.cpp | 6 +++--- src/core/utils/channel_monitor.hpp | 2 +- 9 files changed, 39 insertions(+), 49 deletions(-) diff --git a/src/core/api/link_api.cpp b/src/core/api/link_api.cpp index 4930f2bf0..093c73505 100644 --- a/src/core/api/link_api.cpp +++ b/src/core/api/link_api.cpp @@ -39,8 +39,8 @@ using namespace ot; -static void HandleActiveScanResult(void *aContext, Mac::Frame *aFrame); -static void HandleEnergyScanResult(void *aContext, otEnergyScanResult *aResult); +static void HandleActiveScanResult(Instance &aInstance, Mac::Frame *aFrame); +static void HandleEnergyScanResult(Instance &aInstance, otEnergyScanResult *aResult); uint8_t otLinkGetChannel(otInstance *aInstance) { @@ -367,8 +367,7 @@ otError otLinkActiveScan(otInstance * aInstance, Instance &instance = *static_cast(aInstance); instance.RegisterActiveScanCallback(aCallback, aCallbackContext); - return instance.GetThreadNetif().GetMac().ActiveScan(aScanChannels, aScanDuration, &HandleActiveScanResult, - aInstance); + return instance.GetThreadNetif().GetMac().ActiveScan(aScanChannels, aScanDuration, &HandleActiveScanResult); } bool otLinkIsActiveScanInProgress(otInstance *aInstance) @@ -378,20 +377,18 @@ bool otLinkIsActiveScanInProgress(otInstance *aInstance) return instance.GetThreadNetif().GetMac().IsActiveScanInProgress(); } -void HandleActiveScanResult(void *aContext, Mac::Frame *aFrame) +void HandleActiveScanResult(Instance &aInstance, Mac::Frame *aFrame) { - Instance &instance = *static_cast(aContext); - if (aFrame == NULL) { - instance.InvokeActiveScanCallback(NULL); + aInstance.InvokeActiveScanCallback(NULL); } else { otActiveScanResult result; - instance.GetThreadNetif().GetMac().ConvertBeaconToActiveScanResult(aFrame, result); - instance.InvokeActiveScanCallback(&result); + aInstance.GetThreadNetif().GetMac().ConvertBeaconToActiveScanResult(aFrame, result); + aInstance.InvokeActiveScanCallback(&result); } } @@ -404,15 +401,12 @@ otError otLinkEnergyScan(otInstance * aInstance, Instance &instance = *static_cast(aInstance); instance.RegisterEnergyScanCallback(aCallback, aCallbackContext); - return instance.GetThreadNetif().GetMac().EnergyScan(aScanChannels, aScanDuration, &HandleEnergyScanResult, - aInstance); + return instance.GetThreadNetif().GetMac().EnergyScan(aScanChannels, aScanDuration, &HandleEnergyScanResult); } -void HandleEnergyScanResult(void *aContext, otEnergyScanResult *aResult) +void HandleEnergyScanResult(Instance &aInstance, otEnergyScanResult *aResult) { - Instance &instance = *static_cast(aContext); - - instance.InvokeEnergyScanCallback(aResult); + aInstance.InvokeEnergyScanCallback(aResult); } bool otLinkIsEnergyScanInProgress(otInstance *aInstance) diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index 999933b67..a33f84f33 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -96,7 +96,6 @@ Mac::Mac(Instance &aInstance) , mScanChannel(OT_RADIO_CHANNEL_MIN) , mScanDuration(0) , mScanChannelMask() - , mScanContext(NULL) , mActiveScanHandler(NULL) /* Initialize `mActiveScanHandler` and `mEnergyScanHandler` union */ , mSubMac(aInstance, *this) , mOperationTask(aInstance, &Mac::HandleOperationTask, this) @@ -126,7 +125,7 @@ Mac::Mac(Instance &aInstance) SetShortAddress(GetShortAddress()); } -otError Mac::ActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, ActiveScanHandler aHandler, void *aContext) +otError Mac::ActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, ActiveScanHandler aHandler) { otError error = OT_ERROR_NONE; @@ -140,13 +139,13 @@ otError Mac::ActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, ActiveSc aScanDuration = kScanDurationDefault; } - Scan(kOperationActiveScan, aScanChannels, aScanDuration, aContext); + Scan(kOperationActiveScan, aScanChannels, aScanDuration); exit: return error; } -otError Mac::EnergyScan(uint32_t aScanChannels, uint16_t aScanDuration, EnergyScanHandler aHandler, void *aContext) +otError Mac::EnergyScan(uint32_t aScanChannels, uint16_t aScanDuration, EnergyScanHandler aHandler) { otError error = OT_ERROR_NONE; @@ -154,15 +153,15 @@ otError Mac::EnergyScan(uint32_t aScanChannels, uint16_t aScanDuration, EnergySc VerifyOrExit(!IsActiveScanInProgress() && !IsEnergyScanInProgress(), error = OT_ERROR_BUSY); mEnergyScanHandler = aHandler; - Scan(kOperationEnergyScan, aScanChannels, aScanDuration, aContext); + + Scan(kOperationEnergyScan, aScanChannels, aScanDuration); exit: return error; } -void Mac::Scan(Operation aScanOperation, uint32_t aScanChannels, uint16_t aScanDuration, void *aContext) +void Mac::Scan(Operation aScanOperation, uint32_t aScanChannels, uint16_t aScanDuration) { - mScanContext = aContext; mScanDuration = aScanDuration; mScanChannel = ChannelMask::kChannelIteratorFirst; @@ -257,7 +256,7 @@ void Mac::PerformActiveScan(void) { mSubMac.SetPanId(mPanId); FinishOperation(); - mActiveScanHandler(mScanContext, NULL); + mActiveScanHandler(GetInstance(), NULL); PerformNextOperation(); } } @@ -287,7 +286,7 @@ exit: if (error != OT_ERROR_NONE) { FinishOperation(); - mEnergyScanHandler(mScanContext, NULL); + mEnergyScanHandler(GetInstance(), NULL); PerformNextOperation(); } } @@ -301,7 +300,7 @@ void Mac::ReportEnergyScanResult(int8_t aRssi) result.mChannel = mScanChannel; result.mMaxRssi = aRssi; - mEnergyScanHandler(mScanContext, &result); + mEnergyScanHandler(GetInstance(), &result); } } @@ -1583,7 +1582,7 @@ void Mac::HandleReceivedFrame(Frame *aFrame, otError aError) if (aFrame->GetType() == Frame::kFcfFrameBeacon) { mCounters.mRxBeacon++; - mActiveScanHandler(mScanContext, aFrame); + mActiveScanHandler(GetInstance(), aFrame); ExitNow(); } diff --git a/src/core/mac/mac.hpp b/src/core/mac/mac.hpp index 3e51e7298..a3b0f09ab 100644 --- a/src/core/mac/mac.hpp +++ b/src/core/mac/mac.hpp @@ -115,11 +115,11 @@ public: /** * This function pointer is called on receiving an IEEE 802.15.4 Beacon during an Active Scan. * - * @param[in] aContext A pointer to arbitrary context information. + * @param[in] aInstance A reference to the OpenThread instance. * @param[in] aBeaconFrame A pointer to the Beacon frame or NULL to indicate end of Active Scan operation. * */ - typedef void (*ActiveScanHandler)(void *aContext, Frame *aBeaconFrame); + typedef void (*ActiveScanHandler)(Instance &aInstance, Frame *aBeaconFrame); /** * This method starts an IEEE 802.15.4 Active Scan. @@ -128,13 +128,12 @@ public: * @param[in] aScanDuration The time in milliseconds to spend scanning each channel. Zero duration maps to * default value `kScanDurationDefault` = 300 ms. * @param[in] aHandler A pointer to a function that is called on receiving an IEEE 802.15.4 Beacon. - * @param[in] aContext A pointer to arbitrary context information. * * @retval OT_ERROR_NONE Successfully scheduled the Active Scan request. * @retval OT_ERROR_BUSY Could not schedule the scan (a scan is ongoing or scheduled). * */ - otError ActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, ActiveScanHandler aHandler, void *aContext); + otError ActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, ActiveScanHandler aHandler); /** * This method converts a beacon frame to an active scan result of type `otActiveScanResult`. @@ -153,12 +152,12 @@ public: * This function pointer is called during an Energy Scan when the result for a channel is ready or the scan * completes. * - * @param[in] aContext A pointer to arbitrary context information. + * @param[in] aInstance A reference to the OpenThread instance. * @param[in] aResult A valid pointer to the energy scan result information or NULL when the energy scan * completes. * */ - typedef void (*EnergyScanHandler)(void *aContext, otEnergyScanResult *aResult); + typedef void (*EnergyScanHandler)(Instance &aInstance, otEnergyScanResult *aResult); /** * This method starts an IEEE 802.15.4 Energy Scan. @@ -167,13 +166,12 @@ public: * @param[in] aScanDuration The time in milliseconds to spend scanning each channel. If the duration is set to * zero, a single RSSI sample will be taken per channel. * @param[in] aHandler A pointer to a function called to pass on scan result or indicate scan completion. - * @param[in] aContext A pointer to arbitrary context information. * * @retval OT_ERROR_NONE Accepted the Energy Scan request. * @retval OT_ERROR_BUSY Could not start the energy scan. * */ - otError EnergyScan(uint32_t aScanChannels, uint16_t aScanDuration, EnergyScanHandler aHandler, void *aContext); + otError EnergyScan(uint32_t aScanChannels, uint16_t aScanDuration, EnergyScanHandler aHandler); /** * This method indicates the energy scan for the current channel is complete. @@ -641,7 +639,7 @@ private: void HandleTimer(void); static void HandleOperationTask(Tasklet &aTasklet); - void Scan(Operation aScanOperation, uint32_t aScanChannels, uint16_t aScanDuration, void *aContext); + void Scan(Operation aScanOperation, uint32_t aScanChannels, uint16_t aScanDuration); otError UpdateScanChannel(void); void PerformActiveScan(void); void PerformEnergyScan(void); @@ -687,7 +685,6 @@ private: uint8_t mScanChannel; uint16_t mScanDuration; ChannelMask mScanChannelMask; - void * mScanContext; union { ActiveScanHandler mActiveScanHandler; diff --git a/src/core/thread/energy_scan_server.cpp b/src/core/thread/energy_scan_server.cpp index 67c1ca6a5..1851b8282 100644 --- a/src/core/thread/energy_scan_server.cpp +++ b/src/core/thread/energy_scan_server.cpp @@ -128,7 +128,7 @@ void EnergyScanServer::HandleTimer(void) { // grab the lowest channel to scan uint32_t channelMask = mChannelMaskCurrent & ~(mChannelMaskCurrent - 1); - GetNetif().GetMac().EnergyScan(channelMask, mScanDuration, HandleScanResult, this); + GetNetif().GetMac().EnergyScan(channelMask, mScanDuration, HandleScanResult); } else { @@ -139,9 +139,9 @@ exit: return; } -void EnergyScanServer::HandleScanResult(void *aContext, otEnergyScanResult *aResult) +void EnergyScanServer::HandleScanResult(Instance &aInstance, otEnergyScanResult *aResult) { - static_cast(aContext)->HandleScanResult(aResult); + aInstance.Get().HandleScanResult(aResult); } void EnergyScanServer::HandleScanResult(otEnergyScanResult *aResult) diff --git a/src/core/thread/energy_scan_server.hpp b/src/core/thread/energy_scan_server.hpp index fc2c588c1..3856d1980 100644 --- a/src/core/thread/energy_scan_server.hpp +++ b/src/core/thread/energy_scan_server.hpp @@ -69,7 +69,7 @@ private: static void HandleRequest(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo); void HandleRequest(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - static void HandleScanResult(void *aContext, otEnergyScanResult *aResult); + static void HandleScanResult(Instance &aInstance, otEnergyScanResult *aResult); void HandleScanResult(otEnergyScanResult *aResult); static void HandleTimer(Timer &aTimer); diff --git a/src/core/thread/panid_query_server.cpp b/src/core/thread/panid_query_server.cpp index c05f7434f..fc1ceda4c 100644 --- a/src/core/thread/panid_query_server.cpp +++ b/src/core/thread/panid_query_server.cpp @@ -95,9 +95,9 @@ exit: return; } -void PanIdQueryServer::HandleScanResult(void *aContext, Mac::Frame *aFrame) +void PanIdQueryServer::HandleScanResult(Instance &aInstance, Mac::Frame *aFrame) { - static_cast(aContext)->HandleScanResult(aFrame); + aInstance.Get().HandleScanResult(aFrame); } void PanIdQueryServer::HandleScanResult(Mac::Frame *aFrame) @@ -168,7 +168,7 @@ void PanIdQueryServer::HandleTimer(Timer &aTimer) void PanIdQueryServer::HandleTimer(void) { - GetNetif().GetMac().ActiveScan(mChannelMask, 0, HandleScanResult, this); + GetNetif().GetMac().ActiveScan(mChannelMask, 0, HandleScanResult); mChannelMask = 0; } diff --git a/src/core/thread/panid_query_server.hpp b/src/core/thread/panid_query_server.hpp index 3363d39d8..a0dbbb708 100644 --- a/src/core/thread/panid_query_server.hpp +++ b/src/core/thread/panid_query_server.hpp @@ -66,7 +66,7 @@ private: static void HandleQuery(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo); void HandleQuery(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo); - static void HandleScanResult(void *aContext, Mac::Frame *aFrame); + static void HandleScanResult(Instance &aInstance, Mac::Frame *aFrame); void HandleScanResult(Mac::Frame *aFrame); static void HandleTimer(Timer &aTimer); diff --git a/src/core/utils/channel_monitor.cpp b/src/core/utils/channel_monitor.cpp index 9a7431274..e571b50dc 100644 --- a/src/core/utils/channel_monitor.cpp +++ b/src/core/utils/channel_monitor.cpp @@ -112,14 +112,14 @@ void ChannelMonitor::HandleTimer(Timer &aTimer) void ChannelMonitor::HandleTimer(void) { GetInstance().Get().EnergyScan(mScanChannelMasks[mChannelMaskIndex], 0, - &ChannelMonitor::HandleEnergyScanResult, this); + &ChannelMonitor::HandleEnergyScanResult); mTimer.StartAt(mTimer.GetFireTime(), Random::AddJitter(kTimerInterval, kMaxJitterInterval)); } -void ChannelMonitor::HandleEnergyScanResult(void *aContext, otEnergyScanResult *aResult) +void ChannelMonitor::HandleEnergyScanResult(Instance &aInstance, otEnergyScanResult *aResult) { - static_cast(aContext)->HandleEnergyScanResult(aResult); + aInstance.Get().HandleEnergyScanResult(aResult); } void ChannelMonitor::HandleEnergyScanResult(otEnergyScanResult *aResult) diff --git a/src/core/utils/channel_monitor.hpp b/src/core/utils/channel_monitor.hpp index 5bb705530..b4395ad6e 100644 --- a/src/core/utils/channel_monitor.hpp +++ b/src/core/utils/channel_monitor.hpp @@ -195,7 +195,7 @@ private: static void HandleTimer(Timer &aTimer); void HandleTimer(void); - static void HandleEnergyScanResult(void *aContext, otEnergyScanResult *aResult); + static void HandleEnergyScanResult(Instance &aInstance, otEnergyScanResult *aResult); void HandleEnergyScanResult(otEnergyScanResult *aResult); void LogResults(void);