Re: [PATCH BlueZ 1/2] src/profile.c: Allow the "Address Type" to be set

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

 



Hi Mark,

On Wed, Aug 19, 2020 at 8:13 AM Mark Marshall
<mark.marshall@xxxxxxxxxxxxxxxxx> wrote:
>
> This allows us to have profiles that use LE L2CAP connections.
> ---
>  doc/profile-api.txt | 10 ++++++++++
>  src/profile.c       | 18 +++++++++++++++++-
>  2 files changed, 27 insertions(+), 1 deletion(-)
>
> diff --git a/doc/profile-api.txt b/doc/profile-api.txt
> index 183c6c11a..8c7d0a06d 100644
> --- a/doc/profile-api.txt
> +++ b/doc/profile-api.txt
> @@ -112,6 +112,16 @@ Object path        /org/bluez
>
>                                         Profile features (for SDP record)
>
> +                               uint16 AddressType
> +
> +                                       Allows the Address Type to be
> +                                       selected, can be either
> +                                       BDADDR_BREDR, BDADDR_LE_PUBLIC
> +                                       or BDADDR_LE_RANDOM.  If an LE
> +                                       address is selected and the
> +                                       device is not found, the other
> +                                       sort of LE address is tried.

This sounds like a good idea but aren't we missing the GATT service
that actually exposes the PSM for the client to connect to? We should
probably make RegisterApplication accept Profile1 interfaces in such
cases so one can register both at the same time. Also note that this
should be consistent with Device.AddressType which uses a string to
not a uint16.

> +
>                         Possible errors: org.bluez.Error.InvalidArguments
>                                          org.bluez.Error.AlreadyExists
>
> diff --git a/src/profile.c b/src/profile.c
> index 6961a107b..10850f305 100644
> --- a/src/profile.c
> +++ b/src/profile.c
> @@ -677,6 +677,7 @@ struct ext_profile {
>         guint id;
>
>         BtIOMode mode;
> +       uint8_t addr_type;
>         BtIOSecLevel sec_level;
>         bool authorize;
>
> @@ -1173,9 +1174,16 @@ static struct ext_io *create_conn(struct ext_io *server, GIOChannel *io,
>         struct btd_service *service;
>         struct ext_io *conn;
>         GIOCondition cond;
> +       uint8_t addr_type;
>         char addr[18];
>
> -       device = btd_adapter_find_device(server->adapter, dst, BDADDR_BREDR);
> +       addr_type = server->ext->addr_type;
> +       device = btd_adapter_find_device(server->adapter, dst, addr_type);
> +       if (device == NULL && addr_type != BDADDR_BREDR) {
> +               addr_type ^= (BDADDR_LE_PUBLIC | BDADDR_LE_RANDOM);
> +               device = btd_adapter_find_device(server->adapter, dst,
> +                                                addr_type);
> +       }
>         if (device == NULL) {
>                 ba2str(dst, addr);
>                 error("%s device %s not found", server->ext->name, addr);
> @@ -1350,6 +1358,7 @@ static uint32_t ext_start_servers(struct ext_profile *ext,
>                 io = bt_io_listen(connect, confirm, l2cap, NULL, &err,
>                                         BT_IO_OPT_SOURCE_BDADDR,
>                                         btd_adapter_get_address(adapter),
> +                                       BT_IO_OPT_SOURCE_TYPE, ext->addr_type,
>                                         BT_IO_OPT_MODE, ext->mode,
>                                         BT_IO_OPT_PSM, psm,
>                                         BT_IO_OPT_SEC_LEVEL, ext->sec_level,
> @@ -1567,6 +1576,8 @@ static int connect_io(struct ext_io *conn, const bdaddr_t *src,
>                 io = bt_io_connect(ext_connect, conn, NULL, &gerr,
>                                         BT_IO_OPT_SOURCE_BDADDR, src,
>                                         BT_IO_OPT_DEST_BDADDR, dst,
> +                                       BT_IO_OPT_SOURCE_TYPE, ext->addr_type,
> +                                       BT_IO_OPT_DEST_TYPE, ext->addr_type,
>                                         BT_IO_OPT_SEC_LEVEL, ext->sec_level,
>                                         BT_IO_OPT_PSM, conn->psm,
>                                         BT_IO_OPT_INVALID);
> @@ -2285,6 +2296,11 @@ static int parse_ext_opt(struct ext_profile *ext, const char *key,
>                 dbus_message_iter_get_basic(value, &str);
>                 free(ext->service);
>                 ext->service = bt_name2string(str);
> +       } else if (strcasecmp(key, "AddressType") == 0) {
> +               if (type != DBUS_TYPE_UINT16)
> +                       return -EINVAL;
> +               dbus_message_iter_get_basic(value, &u16);
> +               ext->addr_type = u16;
>         }
>
>         return 0;
> --
> 2.17.1
>


-- 
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