Replace att_get_uuid128() by bswap_128()

GATT/ATT use little-endian byte order format for 128-bit UUID. No matter
the system byte order representation, internally the core will handle
128-bit UUID on big-endian format.
This commit is contained in:
Claudio Takahasi 2014-03-24 16:25:38 -03:00 committed by Johan Hedberg
parent 91744cb56f
commit 1a1e9b4fa9
4 changed files with 89 additions and 36 deletions

View File

@ -121,6 +121,19 @@ struct att_data_list *att_data_list_alloc(uint16_t num, uint16_t len)
return list;
}
static void get_uuid(uint8_t type, const void *val, bt_uuid_t *uuid)
{
if (type == BT_UUID16)
bt_uuid16_create(uuid, get_le16(val));
else {
uint128_t u128;
/* Convert from 128-bit LE to BE */
bswap_128(val, &u128);
bt_uuid128_create(uuid, u128);
}
}
uint16_t enc_read_by_grp_req(uint16_t start, uint16_t end, bt_uuid_t *uuid,
uint8_t *pdu, size_t len)
{
@ -152,6 +165,7 @@ uint16_t dec_read_by_grp_req(const uint8_t *pdu, size_t len, uint16_t *start,
uint16_t *end, bt_uuid_t *uuid)
{
const size_t min_len = sizeof(pdu[0]) + sizeof(*start) + sizeof(*end);
uint8_t type;
if (pdu == NULL)
return 0;
@ -162,15 +176,17 @@ uint16_t dec_read_by_grp_req(const uint8_t *pdu, size_t len, uint16_t *start,
if (pdu[0] != ATT_OP_READ_BY_GROUP_REQ)
return 0;
if (len != (min_len + 2) && len != (min_len + 16))
if (len == (min_len + 2))
type = BT_UUID16;
else if (len == (min_len + 16))
type = BT_UUID128;
else
return 0;
*start = get_le16(&pdu[1]);
*end = get_le16(&pdu[3]);
if (len == min_len + 2)
bt_uuid16_create(uuid, get_le16(&pdu[5]));
else
*uuid = att_get_uuid128(&pdu[5]);
get_uuid(type, &pdu[5], uuid);
return len;
}
@ -394,6 +410,7 @@ uint16_t dec_read_by_type_req(const uint8_t *pdu, size_t len, uint16_t *start,
uint16_t *end, bt_uuid_t *uuid)
{
const size_t min_len = sizeof(pdu[0]) + sizeof(*start) + sizeof(*end);
uint8_t type;
if (pdu == NULL)
return 0;
@ -401,7 +418,11 @@ uint16_t dec_read_by_type_req(const uint8_t *pdu, size_t len, uint16_t *start,
if (start == NULL || end == NULL || uuid == NULL)
return 0;
if (len != (min_len + 2) && len != (min_len + 16))
if (len == (min_len + 2))
type = BT_UUID16;
else if (len == (min_len + 16))
type = BT_UUID128;
else
return 0;
if (pdu[0] != ATT_OP_READ_BY_TYPE_REQ)
@ -410,10 +431,7 @@ uint16_t dec_read_by_type_req(const uint8_t *pdu, size_t len, uint16_t *start,
*start = get_le16(&pdu[1]);
*end = get_le16(&pdu[3]);
if (len == min_len + 2)
bt_uuid16_create(uuid, get_le16(&pdu[5]));
else
*uuid = att_get_uuid128(&pdu[5]);
get_uuid(type, &pdu[5], uuid);
return len;
}

View File

@ -148,6 +148,22 @@ static void put_uuid_le(const bt_uuid_t *uuid, void *dst)
bswap_128(&uuid->value.u128, dst);
}
static void get_uuid128(uint8_t type, const void *val, bt_uuid_t *uuid)
{
if (type == BT_UUID16) {
bt_uuid_t uuid16;
bt_uuid16_create(&uuid16, get_le16(val));
bt_uuid_to_uuid128(&uuid16, uuid);
} else {
uint128_t u128;
/* Convert from 128-bit LE to BE */
bswap_128(val, &u128);
bt_uuid128_create(uuid, u128);
}
}
static guint16 encode_discover_primary(uint16_t start, uint16_t end,
bt_uuid_t *uuid, uint8_t *pdu, size_t len)
{
@ -225,6 +241,7 @@ static void primary_all_cb(guint8 status, const guint8 *ipdu, guint16 iplen,
struct att_data_list *list;
unsigned int i, err;
uint16_t start, end;
uint8_t type;
if (status) {
err = status == ATT_ECODE_ATTR_NOT_FOUND ? 0 : status;
@ -240,23 +257,26 @@ static void primary_all_cb(guint8 status, const guint8 *ipdu, guint16 iplen,
for (i = 0, end = 0; i < list->num; i++) {
const uint8_t *data = list->data[i];
struct gatt_primary *primary;
bt_uuid_t uuid;
bt_uuid_t uuid128;
start = get_le16(&data[0]);
end = get_le16(&data[2]);
if (list->len == 6) {
bt_uuid_t uuid16;
bt_uuid16_create(&uuid16, get_le16(&data[4]));
bt_uuid_to_uuid128(&uuid16, &uuid);
} else if (list->len == 20) {
uuid = att_get_uuid128(&data[4]);
} else {
/*
* FIXME: Check before "for". Elements in the Attribute
* Data List have the same length (list->len).
*/
if (list->len == 6)
type = BT_UUID16;
else if (list->len == 20)
type = BT_UUID128;
else {
/* Skipping invalid data */
continue;
}
get_uuid128(type, &data[4], &uuid128);
primary = g_try_new0(struct gatt_primary, 1);
if (!primary) {
att_data_list_free(list);
@ -265,7 +285,7 @@ static void primary_all_cb(guint8 status, const guint8 *ipdu, guint16 iplen,
}
primary->range.start = start;
primary->range.end = end;
bt_uuid_to_string(&uuid, primary->uuid, sizeof(primary->uuid));
bt_uuid_to_string(&uuid128, primary->uuid, sizeof(primary->uuid));
dp->primaries = g_slist_append(dp->primaries, primary);
}
@ -328,7 +348,7 @@ static void resolve_included_uuid_cb(uint8_t status, const uint8_t *pdu,
struct included_discovery *isd = query->isd;
struct gatt_included *incl = query->included;
unsigned int err = status;
bt_uuid_t uuid;
bt_uuid_t uuid128;
size_t buflen;
uint8_t *buf;
@ -341,8 +361,9 @@ static void resolve_included_uuid_cb(uint8_t status, const uint8_t *pdu,
goto done;
}
uuid = att_get_uuid128(buf);
bt_uuid_to_string(&uuid, incl->uuid, sizeof(incl->uuid));
get_uuid128(BT_UUID128, buf, &uuid128);
bt_uuid_to_string(&uuid128, incl->uuid, sizeof(incl->uuid));
isd->includes = g_slist_append(isd->includes, incl);
query->included = NULL;
@ -503,19 +524,23 @@ static void char_discovered_cb(guint8 status, const guint8 *ipdu, guint16 iplen,
for (i = 0; i < list->num; i++) {
uint8_t *value = list->data[i];
struct gatt_char *chars;
bt_uuid_t uuid;
bt_uuid_t uuid128;
uint8_t type;
last = get_le16(value);
if (list->len == 7) {
bt_uuid_t uuid16;
/*
* FIXME: Check before "for". Elements in the Attribute
* Data List have the same length (list->len).
*/
if (list->len == 7)
type = BT_UUID16;
else
type = BT_UUID128;
bt_uuid16_create(&uuid16, get_le16(&value[5]));
bt_uuid_to_uuid128(&uuid16, &uuid);
} else
uuid = att_get_uuid128(&value[5]);
get_uuid128(type, &value[5], &uuid128);
if (dc->uuid && bt_uuid_cmp(dc->uuid, &uuid))
if (dc->uuid && bt_uuid_cmp(dc->uuid, &uuid128))
continue;
chars = g_try_new0(struct gatt_char, 1);
@ -527,7 +552,7 @@ static void char_discovered_cb(guint8 status, const guint8 *ipdu, guint16 iplen,
chars->handle = last;
chars->properties = value[2];
chars->value_handle = get_le16(&value[3]);
bt_uuid_to_string(&uuid, chars->uuid, sizeof(chars->uuid));
bt_uuid_to_string(&uuid128, chars->uuid, sizeof(chars->uuid));
dc->characteristics = g_slist_append(dc->characteristics,
chars);
}

View File

@ -428,8 +428,13 @@ static void char_desc_cb(guint8 status, const guint8 *pdu, guint16 plen,
if (format == 0x01)
bt_uuid16_create(&uuid, get_le16(&value[2]));
else
uuid = att_get_uuid128(&value[2]);
else {
uint128_t u128;
/* Converts from LE to BE byte order */
bswap_128(&value[2], &u128);
bt_uuid128_create(&uuid, u128);
}
bt_uuid_to_string(&uuid, uuidstr, MAX_LEN_UUID_STR);
g_print("handle = 0x%04x, uuid = %s\n", handle, uuidstr);

View File

@ -297,8 +297,13 @@ static void char_desc_cb(guint8 status, const guint8 *pdu, guint16 plen,
if (format == 0x01)
bt_uuid16_create(&uuid, get_le16(&value[2]));
else
uuid = att_get_uuid128(&value[2]);
else {
uint128_t u128;
/* Converts from LE to BE byte order */
bswap_128(&value[2], &u128);
bt_uuid128_create(&uuid, u128);
}
bt_uuid_to_string(&uuid, uuidstr, MAX_LEN_UUID_STR);
rl_printf("handle: 0x%04x, uuid: %s\n", handle, uuidstr);