Message ID | 20200818153257.Bluez.v3.1.I254123a1c85e8cb22739cbbb1ffa2f56ac41faa8@changeid (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Luiz Von Dentz |
Headers | show |
Series | [Bluez,v3,1/2] device: Don't browse SDP if HIDSDPDisable is set | expand |
Hi Archie, On Tue, Aug 18, 2020 at 12:34 AM Archie Pusaka <apusaka@google.com> wrote: > > From: Archie Pusaka <apusaka@chromium.org> > > According to the HID1.1 spec, part 5.3.4.9: > The HIDSDPDisable attribute is a Boolean value, which indicates > whether connection to the SDP channel and Control or Interrupt > channels are mutually exclusive. This feature supports Bluetooth > HID devices that have minimal resources, and multiplex those > resources between servicing the initialization (SDP) and runtime > (Control and Interrupt) channels. > > However, Bluez still tries to connect SDP upon HID connection, > regardless of the existence of the HIDSDPDisable attribute. > > This patch prevents the connection of SDP after HID has been > established, if the device has HIDSDPDisable attribute. > > Reviewed-by: Sonny Sasaka <sonnysasaka@chromium.org> > --- > > Changes in v3: None > Changes in v2: > * Renaming passive_sdp_discovery to refresh_discovery > > profiles/input/device.c | 3 +++ > src/device.c | 11 +++++++++-- > src/device.h | 1 + > 3 files changed, 13 insertions(+), 2 deletions(-) > > diff --git a/profiles/input/device.c b/profiles/input/device.c > index 6ec0a4c63..5e47b88f2 100644 > --- a/profiles/input/device.c > +++ b/profiles/input/device.c > @@ -1373,6 +1373,9 @@ static struct input_device *input_device_new(struct btd_service *service) > /* Initialize device properties */ > extract_hid_props(idev, rec); > > + if (idev->disable_sdp) > + device_set_refresh_discovery(device, false); > + > return idev; > } > > diff --git a/src/device.c b/src/device.c > index 2237a7670..52dfea18f 100644 > --- a/src/device.c > +++ b/src/device.c > @@ -195,6 +195,7 @@ struct btd_device { > bool le; > bool pending_paired; /* "Paired" waiting for SDP */ > bool svc_refreshed; > + bool refresh_discovery; > > /* Manage whether this device can wake the system from suspend. > * - wake_support: Requires a profile that supports wake (i.e. HID) > @@ -1472,7 +1473,6 @@ static gboolean dev_property_wake_allowed_exist( > return device_get_wake_support(device); > } > > - > static gboolean disconnect_all(gpointer user_data) > { > struct btd_device *device = user_data; > @@ -1805,7 +1805,7 @@ done: > btd_error_failed(dev->connect, strerror(-err))); > } else { > /* Start passive SDP discovery to update known services */ > - if (dev->bredr && !dev->svc_refreshed) > + if (dev->bredr && !dev->svc_refreshed && dev->refresh_discovery) > device_browse_sdp(dev, NULL); > g_dbus_send_reply(dbus_conn, dev->connect, DBUS_TYPE_INVALID); > } > @@ -2572,6 +2572,11 @@ done: > browse_request_free(req); > } > > +void device_set_refresh_discovery(struct btd_device *dev, bool refresh) > +{ > + dev->refresh_discovery = refresh; > +} > + > static void device_set_svc_refreshed(struct btd_device *device, bool value) > { > if (device->svc_refreshed == value) > @@ -4071,6 +4076,8 @@ static struct btd_device *device_new(struct btd_adapter *adapter, > device->db_id = gatt_db_register(device->db, gatt_service_added, > gatt_service_removed, device, NULL); > > + device->refresh_discovery = true; > + > return btd_device_ref(device); > } > > diff --git a/src/device.h b/src/device.h > index cb8d884e8..5ba2d7fe0 100644 > --- a/src/device.h > +++ b/src/device.h > @@ -145,6 +145,7 @@ void device_set_wake_override(struct btd_device *device, bool wake_override); > void device_set_wake_allowed(struct btd_device *device, bool wake_allowed, > guint32 id); > void device_set_wake_allowed_complete(struct btd_device *device); > +void device_set_refresh_discovery(struct btd_device *dev, bool refresh); > > typedef void (*disconnect_watch) (struct btd_device *device, gboolean removal, > void *user_data); > -- > 2.28.0.220.ged08abb693-goog Applied, thanks.
diff --git a/profiles/input/device.c b/profiles/input/device.c index 6ec0a4c63..5e47b88f2 100644 --- a/profiles/input/device.c +++ b/profiles/input/device.c @@ -1373,6 +1373,9 @@ static struct input_device *input_device_new(struct btd_service *service) /* Initialize device properties */ extract_hid_props(idev, rec); + if (idev->disable_sdp) + device_set_refresh_discovery(device, false); + return idev; } diff --git a/src/device.c b/src/device.c index 2237a7670..52dfea18f 100644 --- a/src/device.c +++ b/src/device.c @@ -195,6 +195,7 @@ struct btd_device { bool le; bool pending_paired; /* "Paired" waiting for SDP */ bool svc_refreshed; + bool refresh_discovery; /* Manage whether this device can wake the system from suspend. * - wake_support: Requires a profile that supports wake (i.e. HID) @@ -1472,7 +1473,6 @@ static gboolean dev_property_wake_allowed_exist( return device_get_wake_support(device); } - static gboolean disconnect_all(gpointer user_data) { struct btd_device *device = user_data; @@ -1805,7 +1805,7 @@ done: btd_error_failed(dev->connect, strerror(-err))); } else { /* Start passive SDP discovery to update known services */ - if (dev->bredr && !dev->svc_refreshed) + if (dev->bredr && !dev->svc_refreshed && dev->refresh_discovery) device_browse_sdp(dev, NULL); g_dbus_send_reply(dbus_conn, dev->connect, DBUS_TYPE_INVALID); } @@ -2572,6 +2572,11 @@ done: browse_request_free(req); } +void device_set_refresh_discovery(struct btd_device *dev, bool refresh) +{ + dev->refresh_discovery = refresh; +} + static void device_set_svc_refreshed(struct btd_device *device, bool value) { if (device->svc_refreshed == value) @@ -4071,6 +4076,8 @@ static struct btd_device *device_new(struct btd_adapter *adapter, device->db_id = gatt_db_register(device->db, gatt_service_added, gatt_service_removed, device, NULL); + device->refresh_discovery = true; + return btd_device_ref(device); } diff --git a/src/device.h b/src/device.h index cb8d884e8..5ba2d7fe0 100644 --- a/src/device.h +++ b/src/device.h @@ -145,6 +145,7 @@ void device_set_wake_override(struct btd_device *device, bool wake_override); void device_set_wake_allowed(struct btd_device *device, bool wake_allowed, guint32 id); void device_set_wake_allowed_complete(struct btd_device *device); +void device_set_refresh_discovery(struct btd_device *dev, bool refresh); typedef void (*disconnect_watch) (struct btd_device *device, gboolean removal, void *user_data);