diff options
Diffstat (limited to 'epan/dissectors/packet-ppi-sensor.c')
-rw-r--r-- | epan/dissectors/packet-ppi-sensor.c | 67 |
1 files changed, 34 insertions, 33 deletions
diff --git a/epan/dissectors/packet-ppi-sensor.c b/epan/dissectors/packet-ppi-sensor.c index 3f95f8ce43..c8ccd5770e 100644 --- a/epan/dissectors/packet-ppi-sensor.c +++ b/epan/dissectors/packet-ppi-sensor.c @@ -28,6 +28,7 @@ #include <glib.h> #include <epan/packet.h> +#include <epan/expert.h> #include "packet-ppi-geolocation-common.h" enum ppi_sensor_type { @@ -129,6 +130,8 @@ static int hf_ppi_sensor_present_ext = -1; static gint ett_ppi_sensor = -1; static gint ett_ppi_sensor_present = -1; +static expert_field ei_ppi_sensor_present_bit = EI_INIT; + /* used with ScaleFactor */ static gdouble base_10_expt(int power) @@ -164,7 +167,6 @@ dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint length_remaining; proto_tree *ppi_sensor_tree = NULL; - proto_tree *present_tree = NULL; proto_tree *pt, *my_pt; proto_item *ti = NULL; proto_item *sensor_line = NULL; @@ -172,6 +174,21 @@ dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { const gchar *type_str = "Unknown sensor"; const gchar *unit_str = "Unknown unit"; + static const int * ppi_sensor_present_flags[] = { + &hf_ppi_sensor_present_sensortype, + &hf_ppi_sensor_present_scalefactor, + &hf_ppi_sensor_present_val_x, + &hf_ppi_sensor_present_val_y, + &hf_ppi_sensor_present_val_z, + &hf_ppi_sensor_present_val_t, + &hf_ppi_sensor_present_val_e, + &hf_ppi_sensor_present_descstr, + &hf_ppi_sensor_present_appspecific_num, + &hf_ppi_sensor_present_appspecific_data, + &hf_ppi_sensor_present_ext, + NULL + }; + /* bits*/ int bit; guint32 present, next_present; @@ -231,36 +248,19 @@ dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { * Base-geotag-header (Radiotap lookalike) is shorter than the fixed-length portion * plus one "present" bitset. */ - if (tree) - proto_item_append_text(ti, " (invalid - minimum length is 8)"); + proto_item_append_text(ti, " (invalid - minimum length is 8)"); return; } /* perform max length sanity checking */ if (length > PPI_SENSOR_MAXTAGLEN ) { - if (tree) - proto_item_append_text(ti, "Invalid PPI-Sensor length (got %d, %d max\n)", length, PPI_SENSOR_MAXTAGLEN); + proto_item_append_text(ti, "Invalid PPI-Sensor length (got %d, %d max\n)", length, PPI_SENSOR_MAXTAGLEN); return; } - /* Subtree for the "present flags" bitfield. */ - if (tree) { - pt = proto_tree_add_uint(ppi_sensor_tree, hf_ppi_sensor_present, tvb, offset + 4, 4, present); - present_tree = proto_item_add_subtree(pt, ett_ppi_sensor_present); /* this represents the present bitmask field */ - - proto_tree_add_item(present_tree, hf_ppi_sensor_present_sensortype, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_scalefactor, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_val_x, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_val_y, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_val_z, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_val_t, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_val_e, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_descstr, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_appspecific_num, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_appspecific_data, tvb, 4, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(present_tree, hf_ppi_sensor_present_ext, tvb, 4, 4, ENC_LITTLE_ENDIAN); - } + pt = proto_tree_add_bitmask(ppi_sensor_tree, tvb, offset + 4, hf_ppi_sensor_present, ett_ppi_sensor_present, ppi_sensor_present_flags, ENC_LITTLE_ENDIAN); + offset += PPI_GEOBASE_MIN_HEADER_LEN; length_remaining -= PPI_GEOBASE_MIN_HEADER_LEN; @@ -290,10 +290,7 @@ dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { if (length_remaining < 1) break; scalefactor = (gchar) tvb_get_guint8(tvb, offset); - if (tree) { - - proto_tree_add_int(ppi_sensor_tree, hf_ppi_sensor_scalefactor, tvb, offset, 1, scalefactor); - } + proto_tree_add_int(ppi_sensor_tree, hf_ppi_sensor_scalefactor, tvb, offset, 1, scalefactor); offset+=1; length_remaining-=1; break; @@ -384,18 +381,14 @@ dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { if (length_remaining < 4) break; t_appspecific_num = tvb_get_letohl(tvb, offset); /* application specific parsers may switch on this later */ - if (tree) { - proto_tree_add_uint(ppi_sensor_tree, hf_ppi_sensor_appspecific_num, tvb, offset, 4, t_appspecific_num); - } + proto_tree_add_uint(ppi_sensor_tree, hf_ppi_sensor_appspecific_num, tvb, offset, 4, t_appspecific_num); offset+=4; length_remaining-=4; break; case PPI_SENSOR_APPDATA: if (length_remaining < 60) break; - if (tree) { - proto_tree_add_item(ppi_sensor_tree, hf_ppi_sensor_appspecific_data, tvb, offset, 60, ENC_NA); - } + proto_tree_add_item(ppi_sensor_tree, hf_ppi_sensor_appspecific_data, tvb, offset, 60, ENC_NA); offset+=60; length_remaining-=60; break; @@ -404,7 +397,7 @@ dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { * This indicates a field whose size we do not * know, so we cannot proceed. */ - proto_tree_add_text(ppi_sensor_tree, tvb, offset, 0, "Error: PPI-SENSOR: unknown bit (%d) set in present field.\n", bit); + expert_add_info_format(pinfo, pt, &ei_ppi_sensor_present_bit, "Error: PPI-SENSOR: unknown bit (%d) set in present field.", bit); next_present = 0; continue; } @@ -547,9 +540,17 @@ proto_register_ppi_sensor(void) { &ett_ppi_sensor_present, }; + static ei_register_info ei[] = { + { &ei_ppi_sensor_present_bit, { "ppi_sensor.present.unknown_bit", PI_PROTOCOL, PI_WARN, "Error: PPI-ANTENNA: unknown bit set in present field.", EXPFILL }}, + }; + + expert_module_t* expert_ppi_sensor; + proto_ppi_sensor = proto_register_protocol("PPI sensor decoder", "PPI sensor Decoder", "ppi_sensor"); proto_register_field_array(proto_ppi_sensor, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); + expert_ppi_sensor = expert_register_protocol(proto_ppi_sensor); + expert_register_field_array(expert_ppi_sensor, ei, array_length(ei)); register_dissector("ppi_sensor", dissect_ppi_sensor, proto_ppi_sensor); } |