diff mbox series

[BlueZ,v5,2/2] core: Add support of variable length params in mgmt_config

Message ID 20201028195132.BlueZ.v5.2.I2fa28644a012f69c4665977e5816bcf8a51963f5@changeid
State New
Headers show
Series [BlueZ,v5,1/2] mgmt: Add support of mgmt TLV API | expand

Commit Message

Howard Chung Oct. 28, 2020, 11:52 a.m. UTC
This adds support of variable length parameters in mgmt_config.
Also fixed the endian issue.


Reviewed-by: Miao-chen Chou <mcchou@chromium.org>
---
Changes in v5:
- use mgmt_tlv api

Changes in v4:
- fix type of buf_len

Changes in v3:
- use iovec to fill buffer

Changes in v2:
- fix multiple line dereference issue

 src/adapter.c | 264 +++++++++++++++++++-------------------------------
 src/main.c    |  35 ++++++-
 2 files changed, 130 insertions(+), 169 deletions(-)

Comments

Luiz Augusto von Dentz Oct. 28, 2020, 10:01 p.m. UTC | #1
Hi Howard,

On Wed, Oct 28, 2020 at 4:53 AM Howard Chung <howardchung@google.com> wrote:
>

> This adds support of variable length parameters in mgmt_config.

> Also fixed the endian issue.

>

>

> Reviewed-by: Miao-chen Chou <mcchou@chromium.org>

> ---

> Changes in v5:

> - use mgmt_tlv api

>

> Changes in v4:

> - fix type of buf_len

>

> Changes in v3:

> - use iovec to fill buffer

>

> Changes in v2:

> - fix multiple line dereference issue

>

>  src/adapter.c | 264 +++++++++++++++++++-------------------------------

>  src/main.c    |  35 ++++++-

>  2 files changed, 130 insertions(+), 169 deletions(-)

>

> diff --git a/src/adapter.c b/src/adapter.c

> index c0053000ac19..62b7bfbae021 100644

> --- a/src/adapter.c

> +++ b/src/adapter.c

> @@ -4165,267 +4165,197 @@ static void probe_devices(void *user_data)

>

>  static void load_default_system_params(struct btd_adapter *adapter)

>  {

> -       struct {

> -               struct mgmt_tlv entry;

> -               union {

> -                       uint16_t u16;

> -               };

> -       } __packed *params;

> -       uint16_t i = 0;

> -       size_t len = 0;

> -       unsigned int err;

> +       struct mgmt_tlv_list *tlv_list;

> +       unsigned int err = 0;

>

>         if (!main_opts.default_params.num_entries ||

>             !btd_has_kernel_features(KERNEL_SET_SYSTEM_CONFIG))

>                 return;

>

> -       params = malloc0(sizeof(*params) *

> -                       main_opts.default_params.num_entries);

> -

> -       len = sizeof(params->entry) * main_opts.default_params.num_entries;

> +       tlv_list = mgmt_tlv_list_new();

>

>         if (main_opts.default_params.br_page_scan_type != 0xFFFF) {

> -               params[i].entry.type = 0x0000;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.br_page_scan_type;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0000,

> +                       sizeof(main_opts.default_params.br_page_scan_type),

> +                       &main_opts.default_params.br_page_scan_type);

>         }

>

>         if (main_opts.default_params.br_page_scan_interval) {

> -               params[i].entry.type = 0x0001;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.br_page_scan_interval;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0001,

> +                       sizeof(main_opts.default_params.br_page_scan_interval),

> +                       &main_opts.default_params.br_page_scan_interval);

>         }

>

>         if (main_opts.default_params.br_page_scan_win) {

> -               params[i].entry.type = 0x0002;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.br_page_scan_win;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0002,

> +                       sizeof(main_opts.default_params.br_page_scan_win),

> +                       &main_opts.default_params.br_page_scan_win);

>         }

>

>         if (main_opts.default_params.br_scan_type != 0xFFFF) {

> -               params[i].entry.type = 0x0003;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.br_scan_type;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0003,

> +                       sizeof(main_opts.default_params.br_scan_type),

> +                       &main_opts.default_params.br_scan_type);

>         }

>

>         if (main_opts.default_params.br_scan_interval) {

> -               params[i].entry.type = 0x0004;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.br_scan_interval;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0004,

> +                       sizeof(main_opts.default_params.br_scan_interval),

> +                       &main_opts.default_params.br_scan_interval);

>         }

>

>         if (main_opts.default_params.br_scan_win) {

> -               params[i].entry.type = 0x0005;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.br_scan_win;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0005,

> +                       sizeof(main_opts.default_params.br_scan_win),

> +                       &main_opts.default_params.br_scan_win);

>         }

>

>         if (main_opts.default_params.br_link_supervision_timeout) {

> -               params[i].entry.type = 0x0006;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.br_link_supervision_timeout;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0006,

> +                       sizeof(main_opts.default_params.br_link_supervision_timeout),

> +                       &main_opts.default_params.br_link_supervision_timeout);

>         }

>

>         if (main_opts.default_params.br_page_timeout) {

> -               params[i].entry.type = 0x0007;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.br_page_timeout;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0007,

> +                       sizeof(main_opts.default_params.br_page_timeout),

> +                       &main_opts.default_params.br_page_timeout);

>         }

>

>         if (main_opts.default_params.br_min_sniff_interval) {

> -               params[i].entry.type = 0x0008;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.br_min_sniff_interval;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0008,

> +                       sizeof(main_opts.default_params.br_min_sniff_interval),

> +                       &main_opts.default_params.br_min_sniff_interval);

>         }

>

>         if (main_opts.default_params.br_max_sniff_interval) {

> -               params[i].entry.type = 0x0009;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.br_max_sniff_interval;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0009,

> +                       sizeof(main_opts.default_params.br_max_sniff_interval),

> +                       &main_opts.default_params.br_max_sniff_interval);

>         }

>

>         if (main_opts.default_params.le_min_adv_interval) {

> -               params[i].entry.type = 0x000a;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.le_min_adv_interval;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x000a,

> +                       sizeof(main_opts.default_params.le_min_adv_interval),

> +                       &main_opts.default_params.le_min_adv_interval);

>         }

>

>         if (main_opts.default_params.le_max_adv_interval) {

> -               params[i].entry.type = 0x000b;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.le_max_adv_interval;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x000b,

> +                       sizeof(main_opts.default_params.le_max_adv_interval),

> +                       &main_opts.default_params.le_max_adv_interval);

>         }

>

>         if (main_opts.default_params.le_multi_adv_rotation_interval) {

> -               params[i].entry.type = 0x000c;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.le_multi_adv_rotation_interval;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x000c,

> +                       sizeof(main_opts.default_params.le_multi_adv_rotation_interval),

> +                       &main_opts.default_params.le_multi_adv_rotation_interval);

>         }

>

>         if (main_opts.default_params.le_scan_interval_autoconnect) {

> -               params[i].entry.type = 0x000d;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.le_scan_interval_autoconnect;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x000d,

> +                       sizeof(main_opts.default_params.le_scan_interval_autoconnect),

> +                       &main_opts.default_params.le_scan_interval_autoconnect);

>         }

>

>         if (main_opts.default_params.le_scan_win_autoconnect) {

> -               params[i].entry.type = 0x000e;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.le_scan_win_autoconnect;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x000e,

> +                       sizeof(main_opts.default_params.le_scan_win_autoconnect),

> +                       &main_opts.default_params.le_scan_win_autoconnect);

>         }

>

>         if (main_opts.default_params.le_scan_interval_suspend) {

> -               params[i].entry.type = 0x000f;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.le_scan_interval_suspend;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x000f,

> +                       sizeof(main_opts.default_params.le_scan_interval_suspend),

> +                       &main_opts.default_params.le_scan_interval_suspend);

>         }

>

>         if (main_opts.default_params.le_scan_win_suspend) {

> -               params[i].entry.type = 0x0010;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.le_scan_win_suspend;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0010,

> +                       sizeof(main_opts.default_params.le_scan_win_suspend),

> +                       &main_opts.default_params.le_scan_win_suspend);

>         }

>

>         if (main_opts.default_params.le_scan_interval_discovery) {

> -               params[i].entry.type = 0x0011;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.le_scan_interval_discovery;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0011,

> +                       sizeof(main_opts.default_params.le_scan_interval_discovery),

> +                       &main_opts.default_params.le_scan_interval_discovery);

>         }

>

>         if (main_opts.default_params.le_scan_win_discovery) {

> -               params[i].entry.type = 0x0012;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.le_scan_win_discovery;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0012,

> +                       sizeof(main_opts.default_params.le_scan_win_discovery),

> +                       &main_opts.default_params.le_scan_win_discovery);

>         }

>

>         if (main_opts.default_params.le_scan_interval_adv_monitor) {

> -               params[i].entry.type = 0x0013;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.le_scan_interval_adv_monitor;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0013,

> +                       sizeof(main_opts.default_params.le_scan_interval_adv_monitor),

> +                       &main_opts.default_params.le_scan_interval_adv_monitor);

>         }

>

>         if (main_opts.default_params.le_scan_win_adv_monitor) {

> -               params[i].entry.type = 0x0014;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.le_scan_win_adv_monitor;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0014,

> +                       sizeof(main_opts.default_params.le_scan_win_adv_monitor),

> +                       &main_opts.default_params.le_scan_win_adv_monitor);

>         }

>

>         if (main_opts.default_params.le_scan_interval_connect) {

> -               params[i].entry.type = 0x0015;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 =

> -                       main_opts.default_params.le_scan_interval_connect;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0015,

> +                       sizeof(main_opts.default_params.le_scan_interval_connect),

> +                       &main_opts.default_params.le_scan_interval_connect);

>         }

>

>         if (main_opts.default_params.le_scan_win_connect) {

> -               params[i].entry.type = 0x0016;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.le_scan_win_connect;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0016,

> +                       sizeof(main_opts.default_params.le_scan_win_connect),

> +                       &main_opts.default_params.le_scan_win_connect);

>         }

>

>         if (main_opts.default_params.le_min_conn_interval) {

> -               params[i].entry.type = 0x0017;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.le_min_conn_interval;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0017,

> +                       sizeof(main_opts.default_params.le_min_conn_interval),

> +                       &main_opts.default_params.le_min_conn_interval);

>         }

>

>         if (main_opts.default_params.le_max_conn_interval) {

> -               params[i].entry.type = 0x0018;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.le_max_conn_interval;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0018,

> +                       sizeof(main_opts.default_params.le_max_conn_interval),

> +                       &main_opts.default_params.le_max_conn_interval);

>         }

>

>         if (main_opts.default_params.le_conn_latency) {

> -               params[i].entry.type = 0x0019;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.le_conn_latency;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x0019,

> +                       sizeof(main_opts.default_params.le_conn_latency),

> +                       &main_opts.default_params.le_conn_latency);

>         }

>

>         if (main_opts.default_params.le_conn_lsto) {

> -               params[i].entry.type = 0x001a;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.le_conn_lsto;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x001a,

> +                       sizeof(main_opts.default_params.le_conn_lsto),

> +                       &main_opts.default_params.le_conn_lsto);

>         }

>

>         if (main_opts.default_params.le_autoconnect_timeout) {

> -               params[i].entry.type = 0x001b;

> -               params[i].entry.length = sizeof(params[i].u16);

> -               params[i].u16 = main_opts.default_params.le_autoconnect_timeout;

> -               ++i;

> -               len += sizeof(params[i].u16);

> +               err |= !mgmt_tlv_add(tlv_list, 0x001b,

> +                       sizeof(main_opts.default_params.le_autoconnect_timeout),

> +                       &main_opts.default_params.le_autoconnect_timeout);

> +       }

> +

> +       if (err) {

> +               btd_error(adapter->dev_id, "Failed to add tlv to list");

> +               goto done;

>         }

>

> -       err = mgmt_send(adapter->mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG,

> -                       adapter->dev_id, len, params, NULL, NULL, NULL);

> +       err = mgmt_send_tlv(adapter->mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG,

> +                       adapter->dev_id, tlv_list, NULL, NULL, NULL);

> +

>         if (!err)

>                 btd_error(adapter->dev_id,

>                                 "Failed to set default system config for hci%u",

>                                 adapter->dev_id);

> -

> -       free(params);

> +done:

> +       mgmt_tlv_list_free(tlv_list);

>  }

>

>  static void load_devices(struct btd_adapter *adapter)

> diff --git a/src/main.c b/src/main.c

> index 77be776686a8..b83f7bffb485 100644

> --- a/src/main.c

> +++ b/src/main.c

> @@ -305,120 +305,149 @@ static void parse_controller_config(GKeyFile *config)

>  {

>         static const struct {

>                 const char * const val_name;

> -               uint16_t * const val;

> +               void * const val;

> +               const size_t size;

>                 const uint16_t min;

>                 const uint16_t max;

>         } params[] = {

>                 { "BRPageScanType",

>                   &main_opts.default_params.br_page_scan_type,

> +                 sizeof(main_opts.default_params.br_page_scan_type),

>                   0,

>                   1},

>                 { "BRPageScanInterval",

>                   &main_opts.default_params.br_page_scan_interval,

> +                 sizeof(main_opts.default_params.br_page_scan_interval),

>                   0x0012,

>                   0x1000},

>                 { "BRPageScanWindow",

>                   &main_opts.default_params.br_page_scan_win,

> +                 sizeof(main_opts.default_params.br_page_scan_win),

>                   0x0011,

>                   0x1000},

>                 { "BRInquiryScanType",

>                   &main_opts.default_params.br_scan_type,

> +                 sizeof(main_opts.default_params.br_scan_type),

>                   0,

>                   1},

>                 { "BRInquiryScanInterval",

>                   &main_opts.default_params.br_scan_interval,

> +                 sizeof(main_opts.default_params.br_scan_interval),

>                   0x0012,

>                   0x1000},

>                 { "BRInquiryScanWindow",

>                   &main_opts.default_params.br_scan_win,

> +                 sizeof(main_opts.default_params.br_scan_win),

>                   0x0011,

>                   0x1000},

>                 { "BRLinkSupervisionTimeout",

>                   &main_opts.default_params.br_link_supervision_timeout,

> +                 sizeof(main_opts.default_params.br_link_supervision_timeout),

>                   0x0001,

>                   0xFFFF},

>                 { "BRPageTimeout",

>                   &main_opts.default_params.br_page_timeout,

> +                 sizeof(main_opts.default_params.br_page_scan_win),

>                   0x0001,

>                   0xFFFF},

>                 { "BRMinSniffInterval",

>                   &main_opts.default_params.br_min_sniff_interval,

> +                 sizeof(main_opts.default_params.br_min_sniff_interval),

>                   0x0001,

>                   0xFFFE},

>                 { "BRMaxSniffInterval",

>                   &main_opts.default_params.br_max_sniff_interval,

> +                 sizeof(main_opts.default_params.br_max_sniff_interval),

>                   0x0001,

>                   0xFFFE},

>                 { "LEMinAdvertisementInterval",

>                   &main_opts.default_params.le_min_adv_interval,

> +                 sizeof(main_opts.default_params.le_min_adv_interval),

>                   0x0020,

>                   0x4000},

>                 { "LEMaxAdvertisementInterval",

>                   &main_opts.default_params.le_max_adv_interval,

> +                 sizeof(main_opts.default_params.le_max_adv_interval),

>                   0x0020,

>                   0x4000},

>                 { "LEMultiAdvertisementRotationInterval",

>                   &main_opts.default_params.le_multi_adv_rotation_interval,

> +                 sizeof(main_opts.default_params.le_multi_adv_rotation_interval),

>                   0x0001,

>                   0xFFFF},

>                 { "LEScanIntervalAutoConnect",

>                   &main_opts.default_params.le_scan_interval_autoconnect,

> +                 sizeof(main_opts.default_params.le_scan_interval_autoconnect),

>                   0x0004,

>                   0x4000},

>                 { "LEScanWindowAutoConnect",

>                   &main_opts.default_params.le_scan_win_autoconnect,

> +                 sizeof(main_opts.default_params.le_scan_win_autoconnect),

>                   0x0004,

>                   0x4000},

>                 { "LEScanIntervalSuspend",

>                   &main_opts.default_params.le_scan_interval_suspend,

> +                 sizeof(main_opts.default_params.le_scan_interval_suspend),

>                   0x0004,

>                   0x4000},

>                 { "LEScanWindowSuspend",

>                   &main_opts.default_params.le_scan_win_suspend,

> +                 sizeof(main_opts.default_params.le_scan_win_suspend),

>                   0x0004,

>                   0x4000},

>                 { "LEScanIntervalDiscovery",

>                   &main_opts.default_params.le_scan_interval_discovery,

> +                 sizeof(main_opts.default_params.le_scan_interval_discovery),

>                   0x0004,

>                   0x4000},

>                 { "LEScanWindowDiscovery",

>                   &main_opts.default_params.le_scan_win_discovery,

> +                 sizeof(main_opts.default_params.le_scan_win_discovery),

>                   0x0004,

>                   0x4000},

>                 { "LEScanIntervalAdvMonitor",

>                   &main_opts.default_params.le_scan_interval_adv_monitor,

> +                 sizeof(main_opts.default_params.le_scan_interval_adv_monitor),

>                   0x0004,

>                   0x4000},

>                 { "LEScanWindowAdvMonitor",

>                   &main_opts.default_params.le_scan_win_adv_monitor,

> +                 sizeof(main_opts.default_params.le_scan_win_adv_monitor),

>                   0x0004,

>                   0x4000},

>                 { "LEScanIntervalConnect",

>                   &main_opts.default_params.le_scan_interval_connect,

> +                 sizeof(main_opts.default_params.le_scan_interval_connect),

>                   0x0004,

>                   0x4000},

>                 { "LEScanWindowConnect",

>                   &main_opts.default_params.le_scan_win_connect,

> +                 sizeof(main_opts.default_params.le_scan_win_connect),

>                   0x0004,

>                   0x4000},

>                 { "LEMinConnectionInterval",

>                   &main_opts.default_params.le_min_conn_interval,

> +                 sizeof(main_opts.default_params.le_min_conn_interval),

>                   0x0006,

>                   0x0C80},

>                 { "LEMaxConnectionInterval",

>                   &main_opts.default_params.le_max_conn_interval,

> +                 sizeof(main_opts.default_params.le_max_conn_interval),

>                   0x0006,

>                   0x0C80},

>                 { "LEConnectionLatency",

>                   &main_opts.default_params.le_conn_latency,

> +                 sizeof(main_opts.default_params.le_conn_latency),

>                   0x0000,

>                   0x01F3},

>                 { "LEConnectionSupervisionTimeout",

>                   &main_opts.default_params.le_conn_lsto,

> +                 sizeof(main_opts.default_params.le_conn_lsto),

>                   0x000A,

>                   0x0C80},

>                 { "LEAutoconnecttimeout",

>                   &main_opts.default_params.le_autoconnect_timeout,

> +                 sizeof(main_opts.default_params.le_autoconnect_timeout),

>                   0x0001,

>                   0x4000},

>         };

> @@ -439,7 +468,9 @@ static void parse_controller_config(GKeyFile *config)

>

>                         val = MAX(val, params[i].min);

>                         val = MIN(val, params[i].max);

> -                       *params[i].val = val;

> +

> +                       val = htobl(val);

> +                       memcpy(params[i].val, &val, params[i].size);

>                         ++main_opts.default_params.num_entries;

>                 }

>         }

> --

> 2.29.0.rc2.309.g374f81d7ae-goog


Ive sent a patch-set based on your changes, Im start changing it to
split the BR/EDR to LE since BlueZ actually supports single mode it
makes more sense to have them handled by different groups, that said
it will affect how we expose them in main.conf.


-- 
Luiz Augusto von Dentz
diff mbox series

Patch

diff --git a/src/adapter.c b/src/adapter.c
index c0053000ac19..62b7bfbae021 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -4165,267 +4165,197 @@  static void probe_devices(void *user_data)
 
 static void load_default_system_params(struct btd_adapter *adapter)
 {
-	struct {
-		struct mgmt_tlv entry;
-		union {
-			uint16_t u16;
-		};
-	} __packed *params;
-	uint16_t i = 0;
-	size_t len = 0;
-	unsigned int err;
+	struct mgmt_tlv_list *tlv_list;
+	unsigned int err = 0;
 
 	if (!main_opts.default_params.num_entries ||
 	    !btd_has_kernel_features(KERNEL_SET_SYSTEM_CONFIG))
 		return;
 
-	params = malloc0(sizeof(*params) *
-			main_opts.default_params.num_entries);
-
-	len = sizeof(params->entry) * main_opts.default_params.num_entries;
+	tlv_list = mgmt_tlv_list_new();
 
 	if (main_opts.default_params.br_page_scan_type != 0xFFFF) {
-		params[i].entry.type = 0x0000;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.br_page_scan_type;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0000,
+			sizeof(main_opts.default_params.br_page_scan_type),
+			&main_opts.default_params.br_page_scan_type);
 	}
 
 	if (main_opts.default_params.br_page_scan_interval) {
-		params[i].entry.type = 0x0001;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.br_page_scan_interval;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0001,
+			sizeof(main_opts.default_params.br_page_scan_interval),
+			&main_opts.default_params.br_page_scan_interval);
 	}
 
 	if (main_opts.default_params.br_page_scan_win) {
-		params[i].entry.type = 0x0002;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.br_page_scan_win;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0002,
+			sizeof(main_opts.default_params.br_page_scan_win),
+			&main_opts.default_params.br_page_scan_win);
 	}
 
 	if (main_opts.default_params.br_scan_type != 0xFFFF) {
-		params[i].entry.type = 0x0003;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.br_scan_type;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0003,
+			sizeof(main_opts.default_params.br_scan_type),
+			&main_opts.default_params.br_scan_type);
 	}
 
 	if (main_opts.default_params.br_scan_interval) {
-		params[i].entry.type = 0x0004;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.br_scan_interval;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0004,
+			sizeof(main_opts.default_params.br_scan_interval),
+			&main_opts.default_params.br_scan_interval);
 	}
 
 	if (main_opts.default_params.br_scan_win) {
-		params[i].entry.type = 0x0005;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.br_scan_win;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0005,
+			sizeof(main_opts.default_params.br_scan_win),
+			&main_opts.default_params.br_scan_win);
 	}
 
 	if (main_opts.default_params.br_link_supervision_timeout) {
-		params[i].entry.type = 0x0006;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.br_link_supervision_timeout;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0006,
+			sizeof(main_opts.default_params.br_link_supervision_timeout),
+			&main_opts.default_params.br_link_supervision_timeout);
 	}
 
 	if (main_opts.default_params.br_page_timeout) {
-		params[i].entry.type = 0x0007;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.br_page_timeout;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0007,
+			sizeof(main_opts.default_params.br_page_timeout),
+			&main_opts.default_params.br_page_timeout);
 	}
 
 	if (main_opts.default_params.br_min_sniff_interval) {
-		params[i].entry.type = 0x0008;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.br_min_sniff_interval;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0008,
+			sizeof(main_opts.default_params.br_min_sniff_interval),
+			&main_opts.default_params.br_min_sniff_interval);
 	}
 
 	if (main_opts.default_params.br_max_sniff_interval) {
-		params[i].entry.type = 0x0009;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.br_max_sniff_interval;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0009,
+			sizeof(main_opts.default_params.br_max_sniff_interval),
+			&main_opts.default_params.br_max_sniff_interval);
 	}
 
 	if (main_opts.default_params.le_min_adv_interval) {
-		params[i].entry.type = 0x000a;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.le_min_adv_interval;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x000a,
+			sizeof(main_opts.default_params.le_min_adv_interval),
+			&main_opts.default_params.le_min_adv_interval);
 	}
 
 	if (main_opts.default_params.le_max_adv_interval) {
-		params[i].entry.type = 0x000b;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.le_max_adv_interval;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x000b,
+			sizeof(main_opts.default_params.le_max_adv_interval),
+			&main_opts.default_params.le_max_adv_interval);
 	}
 
 	if (main_opts.default_params.le_multi_adv_rotation_interval) {
-		params[i].entry.type = 0x000c;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.le_multi_adv_rotation_interval;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x000c,
+			sizeof(main_opts.default_params.le_multi_adv_rotation_interval),
+			&main_opts.default_params.le_multi_adv_rotation_interval);
 	}
 
 	if (main_opts.default_params.le_scan_interval_autoconnect) {
-		params[i].entry.type = 0x000d;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.le_scan_interval_autoconnect;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x000d,
+			sizeof(main_opts.default_params.le_scan_interval_autoconnect),
+			&main_opts.default_params.le_scan_interval_autoconnect);
 	}
 
 	if (main_opts.default_params.le_scan_win_autoconnect) {
-		params[i].entry.type = 0x000e;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.le_scan_win_autoconnect;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x000e,
+			sizeof(main_opts.default_params.le_scan_win_autoconnect),
+			&main_opts.default_params.le_scan_win_autoconnect);
 	}
 
 	if (main_opts.default_params.le_scan_interval_suspend) {
-		params[i].entry.type = 0x000f;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.le_scan_interval_suspend;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x000f,
+			sizeof(main_opts.default_params.le_scan_interval_suspend),
+			&main_opts.default_params.le_scan_interval_suspend);
 	}
 
 	if (main_opts.default_params.le_scan_win_suspend) {
-		params[i].entry.type = 0x0010;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.le_scan_win_suspend;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0010,
+			sizeof(main_opts.default_params.le_scan_win_suspend),
+			&main_opts.default_params.le_scan_win_suspend);
 	}
 
 	if (main_opts.default_params.le_scan_interval_discovery) {
-		params[i].entry.type = 0x0011;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.le_scan_interval_discovery;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0011,
+			sizeof(main_opts.default_params.le_scan_interval_discovery),
+			&main_opts.default_params.le_scan_interval_discovery);
 	}
 
 	if (main_opts.default_params.le_scan_win_discovery) {
-		params[i].entry.type = 0x0012;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.le_scan_win_discovery;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0012,
+			sizeof(main_opts.default_params.le_scan_win_discovery),
+			&main_opts.default_params.le_scan_win_discovery);
 	}
 
 	if (main_opts.default_params.le_scan_interval_adv_monitor) {
-		params[i].entry.type = 0x0013;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.le_scan_interval_adv_monitor;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0013,
+			sizeof(main_opts.default_params.le_scan_interval_adv_monitor),
+			&main_opts.default_params.le_scan_interval_adv_monitor);
 	}
 
 	if (main_opts.default_params.le_scan_win_adv_monitor) {
-		params[i].entry.type = 0x0014;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.le_scan_win_adv_monitor;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0014,
+			sizeof(main_opts.default_params.le_scan_win_adv_monitor),
+			&main_opts.default_params.le_scan_win_adv_monitor);
 	}
 
 	if (main_opts.default_params.le_scan_interval_connect) {
-		params[i].entry.type = 0x0015;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 =
-			main_opts.default_params.le_scan_interval_connect;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0015,
+			sizeof(main_opts.default_params.le_scan_interval_connect),
+			&main_opts.default_params.le_scan_interval_connect);
 	}
 
 	if (main_opts.default_params.le_scan_win_connect) {
-		params[i].entry.type = 0x0016;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.le_scan_win_connect;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0016,
+			sizeof(main_opts.default_params.le_scan_win_connect),
+			&main_opts.default_params.le_scan_win_connect);
 	}
 
 	if (main_opts.default_params.le_min_conn_interval) {
-		params[i].entry.type = 0x0017;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.le_min_conn_interval;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0017,
+			sizeof(main_opts.default_params.le_min_conn_interval),
+			&main_opts.default_params.le_min_conn_interval);
 	}
 
 	if (main_opts.default_params.le_max_conn_interval) {
-		params[i].entry.type = 0x0018;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.le_max_conn_interval;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0018,
+			sizeof(main_opts.default_params.le_max_conn_interval),
+			&main_opts.default_params.le_max_conn_interval);
 	}
 
 	if (main_opts.default_params.le_conn_latency) {
-		params[i].entry.type = 0x0019;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.le_conn_latency;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x0019,
+			sizeof(main_opts.default_params.le_conn_latency),
+			&main_opts.default_params.le_conn_latency);
 	}
 
 	if (main_opts.default_params.le_conn_lsto) {
-		params[i].entry.type = 0x001a;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.le_conn_lsto;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x001a,
+			sizeof(main_opts.default_params.le_conn_lsto),
+			&main_opts.default_params.le_conn_lsto);
 	}
 
 	if (main_opts.default_params.le_autoconnect_timeout) {
-		params[i].entry.type = 0x001b;
-		params[i].entry.length = sizeof(params[i].u16);
-		params[i].u16 = main_opts.default_params.le_autoconnect_timeout;
-		++i;
-		len += sizeof(params[i].u16);
+		err |= !mgmt_tlv_add(tlv_list, 0x001b,
+			sizeof(main_opts.default_params.le_autoconnect_timeout),
+			&main_opts.default_params.le_autoconnect_timeout);
+	}
+
+	if (err) {
+		btd_error(adapter->dev_id, "Failed to add tlv to list");
+		goto done;
 	}
 
-	err = mgmt_send(adapter->mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG,
-			adapter->dev_id, len, params, NULL, NULL, NULL);
+	err = mgmt_send_tlv(adapter->mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG,
+			adapter->dev_id, tlv_list, NULL, NULL, NULL);
+
 	if (!err)
 		btd_error(adapter->dev_id,
 				"Failed to set default system config for hci%u",
 				adapter->dev_id);
-
-	free(params);
+done:
+	mgmt_tlv_list_free(tlv_list);
 }
 
 static void load_devices(struct btd_adapter *adapter)
diff --git a/src/main.c b/src/main.c
index 77be776686a8..b83f7bffb485 100644
--- a/src/main.c
+++ b/src/main.c
@@ -305,120 +305,149 @@  static void parse_controller_config(GKeyFile *config)
 {
 	static const struct {
 		const char * const val_name;
-		uint16_t * const val;
+		void * const val;
+		const size_t size;
 		const uint16_t min;
 		const uint16_t max;
 	} params[] = {
 		{ "BRPageScanType",
 		  &main_opts.default_params.br_page_scan_type,
+		  sizeof(main_opts.default_params.br_page_scan_type),
 		  0,
 		  1},
 		{ "BRPageScanInterval",
 		  &main_opts.default_params.br_page_scan_interval,
+		  sizeof(main_opts.default_params.br_page_scan_interval),
 		  0x0012,
 		  0x1000},
 		{ "BRPageScanWindow",
 		  &main_opts.default_params.br_page_scan_win,
+		  sizeof(main_opts.default_params.br_page_scan_win),
 		  0x0011,
 		  0x1000},
 		{ "BRInquiryScanType",
 		  &main_opts.default_params.br_scan_type,
+		  sizeof(main_opts.default_params.br_scan_type),
 		  0,
 		  1},
 		{ "BRInquiryScanInterval",
 		  &main_opts.default_params.br_scan_interval,
+		  sizeof(main_opts.default_params.br_scan_interval),
 		  0x0012,
 		  0x1000},
 		{ "BRInquiryScanWindow",
 		  &main_opts.default_params.br_scan_win,
+		  sizeof(main_opts.default_params.br_scan_win),
 		  0x0011,
 		  0x1000},
 		{ "BRLinkSupervisionTimeout",
 		  &main_opts.default_params.br_link_supervision_timeout,
+		  sizeof(main_opts.default_params.br_link_supervision_timeout),
 		  0x0001,
 		  0xFFFF},
 		{ "BRPageTimeout",
 		  &main_opts.default_params.br_page_timeout,
+		  sizeof(main_opts.default_params.br_page_scan_win),
 		  0x0001,
 		  0xFFFF},
 		{ "BRMinSniffInterval",
 		  &main_opts.default_params.br_min_sniff_interval,
+		  sizeof(main_opts.default_params.br_min_sniff_interval),
 		  0x0001,
 		  0xFFFE},
 		{ "BRMaxSniffInterval",
 		  &main_opts.default_params.br_max_sniff_interval,
+		  sizeof(main_opts.default_params.br_max_sniff_interval),
 		  0x0001,
 		  0xFFFE},
 		{ "LEMinAdvertisementInterval",
 		  &main_opts.default_params.le_min_adv_interval,
+		  sizeof(main_opts.default_params.le_min_adv_interval),
 		  0x0020,
 		  0x4000},
 		{ "LEMaxAdvertisementInterval",
 		  &main_opts.default_params.le_max_adv_interval,
+		  sizeof(main_opts.default_params.le_max_adv_interval),
 		  0x0020,
 		  0x4000},
 		{ "LEMultiAdvertisementRotationInterval",
 		  &main_opts.default_params.le_multi_adv_rotation_interval,
+		  sizeof(main_opts.default_params.le_multi_adv_rotation_interval),
 		  0x0001,
 		  0xFFFF},
 		{ "LEScanIntervalAutoConnect",
 		  &main_opts.default_params.le_scan_interval_autoconnect,
+		  sizeof(main_opts.default_params.le_scan_interval_autoconnect),
 		  0x0004,
 		  0x4000},
 		{ "LEScanWindowAutoConnect",
 		  &main_opts.default_params.le_scan_win_autoconnect,
+		  sizeof(main_opts.default_params.le_scan_win_autoconnect),
 		  0x0004,
 		  0x4000},
 		{ "LEScanIntervalSuspend",
 		  &main_opts.default_params.le_scan_interval_suspend,
+		  sizeof(main_opts.default_params.le_scan_interval_suspend),
 		  0x0004,
 		  0x4000},
 		{ "LEScanWindowSuspend",
 		  &main_opts.default_params.le_scan_win_suspend,
+		  sizeof(main_opts.default_params.le_scan_win_suspend),
 		  0x0004,
 		  0x4000},
 		{ "LEScanIntervalDiscovery",
 		  &main_opts.default_params.le_scan_interval_discovery,
+		  sizeof(main_opts.default_params.le_scan_interval_discovery),
 		  0x0004,
 		  0x4000},
 		{ "LEScanWindowDiscovery",
 		  &main_opts.default_params.le_scan_win_discovery,
+		  sizeof(main_opts.default_params.le_scan_win_discovery),
 		  0x0004,
 		  0x4000},
 		{ "LEScanIntervalAdvMonitor",
 		  &main_opts.default_params.le_scan_interval_adv_monitor,
+		  sizeof(main_opts.default_params.le_scan_interval_adv_monitor),
 		  0x0004,
 		  0x4000},
 		{ "LEScanWindowAdvMonitor",
 		  &main_opts.default_params.le_scan_win_adv_monitor,
+		  sizeof(main_opts.default_params.le_scan_win_adv_monitor),
 		  0x0004,
 		  0x4000},
 		{ "LEScanIntervalConnect",
 		  &main_opts.default_params.le_scan_interval_connect,
+		  sizeof(main_opts.default_params.le_scan_interval_connect),
 		  0x0004,
 		  0x4000},
 		{ "LEScanWindowConnect",
 		  &main_opts.default_params.le_scan_win_connect,
+		  sizeof(main_opts.default_params.le_scan_win_connect),
 		  0x0004,
 		  0x4000},
 		{ "LEMinConnectionInterval",
 		  &main_opts.default_params.le_min_conn_interval,
+		  sizeof(main_opts.default_params.le_min_conn_interval),
 		  0x0006,
 		  0x0C80},
 		{ "LEMaxConnectionInterval",
 		  &main_opts.default_params.le_max_conn_interval,
+		  sizeof(main_opts.default_params.le_max_conn_interval),
 		  0x0006,
 		  0x0C80},
 		{ "LEConnectionLatency",
 		  &main_opts.default_params.le_conn_latency,
+		  sizeof(main_opts.default_params.le_conn_latency),
 		  0x0000,
 		  0x01F3},
 		{ "LEConnectionSupervisionTimeout",
 		  &main_opts.default_params.le_conn_lsto,
+		  sizeof(main_opts.default_params.le_conn_lsto),
 		  0x000A,
 		  0x0C80},
 		{ "LEAutoconnecttimeout",
 		  &main_opts.default_params.le_autoconnect_timeout,
+		  sizeof(main_opts.default_params.le_autoconnect_timeout),
 		  0x0001,
 		  0x4000},
 	};
@@ -439,7 +468,9 @@  static void parse_controller_config(GKeyFile *config)
 
 			val = MAX(val, params[i].min);
 			val = MIN(val, params[i].max);
-			*params[i].val = val;
+
+			val = htobl(val);
+			memcpy(params[i].val, &val, params[i].size);
 			++main_opts.default_params.num_entries;
 		}
 	}