|
@@ -1283,31 +1283,41 @@ static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status,
|
|
|
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;
|
|
|
|
|
|
- if (data_len < 2)
|
|
|
- return false;
|
|
|
+ if (eir_len < 2)
|
|
|
+ return NULL;
|
|
|
|
|
|
- while (parsed < data_len - 1) {
|
|
|
- u8 field_len = data[0];
|
|
|
+ while (parsed < eir_len - 1) {
|
|
|
+ u8 field_len = eir[0];
|
|
|
|
|
|
if (field_len == 0)
|
|
|
break;
|
|
|
|
|
|
parsed += field_len + 1;
|
|
|
|
|
|
- if (parsed > data_len)
|
|
|
+ if (parsed > eir_len)
|
|
|
break;
|
|
|
|
|
|
- if (data[1] == type)
|
|
|
- return true;
|
|
|
+ if (eir[1] != type) {
|
|
|
+ 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)
|