linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marcel Holtmann <marcel@holtmann.org>
To: Johan Hedberg <johan.hedberg@gmail.com>
Cc: Steven Walter <stevenrwalter@gmail.com>,
	"Gustavo F. Padovan" <gustavo@padovan.org>,
	BlueZ development <linux-bluetooth@vger.kernel.org>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3] Bluetooth: automatically flushable packets aren't allowed on LE links
Date: Thu, 20 Nov 2014 21:50:18 +0800	[thread overview]
Message-ID: <80321467-10AB-489E-A47E-44B0ECEE4BE1@holtmann.org> (raw)
In-Reply-To: <20141120113813.GA23288@t440s.lan>

Hi Johan,

>> The bluetooth spec states that automatically flushable packets may not
>> be sent over a LE-U link.
>> 
>> Signed-off-by: Steven Walter <stevenrwalter@gmail.com>
>> ---
>> net/bluetooth/l2cap_core.c | 14 ++++++++------
>> 1 file changed, 8 insertions(+), 6 deletions(-)
>> 
>> diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
>> index 4af3821..7c4350f 100644
>> --- a/net/bluetooth/l2cap_core.c
>> +++ b/net/bluetooth/l2cap_core.c
>> @@ -764,7 +764,7 @@ static void l2cap_send_cmd(struct l2cap_conn *conn, u8 ident, u8 code, u16 len,
>> 	if (!skb)
>> 		return;
>> 
>> -	if (lmp_no_flush_capable(conn->hcon->hdev))
>> +	if (lmp_no_flush_capable(conn->hcon->hdev) || conn->hcon->type == LE_LINK)
>> 		flags = ACL_START_NO_FLUSH;
>> 	else
>> 		flags = ACL_START;
>> @@ -784,7 +784,7 @@ static bool __chan_is_moving(struct l2cap_chan *chan)
>> static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
>> {
>> 	struct hci_conn *hcon = chan->conn->hcon;
>> -	u16 flags;
>> +	u16 flags = ACL_START;
>> 
>> 	BT_DBG("chan %p, skb %p len %d priority %u", chan, skb, skb->len,
>> 	       skb->priority);
>> @@ -798,11 +798,13 @@ static void l2cap_do_send(struct l2cap_chan *chan, struct sk_buff *skb)
>> 		return;
>> 	}
>> 
>> -	if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
>> -	    lmp_no_flush_capable(hcon->hdev))
>> +	if (hcon->type == LE_LINK) {
>> +		/* LE-U does not support auto-flushing packets */
>> 		flags = ACL_START_NO_FLUSH;
>> -	else
>> -		flags = ACL_START;
>> +	} else if (!test_bit(FLAG_FLUSHABLE, &chan->flags) &&
>> +		    lmp_no_flush_capable(hcon->hdev)) {
>> +		flags = ACL_START_NO_FLUSH;
>> +	}
> 
> I think Marcel was after just providing a clarifying code comment in
> both places - having two branches of an if-statement doing exactly the
> same thing looks a bit weird to me. To make thins completely clear I'd
> suggest adding a simple helper function that you can call from both
> places to get the needed flags, something like the following:

I am actually fine with just adding a comment explaining the complex if statement on why it is correct. It is just a helper for everybody to understand what and why it is done that way.

> static u16 get_acl_flags(struct hci_conn *hcon, struct l2cap_chan *chan)
> {

If we do it with a helper functions, then it should only provide the l2cap_chan since we can get the hci_conn from there.

> 	/* LE-U does not support auto-flushing packets */
> 	if (hcon->type == LE_LINK)
> 		return ACL_START_NO_FLUSH;
> 
> 	/* If non-flushable packets are not supported don't request them */
> 	if (!lmp_no_flush_capable(hcon->hdev))
> 		 return ACL_START;
> 
> 	/* If the chan has requested auto-flushing go with that */
> 	if (chan && test_bit(FLAG_FLUSHABLE, &chan->flags))
> 		return ACL_START;

This seems to be a bit too much. The FLAG_FLUSABLE is only settable if the controller supports it. I wonder why we need the LMP features check here in the first place. Can we not just trust the flag on the channel is set correctly and enforce it before setting the flag.
> 
> 	/* Otherwise go with a non-flushable packet */
>        return ACL_START_NO_FLUSH;
> }
> 
> This way we'd avoid complex if-statements and can clearly document each
> condition independently.

Regards

Marcel


  reply	other threads:[~2014-11-20 13:50 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-18 14:46 [PATCH] l2cap_core: automatically flushable packets aren't supported by LE-only devices Steven Walter
2014-11-18 22:01 ` Marcel Holtmann
2014-11-19 14:41   ` [PATCH v2] l2cap_core: automatically flushable packets aren't allowed on LE links Steven Walter
2014-11-19 14:48     ` Marcel Holtmann
2014-11-19 17:59       ` [PATCH v3] Bluetooth: " Steven Walter
2014-11-20 11:38         ` Johan Hedberg
2014-11-20 13:50           ` Marcel Holtmann [this message]
2014-11-20 14:57             ` Johan Hedberg
     [not found]             ` <CAK8d-aL+3eB4WZeqO1sv9p3440EVXQiqF6QiTU5YNAKAbZ7f-w@mail.gmail.com>
2014-11-25 14:53               ` Steven Walter
2014-11-26  5:16                 ` Marcel Holtmann
2014-11-27 10:14                   ` Johan Hedberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=80321467-10AB-489E-A47E-44B0ECEE4BE1@holtmann.org \
    --to=marcel@holtmann.org \
    --cc=gustavo@padovan.org \
    --cc=johan.hedberg@gmail.com \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stevenrwalter@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).