]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Bluetooth: Errata Service Release 8, Erratum 3253
authorMallikarjun Phulari <mallikarjun.phulari@intel.com>
Fri, 5 Oct 2018 09:18:13 +0000 (14:48 +0530)
committerMarcel Holtmann <marcel@holtmann.org>
Sun, 14 Oct 2018 08:25:47 +0000 (10:25 +0200)
L2CAP: New result values
0x0006 - Connection refused – Invalid Source CID
0x0007 - Connection refused – Source CID already allocated

As per the ESR08_V1.0.0, 1.11.2 Erratum 3253, Page No. 54,
"Remote CID invalid Issue".
Applies to Core Specification versions: V5.0, V4.2, v4.1, v4.0, and v3.0 + HS
Vol 3, Part A, Section 4.2, 4.3, 4.14, 4.15.

Core Specification Version 5.0, Page No.1753, Table 4.6 and
Page No. 1767, Table 4.14

New result values are added to l2cap connect/create channel response as
0x0006 - Connection refused – Invalid Source CID
0x0007 - Connection refused – Source CID already allocated

Signed-off-by: Mallikarjun Phulari <mallikarjun.phulari@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/l2cap.h
net/bluetooth/l2cap_core.c

index ea4b4ec85b7833e033652faa879f14aab625c43f..093aedebdf0ca03f1f270fa77a523d8309229c84 100644 (file)
@@ -277,6 +277,8 @@ struct l2cap_conn_rsp {
 #define L2CAP_CR_SEC_BLOCK     0x0003
 #define L2CAP_CR_NO_MEM                0x0004
 #define L2CAP_CR_BAD_AMP       0x0005
+#define L2CAP_CR_INVALID_SCID  0x0006
+#define L2CAP_CR_SCID_IN_USE   0x0007
 
 /* credit based connect results */
 #define L2CAP_CR_LE_SUCCESS            0x0000
index cf03a0122b2b3d7a8f2024a0c6491f4641585cea..2146e0f3b6f868dc032fbbd741af55a7956a23bc 100644 (file)
@@ -3816,9 +3816,17 @@ static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
 
        result = L2CAP_CR_NO_MEM;
 
+       /* Check for valid dynamic CID range (as per Erratum 3253) */
+       if (scid < L2CAP_CID_DYN_START || scid > L2CAP_CID_DYN_END) {
+               result = L2CAP_CR_INVALID_SCID;
+               goto response;
+       }
+
        /* Check if we already have channel with that dcid */
-       if (__l2cap_get_chan_by_dcid(conn, scid))
+       if (__l2cap_get_chan_by_dcid(conn, scid)) {
+               result = L2CAP_CR_SCID_IN_USE;
                goto response;
+       }
 
        chan = pchan->ops->new_connection(pchan);
        if (!chan)