diff options
author | Johan Hedberg <johan.hedberg@intel.com> | 2014-08-18 13:33:29 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2014-09-08 13:07:54 -0400 |
commit | 1e91c29eb60c031f4297d1a58125d0bd37691348 (patch) | |
tree | fe779db5481f98eb8d4aa281dfdd93d0a6538672 /net/bluetooth | |
parent | e31fb86005a01b7df8427b09d0158da28d0c773a (diff) |
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: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth')
-rw-r--r-- | net/bluetooth/smp.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c index 07ca4ce0943b..496584921fdc 100644 --- a/net/bluetooth/smp.c +++ b/net/bluetooth/smp.c | |||
@@ -829,7 +829,7 @@ static void smp_timeout(struct work_struct *work) | |||
829 | 829 | ||
830 | BT_DBG("conn %p", conn); | 830 | BT_DBG("conn %p", conn); |
831 | 831 | ||
832 | l2cap_conn_shutdown(conn, ETIMEDOUT); | 832 | hci_disconnect(conn->hcon, HCI_ERROR_REMOTE_USER_TERM); |
833 | } | 833 | } |
834 | 834 | ||
835 | static struct smp_chan *smp_chan_create(struct l2cap_conn *conn) | 835 | 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 | if (smp) | 1569 | if (smp) |
1570 | cancel_delayed_work_sync(&smp->security_timer); | 1570 | cancel_delayed_work_sync(&smp->security_timer); |
1571 | 1571 | ||
1572 | l2cap_conn_shutdown(chan->conn, -err); | 1572 | hci_disconnect(chan->conn->hcon, HCI_ERROR_AUTH_FAILURE); |
1573 | } | 1573 | } |
1574 | 1574 | ||
1575 | return err; | 1575 | return err; |