Commit 1e91c29e authored by Johan Hedberg's avatar Johan Hedberg Committed by Marcel Holtmann

Bluetooth: Use hci_disconnect for immediate disconnection from SMP

Relying on the l2cap_conn_del procedure (triggered through the
l2cap_conn_shutdown API) to get the connection disconnected is not
reliable as it depends on all users releasing (through hci_conn_drop)
and that there's at least one user (so hci_conn_drop is called at least
one time).

A much simpler and more reliable solution is to call hci_disconnect()
directly from the SMP code when we want to disconnect. One side-effect
this has is that it prevents any SMP Failure PDU from being sent before
the disconnection, however neither one of the scenarios where
l2cap_conn_shutdown was used really requires this.
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent e31fb860
...@@ -829,7 +829,7 @@ static void smp_timeout(struct work_struct *work) ...@@ -829,7 +829,7 @@ static void smp_timeout(struct work_struct *work)
BT_DBG("conn %p", conn); BT_DBG("conn %p", conn);
l2cap_conn_shutdown(conn, ETIMEDOUT); hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM);
} }
static struct smp_chan *smp_chan_create(struct l2cap_conn *conn) static struct smp_chan *smp_chan_create(struct l2cap_conn *conn)
...@@ -1569,7 +1569,7 @@ static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb) ...@@ -1569,7 +1569,7 @@ static int smp_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
if (smp) if (smp)
cancel_delayed_work_sync(&smp->security_timer); cancel_delayed_work_sync(&smp->security_timer);
l2cap_conn_shutdown(chan->conn, -err); hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE);
} }
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment