This is an automated email from the ASF dual-hosted git repository.
mgorecki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
The following commit(s) were added to refs/heads/master by this push:
new 207b1074f nimble/ll: Add vs hci cmd with additional scan cfg
207b1074f is described below
commit 207b1074fab736a381e06e22e58f30d2908e87c2
Author: Michal Gorecki <[email protected]>
AuthorDate: Mon Nov 18 11:14:19 2024 +0100
nimble/ll: Add vs hci cmd with additional scan cfg
This allows to configure scanner to:
- ignore either legacy or extended packets,
- set minimal RSSI filter on primary channel.
If scan is enabled
command returns command disallowed error.
---
nimble/controller/include/controller/ble_ll_scan.h | 16 ++++++++
nimble/controller/src/ble_ll_hci_vs.c | 35 ++++++++++++++++
nimble/controller/src/ble_ll_scan.c | 46 +++++++++++++++++++++-
nimble/controller/syscfg.yml | 11 ++++++
nimble/include/nimble/hci_common.h | 10 +++++
5 files changed, 116 insertions(+), 2 deletions(-)
diff --git a/nimble/controller/include/controller/ble_ll_scan.h
b/nimble/controller/include/controller/ble_ll_scan.h
index 07e4c9208..19d9cdd9c 100644
--- a/nimble/controller/include/controller/ble_ll_scan.h
+++ b/nimble/controller/include/controller/ble_ll_scan.h
@@ -99,6 +99,14 @@ struct ble_ll_scan_pdu_data {
uint8_t adva[BLE_DEV_ADDR_LEN];
};
+struct ble_ll_scan_vs_config {
+ uint8_t ignore_legacy : 1;
+ uint8_t ignore_ext : 1;
+ uint8_t rssi_filter : 1;
+
+ int8_t rssi_threshold;
+};
+
struct ble_ll_scan_addr_data {
uint8_t *adva;
uint8_t *targeta;
@@ -156,6 +164,10 @@ struct ble_ll_scan_sm
/* Connection sm for initiator scan */
struct ble_ll_conn_sm *connsm;
#endif
+
+#if MYNEWT_VAL(BLE_LL_HCI_VS_SET_SCAN_CFG)
+ struct ble_ll_scan_vs_config vs_config;
+#endif
};
/* Scan types */
@@ -259,6 +271,10 @@ ble_ll_scan_rx_filter(uint8_t own_addr_type, uint8_t
scan_filt_policy,
struct ble_ll_scan_addr_data *addrd, uint8_t *scan_ok);
int ble_ll_scan_rx_check_init(struct ble_ll_scan_addr_data *addrd);
+#if MYNEWT_VAL(BLE_LL_HCI_VS_SET_SCAN_CFG)
+int ble_ll_scan_set_vs_config(uint32_t flags, int8_t rssi_threshold);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/nimble/controller/src/ble_ll_hci_vs.c
b/nimble/controller/src/ble_ll_hci_vs.c
index 1710e456f..df8b68869 100644
--- a/nimble/controller/src/ble_ll_hci_vs.c
+++ b/nimble/controller/src/ble_ll_hci_vs.c
@@ -356,6 +356,37 @@ ble_ll_hci_vs_set_local_irk(uint16_t ocf, const uint8_t
*cmdbuf, uint8_t cmdlen,
}
#endif
+#if MYNEWT_VAL(BLE_LL_HCI_VS_SET_SCAN_CFG)
+static int
+ble_ll_hci_vs_set_scan_cfg(uint16_t ocf, const uint8_t *cmdbuf, uint8_t cmdlen,
+ uint8_t *rspbuf, uint8_t *rsplen)
+{
+ const struct ble_hci_vs_set_scan_cfg_cp *cmd = (const void *)cmdbuf;
+ uint32_t flags;
+ int rc;
+
+ if (cmdlen != sizeof(*cmd)) {
+ return BLE_ERR_INV_HCI_CMD_PARMS;
+ }
+
+ flags = le32toh(cmd->flags);
+
+ if ((flags & BLE_HCI_VS_SET_SCAN_CFG_FLAG_NO_LEGACY) &&
+ (flags & BLE_HCI_VS_SET_SCAN_CFG_FLAG_NO_EXT)) {
+ return BLE_ERR_INV_HCI_CMD_PARMS;
+ }
+
+ rc = ble_ll_scan_set_vs_config(flags, cmd->rssi_threshold);
+ if (rc != 0) {
+ return BLE_ERR_CMD_DISALLOWED;
+ }
+
+ *rsplen = 0;
+
+ return 0;
+}
+#endif
+
static struct ble_ll_hci_vs_cmd g_ble_ll_hci_vs_cmds[] = {
BLE_LL_HCI_VS_CMD(BLE_HCI_OCF_VS_RD_STATIC_ADDR,
ble_ll_hci_vs_rd_static_addr),
@@ -386,6 +417,10 @@ static struct ble_ll_hci_vs_cmd g_ble_ll_hci_vs_cmds[] = {
BLE_LL_HCI_VS_CMD(BLE_HCI_OCF_VS_SET_LOCAL_IRK,
ble_ll_hci_vs_set_local_irk),
#endif
+#if MYNEWT_VAL(BLE_LL_HCI_VS_SET_SCAN_CFG)
+ BLE_LL_HCI_VS_CMD(BLE_HCI_OCF_VS_SET_SCAN_CFG,
+ ble_ll_hci_vs_set_scan_cfg)
+#endif
};
static struct ble_ll_hci_vs_cmd *
diff --git a/nimble/controller/src/ble_ll_scan.c
b/nimble/controller/src/ble_ll_scan.c
index 670f6b38c..157ba94c1 100644
--- a/nimble/controller/src/ble_ll_scan.c
+++ b/nimble/controller/src/ble_ll_scan.c
@@ -2000,8 +2000,10 @@ ble_ll_scan_rx_pkt_in_on_legacy(uint8_t pdu_type, struct
os_mbuf *om,
void
ble_ll_scan_rx_pkt_in(uint8_t ptype, struct os_mbuf *om, struct ble_mbuf_hdr
*hdr)
{
+#if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL) || MYNEWT_VAL(BLE_LL_HCI_VS_SET_SCAN_CFG)
+ struct ble_mbuf_hdr_rxinfo *rxinfo = &hdr->rxinfo;
+#endif
#if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
- struct ble_mbuf_hdr_rxinfo *rxinfo;
uint8_t *targeta;
#endif
struct ble_ll_scan_sm *scansm;
@@ -2023,6 +2025,26 @@ ble_ll_scan_rx_pkt_in(uint8_t ptype, struct os_mbuf *om,
struct ble_mbuf_hdr *hd
return;
}
+#if MYNEWT_VAL(BLE_LL_HCI_VS_SET_SCAN_CFG)
+ if ((scansm->vs_config.ignore_ext) &&
+ (ptype == BLE_ADV_PDU_TYPE_ADV_EXT_IND)) {
+ ble_ll_scan_chk_resume();
+ return;
+ }
+
+ if ((scansm->vs_config.ignore_legacy) &&
+ (ptype != BLE_ADV_PDU_TYPE_ADV_EXT_IND)) {
+ ble_ll_scan_chk_resume();
+ return;
+ }
+
+ if ((scansm->vs_config.rssi_filter) &&
+ (rxinfo->rssi < scansm->vs_config.rssi_threshold)) {
+ ble_ll_scan_chk_resume();
+ return;
+ }
+#endif
+
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
if (ptype == BLE_ADV_PDU_TYPE_ADV_EXT_IND) {
ble_ll_scan_aux_pkt_in_on_ext(om, hdr);
@@ -2034,7 +2056,6 @@ ble_ll_scan_rx_pkt_in(uint8_t ptype, struct os_mbuf *om,
struct ble_mbuf_hdr *hd
switch (scansm->scanp->scan_type) {
#if MYNEWT_VAL(BLE_LL_ROLE_CENTRAL)
case BLE_SCAN_TYPE_INITIATE:
- rxinfo = &hdr->rxinfo;
if (rxinfo->flags & BLE_MBUF_HDR_F_CONNECT_IND_TXD) {
/* We need to keep original TargetA in case it was resolved, so rl
* can be updated properly.
@@ -2258,6 +2279,27 @@ ble_ll_scan_hci_set_ext_params(const uint8_t *cmdbuf,
uint8_t len)
#endif
+#if MYNEWT_VAL(BLE_LL_HCI_VS_SET_SCAN_CFG)
+int
+ble_ll_scan_set_vs_config(uint32_t flags, int8_t rssi_threshold)
+{
+ struct ble_ll_scan_sm *scansm;
+
+ scansm = &g_ble_ll_scan_sm;
+
+ if (scansm->scan_enabled || scansm->connsm) {
+ return 1;
+ }
+
+ scansm->vs_config.ignore_legacy = !!(flags &
BLE_HCI_VS_SET_SCAN_CFG_FLAG_NO_LEGACY);
+ scansm->vs_config.ignore_ext = !!(flags &
BLE_HCI_VS_SET_SCAN_CFG_FLAG_NO_EXT);
+ scansm->vs_config.rssi_filter = !!(flags &
BLE_HCI_VS_SET_SCAN_CFG_FLAG_RSSI_FILTER);
+ scansm->vs_config.rssi_threshold = rssi_threshold;
+
+ return 0;
+}
+#endif
+
#if MYNEWT_VAL(BLE_LL_CFG_FEAT_LL_EXT_ADV)
static void
ble_ll_scan_duration_period_timers_restart(struct ble_ll_scan_sm *scansm)
diff --git a/nimble/controller/syscfg.yml b/nimble/controller/syscfg.yml
index 862a36a52..bc4860c1b 100644
--- a/nimble/controller/syscfg.yml
+++ b/nimble/controller/syscfg.yml
@@ -422,6 +422,17 @@ syscfg.defs:
value: 0
restrictions:
- BLE_LL_HCI_VS if 1
+ BLE_LL_HCI_VS_SET_SCAN_CFG:
+ description: >
+ Enables HCI command to set global PDU filter for scanner.
+ It allows:
+ - ignoring extended or legacy PDUs while scanning,
+ - setting minimal RSSI filter on primary channel
+ value: 0
+ restrictions:
+ - BLE_LL_HCI_VS if 1
+ - BLE_LL_CFG_FEAT_LL_EXT_ADV if 1
+ - BLE_LL_ROLE_OBSERVER if 1
BLE_LL_HCI_VS_EVENT_ON_ASSERT:
diff --git a/nimble/include/nimble/hci_common.h
b/nimble/include/nimble/hci_common.h
index 252b03397..6d9ba85db 100644
--- a/nimble/include/nimble/hci_common.h
+++ b/nimble/include/nimble/hci_common.h
@@ -1396,6 +1396,16 @@ struct ble_hci_vs_set_local_irk_cp {
uint8_t irk[16];
} __attribute__((packed));
+#define BLE_HCI_VS_SET_SCAN_CFG_FLAG_NO_LEGACY (0x00000001)
+#define BLE_HCI_VS_SET_SCAN_CFG_FLAG_NO_EXT (0x00000002)
+#define BLE_HCI_VS_SET_SCAN_CFG_FLAG_RSSI_FILTER (0x00000004)
+
+#define BLE_HCI_OCF_VS_SET_SCAN_CFG
(MYNEWT_VAL(BLE_HCI_VS_OCF_OFFSET) + (0x000B))
+struct ble_hci_vs_set_scan_cfg_cp {
+ uint32_t flags;
+ int8_t rssi_threshold;
+} __attribute__((packed));
+
/* Command Specific Definitions */
/* --- Set controller to host flow control (OGF 0x03, OCF 0x0031) --- */
#define BLE_HCI_CTLR_TO_HOST_FC_OFF (0)