01_SDK/nimble/host/nimble/nimble/host/src/ble_gap.c
@@ -1785,7 +1785,7 @@
#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;
@@ -2580,6 +2580,10 @@
        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);
@@ -5713,6 +5717,109 @@
#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)
{
@@ -5803,6 +5910,7 @@
    return BLE_HS_ENOTSUP;
#endif
}
#endif
void
ble_gap_passkey_event(uint16_t conn_handle,