aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorcbontje <cbontje@gmail.com>2015-07-06 15:28:28 -0600
committerPascal Quantin <pascal.quantin@gmail.com>2015-07-07 19:57:15 +0000
commite9622175f7aee7dbeff6e97c9ac6ab78460e239a (patch)
tree65dcf5a1bcfc6bf7c434f1f364493f10e7f55828 /epan
parentb8f3888141b0a47a6af83f9bbcb7325c7a7a3e5d (diff)
Added support for optional display of signed 16/32-bit integer Modbus register data
Change-Id: I2a81fdf426fdc20db200596ccd2eae26936fc81a Reviewed-on: https://code.wireshark.org/review/9526 Reviewed-by: Graham Bloice <graham.bloice@trihedral.com> Petri-Dish: Graham Bloice <graham.bloice@trihedral.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-mbtcp.c32
-rw-r--r--epan/dissectors/packet-mbtcp.h2
2 files changed, 34 insertions, 0 deletions
diff --git a/epan/dissectors/packet-mbtcp.c b/epan/dissectors/packet-mbtcp.c
index fb9f47029a..690b0c5700 100644
--- a/epan/dissectors/packet-mbtcp.c
+++ b/epan/dissectors/packet-mbtcp.c
@@ -148,7 +148,9 @@ 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_reg_uint16 = -1;
+static int hf_modbus_reg_int16 = -1;
static int hf_modbus_reg_uint32 = -1;
+static int hf_modbus_reg_int32 = -1;
static int hf_modbus_reg_ieee_float = -1;
static int hf_modbus_reg_modicon_float = -1;
static int hf_mbrtu_unitid = -1;
@@ -389,7 +391,9 @@ static const value_string conformity_level_vals[] = {
static const enum_val_t mbus_register_format[] = {
{ "UINT16 ", "UINT16 ", MBTCP_PREF_REGISTER_FORMAT_UINT16 },
+ { "INT16 ", "INT16 ", MBTCP_PREF_REGISTER_FORMAT_INT16 },
{ "UINT32 ", "UINT32 ", MBTCP_PREF_REGISTER_FORMAT_UINT32 },
+ { "INT32 ", "INT32 ", MBTCP_PREF_REGISTER_FORMAT_INT32 },
{ "IEEE FLT ", "IEEE FLT ", MBTCP_PREF_REGISTER_FORMAT_IEEE_FLOAT },
{ "MODICON FLT", "MODICON FLT", MBTCP_PREF_REGISTER_FORMAT_MODICON_FLOAT },
{ NULL, NULL, 0 }
@@ -763,6 +767,8 @@ dissect_modbus_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8
gint payload_start, gint payload_len, guint8 register_format)
{
gint reported_len, data_offset, reg_num = 0;
+ gint16 data16s;
+ gint32 data32s;
guint16 data16, modflt_lo, modflt_hi;
guint32 data32, modflt_comb;
gfloat data_float, modfloat;
@@ -815,6 +821,14 @@ dissect_modbus_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8
data_offset += 2;
reg_num += 1;
break;
+ case MBTCP_PREF_REGISTER_FORMAT_INT16: /* Standard-size signed integer 16-bit register */
+ data16s = tvb_get_ntohs(next_tvb, data_offset);
+ register_item = proto_tree_add_int(tree, hf_modbus_reg_int16, next_tvb, data_offset, 2, data16s);
+ proto_item_set_text(register_item, "Register %u (INT16): %d", reg_num, data16s);
+
+ data_offset += 2;
+ reg_num += 1;
+ break;
case MBTCP_PREF_REGISTER_FORMAT_UINT32: /* Double-size unsigned integer 2 x 16-bit registers */
data32 = tvb_get_ntohl(next_tvb, data_offset);
register_item = proto_tree_add_uint(tree, hf_modbus_reg_uint32, next_tvb, data_offset, 4, data32);
@@ -823,6 +837,14 @@ dissect_modbus_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint8
data_offset += 4;
reg_num += 2;
break;
+ case MBTCP_PREF_REGISTER_FORMAT_INT32: /* Double-size signed integer 2 x 16-bit registers */
+ data32s = tvb_get_ntohl(next_tvb, data_offset);
+ register_item = proto_tree_add_int(tree, hf_modbus_reg_int32, next_tvb, data_offset, 4, data32s);
+ proto_item_set_text(register_item, "Register %u (INT32): %d", reg_num, data32s);
+
+ data_offset += 4;
+ reg_num += 2;
+ break;
case MBTCP_PREF_REGISTER_FORMAT_IEEE_FLOAT: /* IEEE Floating Point, 2 x 16-bit registers */
data_float = tvb_get_ntohieee_float(next_tvb, data_offset);
register_item = proto_tree_add_float(tree, hf_modbus_reg_ieee_float, next_tvb, data_offset, 4, data_float);
@@ -1733,11 +1755,21 @@ proto_register_modbus(void)
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_modbus_reg_int16,
+ { "Register (INT16)", "modbus.register.int16",
+ FT_INT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
{ &hf_modbus_reg_uint32,
{ "Register (UINT32)", "modbus.register.uint32",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_modbus_reg_int32,
+ { "Register (INT32)", "modbus.register.int32",
+ FT_INT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
{ &hf_modbus_reg_ieee_float,
{ "Register (IEEE Float)", "modbus.register.ieee_float",
FT_FLOAT, BASE_NONE, NULL, 0x0,
diff --git a/epan/dissectors/packet-mbtcp.h b/epan/dissectors/packet-mbtcp.h
index cf5d322c3e..bf81de720e 100644
--- a/epan/dissectors/packet-mbtcp.h
+++ b/epan/dissectors/packet-mbtcp.h
@@ -101,6 +101,8 @@
#define MBTCP_PREF_REGISTER_FORMAT_UINT32 1
#define MBTCP_PREF_REGISTER_FORMAT_IEEE_FLOAT 2
#define MBTCP_PREF_REGISTER_FORMAT_MODICON_FLOAT 3
+#define MBTCP_PREF_REGISTER_FORMAT_INT16 4
+#define MBTCP_PREF_REGISTER_FORMAT_INT32 5
#define MBTCP_PREF_REGISTER_ADDR_RAW 0
#define MBTCP_PREF_REGISTER_ADDR_MOD5 1