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

Commit eeca6f89 authored by Johan Hedberg's avatar Johan Hedberg Committed by Gustavo Padovan
Browse files

Bluetooth: Add new mgmt setting for LE advertising



This patch adds a new mgmt setting for LE advertising and hooks up the
necessary places in the mgmt code to operate on the HCI_LE_PERIPHERAL
flag (which corresponds to this setting). This patch does not yet add
any new command for enabling the setting - that is left for a subsequent
patch.

Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
parent 416a4ae5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ struct mgmt_rp_read_index_list {
#define MGMT_SETTING_BREDR		0x00000080
#define MGMT_SETTING_HS			0x00000100
#define MGMT_SETTING_LE			0x00000200
#define MGMT_SETTING_ADVERTISING	0x00000400

#define MGMT_OP_READ_INFO		0x0004
#define MGMT_READ_INFO_SIZE		0
+1 −0
Original line number Diff line number Diff line
@@ -1000,6 +1000,7 @@ static void hci_cc_write_le_host_supported(struct hci_dev *hdev,
		} else {
			hdev->features[1][0] &= ~LMP_HOST_LE;
			clear_bit(HCI_LE_ENABLED, &hdev->dev_flags);
			clear_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags);
		}

		if (sent->simul)
+20 −1
Original line number Diff line number Diff line
@@ -384,8 +384,10 @@ static u32 get_supported_settings(struct hci_dev *hdev)
	if (enable_hs)
		settings |= MGMT_SETTING_HS;

	if (lmp_le_capable(hdev))
	if (lmp_le_capable(hdev)) {
		settings |= MGMT_SETTING_LE;
		settings |= MGMT_SETTING_ADVERTISING;
	}

	return settings;
}
@@ -424,6 +426,9 @@ static u32 get_current_settings(struct hci_dev *hdev)
	if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags))
		settings |= MGMT_SETTING_HS;

	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags))
		settings |= MGMT_SETTING_ADVERTISING;

	return settings;
}

@@ -1411,6 +1416,11 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
			changed = true;
		}

		if (!val && test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) {
			clear_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags);
			changed = true;
		}

		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
			goto unlock;
@@ -1442,6 +1452,9 @@ static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)

	hci_req_init(&req, hdev);

	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags) && !val)
		hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(val), &val);

	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

@@ -3517,6 +3530,12 @@ static int powered_update_hci(struct hci_dev *hdev)
				    sizeof(cp), &cp);
	}

	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) {
		u8 adv = 0x01;

		hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(adv), &adv);
	}

	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,