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

Commit b2cc9761 authored by Jaganath Kanakkassery's avatar Jaganath Kanakkassery Committed by Marcel Holtmann
Browse files

Bluetooth: Handle extended ADV PDU types



This patch defines the extended ADV types and handle it in ADV report.

Signed-off-by: default avatarJaganath Kanakkassery <jaganathx.kanakkassery@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 45bdd86e
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -1976,6 +1976,14 @@ struct hci_ev_le_conn_complete {
#define LE_LEGACY_SCAN_RSP_ADV		0x001b
#define LE_LEGACY_SCAN_RSP_ADV_SCAN	0x001a

/* Extended Advertising event types */
#define LE_EXT_ADV_NON_CONN_IND		0x0000
#define LE_EXT_ADV_CONN_IND		0x0001
#define LE_EXT_ADV_SCAN_IND		0x0002
#define LE_EXT_ADV_DIRECT_IND		0x0004
#define LE_EXT_ADV_SCAN_RSP		0x0008
#define LE_EXT_ADV_LEGACY_PDU		0x0010

#define ADDR_LE_DEV_PUBLIC	0x00
#define ADDR_LE_DEV_RANDOM	0x01

+37 −13
Original line number Diff line number Diff line
@@ -5137,8 +5137,9 @@ static void hci_le_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
	hci_dev_unlock(hdev);
}

static u8 convert_legacy_evt_type(u16 evt_type)
static u8 ext_evt_type_to_legacy(u16 evt_type)
{
	if (evt_type & LE_EXT_ADV_LEGACY_PDU) {
		switch (evt_type) {
		case LE_LEGACY_ADV_IND:
			return LE_ADV_IND;
@@ -5159,6 +5160,29 @@ static u8 convert_legacy_evt_type(u16 evt_type)
		return LE_ADV_INVALID;
	}

	if (evt_type & LE_EXT_ADV_CONN_IND) {
		if (evt_type & LE_EXT_ADV_DIRECT_IND)
			return LE_ADV_DIRECT_IND;

		return LE_ADV_IND;
	}

	if (evt_type & LE_EXT_ADV_SCAN_RSP)
		return LE_ADV_SCAN_RSP;

	if (evt_type & LE_EXT_ADV_SCAN_IND)
		return LE_ADV_SCAN_IND;

	if (evt_type == LE_EXT_ADV_NON_CONN_IND ||
	    evt_type & LE_EXT_ADV_DIRECT_IND)
		return LE_ADV_NONCONN_IND;

	BT_ERR_RATELIMITED("Unknown advertising packet type: 0x%02x",
				   evt_type);

	return LE_ADV_INVALID;
}

static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
{
	u8 num_reports = skb->data[0];
@@ -5172,7 +5196,7 @@ static void hci_le_ext_adv_report_evt(struct hci_dev *hdev, struct sk_buff *skb)
		u16 evt_type;

		evt_type = __le16_to_cpu(ev->evt_type);
		legacy_evt_type = convert_legacy_evt_type(evt_type);
		legacy_evt_type = ext_evt_type_to_legacy(evt_type);
		if (legacy_evt_type != LE_ADV_INVALID) {
			process_adv_report(hdev, legacy_evt_type, &ev->bdaddr,
					   ev->bdaddr_type, NULL, 0, ev->rssi,