| | |
| | | #endif |
| | | |
| | | #if NIMBLE_BLE_CONNECT |
| | | static int |
| | | int |
| | | ble_gap_rd_rem_sup_feat_tx(uint16_t handle) |
| | | { |
| | | struct ble_hci_le_rd_rem_feat_cp cmd; |
| | |
| | | ble_gap_slave_reset_state(0); |
| | | goto done; |
| | | } |
| | | |
| | | #if SMP_MULTI_ADDR_MODE_EN |
| | | ble_hs_id_set_used_addr_type(own_addr_type); |
| | | #endif |
| | | |
| | | if (duration_ms != BLE_HS_FOREVER) { |
| | | ble_gap_slave_set_timer(duration_ticks); |
| | |
| | | #endif |
| | | } |
| | | |
| | | #if SMP_MULTI_ADDR_MODE_EN |
| | | #include "host/ble_store.h" |
| | | |
| | | int |
| | | ble_gap_unpair(const ble_addr_t *peer_addr, const ble_addr_t *own_addr) |
| | | { |
| | | #if NIMBLE_BLE_SM |
| | | struct ble_hs_conn *conn; |
| | | |
| | | if (ble_addr_cmp(peer_addr, BLE_ADDR_ANY) == 0) { |
| | | return BLE_HS_EINVAL; |
| | | } |
| | | |
| | | ble_hs_lock(); |
| | | |
| | | conn = ble_hs_conn_find_by_addr(peer_addr); |
| | | if (conn != NULL) { |
| | | ble_addr_t cur_own_addr = {0}; |
| | | cur_own_addr.type = conn->bhc_our_addr_type; |
| | | ble_hs_id_copy_addr(conn->bhc_our_addr_type, cur_own_addr.val, NULL); |
| | | |
| | | if(ble_addr_cmp(own_addr, &cur_own_addr) == 0){ |
| | | ble_gap_terminate_with_conn(conn, BLE_ERR_REM_USER_CONN_TERM); |
| | | } |
| | | } |
| | | |
| | | ble_hs_unlock(); |
| | | |
| | | ble_hs_pvcy_remove_entry(peer_addr->type, peer_addr->val); |
| | | |
| | | return ble_store_util_delete_peer(peer_addr, own_addr); |
| | | #else |
| | | return BLE_HS_ENOTSUP; |
| | | #endif |
| | | } |
| | | |
| | | int |
| | | ble_gap_unpair_oldest_peer(void) |
| | | { |
| | | #if NIMBLE_BLE_SM |
| | | int num_peers; |
| | | int rc; |
| | | |
| | | num_peers = ble_store_config_get_our_secs_num(); |
| | | if(num_peers == 0){ |
| | | return BLE_HS_ENOENT; |
| | | } |
| | | |
| | | struct ble_store_value_sec *oldest_val_sec = ble_store_config_get_our_secs(0); |
| | | |
| | | rc = ble_gap_unpair(&oldest_val_sec->peer_addr, &oldest_val_sec->own_addr); |
| | | if (rc != 0) { |
| | | return rc; |
| | | } |
| | | |
| | | return 0; |
| | | #else |
| | | return BLE_HS_ENOTSUP; |
| | | #endif |
| | | } |
| | | |
| | | int |
| | | ble_gap_unpair_oldest_except(const ble_addr_t *peer_addr) |
| | | { |
| | | #if NIMBLE_BLE_SM |
| | | int num_peers; |
| | | int rc, i; |
| | | |
| | | num_peers = ble_store_config_get_cccds_num(); |
| | | if (num_peers == 0) { |
| | | return BLE_HS_ENOENT; |
| | | } |
| | | |
| | | ble_addr_t own_addr; |
| | | own_addr.type = ble_hs_id_get_used_addr_type(); |
| | | rc = ble_hs_id_copy_addr(own_addr.type, own_addr.val, NULL); |
| | | if(rc != 0){ |
| | | return -1; |
| | | } |
| | | |
| | | struct ble_store_value_cccd *oldest_val_cccd = ble_store_config_get_cccds(0); |
| | | |
| | | for (i = 0; i < num_peers; i++) { |
| | | struct ble_store_value_cccd *cur = oldest_val_cccd + i; |
| | | if (ble_addr_cmp(peer_addr, &cur->peer_addr) != 0 || |
| | | ble_addr_cmp(&own_addr, &cur->own_addr) != 0) { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (i >= num_peers) { |
| | | return BLE_HS_ENOMEM; |
| | | } |
| | | |
| | | oldest_val_cccd = oldest_val_cccd + i; |
| | | |
| | | return ble_gap_unpair(&oldest_val_cccd->peer_addr, &oldest_val_cccd->own_addr); |
| | | #else |
| | | return BLE_HS_ENOTSUP; |
| | | #endif |
| | | } |
| | | |
| | | #else |
| | | int |
| | | ble_gap_unpair(const ble_addr_t *peer_addr) |
| | | { |
| | |
| | | return BLE_HS_ENOTSUP; |
| | | #endif |
| | | } |
| | | #endif |
| | | |
| | | void |
| | | ble_gap_passkey_event(uint16_t conn_handle, |