2019-05-18 19:54:35

by Pali Rohár

[permalink] [raw]
Subject: bluez A2DP socket reliability

Hello! How is L2CAP layer of bluetooth socket used for A2DP audio
transfer configured in bluez? It is reliable with big/infinite
retransmit count? Or in best-effort manner and some packets may be
dropped? And it is possible to change between these two modes for
application which uses bluez DBUS API? I'm asking because some A2DP
audio codecs are designed to deal with packet loss and for those codecs
it would be probably better to configure L2CAP socket to unreliable
mode.

--
Pali Rohár
[email protected]


Attachments:
(No filename) (526.00 B)
signature.asc (201.00 B)
Download all attachments

2019-05-19 17:00:04

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: bluez A2DP socket reliability

Hi Pali,

On Sat, May 18, 2019 at 11:12 PM Pali Rohár <[email protected]> wrote:
>
> Hello! How is L2CAP layer of bluetooth socket used for A2DP audio
> transfer configured in bluez? It is reliable with big/infinite
> retransmit count? Or in best-effort manner and some packets may be
> dropped? And it is possible to change between these two modes for
> application which uses bluez DBUS API? I'm asking because some A2DP
> audio codecs are designed to deal with packet loss and for those codecs
> it would be probably better to configure L2CAP socket to unreliable
> mode.

We don't use ERTM with AVDTP, both signaling and transport sockets are
using basic mode which don't support retransmissions, there the
concept of flush timeout which iirc we don't currently it.


--
Luiz Augusto von Dentz

2019-05-19 17:27:26

by Pali Rohár

[permalink] [raw]
Subject: Re: bluez A2DP socket reliability

On Sunday 19 May 2019 11:13:09 Luiz Augusto von Dentz wrote:
> Hi Pali,
>
> On Sat, May 18, 2019 at 11:12 PM Pali Rohár <[email protected]> wrote:
> >
> > Hello! How is L2CAP layer of bluetooth socket used for A2DP audio
> > transfer configured in bluez? It is reliable with big/infinite
> > retransmit count? Or in best-effort manner and some packets may be
> > dropped? And it is possible to change between these two modes for
> > application which uses bluez DBUS API? I'm asking because some A2DP
> > audio codecs are designed to deal with packet loss and for those codecs
> > it would be probably better to configure L2CAP socket to unreliable
> > mode.
>
> We don't use ERTM with AVDTP, both signaling and transport sockets are
> using basic mode which don't support retransmissions, there the
> concept of flush timeout which iirc we don't currently it.

On bluez.org site there is no information how to use bluez sockets and
the only documentation/tutorial which I found on internet was this:

https://people.csail.mit.edu/albert/bluez-intro/x559.html

I do not know how up-to-date it is, but seems that by default bluez
L2CAP sockets are reliable and to change them to unreliable mode it is
needed to issue OGF_HOST_CTL / OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT (0x28)
request. As default is zero = infinity = reliable connection.

I do not understand low level bluetooth details, but is ERTM related to
OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT?

So what are default settings for L2CAP socket used by AVDTP/A2DP
profiles which are transferred to user application via DBUS?

--
Pali Rohár
[email protected]


Attachments:
(No filename) (1.61 kB)
signature.asc (201.00 B)
Download all attachments

2019-06-07 13:13:20

by Pali Rohár

[permalink] [raw]
Subject: Re: bluez A2DP socket reliability

On Sunday 19 May 2019 14:22:23 Pali Rohár wrote:
> On Sunday 19 May 2019 11:13:09 Luiz Augusto von Dentz wrote:
> > Hi Pali,
> >
> > On Sat, May 18, 2019 at 11:12 PM Pali Rohár <[email protected]> wrote:
> > >
> > > Hello! How is L2CAP layer of bluetooth socket used for A2DP audio
> > > transfer configured in bluez? It is reliable with big/infinite
> > > retransmit count? Or in best-effort manner and some packets may be
> > > dropped? And it is possible to change between these two modes for
> > > application which uses bluez DBUS API? I'm asking because some A2DP
> > > audio codecs are designed to deal with packet loss and for those codecs
> > > it would be probably better to configure L2CAP socket to unreliable
> > > mode.
> >
> > We don't use ERTM with AVDTP, both signaling and transport sockets are
> > using basic mode which don't support retransmissions, there the
> > concept of flush timeout which iirc we don't currently it.
>
> On bluez.org site there is no information how to use bluez sockets and
> the only documentation/tutorial which I found on internet was this:
>
> https://people.csail.mit.edu/albert/bluez-intro/x559.html
>
> I do not know how up-to-date it is, but seems that by default bluez
> L2CAP sockets are reliable and to change them to unreliable mode it is
> needed to issue OGF_HOST_CTL / OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT (0x28)
> request. As default is zero = infinity = reliable connection.
>
> I do not understand low level bluetooth details, but is ERTM related to
> OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT?
>
> So what are default settings for L2CAP socket used by AVDTP/A2DP
> profiles which are transferred to user application via DBUS?

Hi! Do you have any idea about OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT? It is
related to ERTM or not?

--
Pali Rohár
[email protected]

2019-06-07 15:41:43

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: bluez A2DP socket reliability

Hi Pali,

On Fri, Jun 7, 2019 at 4:00 PM Pali Rohár <[email protected]> wrote:
>
> On Sunday 19 May 2019 14:22:23 Pali Rohár wrote:
> > On Sunday 19 May 2019 11:13:09 Luiz Augusto von Dentz wrote:
> > > Hi Pali,
> > >
> > > On Sat, May 18, 2019 at 11:12 PM Pali Rohár <[email protected]> wrote:
> > > >
> > > > Hello! How is L2CAP layer of bluetooth socket used for A2DP audio
> > > > transfer configured in bluez? It is reliable with big/infinite
> > > > retransmit count? Or in best-effort manner and some packets may be
> > > > dropped? And it is possible to change between these two modes for
> > > > application which uses bluez DBUS API? I'm asking because some A2DP
> > > > audio codecs are designed to deal with packet loss and for those codecs
> > > > it would be probably better to configure L2CAP socket to unreliable
> > > > mode.
> > >
> > > We don't use ERTM with AVDTP, both signaling and transport sockets are
> > > using basic mode which don't support retransmissions, there the
> > > concept of flush timeout which iirc we don't currently it.
> >
> > On bluez.org site there is no information how to use bluez sockets and
> > the only documentation/tutorial which I found on internet was this:
> >
> > https://people.csail.mit.edu/albert/bluez-intro/x559.html
> >
> > I do not know how up-to-date it is, but seems that by default bluez
> > L2CAP sockets are reliable and to change them to unreliable mode it is
> > needed to issue OGF_HOST_CTL / OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT (0x28)
> > request. As default is zero = infinity = reliable connection.
> >
> > I do not understand low level bluetooth details, but is ERTM related to
> > OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT?
> >
> > So what are default settings for L2CAP socket used by AVDTP/A2DP
> > profiles which are transferred to user application via DBUS?
>
> Hi! Do you have any idea about OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT? It is
> related to ERTM or not?

The OCF usually describes an HCI command which may affect the entire
ACL connection, ERTM is a L2CAP channel mode that includes
retransmissions. The A2DP stream transport doesn't ERTM so no
retransmissions shall take place.

--
Luiz Augusto von Dentz

2019-06-10 11:02:21

by Pali Rohár

[permalink] [raw]
Subject: Re: bluez A2DP socket reliability

On Friday 07 June 2019 18:23:41 Luiz Augusto von Dentz wrote:
> Hi Pali,
>
> On Fri, Jun 7, 2019 at 4:00 PM Pali Rohár <[email protected]> wrote:
> >
> > On Sunday 19 May 2019 14:22:23 Pali Rohár wrote:
> > > On Sunday 19 May 2019 11:13:09 Luiz Augusto von Dentz wrote:
> > > > Hi Pali,
> > > >
> > > > On Sat, May 18, 2019 at 11:12 PM Pali Rohár <[email protected]> wrote:
> > > > >
> > > > > Hello! How is L2CAP layer of bluetooth socket used for A2DP audio
> > > > > transfer configured in bluez? It is reliable with big/infinite
> > > > > retransmit count? Or in best-effort manner and some packets may be
> > > > > dropped? And it is possible to change between these two modes for
> > > > > application which uses bluez DBUS API? I'm asking because some A2DP
> > > > > audio codecs are designed to deal with packet loss and for those codecs
> > > > > it would be probably better to configure L2CAP socket to unreliable
> > > > > mode.
> > > >
> > > > We don't use ERTM with AVDTP, both signaling and transport sockets are
> > > > using basic mode which don't support retransmissions, there the
> > > > concept of flush timeout which iirc we don't currently it.
> > >
> > > On bluez.org site there is no information how to use bluez sockets and
> > > the only documentation/tutorial which I found on internet was this:
> > >
> > > https://people.csail.mit.edu/albert/bluez-intro/x559.html
> > >
> > > I do not know how up-to-date it is, but seems that by default bluez
> > > L2CAP sockets are reliable and to change them to unreliable mode it is
> > > needed to issue OGF_HOST_CTL / OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT (0x28)
> > > request. As default is zero = infinity = reliable connection.
> > >
> > > I do not understand low level bluetooth details, but is ERTM related to
> > > OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT?
> > >
> > > So what are default settings for L2CAP socket used by AVDTP/A2DP
> > > profiles which are transferred to user application via DBUS?
> >
> > Hi! Do you have any idea about OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT? It is
> > related to ERTM or not?
>
> The OCF usually describes an HCI command which may affect the entire
> ACL connection, ERTM is a L2CAP channel mode that includes
> retransmissions. The A2DP stream transport doesn't ERTM so no
> retransmissions shall take place.

Fine, no retransmission is good for A2DP.

And how it is with delivering packets? It is possible that may be
delivered to other side in wrong order?

--
Pali Rohár
[email protected]

2019-06-10 12:20:28

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: bluez A2DP socket reliability

Hi Pali,

On Mon, Jun 10, 2019 at 1:51 PM Pali Rohár <[email protected]> wrote:
>
> On Friday 07 June 2019 18:23:41 Luiz Augusto von Dentz wrote:
> > Hi Pali,
> >
> > On Fri, Jun 7, 2019 at 4:00 PM Pali Rohár <[email protected]> wrote:
> > >
> > > On Sunday 19 May 2019 14:22:23 Pali Rohár wrote:
> > > > On Sunday 19 May 2019 11:13:09 Luiz Augusto von Dentz wrote:
> > > > > Hi Pali,
> > > > >
> > > > > On Sat, May 18, 2019 at 11:12 PM Pali Rohár <[email protected]> wrote:
> > > > > >
> > > > > > Hello! How is L2CAP layer of bluetooth socket used for A2DP audio
> > > > > > transfer configured in bluez? It is reliable with big/infinite
> > > > > > retransmit count? Or in best-effort manner and some packets may be
> > > > > > dropped? And it is possible to change between these two modes for
> > > > > > application which uses bluez DBUS API? I'm asking because some A2DP
> > > > > > audio codecs are designed to deal with packet loss and for those codecs
> > > > > > it would be probably better to configure L2CAP socket to unreliable
> > > > > > mode.
> > > > >
> > > > > We don't use ERTM with AVDTP, both signaling and transport sockets are
> > > > > using basic mode which don't support retransmissions, there the
> > > > > concept of flush timeout which iirc we don't currently it.
> > > >
> > > > On bluez.org site there is no information how to use bluez sockets and
> > > > the only documentation/tutorial which I found on internet was this:
> > > >
> > > > https://people.csail.mit.edu/albert/bluez-intro/x559.html
> > > >
> > > > I do not know how up-to-date it is, but seems that by default bluez
> > > > L2CAP sockets are reliable and to change them to unreliable mode it is
> > > > needed to issue OGF_HOST_CTL / OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT (0x28)
> > > > request. As default is zero = infinity = reliable connection.
> > > >
> > > > I do not understand low level bluetooth details, but is ERTM related to
> > > > OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT?
> > > >
> > > > So what are default settings for L2CAP socket used by AVDTP/A2DP
> > > > profiles which are transferred to user application via DBUS?
> > >
> > > Hi! Do you have any idea about OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT? It is
> > > related to ERTM or not?
> >
> > The OCF usually describes an HCI command which may affect the entire
> > ACL connection, ERTM is a L2CAP channel mode that includes
> > retransmissions. The A2DP stream transport doesn't ERTM so no
> > retransmissions shall take place.
>
> Fine, no retransmission is good for A2DP.
>
> And how it is with delivering packets? It is possible that may be
> delivered to other side in wrong order?

It is a single hop with guaranteed ordering at L2CAP channel, you can
control the priority on a per socket manner but afaik PA is already
setting that to high priority which helps when dealing with
congestions due to other traffic like OBEX, etc.

--
Luiz Augusto von Dentz

2019-06-10 16:38:37

by Frédéric Danis

[permalink] [raw]
Subject: Re: bluez A2DP socket reliability

Hi,

Le 10/06/2019 à 12:51, Pali Rohár a écrit :
> On Friday 07 June 2019 18:23:41 Luiz Augusto von Dentz wrote:
>> Hi Pali,
>>
>> On Fri, Jun 7, 2019 at 4:00 PM Pali Rohár<[email protected]> wrote:
>>> On Sunday 19 May 2019 14:22:23 Pali Rohár wrote:
>>>> On Sunday 19 May 2019 11:13:09 Luiz Augusto von Dentz wrote:
>>>>> Hi Pali,
>>>>>
>>>>> On Sat, May 18, 2019 at 11:12 PM Pali Rohár<[email protected]> wrote:
>>>>>> Hello! How is L2CAP layer of bluetooth socket used for A2DP audio
>>>>>> transfer configured in bluez? It is reliable with big/infinite
>>>>>> retransmit count? Or in best-effort manner and some packets may be
>>>>>> dropped? And it is possible to change between these two modes for
>>>>>> application which uses bluez DBUS API? I'm asking because some A2DP
>>>>>> audio codecs are designed to deal with packet loss and for those codecs
>>>>>> it would be probably better to configure L2CAP socket to unreliable
>>>>>> mode.
>>>>> We don't use ERTM with AVDTP, both signaling and transport sockets are
>>>>> using basic mode which don't support retransmissions, there the
>>>>> concept of flush timeout which iirc we don't currently it.
>>>> On bluez.org site there is no information how to use bluez sockets and
>>>> the only documentation/tutorial which I found on internet was this:
>>>>
>>>> https://people.csail.mit.edu/albert/bluez-intro/x559.html
>>>>
>>>> I do not know how up-to-date it is, but seems that by default bluez
>>>> L2CAP sockets are reliable and to change them to unreliable mode it is
>>>> needed to issue OGF_HOST_CTL / OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT (0x28)
>>>> request. As default is zero = infinity = reliable connection.
>>>>
>>>> I do not understand low level bluetooth details, but is ERTM related to
>>>> OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT?
>>>>
>>>> So what are default settings for L2CAP socket used by AVDTP/A2DP
>>>> profiles which are transferred to user application via DBUS?
>>> Hi! Do you have any idea about OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT? It is
>>> related to ERTM or not?
>> The OCF usually describes an HCI command which may affect the entire
>> ACL connection, ERTM is a L2CAP channel mode that includes
>> retransmissions. The A2DP stream transport doesn't ERTM so no
>> retransmissions shall take place.
> Fine, no retransmission is good for A2DP.

I am not sure there is no retransmission with current implementation.
AFAIU, ERTM and automatic flush timeout are not linked. ERTM operates at
L2CAP level while automatic flush timeout [1] operates at ACL level.
When I read the automatic flush timeout set for an A2DP SBC connection
it returns 0, which means that the connection uses an infinite timeout.
So, even if higher levels set packets as flushable, the ACL policy
requests baseband to indefinitely try to send data [3]:
  "The default Flush Timeout shall be infinite,
    i.e. re-transmissions are carried out until
    physical link loss occurs. This is also
    referred to as a 'reliable channel.'"

[1] Bluetooth core Vol 2, Part E, 6.19
[2] Bluetooth core Vol 2, Part E, 7.3.29
[3] Bluetooth core Vol 2, Part B, 7.6.3

--
Frédéric Danis Embedded Linux Consultant
[email protected]

2019-06-14 07:16:45

by Pali Rohár

[permalink] [raw]
Subject: Re: bluez A2DP socket reliability

On Monday 10 June 2019 18:06:53 Frédéric Danis wrote:
> Hi,
>
> Le 10/06/2019 à 12:51, Pali Rohár a écrit :
> > On Friday 07 June 2019 18:23:41 Luiz Augusto von Dentz wrote:
> > > Hi Pali,
> > >
> > > On Fri, Jun 7, 2019 at 4:00 PM Pali Rohár<[email protected]> wrote:
> > > > On Sunday 19 May 2019 14:22:23 Pali Rohár wrote:
> > > > > On Sunday 19 May 2019 11:13:09 Luiz Augusto von Dentz wrote:
> > > > > > Hi Pali,
> > > > > >
> > > > > > On Sat, May 18, 2019 at 11:12 PM Pali Rohár<[email protected]> wrote:
> > > > > > > Hello! How is L2CAP layer of bluetooth socket used for A2DP audio
> > > > > > > transfer configured in bluez? It is reliable with big/infinite
> > > > > > > retransmit count? Or in best-effort manner and some packets may be
> > > > > > > dropped? And it is possible to change between these two modes for
> > > > > > > application which uses bluez DBUS API? I'm asking because some A2DP
> > > > > > > audio codecs are designed to deal with packet loss and for those codecs
> > > > > > > it would be probably better to configure L2CAP socket to unreliable
> > > > > > > mode.
> > > > > > We don't use ERTM with AVDTP, both signaling and transport sockets are
> > > > > > using basic mode which don't support retransmissions, there the
> > > > > > concept of flush timeout which iirc we don't currently it.
> > > > > On bluez.org site there is no information how to use bluez sockets and
> > > > > the only documentation/tutorial which I found on internet was this:
> > > > >
> > > > > https://people.csail.mit.edu/albert/bluez-intro/x559.html
> > > > >
> > > > > I do not know how up-to-date it is, but seems that by default bluez
> > > > > L2CAP sockets are reliable and to change them to unreliable mode it is
> > > > > needed to issue OGF_HOST_CTL / OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT (0x28)
> > > > > request. As default is zero = infinity = reliable connection.
> > > > >
> > > > > I do not understand low level bluetooth details, but is ERTM related to
> > > > > OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT?
> > > > >
> > > > > So what are default settings for L2CAP socket used by AVDTP/A2DP
> > > > > profiles which are transferred to user application via DBUS?
> > > > Hi! Do you have any idea about OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT? It is
> > > > related to ERTM or not?
> > > The OCF usually describes an HCI command which may affect the entire
> > > ACL connection, ERTM is a L2CAP channel mode that includes
> > > retransmissions. The A2DP stream transport doesn't ERTM so no
> > > retransmissions shall take place.
> > Fine, no retransmission is good for A2DP.
>
> I am not sure there is no retransmission with current implementation.
> AFAIU, ERTM and automatic flush timeout are not linked. ERTM operates at
> L2CAP level while automatic flush timeout [1] operates at ACL level.
> When I read the automatic flush timeout set for an A2DP SBC connection it
> returns 0, which means that the connection uses an infinite timeout. So,
> even if higher levels set packets as flushable, the ACL policy requests
> baseband to indefinitely try to send data [3]:
>   "The default Flush Timeout shall be infinite,
>     i.e. re-transmissions are carried out until
>     physical link loss occurs. This is also
>     referred to as a 'reliable channel.'"
>
> [1] Bluetooth core Vol 2, Part E, 6.19
> [2] Bluetooth core Vol 2, Part E, 7.3.29
> [3] Bluetooth core Vol 2, Part B, 7.6.3

Mhm... I feeling quite lost. Is A2DP socket reliable with enabled
retransmission or not?

--
Pali Rohár
[email protected]