diff options
author | cbontje <cbontje@gmail.com> | 2015-07-06 15:28:28 -0600 |
---|---|---|
committer | Pascal Quantin <pascal.quantin@gmail.com> | 2015-07-07 19:57:15 +0000 |
commit | e9622175f7aee7dbeff6e97c9ac6ab78460e239a (patch) | |
tree | 65dcf5a1bcfc6bf7c434f1f364493f10e7f55828 /epan/dissectors/packet-mbtcp.c | |
parent | b8f3888141b0a47a6af83f9bbcb7325c7a7a3e5d (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/dissectors/packet-mbtcp.c')
-rw-r--r-- | epan/dissectors/packet-mbtcp.c | 32 |
1 files changed, 32 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, |