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

Commit 1dc06093 authored by Johan Hedberg's avatar Johan Hedberg
Browse files

Bluetooth: Merge device class into the EIR data in mgmt_ev_device_found



There's no need to have a separate device class field since the same
information can be encoded into the EIR data.

Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 6759a675
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -893,6 +893,17 @@ static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type)
	return false;
}

static inline u16 eir_append_data(u8 *eir, u16 eir_len, u8 type, u8 *data,
								u8 data_len)
{
	eir[eir_len++] = sizeof(type) + data_len;
	eir[eir_len++] = type;
	memcpy(&eir[eir_len], data, data_len);
	eir_len += data_len;

	return eir_len;
}

int hci_register_cb(struct hci_cb *hcb);
int hci_unregister_cb(struct hci_cb *hcb);

+0 −1
Original line number Diff line number Diff line
@@ -365,7 +365,6 @@ struct mgmt_ev_auth_failed {
#define MGMT_EV_DEVICE_FOUND		0x0011
struct mgmt_ev_device_found {
	struct mgmt_addr_info addr;
	__u8 dev_class[3];
	__s8 rssi;
	__u8 confirm_name;
	__le16 eir_len;
+13 −7
Original line number Diff line number Diff line
@@ -2786,23 +2786,29 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
{
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
	size_t ev_size = sizeof(*ev) + eir_len;
	size_t ev_size;

	if (ev_size > sizeof(buf))
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
		return -EINVAL;

	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
	ev->addr.type = link_to_mgmt(link_type, addr_type);
	ev->rssi = rssi;
	ev->confirm_name = cfm_name;

	if (eir_len > 0) {
		put_unaligned_le16(eir_len, &ev->eir_len);
	if (eir_len > 0)
		memcpy(ev->eir, eir, eir_len);
	}

	if (dev_class)
		memcpy(ev->dev_class, dev_class, sizeof(ev->dev_class));
	if (dev_class && !eir_has_data_type(ev->eir, eir_len, EIR_CLASS_OF_DEV))
		eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
								dev_class, 3);

	put_unaligned_le16(eir_len, &ev->eir_len);

	ev_size = sizeof(*ev) + eir_len;

	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
}