|
@@ -510,6 +510,39 @@ static u8 *create_uuid32_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
|
|
|
return ptr;
|
|
|
}
|
|
|
|
|
|
+static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
|
|
|
+{
|
|
|
+ u8 *ptr = data, *uuids_start = NULL;
|
|
|
+ struct bt_uuid *uuid;
|
|
|
+
|
|
|
+ if (len < 18)
|
|
|
+ return ptr;
|
|
|
+
|
|
|
+ list_for_each_entry(uuid, &hdev->uuids, list) {
|
|
|
+ if (uuid->size != 128)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (!uuids_start) {
|
|
|
+ uuids_start = ptr;
|
|
|
+ uuids_start[0] = 1;
|
|
|
+ uuids_start[1] = EIR_UUID128_ALL;
|
|
|
+ ptr += 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Stop if not enough space to put next UUID */
|
|
|
+ if ((ptr - data) + 16 > len) {
|
|
|
+ uuids_start[1] = EIR_UUID128_SOME;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ memcpy(ptr, uuid->uuid, 16);
|
|
|
+ ptr += 16;
|
|
|
+ uuids_start[0] += 16;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ptr;
|
|
|
+}
|
|
|
+
|
|
|
static void create_eir(struct hci_dev *hdev, u8 *data)
|
|
|
{
|
|
|
u8 *ptr = data;
|
|
@@ -555,6 +588,7 @@ static void create_eir(struct hci_dev *hdev, u8 *data)
|
|
|
|
|
|
ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
|
|
|
ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
|
|
|
+ ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
|
|
|
}
|
|
|
|
|
|
static int update_eir(struct hci_dev *hdev)
|