Bluetooth: controller: Split Ext Scan Filter Policies out

Since Extended Scanner Filter Policies is an independent feature from
Controller-based Privacy, split it out so it can be built independently
and included without it.

Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
This commit is contained in:
Carles Cufi 2017-08-15 12:37:04 +02:00 committed by Johan Hedberg
commit fc965e5554
8 changed files with 43 additions and 15 deletions

View file

@ -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

View file

@ -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,

View file

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

View file

@ -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 */

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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