Pairng: Fix crosskey paring
* Send BONDING event to Java when static identity address is
first obtained during crosskey pairing
* Send BONDING event to Java for the initial random address
before send BONDED event
* Do not send bond event for static identity address when SDP is done.
* Make sure pairing control block always get cleaned up when both SDP
and pairing are done
* Send empty UUIDs to Java layer to unblock bonding intent broadcast
when SDP fails
Bug: 130553855
Fixes: 128518468
Test: pair between two dual mode phones, starting from SMP first to
trigger crosskey pairing
Change-Id: I56f3071595a6fb0cb5fe4df63eae33f8d4858141
diff --git a/system/btif/src/btif_dm.cc b/system/btif/src/btif_dm.cc
index 3b56bf8..1f5cb82 100644
--- a/system/btif/src/btif_dm.cc
+++ b/system/btif/src/btif_dm.cc
@@ -1146,7 +1146,14 @@
/* Trigger SDP on the device */
pairing_cb.sdp_attempts = 1;
- // Report bonded to Java before start SDP
+ if (is_crosskey) {
+ // If bonding occurred due to cross-key pairing, send bonding callback
+ // for static address now
+ LOG_INFO(LOG_TAG,
+ "%s: send bonding state update for static address %s",
+ __func__, bd_addr.ToString().c_str());
+ bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);
+ }
bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDED);
btif_dm_get_remote_services(bd_addr);
@@ -1438,35 +1445,32 @@
if (pairing_cb.state == BT_BOND_STATE_BONDED && pairing_cb.sdp_attempts &&
(p_data->disc_res.bd_addr == pairing_cb.bd_addr ||
p_data->disc_res.bd_addr == pairing_cb.static_bdaddr)) {
- LOG_INFO(LOG_TAG, "%s Remote Service SDP done.", __func__);
+ LOG_INFO(LOG_TAG, "%s: SDP search done for %s", __func__,
+ bd_addr.ToString().c_str());
pairing_cb.sdp_attempts = 0;
- // If bond occured due to cross-key pairing, send bond state callback
- // for static address now
- if (p_data->disc_res.bd_addr == pairing_cb.static_bdaddr) {
- bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDING);
- bond_state_changed(BT_STATUS_SUCCESS, bd_addr, BT_BOND_STATE_BONDED);
- }
- if (pairing_cb.state == BT_BOND_STATE_BONDED) {
- if (p_data->disc_res.result == BTA_SUCCESS) {
- // Device is bonded and SDP completed. Clear the pairing control
- // block.
- pairing_cb = {};
- } else {
- // Report empty UUID to Java if SDP report negative result while
- // pairing.
- bt_property_t prop;
- Uuid uuid;
+ // Both SDP and bonding are done, clear pairing control block in case
+ // it is not already cleared
+ pairing_cb = {};
- prop.type = BT_PROPERTY_UUIDS;
- prop.val = &uuid;
- prop.len = Uuid::kNumBytes128;
+ // Send one empty UUID to Java to unblock pairing intent when SDP failed
+ // or no UUID is discovered
+ if (p_data->disc_res.result != BTA_SUCCESS ||
+ p_data->disc_res.num_uuids == 0) {
+ LOG_INFO(LOG_TAG,
+ "%s: SDP failed, send empty UUID to unblock bonding %s",
+ __func__, bd_addr.ToString().c_str());
+ bt_property_t prop;
+ Uuid uuid = {};
- /* Send the event to the BTIF */
- HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
- BT_STATUS_SUCCESS, &bd_addr, 1, &prop);
- break;
- }
+ prop.type = BT_PROPERTY_UUIDS;
+ prop.val = &uuid;
+ prop.len = Uuid::kNumBytes128;
+
+ /* Send the event to the BTIF */
+ HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
+ BT_STATUS_SUCCESS, &bd_addr, 1, &prop);
+ break;
}
}
@@ -2914,6 +2918,10 @@
break;
}
}
+ if (state == BT_BOND_STATE_BONDED && bd_addr != pairing_cb.static_bdaddr) {
+ // Report RPA bonding state to Java in crosskey paring
+ bond_state_changed(status, bd_addr, BT_BOND_STATE_BONDING);
+ }
bond_state_changed(status, bd_addr, state);
}