Bluetooth: L2CAP: Fix not checking output MTU is acceptable on L2CAP_ECRED_CONN_REQ
Upon receiving L2CAP_ECRED_CONN_REQ the given MTU shall be checked
against the suggested MTU of the listening socket as that is required
by the likes of PTS L2CAP/ECFC/BV-27-C test which expects
L2CAP_CR_LE_UNACCEPT_PARAMS if the MTU is lowers than socket omtu.
In order to be able to set chan->omtu the code now allows setting
setsockopt(BT_SNDMTU), but it is only allowed when connection has not
been stablished since there is no procedure to reconfigure the output
MTU.
Link: https://github.com/bluez/bluez/issues/1895
Fixes: 15f02b9105 ("Bluetooth: L2CAP: Add initial code for Enhanced Credit Based Mode")
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This commit is contained in:
parent
7cff9a40c6
commit
a8d1d73c81
|
|
@ -5117,6 +5117,14 @@ static inline int l2cap_ecred_conn_req(struct l2cap_conn *conn,
|
|||
goto unlock;
|
||||
}
|
||||
|
||||
/* Check if the listening channel has set an output MTU then the
|
||||
* requested MTU shall be less than or equal to that value.
|
||||
*/
|
||||
if (pchan->omtu && mtu < pchan->omtu) {
|
||||
result = L2CAP_CR_LE_UNACCEPT_PARAMS;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
result = L2CAP_CR_LE_SUCCESS;
|
||||
|
||||
for (i = 0; i < num_scid; i++) {
|
||||
|
|
|
|||
|
|
@ -1029,10 +1029,17 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname,
|
|||
break;
|
||||
}
|
||||
|
||||
/* Setting is not supported as it's the remote side that
|
||||
* decides this.
|
||||
*/
|
||||
err = -EPERM;
|
||||
/* Only allow setting output MTU when not connected */
|
||||
if (sk->sk_state == BT_CONNECTED) {
|
||||
err = -EISCONN;
|
||||
break;
|
||||
}
|
||||
|
||||
err = copy_safe_from_sockptr(&mtu, sizeof(mtu), optval, optlen);
|
||||
if (err)
|
||||
break;
|
||||
|
||||
chan->omtu = mtu;
|
||||
break;
|
||||
|
||||
case BT_RCVMTU:
|
||||
|
|
|
|||
Loading…
Reference in New Issue