Bluetooth: Add EIR flags to LE Adv data cache
Use the EIR flags to prevent LE pairing attempts to
BR/EDR capable (Dual Mode) devices.
Signed-off-by: Brian Gix <bgix@codeaurora.org>
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 51d7fa8..d0da174 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -121,6 +121,7 @@
struct list_head list;
bdaddr_t bdaddr;
u8 bdaddr_type;
+ u8 flags;
};
#define NUM_REASSEMBLY 4
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 57fdcc1..ad88382 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1347,17 +1347,32 @@
struct hci_ev_le_advertising_info *ev)
{
struct adv_entry *entry;
+ u8 flags = 0;
+ int i;
BT_DBG("");
if (!is_connectable_adv(ev->evt_type))
return -EINVAL;
+ if (ev->data && ev->length) {
+ for (i = 0; (i + 2) < ev->length; i++)
+ if (ev->data[i+1] == 0x01) {
+ flags = ev->data[i+2];
+ BT_DBG("flags: %2.2x", flags);
+ break;
+ } else {
+ i += ev->data[i];
+ }
+ }
+
entry = hci_find_adv_entry(hdev, &ev->bdaddr);
/* Only new entries should be added to adv_entries. So, if
* bdaddr was found, don't add it. */
- if (entry)
+ if (entry) {
+ entry->flags = flags;
return 0;
+ }
entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
if (!entry)
@@ -1365,6 +1380,7 @@
bacpy(&entry->bdaddr, &ev->bdaddr);
entry->bdaddr_type = ev->bdaddr_type;
+ entry->flags = flags;
write_lock(&hdev->adv_entries_lock);
list_add(&entry->list, &hdev->adv_entries);
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 424f2df..848a515 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -1436,6 +1436,7 @@
struct pending_cmd *cmd;
u8 sec_level, auth_type, io_cap;
struct hci_conn *conn;
+ struct adv_entry *entry;
int err;
BT_DBG("");
@@ -1462,7 +1463,8 @@
auth_type = HCI_AT_DEDICATED_BONDING_MITM;
}
- if (hci_find_adv_entry(hdev, &cp->bdaddr)) {
+ entry = hci_find_adv_entry(hdev, &cp->bdaddr);
+ if (entry && entry->flags & 0x04) {
conn = hci_connect(hdev, LE_LINK, 0, &cp->bdaddr, sec_level,
auth_type);
} else {