Re: [PATCH] Bluetooth: MTU configuration for LE links

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Anderson,

> This patch implements MTU configuration for LE links. The previous
> implementation was setting the MTU as a fixed value.
> 
> Signed-off-by: Anderson Briglia <anderson.briglia@xxxxxxxxxxxxx>
> Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@xxxxxxxxxxxxx>
> ---
>  net/bluetooth/l2cap_core.c |    6 +++++-
>  net/bluetooth/l2cap_sock.c |   18 ++++++++++++++++--
>  2 files changed, 21 insertions(+), 3 deletions(-)
> 
> diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
> index be6c5aa..4a8b388 100644
> --- a/net/bluetooth/l2cap_core.c
> +++ b/net/bluetooth/l2cap_core.c
> @@ -177,7 +177,11 @@ static void __l2cap_chan_add(struct l2cap_conn *conn, struct l2cap_chan *chan)
>  	if (sk->sk_type == SOCK_SEQPACKET || sk->sk_type == SOCK_STREAM) {
>  		if (conn->hcon->type == LE_LINK) {
>  			/* LE connection */
> -			l2cap_pi(sk)->omtu = L2CAP_LE_DEFAULT_MTU;
> +			if (l2cap_pi(sk)->imtu < L2CAP_LE_DEFAULT_MTU)
> +				l2cap_pi(sk)->imtu = L2CAP_LE_DEFAULT_MTU;
> +			if (l2cap_pi(sk)->omtu < L2CAP_LE_DEFAULT_MTU)
> +				l2cap_pi(sk)->omtu = L2CAP_LE_DEFAULT_MTU;
> +
>  			l2cap_pi(sk)->scid = L2CAP_CID_LE_DATA;
>  			l2cap_pi(sk)->dcid = L2CAP_CID_LE_DATA;
>  		} else {
> diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
> index 0059dda..b5796fd 100644
> --- a/net/bluetooth/l2cap_sock.c
> +++ b/net/bluetooth/l2cap_sock.c
> @@ -530,16 +530,18 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us
>  {
>  	struct sock *sk = sock->sk;
>  	struct l2cap_options opts;
> -	int len, err = 0;
> +	int len, le_sock, err = 0;
>  	u32 opt;
>  
>  	BT_DBG("sk %p", sk);
>  
>  	lock_sock(sk);
>  
> +	le_sock = l2cap_pi(sk)->scid == L2CAP_CID_LE_DATA;
> +
>  	switch (optname) {
>  	case L2CAP_OPTIONS:
> -		if (sk->sk_state == BT_CONNECTED) {
> +		if (sk->sk_state == BT_CONNECTED && !le_sock) {
>  			err = -EINVAL;
>  			break;
>  		}
> @@ -558,6 +560,18 @@ static int l2cap_sock_setsockopt_old(struct socket *sock, int optname, char __us
>  			break;
>  		}
>  
> +		if ((opts.imtu || opts.omtu) && le_sock &&
> +				(sk->sk_state == BT_CONNECTED)) {
> +			if (opts.imtu >= L2CAP_LE_DEFAULT_MTU)
> +				l2cap_pi(sk)->imtu = opts.imtu;
> +			if (opts.omtu >= L2CAP_LE_DEFAULT_MTU)
> +				l2cap_pi(sk)->omtu = opts.omtu;
> +			if (opts.imtu < L2CAP_LE_DEFAULT_MTU ||
> +					opts.omtu < L2CAP_LE_DEFAULT_MTU)
> +				err = -EINVAL;
> +			break;
> +		}
> +

so how do you expect this to work exactly? In BR/EDR L2CAP you set the
MTU details before calling connect(). With LE you expect to be connected
and then tell the kernel what the limits actually are?

This sounds highly convoluted. And especially hijacking the existing
command for it seems wrong. Using l2cap_sock_setsockopt_old() might have
given it away that it is a bad idea to re-use that socket option for a
new technology ;)

So the real fact here is that the MTU handling/negotiation for BR/EDR
and LE are different. Nothing is going to change this. So this should be
also different from a socket option point of view.

Regards

Marcel


--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux