This patch adds parameters to control the durations of allowlist scan
and no-filter scan when the kernel is doing interleaving scan.
---
Changes in v3:
- Set EnableAdvMonInterleaveScan default to Disable
Changes in v2:
- Fix typo in the commit title
src/adapter.c | 18 ++++++++++++++++++
src/hcid.h | 3 +++
src/main.c | 10 ++++++++++
src/main.conf | 7 +++++++
4 files changed, 38 insertions(+)
diff --git a/src/adapter.c b/src/adapter.c
index b2bd8b3f1d01..c0e95b48a1c4 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -4431,6 +4431,24 @@ static void load_default_system_params(struct btd_adapter *adapter)
len += sizeof(params[i].u16);
}
+ if (main_opts.default_params.advmon_allowlist_scan_duration) {
+ params[i].entry.type = 0x001d;
+ params[i].entry.length = sizeof(params[i].u16);
+ params[i].u16 =
+ main_opts.default_params.advmon_allowlist_scan_duration;
+ ++i;
+ len += sizeof(params[i].u16);
+ }
+
+ if (main_opts.default_params.advmon_no_filter_scan_duration) {
+ params[i].entry.type = 0x001e;
+ params[i].entry.length = sizeof(params[i].u16);
+ params[i].u16 =
+ main_opts.default_params.advmon_no_filter_scan_duration;
+ ++i;
+ len += sizeof(params[i].u16);
+ }
+
err = mgmt_send(adapter->mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG,
adapter->dev_id, len, params, NULL, NULL, NULL);
if (!err)
diff --git a/src/hcid.h b/src/hcid.h
index 3624ba6ea163..c3e5fe803543 100644
--- a/src/hcid.h
+++ b/src/hcid.h
@@ -93,6 +93,9 @@ struct main_opts {
uint16_t le_conn_latency;
uint16_t le_conn_lsto;
uint16_t le_autoconnect_timeout;
+
+ uint16_t advmon_allowlist_scan_duration;
+ uint16_t advmon_no_filter_scan_duration;
} default_params;
diff --git a/src/main.c b/src/main.c
index 038f867b5a6d..e222ed3bf855 100644
--- a/src/main.c
+++ b/src/main.c
@@ -123,6 +123,8 @@ static const char *controller_options[] = {
"LEConnectionLatency",
"LEConnectionSupervisionTimeout",
"LEAutoconnecttimeout",
+ "AdvMonAllowlistScanDuration",
+ "AdvMonNoFilterScanDuration",
NULL
};
@@ -434,6 +436,14 @@ static void parse_controller_config(GKeyFile *config)
&main_opts.default_params.le_autoconnect_timeout,
0x0001,
0x4000},
+ { "AdvMonAllowlistScanDuration",
+ &main_opts.default_params.advmon_allowlist_scan_duration,
+ 1,
+ 10000},
+ { "AdvMonNoFilterScanDuration",
+ &main_opts.default_params.advmon_no_filter_scan_duration,
+ 1,
+ 10000},
};
uint16_t i;
diff --git a/src/main.conf b/src/main.conf
index 8d85702d4316..3b341f44c9cf 100644
--- a/src/main.conf
+++ b/src/main.conf
@@ -152,6 +152,13 @@
#LEConnectionSupervisionTimeout=
#LEAutoconnecttimeout=
+# Scan duration during interleaving scan. Only used when scanning for ADV
+# monitors. The units are msec.
+# Default: 300
+#AdvMonAllowlistScanDuration=
+# Default: 500
+#AdvMonNoFilterScanDuration=
+
[GATT]
# GATT attribute cache.
# Possible values:
--
2.28.0.681.g6f77f65b4e-goog
This patch adds parameter to enable/disable the interleave scan feature.
---
Changes in v3:
- Set EnableAdvMonInterleaveScan default to Disable
src/adapter.c | 9 +++++++++
src/hcid.h | 1 +
src/main.c | 6 ++++++
src/main.conf | 6 ++++++
4 files changed, 22 insertions(+)
diff --git a/src/adapter.c b/src/adapter.c
index c0e95b48a1c4..a2c782e308bb 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -4449,6 +4449,15 @@ static void load_default_system_params(struct btd_adapter *adapter)
len += sizeof(params[i].u16);
}
+ if (main_opts.default_params.enable_advmon_interleave_scan != 0xFFFF) {
+ params[i].entry.type = 0x001f;
+ params[i].entry.length = sizeof(params[i].u16);
+ params[i].u16 =
+ main_opts.default_params.enable_advmon_interleave_scan;
+ ++i;
+ len += sizeof(params[i].u16);
+ }
+
err = mgmt_send(adapter->mgmt, MGMT_OP_SET_DEF_SYSTEM_CONFIG,
adapter->dev_id, len, params, NULL, NULL, NULL);
if (!err)
diff --git a/src/hcid.h b/src/hcid.h
index c3e5fe803543..c6717be62c48 100644
--- a/src/hcid.h
+++ b/src/hcid.h
@@ -96,6 +96,7 @@ struct main_opts {
uint16_t advmon_allowlist_scan_duration;
uint16_t advmon_no_filter_scan_duration;
+ uint16_t enable_advmon_interleave_scan;
} default_params;
diff --git a/src/main.c b/src/main.c
index e222ed3bf855..3433130bc419 100644
--- a/src/main.c
+++ b/src/main.c
@@ -125,6 +125,7 @@ static const char *controller_options[] = {
"LEAutoconnecttimeout",
"AdvMonAllowlistScanDuration",
"AdvMonNoFilterScanDuration",
+ "EnableAdvMonInterleaveScan",
NULL
};
@@ -444,6 +445,10 @@ static void parse_controller_config(GKeyFile *config)
&main_opts.default_params.advmon_no_filter_scan_duration,
1,
10000},
+ { "EnableAdvMonInterleaveScan",
+ &main_opts.default_params.enable_advmon_interleave_scan,
+ 0,
+ 1},
};
uint16_t i;
@@ -711,6 +716,7 @@ static void init_defaults(void)
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.default_params.enable_advmon_interleave_scan = 0xFFFF;
if (sscanf(VERSION, "%hhu.%hhu", &major, &minor) != 2)
return;
diff --git a/src/main.conf b/src/main.conf
index 3b341f44c9cf..82ffc5813204 100644
--- a/src/main.conf
+++ b/src/main.conf
@@ -159,6 +159,12 @@
# Default: 500
#AdvMonNoFilterScanDuration=
+# Enable/Disable Advertisement Monitor interleave scan for power saving.
+# 0: disable
+# 1: enable
+# Defaults to 0
+#EnableAdvMonInterleaveScan=
+
[GATT]
# GATT attribute cache.
# Possible values:
--
2.28.0.681.g6f77f65b4e-goog