diff options
author | Michal Labedzki <michal.labedzki@tieto.com> | 2015-01-19 14:27:29 +0100 |
---|---|---|
committer | Michal Labedzki <michal.labedzki@tieto.com> | 2015-02-02 10:48:37 +0000 |
commit | 1786cfee3f6d4a5b7679aeb12e05751ff40d9a11 (patch) | |
tree | 64df9cd4fa66243e61230019e44c193be714ffae | |
parent | 578c2beeb2a7264277942fbdfaac39d7270caadd (diff) |
Bluetooth: Advertising Data: Fix Service Data entry
Service Data entry is defined as UUID (16, 32 or 128) and
rest of payload is specific service data.
Bug: 10859
Change-Id: Ibaee075a66a144dfc52ed70614677c73a88d6a2c
Reviewed-on: https://code.wireshark.org/review/6902
Petri-Dish: Michal Labedzki <michal.labedzki@tieto.com>
Reviewed-by: Michal Labedzki <michal.labedzki@tieto.com>
-rw-r--r-- | epan/dissectors/packet-bthci_cmd.c | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/epan/dissectors/packet-bthci_cmd.c b/epan/dissectors/packet-bthci_cmd.c index 81a3f8c7f9..5cfaf27b74 100644 --- a/epan/dissectors/packet-bthci_cmd.c +++ b/epan/dissectors/packet-bthci_cmd.c @@ -365,6 +365,7 @@ static gint hf_btcommon_eir_ad_bd_addr = -1; static gint hf_btcommon_eir_ad_le_bd_addr_reserved = -1; static gint hf_btcommon_eir_ad_le_bd_addr_type = -1; static gint hf_btcommon_eir_ad_le_role = -1; +static gint hf_btcommon_eir_ad_service_data = -1; static gint hf_btcommon_eir_ad_did_vendor_id = -1; static gint hf_btcommon_eir_ad_did_vendor_id_bluetooth_sig = -1; static gint hf_btcommon_eir_ad_did_vendor_id_usb_forum = -1; @@ -4773,7 +4774,6 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case 0x02: /* 16-bit Service Class UUIDs (incomplete) */ case 0x03: /* 16-bit Service Class UUIDs */ case 0x14: /* List of 16-bit Service Solicitation UUIDs */ - case 0x16: /* Service Data - 16 bit UUID */ end_offset = offset + length; while (offset < end_offset) { proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_uuid_16, tvb, offset, 2, ENC_LITTLE_ENDIAN); @@ -4784,7 +4784,6 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case 0x04: /* 32-bit Service Class UUIDs (incomplete) */ case 0x05: /* 32-bit Service Class UUIDs */ case 0x1F: /* List of 32-bit Service Solicitation UUIDs */ - case 0x20: /* Service Data - 32 bit UUID */ end_offset = offset + length; while (offset < end_offset) { if (tvb_get_ntohs(tvb, offset) == 0x0000) { @@ -4816,7 +4815,6 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case 0x06: /* 128-bit Service Class UUIDs (incomplete) */ case 0x07: /* 128-bit Service Class UUIDs */ case 0x15: /* List of 128-bit Service Solicitation UUIDs */ - case 0x21: /* Service Data - 128 bit UUID */ end_offset = offset + length; while (offset < end_offset) { if (tvb_get_ntohs(tvb, offset) == 0x0000 && @@ -4951,6 +4949,75 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_item_append_text(entry_item, ": %g - %g msec", tvb_get_letohs(tvb, offset - 4) * 1.25, tvb_get_letohs(tvb, offset - 2) * 1.25); break; + case 0x16: /* Service Data - 16 bit UUID */ + proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_uuid_16, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + + if (length - 2 > 0) { + proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_service_data, tvb, offset, length - 2, ENC_NA); + offset += length - 2; + } + break; + case 0x20: /* Service Data - 32 bit UUID */ + if (tvb_get_ntohs(tvb, offset) == 0x0000) { + sub_item = proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_uuid_32, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_item_append_text(sub_item, " (%s)", val_to_str_ext_const(tvb_get_ntohs(tvb, offset + 2), &bluetooth_uuid_vals_ext, "Unknown")); + } else { + sub_item = proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_custom_uuid, tvb, offset, 4, ENC_NA); + + i_uuid = 0; + while (custom_uuid[i_uuid].name) { + if (custom_uuid[i_uuid].size != 4) { + i_uuid += 1; + continue; + } + + if (tvb_memeql(tvb, offset, custom_uuid[i_uuid].uuid, 4) == 0) { + proto_item_append_text(sub_item, " (%s)", custom_uuid[i_uuid].name); + break; + } + + i_uuid += 1; + } + } + offset += 4; + + if (length - 4 > 0) { + proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_service_data, tvb, offset, length - 4, ENC_NA); + offset += length - 4; + } + break; + case 0x21: /* Service Data - 128 bit UUID */ + if (tvb_get_ntohs(tvb, offset) == 0x0000 && + tvb_get_ntohl(tvb, offset + 4) == 0x1000 && + tvb_get_ntoh64(tvb, offset + 8) == G_GUINT64_CONSTANT(0x800000805F9B34FB)) { + sub_item = proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_uuid_128, tvb, offset, 16, ENC_NA); + proto_item_append_text(sub_item, " (%s)", val_to_str_ext_const(tvb_get_ntohs(tvb, offset + 2), &bluetooth_uuid_vals_ext, "Unknown")); + } else { + sub_item = proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_custom_uuid, tvb, offset, 16, ENC_NA); + + i_uuid = 0; + while (custom_uuid[i_uuid].name) { + if (custom_uuid[i_uuid].size != 16) { + i_uuid += 1; + continue; + } + + if (tvb_memeql(tvb, offset, custom_uuid[i_uuid].uuid, 16) == 0) { + proto_item_append_text(sub_item, " (%s)", custom_uuid[i_uuid].name); + break; + } + + i_uuid += 1; + } + } + offset += 16; + + if (length - 16 > 0) { + proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_service_data, tvb, offset, length - 16, ENC_NA); + offset += length - 16; + } + break; case 0x17: /* Public Target Address */ case 0x18: /* Random Target Address */ end_offset = offset + length; @@ -5266,6 +5333,11 @@ proto_register_btcommon(void) FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} }, + { &hf_btcommon_eir_ad_service_data, + {"Service Data", "btcommon.eir_ad.entry.service_data", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL} + }, { &hf_btcommon_eir_ad_length, { "Length", "btcommon.eir_ad.entry.length", FT_UINT8, BASE_DEC, NULL, 0x0, |