aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2014-08-18 13:33:29 -0400
committerMarcel Holtmann <marcel@holtmann.org>2014-09-08 13:07:54 -0400
commit1e91c29eb60c031f4297d1a58125d0bd37691348 (patch)
treefe779db5481f98eb8d4aa281dfdd93d0a6538672 /net/bluetooth
parente31fb86005a01b7df8427b09d0158da28d0c773a (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.c4
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
835static struct smp_chan *smp_chan_create(struct l2cap_conn *conn) 835static 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;