diff options
author | Michal Labedzki <michal.labedzki@tieto.com> | 2015-12-10 09:41:59 +0100 |
---|---|---|
committer | Michal Labedzki <michal.labedzki@tieto.com> | 2016-01-18 18:36:10 +0000 |
commit | dc4c64b4cbbf46596d9810e56b49773cb41eadec (patch) | |
tree | 642cd343b88766b44e93864024a1d4442bcf1b68 | |
parent | 69e80c4d87a259c09721198aecd62a7fdb2f4f7e (diff) |
Bluetooth: EIR/AD: Add missing IPS item
Change-Id: I8cfb0b375d4585bbeb890e79c1a41303e0277065
Reviewed-on: https://code.wireshark.org/review/13387
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Michal Labedzki <michal.labedzki@tieto.com>
Tested-by: Michal Labedzki <michal.labedzki@tieto.com>
-rw-r--r-- | epan/dissectors/packet-btatt.c | 31 | ||||
-rw-r--r-- | epan/dissectors/packet-btatt.h | 7 | ||||
-rw-r--r-- | epan/dissectors/packet-bthci_cmd.c | 214 |
3 files changed, 235 insertions, 17 deletions
diff --git a/epan/dissectors/packet-btatt.c b/epan/dissectors/packet-btatt.c index 4f805c7709..75e604332f 100644 --- a/epan/dissectors/packet-btatt.c +++ b/epan/dissectors/packet-btatt.c @@ -524,10 +524,11 @@ static int hf_btatt_altitude = -1; static int hf_btatt_indoor_positioning_configuration = -1; static int hf_btatt_indoor_positioning_configuration_reserved = -1; static int hf_btatt_indoor_positioning_configuration_location_name = -1; +static int hf_btatt_indoor_positioning_configuration_uncertainty = -1; static int hf_btatt_indoor_positioning_configuration_floor_number = -1; static int hf_btatt_indoor_positioning_configuration_altitude = -1; static int hf_btatt_indoor_positioning_configuration_tx_power = -1; -static int hf_btatt_indoor_positioning_configuration_coordinate_system_used_in_advertising_packets = -1; +static int hf_btatt_indoor_positioning_configuration_coordinate_system = -1; static int hf_btatt_indoor_positioning_configuration_coordinates = -1; static int hf_btatt_number_of_digitals = -1; static int hf_btatt_time_trigger_setting_condition = -1; @@ -1263,10 +1264,11 @@ static const int *hfx_btatt_uncertainty[] = { static const int *hfx_btatt_indoor_positioning_configuration[] = { &hf_btatt_indoor_positioning_configuration_reserved, &hf_btatt_indoor_positioning_configuration_location_name, + &hf_btatt_indoor_positioning_configuration_uncertainty, &hf_btatt_indoor_positioning_configuration_floor_number, &hf_btatt_indoor_positioning_configuration_altitude, &hf_btatt_indoor_positioning_configuration_tx_power, - &hf_btatt_indoor_positioning_configuration_coordinate_system_used_in_advertising_packets, + &hf_btatt_indoor_positioning_configuration_coordinate_system, &hf_btatt_indoor_positioning_configuration_coordinates, NULL }; @@ -2579,14 +2581,14 @@ static const value_string digital_vals[] = { }; -static const value_string uncertainty_stationary_vals[] = { +const value_string btatt_ips_uncertainty_stationary_vals[] = { { 0x00, "Stationary"}, { 0x01, "Mobile"}, {0x0, NULL} }; -static const value_string uncertainty_update_time_vals[] = { +const value_string btatt_ips_uncertainty_update_time_vals[] = { { 0x00, "Up to 3s"}, { 0x01, "Up to 4s"}, { 0x02, "Up to 6s"}, @@ -2599,7 +2601,7 @@ static const value_string uncertainty_update_time_vals[] = { }; -static const value_string uncertainty_precision_vals[] = { +const value_string btatt_ips_uncertainty_precision_vals[] = { { 0x00, "Less than 0.1m"}, { 0x01, "0.1-1m"}, { 0x02, "1-2m"}, @@ -2612,7 +2614,7 @@ static const value_string uncertainty_precision_vals[] = { }; -static const value_string indoor_positioning_configuration_coordinate_system_used_in_advertising_packets_vals[] = { +const value_string btatt_ips_coordinate_system[] = { { 0x00, "WGS84 Coordinate System"}, { 0x01, "Local Coordinate System"}, {0x0, NULL} @@ -9119,17 +9121,17 @@ proto_register_btatt(void) }, {&hf_btatt_uncertainty_precision, {"Precision", "btatt.uncertainty.precision", - FT_UINT8, BASE_HEX, VALS(uncertainty_precision_vals), 0x70, + FT_UINT8, BASE_HEX, VALS(btatt_ips_uncertainty_precision_vals), 0x70, NULL, HFILL} }, {&hf_btatt_uncertainty_update_time, {"Update Time", "btatt.uncertainty.update_time", - FT_UINT8, BASE_HEX, VALS(uncertainty_update_time_vals), 0x0E, + FT_UINT8, BASE_HEX, VALS(btatt_ips_uncertainty_update_time_vals), 0x0E, NULL, HFILL} }, {&hf_btatt_uncertainty_stationary, {"Stationary", "btatt.uncertainty.stationary", - FT_UINT8, BASE_HEX, VALS(uncertainty_stationary_vals), 0x01, + FT_UINT8, BASE_HEX, VALS(btatt_ips_uncertainty_stationary_vals), 0x01, NULL, HFILL} }, {&hf_btatt_latitude, @@ -9174,6 +9176,11 @@ proto_register_btatt(void) }, {&hf_btatt_indoor_positioning_configuration_location_name, {"Location Name", "btatt.indoor_positioning_configuration.location_name", + FT_BOOLEAN, 8, NULL, 0x40, + NULL, HFILL} + }, + {&hf_btatt_indoor_positioning_configuration_uncertainty, + {"Uncertainty", "btatt.indoor_positioning_configuration.uncertainty", FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL} }, @@ -9192,9 +9199,9 @@ proto_register_btatt(void) FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL} }, - {&hf_btatt_indoor_positioning_configuration_coordinate_system_used_in_advertising_packets, - {"Coordinate System Used in Advertising Packets", "btatt.indoor_positioning_configuration.coordinate_system_used_in_advertising_packets", - FT_UINT8, BASE_HEX, VALS(indoor_positioning_configuration_coordinate_system_used_in_advertising_packets_vals), 0x02, + {&hf_btatt_indoor_positioning_configuration_coordinate_system, + {"Coordinate System", "btatt.indoor_positioning_configuration.coordinate_system", + FT_UINT8, BASE_HEX, VALS(btatt_ips_coordinate_system), 0x02, NULL, HFILL} }, {&hf_btatt_indoor_positioning_configuration_coordinates, diff --git a/epan/dissectors/packet-btatt.h b/epan/dissectors/packet-btatt.h index db229fbb20..6f15f797c1 100644 --- a/epan/dissectors/packet-btatt.h +++ b/epan/dissectors/packet-btatt.h @@ -30,6 +30,13 @@ typedef struct _tap_handles_t { bluetooth_uuid_t uuid; } tap_handles_t; + +extern const value_string btatt_ips_coordinate_system[]; +extern const value_string btatt_ips_uncertainty_stationary_vals[]; +extern const value_string btatt_ips_uncertainty_update_time_vals[]; +extern const value_string btatt_ips_uncertainty_precision_vals[]; +extern const value_string btatt_ips_uncertainty_coordinate_system[]; + #endif /* diff --git a/epan/dissectors/packet-bthci_cmd.c b/epan/dissectors/packet-bthci_cmd.c index ffff2fea8b..c5bbbca151 100644 --- a/epan/dissectors/packet-bthci_cmd.c +++ b/epan/dissectors/packet-bthci_cmd.c @@ -43,6 +43,7 @@ #include "packet-bluetooth.h" #include "packet-bthci_cmd.h" #include "packet-btsdp.h" +#include "packet-btatt.h" static int proto_bthci_cmd = -1; @@ -432,6 +433,27 @@ static gint hf_btcommon_eir_ad_oob_flags_reserved = -1; static gint hf_btcommon_eir_ad_connection_interval_min = -1; static gint hf_btcommon_eir_ad_connection_interval_max = -1; static gint hf_btcommon_eir_ad_uri = -1; +static gint hf_btcommon_eir_ad_ips_flags = -1; +static gint hf_btcommon_eir_ad_ips_flags_reserved = -1; +static gint hf_btcommon_eir_ad_ips_flags_location_name = -1; +static gint hf_btcommon_eir_ad_ips_flags_uncertainty = -1; +static gint hf_btcommon_eir_ad_ips_flags_floor_number = -1; +static gint hf_btcommon_eir_ad_ips_flags_altitude = -1; +static gint hf_btcommon_eir_ad_ips_flags_tx_power = -1; +static gint hf_btcommon_eir_ad_ips_flags_coordinate_system = -1; +static gint hf_btcommon_eir_ad_ips_flags_coordinates = -1; +static gint hf_btcommon_eir_ad_ips_uncertainty = -1; +static gint hf_btcommon_eir_ad_ips_uncertainty_reserved = -1; +static gint hf_btcommon_eir_ad_ips_uncertainty_precision = -1; +static gint hf_btcommon_eir_ad_ips_uncertainty_update_time = -1; +static gint hf_btcommon_eir_ad_ips_uncertainty_stationary = -1; +static gint hf_btcommon_eir_ad_ips_latitude = -1; +static gint hf_btcommon_eir_ad_ips_longitude = -1; +static gint hf_btcommon_eir_ad_ips_local_north_coordinate = -1; +static gint hf_btcommon_eir_ad_ips_local_east_coordinate = -1; +static gint hf_btcommon_eir_ad_ips_tx_power_level = -1; +static gint hf_btcommon_eir_ad_ips_floor_number = -1; +static gint hf_btcommon_eir_ad_ips_altitude = -1; static gint hf_btcommon_cod_class_of_device = -1; static gint hf_btcommon_cod_format_type = -1; static gint hf_btcommon_cod_major_service_class_information = -1; @@ -502,12 +524,34 @@ static gint hf_btcommon_le_channel_map_37 = -1; static gint hf_btcommon_le_channel_map_38 = -1; static gint hf_btcommon_le_channel_map_39 = -1; + +static const int *hfx_btcommon_eir_ad_ips_flags[] = { + &hf_btcommon_eir_ad_ips_flags_reserved, + &hf_btcommon_eir_ad_ips_flags_location_name, + &hf_btcommon_eir_ad_ips_flags_uncertainty, + &hf_btcommon_eir_ad_ips_flags_floor_number, + &hf_btcommon_eir_ad_ips_flags_altitude, + &hf_btcommon_eir_ad_ips_flags_tx_power, + &hf_btcommon_eir_ad_ips_flags_coordinate_system, + &hf_btcommon_eir_ad_ips_flags_coordinates, + NULL +}; + +static const int *hfx_btcommon_eir_ad_ips_uncertainty[] = { + &hf_btcommon_eir_ad_ips_uncertainty_reserved, + &hf_btcommon_eir_ad_ips_uncertainty_precision, + &hf_btcommon_eir_ad_ips_uncertainty_update_time, + &hf_btcommon_eir_ad_ips_uncertainty_stationary, + NULL +}; + static gint ett_cod = -1; static gint ett_eir_ad = -1; static gint ett_eir_ad_entry = -1; static expert_field ei_eir_ad_undecoded = EI_INIT; static expert_field ei_eir_ad_unknown = EI_INIT; +static expert_field ei_eir_ad_not_used = EI_INIT; static dissector_handle_t btcommon_cod_handle; static dissector_handle_t btcommon_eir_handle; @@ -4889,8 +4933,10 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, bluetoo proto_tree *entry_tree; proto_item *sub_item; gint offset = 0; + gint offset_start; guint8 length; guint8 type; + guint8 flags; guint8 data_size; gint64 end_offset; gboolean has_bd_addr = FALSE; @@ -4918,6 +4964,8 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, bluetoo offset += 1; length -= 1; + offset_start = offset; + switch (type) { case 0x01: /* Flags */ proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_flags_reserved, tvb, offset, 1, ENC_NA); @@ -5188,14 +5236,58 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, bluetoo break; case 0x25: /* Indoor Positioning */ -/* TODO */ - sub_item = proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_data, tvb, offset, length, ENC_NA); - expert_add_info(pinfo, sub_item, &ei_eir_ad_undecoded); - offset += length; + if (length == 0) + break; + + sub_item = proto_tree_add_bitmask(entry_tree, tvb, offset, hf_btcommon_eir_ad_ips_flags, ett_eir_ad_entry, hfx_btcommon_eir_ad_ips_flags, ENC_LITTLE_ENDIAN); + flags = tvb_get_guint8(tvb, offset); + offset += 1; + + if (flags & 0x01) { + proto_tree_add_item(tree, hf_btcommon_eir_ad_ips_latitude, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + + proto_tree_add_item(tree, hf_btcommon_eir_ad_ips_longitude, tvb, offset, 4, ENC_LITTLE_ENDIAN); + offset += 4; + + proto_tree_add_item(tree, hf_btcommon_eir_ad_ips_local_north_coordinate, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + + proto_tree_add_item(tree, hf_btcommon_eir_ad_ips_local_east_coordinate, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + } + + if (flags & 0x04) { + proto_tree_add_item(tree, hf_btcommon_eir_ad_ips_tx_power_level, tvb, offset, 1, ENC_NA); + offset += 1; + } + + if (flags & 0x08) { + proto_tree_add_item(tree, hf_btcommon_eir_ad_ips_altitude, tvb, offset, 2, ENC_LITTLE_ENDIAN); + offset += 2; + } + + if (flags & 0x10) { + proto_tree_add_item(tree, hf_btcommon_eir_ad_ips_floor_number, tvb, offset, 1, ENC_NA); + offset += 1; + } + + if (flags & 0x20) { + proto_tree_add_bitmask(tree, tvb, offset, hf_btcommon_eir_ad_ips_uncertainty, ett_eir_ad_entry, hfx_btcommon_eir_ad_ips_uncertainty, ENC_NA); + offset += 1; + } + + if (flags & 0xC0) { + expert_add_info(pinfo, sub_item, &ei_eir_ad_not_used); + } break; case 0x26: /* Transport Discovery Data */ /* TODO */ + + proto_tree_add_bitmask(tree, tvb, offset, hf_bthci_cmd_le_event_mask, ett_eir_ad_entry, hfx_bthci_cmd_le_event_mask, ENC_LITTLE_ENDIAN); + offset += 1; + sub_item = proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_data, tvb, offset, length, ENC_NA); expert_add_info(pinfo, sub_item, &ei_eir_ad_undecoded); offset += length; @@ -5247,6 +5339,12 @@ dissect_eir_ad_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, bluetoo expert_add_info(pinfo, sub_item, &ei_eir_ad_unknown); offset += length; } + + if (offset - offset_start > 0 && offset - offset_start < length) { + sub_item = proto_tree_add_item(entry_tree, hf_btcommon_eir_ad_data, tvb, offset, length - (offset - offset_start), ENC_NA); + expert_add_info(pinfo, sub_item, &ei_eir_ad_unknown); + offset += length - (offset - offset_start); + } } if (tvb_reported_length_remaining(tvb, offset) > 0) { @@ -5768,6 +5866,111 @@ proto_register_btcommon(void) FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} }, + {&hf_btcommon_eir_ad_ips_flags, + {"Indoor Positioning Configuration", "btcommon.eir_ad.entry.ips.flags", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_flags_reserved, + {"Reserved", "btcommon.eir_ad.entry.ips.flags.reserved", + FT_UINT8, BASE_HEX, NULL, 0xC0, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_flags_location_name, + {"Location Name", "btcommon.eir_ad.entry.ips.flags.location_name", + FT_BOOLEAN, 8, NULL, 0x40, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_flags_uncertainty, + {"Uncertainty", "btcommon.eir_ad.entry.ips.flags.uncertainty", + FT_BOOLEAN, 8, NULL, 0x20, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_flags_floor_number, + {"Floor Number", "btcommon.eir_ad.entry.ips.flags.floor_number", + FT_BOOLEAN, 8, NULL, 0x10, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_flags_altitude, + {"Altitude", "btcommon.eir_ad.entry.ips.flags.altitude", + FT_BOOLEAN, 8, NULL, 0x08, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_flags_tx_power, + {"Tx Power", "btcommon.eir_ad.entry.ips.flags.tx_power", + FT_BOOLEAN, 8, NULL, 0x04, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_flags_coordinate_system, + {"Coordinate System", "btcommon.eir_ad.entry.ips.flags.coordinate_system", + FT_UINT8, BASE_HEX, VALS(btatt_ips_coordinate_system), 0x02, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_flags_coordinates, + {"Coordinates", "btcommon.eir_ad.entry.ips.flags.coordinates", + FT_BOOLEAN, 8, NULL, 0x01, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_uncertainty, + {"Uncertainty", "btcommon.eir_ad.entry.ips.uncertainty", + FT_UINT8, BASE_HEX, NULL, 0x0, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_uncertainty_reserved, + {"Reserved", "btcommon.eir_ad.entry.ips.uncertainty.reserved", + FT_UINT8, BASE_HEX, NULL, 0x80, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_uncertainty_precision, + {"Precision", "btcommon.eir_ad.entry.ips.uncertainty.precision", + FT_UINT8, BASE_HEX, VALS(btatt_ips_uncertainty_precision_vals), 0x70, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_uncertainty_update_time, + {"Update Time", "btcommon.eir_ad.entry.ips.uncertainty.update_time", + FT_UINT8, BASE_HEX, VALS(btatt_ips_uncertainty_update_time_vals), 0x0E, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_uncertainty_stationary, + {"Stationary", "btcommon.eir_ad.entry.ips.uncertainty.stationary", + FT_UINT8, BASE_HEX, VALS(btatt_ips_uncertainty_stationary_vals), 0x01, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_latitude, + {"Latitude", "btcommon.eir_ad.entry.ips.latitude", + FT_INT32, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_longitude, + {"Longitude", "btcommon.eir_ad.entry.ips.longitude", + FT_INT32, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_local_north_coordinate, + {"Local North Coordinate", "btcommon.eir_ad.entry.ips.local_north_coordinate", + FT_INT16, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_local_east_coordinate, + {"Local East Coordinate", "btcommon.eir_ad.entry.ips.local_east_coordinate", + FT_INT16, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_floor_number, + {"Floor Number", "btcommon.eir_ad.entry.ips.floor_number", + FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_altitude, + {"Altitude", "btcommon.eir_ad.entry.ips.altitude", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, + {&hf_btcommon_eir_ad_ips_tx_power_level, + {"Tx Power Level", "btcommon.eir_ad.entry.ips.tx_power_level", + FT_INT8, BASE_DEC, NULL, 0x0, + NULL, HFILL} + }, { &hf_btcommon_cod_class_of_device, { "Class of Device", "btcommon.cod.class_of_device", FT_UINT24, BASE_HEX, NULL, 0x0, @@ -6122,7 +6325,8 @@ proto_register_btcommon(void) static ei_register_info ei[] = { { &ei_eir_ad_undecoded, { "btcommon.eir_ad.undecoded", PI_UNDECODED, PI_NOTE, "Undecoded", EXPFILL }}, - { &ei_eir_ad_unknown, { "btcommon.eir_ad.unknown", PI_PROTOCOL, PI_WARN, "Unknown data", EXPFILL }}, + { &ei_eir_ad_unknown, { "btcommon.eir_ad.unknown", PI_PROTOCOL, PI_WARN, "Unknown data", EXPFILL }}, + { &ei_eir_ad_not_used, { "btcommon.eir_ad.not_used", PI_PROTOCOL, PI_WARN, "Value should not be used", EXPFILL }}, }; proto_btcommon = proto_register_protocol("Bluetooth Common", "BT Common", "btcommon"); |