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 |
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 --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; } }
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(-)