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@xxxxxxxxx> --- include/net/bluetooth/l2cap.h | 6 ++++++ net/bluetooth/l2cap_core.c | 17 ++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/include/net/bluetooth/l2cap.h b/include/net/bluetooth/l2cap.h index 0697fd4..c7f97cc 100644 --- a/include/net/bluetooth/l2cap.h +++ b/include/net/bluetooth/l2cap.h @@ -284,6 +284,12 @@ struct l2cap_conn_rsp { #define L2CAP_CR_INVALID_SCID 0x0009 #define L2CAP_CR_SCID_IN_USE 0x000A +/* connect/create channel results + * New result codesAs per ESR08_V1.0.0, Erratum 3253 + */ +#define L2CAP_CR_BREDR_INVALID_SCID 0x0006 +#define L2CAP_CR_BREDR_SCID_IN_USE 0x0007 + /* connect/create channel status */ #define L2CAP_CS_NO_INFO 0x0000 #define L2CAP_CS_AUTHEN_PEND 0x0001 diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index d17a473..d605748 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c @@ -3815,9 +3815,24 @@ static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn, result = L2CAP_CR_NO_MEM; + /* As per ESR08_V1.0.0, Erratum 3253, check the CID is in valid + * dynamic range and is not allocated already. + * Send the new result codes accordingly + */ + + /* Check for valid dynamic CID range */ + if (scid < L2CAP_CID_DYN_START || scid > L2CAP_CID_DYN_END) { + result = L2CAP_CR_BREDR_INVALID_SCID; + chan = NULL; + 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_BREDR_SCID_IN_USE; + chan = NULL; goto response; + } chan = pchan->ops->new_connection(pchan); if (!chan) -- 2.7.4