aboutsummaryrefslogtreecommitdiffstats
path: root/net/bluetooth
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2013-01-26 17:31:29 -0500
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2013-02-01 12:50:17 -0500
commit83be8eca2e67faaec45280224b798828bbfa69aa (patch)
treeee0d4782e5270dc3812c9ece825545b88bcbb14b /net/bluetooth
parent4821002ce2baa130666c2d777e0ed30bee6c7702 (diff)
Bluetooth: Keep track of UUID type upon addition
The primary purpose of the UUIDs is to enable generation of EIR and AD data. In these data formats the UUIDs are split into separate fields based on whether they're 16, 32 or 128 bit UUIDs. To make the generation of these data fields simpler this patch adds a type member to the bt_uuid struct and assigns a value to it as soon as the UUID is added to the kernel. This way the type doesn't need to be calculated each time the UUID list is later iterated. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net/bluetooth')
-rw-r--r--net/bluetooth/mgmt.c48
1 files changed, 23 insertions, 25 deletions
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 4fd45a3271e0..8de6d576dc70 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -435,28 +435,6 @@ static u32 get_current_settings(struct hci_dev *hdev)
435 435
436#define PNP_INFO_SVCLASS_ID 0x1200 436#define PNP_INFO_SVCLASS_ID 0x1200
437 437
438static u8 bluetooth_base_uuid[] = {
439 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
440 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
441};
442
443static u16 get_uuid16(u8 *uuid128)
444{
445 u32 val;
446 int i;
447
448 for (i = 0; i < 12; i++) {
449 if (bluetooth_base_uuid[i] != uuid128[i])
450 return 0;
451 }
452
453 val = get_unaligned_le32(&uuid128[12]);
454 if (val > 0xffff)
455 return 0;
456
457 return (u16) val;
458}
459
460static void create_eir(struct hci_dev *hdev, u8 *data) 438static void create_eir(struct hci_dev *hdev, u8 *data)
461{ 439{
462 u8 *ptr = data; 440 u8 *ptr = data;
@@ -513,10 +491,10 @@ static void create_eir(struct hci_dev *hdev, u8 *data)
513 list_for_each_entry(uuid, &hdev->uuids, list) { 491 list_for_each_entry(uuid, &hdev->uuids, list) {
514 u16 uuid16; 492 u16 uuid16;
515 493
516 uuid16 = get_uuid16(uuid->uuid); 494 if (uuid->size != 16)
517 if (uuid16 == 0) 495 continue;
518 return;
519 496
497 uuid16 = get_unaligned_le16(&uuid->uuid[12]);
520 if (uuid16 < 0x1100) 498 if (uuid16 < 0x1100)
521 continue; 499 continue;
522 500
@@ -1304,6 +1282,25 @@ unlock:
1304 return err; 1282 return err;
1305} 1283}
1306 1284
1285static const u8 bluetooth_base_uuid[] = {
1286 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
1287 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1288};
1289
1290static u8 get_uuid_size(const u8 *uuid)
1291{
1292 u32 val;
1293
1294 if (memcmp(uuid, bluetooth_base_uuid, 12))
1295 return 128;
1296
1297 val = get_unaligned_le32(&uuid[12]);
1298 if (val > 0xffff)
1299 return 32;
1300
1301 return 16;
1302}
1303
1307static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) 1304static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1308{ 1305{
1309 struct mgmt_cp_add_uuid *cp = data; 1306 struct mgmt_cp_add_uuid *cp = data;
@@ -1329,6 +1326,7 @@ static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1329 1326
1330 memcpy(uuid->uuid, cp->uuid, 16); 1327 memcpy(uuid->uuid, cp->uuid, 16);
1331 uuid->svc_hint = cp->svc_hint; 1328 uuid->svc_hint = cp->svc_hint;
1329 uuid->size = get_uuid_size(cp->uuid);
1332 1330
1333 list_add_tail(&uuid->list, &hdev->uuids); 1331 list_add_tail(&uuid->list, &hdev->uuids);
1334 1332