Bluetooth: Fix mgmt pairing failure when authentication fails
Whether through HCI with BR/EDR or SMP with LE when authentication fails we should also notify any pending Pair Device mgmt command. This patch updates the mgmt_auth_failed function to take the actual hci_conn object and makes sure that any pending pairing command is notified and cleaned up appropriately. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
Родитель
c68b7f127d
Коммит
e1e930f591
|
@ -1342,8 +1342,7 @@ int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||||
int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||||
u8 link_type, u8 addr_type, u32 passkey,
|
u8 link_type, u8 addr_type, u32 passkey,
|
||||||
u8 entered);
|
u8 entered);
|
||||||
void mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
void mgmt_auth_failed(struct hci_conn *conn, u8 status);
|
||||||
u8 addr_type, u8 status);
|
|
||||||
void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status);
|
void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status);
|
||||||
void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
|
void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
|
||||||
void mgmt_sc_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
|
void mgmt_sc_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
|
||||||
|
|
|
@ -2320,8 +2320,7 @@ static void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
||||||
conn->sec_level = conn->pending_sec_level;
|
conn->sec_level = conn->pending_sec_level;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
|
mgmt_auth_failed(conn, ev->status);
|
||||||
ev->status);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
|
clear_bit(HCI_CONN_AUTH_PEND, &conn->flags);
|
||||||
|
@ -3900,8 +3899,7 @@ static void hci_simple_pair_complete_evt(struct hci_dev *hdev,
|
||||||
* event gets always produced as initiator and is also mapped to
|
* event gets always produced as initiator and is also mapped to
|
||||||
* the mgmt_auth_failed event */
|
* the mgmt_auth_failed event */
|
||||||
if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
|
if (!test_bit(HCI_CONN_AUTH_PEND, &conn->flags) && ev->status)
|
||||||
mgmt_auth_failed(hdev, &conn->dst, conn->type, conn->dst_type,
|
mgmt_auth_failed(conn, ev->status);
|
||||||
ev->status);
|
|
||||||
|
|
||||||
hci_conn_drop(conn);
|
hci_conn_drop(conn);
|
||||||
|
|
||||||
|
|
|
@ -6485,16 +6485,23 @@ int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
|
||||||
return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL);
|
return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
|
void mgmt_auth_failed(struct hci_conn *conn, u8 hci_status)
|
||||||
u8 addr_type, u8 status)
|
|
||||||
{
|
{
|
||||||
struct mgmt_ev_auth_failed ev;
|
struct mgmt_ev_auth_failed ev;
|
||||||
|
struct pending_cmd *cmd;
|
||||||
|
u8 status = mgmt_status(hci_status);
|
||||||
|
|
||||||
bacpy(&ev.addr.bdaddr, bdaddr);
|
bacpy(&ev.addr.bdaddr, &conn->dst);
|
||||||
ev.addr.type = link_to_bdaddr(link_type, addr_type);
|
ev.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
|
||||||
ev.status = mgmt_status(status);
|
ev.status = status;
|
||||||
|
|
||||||
mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
|
cmd = find_pairing(conn);
|
||||||
|
|
||||||
|
mgmt_event(MGMT_EV_AUTH_FAILED, conn->hdev, &ev, sizeof(ev),
|
||||||
|
cmd ? cmd->sk : NULL);
|
||||||
|
|
||||||
|
if (cmd)
|
||||||
|
pairing_complete(cmd, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
|
void mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
|
||||||
|
|
|
@ -420,8 +420,7 @@ static void smp_failure(struct l2cap_conn *conn, u8 reason)
|
||||||
&reason);
|
&reason);
|
||||||
|
|
||||||
clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
|
clear_bit(HCI_CONN_ENCRYPT_PEND, &hcon->flags);
|
||||||
mgmt_auth_failed(hcon->hdev, &hcon->dst, hcon->type, hcon->dst_type,
|
mgmt_auth_failed(hcon, HCI_ERROR_AUTH_FAILURE);
|
||||||
HCI_ERROR_AUTH_FAILURE);
|
|
||||||
|
|
||||||
if (chan->data)
|
if (chan->data)
|
||||||
smp_chan_destroy(conn);
|
smp_chan_destroy(conn);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче