diff --git a/nimble/host/src/ble_sm.c b/nimble/host/src/ble_sm.c index 92caa3b7f..2f6661369 100644 --- a/nimble/host/src/ble_sm.c +++ b/nimble/host/src/ble_sm.c @@ -2650,42 +2650,42 @@ ble_sm_fail_rx(uint16_t conn_handle, struct os_mbuf **om, int ble_sm_incr_our_sign_counter(uint16_t conn_handle) { - struct ble_store_key_sec key_sec; - struct ble_store_value_sec value_sec; - struct ble_gap_conn_desc desc; - int rc; + struct ble_store_key_sec key_sec; + struct ble_store_value_sec value_sec; + struct ble_gap_conn_desc desc; + int rc; - rc = ble_gap_conn_find(conn_handle, &desc); - if (rc != 0) { - return rc; - } + rc = ble_gap_conn_find(conn_handle, &desc); + if (rc != 0) { + return rc; + } - memset(&key_sec, 0, sizeof key_sec); - key_sec.peer_addr = desc.peer_id_addr; + memset(&key_sec, 0, sizeof key_sec); + key_sec.peer_addr = desc.peer_id_addr; - rc = ble_store_read_our_sec(&key_sec, &value_sec); - if (rc != 0) { - return rc; - } - if (value_sec.csrk_present != 1) { - return BLE_HS_ENOENT; - } - if (value_sec.sign_counter == (uint32_t)0xffffffff) { - return BLE_HS_ENOMEM; - } + rc = ble_store_read_our_sec(&key_sec, &value_sec); + if (rc != 0) { + return rc; + } + if (value_sec.csrk_present != 1) { + return BLE_HS_ENOENT; + } + if (value_sec.sign_counter == (uint32_t)0xffffffff) { + return BLE_HS_ENOMEM; + } - rc = ble_store_delete_our_sec(&key_sec); - if (rc != 0) { - return rc; - } + rc = ble_store_delete_our_sec(&key_sec); + if (rc != 0) { + return rc; + } - value_sec.sign_counter += 1; - rc = ble_store_write_our_sec(&value_sec); - if (rc != 0) { - return rc; - } + value_sec.sign_counter += 1; + rc = ble_store_write_our_sec(&value_sec); + if (rc != 0) { + return rc; + } - return 0; + return 0; } /** @@ -2700,42 +2700,48 @@ ble_sm_incr_our_sign_counter(uint16_t conn_handle) int ble_sm_incr_peer_sign_counter(uint16_t conn_handle) { - struct ble_store_key_sec key_sec; - struct ble_store_value_sec value_sec; - struct ble_gap_conn_desc desc; - int rc; + struct ble_store_key_sec key_sec; + struct ble_store_value_sec value_sec; + struct ble_gap_conn_desc desc; + int rc; - rc = ble_gap_conn_find(conn_handle, &desc); - if (rc != 0) { - return rc; - } + rc = ble_gap_conn_find(conn_handle, &desc); + if (rc != 0) { + return rc; + } - memset(&key_sec, 0, sizeof key_sec); - key_sec.peer_addr = desc.peer_id_addr; + memset(&key_sec, 0, sizeof key_sec); + key_sec.peer_addr = desc.peer_id_addr; - rc = ble_store_read_peer_sec(&key_sec, &value_sec); - if (rc != 0) { - return rc; - } - if (value_sec.csrk_present != 1) { - return BLE_HS_ENOENT; - } - if (value_sec.sign_counter == (uint32_t)0xffffffff) { - return BLE_HS_ENOMEM; - } + rc = ble_store_read_peer_sec(&key_sec, &value_sec); + if (rc != 0) { + return rc; + } + if (value_sec.csrk_present != 1) { + return BLE_HS_ENOENT; + } + if (value_sec.sign_counter == (uint32_t)0xffffffff) { + return BLE_HS_ENOMEM; + } - rc = ble_store_delete_peer_sec(&key_sec); - if (rc != 0) { - return rc; - } + rc = ble_store_delete_peer_sec(&key_sec); + if (rc != 0) { + return rc; + } - value_sec.sign_counter += 1; - rc = ble_store_write_peer_sec(&value_sec); - if (rc != 0) { - return rc; - } + if (value_sec.irk_present == 1) { + ble_hs_pvcy_remove_entry(value_sec.peer_addr.type, value_sec.peer_addr.val); + // No need to check if the above command fails or passes + // Proceed with trying to write the new sign counter + } - return 0; + value_sec.sign_counter += 1; + rc = ble_store_write_peer_sec(&value_sec); + if (rc != 0) { + return rc; + } + + return 0; } /**