uint32_t conn_mw_ble_gap_whitelist_set(uint8_t const * const p_rx_buf, uint32_t rx_buf_len, uint8_t * const p_tx_buf, uint32_t * const p_tx_buf_len) { SER_ASSERT_NOT_NULL(p_rx_buf); SER_ASSERT_NOT_NULL(p_tx_buf); SER_ASSERT_NOT_NULL(p_tx_buf_len); uint32_t err_code = NRF_SUCCESS; uint32_t sd_err_code; uint8_t length; ble_gap_addr_t wl_addr_array[BLE_GAP_WHITELIST_ADDR_MAX_COUNT]; ble_gap_addr_t * p_wl_addrs_array[BLE_GAP_WHITELIST_ADDR_MAX_COUNT]; for (uint8_t i = 0; i < BLE_GAP_WHITELIST_ADDR_MAX_COUNT; ++i) { p_wl_addrs_array[i] = &wl_addr_array[i]; } ble_gap_addr_t * * pp_wl_addrs = p_wl_addrs_array; err_code = ble_gap_whitelist_set_req_dec(p_rx_buf, rx_buf_len, &pp_wl_addrs, &length); SER_ASSERT(err_code == NRF_SUCCESS, err_code); sd_err_code = sd_ble_gap_whitelist_set((ble_gap_addr_t const * *)pp_wl_addrs, length); err_code = ble_gap_whitelist_set_rsp_enc(sd_err_code, p_tx_buf, p_tx_buf_len); SER_ASSERT(err_code == NRF_SUCCESS, err_code); return err_code; }
/* Copies the peers to whitelist into a local cache. * The cached list will be used by im_whitelist_get() to retrieve the active whitelist. * For SoftDevices 3x, also loads the peers' GAP addresses and whitelists them using * sd_ble_gap_whitelist_set(). */ ret_code_t im_whitelist_set(pm_peer_id_t const * p_peers, uint32_t peer_cnt) { // Clear the cache of whitelisted peers. memset(m_wlisted_peers, 0x00, sizeof(m_wlisted_peers)); if ((p_peers == NULL) || (peer_cnt == 0)) { // Clear the current whitelist. m_wlisted_peer_cnt = 0; #if (NRF_SD_BLE_API_VERSION == 3) // NRF_SUCCESS, or // BLE_GAP_ERROR_WHITELIST_IN_USE return sd_ble_gap_whitelist_set(NULL, 0); #else // The cached list of whitelisted peers is already cleared; nothing to do. return NRF_SUCCESS; #endif } // @todo emdi: should not ever cache more than BLE_GAP_WHITELIST_ADDR_MAX_COUNT... // Copy the new whitelisted peers. m_wlisted_peer_cnt = peer_cnt; memcpy(m_wlisted_peers, p_peers, sizeof(pm_peer_id_t) * peer_cnt); #if (NRF_SD_BLE_API_VERSION == 3) ret_code_t ret; uint32_t wlist_addr_cnt = 0; ble_gap_addr_t const * addr_ptrs[BLE_GAP_WHITELIST_ADDR_MAX_COUNT]; ble_gap_addr_t addrs[BLE_GAP_WHITELIST_ADDR_MAX_COUNT]; memset(addrs, 0x00, sizeof(addrs)); // Fetch GAP addresses for these peers, but don't fetch IRKs. ret = peers_id_keys_get(p_peers, peer_cnt, addrs, &wlist_addr_cnt, NULL, NULL); if (ret != NRF_SUCCESS) { // NRF_ERROR_NOT_FOUND, if a peer or its data were not found. // BLE_ERROR_GAP_INVALID_BLE_ADDR, if a peer address can not be used for whitelisting. return ret; } for (uint32_t i = 0; i < BLE_GAP_WHITELIST_ADDR_MAX_COUNT; i++) { addr_ptrs[i] = &addrs[i]; } // NRF_ERROR_DATA_SIZE, if peer_cnt > BLE_GAP_WHITELIST_ADDR_MAX_COUNT. // BLE_ERROR_GAP_WHITELIST_IN_USE, if a whitelist is in use. return sd_ble_gap_whitelist_set(addr_ptrs, peer_cnt); #else return NRF_SUCCESS; #endif }