mirror of https://github.com/ARMmbed/mbed-os.git
BLE: Add cordio implementation of PalPrivateAddressController
parent
f1dbc893f3
commit
7dacae73b2
|
@ -0,0 +1,227 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PalPrivateAddressControllerImpl.h"
|
||||||
|
#include "dm_api.h"
|
||||||
|
|
||||||
|
namespace ble {
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::initialize()
|
||||||
|
{
|
||||||
|
DmPrivInit();
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::terminate()
|
||||||
|
{
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::generate_resolvable_private_address(const irk_t& local_irk)
|
||||||
|
{
|
||||||
|
if (_generating_rpa) {
|
||||||
|
return BLE_ERROR_INVALID_STATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
DmPrivGenerateAddr(const_cast<uint8_t*>(local_irk.data()), 0);
|
||||||
|
_generating_rpa = true;
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
address_t PalPrivateAddressController::generate_non_resolvable_private_address()
|
||||||
|
{
|
||||||
|
address_t address;
|
||||||
|
SecRand(address.data(), address.size());
|
||||||
|
DM_RAND_ADDR_SET(address, DM_RAND_ADDR_NONRESOLV);
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::resolve_private_address(
|
||||||
|
const address_t &address,
|
||||||
|
const irk_t& irk
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (_resolving_rpa) {
|
||||||
|
return BLE_ERROR_INVALID_STATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
DmPrivResolveAddr(
|
||||||
|
const_cast<uint8_t*>(address.data()),
|
||||||
|
const_cast<uint8_t*>(irk.data()),
|
||||||
|
0
|
||||||
|
);
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PalPrivateAddressController::is_ll_privacy_supported()
|
||||||
|
{
|
||||||
|
return HciLlPrivacySupported();
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::set_ll_address_resolution(bool enable)
|
||||||
|
{
|
||||||
|
DmPrivSetAddrResEnable(enable);
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::set_ll_resolvable_private_address_timeout(
|
||||||
|
resolvable_address_timeout_t timeout
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (HciLlPrivacySupported() == false) {
|
||||||
|
return BLE_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
DmPrivSetResolvablePrivateAddrTimeout(timeout.value());
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t PalPrivateAddressController::read_resolving_list_capacity()
|
||||||
|
{
|
||||||
|
return HciGetResolvingListSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::add_device_to_resolving_list(
|
||||||
|
target_peer_address_type_t peer_address_type,
|
||||||
|
const address_t &peer_identity_address,
|
||||||
|
const irk_t& peer_irk,
|
||||||
|
const irk_t& local_irk
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (is_ll_privacy_supported() == false) {
|
||||||
|
return BLE_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
DmPrivAddDevToResList(
|
||||||
|
peer_address_type.value(),
|
||||||
|
peer_identity_address.data(),
|
||||||
|
const_cast<uint8_t*>(peer_irk.data()),
|
||||||
|
const_cast<uint8_t*>(local_irk.data()),
|
||||||
|
true,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::remove_device_from_resolving_list(
|
||||||
|
target_peer_address_type_t peer_address_type,
|
||||||
|
const address_t &peer_identity_address
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (is_ll_privacy_supported() == false) {
|
||||||
|
return BLE_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
DmPrivRemDevFromResList(peer_address_type.value(), peer_identity_address.data(), 0);
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::set_peer_privacy_mode(
|
||||||
|
target_peer_address_type_t peer_address_type,
|
||||||
|
const address_t &peer_address,
|
||||||
|
privacy_mode_t privacy_mode
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (is_ll_privacy_supported() == false) {
|
||||||
|
return BLE_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
DmPrivSetPrivacyMode(
|
||||||
|
peer_address_type.value(),
|
||||||
|
peer_address.data(),
|
||||||
|
privacy_mode.value()
|
||||||
|
);
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble_error_t PalPrivateAddressController::clear_resolving_list()
|
||||||
|
{
|
||||||
|
if (is_ll_privacy_supported() == false) {
|
||||||
|
return BLE_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
DmPrivClearResList();
|
||||||
|
return BLE_ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PalPrivateAddressController::set_event_handler(EventHandler *handler)
|
||||||
|
{
|
||||||
|
_event_handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
PalPrivateAddressController& PalPrivateAddressController::instance()
|
||||||
|
{
|
||||||
|
static impl::PalPrivateAddressController self;
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PalPrivateAddressController::cordio_handler(const wsfMsgHdr_t *msg)
|
||||||
|
{
|
||||||
|
if (msg == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto* handler = instance()._event_handler;
|
||||||
|
|
||||||
|
switch (msg->event) {
|
||||||
|
case DM_PRIV_GENERATE_ADDR_IND: {
|
||||||
|
instance()._generating_rpa = false;
|
||||||
|
|
||||||
|
if (!handler) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto *evt = (const dmPrivGenAddrIndEvt_t*) msg;
|
||||||
|
if (evt->hdr.status == HCI_SUCCESS) {
|
||||||
|
handler->on_resolvable_private_address_generated(evt->addr);
|
||||||
|
} else {
|
||||||
|
handler->on_resolvable_private_address_generated(address_t{});
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DM_PRIV_RESOLVED_ADDR_IND: {
|
||||||
|
instance()._resolving_rpa = false;
|
||||||
|
|
||||||
|
if (!handler) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
handler->on_private_address_resolved(msg->status == HCI_SUCCESS);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DM_PRIV_ADD_DEV_TO_RES_LIST_IND: // Device added to resolving list
|
||||||
|
case DM_PRIV_REM_DEV_FROM_RES_LIST_IND: // Device removed from resolving list
|
||||||
|
case DM_PRIV_CLEAR_RES_LIST_IND: // Resolving list cleared
|
||||||
|
{
|
||||||
|
if (!handler) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Previous command completed, we can move to the next control block
|
||||||
|
handler->on_resolving_list_action_complete();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace impl
|
||||||
|
} // namespace ble
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLE_CORDIO_PAL_PRIVATE_ADDRESS_CONTROLLER_IMPL_H
|
||||||
|
#define BLE_CORDIO_PAL_PRIVATE_ADDRESS_CONTROLLER_IMPL_H
|
||||||
|
|
||||||
|
#include "source/pal/PalPrivateAddressController.h"
|
||||||
|
#include "dm_api.h"
|
||||||
|
|
||||||
|
namespace ble {
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cordio implementation of a ble::PalPrivateAddressController.
|
||||||
|
*/
|
||||||
|
struct PalPrivateAddressController final : public ble::PalPrivateAddressController {
|
||||||
|
|
||||||
|
ble_error_t initialize() final;
|
||||||
|
|
||||||
|
ble_error_t terminate() final;
|
||||||
|
|
||||||
|
ble_error_t generate_resolvable_private_address(const irk_t& local_irk) final;
|
||||||
|
|
||||||
|
address_t generate_non_resolvable_private_address() final;
|
||||||
|
|
||||||
|
ble_error_t resolve_private_address(
|
||||||
|
const address_t &address,
|
||||||
|
const irk_t& irk
|
||||||
|
) final;
|
||||||
|
|
||||||
|
bool is_ll_privacy_supported() final;
|
||||||
|
|
||||||
|
ble_error_t set_ll_address_resolution(bool enable) final;
|
||||||
|
|
||||||
|
ble_error_t set_ll_resolvable_private_address_timeout(resolvable_address_timeout_t timeout) final;
|
||||||
|
|
||||||
|
uint8_t read_resolving_list_capacity() final;
|
||||||
|
|
||||||
|
ble_error_t add_device_to_resolving_list(
|
||||||
|
target_peer_address_type_t peer_address_type,
|
||||||
|
const address_t &peer_identity_address,
|
||||||
|
const irk_t& peer_irk,
|
||||||
|
const irk_t& local_irk
|
||||||
|
) final;
|
||||||
|
|
||||||
|
ble_error_t remove_device_from_resolving_list(
|
||||||
|
target_peer_address_type_t peer_address_type,
|
||||||
|
const address_t &peer_identity_address
|
||||||
|
) final;
|
||||||
|
|
||||||
|
ble_error_t clear_resolving_list() final;
|
||||||
|
|
||||||
|
ble_error_t set_peer_privacy_mode(
|
||||||
|
target_peer_address_type_t peer_address_type,
|
||||||
|
const address_t &peer_address,
|
||||||
|
privacy_mode_t privacy_mode
|
||||||
|
) final;
|
||||||
|
|
||||||
|
void set_event_handler(EventHandler *handler) final;
|
||||||
|
|
||||||
|
static PalPrivateAddressController& instance();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback which handle wsfMsgHdr_t and forward them to emit_gap_event.
|
||||||
|
*/
|
||||||
|
static bool cordio_handler(const wsfMsgHdr_t *msg);
|
||||||
|
|
||||||
|
private:
|
||||||
|
PalPrivateAddressController() = default;
|
||||||
|
|
||||||
|
EventHandler *_event_handler = nullptr;
|
||||||
|
bool _generating_rpa = false;
|
||||||
|
bool _resolving_rpa = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace impl
|
||||||
|
} // namespace ble
|
||||||
|
|
||||||
|
#endif //BLE_CORDIO_PAL_PRIVATE_ADDRESS_CONTROLLER_IMPL_H
|
Loading…
Reference in New Issue