Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7a4cd51d authored by Marcel Holtmann's avatar Marcel Holtmann Committed by Johan Hedberg
Browse files

Bluetooth: Track the current configured random address



For Bluetooth controllers with LE support, track the value of the
currently configured random address. It is important to know what
the current random address is to avoid unneeded attempts to set
a new address. This will become important when introducing the
LE privacy support in the future.

In addition expose the current configured random address via
debugfs for debugging purposes.

Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent b32bba6c
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -151,6 +151,7 @@ struct hci_dev {
	__u8		bus;
	__u8		bus;
	__u8		dev_type;
	__u8		dev_type;
	bdaddr_t	bdaddr;
	bdaddr_t	bdaddr;
	bdaddr_t	random_addr;
	bdaddr_t	static_addr;
	bdaddr_t	static_addr;
	__u8		own_addr_type;
	__u8		own_addr_type;
	__u8		dev_name[HCI_MAX_NAME_LENGTH];
	__u8		dev_name[HCI_MAX_NAME_LENGTH];
+26 −0
Original line number Original line Diff line number Diff line
@@ -548,6 +548,29 @@ static int sniff_max_interval_get(void *data, u64 *val)
DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
DEFINE_SIMPLE_ATTRIBUTE(sniff_max_interval_fops, sniff_max_interval_get,
			sniff_max_interval_set, "%llu\n");
			sniff_max_interval_set, "%llu\n");


static int random_address_show(struct seq_file *f, void *p)
{
	struct hci_dev *hdev = f->private;

	hci_dev_lock(hdev);
	seq_printf(f, "%pMR\n", &hdev->random_addr);
	hci_dev_unlock(hdev);

	return 0;
}

static int random_address_open(struct inode *inode, struct file *file)
{
	return single_open(file, random_address_show, inode->i_private);
}

static const struct file_operations random_address_fops = {
	.open		= random_address_open,
	.read		= seq_read,
	.llseek		= seq_lseek,
	.release	= single_release,
};

static int static_address_show(struct seq_file *f, void *p)
static int static_address_show(struct seq_file *f, void *p)
{
{
	struct hci_dev *hdev = f->private;
	struct hci_dev *hdev = f->private;
@@ -1557,6 +1580,8 @@ static int __hci_init(struct hci_dev *hdev)
	}
	}


	if (lmp_le_capable(hdev)) {
	if (lmp_le_capable(hdev)) {
		debugfs_create_file("random_address", 0444, hdev->debugfs,
				    hdev, &random_address_fops);
		debugfs_create_file("static_address", 0444, hdev->debugfs,
		debugfs_create_file("static_address", 0444, hdev->debugfs,
				    hdev, &static_address_fops);
				    hdev, &static_address_fops);


@@ -2205,6 +2230,7 @@ static int hci_dev_do_close(struct hci_dev *hdev)


	memset(hdev->eir, 0, sizeof(hdev->eir));
	memset(hdev->eir, 0, sizeof(hdev->eir));
	memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
	memset(hdev->dev_class, 0, sizeof(hdev->dev_class));
	bacpy(&hdev->random_addr, BDADDR_ANY);


	hci_req_unlock(hdev);
	hci_req_unlock(hdev);


+24 −0
Original line number Original line Diff line number Diff line
@@ -959,6 +959,26 @@ static void hci_cc_read_local_oob_ext_data(struct hci_dev *hdev,
	hci_dev_unlock(hdev);
	hci_dev_unlock(hdev);
}
}



static void hci_cc_le_set_random_addr(struct hci_dev *hdev, struct sk_buff *skb)
{
	__u8 status = *((__u8 *) skb->data);
	bdaddr_t *sent;

	BT_DBG("%s status 0x%2.2x", hdev->name, status);

	sent = hci_sent_cmd_data(hdev, HCI_OP_LE_SET_RANDOM_ADDR);
	if (!sent)
		return;

	hci_dev_lock(hdev);

	if (!status)
		bacpy(&hdev->random_addr, sent);

	hci_dev_unlock(hdev);
}

static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb)
{
{
	__u8 *sent, status = *((__u8 *) skb->data);
	__u8 *sent, status = *((__u8 *) skb->data);
@@ -2308,6 +2328,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)
		hci_cc_user_passkey_neg_reply(hdev, skb);
		hci_cc_user_passkey_neg_reply(hdev, skb);
		break;
		break;


	case HCI_OP_LE_SET_RANDOM_ADDR:
		hci_cc_le_set_random_addr(hdev, skb);
		break;

	case HCI_OP_LE_SET_ADV_ENABLE:
	case HCI_OP_LE_SET_ADV_ENABLE:
		hci_cc_le_set_adv_enable(hdev, skb);
		hci_cc_le_set_adv_enable(hdev, skb);
		break;
		break;