Bluetooth: Switch ATT channels to use L2CAP_CHAN_FIXED
authorJohan Hedberg <johan.hedberg@intel.com>
Fri, 24 Jan 2014 08:35:41 +0000 (10:35 +0200)
committerJohan Hedberg <johan.hedberg@intel.com>
Thu, 13 Feb 2014 07:51:37 +0000 (09:51 +0200)
ATT channels are not connection oriented so having them use
L2CAP_CHAN_CONN_ORIENTED is quite confusing. Instead, use the new
L2CAP_CHAN_FIXED type and ensure that the MTU and CID values get
properly set.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/l2cap_core.c
net/bluetooth/l2cap_sock.c

index cd28057d2903219d58d2fa76d029cc52153df88c..e5c5c7427c410ed1754adbe6aa8a4209118746ff 100644 (file)
@@ -498,18 +498,10 @@ void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
 
        switch (chan->chan_type) {
        case L2CAP_CHAN_CONN_ORIENTED:
-               if (conn->hcon->type == LE_LINK) {
-                       if (chan->dcid == L2CAP_CID_ATT) {
-                               chan->omtu = L2CAP_DEFAULT_MTU;
-                               chan->scid = L2CAP_CID_ATT;
-                       } else {
-                               chan->scid = l2cap_alloc_cid(conn);
-                       }
-               } else {
-                       /* Alloc CID for connection-oriented socket */
-                       chan->scid = l2cap_alloc_cid(conn);
+               /* Alloc CID for connection-oriented socket */
+               chan->scid = l2cap_alloc_cid(conn);
+               if (conn->hcon->type == ACL_LINK)
                        chan->omtu = L2CAP_DEFAULT_MTU;
-               }
                break;
 
        case L2CAP_CHAN_CONN_LESS:
@@ -7025,7 +7017,12 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
                goto done;
        }
 
-       if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !(psm || cid)) {
+       if (chan->chan_type == L2CAP_CHAN_CONN_ORIENTED && !psm) {
+               err = -EINVAL;
+               goto done;
+       }
+
+       if (chan->chan_type == L2CAP_CHAN_FIXED && !cid) {
                err = -EINVAL;
                goto done;
        }
index fe086b4efc0c204d18200f8599cf7cf9f0f0e8d1..04abd26a346684d87010bae7f5f606bf81c47474 100644 (file)
@@ -101,6 +101,15 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen)
        if (!bdaddr_type_is_valid(la.l2_bdaddr_type))
                return -EINVAL;
 
+       if (la.l2_cid) {
+               /* When the socket gets created it defaults to
+                * CHAN_CONN_ORIENTED, so we need to overwrite the
+                * default here.
+                */
+               chan->chan_type = L2CAP_CHAN_FIXED;
+               chan->omtu = L2CAP_DEFAULT_MTU;
+       }
+
        if (bdaddr_type_is_le(la.l2_bdaddr_type)) {
                if (!enable_lecoc && la.l2_psm)
                        return -EINVAL;