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 |
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 |
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
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!
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); >
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); > > >
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); > > > > > > >
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 --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);
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(-)