From a9953817d3f83b99f82f6ffb89d5d75d5648bbda Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Tue, 20 Nov 2012 18:01:01 +0100 Subject: [PATCH] monitor: Handle UUID-32 and UUID-128 values --- monitor/sdp.c | 41 +++++++++++++++++++++++++++++++++++++++-- monitor/uuid.c | 8 ++++++++ monitor/uuid.h | 1 + 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/monitor/sdp.c b/monitor/sdp.c index 2cdcf00c3..805e37e0a 100644 --- a/monitor/sdp.c +++ b/monitor/sdp.c @@ -53,9 +53,17 @@ static void print_uint(uint8_t indent, const uint8_t *data, uint32_t size) case 4: print_field("%*c0x%8.8x", indent, ' ', bt_get_be32(data)); break; + default: + packet_hexdump(data, size); + break; } } +static void print_sint(uint8_t indent, const uint8_t *data, uint32_t size) +{ + packet_hexdump(data, size); +} + static void print_uuid(uint8_t indent, const uint8_t *data, uint32_t size) { switch (size) { @@ -63,6 +71,28 @@ static void print_uuid(uint8_t indent, const uint8_t *data, uint32_t size) print_field("%*c%s (0x%4.4x)", indent, ' ', uuid16_to_str(bt_get_be16(data)), bt_get_be16(data)); break; + case 4: + print_field("%*c%s (0x%8.8x)", indent, ' ', + uuid32_to_str(bt_get_be32(data)), bt_get_be32(data)); + break; + case 16: + /* BASE_UUID = 00000000-0000-1000-8000-00805F9B34FB */ + print_field("%*c%8.8x-%4.4x-%4.4x-%4.4x-%4.4x%8.4x", + indent, ' ', + bt_get_be32(data), bt_get_be16(data + 4), + bt_get_be16(data + 6), bt_get_be16(data + 8), + bt_get_be16(data + 10), bt_get_be32(data + 12)); + if (bt_get_be16(data + 4) == 0x0000 && + bt_get_be16(data + 6) == 0x1000 && + bt_get_be16(data + 8) == 0x8000 && + bt_get_be16(data + 10) == 0x0080 && + bt_get_be32(data + 12) == 0x5F9B34FB) + print_field("%*c%s", indent, ' ', + uuid32_to_str(bt_get_be32(data))); + break; + default: + packet_hexdump(data, size); + break; } } @@ -72,6 +102,11 @@ static void print_string(uint8_t indent, const uint8_t *data, uint32_t size) print_field("%*c%s [len %d]", indent, ' ', str, size); } +static void print_boolean(uint8_t indent, const uint8_t *data, uint32_t size) +{ + print_field("%*c%s", indent, ' ', data[0] ? "true" : "false"); +} + static struct { uint8_t value; uint8_t *sizes; @@ -81,10 +116,10 @@ static struct { } type_table[] = { { 0, SIZES(0), false, "Nil" }, { 1, SIZES(0, 1, 2, 3, 4), false, "Unsigned Integer", print_uint }, - { 2, SIZES(0, 1, 2, 3, 4), false, "Signed Integer" }, + { 2, SIZES(0, 1, 2, 3, 4), false, "Signed Integer", print_sint }, { 3, SIZES(1, 2, 4), false, "UUID", print_uuid }, { 4, SIZES(5, 6, 7), false, "String", print_string }, - { 5, SIZES(0), false, "Boolean" }, + { 5, SIZES(0), false, "Boolean", print_boolean }, { 6, SIZES(5, 6, 7), true, "Sequence" }, { 7, SIZES(5, 6, 7), true, "Alternative" }, { 8, SIZES(5, 6, 7), false, "URL", print_string }, @@ -174,6 +209,7 @@ static void decode_data_elements(uint8_t indent, if (size < 1 + (extrabits / 8)) { print_text(COLOR_ERROR, "data element descriptor too short"); + packet_hexdump(data, size); return; } @@ -181,6 +217,7 @@ static void decode_data_elements(uint8_t indent, if (size < 1 + (extrabits / 8) + datalen) { print_text(COLOR_ERROR, "data element size too short"); + packet_hexdump(data, size); return; } diff --git a/monitor/uuid.c b/monitor/uuid.c index 8ba58c1d9..c348e1742 100644 --- a/monitor/uuid.c +++ b/monitor/uuid.c @@ -151,3 +151,11 @@ const char *uuid16_to_str(uint16_t uuid) return "Unknown"; } + +const char *uuid32_to_str(uint32_t uuid) +{ + if ((uuid & 0xffff0000) == 0x0000) + return uuid16_to_str(uuid & 0x0000ffff); + + return "Unknown"; +} diff --git a/monitor/uuid.h b/monitor/uuid.h index 30769cddf..f118cb3f8 100644 --- a/monitor/uuid.h +++ b/monitor/uuid.h @@ -25,3 +25,4 @@ #include const char *uuid16_to_str(uint16_t uuid); +const char *uuid32_to_str(uint32_t uuid); -- 2.47.3