diff --git a/subsys/bluetooth/controller/Kconfig b/subsys/bluetooth/controller/Kconfig index d423d49814e..ac3421705aa 100644 --- a/subsys/bluetooth/controller/Kconfig +++ b/subsys/bluetooth/controller/Kconfig @@ -123,7 +123,8 @@ config BT_CTLR_PRIVACY default y select BT_RPA help - Enable support for Bluetooth v4.2 LE Controller-based Privacy feature in the Controller. + Enable support for Bluetooth v4.2 LE Controller-based Privacy feature + in the Controller. config BT_CTLR_RL_SIZE prompt "LE Controller-based Privacy Resolving List size" @@ -135,6 +136,13 @@ config BT_CTLR_RL_SIZE Set the size of the Resolving List for LE Controller-based Privacy. On nRF5x-based controllers, the hardware imposes a limit of 8 devices. +config BT_CTLR_EXT_SCAN_FP + bool "LE Extended Scanner Filter Policies" + default y + help + Enable support for Bluetooth v4.2 LE Extended Scanner Filter Policies + in the Controller. + config BT_CTLR_DATA_LENGTH bool "Data Length Update" default y diff --git a/subsys/bluetooth/controller/hci/hci.c b/subsys/bluetooth/controller/hci/hci.c index cf689709e19..8e097a51321 100644 --- a/subsys/bluetooth/controller/hci/hci.c +++ b/subsys/bluetooth/controller/hci/hci.c @@ -1677,15 +1677,18 @@ static void le_advertising_report(struct pdu_data *pdu_data, u8_t *b, u8_t info_len; u8_t rssi; #if defined(CONFIG_BT_CTLR_PRIVACY) - u8_t rl_idx, direct; + u8_t rl_idx; #endif /* CONFIG_BT_CTLR_PRIVACY */ +#if defined(CONFIG_BT_CTLR_EXT_SCAN_FP) + u8_t direct; +#endif /* CONFIG_BT_CTLR_EXT_SCAN_FP */ u8_t *prssi; if (!(event_mask & BT_EVT_MASK_LE_META_EVENT)) { return; } -#if defined(CONFIG_BT_CTLR_PRIVACY) +#if defined(CONFIG_BT_CTLR_EXT_SCAN_FP) direct = b[offsetof(struct radio_pdu_node_rx, pdu_data) + offsetof(struct pdu_adv, payload) + adv->len + 2]; @@ -1697,7 +1700,7 @@ static void le_advertising_report(struct pdu_data *pdu_data, u8_t *b, if (!(le_event_mask & BT_EVT_MASK_LE_ADVERTISING_REPORT)) { return; } -#endif /* CONFIG_BT_CTLR_PRIVACY */ +#endif /* CONFIG_BT_CTLR_EXT_SCAN_FP */ #if CONFIG_BT_CTLR_DUP_FILTER_LEN > 0 @@ -1715,10 +1718,7 @@ static void le_advertising_report(struct pdu_data *pdu_data, u8_t *b, rssi = b[offsetof(struct radio_pdu_node_rx, pdu_data) + offsetof(struct pdu_adv, payload) + adv->len]; -#if defined(CONFIG_BT_CTLR_PRIVACY) - rl_idx = b[offsetof(struct radio_pdu_node_rx, pdu_data) + - offsetof(struct pdu_adv, payload) + adv->len + 1]; - +#if defined(CONFIG_BT_CTLR_EXT_SCAN_FP) if (direct) { struct bt_hci_evt_le_direct_adv_report *drp; struct bt_hci_evt_le_direct_adv_info *dir_info; @@ -1732,6 +1732,9 @@ static void le_advertising_report(struct pdu_data *pdu_data, u8_t *b, dir_info->evt_type = c_adv_type[PDU_ADV_TYPE_DIRECT_IND]; +#if defined(CONFIG_BT_CTLR_PRIVACY) + rl_idx = b[offsetof(struct radio_pdu_node_rx, pdu_data) + + offsetof(struct pdu_adv, payload) + adv->len + 1]; if (rl_idx < ll_rl_size_get()) { /* Store identity address */ ll_rl_id_addr_get(rl_idx, &dir_info->addr.type, @@ -1739,6 +1742,9 @@ static void le_advertising_report(struct pdu_data *pdu_data, u8_t *b, /* Mark it as identity address from RPA (0x02, 0x03) */ dir_info->addr.type += 2; } else { +#else + if (1) { +#endif /* CONFIG_BT_CTLR_PRIVACY */ dir_info->addr.type = adv->tx_addr; memcpy(&dir_info->addr.a.val[0], &adv->payload.direct_ind.adv_addr[0], @@ -1753,7 +1759,7 @@ static void le_advertising_report(struct pdu_data *pdu_data, u8_t *b, return; } -#endif /* CONFIG_BT_CTLR_PRIVACY */ +#endif /* CONFIG_BT_CTLR_EXT_SCAN_FP */ info_len = sizeof(struct bt_hci_evt_le_advertising_info) + data_len + sizeof(*prssi); @@ -1766,6 +1772,8 @@ static void le_advertising_report(struct pdu_data *pdu_data, u8_t *b, adv_info->evt_type = c_adv_type[adv->type]; #if defined(CONFIG_BT_CTLR_PRIVACY) + rl_idx = b[offsetof(struct radio_pdu_node_rx, pdu_data) + + offsetof(struct pdu_adv, payload) + adv->len + 1]; if (rl_idx < ll_rl_size_get()) { /* Store identity address */ ll_rl_id_addr_get(rl_idx, &adv_info->addr.type, diff --git a/subsys/bluetooth/controller/ll_sw/ctrl.c b/subsys/bluetooth/controller/ll_sw/ctrl.c index 56c425c3ec0..e106b93f2f1 100644 --- a/subsys/bluetooth/controller/ll_sw/ctrl.c +++ b/subsys/bluetooth/controller/ll_sw/ctrl.c @@ -1145,13 +1145,15 @@ static u32_t isr_rx_scan_report(u8_t rssi_ready, u8_t rl_idx, bool dir_report) (rssi_ready) ? (radio_rssi_get() & 0x7f) : 0x7f; #if defined(CONFIG_BT_CTLR_PRIVACY) - /* save the resolving list index */ + /* save the resolving list index. */ ((u8_t *)pdu_adv_rx)[offsetof(struct pdu_adv, payload) + pdu_adv_rx->len + 1] = rl_idx; +#endif /* CONFIG_BT_CTLR_PRIVACY */ +#if defined(CONFIG_BT_CTLR_EXT_SCAN_FP) /* save the directed adv report flag */ ((u8_t *)pdu_adv_rx)[offsetof(struct pdu_adv, payload) + pdu_adv_rx->len + 2] = dir_report ? 1 : 0; -#endif /* CONFIG_BT_CTLR_PRIVACY */ +#endif /* CONFIG_BT_CTLR_EXT_SCAN_FP */ packet_rx_enqueue(); diff --git a/subsys/bluetooth/controller/ll_sw/ctrl.h b/subsys/bluetooth/controller/ll_sw/ctrl.h index c0f9ec14039..4521b29df2d 100644 --- a/subsys/bluetooth/controller/ll_sw/ctrl.h +++ b/subsys/bluetooth/controller/ll_sw/ctrl.h @@ -53,12 +53,16 @@ #if defined(CONFIG_BT_CTLR_PRIVACY) #define RADIO_BLE_FEAT_BIT_PRIVACY BIT64(BT_LE_FEAT_BIT_PRIVACY) -#define RADIO_BLE_FEAT_BIT_EXT_SCAN BIT64(BT_LE_FEAT_BIT_EXT_SCAN) #else /* !CONFIG_BT_CTLR_PRIVACY */ #define RADIO_BLE_FEAT_BIT_PRIVACY 0 -#define RADIO_BLE_FEAT_BIT_EXT_SCAN 0 #endif /* !CONFIG_BT_CTLR_PRIVACY */ +#if defined(CONFIG_BT_CTLR_EXT_SCAN_FP) +#define RADIO_BLE_FEAT_BIT_EXT_SCAN BIT64(BT_LE_FEAT_BIT_EXT_SCAN) +#else /* !CONFIG_BT_CTLR_EXT_SCAN_FP */ +#define RADIO_BLE_FEAT_BIT_EXT_SCAN 0 +#endif /* !CONFIG_BT_CTLR_EXT_SCAN_FP */ + #if defined(CONFIG_BT_CTLR_CHAN_SEL_2) #define RADIO_BLE_FEAT_BIT_CHAN_SEL_2 BIT64(BT_LE_FEAT_BIT_CHAN_SEL_ALGO_2) #else /* !CONFIG_BT_CTLR_CHAN_SEL_2 */ diff --git a/subsys/bluetooth/controller/ll_sw/ctrl_internal.h b/subsys/bluetooth/controller/ll_sw/ctrl_internal.h index ca03f2292ee..924ac9194c7 100644 --- a/subsys/bluetooth/controller/ll_sw/ctrl_internal.h +++ b/subsys/bluetooth/controller/ll_sw/ctrl_internal.h @@ -274,9 +274,12 @@ struct pdu_data_q_tx { }; /* Extra bytes for enqueued rx_node metadata: rssi (always) and resolving - * index and directed adv report (with privacy enabled). + * index and directed adv report (with privacy or extended scanner filter + * policies enabled). + * Note: to simplify the code, both bytes are allocated even if only one of + * the options is selected. */ -#if defined(CONFIG_BT_CTLR_PRIVACY) +#if defined(CONFIG_BT_CTLR_PRIVACY) || defined(CONFIG_BT_CTLR_EXT_SCAN_FP) #define PDU_AC_SIZE_EXTRA 3 #else #define PDU_AC_SIZE_EXTRA 1 diff --git a/tests/bluetooth/init/prj_controller_4_0.conf b/tests/bluetooth/init/prj_controller_4_0.conf index 827e1ef7a02..4130a07f3d4 100644 --- a/tests/bluetooth/init/prj_controller_4_0.conf +++ b/tests/bluetooth/init/prj_controller_4_0.conf @@ -7,6 +7,7 @@ CONFIG_BT_CTLR_SCHED_ADVANCED=y CONFIG_BT_CTLR_DUP_FILTER_LEN=16 CONFIG_BT_CTLR_LE_PING=n CONFIG_BT_CTLR_PRIVACY=n +CONFIG_BT_CTLR_EXT_SCAN_FP=n CONFIG_BT_CTLR_DATA_LENGTH=n CONFIG_BT_CTLR_PHY=n CONFIG_BT_CTLR_CHAN_SEL_2=n diff --git a/tests/bluetooth/init/prj_controller_dbg.conf b/tests/bluetooth/init/prj_controller_dbg.conf index ebe9977757c..af8521259a9 100644 --- a/tests/bluetooth/init/prj_controller_dbg.conf +++ b/tests/bluetooth/init/prj_controller_dbg.conf @@ -7,6 +7,7 @@ CONFIG_BT_CTLR_SCHED_ADVANCED=n CONFIG_BT_CTLR_DUP_FILTER_LEN=16 CONFIG_BT_CTLR_LE_PING=y CONFIG_BT_CTLR_PRIVACY=y +CONFIG_BT_CTLR_EXT_SCAN_FP=y CONFIG_BT_CTLR_DATA_LENGTH=y CONFIG_BT_CTLR_PHY=y CONFIG_BT_CTLR_PHY_2M=y diff --git a/tests/bluetooth/init/prj_controller_tiny.conf b/tests/bluetooth/init/prj_controller_tiny.conf index e0519eba79d..f5eec121eeb 100644 --- a/tests/bluetooth/init/prj_controller_tiny.conf +++ b/tests/bluetooth/init/prj_controller_tiny.conf @@ -7,6 +7,7 @@ CONFIG_BT_CTLR_SCHED_ADVANCED=n CONFIG_BT_CTLR_DUP_FILTER_LEN=0 CONFIG_BT_CTLR_LE_PING=n CONFIG_BT_CTLR_PRIVACY=n +CONFIG_BT_CTLR_EXT_SCAN_FP=n CONFIG_BT_CTLR_DATA_LENGTH=n CONFIG_BT_CTLR_PHY=n CONFIG_BT_CTLR_CHAN_SEL_2=n