提交 50b5b952 编写于 作者: M Marcel Holtmann 提交者: Johan Hedberg

Bluetooth: Support static address when BR/EDR has been disabled

Every BR/EDR/LE dual-mode controller requires to have a public address
and so far that has become the identity address and own address. The
only way to change that behavior was with a force_static_address
debugfs option.

However the host can actually disable the BR/EDR part of a dual-mode
controller and turn into a single mode LE controller. In that case
it makes perfect sense for a host to use a chosen static address
instead of the public address.

So if the host disables BR/EDR and configures a static address, then
that static address is used as identity address and own address. If
the host does not configure a static address, then the public address
is used as before.
Signed-off-by: NMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: NJohan Hedberg <johan.hedberg@intel.com>
上级 cd1c5665
...@@ -3852,12 +3852,18 @@ static void le_scan_disable_work(struct work_struct *work) ...@@ -3852,12 +3852,18 @@ static void le_scan_disable_work(struct work_struct *work)
* *
* For debugging purposes it is possible to force controllers with a * For debugging purposes it is possible to force controllers with a
* public address to use the static random address instead. * public address to use the static random address instead.
*
* In case BR/EDR has been disabled on a dual-mode controller and
* userspace has configured a static address, then that address
* becomes the identity address instead of the public BR/EDR address.
*/ */
void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr,
u8 *bdaddr_type) u8 *bdaddr_type)
{ {
if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) || if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ||
!bacmp(&hdev->bdaddr, BDADDR_ANY)) { !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
(!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) &&
bacmp(&hdev->static_addr, BDADDR_ANY))) {
bacpy(bdaddr, &hdev->static_addr); bacpy(bdaddr, &hdev->static_addr);
*bdaddr_type = ADDR_LE_DEV_RANDOM; *bdaddr_type = ADDR_LE_DEV_RANDOM;
} else { } else {
......
...@@ -378,9 +378,15 @@ int hci_update_random_address(struct hci_request *req, bool require_privacy, ...@@ -378,9 +378,15 @@ int hci_update_random_address(struct hci_request *req, bool require_privacy,
* address use the static address as random address (but skip * address use the static address as random address (but skip
* the HCI command if the current random address is already the * the HCI command if the current random address is already the
* static one. * static one.
*
* In case BR/EDR has been disabled on a dual-mode controller
* and a static address has been configured, then use that
* address instead of the public BR/EDR address.
*/ */
if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) || if (test_bit(HCI_FORCE_STATIC_ADDR, &hdev->dbg_flags) ||
!bacmp(&hdev->bdaddr, BDADDR_ANY)) { !bacmp(&hdev->bdaddr, BDADDR_ANY) ||
(!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) &&
bacmp(&hdev->static_addr, BDADDR_ANY))) {
*own_addr_type = ADDR_LE_DEV_RANDOM; *own_addr_type = ADDR_LE_DEV_RANDOM;
if (bacmp(&hdev->static_addr, &hdev->random_addr)) if (bacmp(&hdev->static_addr, &hdev->random_addr))
hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6, hci_req_add(req, HCI_OP_LE_SET_RANDOM_ADDR, 6,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册