diff options
Diffstat (limited to 'epan/dissectors/packet-ff.c')
-rw-r--r-- | epan/dissectors/packet-ff.c | 15316 |
1 files changed, 15316 insertions, 0 deletions
diff --git a/epan/dissectors/packet-ff.c b/epan/dissectors/packet-ff.c new file mode 100644 index 00000000..6d7ae3d5 --- /dev/null +++ b/epan/dissectors/packet-ff.c @@ -0,0 +1,15316 @@ +/* packet-ff.c + * Routines for FF-HSE packet disassembly + * + * FF-588-1.3: HSE Field Device Access Agent + * 6. Field Device Access Agent Interface + * + * (c) Copyright 2008, Yukiyo Akisada <Yukiyo.Akisada@jp.yokogawa.com> + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* + * /etc/services + * --------------------------------------------------------------------- + * ff-annunc 1089/tcp # FF Annunciation + * ff-annunc 1089/udp # FF Annunciation + * ff-fms 1090/tcp # FF Fieldbus Message Specification + * ff-fms 1090/udp # FF Fieldbus Message Specification + * ff-sm 1091/tcp # FF System Management + * ff-sm 1091/udp # FF System Management + * ff-lr-port 3622/tcp # FF LAN Redundancy Port + * ff-lr-port 3622/udp # FF LAN Redundancy Port + * --------------------------------------------------------------------- + */ + +#include "config.h" + +#include <epan/packet.h> +#include "packet-ff.h" +#include "packet-tcp.h" + +#define FDA_MSG_HDR_LENGTH 12 + +void proto_register_ff(void); +void proto_reg_handoff_ff(void); + +static int proto_ff = -1; +static gint ett_ff = -1; + +static gboolean ff_desegment = TRUE; /* desegmentation of FF over TCP */ + +static dissector_handle_t ff_udp_handle; +static dissector_handle_t ff_tcp_handle; + + + +/* + * 6.3. Message Header + */ +static int hf_ff_fda_msg_hdr = -1; + +static int hf_ff_fda_msg_hdr_ver = -1; +static int hf_ff_fda_msg_hdr_fda_addr = -1; +static int hf_ff_fda_msg_hdr_len = -1; +static int hf_ff_unknown_data = -1; +static int hf_ff_data = -1; +static int hf_ff_reserved24 = -1; +static int hf_ff_unknown_service = -1; + +static gint ett_ff_fda_msg_hdr = -1; +static gint ett_ff_fda_msg_hdr_proto_and_type = -1; +static gint ett_ff_fda_msg_hdr_opts = -1; +static gint ett_ff_fda_msg_hdr_srv = -1; + + + +/* + * 6.4. Message Trailer + */ +static int hf_ff_fda_msg_trailer = -1; + +static int hf_ff_fda_msg_trailer_msg_num = -1; +static int hf_ff_fda_msg_trailer_invoke_id = -1; +static int hf_ff_fda_msg_trailer_time_stamp = -1; +static int hf_ff_fda_msg_trailer_extended_control_field = -1; + +static gint ett_ff_fda_msg_trailer = -1; + + + +/* + * 6.5.1 FDA Session Management Services + */ +static int hf_ff_fda = -1; +static int hf_ff_hdr_srv = -1; +static int hf_ff_hdr_srv_confirm_flag = -1; +static int hf_ff_hdr_srv_service_id = -1; +static int hf_ff_hdr_srv_fda_service_id_confirm = -1; +static int hf_ff_hdr_srv_fda_service_id_unconfirm = -1; +static int hf_ff_hdr_srv_sm_service_id_confirm = -1; +static int hf_ff_hdr_srv_sm_service_id_unconfirm = -1; +static int hf_ff_hdr_srv_fms_service_id_confirm = -1; +static int hf_ff_hdr_srv_fms_service_id_unconfirm = -1; +static int hf_ff_hdr_srv_lan_service_id_confirm = -1; +static int hf_ff_hdr_srv_lan_service_id_unconfirm = -1; +static int hf_ff_hdr_proto_id = -1; +static int hf_ff_hdr_confirm_msg_type = -1; +static int hf_ff_hdr_proto_confirm = -1; +static int hf_ff_hdr_opts_msg_num = -1; +static int hf_ff_hdr_opts_invoke_id = -1; +static int hf_ff_hdr_opts_timestamp = -1; +static int hf_ff_hdr_opts_reserved = -1; +static int hf_ff_hdr_opts_ext_ctrl = -1; +static int hf_ff_hdr_opts_pad = -1; +static int hf_ff_hdr_opts = -1; + +/* + * 6.5.1.1. FDA Open Session (Confirmed Service Id = 1) + */ +static int hf_ff_fda_open_sess = -1; + +static int hf_ff_fda_open_sess_req = -1; +static int hf_ff_fda_open_sess_req_sess_idx = -1; +static int hf_ff_fda_open_sess_req_max_buf_siz = -1; +static int hf_ff_fda_open_sess_req_max_msg_len = -1; +static int hf_ff_fda_open_sess_req_reserved = -1; +static int hf_ff_fda_open_sess_req_nma_conf_use = -1; +static int hf_ff_fda_open_sess_req_inactivity_close_time = -1; +static int hf_ff_fda_open_sess_req_transmit_delay_time = -1; +static int hf_ff_fda_open_sess_req_pd_tag = -1; + +static int hf_ff_fda_open_sess_rsp = -1; +static int hf_ff_fda_open_sess_rsp_sess_idx = -1; +static int hf_ff_fda_open_sess_rsp_max_buf_siz = -1; +static int hf_ff_fda_open_sess_rsp_max_msg_len = -1; +static int hf_ff_fda_open_sess_rsp_reserved = -1; +static int hf_ff_fda_open_sess_rsp_nma_conf_use = -1; +static int hf_ff_fda_open_sess_rsp_inactivity_close_time = -1; +static int hf_ff_fda_open_sess_rsp_transmit_delay_time = -1; +static int hf_ff_fda_open_sess_rsp_pd_tag = -1; + +static int hf_ff_fda_open_sess_err = -1; +static int hf_ff_fda_open_sess_err_err_class = -1; +static int hf_ff_fda_open_sess_err_err_code = -1; +static int hf_ff_fda_open_sess_err_additional_code = -1; +static int hf_ff_fda_open_sess_err_additional_desc = -1; + +static gint ett_ff_fda_open_sess_req = -1; +static gint ett_ff_fda_open_sess_rsp = -1; +static gint ett_ff_fda_open_sess_err = -1; + + + +/* + * 6.5.1.2. FDA Idle (Confirmed Service Id = 3) + */ +static int hf_ff_fda_idle = -1; + +static int hf_ff_fda_idle_req = -1; + +static int hf_ff_fda_idle_rsp = -1; + +static int hf_ff_fda_idle_err = -1; +static int hf_ff_fda_idle_err_err_class = -1; +static int hf_ff_fda_idle_err_err_code = -1; +static int hf_ff_fda_idle_err_additional_code = -1; +static int hf_ff_fda_idle_err_additional_desc = -1; + +static gint ett_ff_fda_idle_req = -1; +static gint ett_ff_fda_idle_rsp = -1; +static gint ett_ff_fda_idle_err = -1; + + + +/* + * 6.5.2. SM Services + */ +static int hf_ff_sm = -1; + + + +/* + * 6.5.2.1. SM Find Tag Query (Unconfirmed Service Id = 1) + */ +static int hf_ff_sm_find_tag_query = -1; + +static int hf_ff_sm_find_tag_query_req = -1; +static int hf_ff_sm_find_tag_query_req_query_type = -1; +static int hf_ff_sm_find_tag_query_req_idx = -1; +static int hf_ff_sm_find_tag_query_req_tag = -1; +static int hf_ff_sm_find_tag_query_req_vfd_tag = -1; + +static gint ett_ff_sm_find_tag_query_req = -1; + + + +/* + * 6.5.2.2. SM Find Tag Reply (Unconfirmed Service Id = 2) + */ +static int hf_ff_sm_find_tag_reply = -1; + +static int hf_ff_sm_find_tag_reply_req = -1; +static int hf_ff_sm_find_tag_reply_req_query_type = -1; +static int hf_ff_sm_find_tag_reply_req_h1_node_addr = -1; +static int hf_ff_sm_find_tag_reply_req_fda_addr_link_id = -1; +static int hf_ff_sm_find_tag_reply_req_vfd_ref = -1; +static int hf_ff_sm_find_tag_reply_req_od_idx = -1; +static int hf_ff_sm_find_tag_reply_req_ip_addr = -1; +static int hf_ff_sm_find_tag_reply_req_od_ver = -1; +static int hf_ff_sm_find_tag_reply_req_dev_id = -1; +static int hf_ff_sm_find_tag_reply_req_pd_tag = -1; +static int hf_ff_sm_find_tag_reply_req_reserved = -1; +static int hf_ff_sm_find_tag_reply_req_num_of_fda_addr_selectors = -1; +static int hf_ff_sm_find_tag_reply_req_fda_addr_selector = -1; +static int hf_ff_sm_find_tag_reply_dup_reserved = -1; +static int hf_ff_sm_find_tag_reply_dup_pd_tag = -1; +static int hf_ff_sm_find_tag_reply_dup_device = -1; +static int hf_ff_sm_find_tag_reply_dup = -1; + +static gint ett_ff_sm_find_tag_reply_req = -1; +static gint ett_ff_sm_find_tag_reply_req_dup_detection_state = -1; +static gint ett_ff_sm_find_tag_reply_req_list_of_fda_addr_selectors = -1; + + + +/* + * 6.5.2.3. SM Identify (Confirmed Service Id = 3) + */ +static int hf_ff_sm_id = -1; + +static int hf_ff_sm_id_req = -1; + +static int hf_ff_sm_id_rsp = -1; +static int hf_ff_sm_id_rsp_dev_idx = -1; +static int hf_ff_sm_id_rsp_max_dev_idx = -1; +static int hf_ff_sm_id_rsp_operational_ip_addr = -1; +static int hf_ff_sm_id_rsp_dev_id = -1; +static int hf_ff_sm_id_rsp_pd_tag = -1; +static int hf_ff_sm_id_rsp_hse_repeat_time = -1; +static int hf_ff_sm_id_rsp_lr_port = -1; +static int hf_ff_sm_id_rsp_reserved = -1; +static int hf_ff_sm_id_rsp_annunc_ver_num = -1; +static int hf_ff_sm_id_rsp_hse_dev_ver_num = -1; +static int hf_ff_sm_id_rsp_num_of_entries = -1; +static int hf_ff_sm_id_rsp_h1_live_list_h1_link_id = -1; +static int hf_ff_sm_id_rsp_h1_live_list_reserved = -1; +static int hf_ff_sm_id_rsp_h1_live_list_ver_num = -1; +static int hf_ff_sm_id_rsp_h1_node_addr_ver_num_h1_node_addr = -1; +static int hf_ff_sm_id_rsp_h1_node_addr_ver_num_ver_num = -1; +static int hf_ff_sm_id_rsp_smk_state_name = -1; +static int hf_ff_sm_id_rsp_smk_state_sync = -1; +static int hf_ff_sm_id_rsp_smk_state = -1; +static int hf_ff_sm_id_rsp_dev_type_link = -1; +static int hf_ff_sm_id_rsp_dev_type_iogateway = -1; +static int hf_ff_sm_id_rsp_dev_type_hse = -1; +static int hf_ff_sm_id_rsp_dev_type_h1 = -1; +static int hf_ff_sm_id_rsp_dev_type_reserved = -1; +static int hf_ff_sm_id_rsp_dev_type_redundant_caps = -1; +static int hf_ff_sm_id_rsp_dev_type = -1; +static int hf_ff_sm_id_rsp_dev_redundancy_state_reserved = -1; +static int hf_ff_sm_id_rsp_dev_redundancy_state_role = -1; +static int hf_ff_sm_id_rsp_dev_redundancy_state_type = -1; +static int hf_ff_sm_id_rsp_dev_redundancy_state = -1; +static int hf_ff_sm_id_rsp_dup_detection_state_reserved = -1; +static int hf_ff_sm_id_rsp_dup_detection_state_pd_tag = -1; +static int hf_ff_sm_id_rsp_dup_detection_state_device = -1; +static int hf_ff_sm_id_rsp_dup_detection_state = -1; + +static int hf_ff_sm_id_err = -1; +static int hf_ff_sm_id_err_err_class = -1; +static int hf_ff_sm_id_err_err_code = -1; +static int hf_ff_sm_id_err_additional_code = -1; +static int hf_ff_sm_id_err_additional_desc = -1; + +static gint ett_ff_sm_id_req = -1; +static gint ett_ff_sm_id_rsp = -1; +static gint ett_ff_sm_id_rsp_smk_state = -1; +static gint ett_ff_sm_id_rsp_dev_type = -1; +static gint ett_ff_sm_id_rsp_dev_redundancy_state = -1; +static gint ett_ff_sm_id_rsp_dup_detection_state = -1; +static gint ett_ff_sm_id_rsp_entries_h1_live_list = -1; +static gint ett_ff_sm_id_rsp_h1_live_list = -1; +static gint ett_ff_sm_id_rsp_entries_node_addr = -1; +static gint ett_ff_sm_id_rsp_h1_node_addr = -1; +static gint ett_ff_sm_id_err = -1; + + + +/* + * 6.5.2.4. SM Clear Address (Confirmed Service Id = 12) + */ +static int hf_ff_sm_clear_addr = -1; + +static int hf_ff_sm_clear_addr_req = -1; +static int hf_ff_sm_clear_addr_req_dev_id = -1; +static int hf_ff_sm_clear_addr_req_pd_tag = -1; +static int hf_ff_sm_clear_addr_req_interface_to_clear = -1; + +static int hf_ff_sm_clear_addr_rsp = -1; + +static int hf_ff_sm_clear_addr_err = -1; +static int hf_ff_sm_clear_addr_err_err_class = -1; +static int hf_ff_sm_clear_addr_err_err_code = -1; +static int hf_ff_sm_clear_addr_err_additional_code = -1; +static int hf_ff_sm_clear_addr_err_additional_desc = -1; + +static gint ett_ff_sm_clear_addr_req = -1; +static gint ett_ff_sm_clear_addr_rsp = -1; +static gint ett_ff_sm_clear_addr_err = -1; + + + +/* + * 6.5.2.5. SM Set Assignment Info (Confirmed Service Id = 14) + */ +static int hf_ff_sm_set_assign_info = -1; + +static int hf_ff_sm_set_assign_info_req_dev_redundancy_state_reserved = -1; +static int hf_ff_sm_set_assign_info_req_dev_redundancy_state_role = -1; +static int hf_ff_sm_set_assign_info_req_dev_redundancy_state_type = -1; +static int hf_ff_sm_set_assign_info_req_dev_redundancy_state = -1; +static int hf_ff_sm_set_assign_info_req_clear_dup_detection_state_reserved = -1; +static int hf_ff_sm_set_assign_info_req_clear_dup_detection_state_pd_tag = -1; +static int hf_ff_sm_set_assign_info_req_clear_dup_detection_state_device_index = -1; +static int hf_ff_sm_set_assign_info_req_clear_dup_detection_state = -1; + +static int hf_ff_sm_set_assign_info_req = -1; +static int hf_ff_sm_set_assign_info_req_dev_id = -1; +static int hf_ff_sm_set_assign_info_req_pd_tag = -1; +static int hf_ff_sm_set_assign_info_req_h1_new_addr = -1; +static int hf_ff_sm_set_assign_info_req_lr_port = -1; +static int hf_ff_sm_set_assign_info_req_hse_repeat_time = -1; +static int hf_ff_sm_set_assign_info_req_dev_idx = -1; +static int hf_ff_sm_set_assign_info_req_max_dev_idx = -1; +static int hf_ff_sm_set_assign_info_req_operational_ip_addr = -1; + +static int hf_ff_sm_set_assign_info_rsp = -1; +static int hf_ff_sm_set_assign_info_rsp_reserved = -1; +static int hf_ff_sm_set_assign_info_rsp_max_dev_idx = -1; +static int hf_ff_sm_set_assign_info_rsp_hse_repeat_time = -1; + +static int hf_ff_sm_set_assign_info_err = -1; +static int hf_ff_sm_set_assign_info_err_err_class = -1; +static int hf_ff_sm_set_assign_info_err_err_code = -1; +static int hf_ff_sm_set_assign_info_err_additional_code = -1; +static int hf_ff_sm_set_assign_info_err_additional_desc = -1; + +static gint ett_ff_sm_set_assign_info_req = -1; +static gint ett_ff_sm_set_assign_info_req_dev_redundancy_state = -1; +static gint ett_ff_sm_set_assign_info_req_clear_dup_detection_state = -1; +static gint ett_ff_sm_set_assign_info_rsp = -1; +static gint ett_ff_sm_set_assign_info_err = -1; + + + +/* + * 6.5.2.6. SM Clear Assignment Info (Confirmed Service Id = 15) + */ +static int hf_ff_sm_clear_assign_info = -1; + +static int hf_ff_sm_clear_assign_info_req = -1; +static int hf_ff_sm_clear_assign_info_req_dev_id = -1; +static int hf_ff_sm_clear_assign_info_req_pd_tag = -1; + +static int hf_ff_sm_clear_assign_info_rsp = -1; + +static int hf_ff_sm_clear_assign_info_err = -1; +static int hf_ff_sm_clear_assign_info_err_err_class = -1; +static int hf_ff_sm_clear_assign_info_err_err_code = -1; +static int hf_ff_sm_clear_assign_info_err_additional_code = -1; +static int hf_ff_sm_clear_assign_info_err_additional_desc = -1; + +static gint ett_ff_sm_clear_assign_info_req = -1; +static gint ett_ff_sm_clear_assign_info_rsp = -1; +static gint ett_ff_sm_clear_assign_info_err = -1; + + + +/* + * 6.5.2.7. SM Device Annunciation (Unconfirmed Service Id = 16) + */ +static int hf_ff_sm_dev_annunc = -1; + +static int hf_ff_sm_dev_annunc_req = -1; +static int hf_ff_sm_dev_annunc_req_dev_idx = -1; +static int hf_ff_sm_dev_annunc_req_max_dev_idx = -1; +static int hf_ff_sm_dev_annunc_req_operational_ip_addr = -1; +static int hf_ff_sm_dev_annunc_req_dev_id = -1; +static int hf_ff_sm_dev_annunc_req_pd_tag = -1; +static int hf_ff_sm_dev_annunc_req_hse_repeat_time = -1; +static int hf_ff_sm_dev_annunc_req_lr_port = -1; +static int hf_ff_sm_dev_annunc_req_reserved = -1; +static int hf_ff_sm_dev_annunc_req_annunc_ver_num = -1; +static int hf_ff_sm_dev_annunc_req_hse_dev_ver_num = -1; +static int hf_ff_sm_dev_annunc_req_num_of_entries = -1; +static int hf_ff_sm_dev_annunc_req_h1_live_list_h1_link_id = -1; +static int hf_ff_sm_dev_annunc_req_h1_live_list_reserved = -1; +static int hf_ff_sm_dev_annunc_req_h1_live_list_ver_num = -1; +static int hf_ff_sm_dev_annunc_req_h1_node_addr_ver_num_h1_node_addr = -1; +static int hf_ff_sm_dev_annunc_req_h1_node_addr_ver_num_ver_num = -1; +static int hf_ff_sm_dev_annunc_req_smk_state_name = -1; +static int hf_ff_sm_dev_annunc_req_smk_state_sync = -1; +static int hf_ff_sm_dev_annunc_req_smk_state = -1; +static int hf_ff_sm_dev_annunc_req_dev_type_link = -1; +static int hf_ff_sm_dev_annunc_req_dev_type_iogateway = -1; +static int hf_ff_sm_dev_annunc_req_dev_type_hse = -1; +static int hf_ff_sm_dev_annunc_req_dev_type_h1 = -1; +static int hf_ff_sm_dev_annunc_req_dev_type_reserved = -1; +static int hf_ff_sm_dev_annunc_req_dev_type_redundant_caps = -1; +static int hf_ff_sm_dev_annunc_req_dev_type = -1; +static int hf_ff_sm_dev_annunc_req_dev_redundancy_state_reserved = -1; +static int hf_ff_sm_dev_annunc_req_dev_redundancy_state_role = -1; +static int hf_ff_sm_dev_annunc_req_dev_redundancy_state_type = -1; +static int hf_ff_sm_dev_annunc_req_dev_redundancy_state = -1; +static int hf_ff_sm_dev_annunc_req_dup_detection_state_reserved = -1; +static int hf_ff_sm_dev_annunc_req_dup_detection_state_pd_tag = -1; +static int hf_ff_sm_dev_annunc_req_dup_detection_state_device = -1; +static int hf_ff_sm_dev_annunc_req_dup_detection_state = -1; + +static gint ett_ff_sm_dev_annunc_req = -1; +static gint ett_ff_sm_dev_annunc_req_smk_state = -1; +static gint ett_ff_sm_dev_annunc_req_dev_type = -1; +static gint ett_ff_sm_dev_annunc_req_dev_redundancy_state = -1; +static gint ett_ff_sm_dev_annunc_req_dup_detection_state = -1; +static gint ett_ff_sm_dev_annunc_req_entries_h1_live_list = -1; +static gint ett_ff_sm_dev_annunc_req_h1_live_list = -1; +static gint ett_ff_sm_dev_annunc_req_entries_node_addr = -1; +static gint ett_ff_sm_dev_annunc_req_h1_node_addr = -1; + + + +/* + * 6.5.3. FMS Services + */ +static int hf_ff_fms = -1; + + + +/* + * 6.5.3.2. FMS Initiate (Confirmed Service Id = 96) + */ +static int hf_ff_fms_init = -1; + +static int hf_ff_fms_init_req = -1; +static int hf_ff_fms_init_req_conn_opt = -1; +static int hf_ff_fms_init_req_access_protection_supported_calling = -1; +static int hf_ff_fms_init_req_passwd_and_access_grps_calling = -1; +static int hf_ff_fms_init_req_ver_od_calling = -1; +static int hf_ff_fms_init_req_prof_num_calling = -1; +static int hf_ff_fms_init_req_pd_tag = -1; + +static int hf_ff_fms_init_rsp = -1; +static int hf_ff_fms_init_rsp_ver_od_called = -1; +static int hf_ff_fms_init_rsp_prof_num_called = -1; + +static int hf_ff_fms_init_err = -1; +static int hf_ff_fms_init_err_err_class = -1; +static int hf_ff_fms_init_err_err_code = -1; +static int hf_ff_fms_init_err_additional_code = -1; +static int hf_ff_fms_init_err_additional_desc = -1; + +static gint ett_ff_fms_init_req = -1; +static gint ett_ff_fms_init_rep = -1; +static gint ett_ff_fms_init_err = -1; + + + +/* + * 6.5.3.3. FMS Abort (Unconfirmed Service Id = 112) + */ +static int hf_ff_fms_abort = -1; + +static int hf_ff_fms_abort_req = -1; +static int hf_ff_fms_abort_req_detail = -1; +static int hf_ff_fms_abort_req_abort_id = -1; +static int hf_ff_fms_abort_req_reason_code = -1; +static int hf_ff_fms_abort_req_reserved = -1; + +static gint ett_ff_fms_abort_req = -1; + + + +/* + * 6.5.3.4. FMS Status (Confirmed Service Id = 0) + */ +static int hf_ff_fms_status = -1; + +static int hf_ff_fms_status_req = -1; + +static int hf_ff_fms_status_rsp = -1; +static int hf_ff_fms_status_rsp_logical_status = -1; +static int hf_ff_fms_status_rsp_physical_status = -1; +static int hf_ff_fms_status_rsp_reserved = -1; +static int hf_ff_fms_status_rsp_local_detail = -1; + +static int hf_ff_fms_status_err = -1; +static int hf_ff_fms_status_err_err_class = -1; +static int hf_ff_fms_status_err_err_code = -1; +static int hf_ff_fms_status_err_additional_code = -1; +static int hf_ff_fms_status_err_additional_desc = -1; + +static gint ett_ff_fms_status_req = -1; +static gint ett_ff_fms_status_rsp = -1; +static gint ett_ff_fms_status_err = -1; + + + +/* + * 6.5.3.5. FMS Unsolicited Status (Unconfirmed Service Id = 1) + */ +static int hf_ff_fms_unsolicited_status = -1; + +static int hf_ff_fms_unsolicited_status_req = -1; +static int hf_ff_fms_unsolicited_status_req_logical_status = -1; +static int hf_ff_fms_unsolicited_status_req_physical_status = -1; +static int hf_ff_fms_unsolicited_status_req_reserved = -1; +static int hf_ff_fms_unsolicited_status_req_local_detail = -1; + +static gint ett_ff_fms_unsolicited_status_req = -1; + + + +/* + * 6.5.3.6. FMS Identify (Confirmed Service Id = 1) + */ +static int hf_ff_fms_id = -1; + +static int hf_ff_fms_id_req = -1; + +static int hf_ff_fms_id_rsp = -1; +static int hf_ff_fms_id_rsp_vendor_name = -1; +static int hf_ff_fms_id_rsp_model_name = -1; +static int hf_ff_fms_id_rsp_revision = -1; + +static int hf_ff_fms_id_err = -1; +static int hf_ff_fms_id_err_err_class = -1; +static int hf_ff_fms_id_err_err_code = -1; +static int hf_ff_fms_id_err_additional_code = -1; +static int hf_ff_fms_id_err_additional_desc = -1; + +static gint ett_ff_fms_id_req = -1; +static gint ett_ff_fms_id_rsp = -1; +static gint ett_ff_fms_id_err = -1; + + + +/* + * 6.5.3.7. FMS Get OD (Confirmed Service Id = 4) + */ +static int hf_ff_fms_get_od = -1; + +static int hf_ff_fms_get_od_req = -1; +static int hf_ff_fms_get_od_req_all_attrs = -1; +static int hf_ff_fms_get_od_req_start_idx_flag = -1; +static int hf_ff_fms_get_od_req_reserved = -1; +static int hf_ff_fms_get_od_req_idx = -1; + +static int hf_ff_fms_get_od_rsp = -1; +static int hf_ff_fms_get_od_rsp_more_follows = -1; +static int hf_ff_fms_get_od_rsp_num_of_obj_desc = -1; +static int hf_ff_fms_get_od_rsp_reserved = -1; +static int hf_ff_fms_get_od_rsp_object_descriptions = -1; + +static int hf_ff_fms_get_od_err = -1; +static int hf_ff_fms_get_od_err_err_class = -1; +static int hf_ff_fms_get_od_err_err_code = -1; +static int hf_ff_fms_get_od_err_additional_code = -1; +static int hf_ff_fms_get_od_err_additional_desc = -1; + +static gint ett_ff_fms_get_od_req = -1; +static gint ett_ff_fms_get_od_rsp = -1; +static gint ett_ff_fms_get_od_err = -1; + + + +/* + * 6.5.3.8. FMS Initiate Put OD (Confirmed Service Id = 28) + */ +static int hf_ff_fms_init_put_od = -1; + +static int hf_ff_fms_init_put_od_req = -1; +static int hf_ff_fms_init_put_od_req_reserved = -1; +static int hf_ff_fms_init_put_od_req_consequence = -1; + +static int hf_ff_fms_init_put_od_rsp = -1; + +static int hf_ff_fms_init_put_od_err = -1; +static int hf_ff_fms_init_put_od_err_err_class = -1; +static int hf_ff_fms_init_put_od_err_err_code = -1; +static int hf_ff_fms_init_put_od_err_additional_code = -1; +static int hf_ff_fms_init_put_od_err_additional_desc = -1; + +static gint ett_ff_fms_init_put_od_req = -1; +static gint ett_ff_fms_init_put_od_rsp = -1; +static gint ett_ff_fms_init_put_od_err = -1; + + + +/* + * 6.5.3.9. FMS Put OD (Confirmed Service Id = 29) + */ +static int hf_ff_fms_put_od = -1; + +static int hf_ff_fms_put_od_req = -1; +static int hf_ff_fms_put_od_req_num_of_obj_desc = -1; +static int hf_ff_fms_put_od_req_object_descriptions = -1; + +static int hf_ff_fms_put_od_rsp = -1; + +static int hf_ff_fms_put_od_err = -1; +static int hf_ff_fms_put_od_err_err_class = -1; +static int hf_ff_fms_put_od_err_err_code = -1; +static int hf_ff_fms_put_od_err_additional_code = -1; +static int hf_ff_fms_put_od_err_additional_desc = -1; + +static gint ett_ff_fms_put_od_req = -1; +static gint ett_ff_fms_put_od_rsp = -1; +static gint ett_ff_fms_put_od_err = -1; + + + +/* + * 6.5.3.10. FMS Terminate Put OD (Confirmed Service Id = 30) + */ +static int hf_ff_fms_terminate_put_od = -1; + +static int hf_ff_fms_terminate_put_od_req = -1; + +static int hf_ff_fms_terminate_put_od_rsp = -1; + +static int hf_ff_fms_terminate_put_od_err = -1; +static int hf_ff_fms_terminate_put_od_err_index = -1; +static int hf_ff_fms_terminate_put_od_err_err_class = -1; +static int hf_ff_fms_terminate_put_od_err_err_code = -1; +static int hf_ff_fms_terminate_put_od_err_additional_code = -1; +static int hf_ff_fms_terminate_put_od_err_additional_desc = -1; + +static gint ett_ff_fms_terminate_put_od_req = -1; +static gint ett_ff_fms_terminate_put_od_rsp = -1; +static gint ett_ff_fms_terminate_put_od_err = -1; + + + +/* + * 6.5.3.11. FMS Generic Initiate Download Sequence (Confirmed Service Id = 31) + */ +static int hf_ff_fms_gen_init_download_seq = -1; + +static int hf_ff_fms_gen_init_download_seq_req = -1; +static int hf_ff_fms_gen_init_download_seq_req_idx = -1; + +static int hf_ff_fms_gen_init_download_seq_rsp = -1; + +static int hf_ff_fms_gen_init_download_seq_err = -1; +static int hf_ff_fms_gen_init_download_seq_err_err_class = -1; +static int hf_ff_fms_gen_init_download_seq_err_err_code = -1; +static int hf_ff_fms_gen_init_download_seq_err_additional_code = -1; +static int hf_ff_fms_gen_init_download_seq_err_additional_desc = -1; + +static gint ett_ff_fms_gen_init_download_seq_req = -1; +static gint ett_ff_fms_gen_init_download_seq_rep = -1; +static gint ett_ff_fms_gen_init_download_seq_err = -1; + + + +/* + * 6.5.3.12. FMS Generic Download Segment (Confirmed Service Id = 32) + */ +static int hf_ff_fms_gen_download_seg = -1; + +static int hf_ff_fms_gen_download_seg_req = -1; +static int hf_ff_fms_gen_download_seg_req_idx = -1; +static int hf_ff_fms_gen_download_seg_req_more_follows = -1; +static int hf_ff_fms_gen_download_seg_req_load_data = -1; + +static int hf_ff_fms_gen_download_seg_rsp = -1; + +static int hf_ff_fms_gen_download_seg_err = -1; +static int hf_ff_fms_gen_download_seg_err_err_class = -1; +static int hf_ff_fms_gen_download_seg_err_err_code = -1; +static int hf_ff_fms_gen_download_seg_err_additional_code = -1; +static int hf_ff_fms_gen_download_seg_err_additional_desc = -1; + +static gint ett_ff_fms_gen_download_seg_req = -1; +static gint ett_ff_fms_gen_download_seg_rsp = -1; +static gint ett_ff_fms_gen_download_seg_err = -1; + + + +/* + * 6.5.3.13. FMS Generic Terminate Download Sequence (Confirmed Service Id = 33) + */ +static int hf_ff_fms_gen_terminate_download_seq = -1; + +static int hf_ff_fms_gen_terminate_download_seq_req = -1; +static int hf_ff_fms_gen_terminate_download_seq_req_idx = -1; + +static int hf_ff_fms_gen_terminate_download_seq_rsp = -1; +static int hf_ff_fms_gen_terminate_download_seq_rsp_final_result = -1; + +static int hf_ff_fms_gen_terminate_download_seq_err = -1; +static int hf_ff_fms_gen_terminate_download_seq_err_err_class = -1; +static int hf_ff_fms_gen_terminate_download_seq_err_err_code = -1; +static int hf_ff_fms_gen_terminate_download_seq_err_additional_code = -1; +static int hf_ff_fms_gen_terminate_download_seq_err_additional_desc = -1; + +static gint ett_ff_fms_gen_terminate_download_seq_req = -1; +static gint ett_ff_fms_gen_terminate_download_seq_rsp = -1; +static gint ett_ff_fms_gen_terminate_download_seq_err = -1; + + + +/* + * 6.5.3.14. FMS Initiate Download Sequence (Confirmed Service Id = 9) + */ +static int hf_ff_fms_init_download_seq = -1; + +static int hf_ff_fms_init_download_seq_req = -1; +static int hf_ff_fms_init_download_seq_req_idx = -1; + +static int hf_ff_fms_init_download_seq_rsp = -1; + +static int hf_ff_fms_init_download_seq_err = -1; +static int hf_ff_fms_init_download_seq_err_err_class = -1; +static int hf_ff_fms_init_download_seq_err_err_code = -1; +static int hf_ff_fms_init_download_seq_err_additional_code = -1; +static int hf_ff_fms_init_download_seq_err_additional_desc = -1; + +static gint ett_ff_fms_init_download_seq_req = -1; +static gint ett_ff_fms_init_download_seq_rsp = -1; +static gint ett_ff_fms_init_download_seq_err = -1; + + + +/* + * 6.5.3.15. FMS Download Segment (Confirmed Service Id = 10) + */ +static int hf_ff_fms_download_seg = -1; +static int hf_ff_fms_download_seg_req = -1; +static int hf_ff_fms_download_seg_req_idx = -1; + +static int hf_ff_fms_download_seg_rsp = -1; +static int hf_ff_fms_download_seg_rsp_more_follows = -1; +static int hf_ff_fms_download_seg_rsp_load_data = -1; + +static int hf_ff_fms_download_seg_err = -1; +static int hf_ff_fms_download_seg_err_err_class = -1; +static int hf_ff_fms_download_seg_err_err_code = -1; +static int hf_ff_fms_download_seg_err_additional_code = -1; +static int hf_ff_fms_download_seg_err_additional_desc = -1; + +static gint ett_ff_fms_download_seg_req = -1; +static gint ett_ff_fms_download_seg_rsp = -1; +static gint ett_ff_fms_download_seg_err = -1; + + + +/* + * 6.5.3.16. FMS Terminate Download Sequence (Confirmed Service Id = 11) + */ +static int hf_ff_fms_terminate_download_seq = -1; + +static int hf_ff_fms_terminate_download_seq_req = -1; +static int hf_ff_fms_terminate_download_seq_req_idx = -1; +static int hf_ff_fms_terminate_download_seq_req_final_result = -1; + +static int hf_ff_fms_terminate_download_seq_rsp = -1; + +static int hf_ff_fms_terminate_download_seq_err = -1; +static int hf_ff_fms_terminate_download_seq_err_err_class = -1; +static int hf_ff_fms_terminate_download_seq_err_err_code = -1; +static int hf_ff_fms_terminate_download_seq_err_additional_code = -1; +static int hf_ff_fms_terminate_download_seq_err_additional_desc = -1; + +static gint ett_ff_fms_terminate_download_seq_req = -1; +static gint ett_ff_fms_terminate_download_seq_rsp = -1; +static gint ett_ff_fms_terminate_download_seq_err = -1; + + + +/* + * 6.5.3.17. FMS Initiate Upload Sequence (Confirmed Service Id = 12) + */ +static int hf_ff_fms_init_upload_seq = -1; + +static int hf_ff_fms_init_upload_seq_req = -1; +static int hf_ff_fms_init_upload_seq_req_idx = -1; + +static int hf_ff_fms_init_upload_seq_rsp = -1; + +static int hf_ff_fms_init_upload_seq_err = -1; +static int hf_ff_fms_init_upload_seq_err_err_class = -1; +static int hf_ff_fms_init_upload_seq_err_err_code = -1; +static int hf_ff_fms_init_upload_seq_err_additional_code = -1; +static int hf_ff_fms_init_upload_seq_err_additional_desc = -1; + +static gint ett_ff_fms_init_upload_seq_req = -1; +static gint ett_ff_fms_init_upload_seq_rsp = -1; +static gint ett_ff_fms_init_upload_seq_err = -1; + + + +/* + * 6.5.3.18. FMS Upload Segment (Confirmed Service Id = 13) + */ +static int hf_ff_fms_upload_seg = -1; + +static int hf_ff_fms_upload_seg_req = -1; +static int hf_ff_fms_upload_seg_req_idx = -1; + +static int hf_ff_fms_upload_seg_rsp = -1; +static int hf_ff_fms_upload_seg_rsp_more_follows = -1; +static int hf_ff_fms_upload_seg_rsp_final_result = -1; + +static int hf_ff_fms_upload_seg_err = -1; +static int hf_ff_fms_upload_seg_err_err_class = -1; +static int hf_ff_fms_upload_seg_err_err_code = -1; +static int hf_ff_fms_upload_seg_err_additional_code = -1; +static int hf_ff_fms_upload_seg_err_additional_desc = -1; + +static gint ett_ff_fms_upload_seg_req = -1; +static gint ett_ff_fms_upload_seg_rsp = -1; +static gint ett_ff_fms_upload_seg_err = -1; + + + +/* + * 6.5.3.19. FMS Terminate Upload Sequence (Confirmed Service Id = 14) + */ +static int hf_ff_fms_terminate_upload_seq = -1; + +static int hf_ff_fms_terminate_upload_seq_req = -1; +static int hf_ff_fms_terminate_upload_seq_req_idx = -1; + +static int hf_ff_fms_terminate_upload_seq_rsp = -1; + +static int hf_ff_fms_terminate_upload_seq_err = -1; +static int hf_ff_fms_terminate_upload_seq_err_err_class = -1; +static int hf_ff_fms_terminate_upload_seq_err_err_code = -1; +static int hf_ff_fms_terminate_upload_seq_err_additional_code = -1; +static int hf_ff_fms_terminate_upload_seq_err_additional_desc = -1; + +static gint ett_ff_fms_terminate_upload_seq_req = -1; +static gint ett_ff_fms_terminate_upload_seq_rsp = -1; +static gint ett_ff_fms_terminate_upload_seq_err = -1; + + + +/* + * 6.5.3.20. FMS Request Domain Download (Confirmed Service Id = 15) + */ +static int hf_ff_fms_req_dom_download = -1; + +static int hf_ff_fms_req_dom_download_req = -1; +static int hf_ff_fms_req_dom_download_req_idx = -1; +static int hf_ff_fms_req_dom_download_req_additional_info = -1; + +static int hf_ff_fms_req_dom_download_rsp = -1; + +static int hf_ff_fms_req_dom_download_err = -1; +static int hf_ff_fms_req_dom_download_err_err_class = -1; +static int hf_ff_fms_req_dom_download_err_err_code = -1; +static int hf_ff_fms_req_dom_download_err_additional_code = -1; +static int hf_ff_fms_req_dom_download_err_additional_desc = -1; + +static gint ett_ff_fms_req_dom_download_req = -1; +static gint ett_ff_fms_req_dom_download_rsp = -1; +static gint ett_ff_fms_req_dom_download_err = -1; + + + +/* + * 6.5.3.21. FMS Request Domain Upload (Confirmed Service Id = 16) + */ +static int hf_ff_fms_req_dom_upload = -1; + +static int hf_ff_fms_req_dom_upload_req = -1; +static int hf_ff_fms_req_dom_upload_req_idx = -1; +static int hf_ff_fms_req_dom_upload_req_additional_info = -1; + +static int hf_ff_fms_req_dom_upload_rsp = -1; + +static int hf_ff_fms_req_dom_upload_err = -1; +static int hf_ff_fms_req_dom_upload_err_err_class = -1; +static int hf_ff_fms_req_dom_upload_err_err_code = -1; +static int hf_ff_fms_req_dom_upload_err_additional_code = -1; +static int hf_ff_fms_req_dom_upload_err_additional_desc = -1; + +static gint ett_ff_fms_req_dom_upload_req = -1; +static gint ett_ff_fms_req_dom_upload_rsp = -1; +static gint ett_ff_fms_req_dom_upload_err = -1; + + + +/* + * 6.5.3.22. FMS Create Program Invocation (Confirmed Service Id = 17) + */ +static int hf_ff_fms_create_pi = -1; + +static int hf_ff_fms_create_pi_req = -1; +static int hf_ff_fms_create_pi_req_reusable = -1; +static int hf_ff_fms_create_pi_req_reserved = -1; +static int hf_ff_fms_create_pi_req_num_of_dom_idxes = -1; +static int hf_ff_fms_create_pi_req_dom_idx = -1; + +static int hf_ff_fms_create_pi_rsp = -1; +static int hf_ff_fms_create_pi_rsp_idx = -1; + +static int hf_ff_fms_create_pi_err = -1; +static int hf_ff_fms_create_pi_err_err_class = -1; +static int hf_ff_fms_create_pi_err_err_code = -1; +static int hf_ff_fms_create_pi_err_additional_code = -1; +static int hf_ff_fms_create_pi_err_additional_desc = -1; + +static gint ett_ff_fms_create_pi_req = -1; +static gint ett_ff_fms_create_pi_req_list_of_dom_idxes = -1; +static gint ett_ff_fms_create_pi_rsp = -1; +static gint ett_ff_fms_create_pi_err = -1; + + + +/* + * 6.5.3.23. FMS Delete Program Invocation (Confirmed Service Id = 18) + */ +static int hf_ff_fms_del_pi = -1; +static int hf_ff_fms_del_pi_req = -1; +static int hf_ff_fms_del_pi_req_idx = -1; + +static int hf_ff_fms_del_pi_rsp = -1; + +static int hf_ff_fms_del_pi_err = -1; +static int hf_ff_fms_del_pi_err_err_class = -1; +static int hf_ff_fms_del_pi_err_err_code = -1; +static int hf_ff_fms_del_pi_err_additional_code = -1; +static int hf_ff_fms_del_pi_err_additional_desc = -1; + +static gint ett_ff_fms_del_pi_req = -1; +static gint ett_ff_fms_del_pi_rsp = -1; +static gint ett_ff_fms_del_pi_err = -1; + + + +/* + * 6.5.3.24. FMS Start (Confirmed Service Id = 19) + */ +static int hf_ff_fms_start = -1; +static int hf_ff_fms_start_req = -1; +static int hf_ff_fms_start_req_idx = -1; +static int hf_ff_fms_start_req_execution_argument = -1; + +static int hf_ff_fms_start_rsp = -1; + +static int hf_ff_fms_start_err = -1; +static int hf_ff_fms_start_err_pi_state = -1; +static int hf_ff_fms_start_err_err_class = -1; +static int hf_ff_fms_start_err_err_code = -1; +static int hf_ff_fms_start_err_additional_code = -1; +static int hf_ff_fms_start_err_additional_desc = -1; + +static gint ett_ff_fms_start_req = -1; +static gint ett_ff_fms_start_rsp = -1; +static gint ett_ff_fms_start_err = -1; + + + +/* + * 6.5.3.25. FMS Stop (Confirmed Service Id = 20) + */ +static int hf_ff_fms_stop = -1; + +static int hf_ff_fms_stop_req = -1; +static int hf_ff_fms_stop_req_idx = -1; + +static int hf_ff_fms_stop_rsp = -1; + +static int hf_ff_fms_stop_err = -1; +static int hf_ff_fms_stop_err_pi_state = -1; +static int hf_ff_fms_stop_err_err_class = -1; +static int hf_ff_fms_stop_err_err_code = -1; +static int hf_ff_fms_stop_err_additional_code = -1; +static int hf_ff_fms_stop_err_additional_desc = -1; + +static gint ett_ff_fms_stop_req = -1; +static gint ett_ff_fms_stop_rsp = -1; +static gint ett_ff_fms_stop_err = -1; + + + +/* + * 6.5.3.26. FMS Resume (Confirmed Service Id = 21) + */ +static int hf_ff_fms_resume = -1; +static int hf_ff_fms_resume_req = -1; +static int hf_ff_fms_resume_req_idx = -1; +static int hf_ff_fms_resume_req_execution_argument = -1; + +static int hf_ff_fms_resume_rsp = -1; + +static int hf_ff_fms_resume_err = -1; +static int hf_ff_fms_resume_err_pi_state = -1; +static int hf_ff_fms_resume_err_err_class = -1; +static int hf_ff_fms_resume_err_err_code = -1; +static int hf_ff_fms_resume_err_additional_code = -1; +static int hf_ff_fms_resume_err_additional_desc = -1; + +static gint ett_ff_fms_resume_req = -1; +static gint ett_ff_fms_resume_rsp = -1; +static gint ett_ff_fms_resume_err = -1; + + + +/* + * 6.5.3.27. FMS Reset (Confirmed Service Id = 22) + */ +static int hf_ff_fms_reset = -1; +static int hf_ff_fms_reset_req = -1; +static int hf_ff_fms_reset_req_idx = -1; + +static int hf_ff_fms_reset_rsp = -1; + +static int hf_ff_fms_reset_err = -1; +static int hf_ff_fms_reset_err_pi_state = -1; +static int hf_ff_fms_reset_err_err_class = -1; +static int hf_ff_fms_reset_err_err_code = -1; +static int hf_ff_fms_reset_err_additional_code = -1; +static int hf_ff_fms_reset_err_additional_desc = -1; + +static gint ett_ff_fms_reset_req = -1; +static gint ett_ff_fms_reset_rsp = -1; +static gint ett_ff_fms_reset_err = -1; + + + +/* + * 6.5.3.28. FMS Kill (Confirmed Service Id = 23) + */ +static int hf_ff_fms_kill = -1; +static int hf_ff_fms_kill_req = -1; +static int hf_ff_fms_kill_req_idx = -1; + +static int hf_ff_fms_kill_rsp = -1; + +static int hf_ff_fms_kill_err = -1; +static int hf_ff_fms_kill_err_err_class = -1; +static int hf_ff_fms_kill_err_err_code = -1; +static int hf_ff_fms_kill_err_additional_code = -1; +static int hf_ff_fms_kill_err_additional_desc = -1; + +static gint ett_ff_fms_kill_req = -1; +static gint ett_ff_fms_kill_rsp = -1; +static gint ett_ff_fms_kill_err = -1; + + + +/* + * 6.5.3.29. FMS Read (Confirmed Service Id = 2) + */ +static int hf_ff_fms_read = -1; + +static int hf_ff_fms_read_req = -1; +static int hf_ff_fms_read_req_idx = -1; + +static int hf_ff_fms_read_rsp = -1; + +static int hf_ff_fms_read_err = -1; +static int hf_ff_fms_read_err_err_class = -1; +static int hf_ff_fms_read_err_err_code = -1; +static int hf_ff_fms_read_err_additional_code = -1; +static int hf_ff_fms_read_err_additional_desc = -1; + +static gint ett_ff_fms_read_req = -1; +static gint ett_ff_fms_read_rsp = -1; +static gint ett_ff_fms_read_err = -1; + + + +/* + * 6.5.3.30. FMS Read with Subindex (Confirmed Service Id = 82) + */ +static int hf_ff_fms_read_with_subidx = -1; + +static int hf_ff_fms_read_with_subidx_req = -1; +static int hf_ff_fms_read_with_subidx_req_idx = -1; +static int hf_ff_fms_read_with_subidx_req_subidx = -1; + +static int hf_ff_fms_read_with_subidx_rsp = -1; + +static int hf_ff_fms_read_with_subidx_err = -1; +static int hf_ff_fms_read_with_subidx_err_err_class = -1; +static int hf_ff_fms_read_with_subidx_err_err_code = -1; +static int hf_ff_fms_read_with_subidx_err_additional_code = -1; +static int hf_ff_fms_read_with_subidx_err_additional_desc = -1; + +static gint ett_ff_fms_read_with_subidx_req = -1; +static gint ett_ff_fms_read_with_subidx_rsp = -1; +static gint ett_ff_fms_read_with_subidx_err = -1; + + + +/* + * 6.5.3.31. FMS Write (Confirmed Service Id = 3) + */ +static int hf_ff_fms_write = -1; +static int hf_ff_fms_write_req = -1; +static int hf_ff_fms_write_req_idx = -1; + +static int hf_ff_fms_write_rsp = -1; + +static int hf_ff_fms_write_err = -1; +static int hf_ff_fms_write_err_err_class = -1; +static int hf_ff_fms_write_err_err_code = -1; +static int hf_ff_fms_write_err_additional_code = -1; +static int hf_ff_fms_write_err_additional_desc = -1; + +static gint ett_ff_fms_write_req = -1; +static gint ett_ff_fms_write_rsp = -1; +static gint ett_ff_fms_write_err = -1; + + + +/* + * 6.5.3.32. FMS Write with Subindex (Confirmed Service Id = 83) + */ +static int hf_ff_fms_write_with_subidx = -1; + +static int hf_ff_fms_write_with_subidx_req = -1; +static int hf_ff_fms_write_with_subidx_req_idx = -1; +static int hf_ff_fms_write_with_subidx_req_subidx = -1; + +static int hf_ff_fms_write_with_subidx_rsp = -1; + +static int hf_ff_fms_write_with_subidx_err = -1; +static int hf_ff_fms_write_with_subidx_err_err_class = -1; +static int hf_ff_fms_write_with_subidx_err_err_code = -1; +static int hf_ff_fms_write_with_subidx_err_additional_code = -1; +static int hf_ff_fms_write_with_subidx_err_additional_desc = -1; + +static gint ett_ff_fms_write_with_subidx_req = -1; +static gint ett_ff_fms_write_with_subidx_rsp = -1; +static gint ett_ff_fms_write_with_subidx_err = -1; + + + +/* + * 6.5.3.33. FMS Define Variable List (Confirmed Service Id = 7) + */ +static int hf_ff_fms_def_variable_list = -1; + +static int hf_ff_fms_def_variable_list_req = -1; +static int hf_ff_fms_def_variable_list_req_num_of_idxes = -1; +static int hf_ff_fms_def_variable_list_req_idx = -1; + +static int hf_ff_fms_def_variable_list_rsp = -1; +static int hf_ff_fms_def_variable_list_rsp_idx = -1; + +static int hf_ff_fms_def_variable_list_err = -1; +static int hf_ff_fms_def_variable_list_err_err_class = -1; +static int hf_ff_fms_def_variable_list_err_err_code = -1; +static int hf_ff_fms_def_variable_list_err_additional_code = -1; +static int hf_ff_fms_def_variable_list_err_additional_desc = -1; + +static gint ett_ff_fms_def_variable_list_req = -1; +static gint ett_ff_fms_def_variable_list_req_list_of_idxes = -1; +static gint ett_ff_fms_def_variable_list_rsp = -1; +static gint ett_ff_fms_def_variable_list_err = -1; + + + +/* + * 6.5.3.34. FMS Delete Variable List (Confirmed Service Id = 8) + */ +static int hf_ff_fms_del_variable_list = -1; + +static int hf_ff_fms_del_variable_list_req = -1; +static int hf_ff_fms_del_variable_list_req_idx = -1; + +static int hf_ff_fms_del_variable_list_rsp = -1; + +static int hf_ff_fms_del_variable_list_err = -1; +static int hf_ff_fms_del_variable_list_err_err_class = -1; +static int hf_ff_fms_del_variable_list_err_err_code = -1; +static int hf_ff_fms_del_variable_list_err_additional_code = -1; +static int hf_ff_fms_del_variable_list_err_additional_desc = -1; + +static gint ett_ff_fms_del_variable_list_req = -1; +static gint ett_ff_fms_del_variable_list_rsp = -1; +static gint ett_ff_fms_del_variable_list_err = -1; + + + +/* + * 6.5.3.35. FMS Information Report (Unconfirmed Service Id = 0) + */ +static int hf_ff_fms_info_report = -1; + +static int hf_ff_fms_info_report_req = -1; +static int hf_ff_fms_info_report_req_idx = -1; + +static gint ett_ff_fms_info_report_req = -1; + + + +/* + * 6.5.3.36. FMS Information Report with Subindex (Unconfirmed Service Id = 16) + */ +static int hf_ff_fms_info_report_with_subidx = -1; + +static int hf_ff_fms_info_report_with_subidx_req = -1; +static int hf_ff_fms_info_report_with_subidx_req_idx = -1; +static int hf_ff_fms_info_report_with_subidx_req_subidx = -1; + +static gint ett_ff_fms_info_report_with_subidx_req = -1; + + + +/* + * 6.5.3.37. FMS Information Report On Change (Unconfirmed Service Id = 17) + */ +static int hf_ff_fms_info_report_on_change = -1; + +static int hf_ff_fms_info_report_on_change_req = -1; +static int hf_ff_fms_info_report_on_change_req_idx = -1; + +static gint ett_ff_fms_info_report_on_change_req = -1; + + + +/* + * 6.5.3.38. FMS Information Report On Change with Subindex + * (Unconfirmed Service Id = 18) + */ +static int hf_ff_fms_info_report_on_change_with_subidx = -1; + +static int hf_ff_fms_info_report_on_change_with_subidx_req = -1; +static int hf_ff_fms_info_report_on_change_with_subidx_req_idx = -1; +static int hf_ff_fms_info_report_on_change_with_subidx_req_subidx = -1; + +static gint ett_ff_fms_info_report_on_change_with_subidx_req = -1; + + + +/* + * 6.5.3.39. FMS Event Notification (Unconfirmed Service Id = 2) + */ +static int hf_ff_fms_ev_notification = -1; + +static int hf_ff_fms_ev_notification_req = -1; +static int hf_ff_fms_ev_notification_req_idx = -1; +static int hf_ff_fms_ev_notification_req_ev_num = -1; + +static gint ett_ff_fms_ev_notification_req = -1; + + + +/* + * 6.5.3.40. FMS Alter Event Condition Monitoring (Confirmed Service Id = 24) + */ +static int hf_ff_fms_alter_ev_condition_monitoring = -1; + +static int hf_ff_fms_alter_ev_condition_monitoring_req = -1; +static int hf_ff_fms_alter_ev_condition_monitoring_req_idx = -1; +static int hf_ff_fms_alter_ev_condition_monitoring_req_enabled = -1; + +static int hf_ff_fms_alter_ev_condition_monitoring_rsp = -1; + +static int hf_ff_fms_alter_ev_condition_monitoring_err = -1; +static int hf_ff_fms_alter_ev_condition_monitoring_err_err_class = -1; +static int hf_ff_fms_alter_ev_condition_monitoring_err_err_code = -1; +static int hf_ff_fms_alter_ev_condition_monitoring_err_additional_code = -1; +static int hf_ff_fms_alter_ev_condition_monitoring_err_additional_desc = -1; + +static gint ett_ff_fms_alter_ev_condition_monitoring_req = -1; +static gint ett_ff_fms_alter_ev_condition_monitoring_rsp = -1; +static gint ett_ff_fms_alter_ev_condition_monitoring_err = -1; + + + +/* + * 6.5.3.41. FMS Acknowledge Event Notification (Confirmed Service Id = 25) + */ +static int hf_ff_fms_ack_ev_notification = -1; + +static int hf_ff_fms_ack_ev_notification_req = -1; +static int hf_ff_fms_ack_ev_notification_req_idx = -1; +static int hf_ff_fms_ack_ev_notification_req_ev_num = -1; + +static int hf_ff_fms_ack_ev_notification_rsp = -1; + +static int hf_ff_fms_ack_ev_notification_err = -1; +static int hf_ff_fms_ack_ev_notification_err_err_class = -1; +static int hf_ff_fms_ack_ev_notification_err_err_code = -1; +static int hf_ff_fms_ack_ev_notification_err_additional_code = -1; +static int hf_ff_fms_ack_ev_notification_err_additional_desc = -1; + +static gint ett_ff_fms_ack_ev_notification_req = -1; +static gint ett_ff_fms_ack_ev_notification_rsp = -1; +static gint ett_ff_fms_ack_ev_notification_err = -1; + + + +/* + * 6.5.4. LAN Redundancy Services + */ +static int hf_ff_lr = -1; + + + +/* + * 6.5.4.1. LAN Redundancy Get Information (Confirmed Service Id = 1) + */ +static int hf_ff_lr_get_info = -1; + +static int hf_ff_lr_get_info_req = -1; + +static int hf_ff_lr_get_info_rsp = -1; +static int hf_ff_lr_get_info_rsp_lr_attrs_ver = -1; +static int hf_ff_lr_get_info_rsp_lr_max_msg_num_diff = -1; +static int hf_ff_lr_get_info_rsp_reserved = -1; +static int hf_ff_lr_get_info_rsp_diagnostic_msg_intvl = -1; +static int hf_ff_lr_get_info_rsp_aging_time = -1; +static int hf_ff_lr_get_info_rsp_diagnostic_msg_if_a_send_addr = -1; +static int hf_ff_lr_get_info_rsp_diagnostic_msg_if_a_recv_addr = -1; +static int hf_ff_lr_get_info_rsp_diagnostic_msg_if_b_send_addr = -1; +static int hf_ff_lr_get_info_rsp_diagnostic_msg_if_b_recv_addr = -1; +static int hf_ff_lr_get_info_rsp_lr_flags_reserved = -1; +static int hf_ff_lr_get_info_rsp_lr_flags_load_balance = -1; +static int hf_ff_lr_get_info_rsp_lr_flags_diag = -1; +static int hf_ff_lr_get_info_rsp_lr_flags_multi_recv = -1; +static int hf_ff_lr_get_info_rsp_lr_flags_cross_cable = -1; +static int hf_ff_lr_get_info_rsp_lr_flags_multi_trans = -1; +static int hf_ff_lr_get_info_rsp_lr_flags = -1; + +static int hf_ff_lr_get_info_err = -1; +static int hf_ff_lr_get_info_err_err_class = -1; +static int hf_ff_lr_get_info_err_err_code = -1; +static int hf_ff_lr_get_info_err_additional_code = -1; +static int hf_ff_lr_get_info_err_additional_desc = -1; + +static gint ett_ff_lr_get_info_req = -1; +static gint ett_ff_lr_get_info_rsp = -1; +static gint ett_ff_lr_get_info_rsp_lr_flags = -1; +static gint ett_ff_lr_get_info_err = -1; + + + +/* + * 6.5.4.2. LAN Redundancy Put Information (Confirmed Service Id = 2) + */ +static int hf_ff_lr_put_info = -1; + +static int hf_ff_lr_put_info_req = -1; +static int hf_ff_lr_put_info_req_lr_attrs_ver = -1; +static int hf_ff_lr_put_info_req_lr_max_msg_num_diff = -1; +static int hf_ff_lr_put_info_req_reserved = -1; +static int hf_ff_lr_put_info_req_diagnostic_msg_intvl = -1; +static int hf_ff_lr_put_info_req_aging_time = -1; +static int hf_ff_lr_put_info_req_diagnostic_msg_if_a_send_addr = -1; +static int hf_ff_lr_put_info_req_diagnostic_msg_if_a_recv_addr = -1; +static int hf_ff_lr_put_info_req_diagnostic_msg_if_b_send_addr = -1; +static int hf_ff_lr_put_info_req_diagnostic_msg_if_b_recv_addr = -1; +static int hf_ff_lr_put_info_req_lr_flags_reserved = -1; +static int hf_ff_lr_put_info_req_lr_flags_load_balance = -1; +static int hf_ff_lr_put_info_req_lr_flags_diag = -1; +static int hf_ff_lr_put_info_req_lr_flags_multi_recv = -1; +static int hf_ff_lr_put_info_req_lr_flags_cross_cable = -1; +static int hf_ff_lr_put_info_req_lr_flags_multi_trans = -1; +static int hf_ff_lr_put_info_req_lr_flags = -1; + +static int hf_ff_lr_put_info_rsp = -1; +static int hf_ff_lr_put_info_rsp_lr_attrs_ver = -1; +static int hf_ff_lr_put_info_rsp_lr_max_msg_num_diff = -1; +static int hf_ff_lr_put_info_rsp_reserved = -1; +static int hf_ff_lr_put_info_rsp_diagnostic_msg_intvl = -1; +static int hf_ff_lr_put_info_rsp_aging_time = -1; +static int hf_ff_lr_put_info_rsp_diagnostic_msg_if_a_send_addr = -1; +static int hf_ff_lr_put_info_rsp_diagnostic_msg_if_a_recv_addr = -1; +static int hf_ff_lr_put_info_rsp_diagnostic_msg_if_b_send_addr = -1; +static int hf_ff_lr_put_info_rsp_diagnostic_msg_if_b_recv_addr = -1; +static int hf_ff_lr_put_info_rsp_lr_flags_reserved = -1; +static int hf_ff_lr_put_info_rsp_lr_flags_load_balance = -1; +static int hf_ff_lr_put_info_rsp_lr_flags_diag = -1; +static int hf_ff_lr_put_info_rsp_lr_flags_multi_recv = -1; +static int hf_ff_lr_put_info_rsp_lr_flags_cross_cable = -1; +static int hf_ff_lr_put_info_rsp_lr_flags_multi_trans = -1; +static int hf_ff_lr_put_info_rsp_lr_flags = -1; + +static int hf_ff_lr_put_info_err = -1; +static int hf_ff_lr_put_info_err_err_class = -1; +static int hf_ff_lr_put_info_err_err_code = -1; +static int hf_ff_lr_put_info_err_additional_code = -1; +static int hf_ff_lr_put_info_err_additional_desc = -1; + +static gint ett_ff_lr_put_info_req = -1; +static gint ett_ff_lr_put_info_req_lr_flags = -1; +static gint ett_ff_lr_put_info_rsp = -1; +static gint ett_ff_lr_put_info_rsp_lr_flags = -1; +static gint ett_ff_lr_put_info_err = -1; + + + +/* + * 6.5.4.3. LAN Redundancy Get Statistics (Confirmed Service Id = 3) + */ +static int hf_ff_lr_get_statistics = -1; + +static int hf_ff_lr_get_statistics_req = -1; + +static int hf_ff_lr_get_statistics_rsp = -1; +static int hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_recv_a = -1; +static int hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_miss_a = -1; +static int hf_ff_lr_get_statistics_rsp_num_rem_dev_diag_recv_fault_a = -1; +static int hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_recv_b = -1; +static int hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_miss_b = -1; +static int hf_ff_lr_get_statistics_rsp_num_rem_dev_diag_recv_fault_b = -1; +static int hf_ff_lr_get_statistics_rsp_num_x_cable_stat = -1; +static int hf_ff_lr_get_statistics_rsp_x_cable_stat = -1; + +static int hf_ff_lr_get_statistics_err = -1; +static int hf_ff_lr_get_statistics_err_err_class = -1; +static int hf_ff_lr_get_statistics_err_err_code = -1; +static int hf_ff_lr_get_statistics_err_additional_code = -1; +static int hf_ff_lr_get_statistics_err_additional_desc = -1; + +static gint ett_ff_lr_get_statistics_req = -1; +static gint ett_ff_lr_get_statistics_rsp = -1; +static gint ett_ff_lr_get_statistics_rsp_list_of_x_cable_stat = -1; +static gint ett_ff_lr_get_statistics_err = -1; + + + +/* + * 6.5.4.4. Diagnostic Message (Unconfirmed Service Id = 1) + */ +static int hf_ff_lr_diagnostic_msg = -1; + +static int hf_ff_lr_diagnostic_msg_req = -1; +static int hf_ff_lr_diagnostic_msg_req_dev_idx = -1; +static int hf_ff_lr_diagnostic_msg_req_num_of_network_ifs = -1; +static int hf_ff_lr_diagnostic_msg_req_transmission_if = -1; +static int hf_ff_lr_diagnostic_msg_req_diagnostic_msg_intvl = -1; +static int hf_ff_lr_diagnostic_msg_req_pd_tag = -1; +static int hf_ff_lr_diagnostic_msg_req_reserved = -1; +static int hf_ff_lr_diagnostic_msg_req_num_of_if_statuses = -1; +static int hf_ff_lr_diagnostic_msg_req_if_a_to_a_status = -1; +static int hf_ff_lr_diagnostic_msg_req_if_b_to_a_status = -1; +static int hf_ff_lr_diagnostic_msg_req_if_a_to_b_status = -1; +static int hf_ff_lr_diagnostic_msg_req_if_b_to_b_status = -1; +static int hf_ff_lr_diagnostic_msg_req_dup_detection_state_reserved = -1; +static int hf_ff_lr_diagnostic_msg_req_dup_detection_state_pd_tag = -1; +static int hf_ff_lr_diagnostic_msg_req_dup_detection_state_device = -1; +static int hf_ff_lr_diagnostic_msg_req_dup_detection_state = -1; + +static gint ett_ff_lr_diagnostic_msg_req = -1; +static gint ett_ff_lr_diagnostic_msg_req_dup_detection_stat = -1; +static gint ett_ff_lr_diagnostic_msg_req_a_to_a_status = -1; +static gint ett_ff_lr_diagnostic_msg_req_b_to_a_status = -1; +static gint ett_ff_lr_diagnostic_msg_req_a_to_b_status = -1; +static gint ett_ff_lr_diagnostic_msg_req_b_to_b_status = -1; + + + +#if 0 +static const value_string names_pad_len[] = { + { 0x00, "No padding" }, + { OPTION_PAD_4BYTE, "pad to 4 byte boundary" }, + { OPTION_PAD_8BYTE, "pad to 8 byte boundary" }, + { 0, NULL } +}; +#endif + + +static const value_string names_proto[] = { + { 0x00, "Unused"}, + { 0x01, "FDA Session Management" }, + { 0x02, "SM" }, + { 0x03, "FMS" }, + { 0x04, "LAN Redundancy" }, + { 0, NULL } +}; + + + +static const value_string names_type[] = { + { TYPE_REQUEST, "Request Message" }, + { TYPE_RESPONSE, "Response Message" }, + { TYPE_ERROR, "Error Message" }, + { 0, NULL } +}; + + + +static const value_string names_nma_conf_use[] = { + { 0, "NMA Configuration Not Permitted" }, + { 1, "NMA Configuration Permitted" }, + { 0, NULL } +}; + + + +static const value_string names_query_type[] = { + { 0, "PD Tag query for primary device" }, + { 1, "VFD tag query" }, + { 2, "Function-Block tag query" }, + { 3, "Element Id query" }, + { 4, "PD Tag/VFD Reference query" }, + { 5, "Device Index query" }, + { 6, "PD Tag query for secondary or member of redundant set" }, + { 0, NULL } +}; + + + +static const value_string names_smk_state[] = { + /* Bits 2-8 */ + { 0x01, "NO_TAG" }, /* 0000 0010 */ + { 0x02, "OPERATIONAL" }, /* 0000 0100 */ + { 0, NULL } +}; + + + +static const value_string names_dev_type[] = { + { 0x00, "Type D-1 Device" }, /* 0000 0000 */ + { 0x01, "Type D-2 Device" }, /* 0000 0001 */ + { 0x02, "Type D-3 Device" }, /* 0000 0010 */ + { 0x03, "Type D-3 and Type D-2 Device" }, /* 0000 0011 */ + { 0x04, "Not used" }, /* 0000 0100 */ + { 0x05, "Type D-2 and Type D-1 Device" }, /* 0000 0101 */ + { 0x06, "Type D-3 and Type D-1 Device" }, /* 0000 0110 */ + { 0x07, "Type D-3 and D-2 and Type D-1 Device" }, /* 0000 0111 */ + { 0, NULL } +}; + + + +static const value_string names_dev_redundancy_role[] = { + /* Bits 3 & 4*/ + { 0x00, "Non-redundant" }, /* 0000 0000 */ + { 0x01, "Primary" }, /* 0000 0100 */ + { 0x02, "Secondary" }, /* 0000 1000 */ + { 0, NULL } +}; + + + +static const value_string names_assigned_redundant_dev_type[] = { + { 0x00, "Non-redundant" }, /* 0000 0000 */ + { 0x01, "Type D-2 Device" }, /* 0000 0001 */ + { 0x02, "Type D-3 Device" }, /* 0000 0010 */ + { 0, NULL } +}; + + + +static const value_string names_type_d2_dev_redundancy_role[] = { + /* Bits 3 & 4*/ + { 0x00, "Non-redundant" }, /* 0000 0000 */ + { 0x01, "Type D-2 Device Primary" }, /* 0000 0100 */ + { 0x02, "Type D-2 Device Secondary" }, /* 0000 1000 */ + { 0, NULL } +}; + + + +static const value_string names_conn_opt[] = { + { 1, "VCR Selector" }, + { 2, "NMA Access" }, + { 3, "FBAP Access" }, + { 0, NULL } +}; + + + +static const value_string names_fda_unconfirmed[] = { + { 0, NULL } +}; + + + +static const value_string names_fda_confirmed[] = { + { FDA_OPEN_SESSION, "FDA Open Session" }, + { FDA_IDLE, "FDA Idle" }, + { 0, NULL } +}; + + + +static const value_string names_sm_unconfirmed[] = { + { HSE_SM_FIND_TAG_QUERY, "SM Find Tag Query" }, + { HSE_SM_FIND_TAG_REPLY, "SM Find Tag Reply" }, + { HSE_SM_DEVICE_ANNUNCIATION, "SM Device Annunciation" }, + { 0, NULL } +}; + + + +static const value_string names_sm_confirmed[] = { + { HSE_SM_IDENTIFY, "SM Identify" }, + { HSE_SM_CLEAR_ADDRESS, "SM Clear Address" }, + { HSE_SM_SET_ASSIGNMENT, "SM Set Assignment Info" }, + { HSE_SM_CLEAR_ASSIGNMENT, "SM Clear Assignment Info" }, + { 0, NULL } +}; + + + +static const value_string names_fms_unconfirmed[] = { + { HSE_FMS_INFORMATION_REPORT, "FMS Information Report" }, + { HSE_FMS_UNSOLICITED_STATUS, "FMS Unsolicited Status" }, + { HSE_FMS_EVENT_NOTIFICATION, "FMS Event Notification" }, + { HSE_FMS_INFORMATION_REPORT_WITH_SUBINDEX, + "FMS Information Report with Subindex" }, + { HSE_FMS_INFORMATION_REPORT_ON_CHANGE, + "FMS Information Report On Change" }, + { HSE_FMS_INFORMATION_REPORT_ON_CHANGE_WITH_SUBINDEX, + "FMS Information Report On Change with Subindex" }, + { HSE_FMS_ABORT, "FMS Abort" }, + { 0, NULL } +}; + + + +static const value_string names_fms_confirmed[] = { + { HSE_FMS_STATUS, "FMS Status" }, + { HSE_FMS_IDENTIFY, "FMS Identify" }, + { HSE_FMS_READ, "FMS Read" }, + { HSE_FMS_WRITE, "FMS Write" }, + { HSE_FMS_GET_OD, "FMS Get OD" }, + { HSE_FMS_DEFINE_VARIABLE_LIST, "FMS Define Variable List" }, + { HSE_FMS_DELETE_VARIABLE_LIST, "FMS Delete Variable List" }, + { HSE_FMS_INITIATE_DOWNLOAD_SEQUENCE, "FMS Initiate Download Sequence" }, + { HSE_FMS_DOWNLOAD_SEGMENT, "FMS Download Segment" }, + { HSE_FMS_TERMINATE_DOWNLOAD_SEQUENCE, "FMS Terminate Download Sequence" }, + { HSE_FMS_INITIATE_UPLOAD_SEQUENCE, "FMS Initiate Upload Sequence" }, + { HSE_FMS_UPLOAD_SEGMENT, "FMS Upload Segment" }, + { HSE_FMS_TERMINATE_UPLOAD_SEQUENCE, "FMS Terminate Upload Sequence" }, + { HSE_FMS_REQUEST_DOMAIN_DOWNLOAD, "FMS Request Domain Download" }, + { HSE_FMS_REQUEST_DOMAIN_UPLOAD, "FMS Request Domain Upload" }, + { HSE_FMS_CREATE_PROGRAM_INVOCATION, "FMS Create Program Invocation" }, + { HSE_FMS_DELETE_PROGRAM_INVOCATION, "FMS Delete Program Invocation" }, + { HSE_FMS_START, "FMS Start" }, + { HSE_FMS_STOP, "FMS Stop" }, + { HSE_FMS_RESUME, "FMS Resume" }, + { HSE_FMS_RESET, "FMS Reset" }, + { HSE_FMS_KILL, "FMS Kill" }, + { HSE_FMS_ALTER_EVENT_CONDITION_MONITORING, + "FMS Alter Event Condition Monitoring" }, + { HSE_FMS_ACKNOWLEDGE_EVENT_NOTIFICATION, + "FMS Acknowledge Event Notification" }, + { HSE_FMS_INITIATE_PUT_OD, "FMS Initiate Put OD" }, + { HSE_FMS_PUT_OD, "FMS Put OD" }, + { HSE_FMS_TERMINATE_PUT_OD, "FMS Terminate Put OD" }, + { HSE_FMS_GENERIC_INITIATE_DOWNLOAD_SEQUENCE, + "FMS Generic Initiate Download Sequence" }, + { HSE_FMS_GENERIC_DOWNLOAD_SEGMENT, "FMS Generic Download Segment" }, + { HSE_FMS_GENERIC_TERMINATE_DOWNLOAD_SEQUENCE, + "FMS Generic Terminate Download Sequence" }, + { HSE_FMS_READ_WITH_SUBINDEX, "FMS Read with Subindex" }, + { HSE_FMS_WRITE_WITH_SUBINDEX, "FMS Write with Subindex" }, + { HSE_FMS_INITIATE, "FMS Initiate" }, + { 0, NULL } +}; +static value_string_ext names_fms_confirmed_ext = VALUE_STRING_EXT_INIT(names_fms_confirmed); + + +static const value_string names_lan_unconfirmed[] = { + { LAN_DIAG, "Diagnostic Message" }, + { 0, NULL } +}; + + + +static const value_string names_lan_confirmed[] = { + { LAN_GET_INFO, "LAN Redundancy Get Information" }, + { LAN_PUT_INFO, "LAN Redundancy Put Information" }, + { LAN_GET_STATISTICS, "LAN Redundancy Get Statistics" }, + { 0, NULL } +}; + + + +static const value_string names_transmission_interface[] = { + { 0, "Interface A" }, + { 1, "Interface B" }, + { 0, NULL } +}; + + + +static const value_string names_err_class[] = { + { 1, "vfd state" }, + { 2, "application reference" }, + { 3, "definition" }, + { 4, "resource" }, + { 5, "service" }, + { 6, "access" }, + { 7, "od" }, + { 8, "other" }, + { 9, "reject" }, + { 10, "h1 sm reason code" }, + { 11, "fms initiate" }, + { 0, NULL } +}; +static value_string_ext names_err_class_ext = VALUE_STRING_EXT_INIT(names_err_class); + + +static const value_string names_err_code_vfd_state[] = { + { 0, "other" }, + { 0, NULL } +}; + + + +static const value_string names_err_code_appl_ref[] = { + { 0, "other" }, + { 1, "object undefined" }, + { 2, "object attributes inconsistent" }, + { 3, "name already exists" }, + { 0, NULL } +}; + + + +static const value_string names_err_code_def[] = { + { 0, "other" }, + { 1, "application unreachable" }, + { 0, NULL } +}; + + + +static const value_string names_err_code_res[] = { + { 0, "other" }, + { 1, "memory unavailable" }, + { 2, "max outstanding requests per session exceeded" }, + { 3, "max sessions exceeded" }, + { 4, "object creation failure" }, + { 0, NULL } +}; + + + +static const value_string names_err_code_srv[] = { + { 0, "other" }, + { 1, "object state conflict" }, + { 2, "pdu size" }, + { 3, "object constraint conflict" }, + { 4, "parameter inconsistent" }, + { 5, "illegal parameter" }, + { 6, "unsupported service" }, + { 7, "unsupported version" }, + { 8, "invalid options" }, + { 9, "unsupported protocol" }, + { 10, "reserved" }, + { 11, "key parameter mismatch" }, + { 12, "assignments already made" }, + { 13, "unsupported device redundancy state" }, + { 14, "response time-out" }, + { 15, "duplicate PD Tag detected" }, + { 0, NULL } +}; +static value_string_ext names_err_code_srv_ext = VALUE_STRING_EXT_INIT(names_err_code_srv); + + +static const value_string names_err_code_access[] = { + { 0, "other" }, + { 1, "object invalidated" }, + { 2, "hardware fault" }, + { 3, "object access denied" }, + { 4, "invalid address" }, + { 5, "object attribute inconsistent" }, + { 6, "object access unsupported" }, + { 7, "object non existent" }, + { 8, "type conflict" }, + { 9, "named access unsupported" }, + { 10, "access to element unsupported" }, + { 11, "config access already open" }, + { 12, "reserved" }, + { 13, "unrecognized FDA Address" }, + { 0, NULL } +}; +static value_string_ext names_err_code_access_ext = VALUE_STRING_EXT_INIT(names_err_code_access); + + + +static const value_string names_err_code_od[] = { + { 0, "other" }, + { 1, "name length overflow" }, + { 2, "od overflow" }, + { 3, "od write protected" }, + { 4, "extension length overflow" }, + { 5, "od description length overflow" }, + { 6, "operational problem" }, + { 7, "hse to h1 format conversion not supported" }, + { 0, NULL } +}; + + + +static const value_string names_err_code_other[] = { + { 0, "other" }, + { 0, NULL } +}; + + + +static const value_string names_err_code_reject[] = { + { 5, "pdu size" }, + { 0, NULL } +}; + + + +static const value_string names_err_code_h1_sm_reason_code[] = { + { 0, "other" }, + { 1, "DLL Error - insufficient resources" }, + { 2, "DLL Error - sending queue full" }, + { 3, "DLL Error - time-out before transmission" }, + { 4, "DLL Error - reason unspecified" }, + { 5, "Device failed to respond to SET_PD_TAG" }, + { 6, "Device failed to respond to WHO_HAS_PD_TAG" }, + { 7, "Device failed to respond to SET_ADDR" }, + { 8, "Device failed to respond to IDENTIFY" }, + { 9, "Device failed to respond to ENABLE_SM_OP" }, + { 10, "Device failed to respond to CLEAR_ADDRESS" }, + { 11, "Multiple Response from WHO_HAS_PD_TAG" }, + { 12, "Non-Matching PD_TAG from WHO_HAS_PD_TAG" }, + { 13, "Non-Matching PD_TAG from IDENTIFY" }, + { 14, "Non-Matching DEV_ID from IDENTIFY" }, + { 15, "Remote Error Invalid State" }, + { 16, "Remote Error PD-Tag doesn't match" }, + { 17, "Remote Error Dev-ID doesn't match" }, + { 18, "Remote Error SMIB object write failed" }, + { 19, "Remote Error Starting SM Operational" }, + { 0, NULL } +}; +static value_string_ext names_err_code_h1_sm_reason_code_ext = VALUE_STRING_EXT_INIT(names_err_code_h1_sm_reason_code); + + +static const value_string names_err_code_fms_init[] = { + { 0, "other" }, + { 1, "max-fms-pdu-size-insufficient" }, + { 2, "feature-not-supported" }, + { 3, "version-od-incompatible" }, + { 4, "user-initiate-denied" }, + { 5, "password-error" }, + { 6, "profile-number-incompatible" }, + { 0, NULL } +}; + +static const char * +val_to_str_err_code(guint8 errclass, guint8 code) +{ + switch (errclass) { + case 1: + return (val_to_str_const(code, names_err_code_vfd_state, "Unknown")); + + case 2: + return (val_to_str_const(code, names_err_code_appl_ref, "Unknown")); + + case 3: + return (val_to_str_const(code, names_err_code_def, "Unknown")); + + case 4: + return (val_to_str_const(code, names_err_code_res, "Unknown")); + + case 5: + return (val_to_str_ext_const(code, &names_err_code_srv_ext, "Unknown")); + + case 6: + return (val_to_str_ext_const(code, &names_err_code_access_ext, "Unknown")); + + case 7: + return (val_to_str_const(code, names_err_code_od, "Unknown")); + + case 8: + return (val_to_str_const(code, names_err_code_other, "Unknown")); + + case 9: + return (val_to_str_const(code, names_err_code_reject, "Unknown")); + + case 10: + return (val_to_str_ext_const(code, + &names_err_code_h1_sm_reason_code_ext, "Unknown")); + + case 11: + return (val_to_str_const(code, names_err_code_fms_init, "Unknown")); + + default: + return ("Unknown"); + } +} + + + +/* + * 6.5.1.1. FDA Open Session (Confirmed Service Id = 1) + * 6.5.1.1.1. Request Message Parameters + */ +static void +dissect_ff_msg_fda_open_sess_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FDA Open Session Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fda_open_sess_req, NULL, "FDA Open Session Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_req_sess_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_req_max_buf_siz, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_req_max_msg_len, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_req_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_req_nma_conf_use, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_req_inactivity_close_time, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_req_transmit_delay_time, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_req_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.1.1.2. Response Message Parameters + */ +static void +dissect_ff_msg_fda_open_sess_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FDA Open Session Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fda_open_sess_rsp, NULL, "FDA Open Session Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_rsp_sess_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_rsp_max_buf_siz, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_rsp_max_msg_len, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_rsp_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_rsp_nma_conf_use, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_rsp_inactivity_close_time, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_rsp_transmit_delay_time, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_rsp_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.1.1.3. Error Message Parameters + */ +static void +dissect_ff_msg_fda_open_sess_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FDA Open Session Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fda_open_sess_err, NULL, "FDA Open Session Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fda_open_sess_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fda_open_sess_err_additional_desc, tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.1.2. FDA Idle (Confirmed Service Id = 3) + * 6.5.1.2.1. Request Message Parameters + */ +static void +dissect_ff_msg_fda_idle_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FDA Idle Request"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fda_idle_req, NULL, "FDA Idle Request"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.1.2.2. Response Message Parameters + */ +static void +dissect_ff_msg_fda_idle_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FDA Idle Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fda_idle_rsp, NULL, "FDA Idle Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.1.2.3. Error Message Parameters + */ +static void +dissect_ff_msg_fda_idle_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FDA Idle Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fda_idle_err, NULL, "FDA Idle Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fda_idle_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fda_idle_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fda_idle_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fda_idle_err_additional_desc, tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.1. SM Find Tag Query (Unconfirmed Service Id = 1) + * 6.5.2.1.1. Request Message Parameters + */ +static void +dissect_ff_msg_sm_find_tag_query_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Find Tag Query Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_find_tag_query_req, NULL, "SM Find Tag Query Request"); + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_query_req_query_type, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_query_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_query_req_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_query_req_vfd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.2. SM Find Tag Reply (Unconfirmed Service Id = 2) + * 6.5.2.2.1. Request Message Parameters + */ +static void +dissect_ff_msg_sm_find_tag_reply_req_dup_detection_state(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 3-8: Reserved, set to 0. + * Bit 2: 1 = Duplicate PD Tag Detected + * 0 = Duplicate PD Tag Not Detected + * Bit 1: 1 = Duplicate Device Index Detected + * 0 = Duplicate Device Index Not Detected + */ + static int * const dup_flags[] = { + &hf_ff_sm_find_tag_reply_dup_reserved, + &hf_ff_sm_find_tag_reply_dup_pd_tag, + &hf_ff_sm_find_tag_reply_dup_device, + NULL + }; + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_find_tag_reply_dup, ett_ff_sm_find_tag_reply_req_dup_detection_state, dup_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_find_tag_reply_req_list_of_fda_addr_selectors(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint16 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 2 * value, + ett_ff_sm_find_tag_reply_req_list_of_fda_addr_selectors, NULL, + "List of FDA Address Selectors (%u bytes)", 2 * value); + + for (d = 0; d < value; d++) { + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_fda_addr_selector, + tvb, offset, 2, ENC_BIG_ENDIAN); + + offset += 2; + } +} + + + +static void +dissect_ff_msg_sm_find_tag_reply_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint16 NumOfFDAAddrSelectors; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Find Tag Reply Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_find_tag_reply_req, NULL, "SM Find Tag Reply Request"); + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_query_type, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_h1_node_addr, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_fda_addr_link_id, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_vfd_ref, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_od_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_ip_addr, tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_od_ver, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_dev_id, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + dissect_ff_msg_sm_find_tag_reply_req_dup_detection_state(tvb, + offset, sub_tree); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + NumOfFDAAddrSelectors = tvb_get_ntohs(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_sm_find_tag_reply_req_num_of_fda_addr_selectors, + tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + if (NumOfFDAAddrSelectors) { + dissect_ff_msg_sm_find_tag_reply_req_list_of_fda_addr_selectors(tvb, + offset, sub_tree, NumOfFDAAddrSelectors); + offset += 2 * NumOfFDAAddrSelectors; + length -= 2 * NumOfFDAAddrSelectors; + } + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.3. SM Identify (Confirmed Service Id = 3) + * 6.5.2.3.1. Request Message Parameters + */ +static void +dissect_ff_msg_sm_id_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Identify Request"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_id_req, NULL, "SM Identify Request"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.3.2. Response Message Parameters + */ +static void +dissect_ff_msg_sm_id_rsp_h1_node_addr(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + proto_tree *sub_tree; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 2, + ett_ff_sm_id_rsp_h1_node_addr, NULL, "H1 Node Address Version Number (%u bytes)", 2); + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_h1_node_addr_ver_num_h1_node_addr, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_h1_node_addr_ver_num_ver_num, tvb, offset, 1, ENC_BIG_ENDIAN); + /*offset += 1;*/ +} + + + +static void +dissect_ff_msg_sm_id_rsp_entries_node_addr(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_sm_id_rsp_entries_node_addr, NULL, "Version Number List (%u bytes)", 4 * value); + + for (d = 0; d < value * 2; d++) { + dissect_ff_msg_sm_id_rsp_h1_node_addr(tvb, offset, sub_tree); + offset += 2; + } +} + + + +static void +dissect_ff_msg_sm_id_rsp_h1_live_list(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + proto_tree *sub_tree; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4, + ett_ff_sm_id_rsp_h1_live_list, NULL, "H1 Live-list Version Number (%u bytes)", 4); + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_h1_live_list_h1_link_id, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_h1_live_list_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_h1_live_list_ver_num, tvb, offset, 1, ENC_BIG_ENDIAN); + /*offset += 1;*/ +} + + + +static void +dissect_ff_msg_sm_id_rsp_entries_link_id(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_sm_id_rsp_entries_h1_live_list, NULL, "Version Number List (%u bytes)", 4 * value); + + for (d = 0; d < value; d++) { + dissect_ff_msg_sm_id_rsp_h1_live_list(tvb, offset, sub_tree); + offset += 4; + } +} + + + +static void +dissect_ff_msg_sm_id_rsp_smk_state(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 2-8: + * 0 = Reserved + * 1 = NO_TAG + * 2 = OPERATIONAL + * 3 127 = Reserved + * Bit 1: + * 0 = Not Synchronized with SNTP Time Server + * 1 = Synchronized with SNTP Time Server + */ + static int * const state_flags[] = { + &hf_ff_sm_id_rsp_smk_state_name, + &hf_ff_sm_id_rsp_smk_state_sync, + NULL + }; + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_id_rsp_smk_state, ett_ff_sm_id_rsp_smk_state, state_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_id_rsp_dev_type(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bit 8 = Linking Device + * Bit 7 = I/O Gateway + * Bit 6 = HSE Field Device + * Bit 5 = H1 Device + * Bit 4 = Reserved + * Bits 1 - 3 Redundant Device Type Capability* + * 0 = Type D-1 Device + * 1 = Type D-2 Device + * 2 = Type D-3 Device + * 3 = Type D-3 and Type D-2 Device + * 4 = Not used + * 5 = Type D-2 and Type D-1 Device + * 6 = Type D-3 and Type D-1 Device + * 7 = Type D-3 and D-2 and Type D-1 Device + */ + static int * const device_flags[] = { + &hf_ff_sm_id_rsp_dev_type_link, + &hf_ff_sm_id_rsp_dev_type_iogateway, + &hf_ff_sm_id_rsp_dev_type_hse, + &hf_ff_sm_id_rsp_dev_type_h1, + &hf_ff_sm_id_rsp_dev_type_reserved, + &hf_ff_sm_id_rsp_dev_type_redundant_caps, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_id_rsp_dev_type, ett_ff_sm_id_rsp_dev_type, device_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_id_rsp_dev_redundancy_state(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 5-8 = Reserved, set to 0 + * Bits 3 & 4 Device Redundancy Role + * 0 = Reserved + * 1 = Primary + * 2 = Secondary + * Bits 1 & 2 Assigned Redundant Device Type* + * 0 = Type D-1 Device + * 1 = Type D-2 Device + * 2 = Type D-3 Device + */ + static int * const state_flags[] = { + &hf_ff_sm_id_rsp_dev_redundancy_state_reserved, + &hf_ff_sm_id_rsp_dev_redundancy_state_role, + &hf_ff_sm_id_rsp_dev_redundancy_state_type, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_id_rsp_dev_redundancy_state, ett_ff_sm_id_rsp_dev_redundancy_state, state_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_id_rsp_dup_detection_state(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 3-8: Reserved, set to 0. + * Bit 2: 1 = Duplicate PD Tag Detected + * 0 = Duplicate PD Tag Not Detected + * Bit 1: 1 = Duplicate Device Index Detected + * 0 = Duplicate Device Index Not Detected + */ + static int * const dup_flags[] = { + &hf_ff_sm_id_rsp_dup_detection_state_reserved, + &hf_ff_sm_id_rsp_dup_detection_state_pd_tag, + &hf_ff_sm_id_rsp_dup_detection_state_device, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_id_rsp_dup_detection_state, ett_ff_sm_id_rsp_dup_detection_state, dup_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_id_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree, guint32 FDAAddress) +{ + proto_tree *sub_tree; + + guint32 NumOfEntriesInVerNumList; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Identify Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_sm_id_rsp, NULL, "SM Identify Response"); + + dissect_ff_msg_sm_id_rsp_smk_state(tvb, offset, sub_tree); + offset += 1; + length -= 1; + + dissect_ff_msg_sm_id_rsp_dev_type(tvb, offset, sub_tree); + offset += 1; + length -= 1; + + dissect_ff_msg_sm_id_rsp_dev_redundancy_state(tvb, + offset, sub_tree); + offset += 1; + length -= 1; + + dissect_ff_msg_sm_id_rsp_dup_detection_state(tvb, + offset, sub_tree); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_dev_idx, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_max_dev_idx, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_operational_ip_addr, tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_dev_id, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_hse_repeat_time, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_lr_port, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_annunc_ver_num, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_hse_dev_ver_num, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + NumOfEntriesInVerNumList = tvb_get_ntohl(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_sm_id_rsp_num_of_entries, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (NumOfEntriesInVerNumList) { + guint16 LinkId; + /* 11111111 11111111 00000000 00000000 */ + LinkId = (guint16)(FDAAddress >> 16); + if (LinkId) { + dissect_ff_msg_sm_id_rsp_entries_node_addr(tvb, + offset, sub_tree, NumOfEntriesInVerNumList); + } else { + dissect_ff_msg_sm_id_rsp_entries_link_id(tvb, + offset, sub_tree, NumOfEntriesInVerNumList); + } + + offset += 4 * NumOfEntriesInVerNumList; + length -= 4 * NumOfEntriesInVerNumList; + } + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.3.3. Error Message Parameters + */ +static void +dissect_ff_msg_sm_id_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Identify Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_sm_id_err, NULL, "SM Identify Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_sm_id_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_sm_id_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_id_err_additional_desc, tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.4. SM Clear Address (Confirmed Service Id = 12) + * 6.5.2.4.1. Request Message Parameters + */ +static void +dissect_ff_msg_sm_clear_addr_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Address Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_id_err, NULL, "SM Clear Address Request"); + + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_addr_req_dev_id, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_addr_req_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_addr_req_interface_to_clear, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.4.2. Response Message Parameters + */ +static void +dissect_ff_msg_sm_clear_addr_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Address Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_clear_addr_rsp, NULL, "SM Clear Address Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.4.3. Error Message Parameters + */ +static void +dissect_ff_msg_sm_clear_addr_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Address Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_clear_addr_err, NULL, "SM Clear Address Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_addr_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_sm_clear_addr_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_addr_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_addr_err_additional_desc, tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.5. SM Set Assignment Info (Confirmed Service Id = 14) + * 6.5.2.5.1. Request Message Parameters + */ +static void +dissect_ff_msg_sm_set_assign_info_req_dev_redundancy_state(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 5-8 = Reserved, set to 0 + * Bits 3 & 4 Type D-2 Device Redundancy Role + * 0 = Not used + * 1 = Type D-2 Device Primary + * 2 = Type D-2 Device Secondary + * Bits 1 & 2 Assigned Device Redundancy Type + * 0 = Type D-1 Device + * 1 = Type D-2 Device + * 2 = Type D-3 Device + */ + static int * const state_flags[] = { + &hf_ff_sm_set_assign_info_req_dev_redundancy_state_reserved, + &hf_ff_sm_set_assign_info_req_dev_redundancy_state_role, + &hf_ff_sm_set_assign_info_req_dev_redundancy_state_type, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_set_assign_info_req_dev_redundancy_state, ett_ff_sm_set_assign_info_req_dev_redundancy_state, state_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_set_assign_info_req_clear_dup_detection_state(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 3-8: Reserved, set to 0. + * Bit 2: 1 = Do not clear Duplicate PD Tag Detected + * 0 = Clear Duplicate PD Tag Detected + * Bit 1: 1 = Do not clear Duplicate Device Index Detected + * 0 = Clear Duplicate Device Index Detected + */ + static int * const state_flags[] = { + &hf_ff_sm_set_assign_info_req_clear_dup_detection_state_reserved, + &hf_ff_sm_set_assign_info_req_clear_dup_detection_state_pd_tag, + &hf_ff_sm_set_assign_info_req_clear_dup_detection_state_device_index, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_set_assign_info_req_clear_dup_detection_state, ett_ff_sm_set_assign_info_req_clear_dup_detection_state, state_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_set_assign_info_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Set Assignment Info Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_set_assign_info_req, NULL, "SM Set Assignment Info Request"); + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_req_dev_id, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_req_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_req_h1_new_addr, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + dissect_ff_msg_sm_set_assign_info_req_dev_redundancy_state(tvb, + offset, sub_tree); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_req_lr_port, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_req_hse_repeat_time, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_req_dev_idx, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_req_max_dev_idx, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_req_operational_ip_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + dissect_ff_msg_sm_set_assign_info_req_clear_dup_detection_state(tvb, + offset, sub_tree); + offset += 1; + length -= 1; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.5.2. Response Message Parameters + */ +static void +dissect_ff_msg_sm_set_assign_info_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Set Assignment Info Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_set_assign_info_rsp, NULL, "SM Set Assignment Info Response"); + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_rsp_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_rsp_max_dev_idx, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_rsp_hse_repeat_time, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.5.3. Error Message Parameters + */ +static void +dissect_ff_msg_sm_set_assign_info_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Set Assignment Info Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_set_assign_info_err, NULL, "SM Set Assignment Info Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_sm_set_assign_info_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_set_assign_info_err_additional_desc, tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.6. SM Clear Assignment Info (Confirmed Service Id = 15) + * 6.5.2.6.1. Request Message Parameters + */ +static void +dissect_ff_msg_sm_clear_assign_info_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Assignment Info Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_clear_assign_info_req, NULL, "SM Clear Assignment Info Request"); + + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_assign_info_req_dev_id, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_assign_info_req_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.6.2. Response Message Parameters + */ +static void +dissect_ff_msg_sm_clear_assign_info_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Assignment Info Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_clear_assign_info_rsp, NULL, "SM Clear Assignment Info Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.6.3. Error Message Parameters + */ +static void +dissect_ff_msg_sm_clear_assign_info_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Assignment Info Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_clear_assign_info_err, NULL, "SM Clear Assignment Info Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_assign_info_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_sm_clear_assign_info_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_assign_info_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_clear_assign_info_err_additional_desc, tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.2.7. SM Device Annunciation (Unconfirmed Service Id = 16) + * 6.5.2.7.1. Request Message Parameters + */ +static void +dissect_ff_msg_sm_dev_annunc_req_h1_node_addr(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + proto_tree *sub_tree; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 2, + ett_ff_sm_dev_annunc_req_h1_node_addr, NULL, "H1 Node Address Version Number (%u bytes)", 2); + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_h1_node_addr_ver_num_h1_node_addr, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_h1_node_addr_ver_num_ver_num, + tvb, offset, 1, ENC_BIG_ENDIAN); + /*offset += 1;*/ +} + + + +static void +dissect_ff_msg_sm_dev_annunc_req_entries_node_addr(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_sm_dev_annunc_req_entries_node_addr, NULL, "Version Number List (%u bytes)", 4 * value); + + for (d = 0; d < value * 2; d++) { + dissect_ff_msg_sm_dev_annunc_req_h1_node_addr(tvb, offset, sub_tree); + offset += 2; + } +} + + + +static void +dissect_ff_msg_sm_dev_annunc_req_h1_live_list(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + proto_tree *sub_tree; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4, + ett_ff_sm_dev_annunc_req_h1_live_list, NULL, "H1 Live-list Version Number (%u bytes)", 4); + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_h1_live_list_h1_link_id, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_h1_live_list_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_h1_live_list_ver_num, tvb, offset, 1, ENC_BIG_ENDIAN); + /*offset += 1;*/ +} + + + +static void +dissect_ff_msg_sm_dev_annunc_req_entries_link_id(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_sm_dev_annunc_req_entries_h1_live_list, NULL, "Version Number List (%u bytes)", 4 * value); + + for (d = 0; d < value; d++) { + dissect_ff_msg_sm_dev_annunc_req_h1_live_list(tvb, offset, sub_tree); + offset += 4; + } +} + + + +static void +dissect_ff_msg_sm_dev_annunc_req_smk_state(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 2-8: + * 0 = Reserved + * 1 = NO_TAG + * 2 = OPERATIONAL + * 3 127 = Reserved + * Bit 1: + * 0 = Not Synchronized with SNTP Time Server + * 1 = Synchronized with SNTP Time Server + */ + static int * const state_flags[] = { + &hf_ff_sm_dev_annunc_req_smk_state_name, + &hf_ff_sm_dev_annunc_req_smk_state_sync, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_dev_annunc_req_smk_state, ett_ff_sm_dev_annunc_req_smk_state, state_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_dev_annunc_req_dev_type(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bit 8 = Linking Device + * Bit 7 = I/O Gateway + * Bit 6 = HSE Field Device + * Bit 5 = H1 Device + * Bit 4 = Reserved + * Bits 1 - 3 Redundant Device Type Capability* + * 0 = Type D-1 Device + * 1 = Type D-2 Device + * 2 = Type D-3 Device + * 3 = Type D-3 and Type D-2 Device + * 4 = Not used + * 5 = Type D-2 and Type D-1 Device + * 6 = Type D-3 and Type D-1 Device + * 7 = Type D-3 and D-2 and Type D-1 Device + */ + static int * const device_flags[] = { + &hf_ff_sm_dev_annunc_req_dev_type_link, + &hf_ff_sm_dev_annunc_req_dev_type_iogateway, + &hf_ff_sm_dev_annunc_req_dev_type_hse, + &hf_ff_sm_dev_annunc_req_dev_type_h1, + &hf_ff_sm_dev_annunc_req_dev_type_reserved, + &hf_ff_sm_dev_annunc_req_dev_type_redundant_caps, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_dev_annunc_req_dev_type, ett_ff_sm_dev_annunc_req_dev_type, device_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_dev_annunc_req_dev_redundancy_state(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 5-8 = Reserved, set to 0 + * Bits 3 & 4 Device Redundancy Role + * 0 = Reserved + * 1 = Primary + * 2 = Secondary + * Bits 1 & 2 Assigned Redundant Device Type* + * 0 = Type D-1 Device + * 1 = Type D-2 Device + * 2 = Type D-3 Device + */ + static int * const device_flags[] = { + &hf_ff_sm_dev_annunc_req_dev_redundancy_state_reserved, + &hf_ff_sm_dev_annunc_req_dev_redundancy_state_role, + &hf_ff_sm_dev_annunc_req_dev_redundancy_state_type, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_dev_annunc_req_dev_redundancy_state, ett_ff_sm_dev_annunc_req_dev_redundancy_state, device_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_dev_annunc_req_dup_detection_state(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 3-8: Reserved, set to 0. + * Bit 2: 1 = Duplicate PD Tag Detected + * 0 = Duplicate PD Tag Not Detected + * Bit 1: 1 = Duplicate Device Index Detected + * 0 = Duplicate Device Index Not Detected + */ + static int * const state_flags[] = { + &hf_ff_sm_dev_annunc_req_dup_detection_state_reserved, + &hf_ff_sm_dev_annunc_req_dup_detection_state_pd_tag, + &hf_ff_sm_dev_annunc_req_dup_detection_state_device, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_sm_dev_annunc_req_dup_detection_state, ett_ff_sm_dev_annunc_req_dup_detection_state, state_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_sm_dev_annunc_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree, guint32 FDAAddress) +{ + proto_tree *sub_tree; + + guint32 NumOfEntriesInVerNumList; + + col_set_str(pinfo->cinfo, COL_INFO, "SM Device Annunciation Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_sm_dev_annunc_req, NULL, "SM Device Annunciation Request"); + + + dissect_ff_msg_sm_dev_annunc_req_smk_state(tvb, offset, sub_tree); + offset += 1; + length -= 1; + + dissect_ff_msg_sm_dev_annunc_req_dev_type(tvb, + offset, sub_tree); + offset += 1; + length -= 1; + + dissect_ff_msg_sm_dev_annunc_req_dev_redundancy_state(tvb, + offset, sub_tree); + offset += 1; + length -= 1; + + dissect_ff_msg_sm_dev_annunc_req_dup_detection_state(tvb, + offset, sub_tree); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_dev_idx, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_max_dev_idx, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_operational_ip_addr, tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_dev_id, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_hse_repeat_time, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_lr_port, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_annunc_ver_num, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_hse_dev_ver_num, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + NumOfEntriesInVerNumList = tvb_get_ntohl(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_sm_dev_annunc_req_num_of_entries, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (NumOfEntriesInVerNumList) { + guint16 LinkId; + /* 11111111 11111111 00000000 00000000 */ + LinkId = (guint16)(FDAAddress >> 16); + if (LinkId) { + dissect_ff_msg_sm_dev_annunc_req_entries_node_addr(tvb, + offset, sub_tree, NumOfEntriesInVerNumList); + } else { + dissect_ff_msg_sm_dev_annunc_req_entries_link_id(tvb, + offset, sub_tree, NumOfEntriesInVerNumList); + } + + offset += 4 * NumOfEntriesInVerNumList; + length -= 4 * NumOfEntriesInVerNumList; + } + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.2. FMS Initiate (Confirmed Service Id = 96) + * 6.5.3.2.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_init_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_init_req, NULL, "FMS Initiate Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_req_conn_opt, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_req_access_protection_supported_calling, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_req_passwd_and_access_grps_calling, + tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_req_ver_od_calling, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_req_prof_num_calling, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_req_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.2.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_init_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_rep, NULL, "FMS Initiate Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_rsp_ver_od_called, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_rsp_prof_num_called, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.2.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_init_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_init_err, NULL, "FMS Initiate Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_init_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_init_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_err_additional_desc, tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.3. FMS Abort (Unconfirmed Service Id = 112) + * 6.5.3.3.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_abort_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Abort Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_abort_req, NULL, "FMS Abort Request"); + + proto_tree_add_item(sub_tree, hf_ff_fms_abort_req_detail, tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_fms_abort_req_abort_id, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_abort_req_reason_code, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_abort_req_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.4. FMS Status (Confirmed Service Id = 0) + * 6.5.3.4.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_status_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Status Request"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_status_req, NULL, "FMS Status Request"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.4.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_status_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Status Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_status_rsp, NULL, "FMS Status Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_status_rsp_logical_status, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_status_rsp_physical_status, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_status_rsp_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_status_rsp_local_detail, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.4.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_status_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Status Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_status_err, NULL, "FMS Status Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_status_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_status_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_status_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_status_err_additional_desc, tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.5. FMS Unsolicited Status (Unconfirmed Service Id = 1) + * 6.5.3.5.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_unsolicited_status_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Unsolicited Status Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_unsolicited_status_req, NULL, "FMS Unsolicited Status Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_unsolicited_status_req_logical_status, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_unsolicited_status_req_physical_status, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_unsolicited_status_req_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_unsolicited_status_req_local_detail, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.6. FMS Identify (Confirmed Service Id = 1) + * 6.5.3.6.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_id_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Identify Request"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_id_req, NULL, "FMS Identify Request"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.6.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_id_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Identify Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_id_rsp, NULL, "FMS Identify Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_id_rsp_vendor_name, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_fms_id_rsp_model_name, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_fms_id_rsp_revision, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.6.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_id_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Identify Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_id_err, NULL, "FMS Identify Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_id_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_id_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_id_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_id_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.7. FMS Get OD (Confirmed Service Id = 4) + * 6.5.3.7.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_get_od_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Get OD Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_get_od_req, NULL, "FMS Get OD Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_get_od_req_all_attrs, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_get_od_req_start_idx_flag, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_get_od_req_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_get_od_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.7.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_get_od_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Get OD Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_get_od_rsp, NULL, "FMS Get OD Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_get_od_rsp_more_follows, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_get_od_rsp_num_of_obj_desc, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_get_od_rsp_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_fms_get_od_rsp_object_descriptions, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.7.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_get_od_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Get OD Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_get_od_err, NULL, "FMS Get OD Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_get_od_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_get_od_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_get_od_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_get_od_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.8. FMS Initiate Put OD (Confirmed Service Id = 28) + * 6.5.3.8.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_init_put_od_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Put OD Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_put_od_req, NULL, "FMS Initiate Put OD Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_put_od_req_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_put_od_req_consequence, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.8.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_init_put_od_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Put OD Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_put_od_rsp, NULL, "FMS Initiate Put OD Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.8.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_init_put_od_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Put OD Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_put_od_err, NULL, "FMS Initiate Put OD Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_init_put_od_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_init_put_od_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_put_od_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_init_put_od_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.9. FMS Put OD (Confirmed Service Id = 29) + * 6.5.3.9.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_put_od_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Put OD Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_put_od_req, NULL, "FMS Put OD Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_put_od_req_num_of_obj_desc, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + proto_tree_add_item(sub_tree, hf_ff_fms_put_od_req_object_descriptions, tvb, offset, length, ENC_NA); +} + + + +/* + * 6.5.3.9.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_put_od_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Put OD Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_put_od_rsp, NULL, "FMS Put OD Response"); + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.9.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_put_od_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Put OD Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_put_od_err, NULL, "FMS Put OD Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_put_od_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_put_od_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_put_od_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_put_od_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.10. FMS Terminate Put OD (Confirmed Service Id = 30) + * 6.5.3.10.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_terminate_put_od_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Put OD Request"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_terminate_put_od_req, NULL, "FMS Terminate Put OD Request"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.10.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_terminate_put_od_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Put OD Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_terminate_put_od_rsp, NULL, "FMS Terminate Put OD Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.10.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_terminate_put_od_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Put OD Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_terminate_put_od_err, NULL, "FMS Terminate Put OD Error"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_put_od_err_index, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_put_od_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_terminate_put_od_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_put_od_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_put_od_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.11. FMS Generic Initiate Download Sequence + * (Confirmed Service Id = 31) + * 6.5.3.11.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_generic_init_download_sequence_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Initiate Download Sequence Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_gen_init_download_seq_req, NULL, "FMS Generic Initiate Download Sequence Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_init_download_seq_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.11.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_generic_init_download_sequence_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Initiate Download Sequence Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_gen_init_download_seq_rep, NULL, "FMS Generic Initiate Download Sequence Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.11.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_generic_init_download_sequence_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Initiate Download Sequence Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_gen_init_download_seq_err, NULL, "FMS Generic Initiate Download Sequence Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_init_download_seq_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_gen_init_download_seq_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_init_download_seq_err_additional_code, + tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_init_download_seq_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.12. FMS Generic Download Segment (Confirmed Service Id = 32) + * 6.5.3.12.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_generic_download_segment_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Download Segment Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_gen_download_seg_req, NULL, "FMS Generic Download Segment Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_download_seg_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_download_seg_req_more_follows, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_fms_gen_download_seg_req_load_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.12.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_generic_download_segment_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Download Segment Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_gen_download_seg_rsp, NULL, "FMS Generic Download Segment Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.12.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_generic_download_segment_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Download Segment Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_gen_download_seg_err, NULL, "FMS Generic Download Segment Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_download_seg_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_gen_download_seg_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_download_seg_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_download_seg_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.13. FMS Generic Terminate Download Sequence + * (Confirmed Service Id = 33) + * 6.5.3.13.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_generic_terminate_download_sequence_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Terminate Download Sequence Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_gen_terminate_download_seq_req, NULL, "FMS Generic Terminate Download Sequence Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_terminate_download_seq_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.13.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_generic_terminate_download_sequence_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Terminate Download Sequence Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_gen_terminate_download_seq_rsp, NULL, "FMS Generic Terminate Download Sequence Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_terminate_download_seq_rsp_final_result, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.13.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_generic_terminate_download_sequence_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Terminate Download Sequence Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_gen_terminate_download_seq_err, NULL, "FMS Generic Terminate Download Sequence Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_terminate_download_seq_err_err_class, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_gen_terminate_download_seq_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_terminate_download_seq_err_additional_code, + tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_gen_terminate_download_seq_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.14. FMS Initiate Download Sequence (Confirmed Service Id = 9) + * 6.5.3.14.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_init_download_sequence_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Download Sequence Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_download_seq_req, NULL, "FMS Initiate Download Sequence Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_download_seq_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.14.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_init_download_sequence_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Download Sequence Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_download_seq_rsp, NULL, "FMS Initiate Download Sequence Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.14.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_init_download_sequence_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Download Sequence Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_download_seq_err, NULL, "FMS Initiate Download Sequence Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_init_download_seq_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_init_download_seq_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_download_seq_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_download_seq_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.15. FMS Download Segment (Confirmed Service Id = 10) + * 6.5.3.15.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_download_segment_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Download Segment Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_download_seg_req, NULL, "FMS Download Segment Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_download_seg_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.15.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_download_segment_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Download Segment Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_download_seg_rsp, NULL, "FMS Download Segment Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_download_seg_rsp_more_follows, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_fms_download_seg_rsp_load_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.15.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_download_segment_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Download Segment Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_download_seg_err, NULL, "FMS Download Segment Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_download_seg_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_download_seg_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_download_seg_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_download_seg_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.16. FMS Terminate Download Sequence (Confirmed Service Id = 11) + * 6.5.3.16.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_terminate_download_sequence_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Download Sequence Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_terminate_download_seq_req, NULL, "FMS Terminate Download Sequence Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_download_seq_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_download_seq_req_final_result, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.16.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_terminate_download_sequence_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Download Sequence Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_terminate_download_seq_rsp, NULL, "FMS Terminate Download Sequence Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.16.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_terminate_download_sequence_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Download Sequence Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_terminate_download_seq_err, NULL, "FMS Terminate Download Sequence Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_download_seq_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_terminate_download_seq_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_download_seq_err_additional_code, + tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_download_seq_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.17. FMS Initiate Upload Sequence (Confirmed Service Id = 12) + * 6.5.3.17.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_init_upload_seq_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Upload Sequence Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_upload_seq_req, NULL, "FMS Initiate Upload Sequence Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_upload_seq_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.17.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_init_upload_seq_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Upload Sequence Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_upload_seq_rsp, NULL, "FMS Initiate Upload Sequence Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.17.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_init_upload_seq_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Upload Sequence Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_init_upload_seq_err, NULL, "FMS Initiate Upload Sequence Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_init_upload_seq_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_init_upload_seq_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_init_upload_seq_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_init_upload_seq_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.18. FMS Upload Segment (Confirmed Service Id = 13) + * 6.5.3.18.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_upload_segment_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Upload Segment Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_upload_seg_req, NULL, "FMS Upload Segment Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_upload_seg_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.18.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_upload_segment_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Upload Segment Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_upload_seg_rsp, NULL, "FMS Upload Segment Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_upload_seg_rsp_more_follows, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_fms_upload_seg_rsp_final_result, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.18.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_upload_segment_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Upload Segment Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_upload_seg_err, NULL, "FMS Upload Segment Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_upload_seg_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_upload_seg_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_upload_seg_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_upload_seg_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.19. FMS Terminate Upload Sequence (Confirmed Service Id = 14) + * 6.5.3.19.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_terminate_upload_seq_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Upload Sequence Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_terminate_upload_seq_req, NULL, "FMS Terminate Upload Sequence Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_upload_seq_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.19.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_terminate_upload_seq_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Upload Sequence Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_terminate_upload_seq_rsp, NULL, "FMS Terminate Upload Sequence Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.19.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_terminate_upload_seq_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Upload Sequence Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_terminate_upload_seq_err, NULL, "FMS Terminate Upload Sequence Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_upload_seq_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_terminate_upload_seq_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_upload_seq_err_additional_code, + tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_terminate_upload_seq_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.20. FMS Request Domain Download (Confirmed Service Id = 15) + * 6.5.3.20.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_req_dom_download_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Download Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_req_dom_download_req, NULL, "FMS Request Domain Download Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_download_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_download_req_additional_info, + tvb, offset, length, ENC_ASCII); + } +} + + + +/* + * 6.5.3.20.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_req_dom_download_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Download Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_req_dom_download_rsp, NULL, "FMS Request Domain Download Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.20.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_req_dom_download_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Download Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_req_dom_download_err, NULL, "FMS Request Domain Download Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_download_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_req_dom_download_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_download_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_download_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.21. FMS Request Domain Upload (Confirmed Service Id = 16) + * 6.5.3.21.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_req_dom_upload_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Upload Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_req_dom_upload_req, NULL, "FMS Request Domain Upload Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_upload_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_upload_req_additional_info, + tvb, offset, length, ENC_ASCII); + } +} + + + +/* + * 6.5.3.21.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_req_dom_upload_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Upload Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_req_dom_upload_rsp, NULL, "FMS Request Domain Upload Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.21.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_req_dom_upload_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Upload Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_req_dom_upload_err, NULL, "FMS Request Domain Upload Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_upload_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_req_dom_upload_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_upload_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_req_dom_upload_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.22. FMS Create Program Invocation (Confirmed Service Id = 17) + * 6.5.3.22.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_create_pi_req_dom_idxes(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint16 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_fms_create_pi_req_list_of_dom_idxes, NULL, "List Of Domain Indexes (%u bytes)", 4 * value); + + for (d = 0; d < value; d++) { + proto_tree_add_item(sub_tree, + hf_ff_fms_create_pi_req_dom_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + + offset += 4; + } +} + + + +static void +dissect_ff_msg_fms_create_pi_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint16 NumOfDomIdxes; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Create Program Invocation Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_create_pi_req, NULL, "FMS Create Program Invocation Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_create_pi_req_reusable, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_create_pi_req_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + NumOfDomIdxes = tvb_get_ntohs(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_create_pi_req_num_of_dom_idxes, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + if (NumOfDomIdxes) { + dissect_ff_msg_fms_create_pi_req_dom_idxes(tvb, + offset, sub_tree, NumOfDomIdxes); + + offset += 4 * NumOfDomIdxes; + length -= 4 * NumOfDomIdxes; + } + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.22.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_create_pi_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Create Program Invocation Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_create_pi_rsp, NULL, "FMS Create Program Invocation Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_create_pi_rsp_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.22.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_create_pi_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Create Program Invocation Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_create_pi_err, NULL, "FMS Create Program Invocation Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_create_pi_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_create_pi_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_create_pi_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_create_pi_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.23. FMS Delete Program Invocation (Confirmed Service Id = 18) + * 6.5.3.23.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_del_pi_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Program Invocation Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_del_pi_req, NULL, "FMS Delete Program Invocation Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_del_pi_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.23.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_del_pi_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Program Invocation Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_del_pi_rsp, NULL, "FMS Delete Program Invocation Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.23.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_del_pi_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Program Invocation Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_del_pi_err, NULL, "FMS Delete Program Invocation Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_del_pi_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_del_pi_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_del_pi_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_del_pi_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.24. FMS Start (Confirmed Service Id = 19) + * 6.5.3.24.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_start_pi_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Start Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_start_req, NULL, "FMS Start Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_start_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_fms_start_req_execution_argument, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.24.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_start_pi_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Start Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_start_rsp, NULL, "FMS Start Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.24.3. PI Error Message Parameters + */ +static void +dissect_ff_msg_fms_start_pi_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Start Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_start_err, NULL, "FMS Start Error"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_start_err_pi_state, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_start_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_start_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_start_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_start_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.25. FMS Stop (Confirmed Service Id = 20) + * 6.5.3.25.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_stop_pi_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Stop Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_stop_req, NULL, "FMS Stop Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_stop_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.25.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_stop_pi_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Stop Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_stop_rsp, NULL, "FMS Stop Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.25.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_stop_pi_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Stop Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_stop_err, NULL, "FMS Stop Error"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_stop_err_pi_state, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_stop_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_stop_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_stop_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_stop_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.26. FMS Resume (Confirmed Service Id = 21) + * 6.5.3.26.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_resume_pi_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Resume Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_resume_req, NULL, "FMS Resume Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_resume_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_fms_resume_req_execution_argument, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.26.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_resume_pi_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Resume Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_resume_rsp, NULL, "FMS Resume Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.26.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_resume_pi_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Resume Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_resume_err, NULL, "FMS Resume Error"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_resume_err_pi_state, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_resume_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_resume_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_resume_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_resume_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.27. FMS Reset (Confirmed Service Id = 22) + * 6.5.3.27.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_reset_pi_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Reset Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_reset_req, NULL, "FMS Reset Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_reset_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.27.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_reset_pi_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Reset Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_reset_rsp, NULL, "FMS Reset Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.27.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_reset_pi_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Reset Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_reset_err, NULL, "FMS Reset Error"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_reset_err_pi_state, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_reset_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_reset_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_reset_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_reset_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.28. FMS Kill (Confirmed Service Id = 23) + * 6.5.3.28.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_kill_pi_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Kill Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_kill_req, NULL, "FMS Kill Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_kill_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.28.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_kill_pi_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Kill Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_kill_rsp, NULL, "FMS Kill Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.28.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_kill_pi_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Kill Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_kill_err, NULL, "FMS Kill Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_kill_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_kill_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_kill_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_kill_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.29. FMS Read (Confirmed Service Id = 2) + * 6.5.3.29.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_read_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Read Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_read_req, NULL, "FMS Read Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_read_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.29.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_read_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Read Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_read_rsp, NULL, "FMS Read Response"); + + proto_tree_add_item(sub_tree, hf_ff_data, tvb, offset, length, ENC_NA); +} + + + +/* + * 6.5.3.29.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_read_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Read Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_read_err, NULL, "FMS Read Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_read_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_read_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_read_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_read_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.30. FMS Read with Subindex (Confirmed Service Id = 82) + * 6.5.3.30.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_read_subindex_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Read with Subindex Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_read_with_subidx_req, NULL, "FMS Read with Subindex Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_read_with_subidx_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fms_read_with_subidx_req_subidx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.30.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_read_subindex_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Read with Subindex Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_read_with_subidx_rsp, NULL, "FMS Read with Subindex Response"); + + proto_tree_add_item(sub_tree, hf_ff_data, tvb, offset, length, ENC_NA); +} + + + +/* + * 6.5.3.30.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_read_subindex_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Read with Subindex Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_read_with_subidx_err, NULL, "FMS Read with Subindex Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_read_with_subidx_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_read_with_subidx_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_read_with_subidx_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_read_with_subidx_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.31. FMS Write (Confirmed Service Id = 3) + * 6.5.3.31.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_write_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Write Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_write_req, NULL, "FMS Write Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_write_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.31.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_write_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Write Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_write_rsp, NULL, "FMS Write Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.31.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_write_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Write Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, ett_ff_fms_write_err, NULL, "FMS Write Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_write_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_fms_write_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_write_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, hf_ff_fms_write_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.32. FMS Write with Subindex (Confirmed Service Id = 83) + * 6.5.3.32.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_write_subindex_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Write with Subindex Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_write_with_subidx_req, NULL, "FMS Write with Subindex Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_write_with_subidx_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fms_write_with_subidx_req_subidx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.32.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_write_subindex_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Write with Subindex Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_write_with_subidx_rsp, NULL, "FMS Write with Subindex Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.32.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_write_subindex_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Write with Subindex Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_write_with_subidx_err, NULL, "FMS Write with Subindex Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_write_with_subidx_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_write_with_subidx_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_write_with_subidx_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_write_with_subidx_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.33. FMS Define Variable List (Confirmed Service Id = 7) + * 6.5.3.33.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_def_variable_list_req_list_of_idxes(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_fms_def_variable_list_req_list_of_idxes, NULL, "List Of Indexes (%u bytes)", 4 * value); + + for (d = 0; d < value; d++) { + proto_tree_add_item(sub_tree, + hf_ff_fms_def_variable_list_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } +} + + + +static void +dissect_ff_msg_fms_def_variable_list_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint32 NumOfIndexes; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Define Variable List Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_def_variable_list_req, NULL, "FMS Define Variable List Request"); + + NumOfIndexes = tvb_get_ntohl(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_def_variable_list_req_num_of_idxes, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (NumOfIndexes) { + dissect_ff_msg_fms_def_variable_list_req_list_of_idxes(tvb, + offset, sub_tree, NumOfIndexes); + offset += 4 * NumOfIndexes; + length -= 4 * NumOfIndexes; + } + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.33.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_def_variable_list_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Define Variable List Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_def_variable_list_rsp, NULL, "FMS Define Variable List Response"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_def_variable_list_rsp_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.33.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_def_variable_list_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Define Variable List Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_def_variable_list_err, NULL, "FMS Define Variable List Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_def_variable_list_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_def_variable_list_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_def_variable_list_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_def_variable_list_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.34. FMS Delete Variable List (Confirmed Service Id = 8) + * 6.5.3.34.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_del_variable_list_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Variable List Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_del_variable_list_req, NULL, "FMS Delete Variable List Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_del_variable_list_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.34.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_del_variable_list_rsp(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Variable List Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_del_variable_list_rsp, NULL, "FMS Delete Variable List Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.34.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_del_variable_list_err(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Variable List Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_del_variable_list_err, NULL, "FMS Delete Variable List Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_del_variable_list_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_del_variable_list_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_del_variable_list_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_del_variable_list_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.35. FMS Information Report (Unconfirmed Service Id = 0) + * 6.5.3.35.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_info_report_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Information Report Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_info_report_req, NULL, "FMS Information Report Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_info_report_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.36. FMS Information Report with Subindex + * (Unconfirmed Service Id = 16) + * 6.5.3.36.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_info_report_subindex_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Information Report with Subindex Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_info_report_with_subidx_req, NULL, "FMS Information Report with Subindex Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_info_report_with_subidx_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fms_info_report_with_subidx_req_subidx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.37. FMS Information Report On Change (Unconfirmed Service Id = 17) + * 6.5.3.37.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_info_report_change_req(tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Information Report On Change Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_info_report_on_change_req, NULL, "FMS Information Report On Change Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_info_report_on_change_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.38. FMS Information Report On Change with Subindex + * (Unconfirmed Service Id = 18) + * 6.5.3.38.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_info_report_change_subindex_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Information Report On Change with Subindex Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_info_report_on_change_with_subidx_req, NULL, "FMS Information Report On Change with Subindex Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_info_report_on_change_with_subidx_req_idx, + tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fms_info_report_on_change_with_subidx_req_subidx, + tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.39. FMS Event Notification (Unconfirmed Service Id = 2) + * 6.5.3.39.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_ev_notification_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Event Notification Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_ev_notification_req, NULL, "FMS Event Notification Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_ev_notification_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fms_ev_notification_req_ev_num, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.40. FMS Alter Event Condition Monitoring (Confirmed Service Id = 24) + * 6.5.3.40.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_alter_alter_ev_condition_monitoring_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Alter Event Condition Monitoring Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_alter_ev_condition_monitoring_req, NULL, "FMS Alter Event Condition Monitoring Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_alter_ev_condition_monitoring_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, hf_ff_reserved24, tvb, offset, 3, ENC_BIG_ENDIAN); + offset += 3; + length -= 3; + + proto_tree_add_item(sub_tree, + hf_ff_fms_alter_ev_condition_monitoring_req_enabled, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.40.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_alter_alter_ev_condition_monitoring_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Alter Event Condition Monitoring Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_alter_ev_condition_monitoring_rsp, NULL, "FMS Alter Event Condition Monitoring Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.40.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_alter_alter_ev_condition_monitoring_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Alter Event Condition Monitoring Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_alter_ev_condition_monitoring_err, NULL, "FMS Alter Event Condition Monitoring Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_alter_ev_condition_monitoring_err_err_class, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_alter_ev_condition_monitoring_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_alter_ev_condition_monitoring_err_additional_code, + tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_alter_ev_condition_monitoring_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.41. FMS Acknowledge Event Notification (Confirmed Service Id = 25) + * 6.5.3.41.1. Request Message Parameters + */ +static void +dissect_ff_msg_fms_ack_ev_notification_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Acknowledge Event Notification Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_ack_ev_notification_req, NULL, "FMS Acknowledge Event Notification Request"); + + proto_tree_add_item(sub_tree, + hf_ff_fms_ack_ev_notification_req_idx, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_fms_ack_ev_notification_req_ev_num, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.41.2. Response Message Parameters + */ +static void +dissect_ff_msg_fms_ack_ev_notification_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Acknowledge Event Notification Response"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_ack_ev_notification_rsp, NULL, "FMS Acknowledge Event Notification Response"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.3.41.3. Error Message Parameters + */ +static void +dissect_ff_msg_fms_ack_ev_notification_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "FMS Acknowledge Event Notification Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_fms_ack_ev_notification_err, NULL, "FMS Acknowledge Event Notification Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_fms_ack_ev_notification_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_fms_ack_ev_notification_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_fms_ack_ev_notification_err_additional_code, + tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_fms_ack_ev_notification_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.4.1. LAN Redundancy Get Information (Confirmed Service Id = 1) + * 6.5.4.1.1. Request Message Parameters + */ +static void +dissect_ff_msg_lr_get_info_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Information Request"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_get_info_req, NULL, "LAN Redundancy Get Information Request"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.4.1.2. Response Message Parameters + */ +static void +dissect_ff_msg_lr_get_info_rsp_lr_flags(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 6-8: Reserved (not used) = 0 + * Bit 5: Load Balancing Enabled + * 0 = False Do not do load balancing + * 1 = True Do load balancing + * Bit 4: Diagnosis Using Own Messages Enabled + * 0 = False Do not use own diagnostic messages for diagnosis + * 1 = True Use own diagnostic messages for diagnosis + * Bit 3: Single Multicast Message Reception Interface Enabled + * 0 = False Listen for multicast addresses + * on both interfaces + * 1 = True Listen for multicast addresses + * on one interface + * if zero or one fault detected + * in network status table + * Bit 2: Crossed Cable Detection Enabled + * 0 = False Do not detect crossed cables + * 1 = True Detect crossed cables + * B1 (lsb): Single Multicast Message Transmission Interface Enabled + * 0 = False Transmit on both interfaces + * 1 = True Transmit on one interface + */ + static int * const lan_flags[] = { + &hf_ff_lr_get_info_rsp_lr_flags_reserved, + &hf_ff_lr_get_info_rsp_lr_flags_load_balance, + &hf_ff_lr_get_info_rsp_lr_flags_diag, + &hf_ff_lr_get_info_rsp_lr_flags_multi_recv, + &hf_ff_lr_get_info_rsp_lr_flags_cross_cable, + &hf_ff_lr_get_info_rsp_lr_flags_multi_trans, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_lr_get_info_rsp_lr_flags, ett_ff_lr_get_info_rsp_lr_flags, lan_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_lr_get_info_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 MaxMsgNumDiff; + + col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Information Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_get_info_rsp, NULL, "LAN Redundancy Get Information Response"); + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_rsp_lr_attrs_ver, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + MaxMsgNumDiff = tvb_get_guint8(tvb, offset); + switch (MaxMsgNumDiff) { + case 0: + case 1: + proto_tree_add_uint_format_value(sub_tree, + hf_ff_lr_get_info_rsp_lr_max_msg_num_diff, + tvb, offset, 1, MaxMsgNumDiff, + "Do not detect a fault (%u)", + MaxMsgNumDiff); + break; + + default: + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_rsp_lr_max_msg_num_diff, + tvb, offset, 1, ENC_BIG_ENDIAN); + } + offset += 1; + length -= 1; + + dissect_ff_msg_lr_get_info_rsp_lr_flags(tvb, offset, sub_tree); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_rsp_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_rsp_diagnostic_msg_intvl, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_rsp_aging_time, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_rsp_diagnostic_msg_if_a_send_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_rsp_diagnostic_msg_if_a_recv_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_rsp_diagnostic_msg_if_b_send_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_rsp_diagnostic_msg_if_b_recv_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.4.1.3. Error Message Parameters + */ +static void +dissect_ff_msg_lr_get_info_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Information Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_get_info_err, NULL, "LAN Redundancy Get Information Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_lr_get_info_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_info_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.4.2. LAN Redundancy Put Information (Confirmed Service Id = 2) + * 6.5.4.2.1. Request Message Parameters + */ +static void +dissect_ff_msg_lr_put_info_req_lr_flags(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 6-8: Reserved (not used) = 0 + * Bit 5: Load Balancing Enabled + * 0 = False Do not do load balancing + * 1 = True Do load balancing + * Bit 4: Diagnosis Using Own Messages Enabled + * 0 = False Do not use own diagnostic messages for diagnosis + * 1 = True Use own diagnostic messages for diagnosis + * Bit 3: Single Multicast Message Reception Interface Enabled + * 0 = False Listen for multicast addresses + * on both interfaces + * 1 = True Listen for multicast addresses + * on one interface + * if zero or one fault detected + * in network status table + * Bit 2: Crossed Cable Detection Enabled + * 0 = False Do not detect crossed cables + * 1 = True Detect crossed cables + * B1 (lsb): Single Multicast Message Transmission Interface Enabled + * 0 = False Transmit on both interfaces + * 1 = True Transmit on one interface + */ + static int * const lan_flags[] = { + &hf_ff_lr_put_info_req_lr_flags_reserved, + &hf_ff_lr_put_info_req_lr_flags_load_balance, + &hf_ff_lr_put_info_req_lr_flags_diag, + &hf_ff_lr_put_info_req_lr_flags_multi_recv, + &hf_ff_lr_put_info_req_lr_flags_cross_cable, + &hf_ff_lr_put_info_req_lr_flags_multi_trans, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_lr_put_info_req_lr_flags, ett_ff_lr_put_info_req_lr_flags, lan_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_lr_put_info_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 MaxMsgNumDiff; + + col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Put Information Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_put_info_req, NULL, "LAN Redundancy Put Information Request"); + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_req_lr_attrs_ver, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + MaxMsgNumDiff = tvb_get_guint8(tvb, offset); + switch (MaxMsgNumDiff) { + case 0: + case 1: + proto_tree_add_uint_format_value(sub_tree, + hf_ff_lr_put_info_req_lr_max_msg_num_diff, + tvb, offset, 1, MaxMsgNumDiff, + "Do not detect a fault (%u)", + MaxMsgNumDiff); + break; + + default: + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_req_lr_max_msg_num_diff, + tvb, offset, 1, ENC_BIG_ENDIAN); + } + offset += 1; + length -= 1; + + dissect_ff_msg_lr_put_info_req_lr_flags(tvb, offset, sub_tree); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_req_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_req_diagnostic_msg_intvl, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_req_aging_time, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_req_diagnostic_msg_if_a_send_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_req_diagnostic_msg_if_a_recv_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_req_diagnostic_msg_if_b_send_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_req_diagnostic_msg_if_b_recv_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.4.2.2. Response Message Parameters + */ +static void +dissect_ff_msg_lr_put_info_rsp_lr_flags(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 6-8: Reserved (not used) = 0 + * Bit 5: Load Balancing Enabled + * 0 = False Do not do load balancing + * 1 = True Do load balancing + * Bit 4: Diagnosis Using Own Messages Enabled + * 0 = False Do not use own diagnostic messages for diagnosis + * 1 = True Use own diagnostic messages for diagnosis + * Bit 3: Single Multicast Message Reception Interface Enabled + * 0 = False Listen for multicast addresses + * on both interfaces + * 1 = True Listen for multicast addresses + * on one interface + * if zero or one fault detected + * in network status table + * Bit 2: Crossed Cable Detection Enabled + * 0 = False Do not detect crossed cables + * 1 = True Detect crossed cables + * B1 (lsb): Single Multicast Message Transmission Interface Enabled + * 0 = False Transmit on both interfaces + * 1 = True Transmit on one interface + */ + static int * const lan_flags[] = { + &hf_ff_lr_put_info_rsp_lr_flags_reserved, + &hf_ff_lr_put_info_rsp_lr_flags_load_balance, + &hf_ff_lr_put_info_rsp_lr_flags_diag, + &hf_ff_lr_put_info_rsp_lr_flags_multi_recv, + &hf_ff_lr_put_info_rsp_lr_flags_cross_cable, + &hf_ff_lr_put_info_rsp_lr_flags_multi_trans, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_lr_put_info_rsp_lr_flags, ett_ff_lr_put_info_rsp_lr_flags, lan_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_lr_put_info_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 MaxMsgNumDiff; + + col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Put Information Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_put_info_rsp, NULL, "LAN Redundancy Put Information Response"); + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_rsp_lr_attrs_ver, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + MaxMsgNumDiff = tvb_get_guint8(tvb, offset); + switch (MaxMsgNumDiff) { + case 0: + case 1: + proto_tree_add_uint_format_value(sub_tree, + hf_ff_lr_put_info_rsp_lr_max_msg_num_diff, + tvb, offset, 1, MaxMsgNumDiff, + "Do not detect a fault (%u)", + MaxMsgNumDiff); + break; + + default: + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_rsp_lr_max_msg_num_diff, + tvb, offset, 1, ENC_BIG_ENDIAN); + } + offset += 1; + length -= 1; + + dissect_ff_msg_lr_put_info_rsp_lr_flags(tvb, offset, sub_tree); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_rsp_reserved, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_rsp_diagnostic_msg_intvl, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_rsp_aging_time, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_rsp_diagnostic_msg_if_a_send_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_rsp_diagnostic_msg_if_a_recv_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_rsp_diagnostic_msg_if_b_send_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_rsp_diagnostic_msg_if_b_recv_addr, + tvb, offset, 16, ENC_NA); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.4.2.3. Error Message Parameters + */ +static void +dissect_ff_msg_lr_put_info_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Put Information Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_put_info_err, NULL, "LAN Redundancy Put Information Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, hf_ff_lr_put_info_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_lr_put_info_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } + + return; +} + + + +/* + * 6.5.4.3. LAN Redundancy Get Statistics (Confirmed Service Id = 3) + * 6.5.4.3.1. Request Message Parameters + */ +static void +dissect_ff_msg_lr_get_statistics_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + + col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Statistics Request"); + + if (!tree) { + return; + } + + if (length) { + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_get_statistics_req, NULL, "LAN Redundancy Get Statistics Request"); + + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.4.3.2. Response Message Parameters + */ +static void +dissect_ff_msg_lr_get_statistics_rsp_x_cable_stat(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_lr_get_statistics_rsp_list_of_x_cable_stat, NULL, + "List of Crossed Cable Status (%u bytes)", 4 * value); + + for (d = 0; d < value; d++) { + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_rsp_x_cable_stat, tvb, offset, 4, ENC_BIG_ENDIAN); + + offset += 4; + } +} + + + +static void +dissect_ff_msg_lr_get_statistics_rsp( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint32 NumXcableStat; + + col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Statistics Response"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_get_statistics_rsp, NULL, "LAN Redundancy Get Statistics Response"); + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_recv_a, + tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_miss_a, + tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_rsp_num_rem_dev_diag_recv_fault_a, + tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_recv_b, + tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_miss_b, + tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_rsp_num_rem_dev_diag_recv_fault_b, + tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + NumXcableStat = tvb_get_ntohl(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_rsp_num_x_cable_stat, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + if (NumXcableStat) { + dissect_ff_msg_lr_get_statistics_rsp_x_cable_stat(tvb, + offset, sub_tree, NumXcableStat); + offset += 4 * NumXcableStat; + length -= 4 * NumXcableStat; + } + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.4.3.3. Error Message Parameters + */ +static void +dissect_ff_msg_lr_get_statistics_err( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint8 ErrorClass; + guint8 ErrorCode; + const char *error_code; + + col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Statistics Error"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_get_statistics_err, NULL, "LAN Redundancy Get Statistics Error"); + + ErrorClass = tvb_get_guint8(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_err_err_class, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + ErrorCode = tvb_get_guint8(tvb, offset); + error_code = val_to_str_err_code(ErrorClass, ErrorCode); + proto_tree_add_uint_format_value(sub_tree, + hf_ff_lr_get_statistics_err_err_code, + tvb, offset, 1, ErrorCode, + "%s (%u)", error_code, ErrorCode); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_err_additional_code, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_lr_get_statistics_err_additional_desc, + tvb, offset, 16, ENC_ASCII); + offset += 16; + length -= 16; + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5.4.4. Diagnostic Message (Unconfirmed Service Id = 1) + * 6.5.4.4.1. Request Message Parameters + */ +static void +dissect_ff_msg_diagnostic_msg_req_dup_detection_stat(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + /* + * Bits 3-8: Reserved, set to 0. + * Bit 2: 1 = Duplicate PD Tag Detected + * 0 = Duplicate PD Tag Not Detected + * Bit 18: 1 = Duplicate Device Index Detected + * 0 = Duplicate Device Index Not Detected + */ + static int * const dup_flags[] = { + &hf_ff_lr_diagnostic_msg_req_dup_detection_state_reserved, + &hf_ff_lr_diagnostic_msg_req_dup_detection_state_pd_tag, + &hf_ff_lr_diagnostic_msg_req_dup_detection_state_device, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_lr_diagnostic_msg_req_dup_detection_state, ett_ff_lr_diagnostic_msg_req_dup_detection_stat, dup_flags, ENC_BIG_ENDIAN); +} + + + +static void +dissect_ff_msg_diagnostic_msg_req_if_a_to_a_status(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_lr_diagnostic_msg_req_a_to_a_status, NULL, + "List of Interface AtoA Statuses (%u bytes)", 4 * value); + + for (d = 0; d < value; d++) { + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_if_a_to_a_status, + tvb, offset, 4, ENC_BIG_ENDIAN); + + offset += 4; + } +} + + + +static void +dissect_ff_msg_diagnostic_msg_req_if_b_to_a_status(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_lr_diagnostic_msg_req_b_to_a_status, NULL, + "List of Interface BtoA Statuses (%u bytes)", 4 * value); + + for (d = 0; d < value; d++) { + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_if_b_to_a_status, + tvb, offset, 4, ENC_BIG_ENDIAN); + + offset += 4; + } +} + + + +static void +dissect_ff_msg_diagnostic_msg_req_if_a_to_b_status(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_lr_diagnostic_msg_req_a_to_b_status, NULL, + "List of Interface AtoB Statuses (%u bytes)", 4 * value); + + for (d = 0; d < value; d++) { + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_if_a_to_b_status, + tvb, offset, 4, ENC_BIG_ENDIAN); + + offset += 4; + } +} + + + +static void +dissect_ff_msg_diagnostic_msg_req_if_b_to_b_status(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint32 value) +{ + proto_tree *sub_tree; + guint d; + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4 * value, + ett_ff_lr_diagnostic_msg_req_b_to_b_status, NULL, + "List of Interface BtoB Statuses (%u bytes)", 4 * value); + + for (d = 0; d < value; d++) { + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_if_b_to_b_status, + tvb, offset, 4, ENC_BIG_ENDIAN); + + offset += 4; + } +} + + + +static void +dissect_ff_msg_diagnostic_msg_req( + tvbuff_t *tvb, gint offset, + guint32 length, packet_info *pinfo, proto_tree *tree) +{ + proto_tree *sub_tree; + guint16 DeviceIndex; + guint16 NumOfInterfaceStatuses; + + col_set_str(pinfo->cinfo, COL_INFO, "Diagnostic Message Request"); + + if (!tree) { + return; + } + + sub_tree = proto_tree_add_subtree(tree, tvb, offset, length, + ett_ff_lr_diagnostic_msg_req, NULL, "Diagnostic Message Request"); + + DeviceIndex = tvb_get_ntohs(tvb, offset); + if (DeviceIndex) { + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_dev_idx, tvb, offset, 2, ENC_BIG_ENDIAN); + } else { + proto_tree_add_uint_format_value(sub_tree, + hf_ff_lr_diagnostic_msg_req_dev_idx, + tvb, offset, 2, DeviceIndex, + "Index not assigned (%u)", DeviceIndex); + } + offset += 2; + length -= 2; + + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_num_of_network_ifs, + tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_transmission_if, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_diagnostic_msg_intvl, + tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + length -= 4; + + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_pd_tag, tvb, offset, 32, ENC_ASCII); + offset += 32; + length -= 32; + + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + length -= 1; + + dissect_ff_msg_diagnostic_msg_req_dup_detection_stat(tvb, + offset, sub_tree); + offset += 1; + length -= 1; + + NumOfInterfaceStatuses = tvb_get_ntohs(tvb, offset); + proto_tree_add_item(sub_tree, + hf_ff_lr_diagnostic_msg_req_num_of_if_statuses, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + length -= 2; + + if (NumOfInterfaceStatuses) { + dissect_ff_msg_diagnostic_msg_req_if_a_to_a_status(tvb, + offset, sub_tree, NumOfInterfaceStatuses); + offset += 4 * NumOfInterfaceStatuses; + length -= 4 * NumOfInterfaceStatuses; + + dissect_ff_msg_diagnostic_msg_req_if_b_to_a_status(tvb, + offset, sub_tree, NumOfInterfaceStatuses); + offset += 4 * NumOfInterfaceStatuses; + length -= 4 * NumOfInterfaceStatuses; + + dissect_ff_msg_diagnostic_msg_req_if_a_to_b_status(tvb, + offset, sub_tree, NumOfInterfaceStatuses); + offset += 4 * NumOfInterfaceStatuses; + length -= 4 * NumOfInterfaceStatuses; + + dissect_ff_msg_diagnostic_msg_req_if_b_to_b_status(tvb, + offset, sub_tree, NumOfInterfaceStatuses); + offset += 4 * NumOfInterfaceStatuses; + length -= 4 * NumOfInterfaceStatuses; + } + + if (length) { + proto_tree_add_item(sub_tree, hf_ff_unknown_data, tvb, offset, length, ENC_NA); + } +} + + + +/* + * 6.5. Service-Specific Parameters + */ +static void +dissect_ff_msg_body(tvbuff_t *tvb, gint offset, guint32 length, + packet_info *pinfo, proto_tree *tree, + guint8 ProtocolAndType, guint8 Service, guint32 FDAAddress) +{ + proto_item *hidden_item; + guint16 message = 0; + + message = ((guint16)ProtocolAndType) << 8; + message |= (guint16)Service; + + switch (message) { + case FDA_MSG_SESSION_OPEN_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_open_sess, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_open_sess_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fda_open_sess_req(tvb, offset, length, + pinfo, tree); + break; + + case FDA_MSG_SESSION_OPEN_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_open_sess, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_open_sess_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fda_open_sess_rsp(tvb, offset, length, + pinfo, tree); + break; + + case FDA_MSG_SESSION_OPEN_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_open_sess, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_open_sess_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fda_open_sess_err(tvb, offset, length, + pinfo, tree); + break; + + case FDA_MSG_SESSION_IDLE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_idle, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_idle_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fda_idle_req(tvb, offset, length, + pinfo, tree); + break; + + case FDA_MSG_SESSION_IDLE_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_idle, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_idle_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fda_idle_rsp(tvb, offset, length, + pinfo, tree); + break; + + case FDA_MSG_SESSION_IDLE_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_idle, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fda_idle_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fda_idle_err(tvb, offset, length, + pinfo, tree); + break; + + case SM_MSG_FIND_TAG_QUERY_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_find_tag_query, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_find_tag_query_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_find_tag_query_req(tvb, offset, length, + pinfo, tree); + break; + + case SM_MSG_FIND_TAG_REPLY_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_find_tag_reply, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_find_tag_reply_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_find_tag_reply_req(tvb, offset, length, + pinfo, tree); + break; + + case SM_MSG_IDENTIFY_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_id, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_id_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_id_req(tvb, offset, length, + pinfo, tree); + break; + + case SM_MSG_IDENTIFY_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_id, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_id_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_id_rsp(tvb, offset, length, + pinfo, tree, FDAAddress); + break; + + case SM_MSG_IDENTIFY_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_id, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_id_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_id_err(tvb, offset, length, + pinfo, tree); + break; + + case SM_MSG_CLEAR_ADDRESS_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_addr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_addr_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_clear_addr_req(tvb, offset, length, + pinfo, tree); + break; + + case SM_MSG_CLEAR_ADDRESS_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_addr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_addr_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_clear_addr_rsp(tvb, offset, length, + pinfo, tree); + break; + + case SM_MSG_CLEAR_ADDRESS_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_addr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_addr_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_clear_addr_err(tvb, offset, length, + pinfo, tree); + break; + + case SM_MSG_SET_ASSIGNMENT_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_set_assign_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_set_assign_info_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_set_assign_info_req(tvb, offset, + length, pinfo, tree); + break; + + case SM_MSG_SET_ASSIGNMENT_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_set_assign_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_set_assign_info_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_set_assign_info_rsp(tvb, offset, + length, pinfo, tree); + break; + + case SM_MSG_SET_ASSIGNMENT_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_set_assign_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_set_assign_info_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_set_assign_info_err(tvb, offset, + length, pinfo, tree); + break; + + case SM_MSG_CLEAR_ASSIGNMENT_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_assign_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_assign_info_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_clear_assign_info_req(tvb, offset, + length, pinfo, tree); + break; + + case SM_MSG_CLEAR_ASSIGNMENT_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_assign_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_assign_info_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_clear_assign_info_rsp(tvb, offset, + length, pinfo, tree); + break; + + case SM_MSG_CLEAR_ASSIGNMENT_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_assign_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_clear_assign_info_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_clear_assign_info_err(tvb, offset, + length, pinfo, tree); + break; + + case SM_MSG_DEVICE_ANNUNCIATION_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_dev_annunc, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_sm_dev_annunc_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_sm_dev_annunc_req(tvb, offset, + length, pinfo, tree, FDAAddress); + break; + + case FMS_MSG_INITIATE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_ABORT_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_abort, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_abort_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_abort_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_STATUS_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_status, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_status_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_status_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_STATUS_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_status, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_status_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_status_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_STATUS_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_status, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_status_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_status_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_UNSOLICITED_STATUS_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_unsolicited_status, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_unsolicited_status_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_unsolicited_status_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_IDENTIFY_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_id, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_id_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_id_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_IDENTIFY_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_id, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_id_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_id_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_IDENTIFY_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_id, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_id_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_id_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_GET_OD_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_get_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_get_od_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_get_od_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_GET_OD_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_get_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_get_od_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_get_od_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_GET_OD_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_get_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_get_od_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_get_od_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_PUT_OD_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_put_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_put_od_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_put_od_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_PUT_OD_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_put_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_put_od_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_put_od_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_PUT_OD_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_put_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_put_od_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_put_od_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_PUT_OD_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_put_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_put_od_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_put_od_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_PUT_OD_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_put_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_put_od_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_put_od_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_PUT_OD_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_put_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_put_od_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_put_od_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_TERMINATE_PUT_OD_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_put_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_put_od_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_terminate_put_od_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_TERMINATE_PUT_OD_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_put_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_put_od_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_terminate_put_od_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_TERMINATE_PUT_OD_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_put_od, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_put_od_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_terminate_put_od_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_GENERIC_INITIATE_DOWNLOAD_SEQUENCE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_init_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_init_download_seq_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_generic_init_download_sequence_req( + tvb, offset, length, pinfo, tree); + break; + + case FMS_MSG_GENERIC_INITIATE_DOWNLOAD_SEQUENCE_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_init_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_init_download_seq_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_generic_init_download_sequence_rsp( + tvb, offset, length, pinfo, tree); + break; + + case FMS_MSG_GENERIC_INITIATE_DOWNLOAD_SEQUENCE_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_init_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_init_download_seq_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_generic_init_download_sequence_err( + tvb, offset, length, pinfo, tree); + break; + + case FMS_MSG_GENERIC_DOWNLOAD_SEGMENT_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_download_seg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_download_seg_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_generic_download_segment_req(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_GENERIC_DOWNLOAD_SEGMENT_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_download_seg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_download_seg_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_generic_download_segment_rsp(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_GENERIC_DOWNLOAD_SEGMENT_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_download_seg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_download_seg_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_generic_download_segment_err(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_GENERIC_TERMINATE_DOWNLOAD_SEQUENCE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_terminate_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_terminate_download_seq_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_generic_terminate_download_sequence_req( + tvb, offset, length, pinfo, tree); + break; + + case FMS_MSG_GENERIC_TERMINATE_DOWNLOAD_SEQUENCE_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_terminate_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_terminate_download_seq_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_generic_terminate_download_sequence_rsp( + tvb, offset, length, pinfo, tree); + break; + + case FMS_MSG_GENERIC_TERMINATE_DOWNLOAD_SEQUENCE_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_terminate_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_gen_terminate_download_seq_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_generic_terminate_download_sequence_err( + tvb, offset, length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_DOWNLOAD_SEQUENCE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_download_seq_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_download_sequence_req(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_DOWNLOAD_SEQUENCE_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_download_seq_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_download_sequence_rsp(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_DOWNLOAD_SEQUENCE_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_download_seq_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_download_sequence_err(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_DOWNLOAD_SEGMENT_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_download_seg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_download_seg_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_download_segment_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DOWNLOAD_SEGMENT_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_download_seg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_download_seg_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_download_segment_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DOWNLOAD_SEGMENT_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_download_seg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_download_seg_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_download_segment_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_TERMINATE_DOWNLOAD_SEQUENCE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_download_seq_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_terminate_download_sequence_req(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_TERMINATE_DOWNLOAD_SEQUENCE_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_download_seq_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_terminate_download_sequence_rsp(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_TERMINATE_DOWNLOAD_SEQUENCE_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_download_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_download_seq_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_terminate_download_sequence_err(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_UPLOAD_SEQUENCE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_upload_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_upload_seq_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_upload_seq_req(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_UPLOAD_SEQUENCE_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_upload_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_upload_seq_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_upload_seq_rsp(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_INITIATE_UPLOAD_SEQUENCE_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_upload_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_init_upload_seq_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_init_upload_seq_err(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_UPLOAD_SEGMENT_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_upload_seg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_upload_seg_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_upload_segment_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_UPLOAD_SEGMENT_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_upload_seg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_upload_seg_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_upload_segment_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_UPLOAD_SEGMENT_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_upload_seg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_upload_seg_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_upload_segment_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_TERMINATE_UPLOAD_SEQUENCE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_upload_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_upload_seq_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_terminate_upload_seq_req(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_TERMINATE_UPLOAD_SEQUENCE_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_upload_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_upload_seq_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_terminate_upload_seq_rsp(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_TERMINATE_UPLOAD_SEQUENCE_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_upload_seq, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_terminate_upload_seq_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_terminate_upload_seq_err(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_REQUEST_DOMAIN_DOWNLOAD_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_download, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_download_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_req_dom_download_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_REQUEST_DOMAIN_DOWNLOAD_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_download, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_download_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_req_dom_download_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_REQUEST_DOMAIN_DOWNLOAD_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_download, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_download_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_req_dom_download_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_REQUEST_DOMAIN_UPLOAD_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_upload, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_upload_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_req_dom_upload_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_REQUEST_DOMAIN_UPLOAD_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_upload, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_upload_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_req_dom_upload_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_REQUEST_DOMAIN_UPLOAD_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_upload, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_req_dom_upload_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_req_dom_upload_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_CREATE_PI_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_create_pi, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_create_pi_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_create_pi_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_CREATE_PI_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_create_pi, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_create_pi_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_create_pi_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_CREATE_PI_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_create_pi, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_create_pi_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_create_pi_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DELETE_PI_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_pi, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_pi_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_del_pi_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DELETE_PI_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_pi, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_pi_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_del_pi_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DELETE_PI_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_pi, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_pi_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_del_pi_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_START_PI_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_start, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_start_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_start_pi_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_START_PI_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_start, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_start_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_start_pi_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_START_PI_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_start, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_start_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_start_pi_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_STOP_PI_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_stop, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_stop_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_stop_pi_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_STOP_PI_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_stop, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_stop_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_stop_pi_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_STOP_PI_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_stop, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_stop_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_stop_pi_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_RESUME_PI_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_resume, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_resume_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_resume_pi_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_RESUME_PI_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_resume, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_resume_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_resume_pi_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_RESUME_PI_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_resume, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_resume_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_resume_pi_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_RESET_PI_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_reset, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_reset_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_reset_pi_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_RESET_PI_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_reset, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_reset_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_reset_pi_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_RESET_PI_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_reset, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_reset_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_reset_pi_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_KILL_PI_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_kill, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_kill_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_kill_pi_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_KILL_PI_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_kill, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_kill_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_kill_pi_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_KILL_PI_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_kill, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_kill_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_kill_pi_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_READ_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_read_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_READ_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_read_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_READ_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_read_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_READ_SUBINDEX_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read_with_subidx, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read_with_subidx_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_read_subindex_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_READ_SUBINDEX_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read_with_subidx, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read_with_subidx_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_read_subindex_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_READ_SUBINDEX_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read_with_subidx, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_read_with_subidx_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_read_subindex_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_WRITE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_write_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_WRITE_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_write_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_WRITE_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_write_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_WRITE_SUBINDEX_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write_with_subidx, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write_with_subidx_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_write_subindex_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_WRITE_SUBINDEX_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write_with_subidx, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write_with_subidx_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_write_subindex_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_WRITE_SUBINDEX_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write_with_subidx, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_write_with_subidx_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_write_subindex_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DEFINE_VARIABLE_LIST_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_def_variable_list, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_def_variable_list_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_def_variable_list_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DEFINE_VARIABLE_LIST_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_def_variable_list, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_def_variable_list_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_def_variable_list_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DEFINE_VARIABLE_LIST_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_def_variable_list, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_def_variable_list_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_def_variable_list_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DELETE_VARIABLE_LIST_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_variable_list, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_variable_list_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_del_variable_list_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DELETE_VARIABLE_LIST_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_variable_list, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_variable_list_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_del_variable_list_rsp(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_DELETE_VARIABLE_LIST_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_variable_list, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_del_variable_list_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_del_variable_list_err(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_INFO_REPORT_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_info_report, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_info_report_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_info_report_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_INFO_REPORT_SUBINDEX_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_info_report_with_subidx, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_info_report_with_subidx_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_info_report_subindex_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_INFO_REPORT_CHANGE_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_info_report_on_change, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_info_report_on_change_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_info_report_change_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_INFO_REPORT_CHANGE_SUBINDEX_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_info_report_on_change_with_subidx, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_info_report_on_change_with_subidx_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_info_report_change_subindex_req(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_EVENT_NOTIFICATION_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_ev_notification, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_ev_notification_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_ev_notification_req(tvb, offset, + length, pinfo, tree); + break; + + case FMS_MSG_ALTER_EVENT_CONDITION_MONITORING_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_alter_ev_condition_monitoring, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_alter_ev_condition_monitoring_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_alter_alter_ev_condition_monitoring_req( + tvb, offset, length, pinfo, tree); + break; + + case FMS_MSG_ALTER_EVENT_CONDITION_MONITORING_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_alter_ev_condition_monitoring, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_alter_ev_condition_monitoring_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_alter_alter_ev_condition_monitoring_rsp( + tvb, offset, length, pinfo, tree); + break; + + case FMS_MSG_ALTER_EVENT_CONDITION_MONITORING_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_alter_ev_condition_monitoring, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_alter_ev_condition_monitoring_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_alter_alter_ev_condition_monitoring_err( + tvb, offset, length, pinfo, tree); + break; + + case FMS_MSG_ACKNOWLEDGE_EVENT_NOTIFICATION_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_ack_ev_notification, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_ack_ev_notification_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_ack_ev_notification_req(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_ACKNOWLEDGE_EVENT_NOTIFICATION_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_ack_ev_notification, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_ack_ev_notification_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_ack_ev_notification_rsp(tvb, + offset, length, pinfo, tree); + break; + + case FMS_MSG_ACKNOWLEDGE_EVENT_NOTIFICATION_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_ack_ev_notification, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_fms_ack_ev_notification_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_fms_ack_ev_notification_err(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_GET_INFO_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_info_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_lr_get_info_req(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_GET_INFO_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_info_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_lr_get_info_rsp(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_GET_INFO_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_info_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_lr_get_info_err(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_PUT_INFO_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_put_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_put_info_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_lr_put_info_req(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_PUT_INFO_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_put_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_put_info_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_lr_put_info_rsp(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_PUT_INFO_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_put_info, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_put_info_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_lr_put_info_err(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_GET_STATISTICS_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_statistics, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_statistics_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_lr_get_statistics_req(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_GET_STATISTICS_RSP: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_statistics, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_statistics_rsp, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_lr_get_statistics_rsp(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_GET_STATISTICS_ERR: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_statistics, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_get_statistics_err, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_lr_get_statistics_err(tvb, + offset, length, pinfo, tree); + break; + + case LAN_MSG_DIAG_REQ: + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_diagnostic_msg, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + hidden_item = proto_tree_add_boolean(tree, + hf_ff_lr_diagnostic_msg_req, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + dissect_ff_msg_diagnostic_msg_req(tvb, + offset, length, pinfo, tree); + break; + + default: + col_add_fstr(pinfo->cinfo, COL_INFO, + "Unknown Service (Protocol Id: %u, Confirmed Msg Type: %u) " + "(%s Service Id = %u)", + (ProtocolAndType & PROTOCOL_MASK) >> 2, + ProtocolAndType & TYPE_MASK, + (Service & SERVICE_CONFIRMED_FLAG_MASK)? + "Confirmed": "Unconfirmed", + Service & SERVICE_SERVICE_ID_MASK); + + if (length) { + proto_tree_add_item(tree, hf_ff_unknown_service, tvb, offset, length, ENC_NA); + } + } +} + + + +/* + * 6.4. Message Trailer + */ +static void +dissect_ff_msg_trailer(tvbuff_t *tvb, + gint offset, guint32 length, proto_tree *tree, guint8 Options) +{ + proto_tree *sub_tree; + proto_item *hidden_item; + + if (!tree) { + return; + } + + hidden_item = proto_tree_add_boolean(tree, hf_ff_fda_msg_trailer, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + sub_tree = proto_tree_add_subtree(tree, + tvb, offset, length, ett_ff_fda_msg_trailer, NULL, "FDA Message Trailer"); + + if (Options & OPTION_MESSAGE_NUMBER_MASK) { + proto_tree_add_item(sub_tree, + hf_ff_fda_msg_trailer_msg_num, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } + + if (Options & OPTION_INVOKE_ID_MASK) { + proto_tree_add_item(sub_tree, + hf_ff_fda_msg_trailer_invoke_id, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + } + + if (Options & OPTION_TIME_STAMP_MASK) { + proto_tree_add_item(sub_tree, + hf_ff_fda_msg_trailer_time_stamp, tvb, offset, 8, ENC_BIG_ENDIAN); + offset += 8; + } + + if (Options & OPTION_EXTENDED_CNTRL_MASK) { + proto_tree_add_item(sub_tree, + hf_ff_fda_msg_trailer_extended_control_field, + tvb, offset, 4, ENC_BIG_ENDIAN); + /* offset += 4; */ + } +} + + + +/* + * Service + */ + +static void +dissect_ff_msg_hdr_srv(tvbuff_t *tvb, + gint offset, proto_tree *tree, guint8 proto_and_type, guint8 service) +{ + proto_tree *sub_tree; + proto_item *ti; + + if (!tree) { + return; + } + + ti = proto_tree_add_uint(tree, hf_ff_hdr_srv, tvb, offset, 1, service); + sub_tree = proto_item_add_subtree(ti, ett_ff_fda_msg_hdr_srv); + + /* Bit 8: Confirmed Flag */ + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_confirm_flag, tvb, offset, 1, ENC_BIG_ENDIAN); + + /* Bits 1-7 Service Id of the service */ + switch (proto_and_type & PROTOCOL_MASK) { + case PROTOCOL_FDA: + if (service & SERVICE_CONFIRMED_FLAG_MASK) { + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_fda_service_id_confirm, tvb, offset, 1, ENC_BIG_ENDIAN); + } else { + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_fda_service_id_unconfirm, tvb, offset, 1, ENC_BIG_ENDIAN); + } + + break; + + case PROTOCOL_SM: + if (service & SERVICE_CONFIRMED_FLAG_MASK) { + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_sm_service_id_confirm, tvb, offset, 1, ENC_BIG_ENDIAN); + } else { + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_sm_service_id_unconfirm, tvb, offset, 1, ENC_BIG_ENDIAN); + } + + break; + + case PROTOCOL_FMS: + if (service & SERVICE_CONFIRMED_FLAG_MASK) { + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_fms_service_id_confirm, tvb, offset, 1, ENC_BIG_ENDIAN); + } else { + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_fms_service_id_unconfirm, tvb, offset, 1, ENC_BIG_ENDIAN); + } + + break; + + case PROTOCOL_LAN: + if (service & SERVICE_CONFIRMED_FLAG_MASK) { + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_lan_service_id_confirm, tvb, offset, 1, ENC_BIG_ENDIAN); + } else { + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_lan_service_id_unconfirm, tvb, offset, 1, ENC_BIG_ENDIAN); + } + + break; + + default: + proto_tree_add_item(sub_tree, hf_ff_hdr_srv_service_id, tvb, offset, 1, ENC_BIG_ENDIAN); + } +} + + + +/* + * Protocol Id And Confirmed Msg Type + */ + +static void +dissect_ff_msg_hdr_proto_and_type(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + static int * const header[] = { + &hf_ff_hdr_proto_id, + &hf_ff_hdr_confirm_msg_type, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_hdr_proto_confirm, ett_ff_fda_msg_hdr_proto_and_type, header, ENC_BIG_ENDIAN); +} + + + +/* + * Options + */ + +static void +dissect_ff_msg_hdr_opts(tvbuff_t *tvb, + gint offset, proto_tree *tree) +{ + static int * const options[] = { + &hf_ff_hdr_opts_msg_num, + &hf_ff_hdr_opts_invoke_id, + &hf_ff_hdr_opts_timestamp, + &hf_ff_hdr_opts_reserved, + &hf_ff_hdr_opts_ext_ctrl, + &hf_ff_hdr_opts_pad, + NULL + }; + + proto_tree_add_bitmask(tree, tvb, offset, hf_ff_hdr_opts, ett_ff_fda_msg_hdr_opts, options, ENC_BIG_ENDIAN); +} + + + +/* + * 6.3. Message Header + */ +static void +dissect_ff_msg_hdr(tvbuff_t *tvb, + proto_tree *tree, guint8 ProtocolAndType, guint8 Service) +{ + proto_tree *sub_tree; + proto_item *hidden_item; + gint offset = 0; + + if (!tree) { + return; + } + + hidden_item = proto_tree_add_boolean(tree, hf_ff_fda_msg_hdr, tvb, 0, 0, 1); + proto_item_set_hidden(hidden_item); + + sub_tree = proto_tree_add_subtree(tree, + tvb, offset, FDA_MSG_HDR_LENGTH, ett_ff_fda_msg_hdr, NULL, "FDA Message Header"); + + /* FDA Message Version */ + proto_tree_add_item(sub_tree, + hf_ff_fda_msg_hdr_ver, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + /* Options */ + dissect_ff_msg_hdr_opts(tvb, offset, sub_tree); + offset += 1; + + /* Protocol Id And Confirmed Msg Type */ + dissect_ff_msg_hdr_proto_and_type(tvb, + offset, sub_tree); + offset += 1; + + /* Service */ + dissect_ff_msg_hdr_srv(tvb, + offset, sub_tree, ProtocolAndType, Service); + offset += 1; + + /* FDA Address */ + proto_tree_add_item(sub_tree, + hf_ff_fda_msg_hdr_fda_addr, tvb, offset, 4, ENC_BIG_ENDIAN); + offset += 4; + + /* Message Length */ + proto_tree_add_item(sub_tree, + hf_ff_fda_msg_hdr_len, tvb, offset, 4, ENC_BIG_ENDIAN); + /* offset += 4; */ +} + + + +static int +dissect_ff(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) +{ + proto_tree *sub_tree; + proto_item *ti; + gint offset = 0; + + guint8 Options = 0; /* Options */ + guint8 ProtocolAndType = 0; /* Protocol Id And Confirmed Msg Type */ + guint8 Service = 0; /* Service */ + guint32 FDAAddress = 0; /* FDA Address */ + guint32 length = 0; /* Message Length */ + + guint32 trailer_len = 0; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "FF"); + + Options = tvb_get_guint8(tvb, 1); + ProtocolAndType = tvb_get_guint8(tvb, 2); + Service = tvb_get_guint8(tvb, 3); + FDAAddress = tvb_get_ntohl(tvb, 4); + length = tvb_get_ntohl(tvb, 8); + + ti = proto_tree_add_item(tree, proto_ff, tvb, offset, length, ENC_NA); + sub_tree = proto_item_add_subtree(ti, ett_ff); + + if (Options & OPTION_MESSAGE_NUMBER_MASK) { + length -= 4; + trailer_len += 4; + } + + if (Options & OPTION_INVOKE_ID_MASK) { + length -= 4; + trailer_len += 4; + } + + if (Options & OPTION_TIME_STAMP_MASK) { + length -= 8; + trailer_len += 8; + } + + if (Options & OPTION_EXTENDED_CNTRL_MASK) { + length -= 4; + trailer_len += 4; + } + + /* + * Header + */ + dissect_ff_msg_hdr(tvb, sub_tree, ProtocolAndType, Service); + offset += FDA_MSG_HDR_LENGTH; + length -= FDA_MSG_HDR_LENGTH; + + /* + * Service-Specific Parameters + User Data (optional) + */ + dissect_ff_msg_body(tvb, offset, length, pinfo, sub_tree, + ProtocolAndType, Service, FDAAddress); + offset += length; + + /* + * Trailer (optional) + */ + if (trailer_len) { + dissect_ff_msg_trailer(tvb, + offset, trailer_len, sub_tree, Options); + offset += trailer_len; + } + + return offset; +} + + +static guint +get_ff_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset, void *data _U_) +{ + return (tvb_get_ntohl(tvb, offset + 8)); +} + + + +static int +dissect_ff_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) +{ +/* + * + * 6.3. Message Header + * + * 0 1 2 3 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Version | Options | Protocol/Type | Service | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | FDA Address | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | Message Length | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * + */ + + tcp_dissect_pdus(tvb, pinfo, tree, ff_desegment, + FDA_MSG_HDR_LENGTH, get_ff_pdu_len, dissect_ff, data); + + return tvb_reported_length(tvb); +} + + + +static int +dissect_ff_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) +{ + gint offset = 0; + + while (tvb_reported_length_remaining(tvb, offset) > FDA_MSG_HDR_LENGTH) + { + tvbuff_t *pdu_tvb; + gint length; + + /* Make sure at least the header is there */ + if (tvb_captured_length_remaining(tvb, offset) < FDA_MSG_HDR_LENGTH) + break; + + length = get_ff_pdu_len(pinfo, tvb, offset, data); + + /* Make sure the length field is valid */ + if ((length > tvb_reported_length_remaining(tvb, offset)) || + (length < FDA_MSG_HDR_LENGTH)) + break; + + pdu_tvb = tvb_new_subset_length(tvb, offset, length); + offset += dissect_ff(pdu_tvb, pinfo, tree, data); + } + + return offset; +} + + + +void +proto_register_ff(void) +{ + static hf_register_info hf[] = { + /* + * 6.3. Message Header + */ + { &hf_ff_fda_msg_hdr, + { "Message Header", "ff.hdr", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_msg_hdr_ver, + { "FDA Message Version", "ff.hdr.ver", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_msg_hdr_fda_addr, + { "FDA Address", "ff.hdr.fda_addr", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_msg_hdr_len, + { "Message Length", "ff.hdr.len", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_unknown_data, + { "Unknown data", "ff.unknown_data", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_data, + { "Data", "ff.data", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_reserved24, + { "Reserved", "ff.reserved", + FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_unknown_service, + { "Unknown service", "ff.unknown_service", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + /* + * 6.4. Message Trailer + */ + { &hf_ff_fda_msg_trailer, + { "Message Trailer", "ff.trailer", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_msg_trailer_msg_num, + { "Message Number", "ff.trailer.msg_num", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_msg_trailer_invoke_id, + { "Invoke Id", "ff.trailer.invoke_id", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_msg_trailer_time_stamp, + { "Time Stamp", "ff.trailer.time_stamp", + FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_msg_trailer_extended_control_field, + { "Extended Control Field", "ff.trailer.extended_control_field", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.1. FDA Session Management Services + */ + { &hf_ff_fda, + { "FDA Session Management Service", "ff.fda", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_hdr_srv, + { "Service", "ff.hdr_srv", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_hdr_srv_confirm_flag, + { "Confirmed Flag", "ff.hdr_srv.confirm_flag", + FT_BOOLEAN, 8, TFS(&tfs_confirmed_unconfirmed), SERVICE_CONFIRMED_FLAG_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_srv_service_id, + { "Service Id (Unknown)", "ff.hdr_srv.service_id", + FT_UINT8, BASE_DEC, NULL, SERVICE_SERVICE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_srv_fda_service_id_confirm, + { "Service Id", "ff.hdr_srv.fda.service_id.confirm", + FT_UINT8, BASE_DEC, VALS(names_fda_confirmed), SERVICE_SERVICE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_srv_fda_service_id_unconfirm, + { "Service Id", "ff.hdr_srv.fda.service_id.unconfirm", + FT_UINT8, BASE_DEC, VALS(names_fda_unconfirmed), SERVICE_SERVICE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_srv_sm_service_id_confirm, + { "Service Id", "ff.hdr_srv.sm.service_id.confirm", + FT_UINT8, BASE_DEC, VALS(names_sm_confirmed), SERVICE_SERVICE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_srv_sm_service_id_unconfirm, + { "Service Id", "ff.hdr_srv.sm.service_id.unconfirm", + FT_UINT8, BASE_DEC, VALS(names_sm_unconfirmed), SERVICE_SERVICE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_srv_fms_service_id_confirm, + { "Service Id", "ff.hdr_srv.fms.service_id.confirm", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_fms_confirmed_ext, SERVICE_SERVICE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_srv_fms_service_id_unconfirm, + { "Service Id", "ff.hdr_srv.fms.service_id.unconfirm", + FT_UINT8, BASE_DEC, VALS(names_fms_unconfirmed), SERVICE_SERVICE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_srv_lan_service_id_confirm, + { "Service Id", "ff.hdr_srv.lan.service_id.confirm", + FT_UINT8, BASE_DEC, VALS(names_lan_confirmed), SERVICE_SERVICE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_srv_lan_service_id_unconfirm, + { "Service Id", "ff.hdr_srv.lan.service_id.unconfirm", + FT_UINT8, BASE_DEC, VALS(names_lan_unconfirmed), SERVICE_SERVICE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_proto_id, + { "Service Id", "ff.hdr.proto_id", + FT_UINT8, BASE_DEC, VALS(names_proto), PROTOCOL_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_confirm_msg_type, + { "Service Id", "ff.hdr.confirm_msg_type", + FT_UINT8, BASE_DEC, VALS(names_type), TYPE_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_proto_confirm, + { "Protocol Id And Confirmed Msg Type", "ff.hdr.proto_confirm", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_hdr_opts_msg_num, + { "Message Number in the Trailer", "ff.hdr.opts.msg_num", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), OPTION_MESSAGE_NUMBER_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_opts_invoke_id, + { "Invoke Id in the Trailer", "ff.hdr.opts.invoke_id", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), OPTION_INVOKE_ID_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_opts_timestamp, + { "Time Stamp in the Trailer", "ff.hdr.opts.timestamp", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), OPTION_TIME_STAMP_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_opts_reserved, + { "Reserved", "ff.hdr.opts.reserved", + FT_UINT8, BASE_HEX, NULL, OPTION_RESERVED_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_opts_ext_ctrl, + { "Extended Control in the Trailer", "ff.hdr.opts.ext_ctrl", + FT_BOOLEAN, 8, TFS(&tfs_present_not_present), OPTION_EXTENDED_CNTRL_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_opts_pad, + { "Pad Length", "ff.hdr.opts.pad", + FT_UINT8, BASE_HEX, NULL, OPTION_PAD_LENGTH_MASK, NULL, HFILL } }, + + { &hf_ff_hdr_opts, + { "Options", "ff.hdr.opts", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.1.1. FDA Open Session (Confirmed Service Id = 1) + */ + { &hf_ff_fda_open_sess, + { "FDA Open Session", "ff.fda.open_sess", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.1.1.1. Request Message Parameters + */ + { &hf_ff_fda_open_sess_req, + { "FDA Open Session Request", "ff.fda.open_sess.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_req_sess_idx, + { "Session Index", "ff.fda.open_sess.req.sess_idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_req_max_buf_siz, + { "Max Buffer Size", "ff.fda.open_sess.req.max_buf_siz", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_req_max_msg_len, + { "Max Message Length", "ff.fda.open_sess.req.max_msg_len", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_req_reserved, + { "Reserved", "ff.fda.open_sess.req.reserved", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_req_nma_conf_use, + { "NMA Configuration Use", "ff.fda.open_sess.req.nma_conf_use", + FT_UINT8, BASE_DEC, VALS(names_nma_conf_use), 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_req_inactivity_close_time, + { "Inactivity Close Time", + "ff.fda.open_sess.req.inactivity_close_time", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_req_transmit_delay_time, + { "Transmit Delay Time", "ff.fda.open_sess.req.transmit_delay_time", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_req_pd_tag, + { "PD Tag", "ff.fda.open_sess.req.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.1.1.2. Response Message Parameters + */ + { &hf_ff_fda_open_sess_rsp, + { "FDA Open Session Response", "ff.fda.open_sess.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_rsp_sess_idx, + { "Session Index", "ff.fda.open_sess.rsp.sess_idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_rsp_max_buf_siz, + { "Max Buffer Size", "ff.fda.open_sess.rsp.max_buf_siz", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_rsp_max_msg_len, + { "Max Message Length", "ff.fda.open_sess.rsp.max_msg_len", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_rsp_reserved, + { "Reserved", "ff.fda.open_sess.rsp.reserved", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_rsp_nma_conf_use, + { "NMA Configuration Use", "ff.fda.open_sess.rsp.nma_conf_use", + FT_UINT8, BASE_DEC, VALS(names_nma_conf_use), 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_rsp_inactivity_close_time, + { "Inactivity Close Time", + "ff.fda.open_sess.rsp.inactivity_close_time", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_rsp_transmit_delay_time, + { "Transmit Delay Time", "ff.fda.open_sess.rsp.transmit_delay_time", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_rsp_pd_tag, + { "PD Tag", "ff.fda.open_sess.rsp.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.1.1.3. Error Message Parameters + */ + { &hf_ff_fda_open_sess_err, + { "FDA Open Session Error", "ff.fda.open_sess.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_err_err_class, + { "Error Class", "ff.fda.open_sess.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_err_err_code, + { "Error Code", "ff.fda.open_sess.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_err_additional_code, + { "Additional Code", "ff.fda.open_sess.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_open_sess_err_additional_desc, + { "Additional Description", "ff.fda.open_sess.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.1.2. FDA Idle (Confirmed Service Id = 3) + */ + { &hf_ff_fda_idle, + { "FDA Idle", "ff.fda.idle", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.1.2.1. Request Message Parameters + */ + { &hf_ff_fda_idle_req, + { "FDA Idle Request", "ff.fda.idle.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.1.2.2. Response Message Parameters + */ + { &hf_ff_fda_idle_rsp, + { "FDA Idle Response", "ff.fda.idle.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.1.2.3. Error Message Parameters + */ + { &hf_ff_fda_idle_err, + { "FDA Idle Error", "ff.fda.idle.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_idle_err_err_class, + { "Error Class", "ff.fda.idle.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_idle_err_err_code, + { "Error Code", "ff.fda.idle.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_idle_err_additional_code, + { "Additional Code", "ff.fda.idle.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fda_idle_err_additional_desc, + { "Additional Description", "ff.fda.idle.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2. SM Services + */ + { &hf_ff_sm, + { "SM Service", "ff.sm", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.1. SM Find Tag Query (Unconfirmed Service Id = 1) + */ + { &hf_ff_sm_find_tag_query, + { "SM Find Tag Query", "ff.sm.find_tag_query", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.1.1. Request Message Parameters + */ + { &hf_ff_sm_find_tag_query_req, + { "SM Find Tag Query Request", "ff.sm.find_tag_query.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_query_req_query_type, + { "Query Type", "ff.sm.find_tag_query.req.query_type", + FT_UINT8, BASE_DEC, VALS(names_query_type), 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_query_req_idx, + { "Element Id or VFD Reference or Device Index", + "ff.sm.find_tag_query.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_query_req_tag, + { "PD Tag or Function Block Tag", "ff.sm.find_tag_query.req.tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_query_req_vfd_tag, + { "VFD Tag", "ff.sm.find_tag_query.req.vfd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.2. SM Find Tag Reply (Unconfirmed Service Id = 2) + */ + { &hf_ff_sm_find_tag_reply, + { "SM Find Tag Reply", "ff.sm.find_tag_reply", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.2.1. Request Message Parameters + */ + { &hf_ff_sm_find_tag_reply_req, + { "SM Find Tag Reply Request", "ff.sm.find_tag_reply.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_query_type, + { "Query Type", "ff.sm.find_tag_reply.req.query_type", + FT_UINT8, BASE_DEC, VALS(names_query_type), 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_h1_node_addr, + { "Queried Object H1 Node Address", + "ff.sm.find_tag_reply.req.h1_node_addr", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_fda_addr_link_id, + { "Queried Object FDA Address Link Id", + "ff.sm.find_tag_reply.req.fda_addr_link_id", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_vfd_ref, + { "Queried Object VFD Reference", + "ff.sm.find_tag_reply.req.vfd_ref", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_od_idx, + { "Queried Object OD Index", "ff.sm.find_tag_reply.req.od_idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_ip_addr, + { "Queried Object IP Address", "ff.sm.find_tag_reply.req.ip_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_od_ver, + { "Queried Object OD Version", "ff.sm.find_tag_reply.req.od_ver", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_dev_id, + { "Queried Object Device ID", "ff.sm.find_tag_reply.req.dev_id", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_pd_tag, + { "Queried Object PD Tag", "ff.sm.find_tag_reply.req.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_reserved, + { "Reserved", "ff.sm.find_tag_reply.req.reserved", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_num_of_fda_addr_selectors, + { "Number Of FDA Address Selectors", + "ff.sm.find_tag_reply.req.num_of_fda_addr_selectors", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_req_fda_addr_selector, + { "FDA Address Selector", + "ff.sm.find_tag_reply.req.fda_addr_selector.fda_addr_selector", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_dup_reserved, + { "Reserved", + "ff.sm.find_tag_reply.dup_reserved", + FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_dup_pd_tag, + { "Duplicate PD Tag", + "ff.sm.find_tag_reply.dup_pd_tag", + FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x02, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_dup_device, + { "Duplicate Device Index", + "ff.sm.find_tag_reply.dup_device", + FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x01, NULL, HFILL } }, + + { &hf_ff_sm_find_tag_reply_dup, + { "Duplicate Detection State", + "ff.sm.find_tag_reply.dup", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.2.7. SM Identify (Unconfirmed Service Id = 16) + */ + { &hf_ff_sm_id, + { "SM Identify", "ff.sm.id", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.2.3.1. Request Message Parameters + */ + { &hf_ff_sm_id_req, + { "SM Identify Request", "ff.sm.id.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.3.2. Response Message Parameters + */ + { &hf_ff_sm_id_rsp, + { "SM Identify Response", "ff.sm.id.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_idx, + { "Device Index", "ff.sm.id.rsp.dev_idx", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_max_dev_idx, + { "Max Device Index", "ff.sm.id.rsp.max_dev_idx", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_operational_ip_addr, + { "Operational IP Address", "ff.sm.id.rsp.operational_ip_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_id, + { "Device ID", "ff.sm.id.rsp.dev_id", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_pd_tag, + { "PD Tag", "ff.sm.id.rsp.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_hse_repeat_time, + { "HSE Repeat Time", "ff.sm.id.rsp.hse_repeat_time", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_lr_port, + { "LAN Redundancy Port", "ff.sm.id.rsp.lr_port", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_reserved, + { "Reserved", "ff.sm.id.rsp.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_annunc_ver_num, + { "Annunciation Version Number", "ff.sm.id.rsp.annunc_ver_num", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_hse_dev_ver_num, + { "HSE Device Version Number", "ff.sm.id.rsp.hse_dev_ver_num", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_num_of_entries, + { "Number of Entries in Version Number List", + "ff.sm.id.rsp.num_of_entries", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_h1_live_list_h1_link_id, + { "H1 Link Id", "ff.sm.id.rsp.h1_live_list.h1_link_id", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_h1_live_list_reserved, + { "Reserved", "ff.sm.id.rsp.h1_live_list.reserved", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_h1_live_list_ver_num, + { "Version Number", "ff.sm.id.rsp.h1_live_list.ver_num", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_h1_node_addr_ver_num_h1_node_addr, + { "H1 Node Address", + "ff.sm.id.rsp.h1_node_addr_ver_num.h1_node_addr", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_h1_node_addr_ver_num_ver_num, + { "Version Number", "ff.sm.id.rsp.h1_node_addr_ver_num.ver_num", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_smk_state_name, + { "Name", "ff.sm.id.rsp.smk_state_name", + FT_UINT8, BASE_DEC, VALS(names_smk_state), 0xFE, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_smk_state_sync, + { "Synchronized with SNTP Time Server", "ff.sm.id.rsp.smk_state_sync", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_smk_state, + { "SMK State", "ff.sm.id.rsp.smk_state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_type_link, + { "Linking Device", "ff.sm.id.rsp.dev_type.link", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_type_iogateway, + { "I/O Gateway", "ff.sm.id.rsp.dev_type.iogateway", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_type_hse, + { "HSE Field Device", "ff.sm.id.rsp.dev_type.hse", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_type_h1, + { "H1 Device", "ff.sm.id.rsp.dev_type.h1", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_type_reserved, + { "Reserved", "ff.sm.id.rsp.dev_type.reserved", + FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_type_redundant_caps, + { "Redundant Device Type Capability", "ff.sm.id.rsp.dev_type.redundant_caps", + FT_UINT8, BASE_DEC, VALS(names_dev_type), 0x07, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_type, + { "Device Type", "ff.sm.id.rsp.dev_type", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_redundancy_state_reserved, + { "Reserved", "ff.sm.id.rsp.dev_redundancy_state.reserved", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_redundancy_state_role, + { "Device Redundancy Role", "ff.sm.id.rsp.dev_redundancy_state.role", + FT_UINT8, BASE_DEC, VALS(names_dev_redundancy_role), 0x0C, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_redundancy_state_type, + { "Assigned Redundant Device Type", "ff.sm.id.rsp.dev_redundancy_state.type", + FT_UINT8, BASE_DEC, VALS(names_assigned_redundant_dev_type), 0x03, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dev_redundancy_state, + { "Device Redundancy State", "ff.sm.id.rsp.dev_redundancy_state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dup_detection_state_reserved, + { "Reserved", "ff.sm.id.rsp.dup_detection_state.reserved", + FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dup_detection_state_pd_tag, + { "Duplicate PD Tag", "ff.sm.id.rsp.dup_detection_state.pd_tag", + FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x02, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dup_detection_state_device, + { "Duplicate Device Index", "ff.sm.id.rsp.dup_detection_state.device", + FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x01, NULL, HFILL } }, + + { &hf_ff_sm_id_rsp_dup_detection_state, + { "Duplicate Detection State", "ff.sm.id.rsp.dup_detection_state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.2.3.3. Error Message Parameters + */ + { &hf_ff_sm_id_err, + { "SM Identify Error", "ff.sm.id.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_err_err_class, + { "Error Class", "ff.sm.id.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_err_err_code, + { "Error Code", "ff.sm.id.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_err_additional_code, + { "Additional Code", "ff.sm.id.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_id_err_additional_desc, + { "Additional Description", "ff.sm.id.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.4. SM Clear Address (Confirmed Service Id = 12) + */ + { &hf_ff_sm_clear_addr, + { "SM Clear Address", "ff.sm.clear_addr", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.4.1. Request Message Parameters + */ + { &hf_ff_sm_clear_addr_req, + { "SM Clear Address Request", "ff.sm.clear_addr.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_addr_req_dev_id, + { "Device ID", "ff.sm.clear_addr.req.dev_id", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_addr_req_pd_tag, + { "PD Tag", "ff.sm.clear_addr.req.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_addr_req_interface_to_clear, + { "Interface to Clear", "ff.sm.clear_addr.req.interface_to_clear", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.4.2. Response Message Parameters + */ + { &hf_ff_sm_clear_addr_rsp, + { "SM Clear Address Response", "ff.sm.clear_addr.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.4.3. Error Message Parameters + */ + { &hf_ff_sm_clear_addr_err, + { "SM Clear Address Error", "ff.sm.clear_addr.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_addr_err_err_class, + { "Error Class", "ff.sm.clear_addr.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_addr_err_err_code, + { "Error Code", "ff.sm.clear_addr.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_addr_err_additional_code, + { "Additional Code", "ff.sm.clear_addr.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_addr_err_additional_desc, + { "Additional Description", "ff.sm.clear_addr.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.5. SM Set Assignment Info (Confirmed Service Id = 14) + */ + { &hf_ff_sm_set_assign_info, + { "SM Set Assignment Info", "ff.sm.set_assign_info", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.5.1. Request Message Parameters + */ + { &hf_ff_sm_set_assign_info_req_dev_redundancy_state_reserved, + { "Reserved", "ff.sm.set_assign_info.req_dev_redundancy_state.reserved", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_dev_redundancy_state_role, + { "Type D-2 Device Redundancy Role", "ff.sm.set_assign_info.req_dev_redundancy_state.role", + FT_UINT8, BASE_DEC, VALS(names_type_d2_dev_redundancy_role), 0x0C, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_dev_redundancy_state_type, + { "Assigned Device Redundancy Type", "ff.sm.set_assign_info.req_dev_redundancy_state.type", + FT_UINT8, BASE_DEC, VALS(names_assigned_redundant_dev_type), 0x03, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_dev_redundancy_state, + { "Device Redundancy State", "ff.sm.set_assign_info.req_dev_redundancy_state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_clear_dup_detection_state_reserved, + { "Reserved", "ff.sm.set_assign_info.req_clear_dup_detection_state.reserved", + FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_clear_dup_detection_state_pd_tag, + { "Duplicate PD Tag Detected", "ff.sm.set_assign_info.req_clear_dup_detection_state.pd_tag", + FT_BOOLEAN, 8, TFS(&tfs_do_not_clear_clear), 0x02, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_clear_dup_detection_state_device_index, + { "Duplicate Device Index Detected", "ff.sm.set_assign_info.req_clear_dup_detection_state.device_index", + FT_BOOLEAN, 8, TFS(&tfs_do_not_clear_clear), 0x01, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_clear_dup_detection_state, + { "Clear Duplicate Detection State", "ff.sm.set_assign_info.req_clear_dup_detection_state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req, + { "SM Set Assignment Info Request", "ff.sm.set_assign_info.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_dev_id, + { "Device ID", "ff.sm.set_assign_info.req.dev_id", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_pd_tag, + { "PD Tag", "ff.sm.set_assign_info.req.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_h1_new_addr, + { "H1 New Address", "ff.sm.set_assign_info.req.h1_new_addr", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_lr_port, + { "LAN Redundancy Port", + "ff.sm.set_assign_info.req.lr_port", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_hse_repeat_time, + { "HSE Repeat Time", "ff.sm.set_assign_info.req.hse_repeat_time", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_dev_idx, + { "Device Index", "ff.sm.set_assign_info.req.dev_idx", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_max_dev_idx, + { "Max Device Index", "ff.sm.set_assign_info.req.max_dev_idx", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_req_operational_ip_addr, + { "Operational IP Address", + "ff.sm.set_assign_info.req.operational_ip_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.5.2. Response Message Parameters + */ + { &hf_ff_sm_set_assign_info_rsp, + { "SM Set Assignment Info Response", "ff.sm.set_assign_info.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_rsp_reserved, + { "Reserved", "ff.sm.set_assign_info.rsp.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_rsp_max_dev_idx, + { "Max Device Index", "ff.sm.set_assign_info.rsp.max_dev_idx", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_rsp_hse_repeat_time, + { "HSE Repeat Time", "ff.sm.set_assign_info.rsp.hse_repeat_time", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.5.3. Error Message Parameters + */ + { &hf_ff_sm_set_assign_info_err, + { "SM Set Assignment Info Error", "ff.sm.set_assign_info.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_err_err_class, + { "Error Class", "ff.sm.set_assign_info.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_err_err_code, + { "Error Code", "ff.sm.set_assign_info.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_err_additional_code, + { "Additional Code", "ff.sm.set_assign_info.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_set_assign_info_err_additional_desc, + { "Additional Description", + "ff.sm.set_assign_info.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.6. SM Clear Assignment Info (Confirmed Service Id = 15) + */ + { &hf_ff_sm_clear_assign_info, + { "SM Clear Assignment Info", "ff.sm.clear_assign_info", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.6.1. Request Message Parameters + */ + { &hf_ff_sm_clear_assign_info_req, + { "SM Clear Assignment Info Request", "ff.sm.clear_assign_info.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_assign_info_req_dev_id, + { "Device ID", "ff.sm.clear_assign_info.req.dev_id", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_assign_info_req_pd_tag, + { "PD Tag", "ff.sm.clear_assign_info.req.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.6.2. Response Message Parameters + */ + { &hf_ff_sm_clear_assign_info_rsp, + { "SM Clear Assignment Info Response", + "ff.sm.clear_assign_info.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.6.3. Error Message Parameters + */ + { &hf_ff_sm_clear_assign_info_err, + { "SM Clear Assignment Info Error", "ff.sm.clear_assign_info.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_assign_info_err_err_class, + { "Error Class", "ff.sm.clear_assign_info.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_assign_info_err_err_code, + { "Error Code", "ff.sm.clear_assign_info.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_assign_info_err_additional_code, + { "Additional Code", "ff.sm.clear_assign_info.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_clear_assign_info_err_additional_desc, + { "Additional Description", + "ff.sm.clear_assign_info.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.7. SM Device Annunciation (Unconfirmed Service Id = 16) + */ + { &hf_ff_sm_dev_annunc, + { "SM Device Annunciation", "ff.sm.dev_annunc", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.2.7.1. Request Message Parameters + */ + { &hf_ff_sm_dev_annunc_req, + { "SM Device Annunciation Request", "ff.sm.dev_annunc.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_idx, + { "Device Index", "ff.sm.dev_annunc.req.dev_idx", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_max_dev_idx, + { "Max Device Index", "ff.sm.dev_annunc.req.max_dev_idx", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_operational_ip_addr, + { "Operational IP Address", + "ff.sm.dev_annunc.req.operational_ip_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_id, + { "Device ID", "ff.sm.dev_annunc.req.dev_id", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_pd_tag, + { "PD Tag", "ff.sm.dev_annunc.req.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_hse_repeat_time, + { "HSE Repeat Time", "ff.sm.dev_annunc.req.hse_repeat_time", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_lr_port, + { "LAN Redundancy Port", "ff.sm.dev_annunc.req.lr_port", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_reserved, + { "Reserved", "ff.sm.dev_annunc.req.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_annunc_ver_num, + { "Annunciation Version Number", + "ff.sm.dev_annunc.req.annunc_ver_num", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_hse_dev_ver_num, + { "HSE Device Version Number", + "ff.sm.dev_annunc.req.hse_dev_ver_num", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_num_of_entries, + { "Number of Entries in Version Number List", + "ff.sm.dev_annunc.req.num_of_entries", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_h1_live_list_h1_link_id, + { "H1 Link Id", "ff.sm.dev_annunc.req.h1_live_list.h1_link_id", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_h1_live_list_reserved, + { "Reserved", "ff.sm.dev_annunc.req.h1_live_list.reserved", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_h1_live_list_ver_num, + { "Version Number", "ff.sm.dev_annunc.req.h1_live_list.ver_num", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_h1_node_addr_ver_num_h1_node_addr, + { "H1 Node Address", + "ff.sm.dev_annunc.req.h1_node_addr_ver_num.h1_node_addr", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_h1_node_addr_ver_num_ver_num, + { "Version Number", + "ff.sm.dev_annunc.req.h1_node_addr_ver_num.ver_num", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_smk_state_name, + { "Name", "ff.sm.dev_annunc.req.smk_state_name", + FT_UINT8, BASE_DEC, VALS(names_smk_state), 0xFE, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_smk_state_sync, + { "Synchronized with SNTP Time Server", "ff.sm.dev_annunc.req.smk_state_sync", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x01, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_smk_state, + { "SMK State", "ff.sm.dev_annunc.req.smk_state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_type_link, + { "Linking Device", "ff.sm.dev_annunc.req.dev_type.link", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x80, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_type_iogateway, + { "I/O Gateway", "ff.sm.dev_annunc.req.dev_type.iogateway", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x40, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_type_hse, + { "HSE Field Device", "ff.sm.dev_annunc.req.dev_type.hse", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x20, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_type_h1, + { "H1 Device", "ff.sm.dev_annunc.req.dev_type.h1", + FT_BOOLEAN, 8, TFS(&tfs_yes_no), 0x10, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_type_reserved, + { "Reserved", "ff.sm.dev_annunc.req.dev_type.reserved", + FT_UINT8, BASE_HEX, NULL, 0x08, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_type_redundant_caps, + { "Redundant Device Type Capability", "ff.sm.dev_annunc.req.dev_type.redundant_caps", + FT_UINT8, BASE_DEC, VALS(names_dev_type), 0x07, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_type, + { "Device Type", "ff.sm.dev_annunc.req.dev_type", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_redundancy_state_reserved, + { "Reserved", "ff.sm.dev_annunc.req_dev_redundancy_state.reserved", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_redundancy_state_role, + { "Type D-2 Device Redundancy Role", "ff.sm.dev_annunc.req_dev_redundancy_state.role", + FT_UINT8, BASE_DEC, VALS(names_type_d2_dev_redundancy_role), 0x0C, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_redundancy_state_type, + { "Assigned Device Redundancy Type", "ff.sm.dev_annunc.req_dev_redundancy_state.type", + FT_UINT8, BASE_DEC, VALS(names_assigned_redundant_dev_type), 0x03, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dev_redundancy_state, + { "Device Redundancy State", "ff.sm.dev_annunc.req_dev_redundancy_state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dup_detection_state_reserved, + { "Reserved", "ff.sm.dev_annunc.req.dup_detection_state.reserved", + FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dup_detection_state_pd_tag, + { "Duplicate PD Tag", "ff.sm.dev_annunc.req.dup_detection_state.pd_tag", + FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x02, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dup_detection_state_device, + { "Duplicate Device Index", "ff.sm.dev_annunc.req.dup_detection_state.device", + FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x01, NULL, HFILL } }, + + { &hf_ff_sm_dev_annunc_req_dup_detection_state, + { "Duplicate Detection State", "ff.sm.dev_annunc.req.dup_detection_state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.3. FMS Services + */ + { &hf_ff_fms, + { "FMS Service", "ff.fms", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.2. FMS Initiate (Confirmed Service Id = 96) + */ + { &hf_ff_fms_init, + { "FMS Initiate", "ff.fms.init", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.2.1. Request Message Parameters + */ + { &hf_ff_fms_init_req, + { "FMS Initiate Request", "ff.fms.init.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_req_conn_opt, + { "Connect Option", "ff.fms.init.req.conn_opt", + FT_UINT8, BASE_DEC, VALS(names_conn_opt), 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_req_access_protection_supported_calling, + { "Access Protection Supported Calling", + "ff.fms.init.req.access_protection_supported_calling", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_req_passwd_and_access_grps_calling, + { "Password and Access Groups Calling", + "ff.fms.init.req.passwd_and_access_grps_calling", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_req_ver_od_calling, + { "Version OD Calling", "ff.fms.init.req.ver_od_calling", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_req_prof_num_calling, + { "Profile Number Calling", "ff.fms.init.req.prof_num_calling", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_req_pd_tag, + { "PD Tag", "ff.fms.init.req.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.2.2. Response Message Parameters + */ + { &hf_ff_fms_init_rsp, + { "FMS Initiate Response", "ff.fms.init.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_rsp_ver_od_called, + { "Version OD Called", "ff.fms.init.rsp.ver_od_called", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_rsp_prof_num_called, + { "Profile Number Called", "ff.fms.init.rsp.prof_num_called", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.2.3. Error Message Parameters + */ + { &hf_ff_fms_init_err, + { "FMS Initiate Error", "ff.fms.init.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_err_err_class, + { "Error Class", "ff.fms.init.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_err_err_code, + { "Error Code", "ff.fms.init.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_err_additional_code, + { "Additional Code", "ff.fms.init.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_err_additional_desc, + { "Additional Description", "ff.fms.init.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.3. FMS Abort (Unconfirmed Service Id = 112) + */ + { &hf_ff_fms_abort, + { "FMS Abort", "ff.fms.abort", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.3.1. Request Message Parameters + */ + { &hf_ff_fms_abort_req, + { "FMS Abort Request", "ff.fms.abort.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_abort_req_detail, + { "Abort Detail", "ff.fms.abort.req.detail", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_abort_req_abort_id, + { "Abort Identifier", "ff.fms.abort.req.abort_id", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_abort_req_reason_code, + { "Reason Code", "ff.fms.abort.req.reason_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_abort_req_reserved, + { "Reserved", "ff.fms.abort.req.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.4. FMS Status (Confirmed Service Id = 0) + */ + { &hf_ff_fms_status, + { "FMS Status", "ff.fms.status", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.4.1. Request Message Parameters + */ + { &hf_ff_fms_status_req, + { "FMS Status Request", "ff.fms.status.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.4.2. Response Message Parameters + */ + { &hf_ff_fms_status_rsp, + { "FMS Status Response", "ff.fms.status.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_status_rsp_logical_status, + { "Logical Status", "ff.fms.status.rsp.logical_status", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_status_rsp_physical_status, + { "Physical Status", "ff.fms.status.rsp.physical_status", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_status_rsp_reserved, + { "Reserved", "ff.fms.status.rsp.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_status_rsp_local_detail, + { "Local Detail", "ff.fms.status.rsp.local_detail", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.4.3. Error Message Parameters + */ + { &hf_ff_fms_status_err, + { "FMS Status Error", "ff.fms.status.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_status_err_err_class, + { "Error Class", "ff.fms.status.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_status_err_err_code, + { "Error Code", "ff.fms.status.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_status_err_additional_code, + { "Additional Code", "ff.fms.status.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_status_err_additional_desc, + { "Additional Description", "ff.fms.status.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.5. FMS Unsolicited Status (Unconfirmed Service Id = 1) + */ + { &hf_ff_fms_unsolicited_status, + { "FMS Unsolicited Status", "ff.fms.unsolicited_status", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.5.1. Request Message Parameters + */ + { &hf_ff_fms_unsolicited_status_req, + { "FMS Unsolicited Status Request", "ff.fms.unsolicited_status.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_unsolicited_status_req_logical_status, + { "Logical Status", "ff.fms.unsolicited_status.req.logical_status", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_unsolicited_status_req_physical_status, + { "Physical Status", + "ff.fms.unsolicited_status.req.physical_status", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_unsolicited_status_req_reserved, + { "Reserved", "ff.fms.unsolicited_status.req.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_unsolicited_status_req_local_detail, + { "Local Detail", "ff.fms.unsolicited_status.req.local_detail", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.6. FMS Identify (Confirmed Service Id = 1) + */ + { &hf_ff_fms_id, + { "FMS Identify", "ff.fms.id", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.6.1. Request Message Parameters + */ + { &hf_ff_fms_id_req, + { "FMS Identify Request", "ff.fms.id.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.6.2. Response Message Parameters + */ + { &hf_ff_fms_id_rsp, + { "FMS Identify Response", "ff.fms.id.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_id_rsp_vendor_name, + { "Vendor Name", "ff.fms.id.rsp.vendor_name", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_id_rsp_model_name, + { "Model Name", "ff.fms.id.rsp.model_name", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_id_rsp_revision, + { "Revision", "ff.fms.id.rsp.revision", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.6.3. Error Message Parameters + */ + { &hf_ff_fms_id_err, + { "FMS Identify Error", "ff.fms.id.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_id_err_err_class, + { "Error Class", "ff.fms.id.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_id_err_err_code, + { "Error Code", "ff.fms.id.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_id_err_additional_code, + { "Additional Code", "ff.fms.id.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_id_err_additional_desc, + { "Additional Description", "ff.fms.id.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.7. FMS Get OD (Confirmed Service Id = 4) + */ + { &hf_ff_fms_get_od, + { "FMS Get OD", "ff.fms.get_od", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.7.1. Request Message Parameters + */ + { &hf_ff_fms_get_od_req, + { "FMS Get OD Request", "ff.fms.get_od.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_req_all_attrs, + { "All Attributes", "ff.fms.get_od.req.all_attrs", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_req_start_idx_flag, + { "Start Index Flag", "ff.fms.get_od.req.start_idx_flag", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_req_reserved, + { "Reserved", "ff.fms.get_od.req.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_req_idx, + { "Index", "ff.fms.get_od.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.7.2. Response Message Parameters + */ + { &hf_ff_fms_get_od_rsp, + { "FMS Get OD Response", "ff.fms.get_od.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_rsp_more_follows, + { "More Follows", "ff.fms.get_od.rsp.more_follows", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_rsp_num_of_obj_desc, + { "Number of Object Descriptions", + "ff.fms.get_od.rsp.num_of_obj_desc", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_rsp_reserved, + { "Reserved", "ff.fms.get_od.rsp.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_rsp_object_descriptions, + { "List of Object Descriptions", "ff.fms.get_od.rsp.object_descriptions", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.7.3. Error Message Parameters + */ + { &hf_ff_fms_get_od_err, + { "FMS Get OD Error", "ff.fms.get_od.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_err_err_class, + { "Error Class", "ff.fms.get_od.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_err_err_code, + { "Error Code", "ff.fms.get_od.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_err_additional_code, + { "Additional Code", "ff.fms.get_od.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_get_od_err_additional_desc, + { "Additional Description", "ff.fms.get_od.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.8. FMS Initiate Put OD (Confirmed Service Id = 28) + */ + { &hf_ff_fms_init_put_od, + { "FMS Initiate Put OD", "ff.fms.init_put_od", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.8.1. Request Message Parameters + */ + { &hf_ff_fms_init_put_od_req, + { "FMS Initiate Put OD Request", "ff.fms.init_put_od.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_put_od_req_reserved, + { "Reserved", "ff.fms.init_put_od.req.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_put_od_req_consequence, + { "Consequence", "ff.fms.init_put_od.req.consequence", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.8.2. Response Message Parameters + */ + { &hf_ff_fms_init_put_od_rsp, + { "FMS Initiate Put OD Response", "ff.fms.init_put_od.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.8.3. Error Message Parameters + */ + { &hf_ff_fms_init_put_od_err, + { "FMS Initiate Put OD Error", "ff.fms.init_put_od.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_put_od_err_err_class, + { "Error Class", "ff.fms.init_put_od.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_put_od_err_err_code, + { "Error Code", "ff.fms.init_put_od.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_put_od_err_additional_code, + { "Additional Code", "ff.fms.init_put_od.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_put_od_err_additional_desc, + { "Additional Description", + "ff.fms.init_put_od.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.9. FMS Put OD (Confirmed Service Id = 29) + */ + { &hf_ff_fms_put_od, + { "FMS Put OD", "ff.fms.put_od", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.9.1. Request Message Parameters + */ + { &hf_ff_fms_put_od_req, + { "FMS Put OD Request", "ff.fms.put_od.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_put_od_req_num_of_obj_desc, + { "Number of Object Descriptions", + "ff.fms.put_od.req.num_of_obj_desc", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_put_od_req_object_descriptions, + { "List of Object Descriptions", "ff.fms.put_od.req.object_descriptions", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.3.9.2. Response Message Parameters + */ + { &hf_ff_fms_put_od_rsp, + { "FMS Put OD Response", "ff.fms.put_od.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.9.3. Error Message Parameters + */ + { &hf_ff_fms_put_od_err, + { "FMS Put OD Error", "ff.fms.put_od.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_put_od_err_err_class, + { "Error Class", "ff.fms.put_od.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_put_od_err_err_code, + { "Error Code", "ff.fms.put_od.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_put_od_err_additional_code, + { "Additional Code", "ff.fms.put_od.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_put_od_err_additional_desc, + { "Additional Description", "ff.fms.put_od.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.10. FMS Terminate Put OD (Confirmed Service Id = 30) + */ + { &hf_ff_fms_terminate_put_od, + { "FMS Terminate Put OD", "ff.fms.terminate_put_od", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.10.1. Request Message Parameters + */ + { &hf_ff_fms_terminate_put_od_req, + { "FMS Terminate Put OD Request", "ff.fms.terminate_put_od.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.10.2. Response Message Parameters + */ + { &hf_ff_fms_terminate_put_od_rsp, + { "FMS Terminate Put OD Response", "ff.fms.terminate_put_od.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.10.3. Error Message Parameters + */ + { &hf_ff_fms_terminate_put_od_err, + { "FMS Terminate Put OD Error", "ff.fms.terminate_put_od.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_put_od_err_index, + { "Index", "ff.fms.terminate_put_od.err.index", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_put_od_err_err_class, + { "Error Class", "ff.fms.terminate_put_od.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_put_od_err_err_code, + { "Error Code", "ff.fms.terminate_put_od.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_put_od_err_additional_code, + { "Additional Code", "ff.fms.terminate_put_od.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_put_od_err_additional_desc, + { "Additional Description", + "ff.fms.terminate_put_od.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.11. FMS Generic Initiate Download Sequence + * (Confirmed Service Id = 31) + */ + { &hf_ff_fms_gen_init_download_seq, + { "FMS Generic Initiate Download Sequence", + "ff.fms.gen_init_download_seq", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.11.1. Request Message Parameters + */ + { &hf_ff_fms_gen_init_download_seq_req, + { "FMS Generic Initiate Download Sequence Request", + "ff.fms.gen_init_download_seq.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_init_download_seq_req_idx, + { "Index", + "ff.fms.gen_init_download_seq.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.11.2. Response Message Parameters + */ + { &hf_ff_fms_gen_init_download_seq_rsp, + { "FMS Generic Initiate Download Sequence Response", + "ff.fms.gen_init_download_seq.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.11.3. Error Message Parameters + */ + { &hf_ff_fms_gen_init_download_seq_err, + { "FMS Generic Initiate Download Sequence Error", + "ff.fms.gen_init_download_seq.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_init_download_seq_err_err_class, + { "Error Class", "ff.fms.gen_init_download_seq.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_init_download_seq_err_err_code, + { "Error Code", "ff.fms.gen_init_download_seq.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_init_download_seq_err_additional_code, + { "Additional Code", + "ff.fms.gen_init_download_seq.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_init_download_seq_err_additional_desc, + { "Additional Description", + "ff.fms.gen_init_download_seq.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.12. FMS Generic Download Segment (Confirmed Service Id = 32) + */ + { &hf_ff_fms_gen_download_seg, + { "FMS Generic Download Segment", "ff.fms.gen_download_seg", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.12.1. Request Message Parameters + */ + { &hf_ff_fms_gen_download_seg_req, + { "FMS Generic Download Segment Request", + "ff.fms.gen_download_seg.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_download_seg_req_idx, + { "Index", "ff.fms.gen_download_seg.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_download_seg_req_more_follows, + { "More Follows", "ff.fms.gen_download_seg.req.more_follows", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_download_seg_req_load_data, + { "Load Data", "ff.fms.gen_download_seg.req.load_data", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.3.12.2. Response Message Parameters + */ + { &hf_ff_fms_gen_download_seg_rsp, + { "FMS Generic Download Segment Response", + "ff.fms.gen_download_seg.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.12.3. Error Message Parameters + */ + { &hf_ff_fms_gen_download_seg_err, + { "FMS Generic Download Segment Error", + "ff.fms.gen_download_seg.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_download_seg_err_err_class, + { "Error Class", "ff.fms.gen_download_seg.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_download_seg_err_err_code, + { "Error Code", "ff.fms.gen_download_seg.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_download_seg_err_additional_code, + { "Additional Code", "ff.fms.gen_download_seg.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_download_seg_err_additional_desc, + { "Additional Description", + "ff.fms.gen_download_seg.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.13. FMS Generic Terminate Download Sequence + * (Confirmed Service Id = 33) + */ + { &hf_ff_fms_gen_terminate_download_seq, + { "FMS Generic Terminate Download Sequence", + "ff.fms.gen_terminate_download_seq", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.13.1. Request Message Parameters + */ + { &hf_ff_fms_gen_terminate_download_seq_req, + { "FMS Generic Terminate Download Sequence Request", + "ff.fms.gen_terminate_download_seq.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_terminate_download_seq_req_idx, + { "Index", "ff.fms.gen_terminate_download_seq.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.13.2. Response Message Parameters + */ + { &hf_ff_fms_gen_terminate_download_seq_rsp, + { "FMS Generic Terminate Download Sequence Response", + "ff.fms.gen_terminate_download_seq.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_terminate_download_seq_rsp_final_result, + { "Final Result", + "ff.fms.gen_terminate_download_seq.rsp.final_result", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.13.3. Error Message Parameters + */ + { &hf_ff_fms_gen_terminate_download_seq_err, + { "FMS Generic Terminate Download Sequence Error", + "ff.fms.gen_terminate_download_seq.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_terminate_download_seq_err_err_class, + { "Error Class", "ff.fms.gen_terminate_download_seq.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_terminate_download_seq_err_err_code, + { "Error Code", "ff.fms.gen_terminate_download_seq.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_terminate_download_seq_err_additional_code, + { "Additional Code", + "ff.fms.gen_terminate_download_seq.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_gen_terminate_download_seq_err_additional_desc, + { "Additional Description", + "ff.fms.gen_terminate_download_seq.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.14. FMS Initiate Download Sequence (Confirmed Service Id = 9) + */ + { &hf_ff_fms_init_download_seq, + { "FMS Initiate Download Sequence", + "ff.fms.init_download_seq", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.14.1. Request Message Parameters + */ + { &hf_ff_fms_init_download_seq_req, + { "FMS Initiate Download Sequence Request", + "ff.fms.init_download_seq.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_download_seq_req_idx, + { "Index", "ff.fms.init_download_seq.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.14.2. Response Message Parameters + */ + { &hf_ff_fms_init_download_seq_rsp, + { "FMS Initiate Download Sequence Response", + "ff.fms.init_download_seq.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.14.3. Error Message Parameters + */ + { &hf_ff_fms_init_download_seq_err, + { "FMS Initiate Download Sequence Error", + "ff.fms.init_download_seq.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_download_seq_err_err_class, + { "Error Class", "ff.fms.init_download_seq.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_download_seq_err_err_code, + { "Error Code", "ff.fms.init_download_seq.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_download_seq_err_additional_code, + { "Additional Code", "ff.fms.init_download_seq.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_download_seq_err_additional_desc, + { "Additional Description", + "ff.fms.init_download_seq.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.15. FMS Download Segment (Confirmed Service Id = 10) + */ + { &hf_ff_fms_download_seg, + { "FMS Download Segment", "ff.fms.download_seg", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.15.1. Request Message Parameters + */ + { &hf_ff_fms_download_seg_req, + { "FMS Download Segment Request", "ff.fms.download_seg.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_download_seg_req_idx, + { "Index", "ff.fms.download_seg.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.15.2. Response Message Parameters + */ + { &hf_ff_fms_download_seg_rsp, + { "FMS Download Segment Response", "ff.fms.download_seg.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_download_seg_rsp_more_follows, + { "Final Result", "ff.fms.download_seg.rsp.more_follows", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_download_seg_rsp_load_data, + { "Load Data", "ff.fms.download_seg.rsp.load_data", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.3.15.3. Error Message Parameters + */ + { &hf_ff_fms_download_seg_err, + { "FMS Download Segment Error", "ff.fms.download_seg.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_download_seg_err_err_class, + { "Error Class", "ff.fms.download_seg.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_download_seg_err_err_code, + { "Error Code", "ff.fms.download_seg.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_download_seg_err_additional_code, + { "Additional Code", "ff.fms.download_seg.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_download_seg_err_additional_desc, + { "Additional Description", + "ff.fms.download_seg.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.16. FMS Terminate Download Sequence (Confirmed Service Id = 11) + */ + { &hf_ff_fms_terminate_download_seq, + { "FMS Terminate Download Sequence", + "ff.fms.terminate_download_seq", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.16.1. Request Message Parameters + */ + { &hf_ff_fms_terminate_download_seq_req, + { "FMS Terminate Download Sequence Request", + "ff.fms.terminate_download_seq.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_download_seq_req_idx, + { "Index", "ff.fms.terminate_download_seq.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_download_seq_req_final_result, + { "Final Result", "ff.fms.terminate_download_seq.req.final_result", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.16.2. Response Message Parameters + */ + { &hf_ff_fms_terminate_download_seq_rsp, + { "FMS Terminate Download Sequence Response", + "ff.fms.terminate_download_seq.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.16.3. Error Message Parameters + */ + { &hf_ff_fms_terminate_download_seq_err, + { "FMS Terminate Download Sequence Error", + "ff.fms.terminate_download_seq.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_download_seq_err_err_class, + { "Error Class", "ff.fms.terminate_download_seq.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_download_seq_err_err_code, + { "Error Code", "ff.fms.terminate_download_seq.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_download_seq_err_additional_code, + { "Additional Code", + "ff.fms.terminate_download_seq.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_download_seq_err_additional_desc, + { "Additional Description", + "ff.fms.terminate_download_seq.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.17. FMS Initiate Upload Sequence (Confirmed Service Id = 12) + */ + { &hf_ff_fms_init_upload_seq, + { "FMS Initiate Upload Sequence", "ff.fms.init_upload_seq", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.17.1. Request Message Parameters + */ + { &hf_ff_fms_init_upload_seq_req, + { "FMS Initiate Upload Sequence Request", + "ff.fms.init_upload_seq.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_upload_seq_req_idx, + { "Index", "ff.fms.init_upload_seq.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.17.2. Response Message Parameters + */ + { &hf_ff_fms_init_upload_seq_rsp, + { "FMS Initiate Upload Sequence Response", + "ff.fms.init_upload_seq.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.17.3. Error Message Parameters + */ + { &hf_ff_fms_init_upload_seq_err, + { "FMS Initiate Upload Sequence Error", + "ff.fms.init_upload_seq.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_upload_seq_err_err_class, + { "Error Class", "ff.fms.init_upload_seq.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_upload_seq_err_err_code, + { "Error Code", "ff.fms.init_upload_seq.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_upload_seq_err_additional_code, + { "Additional Code", "ff.fms.init_upload_seq.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_init_upload_seq_err_additional_desc, + { "Additional Description", + "ff.fms.init_upload_seq.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.18. FMS Upload Segment (Confirmed Service Id = 13) + */ + { &hf_ff_fms_upload_seg, + { "FMS Upload Segment", "ff.fms.upload_seg", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.18.1. Request Message Parameters + */ + { &hf_ff_fms_upload_seg_req, + { "FMS Upload Segment Request", "ff.fms.upload_seg.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_upload_seg_req_idx, + { "Index", "ff.fms.upload_seg.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.18.2. Response Message Parameters + */ + { &hf_ff_fms_upload_seg_rsp, + { "FMS Upload Segment Response", "ff.fms.upload_seg.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_upload_seg_rsp_more_follows, + { "More Follows", "ff.fms.upload_seg.rsp.more_follows", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_upload_seg_rsp_final_result, + { "Final Result", "ff.fms.upload_seg.rsp.final_result", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.3.18.3. Error Message Parameters + */ + { &hf_ff_fms_upload_seg_err, + { "FMS Upload Segment Error", "ff.fms.upload_seg.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_upload_seg_err_err_class, + { "Error Class", "ff.fms.upload_seg.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_upload_seg_err_err_code, + { "Error Code", "ff.fms.upload_seg.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_upload_seg_err_additional_code, + { "Additional Code", "ff.fms.upload_seg.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_upload_seg_err_additional_desc, + { "Additional Description", "ff.fms.upload_seg.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.19. FMS Terminate Upload Sequence (Confirmed Service Id = 14) + */ + { &hf_ff_fms_terminate_upload_seq, + { "FMS Terminate Upload Sequence", + "ff.fms.terminate_upload_seq", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.19.1. Request Message Parameters + */ + { &hf_ff_fms_terminate_upload_seq_req, + { "FMS Terminate Upload Sequence Request", + "ff.fms.terminate_upload_seq.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_upload_seq_req_idx, + { "Index", "ff.fms.terminate_upload_seq.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.19.2. Response Message Parameters + */ + { &hf_ff_fms_terminate_upload_seq_rsp, + { "FMS Terminate Upload Sequence Response", + "ff.fms.terminate_upload_seq.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.19.3. Error Message Parameters + */ + { &hf_ff_fms_terminate_upload_seq_err, + { "FMS Terminate Upload Sequence Error", + "ff.fms.terminate_upload_seq.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_upload_seq_err_err_class, + { "Error Class", "ff.fms.terminate_upload_seq.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_upload_seq_err_err_code, + { "Error Code", "ff.fms.terminate_upload_seq.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_upload_seq_err_additional_code, + { "Additional Code", + "ff.fms.terminate_upload_seq.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_terminate_upload_seq_err_additional_desc, + { "Additional Description", + "ff.fms.terminate_upload_seq.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.20. FMS Request Domain Download (Confirmed Service Id = 15) + */ + { &hf_ff_fms_req_dom_download, + { "FMS Request Domain Download", "ff.fms.req_dom_download", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.20.1. Request Message Parameters + */ + { &hf_ff_fms_req_dom_download_req, + { "FMS Request Domain Download Request", + "ff.fms.req_dom_download.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_download_req_idx, + { "Index", "ff.fms.req_dom_download.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_download_req_additional_info, + { "Additional Description", + "ff.fms.req_dom_download.req.additional_info", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.20.2. Response Message Parameters + */ + { &hf_ff_fms_req_dom_download_rsp, + { "FMS Request Domain Download Response", + "ff.fms.req_dom_download.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + /* + * 6.5.3.20.3. Error Message Parameters + */ + { &hf_ff_fms_req_dom_download_err, + { "FMS Request Domain Download Error", + "ff.fms.req_dom_download.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_download_err_err_class, + { "Error Class", "ff.fms.req_dom_download.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_download_err_err_code, + { "Error Code", "ff.fms.req_dom_download.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_download_err_additional_code, + { "Additional Code", "ff.fms.req_dom_download.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_download_err_additional_desc, + { "Additional Description", + "ff.fms.req_dom_download.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.21. FMS Request Domain Upload (Confirmed Service Id = 16) + */ + { &hf_ff_fms_req_dom_upload, + { "FMS Request Domain Upload", "ff.fms.req_dom_upload", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.21.1. Request Message Parameters + */ + { &hf_ff_fms_req_dom_upload_req, + { "FMS Request Domain Upload Request", "ff.fms.req_dom_upload.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_upload_req_idx, + { "Index", "ff.fms.req_dom_upload.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_upload_req_additional_info, + { "Additional Description", + "ff.fms.req_dom_upload.req.additional_info", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.21.2. Response Message Parameters + */ + { &hf_ff_fms_req_dom_upload_rsp, + { "FMS Request Domain Upload Response", "ff.fms.req_dom_upload.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.21.3. Error Message Parameters + */ + { &hf_ff_fms_req_dom_upload_err, + { "FMS Request Domain Upload Error", "ff.fms.req_dom_upload.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_upload_err_err_class, + { "Error Class", "ff.fms.req_dom_upload.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_upload_err_err_code, + { "Error Code", "ff.fms.req_dom_upload.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_upload_err_additional_code, + { "Additional Code", "ff.fms.req_dom_upload.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_req_dom_upload_err_additional_desc, + { "Additional Description", + "ff.fms.req_dom_upload.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.22. FMS Create Program Invocation (Confirmed Service Id = 17) + */ + { &hf_ff_fms_create_pi, + { "FMS Create Program Invocation", "ff.fms.create_pi", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.22.1. Request Message Parameters + */ + { &hf_ff_fms_create_pi_req, + { "FMS Create Program Invocation Request", "ff.fms.create_pi.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_create_pi_req_reusable, + { "Reusable", "ff.fms.create_pi.req.reusable", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_create_pi_req_reserved, + { "Reserved", "ff.fms.create_pi.req.reserved", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_create_pi_req_num_of_dom_idxes, + { "Number of Domain Indexes", + "ff.fms.create_pi.req.num_of_dom_idxes", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_create_pi_req_dom_idx, + { "Domain Index", "ff.fms.create_pi.req.list_of_dom_idxes.dom_idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.22.2. Response Message Parameters + */ + { &hf_ff_fms_create_pi_rsp, + { "FMS Create Program Invocation Response", "ff.fms.create_pi.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_create_pi_rsp_idx, + { "Index", "ff.fms.create_pi.rsp.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.22.3. Error Message Parameters + */ + { &hf_ff_fms_create_pi_err, + { "FMS Create Program Invocation Error", "ff.fms.create_pi.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_create_pi_err_err_class, + { "Error Class", "ff.fms.create_pi.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_create_pi_err_err_code, + { "Error Code", "ff.fms.create_pi.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_create_pi_err_additional_code, + { "Additional Code", + "ff.fms.create_pi.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_create_pi_err_additional_desc, + { "Additional Description", + "ff.fms.create_pi.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.23. FMS Delete Program Invocation (Confirmed Service Id = 18) + */ + { &hf_ff_fms_del_pi , + { "FMS Delete Program Invocation", "ff.fms.del_pi", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.23.1. Request Message Parameters + */ + { &hf_ff_fms_del_pi_req, + { "FMS Delete Program Invocation Request", "ff.fms.del_pi.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_pi_req_idx, + { "Index", "ff.fms.del_pi.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.23.2. Response Message Parameters + */ + { &hf_ff_fms_del_pi_rsp, + { "FMS Delete Program Invocation Response", "ff.fms.del_pi.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.23.3. Error Message Parameters + */ + { &hf_ff_fms_del_pi_err, + { "FMS Delete Program Invocation Error", "ff.fms.del_pi.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_pi_err_err_class, + { "Error Class", "ff.fms.del_pi.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_pi_err_err_code, + { "Error Code", "ff.fms.del_pi.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_pi_err_additional_code, + { "Additional Code", + "ff.fms.del_pi.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_pi_err_additional_desc, + { "Additional Description", + "ff.fms.del_pi.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.24. FMS Start (Confirmed Service Id = 19) + */ + { &hf_ff_fms_start, + { "FMS Start", "ff.fms.start", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.24.1. Request Message Parameters + */ + { &hf_ff_fms_start_req, + { "FMS Start Request", "ff.fms.start.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_start_req_idx, + { "Index", "ff.fms.start.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_start_req_execution_argument, + { "Execution Argument", "ff.fms.start.req.execution_argument", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.3.24.2. Response Message Parameters + */ + { &hf_ff_fms_start_rsp, + { "FMS Start Response", "ff.fms.start.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.24.3. PI Error Message Parameters + */ + { &hf_ff_fms_start_err, + { "FMS Start Error", "ff.fms.start.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_start_err_pi_state, + { "Pi State", "ff.fms.start.err.pi_state", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_start_err_err_class, + { "Error Class", "ff.fms.start.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_start_err_err_code, + { "Error Code", "ff.fms.start.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_start_err_additional_code, + { "Additional Code", "ff.fms.start.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_start_err_additional_desc, + { "Additional Description", "ff.fms.start.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.25. FMS Stop (Confirmed Service Id = 20) + */ + { &hf_ff_fms_stop, + { "FMS Stop", "ff.fms.stop", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.25.1. Request Message Parameters + */ + { &hf_ff_fms_stop_req, + { "FMS Stop Request", "ff.fms.stop.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_stop_req_idx, + { "Index", "ff.fms.stop.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.25.2. Response Message Parameters + */ + { &hf_ff_fms_stop_rsp, + { "FMS Stop Response", "ff.fms.stop.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.25.3. Error Message Parameters + */ + { &hf_ff_fms_stop_err, + { "FMS Stop Error", "ff.fms.stop.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_stop_err_pi_state, + { "Pi State", "ff.fms.stop.err.pi_state", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_stop_err_err_class, + { "Error Class", "ff.fms.stop.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_stop_err_err_code, + { "Error Code", "ff.fms.stop.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_stop_err_additional_code, + { "Additional Code", "ff.fms.stop.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_stop_err_additional_desc, + { "Additional Description", "ff.fms.stop.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.26. FMS Resume (Confirmed Service Id = 21) + */ + { &hf_ff_fms_resume, + { "FMS Resume", "ff.fms.resume", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.26.1. Request Message Parameters + */ + { &hf_ff_fms_resume_req, + { "FMS Resume Request", "ff.fms.resume.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_resume_req_idx, + { "Index", "ff.fms.resume.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_resume_req_execution_argument, + { "Execution Argument", "ff.fms.resume.req.execution_argument", + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.3.26.2. Response Message Parameters + */ + { &hf_ff_fms_resume_rsp, + { "FMS Resume Response", "ff.fms.resume.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.26.3. Error Message Parameters + */ + { &hf_ff_fms_resume_err, + { "FMS Resume Error", "ff.fms.resume.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_resume_err_pi_state, + { "Pi State", "ff.fms.resume.err.pi_state", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_resume_err_err_class, + { "Error Class", "ff.fms.resume.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_resume_err_err_code, + { "Error Code", "ff.fms.resume.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_resume_err_additional_code, + { "Additional Code", "ff.fms.resume.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_resume_err_additional_desc, + { "Additional Description", "ff.fms.resume.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.27. FMS Reset (Confirmed Service Id = 22) + */ + { &hf_ff_fms_reset, + { "FMS Reset", "ff.fms.reset", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.27.1. Request Message Parameters + */ + { &hf_ff_fms_reset_req, + { "FMS Reset Request", "ff.fms.reset.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_reset_req_idx, + { "Index", "ff.fms.reset.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.27.2. Response Message Parameters + */ + { &hf_ff_fms_reset_rsp, + { "FMS Reset Response", "ff.fms.reset.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.27.3. Error Message Parameters + */ + { &hf_ff_fms_reset_err, + { "FMS Reset Error", "ff.fms.reset.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_reset_err_pi_state, + { "Pi State", "ff.fms.reset.err.pi_state", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_reset_err_err_class, + { "Error Class", "ff.fms.reset.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_reset_err_err_code, + { "Error Code", "ff.fms.reset.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_reset_err_additional_code, + { "Additional Code", "ff.fms.reset.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_reset_err_additional_desc, + { "Additional Description", "ff.fms.reset.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.28. FMS Kill (Confirmed Service Id = 23) + */ + { &hf_ff_fms_kill, + { "FMS Kill", "ff.fms.kill", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.28.1. Request Message Parameters + */ + { &hf_ff_fms_kill_req, + { "FMS Kill Request", "ff.fms.kill.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.28.2. Response Message Parameters + */ + { &hf_ff_fms_kill_rsp, + { "FMS Kill Response", "ff.fms.kill.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.28.3. Error Message Parameters + */ + { &hf_ff_fms_kill_err, + { "FMS Kill Error", "ff.fms.kill.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_kill_req_idx, + { "Index", "ff.fms.kill.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_kill_err_err_class, + { "Error Class", "ff.fms.kill.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_kill_err_err_code, + { "Error Code", "ff.fms.kill.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_kill_err_additional_code, + { "Additional Code", "ff.fms.kill.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_kill_err_additional_desc, + { "Additional Description", "ff.fms.kill.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.29. FMS Read (Confirmed Service Id = 2) + */ + { &hf_ff_fms_read, + { "FMS Read", "ff.fms.read", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.29.1. Request Message Parameters + */ + { &hf_ff_fms_read_req, + { "FMS Read Request", "ff.fms.read.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_req_idx, + { "Index", "ff.fms.read.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.29.2. Response Message Parameters + */ + { &hf_ff_fms_read_rsp, + { "FMS Read Response", "ff.fms.read.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.29.3. Error Message Parameters + */ + { &hf_ff_fms_read_err, + { "FMS Read Error", "ff.fms.read.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_err_err_class, + { "Error Class", "ff.fms.read.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_err_err_code, + { "Error Code", "ff.fms.read.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_err_additional_code, + { "Additional Code", "ff.fms.read.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_err_additional_desc, + { "Additional Description", "ff.fms.read.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.30. FMS Read with Subindex (Confirmed Service Id = 82) + */ + { &hf_ff_fms_read_with_subidx, + { "FMS Read with Subindex", "ff.fms.read_with_subidx", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.30.1. Request Message Parameters + */ + { &hf_ff_fms_read_with_subidx_req, + { "FMS Read with Subindex Request", "ff.fms.read_with_subidx.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_with_subidx_req_idx, + { "Index", "ff.fms.read_with_subidx.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_with_subidx_req_subidx, + { "Index", "ff.fms.read_with_subidx.req.subidx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.30.2. Response Message Parameters + */ + { &hf_ff_fms_read_with_subidx_rsp, + { "FMS Read with Subindex Response", "ff.fms.read_with_subidx.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.30.3. Error Message Parameters + */ + { &hf_ff_fms_read_with_subidx_err, + { "FMS Read with Subindex Error", "ff.fms.read_with_subidx.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_with_subidx_err_err_class, + { "Error Class", "ff.fms.read_with_subidx.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_with_subidx_err_err_code, + { "Error Code", "ff.fms.read_with_subidx.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_with_subidx_err_additional_code, + { "Additional Code", "ff.fms.read_with_subidx.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_read_with_subidx_err_additional_desc, + { "Additional Description", + "ff.fms.read_with_subidx.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.31. FMS Write (Confirmed Service Id = 3) + */ + { &hf_ff_fms_write, + { "FMS Write", "ff.fms.write", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.31.1. Request Message Parameters + */ + { &hf_ff_fms_write_req, + { "FMS Write Request", "ff.fms.write.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_req_idx, + { "Index", "ff.fms.write.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.31.2. Response Message Parameters + */ + { &hf_ff_fms_write_rsp, + { "FMS Write Response", "ff.fms.write.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.31.3. Error Message Parameters + */ + { &hf_ff_fms_write_err, + { "FMS Write Error", "ff.fms.write.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_err_err_class, + { "Error Class", "ff.fms.write.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_err_err_code, + { "Error Code", "ff.fms.write.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_err_additional_code, + { "Additional Code", "ff.fms.write.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_err_additional_desc, + { "Additional Description", "ff.fms.write.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.32. FMS Write with Subindex (Confirmed Service Id = 83) + */ + { &hf_ff_fms_write_with_subidx, + { "FMS Write with Subindex", "ff.fms.write_with_subidx", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.32.1. Request Message Parameters + */ + { &hf_ff_fms_write_with_subidx_req, + { "FMS Write with Subindex Request", "ff.fms.write_with_subidx.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_with_subidx_req_idx, + { "Index", "ff.fms.write_with_subidx.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_with_subidx_req_subidx, + { "Index", "ff.fms.write_with_subidx.req.subidx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.32.2. Response Message Parameters + */ + { &hf_ff_fms_write_with_subidx_rsp, + { "FMS Write with Subindex Response", + "ff.fms.write_with_subidx.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.32.3. Error Message Parameters + */ + { &hf_ff_fms_write_with_subidx_err, + { "FMS Write with Subindex Error", "ff.fms.write_with_subidx.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_with_subidx_err_err_class, + { "Error Class", "ff.fms.write_with_subidx.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_with_subidx_err_err_code, + { "Error Code", "ff.fms.write_with_subidx.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_with_subidx_err_additional_code, + { "Additional Code", "ff.fms.write_with_subidx.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_write_with_subidx_err_additional_desc, + { "Additional Description", + "ff.fms.write_with_subidx.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.33. FMS Define Variable List (Confirmed Service Id = 7) + */ + { &hf_ff_fms_def_variable_list, + { "FMS Define Variable List", "ff.fms.def_variable_list", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.33.1. Request Message Parameters + */ + { &hf_ff_fms_def_variable_list_req, + { "FMS Define Variable List Request", + "ff.fms.def_variable_list.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_def_variable_list_req_num_of_idxes, + { "Number of Indexes", "ff.fms.def_variable_list.req.num_of_idxes", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_def_variable_list_req_idx, + { "Index", "ff.fms.def_variable_list.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.33.2. Response Message Parameters + */ + { &hf_ff_fms_def_variable_list_rsp, + { "FMS Define Variable List Response", + "ff.fms.def_variable_list.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_def_variable_list_rsp_idx, + { "Index", "ff.fms.def_variable_list.rsp.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.33.3. Error Message Parameters + */ + { &hf_ff_fms_def_variable_list_err, + { "FMS Define Variable List Error", "ff.fms.def_variable_list.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_def_variable_list_err_err_class, + { "Error Class", "ff.fms.def_variable_list.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_def_variable_list_err_err_code, + { "Error Code", "ff.fms.def_variable_list.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_def_variable_list_err_additional_code, + { "Additional Code", "ff.fms.def_variable_list.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_def_variable_list_err_additional_desc, + { "Additional Description", + "ff.fms.def_variable_list.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.34. FMS Delete Variable List (Confirmed Service Id = 8) + */ + { &hf_ff_fms_del_variable_list, + { "FMS Delete Variable List", "ff.fms.del_variable_list", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.34.1. Request Message Parameters + */ + { &hf_ff_fms_del_variable_list_req, + { "FMS Delete Variable List Request", + "ff.fms.del_variable_list.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_variable_list_req_idx, + { "Index", "ff.fms.del_variable_list.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.34.2. Response Message Parameters + */ + { &hf_ff_fms_del_variable_list_rsp, + { "FMS Delete Variable List Response", + "ff.fms.del_variable_list.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.34.3. Error Message Parameters + */ + { &hf_ff_fms_del_variable_list_err, + { "FMS Delete Variable List Error", "ff.fms.del_variable_list.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_variable_list_err_err_class, + { "Error Class", "ff.fms.del_variable_list.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_variable_list_err_err_code, + { "Error Code", "ff.fms.del_variable_list.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_variable_list_err_additional_code, + { "Additional Code", "ff.fms.del_variable_list.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_del_variable_list_err_additional_desc, + { "Additional Description", + "ff.fms.del_variable_list.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.35. FMS Information Report (Unconfirmed Service Id = 0) + */ + { &hf_ff_fms_info_report, + { "FMS Information Report", "ff.fms.info_report", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.35.1. Request Message Parameters + */ + { &hf_ff_fms_info_report_req, + { "FMS Information Report Request", "ff.fms.info_report.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_info_report_req_idx, + { "Index", "ff.fms.info_report.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.36. FMS Information Report with Subindex + * (Unconfirmed Service Id = 16) + */ + { &hf_ff_fms_info_report_with_subidx, + { "FMS Information Report with Subindex", + "ff.fms.info_report_with_subidx", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.36.1. Request Message Parameters + */ + { &hf_ff_fms_info_report_with_subidx_req, + { "FMS Information Report with Subindex Request", + "ff.fms.info_report_with_subidx.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_info_report_with_subidx_req_idx, + { "Index", "ff.fms.info_report_with_subidx.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_info_report_with_subidx_req_subidx, + { "Subindex", "ff.fms.info_report_with_subidx.req.subidx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.37. FMS Information Report On Change + * (Unconfirmed Service Id = 17) + */ + { &hf_ff_fms_info_report_on_change, + { "FMS Information Report On Change with Subindex", + "ff.fms.info_report_on_change", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.37.1. Request Message Parameters + */ + { &hf_ff_fms_info_report_on_change_req, + { "FMS Information Report On Change with Subindex Request", + "ff.fms.info_report_on_change.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_info_report_on_change_req_idx, + { "Index", "ff.fms.info_report_on_change.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.38. FMS Information Report On Change with Subindex + * (Unconfirmed Service Id = 18) + */ + { &hf_ff_fms_info_report_on_change_with_subidx, + { "FMS Information Report On Change", + "ff.fms.info_report_on_change_with_subidx", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.38.1. Request Message Parameters + */ + { &hf_ff_fms_info_report_on_change_with_subidx_req, + { "FMS Information Report On Change Request", + "ff.fms.info_report_on_change_with_subidx.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_info_report_on_change_with_subidx_req_idx, + { "Index", "ff.fms.info_report_on_change_with_subidx.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_info_report_on_change_with_subidx_req_subidx, + { "Subindex", "ff.fms.info_report_on_change_with_subidx.req.subidx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.39. FMS Event Notification (Unconfirmed Service Id = 2) + */ + { &hf_ff_fms_ev_notification, + { "FMS Event Notification", "ff.fms.ev_notification", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.39.1. Request Message Parameters + */ + { &hf_ff_fms_ev_notification_req, + { "FMS Event Notification Request", "ff.fms.ev_notification.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_ev_notification_req_idx, + { "Index", "ff.fms.ev_notification.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_ev_notification_req_ev_num, + { "Event Number", "ff.fms.ev_notification.req.ev_num", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.40. FMS Alter Event Condition Monitoring + * (Confirmed Service Id = 24) + */ + { &hf_ff_fms_alter_ev_condition_monitoring, + { "FMS Alter Event Condition Monitoring", + "ff.fms.alter_ev_condition_monitoring", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.40.1. Request Message Parameters + */ + { &hf_ff_fms_alter_ev_condition_monitoring_req, + { "FMS Alter Event Condition Monitoring Request", + "ff.fms.alter_ev_condition_monitoring.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_alter_ev_condition_monitoring_req_idx, + { "Index", "ff.fms.alter_ev_condition_monitoring.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_alter_ev_condition_monitoring_req_enabled, + { "Enabled", "ff.fms.alter_ev_condition_monitoring.req.enabled", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.40.2. Response Message Parameters + */ + { &hf_ff_fms_alter_ev_condition_monitoring_rsp, + { "FMS Alter Event Condition Monitoring Response", + "ff.fms.alter_ev_condition_monitoring.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.40.3. Error Message Parameters + */ + { &hf_ff_fms_alter_ev_condition_monitoring_err, + { "FMS Alter Event Condition Monitoring Error", + "ff.fms.alter_ev_condition_monitoring.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_alter_ev_condition_monitoring_err_err_class, + { "Error Class", + "ff.fms.alter_ev_condition_monitoring.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_alter_ev_condition_monitoring_err_err_code, + { "Error Code", "ff.fms.alter_ev_condition_monitoring.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_alter_ev_condition_monitoring_err_additional_code, + { "Additional Code", + "ff.fms.alter_ev_condition_monitoring.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_alter_ev_condition_monitoring_err_additional_desc, + { "Additional Description", + "ff.fms.alter_ev_condition_monitoring.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.41. FMS Acknowledge Event Notification + * (Confirmed Service Id = 25) + */ + { &hf_ff_fms_ack_ev_notification, + { "FMS Acknowledge Event Notification", + "ff.fms.ack_ev_notification", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.41.1. Request Message Parameters + */ + { &hf_ff_fms_ack_ev_notification_req, + { "FMS Acknowledge Event Notification Request", + "ff.fms.ack_ev_notification.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_ack_ev_notification_req_idx, + { "Index", "ff.fms.ack_ev_notification.req.idx", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_ack_ev_notification_req_ev_num, + { "Event Number", "ff.fms.ack_ev_notification.req.ev_num", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.41.2. Response Message Parameters + */ + { &hf_ff_fms_ack_ev_notification_rsp, + { "FMS Acknowledge Event Notification Response", + "ff.fms.ack_ev_notification.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.3.41.3. Error Message Parameters + */ + { &hf_ff_fms_ack_ev_notification_err, + { "FMS Acknowledge Event Notification Error", + "ff.fms.ack_ev_notification.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_ack_ev_notification_err_err_class, + { "Error Class", "ff.fms.ack_ev_notification.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_ack_ev_notification_err_err_code, + { "Error Code", "ff.fms.ack_ev_notification.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_ack_ev_notification_err_additional_code, + { "Additional Code", + "ff.fms.ack_ev_notification.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_fms_ack_ev_notification_err_additional_desc, + { "Additional Description", + "ff.fms.ack_ev_notification.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4. LAN Redundancy Services + */ + { &hf_ff_lr, + { "LAN Redundancy Service", "ff.lr", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.1. LAN Redundancy Get Information (Confirmed Service Id = 1) + */ + { &hf_ff_lr_get_info, + { "LAN Redundancy Get Information", + "ff.lr.get_info", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.1.1. Request Message Parameters + */ + { &hf_ff_lr_get_info_req, + { "LAN Redundancy Get Information Request", + "ff.lr.get_info.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.1.2. Response Message Parameters + */ + { &hf_ff_lr_get_info_rsp, + { "LAN Redundancy Get Information Response", + "ff.lr.get_info.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_lr_attrs_ver, + { "LAN Redundancy Attributes Version", + "ff.lr.get_info.rsp.lr_attrs_ver", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_lr_max_msg_num_diff, + { "Max Message Number Difference", + "ff.lr.get_info.rsp.max_msg_num_diff", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_reserved, + { "Reserved", + "ff.lr.get_info.rsp.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_diagnostic_msg_intvl, + { "Diagnostic Message Interval", + "ff.lr.get_info.rsp.diagnostic_msg_intvl", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_aging_time, + { "Aging Time", + "ff.lr.get_info.rsp.aging_time", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_diagnostic_msg_if_a_send_addr, + { "Diagnostic Message Interface A Send Address", + "ff.lr.get_info.rsp.diagnostic_msg_if_a_send_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_diagnostic_msg_if_a_recv_addr, + { "Diagnostic Message Interface A Receive Address", + "ff.lr.get_info.rsp.diagnostic_msg_if_a_recv_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_diagnostic_msg_if_b_send_addr, + { "Diagnostic Message Interface B Send Address", + "ff.lr.get_info.rsp.diagnostic_msg_if_b_send_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_diagnostic_msg_if_b_recv_addr, + { "Diagnostic Message Interface B Receive Address", + "ff.lr.get_info.rsp.diagnostic_msg_if_b_recv_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_lr_flags_reserved, + { "Reserved", + "ff.lr.get_info.rsp.lr_flags.reserved", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_lr_flags_load_balance, + { "Load Balancing", + "ff.lr.get_info.rsp.lr_flags.load_balance", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_lr_flags_diag, + { "Diagnosis Using Own Messages", + "ff.lr.get_info.rsp.lr_flags.diag", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_lr_flags_multi_recv, + { "Single Multicast Message Reception Interface", + "ff.lr.get_info.rsp.lr_flags.multi_recv", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_lr_flags_cross_cable, + { "Crossed Cable Detection", + "ff.lr.get_info.rsp.lr_flags.cross_cable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_lr_flags_multi_trans, + { "Single Multicast Message Transmission Interface", + "ff.lr.get_info.rsp.lr_flags.multi_trans", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01, NULL, HFILL } }, + + { &hf_ff_lr_get_info_rsp_lr_flags, + { "LAN Redundancy Flags", + "ff.lr.get_info.rsp.lr_flags", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.1.3. Error Message Parameters + */ + { &hf_ff_lr_get_info_err, + { "LAN Redundancy Get Information Error", + "ff.lr.get_info.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_err_err_class, + { "Error Class", "ff.lr.get_info.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_err_err_code, + { "Error Code", "ff.lr.get_info.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_err_additional_code, + { "Additional Code", + "ff.lr.get_info.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_info_err_additional_desc, + { "Additional Description", + "ff.lr.get_info.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.2. LAN Redundancy Put Information (Confirmed Service Id = 2) + */ + { &hf_ff_lr_put_info, + { "LAN Redundancy Put Information", "ff.lr.put_info", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.2.1. Request Message Parameters + */ + { &hf_ff_lr_put_info_req, + { "LAN Redundancy Put Information Request", "ff.lr.put_info.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_lr_attrs_ver, + { "LAN Redundancy Attributes Version", + "ff.lr.put_info.req.lr_attrs_ver", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_lr_max_msg_num_diff, + { "Max Message Number Difference", + "ff.lr.put_info.req.max_msg_num_diff", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_reserved, + { "Reserved", + "ff.lr.put_info.req.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_diagnostic_msg_intvl, + { "Diagnostic Message Interval", + "ff.lr.put_info.req.diagnostic_msg_intvl", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_aging_time, + { "Aging Time", + "ff.lr.put_info.req.aging_time", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_diagnostic_msg_if_a_send_addr, + { "Diagnostic Message Interface A Send Address", + "ff.lr.put_info.req.diagnostic_msg_if_a_send_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_diagnostic_msg_if_a_recv_addr, + { "Diagnostic Message Interface A Receive Address", + "ff.lr.put_info.req.diagnostic_msg_if_a_recv_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_diagnostic_msg_if_b_send_addr, + { "Diagnostic Message Interface B Send Address", + "ff.lr.put_info.req.diagnostic_msg_if_b_send_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_diagnostic_msg_if_b_recv_addr, + { "Diagnostic Message Interface B Receive Address", + "ff.lr.put_info.req.diagnostic_msg_if_b_recv_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_lr_flags_reserved, + { "Reserved", + "ff.lr.put_info.req.lr_flags.reserved", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_lr_flags_load_balance, + { "Load Balancing", + "ff.lr.put_info.req.lr_flags.load_balance", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_lr_flags_diag, + { "Diagnosis Using Own Messages", + "ff.lr.put_info.req.lr_flags.diag", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_lr_flags_multi_recv, + { "Single Multicast Message Reception Interface", + "ff.lr.put_info.req.lr_flags.multi_recv", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_lr_flags_cross_cable, + { "Crossed Cable Detection", + "ff.lr.put_info.req.lr_flags.cross_cable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_lr_flags_multi_trans, + { "Single Multicast Message Transmission Interface", + "ff.lr.put_info.req.lr_flags.multi_trans", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01, NULL, HFILL } }, + + { &hf_ff_lr_put_info_req_lr_flags, + { "LAN Redundancy Flags", + "ff.lr.put_info.req.lr_flags", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.4.2.2. Response Message Parameters + */ + { &hf_ff_lr_put_info_rsp, + { "LAN Redundancy Put Information Response", + "ff.lr.put_info.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_lr_attrs_ver, + { "LAN Redundancy Attributes Version", + "ff.lr.put_info.rsp.lr_attrs_ver", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_lr_max_msg_num_diff, + { "Max Message Number Difference", + "ff.lr.put_info.rsp.max_msg_num_diff", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_reserved, + { "Reserved", + "ff.lr.put_info.rsp.reserved", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_diagnostic_msg_intvl, + { "Diagnostic Message Interval", + "ff.lr.put_info.rsp.diagnostic_msg_intvl", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_aging_time, + { "Aging Time", + "ff.lr.put_info.rsp.aging_time", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_diagnostic_msg_if_a_send_addr, + { "Diagnostic Message Interface A Send Address", + "ff.lr.put_info.rsp.diagnostic_msg_if_a_send_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_diagnostic_msg_if_a_recv_addr, + { "Diagnostic Message Interface A Receive Address", + "ff.lr.put_info.rsp.diagnostic_msg_if_a_recv_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_diagnostic_msg_if_b_send_addr, + { "Diagnostic Message Interface B Send Address", + "ff.lr.put_info.rsp.diagnostic_msg_if_b_send_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_diagnostic_msg_if_b_recv_addr, + { "Diagnostic Message Interface B Receive Address", + "ff.lr.put_info.rsp.diagnostic_msg_if_b_recv_addr", + FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_lr_flags_reserved, + { "Reserved", + "ff.lr.put_info.rsp.lr_flags.reserved", + FT_UINT8, BASE_HEX, NULL, 0xE0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_lr_flags_load_balance, + { "Load Balancing", + "ff.lr.put_info.rsp.lr_flags.load_balance", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x10, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_lr_flags_diag, + { "Diagnosis Using Own Messages", + "ff.lr.put_info.rsp.lr_flags.diag", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x08, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_lr_flags_multi_recv, + { "Single Multicast Message Reception Interface", + "ff.lr.put_info.rsp.lr_flags.multi_recv", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x04, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_lr_flags_cross_cable, + { "Crossed Cable Detection", + "ff.lr.put_info.rsp.lr_flags.cross_cable", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x02, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_lr_flags_multi_trans, + { "Single Multicast Message Transmission Interface", + "ff.lr.put_info.rsp.lr_flags.multi_trans", + FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled), 0x01, NULL, HFILL } }, + + { &hf_ff_lr_put_info_rsp_lr_flags, + { "LAN Redundancy Flags", + "ff.lr.put_info.rsp.lr_flags", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + + /* + * 6.5.4.2.3. Error Message Parameters + */ + { &hf_ff_lr_put_info_err, + { "LAN Redundancy Put Information Error", "ff.lr.put_info.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_err_err_class, + { "Error Class", "ff.lr.put_info.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_err_err_code, + { "Error Code", "ff.lr.put_info.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_err_additional_code, + { "Additional Code", + "ff.lr.put_info.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_put_info_err_additional_desc, + { "Additional Description", + "ff.lr.put_info.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.3. LAN Redundancy Get Statistics (Confirmed Service Id = 3) + */ + { &hf_ff_lr_get_statistics, + { "LAN Redundancy Get Statistics", + "ff.lr.get_statistics", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.3.1. Request Message Parameters + */ + { &hf_ff_lr_get_statistics_req, + { "LAN Redundancy Get Statistics Request", + "ff.lr.get_statistics.req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.3.2. Response Message Parameters + */ + { &hf_ff_lr_get_statistics_rsp, + { "LAN Redundancy Get Statistics Response", + "ff.lr.get_statistics.rsp", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_recv_a, + { "Error Code", "ff.lr.get_statistics.rsp.num_diag_svr_ind_recv_a", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_miss_a, + { "Error Code", "ff.lr.get_statistics.rsp.num_diag_svr_ind_miss_a", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_rsp_num_rem_dev_diag_recv_fault_a, + { "Error Code", + "ff.lr.get_statistics.rsp.num_rem_dev_diag_recv_fault_a", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_recv_b, + { "Error Code", "ff.lr.get_statistics.rsp.num_diag_svr_ind_recv_b", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_rsp_num_diag_svr_ind_miss_b, + { "Error Code", "ff.lr.get_statistics.rsp.num_diag_svr_ind_miss_b", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_rsp_num_rem_dev_diag_recv_fault_b, + { "Error Code", + "ff.lr.get_statistics.rsp.num_rem_dev_diag_recv_fault_b", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_rsp_num_x_cable_stat, + { "Error Code", "ff.lr.get_statistics.rsp.num_x_cable_stat", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_rsp_x_cable_stat, + { "Error Code", "ff.lr.get_statistics.rsp.x_cable_stat", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.3.3. Error Message Parameters + */ + { &hf_ff_lr_get_statistics_err, + { "LAN Redundancy Get Statistics Error", + "ff.lr.get_statistics.err", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_err_err_class, + { "Error Class", "ff.lr.get_statistics.err.err_class", + FT_UINT8, BASE_DEC|BASE_EXT_STRING, &names_err_class_ext, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_err_err_code, + { "Error Code", "ff.lr.get_statistics.err.err_code", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_err_additional_code, + { "Additional Code", + "ff.lr.get_statistics.err.additional_code", + FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_get_statistics_err_additional_desc, + { "Additional Description", + "ff.lr.get_statistics.err.additional_desc", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.4 Diagnostic Message (Unconfirmed Service Id = 1) + */ + { &hf_ff_lr_diagnostic_msg, + { "Diagnostic Message", "ff.lr.diagnostic_msg", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + + + /* + * 6.5.4.4.1. Request Message Parameters + */ + { &hf_ff_lr_diagnostic_msg_req, + { "Diagnostic Message Request", "ff.lr.diagnostic_msg_req", + FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_dev_idx, + { "Device Index", "ff.lr.diagnostic_msg.req.dev_idx", + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_num_of_network_ifs, + { "Number of Network Interfaces", + "ff.lr.diagnostic_msg.req.num_of_network_ifs", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_transmission_if, + { "Transmission Interface", + "ff.lr.diagnostic_msg.req.transmission_if", + FT_UINT8, BASE_DEC, VALS(names_transmission_interface), 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_diagnostic_msg_intvl, + { "Diagnostic Message Interval", + "ff.lr.diagnostic_msg.req.diagnostic_msg_intvl", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_pd_tag, + { "PD Tag", "ff.lr.diagnostic_msg.req.pd_tag", + FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_reserved, + { "Reserved", "ff.lr.diagnostic_msg.req.reserved", + FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_num_of_if_statuses, + { "Number of Interface Statuses", + "ff.lr.diagnostic_msg.req.num_of_if_statuses", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_if_a_to_a_status, + { "Interface AtoA Status", + "ff.lr.diagnostic_msg.req.if_a_to_a_status", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_if_b_to_a_status, + { "Interface BtoA Status", + "ff.lr.diagnostic_msg.req.if_b_to_a_status", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_if_a_to_b_status, + { "Interface AtoB Status", + "ff.lr.diagnostic_msg.req.if_a_to_b_status", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_if_b_to_b_status, + { "Interface BtoB Status", + "ff.lr.diagnostic_msg.req.if_b_to_b_status", + FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_dup_detection_state_reserved, + { "Reserved", "ff.lr.diagnostic_msg.req.dup_detection_state.reserved", + FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_dup_detection_state_pd_tag, + { "Duplicate PD Tag", "ff.lr.diagnostic_msg.req.dup_detection_state.pd_tag", + FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x02, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_dup_detection_state_device, + { "Duplicate Device Index", "ff.lr.diagnostic_msg.req.dup_detection_state.device", + FT_BOOLEAN, 8, TFS(&tfs_detected_not_detected), 0x01, NULL, HFILL } }, + + { &hf_ff_lr_diagnostic_msg_req_dup_detection_state, + { "Duplicate Detection State", "ff.lr.diagnostic_msg.req.dup_detection_state", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + }; + + + + static gint *ett[] = { + &ett_ff, + &ett_ff_fda_msg_hdr, + &ett_ff_fda_msg_hdr_proto_and_type, + &ett_ff_fda_msg_hdr_opts, + &ett_ff_fda_msg_hdr_srv, + + &ett_ff_fda_msg_trailer, + + &ett_ff_fda_open_sess_req, + &ett_ff_fda_open_sess_rsp, + &ett_ff_fda_open_sess_err, + + &ett_ff_fda_idle_req, + &ett_ff_fda_idle_rsp, + &ett_ff_fda_idle_err, + + &ett_ff_sm_find_tag_query_req, + &ett_ff_sm_find_tag_reply_req, + &ett_ff_sm_find_tag_reply_req_dup_detection_state, + &ett_ff_sm_find_tag_reply_req_list_of_fda_addr_selectors, + + &ett_ff_sm_id_req, + &ett_ff_sm_id_rsp, + &ett_ff_sm_id_rsp_smk_state, + &ett_ff_sm_id_rsp_dev_type, + &ett_ff_sm_id_rsp_dev_redundancy_state, + &ett_ff_sm_id_rsp_dup_detection_state, + &ett_ff_sm_id_rsp_entries_h1_live_list, + &ett_ff_sm_id_rsp_h1_live_list, + &ett_ff_sm_id_rsp_entries_node_addr, + &ett_ff_sm_id_rsp_h1_node_addr, + &ett_ff_sm_id_err, + + &ett_ff_sm_clear_addr_req, + &ett_ff_sm_clear_addr_rsp, + &ett_ff_sm_clear_addr_err, + + &ett_ff_sm_set_assign_info_req, + &ett_ff_sm_set_assign_info_req_dev_redundancy_state, + &ett_ff_sm_set_assign_info_req_clear_dup_detection_state, + &ett_ff_sm_set_assign_info_rsp, + &ett_ff_sm_set_assign_info_err, + + &ett_ff_sm_clear_assign_info_req, + &ett_ff_sm_clear_assign_info_rsp, + &ett_ff_sm_clear_assign_info_err, + + &ett_ff_sm_dev_annunc_req, + &ett_ff_sm_dev_annunc_req_smk_state, + &ett_ff_sm_dev_annunc_req_dev_type, + &ett_ff_sm_dev_annunc_req_dev_redundancy_state, + &ett_ff_sm_dev_annunc_req_dup_detection_state, + &ett_ff_sm_dev_annunc_req_entries_h1_live_list, + &ett_ff_sm_dev_annunc_req_h1_live_list, + &ett_ff_sm_dev_annunc_req_entries_node_addr, + &ett_ff_sm_dev_annunc_req_h1_node_addr, + + &ett_ff_fms_init_req, + &ett_ff_fms_init_rep, + &ett_ff_fms_init_err, + + &ett_ff_fms_abort_req, + + &ett_ff_fms_status_req, + &ett_ff_fms_status_rsp, + &ett_ff_fms_status_err, + + &ett_ff_fms_unsolicited_status_req, + + &ett_ff_fms_id_req, + &ett_ff_fms_id_rsp, + &ett_ff_fms_id_err, + + &ett_ff_fms_get_od_req, + &ett_ff_fms_get_od_rsp, + &ett_ff_fms_get_od_err, + + &ett_ff_fms_init_put_od_req, + &ett_ff_fms_init_put_od_rsp, + &ett_ff_fms_init_put_od_err, + + &ett_ff_fms_put_od_req, + &ett_ff_fms_put_od_rsp, + &ett_ff_fms_put_od_err, + + &ett_ff_fms_terminate_put_od_req, + &ett_ff_fms_terminate_put_od_rsp, + &ett_ff_fms_terminate_put_od_err, + + &ett_ff_fms_gen_init_download_seq_req, + &ett_ff_fms_gen_init_download_seq_rep, + &ett_ff_fms_gen_init_download_seq_err, + + &ett_ff_fms_gen_download_seg_req, + &ett_ff_fms_gen_download_seg_rsp, + &ett_ff_fms_gen_download_seg_err, + + &ett_ff_fms_gen_terminate_download_seq_req, + &ett_ff_fms_gen_terminate_download_seq_rsp, + &ett_ff_fms_gen_terminate_download_seq_err, + + &ett_ff_fms_init_download_seq_req, + &ett_ff_fms_init_download_seq_rsp, + &ett_ff_fms_init_download_seq_err, + + &ett_ff_fms_download_seg_req, + &ett_ff_fms_download_seg_rsp, + &ett_ff_fms_download_seg_err, + + &ett_ff_fms_terminate_download_seq_req, + &ett_ff_fms_terminate_download_seq_rsp, + &ett_ff_fms_terminate_download_seq_err, + + &ett_ff_fms_init_upload_seq_req, + &ett_ff_fms_init_upload_seq_rsp, + &ett_ff_fms_init_upload_seq_err, + + &ett_ff_fms_upload_seg_req, + &ett_ff_fms_upload_seg_rsp, + &ett_ff_fms_upload_seg_err, + + &ett_ff_fms_terminate_upload_seq_req, + &ett_ff_fms_terminate_upload_seq_rsp, + &ett_ff_fms_terminate_upload_seq_err, + + &ett_ff_fms_req_dom_download_req, + &ett_ff_fms_req_dom_download_rsp, + &ett_ff_fms_req_dom_download_err, + + &ett_ff_fms_req_dom_upload_req, + &ett_ff_fms_req_dom_upload_rsp, + &ett_ff_fms_req_dom_upload_err, + + &ett_ff_fms_create_pi_req, + &ett_ff_fms_create_pi_req_list_of_dom_idxes, + &ett_ff_fms_create_pi_rsp, + &ett_ff_fms_create_pi_err, + + &ett_ff_fms_del_pi_req, + &ett_ff_fms_del_pi_rsp, + &ett_ff_fms_del_pi_err, + + &ett_ff_fms_start_req, + &ett_ff_fms_start_rsp, + &ett_ff_fms_start_err, + + &ett_ff_fms_stop_req, + &ett_ff_fms_stop_rsp, + &ett_ff_fms_stop_err, + + &ett_ff_fms_resume_req, + &ett_ff_fms_resume_rsp, + &ett_ff_fms_resume_err, + + &ett_ff_fms_reset_req, + &ett_ff_fms_reset_rsp, + &ett_ff_fms_reset_err, + + &ett_ff_fms_kill_req, + &ett_ff_fms_kill_rsp, + &ett_ff_fms_kill_err, + + &ett_ff_fms_read_req, + &ett_ff_fms_read_rsp, + &ett_ff_fms_read_err, + + &ett_ff_fms_read_with_subidx_req, + &ett_ff_fms_read_with_subidx_rsp, + &ett_ff_fms_read_with_subidx_err, + + &ett_ff_fms_write_req, + &ett_ff_fms_write_rsp, + &ett_ff_fms_write_err, + + &ett_ff_fms_write_with_subidx_req, + &ett_ff_fms_write_with_subidx_rsp, + &ett_ff_fms_write_with_subidx_err, + + &ett_ff_fms_def_variable_list_req, + &ett_ff_fms_def_variable_list_req_list_of_idxes, + &ett_ff_fms_def_variable_list_rsp, + &ett_ff_fms_def_variable_list_err, + + &ett_ff_fms_del_variable_list_req, + &ett_ff_fms_del_variable_list_rsp, + &ett_ff_fms_del_variable_list_err, + + &ett_ff_fms_info_report_req, + + &ett_ff_fms_info_report_with_subidx_req, + + &ett_ff_fms_info_report_on_change_req, + + &ett_ff_fms_info_report_on_change_with_subidx_req, + + &ett_ff_fms_ev_notification_req, + + &ett_ff_fms_alter_ev_condition_monitoring_req, + &ett_ff_fms_alter_ev_condition_monitoring_rsp, + &ett_ff_fms_alter_ev_condition_monitoring_err, + + &ett_ff_fms_ack_ev_notification_req, + &ett_ff_fms_ack_ev_notification_rsp, + &ett_ff_fms_ack_ev_notification_err, + + &ett_ff_lr_get_info_req, + &ett_ff_lr_get_info_rsp, + &ett_ff_lr_get_info_rsp_lr_flags, + &ett_ff_lr_get_info_err, + + &ett_ff_lr_put_info_req, + &ett_ff_lr_put_info_req_lr_flags, + &ett_ff_lr_put_info_rsp, + &ett_ff_lr_put_info_rsp_lr_flags, + &ett_ff_lr_put_info_err, + + &ett_ff_lr_get_statistics_req, + &ett_ff_lr_get_statistics_rsp, + &ett_ff_lr_get_statistics_rsp_list_of_x_cable_stat, + &ett_ff_lr_get_statistics_err, + + &ett_ff_lr_diagnostic_msg_req, + &ett_ff_lr_diagnostic_msg_req_dup_detection_stat, + &ett_ff_lr_diagnostic_msg_req_a_to_a_status, + &ett_ff_lr_diagnostic_msg_req_b_to_a_status, + &ett_ff_lr_diagnostic_msg_req_a_to_b_status, + &ett_ff_lr_diagnostic_msg_req_b_to_b_status, + }; + + proto_ff = proto_register_protocol("FOUNDATION Fieldbus", "FF", "ff"); + proto_register_field_array(proto_ff, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + ff_udp_handle = register_dissector("ff.udp", dissect_ff_udp, proto_ff); + ff_tcp_handle = register_dissector("ff.tcp", dissect_ff_tcp, proto_ff); +} + + + +void +proto_reg_handoff_ff(void) +{ + /* + * 4.8. Using UDP and TCP + */ + + /* + * 4.8.4.2. Use + * + * - Device Annunciation + * - Client / Server + * - Set/Clear Assignment Info and Clear Address + * - SM Identify + * - SM Find Tag + * - LAN Redundancy Get and Put Information + */ + dissector_add_uint_range_with_preference("udp.port", UDP_PORT_FF_RANGE, ff_udp_handle); + dissector_add_uint_with_preference("tcp.port", TCP_PORT_FF_FMS, ff_tcp_handle); +} + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |