Re: [PATCH v2 1/3] eir: parse data types for LE OOB pairing

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

 



Hi Luiz,

On Tue, Jun 21, 2022 at 1:57 PM Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
>
> Hi Mike,
>
> On Mon, Jun 13, 2022 at 3:28 PM Mike Brudevold <puffy.taco@xxxxxxxxx> wrote:
> >
> > Hi Luiz,
> >
> > On Mon, Jun 13, 2022 at 4:55 PM Luiz Augusto von Dentz
> > <luiz.dentz@xxxxxxxxx> wrote:
> > >
> > > Hi Mike,
> > >
> > > On Mon, Jun 13, 2022 at 2:42 PM Mike Brudevold <puffy.taco@xxxxxxxxx> wrote:
> > > >
> > > > Hi Luiz,
> > > >
> > > > > It might be better to handle this via bt_ad instance instead of
> > > > > eir_data, in fact the plan was always to switch to bt_ad but it seems
> > > > > we forgot about it at some point.
> > > >
> > > > Are you thinking something like below (doesn't fully compile,
> > > > name2utf8 is static in eir so I did nothing about that yet)?
> > > > Basically where the ad code parses the EIR data, but the neard plugin
> > > > still manages what to do with the data?  The alternative would be
> > > > where device.c became smarter to consume the ad struct itself and the
> > > > neard plugin becomes a simple conduit for the ad data.
> > >
> > > The later is probably better alternative, like I said I wrote bt_ad to
> > > replace eir handling completely so we could also write proper unit
> > > testing for it, Im fine if you want to take the time to change the
> > > daemon core itself but at least introduce support for the types you
> > > will be using in the plugin and then make use of them.
> > >
> > > > index 77a4630da..3d4064515 100644
> > > > --- a/plugins/neard.c
> > > > +++ b/plugins/neard.c
> > > > @@ -31,6 +31,7 @@
> > > >  #include "src/agent.h"
> > > >  #include "src/btd.h"
> > > >  #include "src/shared/util.h"
> > > > +#include "src/shared/ad.h"
> > > >
> > > >  #define NEARD_NAME "org.neard"
> > > >  #define NEARD_PATH "/org/neard"
> > > > @@ -336,6 +337,52 @@ static int check_device(struct btd_device *device)
> > > >         return 0;
> > > >  }
> > > >
> > > > +static void process_oob_adv(void *data, void *user_data)
> > > > +{
> > > > +       struct bt_ad_data *ad_data = data;
> > > > +       struct oob_params *remote = user_data;
> > > > +       uint8_t name_len;
> > > > +
> > > > +       switch (ad_data->type) {
> > > > +       case EIR_NAME_SHORT:
> > > > +       case EIR_NAME_COMPLETE:
> > > > +               name_len = ad_data->len;
> > > > +
> > > > +               /* Some vendors put a NUL byte terminator into
> > > > +                       * the name */
> > > > +               while (name_len > 0 && ad_data->data[name_len - 1] == '\0')
> > > > +                       name_len--;
> > > > +
> > > > +               g_free(remote->name);
> > > > +
> > > > +               remote->name = name2utf8(ad_data->data, name_len);
> > > > +               break;
> > > > +
> > > > +       case BT_AD_LE_DEVICE_ADDRESS:
> > > > +               if (ad_data->len < sizeof(bdaddr_t) + 1)
> > > > +                       break;
> > > > +
> > > > +               memcpy(&remote->address, ad_data->data, sizeof(bdaddr_t));
> > > > +               remote->address_type = ad_data->data[sizeof(bdaddr_t)] & 0x1 ?
> > > > +                               BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC;
> > > > +               break;
> > > > +
> > > > +       case EIR_LE_SC_CONF:
> > > > +               if (ad_data->len < 16)
> > > > +                       break;
> > > > +               free(remote->hash256);
> > > > +               remote->hash256 = util_memdup(ad_data->data, 16);
> > > > +               break;
> > > > +
> > > > +       case EIR_LE_SC_RAND:
> > > > +               if (ad_data->len < 16)
> > > > +                       break;
> > > > +               free(remote->randomizer256);
> > > > +               remote->randomizer256 = util_memdup(ad_data->data, 16);
> > > > +               break;
> > > > +       }
> > > > +}
> > >
> > > Do we need to duplicate this information? I'd consider just using the
> > > bt_ad instance to parse and store them, well perhaps we want to
> > > introduce something like bt_ad_foreach_type so you can locate the data
> > > by type?
> >
> > That's partly what I was checking on.  The ad code doesn't have much
> > functionality right now to be able to parse the meaning of the data,
> > beyond storing them in TLV format (bt_ad_data).  Which is the opposite
> > to how the data is given to ad if you're creating an advertisement
> > (e.g., service UUIDs are stored in bt_uuid_t format inside the service
> > queue when using bt_ad_add_service_uuid, not in the data queue).  This
> > means the ad code likely has to get smarter, but I wanted to make sure
> > I wasn't missing something that should have been obvious.  If the ad
> > code can present the data back in a usable format, then it wouldn't
> > really have to be duplicated.  Otherwise this code would have been an
> > easy way to not use the eir code while the ad code gets developed.
> > With some concern still that there's a type_reject_list related to the
> > data ad queue, but that can be completely bypassed when using
> > bt_ad_new_with_data - so this method is doing something that seems
> > unintended.
>
> Are you missing some feedback on these changes?

If you have any, I welcome them.  I have an idea of what I would do to
augment struct bt_ad by making bt_ad_new_with_data smarter to parse
out to other queues/data values, but it hasn't been the highest
priority so I haven't put any time into it.

>
> > >
> > > >  static int process_eir(uint8_t *eir, size_t size, struct oob_params *remote)
> > > >  {
> > > >         struct eir_data eir_data;
> > > > @@ -370,32 +417,17 @@ static int process_eir(uint8_t *eir, size_t
> > > > size, struct oob_params *remote)
> > > >
> > > >  static void process_eir_le(uint8_t *eir, size_t size, struct
> > > > oob_params *remote)
> > > >  {
> > > > -       struct eir_data eir_data;
> > > > +       struct bt_ad *ad;
> > > >
> > > >         DBG("size %zu", size);
> > > >
> > > > -       memset(&eir_data, 0, sizeof(eir_data));
> > > > -
> > > > -       eir_parse(&eir_data, eir, size);
> > > > -
> > > > -       bacpy(&remote->address, &eir_data.addr);
> > > > -       remote->address_type = eir_data.addr_type;
> > > > -
> > > > -       remote->class = eir_data.class;
> > > > -
> > > > -       remote->name = eir_data.name;
> > > > -       eir_data.name = NULL;
> > > > -
> > > > -       remote->services = eir_data.services;
> > > > -       eir_data.services = NULL;
> > > > -
> > > > -       remote->hash256 = eir_data.hash256;
> > > > -       eir_data.hash256 = NULL;
> > > > +       ad = bt_ad_new_with_data(size, eir);
> > > >
> > > > -       remote->randomizer256 = eir_data.randomizer256;
> > > > -       eir_data.randomizer256 = NULL;
> > > > +       if (ad) {
> > > > +               bt_ad_foreach_data(ad, process_oob_adv, remote);
> > > >
> > > > -       eir_data_free(&eir_data);
> > > > +               bt_ad_unref(ad);
> > > > +       }
> > > >  }
> > >
> > >
> > >
> > > --
> > > Luiz Augusto von Dentz
>
>
>
> --
> 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