summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg2013-12-02 21:12:22 +0100
committerMarcel Holtmann2013-12-05 16:05:35 +0100
commit595177f311f5d42804f729e927f7eac87bbcc21b (patch)
tree1566788a0e2dd19630b02d6db5ebd5681c64034a
parentBluetooth: Implement LE L2CAP reassembly (diff)
downloadkernel-qcow2-linux-595177f311f5d42804f729e927f7eac87bbcc21b.tar.gz
kernel-qcow2-linux-595177f311f5d42804f729e927f7eac87bbcc21b.tar.xz
kernel-qcow2-linux-595177f311f5d42804f729e927f7eac87bbcc21b.zip
Bluetooth: Fix LE L2CAP Connect Request handling together with SMP
Unlike BR/EDR, for LE when we're in the BT_CONNECT state we may or may not have already have sent the Connect Request. This means that we need some extra tracking of the request. This patch adds an extra channel flag to prevent the request from being sent a second time. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--include/net/bluetooth/l2cap.h1
-rw-r--r--net/bluetooth/l2cap_core.c3
2 files changed, 4 insertions, 0 deletions
diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h
index b0d7e4adb167..292749c0f4bc 100644
--- a/include/net/bluetooth/l2cap.h
+++ b/include/net/bluetooth/l2cap.h
@@ -695,6 +695,7 @@ enum {
FLAG_EXT_CTRL,
FLAG_EFS_ENABLE,
FLAG_DEFER_SETUP,
+ FLAG_LE_CONN_REQ_SENT,
};
enum {
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 1c94e51a28fe..407e9d61d061 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -1223,6 +1223,9 @@ static void l2cap_le_connect(struct l2cap_chan *chan)
struct l2cap_conn *conn = chan->conn;
struct l2cap_le_conn_req req;
+ if (test_and_set_bit(FLAG_LE_CONN_REQ_SENT, &chan->flags))
+ return;
+
req.psm = chan->psm;
req.scid = cpu_to_le16(chan->scid);
req.mtu = cpu_to_le16(chan->imtu);