aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorMichal Labedzki <michal.labedzki@tieto.com>2015-12-10 09:41:59 +0100
committerMichal Labedzki <michal.labedzki@tieto.com>2016-01-18 18:36:10 +0000
commitdc4c64b4cbbf46596d9810e56b49773cb41eadec (patch)
tree642cd343b88766b44e93864024a1d4442bcf1b68 /epan/dissectors
parent69e80c4d87a259c09721198aecd62a7fdb2f4f7e (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>
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-btatt.c31
-rw-r--r--epan/dissectors/packet-btatt.h7
-rw-r--r--epan/dissectors/packet-bthci_cmd.c214
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");