if BT_MESH
+comment "Note: If using Duplicate Scan, set Scan Duplicate Type to 0x2"
+config BT_MESH_USE_DUPLICATE_SCAN
+ bool "Support Duplicate Scan in BLE Mesh"
+ select BLE_SCAN_DUPLICATE
+ select BLE_MESH_SCAN_DUPLICATE_EN
+ default y
+ help
+ Enable this option to allow using specific duplicate scan filter
+ in BLE Mesh, Scan Duplicate Type must be set to 0x02.
+ make menuconfig -> Component config -> Bluetooth -> Bluetooth
+ controller -> Scan Duplicate Type -> Scan Duplicate By Device
+ Address And Advertising Data.
+
config BT_MESH_FAST_PROV
bool "Enable BLE Mesh Fast Provisioning"
select BT_MESH_NODE
return bt_le_scan_start(&scan_param, bt_mesh_scan_cb);
}
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+int bt_mesh_duplicate_scan_enable(void)
+{
+ struct bt_le_scan_param scan_param = {
+ .type = BT_HCI_LE_SCAN_PASSIVE,
+ .filter_dup = BT_HCI_LE_SCAN_FILTER_DUP_ENABLE,
+ .interval = MESH_SCAN_INTERVAL,
+ .window = MESH_SCAN_WINDOW
+ };
+
+ BT_DBG("%s", __func__);
+
+ return bt_le_scan_start(&scan_param, bt_mesh_scan_cb);
+}
+#endif
+
int bt_mesh_scan_disable(void)
{
BT_DBG("%s", __func__);
int bt_mesh_scan_enable(void);
+int bt_mesh_duplicate_scan_enable(void);
+
int bt_mesh_scan_disable(void);
void ble_mesh_task_post(ble_mesh_msg_t *msg, uint32_t timeout);
int bt_encrypt_be(const u8_t key[16], const u8_t plaintext[16],
u8_t enc_data[16]);
+enum {
+ BT_MESH_EXCEP_LIST_ADD = 0,
+ BT_MESH_EXCEP_LIST_REMOVE,
+ BT_MESH_EXCEP_LIST_CLEAN,
+};
+
+enum {
+ BT_MESH_EXCEP_INFO_ADV_ADDR = 0,
+ BT_MESH_EXCEP_INFO_MESH_LINK_ID,
+ BT_MESH_EXCEP_INFO_MESH_BEACON,
+ BT_MESH_EXCEP_INFO_MESH_PROV_ADV,
+ BT_MESH_EXCEP_INFO_MESH_PROXY_ADV,
+};
+
+enum {
+ BT_MESH_EXCEP_CLEAN_ADDR_LIST = BIT(0),
+ BT_MESH_EXCEP_CLEAN_MESH_LINK_ID_LIST = BIT(1),
+ BT_MESH_EXCEP_CLEAN_MESH_BEACON_LIST = BIT(2),
+ BT_MESH_EXCEP_CLEAN_MESH_PROV_ADV_LIST = BIT(3),
+ BT_MESH_EXCEP_CLEAN_MESH_PROXY_ADV_LIST = BIT(4),
+ BT_MESH_EXCEP_CLEAN_ALL_LIST = 0xFFFF,
+};
+
+int bt_mesh_update_exceptional_list(u8_t sub_code, u8_t type, void *info);
+
#endif /* #ifndef __MESH_BEARER_ADRPT_H__ */
return true;
}
-static int start_le_scan(u8_t scan_type, u16_t interval, u16_t window)
+static int start_le_scan(u8_t scan_type, u16_t interval, u16_t window, u8_t filter_dup)
{
int err = 0;
/*TODO: Need to process scan_param_setup_cback
* Need to add menuconfig for duplicate scan*/
-#if defined(CONFIG_BLE_MESH_SCAN_DUPLICATE_EN) && CONFIG_BLE_MESH_SCAN_DUPLICATE_EN
BTM_BleSetScanFilterParams(client_if, interval, window, scan_type, addr_type_own,
- BT_HCI_LE_SCAN_FILTER_DUP_ENABLE, scan_fil_policy, NULL);
-#else
- BTM_BleSetScanFilterParams(client_if, interval, window, scan_type, addr_type_own,
- BT_HCI_LE_SCAN_FILTER_DUP_DISABLE, scan_fil_policy, NULL);
-#endif
+ filter_dup, scan_fil_policy, NULL);
/*TODO: Need to process p_start_stop_scan_cb to check if start successfully */
/* BLE Mesh scan permanently, so no duration of scan here */
}
#endif
- err = start_le_scan(param->type, param->interval, param->window);
+ err = start_le_scan(param->type, param->interval, param->window, param->filter_dup);
if (err) {
#if BT_DEV
atomic_clear_bit(bt_dev.flags, BT_DEV_EXPLICIT_SCAN);
#endif /* CONFIG_MBEDTLS_HARDWARE_AES */
}
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+int bt_mesh_update_exceptional_list(u8_t sub_code, u8_t type, void *info)
+{
+ BD_ADDR value = {0};
+
+ if ((sub_code > BT_MESH_EXCEP_LIST_CLEAN) ||
+ (type > BT_MESH_EXCEP_INFO_MESH_PROXY_ADV)) {
+ BT_ERR("%s, Invalid parameter", __func__);
+ return -EINVAL;
+ }
+
+ if (type == BT_MESH_EXCEP_INFO_MESH_LINK_ID) {
+ if (!info) {
+ BT_ERR("%s, NULL Provisioning Link ID", __func__);
+ return -EINVAL;
+ }
+ memcpy(value, info, sizeof(u32_t));
+ }
+
+ BT_DBG("%s, %s type 0x%x", __func__, sub_code ? "Remove" : "Add", type);
+
+ /* The parameter "device_info" can't be NULL in the API */
+ BLE_MESH_BTM_CHECK_STATUS(BTM_UpdateBleDuplicateExceptionalList(sub_code, type, value, NULL));
+
+ return 0;
+}
+#endif
+
#endif /* #if CONFIG_BT_MESH */
/* Add this to avoid "already active status" for bt_mesh_scan_enable() */
bt_mesh_scan_disable();
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ /* Add Mesh beacon type (Secure Network Beacon) to the exceptional list */
+ bt_mesh_update_exceptional_list(BT_MESH_EXCEP_LIST_ADD,
+ BT_MESH_EXCEP_INFO_MESH_BEACON, NULL);
+#endif
+
if (IS_ENABLED(CONFIG_BT_MESH_LOW_POWER)) {
+ /* TODO: Enable duplicate scan in Low Power Mode */
bt_mesh_lpn_init();
} else {
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ bt_mesh_duplicate_scan_enable();
+#else
bt_mesh_scan_enable();
+#endif
}
if (IS_ENABLED(CONFIG_BT_MESH_FRIEND)) {
if (IS_ENABLED(CONFIG_BT_MESH_PB_ADV) &&
(bearers & BT_MESH_PROV_ADV)) {
/* Make sure the scanning is for provisioning invitations */
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ bt_mesh_duplicate_scan_enable();
+#else
bt_mesh_scan_enable();
+#endif
/* Enable unprovisioned beacon sending */
bt_mesh_beacon_enable();
}
return err;
}
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ if (IS_ENABLED(CONFIG_BT_MESH_PB_ADV) &&
+ (bearers & BT_MESH_PROV_ADV)) {
+ bt_mesh_update_exceptional_list(BT_MESH_EXCEP_LIST_ADD,
+ BT_MESH_EXCEP_INFO_MESH_BEACON, NULL);
+ }
+
+ if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT) &&
+ (bearers & BT_MESH_PROV_GATT)) {
+ bt_mesh_update_exceptional_list(BT_MESH_EXCEP_LIST_ADD,
+ BT_MESH_EXCEP_INFO_MESH_PROV_ADV, NULL);
+ }
+
+ if (IS_ENABLED(CONFIG_BT_MESH_PROXY)) {
+ bt_mesh_update_exceptional_list(BT_MESH_EXCEP_LIST_ADD,
+ BT_MESH_EXCEP_INFO_MESH_PROXY_ADV, NULL);
+ }
+#endif
+
if ((IS_ENABLED(CONFIG_BT_MESH_PB_ADV) &&
(bearers & BT_MESH_PROV_ADV)) ||
(IS_ENABLED(CONFIG_BT_MESH_PB_GATT) &&
(bearers & BT_MESH_PROV_GATT))) {
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ bt_mesh_duplicate_scan_enable();
+#else
bt_mesh_scan_enable();
+#endif
}
if (IS_ENABLED(CONFIG_BT_MESH_PB_GATT) &&
bt_mesh_adv_update();
}
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ /* Add Mesh beacon type (Secure Network Beacon) to the exceptional list */
+ bt_mesh_update_exceptional_list(BT_MESH_EXCEP_LIST_ADD,
+ BT_MESH_EXCEP_INFO_MESH_BEACON, NULL);
+#endif
+
if (IS_ENABLED(CONFIG_BT_MESH_LOW_POWER)) {
+ /* TODO: Enable duplicate scan in Low Power Mode */
bt_mesh_lpn_init();
} else {
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ bt_mesh_duplicate_scan_enable();
+#else
bt_mesh_scan_enable();
+#endif
}
if (IS_ENABLED(CONFIG_BT_MESH_FRIEND)) {
prov->link_close(BT_MESH_PROV_ADV);
}
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ /* Remove the link id from exceptional list */
+ bt_mesh_update_exceptional_list(BT_MESH_EXCEP_LIST_REMOVE,
+ BT_MESH_EXCEP_INFO_MESH_LINK_ID, &link.id);
+#endif
+
/* Clear everything except the retransmit delayed work config */
memset(&link, 0, offsetof(struct prov_link, tx.retransmit));
atomic_set_bit(link.flags, LINK_ACTIVE);
net_buf_simple_init(link.rx.buf, 0);
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ /* Add the link id into exceptional list */
+ bt_mesh_update_exceptional_list(BT_MESH_EXCEP_LIST_ADD,
+ BT_MESH_EXCEP_INFO_MESH_LINK_ID, &link.id);
+#endif
+
bearer_ctl_send(LINK_ACK, NULL, 0);
link.expect = PROV_INVITE;
prov_memory_free(i);
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ /* Remove the link id from exceptional list */
+ bt_mesh_update_exceptional_list(BT_MESH_EXCEP_LIST_REMOVE,
+ BT_MESH_EXCEP_INFO_MESH_LINK_ID, &link[i].link_id);
+#endif
+
/* Clear everything except the retransmit delayed work config */
memset(&link[i], 0, offsetof(struct prov_link, tx.retransmit));
}
}
+#if defined(CONFIG_BT_MESH_USE_DUPLICATE_SCAN)
+ /* Add the link id into exceptional list */
+ bt_mesh_update_exceptional_list(BT_MESH_EXCEP_LIST_ADD,
+ BT_MESH_EXCEP_INFO_MESH_LINK_ID, &link[i].link_id);
+#endif
+
bearer_ctl_send(i, LINK_OPEN, link[i].uuid, 16);
/* Set LINK_ACTIVE just to be in compatibility with current Zephyr code */
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_ENABLED=y
+CONFIG_BLE_SCAN_DUPLICATE=y
+CONFIG_SCAN_DUPLICATE_TYPE=2
+CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200
+CONFIG_BLE_MESH_SCAN_DUPLICATE_EN=y
+CONFIG_MESH_DUPLICATE_SCAN_CACHE_SIZE=200
CONFIG_BT_MESH=y
+CONFIG_BT_MESH_USE_DUPLICATE_SCAN=y
CONFIG_BT_MESH_NODE=y
CONFIG_BT_MESH_PROV=y
CONFIG_NET_BUF_POOL_USAGE=y
CONFIG_ESPTOOLPY_BAUD_921600B=y
CONFIG_MONITOR_BAUD_921600B=y
CONFIG_BT_ENABLED=y
+CONFIG_BLE_SCAN_DUPLICATE=y
+CONFIG_SCAN_DUPLICATE_TYPE=2
+CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200
+CONFIG_BLE_MESH_SCAN_DUPLICATE_EN=y
+CONFIG_MESH_DUPLICATE_SCAN_CACHE_SIZE=200
CONFIG_BT_MESH=y
+CONFIG_BT_MESH_USE_DUPLICATE_SCAN=y
CONFIG_BT_MESH_NODE=y
CONFIG_BT_MESH_PROV=y
CONFIG_NET_BUF_POOL_USAGE=y
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_ENABLED=y
+CONFIG_BLE_SCAN_DUPLICATE=y
+CONFIG_SCAN_DUPLICATE_TYPE=2
+CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200
+CONFIG_BLE_MESH_SCAN_DUPLICATE_EN=y
+CONFIG_MESH_DUPLICATE_SCAN_CACHE_SIZE=200
CONFIG_BT_MESH=y
+CONFIG_BT_MESH_USE_DUPLICATE_SCAN=y
CONFIG_BT_MESH_PROV=y
CONFIG_BT_MESH_PROVISIONER=y
CONFIG_BT_MESH_UNPROV_DEV_ADD=20
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_ENABLED=y
+CONFIG_BLE_SCAN_DUPLICATE=y
+CONFIG_SCAN_DUPLICATE_TYPE=2
+CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200
+CONFIG_BLE_MESH_SCAN_DUPLICATE_EN=y
+CONFIG_MESH_DUPLICATE_SCAN_CACHE_SIZE=200
CONFIG_BT_MESH=y
+CONFIG_BT_MESH_USE_DUPLICATE_SCAN=y
CONFIG_BT_MESH_PROV=y
CONFIG_BT_MESH_PROVISIONER=y
CONFIG_BT_MESH_UNPROV_DEV_ADD=10
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_ENABLED=y
+CONFIG_BLE_SCAN_DUPLICATE=y
+CONFIG_SCAN_DUPLICATE_TYPE=2
+CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200
+CONFIG_BLE_MESH_SCAN_DUPLICATE_EN=y
+CONFIG_MESH_DUPLICATE_SCAN_CACHE_SIZE=200
CONFIG_BT_MESH=y
+CONFIG_BT_MESH_USE_DUPLICATE_SCAN=y
CONFIG_BT_MESH_FAST_PROV=y
CONFIG_BT_MESH_PROV=y
CONFIG_BT_MESH_NODE=y
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_ENABLED=y
+CONFIG_BLE_SCAN_DUPLICATE=y
+CONFIG_SCAN_DUPLICATE_TYPE=2
+CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200
+CONFIG_BLE_MESH_SCAN_DUPLICATE_EN=y
+CONFIG_MESH_DUPLICATE_SCAN_CACHE_SIZE=200
CONFIG_BT_MESH=y
+CONFIG_BT_MESH_USE_DUPLICATE_SCAN=y
CONFIG_BT_MESH_NODE=y
CONFIG_BT_MESH_PROV=y
CONFIG_NET_BUF_POOL_USAGE=y
# Override some defaults so BT stack is enabled
# by default in this example
CONFIG_BT_ENABLED=y
+CONFIG_BLE_SCAN_DUPLICATE=y
+CONFIG_SCAN_DUPLICATE_TYPE=2
+CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200
+CONFIG_BLE_MESH_SCAN_DUPLICATE_EN=y
+CONFIG_MESH_DUPLICATE_SCAN_CACHE_SIZE=200
CONFIG_BT_MESH=y
+CONFIG_BT_MESH_USE_DUPLICATE_SCAN=y
CONFIG_BT_MESH_PROV=y
CONFIG_BT_MESH_PROVISIONER=y
CONFIG_BT_MESH_UNPROV_DEV_ADD=10
CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240
CONFIG_MEMMAP_SMP=y
CONFIG_BT_ENABLED=y
+CONFIG_BLE_SCAN_DUPLICATE=y
+CONFIG_SCAN_DUPLICATE_TYPE=2
+CONFIG_DUPLICATE_SCAN_CACHE_SIZE=200
+CONFIG_BLE_MESH_SCAN_DUPLICATE_EN=y
+CONFIG_MESH_DUPLICATE_SCAN_CACHE_SIZE=200
CONFIG_BT_MESH=y
+CONFIG_BT_MESH_USE_DUPLICATE_SCAN=y
CONFIG_BT_MESH_FAST_PROV=y
CONFIG_BT_MESH_PROV=y
CONFIG_BT_MESH_NODE=y