linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Pauli Virtanen <pav@iki.fi>
To: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Cc: linux-bluetooth@vger.kernel.org
Subject: Re: [RFC, BlueZ] bap: check adapter support before enabling BAP
Date: Sat, 28 Jan 2023 09:26:21 +0000	[thread overview]
Message-ID: <00234f093d58acd5545eb10c6f956ba04393f645.camel@iki.fi> (raw)
In-Reply-To: <CABBYNZLBUXuYLBdRDba2ReGLe0wgXx-=4itG3qczqKker5ZVmw@mail.gmail.com>

Hi Luiz,

pe, 2023-01-27 kello 16:28 -0800, Luiz Augusto von Dentz kirjoitti:
> On Fri, Jan 27, 2023 at 12:56 PM Pauli Virtanen <pav@iki.fi> wrote:
> > When the BT adapter does not have the "Connected Isochronous Stream - Central"
> > feature, establishing ISO connections fails at a late stage.  Namely, we get
> > EOPNOTSUPP in connect() due to cis_central_capable(hdev) being false.  However,
> > at that point BlueZ and the rest of the userspace like sound servers have
> > already set up the BAP stuff, and think they are trying to do something that
> > should succeed under normal conditions.
> > 
> > It appears the information about what features the adapter actually has should
> > be available to BlueZ earlier, and BlueZ should provide accurate information
> > about the adapter capabilities to the rest of the userspace.
> > 
> > For LE Audio in particular this is sort of important, because the adapter
> > support is not currently there, and only fairly new adapter models have these
> > features. There's also a few other bits (Core Sec 4.6, table 4.6) that BlueZ
> > might need to know later on, once support for more LE Audio parts is added.
> > 
> > At the moment the ISO sockets are under the experimental feature flag, so I'm
> > not sure if this is something that is to be added right now.
> > 
> > Below is a quick hack, which just exposes these bits to the mgmt settings a la
> > WBS and handles them in BlueZ.  But would this be the right place to put them
> > in the first place? Other ideas?  Trying to connect() to some random addresses
> > from userspace just to probe the feature capability probably is not the right
> > thing.
> 
> While it is probably a good idea to add as a feature it should be
> tight to ISO sockets itself, and perhaps we should have both central
> and peripheral flags so we can detect if we need to register the GATT
> services when registering the MediaEndpoint.

Thanks, I'll make a proper patch along these lines then, with the three
CIS and BIS feature bits that are currently checked on kernel side in
connect() in the mgmt controller info.

> > 
> > ---
> >  doc/mgmt-api.txt       |  2 ++
> >  lib/mgmt.h             |  1 +
> >  profiles/audio/bap.c   |  5 +++++
> >  profiles/audio/media.c |  3 +++
> >  src/adapter.c          | 11 +++++++++++
> >  src/adapter.h          |  6 ++++++
> >  tools/btmgmt.c         |  1 +
> >  7 files changed, 29 insertions(+)
> > 
> >  include/net/bluetooth/mgmt.h | 1 +
> >  net/bluetooth/mgmt.c         | 6 ++++++
> >  2 files changed, 7 insertions(+)
> > 
> > 
> > diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
> > index 90d612ed8..11798629a 100644
> > --- a/doc/mgmt-api.txt
> > +++ b/doc/mgmt-api.txt
> > @@ -333,6 +333,7 @@ Read Controller Information Command
> >                 16      PHY Configuration
> >                 17      Wideband Speech
> >                 18      Quality Report
> > +               19      Connected Isochronous Stream Central
> > 
> >         This command generates a Command Complete event on success or
> >         a Command Status event on failure.
> > @@ -2926,6 +2927,7 @@ Read Extended Controller Information Command
> >                 16      PHY Configuration
> >                 17      Wideband Speech
> >                 18      Quality Report
> > +               19      Connected Isochronous Stream Central
> > 
> >         The EIR_Data field contains information about class of device,
> >         local name and other values. Not all of them might be present. For
> > diff --git a/lib/mgmt.h b/lib/mgmt.h
> > index 796190cd9..610770491 100644
> > --- a/lib/mgmt.h
> > +++ b/lib/mgmt.h
> > @@ -96,6 +96,7 @@ struct mgmt_rp_read_index_list {
> >  #define MGMT_SETTING_STATIC_ADDRESS    0x00008000
> >  #define MGMT_SETTING_PHY_CONFIGURATION 0x00010000
> >  #define MGMT_SETTING_WIDEBAND_SPEECH   0x00020000
> > +#define MGMT_SETTING_CIS_CENTRAL       0x00040000
> > 
> >  #define MGMT_OP_READ_INFO              0x0004
> >  struct mgmt_rp_read_info {
> > diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c
> > index e5ffb7230..2cd12465a 100644
> > --- a/profiles/audio/bap.c
> > +++ b/profiles/audio/bap.c
> > @@ -1264,6 +1264,11 @@ static int bap_probe(struct btd_service *service)
> >                 return -ENOTSUP;
> >         }
> > 
> > +       if (!btd_adapter_has_feature(adapter, ADAPTER_FEAT_CIS_CENTRAL)) {
> > +               error("BAP requires CIS Central, but unsupported by adapter");
> > +               return -ENOTSUP;
> 
> In theory this is correct, BAP shall only be used by the central, but
> we need to make sure the code doesn't assume bap driver is also needed
> when acting as peripheral.
> 
> > +       }
> > +
> >         /* Ignore, if we were probed for this device already */
> >         if (data) {
> >                 error("Profile probed twice for the same device!");
> > diff --git a/profiles/audio/media.c b/profiles/audio/media.c
> > index fbb350889..873dee33e 100644
> > --- a/profiles/audio/media.c
> > +++ b/profiles/audio/media.c
> > @@ -1259,6 +1259,9 @@ static bool experimental_endpoint_supported(struct btd_adapter *adapter)
> >         if (!btd_adapter_has_exp_feature(adapter, EXP_FEAT_ISO_SOCKET))
> >                 return false;
> > 
> > +       if (!btd_adapter_has_feature(adapter, ADAPTER_FEAT_CIS_CENTRAL))
> > +               return false;
> 
> We can act both as central and peripheral so we need to check none of
> those are supported then the UUIDs shall not be listed.
> 
> >         return g_dbus_get_flags() & G_DBUS_FLAG_ENABLE_EXPERIMENTAL;
> >  }
> > 
> > diff --git a/src/adapter.c b/src/adapter.c
> > index aadad4016..2e038ace0 100644
> > --- a/src/adapter.c
> > +++ b/src/adapter.c
> > @@ -10717,6 +10717,17 @@ bool btd_has_kernel_features(uint32_t features)
> >         return (kernel_features & features) ? true : false;
> >  }
> > 
> > +bool btd_adapter_has_feature(struct btd_adapter *adapter, uint32_t feature)
> > +{
> > +       size_t i;
> > +       uint32_t features = 0;
> > +
> > +       if (adapter->supported_settings & MGMT_SETTING_CIS_CENTRAL)
> > +               features |= ADAPTER_FEAT_CIS_CENTRAL;
> > +
> > +       return features & feature;
> > +}
> > +
> >  bool btd_adapter_has_exp_feature(struct btd_adapter *adapter, uint32_t feature)
> >  {
> >         size_t i;
> > diff --git a/src/adapter.h b/src/adapter.h
> > index 78eb069ae..6a9a626bc 100644
> > --- a/src/adapter.h
> > +++ b/src/adapter.h
> > @@ -256,6 +256,12 @@ void btd_adapter_for_each_device(struct btd_adapter *adapter,
> > 
> >  bool btd_le_connect_before_pairing(void);
> > 
> > +enum adapter_features {
> > +       ADAPTER_FEAT_CIS_CENTRAL        = 1 << 0,
> > +};
> > +
> > +bool btd_adapter_has_feature(struct btd_adapter *adapter, uint32_t feature);
> > +
> >  enum experimental_features {
> >         EXP_FEAT_DEBUG                  = 1 << 0,
> >         EXP_FEAT_LE_SIMULT_ROLES        = 1 << 1,
> > diff --git a/tools/btmgmt.c b/tools/btmgmt.c
> > index 29f86091f..de614ced1 100644
> > --- a/tools/btmgmt.c
> > +++ b/tools/btmgmt.c
> > @@ -353,6 +353,7 @@ static const char *settings_str[] = {
> >                                 "static-addr",
> >                                 "phy-configuration",
> >                                 "wide-band-speech",
> > +                               "cis-central",
> >  };
> > 
> >  static const char *settings2str(uint32_t settings)
> > diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h
> > index 743f6f59dff8..dc284c5f5cbb 100644
> > --- a/include/net/bluetooth/mgmt.h
> > +++ b/include/net/bluetooth/mgmt.h
> > @@ -109,6 +109,7 @@ struct mgmt_rp_read_index_list {
> >  #define MGMT_SETTING_STATIC_ADDRESS    0x00008000
> >  #define MGMT_SETTING_PHY_CONFIGURATION 0x00010000
> >  #define MGMT_SETTING_WIDEBAND_SPEECH   0x00020000
> > +#define MGMT_SETTING_CIS_CENTRAL       0x00040000
> > 
> >  #define MGMT_OP_READ_INFO              0x0004
> >  #define MGMT_READ_INFO_SIZE            0
> > diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
> > index 0dd30a3beb77..d802faf60f26 100644
> > --- a/net/bluetooth/mgmt.c
> > +++ b/net/bluetooth/mgmt.c
> > @@ -859,6 +859,9 @@ static u32 get_supported_settings(struct hci_dev *hdev)
> >             hdev->set_bdaddr)
> >                 settings |= MGMT_SETTING_CONFIGURATION;
> > 
> > +       if (cis_central_capable(hdev))
> > +               settings |= MGMT_SETTING_CIS_CENTRAL;
> > +
> >         settings |= MGMT_SETTING_PHY_CONFIGURATION;
> > 
> >         return settings;
> > @@ -932,6 +935,9 @@ static u32 get_current_settings(struct hci_dev *hdev)
> >         if (hci_dev_test_flag(hdev, HCI_WIDEBAND_SPEECH_ENABLED))
> >                 settings |= MGMT_SETTING_WIDEBAND_SPEECH;
> > 
> > +       if (cis_central_capable(hdev) && iso_enabled())
> > +               settings |= MGMT_SETTING_CIS_CENTRAL;
> 
> I'd drop iso_enabled() from above, the features bits shall indicate
> the controller capability only, right now ISO packets can only be
> transferred via ISO sockets but this may change in the future if
> vendors decide they need a more specialized transport for audio.
> 
> >         return settings;
> >  }
> > 
> > --
> > 2.39.1
> > 
> 
> 

-- 
Pauli Virtanen

  parent reply	other threads:[~2023-01-28  9:28 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-27 20:52 [RFC, BlueZ] bap: check adapter support before enabling BAP Pauli Virtanen
2023-01-27 21:12 ` [RFC,BlueZ] " bluez.test.bot
2023-01-28  0:28 ` [RFC, BlueZ] " Luiz Augusto von Dentz
2023-01-28  0:29   ` Luiz Augusto von Dentz
2023-01-28  9:26   ` Pauli Virtanen [this message]
2023-01-30 18:37 ` [PATCH BlueZ 1/8] doc: add MGMT setting for CIS features, remove Quality Report Pauli Virtanen
2023-01-30 18:37   ` [PATCH BlueZ 2/8] lib: Add defines for MGMT setting bits for CIS feature support Pauli Virtanen
2023-02-07  1:13     ` Luiz Augusto von Dentz
2023-01-30 18:37   ` [PATCH BlueZ 3/8] monitor: add names " Pauli Virtanen
2023-02-07  1:12     ` Luiz Augusto von Dentz
2023-01-30 18:37   ` [PATCH BlueZ 4/8] tools/btmgmt: " Pauli Virtanen
2023-02-07  1:14     ` Luiz Augusto von Dentz
2023-01-30 18:37   ` [PATCH BlueZ 5/8] adapter: add functions indicating adapter CIS capability Pauli Virtanen
2023-02-07  1:10     ` Luiz Augusto von Dentz
2023-01-30 18:37   ` [PATCH BlueZ 6/8] media: Check adapter CIS support to add BAP in SupportedUUIDs Pauli Virtanen
2023-01-30 18:37   ` [PATCH BlueZ 7/8] shared/bap: handle central-only case Pauli Virtanen
2023-01-30 19:39     ` Luiz Augusto von Dentz
2023-01-30 20:04       ` Pauli Virtanen
2023-02-07  1:19         ` Luiz Augusto von Dentz
2023-01-30 18:37   ` [PATCH BlueZ 8/8] bap: handle adapters that are not CIS Central / Peripheral capable Pauli Virtanen
2023-02-07  1:27     ` Luiz Augusto von Dentz
2023-01-30 20:13   ` [BlueZ,1/8] doc: add MGMT setting for CIS features, remove Quality Report bluez.test.bot
2023-02-07  1:08   ` [PATCH BlueZ 1/8] " Luiz Augusto von Dentz
2023-02-10 20:07     ` Luiz Augusto von Dentz
2023-02-13 22:20   ` patchwork-bot+bluetooth
2023-02-01 18:41 ` [PATCH BlueZ] media: set default value for BAP endpoint Vendor field Pauli Virtanen
2023-02-01 19:10   ` Luiz Augusto von Dentz
2023-02-01 19:51   ` [PATCH BlueZ v2] " Pauli Virtanen
2023-02-01 21:14     ` [BlueZ,v2] " bluez.test.bot
2023-02-01 21:50     ` [PATCH BlueZ v2] " patchwork-bot+bluetooth
2023-02-01 20:05   ` [BlueZ] " bluez.test.bot
2023-02-11 10:53 ` [PATCH BlueZ v2 1/9] doc: remove unimplemented Quality Report from MGMT settings Pauli Virtanen
2023-02-11 10:53   ` [PATCH BlueZ v2 2/9] doc: add MGMT setting for CIS features Pauli Virtanen
2023-02-11 10:53   ` [PATCH BlueZ v2 3/9] lib: Add defines for MGMT setting bits for CIS feature support Pauli Virtanen
2023-02-11 10:53   ` [PATCH BlueZ v2 4/9] monitor: add MGMT setting bit names " Pauli Virtanen
2023-02-11 10:53   ` [PATCH BlueZ v2 5/9] tools/btmgmt: " Pauli Virtanen
2023-02-11 10:53   ` [PATCH BlueZ v2 6/9] adapter: add function for checking adapter features, add CIS features Pauli Virtanen
2023-02-11 10:53   ` [PATCH BlueZ v2 7/9] media: Check adapter CIS support to add BAP in SupportedUUIDs Pauli Virtanen
2023-02-11 10:53   ` [PATCH BlueZ v2 8/9] shared/bap: support client-only case Pauli Virtanen
2023-02-11 10:53   ` [PATCH BlueZ v2 9/9] bap: handle adapters that are not CIS Central / Peripheral capable Pauli Virtanen
2023-02-11 13:45   ` [BlueZ,v2,1/9] doc: remove unimplemented Quality Report from MGMT settings bluez.test.bot
2023-02-13 22:20   ` [PATCH BlueZ v2 1/9] " patchwork-bot+bluetooth
2023-02-13 22:30     ` Luiz Augusto von Dentz

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=00234f093d58acd5545eb10c6f956ba04393f645.camel@iki.fi \
    --to=pav@iki.fi \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=luiz.dentz@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).