Linux bluetooth development
 help / color / mirror / Atom feed
From: Mat Martineau <mathewm@codeaurora.org>
To: Marcel Holtmann <marcel@holtmann.org>
Cc: "Gustavo F. Padovan" <gustavo@padovan.org>,
	linux-bluetooth@vger.kernel.org, rshaffer@codeaurora.org
Subject: Re: [PATCH 1/8] Bluetooth: Make sure the L2CAP FCS is only enabled for ERTM or streaming.
Date: Tue, 3 Aug 2010 09:23:59 -0700 (PDT)	[thread overview]
Message-ID: <alpine.DEB.2.00.1008030918360.19861@linux-sea-02> (raw)
In-Reply-To: <1280851870.12579.84.camel@localhost.localdomain>


Hi Marcel -

On Tue, 3 Aug 2010, Marcel Holtmann wrote:

>>>>>>> Signed-off-by: Mat Martineau <mathewm@codeaurora.org>
>>>>>>> ---
>>>>>>>  net/bluetooth/l2cap.c |   12 ++++++++----
>>>>>>>  1 files changed, 8 insertions(+), 4 deletions(-)
>>>>>>>
>>>>>>> diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c
>>>>>>> index 9ba1e8e..aed72f2 100644
>>>>>>> --- a/net/bluetooth/l2cap.c
>>>>>>> +++ b/net/bluetooth/l2cap.c
>>>>>>> @@ -3127,8 +3127,10 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
>>>>>>>  		goto unlock;
>>>>>>>
>>>>>>>  	if (l2cap_pi(sk)->conf_state & L2CAP_CONF_INPUT_DONE) {
>>>>>>> -		if (!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) ||
>>>>>>> -		    l2cap_pi(sk)->fcs != L2CAP_FCS_NONE)
>>>>>>> +		if ((l2cap_pi(sk)->mode == L2CAP_MODE_ERTM ||
>>>>>>> +			l2cap_pi(sk)->mode == L2CAP_MODE_STREAMING) &&
>>>>>>> +			(!(l2cap_pi(sk)->conf_state & L2CAP_CONF_NO_FCS_RECV) ||
>>>>>>> +			l2cap_pi(sk)->fcs != L2CAP_FCS_NONE))
>>>>>>>  			l2cap_pi(sk)->fcs = L2CAP_FCS_CRC16;
>>>>>>
>>>>>> this becomes unreadable and my brain starts to throw a core dump. So it
>>>>>> clearly needs to be put into a helper inline function.
>>>>>
>>>>> Actually we don't need that, since the code that deals with Basic Mode
>>>>> never check  and use the l2cap_pi(sk)->fcs. So we don't care about FCS
>>>>> value in the Basic Mode.
>>>>
>>>> There isn't currently any Basic Mode code that triggers this latent
>>>> bug, but I have a patch coming up that does require this fix.
>>>>
>>>> As it stands, getsockopt() on a connected basic mode socket shows FCS
>>>> enabled, so this bug is visible from userspace.
>>>
>>> can we just fail the setsockopt() when trying to set basic mode and FCS
>>> off.
>>
>> It definitely makes sense to have more validation of L2CAP_OPTIONS
>> passed to setsockopt().
>>
>>> And also in case fallback to basic mode happens, then FCS should be set
>>> to be enabled. Since for FCS and basic mode we always have to use FCS.
>>> So that seems just fine to me.
>>
>> The spec says "The FCS option shall only be used when the mode is
>> being, or is already configured to Enhanced Retransmission mode or
>> Streaming mode."  FCS is never used in basic mode (fallback or not).
>>
>> (Maybe I've misunderstood your point)
>
> So basic mode uses CRC16 as FCS. And with basic that is not changeable.
> If you try basic mode + no FCS then we should clearly fail the call to
> setsockopt() for that.

That's the opposite of what I'm trying to say! :)

Basic mode B-frames have *no* FCS (L2CAP spec section 3.1).  The FCS 
field is only found in I-frames and S-frames used in ERTM and 
streaming modes.  If you try basic mode + FCS, that should fail.

>>> Maybe you need to explain a bit more in detail what you are trying to
>>> achieve in conjunction with userspace API.
>>
>> My goal is to only have l2cap_pi(sk)->fcs == L2CAP_FCS_CRC16 when the
>> FCS option is actually in use.  Otherwise, any logic checking for FCS
>> also has to check the L2CAP mode.  Might as well check the mode once
>> and set fcs accordingly -- which is what my patch does.
>>
>> Gustavo is correct that l2cap_pi(sk)->fcs is currently only checked on
>> code paths used with ERTM and streaming mode.  However, future code
>> (including a patch I'll be posting soon) will depend on the fcs value
>> being accurate in all modes.
>
> As I said, I have no problem with returning basic mode + crc16. Since
> that is actually what you are doing in that case.
>
> The only thing that we have to keep in mind to be backward compatible is
> to allow setting of basic mode and fcs = 0x00 and then change that into
> crc16.

The fcs field in L2CAP_OPTIONS is new for ERTM/Streaming modes, so 
there should be no backward compatibility issues with basic mode.


Regards,

--
Mat Martineau
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum

  reply	other threads:[~2010-08-03 16:23 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-02 19:20 [PATCH 0/8] Bluetooth: L2CAP updates for PSM validation and ERTM Mat Martineau
2010-08-02 19:20 ` [PATCH 1/8] Bluetooth: Make sure the L2CAP FCS is only enabled for ERTM or streaming Mat Martineau
2010-08-02 19:38   ` Marcel Holtmann
2010-08-02 21:20     ` Gustavo F. Padovan
2010-08-02 22:40       ` Mat Martineau
2010-08-02 22:51         ` Marcel Holtmann
2010-08-03 15:58           ` Mat Martineau
2010-08-03 16:11             ` Marcel Holtmann
2010-08-03 16:23               ` Mat Martineau [this message]
2010-08-03 16:50                 ` Marcel Holtmann
2010-08-03 18:44             ` Gustavo F. Padovan
2010-08-02 19:20 ` [PATCH 2/8] Bluetooth: Change default ERTM retransmit timeout to 2 seconds, as the spec requires Mat Martineau
2010-08-02 19:40   ` Marcel Holtmann
2010-08-02 19:20 ` [PATCH 3/8] Bluetooth: Validate PSM values in calls to connect() and bind() Mat Martineau
2010-08-02 19:39   ` Marcel Holtmann
2010-08-02 21:24     ` Gustavo F. Padovan
2010-08-02 19:20 ` [PATCH 4/8] Bluetooth: Do endianness conversion on MPS configuration value before doing comparisons Mat Martineau
2010-08-02 19:41   ` Marcel Holtmann
2010-08-02 19:20 ` [PATCH 5/8] Bluetooth: Don't modify remote_tx_win when receiving a config response. Only config requests should set remote_tx_win Mat Martineau
2010-08-02 19:42   ` Marcel Holtmann
2010-08-02 19:20 ` [PATCH 6/8] Bluetooth: Move stream-oriented recvmsg code so it can be used by L2CAP Mat Martineau
2010-08-02 19:46   ` Marcel Holtmann
2010-08-02 22:13     ` Mat Martineau
2010-08-02 19:20 ` [PATCH 7/8] Bluetooth: Use a stream-oriented recvmsg with SOCK_STREAM L2CAP sockets Mat Martineau
2010-08-02 19:53   ` Marcel Holtmann
2010-08-02 19:20 ` [PATCH 8/8] Bluetooth: Use 3-DH5 payload size for default ERTM max PDU size Mat Martineau
2010-08-02 19:48   ` Marcel Holtmann
2010-08-03 16:13     ` Mat Martineau
2010-08-02 19:50 ` [PATCH 0/8] Bluetooth: L2CAP updates for PSM validation and ERTM Marcel Holtmann
2010-08-02 22:02   ` Mat Martineau
2010-08-02 22:09     ` Marcel Holtmann
2010-08-02 23:56       ` ERTM known bugs/regressions (was Re: [PATCH 0/8] ...) 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=alpine.DEB.2.00.1008030918360.19861@linux-sea-02 \
    --to=mathewm@codeaurora.org \
    --cc=gustavo@padovan.org \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=marcel@holtmann.org \
    --cc=rshaffer@codeaurora.org \
    /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