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

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

Bluetooth: Add simple version of Read Advertising Features command



This adds support for the simplest possible version of Read Advertising
Features management command. It allows basic testing of the interface.

Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
parent a958452a
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -517,6 +517,17 @@ struct mgmt_rp_read_ext_index_list {
	} entry[0];
} __packed;

#define MGMT_OP_READ_ADV_FEATURES	0x0003D
#define MGMT_READ_ADV_FEATURES_SIZE	0
struct mgmt_rp_read_adv_features {
	__le32 supported_flags;
	__u8   max_adv_data_len;
	__u8   max_scan_rsp_len;
	__u8   max_instances;
	__u8   num_instances;
	__u8   instance[0];
} __packed;

#define MGMT_EV_CMD_COMPLETE		0x0001
struct mgmt_ev_cmd_complete {
	__le16	opcode;
+36 −0
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ static const u16 mgmt_commands[] = {
	MGMT_OP_SET_PUBLIC_ADDRESS,
	MGMT_OP_START_SERVICE_DISCOVERY,
	MGMT_OP_READ_EXT_INDEX_LIST,
	MGMT_OP_READ_ADV_FEATURES,
};

static const u16 mgmt_events[] = {
@@ -6254,6 +6255,40 @@ static int set_public_address(struct sock *sk, struct hci_dev *hdev,
	return err;
}

static int read_adv_features(struct sock *sk, struct hci_dev *hdev,
			     void *data, u16 data_len)
{
	struct mgmt_rp_read_adv_features *rp;
	size_t rp_len;
	int err;

	BT_DBG("%s", hdev->name);

	hci_dev_lock(hdev);

	rp_len = sizeof(*rp);
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
		hci_dev_unlock(hdev);
		return -ENOMEM;
	}

	rp->supported_flags = cpu_to_le32(0);
	rp->max_adv_data_len = 31;
	rp->max_scan_rsp_len = 31;
	rp->max_instances = 0;
	rp->num_instances = 0;

	hci_dev_unlock(hdev);

	err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_READ_ADV_FEATURES,
				MGMT_STATUS_SUCCESS, rp, rp_len);

	kfree(rp);

	return err;
}

static const struct hci_mgmt_handler mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
	{ read_version,            MGMT_READ_VERSION_SIZE,
@@ -6337,6 +6372,7 @@ static const struct hci_mgmt_handler mgmt_handlers[] = {
	{ read_ext_index_list,     MGMT_READ_EXT_INDEX_LIST_SIZE,
						HCI_MGMT_NO_HDEV |
						HCI_MGMT_UNTRUSTED },
	{ read_adv_features,       MGMT_READ_ADV_FEATURES_SIZE },
};

int mgmt_control(struct hci_mgmt_chan *chan, struct sock *sk,