Due to whitelist limitation of 8 peers, I am doing manual filtering of bonded devices. I am trying to use pm_address_resolve function to figure out whether I have previously bonded with this peer.
static bool try_resolve_peer_address(ble_gap_addr_t peer_addr){ pm_peer_id_t peer_id; pm_peer_data_flash_t peer_data; pm_peer_id_t bonded_matching_peer_id = PM_PEER_ID_INVALID; pds_peer_data_iterate_prepare(); while (pds_peer_data_iterate(PM_PEER_DATA_ID_BONDING, &peer_id, &peer_data)) { if (pm_address_resolve(&peer_addr, &peer_data.p_bonding_data->peer_ble_id.id_info)) { bonded_matching_peer_id = peer_id; NRF_LOG_INFO("Found bonded peer with id %04X",peer_id); return true; } } return false; } static void on_adv_report(ble_evt_t const * p_ble_evt) { ret_code_t err_code = NRF_SUCCESS; ble_gap_evt_t const * p_gap_evt = &p_ble_evt->evt.gap_evt; if(p_gap_evt->params.adv_report.primary_phy == BLE_GAP_PHY_CODED && ble_advdata_uuid_find(p_gap_evt->params.adv_report.data.p_data,p_gap_evt->params.adv_report.data.len,&g_adv_uuids[0])){ const ble_gap_evt_adv_report_t* const adv = &p_gap_evt->params.adv_report; if(fake_whitelisting){ if(adv->peer_addr.addr_type != BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE){ // nothing to do } else if(try_resolve_peer_address(adv->peer_addr)){ err_code = sd_ble_gap_connect(&adv->peer_addr,&m_scan_param,&g_conn_param,1); APP_ERROR_CHECK(err_code); } } else{ err_code = sd_ble_gap_connect(&adv->peer_addr,&m_scan_param,&g_conn_param,1); APP_ERROR_CHECK(err_code); } } APP_ERROR_CHECK(sd_ble_gap_scan_start(NULL,&g_scan_buffer)); }
The application halts on sd_ble_gap_scan_start returning NRF_ERROR_INVALID_STATE, if I comment out the try_resolve_peer_address, it continues to scan just fine.
Could this be somehow related to id_manager.c::sd_ecb_block_encrypt? Since that's what pm_address_resolve calls internally.