| /* |
| * Copyright (c) 2016-2017 Nordic Semiconductor ASA |
| * Copyright (c) 2016 Vinayak Kariappa Chettimada |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr.h> |
| #include <bluetooth/hci.h> |
| |
| #include "util/util.h" |
| |
| #include "pdu.h" |
| #include "ctrl.h" |
| #include "ll.h" |
| #include "ll_filter.h" |
| |
| static struct { |
| u16_t interval; |
| u16_t window; |
| |
| #if defined(CONFIG_BT_CTLR_ADV_EXT) |
| u8_t type:4; |
| #else /* !CONFIG_BT_CTLR_ADV_EXT */ |
| u8_t type:1; |
| #endif /* !CONFIG_BT_CTLR_ADV_EXT */ |
| |
| u8_t own_addr_type:2; |
| u8_t filter_policy:2; |
| } ll_scan; |
| |
| u32_t ll_scan_params_set(u8_t type, u16_t interval, u16_t window, |
| u8_t own_addr_type, u8_t filter_policy) |
| { |
| if (radio_scan_is_enabled()) { |
| return BT_HCI_ERR_CMD_DISALLOWED; |
| } |
| |
| /* type value: |
| * 0000b - legacy 1M passive |
| * 0001b - legacy 1M active |
| * 0010b - Ext. 1M passive |
| * 0011b - Ext. 1M active |
| * 0100b - invalid |
| * 0101b - invalid |
| * 0110b - invalid |
| * 0111b - invalid |
| * 1000b - Ext. Coded passive |
| * 1001b - Ext. Coded active |
| */ |
| ll_scan.type = type; |
| ll_scan.interval = interval; |
| ll_scan.window = window; |
| ll_scan.own_addr_type = own_addr_type; |
| ll_scan.filter_policy = filter_policy; |
| |
| return 0; |
| } |
| |
| u32_t ll_scan_enable(u8_t enable) |
| { |
| u32_t status; |
| u8_t rpa_gen = 0; |
| |
| if (!enable) { |
| return radio_scan_disable(); |
| } else if (radio_scan_is_enabled()) { |
| /* Duplicate filtering is processed in the HCI layer */ |
| return 0; |
| } |
| |
| #if defined(CONFIG_BT_CTLR_PRIVACY) |
| ll_filters_scan_update(ll_scan.filter_policy); |
| |
| if ((ll_scan.type & 0x1) && |
| (ll_scan.own_addr_type == BT_ADDR_LE_PUBLIC_ID || |
| ll_scan.own_addr_type == BT_ADDR_LE_RANDOM_ID)) { |
| /* Generate RPAs if required */ |
| ll_rl_rpa_update(false); |
| rpa_gen = 1; |
| } |
| #endif |
| status = radio_scan_enable(ll_scan.type, ll_scan.own_addr_type & 0x1, |
| ll_addr_get(ll_scan.own_addr_type & 0x1, |
| NULL), |
| ll_scan.interval, ll_scan.window, |
| ll_scan.filter_policy, rpa_gen, |
| FILTER_IDX_NONE); |
| |
| return status; |
| } |