Bluetooth: Terminate the link if pairing is cancelled
If user decides to cancel the ongoing pairing process (e.g. by clicking the cancel button on pairing/passkey window), abort any ongoing pairing and then terminate the link if it was created because of the pair device action. Signed-off-by: Manish Mandlik <mmandlik@google.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:

committed by
Johan Hedberg

parent
8208f5a9d4
commit
76b1399655
@@ -2931,7 +2931,7 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
|
||||
if (cp->addr.type == BDADDR_BREDR) {
|
||||
conn = hci_connect_acl(hdev, &cp->addr.bdaddr, sec_level,
|
||||
auth_type);
|
||||
auth_type, CONN_REASON_PAIR_DEVICE);
|
||||
} else {
|
||||
u8 addr_type = le_addr_type(cp->addr.type);
|
||||
struct hci_conn_params *p;
|
||||
@@ -2950,9 +2950,9 @@ static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
if (p->auto_connect == HCI_AUTO_CONN_EXPLICIT)
|
||||
p->auto_connect = HCI_AUTO_CONN_DISABLED;
|
||||
|
||||
conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr,
|
||||
addr_type, sec_level,
|
||||
HCI_LE_CONN_TIMEOUT);
|
||||
conn = hci_connect_le_scan(hdev, &cp->addr.bdaddr, addr_type,
|
||||
sec_level, HCI_LE_CONN_TIMEOUT,
|
||||
CONN_REASON_PAIR_DEVICE);
|
||||
}
|
||||
|
||||
if (IS_ERR(conn)) {
|
||||
@@ -3053,6 +3053,20 @@ static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||
|
||||
err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
|
||||
addr, sizeof(*addr));
|
||||
|
||||
/* Since user doesn't want to proceed with the connection, abort any
|
||||
* ongoing pairing and then terminate the link if it was created
|
||||
* because of the pair device action.
|
||||
*/
|
||||
if (addr->type == BDADDR_BREDR)
|
||||
hci_remove_link_key(hdev, &addr->bdaddr);
|
||||
else
|
||||
smp_cancel_and_remove_pairing(hdev, &addr->bdaddr,
|
||||
le_addr_type(addr->type));
|
||||
|
||||
if (conn->conn_reason == CONN_REASON_PAIR_DEVICE)
|
||||
hci_abort_conn(conn, HCI_ERROR_REMOTE_USER_TERM);
|
||||
|
||||
unlock:
|
||||
hci_dev_unlock(hdev);
|
||||
return err;
|
||||
|
Reference in New Issue
Block a user