You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.0 KiB
159 lines
5.0 KiB
|
|
|
|
#include "nrf_log.h"
|
|
#include "peer_manager_handler.h"
|
|
|
|
#include "int_comm.h"
|
|
#include "pm.h"
|
|
|
|
#define SEC_PARAM_BOND 1 /**< Perform bonding. */
|
|
#define SEC_PARAM_MITM 1 /**< Man In The Middle protection required. */
|
|
#define SEC_PARAM_LESC 1 /**< LE Secure Connections enabled. */
|
|
#define SEC_PARAM_KEYPRESS 0 /**< Keypress notifications not enabled. */
|
|
#define SEC_PARAM_IO_CAPABILITIES \
|
|
BLE_GAP_IO_CAPS_KEYBOARD_DISPLAY /**< Display and keyboard I/O capabilities. \
|
|
*/
|
|
#define SEC_PARAM_OOB 0 /**< Out Of Band data not available. */
|
|
#define SEC_PARAM_MIN_KEY_SIZE 7 /**< Minimum encryption key size. */
|
|
#define SEC_PARAM_MAX_KEY_SIZE 16 /**< Maximum encryption key size. */
|
|
|
|
static pm_peer_id_t
|
|
m_peer_id; /**< Device reference handle to the current bonded central. */
|
|
|
|
pm_peer_id_t get_peer_id(void) { return m_peer_id; }
|
|
|
|
/**@brief Function for setting filtered whitelist.
|
|
*
|
|
* @param[in] skip Filter passed to @ref pm_peer_id_list.
|
|
*/
|
|
void whitelist_set(pm_peer_id_list_skip_t skip) {
|
|
pm_peer_id_t peer_ids[BLE_GAP_WHITELIST_ADDR_MAX_COUNT];
|
|
uint32_t peer_id_count = BLE_GAP_WHITELIST_ADDR_MAX_COUNT;
|
|
|
|
ret_code_t err_code =
|
|
pm_peer_id_list(peer_ids, &peer_id_count, PM_PEER_ID_INVALID, skip);
|
|
APP_ERROR_CHECK(err_code);
|
|
|
|
NRF_LOG_INFO("\tm_whitelist_peer_cnt %d, MAX_PEERS_WLIST %d",
|
|
peer_id_count + 1, BLE_GAP_WHITELIST_ADDR_MAX_COUNT);
|
|
|
|
err_code = pm_whitelist_set(peer_ids, peer_id_count);
|
|
APP_ERROR_CHECK(err_code);
|
|
}
|
|
|
|
/**@brief Function for handling Peer Manager events.
|
|
*
|
|
* @param[in] p_evt Peer Manager event.
|
|
*/
|
|
void pm_evt_handler(pm_evt_t const *p_evt) {
|
|
pm_handler_on_pm_evt(p_evt);
|
|
pm_handler_disconnect_on_sec_failure(p_evt);
|
|
pm_handler_flash_clean(p_evt);
|
|
|
|
switch (p_evt->evt_id) {
|
|
case PM_EVT_CONN_SEC_SUCCEEDED:
|
|
m_peer_id = p_evt->peer_id;
|
|
break;
|
|
|
|
case PM_EVT_PEERS_DELETE_SUCCEEDED:
|
|
send_status_event();
|
|
break;
|
|
|
|
case PM_EVT_PEER_DATA_UPDATE_SUCCEEDED:
|
|
if (p_evt->params.peer_data_update_succeeded.flash_changed &&
|
|
(p_evt->params.peer_data_update_succeeded.data_id ==
|
|
PM_PEER_DATA_ID_BONDING)) {
|
|
NRF_LOG_INFO("New Bond, add the peer to the whitelist if possible");
|
|
// Note: You should check on what kind of white list policy your
|
|
// application should use.
|
|
|
|
whitelist_set(PM_PEER_ID_LIST_SKIP_NO_ID_ADDR);
|
|
send_status_event();
|
|
}
|
|
break;
|
|
case PM_EVT_CONN_SEC_CONFIG_REQ: {
|
|
bool ok = send_repair_request();
|
|
|
|
if (ok) {
|
|
// Allow pairing request from an already bonded peer.
|
|
pm_conn_sec_config_t conn_sec_config = {.allow_repairing = true};
|
|
pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config);
|
|
} else {
|
|
// Reject pairing request from an already bonded peer.
|
|
pm_conn_sec_config_t conn_sec_config = {.allow_repairing = false};
|
|
pm_conn_sec_config_reply(p_evt->conn_handle, &conn_sec_config);
|
|
}
|
|
|
|
} break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**@brief Function for the Peer Manager initialization.
|
|
*/
|
|
void peer_manager_init(void) {
|
|
ble_gap_sec_params_t sec_param;
|
|
pm_privacy_params_t privacy_params;
|
|
ret_code_t err_code;
|
|
|
|
err_code = pm_init();
|
|
APP_ERROR_CHECK(err_code);
|
|
|
|
memset(&sec_param, 0, sizeof(ble_gap_sec_params_t));
|
|
|
|
// Security parameters to be used for all security procedures.
|
|
sec_param.bond = SEC_PARAM_BOND;
|
|
sec_param.mitm = SEC_PARAM_MITM;
|
|
sec_param.lesc = SEC_PARAM_LESC;
|
|
sec_param.keypress = SEC_PARAM_KEYPRESS;
|
|
sec_param.io_caps = SEC_PARAM_IO_CAPABILITIES;
|
|
sec_param.oob = SEC_PARAM_OOB;
|
|
sec_param.min_key_size = SEC_PARAM_MIN_KEY_SIZE;
|
|
sec_param.max_key_size = SEC_PARAM_MAX_KEY_SIZE;
|
|
sec_param.kdist_own.enc = 1;
|
|
sec_param.kdist_own.id = 1;
|
|
sec_param.kdist_peer.enc = 1;
|
|
sec_param.kdist_peer.id = 1;
|
|
|
|
err_code = pm_sec_params_set(&sec_param);
|
|
APP_ERROR_CHECK(err_code);
|
|
|
|
privacy_params.p_device_irk = NULL;
|
|
privacy_params.privacy_mode = BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY;
|
|
privacy_params.private_addr_cycle_s = 0;
|
|
privacy_params.private_addr_type =
|
|
BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE;
|
|
pm_privacy_set(&privacy_params);
|
|
|
|
err_code = pm_register(pm_evt_handler);
|
|
APP_ERROR_CHECK(err_code);
|
|
}
|
|
|
|
/**@brief Function for setting filtered device identities.
|
|
*
|
|
* @param[in] skip Filter passed to @ref pm_peer_id_list.
|
|
*/
|
|
void identities_set(pm_peer_id_list_skip_t skip) {
|
|
pm_peer_id_t peer_ids[BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT];
|
|
uint32_t peer_id_count = BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT;
|
|
|
|
ret_code_t err_code =
|
|
pm_peer_id_list(peer_ids, &peer_id_count, PM_PEER_ID_INVALID, skip);
|
|
APP_ERROR_CHECK(err_code);
|
|
|
|
err_code = pm_device_identities_list_set(peer_ids, peer_id_count);
|
|
APP_ERROR_CHECK(err_code);
|
|
}
|
|
|
|
/////**@brief Clear bond information from persistent storage. */
|
|
void delete_bonds(void) {
|
|
ret_code_t err_code;
|
|
|
|
NRF_LOG_INFO("Erase bonds!");
|
|
|
|
// pm_whitelist_set(NULL, 0);
|
|
err_code = pm_peers_delete();
|
|
APP_ERROR_CHECK(err_code);
|
|
}
|