diff mbox series

[BlueZ,RFC] profile: Add probe_on_discover flag

Message ID 20230802201538.584029-1-luiz.dentz@gmail.com (mailing list archive)
State Accepted
Commit 67a26abe53bf33422c17a3f63866e76864b92bc2
Headers show
Series [BlueZ,RFC] profile: Add probe_on_discover flag | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
tedd_an/CheckPatch success CheckPatch PASS
tedd_an/GitLint success Gitlint PASS
tedd_an/BuildEll success Build ELL PASS
tedd_an/BluezMake success Bluez Make PASS
tedd_an/MakeCheck success Bluez Make Check PASS
tedd_an/MakeDistcheck success Make Distcheck PASS
tedd_an/CheckValgrind success Check Valgrind PASS
tedd_an/CheckSmatch success CheckSparse PASS
tedd_an/bluezmakeextell success Make External ELL PASS
tedd_an/IncrementalBuild success Incremental Build PASS
tedd_an/ScanBuild success Scan Build PASS

Commit Message

Luiz Augusto von Dentz Aug. 2, 2023, 8:15 p.m. UTC
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>

This adds probe_on_discover flag which indicates if profile needs to be
probed when the remote_uuid is discovered and changes device logic to
attempt to probe driver when a new UUID is discovered and
probe_on_discover is set.
---
 src/device.c  | 22 +++++++++++++++++-----
 src/profile.h |  5 +++++
 2 files changed, 22 insertions(+), 5 deletions(-)

Comments

bluez.test.bot@gmail.com Aug. 2, 2023, 9:41 p.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=772324

---Test result---

Test Summary:
CheckPatch                    PASS      0.55 seconds
GitLint                       PASS      0.35 seconds
BuildEll                      PASS      27.75 seconds
BluezMake                     PASS      1007.36 seconds
MakeCheck                     PASS      12.02 seconds
MakeDistcheck                 PASS      158.45 seconds
CheckValgrind                 PASS      259.81 seconds
CheckSmatch                   PASS      345.99 seconds
bluezmakeextell               PASS      106.11 seconds
IncrementalBuild              PASS      850.98 seconds
ScanBuild                     PASS      1094.63 seconds



---
Regards,
Linux Bluetooth
patchwork-bot+bluetooth@kernel.org Aug. 9, 2023, 5:20 p.m. UTC | #2
Hello:

This patch was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:

On Wed,  2 Aug 2023 13:15:38 -0700 you wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> 
> This adds probe_on_discover flag which indicates if profile needs to be
> probed when the remote_uuid is discovered and changes device logic to
> attempt to probe driver when a new UUID is discovered and
> probe_on_discover is set.
> 
> [...]

Here is the summary with links:
  - [BlueZ,RFC] profile: Add probe_on_discover flag
    https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=67a26abe53bf

You are awesome, thank you!
Pauli Virtanen Aug. 9, 2023, 6:31 p.m. UTC | #3
Hi Luiz,

ke, 2023-08-02 kello 13:15 -0700, Luiz Augusto von Dentz kirjoitti:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> 
> This adds probe_on_discover flag which indicates if profile needs to be
> probed when the remote_uuid is discovered and changes device logic to
> attempt to probe driver when a new UUID is discovered and
> probe_on_discover is set.
> ---
>  src/device.c  | 22 +++++++++++++++++-----
>  src/profile.h |  5 +++++
>  2 files changed, 22 insertions(+), 5 deletions(-)

Note this seems to break (unicast) BAP for me, bap_probe does not seem
to be called any more on the devices.

Previously it is called immediately on bluetoothd start, not clear if
that is how it should be.

> 
> diff --git a/src/device.c b/src/device.c
> index b43ced8b5c91..19ae03f7d98a 100644
> --- a/src/device.c
> +++ b/src/device.c
> @@ -2156,7 +2156,7 @@ done:
>  void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
>  {
>  	GSList *l;
> -	bool added = false;
> +	GSList *added = NULL;
>  
>  	if (dev->bredr_state.svc_resolved || dev->le_state.svc_resolved)
>  		return;
> @@ -2165,13 +2165,11 @@ void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
>  		const char *str = l->data;
>  		if (g_slist_find_custom(dev->eir_uuids, str, bt_uuid_strcmp))
>  			continue;
> -		added = true;
> +		added = g_slist_append(added, (void *)str);
>  		dev->eir_uuids = g_slist_append(dev->eir_uuids, g_strdup(str));
>  	}
>  
> -	if (added)
> -		g_dbus_emit_property_changed(dbus_conn, dev->path,
> -						DEVICE_INTERFACE, "UUIDs");
> +	device_probe_profiles(dev, added);
>  }
>  
>  static void add_manufacturer_data(void *data, void *user_data)
> @@ -2201,6 +2199,7 @@ static void add_service_data(void *data, void *user_data)
>  	struct eir_sd *sd = data;
>  	struct btd_device *dev = user_data;
>  	bt_uuid_t uuid;
> +	GSList *l;
>  
>  	if (bt_string_to_uuid(&uuid, sd->uuid) < 0)
>  		return;
> @@ -2208,6 +2207,10 @@ static void add_service_data(void *data, void *user_data)
>  	if (!bt_ad_add_service_data(dev->ad, &uuid, sd->data, sd->data_len))
>  		return;
>  
> +	l = g_slist_append(NULL, sd->uuid);
> +	device_add_eir_uuids(dev, l);
> +	g_slist_free(l);
> +
>  	g_dbus_emit_property_changed(dbus_conn, dev->path,
>  					DEVICE_INTERFACE, "ServiceData");
>  }
> @@ -3930,6 +3933,12 @@ static bool device_match_profile(struct btd_device *device,
>  	if (profile->remote_uuid == NULL)
>  		return false;
>  
> +	/* Don't match if device was just discovered (not connected) and the
> +	 * profile don't have probe_on_discover flag set.
> +	 */
> +	if (!btd_device_is_connected(device) && !profile->probe_on_discover)
> +		return false;
> +
>  	if (g_slist_find_custom(uuids, profile->remote_uuid,
>  							bt_uuid_strcmp) == NULL)
>  		return false;
> @@ -4884,6 +4893,9 @@ void device_probe_profiles(struct btd_device *device, GSList *uuids)
>  	struct probe_data d = { device, uuids };
>  	char addr[18];
>  
> +	if (!uuids)
> +		return;
> +
>  	ba2str(&device->bdaddr, addr);
>  
>  	if (device->blocked) {
> diff --git a/src/profile.h b/src/profile.h
> index 6871f2f0d7d8..cfc50058812d 100644
> --- a/src/profile.h
> +++ b/src/profile.h
> @@ -33,6 +33,11 @@ struct btd_profile {
>  	 */
>  	bool experimental;
>  
> +	/* Indicates the profile needs to be probed when the remote_uuid is
> +	 * discovered.
> +	 */
> +	bool probe_on_discover;
> +
>  	int (*device_probe) (struct btd_service *service);
>  	void (*device_remove) (struct btd_service *service);
>
Luiz Augusto von Dentz Aug. 9, 2023, 7:17 p.m. UTC | #4
Hi Pauli,

On Wed, Aug 9, 2023 at 11:31 AM Pauli Virtanen <pav@iki.fi> wrote:
>
> Hi Luiz,
>
> ke, 2023-08-02 kello 13:15 -0700, Luiz Augusto von Dentz kirjoitti:
> > From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> >
> > This adds probe_on_discover flag which indicates if profile needs to be
> > probed when the remote_uuid is discovered and changes device logic to
> > attempt to probe driver when a new UUID is discovered and
> > probe_on_discover is set.
> > ---
> >  src/device.c  | 22 +++++++++++++++++-----
> >  src/profile.h |  5 +++++
> >  2 files changed, 22 insertions(+), 5 deletions(-)
>
> Note this seems to break (unicast) BAP for me, bap_probe does not seem
> to be called any more on the devices.

On master?

> Previously it is called immediately on bluetoothd start, not clear if
> that is how it should be.

It should be probed as per usual, so there might be a bug with it then.

> >
> > diff --git a/src/device.c b/src/device.c
> > index b43ced8b5c91..19ae03f7d98a 100644
> > --- a/src/device.c
> > +++ b/src/device.c
> > @@ -2156,7 +2156,7 @@ done:
> >  void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
> >  {
> >       GSList *l;
> > -     bool added = false;
> > +     GSList *added = NULL;
> >
> >       if (dev->bredr_state.svc_resolved || dev->le_state.svc_resolved)
> >               return;
> > @@ -2165,13 +2165,11 @@ void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
> >               const char *str = l->data;
> >               if (g_slist_find_custom(dev->eir_uuids, str, bt_uuid_strcmp))
> >                       continue;
> > -             added = true;
> > +             added = g_slist_append(added, (void *)str);
> >               dev->eir_uuids = g_slist_append(dev->eir_uuids, g_strdup(str));
> >       }
> >
> > -     if (added)
> > -             g_dbus_emit_property_changed(dbus_conn, dev->path,
> > -                                             DEVICE_INTERFACE, "UUIDs");
> > +     device_probe_profiles(dev, added);
> >  }
> >
> >  static void add_manufacturer_data(void *data, void *user_data)
> > @@ -2201,6 +2199,7 @@ static void add_service_data(void *data, void *user_data)
> >       struct eir_sd *sd = data;
> >       struct btd_device *dev = user_data;
> >       bt_uuid_t uuid;
> > +     GSList *l;
> >
> >       if (bt_string_to_uuid(&uuid, sd->uuid) < 0)
> >               return;
> > @@ -2208,6 +2207,10 @@ static void add_service_data(void *data, void *user_data)
> >       if (!bt_ad_add_service_data(dev->ad, &uuid, sd->data, sd->data_len))
> >               return;
> >
> > +     l = g_slist_append(NULL, sd->uuid);
> > +     device_add_eir_uuids(dev, l);
> > +     g_slist_free(l);
> > +
> >       g_dbus_emit_property_changed(dbus_conn, dev->path,
> >                                       DEVICE_INTERFACE, "ServiceData");
> >  }
> > @@ -3930,6 +3933,12 @@ static bool device_match_profile(struct btd_device *device,
> >       if (profile->remote_uuid == NULL)
> >               return false;
> >
> > +     /* Don't match if device was just discovered (not connected) and the
> > +      * profile don't have probe_on_discover flag set.
> > +      */
> > +     if (!btd_device_is_connected(device) && !profile->probe_on_discover)
> > +             return false;
> > +
> >       if (g_slist_find_custom(uuids, profile->remote_uuid,
> >                                                       bt_uuid_strcmp) == NULL)
> >               return false;
> > @@ -4884,6 +4893,9 @@ void device_probe_profiles(struct btd_device *device, GSList *uuids)
> >       struct probe_data d = { device, uuids };
> >       char addr[18];
> >
> > +     if (!uuids)
> > +             return;
> > +
> >       ba2str(&device->bdaddr, addr);
> >
> >       if (device->blocked) {
> > diff --git a/src/profile.h b/src/profile.h
> > index 6871f2f0d7d8..cfc50058812d 100644
> > --- a/src/profile.h
> > +++ b/src/profile.h
> > @@ -33,6 +33,11 @@ struct btd_profile {
> >        */
> >       bool experimental;
> >
> > +     /* Indicates the profile needs to be probed when the remote_uuid is
> > +      * discovered.
> > +      */
> > +     bool probe_on_discover;
> > +
> >       int (*device_probe) (struct btd_service *service);
> >       void (*device_remove) (struct btd_service *service);
> >
>
Pauli Virtanen Aug. 9, 2023, 7:39 p.m. UTC | #5
Hi Luiz,

ke, 2023-08-09 kello 12:17 -0700, Luiz Augusto von Dentz kirjoitti:
> Hi Pauli,
> 
> On Wed, Aug 9, 2023 at 11:31 AM Pauli Virtanen <pav@iki.fi> wrote:
> > 
> > Hi Luiz,
> > 
> > ke, 2023-08-02 kello 13:15 -0700, Luiz Augusto von Dentz kirjoitti:
> > > From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> > > 
> > > This adds probe_on_discover flag which indicates if profile needs to be
> > > probed when the remote_uuid is discovered and changes device logic to
> > > attempt to probe driver when a new UUID is discovered and
> > > probe_on_discover is set.
> > > ---
> > >  src/device.c  | 22 +++++++++++++++++-----
> > >  src/profile.h |  5 +++++
> > >  2 files changed, 22 insertions(+), 5 deletions(-)
> > 
> > Note this seems to break (unicast) BAP for me, bap_probe does not seem
> > to be called any more on the devices.
> 
> On master?

Yes, at 3370c462552b0 I have on bluetoothd startup

elo 09 22:35:02 fedora bluetoothd[2611]: src/adapter.c:load_irks() hci0 irks 2
elo 09 22:35:02 fedora bluetoothd[2611]: src/adapter.c:load_conn_params() hci0 conn params 2
elo 09 22:35:02 fedora bluetoothd[2611]: src/device.c:device_probe_profiles() Probing profiles for device 28:3D:C2:4A:7D:2A
elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/csip.c:csip_probe() 28:3D:C2:4A:7D:2A
elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/csip.c:csip_data_add() data 0x603000018250
elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b1d0: device 28:3D:C2:4A:7D:2A profile csip state changed: unavailable -> disconnected (0)
elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/bass.c:bass_probe() 28:3D:C2:4A:7D:2A
elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/bass.c:bass_data_add() data 0x603000018310
elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b210: device 28:3D:C2:4A:7D:2A profile bass state changed: unavailable -> disconnected (0)
elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/bap.c:bap_probe() 28:3D:C2:4A:7D:2A
elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/bap.c:bap_data_add() data 0x60b000019060
elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b250: device 28:3D:C2:4A:7D:2A profile bap state changed: unavailable -> disconnected (0)
elo 09 22:35:02 fedora bluetoothd[2611]: profiles/battery/battery.c:batt_probe() BATT profile probe (28:3D:C2:4A:7D:2A)
elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b310: device 28:3D:C2:4A:7D:2A profile batt-profile state changed: unavailable -> disconnected (0)
elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b350: device 28:3D:C2:4A:7D:2A profile deviceinfo state changed: unavailable -> disconnected (0)
elo 09 22:35:02 fedora bluetoothd[2611]: profiles/gap/gas.c:gap_probe() GAP profile probe (28:3D:C2:4A:7D:2A)
elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b390: device 28:3D:C2:4A:7D:2A profile gap-profile state changed: unavailable -> disconnected (0)
elo 09 22:35:02 fedora bluetoothd[2611]: src/device.c:device_probe_profiles() Probing profiles for device 28:3D:C2:4A:7E:DA
...

but at 67a26abe53bf it becomes

elo 09 22:37:00 fedora bluetoothd[2861]: src/adapter.c:load_irks() hci0 irks 2
elo 09 22:37:00 fedora bluetoothd[2861]: src/adapter.c:load_conn_params() hci0 conn params 2
elo 09 22:37:00 fedora bluetoothd[2861]: src/device.c:device_probe_profiles() Probing profiles for device 28:3D:C2:4A:7D:2A
elo 09 22:37:00 fedora bluetoothd[2861]: src/device.c:device_probe_profiles() Probing profiles for device 28:3D:C2:4A:7E:DA

The device is not connected at this point, but it also doesn't probe
the profiles when connecting.

> 
> > Previously it is called immediately on bluetoothd start, not clear if
> > that is how it should be.
> 
> It should be probed as per usual, so there might be a bug with it then.
> 
> > > 
> > > diff --git a/src/device.c b/src/device.c
> > > index b43ced8b5c91..19ae03f7d98a 100644
> > > --- a/src/device.c
> > > +++ b/src/device.c
> > > @@ -2156,7 +2156,7 @@ done:
> > >  void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
> > >  {
> > >       GSList *l;
> > > -     bool added = false;
> > > +     GSList *added = NULL;
> > > 
> > >       if (dev->bredr_state.svc_resolved || dev->le_state.svc_resolved)
> > >               return;
> > > @@ -2165,13 +2165,11 @@ void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
> > >               const char *str = l->data;
> > >               if (g_slist_find_custom(dev->eir_uuids, str, bt_uuid_strcmp))
> > >                       continue;
> > > -             added = true;
> > > +             added = g_slist_append(added, (void *)str);
> > >               dev->eir_uuids = g_slist_append(dev->eir_uuids, g_strdup(str));
> > >       }
> > > 
> > > -     if (added)
> > > -             g_dbus_emit_property_changed(dbus_conn, dev->path,
> > > -                                             DEVICE_INTERFACE, "UUIDs");
> > > +     device_probe_profiles(dev, added);
> > >  }
> > > 
> > >  static void add_manufacturer_data(void *data, void *user_data)
> > > @@ -2201,6 +2199,7 @@ static void add_service_data(void *data, void *user_data)
> > >       struct eir_sd *sd = data;
> > >       struct btd_device *dev = user_data;
> > >       bt_uuid_t uuid;
> > > +     GSList *l;
> > > 
> > >       if (bt_string_to_uuid(&uuid, sd->uuid) < 0)
> > >               return;
> > > @@ -2208,6 +2207,10 @@ static void add_service_data(void *data, void *user_data)
> > >       if (!bt_ad_add_service_data(dev->ad, &uuid, sd->data, sd->data_len))
> > >               return;
> > > 
> > > +     l = g_slist_append(NULL, sd->uuid);
> > > +     device_add_eir_uuids(dev, l);
> > > +     g_slist_free(l);
> > > +
> > >       g_dbus_emit_property_changed(dbus_conn, dev->path,
> > >                                       DEVICE_INTERFACE, "ServiceData");
> > >  }
> > > @@ -3930,6 +3933,12 @@ static bool device_match_profile(struct btd_device *device,
> > >       if (profile->remote_uuid == NULL)
> > >               return false;
> > > 
> > > +     /* Don't match if device was just discovered (not connected) and the
> > > +      * profile don't have probe_on_discover flag set.
> > > +      */
> > > +     if (!btd_device_is_connected(device) && !profile->probe_on_discover)
> > > +             return false;
> > > +
> > >       if (g_slist_find_custom(uuids, profile->remote_uuid,
> > >                                                       bt_uuid_strcmp) == NULL)
> > >               return false;
> > > @@ -4884,6 +4893,9 @@ void device_probe_profiles(struct btd_device *device, GSList *uuids)
> > >       struct probe_data d = { device, uuids };
> > >       char addr[18];
> > > 
> > > +     if (!uuids)
> > > +             return;
> > > +
> > >       ba2str(&device->bdaddr, addr);
> > > 
> > >       if (device->blocked) {
> > > diff --git a/src/profile.h b/src/profile.h
> > > index 6871f2f0d7d8..cfc50058812d 100644
> > > --- a/src/profile.h
> > > +++ b/src/profile.h
> > > @@ -33,6 +33,11 @@ struct btd_profile {
> > >        */
> > >       bool experimental;
> > > 
> > > +     /* Indicates the profile needs to be probed when the remote_uuid is
> > > +      * discovered.
> > > +      */
> > > +     bool probe_on_discover;
> > > +
> > >       int (*device_probe) (struct btd_service *service);
> > >       void (*device_remove) (struct btd_service *service);
> > > 
> > 
> 
>
Luiz Augusto von Dentz Aug. 9, 2023, 7:53 p.m. UTC | #6
Hi Pauli,

On Wed, Aug 9, 2023 at 12:39 PM Pauli Virtanen <pav@iki.fi> wrote:
>
> Hi Luiz,
>
> ke, 2023-08-09 kello 12:17 -0700, Luiz Augusto von Dentz kirjoitti:
> > Hi Pauli,
> >
> > On Wed, Aug 9, 2023 at 11:31 AM Pauli Virtanen <pav@iki.fi> wrote:
> > >
> > > Hi Luiz,
> > >
> > > ke, 2023-08-02 kello 13:15 -0700, Luiz Augusto von Dentz kirjoitti:
> > > > From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> > > >
> > > > This adds probe_on_discover flag which indicates if profile needs to be
> > > > probed when the remote_uuid is discovered and changes device logic to
> > > > attempt to probe driver when a new UUID is discovered and
> > > > probe_on_discover is set.
> > > > ---
> > > >  src/device.c  | 22 +++++++++++++++++-----
> > > >  src/profile.h |  5 +++++
> > > >  2 files changed, 22 insertions(+), 5 deletions(-)
> > >
> > > Note this seems to break (unicast) BAP for me, bap_probe does not seem
> > > to be called any more on the devices.
> >
> > On master?
>
> Yes, at 3370c462552b0 I have on bluetoothd startup
>
> elo 09 22:35:02 fedora bluetoothd[2611]: src/adapter.c:load_irks() hci0 irks 2
> elo 09 22:35:02 fedora bluetoothd[2611]: src/adapter.c:load_conn_params() hci0 conn params 2
> elo 09 22:35:02 fedora bluetoothd[2611]: src/device.c:device_probe_profiles() Probing profiles for device 28:3D:C2:4A:7D:2A
> elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/csip.c:csip_probe() 28:3D:C2:4A:7D:2A
> elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/csip.c:csip_data_add() data 0x603000018250
> elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b1d0: device 28:3D:C2:4A:7D:2A profile csip state changed: unavailable -> disconnected (0)
> elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/bass.c:bass_probe() 28:3D:C2:4A:7D:2A
> elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/bass.c:bass_data_add() data 0x603000018310
> elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b210: device 28:3D:C2:4A:7D:2A profile bass state changed: unavailable -> disconnected (0)
> elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/bap.c:bap_probe() 28:3D:C2:4A:7D:2A
> elo 09 22:35:02 fedora bluetoothd[2611]: profiles/audio/bap.c:bap_data_add() data 0x60b000019060
> elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b250: device 28:3D:C2:4A:7D:2A profile bap state changed: unavailable -> disconnected (0)
> elo 09 22:35:02 fedora bluetoothd[2611]: profiles/battery/battery.c:batt_probe() BATT profile probe (28:3D:C2:4A:7D:2A)
> elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b310: device 28:3D:C2:4A:7D:2A profile batt-profile state changed: unavailable -> disconnected (0)
> elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b350: device 28:3D:C2:4A:7D:2A profile deviceinfo state changed: unavailable -> disconnected (0)
> elo 09 22:35:02 fedora bluetoothd[2611]: profiles/gap/gas.c:gap_probe() GAP profile probe (28:3D:C2:4A:7D:2A)
> elo 09 22:35:02 fedora bluetoothd[2611]: src/service.c:change_state() 0x60400000b390: device 28:3D:C2:4A:7D:2A profile gap-profile state changed: unavailable -> disconnected (0)
> elo 09 22:35:02 fedora bluetoothd[2611]: src/device.c:device_probe_profiles() Probing profiles for device 28:3D:C2:4A:7E:DA
> ...
>
> but at 67a26abe53bf it becomes
>
> elo 09 22:37:00 fedora bluetoothd[2861]: src/adapter.c:load_irks() hci0 irks 2
> elo 09 22:37:00 fedora bluetoothd[2861]: src/adapter.c:load_conn_params() hci0 conn params 2
> elo 09 22:37:00 fedora bluetoothd[2861]: src/device.c:device_probe_profiles() Probing profiles for device 28:3D:C2:4A:7D:2A
> elo 09 22:37:00 fedora bluetoothd[2861]: src/device.c:device_probe_profiles() Probing profiles for device 28:3D:C2:4A:7E:DA
>
> The device is not connected at this point, but it also doesn't probe
> the profiles when connecting.

Yep, seems like we should be checking if the device is temporary
rather than connected:

https://patchwork.kernel.org/project/bluetooth/patch/20230809194620.1595792-1-luiz.dentz@gmail.com/

> >
> > > Previously it is called immediately on bluetoothd start, not clear if
> > > that is how it should be.
> >
> > It should be probed as per usual, so there might be a bug with it then.
> >
> > > >
> > > > diff --git a/src/device.c b/src/device.c
> > > > index b43ced8b5c91..19ae03f7d98a 100644
> > > > --- a/src/device.c
> > > > +++ b/src/device.c
> > > > @@ -2156,7 +2156,7 @@ done:
> > > >  void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
> > > >  {
> > > >       GSList *l;
> > > > -     bool added = false;
> > > > +     GSList *added = NULL;
> > > >
> > > >       if (dev->bredr_state.svc_resolved || dev->le_state.svc_resolved)
> > > >               return;
> > > > @@ -2165,13 +2165,11 @@ void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
> > > >               const char *str = l->data;
> > > >               if (g_slist_find_custom(dev->eir_uuids, str, bt_uuid_strcmp))
> > > >                       continue;
> > > > -             added = true;
> > > > +             added = g_slist_append(added, (void *)str);
> > > >               dev->eir_uuids = g_slist_append(dev->eir_uuids, g_strdup(str));
> > > >       }
> > > >
> > > > -     if (added)
> > > > -             g_dbus_emit_property_changed(dbus_conn, dev->path,
> > > > -                                             DEVICE_INTERFACE, "UUIDs");
> > > > +     device_probe_profiles(dev, added);
> > > >  }
> > > >
> > > >  static void add_manufacturer_data(void *data, void *user_data)
> > > > @@ -2201,6 +2199,7 @@ static void add_service_data(void *data, void *user_data)
> > > >       struct eir_sd *sd = data;
> > > >       struct btd_device *dev = user_data;
> > > >       bt_uuid_t uuid;
> > > > +     GSList *l;
> > > >
> > > >       if (bt_string_to_uuid(&uuid, sd->uuid) < 0)
> > > >               return;
> > > > @@ -2208,6 +2207,10 @@ static void add_service_data(void *data, void *user_data)
> > > >       if (!bt_ad_add_service_data(dev->ad, &uuid, sd->data, sd->data_len))
> > > >               return;
> > > >
> > > > +     l = g_slist_append(NULL, sd->uuid);
> > > > +     device_add_eir_uuids(dev, l);
> > > > +     g_slist_free(l);
> > > > +
> > > >       g_dbus_emit_property_changed(dbus_conn, dev->path,
> > > >                                       DEVICE_INTERFACE, "ServiceData");
> > > >  }
> > > > @@ -3930,6 +3933,12 @@ static bool device_match_profile(struct btd_device *device,
> > > >       if (profile->remote_uuid == NULL)
> > > >               return false;
> > > >
> > > > +     /* Don't match if device was just discovered (not connected) and the
> > > > +      * profile don't have probe_on_discover flag set.
> > > > +      */
> > > > +     if (!btd_device_is_connected(device) && !profile->probe_on_discover)
> > > > +             return false;
> > > > +
> > > >       if (g_slist_find_custom(uuids, profile->remote_uuid,
> > > >                                                       bt_uuid_strcmp) == NULL)
> > > >               return false;
> > > > @@ -4884,6 +4893,9 @@ void device_probe_profiles(struct btd_device *device, GSList *uuids)
> > > >       struct probe_data d = { device, uuids };
> > > >       char addr[18];
> > > >
> > > > +     if (!uuids)
> > > > +             return;
> > > > +
> > > >       ba2str(&device->bdaddr, addr);
> > > >
> > > >       if (device->blocked) {
> > > > diff --git a/src/profile.h b/src/profile.h
> > > > index 6871f2f0d7d8..cfc50058812d 100644
> > > > --- a/src/profile.h
> > > > +++ b/src/profile.h
> > > > @@ -33,6 +33,11 @@ struct btd_profile {
> > > >        */
> > > >       bool experimental;
> > > >
> > > > +     /* Indicates the profile needs to be probed when the remote_uuid is
> > > > +      * discovered.
> > > > +      */
> > > > +     bool probe_on_discover;
> > > > +
> > > >       int (*device_probe) (struct btd_service *service);
> > > >       void (*device_remove) (struct btd_service *service);
> > > >
> > >
> >
> >
>
diff mbox series

Patch

diff --git a/src/device.c b/src/device.c
index b43ced8b5c91..19ae03f7d98a 100644
--- a/src/device.c
+++ b/src/device.c
@@ -2156,7 +2156,7 @@  done:
 void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
 {
 	GSList *l;
-	bool added = false;
+	GSList *added = NULL;
 
 	if (dev->bredr_state.svc_resolved || dev->le_state.svc_resolved)
 		return;
@@ -2165,13 +2165,11 @@  void device_add_eir_uuids(struct btd_device *dev, GSList *uuids)
 		const char *str = l->data;
 		if (g_slist_find_custom(dev->eir_uuids, str, bt_uuid_strcmp))
 			continue;
-		added = true;
+		added = g_slist_append(added, (void *)str);
 		dev->eir_uuids = g_slist_append(dev->eir_uuids, g_strdup(str));
 	}
 
-	if (added)
-		g_dbus_emit_property_changed(dbus_conn, dev->path,
-						DEVICE_INTERFACE, "UUIDs");
+	device_probe_profiles(dev, added);
 }
 
 static void add_manufacturer_data(void *data, void *user_data)
@@ -2201,6 +2199,7 @@  static void add_service_data(void *data, void *user_data)
 	struct eir_sd *sd = data;
 	struct btd_device *dev = user_data;
 	bt_uuid_t uuid;
+	GSList *l;
 
 	if (bt_string_to_uuid(&uuid, sd->uuid) < 0)
 		return;
@@ -2208,6 +2207,10 @@  static void add_service_data(void *data, void *user_data)
 	if (!bt_ad_add_service_data(dev->ad, &uuid, sd->data, sd->data_len))
 		return;
 
+	l = g_slist_append(NULL, sd->uuid);
+	device_add_eir_uuids(dev, l);
+	g_slist_free(l);
+
 	g_dbus_emit_property_changed(dbus_conn, dev->path,
 					DEVICE_INTERFACE, "ServiceData");
 }
@@ -3930,6 +3933,12 @@  static bool device_match_profile(struct btd_device *device,
 	if (profile->remote_uuid == NULL)
 		return false;
 
+	/* Don't match if device was just discovered (not connected) and the
+	 * profile don't have probe_on_discover flag set.
+	 */
+	if (!btd_device_is_connected(device) && !profile->probe_on_discover)
+		return false;
+
 	if (g_slist_find_custom(uuids, profile->remote_uuid,
 							bt_uuid_strcmp) == NULL)
 		return false;
@@ -4884,6 +4893,9 @@  void device_probe_profiles(struct btd_device *device, GSList *uuids)
 	struct probe_data d = { device, uuids };
 	char addr[18];
 
+	if (!uuids)
+		return;
+
 	ba2str(&device->bdaddr, addr);
 
 	if (device->blocked) {
diff --git a/src/profile.h b/src/profile.h
index 6871f2f0d7d8..cfc50058812d 100644
--- a/src/profile.h
+++ b/src/profile.h
@@ -33,6 +33,11 @@  struct btd_profile {
 	 */
 	bool experimental;
 
+	/* Indicates the profile needs to be probed when the remote_uuid is
+	 * discovered.
+	 */
+	bool probe_on_discover;
+
 	int (*device_probe) (struct btd_service *service);
 	void (*device_remove) (struct btd_service *service);