aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2013-04-25 16:33:36 +0300
committerJohan Hedberg <johan.hedberg@intel.com>2013-04-26 13:08:14 +0300
commitb43a5def00998b1571d097669c299c656336da05 (patch)
tree4404889941f6f5d51f8489affc1a8a3641d8b0b0
parentc068b9bb796876e72e7b06cd540103911522a4e4 (diff)
downloadbluetooth-next-b43a5def00998b1571d097669c299c656336da05.tar.gz
Bluetooth: Fix hardcoding ATT CID in __l2cap_chan_add()
Since in the future more than the ATT CID may be permissible we should not be hardcoding it for all LE connections in __l2cap_chan_add(). Instead, the source ATT CID should only be set if the destination is also ATT, and in other cases we should just use the existing dynamic CID allocation function. Assigning scid based on dcid means that whenever __l2cap_chan_add() is called that chan->dcid is properly initialized. l2cap_le_conn_ready() wasn't initializing is properly so this is also taken care of in this patch. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
-rw-r--r--net/bluetooth/l2cap_core.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index f7221ee74345c..5da195cb2abd2 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -504,8 +504,10 @@ void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
if (conn->hcon->type == LE_LINK) {
/* LE connection */
chan->omtu = L2CAP_DEFAULT_MTU;
- chan->scid = L2CAP_CID_LE_ATT;
- chan->dcid = L2CAP_CID_LE_ATT;
+ if (chan->dcid == L2CAP_CID_LE_ATT)
+ chan->scid = L2CAP_CID_LE_ATT;
+ else
+ chan->scid = l2cap_alloc_cid(conn);
} else {
/* Alloc CID for connection-oriented socket */
chan->scid = l2cap_alloc_cid(conn);
@@ -1357,6 +1359,8 @@ static void l2cap_le_conn_ready(struct l2cap_conn *conn)
if (!chan)
goto clean;
+ chan->dcid = L2CAP_CID_LE_ATT;
+
sk = chan->sk;
hci_conn_hold(conn->hcon);