struct bt_keys *bt_keys_get_addr(const bt_addr_le_t *addr) { struct bt_keys *keys; int i; BT_DBG("%s", bt_addr_le_str(addr)); for (i = 0; i < ARRAY_SIZE(key_pool); i++) { keys = &key_pool[i]; if (!bt_addr_le_cmp(&keys->addr, addr)) { return keys; } if (!bt_addr_le_cmp(&keys->addr, BT_ADDR_LE_ANY)) { bt_addr_le_copy(&keys->addr, addr); BT_DBG("created %p for %s", keys, bt_addr_le_str(addr)); return keys; } } BT_DBG("unable to create keys for %s", bt_addr_le_str(addr)); return NULL; }
struct bt_keys *bt_keys_find_irk(const bt_addr_le_t *addr) { int i; BT_DBG("%s", bt_addr_le_str(addr)); if (!bt_addr_le_is_rpa(addr)) { return NULL; } for (i = 0; i < ARRAY_SIZE(key_pool); i++) { if (!(key_pool[i].keys & BT_KEYS_IRK)) { continue; } if (!bt_addr_cmp((bt_addr_t *)addr->val, &key_pool[i].irk.rpa)) { BT_DBG("cached RPA %s for %s", bt_addr_str(&key_pool[i].irk.rpa), bt_addr_le_str(&key_pool[i].addr)); return &key_pool[i]; } } for (i = 0; i < ARRAY_SIZE(key_pool); i++) { if (!(key_pool[i].keys & BT_KEYS_IRK)) { continue; } if (bt_smp_irk_matches(key_pool[i].irk.val, (bt_addr_t *)addr->val)) { BT_DBG("RPA %s matches %s", bt_addr_str(&key_pool[i].irk.rpa), bt_addr_le_str(&key_pool[i].addr)); bt_addr_copy(&key_pool[i].irk.rpa, (bt_addr_t *)addr->val); return &key_pool[i]; } } BT_DBG("No IRK for %s", bt_addr_le_str(addr)); return NULL; }
void on_nble_get_bda_rsp(const struct nble_get_bda_rsp *rsp) { bt_addr_le_copy(&nble.addr, &rsp->bda); BT_DBG("Local bdaddr: %s", bt_addr_le_str(&nble.addr)); nble_get_version_req(NULL); }
void bt_keys_clear(struct bt_keys *keys) { BT_DBG("keys for %s", bt_addr_le_str(&keys->addr)); if (keys->keys & BT_KEYS_IRK) { bt_id_del(keys); } memset(keys, 0, sizeof(*keys)); }
void bt_keys_clear(struct bt_keys *keys, int type) { BT_DBG("keys for %s type %d", bt_addr_le_str(&keys->addr), type); keys->keys &= ~type; if (!keys->keys) { memset(keys, 0, sizeof(*keys)); } }
struct bt_keys *bt_keys_find_addr(const bt_addr_le_t *addr) { int i; BT_DBG("%s", bt_addr_le_str(addr)); for (i = 0; i < ARRAY_SIZE(key_pool); i++) { if (!bt_addr_le_cmp(&key_pool[i].addr, addr)) { return &key_pool[i]; } } return NULL; }
struct bt_keys *bt_keys_find(int type, const bt_addr_le_t *addr) { int i; BT_DBG("type %d %s", type, bt_addr_le_str(addr)); for (i = 0; i < ARRAY_SIZE(key_pool); i++) { if ((key_pool[i].keys & type) && !bt_addr_le_cmp(&key_pool[i].addr, addr)) { return &key_pool[i]; } } return NULL; }
struct bt_keys *bt_keys_get_type(int type, const bt_addr_le_t *addr) { struct bt_keys *keys; BT_DBG("type %d %s", type, bt_addr_le_str(addr)); keys = bt_keys_find(type, addr); if (keys) { return keys; } keys = bt_keys_get_addr(addr); if (!keys) { return NULL; } bt_keys_add_type(keys, type); return keys; }
void on_nble_gap_adv_report_evt(const struct nble_gap_adv_report_evt *evt, const uint8_t *buf, uint8_t len) { #if TODO_IMPLEMENT_CONNECTION uint8_t num_reports = buf->data[0]; struct bt_hci_ev_le_advertising_info *info; BT_DBG("Adv number of reports %u", num_reports); info = net_buf_pull(buf, sizeof(num_reports)); while (num_reports--) { int8_t rssi = info->data[info->length]; const bt_addr_le_t *addr; BT_DBG("%s event %u, len %u, rssi %d dBm", bt_addr_le_str(&info->addr), info->evt_type, info->length, rssi); addr = find_id_addr(&info->addr); #endif BT_DBG("nble gap: event:%u, len %u", evt->adv_type, len); if (scan_dev_found_cb) { scan_dev_found_cb(&evt->addr, evt->rssi, evt->adv_type, buf, len); } #if TODO_IMPLEMENT_CONNECTION #if defined(CONFIG_BLUETOOTH_CONN) check_pending_conn(addr, &info->addr, info->evt_type); #endif /* CONFIG_BLUETOOTH_CONN */ /* Get next report iteration by moving pointer to right offset * in buf according to spec 4.2, Vol 2, Part E, 7.7.65.2. */ info = net_buf_pull(buf, sizeof(*info) + info->length + sizeof(rssi)); } #endif }