aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ppi-sensor.c
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2015-11-24 00:18:24 -0500
committerMichael Mann <mmann78@netscape.net>2015-11-24 11:47:50 +0000
commite30c8f230222aea11dc729cb840affcf49fa8a21 (patch)
treea7c3348bdb89b4396e5ab2d8dfe5b879e60fe860 /epan/dissectors/packet-ppi-sensor.c
parent8748a047bf684fbdf2c9859b6b17aa18b9a761d7 (diff)
Convert PPI dissectors to "new style".
Also add some expert info and don't stop dissection based on version. Change-Id: Ia471cb3d517008a486ec9ad8aaf11d06fa55a72d Reviewed-on: https://code.wireshark.org/review/12082 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-ppi-sensor.c')
-rw-r--r--epan/dissectors/packet-ppi-sensor.c54
1 files changed, 26 insertions, 28 deletions
diff --git a/epan/dissectors/packet-ppi-sensor.c b/epan/dissectors/packet-ppi-sensor.c
index 3b2548f083..af86f0b9e0 100644
--- a/epan/dissectors/packet-ppi-sensor.c
+++ b/epan/dissectors/packet-ppi-sensor.c
@@ -129,6 +129,8 @@ static gint ett_ppi_sensor = -1;
static gint ett_ppi_sensor_present = -1;
static expert_field ei_ppi_sensor_present_bit = EI_INIT;
+static expert_field ei_ppi_sensor_version = EI_INIT;
+static expert_field ei_ppi_sensor_length = EI_INIT;
/* used with ScaleFactor */
static gdouble
@@ -157,8 +159,8 @@ base_10_expt(int power)
return (1.0/ret);
}
-static void
-dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
+static int
+dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) {
/* The fixed values up front */
guint32 version;
guint length;
@@ -166,8 +168,8 @@ dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
proto_tree *ppi_sensor_tree = NULL;
proto_tree *pt, *my_pt;
- proto_item *ti = NULL;
- proto_item *sensor_line = NULL;
+ proto_item *version_item, *length_item;
+ proto_tree *sensor_line;
/* sensor type in english */
const gchar *type_str = "Unknown sensor";
const gchar *unit_str = "Unknown unit";
@@ -216,27 +218,21 @@ dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
version, length);
/* Create the basic dissection tree*/
- if (tree) {
- ti = proto_tree_add_protocol_format(tree, proto_ppi_sensor,
- tvb, 0, length, "PPI Sensor Header v%u, Length %u", version, length);
- sensor_line = ti; /* we will almost definitely overwrite this in the field processing below */
-
- /*Add in the fixed ppi-geotagging-header fields: ver, pad, len */
- ppi_sensor_tree= proto_item_add_subtree(ti, ett_ppi_sensor);
- proto_tree_add_uint(ppi_sensor_tree, hf_ppi_sensor_version,
- tvb, offset, 1, version);
- proto_tree_add_item(ppi_sensor_tree, hf_ppi_sensor_pad,
- tvb, offset + 1, 1, ENC_BIG_ENDIAN);
- ti = proto_tree_add_uint(ppi_sensor_tree, hf_ppi_sensor_length,
- tvb, offset + 2, 2, length);
- /*fixed ppi-geotagging-header fields finished, move onto the fields marked present*/
- }
+ sensor_line = proto_tree_add_protocol_format(tree, proto_ppi_sensor,
+ tvb, 0, length, "PPI Sensor Header v%u, Length %u", version, length);
+ /*Add in the fixed ppi-geotagging-header fields: ver, pad, len */
+ ppi_sensor_tree = proto_item_add_subtree(sensor_line, ett_ppi_sensor);
+ version_item = proto_tree_add_uint(ppi_sensor_tree, hf_ppi_sensor_version,
+ tvb, offset, 1, version);
+ proto_tree_add_item(ppi_sensor_tree, hf_ppi_sensor_pad,
+ tvb, offset + 1, 1, ENC_BIG_ENDIAN);
+ length_item = proto_tree_add_uint(ppi_sensor_tree, hf_ppi_sensor_length,
+ tvb, offset + 2, 2, length);
+ /*fixed ppi-geotagging-header fields finished, move onto the fields marked present*/
/* We support v1 and v2 of Sensor tags (identical) */
if (! (version == 1 || version == 2) ) {
- if (tree)
- proto_item_append_text(ti, "invalid version (got %d, expected 1 or 2)", version);
- return;
+ expert_add_info_format(pinfo, version_item, &ei_ppi_sensor_version, "Invalid version (got %d, expected 1 or 2)", version);
}
length_remaining = length;
@@ -246,14 +242,14 @@ 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.
*/
- proto_item_append_text(ti, " (invalid - minimum length is 8)");
- return;
+ expert_add_info_format(pinfo, length_item, &ei_ppi_sensor_length, "Invalid PPI-Sensor length - minimum length is 8");
+ return 2;
}
/* perform max length sanity checking */
if (length > PPI_SENSOR_MAXTAGLEN ) {
- proto_item_append_text(ti, "Invalid PPI-Sensor length (got %d, %d max\n)", length, PPI_SENSOR_MAXTAGLEN);
- return;
+ expert_add_info_format(pinfo, length_item, &ei_ppi_sensor_length, "Invalid PPI-Sensor length (got %d, %d max\n)", length, PPI_SENSOR_MAXTAGLEN);
+ return 2;
}
/* Subtree for the "present flags" bitfield. */
@@ -401,7 +397,7 @@ dissect_ppi_sensor(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) {
}
};
- return;
+ return tvb_captured_length(tvb);
}
void
@@ -540,6 +536,8 @@ proto_register_ppi_sensor(void) {
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 }},
+ { &ei_ppi_sensor_version, { "ppi_sensor.version.unsupported", PI_PROTOCOL, PI_WARN, "Invalid version", EXPFILL }},
+ { &ei_ppi_sensor_length, { "ppi_sensor.length.invalid", PI_MALFORMED, PI_ERROR, "Invalid length", EXPFILL }},
};
expert_module_t* expert_ppi_sensor;
@@ -549,7 +547,7 @@ proto_register_ppi_sensor(void) {
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);
+ new_register_dissector("ppi_sensor", dissect_ppi_sensor, proto_ppi_sensor);
}