Update all callbacks to support a client supplied context pointer. (#425)

* Update all callbacks to support a client supplied context pointer.
This commit is contained in:
Nick Banks
2016-08-19 11:38:11 -07:00
committed by Jonathan Hui
parent a2580e8346
commit 47dcec0bac
10 changed files with 83 additions and 63 deletions
+28 -20
View File
@@ -239,23 +239,26 @@ bool otIsSingleton(void);
* This function pointer is called during an IEEE 802.15.4 Active Scan when an IEEE 802.15.4 Beacon is received or
* the scan completes.
*
* @param[in] aResult A valid pointer to the beacon information or NULL when the active scan completes.
* @param[in] aResult A valid pointer to the beacon information or NULL when the active scan completes.
* @param[in] aContext A pointer to application-specific context.
*
*/
typedef void (*otHandleActiveScanResult)(otActiveScanResult *aResult);
typedef void (*otHandleActiveScanResult)(otActiveScanResult *aResult, void *aContext);
/**
* This function starts an IEEE 802.15.4 Active Scan
*
* @param[in] aScanChannels A bit vector indicating which channels to scan (e.g. OT_CHANNEL_11_MASK).
* @param[in] aScanDuration The time in milliseconds to spend scanning each channel.
* @param[in] aCallback A pointer to a function called on receiving a beacon or scan completes.
* @param[in] aScanChannels A bit vector indicating which channels to scan (e.g. OT_CHANNEL_11_MASK).
* @param[in] aScanDuration The time in milliseconds to spend scanning each channel.
* @param[in] aCallback A pointer to a function called on receiving a beacon or scan completes.
* @param[in] aCallbackContext A pointer to application-specific context.
*
* @retval kThreadError_None Accepted the Active Scan request.
* @retval kThreadError_Busy Already performing an Active Scan.
*
*/
ThreadError otActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, otHandleActiveScanResult aCallback);
ThreadError otActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, otHandleActiveScanResult aCallback,
void *aCallbackContext);
/**
* This function indicates whether or not an IEEE 802.15.4 Active Scan is currently in progress.
@@ -268,17 +271,18 @@ bool otIsActiveScanInProgress(void);
/**
* This function starts a Thread Discovery scan.
*
* @param[in] aScanChannels A bit vector indicating which channels to scan (e.g. OT_CHANNEL_11_MASK).
* @param[in] aScanDuration The time in milliseconds to spend scanning each channel.
* @param[in] aPanId The PAN ID filter (set to Broadcast PAN to disable filter).
* @param[in] aCallback A pointer to a function called on receiving an MLE Discovery Response or scan completes.
* @param[in] aScanChannels A bit vector indicating which channels to scan (e.g. OT_CHANNEL_11_MASK).
* @param[in] aScanDuration The time in milliseconds to spend scanning each channel.
* @param[in] aPanId The PAN ID filter (set to Broadcast PAN to disable filter).
* @param[in] aCallback A pointer to a function called on receiving an MLE Discovery Response or scan completes.
* @param[in] aCallbackContext A pointer to application-specific context.
*
* @retval kThreadError_None Accepted the Thread Discovery request.
* @retval kThreadError_Busy Already performing an Thread Discovery.
*
*/
ThreadError otDiscover(uint32_t aScanChannels, uint16_t aScanDuration, uint16_t aPanid,
otHandleActiveScanResult aCallback);
otHandleActiveScanResult aCallback, void *aCallbackContext);
/**
* This function indicates whether or not an MLE Thread Discovery is currently in progress.
@@ -1365,19 +1369,21 @@ uint8_t otGetStableNetworkDataVersion(void);
* @note This callback is called before IEEE 802.15.4 security processing and mSecurityValid in @p aFrame will
* always be false.
*
* @param[in] aFrame A pointer to the received IEEE 802.15.4 frame.
* @param[in] aFrame A pointer to the received IEEE 802.15.4 frame.
* @param[in] aContext A pointer to application-specific context.
*
*/
typedef void (*otLinkPcapCallback)(const RadioPacket *aFrame);
typedef void (*otLinkPcapCallback)(const RadioPacket *aFrame, void *aContext);
/**
* This function registers a callback to provide received raw IEEE 802.15.4 frames.
*
* @param[in] aPcapCallback A pointer to a function that is called when receiving an IEEE 802.15.4 link frame or
* NULL to disable the callback.
* @param[in] aPcapCallback A pointer to a function that is called when receiving an IEEE 802.15.4 link frame or
* NULL to disable the callback.
* @param[in] aCallbackContext A pointer to application-specific context.
*
*/
void otSetLinkPcapCallback(otLinkPcapCallback aPcapCallback);
void otSetLinkPcapCallback(otLinkPcapCallback aPcapCallback, void *aCallbackContext);
/**
* This function indicates whether or not promiscuous mode is enabled at the link layer.
@@ -1621,18 +1627,20 @@ int otWriteMessage(otMessage aMessage, uint16_t aOffset, const void *aBuf, uint1
* This function pointer is called when an IPv6 datagram is received.
*
* @param[in] aMessage A pointer to the message buffer containing the received IPv6 datagram.
* @param[in] aContext A pointer to application-specific context.
*
*/
typedef void (*otReceiveIp6DatagramCallback)(otMessage aMessage);
typedef void (*otReceiveIp6DatagramCallback)(otMessage aMessage, void *aContext);
/**
* This function registers a callback to provide received IPv6 datagrams.
*
* @param[in] aCallback A pointer to a function that is called when an IPv6 datagram is received or NULL to disable
* the callback.
* @param[in] aCallback A pointer to a function that is called when an IPv6 datagram is received or
* NULL to disable the callback.
* @param[in] aCallbackContext A pointer to application-specific context.
*
*/
void otSetReceiveIp6DatagramCallback(otReceiveIp6DatagramCallback aCallback);
void otSetReceiveIp6DatagramCallback(otReceiveIp6DatagramCallback aCallback, void *aCallbackContext);
/**
* This function sends an IPv6 datagram via the Thread interface.
+4 -3
View File
@@ -476,7 +476,7 @@ void Interpreter::ProcessDiscover(int argc, char *argv[])
scanChannels = 1 << value;
}
SuccessOrExit(error = otDiscover(scanChannels, 0, OT_PANID_BROADCAST, &HandleActiveScanResult));
SuccessOrExit(error = otDiscover(scanChannels, 0, OT_PANID_BROADCAST, &HandleActiveScanResult, NULL));
sServer->OutputFormat("| J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI |\r\n");
sServer->OutputFormat("+---+------------------+------------------+------+------------------+----+-----+-----+\r\n");
@@ -1510,7 +1510,7 @@ void Interpreter::ProcessScan(int argc, char *argv[])
scanChannels = 1 << value;
}
SuccessOrExit(error = otActiveScan(scanChannels, 0, &HandleActiveScanResult));
SuccessOrExit(error = otActiveScan(scanChannels, 0, &HandleActiveScanResult, NULL));
sServer->OutputFormat("| J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm | LQI |\r\n");
sServer->OutputFormat("+---+------------------+------------------+------+------------------+----+-----+-----+\r\n");
@@ -1520,7 +1520,7 @@ exit:
AppendResult(error);
}
void Interpreter::HandleActiveScanResult(otActiveScanResult *aResult)
void Interpreter::HandleActiveScanResult(otActiveScanResult *aResult, void *aContext)
{
if (aResult == NULL)
{
@@ -1543,6 +1543,7 @@ void Interpreter::HandleActiveScanResult(otActiveScanResult *aResult)
sServer->OutputFormat("| %3d |\r\n", aResult->mLqi);
exit:
(void)aContext;
return;
}
+1 -1
View File
@@ -184,7 +184,7 @@ private:
static void HandleEchoResponse(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo);
static void HandlePingTimer(void *aContext);
static void HandleActiveScanResult(otActiveScanResult *aResult);
static void HandleActiveScanResult(otActiveScanResult *aResult, void *aContext);
static void HandleNetifStateChanged(uint32_t aFlags, void *aContext);
static const struct Command sCommands[];
+4 -2
View File
@@ -122,6 +122,7 @@ Mac::Mac(ThreadNetif &aThreadNetif):
mDataSequence = static_cast<uint8_t>(otPlatRandomGet());
mPcapCallback = NULL;
mPcapCallbackContext = NULL;
otPlatRadioEnable();
}
@@ -860,7 +861,7 @@ void Mac::ReceiveDoneTask(Frame *aFrame, ThreadError aError)
if (mPcapCallback)
{
mPcapCallback(aFrame);
mPcapCallback(aFrame, mPcapCallbackContext);
}
aFrame->GetSrcAddr(srcaddr);
@@ -1069,9 +1070,10 @@ exit:
return error;
}
void Mac::SetPcapCallback(otLinkPcapCallback aPcapCallback)
void Mac::SetPcapCallback(otLinkPcapCallback aPcapCallback, void *aCallbackContext)
{
mPcapCallback = aPcapCallback;
mPcapCallbackContext = aCallbackContext;
}
bool Mac::IsPromiscuous(void)
+5 -3
View File
@@ -419,11 +419,12 @@ public:
/**
* This function registers a callback to provide received raw IEEE 802.15.4 frames.
*
* @param[in] aPcapCallback A pointer to a function that is called when receiving an IEEE 802.15.4 link frame or
* NULL to disable the callback.
* @param[in] aPcapCallback A pointer to a function that is called when receiving an IEEE 802.15.4 link frame or
* NULL to disable the callback.
* @param[in] aCallbackContext A pointer to application-specific context.
*
*/
void SetPcapCallback(otLinkPcapCallback aPcapCallback);
void SetPcapCallback(otLinkPcapCallback aPcapCallback, void *aCallbackContext);
/**
* This function indicates whether or not promiscuous mode is enabled at the link layer.
@@ -518,6 +519,7 @@ private:
void *mActiveScanContext;
otLinkPcapCallback mPcapCallback;
void *mPcapCallbackContext;
Whitelist mWhitelist;
Blacklist mBlacklist;
+4 -2
View File
@@ -52,6 +52,7 @@ static Mpl *sMpl;
static bool sForwardingEnabled;
static otReceiveIp6DatagramCallback sReceiveIp6DatagramCallback = NULL;
static void *sReceiveIp6DatagramCallbackContext = NULL;
static ThreadError ForwardMessage(Message &message, MessageInfo &messageInfo);
@@ -107,9 +108,10 @@ uint16_t Ip6::ComputePseudoheaderChecksum(const Address &src, const Address &dst
return checksum;
}
void Ip6::SetReceiveDatagramCallback(otReceiveIp6DatagramCallback aCallback)
void Ip6::SetReceiveDatagramCallback(otReceiveIp6DatagramCallback aCallback, void *aCallbackContext)
{
sReceiveIp6DatagramCallback = aCallback;
sReceiveIp6DatagramCallbackContext = aCallbackContext;
}
ThreadError AddMplOption(Message &message, Header &header, IpProto nextHeader, uint16_t payloadLength)
@@ -331,7 +333,7 @@ void Ip6::ProcessReceiveCallback(Message &aMessage)
SuccessOrExit(error = messageCopy->SetLength(aMessage.GetLength()));
aMessage.CopyTo(0, 0, aMessage.GetLength(), *messageCopy);
sReceiveIp6DatagramCallback(messageCopy);
sReceiveIp6DatagramCallback(messageCopy, sReceiveIp6DatagramCallbackContext);
exit:
+4 -3
View File
@@ -577,11 +577,12 @@ public:
/**
* This function registers a callback to provide received raw IPv6 datagrams.
*
* @param[in] aCallback A pointer to a function that is called when an IPv6 datagram is received or NULL to
* disable the callback.
* @param[in] aCallback A pointer to a function that is called when an IPv6 datagram is received
* or NULL to disable the callback.
* @param[in] aCallbackContext A pointer to application-specific context.
*
*/
static void SetReceiveDatagramCallback(otReceiveIp6DatagramCallback aCallback);
static void SetReceiveDatagramCallback(otReceiveIp6DatagramCallback aCallback, void *aCallbackContext);
/**
* This static method enables/disables IPv6 forwarding.
+24 -15
View File
@@ -65,6 +65,12 @@ static otDEFINE_ALIGNED_VAR(sThreadNetifRaw, sizeof(ThreadNetif), uint64_t);
static void HandleActiveScanResult(void *aContext, Mac::Frame *aFrame);
static void HandleMleDiscover(otActiveScanResult *aResult, void *aContext);
static otHandleActiveScanResult sActiveScanCallback = NULL;
static void *sActiveScanCallbackContext = NULL;
static otHandleActiveScanResult sDiscoverCallback = NULL;
static void *sDiscoverCallbackContext = NULL;
void otProcessNextTasklet(void)
{
TaskletScheduler::RunNextTasklet();
@@ -759,9 +765,9 @@ uint8_t otGetStableNetworkDataVersion(void)
return sThreadNetif->GetMle().GetLeaderDataTlv().GetStableDataVersion();
}
void otSetLinkPcapCallback(otLinkPcapCallback aPcapCallback)
void otSetLinkPcapCallback(otLinkPcapCallback aPcapCallback, void *aCallbackContext)
{
sThreadNetif->GetMac().SetPcapCallback(aPcapCallback);
sThreadNetif->GetMac().SetPcapCallback(aPcapCallback, aCallbackContext);
}
bool otIsLinkPromiscuous(void)
@@ -929,10 +935,12 @@ bool otIsSingleton(void)
return mEnabled && sThreadNetif->GetMle().IsSingleton();
}
ThreadError otActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, otHandleActiveScanResult aCallback)
ThreadError otActiveScan(uint32_t aScanChannels, uint16_t aScanDuration, otHandleActiveScanResult aCallback,
void *aCallbackContext)
{
return sThreadNetif->GetMac().ActiveScan(aScanChannels, aScanDuration, &HandleActiveScanResult,
reinterpret_cast<void *>(aCallback));
sActiveScanCallback = aCallback;
sActiveScanCallbackContext = aCallbackContext;
return sThreadNetif->GetMac().ActiveScan(aScanChannels, aScanDuration, &HandleActiveScanResult, NULL);
}
bool otIsActiveScanInProgress(void)
@@ -942,7 +950,6 @@ bool otIsActiveScanInProgress(void)
void HandleActiveScanResult(void *aContext, Mac::Frame *aFrame)
{
otHandleActiveScanResult handler = reinterpret_cast<otHandleActiveScanResult>(aContext);
otActiveScanResult result;
Mac::Address address;
Mac::Beacon *beacon;
@@ -952,7 +959,7 @@ void HandleActiveScanResult(void *aContext, Mac::Frame *aFrame)
if (aFrame == NULL)
{
handler(NULL);
sActiveScanCallback(NULL, sActiveScanCallbackContext);
ExitNow();
}
@@ -977,17 +984,19 @@ void HandleActiveScanResult(void *aContext, Mac::Frame *aFrame)
memcpy(&result.mExtendedPanId, beacon->GetExtendedPanId(), sizeof(result.mExtendedPanId));
}
handler(&result);
sActiveScanCallback(&result, sActiveScanCallbackContext);
exit:
(void)aContext;
return;
}
ThreadError otDiscover(uint32_t aScanChannels, uint16_t aScanDuration, uint16_t aPanId,
otHandleActiveScanResult aCallback)
otHandleActiveScanResult aCallback, void *aCallbackContext)
{
return sThreadNetif->GetMle().Discover(aScanChannels, aScanDuration, aPanId, &HandleMleDiscover,
reinterpret_cast<void *>(aCallback));
sDiscoverCallback = aCallback;
sDiscoverCallbackContext = aCallbackContext;
return sThreadNetif->GetMle().Discover(aScanChannels, aScanDuration, aPanId, &HandleMleDiscover, NULL);
}
bool otIsDiscoverInProgress(void)
@@ -997,13 +1006,13 @@ bool otIsDiscoverInProgress(void)
void HandleMleDiscover(otActiveScanResult *aResult, void *aContext)
{
otHandleActiveScanResult handler = reinterpret_cast<otHandleActiveScanResult>(aContext);
handler(aResult);
(void)aContext;
sDiscoverCallback(aResult, sDiscoverCallbackContext);
}
void otSetReceiveIp6DatagramCallback(otReceiveIp6DatagramCallback aCallback)
void otSetReceiveIp6DatagramCallback(otReceiveIp6DatagramCallback aCallback, void *aCallbackContext)
{
Ip6::Ip6::SetReceiveDatagramCallback(aCallback);
Ip6::Ip6::SetReceiveDatagramCallback(aCallback, aCallbackContext);
}
ThreadError otSendIp6Datagram(otMessage aMessage)
+7 -12
View File
@@ -383,7 +383,7 @@ NcpBase::NcpBase():
assert(sThreadNetif != NULL);
otSetStateChangedCallback(&HandleNetifStateChanged, this);
otSetReceiveIp6DatagramCallback(&HandleDatagramFromStack);
otSetReceiveIp6DatagramCallback(&HandleDatagramFromStack, this);
otSetIcmpEchoEnabled(false);
}
@@ -391,9 +391,9 @@ NcpBase::NcpBase():
// MARK: Outbound Datagram Handling
// ----------------------------------------------------------------------------
void NcpBase::HandleDatagramFromStack(otMessage aMessage)
void NcpBase::HandleDatagramFromStack(otMessage aMessage, void *aContext)
{
sNcpContext->HandleDatagramFromStack(*static_cast<Message *>(aMessage));
reinterpret_cast<NcpBase*>(aContext)->HandleDatagramFromStack(*static_cast<Message *>(aMessage));
}
void NcpBase::HandleDatagramFromStack(Message &aMessage)
@@ -455,14 +455,9 @@ exit:
// MARK: Scan Results Glue
// ----------------------------------------------------------------------------
static NcpBase *gActiveScanContextHack = NULL;
void NcpBase::HandleActiveScanResult_Jump(otActiveScanResult *result)
void NcpBase::HandleActiveScanResult_Jump(otActiveScanResult *result, void *aContext)
{
if (gActiveScanContextHack)
{
gActiveScanContextHack->HandleActiveScanResult(result);
}
reinterpret_cast<NcpBase*>(aContext)->HandleActiveScanResult(result);
}
void NcpBase::HandleActiveScanResult(otActiveScanResult *result)
@@ -2390,12 +2385,12 @@ ThreadError NcpBase::SetPropertyHandler_MAC_SCAN_STATE(uint8_t header, spinel_pr
break;
case SPINEL_SCAN_STATE_BEACON:
gActiveScanContextHack = this;
mShouldSignalEndOfScan = false;
errorCode = otActiveScan(
mChannelMask,
mScanPeriod,
&HandleActiveScanResult_Jump
&HandleActiveScanResult_Jump,
this
);
break;
+2 -2
View File
@@ -128,14 +128,14 @@ private:
/**
* Trampoline for HandleDatagramFromStack().
*/
static void HandleDatagramFromStack(otMessage aMessage);
static void HandleDatagramFromStack(otMessage aMessage, void *aContext);
void HandleDatagramFromStack(Message &aMessage);
/**
* Trampoline for HandleActiveScanResult().
*/
static void HandleActiveScanResult_Jump(otActiveScanResult *result);
static void HandleActiveScanResult_Jump(otActiveScanResult *result, void *aContext);
void HandleActiveScanResult(otActiveScanResult *result);