Streamline stack/btm/btm_sec::btm_sec_disconnected

Bug: 163134718
Test: cert
Tag: #refactor

Change-Id: I6dc0fcecc9abd8e29fafa1c60a92c471d394f49c
diff --git a/system/stack/btm/btm_sec.cc b/system/stack/btm/btm_sec.cc
index 3c1d8c2..397dab0 100644
--- a/system/stack/btm/btm_sec.cc
+++ b/system/stack/btm/btm_sec.cc
@@ -3630,10 +3630,7 @@
   return (btm_sec_send_hci_disconnect(p_dev_rec, reason, handle));
 }
 
-void btm_sec_disconnected(uint16_t handle, tHCI_STATUS reason) {
-  uint8_t old_pairing_flags = btm_cb.pairing_flags;
-  tHCI_STATUS result = HCI_ERR_AUTH_FAILURE;
-
+void btm_sec_disconnected(uint16_t handle, tHCI_REASON reason) {
   if ((reason != HCI_ERR_CONN_CAUSE_LOCAL_HOST) &&
       (reason != HCI_ERR_PEER_USER)) {
     LOG_WARN("Got uncommon disconnection reason:%s handle:0x%04x",
@@ -3643,12 +3640,12 @@
   btm_acl_resubmit_page();
 
   tBTM_SEC_DEV_REC* p_dev_rec = btm_find_dev_by_handle(handle);
-  if (!p_dev_rec) {
+  if (p_dev_rec == nullptr) {
     LOG_WARN("Got disconnect for unknown device record handle:0x%04x", handle);
     return;
   }
 
-  tBT_TRANSPORT transport =
+  const tBT_TRANSPORT transport =
       (handle == p_dev_rec->hci_handle) ? BT_TRANSPORT_BR_EDR : BT_TRANSPORT_LE;
 
   /* clear unused flags */
@@ -3656,39 +3653,42 @@
 
   /* If we are in the process of bonding we need to tell client that auth failed
    */
+  const uint8_t old_pairing_flags = btm_cb.pairing_flags;
   if ((btm_cb.pairing_state != BTM_PAIR_STATE_IDLE) &&
       (btm_cb.pairing_bda == p_dev_rec->bd_addr)) {
     LOG_DEBUG("Disconnected while pairing process active handle:0x%04x",
               handle);
     btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE);
     p_dev_rec->sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN;
-    if (btm_cb.api.p_auth_complete_callback) {
-      /* If the disconnection reason is REPEATED_ATTEMPTS,
-         send this error message to complete callback function
-         to display the error message of Repeated attempts.
-         All others, send HCI_ERR_AUTH_FAILURE. */
-      if (reason == HCI_ERR_REPEATED_ATTEMPTS) {
-        result = HCI_ERR_REPEATED_ATTEMPTS;
-      } else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) {
-        result = HCI_ERR_HOST_REJECT_SECURITY;
-      }
-      NotifyBondingChange(*p_dev_rec, result);
 
+    /* If the disconnection reason is REPEATED_ATTEMPTS,
+       send this error message to complete callback function
+       to display the error message of Repeated attempts.
+       All others, send HCI_ERR_AUTH_FAILURE. */
+    tHCI_STATUS status = HCI_ERR_AUTH_FAILURE;
+    if (reason == HCI_ERR_REPEATED_ATTEMPTS) {
+      status = HCI_ERR_REPEATED_ATTEMPTS;
+    } else if (old_pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) {
+      status = HCI_ERR_HOST_REJECT_SECURITY;
+    }
+    NotifyBondingChange(*p_dev_rec, status);
+
+    p_dev_rec = btm_find_dev_by_handle(handle);
+    if (p_dev_rec == nullptr) {
       // |btm_cb.api.p_auth_complete_callback| may cause |p_dev_rec| to be
       // deallocated.
-      p_dev_rec = btm_find_dev_by_handle(handle);
-      if (!p_dev_rec) {
-        return;
-      }
+      LOG_WARN("Device record was deallocated after user callback");
+      return;
     }
   }
 
-  VLOG(2) << __func__ << " bd_addr: " << p_dev_rec->bd_addr
-          << " name: " << p_dev_rec->sec_bd_name
-          << " state: " << btm_pair_state_descr(btm_cb.pairing_state)
-          << " reason: " << reason << " sec_req: " << std::hex
-          << p_dev_rec->security_required;
+  LOG_DEBUG(
+      "Disconnection complete device:%s name:%s state:%s reason:%s sec_req:%x",
+      PRIVATE_ADDRESS(p_dev_rec->bd_addr), p_dev_rec->sec_bd_name,
+      btm_pair_state_descr(btm_cb.pairing_state),
+      hci_reason_code_text(reason).c_str(), p_dev_rec->security_required);
 
+  // TODO Should this be gated by the transport check below ?
   btm_ble_update_mode_operation(HCI_ROLE_UNKNOWN, &p_dev_rec->bd_addr,
                                 HCI_SUCCESS);
   /* see sec_flags processing in btm_acl_removed */
@@ -3734,6 +3734,8 @@
   }
 
   if (p_dev_rec->sec_state == BTM_SEC_STATE_DISCONNECTING_BOTH) {
+    LOG_DEBUG("Waiting for other transport to disconnect current:%s",
+              BtTransportText(transport).c_str());
     p_dev_rec->sec_state = (transport == BT_TRANSPORT_LE)
                                ? BTM_SEC_STATE_DISCONNECTING
                                : BTM_SEC_STATE_DISCONNECTING_BLE;
@@ -3742,17 +3744,16 @@
   p_dev_rec->sec_state = BTM_SEC_STATE_IDLE;
   p_dev_rec->security_required = BTM_SEC_NONE;
 
-  tBTM_SEC_CALLBACK* p_callback = p_dev_rec->p_callback;
-
-  /* if security is pending, send callback to clean up the security state */
-  if (p_callback) {
-    BTM_TRACE_DEBUG("%s: clearing callback. p_dev_rec=%p, p_callback=%p",
-                    __func__, p_dev_rec, p_dev_rec->p_callback);
-    p_dev_rec->p_callback =
-        NULL; /* when the peer device time out the authentication before
-                 we do, this call back must be reset here */
+  if (p_dev_rec->p_callback != nullptr) {
+    tBTM_SEC_CALLBACK* p_callback = p_dev_rec->p_callback;
+    /* when the peer device time out the authentication before
+       we do, this call back must be reset here */
+    p_dev_rec->p_callback = nullptr;
     (*p_callback)(&p_dev_rec->bd_addr, transport, p_dev_rec->p_ref_data,
                   BTM_ERR_PROCESSING);
+    LOG_DEBUG("Cleaned up pending security state device:%s transport:%s",
+              PRIVATE_ADDRESS(p_dev_rec->bd_addr),
+              BtTransportText(transport).c_str());
   }
 }