From 0086e34fc00b3266a5dc7e5b492ca800f93ddd77 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Mon, 24 Mar 2014 16:25:30 -0300 Subject: [PATCH] lib: Fix UUID 16/32-bits to 128-bit conversion 16 and 32-bit UUIDs are always created using host order. However, no matter the system type, 128-bit UUID must use big-endian byte order format (similar to human-readble format). --- lib/uuid.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/lib/uuid.c b/lib/uuid.c index dbca330e3..5c3f9866c 100644 --- a/lib/uuid.c +++ b/lib/uuid.c @@ -32,7 +32,6 @@ #include "uuid.h" -#if __BYTE_ORDER == __BIG_ENDIAN static uint128_t bluetooth_base_uuid = { .data = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB } @@ -41,33 +40,36 @@ static uint128_t bluetooth_base_uuid = { #define BASE_UUID16_OFFSET 2 #define BASE_UUID32_OFFSET 0 -#else -static uint128_t bluetooth_base_uuid = { - .data = { 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, - 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } -}; - -#define BASE_UUID16_OFFSET 12 -#define BASE_UUID32_OFFSET BASE_UUID16_OFFSET - -#endif - static void bt_uuid16_to_uuid128(const bt_uuid_t *src, bt_uuid_t *dst) { + uint16_t be16; + dst->value.u128 = bluetooth_base_uuid; dst->type = BT_UUID128; - memcpy(&dst->value.u128.data[BASE_UUID16_OFFSET], - &src->value.u16, sizeof(src->value.u16)); + /* + * No matter the system: 128-bit UUIDs should be stored + * as big-endian. 16-bit UUIDs are stored on host order. + */ + + be16 = htons(src->value.u16); + memcpy(&dst->value.u128.data[BASE_UUID16_OFFSET], &be16, sizeof(be16)); } static void bt_uuid32_to_uuid128(const bt_uuid_t *src, bt_uuid_t *dst) { + uint32_t be32; + dst->value.u128 = bluetooth_base_uuid; dst->type = BT_UUID128; - memcpy(&dst->value.u128.data[BASE_UUID32_OFFSET], - &src->value.u32, sizeof(src->value.u32)); + /* + * No matter the system: 128-bit UUIDs should be stored + * as big-endian. 32-bit UUIDs are stored on host order. + */ + + be32 = htonl(src->value.u32); + memcpy(&dst->value.u128.data[BASE_UUID32_OFFSET], &be32, sizeof(be32)); } void bt_uuid_to_uuid128(const bt_uuid_t *src, bt_uuid_t *dst) -- 2.11.0