Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: BLE_PowerBank_HeyFaradey
Fork of BLE_API by
Diff: ble/SecurityManager.h
- Revision:
- 1135:22aada733dbd
- Parent:
- 1131:692ddf04fc42
- Child:
- 1136:6b1e6b7282a6
--- a/ble/SecurityManager.h Wed Apr 06 19:13:52 2016 +0100
+++ b/ble/SecurityManager.h Wed Apr 06 19:13:54 2016 +0100
@@ -20,6 +20,7 @@
#include <stdint.h>
#include "Gap.h"
+#include "CallChainOfFunctionPointersWithContext.h"
class SecurityManager {
public:
@@ -82,6 +83,9 @@
typedef void (*LinkSecuredCallback_t)(Gap::Handle_t handle, SecurityMode_t securityMode);
typedef void (*PasskeyDisplayCallback_t)(Gap::Handle_t handle, const Passkey_t passkey);
+ typedef FunctionPointerWithContext<const SecurityManager *> SecurityManagerShutdownCallback_t;
+ typedef CallChainOfFunctionPointersWithContext<const SecurityManager *> SecurityManagerShutdownCallbackChain_t;
+
/*
* The following functions are meant to be overridden in the platform-specific sub-class.
*/
@@ -120,7 +124,7 @@
* @param[in] connectionHandle Handle to identify the connection.
* @param[out] securityStatusP Security status.
*
- * @return BLE_SUCCESS or appropriate error code indicating the failure reason.
+ * @return BLE_ERROR_NONE or appropriate error code indicating the failure reason.
*/
virtual ble_error_t getLinkSecurity(Gap::Handle_t connectionHandle, LinkSecurityStatus_t *securityStatusP) {
/* Avoid compiler warnings about unused variables. */
@@ -131,6 +135,23 @@
}
/**
+ * Set the security mode on a connection. Useful for elevating the security mode
+ * once certain conditions are met, e.g., a particular service is found.
+ *
+ * @param[in] connectionHandle Handle to identify the connection.
+ * @param[in] securityMode Requested security mode.
+ *
+ * @return BLE_ERROR_NONE or appropriate error code indicating the failure reason.
+ */
+ virtual ble_error_t setLinkSecurity(Gap::Handle_t connectionHandle, SecurityMode_t securityMode) {
+ /* Avoid compiler warnings about unused variables. */
+ (void)connectionHandle;
+ (void)securityMode;
+
+ return BLE_ERROR_NOT_IMPLEMENTED;
+ }
+
+ /**
* Delete all peer device context and all related bonding information from
* the database within the security manager.
*
@@ -145,6 +166,38 @@
/* Event callback handlers. */
public:
/**
+ * Setup a callback to be invoked to notify the user application that the
+ * SecurityManager instance is about to shutdown (possibly as a result of a call
+ * to BLE::shutdown()).
+ *
+ * @Note: It is possible to chain together multiple onShutdown callbacks
+ * (potentially from different modules of an application) to be notified
+ * before the SecurityManager is shutdown.
+ *
+ * @Note: It is also possible to set up a callback into a member function of
+ * some object.
+ *
+ * @Note It is possible to unregister a callback using onShutdown().detach(callback)
+ */
+ void onShutdown(const SecurityManagerShutdownCallback_t& callback) {
+ shutdownCallChain.add(callback);
+ }
+ template <typename T>
+ void onShutdown(T *objPtr, void (T::*memberPtr)(void)) {
+ shutdownCallChain.add(objPtr, memberPtr);
+ }
+
+ /**
+ * @brief provide access to the callchain of shutdown event callbacks
+ * It is possible to register callbacks using onShutdown().add(callback);
+ * It is possible to unregister callbacks using onShutdown().detach(callback)
+ * @return The shutdown event callbacks chain
+ */
+ SecurityManagerShutdownCallbackChain_t& onShutdown() {
+ return shutdownCallChain;
+ }
+
+ /**
* To indicate that a security procedure for the link has started.
*/
virtual void onSecuritySetupInitiated(SecuritySetupInitiatedCallback_t callback) {securitySetupInitiatedCallback = callback;}
@@ -214,12 +267,43 @@
/* empty */
}
+public:
+ /**
+ * Notify all registered onShutdown callbacks that the SecurityManager is
+ * about to be shutdown and clear all SecurityManager state of the
+ * associated object.
+ *
+ * This function is meant to be overridden in the platform-specific
+ * sub-class. Nevertheless, the sub-class is only expected to reset its
+ * state and not the data held in SecurityManager members. This shall be
+ * achieved by a call to SecurityManager::reset() from the sub-class'
+ * reset() implementation.
+ *
+ * @return BLE_ERROR_NONE on success.
+ */
+ virtual ble_error_t reset(void) {
+ /* Notify that the instance is about to shutdown */
+ shutdownCallChain.call(this);
+ shutdownCallChain.clear();
+
+ securitySetupInitiatedCallback = NULL;
+ securitySetupCompletedCallback = NULL;
+ linkSecuredCallback = NULL;
+ securityContextStoredCallback = NULL;
+ passkeyDisplayCallback = NULL;
+
+ return BLE_ERROR_NONE;
+ }
+
protected:
SecuritySetupInitiatedCallback_t securitySetupInitiatedCallback;
SecuritySetupCompletedCallback_t securitySetupCompletedCallback;
LinkSecuredCallback_t linkSecuredCallback;
HandleSpecificEvent_t securityContextStoredCallback;
PasskeyDisplayCallback_t passkeyDisplayCallback;
+
+private:
+ SecurityManagerShutdownCallbackChain_t shutdownCallChain;
};
#endif /*__SECURITY_MANAGER_H__*/
\ No newline at end of file
