Loading system/stack/btm/btm_sec.cc +67 −70 Original line number Diff line number Diff line Loading @@ -103,7 +103,6 @@ static void btm_sec_collision_timeout(void* data); static void btm_restore_mode(void); static void btm_sec_pairing_timeout(void* data); static tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec); static void btm_sec_change_pairing_state(tBTM_PAIRING_STATE new_state); static void btm_sec_check_pending_reqs(void); static bool btm_sec_queue_mx_request(const RawAddress& bd_addr, uint16_t psm, Loading Loading @@ -521,13 +520,13 @@ void BTM_PINCodeReply(const RawAddress& bd_addr, tBTM_STATUS res, (btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE))) { /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed * event */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); acl_set_disconnect_reason(HCI_ERR_HOST_REJECT_SECURITY); btsnd_hcic_pin_code_neg_reply(bd_addr); } else { p_dev_rec->sec_rec.security_required = BTM_SEC_NONE; btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } return; } Loading Loading @@ -559,16 +558,16 @@ void BTM_PINCodeReply(const RawAddress& bd_addr, tBTM_STATUS res, /* we change state little bit early so btm_sec_connected() will originate * connection */ /* when existing ACL link is down completely */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); } /* if we already accepted incoming connection from pairing device */ else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) { LOG_WARN( "BTM_PINCodeReply(): link is connecting so wait pin code request " "from peer"); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); } else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); p_dev_rec->sec_rec.sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; NotifyBondingChange(*p_dev_rec, HCI_ERR_AUTH_FAILURE); Loading @@ -576,7 +575,7 @@ void BTM_PINCodeReply(const RawAddress& bd_addr, tBTM_STATUS res, return; } btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); acl_set_disconnect_reason(HCI_SUCCESS); btsnd_hcic_pin_code_req_reply(bd_addr, pin_len, p_pin); Loading Loading @@ -656,7 +655,7 @@ tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, if (SMP_Pair(bd_addr, addr_type) == SMP_STARTED) { btm_sec_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; p_dev_rec->sec_rec.sec_state = BTM_SEC_STATE_AUTHENTICATING; btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); return BTM_CMD_STARTED; } Loading Loading @@ -693,7 +692,7 @@ tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, if (BTM_IsAclConnectionUpAndHandleValid(bd_addr, transport)) { btm_sec_wait_and_start_authentication(p_dev_rec); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); /* Mark lcb as bonding */ l2cu_update_lcb_4_bonding(bd_addr, true); Loading @@ -713,11 +712,11 @@ tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, /* we are not accepting connection request from peer * -> RNR (to learn if peer is 2.1) * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); status = BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); } else { /* We are accepting connection request from peer */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); status = BTM_CMD_STARTED; } LOG_VERBOSE("State:%s sm4: 0x%x sec_state:%d", Loading @@ -731,7 +730,7 @@ tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, if (status != BTM_CMD_STARTED) { LOG_ERROR("BTM_ReadRemoteDeviceName or btm_sec_dd_create_conn error: 0x%x", (int)status); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } return status; Loading Loading @@ -1169,7 +1168,7 @@ void BTM_ConfirmReqReply(tBTM_STATUS res, const RawAddress& bd_addr) { BTM_LogHistory(kBtmLogTag, bd_addr, "Confirm reply", base::StringPrintf("status:%s", btm_status_text(res).c_str())); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); if ((res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY)) { acl_set_disconnect_reason(HCI_SUCCESS); Loading Loading @@ -1224,7 +1223,7 @@ void BTM_PasskeyReqReply(tBTM_STATUS res, const RawAddress& bd_addr, p_dev_rec->sec_rec.sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); return; } } else if (btm_sec_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY) Loading @@ -1232,7 +1231,7 @@ void BTM_PasskeyReqReply(tBTM_STATUS res, const RawAddress& bd_addr, if (passkey > BTM_MAX_PASSKEY_VAL) res = BTM_ILLEGAL_VALUE; btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); if (res != BTM_SUCCESS) { /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed Loading Loading @@ -1275,7 +1274,7 @@ void BTM_RemoteOobDataReply(tBTM_STATUS res, const RawAddress& bd_addr, /* If timeout already expired or has been canceled, ignore the reply */ if (btm_sec_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) return; btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); if (res != BTM_SUCCESS) { /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed Loading Loading @@ -1951,7 +1950,7 @@ static void btm_sec_bond_cancel_complete(void) { */ p_dev_rec = btm_find_dev(btm_sec_cb.pairing_bda); if (p_dev_rec != NULL) p_dev_rec->sec_rec.security_required = BTM_SEC_NONE; btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); /* Notify application that the cancel succeeded */ if (btm_sec_cb.api.p_bond_cancel_cmpl_callback) Loading Loading @@ -2115,7 +2114,7 @@ static tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec) { if (BTM_IsAclConnectionUp(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR)) { return BTM_SUCCESS; } btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); return BTM_CMD_STARTED; } else if (status == BTM_NO_RESOURCES) { return BTM_NO_RESOURCES; Loading @@ -2127,7 +2126,7 @@ static tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec) { LOG_INFO("Security Manager: %s", ADDRESS_TO_LOGGABLE_CSTR(p_dev_rec->bd_addr)); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); return (BTM_CMD_STARTED); } Loading Loading @@ -2267,7 +2266,7 @@ void btm_sec_rmt_name_request_complete(const RawAddress* p_bd_addr, } /* Set the same state again to force the timer to be restarted */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); return; } Loading @@ -2282,7 +2281,7 @@ void btm_sec_rmt_name_request_complete(const RawAddress* p_bd_addr, } if (status != HCI_SUCCESS) { btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); return NotifyBondingChange(*p_dev_rec, status); } Loading Loading @@ -2326,7 +2325,7 @@ void btm_sec_rmt_name_request_complete(const RawAddress* p_bd_addr, } else if (req_status != BTM_CMD_STARTED) { LOG_WARN("failed to start connection"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); NotifyBondingChange(*p_dev_rec, HCI_ERR_MEMORY_FULL); } Loading Loading @@ -2560,7 +2559,7 @@ void btm_io_capabilities_req(RawAddress p) { if (evt_data.bd_addr == btm_sec_cb.connecting_bda) memcpy(p_dev_rec->dev_class, btm_sec_cb.connecting_dc, DEV_CLASS_LEN); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) { p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE; Loading Loading @@ -2622,7 +2621,7 @@ void btm_io_capabilities_rsp(const tBTM_SP_IO_RSP evt_data) { if (btm_sec_cb.pairing_state == BTM_PAIR_STATE_IDLE) { btm_sec_cb.pairing_bda = evt_data.bd_addr; btm_sec_change_pairing_state(BTM_PAIR_STATE_INCOMING_SSP); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_INCOMING_SSP); /* work around for FW bug */ btm_inq_stop_on_ssp(); Loading Loading @@ -2692,7 +2691,7 @@ void btm_proc_sp_req_evt(tBTM_SP_EVT event, const RawAddress bda, switch (event) { case BTM_SP_CFM_REQ_EVT: /* Numeric confirmation. Need user to conf the passkey */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); /* The device record must be allocated in the "IO cap exchange" step */ evt_data.cfm_req.num_val = value; Loading Loading @@ -2744,13 +2743,13 @@ void btm_proc_sp_req_evt(tBTM_SP_EVT event, const RawAddress bda, LOG_VERBOSE("BTM_SP_KEY_NOTIF_EVT: passkey: %u", evt_data.key_notif.passkey); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); break; case BTM_SP_KEY_REQ_EVT: if (btm_sec_cb.devcb.loc_io_caps != BTM_IO_CAP_NONE) { /* HCI_USER_PASSKEY_REQUEST_EVT */ btm_sec_change_pairing_state(BTM_PAIR_STATE_KEY_ENTRY); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_KEY_ENTRY); } break; } Loading Loading @@ -2830,7 +2829,7 @@ void btm_simple_pair_complete(const RawAddress bd_addr, uint8_t status) { p_dev_rec->sec_rec.sec_flags |= BTM_SEC_AUTHENTICATED; } else if (status == HCI_ERR_PAIRING_NOT_ALLOWED) { /* The test spec wants the peer device to get this failure code. */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_DISCONNECT); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_DISCONNECT); /* Change the timer to 1 second */ alarm_set_on_mloop(btm_sec_cb.pairing_timer, BT_1SEC_TIMEOUT_MS, Loading Loading @@ -2887,7 +2886,7 @@ void btm_rem_oob_req(const RawAddress bd_addr) { strlcpy((char*)evt_data.bd_name, (char*)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN + 1); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); if ((*btm_sec_cb.api.p_sp_callback)(BTM_SP_RMT_OOB_EVT, (tBTM_SP_EVT_DATA*)&evt_data) == BTM_NOT_AUTHORIZED) { Loading Loading @@ -3077,7 +3076,7 @@ void btm_sec_auth_complete(uint16_t handle, tHCI_STATUS status) { if (btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) { are_bonding = true; } btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } if (was_authenticating == false) { Loading Loading @@ -3360,7 +3359,7 @@ static void btm_sec_connect_after_reject_timeout(void* /* data */) { if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { LOG_WARN("Security Manager: failed to start connection"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); NotifyBondingChange(*p_dev_rec, HCI_ERR_MEMORY_FULL); } Loading Loading @@ -3404,7 +3403,7 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, btm_sec_cb.pairing_bda == bda) { LOG_WARN("Connection failed during bonding attempt peer:%s reason:%s", ADDRESS_TO_LOGGABLE_CSTR(bda), hci_error_code_text(status).c_str()); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } LOG_DEBUG("Ignoring failed device connection peer:%s reason:%s", Loading Loading @@ -3448,12 +3447,12 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, } else { /* remote device name is unknowm, start getting remote name first */ btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); if (BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR) != BTM_CMD_STARTED) { LOG_ERROR("cannot read remote name"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } } return; Loading Loading @@ -3483,11 +3482,11 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, btm_sec_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT; if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); if (BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR) != BTM_CMD_STARTED) { LOG_ERROR("cannot read remote name"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } return; } Loading Loading @@ -3526,7 +3525,7 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, LOG_VERBOSE("security_required:%x ", p_dev_rec->sec_rec.security_required); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); /* We need to notify host that the key is not known any more */ NotifyBondingChange(*p_dev_rec, status); Loading Loading @@ -3600,7 +3599,7 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, /* remember flag before it is initialized */ const bool is_pair_flags_we_started_dd = btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD; btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); if (is_pair_flags_we_started_dd) { /* Let l2cap start bond timer */ Loading Loading @@ -3710,7 +3709,7 @@ void btm_sec_disconnected(uint16_t handle, tHCI_REASON reason, (btm_sec_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); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); p_dev_rec->sec_rec.sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; /* If the disconnection reason is REPEATED_ATTEMPTS, Loading Loading @@ -3915,7 +3914,7 @@ void btm_sec_link_key_notification(const RawAddress& p_bda, if (btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) we_are_bonding = true; else btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } /* save LTK derived LK no matter what */ Loading Loading @@ -4053,7 +4052,7 @@ static void btm_sec_pairing_timeout(void* /* data */) { case BTM_PAIR_STATE_WAIT_LOCAL_PIN: if ((btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0) btsnd_hcic_pin_code_neg_reply(p_cb->pairing_bda); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); /* We need to notify the UI that no longer need the PIN */ if (btm_sec_cb.api.p_auth_complete_callback) { if (p_dev_rec == NULL) { Loading @@ -4067,14 +4066,14 @@ static void btm_sec_pairing_timeout(void* /* data */) { case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: btsnd_hcic_user_conf_reply(p_cb->pairing_bda, false); /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ /* btm_sec_cb.change_pairing_state (BTM_PAIR_STATE_IDLE); */ break; case BTM_PAIR_STATE_KEY_ENTRY: if (btm_sec_cb.devcb.loc_io_caps != BTM_IO_CAP_NONE) { btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda); } else { btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } break; Loading @@ -4083,12 +4082,12 @@ static void btm_sec_pairing_timeout(void* /* data */) { btsnd_hcic_io_cap_req_reply(p_cb->pairing_bda, btm_sec_cb.devcb.loc_io_caps, BTM_OOB_NONE, auth_req); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); break; case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: btsnd_hcic_rem_oob_neg_reply(p_cb->pairing_bda); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); break; case BTM_PAIR_STATE_WAIT_DISCONNECT: Loading @@ -4103,14 +4102,14 @@ static void btm_sec_pairing_timeout(void* /* data */) { btm_sec_send_hci_disconnect( p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle, "stack::btm::btm_sec::btm_sec_pairing_timeout"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); break; case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: case BTM_PAIR_STATE_GET_REM_NAME: /* We need to notify the UI that timeout has happened while waiting for * authentication*/ btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); if (btm_sec_cb.api.p_auth_complete_callback) { if (p_dev_rec == NULL) { name[0] = 0; Loading @@ -4125,7 +4124,7 @@ static void btm_sec_pairing_timeout(void* /* data */) { default: LOG_WARN("not processed state: %s", tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state)); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); break; } } Loading Loading @@ -4183,7 +4182,7 @@ void btm_sec_pin_code_request(const RawAddress p_bda) { if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) { LOG_VERBOSE("btm_sec_pin_code_request fixed pin replying"); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btsnd_hcic_pin_code_req_reply(p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code); return; Loading @@ -4209,7 +4208,7 @@ void btm_sec_pin_code_request(const RawAddress p_bda) { /* is not forced to be secure - found a FW issue, so we can not do this btm_restore_mode(); */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); } /* If pairing disabled OR (no PIN callback and not bonding) */ Loading @@ -4236,7 +4235,7 @@ void btm_sec_pin_code_request(const RawAddress p_bda) { } /* Notify upper layer of PIN request and start expiration timer */ else { btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); /* Pin code request can not come at the same time as connection request */ p_cb->connecting_bda = p_bda; memcpy(p_cb->connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); Loading Loading @@ -4594,47 +4593,45 @@ static void btm_restore_mode(void) { /******************************************************************************* * * Function btm_sec_change_pairing_state * Function change_pairing_state * * Description This function is called to change pairing state * ******************************************************************************/ static void btm_sec_change_pairing_state(tBTM_PAIRING_STATE new_state) { tBTM_PAIRING_STATE old_state = btm_sec_cb.pairing_state; void tBTM_SEC_CB::change_pairing_state(tBTM_PAIRING_STATE new_state) { tBTM_PAIRING_STATE old_state = pairing_state; LOG_DEBUG("Pairing state changed %s => %s pairing_flags:0x%x", tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state), tBTM_SEC_CB::btm_pair_state_descr(new_state), btm_sec_cb.pairing_flags); tBTM_SEC_CB::btm_pair_state_descr(pairing_state), tBTM_SEC_CB::btm_pair_state_descr(new_state), pairing_flags); if (btm_sec_cb.pairing_state != new_state) { if (pairing_state != new_state) { BTM_LogHistory( kBtmLogTag, btm_sec_cb.pairing_bda, "Pairing state changed", base::StringPrintf( "%s => %s", tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state), base::StringPrintf("%s => %s", tBTM_SEC_CB::btm_pair_state_descr(pairing_state), tBTM_SEC_CB::btm_pair_state_descr(new_state))); } btm_sec_cb.pairing_state = new_state; pairing_state = new_state; if (new_state == BTM_PAIR_STATE_IDLE) { alarm_cancel(btm_sec_cb.pairing_timer); alarm_cancel(pairing_timer); btm_sec_cb.pairing_flags = 0; btm_sec_cb.pin_code_len = 0; pairing_flags = 0; pin_code_len = 0; /* Make sure the the lcb shows we are not bonding */ l2cu_update_lcb_4_bonding(btm_sec_cb.pairing_bda, false); l2cu_update_lcb_4_bonding(pairing_bda, false); btm_restore_mode(); btm_sec_check_pending_reqs(); btm_inq_clear_ssp(); btm_sec_cb.pairing_bda = RawAddress::kAny; pairing_bda = RawAddress::kAny; } else { /* If transitioning out of idle, mark the lcb as bonding */ if (old_state == BTM_PAIR_STATE_IDLE) l2cu_update_lcb_4_bonding(btm_sec_cb.pairing_bda, true); l2cu_update_lcb_4_bonding(pairing_bda, true); alarm_set_on_mloop(btm_sec_cb.pairing_timer, BTM_SEC_TIMEOUT_VALUE * 1000, btm_sec_pairing_timeout, NULL); Loading Loading @@ -4767,7 +4764,7 @@ static bool btm_sec_check_prefetch_pin(tBTM_SEC_DEV_REC* p_dev_rec) { btsnd_hcic_write_auth_enable(true); } } else { btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); /* If we got a PIN, use that, else try to get one */ if (btm_sec_cb.pin_code_len) { Loading system/stack/btm/btm_sec_cb.h +2 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,8 @@ class tBTM_SEC_CB { uint8_t RemoveServiceById(uint8_t service_id); uint8_t RemoveServiceByPsm(uint16_t psm); void change_pairing_state(tBTM_PAIRING_STATE new_state); // misc static methods static const char* btm_pair_state_descr(tBTM_PAIRING_STATE state); }; Loading Loading
system/stack/btm/btm_sec.cc +67 −70 Original line number Diff line number Diff line Loading @@ -103,7 +103,6 @@ static void btm_sec_collision_timeout(void* data); static void btm_restore_mode(void); static void btm_sec_pairing_timeout(void* data); static tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec); static void btm_sec_change_pairing_state(tBTM_PAIRING_STATE new_state); static void btm_sec_check_pending_reqs(void); static bool btm_sec_queue_mx_request(const RawAddress& bd_addr, uint16_t psm, Loading Loading @@ -521,13 +520,13 @@ void BTM_PINCodeReply(const RawAddress& bd_addr, tBTM_STATUS res, (btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_DISC_WHEN_DONE))) { /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed * event */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); acl_set_disconnect_reason(HCI_ERR_HOST_REJECT_SECURITY); btsnd_hcic_pin_code_neg_reply(bd_addr); } else { p_dev_rec->sec_rec.security_required = BTM_SEC_NONE; btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } return; } Loading Loading @@ -559,16 +558,16 @@ void BTM_PINCodeReply(const RawAddress& bd_addr, tBTM_STATUS res, /* we change state little bit early so btm_sec_connected() will originate * connection */ /* when existing ACL link is down completely */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); } /* if we already accepted incoming connection from pairing device */ else if (p_dev_rec->sm4 & BTM_SM4_CONN_PEND) { LOG_WARN( "BTM_PINCodeReply(): link is connecting so wait pin code request " "from peer"); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); } else if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); p_dev_rec->sec_rec.sec_flags &= ~BTM_SEC_LINK_KEY_AUTHED; NotifyBondingChange(*p_dev_rec, HCI_ERR_AUTH_FAILURE); Loading @@ -576,7 +575,7 @@ void BTM_PINCodeReply(const RawAddress& bd_addr, tBTM_STATUS res, return; } btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); acl_set_disconnect_reason(HCI_SUCCESS); btsnd_hcic_pin_code_req_reply(bd_addr, pin_len, p_pin); Loading Loading @@ -656,7 +655,7 @@ tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, if (SMP_Pair(bd_addr, addr_type) == SMP_STARTED) { btm_sec_cb.pairing_flags |= BTM_PAIR_FLAGS_LE_ACTIVE; p_dev_rec->sec_rec.sec_state = BTM_SEC_STATE_AUTHENTICATING; btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); return BTM_CMD_STARTED; } Loading Loading @@ -693,7 +692,7 @@ tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, if (BTM_IsAclConnectionUpAndHandleValid(bd_addr, transport)) { btm_sec_wait_and_start_authentication(p_dev_rec); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); /* Mark lcb as bonding */ l2cu_update_lcb_4_bonding(bd_addr, true); Loading @@ -713,11 +712,11 @@ tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, /* we are not accepting connection request from peer * -> RNR (to learn if peer is 2.1) * RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); status = BTM_ReadRemoteDeviceName(bd_addr, NULL, BT_TRANSPORT_BR_EDR); } else { /* We are accepting connection request from peer */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); status = BTM_CMD_STARTED; } LOG_VERBOSE("State:%s sm4: 0x%x sec_state:%d", Loading @@ -731,7 +730,7 @@ tBTM_STATUS btm_sec_bond_by_transport(const RawAddress& bd_addr, if (status != BTM_CMD_STARTED) { LOG_ERROR("BTM_ReadRemoteDeviceName or btm_sec_dd_create_conn error: 0x%x", (int)status); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } return status; Loading Loading @@ -1169,7 +1168,7 @@ void BTM_ConfirmReqReply(tBTM_STATUS res, const RawAddress& bd_addr) { BTM_LogHistory(kBtmLogTag, bd_addr, "Confirm reply", base::StringPrintf("status:%s", btm_status_text(res).c_str())); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); if ((res == BTM_SUCCESS) || (res == BTM_SUCCESS_NO_SECURITY)) { acl_set_disconnect_reason(HCI_SUCCESS); Loading Loading @@ -1224,7 +1223,7 @@ void BTM_PasskeyReqReply(tBTM_STATUS res, const RawAddress& bd_addr, p_dev_rec->sec_rec.sec_flags &= ~(BTM_SEC_LINK_KEY_AUTHED | BTM_SEC_LINK_KEY_KNOWN); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); return; } } else if (btm_sec_cb.pairing_state != BTM_PAIR_STATE_KEY_ENTRY) Loading @@ -1232,7 +1231,7 @@ void BTM_PasskeyReqReply(tBTM_STATUS res, const RawAddress& bd_addr, if (passkey > BTM_MAX_PASSKEY_VAL) res = BTM_ILLEGAL_VALUE; btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); if (res != BTM_SUCCESS) { /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed Loading Loading @@ -1275,7 +1274,7 @@ void BTM_RemoteOobDataReply(tBTM_STATUS res, const RawAddress& bd_addr, /* If timeout already expired or has been canceled, ignore the reply */ if (btm_sec_cb.pairing_state != BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP) return; btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); if (res != BTM_SUCCESS) { /* use BTM_PAIR_STATE_WAIT_AUTH_COMPLETE to report authentication failed Loading Loading @@ -1951,7 +1950,7 @@ static void btm_sec_bond_cancel_complete(void) { */ p_dev_rec = btm_find_dev(btm_sec_cb.pairing_bda); if (p_dev_rec != NULL) p_dev_rec->sec_rec.security_required = BTM_SEC_NONE; btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); /* Notify application that the cancel succeeded */ if (btm_sec_cb.api.p_bond_cancel_cmpl_callback) Loading Loading @@ -2115,7 +2114,7 @@ static tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec) { if (BTM_IsAclConnectionUp(p_dev_rec->bd_addr, BT_TRANSPORT_BR_EDR)) { return BTM_SUCCESS; } btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); return BTM_CMD_STARTED; } else if (status == BTM_NO_RESOURCES) { return BTM_NO_RESOURCES; Loading @@ -2127,7 +2126,7 @@ static tBTM_STATUS btm_sec_dd_create_conn(tBTM_SEC_DEV_REC* p_dev_rec) { LOG_INFO("Security Manager: %s", ADDRESS_TO_LOGGABLE_CSTR(p_dev_rec->bd_addr)); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_PIN_REQ); return (BTM_CMD_STARTED); } Loading Loading @@ -2267,7 +2266,7 @@ void btm_sec_rmt_name_request_complete(const RawAddress* p_bd_addr, } /* Set the same state again to force the timer to be restarted */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); return; } Loading @@ -2282,7 +2281,7 @@ void btm_sec_rmt_name_request_complete(const RawAddress* p_bd_addr, } if (status != HCI_SUCCESS) { btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); return NotifyBondingChange(*p_dev_rec, status); } Loading Loading @@ -2326,7 +2325,7 @@ void btm_sec_rmt_name_request_complete(const RawAddress* p_bd_addr, } else if (req_status != BTM_CMD_STARTED) { LOG_WARN("failed to start connection"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); NotifyBondingChange(*p_dev_rec, HCI_ERR_MEMORY_FULL); } Loading Loading @@ -2560,7 +2559,7 @@ void btm_io_capabilities_req(RawAddress p) { if (evt_data.bd_addr == btm_sec_cb.connecting_bda) memcpy(p_dev_rec->dev_class, btm_sec_cb.connecting_dc, DEV_CLASS_LEN); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_IOCAPS); if (p_dev_rec->sm4 & BTM_SM4_UPGRADE) { p_dev_rec->sm4 &= ~BTM_SM4_UPGRADE; Loading Loading @@ -2622,7 +2621,7 @@ void btm_io_capabilities_rsp(const tBTM_SP_IO_RSP evt_data) { if (btm_sec_cb.pairing_state == BTM_PAIR_STATE_IDLE) { btm_sec_cb.pairing_bda = evt_data.bd_addr; btm_sec_change_pairing_state(BTM_PAIR_STATE_INCOMING_SSP); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_INCOMING_SSP); /* work around for FW bug */ btm_inq_stop_on_ssp(); Loading Loading @@ -2692,7 +2691,7 @@ void btm_proc_sp_req_evt(tBTM_SP_EVT event, const RawAddress bda, switch (event) { case BTM_SP_CFM_REQ_EVT: /* Numeric confirmation. Need user to conf the passkey */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM); /* The device record must be allocated in the "IO cap exchange" step */ evt_data.cfm_req.num_val = value; Loading Loading @@ -2744,13 +2743,13 @@ void btm_proc_sp_req_evt(tBTM_SP_EVT event, const RawAddress bda, LOG_VERBOSE("BTM_SP_KEY_NOTIF_EVT: passkey: %u", evt_data.key_notif.passkey); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); break; case BTM_SP_KEY_REQ_EVT: if (btm_sec_cb.devcb.loc_io_caps != BTM_IO_CAP_NONE) { /* HCI_USER_PASSKEY_REQUEST_EVT */ btm_sec_change_pairing_state(BTM_PAIR_STATE_KEY_ENTRY); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_KEY_ENTRY); } break; } Loading Loading @@ -2830,7 +2829,7 @@ void btm_simple_pair_complete(const RawAddress bd_addr, uint8_t status) { p_dev_rec->sec_rec.sec_flags |= BTM_SEC_AUTHENTICATED; } else if (status == HCI_ERR_PAIRING_NOT_ALLOWED) { /* The test spec wants the peer device to get this failure code. */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_DISCONNECT); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_DISCONNECT); /* Change the timer to 1 second */ alarm_set_on_mloop(btm_sec_cb.pairing_timer, BT_1SEC_TIMEOUT_MS, Loading Loading @@ -2887,7 +2886,7 @@ void btm_rem_oob_req(const RawAddress bd_addr) { strlcpy((char*)evt_data.bd_name, (char*)p_dev_rec->sec_bd_name, BTM_MAX_REM_BD_NAME_LEN + 1); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP); if ((*btm_sec_cb.api.p_sp_callback)(BTM_SP_RMT_OOB_EVT, (tBTM_SP_EVT_DATA*)&evt_data) == BTM_NOT_AUTHORIZED) { Loading Loading @@ -3077,7 +3076,7 @@ void btm_sec_auth_complete(uint16_t handle, tHCI_STATUS status) { if (btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) { are_bonding = true; } btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } if (was_authenticating == false) { Loading Loading @@ -3360,7 +3359,7 @@ static void btm_sec_connect_after_reject_timeout(void* /* data */) { if (btm_sec_dd_create_conn(p_dev_rec) != BTM_CMD_STARTED) { LOG_WARN("Security Manager: failed to start connection"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); NotifyBondingChange(*p_dev_rec, HCI_ERR_MEMORY_FULL); } Loading Loading @@ -3404,7 +3403,7 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, btm_sec_cb.pairing_bda == bda) { LOG_WARN("Connection failed during bonding attempt peer:%s reason:%s", ADDRESS_TO_LOGGABLE_CSTR(bda), hci_error_code_text(status).c_str()); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } LOG_DEBUG("Ignoring failed device connection peer:%s reason:%s", Loading Loading @@ -3448,12 +3447,12 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, } else { /* remote device name is unknowm, start getting remote name first */ btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); if (BTM_ReadRemoteDeviceName(p_dev_rec->bd_addr, NULL, BT_TRANSPORT_BR_EDR) != BTM_CMD_STARTED) { LOG_ERROR("cannot read remote name"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } } return; Loading Loading @@ -3483,11 +3482,11 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, btm_sec_cb.pairing_flags &= ~BTM_PAIR_FLAGS_REJECTED_CONNECT; if (BTM_SEC_IS_SM4_UNKNOWN(p_dev_rec->sm4)) { /* Try again: RNR when no ACL causes HCI_RMT_HOST_SUP_FEAT_NOTIFY_EVT */ btm_sec_change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_GET_REM_NAME); if (BTM_ReadRemoteDeviceName(bda, NULL, BT_TRANSPORT_BR_EDR) != BTM_CMD_STARTED) { LOG_ERROR("cannot read remote name"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } return; } Loading Loading @@ -3526,7 +3525,7 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, LOG_VERBOSE("security_required:%x ", p_dev_rec->sec_rec.security_required); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); /* We need to notify host that the key is not known any more */ NotifyBondingChange(*p_dev_rec, status); Loading Loading @@ -3600,7 +3599,7 @@ void btm_sec_connected(const RawAddress& bda, uint16_t handle, /* remember flag before it is initialized */ const bool is_pair_flags_we_started_dd = btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD; btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); if (is_pair_flags_we_started_dd) { /* Let l2cap start bond timer */ Loading Loading @@ -3710,7 +3709,7 @@ void btm_sec_disconnected(uint16_t handle, tHCI_REASON reason, (btm_sec_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); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); p_dev_rec->sec_rec.sec_flags &= ~BTM_SEC_LINK_KEY_KNOWN; /* If the disconnection reason is REPEATED_ATTEMPTS, Loading Loading @@ -3915,7 +3914,7 @@ void btm_sec_link_key_notification(const RawAddress& p_bda, if (btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_WE_STARTED_DD) we_are_bonding = true; else btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } /* save LTK derived LK no matter what */ Loading Loading @@ -4053,7 +4052,7 @@ static void btm_sec_pairing_timeout(void* /* data */) { case BTM_PAIR_STATE_WAIT_LOCAL_PIN: if ((btm_sec_cb.pairing_flags & BTM_PAIR_FLAGS_PRE_FETCH_PIN) == 0) btsnd_hcic_pin_code_neg_reply(p_cb->pairing_bda); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); /* We need to notify the UI that no longer need the PIN */ if (btm_sec_cb.api.p_auth_complete_callback) { if (p_dev_rec == NULL) { Loading @@ -4067,14 +4066,14 @@ static void btm_sec_pairing_timeout(void* /* data */) { case BTM_PAIR_STATE_WAIT_NUMERIC_CONFIRM: btsnd_hcic_user_conf_reply(p_cb->pairing_bda, false); /* btm_sec_change_pairing_state (BTM_PAIR_STATE_IDLE); */ /* btm_sec_cb.change_pairing_state (BTM_PAIR_STATE_IDLE); */ break; case BTM_PAIR_STATE_KEY_ENTRY: if (btm_sec_cb.devcb.loc_io_caps != BTM_IO_CAP_NONE) { btsnd_hcic_user_passkey_neg_reply(p_cb->pairing_bda); } else { btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); } break; Loading @@ -4083,12 +4082,12 @@ static void btm_sec_pairing_timeout(void* /* data */) { btsnd_hcic_io_cap_req_reply(p_cb->pairing_bda, btm_sec_cb.devcb.loc_io_caps, BTM_OOB_NONE, auth_req); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); break; case BTM_PAIR_STATE_WAIT_LOCAL_OOB_RSP: btsnd_hcic_rem_oob_neg_reply(p_cb->pairing_bda); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); break; case BTM_PAIR_STATE_WAIT_DISCONNECT: Loading @@ -4103,14 +4102,14 @@ static void btm_sec_pairing_timeout(void* /* data */) { btm_sec_send_hci_disconnect( p_dev_rec, HCI_ERR_AUTH_FAILURE, p_dev_rec->hci_handle, "stack::btm::btm_sec::btm_sec_pairing_timeout"); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); break; case BTM_PAIR_STATE_WAIT_AUTH_COMPLETE: case BTM_PAIR_STATE_GET_REM_NAME: /* We need to notify the UI that timeout has happened while waiting for * authentication*/ btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); if (btm_sec_cb.api.p_auth_complete_callback) { if (p_dev_rec == NULL) { name[0] = 0; Loading @@ -4125,7 +4124,7 @@ static void btm_sec_pairing_timeout(void* /* data */) { default: LOG_WARN("not processed state: %s", tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state)); btm_sec_change_pairing_state(BTM_PAIR_STATE_IDLE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_IDLE); break; } } Loading Loading @@ -4183,7 +4182,7 @@ void btm_sec_pin_code_request(const RawAddress p_bda) { if (!p_cb->pairing_disabled && (p_cb->cfg.pin_type == HCI_PIN_TYPE_FIXED)) { LOG_VERBOSE("btm_sec_pin_code_request fixed pin replying"); btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btsnd_hcic_pin_code_req_reply(p_bda, p_cb->cfg.pin_code_len, p_cb->cfg.pin_code); return; Loading @@ -4209,7 +4208,7 @@ void btm_sec_pin_code_request(const RawAddress p_bda) { /* is not forced to be secure - found a FW issue, so we can not do this btm_restore_mode(); */ btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_AUTH_COMPLETE); } /* If pairing disabled OR (no PIN callback and not bonding) */ Loading @@ -4236,7 +4235,7 @@ void btm_sec_pin_code_request(const RawAddress p_bda) { } /* Notify upper layer of PIN request and start expiration timer */ else { btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); /* Pin code request can not come at the same time as connection request */ p_cb->connecting_bda = p_bda; memcpy(p_cb->connecting_dc, p_dev_rec->dev_class, DEV_CLASS_LEN); Loading Loading @@ -4594,47 +4593,45 @@ static void btm_restore_mode(void) { /******************************************************************************* * * Function btm_sec_change_pairing_state * Function change_pairing_state * * Description This function is called to change pairing state * ******************************************************************************/ static void btm_sec_change_pairing_state(tBTM_PAIRING_STATE new_state) { tBTM_PAIRING_STATE old_state = btm_sec_cb.pairing_state; void tBTM_SEC_CB::change_pairing_state(tBTM_PAIRING_STATE new_state) { tBTM_PAIRING_STATE old_state = pairing_state; LOG_DEBUG("Pairing state changed %s => %s pairing_flags:0x%x", tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state), tBTM_SEC_CB::btm_pair_state_descr(new_state), btm_sec_cb.pairing_flags); tBTM_SEC_CB::btm_pair_state_descr(pairing_state), tBTM_SEC_CB::btm_pair_state_descr(new_state), pairing_flags); if (btm_sec_cb.pairing_state != new_state) { if (pairing_state != new_state) { BTM_LogHistory( kBtmLogTag, btm_sec_cb.pairing_bda, "Pairing state changed", base::StringPrintf( "%s => %s", tBTM_SEC_CB::btm_pair_state_descr(btm_sec_cb.pairing_state), base::StringPrintf("%s => %s", tBTM_SEC_CB::btm_pair_state_descr(pairing_state), tBTM_SEC_CB::btm_pair_state_descr(new_state))); } btm_sec_cb.pairing_state = new_state; pairing_state = new_state; if (new_state == BTM_PAIR_STATE_IDLE) { alarm_cancel(btm_sec_cb.pairing_timer); alarm_cancel(pairing_timer); btm_sec_cb.pairing_flags = 0; btm_sec_cb.pin_code_len = 0; pairing_flags = 0; pin_code_len = 0; /* Make sure the the lcb shows we are not bonding */ l2cu_update_lcb_4_bonding(btm_sec_cb.pairing_bda, false); l2cu_update_lcb_4_bonding(pairing_bda, false); btm_restore_mode(); btm_sec_check_pending_reqs(); btm_inq_clear_ssp(); btm_sec_cb.pairing_bda = RawAddress::kAny; pairing_bda = RawAddress::kAny; } else { /* If transitioning out of idle, mark the lcb as bonding */ if (old_state == BTM_PAIR_STATE_IDLE) l2cu_update_lcb_4_bonding(btm_sec_cb.pairing_bda, true); l2cu_update_lcb_4_bonding(pairing_bda, true); alarm_set_on_mloop(btm_sec_cb.pairing_timer, BTM_SEC_TIMEOUT_VALUE * 1000, btm_sec_pairing_timeout, NULL); Loading Loading @@ -4767,7 +4764,7 @@ static bool btm_sec_check_prefetch_pin(tBTM_SEC_DEV_REC* p_dev_rec) { btsnd_hcic_write_auth_enable(true); } } else { btm_sec_change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); btm_sec_cb.change_pairing_state(BTM_PAIR_STATE_WAIT_LOCAL_PIN); /* If we got a PIN, use that, else try to get one */ if (btm_sec_cb.pin_code_len) { Loading
system/stack/btm/btm_sec_cb.h +2 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,8 @@ class tBTM_SEC_CB { uint8_t RemoveServiceById(uint8_t service_id); uint8_t RemoveServiceByPsm(uint16_t psm); void change_pairing_state(tBTM_PAIRING_STATE new_state); // misc static methods static const char* btm_pair_state_descr(tBTM_PAIRING_STATE state); }; Loading