diff --git a/epan/dissectors/packet-selfm.c b/epan/dissectors/packet-selfm.c index 16024a45e4..8df5e73c04 100644 --- a/epan/dissectors/packet-selfm.c +++ b/epan/dissectors/packet-selfm.c @@ -1,7 +1,7 @@ /* packet-selfm.c * Routines for Schweitzer Engineering Laboratories (SEL) Protocols Dissection * By Chris Bontje (cbontje[AT]gmail.com - * Copyright 2012-2016, + * Copyright 2012-2018, * ************************************************************************************************ * Wireshark - Network traffic analyzer @@ -141,6 +141,7 @@ static int hf_selfm_fastmsg_len = -1; static int hf_selfm_fastmsg_routing_addr = -1; static int hf_selfm_fastmsg_status = -1; static int hf_selfm_fastmsg_funccode = -1; +static int hf_selfm_fastmsg_response_code = -1; static int hf_selfm_fastmsg_seq = -1; static int hf_selfm_fastmsg_seq_fir = -1; static int hf_selfm_fastmsg_seq_fin = -1; @@ -748,6 +749,20 @@ static const value_string selfm_fastmsg_tagtype_vals[] = { { 0, NULL } }; +/* Fast Message ACK Response Codes */ +static const value_string selfm_fastmsg_ack_responsecode_vals[] = { + { 0x0, "Success" }, + { 0x1, "Function code not recognized" }, + { 0x2, "Function code supported but disabled" }, + { 0x3, "Invalid Data Address" }, + { 0x4, "Bad Data" }, + { 0x5, "Insufficient Memory" }, + { 0x6, "Busy" }, + { 0, NULL } +}; + +static value_string_ext selfm_fastmsg_ack_responsecode_vals_ext = + VALUE_STRING_EXT_INIT(selfm_fastmsg_ack_responsecode_vals); /* Fast Message Unsolicited Write COM Port Codes */ static const value_string selfm_fastmsg_unswrite_com_vals[] = { @@ -1899,8 +1914,8 @@ dissect_fastmsg_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int o proto_tree *fastmsg_tree, *fastmsg_def_fc_tree=NULL, *fastmsg_elementlist_tree=NULL; proto_tree *fastmsg_element_tree=NULL, *fastmsg_datareg_tree=NULL, *fastmsg_tag_tree=NULL, *fastmsg_soeblk_tree=NULL; gint cnt, cnt1, num_elements, elmt_status32_ofs=0, elmt_status, null_offset; - guint8 len, funccode, seq, rx_num_fc, tx_num_fc; - guint8 seq_cnt, elmt_idx, fc_enable, soe_num_reg; + guint8 len, funccode, seq=0, rx_num_fc, tx_num_fc; + guint8 seq_cnt=0, elmt_idx, fc_enable, soe_num_reg; guint8 *tag_name_ptr; guint16 base_addr, num_addr, num_reg, addr1, addr2, crc16, crc16_calc, soe_num_blks; guint32 tod_ms, elmt_status32, elmt_ts_offset; @@ -1935,12 +1950,21 @@ dissect_fastmsg_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int o offset += 1; - /* Get Sequence Byte, add to Tree */ - seq = tvb_get_guint8(tvb, offset); - seq_cnt = seq & FAST_MSG_SEQ_CNT; + /* If this is an ACK message, process this byte as a Response Code. */ + if ((funccode == FAST_MSG_EN_UNS_DATA_ACK) || + (funccode == FAST_MSG_DIS_UNS_DATA_ACK) || + (funccode == FAST_MSG_UNS_RESP_ACK)) { + proto_tree_add_item(fastmsg_tree, hf_selfm_fastmsg_response_code, tvb, offset, 1, ENC_BIG_ENDIAN); + } + + else { + /* Otherwise, it is the sequence byte, add to Tree */ + seq = tvb_get_guint8(tvb, offset); + seq_cnt = seq & FAST_MSG_SEQ_CNT; + proto_tree_add_bitmask_with_flags(fastmsg_tree, tvb, offset, hf_selfm_fastmsg_seq, ett_selfm_fastmsg_seq, + seq_fields, ENC_NA, BMT_NO_APPEND); + } - proto_tree_add_bitmask_with_flags(fastmsg_tree, tvb, offset, hf_selfm_fastmsg_seq, ett_selfm_fastmsg_seq, - seq_fields, ENC_NA, BMT_NO_APPEND); offset += 1; /* Add Response Number to tree */ @@ -2853,6 +2877,8 @@ proto_register_selfm(void) { "Status Byte", "selfm.fastmsg.status", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_selfm_fastmsg_funccode, { "Function Code", "selfm.fastmsg.funccode", FT_UINT8, BASE_HEX | BASE_EXT_STRING, &selfm_fastmsg_func_code_vals_ext, 0x0, NULL, HFILL }}, + { &hf_selfm_fastmsg_response_code, + { "Response Code", "selfm.fastmsg.responsecode", FT_UINT8, BASE_HEX | BASE_EXT_STRING, &selfm_fastmsg_ack_responsecode_vals_ext, 0x0, NULL, HFILL }}, { &hf_selfm_fastmsg_seq, { "Sequence Byte", "selfm.fastmsg.seq", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_selfm_fastmsg_seq_fir,