2022-10-07 18:34:58

by Gix, Brian

[permalink] [raw]
Subject: [PATCH v2] Bluetooth: Call HCI cmd to set random addr during MGMT call

The call to MGMT_OP_SET_STATIC_ADDRESS saved the requested address in
the hdev structure, but never wrote that address out to the controller.
This adds call to hci_set_random_addr_sync() after it has been
validated.

Signed-off-by: Brian Gix <[email protected]>
---
include/net/bluetooth/hci_sync.h | 1 +
net/bluetooth/hci_sync.c | 2 +-
net/bluetooth/mgmt.c | 35 ++++++++++++++++++++++++++++++++
3 files changed, 37 insertions(+), 1 deletion(-)

diff --git a/include/net/bluetooth/hci_sync.h b/include/net/bluetooth/hci_sync.h
index 17f5a4c32f36..24864672d12c 100644
--- a/include/net/bluetooth/hci_sync.h
+++ b/include/net/bluetooth/hci_sync.h
@@ -90,6 +90,7 @@ int hci_read_clock_sync(struct hci_dev *hdev, struct hci_cp_read_clock *cp);
int hci_write_fast_connectable_sync(struct hci_dev *hdev, bool enable);
int hci_update_scan_sync(struct hci_dev *hdev);
int hci_update_scan(struct hci_dev *hdev);
+int hci_set_random_addr_sync(struct hci_dev *hdev, bdaddr_t *rpa);

int hci_write_le_host_supported_sync(struct hci_dev *hdev, u8 le, u8 simul);
int hci_remove_ext_adv_instance_sync(struct hci_dev *hdev, u8 instance,
diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
index 76c3107c9f91..e1e3658a6e19 100644
--- a/net/bluetooth/hci_sync.c
+++ b/net/bluetooth/hci_sync.c
@@ -839,7 +839,7 @@ static bool adv_use_rpa(struct hci_dev *hdev, uint32_t flags)
return true;
}

-static int hci_set_random_addr_sync(struct hci_dev *hdev, bdaddr_t *rpa)
+int hci_set_random_addr_sync(struct hci_dev *hdev, bdaddr_t *rpa)
{
/* If we're advertising or initiating an LE connection we can't
* go ahead and change the random address at this time. This is
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index a92e7e485feb..990ab0f6414a 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -6501,10 +6501,28 @@ static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data,
return err;
}

+static int set_addr_sync(struct hci_dev *hdev, void *data)
+{
+ struct mgmt_pending_cmd *cmd = data;
+ struct mgmt_cp_set_static_address *cp = cmd->param;
+
+ return hci_set_random_addr_sync(hdev, &cp->bdaddr);
+}
+
+static void set_addr_complete(struct hci_dev *hdev, void *data, int err)
+{
+ struct mgmt_pending_cmd *cmd = data;
+
+ mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
+ mgmt_status(err));
+ mgmt_pending_free(cmd);
+}
+
static int set_static_address(struct sock *sk, struct hci_dev *hdev,
void *data, u16 len)
{
struct mgmt_cp_set_static_address *cp = data;
+ struct mgmt_pending_cmd *cmd = data;
int err;

bt_dev_dbg(hdev, "sock %p", sk);
@@ -6534,6 +6552,23 @@ static int set_static_address(struct sock *sk, struct hci_dev *hdev,

bacpy(&hdev->static_addr, &cp->bdaddr);

+ cmd = mgmt_pending_new(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev, data, len);
+ if (!cmd)
+ err = -ENOMEM;
+ else
+ err = hci_cmd_sync_queue(hdev, set_addr_sync, cmd,
+ set_addr_complete);
+
+ if (err < 0) {
+ if (cmd)
+ mgmt_pending_free(cmd);
+
+ mgmt_cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
+ mgmt_status(err));
+
+ goto unlock;
+ }
+
err = send_settings_rsp(sk, MGMT_OP_SET_STATIC_ADDRESS, hdev);
if (err < 0)
goto unlock;
--
2.37.3


2022-10-07 19:27:46

by bluez.test.bot

[permalink] [raw]
Subject: RE: [v2] Bluetooth: Call HCI cmd to set random addr during MGMT call

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=683792

---Test result---

Test Summary:
CheckPatch PASS 1.25 seconds
GitLint PASS 0.40 seconds
SubjectPrefix PASS 0.27 seconds
BuildKernel PASS 43.38 seconds
BuildKernel32 PASS 39.55 seconds
Incremental Build with patchesPASS 57.32 seconds
TestRunner: Setup PASS 645.62 seconds
TestRunner: l2cap-tester PASS 20.75 seconds
TestRunner: iso-tester PASS 20.53 seconds
TestRunner: bnep-tester PASS 7.86 seconds
TestRunner: mgmt-tester PASS 129.41 seconds
TestRunner: rfcomm-tester PASS 12.18 seconds
TestRunner: sco-tester PASS 11.64 seconds
TestRunner: ioctl-tester PASS 13.13 seconds
TestRunner: mesh-tester PASS 9.69 seconds
TestRunner: smp-tester PASS 11.57 seconds
TestRunner: userchan-tester PASS 8.14 seconds



---
Regards,
Linux Bluetooth