From: Mat Martineau <mathewm@codeaurora.org>
To: Ulisses Furquim <ulisses@profusion.mobi>,
Andrei Emeltchenko <andrei.emeltchenko.news@gmail.com>
Cc: linux-bluetooth@vger.kernel.org, padovan@profusion.mobi,
pkrystad@codeaurora.org, marcel@holtmann.org,
luiz.dentz@gmail.com
Subject: Re: [RFC 1/2] Bluetooth: Header changes for ERTM state machine replacement
Date: Fri, 24 Feb 2012 16:21:39 -0800 [thread overview]
Message-ID: <4F482993.4030104@codeaurora.org> (raw)
In-Reply-To: <CAA37ikYYGoYcOg5PD98QZt04NjzUWhi6AQVgh2eGYy94vWPQ=g@mail.gmail.com>
Andrei and Ulisses -
On 2/24/2012 9:42 AM, Ulisses Furquim wrote:
> Hi Andrei,
>
> On Fri, Feb 24, 2012 at 7:48 AM, Andrei Emeltchenko
> <andrei.emeltchenko.news@gmail.com> wrote:
>> Hi Mat,
>>
>> It is better to have normal patches for a better review.
I would have preferred to have more "normal" patches, but I didn't want
to keep you guys waiting another week.
>> I think that we can minimize amount of changes by redefining defines
>> when they cannot be used.
Do you mean that it would be better to modify existing macros rather
than remove them?
>>
>> I also think think that patches shall be logically split like:
>> - change control field handling
>> - working with FCS, etc which do not affect state machine
>> - adding states
Sounds like a good way to divide things up.
>>
>> Also check some comments below: (I copied some code from the link you sent)
>>
>> On Thu, Feb 23, 2012 at 12:37:48PM -0800, Mat Martineau wrote:
>>> This change affects data structures storing ERTM state and control
>>> fields, and adds new definitions for states and events. An
>>> l2cap_seq_list structure is added for tracking ERTM sequence numbers
>>> without repeated memory allocations. Control fields are carried in
>>> the bt_skb_cb struct rather than constantly doing shift and mask
>>> operations.
>>>
>>> Signed-off-by: Mat Martineau<mathewm@codeaurora.org>
>>> ---
>>> include/net/bluetooth/bluetooth.h | 14 ++-
>>> include/net/bluetooth/l2cap.h | 260 +++++++++----------------------------
>>> 2 files changed, 73 insertions(+), 201 deletions(-)
>>
>> ...
>>
>>> -static inline int l2cap_tx_window_full(struct l2cap_chan *ch)
>>> -{
>>> - int sub;
>>> -
>>> - sub = (ch->next_tx_seq - ch->expected_ack_seq) % 64;
>>> -
>>> - if (sub< 0)
>>> - sub += 64;
>>> -
>>> - return sub == ch->remote_tx_win;
>>> -}
>>
>> BTW: was it already changed? What is the status with Luiz's patch?
I'm not sure about the patch status - but I do know this function isn't
needed with the new ERTM code.
>>
>> ...
>>
>>> -static inline __u32 __get_control(struct l2cap_chan *chan, void *p)
>>> -{
>>> - if (test_bit(FLAG_EXT_CTRL,&chan->flags))
>>> - return get_unaligned_le32(p);
>>> - else
>>> - return get_unaligned_le16(p);
>>> -}
>>
>> Cannot it still be used?
It's not needed. The control header is only parsed in one place now at
the beginning of l2cap_ertm_data_rcv(), and this macro isn't a good fit
for the code there.
>>
>> + if (test_bit(FLAG_EXT_CTRL,&chan->flags)) {
>> + __get_extended_control(get_unaligned_le32(skb->data),
>> + control);
>> + skb_pull(skb, L2CAP_EXT_CTRL_SIZE);
>> + } else {
>> + __get_enhanced_control(get_unaligned_le16(skb->data),
>> + control);
>> + skb_pull(skb, L2CAP_ENH_CTRL_SIZE);
>> + }
>>
>> - control = __get_control(chan, skb->data);
>> - skb_pull(skb, __ctrl_size(chan));
>>
>> ...
>>
>>> -static inline void __put_control(struct l2cap_chan *chan, __u32 control,
>>> - void *p)
>>> -{
>>> - if (test_bit(FLAG_EXT_CTRL,&chan->flags))
>>> - return put_unaligned_le32(control, p);
>>> - else
>>> - return put_unaligned_le16(control, p);
>>> -}
>>
>> Can it be used in the code below:
>>
>> + if (test_bit(FLAG_EXT_CTRL,&chan->flags)) {
>> + put_unaligned_le32(__pack_extended_control(control),
>> + skb->data + L2CAP_HDR_SIZE);
>> + } else {
>> + put_unaligned_le16(__pack_enhanced_control(control),
>> + skb->data + L2CAP_HDR_SIZE);
>> + }
>>
Since the __pack function differs based on the extended/enhanced header
type, it doesn't seem worthwhile to check FLAG_EXT_CTRL twice.
The code I'm porting in predates the __put_control macro, so I didn't
make an effort to remove it. In order to avoid breaking things, I'm
trying to only change the ported code where required. I'm open to
making this code better, though!
>> and for example here:
>>
>> - __put_control(chan, control, skb_put(skb, __ctrl_size(chan)));
>> + /* Control header is populated later */
>> + if (test_bit(FLAG_EXT_CTRL,&chan->flags))
>> + put_unaligned_le32(0, skb_put(skb, 4));
>> + else
>> + put_unaligned_le16(0, skb_put(skb, 2));
This is the only place the macro would drop in cleanly - but it seems
like a macro should be used in more than one place unless it's hiding
some really distracting syntax. In this case, I think it's clearer to
see what's going on.
And - I forgot to fix some magic numbers in those skb_puts.
>>
>>> -
>>> -static inline __u8 __ctrl_size(struct l2cap_chan *chan)
>>> -{
>>> - if (test_bit(FLAG_EXT_CTRL,&chan->flags))
>>> - return L2CAP_EXT_HDR_SIZE - L2CAP_HDR_SIZE;
>>> - else
>>> - return L2CAP_ENH_HDR_SIZE - L2CAP_HDR_SIZE;
>>> -}
>
> Do we have that many places with this test in Mat's code? If not, then
> we might not need to bother having all of these helpers, I think. And
> if we add them, I do think it makes sense to add them to l2cap_core.c
> than in l2cap.h, right?
Not too many places with the FLAG_EXT_CTRL test, with use of struct
bt_control in most of the code. I would rather have helpers in
l2cap_core.c if they're needed.
Thanks for the reviews!
--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum
next prev parent reply other threads:[~2012-02-25 0:21 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-23 20:37 [RFC 0/2] New L2CAP ERTM state machine Mat Martineau
2012-02-23 20:37 ` [RFC 1/2] Bluetooth: Header changes for ERTM state machine replacement Mat Martineau
2012-02-24 9:48 ` Andrei Emeltchenko
2012-02-24 17:42 ` Ulisses Furquim
2012-02-25 0:21 ` Mat Martineau [this message]
2012-02-25 15:37 ` Ulisses Furquim
2012-02-27 9:28 ` Andrei Emeltchenko
2012-02-24 17:39 ` Ulisses Furquim
2012-02-25 0:32 ` Mat Martineau
2012-02-25 15:32 ` Ulisses Furquim
2012-02-28 23:33 ` Gustavo Padovan
2012-03-03 0:19 ` Mat Martineau
2012-02-23 20:37 ` [RFC 2/2] Bluetooth: L2CAP " Mat Martineau
2012-02-24 20:13 ` Ulisses Furquim
2012-02-25 1:08 ` Mat Martineau
2012-02-25 15:52 ` Ulisses Furquim
2012-02-27 9:15 ` Andrei Emeltchenko
2012-02-28 23:49 ` Gustavo Padovan
2012-03-03 0:30 ` Mat Martineau
2012-03-03 0:40 ` Marcel Holtmann
2012-03-06 23:09 ` Mat Martineau
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=4F482993.4030104@codeaurora.org \
--to=mathewm@codeaurora.org \
--cc=andrei.emeltchenko.news@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=marcel@holtmann.org \
--cc=padovan@profusion.mobi \
--cc=pkrystad@codeaurora.org \
--cc=ulisses@profusion.mobi \
/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).