Commit 0d3b7f64 authored by Johan Hedberg's avatar Johan Hedberg Committed by Marcel Holtmann

Bluetooth: Change eir_has_data_type() to more generic eir_get_data()

To make the EIR parsing helper more general purpose, make it return
the found data and its length rather than just saying whether the data
was present or not.
Signed-off-by: default avatarJohan Hedberg <johan.hedberg@intel.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 29663b0c
...@@ -1283,31 +1283,41 @@ static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status, ...@@ -1283,31 +1283,41 @@ static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
mutex_unlock(&hci_cb_list_lock); mutex_unlock(&hci_cb_list_lock);
} }
static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type) static inline void *eir_get_data(u8 *eir, size_t eir_len, u8 type,
size_t *data_len)
{ {
size_t parsed = 0; size_t parsed = 0;
if (data_len < 2) if (eir_len < 2)
return false; return NULL;
while (parsed < data_len - 1) { while (parsed < eir_len - 1) {
u8 field_len = data[0]; u8 field_len = eir[0];
if (field_len == 0) if (field_len == 0)
break; break;
parsed += field_len + 1; parsed += field_len + 1;
if (parsed > data_len) if (parsed > eir_len)
break; break;
if (data[1] == type) if (eir[1] != type) {
return true; eir += field_len + 1;
continue;
}
/* Zero length data */
if (field_len == 1)
return NULL;
data += field_len + 1; if (data_len)
*data_len = field_len - 1;
return &eir[2];
} }
return false; return NULL;
} }
static inline bool hci_bdaddr_is_rpa(bdaddr_t *bdaddr, u8 addr_type) static inline bool hci_bdaddr_is_rpa(bdaddr_t *bdaddr, u8 addr_type)
......
...@@ -3833,9 +3833,9 @@ static void hci_extended_inquiry_result_evt(struct hci_dev *hdev, ...@@ -3833,9 +3833,9 @@ static void hci_extended_inquiry_result_evt(struct hci_dev *hdev,
data.ssp_mode = 0x01; data.ssp_mode = 0x01;
if (hci_dev_test_flag(hdev, HCI_MGMT)) if (hci_dev_test_flag(hdev, HCI_MGMT))
name_known = eir_has_data_type(info->data, name_known = eir_get_data(info->data,
sizeof(info->data), sizeof(info->data),
EIR_NAME_COMPLETE); EIR_NAME_COMPLETE, NULL);
else else
name_known = true; name_known = true;
......
...@@ -7266,7 +7266,8 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, ...@@ -7266,7 +7266,8 @@ void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
/* Copy EIR or advertising data into event */ /* Copy EIR or advertising data into event */
memcpy(ev->eir, eir, eir_len); memcpy(ev->eir, eir, eir_len);
if (dev_class && !eir_has_data_type(ev->eir, eir_len, EIR_CLASS_OF_DEV)) if (dev_class && !eir_get_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
NULL))
eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV, eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
dev_class, 3); dev_class, 3);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment