Move BLE whitelist APIs from LegacyGap to ble::Gap

pull/12730/head
Lingkai Dong 2020-03-25 14:58:02 +00:00
parent eee3b687c4
commit e97582bd23
7 changed files with 90 additions and 109 deletions

View File

@ -21,6 +21,7 @@
#include <stdint.h>
#include <string.h>
#include "ble/SafeEnum.h"
#include "ble/BLEProtocol.h"
#include "platform/Span.h"
#include "ble/gap/Types.h"
@ -831,6 +832,27 @@ struct coded_symbol_per_bit_t :SafeEnum<coded_symbol_per_bit_t, uint8_t> {
SafeEnum<coded_symbol_per_bit_t, uint8_t>(value) { }
};
/**
* Representation of a whitelist of addresses.
*/
struct whitelist_t {
/**
* Pointer to the array of the addresses composing the whitelist.
*/
BLEProtocol::Address_t *addresses;
/**
* Number addresses in this whitelist.
*/
uint8_t size;
/**
* Capacity of the array holding the addresses.
*/
uint8_t capacity;
};
} // namespace ble
/**

View File

@ -221,26 +221,6 @@ public:
INIT_POLICY_FILTER_ALL_ADV = 1,
};
/**
* Representation of a whitelist of addresses.
*/
struct Whitelist_t {
/**
* Pointer to the array of the addresses composing the whitelist.
*/
BLEProtocol::Address_t *addresses;
/**
* Number addresses in this whitelist.
*/
uint8_t size;
/**
* Capacity of the array holding the addresses.
*/
uint8_t capacity;
};
/**
* Description of the states of the device.
*/
@ -804,51 +784,6 @@ public:
ble_error_t getAppearance(GapAdvertisingData::Appearance *appearanceP);
#endif // BLE_FEATURE_GATT_SERVER
#if BLE_FEATURE_WHITELIST
/**
* Get the maximum size of the whitelist.
*
* @return Maximum size of the whitelist.
*
* @note If using Mbed OS, you can configure the size of the whitelist by
* setting the YOTTA_CFG_WHITELIST_MAX_SIZE macro in your yotta config file.
*/
uint8_t getMaxWhitelistSize(void) const;
/**
* Get the Link Layer to use the internal whitelist when scanning,
* advertising or initiating a connection depending on the filter policies.
*
* @param[in,out] whitelist Define the whitelist instance which is used
* to store the whitelist requested. In input, the caller provisions memory.
*
* @return BLE_ERROR_NONE if the implementation's whitelist was successfully
* copied into the supplied reference.
*/
ble_error_t getWhitelist(Whitelist_t &whitelist) const;
/**
* Set the value of the whitelist to be used during GAP procedures.
*
* @param[in] whitelist A reference to a whitelist containing the addresses
* to be copied to the internal whitelist.
*
* @return BLE_ERROR_NONE if the implementation's whitelist was successfully
* populated with the addresses in the given whitelist.
*
* @note The whitelist must not contain addresses of type @ref
* BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE. This
* results in a @ref BLE_ERROR_INVALID_PARAM because the remote peer might
* change its private address at any time, and it is not possible to resolve
* it.
*
* @note If the input whitelist is larger than @ref getMaxWhitelistSize(),
* then @ref BLE_ERROR_PARAM_OUT_OF_RANGE is returned.
*/
ble_error_t setWhitelist(const Whitelist_t &whitelist);
#endif // BLE_FEATURE_WHITELIST
/*
* APIs with nonvirtual implementations.
*/
@ -1130,12 +1065,6 @@ protected:
/* --- Abstract calls to override --- */
uint8_t getMaxWhitelistSize_(void) const;
ble_error_t getWhitelist_(Whitelist_t &whitelist) const;
ble_error_t setWhitelist_(const Whitelist_t &whitelist);
ble_error_t getAddress_(
BLEProtocol::AddressType_t *typeP,
BLEProtocol::AddressBytes_t address

View File

@ -20,7 +20,6 @@
#include "BLERoles.h"
#include "ble/common/StaticInterface.h"
#include "ble/BLETypes.h"
#include "ble/BLEProtocol.h"
#include "ble/gap/AdvertisingDataBuilder.h"
#include "ble/gap/AdvertisingDataSimpleBuilder.h"
#include "ble/gap/ConnectionParameters.h"
@ -1256,6 +1255,48 @@ public:
#endif // BLE_ROLE_OBSERVER
#endif // BLE_FEATURE_PRIVACY
#if BLE_FEATURE_WHITELIST
/**
* Get the maximum size of the whitelist.
*
* @return Maximum size of the whitelist.
*/
uint8_t getMaxWhitelistSize(void) const;
/**
* Get the Link Layer to use the internal whitelist when scanning,
* advertising or initiating a connection depending on the filter policies.
*
* @param[in,out] whitelist Define the whitelist instance which is used
* to store the whitelist requested. In input, the caller provisions memory.
*
* @return BLE_ERROR_NONE if the implementation's whitelist was successfully
* copied into the supplied reference.
*/
ble_error_t getWhitelist(whitelist_t &whitelist) const;
/**
* Set the value of the whitelist to be used during GAP procedures.
*
* @param[in] whitelist A reference to a whitelist containing the addresses
* to be copied to the internal whitelist.
*
* @return BLE_ERROR_NONE if the implementation's whitelist was successfully
* populated with the addresses in the given whitelist.
*
* @note The whitelist must not contain addresses of type @ref
* BLEProtocol::AddressType::RANDOM_PRIVATE_NON_RESOLVABLE. This
* results in a @ref BLE_ERROR_INVALID_PARAM because the remote peer might
* change its private address at any time, and it is not possible to resolve
* it.
*
* @note If the input whitelist is larger than @ref getMaxWhitelistSize(),
* then @ref BLE_ERROR_PARAM_OUT_OF_RANGE is returned.
*/
ble_error_t setWhitelist(const whitelist_t &whitelist);
#endif // BLE_FEATURE_WHITELIST
#if !defined(DOXYGEN_ONLY)
/*
* API reserved for the controller driver to set the random static address.
@ -1406,6 +1447,9 @@ protected:
central_privay_configuration_t *configuration
);
ble_error_t setRandomStaticAddress_(const ble::address_t& address);
uint8_t getMaxWhitelistSize_(void) const;
ble_error_t getWhitelist_(whitelist_t &whitelist) const;
ble_error_t setWhitelist_(const whitelist_t &whitelist);
protected:
/**

View File

@ -19,23 +19,6 @@
namespace ble {
namespace interface {
#if BLE_FEATURE_WHITELIST
template<class Impl>
uint8_t LegacyGap<Impl>::getMaxWhitelistSize(void) const {
return impl()->getMaxWhitelistSize_();
}
template<class Impl>
ble_error_t LegacyGap<Impl>::getWhitelist(Whitelist_t &whitelist) const {
return impl()->getWhitelist_(whitelist);
}
template<class Impl>
ble_error_t LegacyGap<Impl>::setWhitelist(const Whitelist_t &whitelist) {
return impl()->setWhitelist_(whitelist);
}
#endif // BLE_FEATURE_WHITELIST
template<class Impl>
void LegacyGap<Impl>::processConnectionEvent(
Handle_t handle,
@ -358,21 +341,6 @@ ble_error_t LegacyGap<Impl>::reset_(void)
/* ------------------------- Default implementations ------------------------ */
// -----------------------------------------------------------------------------
template<class Impl>
uint8_t LegacyGap<Impl>::getMaxWhitelistSize_(void) const {
return 0;
}
template<class Impl>
ble_error_t LegacyGap<Impl>::getWhitelist_(Whitelist_t &whitelist) const {
return BLE_ERROR_NOT_IMPLEMENTED;
}
template<class Impl>
ble_error_t LegacyGap<Impl>::setWhitelist_(const Whitelist_t &whitelist) {
return BLE_ERROR_NOT_IMPLEMENTED;
}
template<class Impl>
ble_error_t LegacyGap<Impl>::getAddress_(
BLEProtocol::AddressType_t *typeP,

View File

@ -488,6 +488,24 @@ ble_error_t Gap<Impl>::setRandomStaticAddress(const ble::address_t& address)
return impl()->setRandomStaticAddress_(address);
}
#if BLE_FEATURE_WHITELIST
template<class Impl>
uint8_t Gap<Impl>::getMaxWhitelistSize(void) const {
return impl()->getMaxWhitelistSize_();
}
template<class Impl>
ble_error_t Gap<Impl>::getWhitelist(whitelist_t &whitelist) const {
return impl()->getWhitelist_(whitelist);
}
template<class Impl>
ble_error_t Gap<Impl>::setWhitelist(const whitelist_t &whitelist) {
return impl()->setWhitelist_(whitelist);
}
#endif // BLE_FEATURE_WHITELIST
// -----------------------------------------------------------------------------
/* ------------------------- Default implementations ------------------------ */
// -----------------------------------------------------------------------------

View File

@ -320,7 +320,7 @@ static bool is_disconnection_reason_valid(::Gap::DisconnectionReason_t reason)
/*
* Return true if the whitelist in input is valid or false otherwise.
*/
static bool is_whitelist_valid(const ::Gap::Whitelist_t &whitelist)
static bool is_whitelist_valid(const ::ble::whitelist_t &whitelist)
{
if (whitelist.size > whitelist.capacity) {
return false;
@ -347,7 +347,7 @@ static bool is_whitelist_valid(const ::Gap::Whitelist_t &whitelist)
* Return true if device is present in the whitelist.
*/
static bool is_in_whitelist(
const BLEProtocol::Address_t &device, const ::Gap::Whitelist_t &whitelist
const BLEProtocol::Address_t &device, const ::ble::whitelist_t &whitelist
)
{
for (size_t i = 0; i < whitelist.size; ++i) {
@ -890,7 +890,7 @@ uint8_t GenericGap<PalGapImpl, PalSecurityManager, ConnectionEventMonitorEventHa
}
template <template<class> class PalGapImpl, class PalSecurityManager, class ConnectionEventMonitorEventHandler>
ble_error_t GenericGap<PalGapImpl, PalSecurityManager, ConnectionEventMonitorEventHandler>::getWhitelist_(Whitelist_t &whitelist) const
ble_error_t GenericGap<PalGapImpl, PalSecurityManager, ConnectionEventMonitorEventHandler>::getWhitelist_(whitelist_t &whitelist) const
{
if (initialize_whitelist() == false) {
return BLE_ERROR_INVALID_STATE;
@ -909,7 +909,7 @@ ble_error_t GenericGap<PalGapImpl, PalSecurityManager, ConnectionEventMonitorEve
}
template <template<class> class PalGapImpl, class PalSecurityManager, class ConnectionEventMonitorEventHandler>
ble_error_t GenericGap<PalGapImpl, PalSecurityManager, ConnectionEventMonitorEventHandler>::setWhitelist_(const Whitelist_t &whitelist)
ble_error_t GenericGap<PalGapImpl, PalSecurityManager, ConnectionEventMonitorEventHandler>::setWhitelist_(const whitelist_t &whitelist)
{
if (is_whitelist_valid(whitelist) == false) {
return BLE_ERROR_INVALID_PARAM;

View File

@ -165,7 +165,7 @@ ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::purgeAl
}
template<template<class> class TPalSecurityManager, template<class> class SigningMonitor>
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::generateWhitelistFromBondTable_(::Gap::Whitelist_t *whitelist) const {
ble_error_t GenericSecurityManager<TPalSecurityManager, SigningMonitor>::generateWhitelistFromBondTable_(::ble::whitelist_t *whitelist) const {
if (!_db) return BLE_ERROR_INITIALIZATION_INCOMPLETE;
if (eventHandler) {
if (!whitelist) {