|
@@ -680,9 +680,9 @@ static void l2cap_chan_le_connect_reject(struct l2cap_chan *chan)
|
|
|
u16 result;
|
|
|
|
|
|
if (test_bit(FLAG_DEFER_SETUP, &chan->flags))
|
|
|
- result = L2CAP_CR_AUTHORIZATION;
|
|
|
+ result = L2CAP_CR_LE_AUTHORIZATION;
|
|
|
else
|
|
|
- result = L2CAP_CR_BAD_PSM;
|
|
|
+ result = L2CAP_CR_LE_BAD_PSM;
|
|
|
|
|
|
l2cap_state_change(chan, BT_DISCONN);
|
|
|
|
|
@@ -3670,7 +3670,7 @@ void __l2cap_le_connect_rsp_defer(struct l2cap_chan *chan)
|
|
|
rsp.mtu = cpu_to_le16(chan->imtu);
|
|
|
rsp.mps = cpu_to_le16(chan->mps);
|
|
|
rsp.credits = cpu_to_le16(chan->rx_credits);
|
|
|
- rsp.result = cpu_to_le16(L2CAP_CR_SUCCESS);
|
|
|
+ rsp.result = cpu_to_le16(L2CAP_CR_LE_SUCCESS);
|
|
|
|
|
|
l2cap_send_cmd(conn, chan->ident, L2CAP_LE_CONN_RSP, sizeof(rsp),
|
|
|
&rsp);
|
|
@@ -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)
|
|
@@ -5280,7 +5288,7 @@ static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
|
|
|
credits = __le16_to_cpu(rsp->credits);
|
|
|
result = __le16_to_cpu(rsp->result);
|
|
|
|
|
|
- if (result == L2CAP_CR_SUCCESS && (mtu < 23 || mps < 23 ||
|
|
|
+ if (result == L2CAP_CR_LE_SUCCESS && (mtu < 23 || mps < 23 ||
|
|
|
dcid < L2CAP_CID_DYN_START ||
|
|
|
dcid > L2CAP_CID_LE_DYN_END))
|
|
|
return -EPROTO;
|
|
@@ -5301,7 +5309,7 @@ static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
|
|
|
l2cap_chan_lock(chan);
|
|
|
|
|
|
switch (result) {
|
|
|
- case L2CAP_CR_SUCCESS:
|
|
|
+ case L2CAP_CR_LE_SUCCESS:
|
|
|
if (__l2cap_get_chan_by_dcid(conn, dcid)) {
|
|
|
err = -EBADSLT;
|
|
|
break;
|
|
@@ -5315,8 +5323,8 @@ static int l2cap_le_connect_rsp(struct l2cap_conn *conn,
|
|
|
l2cap_chan_ready(chan);
|
|
|
break;
|
|
|
|
|
|
- case L2CAP_CR_AUTHENTICATION:
|
|
|
- case L2CAP_CR_ENCRYPTION:
|
|
|
+ case L2CAP_CR_LE_AUTHENTICATION:
|
|
|
+ case L2CAP_CR_LE_ENCRYPTION:
|
|
|
/* If we already have MITM protection we can't do
|
|
|
* anything.
|
|
|
*/
|
|
@@ -5459,7 +5467,7 @@ static int l2cap_le_connect_req(struct l2cap_conn *conn,
|
|
|
pchan = l2cap_global_chan_by_psm(BT_LISTEN, psm, &conn->hcon->src,
|
|
|
&conn->hcon->dst, LE_LINK);
|
|
|
if (!pchan) {
|
|
|
- result = L2CAP_CR_BAD_PSM;
|
|
|
+ result = L2CAP_CR_LE_BAD_PSM;
|
|
|
chan = NULL;
|
|
|
goto response;
|
|
|
}
|
|
@@ -5469,28 +5477,28 @@ static int l2cap_le_connect_req(struct l2cap_conn *conn,
|
|
|
|
|
|
if (!smp_sufficient_security(conn->hcon, pchan->sec_level,
|
|
|
SMP_ALLOW_STK)) {
|
|
|
- result = L2CAP_CR_AUTHENTICATION;
|
|
|
+ result = L2CAP_CR_LE_AUTHENTICATION;
|
|
|
chan = NULL;
|
|
|
goto response_unlock;
|
|
|
}
|
|
|
|
|
|
/* Check for valid dynamic CID range */
|
|
|
if (scid < L2CAP_CID_DYN_START || scid > L2CAP_CID_LE_DYN_END) {
|
|
|
- result = L2CAP_CR_INVALID_SCID;
|
|
|
+ result = L2CAP_CR_LE_INVALID_SCID;
|
|
|
chan = NULL;
|
|
|
goto response_unlock;
|
|
|
}
|
|
|
|
|
|
/* Check if we already have channel with that dcid */
|
|
|
if (__l2cap_get_chan_by_dcid(conn, scid)) {
|
|
|
- result = L2CAP_CR_SCID_IN_USE;
|
|
|
+ result = L2CAP_CR_LE_SCID_IN_USE;
|
|
|
chan = NULL;
|
|
|
goto response_unlock;
|
|
|
}
|
|
|
|
|
|
chan = pchan->ops->new_connection(pchan);
|
|
|
if (!chan) {
|
|
|
- result = L2CAP_CR_NO_MEM;
|
|
|
+ result = L2CAP_CR_LE_NO_MEM;
|
|
|
goto response_unlock;
|
|
|
}
|
|
|
|
|
@@ -5526,7 +5534,7 @@ static int l2cap_le_connect_req(struct l2cap_conn *conn,
|
|
|
chan->ops->defer(chan);
|
|
|
} else {
|
|
|
l2cap_chan_ready(chan);
|
|
|
- result = L2CAP_CR_SUCCESS;
|
|
|
+ result = L2CAP_CR_LE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
response_unlock:
|