/* 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>
 *
 * $Id$
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/*
 * /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 <glib.h>

#include <epan/packet.h>
#include "packet-ff.h"
#include "packet-tcp.h"



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 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_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_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;

/*
 * 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 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_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_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_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_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_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 = -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_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_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_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 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_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_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 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_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_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_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_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_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_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_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_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_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_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 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"},
    { PROTOCOL_FDA, "FDA Session Management" },
    { PROTOCOL_SM, "SM" },
    { PROTOCOL_FMS, "FMS" },
    { PROTOCOL_LAN, "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[] = {
    { 0x02, "NO_TAG" },         /* 0000 0010 */
    { 0x04, "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[] = {
    { 0x04, "Primary" }, /* 0000 0100 */
    { 0x08, "Secondary" }, /* 0000 1000 */
    { 0, NULL }
};



static const value_string names_assigned_redundant_dev_type[] = {
    { 0x00, "Type D-1 Device" }, /* 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[] = {
    { 0x00, "Not used" },               /* 0000 0000 */
    { 0x04, "Type D-2 Device Primary" }, /* 0000 0100 */
    { 0x08, "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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FDA Open Session Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FDA Open Session Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fda_open_sess_req);

    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|ENC_NA);
    offset += 32;
    length -= 32;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FDA Open Session Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FDA Open Session Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fda_open_sess_rsp);

    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|ENC_NA);
    offset += 32;
    length -= 32;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FDA Open Session Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FDA Open Session Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fda_open_sess_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FDA Idle Request");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FDA Idle Request");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fda_idle_req);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FDA Idle Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FDA Idle Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fda_idle_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FDA Idle Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FDA Idle Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fda_idle_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Find Tag Query Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Find Tag Query Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_sm_find_tag_query_req);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    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|ENC_NA);
    offset += 32;
    length -= 32;

    proto_tree_add_item(sub_tree,
        hf_ff_sm_find_tag_query_req_vfd_tag, tvb, offset, 32, ENC_ASCII|ENC_NA);
    offset += 32;
    length -= 32;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Duplicate Detection State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_find_tag_reply_req_dup_detection_state);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_sm_find_tag_reply_dup_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_find_tag_reply_dup_pd_tag,   tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_find_tag_reply_dup_device,   tvb, offset, 1, 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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 2 * value,
        "List of FDA Address Selectors (%u bytes)", 2 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_find_tag_reply_req_list_of_fda_addr_selectors);

    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;
    }

    return;
}



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;
    proto_item *ti;
    guint8      DuplicateDetectionState;
    guint16     NumOfFDAAddrSelectors;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Find Tag Reply Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Find Tag Reply Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_sm_find_tag_reply_req);

    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|ENC_NA);
    offset += 32;
    length -= 32;

    proto_tree_add_item(sub_tree,
        hf_ff_sm_find_tag_reply_req_pd_tag, tvb, offset, 32, ENC_ASCII|ENC_NA);
    offset += 32;
    length -= 32;

    DuplicateDetectionState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_find_tag_reply_req_dup_detection_state(tvb,
        offset, sub_tree, DuplicateDetectionState);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Identify Request");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "SM Identify Request");
        sub_tree = proto_item_add_subtree(ti, ett_ff_sm_id_req);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 2,
        "H1 Node Address Version Number (%u bytes)", 2);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_id_rsp_h1_node_addr);

    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;*/

    return;
}



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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "Version Number List (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_id_rsp_entries_node_addr);

    for (d = 0; d < value * 2; d++) {
        dissect_ff_msg_sm_id_rsp_h1_node_addr(tvb, offset, sub_tree);
        offset += 2;
    }

    return;
}



static void
dissect_ff_msg_sm_id_rsp_h1_live_list(tvbuff_t *tvb,
    gint offset, proto_tree *tree)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4,
        "H1 Live-list Version Number (%u bytes)", 4);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_id_rsp_h1_live_list);

    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;*/

    return;
}



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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "Version Number List (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_id_rsp_entries_h1_live_list);

    for (d = 0; d < value; d++) {
        dissect_ff_msg_sm_id_rsp_h1_live_list(tvb, offset, sub_tree);
        offset += 4;
    }

    return;
}



static void
dissect_ff_msg_sm_id_rsp_smk_state(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "SMK State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_id_rsp_smk_state);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_smk_state_name, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_smk_state_sync, tvb, offset, 1, ENC_BIG_ENDIAN);
}



static void
dissect_ff_msg_sm_id_rsp_dev_type(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Device Type: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_id_rsp_dev_type);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dev_type_link,           tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dev_type_iogateway,      tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dev_type_hse,            tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dev_type_h1,             tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dev_type_reserved,       tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dev_type_redundant_caps, tvb, offset, 1, ENC_BIG_ENDIAN);
}



static void
dissect_ff_msg_sm_id_rsp_dev_redundancy_state(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Device Redundancy State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_id_rsp_dev_redundancy_state);

    /*
     * 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
     */

    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dev_redundancy_state_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dev_redundancy_state_role,     tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dev_redundancy_state_type,     tvb, offset, 1, ENC_BIG_ENDIAN);
}



static void
dissect_ff_msg_sm_id_rsp_dup_detection_state(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Duplicate Detection State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_id_rsp_dup_detection_state);

    /*
     * 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
     */

    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dup_detection_state_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dup_detection_state_pd_tag,   tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_id_rsp_dup_detection_state_device,   tvb, offset, 1, 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;
    proto_item *ti;

    guint8  SMKState;
    guint8  DeviceType;
    guint8  DeviceRedundancyState;
    guint8  DuplicateDetectionState;
    guint32 NumOfEntriesInVerNumList;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Identify Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "SM Identify Response");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_id_rsp);

    SMKState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_id_rsp_smk_state(tvb, offset, sub_tree, SMKState);
    offset += 1;
    length -= 1;

    DeviceType = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_id_rsp_dev_type(tvb, offset, sub_tree, DeviceType);
    offset += 1;
    length -= 1;

    DeviceRedundancyState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_id_rsp_dev_redundancy_state(tvb,
        offset, sub_tree, DeviceRedundancyState);
    offset += 1;
    length -= 1;

    DuplicateDetectionState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_id_rsp_dup_detection_state(tvb,
        offset, sub_tree, DuplicateDetectionState);
    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|ENC_NA);
    offset += 32;
    length -= 32;

    proto_tree_add_item(sub_tree,
        hf_ff_sm_id_rsp_pd_tag, tvb, offset, 32, ENC_ASCII|ENC_NA);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Identify Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "SM Identify Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_sm_id_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Address Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Clear Address Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_sm_id_err);

    proto_tree_add_item(sub_tree,
        hf_ff_sm_clear_addr_req_dev_id, tvb, offset, 32, ENC_ASCII|ENC_NA);
    offset += 32;
    length -= 32;

    proto_tree_add_item(sub_tree,
        hf_ff_sm_clear_addr_req_pd_tag, tvb, offset, 32, ENC_ASCII|ENC_NA);
    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    offset += 3;
    length -= 3;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Address Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "SM Clear Address Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_sm_clear_addr_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Address Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Clear Address Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_sm_clear_addr_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Device Redundancy State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_set_assign_info_req_dev_redundancy_state);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_sm_set_assign_info_req_dev_redundancy_state_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_set_assign_info_req_dev_redundancy_state_role,     tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_set_assign_info_req_dev_redundancy_state_type,     tvb, offset, 1, 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, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Clear Duplicate Detection State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_set_assign_info_req_clear_dup_detection_state);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_sm_set_assign_info_req_clear_dup_detection_state_reserved,     tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_set_assign_info_req_clear_dup_detection_state_pd_tag,       tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_set_assign_info_req_clear_dup_detection_state_device_index, tvb, offset, 1, 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;
    proto_item *ti;
    guint8      DeviceRedundancyState;
    guint8      ClearDuplicateDetectionState;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Set Assignment Info Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Set Assignment Info Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_set_assign_info_req);

    proto_tree_add_item(sub_tree,
        hf_ff_sm_set_assign_info_req_dev_id, tvb, offset, 32, ENC_ASCII|ENC_NA);
    offset += 32;
    length -= 32;

    proto_tree_add_item(sub_tree,
        hf_ff_sm_set_assign_info_req_pd_tag, tvb, offset, 32, ENC_ASCII|ENC_NA);
    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;

    DeviceRedundancyState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_set_assign_info_req_dev_redundancy_state(tvb,
        offset, sub_tree, DeviceRedundancyState);
    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    offset += 3;
    length -= 3;

    ClearDuplicateDetectionState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_set_assign_info_req_clear_dup_detection_state(tvb,
        offset, sub_tree, ClearDuplicateDetectionState);
    offset += 1;
    length -= 1;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Set Assignment Info Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Set Assignment Info Response");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_set_assign_info_rsp);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Set Assignment Info Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Set Assignment Info Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_sm_set_assign_info_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Assignment Info Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Clear Assignment Info Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_clear_assign_info_req);

    proto_tree_add_item(sub_tree,
        hf_ff_sm_clear_assign_info_req_dev_id, tvb, offset, 32, ENC_ASCII|ENC_NA);
    offset += 32;
    length -= 32;

    proto_tree_add_item(sub_tree,
        hf_ff_sm_clear_assign_info_req_pd_tag, tvb, offset, 32, ENC_ASCII|ENC_NA);
    offset += 32;
    length -= 32;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Assignment Info Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "SM Clear Assignment Info Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_sm_clear_assign_info_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Clear Assignment Info Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Clear Assignment Info Error");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_clear_assign_info_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 2,
        "H1 Node Address Version Number (%u bytes)", 2);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_dev_annunc_req_h1_node_addr);

    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;*/

    return;
}



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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "Version Number List (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_dev_annunc_req_entries_node_addr);

    for (d = 0; d < value * 2; d++) {
        dissect_ff_msg_sm_dev_annunc_req_h1_node_addr(tvb, offset, sub_tree);
        offset += 2;
    }

    return;
}



static void
dissect_ff_msg_sm_dev_annunc_req_h1_live_list(tvbuff_t *tvb,
    gint offset, proto_tree *tree)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4,
        "H1 Live-list Version Number (%u bytes)", 4);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_dev_annunc_req_h1_live_list);

    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;*/

    return;
}



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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "Version Number List (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_dev_annunc_req_entries_h1_live_list);

    for (d = 0; d < value; d++) {
        dissect_ff_msg_sm_dev_annunc_req_h1_live_list(tvb, offset, sub_tree);
        offset += 4;
    }

    return;
}



static void
dissect_ff_msg_sm_dev_annunc_req_smk_state(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "SMK State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_dev_annunc_req_smk_state);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_smk_state_name, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_smk_state_sync, tvb, offset, 1, ENC_BIG_ENDIAN);
}



static void
dissect_ff_msg_sm_dev_annunc_req_dev_type(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Device Type: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_dev_annunc_req_dev_type);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dev_type_link,           tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dev_type_iogateway,      tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dev_type_hse,            tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dev_type_h1,             tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dev_type_reserved,       tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dev_type_redundant_caps, tvb, offset, 1, ENC_BIG_ENDIAN);
}



static void
dissect_ff_msg_sm_dev_annunc_req_dev_redundancy_state(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Device Redundancy State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_dev_annunc_req_dev_redundancy_state);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dev_redundancy_state_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dev_redundancy_state_role,     tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dev_redundancy_state_type,     tvb, offset, 1, ENC_BIG_ENDIAN);
}



static void
dissect_ff_msg_sm_dev_annunc_req_dup_detection_state(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Duplicate Detection State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_dev_annunc_req_dup_detection_state);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dup_detection_state_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dup_detection_state_pd_tag,   tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_sm_dev_annunc_req_dup_detection_state_device,   tvb, offset, 1, 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;
    proto_item *ti;

    guint8  SMKState;
    guint8  DeviceType;
    guint8  DeviceRedundancyState;
    guint8  DuplicateDetectionState;
    guint32 NumOfEntriesInVerNumList;

    col_set_str(pinfo->cinfo, COL_INFO, "SM Device Annunciation Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "SM Device Annunciation Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_sm_dev_annunc_req);

    SMKState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_dev_annunc_req_smk_state(tvb, offset, sub_tree, SMKState);
    offset += 1;
    length -= 1;

    DeviceType = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_dev_annunc_req_dev_type(tvb,
        offset, sub_tree, DeviceType);
    offset += 1;
    length -= 1;

    DeviceRedundancyState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_dev_annunc_req_dev_redundancy_state(tvb,
        offset, sub_tree, DeviceRedundancyState);
    offset += 1;
    length -= 1;

    DuplicateDetectionState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_sm_dev_annunc_req_dup_detection_state(tvb,
        offset, sub_tree, DuplicateDetectionState);
    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|ENC_NA);
    offset += 32;
    length -= 32;

    proto_tree_add_item(sub_tree,
        hf_ff_sm_dev_annunc_req_pd_tag, tvb, offset, 32, ENC_ASCII|ENC_NA);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Initiate Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_req);

    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|ENC_NA);
    offset += 32;
    length -= 32;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Initiate Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_rep);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Initiate Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Abort Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Abort Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_abort_req);

    proto_tree_add_text(sub_tree, tvb, offset, 16,
        "Abort Detail (%u bytes)", 16);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Status Request");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Status Request");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_status_req);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Status Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Status Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_status_rsp);

    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_text(sub_tree, tvb, offset, 4,
        "Local Detail (%u bytes)", 4);
    offset += 4;
    length -= 4;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Status Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Status Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_status_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Unsolicited Status Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Unsolicited Status Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_unsolicited_status_req);

    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_text(sub_tree, tvb, offset, 4,
        "Local Detail (%u bytes)", 4);
    offset += 4;
    length -= 4;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Identify Request");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Identify Request");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_id_req);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Identify Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Identify Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_id_rsp);

    proto_tree_add_item(sub_tree,
        hf_ff_fms_id_rsp_vendor_name, tvb, offset, 32, ENC_ASCII|ENC_NA);
    offset += 32;
    length -= 32;

    proto_tree_add_item(sub_tree,
        hf_ff_fms_id_rsp_model_name, tvb, offset, 32, ENC_ASCII|ENC_NA);
    offset += 32;
    length -= 32;

    proto_tree_add_item(sub_tree,
        hf_ff_fms_id_rsp_revision, tvb, offset, 32, ENC_ASCII|ENC_NA);
    offset += 32;
    length -= 32;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Identify Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Identify Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_id_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Get OD Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Get OD Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_get_od_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Get OD Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Get OD Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_get_od_rsp);

    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_text(sub_tree, tvb, offset, length,
            "List of Object Descriptions (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Get OD Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Get OD Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_get_od_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Put OD Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Initiate Put OD Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_put_od_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Put OD Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Initiate Put OD Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_put_od_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Put OD Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Initiate Put OD Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_put_od_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Put OD Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Put OD Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_put_od_req);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    offset += 3;
    length -= 3;

    proto_tree_add_text(sub_tree, tvb, offset, length,
        "List of Object Descriptions (%u bytes)", length);

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Put OD Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Put OD Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_put_od_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Put OD Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Put OD Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_put_od_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Put OD Request");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Terminate Put OD Request");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_terminate_put_od_req);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Put OD Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Terminate Put OD Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_terminate_put_od_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Put OD Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Terminate Put OD Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_terminate_put_od_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Initiate Download Sequence Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Generic Initiate Download Sequence Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_gen_init_download_seq_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Initiate Download Sequence Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Generic Initiate Download Sequence Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_gen_init_download_seq_rep);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Initiate Download Sequence Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Generic Initiate Download Sequence Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_gen_init_download_seq_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Download Segment Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Generic Download Segment Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_gen_download_seg_req);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    offset += 3;
    length -= 3;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "Load Data (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Download Segment Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Generic Download Segment Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_gen_download_seg_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Download Segment Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Generic Download Segment Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_gen_download_seg_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Terminate Download Sequence Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Generic Terminate Download Sequence Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_gen_terminate_download_seq_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Terminate Download Sequence Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Generic Terminate Download Sequence Response");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_gen_terminate_download_seq_rsp);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    offset += 3;
    length -= 3;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Generic Terminate Download Sequence Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Generic Terminate Download Sequence Error");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_gen_terminate_download_seq_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Download Sequence Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Initiate Download Sequence Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_init_download_seq_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Download Sequence Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Initiate Download Sequence Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_init_download_seq_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Download Sequence Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Initiate Download Sequence Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_download_seq_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Download Segment Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Download Segment Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_download_seg_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Download Segment Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Download Segment Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_download_seg_rsp);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    offset += 3;
    length -= 3;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "Load Data (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Download Segment Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Download Segment Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_download_seg_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Download Sequence Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Terminate Download Sequence Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_terminate_download_seq_req);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Download Sequence Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Terminate Download Sequence Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_terminate_download_seq_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Download Sequence Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Terminate Download Sequence Error");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_terminate_download_seq_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Upload Sequence Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Initiate Upload Sequence Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_upload_seq_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Upload Sequence Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Initiate Upload Sequence Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_upload_seq_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Initiate Upload Sequence Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Initiate Upload Sequence Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_init_upload_seq_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Upload Segment Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Upload Segment Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_upload_seg_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Upload Segment Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Upload Segment Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_upload_seg_rsp);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    offset += 3;
    length -= 3;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "Final Result (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Upload Segment Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Upload Segment Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_upload_seg_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Upload Sequence Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Terminate Upload Sequence Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_terminate_upload_seq_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Upload Sequence Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Terminate Upload Sequence Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_terminate_upload_seq_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Terminate Upload Sequence Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Terminate Upload Sequence Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_terminate_upload_seq_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Download Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Request Domain Download Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_req_dom_download_req);

    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|ENC_NA);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Download Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Request Domain Download Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_req_dom_download_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Download Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Request Domain Download Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_req_dom_download_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Upload Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Request Domain Upload Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_req_dom_upload_req);

    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|ENC_NA);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Upload Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Request Domain Upload Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_req_dom_upload_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Request Domain Upload Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Request Domain Upload Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_req_dom_upload_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "List Of Domain Indexes (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_create_pi_req_list_of_dom_idxes);

    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;
    }

    return;
}



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;
    proto_item *ti;
    guint16     NumOfDomIdxes;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Create Program Invocation Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Create Program Invocation Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_create_pi_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Create Program Invocation Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Create Program Invocation Response");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_create_pi_rsp);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Create Program Invocation Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Create Program Invocation Error");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_create_pi_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Program Invocation Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Delete Program Invocation Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_del_pi_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Program Invocation Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Delete Program Invocation Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_del_pi_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Program Invocation Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Delete Program Invocation Error");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_del_pi_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Start Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Start Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_start_req);

    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_text(sub_tree, tvb, offset, length,
            "Execution Argument (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Start Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Start Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_start_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Start Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Start Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_start_err);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Stop Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Stop Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_stop_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Stop Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Stop Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_stop_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Stop Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Stop Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_stop_err);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Resume Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Resume Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_resume_req);

    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_text(sub_tree, tvb, offset, length,
            "Execution Argument (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Resume Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Resume Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_resume_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Resume Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Resume Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_resume_err);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Reset Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Reset Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_reset_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Reset Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Reset Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_reset_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Reset Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Reset Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_reset_err);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Kill Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Kill Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_kill_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Kill Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Kill Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_kill_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Kill Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Kill Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_kill_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Read Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Read Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_read_req);

    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_text(tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Read Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Read Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_read_rsp);

    proto_tree_add_text(sub_tree, tvb, offset, length,
        "Data (%u bytes)", length);

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Read Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Read Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_read_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Read with Subindex Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Read with Subindex Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_read_with_subidx_req);

    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_text(tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Read with Subindex Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Read with Subindex Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_read_with_subidx_rsp);

    proto_tree_add_text(sub_tree, tvb, offset, length,
        "Data (%u bytes)", length);

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Read with Subindex Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Read with Subindex Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_read_with_subidx_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Write Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Write Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_write_req);

    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_text(sub_tree, tvb, offset, length,
            "Data (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Write Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Write Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_write_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Write Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length, "FMS Write Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_write_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Write with Subindex Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Write with Subindex Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_write_with_subidx_req);

    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_text(sub_tree, tvb, offset, length,
            "Data (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Write with Subindex Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Write with Subindex Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_write_with_subidx_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Write with Subindex Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Write with Subindex Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_write_with_subidx_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "List Of Indexes (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_def_variable_list_req_list_of_idxes);

    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;
    }

    return;
}



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;
    proto_item *ti;
    guint32     NumOfIndexes;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Define Variable List Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Define Variable List Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_def_variable_list_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Define Variable List Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Define Variable List Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_def_variable_list_rsp);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Define Variable List Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Define Variable List Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_def_variable_list_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Variable List Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Delete Variable List Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_del_variable_list_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Variable List Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Delete Variable List Response");
        sub_tree = proto_item_add_subtree(ti, ett_ff_fms_del_variable_list_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Delete Variable List Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Delete Variable List Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_del_variable_list_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Information Report Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Information Report Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_info_report_req);

    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_text(sub_tree, tvb, offset, length,
            "Data (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Information Report with Subindex Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Information Report with Subindex Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_info_report_with_subidx_req);

    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_text(sub_tree, tvb, offset, length,
            "Data (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Information Report On Change Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Information Report On Change Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_info_report_on_change_req);

    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_text(sub_tree, tvb, offset, length,
            "Data (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Information Report On Change with Subindex Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Information Report On Change with Subindex Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_info_report_on_change_with_subidx_req);

    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_text(sub_tree, tvb, offset, length,
            "Data (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Event Notification Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Event Notification Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_ev_notification_req);

    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_text(sub_tree, tvb, offset, length,
            "Data (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Alter Event Condition Monitoring Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Alter Event Condition Monitoring Request");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_alter_ev_condition_monitoring_req);

    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_text(sub_tree, tvb, offset, 3, "Reserved (%u bytes)", 3);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Alter Event Condition Monitoring Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Alter Event Condition Monitoring Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_alter_ev_condition_monitoring_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Alter Event Condition Monitoring Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Alter Event Condition Monitoring Error");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fms_alter_ev_condition_monitoring_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Acknowledge Event Notification Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Acknowledge Event Notification Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_ack_ev_notification_req);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Acknowledge Event Notification Response");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "FMS Acknowledge Event Notification Response");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_fms_ack_ev_notification_rsp);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "FMS Acknowledge Event Notification Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "FMS Acknowledge Event Notification Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fms_ack_ev_notification_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Information Request");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "LAN Redundancy Get Information Request");
        sub_tree = proto_item_add_subtree(ti,
            ett_ff_lr_get_info_req);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "LAN Redundancy Flags: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_get_info_rsp_lr_flags);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_lr_get_info_rsp_lr_flags_reserved,     tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_get_info_rsp_lr_flags_load_balance, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_get_info_rsp_lr_flags_diag,         tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_get_info_rsp_lr_flags_multi_recv,   tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_get_info_rsp_lr_flags_cross_cable,  tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_get_info_rsp_lr_flags_multi_trans,  tvb, offset, 1, 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;
    proto_item *ti;
    guint8      MaxMsgNumDiff;
    guint8      LRFlags;

    col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Information Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "LAN Redundancy Get Information Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_get_info_rsp);

    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;

    LRFlags = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_lr_get_info_rsp_lr_flags(tvb, offset, sub_tree, LRFlags);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Information Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "LAN Redundancy Get Information Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_get_info_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "LAN Redundancy Flags: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_put_info_req_lr_flags);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_req_lr_flags_reserved,     tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_req_lr_flags_load_balance, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_req_lr_flags_diag,         tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_req_lr_flags_multi_recv,   tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_req_lr_flags_cross_cable,  tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_req_lr_flags_multi_trans,  tvb, offset, 1, 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;
    proto_item *ti;
    guint8      MaxMsgNumDiff;
    guint8      LRFlags;

    col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Put Information Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "LAN Redundancy Put Information Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_put_info_req);

    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;

    LRFlags = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_lr_put_info_req_lr_flags(tvb, offset, sub_tree, LRFlags);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "LAN Redundancy Flags: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_put_info_rsp_lr_flags);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_rsp_lr_flags_reserved,     tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_rsp_lr_flags_load_balance, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_rsp_lr_flags_diag,         tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_rsp_lr_flags_multi_recv,   tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_rsp_lr_flags_cross_cable,  tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_put_info_rsp_lr_flags_multi_trans,  tvb, offset, 1, 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;
    proto_item *ti;
    guint8      MaxMsgNumDiff;
    guint8      LRFlags;

    col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Put Information Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "LAN Redundancy Put Information Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_put_info_rsp);

    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;

    LRFlags = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_lr_put_info_rsp_lr_flags(tvb, offset, sub_tree, LRFlags);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Put Information Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "LAN Redundancy Put Information Error");
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_put_info_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    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;
    proto_item *ti;

    col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Statistics Request");

    if (!tree) {
        return;
    }

    if (length) {
        ti = proto_tree_add_text(tree, tvb, offset, length,
            "LAN Redundancy Get Statistics Request");
        sub_tree = proto_item_add_subtree(ti, ett_ff_lr_get_statistics_req);

        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "List of Crossed Cable Status (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_lr_get_statistics_rsp_list_of_x_cable_stat);

    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;
    }

    return;
}



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;
    proto_item *ti;
    guint32     NumXcableStat;

    col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Statistics Response");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "LAN Redundancy Get Statistics Response");
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_get_statistics_rsp);

    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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;
    proto_item *ti;
    guint8      ErrorClass;
    guint8      ErrorCode;
    const char *error_code;

    col_set_str(pinfo->cinfo, COL_INFO, "LAN Redundancy Get Statistics Error");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "LAN Redundancy Get Statistics Error");
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_lr_get_statistics_err);

    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|ENC_NA);
    offset += 16;
    length -= 16;

    if (length) {
        proto_tree_add_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Duplicate Detection State: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_lr_diagnostic_msg_req_dup_detection_stat);

    /*
     * 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
     */
    proto_tree_add_item(sub_tree, hf_ff_lr_diagnostic_msg_req_dup_detection_state_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_diagnostic_msg_req_dup_detection_state_pd_tag, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_lr_diagnostic_msg_req_dup_detection_state_device, tvb, offset, 1, 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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "List of Interface AtoA Statuses (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_lr_diagnostic_msg_req_a_to_a_status);

    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;
    }

    return;
}



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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "List of Interface BtoA Statuses (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_lr_diagnostic_msg_req_b_to_a_status);

    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;
    }

    return;
}



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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "List of Interface AtoB Statuses (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_lr_diagnostic_msg_req_a_to_b_status);

    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;
    }

    return;
}



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;
    proto_item *ti;
    guint       d;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 4 * value,
        "List of Interface BtoB Statuses (%u bytes)", 4 * value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_lr_diagnostic_msg_req_b_to_b_status);

    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;
    }

    return;
}



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;
    proto_item *ti;
    guint16     DeviceIndex;
    guint8      DuplicateDetectionState;
    guint16     NumOfInterfaceStatuses;

    col_set_str(pinfo->cinfo, COL_INFO, "Diagnostic Message Request");

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, length,
        "Diagnostic Message Request");
    sub_tree = proto_item_add_subtree(ti, ett_ff_lr_diagnostic_msg_req);

    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|ENC_NA);
    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;

    DuplicateDetectionState = tvb_get_guint8(tvb, offset);
    dissect_ff_msg_diagnostic_msg_req_dup_detection_stat(tvb,
        offset, sub_tree, DuplicateDetectionState);
    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_text(sub_tree, tvb, offset, length,
            "[Unknown] (%u bytes)", length);
    }

    return;
}



/*
 * 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_text(tree, tvb, offset, length,
                    "[Unknown Service] (%u bytes)", length);
            }
    }

    return;
}



/*
 * 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 *ti;
    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);

    ti = proto_tree_add_text(tree,
        tvb, offset, length, "FDA Message Trailer");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fda_msg_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; */
    }

    return;
}



/*
 * 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_text(tree, tvb, offset, 1, "Service: 0x%02x", 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);
    }

    return;
}



/*
 * Protocol Id And Confirmed Msg Type
 */

static void
dissect_ff_msg_hdr_proto_and_type(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1,
        "Protocol Id And Confirmed Msg Type: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti,
        ett_ff_fda_msg_hdr_proto_and_type);

    if (!sub_tree) {
        return;
    }

    proto_tree_add_item(sub_tree, hf_ff_hdr_proto_id, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_hdr_confirm_msg_type, tvb, offset, 1, ENC_BIG_ENDIAN);
}



/*
 * Options
 */

static void
dissect_ff_msg_hdr_opts(tvbuff_t *tvb,
    gint offset, proto_tree *tree, guint8 value)
{
    proto_tree *sub_tree;
    proto_item *ti;

    if (!tree) {
        return;
    }

    ti = proto_tree_add_text(tree, tvb, offset, 1, "Options: 0x%02x", value);
    sub_tree = proto_item_add_subtree(ti, ett_ff_fda_msg_hdr_opts);

    proto_tree_add_item(sub_tree, hf_ff_hdr_opts_msg_num,   tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_hdr_opts_invoke_id, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_hdr_opts_timestamp, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_hdr_opts_reserved,  tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_hdr_opts_ext_ctrl,  tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(sub_tree, hf_ff_hdr_opts_pad,       tvb, offset, 1, ENC_BIG_ENDIAN);
}



/*
 * 6.3. Message Header
 */
static void
dissect_ff_msg_hdr(tvbuff_t *tvb,
    proto_tree *tree, guint8 Options, guint8 ProtocolAndType, guint8 Service)
{
    proto_tree *sub_tree;
    proto_item *ti;
    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);

    ti = proto_tree_add_text(tree,
        tvb, offset, 12, "FDA Message Header");
    sub_tree = proto_item_add_subtree(ti, ett_ff_fda_msg_hdr);

    /* 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, Options);
    offset += 1;

    /* Protocol Id And Confirmed Msg Type */
    dissect_ff_msg_hdr_proto_and_type(tvb,
        offset, sub_tree, ProtocolAndType);
    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; */

    return;
}



static int
dissect_ff(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
    proto_tree *sub_tree = NULL;
    proto_item *ti       = NULL;
    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);

    if (tree) {
        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, Options, ProtocolAndType, Service);
    offset += 12;
    length -= 12;

    /*
     * 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 tvb_length(tvb);
}


static guint
get_ff_pdu_len(packet_info *pinfo _U_, tvbuff_t *tvb, int offset)
{
    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,
        12, 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)
{
    guint32 length;

    /* Make sure at least the header is there */
    if (tvb_length(tvb) < 12)
        return 0;

    length = tvb_get_ntohl(tvb, 8);

    /* Make sure the length field is valid */
    if ((length > tvb_reported_length(tvb)) ||
        (length < 12))
        return 0;

    dissect_ff(tvb, pinfo, tree, data);
    return tvb_reported_length(tvb);
}



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 } },



        /*
         * 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_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_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 } },


        /*
         * 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_UINT8, 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 } },


        /*
         * 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_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_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_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 } },


        /*
         * 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_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,
            { "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_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_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_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 } },


        /*
         * 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_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 } },



        /*
         * 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 } },



        /*
         * 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 } },



        /*
         * 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 } },



        /*
         * 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_UINT16, 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_UINT8, 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 } },



        /*
         * 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_UINT8, 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_UINT8, 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_UINT8, 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 } },



        /*
         * 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 } },



        /*
         * 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 } },



        /*
         * 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 } },



        /*
         * 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 } },



        /*
         * 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 } },


        /*
         * 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 } },


        /*
         * 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 } },

    };



    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));

    return;
}



void
proto_reg_handoff_ff(void)
{
    /*
     * 4.8. Using UDP and TCP
     */
    ff_udp_handle = new_create_dissector_handle(dissect_ff_udp, proto_ff);
    ff_tcp_handle = new_create_dissector_handle(dissect_ff_tcp, proto_ff);

    /*
     * 4.8.4.2. Use
     *
     * - Device Annunciation
     */
    dissector_add_uint("udp.port", UDP_PORT_FF_ANNUNC, ff_udp_handle);

    /*
     * 4.8.4.2. Use
     *
     * - Client / Server
     */
    dissector_add_uint("udp.port", UDP_PORT_FF_FMS, ff_udp_handle);
    dissector_add_uint("tcp.port", TCP_PORT_FF_FMS, ff_tcp_handle);

    /*
     * 4.8.4.2. Use
     *
     * - Set/Clear Assignment Info and Clear Address
     * - SM Identify
     * - SM Find Tag
     */
    dissector_add_uint("udp.port", UDP_PORT_FF_SM, ff_udp_handle);

    /*
     * 4.8.4.2. Use
     *
     * - LAN Redundancy Get and Put Information
     */
    dissector_add_uint("udp.port", UDP_PORT_FF_LR_PORT, ff_udp_handle);

    return;
}
