diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2020-10-28 14:45:36 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2020-10-29 10:27:36 -0700 |
commit | 8c6373667aebae94722eb1960434231528b51f3f (patch) | |
tree | 19a7c95c82c906de2a533d6b248dbeaa77714510 /src/main.c | |
parent | d2e6c9ed48fe62f4c9477f617faf671ec93215cb (diff) | |
download | bluez-8c6373667aebae94722eb1960434231528b51f3f.tar.gz |
core: Split LE and BR/EDR parameters
This splits LE and BR/EDR config parameters and checks main_conf.mode
when parsing them.
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 291 |
1 files changed, 176 insertions, 115 deletions
diff --git a/src/main.c b/src/main.c index 77be77668..6f73eb331 100644 --- a/src/main.c +++ b/src/main.c @@ -81,35 +81,39 @@ static const char *supported_options[] = { NULL }; -static const char *controller_options[] = { - "BRPageScanType", - "BRPageScanInterval", - "BRPageScanWindow", - "BRInquiryScanType", - "BRInquiryScanInterval", - "BRInquiryScanWindow", - "BRLinkSupervisionTimeout", - "BRPageTimeout", - "BRMinSniffInterval", - "BRMaxSniffInterval", - "LEMinAdvertisementInterval", - "LEMaxAdvertisementInterval", - "LEMultiAdvertisementRotationInterval", - "LEScanIntervalAutoConnect", - "LEScanWindowAutoConnect", - "LEScanIntervalSuspend", - "LEScanWindowSuspend", - "LEScanIntervalDiscovery", - "LEScanWindowDiscovery", - "LEScanIntervalAdvMonitoring", - "LEScanWindowAdvMonitoring", - "LEScanIntervalConnect", - "LEScanWindowConnect", - "LEMinConnectionInterval", - "LEMaxConnectionInterval", - "LEConnectionLatency", - "LEConnectionSupervisionTimeout", - "LEAutoconnecttimeout", +static const char *br_options[] = { + "PageScanType", + "PageScanInterval", + "PageScanWindow", + "InquiryScanType", + "InquiryScanInterval", + "InquiryScanWindow", + "LinkSupervisionTimeout", + "PageTimeout", + "MinSniffInterval", + "MaxSniffInterval", + NULL +}; + +static const char *le_options[] = { + "MinAdvertisementInterval", + "MaxAdvertisementInterval", + "MultiAdvertisementRotationInterval", + "ScanIntervalAutoConnect", + "ScanWindowAutoConnect", + "ScanIntervalSuspend", + "ScanWindowSuspend", + "ScanIntervalDiscovery", + "ScanWindowDiscovery", + "ScanIntervalAdvMonitoring", + "ScanWindowAdvMonitoring", + "ScanIntervalConnect", + "ScanWindowConnect", + "MinConnectionInterval", + "MaxConnectionInterval", + "ConnectionLatency", + "ConnectionSupervisionTimeout", + "Autoconnecttimeout", NULL }; @@ -135,7 +139,8 @@ static const struct group_table { const char **options; } valid_groups[] = { { "General", supported_options }, - { "Controller", controller_options }, + { "BR", br_options }, + { "LE", le_options }, { "Policy", policy_options }, { "GATT", gatt_options }, { } @@ -301,148 +306,203 @@ static int get_mode(const char *str) return BT_MODE_DUAL; } -static void parse_controller_config(GKeyFile *config) +struct config_param { + const char * const val_name; + void * const val; + const size_t size; + const uint16_t min; + const uint16_t max; +}; + +static void parse_mode_config(GKeyFile *config, const char *group, + const struct config_param *params, + size_t params_len) { - static const struct { - const char * const val_name; - uint16_t * const val; - const uint16_t min; - const uint16_t max; - } params[] = { - { "BRPageScanType", - &main_opts.default_params.br_page_scan_type, + uint16_t i; + + if (!config) + return; + + for (i = 0; i < params_len; ++i) { + GError *err = NULL; + int val = g_key_file_get_integer(config, group, + params[i].val_name, &err); + if (err) { + warn("%s", err->message); + g_clear_error(&err); + } else { + info("%s=%d", params[i].val_name, val); + + val = MAX(val, params[i].min); + val = MIN(val, params[i].max); + + val = htobl(val); + memcpy(params[i].val, &val, params[i].size); + ++main_opts.defaults.num_entries; + } + } +} + +static void parse_br_config(GKeyFile *config) +{ + static const struct config_param params[] = { + { "PageScanType", + &main_opts.defaults.br.page_scan_type, + sizeof(main_opts.defaults.br.page_scan_type), 0, 1}, - { "BRPageScanInterval", - &main_opts.default_params.br_page_scan_interval, + { "PageScanInterval", + &main_opts.defaults.br.page_scan_interval, + sizeof(main_opts.defaults.br.page_scan_interval), 0x0012, 0x1000}, - { "BRPageScanWindow", - &main_opts.default_params.br_page_scan_win, + { "PageScanWindow", + &main_opts.defaults.br.page_scan_win, + sizeof(main_opts.defaults.br.page_scan_win), 0x0011, 0x1000}, - { "BRInquiryScanType", - &main_opts.default_params.br_scan_type, + { "InquiryScanType", + &main_opts.defaults.br.scan_type, + sizeof(main_opts.defaults.br.scan_type), 0, 1}, - { "BRInquiryScanInterval", - &main_opts.default_params.br_scan_interval, + { "InquiryScanInterval", + &main_opts.defaults.br.scan_interval, + sizeof(main_opts.defaults.br.scan_interval), 0x0012, 0x1000}, - { "BRInquiryScanWindow", - &main_opts.default_params.br_scan_win, + { "InquiryScanWindow", + &main_opts.defaults.br.scan_win, + sizeof(main_opts.defaults.br.scan_win), 0x0011, 0x1000}, - { "BRLinkSupervisionTimeout", - &main_opts.default_params.br_link_supervision_timeout, + { "LinkSupervisionTimeout", + &main_opts.defaults.br.link_supervision_timeout, + sizeof(main_opts.defaults.br.link_supervision_timeout), 0x0001, 0xFFFF}, - { "BRPageTimeout", - &main_opts.default_params.br_page_timeout, + { "PageTimeout", + &main_opts.defaults.br.page_timeout, + sizeof(main_opts.defaults.br.page_scan_win), 0x0001, 0xFFFF}, - { "BRMinSniffInterval", - &main_opts.default_params.br_min_sniff_interval, + { "MinSniffInterval", + &main_opts.defaults.br.min_sniff_interval, + sizeof(main_opts.defaults.br.min_sniff_interval), 0x0001, 0xFFFE}, - { "BRMaxSniffInterval", - &main_opts.default_params.br_max_sniff_interval, + { "MaxSniffInterval", + &main_opts.defaults.br.max_sniff_interval, + sizeof(main_opts.defaults.br.max_sniff_interval), 0x0001, 0xFFFE}, - { "LEMinAdvertisementInterval", - &main_opts.default_params.le_min_adv_interval, + }; + + if (main_opts.mode == BT_MODE_LE) + return; + + parse_mode_config(config, "BREDR", params, ARRAY_SIZE(params)); +} + +static void parse_le_config(GKeyFile *config) +{ + static const struct config_param params[] = { + { "MinAdvertisementInterval", + &main_opts.defaults.le.min_adv_interval, + sizeof(main_opts.defaults.le.min_adv_interval), 0x0020, 0x4000}, - { "LEMaxAdvertisementInterval", - &main_opts.default_params.le_max_adv_interval, + { "MaxAdvertisementInterval", + &main_opts.defaults.le.max_adv_interval, + sizeof(main_opts.defaults.le.max_adv_interval), 0x0020, 0x4000}, - { "LEMultiAdvertisementRotationInterval", - &main_opts.default_params.le_multi_adv_rotation_interval, + { "MultiAdvertisementRotationInterval", + &main_opts.defaults.le.adv_rotation_interval, + sizeof(main_opts.defaults.le.adv_rotation_interval), 0x0001, 0xFFFF}, - { "LEScanIntervalAutoConnect", - &main_opts.default_params.le_scan_interval_autoconnect, + { "ScanIntervalAutoConnect", + &main_opts.defaults.le.scan_interval_autoconnect, + sizeof(main_opts.defaults.le.scan_interval_autoconnect), 0x0004, 0x4000}, - { "LEScanWindowAutoConnect", - &main_opts.default_params.le_scan_win_autoconnect, + { "ScanWindowAutoConnect", + &main_opts.defaults.le.scan_win_autoconnect, + sizeof(main_opts.defaults.le.scan_win_autoconnect), 0x0004, 0x4000}, - { "LEScanIntervalSuspend", - &main_opts.default_params.le_scan_interval_suspend, + { "ScanIntervalSuspend", + &main_opts.defaults.le.scan_interval_suspend, + sizeof(main_opts.defaults.le.scan_interval_suspend), 0x0004, 0x4000}, - { "LEScanWindowSuspend", - &main_opts.default_params.le_scan_win_suspend, + { "ScanWindowSuspend", + &main_opts.defaults.le.scan_win_suspend, + sizeof(main_opts.defaults.le.scan_win_suspend), 0x0004, 0x4000}, - { "LEScanIntervalDiscovery", - &main_opts.default_params.le_scan_interval_discovery, + { "ScanIntervalDiscovery", + &main_opts.defaults.le.scan_interval_discovery, + sizeof(main_opts.defaults.le.scan_interval_discovery), 0x0004, 0x4000}, - { "LEScanWindowDiscovery", - &main_opts.default_params.le_scan_win_discovery, + { "ScanWindowDiscovery", + &main_opts.defaults.le.scan_win_discovery, + sizeof(main_opts.defaults.le.scan_win_discovery), 0x0004, 0x4000}, - { "LEScanIntervalAdvMonitor", - &main_opts.default_params.le_scan_interval_adv_monitor, + { "ScanIntervalAdvMonitor", + &main_opts.defaults.le.scan_interval_adv_monitor, + sizeof(main_opts.defaults.le.scan_interval_adv_monitor), 0x0004, 0x4000}, - { "LEScanWindowAdvMonitor", - &main_opts.default_params.le_scan_win_adv_monitor, + { "ScanWindowAdvMonitor", + &main_opts.defaults.le.scan_win_adv_monitor, + sizeof(main_opts.defaults.le.scan_win_adv_monitor), 0x0004, 0x4000}, - { "LEScanIntervalConnect", - &main_opts.default_params.le_scan_interval_connect, + { "ScanIntervalConnect", + &main_opts.defaults.le.scan_interval_connect, + sizeof(main_opts.defaults.le.scan_interval_connect), 0x0004, 0x4000}, - { "LEScanWindowConnect", - &main_opts.default_params.le_scan_win_connect, + { "ScanWindowConnect", + &main_opts.defaults.le.scan_win_connect, + sizeof(main_opts.defaults.le.scan_win_connect), 0x0004, 0x4000}, - { "LEMinConnectionInterval", - &main_opts.default_params.le_min_conn_interval, + { "MinConnectionInterval", + &main_opts.defaults.le.min_conn_interval, + sizeof(main_opts.defaults.le.min_conn_interval), 0x0006, 0x0C80}, - { "LEMaxConnectionInterval", - &main_opts.default_params.le_max_conn_interval, + { "MaxConnectionInterval", + &main_opts.defaults.le.max_conn_interval, + sizeof(main_opts.defaults.le.max_conn_interval), 0x0006, 0x0C80}, - { "LEConnectionLatency", - &main_opts.default_params.le_conn_latency, + { "ConnectionLatency", + &main_opts.defaults.le.conn_latency, + sizeof(main_opts.defaults.le.conn_latency), 0x0000, 0x01F3}, - { "LEConnectionSupervisionTimeout", - &main_opts.default_params.le_conn_lsto, + { "ConnectionSupervisionTimeout", + &main_opts.defaults.le.conn_lsto, + sizeof(main_opts.defaults.le.conn_lsto), 0x000A, 0x0C80}, - { "LEAutoconnecttimeout", - &main_opts.default_params.le_autoconnect_timeout, + { "Autoconnecttimeout", + &main_opts.defaults.le.autoconnect_timeout, + sizeof(main_opts.defaults.le.autoconnect_timeout), 0x0001, 0x4000}, }; - uint16_t i; - if (!config) + if (main_opts.mode == BT_MODE_BREDR) return; - for (i = 0; i < ARRAY_SIZE(params); ++i) { - GError *err = NULL; - int val = g_key_file_get_integer(config, "Controller", - params[i].val_name, &err); - if (err) { - warn("%s", err->message); - g_clear_error(&err); - } else { - info("%s=%d", params[i].val_name, val); - - val = MAX(val, params[i].min); - val = MIN(val, params[i].max); - *params[i].val = val; - ++main_opts.default_params.num_entries; - } - } + parse_mode_config(config, "LE", params, ARRAY_SIZE(params)); } static void parse_config(GKeyFile *config) @@ -666,7 +726,8 @@ static void parse_config(GKeyFile *config) main_opts.gatt_channels = val; } - parse_controller_config(config); + parse_br_config(config); + parse_le_config(config); } static void init_defaults(void) @@ -685,9 +746,9 @@ static void init_defaults(void) main_opts.debug_keys = FALSE; main_opts.refresh_discovery = TRUE; - main_opts.default_params.num_entries = 0; - main_opts.default_params.br_page_scan_type = 0xFFFF; - main_opts.default_params.br_scan_type = 0xFFFF; + main_opts.defaults.num_entries = 0; + main_opts.defaults.br.page_scan_type = 0xFFFF; + main_opts.defaults.br.scan_type = 0xFFFF; if (sscanf(VERSION, "%hhu.%hhu", &major, &minor) != 2) return; |