aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-mbtcp.c
diff options
context:
space:
mode:
authorChris Bontje <cbontje@gmail.com>2017-01-20 10:32:33 -0700
committerAnders Broman <a.broman58@gmail.com>2017-02-18 07:08:56 +0000
commit7ccc55123982ec5bef7bc843f1db6d97c57f55e1 (patch)
treeb8636bca7dde3ade40abe43e263f59ca0a93cb64 /epan/dissectors/packet-mbtcp.c
parent7d8306829b7253aa4c6a6067d7062a7fc368a358 (diff)
Modbus - Add ability to filter by holding/input register number OR value
Bug: 13337 Change-Id: I695530c29b9b0f76eab65503dcba97d19af343fb Reviewed-on: https://code.wireshark.org/review/19706 Reviewed-by: Michael Mann <mmann78@netscape.net> Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-mbtcp.c')
-rw-r--r--epan/dissectors/packet-mbtcp.c111
1 files changed, 87 insertions, 24 deletions
diff --git a/epan/dissectors/packet-mbtcp.c b/epan/dissectors/packet-mbtcp.c
index 4a71d352d7..4624912ab7 100644
--- a/epan/dissectors/packet-mbtcp.c
+++ b/epan/dissectors/packet-mbtcp.c
@@ -141,8 +141,14 @@ static int hf_modbus_more_follows = -1;
static int hf_modbus_next_object_id = -1;
static int hf_modbus_object_str_value = -1;
static int hf_modbus_object_value = -1;
-static int hf_modbus_reg16 = -1;
-static int hf_modbus_reg32 = -1;
+static int hf_modbus_regnum16 = -1;
+static int hf_modbus_regnum32 = -1;
+static int hf_modbus_regval_uint16 = -1;
+static int hf_modbus_regval_int16 = -1;
+static int hf_modbus_regval_uint32 = -1;
+static int hf_modbus_regval_int32 = -1;
+static int hf_modbus_regval_ieee_float = -1;
+static int hf_modbus_regval_modicon_float = -1;
static int hf_mbrtu_unitid = -1;
static int hf_mbrtu_crc16 = -1;
static int hf_mbrtu_crc16_status = -1;
@@ -157,6 +163,7 @@ static gint ett_events_recv = -1;
static gint ett_events_send = -1;
static gint ett_device_id_objects = -1;
static gint ett_device_id_object_items = -1;
+static gint ett_register = -1;
static expert_field ei_mbrtu_crc16_incorrect = EI_INIT;
static expert_field ei_modbus_data_decode = EI_INIT;
@@ -845,6 +852,7 @@ dissect_modbus_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8
guint32 data32, modflt_comb;
gfloat data_float, modfloat;
proto_item *register_item = NULL;
+ proto_tree *register_tree = NULL;
tvbuff_t *next_tvb;
reported_len = tvb_reported_length_remaining(tvb, payload_start);
@@ -887,41 +895,61 @@ dissect_modbus_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8
switch (register_format) {
case MODBUS_PREF_REGISTER_FORMAT_UINT16: /* Standard-size unsigned integer 16-bit register */
data16 = tvb_get_ntohs(next_tvb, data_offset);
- proto_tree_add_uint_format(tree, hf_modbus_reg16, next_tvb, data_offset, 2, reg_num,
- "Register %u (UINT16): %u", reg_num, data16);
+ register_tree = proto_tree_add_subtree_format( tree, next_tvb, data_offset, 2,
+ ett_register, NULL, "Register %u (UINT16): %u", reg_num, data16);
+
+ proto_tree_add_uint(register_tree, hf_modbus_regnum16, next_tvb, data_offset, 2, reg_num);
+ proto_tree_add_uint(register_tree, hf_modbus_regval_uint16, next_tvb, data_offset, 2, data16);
+
data_offset += 2;
reg_num += 1;
break;
case MODBUS_PREF_REGISTER_FORMAT_INT16: /* Standard-size signed integer 16-bit register */
data16s = tvb_get_ntohs(next_tvb, data_offset);
- proto_tree_add_uint_format(tree, hf_modbus_reg16, next_tvb, data_offset, 2, reg_num,
- "Register %u (INT16): %d", reg_num, data16s);
+ register_tree = proto_tree_add_subtree_format( tree, next_tvb, data_offset, 2,
+ ett_register, NULL, "Register %u (INT16): %d", reg_num, data16s);
+
+ proto_tree_add_uint(register_tree, hf_modbus_regnum16, next_tvb, data_offset, 2, reg_num);
+ proto_tree_add_int(register_tree, hf_modbus_regval_int16, next_tvb, data_offset, 2, data16s);
+
data_offset += 2;
reg_num += 1;
break;
- case MODBUS_PREF_REGISTER_FORMAT_UINT32: /* Double-size unsigned integer 2 x 16-bit registers */
+ case MODBUS_PREF_REGISTER_FORMAT_UINT32: /* Double-size 32-bit unsigned integer (2 sequential 16-bit registers) */
data32 = tvb_get_ntohl(next_tvb, data_offset);
- proto_tree_add_uint_format(tree, hf_modbus_reg32, next_tvb, data_offset, 4, reg_num,
- "Register %u (UINT32): %u", reg_num, data32);
+ register_tree = proto_tree_add_subtree_format( tree, next_tvb, data_offset, 4,
+ ett_register, NULL, "Register %u (UINT32): %u", reg_num, data32);
+
+ proto_tree_add_uint(register_tree, hf_modbus_regnum32, next_tvb, data_offset, 4, reg_num);
+ proto_tree_add_uint(register_tree, hf_modbus_regval_uint32, next_tvb, data_offset, 4, data32);
+
data_offset += 4;
reg_num += 2;
break;
- case MODBUS_PREF_REGISTER_FORMAT_INT32: /* Double-size signed integer 2 x 16-bit registers */
+ case MODBUS_PREF_REGISTER_FORMAT_INT32: /* Double-size 32-bit signed integer (2 sequential 16-bit registers) */
data32s = tvb_get_ntohl(next_tvb, data_offset);
- proto_tree_add_uint_format(tree, hf_modbus_reg32, next_tvb, data_offset, 4, reg_num,
- "Register %u (INT32): %d", reg_num, data32s);
+ register_tree = proto_tree_add_subtree_format( tree, next_tvb, data_offset, 4,
+ ett_register, NULL, "Register %u (INT32): %d", reg_num, data32s);
+
+ proto_tree_add_uint(register_tree, hf_modbus_regnum32, next_tvb, data_offset, 4, reg_num);
+ proto_tree_add_int(register_tree, hf_modbus_regval_int32, next_tvb, data_offset, 4, data32s);
+
data_offset += 4;
reg_num += 2;
break;
- case MODBUS_PREF_REGISTER_FORMAT_IEEE_FLOAT: /* IEEE Floating Point, 2 x 16-bit registers */
+ case MODBUS_PREF_REGISTER_FORMAT_IEEE_FLOAT: /* 32-bit IEEE Floating Point, (2 sequential 16-bit registers) */
data_float = tvb_get_ntohieee_float(next_tvb, data_offset);
- proto_tree_add_uint_format(tree, hf_modbus_reg32, next_tvb, data_offset, 4, reg_num,
- "Register %u (IEEE Float): %f", reg_num, data_float);
+ register_tree = proto_tree_add_subtree_format( tree, next_tvb, data_offset, 4,
+ ett_register, NULL, "Register %u (IEEE Float): %f", reg_num, data_float);
+
+ proto_tree_add_uint(register_tree, hf_modbus_regnum32, next_tvb, data_offset, 4, reg_num);
+ proto_tree_add_float(register_tree, hf_modbus_regval_ieee_float, next_tvb, data_offset, 4, data_float);
+
data_offset += 4;
reg_num += 2;
break;
- case MODBUS_PREF_REGISTER_FORMAT_MODICON_FLOAT: /* Modicon Floating Point (word-swap), 2 x 16-bit registers */
+ case MODBUS_PREF_REGISTER_FORMAT_MODICON_FLOAT: /* Modicon Floating Point (word-swapped, 2 sequential 16-bit registers) */
/* Modicon-style Floating Point values are stored in reverse-word order. */
/* ie: a standard IEEE float value 59.991459 is equal to 0x426ff741 */
/* while the Modicon equivalent to this value is 0xf741426f */
@@ -936,8 +964,12 @@ dissect_modbus_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8
modflt_comb = (guint32)(modflt_hi<<16) | modflt_lo;
memcpy(&modfloat, &modflt_comb, 4);
- proto_tree_add_uint_format(tree, hf_modbus_reg32, next_tvb, data_offset, 4, reg_num,
- "Register %u (Modicon Float): %f", reg_num, modfloat);
+ register_tree = proto_tree_add_subtree_format( tree, next_tvb, data_offset, 4,
+ ett_register, NULL, "Register %u (Modicon Float): %f", reg_num, modfloat);
+
+ proto_tree_add_uint(register_tree, hf_modbus_regnum32, next_tvb, data_offset, 4, reg_num);
+ proto_tree_add_float(register_tree, hf_modbus_regval_modicon_float, next_tvb, data_offset, 4, modfloat);
+
data_offset += 4;
reg_num += 2;
break;
@@ -1945,17 +1977,47 @@ proto_register_modbus(void)
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
- { &hf_modbus_reg16,
- { "Register Value (16-bit)", "modbus.reg16",
+ { &hf_modbus_regnum16,
+ { "Register Number", "modbus.regnum16",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
- { &hf_modbus_reg32,
- { "Register Value (32-bit)", "modbus.reg32",
+ { &hf_modbus_regnum32,
+ { "Register Number", "modbus.regnum32",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
- };
+ { &hf_modbus_regval_uint16,
+ { "Register Value (UINT16)", "modbus.regval_uint16",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_modbus_regval_int16,
+ { "Register Value (INT16)", "modbus.regval_int16",
+ FT_INT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_modbus_regval_uint32,
+ { "Register Value (UINT32)", "modbus.regval_uint32",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_modbus_regval_int32,
+ { "Register Value (INT32)", "modbus.regval_int32",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_modbus_regval_ieee_float,
+ { "Register Value (IEEE Float)", "modbus.regval_float",
+ FT_FLOAT, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_modbus_regval_modicon_float,
+ { "Register Value (Modicon Float)", "modbus.regval_float",
+ FT_FLOAT, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }
+ },
+ };
/* Setup protocol subtree array */
static gint *ett[] = {
@@ -1967,7 +2029,8 @@ proto_register_modbus(void)
&ett_events_recv,
&ett_events_send,
&ett_device_id_objects,
- &ett_device_id_object_items
+ &ett_device_id_object_items,
+ &ett_register
};
static ei_register_info ei[] = {