diff options
author | Evan Huus <eapache@gmail.com> | 2013-10-31 01:49:10 +0000 |
---|---|---|
committer | Evan Huus <eapache@gmail.com> | 2013-10-31 01:49:10 +0000 |
commit | 68b588845393ccc3b360d19662425d6ccc85c319 (patch) | |
tree | a157ed5631cdf6afa112095952a8ed742ba5b536 /epan/dissectors/packet-opensafety.c | |
parent | 1ac9cf68a950e9361ed85404fb9490997b103b8c (diff) |
From Roland Knall via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9345
openSAFETY: Changes for better dissection of additional SADR and SN Fail
messages
svn path=/trunk/; revision=52998
Diffstat (limited to 'epan/dissectors/packet-opensafety.c')
-rw-r--r-- | epan/dissectors/packet-opensafety.c | 126 |
1 files changed, 98 insertions, 28 deletions
diff --git a/epan/dissectors/packet-opensafety.c b/epan/dissectors/packet-opensafety.c index f12a0dfb96..bf07d35d23 100644 --- a/epan/dissectors/packet-opensafety.c +++ b/epan/dissectors/packet-opensafety.c @@ -184,15 +184,21 @@ static const value_string message_service_type[] = { { 0, NULL } }; -/* Values 5-255 are reserved for future use. They will be presented as "Reserved [%d]" +/* Values 6-255 are reserved for future use. They will be presented as "Reserved [%d]" * during dissection */ +#define OPENSAFETY_ERROR_GROUP_APPLICATION 0x01 +#define OPENSAFETY_ERROR_GROUP_PARAMETER 0x02 +#define OPENSAFETY_ERROR_GROUP_VENDOR_SPECIFIC 0x03 +#define OPENSAFETY_ERROR_GROUP_OPENSAFETY_STACK 0x04 +#define OPENSAFETY_ERROR_GROUP_ADD_PARAMETER 0x05 + static const value_string sn_fail_error_group[] = { - { 1, "Application" }, - { 2, "Parameter" }, - { 3, "Vendor specific" }, - { 4, "openSAFETY Stack" }, - { 5, "Additional parameter needed" }, + { OPENSAFETY_ERROR_GROUP_APPLICATION, "Application" }, + { OPENSAFETY_ERROR_GROUP_PARAMETER, "Parameter" }, + { OPENSAFETY_ERROR_GROUP_VENDOR_SPECIFIC, "Vendor specific" }, + { OPENSAFETY_ERROR_GROUP_OPENSAFETY_STACK, "openSAFETY Stack" }, + { OPENSAFETY_ERROR_GROUP_ADD_PARAMETER, "Additional parameter needed" }, { 0, NULL } }; @@ -410,6 +416,8 @@ static const true_false_string opensafety_message_direction = { "Request", "Resp #define OPENSAFETY_REQUEST TRUE #define OPENSAFETY_RESPONSE FALSE +static const true_false_string opensafety_addparam_request = { "Header only", "Header & Data" }; + #define OSS_FRAME_POS_ADDR 0 #define OSS_FRAME_POS_ID 1 #define OSS_FRAME_POS_LEN 2 @@ -484,6 +492,9 @@ static int hf_oss_snmt_tool = -1; static int hf_oss_snmt_service_id = -1; static int hf_oss_snmt_error_group = -1; static int hf_oss_snmt_error_code = -1; +static int hf_oss_snmt_param_type = -1; +static int hf_oss_snmt_ext_addsaddr = -1; +static int hf_oss_snmt_ext_addtxspdo = -1; static int hf_oss_ssdo_server = -1; static int hf_oss_ssdo_client = -1; @@ -1289,7 +1300,7 @@ dissect_opensafety_ssdo_message(tvbuff_t *message_tvb , packet_info *pinfo, prot col_append_fstr(pinfo->cinfo, COL_INFO, " - %s", val_to_str_const(((guint32) (ssdoIndex << 16) + ssdoSubIndex), sod_idx_names, "Unknown")); } - col_append_str(pinfo->cinfo, COL_INFO, "]" ); + col_append_fstr(pinfo->cinfo, COL_INFO, "%s", "]" ); payloadOffset += 3; } @@ -1444,7 +1455,7 @@ dissect_opensafety_snmt_message(tvbuff_t *message_tvb, packet_info *pinfo , prot proto_tree *snmt_tree; guint32 entry = 0; guint16 addr, taddr, sdn; - guint8 db0, byte; + guint8 db0, byte, errcode; guint dataLength; char *tempString; @@ -1497,25 +1508,51 @@ dissect_opensafety_snmt_message(tvbuff_t *message_tvb, packet_info *pinfo , prot } else if ( (OSS_FRAME_ID_T(message_tvb, frameStart1) ^ OPENSAFETY_MSG_SNMT_SERVICE_RESPONSE) == 0 ) { - proto_tree_add_uint(snmt_tree, hf_oss_snmt_service_id, message_tvb, OSS_FRAME_POS_DATA + frameStart1, 1, db0); - col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", val_to_str_const(db0, message_service_type, "Unknown")); + byte = tvb_get_guint8(message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 1); + + if ( ! ( (db0 ^ OPENSAFETY_MSG_SNMT_EXT_SN_FAIL) == 0 && byte == OPENSAFETY_ERROR_GROUP_ADD_PARAMETER ) ) + { + proto_tree_add_uint(snmt_tree, hf_oss_snmt_service_id, message_tvb, OSS_FRAME_POS_DATA + frameStart1, 1, db0); + col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", val_to_str_const(db0, message_service_type, "Unknown")); + } + else + { + proto_tree_add_uint_format_value(snmt_tree, hf_oss_snmt_service_id, message_tvb, OSS_FRAME_POS_DATA + frameStart1, 1, + db0, "%s [Request via SN Fail] (0x%02X)", val_to_str_const(byte, sn_fail_error_group, "Unknown"), db0); + col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", val_to_str_const(byte, sn_fail_error_group, "Unknown")); + } proto_tree_add_uint(snmt_tree, hf_oss_snmt_master, message_tvb, OSS_FRAME_POS_ADDR + frameStart1, 2, addr); proto_tree_add_uint(snmt_tree, hf_oss_snmt_slave, message_tvb, frameStart2 + 3, 2, taddr); + if ( (db0 ^ OPENSAFETY_MSG_SNMT_EXT_SN_FAIL) == 0 ) { - byte = tvb_get_guint8(message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 1); - proto_tree_add_uint_format_value(snmt_tree, hf_oss_snmt_error_group, message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 1, 1, - byte, "%s", ( byte == 0 ? "Device" : val_to_str(byte, sn_fail_error_group, "Reserved [%d]" ) ) ); - - byte = tvb_get_guint8(message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 2); - proto_tree_add_uint_format_value(snmt_tree, hf_oss_snmt_error_code, message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 2, 1, - byte, "%s [%d]", ( byte == 0 ? "Default" : "Vendor Specific" ), byte ); - - col_append_fstr(pinfo->cinfo, COL_INFO, " - Group: %s; Code: %s", - ( byte == 0 ? "Device" : val_to_str(byte, sn_fail_error_group, "Reserved [%d]" ) ), - ( byte == 0 ? "Default" : "Vendor Specific" ) - ); + /* Handle a normal SN Fail */ + if ( byte != OPENSAFETY_ERROR_GROUP_ADD_PARAMETER ) + { + proto_tree_add_uint_format_value(snmt_tree, hf_oss_snmt_error_group, message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 1, 1, + byte, "%s", ( byte == 0 ? "Device" : val_to_str(byte, sn_fail_error_group, "Reserved [%d]" ) ) ); + + errcode = tvb_get_guint8(message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 2); + proto_tree_add_uint_format_value(snmt_tree, hf_oss_snmt_error_code, message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 2, 1, + errcode, "%s [%d]", ( errcode == 0 ? "Default" : "Vendor Specific" ), errcode ); + + col_append_fstr(pinfo->cinfo, COL_INFO, " - Group: %s; Code: %s", + ( byte == 0 ? "Device" : val_to_str(byte, sn_fail_error_group, "Reserved [%d]" ) ), + ( errcode == 0 ? "Default" : "Vendor Specific" ) + ); + } + else + { + errcode = tvb_get_guint8(message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 2); + + /* Handle an additional parameter request */ + proto_tree_add_uint(snmt_tree, hf_oss_ssdo_extpar_parset, message_tvb, + OSS_FRAME_POS_DATA + frameStart1 + 2, 1, ( errcode & 0x0F ) + 1 ); + + proto_tree_add_boolean(snmt_tree, hf_oss_snmt_param_type, message_tvb, + OSS_FRAME_POS_DATA + frameStart1 + 2, 1, ( ( errcode & 0xF0 ) != 0xF0 ) ); + } } else if ( (db0 ^ OPENSAFETY_MSG_SNMT_EXT_SN_ASSIGNED_UDID_SCM) == 0 ) { @@ -1529,12 +1566,23 @@ dissect_opensafety_snmt_message(tvbuff_t *message_tvb, packet_info *pinfo , prot { local_scm_udid = (char *)wmem_alloc0(wmem_file_scope(), 18 * sizeof(char)); g_snprintf(local_scm_udid, 18, "%s", tempString ); - expert_add_info_format(pinfo, item, &ei_scmudid_autodetected, "Auto detected payload as SCM UDID [%s].", tempString); + expert_add_info_format(pinfo, item, &ei_scmudid_autodetected, "Auto detected payload as SCM UDID [%s].", local_scm_udid); } } } + else if ( ( db0 ^ OPENSAFETY_MSG_SNMT_EXT_SN_ASSIGNED_ADDITIONAL_SADR) == 0 ) + { + proto_tree_add_uint(snmt_tree, hf_oss_snmt_ext_addsaddr, message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 1, 2, + OSS_FRAME_ADDR_T(message_tvb, frameStart1 + OSS_FRAME_POS_DATA + 1)); + proto_tree_add_uint(snmt_tree, hf_oss_snmt_ext_addtxspdo, message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 3, 2, + OSS_FRAME_ADDR_T(message_tvb, frameStart1 + OSS_FRAME_POS_DATA + 3)); + + col_append_fstr(pinfo->cinfo, COL_INFO, " [0x%04X => 0x%04X]", + OSS_FRAME_ADDR_T(message_tvb, frameStart1 + OSS_FRAME_POS_DATA + 1), + OSS_FRAME_ADDR_T(message_tvb, frameStart1 + OSS_FRAME_POS_DATA + 3)); + } } else if ( (OSS_FRAME_ID_T(message_tvb, frameStart1) ^ OPENSAFETY_MSG_SNMT_SERVICE_REQUEST) == 0 ) { @@ -1576,6 +1624,19 @@ dissect_opensafety_snmt_message(tvbuff_t *message_tvb, packet_info *pinfo , prot proto_tree_add_uint_format_value ( snmt_tree, hf_oss_sod_par_timestamp, message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 1, 4, entry, "0x%08X", entry ); } + else if ( ( db0 ^ OPENSAFETY_MSG_SNMT_EXT_ASSIGN_ADDITIONAL_SADR) == 0 ) + { + proto_tree_add_uint(snmt_tree, hf_oss_snmt_ext_addsaddr, message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 1, 2, + OSS_FRAME_ADDR_T(message_tvb, frameStart1 + OSS_FRAME_POS_DATA + 1)); + + proto_tree_add_uint(snmt_tree, hf_oss_snmt_ext_addtxspdo, message_tvb, OSS_FRAME_POS_DATA + frameStart1 + 3, 2, + OSS_FRAME_ADDR_T(message_tvb, frameStart1 + OSS_FRAME_POS_DATA + 3)); + + col_append_fstr(pinfo->cinfo, COL_INFO, " [0x%04X => 0x%04X]", + OSS_FRAME_ADDR_T(message_tvb, frameStart1 + OSS_FRAME_POS_DATA + 1), + OSS_FRAME_ADDR_T(message_tvb, frameStart1 + OSS_FRAME_POS_DATA + 3)); + } + } } else if ( (OSS_FRAME_ID_T(message_tvb, frameStart1) ^ OPENSAFETY_MSG_SNMT_SADR_ASSIGNED) == 0 ) @@ -2364,6 +2425,15 @@ proto_register_opensafety(void) { &hf_oss_snmt_error_code, { "Error Code", "opensafety.snmt.error_code", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_oss_snmt_param_type, + { "Parameter Request Type", "opensafety.snmt.parameter_type", + FT_BOOLEAN, BASE_NONE, TFS(&opensafety_addparam_request), 0x0, NULL, HFILL } }, + { &hf_oss_snmt_ext_addsaddr, + { "Additional SADDR", "opensafety.snmt.additional.saddr", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + { &hf_oss_snmt_ext_addtxspdo, + { "Additional TxSPDO", "opensafety.snmt.additional.txspdo", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, /* SSDO Specific fields */ { &hf_oss_ssdo_server, @@ -2411,19 +2481,19 @@ proto_register_opensafety(void) FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_oss_ssdo_extpar_parset, - { "Set Nr", "opensafety.ssdo.extpar.setnr", + { "Additional Parameter Set", "opensafety.ssdo.extpar.setnr", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_oss_ssdo_extpar_version, - { "Version", "opensafety.ssdo.extpar.version", + { "Parameter Set Version", "opensafety.ssdo.extpar.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_oss_ssdo_extpar_saddr, - { "SADDR", "opensafety.ssdo.extpar.saddr", + { "Parameter Set for SADDR", "opensafety.ssdo.extpar.saddr", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_oss_ssdo_extpar_length, - { "Set Length", "opensafety.ssdo.extpar.length", + { "Parameter Set Length", "opensafety.ssdo.extpar.length", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_oss_ssdo_extpar_crc, - { "Set CRC", "opensafety.ssdo.extpar.crc", + { "Parameter Set CRC", "opensafety.ssdo.extpar.crc", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_oss_ssdo_extpar_tstamp, { "Timestamp", "opensafety.ssdo.extpar.timestamp", |