Re: [Bluez PATCH v1] input: Don't browse SDP if HIDSDPDisable is set

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Archie,

On Mon, Aug 17, 2020 at 12:23 AM Archie Pusaka <apusaka@xxxxxxxxxx> wrote:
>
> Hi Luiz,
>
>
> On Sat, 15 Aug 2020 at 02:59, Luiz Augusto von Dentz
> <luiz.dentz@xxxxxxxxx> wrote:
> >
> > Hi Archie,
> >
> > On Tue, Aug 11, 2020 at 9:21 PM Archie Pusaka <apusaka@xxxxxxxxxx> wrote:
> > >
> > > From: Archie Pusaka <apusaka@xxxxxxxxxxxx>
> > >
> > > 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@xxxxxxxxxxxx>
> > > ---
> > >
> > >  profiles/input/device.c | 2 ++
> > >  src/device.c            | 8 +++++++-
> > >  src/device.h            | 1 +
> > >  3 files changed, 10 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/profiles/input/device.c b/profiles/input/device.c
> > > index 6ec0a4c63..fac8c6896 100644
> > > --- a/profiles/input/device.c
> > > +++ b/profiles/input/device.c
> > > @@ -1373,6 +1373,8 @@ static struct input_device *input_device_new(struct btd_service *service)
> > >         /* Initialize device properties */
> > >         extract_hid_props(idev, rec);
> > >
> > > +       device_set_skip_passive_sdp_discovery(device, idev->disable_sdp);
> >
> > Shouldn't you actually be checking for the presence of HIDSDPDisable,
>
> Yes, the variable idev->disable_sdp stores the presence of
> HIDSDPDisable attribute.

I didn't realize it was already being stored, now it makes sense.

> > I suppose the first time when you pair with it the SDP must be active
> > in order for us to be able to probe the drivers, then once we get the
> > SDP records stored we should inhibit the refresh of the records.
>
> Correct, the first time we pair the device, SDP is still active as
> usual. The additional check is only applied when refreshing the SDP
> records.
>
> >
> > >         return idev;
> > >  }
> > >
> > > diff --git a/src/device.c b/src/device.c
> > > index 2237a7670..a67787a2d 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            skip_passive_sdp_discovery;

Let's have it as refresh_discovery and I'd add support for setting it
globally on main.conf so  we can initialize it with
main_opts.refresh_discovery so we are consistent with the terminology
we have been using.

> > >
> > >         /* Manage whether this device can wake the system from suspend.
> > >          * - wake_support: Requires a profile that supports wake (i.e. HID)
> > > @@ -1472,6 +1473,10 @@ static gboolean dev_property_wake_allowed_exist(
> > >         return device_get_wake_support(device);
> > >  }
> > >
> > > +void device_set_skip_passive_sdp_discovery(struct btd_device *dev, bool skip)
> > > +{
> > > +       dev->skip_passive_sdp_discovery = skip;
> > > +}
> > >
> > >  static gboolean disconnect_all(gpointer user_data)
> > >  {
> > > @@ -1805,7 +1810,8 @@ 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->skip_passive_sdp_discovery)
> > >                         device_browse_sdp(dev, NULL);

Then here just check for dev->refresh_discovery.

> > >                 g_dbus_send_reply(dbus_conn, dev->connect, DBUS_TYPE_INVALID);
> > >         }
> > > diff --git a/src/device.h b/src/device.h
> > > index cb8d884e8..5348d2652 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_skip_passive_sdp_discovery(struct btd_device *dev, bool skip);

And here we name it device_set_refresh_discovery so plugins can
actually set if the device should have refresh_discovery
enabled/disabled.

> > >
> > >  typedef void (*disconnect_watch) (struct btd_device *device, gboolean removal,
> > >                                         void *user_data);
> > > --
> > > 2.28.0.236.gb10cc79966-goog
> > >
> >
> >
> > --
> > Luiz Augusto von Dentz
>
> Thanks,
> Archie



-- 
Luiz Augusto von Dentz



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux