wireshark/epan/dissectors/packet-zbncp.c

5871 lines
234 KiB
C

/* packet-zbncp.c
* Dissector routines for the ZBOSS Network Co-Processor (NCP)
* Copyright 2021 DSR Corporation, http://dsr-wireless.com/
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <config.h>
#include <epan/packet.h>
#include "packet-ieee802154.h"
#include "packet-zbncp.h"
#include "conversation.h"
void proto_reg_handoff_zbncp(void);
void proto_register_zbncp(void);
extern void dissect_zbee_nwk_status_code(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
extern void dissect_zbee_aps_status_code(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
#define ZBNCP_PROTOABBREV "zbncp"
#define ZBNCP_SIGN_FST_BYTE 0xDEU
#define ZBNCP_SIGN_SEC_BYTE 0xADU
#define ZBNCP_HDR_SIZE 7
#define ZBNCP_HDR_FLAGS_ISACK_MASK 0x01
#define ZBNCP_HDR_FLAGS_RETRANS_MASK 0x02
#define ZBNCP_HDR_FLAGS_PKT_SEQ_MASK 0x0C
#define ZBNCP_HDR_FLAGS_ACK_SEQ_MASK 0x30
#define ZBNCP_HDR_FLAGS_ISFIRST_MASK 0x40
#define ZBNCP_HDR_FLAGS_ISLAST_MASK 0x80
#define ZBNCP_DUMP_INFO_SIGN "ZBNCP"
#define ZBNCP_DUMP_INFO_SIGN_SIZE (sizeof(ZBNCP_DUMP_INFO_SIGN) - 1)
#define ZBNCP_DUMP_INFO_PAYLOAD_SIZE 3
#define ZBNCP_DUMP_INFO_NCP_TYPE 0x06U
#define ZBNCP_DUMP_INFO_SIZE (ZBNCP_DUMP_INFO_SIGN_SIZE + ZBNCP_DUMP_INFO_PAYLOAD_SIZE)
#define ZBNCP_DUMP_DIR_MASK 0x01U
#define ZBNCP_DUMP_HOST_INT_DUMP_MASK 0x02U
#define ZBNCP_DUMP_POTENTIAL_TX_RX_ERROR_MASK 0x04U
/* decryption helpers */
static guint dissect_zbncp_ll_hdr(tvbuff_t *, packet_info *, proto_tree *, guint, guint8 *);
static void dissect_zbncp_body(tvbuff_t *, packet_info *, proto_tree *, guint, guint16 *);
static void dissect_zbncp_high_level(tvbuff_t *, packet_info *, proto_tree *, guint, guint16 *);
static guint dissect_zbncp_high_level_hdr(tvbuff_t *, packet_info *, proto_tree *, guint, guint8 *, guint16 *);
static void dissect_zbncp_high_level_body(tvbuff_t *, packet_info *, proto_tree *, guint, guint8, guint16);
static void dissect_zbncp_fragmentation_body(tvbuff_t *, packet_info *, proto_tree *, guint);
static guint dissect_zbncp_packet(tvbuff_t *, packet_info *, proto_tree *, guint);
static guint dissect_zbncp_status(tvbuff_t *, packet_info *, proto_tree *, guint);
static tvbuff_t *dissect_zbncp_dump_info(tvbuff_t *, packet_info *, proto_tree *);
/*-------------------------------------
* Dissector Function Prototypes
*-------------------------------------
*/
/* Dissection Routines. */
/* Initialize Protocol and Registered fields */
/* ZBNCP hdr */
static int zbncp_frame = -1;
static int proto_zbncp = -1;
static int hf_zbncp_hdr_sign = -1;
static int hf_zbncp_packet_len = -1;
static int hf_zbncp_hdr_type = -1;
static int hf_zbncp_hdr_flags = -1;
static int hf_zbncp_hdr_flags_isack = -1;
static int hf_zbncp_hdr_flags_retrans = -1;
static int hf_zbncp_hdr_flags_packetseq = -1;
static int hf_zbncp_hdr_flags_ackseq = -1;
static int hf_zbncp_hdr_flags_first_frag = -1;
static int hf_zbncp_hdr_flags_last_frag = -1;
static int hf_zbncp_hdr_crc8 = -1;
static int hf_zbncp_body_data_crc16 = -1;
static int hf_zbncp_data_hl_version = -1;
static int hf_zbncp_data_hl_packet_type = -1;
static int hf_zbncp_data_hl_call_id = -1;
static int hf_zbncp_data_hl_tsn = -1;
static int hf_zbncp_data_hl_status_cat = -1;
static int hf_zbncp_data_hl_status = -1;
static int hf_zbncp_data_hl_status_generic = -1;
static int hf_zbncp_data_hl_status_mac = -1;
static int hf_zbncp_data_hl_status_nwk = -1;
static int hf_zbncp_data_hl_status_cbke = -1;
static int hf_zbncp_data_fw_vers = -1;
static int hf_zbncp_data_stack_vers = -1;
static int hf_zbncp_data_proto_vers = -1;
static int hf_zbncp_data_reset_opt = -1;
static int hf_zbncp_data_zb_role = -1;
static int hf_zbncp_data_ch_list_len = -1;
static int hf_zbncp_data_page = -1;
static int hf_zbncp_data_ch_mask = -1;
static int hf_zbncp_data_channel = -1;
static int hf_zbncp_data_channel4 = -1;
static int hf_zbncp_data_pan_id = -1;
static int hf_zbncp_data_mac_int_num = -1;
static int hf_zbncp_data_index = -1;
static int hf_zbncp_data_enable = -1;
static int hf_zbncp_data_bind_type = -1;
static int hf_zbncp_data_ieee_addr = -1;
static int hf_zbncp_data_ext_pan_id = -1;
static int hf_zbncp_data_coordinator_version = -1;
static int hf_zbncp_data_trust_center_addres = -1;
static int hf_zbncp_data_remote_ieee_addr = -1;
static int hf_zbncp_data_src_ieee_addr = -1;
static int hf_zbncp_data_dst_ieee_addr = -1;
static int hf_zbncp_data_partner_ieee_addr = -1;
static int hf_zbncp_data_trace_mask = -1;
static int hf_zbncp_data_trace_wireless_traf = -1;
static int hf_zbncp_data_trace_reserved = -1;
static int hf_zbncp_data_trace_ncp_ll_proto = -1;
static int hf_zbncp_data_trace_host_int_line = -1;
static int hf_zbncp_data_trace_sleep_awake = -1;
static int hf_zbncp_data_keepalive = -1;
static int hf_zbncp_data_rx_on_idle = -1;
static int hf_zbncp_data_res_tx_power = -1;
static int hf_zbncp_data_req_tx_power = -1;
static int hf_zbncp_data_joined = -1;
static int hf_zbncp_data_joined_bit = -1;
static int hf_zbncp_data_parent_bit = -1;
static int hf_zbncp_data_authenticated = -1;
static int hf_zbncp_data_timeout = -1;
static int hf_zbncp_data_keepalive_mode = -1;
static int hf_zbncp_force_route_record_sending = -1;
static int hf_zbncp_data_nwk_addr = -1;
static int hf_zbncp_data_nwk_parent_addr = -1;
static int hf_zbncp_data_src_nwk_addr = -1;
static int hf_zbncp_data_dst_nwk_addr = -1;
static int hf_zbncp_data_remote_nwk_addr = -1;
static int hf_zbncp_data_group_nwk_addr = -1;
static int hf_zbncp_data_src_mac_addr = -1;
static int hf_zbncp_data_dst_mac_addr = -1;
static int hf_zbncp_data_nwk_key = -1;
static int hf_zbncp_data_key_num = -1;
static int hf_zbncp_data_serial_num = -1;
static int hf_zbncp_data_size = -1;
static int hf_zbncp_data_vendor_data = -1;
static int hf_zbncp_data_dump_type = -1;
static int hf_zbncp_data_dump_text = -1;
static int hf_zbncp_data_dump_bin = -1;
static int hf_zbncp_data_parameter_id = -1;
static int hf_zbncp_data_value8_dec = -1;
static int hf_zbncp_data_value16_dec = -1;
static int hf_zbncp_data_aps_ack_to_non_sleepy = -1;
static int hf_zbncp_data_aps_ack_to_sleepy = -1;
static int hf_zbncp_data_min16 = -1;
static int hf_zbncp_data_max16 = -1;
static int hf_zbncp_data_default8_sign = -1;
static int hf_zbncp_data_current8_sign = -1;
static int hf_zbncp_data_is_concentrator = -1;
static int hf_zbncp_data_concentrator_radius = -1;
static int hf_zbncp_data_time16 = -1;
static int hf_zbncp_data_lock_status = -1;
static int hf_zbncp_data_reset_source = -1;
static int hf_zbncp_nwk_leave_allowed = -1;
static int hf_zbncp_data_nvram_dataset_quantity = -1;
static int hf_zbncp_data_nvram_dataset_type = -1;
static int hf_zbncp_data_nvram_version = -1;
static int hf_zbncp_data_dataset_version = -1;
static int hf_zbncp_data_dataset_length = -1;
static int hf_zbncp_data_nvram_dataset_data = -1;
static int hf_zbncp_data_tc_policy_type = -1;
static int hf_zbncp_data_tc_policy_value = -1;
static int hf_zbncp_max_children = -1;
static int hf_zbncp_zdo_leave_allowed = -1;
static int hf_zbncp_zdo_leave_wo_rejoin_allowed = -1;
static int hf_zbncp_data_aps_key = -1;
static int hf_zbncp_data_endpoint = -1;
static int hf_zbncp_data_aps_group_num = -1;
static int hf_zbncp_data_aps_group = -1;
static int hf_zbncp_data_src_endpoint = -1;
static int hf_zbncp_data_dst_endpoint = -1;
static int hf_zbncp_data_poll_pkt_cnt = -1;
static int hf_zbncp_data_poll_timeout = -1;
static int hf_zbncp_data_poll_permit_flag = -1;
static int hf_zbncp_data_profile_id = -1;
static int hf_zbncp_data_device_id = -1;
static int hf_zbncp_data_dev_version = -1;
static int hf_zbncp_data_in_cl_cnt = -1;
static int hf_zbncp_data_out_cl_cnt = -1;
static int hf_zbncp_data_cluster_id = -1;
static int hf_zbncp_data_mac_cap = -1;
static int hf_zbncp_data_manuf_id = -1;
static int hf_zbncp_data_cur_pwr_mode = -1;
static int hf_zbncp_data_cur_pwr_lvl = -1;
static int hf_zbncp_data_susp_period = -1;
static int hf_zbncp_data_av_pwr_src = -1;
static int hf_zbncp_data_cur_pwr_src = -1;
static int hf_zbncp_data_pwr_src_const = -1;
static int hf_zbncp_data_pwr_src_recharge = -1;
static int hf_zbncp_data_pwr_src_disposable = -1;
static int hf_zbncp_data_req_type = -1;
static int hf_zbncp_data_start_idx = -1;
static int hf_zbncp_data_start_idx_16b = -1;
static int hf_zbncp_data_upd_idx = -1;
static int hf_zbncp_data_entry_idx = -1;
static int hf_zbncp_data_num_asoc_dec = -1;
static int hf_zbncp_data_pwr_desc = -1;
static int hf_zbncp_data_pwr_desc_cur_power_mode = -1;
static int hf_zbncp_data_pwr_desc_av_pwr_src = -1;
static int hf_zbncp_data_pwr_desc_cur_pwr_src = -1;
static int hf_zbncp_data_pwr_desc_cur_pwr_lvl = -1;
static int hf_zbncp_data_max_buf_size = -1;
static int hf_zbncp_data_max_inc_trans_size = -1;
static int hf_zbncp_data_max_out_trans_size = -1;
static int hf_zbncp_data_desc_cap = -1;
static int hf_zbncp_data_desc_cap_ext_act_ep_list_av = -1;
static int hf_zbncp_data_desc_cap_ext_simple_desc_list_av = -1;
static int hf_zbncp_data_flags8 = -1;
static int hf_zbncp_data_flags_permit_join = -1;
static int hf_zbncp_data_flags_router_cap = -1;
static int hf_zbncp_data_flags_ed_cap = -1;
static int hf_zbncp_data_flags_stack_profile = -1;
static int hf_zbncp_data_flags16 = -1;
static int hf_zbncp_data_flags_zb_role = -1;
static int hf_zbncp_data_flags_comp_desc_av = -1;
static int hf_zbncp_data_flags_user_desc_av = -1;
static int hf_zbncp_data_flags_freq_868 = -1;
static int hf_zbncp_data_flags_freq_902 = -1;
static int hf_zbncp_data_flags_freq_2400 = -1;
static int hf_zbncp_data_flags_freq_eu_sub_ghz = -1;
static int hf_zbncp_data_srv_msk = -1;
static int hf_zbncp_data_srv_msk_prim_tc = -1;
static int hf_zbncp_data_srv_msk_backup_tc = -1;
static int hf_zbncp_data_srv_msk_prim_bind_tbl_cache = -1;
static int hf_zbncp_data_srv_msk_backup_bind_tbl_cache = -1;
static int hf_zbncp_data_remote_bind_offset = -1;
static int hf_zbncp_data_srv_msk_prim_disc_cache = -1;
static int hf_zbncp_data_srv_msk_backup_disc_cache = -1;
static int hf_zbncp_data_srv_msk_nwk_manager = -1;
static int hf_zbncp_data_srv_msk_stack_compl_rev = -1;
static int hf_zbncp_data_ep_cnt = -1;
static int hf_zbncp_data_dst_addr_mode = -1;
static int hf_zbncp_data_leave_flags = -1;
static int hf_zbncp_data_leave_flags_remove_chil = -1;
static int hf_zbncp_data_leave_flags_rejoin = -1;
static int hf_zbncp_data_permit_dur = -1;
static int hf_zbncp_data_tc_sign = -1;
static int hf_zbncp_data_secur_rejoin = -1;
static int hf_zbncp_data_zdo_rejoin_flags = -1;
static int hf_zbncp_data_zdo_rejoin_flags_tcsw_happened = -1;
static int hf_zbncp_data_dlen8 = -1;
static int hf_zbncp_data_dlen16 = -1;
static int hf_zbncp_data_param_len = -1;
static int hf_zbncp_data_radius = -1;
static int hf_zbncp_data_time_between_disc = -1;
static int hf_zbncp_data_enable_flag = -1;
static int hf_zbncp_data_array = -1;
static int hf_zbncp_data_use_alias = -1;
static int hf_zbncp_data_alias_src = -1;
static int hf_zbncp_data_alias_seq = -1;
static int hf_zbncp_data_tx_opt = -1;
static int hf_zbncp_data_tx_opt_secur = -1;
static int hf_zbncp_data_tx_opt_obsolete = -1;
static int hf_zbncp_data_tx_opt_ack = -1;
static int hf_zbncp_data_tx_opt_frag = -1;
static int hf_zbncp_data_tx_opt_inc_ext_nonce = -1;
static int hf_zbncp_data_tx_opt_force_mesh_route = -1;
static int hf_zbncp_data_tx_opt_send_route_record = -1;
static int hf_zbncp_data_lqi = -1;
static int hf_zbncp_data_rssi = -1;
static int hf_zbncp_data_do_cleanup = -1;
static int hf_zbncp_data_max_rx_bcast = -1;
static int hf_zbncp_data_mac_tx_bcast = -1;
static int hf_zbncp_data_mac_rx_ucast = -1;
static int hf_zbncp_data_mac_tx_ucast_total_zcl = -1;
static int hf_zbncp_data_mac_tx_ucast_failures_zcl = -1;
static int hf_zbncp_data_mac_tx_ucast_retries_zcl = -1;
static int hf_zbncp_data_mac_tx_ucast_total = -1;
static int hf_zbncp_data_mac_tx_ucast_failures = -1;
static int hf_zbncp_data_mac_tx_ucast_retries = -1;
static int hf_zbncp_data_mac_validate_drop_cnt = -1;
static int hf_zbncp_data_mac_phy_cca_fail_count = -1;
static int hf_zbncp_data_phy_to_mac_que_lim_reached = -1;
static int hf_zbncp_data_period_of_time = -1;
static int hf_zbncp_data_last_msg_lqi = -1;
static int hf_zbncp_data_last_msg_rssi = -1;
static int hf_zbncp_data_number_of_resets = -1;
static int hf_zbncp_data_aps_tx_bcast = -1;
static int hf_zbncp_data_aps_tx_ucast_success = -1;
static int hf_zbncp_data_aps_tx_ucast_retry = -1;
static int hf_zbncp_data_aps_tx_ucast_fail = -1;
static int hf_zbncp_data_route_disc_initiated = -1;
static int hf_zbncp_data_nwk_neighbor_added = -1;
static int hf_zbncp_data_nwk_neighbor_removed = -1;
static int hf_zbncp_data_nwk_neighbor_stale = -1;
static int hf_zbncp_upd_status_code = -1;
static int hf_zbncp_data_join_indication = -1;
static int hf_zbncp_data_childs_removed = -1;
static int hf_zbncp_data_aps_decrypt_failure = -1;
static int hf_zbncp_data_packet_buffer_allocate_failures = -1;
static int hf_zbncp_data_aps_unauthorized_key = -1;
static int hf_zbncp_data_nwk_decrypt_failure = -1;
static int hf_zbncp_data_average_mac_retry_per_aps_message_sent = -1;
static int hf_zbncp_data_nwk_fc_failure = -1;
static int hf_zbncp_data_aps_fc_failure = -1;
static int hf_zbncp_data_nwk_retry_overflow = -1;
static int hf_zbncp_data_nwk_bcast_table_full = -1;
static int hf_zbncp_data_status = -1;
static int hf_zbncp_zdo_auth_type = -1;
static int hf_zbncp_zdo_leg_auth_status_code = -1;
static int hf_zbncp_zdo_tclk_auth_status_code = -1;
static int hf_zbncp_zdo_server_mask = -1;
static int hf_zbncp_zdo_start_entry_idx = -1;
static int hf_zbncp_zdo_scan_duration = -1;
static int hf_zbncp_zdo_scan_cnt = -1;
static int hf_zbncp_zdo_scan_mgr_addr = -1;
static int hf_zbncp_data_aps_cnt = -1;
static int hf_zbncp_data_aps_fc = -1;
static int hf_zbncp_data_aps_fc_deliv_mode = -1;
static int hf_zbncp_data_aps_fc_secur = -1;
static int hf_zbncp_data_aps_fc_ack_retrans = -1;
static int hf_zbncp_data_aps_key_attr = -1;
static int hf_zbncp_data_aps_key_attr_key_src = -1;
static int hf_zbncp_data_aps_key_attr_key_used = -1;
static int hf_zbncp_data_pkt_len = -1;
static int hf_zbncp_data_pkt = -1;
static int hf_zbncp_data_scan_dur = -1;
static int hf_zbncp_data_distr_nwk_flag = -1;
static int hf_zbncp_data_nwk_count = -1;
static int hf_zbncp_data_nwk_upd_id = -1;
static int hf_zbncp_data_rejoin = -1;
static int hf_zbncp_data_rejoin_nwk = -1;
static int hf_zbncp_data_secur_en = -1;
static int hf_zbncp_data_beacon_type = -1;
static int hf_zbncp_data_beacon_order = -1;
static int hf_zbncp_data_superframe_order = -1;
static int hf_zbncp_data_battery_life_ext = -1;
static int hf_zbncp_data_enh_beacon = -1;
static int hf_zbncp_data_mac_if = -1;
static int hf_zbncp_data_mac_if_idx = -1;
static int hf_zbncp_data_ed_config = -1;
static int hf_zbncp_data_timeout_cnt = -1;
static int hf_zbncp_data_dev_timeout = -1;
static int hf_zbncp_data_relationship = -1;
static int hf_zbncp_data_tx_fail_cnt = -1;
static int hf_zbncp_data_out_cost = -1;
static int hf_zbncp_data_age = -1;
static int hf_zbncp_data_keepalive_rec = -1;
static int hf_zbncp_data_fast_poll_int = -1;
static int hf_zbncp_data_long_poll_int = -1;
static int hf_zbncp_data_fast_poll_flag = -1;
static int hf_zbncp_data_stop_fast_poll_result = -1;
static int hf_zbncp_data_time = -1;
static int hf_zbncp_data_pan_id_cnt = -1;
static int hf_zbncp_data_ic = -1;
static int hf_zbncp_data_ic_table_size = -1;
static int hf_zbncp_data_ic_ent_cnt = -1;
static int hf_zbncp_data_cs = -1;
static int hf_zbncp_data_ca_pub_key = -1;
static int hf_zbncp_data_ca_priv_key = -1;
static int hf_zbncp_data_cert = -1;
static int hf_zbncp_data_ic_en = -1;
static int hf_zbncp_data_key_type = -1;
static int hf_zbncp_data_issuer = -1;
static int hf_zbncp_data_tx_power = -1;
static int hf_zbncp_data_seed = -1;
static int hf_zbncp_data_tx_time = -1;
static int hf_zbncp_data_link_key = -1;
static int hf_zbncp_data_aps_link_key_type = -1;
static int hf_zbncp_data_key_src = -1;
static int hf_zbncp_data_key_attr = -1;
static int hf_zbncp_data_out_frame_cnt = -1;
static int hf_zbncp_data_inc_frame_cnt = -1;
static int hf_zbncp_data_offset = -1;
static int hf_zbncp_data_do_erase = -1;
static int hf_zbncp_data_calibration_status = -1;
static int hf_zbncp_data_calibration_value = -1;
static int hf_zbncp_data_zgp_key_type = -1;
static int hf_zbncp_data_zgp_link_key = -1;
static int hf_zbncp_data_prod_conf_hdr_crc = -1;
static int hf_zbncp_data_prod_conf_hdr_len = -1;
static int hf_zbncp_data_prod_conf_hdr_version = -1;
static int hf_zbncp_data_prod_conf_body = -1;
/* IEEE802.15.4 capability info (copied from IEEE802.15.4 95e212e6c7 commit)*/
static int hf_ieee802154_cinfo_alt_coord = -1;
static int hf_ieee802154_cinfo_device_type = -1;
static int hf_ieee802154_cinfo_power_src = -1;
static int hf_ieee802154_cinfo_idle_rx = -1;
static int hf_ieee802154_cinfo_sec_capable = -1;
static int hf_ieee802154_cinfo_alloc_addr = -1;
/* ZBNCP traffic dump */
static int hf_zbncp_dump_preambule = -1;
static int hf_zbncp_dump_version = -1;
static int hf_zbncp_dump_type = -1;
static int hf_zbncp_dump_options = -1;
static int hf_zbncp_dump_options_dir = -1;
static int hf_zbncp_dump_options_int_state = -1;
static int hf_zbncp_dump_options_tx_conflict = -1;
/* Initialize subtree pointers */
static gint ett_zbncp_hdr = -1;
static gint ett_zbncp_hdr_flags = -1;
static gint ett_zbncp_ll_body = -1;
static gint ett_zbncp_hl_hdr = -1;
static gint ett_zbncp_hl_body = -1;
static gint ett_zbncp_data_in_cl_list = -1;
static gint ett_zbncp_data_out_cl_list = -1;
static gint ett_zbncp_data_mac_cap = -1;
static gint ett_zbncp_data_pwr_src = -1;
static gint ett_zbncp_data_cur_pwr_src = -1;
static gint ett_zbncp_data_asoc_nwk_list = -1;
static gint ett_zbncp_data_pwr_desc = -1;
static gint ett_zbncp_data_desc_cap = -1;
static gint ett_zbncp_data_flags = -1;
static gint ett_zbncp_data_server_mask = -1;
static gint ett_zbncp_data_ep_list = -1;
static gint ett_zbncp_data_leave_flags = -1;
static gint ett_zbncp_data_tx_opt = -1;
static gint ett_zbncp_data_zdo_rejoin_flags = -1;
static gint ett_zbncp_data_apc_fc = -1;
static gint ett_zbncp_data_prod_conf_hdr = -1;
static gint ett_zbncp_data_aps_key_attr = -1;
static gint ett_zbncp_data_ch_list = -1;
static gint ett_zbncp_data_channel = -1;
static gint ett_zbncp_data_nwk_descr = -1;
static gint ett_zbncp_data_cmd_opt = -1;
static gint ett_zbncp_data_joind_bitmask = -1;
static gint ett_zbncp_data_trace_bitmask = -1;
static gint ett_zbncp_dump = -1;
static gint ett_zbncp_dump_opt = -1;
static dissector_handle_t zbncp_handle;
static const value_string zbncp_hl_type[] =
{
{ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST, "Request"},
{ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE, "Response"},
{ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION, "Indication"},
{0, NULL}
};
static const value_string zbncp_hl_status_cat[] =
{
{ZBNCP_HIGH_LVL_STAT_CAT_GENERIC, "Generic"},
{ZBNCP_HIGH_LVL_STAT_CAT_SYSTEM, "System"},
{ZBNCP_HIGH_LVL_STAT_CAT_MAC, "MAC"},
{ZBNCP_HIGH_LVL_STAT_CAT_NWK, "NWK"},
{ZBNCP_HIGH_LVL_STAT_CAT_APS, "APS"},
{ZBNCP_HIGH_LVL_STAT_CAT_ZDO, "ZDO"},
{ZBNCP_HIGH_LVL_STAT_CAT_CBKE, "CBKE"},
{0, NULL}
};
static const value_string zbncp_reset_opt[] =
{
{0, "No options"},
{1, "Erase NVRAM"},
{2, "Factory Reset"},
{3, "Locking reading keys"},
{0, NULL}
};
static const value_string zbncp_zb_role[] =
{
{0, "ZC"},
{1, "ZR"},
{2, "ZED"},
{0, NULL}
};
static const value_string zbncp_bind_type_vals[] =
{
{0, "NCP_HL_UNUSED_BINDING"},
{1, "NCP_HL_UNICAST_BINDING"},
{0, NULL}
};
static const value_string zbncp_tc_policy_types[] =
{
{0, "TC Link Keys Required"},
{1, "IC Required"},
{2, "TC Rejoin Enabled"},
{3, "Ignore TC Rejoin"},
{4, "APS Insecure Join"},
{5, "Disable NWK MGMT Channel Update"},
{0, NULL}
};
static const value_string zbncp_dev_update_status_code[] =
{
{0, "Standard Device Secured Rejoin"},
{1, "Standard Device Unsecured Join"},
{2, "Device Left"},
{3, "Standard Device Trust Center Rejoin"},
{0, NULL}
};
static const value_string zbncp_hl_call_id[] =
{
{ZBNCP_CMD_GET_MODULE_VERSION, "GET_MODULE_VERSION"},
{ZBNCP_CMD_NCP_RESET, "NCP_RESET"},
{ZBNCP_CMD_GET_ZIGBEE_ROLE, "GET_ZIGBEE_ROLE"},
{ZBNCP_CMD_SET_ZIGBEE_ROLE, "SET_ZIGBEE_ROLE"},
{ZBNCP_CMD_GET_ZIGBEE_CHANNEL_MASK, "GET_ZIGBEE_CHANNEL_MASK"},
{ZBNCP_CMD_SET_ZIGBEE_CHANNEL_MASK, "SET_ZIGBEE_CHANNEL_MASK"},
{ZBNCP_CMD_GET_ZIGBEE_CHANNEL, "GET_ZIGBEE_CHANNEL"},
{ZBNCP_CMD_GET_PAN_ID, "GET_PAN_ID"},
{ZBNCP_CMD_SET_PAN_ID, "SET_PAN_ID"},
{ZBNCP_CMD_GET_LOCAL_IEEE_ADDR, "GET_LOCAL_IEEE_ADDR"},
{ZBNCP_CMD_SET_LOCAL_IEEE_ADDR, "SET_LOCAL_IEEE_ADDR"},
{ZBNCP_CMD_SET_TRACE, "SET_TRACE"},
{ZBNCP_CMD_GET_KEEPALIVE_TIMEOUT, "GET_KEEPALIVE_TIMEOUT"},
{ZBNCP_CMD_SET_KEEPALIVE_TIMEOUT, "SET_KEEPALIVE_TIMEOUT"},
{ZBNCP_CMD_GET_TX_POWER, "GET_TX_POWER"},
{ZBNCP_CMD_SET_TX_POWER, "SET_TX_POWER"},
{ZBNCP_CMD_GET_RX_ON_WHEN_IDLE, "GET_RX_ON_WHEN_IDLE"},
{ZBNCP_CMD_SET_RX_ON_WHEN_IDLE, "SET_RX_ON_WHEN_IDLE"},
{ZBNCP_CMD_GET_JOINED, "GET_JOINED"},
{ZBNCP_CMD_GET_AUTHENTICATED, "GET_AUTHENTICATED"},
{ZBNCP_CMD_GET_ED_TIMEOUT, "GET_ED_TIMEOUT"},
{ZBNCP_CMD_SET_ED_TIMEOUT, "SET_ED_TIMEOUT"},
{ZBNCP_CMD_ADD_VISIBLE_DEV, "ADD_VISIBLE_DEV"},
{ZBNCP_CMD_ADD_INVISIBLE_SHORT, "ADD_INVISIBLE_SHORT"},
{ZBNCP_CMD_RM_INVISIBLE_SHORT, "RM_INVISIBLE_SHORT"},
{ZBNCP_CMD_SET_NWK_KEY, "SET_NWK_KEY"},
{ZBNCP_CMD_GET_SERIAL_NUMBER, "GET_SERIAL_NUMBER"},
{ZBNCP_CMD_GET_VENDOR_DATA, "GET_VENDOR_DATA"},
{ZBNCP_CMD_GET_NWK_KEYS, "GET_NWK_KEYS"},
{ZBNCP_CMD_GET_APS_KEY_BY_IEEE, "GET_APS_KEY_BY_IEEE"},
{ZBNCP_CMD_BIG_PKT_TO_NCP, "BIG_PKT_TO_NCP"},
{ZBNCP_CMD_GET_PARENT_ADDR, "GET_PARENT_ADDR"},
{ZBNCP_CMD_GET_EXT_PAN_ID, "GET_EXT_PAN_ID"},
{ZBNCP_CMD_GET_COORDINATOR_VERSION, "GET_COORDINATOR_VERSION"},
{ZBNCP_CMD_GET_SHORT_ADDRESS, "GET_SHORT_ADDRESS"},
{ZBNCP_CMD_GET_TRUST_CENTER_ADDRESS, "GET_TRUST_CENTER_ADDRESS"},
{ZBNCP_CMD_DEBUG_WRITE, "DEBUG_WRITE"},
{ZBNCP_CMD_GET_CONFIG_PARAMETER, "GET_CONFIG_PARAMETER"},
{ZBNCP_CMD_GET_LOCK_STATUS, "GET_LOCK_STATUS"},
{ZBNCP_CMD_GET_TRACE, "GET_TRACE"},
{ZBNCP_CMD_NCP_RESET_IND, "NCP_RESET_IND"},
{ZBNCP_CMD_SET_NWK_LEAVE_ALLOWED, "SET_NWK_LEAVE_ALLOWED"},
{ZBNCP_CMD_GET_NWK_LEAVE_ALLOWED, "GET_NWK_LEAVE_ALLOWED"},
{ZBNCP_CMD_NVRAM_WRITE, "NVRAM_WRITE"},
{ZBNCP_CMD_NVRAM_READ, "NVRAM_READ"},
{ZBCNP_CMD_NVRAM_CLEAR, "NVRAM_CLEAR"},
{ZBNCP_CMD_NVRAM_ERASE, "NVRAM_ERASE"},
{ZBNCP_CMD_SET_TC_POLICY, "SET_TC_POLICY"},
{ZBNCP_CMD_SET_EXTENDED_PAN_ID, "SET_EXTENDED_PAN_ID"},
{ZBNCP_CMD_SET_MAX_CHILDREN, "SET_MAX_CHILDREN"},
{ZBNCP_CMD_GET_MAX_CHILDREN, "GET_MAX_CHILDREN"},
{ZBNCP_CMD_SET_ZDO_LEAVE_ALLOWED, "SET_ZDO_LEAVE_ALLOWED"},
{ZBNCP_CMD_GET_ZDO_LEAVE_ALLOWED, "GET_ZDO_LEAVE_ALLOWED"},
{ZBNCP_CMD_SET_LEAVE_WO_REJOIN_ALLOWED, "SET_LEAVE_WO_REJOIN_ALLOWED"},
{ZBNCP_CMD_GET_LEAVE_WO_REJOIN_ALLOWED, "GET_LEAVE_WO_REJOIN_ALLOWED"},
{ZBNCP_CMD_DISABLE_GPPB, "DISABLE_GPPB"},
{ZBNCP_CMD_GP_SET_SHARED_KEY_TYPE, "GP_SET_SHARED_KEY_TYPE"},
{ZBNCP_CMD_GP_SET_DEFAULT_LINK_KEY, "GP_SET_DEFAULT_LINK_KEY"},
{ZBNCP_CMD_PRODUCTION_CONFIG_READ, "PRODUCTION_CONFIG_READ"},
{ZBNCP_CMD_AF_SET_SIMPLE_DESC, "AF_SET_SIMPLE_DESC"},
{ZBNCP_CMD_AF_DEL_EP, "AF_DEL_EP"},
{ZBNCP_CMD_AF_SET_NODE_DESC, "AF_SET_NODE_DESC"},
{ZBNCP_CMD_AF_SET_POWER_DESC, "AF_SET_POWER_DESC"},
{ZBNCP_CMD_AF_SUBGHZ_SUSPEND_IND, "AF_SUBGHZ_SUSPEND_IND"},
{ZBNCP_CMD_AF_SUBGHZ_RESUME_IND, "AF_SUBGHZ_RESUME_IND"},
{ZBNCP_CMD_ZDO_NWK_ADDR_REQ, "ZDO_NWK_ADDR_REQ"},
{ZBNCP_CMD_ZDO_IEEE_ADDR_REQ, "ZDO_IEEE_ADDR_REQ"},
{ZBNCP_CMD_ZDO_POWER_DESC_REQ, "ZDO_POWER_DESC_REQ"},
{ZBNCP_CMD_ZDO_NODE_DESC_REQ, "ZDO_NODE_DESC_REQ"},
{ZBNCP_CMD_ZDO_SIMPLE_DESC_REQ, "ZDO_SIMPLE_DESC_REQ"},
{ZBNCP_CMD_ZDO_ACTIVE_EP_REQ, "ZDO_ACTIVE_EP_REQ"},
{ZBNCP_CMD_ZDO_MATCH_DESC_REQ, "ZDO_MATCH_DESC_REQ"},
{ZBNCP_CMD_ZDO_BIND_REQ, "ZDO_BIND_REQ"},
{ZBNCP_CMD_ZDO_UNBIND_REQ, "ZDO_UNBIND_REQ"},
{ZBNCP_CMD_ZDO_MGMT_LEAVE_REQ, "ZDO_MGMT_LEAVE_REQ"},
{ZBNCP_CMD_ZDO_PERMIT_JOINING_REQ, "ZDO_PERMIT_JOINING_REQ"},
{ZBNCP_CMD_ZDO_DEV_ANNCE_IND, "ZDO_DEV_ANNCE_IND"},
{ZBNCP_CMD_ZDO_REJOIN, "ZDO_REJOIN"},
{ZBNCP_CMD_ZDO_SYSTEM_SRV_DISCOVERY_REQ, "ZDO_SYSTEM_SRV_DISCOVERY_REQ"},
{ZBNCP_CMD_ZDO_MGMT_BIND_REQ, "ZDO_MGMT_BIND_REQ"},
{ZBNCP_CMD_ZDO_MGMT_LQI_REQ, "ZDO_MGMT_LQI_REQ"},
{ZBNCP_CMD_ZDO_MGMT_NWK_UPDATE_REQ, "ZDO_MGMT_NWK_UPDATE_REQ"},
{ZBNCP_CMD_ZDO_REMOTE_CMD_IND, "ZDO_REMOTE_CMD_IND"},
{ZBNCP_CMD_ZDO_GET_STATS, "ZDO_GET_STATS"},
{ZBNCP_CMD_ZDO_DEV_AUTHORIZED_IND, "ZDO_DEV_AUTHORIZED_IND"},
{ZBNCP_CMD_ZDO_DEV_UPDATE_IND, "ZDO_DEV_UPDATE_IND"},
{ZBNCP_CMD_ZDO_SET_NODE_DESC_MANUF_CODE, "ZDO_SET_NODE_DESC_MANUF_CODE"},
{ZBNCP_CMD_HL_ZDO_GET_DIAG_DATA_REQ, "ZDO_GET_DIAG_DATA_REQ"},
{ZBNCP_CMD_APSDE_DATA_REQ, "APSDE_DATA_REQ"},
{ZBNCP_CMD_APSME_BIND, "APSME_BIND"},
{ZBNCP_CMD_APSME_UNBIND, "APSME_UNBIND"},
{ZBNCP_CMD_APSME_ADD_GROUP, "APSME_ADD_GROUP"},
{ZBNCP_CMD_APSME_RM_GROUP, "APSME_RM_GROUP"},
{ZBNCP_CMD_APSDE_DATA_IND, "APSDE_DATA_IND"},
{ZBNCP_CMD_APSME_RM_ALL_GROUPS, "APSME_RM_ALL_GROUPS"},
{ZBNCP_CMD_APS_GET_GROUP_TABLE, "APS_GET_GROUP_TABLE"},
{ZBNCP_CMD_APSME_UNBIND_ALL, "APSME_UNBIND_ALL"},
{ZBNCP_CMD_APSME_RM_BIND_ENTRY_BY_ID, "APSME_RM_BIND_ENTRY_BY_ID"},
{ZBNCP_CMD_APSME_CLEAR_BIND_TABLE, "APSME_CLEAR_BIND_TABLE"},
{ZBNCP_CMD_APSME_REMOTE_BIND_IND, "APSME_REMOTE_BIND_IND"},
{ZBNCP_CMD_APSME_REMOTE_UNBIND_IND, "APSME_REMOTE_UNBIND_IND"},
{ZBNCP_CMD_APSME_SET_REMOTE_BIND_OFFSET, "APSME_SET_REMOTE_BIND_OFFSET"},
{ZBNCP_CMD_APSME_GET_REMOTE_BIND_OFFSET, "APSME_GET_REMOTE_BIND_OFFSET"},
{ZBNCP_CMD_APSME_GET_BIND_ENTRY_BY_ID, "APSME_GET_BIND_ENTRY_BY_ID"},
{ZBNCP_CMD_NWK_FORMATION, "NWK_FORMATION"},
{ZBNCP_CMD_NWK_DISCOVERY, "NWK_DISCOVERY"},
{ZBNCP_CMD_NWK_NLME_JOIN, "NWK_NLME_JOIN"},
{ZBNCP_CMD_NWK_PERMIT_JOINING, "NWK_PERMIT_JOINING"},
{ZBNCP_CMD_NWK_GET_IEEE_BY_SHORT, "NWK_GET_IEEE_BY_SHORT"},
{ZBNCP_CMD_NWK_GET_SHORT_BY_IEEE, "NWK_GET_SHORT_BY_IEEE"},
{ZBNCP_CMD_NWK_GET_NEIGHBOR_BY_IEEE, "NWK_GET_NEIGHBOR_BY_IEEE"},
{ZBNCP_CMD_NWK_STARTED_IND, "NWK_STARTED_IND"},
{ZBNCP_CMD_NWK_REJOINED_IND, "NWK_REJOINED_IND"},
{ZBNCP_CMD_NWK_REJOIN_FAILED_IND, "NWK_REJOIN_FAILED_IND"},
{ZBNCP_CMD_NWK_LEAVE_IND, "NWK_LEAVE_IND"},
{ZBNCP_CMD_PIM_SET_FAST_POLL_INTERVAL, "PIM_SET_FAST_POLL_INTERVAL"},
{ZBNCP_CMD_PIM_SET_LONG_POLL_INTERVAL, "PIM_SET_LONG_POLL_INTERVAL"},
{ZBNCP_CMD_PIM_START_FAST_POLL, "PIM_START_FAST_POLL"},
{ZBNCP_CMD_PIM_START_POLL, "PIM_START_POLL"},
{ZBNCP_CMD_PIM_SET_ADAPTIVE_POLL, "PIM_SET_ADAPTIVE_POLL"},
{ZBNCP_CMD_PIM_STOP_FAST_POLL, "PIM_STOP_FAST_POLL"},
{ZBNCP_CMD_PIM_STOP_POLL, "PIM_STOP_POLL"},
{ZBNCP_CMD_PIM_ENABLE_TURBO_POLL, "PIM_ENABLE_TURBO_POLL"},
{ZBNCP_CMD_PIM_DISABLE_TURBO_POLL, "PIM_DISABLE_TURBO_POLL"},
{ZBNCP_CMD_NWK_GET_FIRST_NBT_ENTRY, "NWK_GET_FIRST_NBT_ENTRY"},
{ZBNCP_CMD_NWK_GET_NEXT_NBT_ENTRY, "NWK_GET_NEXT_NBT_ENTRY"},
{ZBNCP_CMD_NWK_PAN_ID_CONFLICT_RESOLVE, "NWK_PAN_ID_CONFLICT_RESOLVE"},
{ZBNCP_CMD_NWK_PAN_ID_CONFLICT_IND, "NWK_PAN_ID_CONFLICT_IND"},
{ZBNCP_CMD_NWK_ADDRESS_UPDATE_IND, "NWK_ADDRESS_UPDATE_IND"},
{ZBNCP_CMD_NWK_START_WITHOUT_FORMATION, "NWK_START_WITHOUT_FORMATION"},
{ZBNCP_CMD_NWK_NLME_ROUTER_START, "NWK_NLME_ROUTER_START"},
{ZBNCP_CMD_PIM_SINGLE_POLL, "PIM_SINGLE_POLL"},
{ZBNCP_CMD_PARENT_LOST_IND, "PARENT_LOST_IND"},
{ZBNCP_CMD_PIM_START_TURBO_POLL_PACKETS, "PIM_START_TURBO_POLL_PACKETS"},
{ZBNCP_CMD_PIM_START_TURBO_POLL_CONTINUOUS, "PIM_START_TURBO_POLL_CONTINUOUS"},
{ZBNCP_CMD_PIM_TURBO_POLL_CONTINUOUS_LEAVE, "PIM_TURBO_POLL_CONTINUOUS_LEAVE"},
{ZBNCP_CMD_PIM_TURBO_POLL_PACKETS_LEAVE, "PIM_TURBO_POLL_PACKETS_LEAVE"},
{ZBNCP_CMD_PIM_PERMIT_TURBO_POLL, "PIM_PERMIT_TURBO_POLL"},
{ZBNCP_CMD_PIM_SET_FAST_POLL_TIMEOUT, "PIM_SET_FAST_POLL_TIMEOUT"},
{ZBNCP_CMD_PIM_GET_LONG_POLL_INTERVAL, "PIM_GET_LONG_POLL_INTERVAL"},
{ZBNCP_CMD_PIM_GET_IN_FAST_POLL_FLAG, "PIM_GET_IN_FAST_POLL_FLAG"},
{ZBNCP_CMD_SET_KEEPALIVE_MODE, "SET_KEEPALIVE_MODE"},
{ZBNCP_CMD_START_CONCENTRATOR_MODE, "START_CONCENTRATOR_MODE"},
{ZBNCP_CMD_STOP_CONCENTRATOR_MODE, "STOP_CONCENTRATOR_MODE"},
{ZBNCP_CMD_NWK_ENABLE_PAN_ID_CONFLICT_RESOLUTION, "NWK_ENABLE_PAN_ID_CONFLICT_RESOLUTION"},
{ZBNCP_CMD_NWK_ENABLE_AUTO_PAN_ID_CONFLICT_RESOLUTION, "NWK_ENABLE_AUTO_PAN_ID_CONFLICT_RESOLUTION"},
{ZBNCP_CMD_PIM_TURBO_POLL_CANCEL_PACKET, "PIM_TURBO_POLL_CANCEL_PACKET"},
{ZBNCP_CMD_SET_FORCE_ROUTE_RECORD, "SET_FORCE_ROUTE_RECORD"},
{ZBNCP_CMD_GET_FORCE_ROUTE_RECORD, "GET_FORCE_ROUTE_RECORD"},
{ZBNCP_CMD_NWK_NBR_ITERATOR_NEXT, "NWK_NBR_ITERATOR_NEXT"},
{ZBNCP_CMD_SECUR_SET_LOCAL_IC, "SECUR_SET_LOCAL_IC"},
{ZBNCP_CMD_SECUR_ADD_IC, "SECUR_ADD_IC"},
{ZBNCP_CMD_SECUR_DEL_IC, "SECUR_DEL_IC"},
{ZBNCP_CMD_SECUR_ADD_CERT, "SECUR_ADD_CERT"},
{ZBNCP_CMD_SECUR_DEL_CERT, "SECUR_DEL_CERT"},
{ZBNCP_CMD_SECUR_START_KE, "SECUR_START_KE"},
{ZBNCP_CMD_SECUR_START_PARTNER_LK, "SECUR_START_PARTNER_LK"},
{ZBNCP_CMD_SECUR_CBKE_SRV_FINISHED_IND, "SECUR_CBKE_SRV_FINISHED_IND"},
{ZBNCP_CMD_SECUR_PARTNER_LK_FINISHED_IND, "SECUR_PARTNER_LK_FINISHED_IND"},
{ZBNCP_CMD_SECUR_KE_WHITELIST_ADD, "SECUR_KE_WHITELIST_ADD"},
{ZBNCP_CMD_SECUR_KE_WHITELIST_DEL, "SECUR_KE_WHITELIST_DEL"},
{ZBNCP_CMD_SECUR_KE_WHITELIST_DEL_ALL, "SECUR_KE_WHITELIST_DEL_ALL"},
{ZBNCP_CMD_SECUR_JOIN_USES_IC, "SECUR_JOIN_USES_IC"},
{ZBNCP_CMD_SECUR_GET_IC_BY_IEEE, "SECUR_GET_IC_BY_IEEE"},
{ZBNCP_CMD_SECUR_GET_CERT, "SECUR_GET_CERT"},
{ZBNCP_CMD_SECUR_GET_LOCAL_IC, "SECUR_GET_LOCAL_IC"},
{ZBNCP_CMD_SECUR_TCLK_IND, "SECUR_TCLK_IND"},
{ZBNCP_CMD_SECUR_TCLK_EXCHANGE_FAILED_IND, "SECUR_TCLK_EXCHANGE_FAILED_IND"},
{ZBNCP_CMD_SECUR_GET_KEY_IDX, "SECUR_GET_KEY_IDX"},
{ZBNCP_CMD_SECUR_GET_KEY, "SECUR_GET_KEY"},
{ZBNCP_CMD_SECUR_ERASE_KEY, "SECUR_ERASE_KEY"},
{ZBNCP_CMD_SECUR_CLEAR_KEY_TABLE, "SECUR_CLEAR_KEY_TABLE"},
{ZBNCP_CMD_SECUR_NWK_INITIATE_KEY_SWITCH_PROCEDURE, "SECUR_NWK_INITIATE_KEY_SWITCH_PROCEDURE"},
{ZBNCP_CMD_SECUR_GET_IC_LIST, "SECUR_GET_IC_LIST"},
{ZBNCP_CMD_SECUR_GET_IC_BY_IDX, "SECUR_GET_IC_BY_IDX"},
{ZBNCP_CMD_SECUR_REMOVE_ALL_IC, "SECUR_REMOVE_ALL_IC"},
{ZBNCP_CMD_SECUR_PARTNER_LK_ENABLE, "SECUR_PARTNER_LK_ENABLE"},
{ZBNCP_CMD_MANUF_MODE_START, "MANUF_MODE_START"},
{ZBNCP_CMD_MANUF_MODE_END, "MANUF_MODE_END"},
{ZBNCP_CMD_MANUF_SET_CHANNEL, "MANUF_SET_CHANNEL"},
{ZBNCP_CMD_MANUF_GET_CHANNEL, "MANUF_GET_CHANNEL"},
{ZBNCP_CMD_MANUF_SET_POWER, "MANUF_SET_POWER"},
{ZBNCP_CMD_MANUF_GET_POWER, "MANUF_GET_POWER"},
{ZBNCP_CMD_MANUF_START_TONE, "MANUF_START_TONE"},
{ZBNCP_CMD_MANUF_STOP_TONE, "MANUF_STOP_TONE"},
{ZBNCP_CMD_MANUF_START_STREAM_RANDOM, "MANUF_START_STREAM_RANDOM"},
{ZBNCP_CMD_MANUF_STOP_STREAM_RANDOM, "MANUF_STOP_STREAM_RANDOM"},
{ZBNCP_CMD_NCP_HL_MANUF_SEND_SINGLE_PACKET, "MANUF_SEND_SINGLE_PACKET"},
{ZBNCP_CMD_MANUF_START_TEST_RX, "MANUF_START_TEST_RX"},
{ZBNCP_CMD_MANUF_STOP_TEST_RX, "MANUF_STOP_TEST_RX"},
{ZBNCP_CMD_MANUF_RX_PACKET_IND, "MANUF_RX_PACKET_IND"},
{ZBNCP_CMD_OTA_RUN_BOOTLOADER, "OTA_RUN_BOOTLOADER"},
{ZBNCP_CMD_OTA_START_UPGRADE_IND, "OTA_START_UPGRADE_IND"},
{ZBNCP_CMD_OTA_SEND_PORTION_FW, "OTA_SEND_PORTION_FW"},
{ZBNCP_CMD_READ_NVRAM_RESERVED, "READ_NVRAM_RESERVED"},
{ZBNCP_CMD_WRITE_NVRAM_RESERVED, "WRITE_NVRAM_RESERVED"},
{ZBNCP_CMD_GET_CALIBRATION_INFO, "GET_CALIBRATION_INFO"},
{0, NULL}
};
static const value_string zbncp_parameter_id_list[] =
{
{ZBNCP_PARAMETER_ID_IEEE_ADDR_TABLE_SIZE, "IEEE_ADDR_TABLE_SIZE"},
{ZBNCP_PARAMETER_ID_NEIGHBOR_TABLE_SIZE, "NEIGHBOR_TABLE_SIZE"},
{ZBNCP_PARAMETER_ID_APS_SRC_BINDING_TABLE_SIZE, "APS_SRC_BINDING_TABLE_SIZE"},
{ZBNCP_PARAMETER_ID_APS_GROUP_TABLE_SIZE, "APS_GROUP_TABLE_SIZE"},
{ZBNCP_PARAMETER_ID_NWK_ROUTING_TABLE_SIZE, "NWK_ROUTING_TABLE_SIZE"},
{ZBNCP_PARAMETER_ID_NWK_ROUTE_DISCOVERY_TABLE_SIZE, "NWK_ROUTE_DISCOVERY_TABLE_SIZE"},
{ZBNCP_PARAMETER_ID_IOBUF_POOL_SIZE, "IOBUF_POOL_SIZE"},
{ZBNCP_PARAMETER_ID_PANID_TABLE_SIZE, "PANID_TABLE_SIZE"},
{ZBNCP_PARAMETER_ID_APS_DUPS_TABLE_SIZE, "APS_DUPS_TABLE_SIZE"},
{ZBNCP_PARAMETER_ID_APS_BIND_TRANS_TABLE_SIZE, "APS_BIND_TRANS_TABLE_SIZE"},
{ZBNCP_PARAMETER_ID_N_APS_RETRANS_ENTRIES, "N_APS_RETRANS_ENTRIES"},
{ZBNCP_PARAMETER_ID_NWK_MAX_HOPS, "NWK_MAX_HOPS"},
{ZBNCP_PARAMETER_ID_NIB_MAX_CHILDREN, "NIB_MAX_CHILDREN"},
{ZBNCP_PARAMETER_ID_N_APS_KEY_PAIR_ARR_MAX_SIZE, "N_APS_KEY_PAIR_ARR_MAX_SIZE"},
{ZBNCP_PARAMETER_ID_NWK_MAX_SRC_ROUTES, "NWK_MAX_SRC_ROUTES"},
{ZBNCP_PARAMETER_ID_APS_MAX_WINDOW_SIZE, "APS_MAX_WINDOW_SIZE"},
{ZBNCP_PARAMETER_ID_APS_INTERFRAME_DELAY, "APS_INTERFRAME_DELAY"},
{ZBNCP_PARAMETER_ID_ZDO_ED_BIND_TIMEOUT, "ZDO_ED_BIND_TIMEOUT"},
{ZBNCP_PARAMETER_ID_NIB_PASSIVE_ASK_TIMEOUT, "NIB_PASSIVE_ASK_TIMEOUT"},
{ZBNCP_PARAMETER_ID_APS_ACK_TIMEOUTS, "APS_ACK_TIMEOUTS"},
{ZBNCP_PARAMETER_ID_MAC_BEACON_JITTER, "MAC_BEACON_JITTER"},
{ZBNCP_PARAMETER_ID_TX_POWER, "TX_POWER"},
{ZBNCP_PARAMETER_ID_ZLL_DEFAULT_RSSI_THRESHOLD, "ZLL_DEFAULT_RSSI_THRESHOLD"},
{ZBNCP_PARAMETER_ID_NIB_MTORR, "NIB_MTORR"},
{0, NULL}
};
static const value_string zbncp_rst_src_list[] =
{
{0, "ZB_RESET_SRC_POWER_ON"},
{1, "ZB_RESET_SRC_SW_RESET"},
{2, "ZB_RESET_SRC_RESET_PIN"},
{3, "ZB_RESET_SRC_BROWN_OUT"},
{4, "ZB_RESET_SRC_CLOCK_LOSS"},
{5, "ZB_RESET_SRC_OTHER"},
{0, NULL}
};
static const value_string zbncp_power_level[] =
{
{0, "Critical"},
{4, "33%"},
{8, "66%"},
{12, "100%"},
{0, NULL}
};
static const value_string zbncp_nwk_req_type[] =
{
{0, "Single device response"},
{1, "Extended response"},
{0, NULL}
};
static const value_string zbncp_hl_status_generic[] =
{
{0, "OK"},
{1, "ERROR"},
{2, "BLOCKED"},
{3, "EXIT"},
{4, "BUSY"},
{5, "EOF"},
{6, "OUT_OF_RANGE"},
{7, "EMPTY"},
{8, "CANCELLED"},
{10, "INVALID_PARAMETER_1"},
{11, "INVALID_PARAMETER_2"},
{12, "INVALID_PARAMETER_3"},
{13, "INVALID_PARAMETER_4"},
{14, "INVALID_PARAMETER_5"},
{15, "INVALID_PARAMETER_6"},
{16, "INVALID_PARAMETER_7"},
{17, "INVALID_PARAMETER_8"},
{18, "INVALID_PARAMETER_9"},
{19, "INVALID_PARAMETER_10"},
{20, "INVALID_PARAMETER_11_OR_MORE"},
{21, "PENDING"},
{22, "NO_MEMORY"},
{23, "INVALID_PARAMETER"},
{24, "OPERATION_FAILED"},
{25, "BUFFER_TOO_SMALL"},
{26, "END_OF_LIST"},
{27, "ALREADY_EXISTS"},
{28, "NOT_FOUND"},
{29, "OVERFLOW"},
{30, "TIMEOUT"},
{31, "NOT_IMPLEMENTED"},
{32, "NO_RESOURCES"},
{33, "UNINITIALIZED"},
{34, "NO_SERVER"},
{35, "INVALID_STATE"},
{37, "CONNECTION_FAILED"},
{38, "CONNECTION_LOST"},
{40, "UNAUTHORIZED"},
{41, "CONFLICT"},
{42, "INVALID_FORMAT"},
{43, "NO_MATCH"},
{44, "PROTOCOL_ERROR"},
{45, "VERSION"},
{46, "MALFORMED_ADDRESS"},
{47, "COULD_NOT_READ_FILE"},
{48, "FILE_NOT_FOUND"},
{49, "DIRECTORY_NOT_FOUND"},
{50, "CONVERSION_ERROR"},
{51, "INCOMPATIBLE_TYPES"},
{56, "FILE_CORRUPTED"},
{57, "PAGE_NOT_FOUND"},
{62, "ILLEGAL_REQUEST"},
{64, "INVALID_GROUP"},
{65, "TABLE_FULL"},
{69, "IGNORE"},
{70, "AGAIN"},
{71, "DEVICE_NOT_FOUND"},
{72, "OBSOLETE"},
{0, NULL}
};
static const value_string zb_mac_state[] =
{
{MAC_ENUM_SUCCESS, "SUCCESS"},
{MAC_ENUM_BEACON_LOSS, "BEACON_LOSS"},
{MAC_ENUM_CHANNEL_ACCESS_FAILURE, "CHANNEL_ACCESS_FAILURE"},
{MAC_ENUM_COUNTER_ERROR, "COUNTER_ERROR"},
{MAC_ENUM_DENIED, "DENIED"},
{MAC_ENUM_DISABLE_TRX_FAILURE, "DISABLE_TRX_FAILURE"},
{MAC_ENUM_FRAME_TOO_LONG, "FRAME_TOO_LONG"},
{MAC_ENUM_IMPROPER_KEY_TYPE, "IMPROPER_KEY_TYPE"},
{MAC_ENUM_IMPROPER_SECURITY_LEVEL, "IMPROPER_SECURITY_LEVEL"},
{MAC_ENUM_INVALID_ADDRESS, "INVALID_ADDRESS"},
{MAC_ENUM_INVALID_GTS, "INVALID_GTS"},
{MAC_ENUM_INVALID_HANDLE, "INVALID_HANDLE"},
{MAC_ENUM_INVALID_INDEX, "INVALID_INDEX"},
{MAC_ENUM_INVALID_PARAMETER, "INVALID_PARAMETER"},
{MAC_ENUM_LIMIT_REACHED, "LIMIT_REACHED"},
{MAC_ENUM_NO_ACK, "NO_ACK"},
{MAC_ENUM_NO_BEACON, "NO_BEACON"},
{MAC_ENUM_NO_DATA, "NO_DATA"},
{MAC_ENUM_NO_SHORT_ADDRESS, "NO_SHORT_ADDRESS"},
{MAC_ENUM_ON_TIME_TOO_LONG, "ON_TIME_TOO_LONG"},
{MAC_ENUM_OUT_OF_CAP, "OUT_OF_CAP"},
{MAC_ENUM_PAN_ID_CONFLICT, "PAN_ID_CONFLICT"},
{MAC_ENUM_PAST_TIME, "PAST_TIME"},
{MAC_ENUM_READ_ONLY, "READ_ONLY"},
{MAC_ENUM_REALIGNMENT, "REALIGNMENT"},
{MAC_ENUM_SCAN_IN_PROGRESS, "SCAN_IN_PROGRESS"},
{MAC_ENUM_SECURITY_ERROR, "SECURITY_ERROR"},
{MAC_ENUM_SUPERFRAME_OVERLAP, "SUPERFRAME_OVERLAP"},
{MAC_ENUM_TRACKING_OFF, "TRACKING_OFF"},
{MAC_ENUM_TRANSACTION_EXPIRED, "TRANSACTION_EXPIRED"},
{MAC_ENUM_TRANSACTION_OVERFLOW, "TRANSACTION_OVERFLOW"},
{MAC_ENUM_TX_ACTIVE, "TX_ACTIVE"},
{MAC_ENUM_UNAVAILABLE_KEY, "UNAVAILABLE_KEY"},
{MAC_ENUM_UNSUPPORTED_LEGACY, "UNSUPPORTED_LEGACY"},
{MAC_ENUM_UNSUPPORTED_SECURITY, "UNSUPPORTED_SECURITY"},
{0, NULL}
};
static const value_string zb_nwk_state[] =
{
{ZBNCP_NWK_STATUS_SUCCESS, "SUCCESS"},
{ZBNCP_NWK_STATUS_INVALID_PARAMETER, "INVALID_PARAMETER"},
{ZBNCP_NWK_STATUS_INVALID_REQUEST, "INVALID_REQUEST"},
{ZBNCP_NWK_STATUS_NOT_PERMITTED, "NOT_PERMITTED, "},
{ZBNCP_NWK_STATUS_ALREADY_PRESENT, "ALREADY_PRESENT"},
{ZBNCP_NWK_STATUS_SYNC_FAILURE, "SYNC_FAILURE"},
{ZBNCP_NWK_STATUS_NEIGHBOR_TABLE_FULL, "NEIGHBOR_TABLE_FULL"},
{ZBNCP_NWK_STATUS_UNKNOWN_DEVICE, "UNKNOWN_DEVICE"},
{ZBNCP_NWK_STATUS_UNSUPPORTED_ATTRIBUTE, "UNSUPPORTED_ATTRIBUTE"},
{ZBNCP_NWK_STATUS_NO_NETWORKS, "NO_NETWORKS"},
{ZBNCP_NWK_STATUS_MAX_FRM_COUNTER, "MAX_FRM_COUNTER"},
{ZBNCP_NWK_STATUS_NO_KEY, "NO_KEY"},
{ZBNCP_NWK_STATUS_ROUTE_DISCOVERY_FAILED, "ROUTE_DISCOVERY_FAILED"},
{ZBNCP_NWK_STATUS_ROUTE_ERROR, "ROUTE_ERROR"},
{ZBNCP_NWK_STATUS_BT_TABLE_FULL, "BT_TABLE_FULL"},
{ZBNCP_NWK_STATUS_FRAME_NOT_BUFFERED, "FRAME_NOT_BUFFERE"},
{ZBNCP_NWK_STATUS_INVALID_INTERFACE, "INVALID_INTERFACE"},
{0, NULL}
};
static const value_string zb_cbke_state[] =
{
{ZBNCP_CBKE_STATUS_OK, "OK"},
{ZBNCP_CBKE_STATUS_UNKNOWN_ISSUER, "UNKNOWN_ISSUER"},
{ZBNCP_CBKE_STATUS_BAD_KEY_CONFIRM, "BAD_KEY_CONFIRM"},
{ZBNCP_CBKE_STATUS_BAD_MESSAGE, "BAD_MESSAGE"},
{ZBNCP_CBKE_STATUS_NO_RESOURCES, "NO_RESOURCES"},
{ZBNCP_CBKE_STATUS_UNSUPPORTED_SUITE, "UNSUPPORTED_SUITE"},
{ZBNCP_CBKE_STATUS_INVALID_CERTIFICATE, "INVALID_CERTIFICATE"},
{ZBNCP_CBKE_STATUS_NO_KE_EP, "NO_KE_EP"},
{0, NULL}
};
static const value_string zb_nvram_database_types[] =
{
{ZB_NVRAM_RESERVED, "ZB_NVRAM_RESERVED"},
{ZB_NVRAM_COMMON_DATA, "ZB_NVRAM_COMMON_DATA"},
{ZB_NVRAM_HA_DATA, "ZB_NVRAM_HA_DATA"},
{ZB_NVRAM_ZCL_REPORTING_DATA, "ZB_NVRAM_ZCL_REPORTING_DATA"},
{ZB_NVRAM_APS_SECURE_DATA_GAP, "ZB_NVRAM_APS_SECURE_DATA_GAP"},
{ZB_NVRAM_APS_BINDING_DATA_GAP, "ZB_NVRAM_APS_BINDING_DATA_GAP"},
{ZB_NVRAM_HA_POLL_CONTROL_DATA, "ZB_NVRAM_HA_POLL_CONTROL_DATA"},
{ZB_IB_COUNTERS, "ZB_IB_COUNTERS"},
{ZB_NVRAM_DATASET_GRPW_DATA, "ZB_NVRAM_DATASET_GRPW_DATA"},
{ZB_NVRAM_APP_DATA1, "ZB_NVRAM_APP_DATA1"},
{ZB_NVRAM_APP_DATA2, "ZB_NVRAM_APP_DATA2"},
{ZB_NVRAM_ADDR_MAP, "ZB_NVRAM_ADDR_MAP"},
{ZB_NVRAM_NEIGHBOUR_TBL, "ZB_NVRAM_NEIGHBOUR_TBL"},
{ZB_NVRAM_INSTALLCODES, "ZB_NVRAM_INSTALLCODES"},
{ZB_NVRAM_APS_SECURE_DATA, "ZB_NVRAM_APS_SECURE_DATA"},
{ZB_NVRAM_APS_BINDING_DATA, "ZB_NVRAM_APS_BINDING_DATA"},
{ZB_NVRAM_DATASET_GP_PRPOXYT, "ZB_NVRAM_DATASET_GP_PRPOXYT"},
{ZB_NVRAM_DATASET_GP_SINKT, "ZB_NVRAM_DATASET_GP_SINKT"},
{ZB_NVRAM_DATASET_GP_CLUSTER, "ZB_NVRAM_DATASET_GP_CLUSTER"},
{ZB_NVRAM_APS_GROUPS_DATA, "ZB_NVRAM_APS_GROUPS_DATA"},
{ZB_NVRAM_DATASET_SE_CERTDB, "ZB_NVRAM_DATASET_SE_CERTDB"},
{ZB_NVRAM_DATASET_GP_APP_TBL, "ZB_NVRAM_DATASET_GP_APP_TBL"},
{ZB_NVRAM_APP_DATA3, "ZB_NVRAM_APP_DATA3"},
{ZB_NVRAM_APP_DATA4, "ZB_NVRAM_APP_DATA4"},
{ZB_NVRAM_KE_WHITELIST, "ZB_NVRAM_KE_WHITELIST"},
{ZB_NVRAM_ZDO_DIAGNOSTICS_DATA, "ZB_NVRAM_ZDO_DIAGNOSTICS_DATA"},
{ZB_NVRAM_DATASET_NUMBER, "ZB_NVRAM_DATASET_NUMBER"},
{ZB_NVRAM_DATA_SET_TYPE_PAGE_HDR, "ZB_NVRAM_DATA_SET_TYPE_PAGE_HDR"},
{0, NULL}
};
static const value_string zbncp_zgp_key_types[] =
{
{0, "No key"},
{1, "Zigbee NWK key"},
{2, "ZGPD group key"},
{3, "NWK-key derived ZGPD group key"},
{4, "(Individual) out-of-the-box ZGPD key"},
{7, "Derived individual ZGPD key"},
{0, NULL}
};
static const value_string zbncp_deliv_mode[] =
{
{0, "Unicast"},
{2, "Broadcast"},
{3, "Group"},
{0, NULL}
};
static const value_string zbncp_aps_key_src[] =
{
{0, "Unknown"},
{1, "CBKE"},
{0, NULL}
};
static const value_string zbncp_aps_key_used[] =
{
{0, "Provisional TCLK"},
{1, "Unverified TCLK"},
{2, "Verified TCLK"},
{3, "Application LK"},
{0, NULL}
};
static const value_string zbncp_rejoin_nwk[] =
{
{0, "Associate"},
{2, "Rejoin"},
{0, NULL}
};
static const value_string zbncp_beacon_type[] =
{
{0, "Non-enhanced beacon"},
{1, "Enhanced Beacon"},
{0, NULL}
};
static const value_string zbncp_relationship[] =
{
{0x00, "neighbor is the parent"},
{0x01, "neighbor is a child"},
{0x02, "neighbor is a sibling"},
{0x03, "none of the above"},
{0x04, "previous child"},
{0x05, "unauthenticated child"},
{0, NULL}
};
static const value_string zbncp_keepalive_mode[] =
{
{0, "ED_KEEPALIVE_DISABLED"},
{1, "MAC_DATA_POLL_KEEPALIVE"},
{2, "ED_TIMEOUT_REQUEST_KEEPALIVE"},
{3, "BOTH_KEEPALIVE_METHODS"},
{0, NULL}
};
static const value_string zbncp_stop_fast_poll_result[] =
{
{0, "Not started"},
{1, "Not stopped"},
{2, "Stopped"},
{0, NULL}
};
static const value_string zbncp_aps_addr_modes[] =
{
{ZB_APSDE_DST_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT, "No addr, no EP"},
{ZB_APSDE_DST_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT, "16-bit group addr, no EP"},
{ZB_APSDE_DST_ADDR_MODE_16_ENDP_PRESENT, "16-bit short addr and EP"},
{ZB_APSDE_DST_ADDR_MODE_64_ENDP_PRESENT, "64-bit ext addr and EP"},
{ZB_APSDE_DST_ADDR_MODE_BIND_TBL_ID, "From the dst binding table"},
{0, NULL}
};
static const value_string zbncp_cs[] =
{
{1, "KEC Crypto-suite #1"},
{2, "KEC Crypto-suite #2"},
{0, NULL}
};
static const value_string zbncp_key_src[] =
{
{0, "Unknown"},
{1, "CBKE"},
{0, NULL}
};
static const value_string zbncp_key_attr[] =
{
{0, "Provisional key"},
{1, "Unverified key"},
{2, "Verified key"},
{3, "Application key"},
{0, NULL}
};
static const value_string zbncp_zdo_auth_types[] =
{
{ZB_ZDO_AUTH_LEGACY_TYPE, "legacy"},
{ZB_ZDO_AUTH_TCLK_TYPE, "TCLK"},
{0, NULL}
};
static const value_string zbncp_zdo_leg_auth_status_codes[] =
{
{0, "Authorization Success"},
{1, "Authorization Failure"},
{0, NULL}
};
static const value_string zbncp_zdo_tclk_auth_status_codes[] =
{
{0, "Authorization Success"},
{1, "Authorization Timeout"},
{2, "Authorization Failure"},
{0, NULL}
};
static const value_string zbncp_dump_type[] =
{
{0, "Text"},
{1, "Binary"},
{0, NULL}
};
static const value_string zbncp_calibration_status[] =
{
{0x00, "Customer value"},
{0x01, "Default value"},
{0x02, "Error"},
{0, NULL}
};
static const value_string zbncp_force_route_record_sending_modes[] =
{
{0x00, "Disabled"},
{0x01, "Enabled"},
{0, NULL}
};
static const true_false_string tfs_cinfo_device_type = {"FFD", "RFD"};
static const true_false_string tfs_cinfo_power_src = {"AC/Mains Power", "Battery"};
/* Returns changed offset */
static guint
dissect_zbncp_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
{
guint status_category = tvb_get_guint8(tvb, offset);
guint status;
proto_tree_add_item(tree, hf_zbncp_data_hl_status_cat, tvb, offset, 1, ENC_NA);
offset += 1;
/* Add status */
status = tvb_get_guint8(tvb, offset);
switch (status_category)
{
case ZBNCP_HIGH_LVL_STAT_CAT_GENERIC:
proto_tree_add_item(tree, hf_zbncp_data_hl_status_generic, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zbncp_hl_status_generic, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_MAC:
proto_tree_add_item(tree, hf_zbncp_data_hl_status_mac, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_mac_state, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_NWK:
proto_tree_add_item(tree, hf_zbncp_data_hl_status_nwk, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_nwk_state, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_APS:
dissect_zbee_aps_status_code(tvb, pinfo, tree, offset);
break;
case ZBNCP_HIGH_LVL_STAT_CAT_CBKE:
proto_tree_add_item(tree, hf_zbncp_data_hl_status_cbke, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_cbke_state, "Unknown Status"));
break;
default:
proto_tree_add_item(tree, hf_zbncp_data_hl_status, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: 0x%x", status);
}
offset += 1;
return offset;
}
static tvbuff_t *
dissect_zbncp_dump_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_tree *zbncp_dump_info_tree;
guint idx, offset;
guint8 options;
static int *const options_field[] = {
&hf_zbncp_dump_options_dir,
&hf_zbncp_dump_options_int_state,
&hf_zbncp_dump_options_tx_conflict,
NULL};
/* check is it ZBNCP dump sign or not */
for (idx = 0; idx < ZBNCP_DUMP_INFO_SIGN_SIZE; idx++)
{
if (tvb_get_guint8(tvb, idx) != ZBNCP_DUMP_INFO_SIGN[idx])
{
return tvb;
}
}
/* Check type */
if (tvb_get_guint8(tvb, ZBNCP_DUMP_INFO_SIGN_SIZE + 1) != ZBNCP_DUMP_INFO_NCP_TYPE)
{
return tvb;
}
zbncp_dump_info_tree = proto_tree_add_subtree(tree, tvb, 0, ZBNCP_DUMP_INFO_SIZE, ett_zbncp_dump, NULL, "ZBNCP Dump");
proto_tree_add_item(zbncp_dump_info_tree, hf_zbncp_dump_preambule, tvb, 0, ZBNCP_DUMP_INFO_SIGN_SIZE, (ENC_ASCII | ENC_NA));
offset = ZBNCP_DUMP_INFO_SIGN_SIZE;
proto_tree_add_item(zbncp_dump_info_tree, hf_zbncp_dump_version, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_dump_info_tree, hf_zbncp_dump_type, tvb, offset, 1, ENC_NA);
offset += 1;
/* options subtree */
options = tvb_get_guint8(tvb, offset);
proto_tree_add_bitmask(zbncp_dump_info_tree, tvb, offset, hf_zbncp_dump_options, ett_zbncp_dump_opt, options_field, ENC_NA);
offset += 1;
if (options & ZBNCP_DUMP_DIR_MASK)
{
col_set_str(pinfo->cinfo, COL_DEF_SRC, "NCP");
col_set_str(pinfo->cinfo, COL_DEF_DST, "HOST");
}
else
{
col_set_str(pinfo->cinfo, COL_DEF_SRC, "HOST");
col_set_str(pinfo->cinfo, COL_DEF_DST, "NCP");
}
if (options & ZBNCP_DUMP_POTENTIAL_TX_RX_ERROR_MASK)
{
col_append_str(pinfo->cinfo, COL_INFO, ", Potential RX/TX Conflict");
}
return tvb_new_subset_remaining(tvb, offset);
}
static guint
dissect_zbncp_high_level_hdr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset, guint8 *ptype, guint16 *call_id)
{
proto_tree *zbncp_comm_hdr_tree = proto_tree_add_subtree_format(tree, tvb, offset, 4, ett_zbncp_hl_hdr, NULL, "High Level Header");
/* Dissect common header */
proto_tree_add_item(zbncp_comm_hdr_tree, hf_zbncp_data_hl_version, tvb, offset, 1, ENC_NA);
offset += 1;
*ptype = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_comm_hdr_tree, hf_zbncp_data_hl_packet_type, tvb, offset, 1, ENC_NA);
offset += 1;
*call_id = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_comm_hdr_tree, hf_zbncp_data_hl_call_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
/* Update col */
col_append_fstr(pinfo->cinfo, COL_INFO, "%s", val_to_str_const(*ptype, zbncp_hl_type, "Unknown Type"));
col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", val_to_str_const(*call_id, zbncp_hl_call_id, "Unknown Call ID"));
/* Dissect additional values */
if (*ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST ||
*ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
/* add TSN */
proto_tree_add_item(zbncp_comm_hdr_tree, hf_zbncp_data_hl_tsn, tvb, offset, 1, ENC_NA);
offset += 1;
}
if (*ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
offset = dissect_zbncp_status(tvb, pinfo, zbncp_comm_hdr_tree, offset);
}
return offset;
}
static void
dissect_zbncp_high_level(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset, guint16 *cmd_id)
{
guint8 packet_type;
offset = dissect_zbncp_high_level_hdr(tvb, pinfo, tree, offset, &packet_type, cmd_id);
dissect_zbncp_high_level_body(tvb, pinfo, tree, offset, packet_type, *cmd_id);
}
static void
dissect_zbncp_dst_addrs(proto_tree *zbncp_hl_body_tree, tvbuff_t *tvb, guint dst_addr_mode_offset, guint *offset)
{
guint8 dst_addr_mode = tvb_get_guint8(tvb, dst_addr_mode_offset);
if (dst_addr_mode == ZB_APSDE_DST_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT || dst_addr_mode == ZB_APSDE_DST_ADDR_MODE_64_ENDP_PRESENT || dst_addr_mode == ZB_APSDE_DST_ADDR_MODE_BIND_TBL_ID)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_ieee_addr, tvb, *offset, 8, ENC_NA);
*offset += 8;
}
else if (dst_addr_mode == ZB_APSDE_DST_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT || dst_addr_mode == ZB_APSDE_DST_ADDR_MODE_16_ENDP_PRESENT)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_nwk_addr, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 8;
}
}
static void
dissect_zbncp_high_level_body(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset, guint8 ptype _U_, guint16 cmd_id)
{
proto_tree *zbncp_hl_body_tree;
if (offset >= tvb_reported_length(tvb))
{
return;
}
zbncp_hl_body_tree = proto_tree_add_subtree_format(tree, tvb, offset, tvb_reported_length(tvb) - offset, ett_zbncp_hl_body, NULL, "Data");
switch (cmd_id)
{
/* NCP Configuration API */
case ZBNCP_CMD_GET_MODULE_VERSION:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_fw_vers, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_stack_vers, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_proto_vers, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_NCP_RESET:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_reset_opt, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_ZIGBEE_ROLE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_zb_role, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SET_ZIGBEE_ROLE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_zb_role, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_ZIGBEE_CHANNEL_MASK:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint i;
guint8 ch_list_len = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ch_list_len, tvb, offset, 1, ENC_NA);
offset += 1;
if (ch_list_len)
{
proto_tree *zbncp_hl_body_data_ch_list = proto_tree_add_subtree_format(
zbncp_hl_body_tree, tvb, offset, ch_list_len * 5, ett_zbncp_data_ch_list, NULL, "Channel List");
for (i = 0; i < ch_list_len; i++)
{
proto_tree *zbncp_hl_body_data_channel_tree = proto_tree_add_subtree_format(
zbncp_hl_body_data_ch_list, tvb, offset, 5, ett_zbncp_data_channel, NULL, "Channel");
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_ch_mask, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
}
}
break;
case ZBNCP_CMD_SET_ZIGBEE_CHANNEL_MASK:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ch_mask, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_GET_ZIGBEE_CHANNEL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_channel, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_PAN_ID:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_pan_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_SET_PAN_ID:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_pan_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_GET_LOCAL_IEEE_ADDR:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_int_num, tvb, offset, 1, ENC_NA);
offset += 1;
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SET_LOCAL_IEEE_ADDR:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_int_num, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SET_TRACE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
static int *const trace_bitmask[] = {
&hf_zbncp_data_trace_wireless_traf,
&hf_zbncp_data_trace_reserved,
&hf_zbncp_data_trace_ncp_ll_proto,
&hf_zbncp_data_trace_host_int_line,
&hf_zbncp_data_trace_sleep_awake,
NULL};
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_trace_mask, ett_zbncp_data_trace_bitmask, trace_bitmask, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_GET_KEEPALIVE_TIMEOUT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_keepalive, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_SET_KEEPALIVE_TIMEOUT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_keepalive, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_GET_TX_POWER:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_res_tx_power, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SET_TX_POWER:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_req_tx_power, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_res_tx_power, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_RX_ON_WHEN_IDLE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rx_on_idle, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SET_RX_ON_WHEN_IDLE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rx_on_idle, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_JOINED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
static int *const join_bitmask[] = {
&hf_zbncp_data_joined_bit,
&hf_zbncp_data_parent_bit,
NULL};
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_joined, ett_zbncp_data_joind_bitmask, join_bitmask, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_AUTHENTICATED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_authenticated, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_ED_TIMEOUT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_timeout, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SET_ED_TIMEOUT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_timeout, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ADD_VISIBLE_DEV:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_ADD_INVISIBLE_SHORT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_RM_INVISIBLE_SHORT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_SET_NWK_KEY:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_key, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_key_num, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_SERIAL_NUMBER:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_serial_num, tvb, offset, 16, ENC_NA);
offset += 16;
}
break;
case ZBNCP_CMD_GET_VENDOR_DATA:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint8 size = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_size, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_vendor_data, tvb, offset, size, ENC_NA);
offset += size;
}
break;
case ZBNCP_CMD_GET_NWK_KEYS:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_key, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_key_num, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_key, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_key_num, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_key, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_key_num, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_APS_KEY_BY_IEEE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_key, tvb, offset, 16, ENC_NA);
offset += 16;
}
break;
case ZBNCP_CMD_BIG_PKT_TO_NCP:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint16 pkt_len;
pkt_len = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_pkt_len, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_pkt, tvb, offset, pkt_len, ENC_NA);
offset += pkt_len;
}
break;
case ZBNCP_CMD_GET_PARENT_ADDR:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_parent_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_GET_EXT_PAN_ID:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ext_pan_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_GET_COORDINATOR_VERSION:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_coordinator_version, tvb, offset++, 1, ENC_NA);
}
break;
case ZBNCP_CMD_GET_SHORT_ADDRESS:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_GET_TRUST_CENTER_ADDRESS:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_trust_center_addres, tvb, offset, 8, ENC_NA);
offset += 8;
}
break;
case ZBNCP_CMD_DEBUG_WRITE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
gint dump_len;
guint8 dump_type = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dump_type, tvb, offset, 1, ENC_NA);
offset += 1;
dump_len = tvb_reported_length(tvb) - offset;
if (dump_type == 0)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dump_text, tvb, offset, dump_len, ENC_ASCII | ENC_NA);
offset += dump_len;
}
else if (dump_type == 1)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dump_bin, tvb, offset, dump_len, ENC_NA);
offset += dump_len;
}
}
break;
case ZBNCP_CMD_GET_CONFIG_PARAMETER:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_parameter_id, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint8 param_id;
param_id = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_parameter_id, tvb, offset, 1, ENC_NA);
offset += 1;
switch (param_id)
{
case ZBNCP_PARAMETER_ID_IEEE_ADDR_TABLE_SIZE:
case ZBNCP_PARAMETER_ID_NEIGHBOR_TABLE_SIZE:
case ZBNCP_PARAMETER_ID_APS_SRC_BINDING_TABLE_SIZE:
case ZBNCP_PARAMETER_ID_APS_GROUP_TABLE_SIZE:
case ZBNCP_PARAMETER_ID_NWK_ROUTE_DISCOVERY_TABLE_SIZE:
case ZBNCP_PARAMETER_ID_IOBUF_POOL_SIZE:
case ZBNCP_PARAMETER_ID_PANID_TABLE_SIZE:
case ZBNCP_PARAMETER_ID_APS_DUPS_TABLE_SIZE:
case ZBNCP_PARAMETER_ID_APS_BIND_TRANS_TABLE_SIZE:
case ZBNCP_PARAMETER_ID_N_APS_RETRANS_ENTRIES:
case ZBNCP_PARAMETER_ID_NWK_MAX_HOPS:
case ZBNCP_PARAMETER_ID_NIB_MAX_CHILDREN:
case ZBNCP_PARAMETER_ID_N_APS_KEY_PAIR_ARR_MAX_SIZE:
case ZBNCP_PARAMETER_ID_NWK_MAX_SRC_ROUTES:
case ZBNCP_PARAMETER_ID_APS_MAX_WINDOW_SIZE:
case ZBNCP_PARAMETER_ID_APS_INTERFRAME_DELAY:
case ZBNCP_PARAMETER_ID_ZDO_ED_BIND_TIMEOUT:
case ZBNCP_PARAMETER_ID_ZLL_DEFAULT_RSSI_THRESHOLD:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_value8_dec, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case ZBNCP_PARAMETER_ID_NIB_PASSIVE_ASK_TIMEOUT:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_value16_dec, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case ZBNCP_PARAMETER_ID_APS_ACK_TIMEOUTS:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_ack_to_non_sleepy, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_ack_to_sleepy, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case ZBNCP_PARAMETER_ID_MAC_BEACON_JITTER:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_min16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_max16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
case ZBNCP_PARAMETER_ID_TX_POWER:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_default8_sign, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_current8_sign, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case ZBNCP_PARAMETER_ID_NIB_MTORR:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_is_concentrator, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_concentrator_radius, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_time16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
break;
}
}
break;
case ZBNCP_CMD_GET_LOCK_STATUS:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_lock_status, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_TRACE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
static int *const trace_bitmask[] = {
&hf_zbncp_data_trace_wireless_traf,
&hf_zbncp_data_trace_ncp_ll_proto,
&hf_zbncp_data_trace_host_int_line,
&hf_zbncp_data_trace_sleep_awake,
NULL};
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_trace_mask, ett_zbncp_data_trace_bitmask, trace_bitmask, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_NCP_RESET_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_reset_source, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SET_NWK_LEAVE_ALLOWED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_nwk_leave_allowed, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_NWK_LEAVE_ALLOWED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_nwk_leave_allowed, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_NVRAM_WRITE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint dataset_count, idx;
guint16 dataset_len;
dataset_count = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nvram_dataset_quantity, tvb, offset, 1, ENC_NA);
offset += 1;
/* multiple datasets */
for (idx = 0; idx < dataset_count; idx++)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nvram_dataset_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dataset_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
dataset_len = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dataset_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nvram_dataset_data, tvb, offset, dataset_len, ENC_NA);
offset += dataset_len;
}
}
break;
case ZBNCP_CMD_NVRAM_READ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nvram_dataset_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint16 dataset_len;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nvram_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nvram_dataset_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dataset_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
dataset_len = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dataset_length, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nvram_dataset_data, tvb, offset, dataset_len, ENC_NA);
offset += dataset_len;
}
break;
case ZBNCP_CMD_SET_TC_POLICY:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_tc_policy_type, tvb, offset, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_tc_policy_value, tvb, offset + 2, 1, ENC_NA);
offset += 3;
}
break;
case ZBNCP_CMD_SET_EXTENDED_PAN_ID:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ext_pan_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SET_MAX_CHILDREN:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_max_children, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_MAX_CHILDREN:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_max_children, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SET_ZDO_LEAVE_ALLOWED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_leave_allowed, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_ZDO_LEAVE_ALLOWED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_leave_allowed, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SET_LEAVE_WO_REJOIN_ALLOWED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_leave_wo_rejoin_allowed, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GET_LEAVE_WO_REJOIN_ALLOWED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_leave_wo_rejoin_allowed, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GP_SET_SHARED_KEY_TYPE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_zgp_key_type, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_GP_SET_DEFAULT_LINK_KEY:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_zgp_link_key, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_PRODUCTION_CONFIG_READ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree *prod_conf_hdr_subtree;
prod_conf_hdr_subtree = proto_tree_add_subtree(zbncp_hl_body_tree, tvb, offset, 8, ett_zbncp_data_prod_conf_hdr, NULL, "Production config header");
proto_tree_add_item(prod_conf_hdr_subtree, hf_zbncp_data_prod_conf_hdr_crc, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(prod_conf_hdr_subtree, hf_zbncp_data_prod_conf_hdr_len, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(prod_conf_hdr_subtree, hf_zbncp_data_prod_conf_hdr_version, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_prod_conf_body, tvb, offset, tvb_captured_length(tvb) - offset, ENC_NA);
offset = tvb_captured_length(tvb);
}
break;
/* AF API */
case ZBNCP_CMD_AF_SET_SIMPLE_DESC:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint i;
guint8 in_cl_cnt;
guint8 out_cl_cnt;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_profile_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_device_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dev_version, tvb, offset, 1, ENC_NA);
offset += 1;
in_cl_cnt = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_in_cl_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
out_cl_cnt = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_out_cl_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
if (in_cl_cnt)
{
proto_tree *zbncp_hl_body_in_cl_list_tree =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, 2 * in_cl_cnt, ett_zbncp_data_in_cl_list, NULL, "Input Cluster List");
for (i = 0; i < in_cl_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_in_cl_list_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
if (out_cl_cnt)
{
proto_tree *zbncp_hl_body_out_cl_list_tree =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, 2 * out_cl_cnt, ett_zbncp_data_out_cl_list, NULL, "Output Cluster List");
for (i = 0; i < out_cl_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_out_cl_list_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
}
break;
case ZBNCP_CMD_AF_DEL_EP:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_AF_SET_NODE_DESC:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
/* copy-pasted from packet-ieee802154.c */
static int *const capability[] = {
&hf_ieee802154_cinfo_alt_coord,
&hf_ieee802154_cinfo_device_type,
&hf_ieee802154_cinfo_power_src,
&hf_ieee802154_cinfo_idle_rx,
&hf_ieee802154_cinfo_sec_capable,
&hf_ieee802154_cinfo_alloc_addr,
NULL};
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_zb_role, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_mac_cap, ett_zbncp_data_mac_cap, capability, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_manuf_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_AF_SET_POWER_DESC:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
static int *const pwr_sources[] = {
&hf_zbncp_data_pwr_src_const,
&hf_zbncp_data_pwr_src_recharge,
&hf_zbncp_data_pwr_src_disposable,
NULL};
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cur_pwr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_av_pwr_src, ett_zbncp_data_pwr_src, pwr_sources, ENC_NA);
offset += 1;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_cur_pwr_src, ett_zbncp_data_cur_pwr_src, pwr_sources, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cur_pwr_lvl, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_AF_SUBGHZ_SUSPEND_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_susp_period, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_AF_SUBGHZ_RESUME_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_susp_period, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
/* ZDO API */
case ZBNCP_CMD_ZDO_NWK_ADDR_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_req_type, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_start_idx, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_remote_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_remote_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (offset < tvb_reported_length(tvb))
{
guint8 num_assoc_dev = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_num_asoc_dec, tvb, offset, 1, ENC_NA);
offset += 1;
if (num_assoc_dev)
{
guint i;
proto_tree *zbncp_hl_body_asoc_nwk_list;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_start_idx, tvb, offset, 1, ENC_NA);
offset += 1;
zbncp_hl_body_asoc_nwk_list =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, 2 * num_assoc_dev, ett_zbncp_data_asoc_nwk_list, NULL, "Assoc Dev NWK Addr List");
for (i = 0; i < num_assoc_dev; i++)
{
proto_tree_add_item(zbncp_hl_body_asoc_nwk_list, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
}
}
break;
case ZBNCP_CMD_ZDO_IEEE_ADDR_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_req_type, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_start_idx, tvb, offset, 1, ENC_NA);
offset += 1;
}
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_remote_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_remote_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (offset < tvb_reported_length(tvb))
{
guint8 num_assoc_dev = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_num_asoc_dec, tvb, offset, 1, ENC_NA);
offset += 1;
if (num_assoc_dev)
{
guint i;
proto_tree *zbncp_hl_body_asoc_nwk_list;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_start_idx, tvb, offset, 1, ENC_NA);
offset += 1;
zbncp_hl_body_asoc_nwk_list =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, 2 * num_assoc_dev, ett_zbncp_data_asoc_nwk_list, NULL, "Assoc Dev NWK Addr List");
for (i = 0; i < num_assoc_dev; i++)
{
proto_tree_add_item(zbncp_hl_body_asoc_nwk_list, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
}
}
break;
case ZBNCP_CMD_ZDO_POWER_DESC_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
static int *const pwr_desc[] = {
&hf_zbncp_data_pwr_desc_cur_power_mode,
&hf_zbncp_data_pwr_desc_av_pwr_src,
&hf_zbncp_data_pwr_desc_cur_pwr_src,
&hf_zbncp_data_pwr_desc_cur_pwr_lvl,
NULL};
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_pwr_desc, ett_zbncp_data_pwr_desc, pwr_desc, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_ZDO_NODE_DESC_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
static int *const flags[] = {
&hf_zbncp_data_flags_zb_role,
&hf_zbncp_data_flags_comp_desc_av,
&hf_zbncp_data_flags_user_desc_av,
&hf_zbncp_data_flags_freq_868,
&hf_zbncp_data_flags_freq_902,
&hf_zbncp_data_flags_freq_2400,
&hf_zbncp_data_flags_freq_eu_sub_ghz,
NULL};
static int *const mac_capability[] = {
&hf_ieee802154_cinfo_alt_coord,
&hf_ieee802154_cinfo_device_type,
&hf_ieee802154_cinfo_power_src,
&hf_ieee802154_cinfo_idle_rx,
&hf_ieee802154_cinfo_sec_capable,
&hf_ieee802154_cinfo_alloc_addr,
NULL};
static int *const server_mask[] = {
&hf_zbncp_data_srv_msk_prim_tc,
&hf_zbncp_data_srv_msk_backup_tc,
&hf_zbncp_data_srv_msk_prim_bind_tbl_cache,
&hf_zbncp_data_srv_msk_backup_bind_tbl_cache,
&hf_zbncp_data_srv_msk_prim_disc_cache,
&hf_zbncp_data_srv_msk_backup_disc_cache,
&hf_zbncp_data_srv_msk_nwk_manager,
&hf_zbncp_data_srv_msk_stack_compl_rev,
NULL};
static int *const desc_capability[] = {
&hf_zbncp_data_desc_cap_ext_act_ep_list_av,
&hf_zbncp_data_desc_cap_ext_simple_desc_list_av,
NULL};
proto_tree_add_bitmask_with_flags(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_flags16, ett_zbncp_data_flags, flags, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
offset += 2;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_mac_cap, ett_zbncp_data_mac_cap, mac_capability, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_manuf_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_max_buf_size, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_max_inc_trans_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_bitmask_with_flags(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_srv_msk, ett_zbncp_data_server_mask, server_mask, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_max_out_trans_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_desc_cap, ett_zbncp_data_desc_cap, desc_capability, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_ZDO_SIMPLE_DESC_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint i;
guint8 in_cl_cnt;
guint8 out_cl_cnt;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_profile_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_device_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dev_version, tvb, offset, 1, ENC_NA);
offset += 1;
in_cl_cnt = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_in_cl_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
out_cl_cnt = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_out_cl_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
if (in_cl_cnt)
{
proto_tree *zbncp_hl_body_in_cl_list_tree =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, 2 * in_cl_cnt, ett_zbncp_data_in_cl_list, NULL, "Input Cluster List");
for (i = 0; i < in_cl_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_in_cl_list_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
if (out_cl_cnt)
{
proto_tree *zbncp_hl_body_out_cl_list_tree =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, 2 * out_cl_cnt, ett_zbncp_data_out_cl_list, NULL, "Output Cluster List");
for (i = 0; i < out_cl_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_out_cl_list_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_ZDO_ACTIVE_EP_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint i;
guint8 ep_cnt = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ep_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
if (ep_cnt)
{
proto_tree *zbncp_hl_body_tree_ep_list =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, ep_cnt, ett_zbncp_data_ep_list, NULL, "Endpoint List");
for (i = 0; i < ep_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_tree_ep_list, hf_zbncp_data_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_ZDO_MATCH_DESC_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint i;
guint8 in_cl_cnt;
guint8 out_cl_cnt;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_profile_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
in_cl_cnt = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_in_cl_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
out_cl_cnt = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_out_cl_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
if (in_cl_cnt)
{
proto_tree *zbncp_hl_body_in_cl_list_tree =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, 2 * in_cl_cnt, ett_zbncp_data_in_cl_list, NULL, "Input Cluster List");
for (i = 0; i < in_cl_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_in_cl_list_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
if (out_cl_cnt)
{
proto_tree *zbncp_hl_body_out_cl_list_tree =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, 2 * out_cl_cnt, ett_zbncp_data_out_cl_list, NULL, "Output Cluster List");
for (i = 0; i < out_cl_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_out_cl_list_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint i;
guint8 ep_cnt = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ep_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
if (ep_cnt)
{
proto_tree *zbncp_hl_body_tree_ep_list =
proto_tree_add_subtree_format(zbncp_hl_body_tree, tvb, offset, ep_cnt, ett_zbncp_data_ep_list, NULL, "Endpoint List");
for (i = 0; i < ep_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_tree_ep_list, hf_zbncp_data_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_ZDO_BIND_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_addr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
dissect_zbncp_dst_addrs(zbncp_hl_body_tree, tvb, offset - 1, &offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ZDO_UNBIND_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_ieee_addr, tvb, offset, 8, ENC_NA);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_addr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
dissect_zbncp_dst_addrs(zbncp_hl_body_tree, tvb, offset - 1, &offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ZDO_MGMT_LEAVE_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
static int *const leave_flags[] = {
&hf_zbncp_data_leave_flags_remove_chil,
&hf_zbncp_data_leave_flags_rejoin,
NULL};
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_leave_flags, ett_zbncp_data_leave_flags, leave_flags, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ZDO_PERMIT_JOINING_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_permit_dur, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_tc_sign, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ZDO_DEV_ANNCE_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
static int *const mac_capability[] = {
&hf_ieee802154_cinfo_alt_coord,
&hf_ieee802154_cinfo_device_type,
&hf_ieee802154_cinfo_power_src,
&hf_ieee802154_cinfo_idle_rx,
&hf_ieee802154_cinfo_sec_capable,
&hf_ieee802154_cinfo_alloc_addr,
NULL};
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_mac_cap, ett_zbncp_data_mac_cap, mac_capability, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ZDO_REJOIN:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint i;
guint8 ch_list_len;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ext_pan_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
ch_list_len = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ch_list_len, tvb, offset, 1, ENC_NA);
offset += 1;
if (ch_list_len)
{
proto_tree *zbncp_hl_body_data_ch_list = proto_tree_add_subtree_format(
zbncp_hl_body_tree, tvb, offset, ch_list_len * 5, ett_zbncp_data_ch_list, NULL, "Channel List");
for (i = 0; i < ch_list_len; i++)
{
proto_tree *zbncp_hl_body_data_channel_tree = proto_tree_add_subtree_format(
zbncp_hl_body_data_ch_list, tvb, offset, 5, ett_zbncp_data_channel, NULL, "Channel");
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_ch_mask, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_secur_rejoin, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
static int *const zdo_rejoin_flags[] = {
&hf_zbncp_data_zdo_rejoin_flags_tcsw_happened,
NULL};
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_zdo_rejoin_flags, ett_zbncp_data_zdo_rejoin_flags, zdo_rejoin_flags, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ZDO_SYSTEM_SRV_DISCOVERY_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_server_mask, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_ZDO_MGMT_BIND_REQ:
case ZBNCP_CMD_ZDO_MGMT_LQI_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_start_entry_idx, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ZDO_MGMT_NWK_UPDATE_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ch_mask, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_scan_duration, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_scan_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_scan_mgr_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_ZDO_REMOTE_CMD_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
guint16 data_len;
static int *const aps_fc[] = {
&hf_zbncp_data_aps_fc_deliv_mode,
&hf_zbncp_data_aps_fc_secur,
&hf_zbncp_data_aps_fc_ack_retrans,
NULL};
static int *const aps_key_attr[] = {
&hf_zbncp_data_aps_key_attr_key_src,
&hf_zbncp_data_aps_key_attr_key_used,
NULL};
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_param_len, tvb, offset, 1, ENC_NA);
offset += 1;
data_len = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dlen16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_aps_fc, ett_zbncp_data_apc_fc, aps_fc, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_group_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_profile_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_mac_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_mac_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_lqi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rssi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_aps_key_attr, ett_zbncp_data_aps_key_attr, aps_key_attr, ENC_NA);
offset += 1;
if (data_len > (tvb_reported_length(tvb) - offset))
{
data_len = tvb_reported_length(tvb) - offset;
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_array, tvb, offset, data_len, ENC_NA);
offset += data_len;
}
break;
case ZBNCP_CMD_ZDO_GET_STATS:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_do_cleanup, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_max_rx_bcast, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_tx_bcast, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_rx_ucast, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_tx_ucast_total_zcl, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_tx_ucast_failures_zcl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_tx_ucast_retries_zcl, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_tx_ucast_total, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_tx_ucast_failures, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_tx_ucast_retries, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_phy_to_mac_que_lim_reached, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_validate_drop_cnt, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_phy_cca_fail_count, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_period_of_time, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_last_msg_lqi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_last_msg_rssi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_number_of_resets, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_tx_bcast, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_tx_ucast_success, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_tx_ucast_retry, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_tx_ucast_fail, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_route_disc_initiated, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_neighbor_added, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_neighbor_removed, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_neighbor_stale, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_join_indication, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_childs_removed, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_fc_failure, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_fc_failure, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_unauthorized_key, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_decrypt_failure, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_decrypt_failure, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_packet_buffer_allocate_failures, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_average_mac_retry_per_aps_message_sent, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_retry_overflow, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_bcast_table_full, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_status, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ZDO_DEV_AUTHORIZED_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
guint8 auth_type;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
auth_type = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_auth_type, tvb, offset, 1, ENC_NA);
offset += 1;
if (auth_type == ZB_ZDO_AUTH_LEGACY_TYPE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_leg_auth_status_code, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (auth_type == ZB_ZDO_AUTH_TCLK_TYPE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_zdo_tclk_auth_status_code, tvb, offset, 1, ENC_NA);
offset += 1;
}
}
break;
case ZBNCP_CMD_ZDO_DEV_UPDATE_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_upd_status_code, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_ZDO_SET_NODE_DESC_MANUF_CODE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_manuf_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_HL_ZDO_GET_DIAG_DATA_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_lqi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rssi, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
/* APS API */
case ZBNCP_CMD_APSDE_DATA_REQ:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint16 data_len;
static int *const tx_options[] = {
&hf_zbncp_data_tx_opt_secur,
&hf_zbncp_data_tx_opt_obsolete,
&hf_zbncp_data_tx_opt_ack,
&hf_zbncp_data_tx_opt_frag,
&hf_zbncp_data_tx_opt_inc_ext_nonce,
&hf_zbncp_data_tx_opt_force_mesh_route,
&hf_zbncp_data_tx_opt_send_route_record,
NULL};
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_param_len, tvb, offset, 1, ENC_NA);
offset += 1;
data_len = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dlen16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
dissect_zbncp_dst_addrs(zbncp_hl_body_tree, tvb, offset + ZBNCP_CMD_APSDE_DATA_REQ_DST_ADDR_MODE_OFFSET, &offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_profile_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_radius, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_addr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_tx_opt, ett_zbncp_data_tx_opt, tx_options, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_use_alias, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_alias_src, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_alias_seq, tvb, offset, 1, ENC_NA);
offset += 1;
if (data_len > (tvb_reported_length(tvb) - offset))
{
data_len = tvb_reported_length(tvb) - offset;
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_array, tvb, offset, data_len, ENC_NA);
offset += data_len;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
dissect_zbncp_dst_addrs(zbncp_hl_body_tree, tvb, offset + ZBNCP_CMD_APSDE_DATA_REQ_RSP_DST_ADDR_MODE_OFFSET, &offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_tx_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_addr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_APSME_BIND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_addr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
dissect_zbncp_dst_addrs(zbncp_hl_body_tree, tvb, offset - 1, &offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST || ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint16 data_len;
/* Binding table ID - it's an additional field for SNCP only */
data_len = tvb_reported_length(tvb) - offset;
if (data_len == 1)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 1, ENC_NA);
offset += 1;
}
}
break;
case ZBNCP_CMD_APSME_UNBIND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_addr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
dissect_zbncp_dst_addrs(zbncp_hl_body_tree, tvb, offset - 1, &offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST || ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint16 data_len;
/* Binding table ID - it's an additional field for SNCP only */
data_len = tvb_reported_length(tvb) - offset;
if (data_len == 1)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 1, ENC_NA);
offset += 1;
}
}
break;
case ZBNCP_CMD_APSME_ADD_GROUP:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_group_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_APSME_RM_GROUP:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_group_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_APSDE_DATA_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
guint16 data_len;
static int *const aps_fc[] = {
&hf_zbncp_data_aps_fc_deliv_mode,
&hf_zbncp_data_aps_fc_secur,
&hf_zbncp_data_aps_fc_ack_retrans,
NULL};
static int *const aps_key_attr[] = {
&hf_zbncp_data_aps_key_attr_key_src,
&hf_zbncp_data_aps_key_attr_key_used,
NULL};
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_param_len, tvb, offset, 1, ENC_NA);
offset += 1;
data_len = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dlen16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_aps_fc, ett_zbncp_data_apc_fc, aps_fc, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_group_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_profile_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_mac_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_mac_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_lqi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rssi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_aps_key_attr, ett_zbncp_data_aps_key_attr, aps_key_attr, ENC_NA);
offset += 1;
if (data_len > (tvb_reported_length(tvb) - offset))
{
data_len = tvb_reported_length(tvb) - offset;
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_array, tvb, offset, data_len, ENC_NA);
offset += data_len;
}
break;
case ZBNCP_CMD_APSME_RM_ALL_GROUPS:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_APS_GET_GROUP_TABLE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint8 group_num;
group_num = tvb_get_gint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_group_num, tvb, offset++, 1, ENC_NA);
if (group_num)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_group, tvb, offset, group_num * 2, ENC_LITTLE_ENDIAN);
offset += group_num * 2;
}
}
break;
case ZBNCP_CMD_APSME_RM_BIND_ENTRY_BY_ID:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_APSME_CLEAR_BIND_TABLE:
/* Empty: only common headers */
break;
case ZBNCP_CMD_APSME_GET_BIND_ENTRY_BY_ID:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_addr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
dissect_zbncp_dst_addrs(zbncp_hl_body_tree, tvb, offset - 1, &offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_bind_type, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_APSME_REMOTE_BIND_IND:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_addr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
dissect_zbncp_dst_addrs(zbncp_hl_body_tree, tvb, offset - 1, &offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_bind_type, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case ZBNCP_CMD_APSME_REMOTE_UNBIND_IND:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_src_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_addr_mode, tvb, offset, 1, ENC_NA);
offset += 1;
dissect_zbncp_dst_addrs(zbncp_hl_body_tree, tvb, offset - 1, &offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dst_endpoint, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_bind_type, tvb, offset, 1, ENC_NA);
offset += 1;
break;
case ZBNCP_CMD_APSME_SET_REMOTE_BIND_OFFSET:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_remote_bind_offset, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_APSME_GET_REMOTE_BIND_OFFSET:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_remote_bind_offset, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
/* NWK Management API*/
case ZBNCP_CMD_NWK_FORMATION:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint i;
guint8 ch_list_len = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ch_list_len, tvb, offset, 1, ENC_NA);
offset += 1;
if (ch_list_len)
{
proto_tree *zbncp_hl_body_data_ch_list = proto_tree_add_subtree_format(
zbncp_hl_body_tree, tvb, offset, ch_list_len * 5, ett_zbncp_data_ch_list, NULL, "Channel List");
for (i = 0; i < ch_list_len; i++)
{
proto_tree *zbncp_hl_body_data_channel_tree = proto_tree_add_subtree_format(
zbncp_hl_body_data_ch_list, tvb, offset, 5, ett_zbncp_data_channel, NULL, "Channel");
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_ch_mask, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_scan_dur, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_distr_nwk_flag, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ext_pan_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_NWK_DISCOVERY:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint i;
guint8 ch_list_len = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ch_list_len, tvb, offset, 1, ENC_NA);
offset += 1;
if (ch_list_len)
{
proto_tree *zbncp_hl_body_data_ch_list = proto_tree_add_subtree_format(
zbncp_hl_body_tree, tvb, offset, ch_list_len * 5, ett_zbncp_data_ch_list, NULL, "Channel List");
for (i = 0; i < ch_list_len; i++)
{
proto_tree *zbncp_hl_body_data_channel_tree = proto_tree_add_subtree_format(
zbncp_hl_body_data_ch_list, tvb, offset, 5, ett_zbncp_data_channel, NULL, "Channel");
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_ch_mask, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_scan_dur, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint i;
guint8 nwk_count = tvb_get_guint8(tvb, offset);
static int *flags[] = {
&hf_zbncp_data_flags_permit_join,
&hf_zbncp_data_flags_router_cap,
&hf_zbncp_data_flags_ed_cap,
&hf_zbncp_data_flags_stack_profile,
NULL};
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_count, tvb, offset, 1, ENC_NA);
offset += 1;
for (i = 0; i < nwk_count; i++)
{
proto_tree *zbncp_hl_body_data_nwk_descr = proto_tree_add_subtree_format(
zbncp_hl_body_tree, tvb, offset, 14, ett_zbncp_data_nwk_descr, NULL, "Network Descriptor");
proto_tree_add_item(zbncp_hl_body_data_nwk_descr, hf_zbncp_data_ext_pan_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_data_nwk_descr, hf_zbncp_data_pan_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_data_nwk_descr, hf_zbncp_data_nwk_upd_id, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_data_nwk_descr, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_data_nwk_descr, hf_zbncp_data_channel, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_bitmask(zbncp_hl_body_data_nwk_descr, tvb, offset, hf_zbncp_data_flags8, ett_zbncp_data_flags, flags, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_data_nwk_descr, hf_zbncp_data_lqi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_data_nwk_descr, hf_zbncp_data_rssi, tvb, offset, 1, ENC_NA);
offset += 1;
}
}
break;
case ZBNCP_CMD_NWK_NLME_JOIN:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint i;
guint8 ch_list_len;
static int *const mac_capability[] = {
&hf_ieee802154_cinfo_alt_coord,
&hf_ieee802154_cinfo_device_type,
&hf_ieee802154_cinfo_power_src,
&hf_ieee802154_cinfo_idle_rx,
&hf_ieee802154_cinfo_sec_capable,
&hf_ieee802154_cinfo_alloc_addr,
NULL};
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ext_pan_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rejoin_nwk, tvb, offset, 1, ENC_NA);
offset += 1;
ch_list_len = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ch_list_len, tvb, offset, 1, ENC_NA);
offset += 1;
if (ch_list_len)
{
proto_tree *zbncp_hl_body_data_ch_list = proto_tree_add_subtree_format(
zbncp_hl_body_tree, tvb, offset, ch_list_len * 5, ett_zbncp_data_ch_list, NULL, "Channel List");
for (i = 0; i < ch_list_len; i++)
{
proto_tree *zbncp_hl_body_data_channel_tree = proto_tree_add_subtree_format(
zbncp_hl_body_data_ch_list, tvb, offset, 5, ett_zbncp_data_channel, NULL, "Channel");
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_data_channel_tree, hf_zbncp_data_ch_mask, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_scan_dur, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_bitmask(zbncp_hl_body_tree, tvb, offset, hf_zbncp_data_mac_cap, ett_zbncp_data_mac_cap, mac_capability, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_secur_en, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ext_pan_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_channel, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_enh_beacon, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_if, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_NWK_PERMIT_JOINING:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_permit_dur, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_NWK_GET_IEEE_BY_SHORT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_NWK_GET_SHORT_BY_IEEE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_NWK_GET_NEIGHBOR_BY_IEEE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_zb_role, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rx_on_idle, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ed_config, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_timeout_cnt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dev_timeout, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_relationship, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_tx_fail_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_lqi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_out_cost, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_age, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_keepalive_rec, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_if_idx, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_NWK_REJOINED_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ext_pan_id, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_channel, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_beacon_type, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_if, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_NWK_REJOIN_FAILED_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
guint status_category = tvb_get_guint8(tvb, offset);
guint status;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_cat, tvb, offset, 1, ENC_NA);
offset += 1;
/* Add status */
status = tvb_get_guint8(tvb, offset);
switch (status_category)
{
case ZBNCP_HIGH_LVL_STAT_CAT_GENERIC:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_generic, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zbncp_hl_status_generic, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_MAC:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_mac, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_mac_state, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_NWK:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_nwk, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_nwk_state, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_APS:
dissect_zbee_aps_status_code(tvb, pinfo, zbncp_hl_body_tree, offset);
break;
case ZBNCP_HIGH_LVL_STAT_CAT_CBKE:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_cbke, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_cbke_state, "Unknown Status"));
break;
default:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: 0x%x", status);
}
offset += 1;
}
break;
case ZBNCP_CMD_NWK_LEAVE_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rejoin, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_PIM_SET_FAST_POLL_INTERVAL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_fast_poll_int, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_PIM_SET_LONG_POLL_INTERVAL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_long_poll_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_PIM_START_FAST_POLL:
/* Empty: only common headers */
break;
case ZBNCP_CMD_PIM_START_POLL:
/* Empty: only common headers */
break;
case ZBNCP_CMD_PIM_SET_ADAPTIVE_POLL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_PIM_STOP_FAST_POLL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_stop_fast_poll_result, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_PIM_STOP_POLL:
/* Empty: only common headers */
break;
case ZBNCP_CMD_PIM_ENABLE_TURBO_POLL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_time, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_PIM_DISABLE_TURBO_POLL:
/* Empty: only common headers */
break;
case ZBNCP_CMD_NWK_GET_FIRST_NBT_ENTRY:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_zb_role, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rx_on_idle, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ed_config, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_timeout_cnt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dev_timeout, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_relationship, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_tx_fail_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_lqi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_out_cost, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_age, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_keepalive_rec, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_if_idx, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_NWK_GET_NEXT_NBT_ENTRY:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_zb_role, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rx_on_idle, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ed_config, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_timeout_cnt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dev_timeout, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_relationship, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_tx_fail_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_lqi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_out_cost, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_age, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_keepalive_rec, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_mac_if_idx, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_NWK_PAN_ID_CONFLICT_RESOLVE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint i;
guint16 pan_id_cnt = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_pan_id_cnt, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
for (i = 0; i < pan_id_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_pan_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
break;
case ZBNCP_CMD_NWK_PAN_ID_CONFLICT_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
guint i;
guint16 pan_id_cnt = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_pan_id_cnt, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
for (i = 0; i < pan_id_cnt; i++)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_pan_id, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
}
break;
case ZBNCP_CMD_NWK_ADDRESS_UPDATE_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_NWK_START_WITHOUT_FORMATION:
/* Empty: only common headers */
break;
case ZBNCP_CMD_NWK_NLME_ROUTER_START:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_beacon_order, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_superframe_order, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_battery_life_ext, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_PIM_SINGLE_POLL:
/* Empty: only common headers */
break;
case ZBNCP_CMD_PARENT_LOST_IND:
/* Empty: only common headers */
break;
case ZBNCP_CMD_PIM_START_TURBO_POLL_PACKETS:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_poll_pkt_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_PIM_START_TURBO_POLL_CONTINUOUS:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_poll_timeout, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_PIM_TURBO_POLL_CONTINUOUS_LEAVE:
/* Empty: only common headers */
break;
case ZBNCP_CMD_PIM_TURBO_POLL_PACKETS_LEAVE:
/* Empty: only common headers */
break;
case ZBNCP_CMD_PIM_PERMIT_TURBO_POLL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_poll_permit_flag, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_PIM_SET_FAST_POLL_TIMEOUT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_poll_timeout, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_PIM_GET_LONG_POLL_INTERVAL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_long_poll_int, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_PIM_GET_IN_FAST_POLL_FLAG:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_fast_poll_flag, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SET_KEEPALIVE_MODE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_keepalive_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
}
break;
case ZBNCP_CMD_START_CONCENTRATOR_MODE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_radius, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_time_between_disc, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_STOP_CONCENTRATOR_MODE:
/* Empty: only common headers */
break;
case ZBNCP_CMD_NWK_ENABLE_PAN_ID_CONFLICT_RESOLUTION:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_enable_flag, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_NWK_ENABLE_AUTO_PAN_ID_CONFLICT_RESOLUTION:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_enable_flag, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_PIM_TURBO_POLL_CANCEL_PACKET:
/* Empty: only common headers */
break;
case ZBNCP_CMD_SET_FORCE_ROUTE_RECORD:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_force_route_record_sending, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
}
break;
case ZBNCP_CMD_GET_FORCE_ROUTE_RECORD:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_force_route_record_sending, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
}
break;
case ZBNCP_CMD_NWK_NBR_ITERATOR_NEXT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_start_idx_16b, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_upd_idx, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
/* Security API */
case ZBNCP_CMD_SECUR_SET_LOCAL_IC:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ic, tvb, offset, tvb_reported_length(tvb) - offset, ENC_NA);
offset = tvb_reported_length(tvb);
}
break;
case ZBNCP_CMD_SECUR_ADD_IC:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ic, tvb, offset, tvb_reported_length(tvb) - offset, ENC_NA);
offset = tvb_reported_length(tvb);
}
break;
case ZBNCP_CMD_SECUR_DEL_IC:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SECUR_ADD_CERT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint8 crypto_suite = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cs, tvb, offset, 1, ENC_NA);
offset += 1;
if (crypto_suite == 1)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ca_pub_key, tvb, offset, 22, ENC_NA);
offset += 22;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cert, tvb, offset, 48, ENC_NA);
offset += 48;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ca_priv_key, tvb, offset, 21, ENC_NA);
offset += 21;
}
else if (crypto_suite == 2)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ca_pub_key, tvb, offset, 37, ENC_NA);
offset += 37;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cert, tvb, offset, 74, ENC_NA);
offset += 74;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ca_priv_key, tvb, offset, 36, ENC_NA);
offset += 36;
}
}
break;
case ZBNCP_CMD_SECUR_DEL_CERT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cs, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_issuer, tvb, offset, 8, ENC_NA);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SECUR_START_KE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cs, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint status_category = tvb_get_guint8(tvb, offset);
guint status;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_cat, tvb, offset, 1, ENC_NA);
offset += 1;
/* Add status */
status = tvb_get_guint8(tvb, offset);
switch (status_category)
{
case ZBNCP_HIGH_LVL_STAT_CAT_GENERIC:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_generic, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zbncp_hl_status_generic, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_MAC:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_mac, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_mac_state, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_NWK:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_nwk, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_nwk_state, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_APS:
dissect_zbee_aps_status_code(tvb, pinfo, zbncp_hl_body_tree, offset);
break;
case ZBNCP_HIGH_LVL_STAT_CAT_CBKE:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_cbke, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_cbke_state, "Unknown Status"));
break;
default:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: 0x%x", status);
}
offset += 1;
}
break;
case ZBNCP_CMD_SECUR_START_PARTNER_LK:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_SECUR_CBKE_SRV_FINISHED_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
guint status_category = tvb_get_guint8(tvb, offset);
guint status;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_cat, tvb, offset, 1, ENC_NA);
offset += 1;
/* Add status */
status = tvb_get_guint8(tvb, offset);
switch (status_category)
{
case ZBNCP_HIGH_LVL_STAT_CAT_GENERIC:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_generic, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zbncp_hl_status_generic, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_MAC:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_mac, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_mac_state, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_NWK:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_nwk, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_nwk_state, "Unknown Status"));
break;
case ZBNCP_HIGH_LVL_STAT_CAT_APS:
dissect_zbee_aps_status_code(tvb, pinfo, zbncp_hl_body_tree, offset);
break;
case ZBNCP_HIGH_LVL_STAT_CAT_CBKE:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status_cbke, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: %s", val_to_str_const(status, zb_cbke_state, "Unknown Status"));
break;
default:
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_hl_status, tvb, offset, 1, ENC_NA);
col_append_fstr(pinfo->cinfo, COL_INFO, ", Status: 0x%x", status);
}
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SECUR_PARTNER_LK_FINISHED_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SECUR_KE_WHITELIST_ADD:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SECUR_KE_WHITELIST_DEL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SECUR_KE_WHITELIST_DEL_ALL:
/* Empty: only common headers */
break;
case ZBNCP_CMD_SECUR_JOIN_USES_IC:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ic_en, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SECUR_GET_IC_BY_IEEE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ic, tvb, offset, tvb_reported_length(tvb) - offset, ENC_NA);
offset = tvb_reported_length(tvb);
}
break;
case ZBNCP_CMD_SECUR_GET_CERT:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cs, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint8 crypto_suite = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cs, tvb, offset, 1, ENC_NA);
offset += 1;
if (crypto_suite == 1)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ca_pub_key, tvb, offset, 22, ENC_NA);
offset += 22;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cert, tvb, offset, 48, ENC_NA);
offset += 48;
}
else if (crypto_suite == 2)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ca_pub_key, tvb, offset, 37, ENC_NA);
offset += 37;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_cert, tvb, offset, 74, ENC_NA);
offset += 74;
}
}
break;
case ZBNCP_CMD_SECUR_GET_LOCAL_IC:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ic, tvb, offset, tvb_reported_length(tvb) - offset, ENC_NA);
offset = tvb_reported_length(tvb);
}
break;
case ZBNCP_CMD_SECUR_TCLK_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_key_type, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_SECUR_TCLK_EXCHANGE_FAILED_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
offset = dissect_zbncp_status(tvb, pinfo, zbncp_hl_body_tree, offset);
}
break;
case ZBNCP_CMD_SECUR_GET_KEY_IDX:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_SECUR_GET_KEY:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_link_key, tvb, offset, 16, ENC_NA);
offset += 16;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_aps_link_key_type, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_key_src, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_key_attr, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_out_frame_cnt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_inc_frame_cnt, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_partner_ieee_addr, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset += 8;
}
break;
case ZBNCP_CMD_SECUR_ERASE_KEY:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_SECUR_CLEAR_KEY_TABLE:
/* Empty: only common headers */
break;
case ZBNCP_CMD_SECUR_NWK_INITIATE_KEY_SWITCH_PROCEDURE:
/* Empty: only common headers */
break;
case ZBNCP_CMD_SECUR_GET_IC_LIST:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_start_idx, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ic_table_size, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_start_idx, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ic_ent_cnt, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ic, tvb, offset, tvb_captured_length(tvb) - offset, ENC_NA);
offset += tvb_captured_length(tvb) - offset;
}
break;
case ZBNCP_CMD_SECUR_GET_IC_BY_IDX:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_entry_idx, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_ic, tvb, offset, tvb_captured_length(tvb) - offset, ENC_NA);
offset += tvb_captured_length(tvb) - offset;
}
break;
case ZBNCP_CMD_SECUR_REMOVE_ALL_IC:
/* Empty: only common headers */
break;
case ZBNCP_CMD_SECUR_PARTNER_LK_ENABLE:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_enable, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
/* Manufacturing Test API */
case ZBNCP_CMD_MANUF_MODE_START:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_channel4, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_MANUF_MODE_END:
/* Empty: only common headers */
break;
case ZBNCP_CMD_MANUF_SET_CHANNEL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_channel4, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_MANUF_GET_CHANNEL:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_page, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_channel4, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
}
break;
case ZBNCP_CMD_MANUF_SET_POWER:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_tx_power, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_MANUF_GET_POWER:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_tx_power, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
case ZBNCP_CMD_MANUF_START_TONE:
/* Empty: only common headers */
break;
case ZBNCP_CMD_MANUF_STOP_TONE:
/* Empty: only common headers */
break;
case ZBNCP_CMD_MANUF_START_STREAM_RANDOM:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_seed, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
break;
case ZBNCP_CMD_MANUF_STOP_STREAM_RANDOM:
/* Empty: only common headers */
break;
case ZBNCP_CMD_NCP_HL_MANUF_SEND_SINGLE_PACKET:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint8 data_len = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dlen8, tvb, offset, 1, ENC_NA);
offset += 1;
if (data_len > (tvb_reported_length(tvb) - offset))
{
data_len = tvb_reported_length(tvb) - offset;
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_array, tvb, offset, data_len, ENC_NA);
offset += data_len;
}
break;
case ZBNCP_CMD_MANUF_START_TEST_RX:
/* Empty: only common headers */
break;
case ZBNCP_CMD_MANUF_STOP_TEST_RX:
/* Empty: only common headers */
break;
case ZBNCP_CMD_MANUF_RX_PACKET_IND:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION)
{
guint16 data_len = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dlen16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_lqi, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_rssi, tvb, offset, 1, ENC_NA);
offset += 1;
if (data_len > (tvb_reported_length(tvb) - offset))
{
data_len = tvb_reported_length(tvb) - offset;
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_array, tvb, offset, data_len, ENC_NA);
offset += data_len;
}
break;
/* NCP FW upgrade API */
case ZBNCP_CMD_OTA_RUN_BOOTLOADER:
/* Empty: only common headers */
break;
case ZBNCP_CMD_OTA_START_UPGRADE_IND:
/* Empty: only common headers */
break;
case ZBNCP_CMD_OTA_SEND_PORTION_FW:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint16 data_len = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dlen16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (data_len > (tvb_reported_length(tvb) - offset))
{
data_len = tvb_reported_length(tvb) - offset;
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_array, tvb, offset, data_len, ENC_NA);
offset += data_len;
}
break;
case ZBNCP_CMD_READ_NVRAM_RESERVED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dlen8, tvb, offset, 1, ENC_NA);
offset += 1;
}
else if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
guint8 data_len;
data_len = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dlen8, tvb, offset, 1, ENC_NA);
offset += 1;
if (data_len > (tvb_reported_length(tvb) - offset))
{
data_len = tvb_reported_length(tvb) - offset;
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_array, tvb, offset, data_len, ENC_NA);
offset += data_len;
}
break;
case ZBNCP_CMD_WRITE_NVRAM_RESERVED:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST)
{
guint8 data_len;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_do_erase, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_offset, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
data_len = tvb_get_guint8(tvb, offset);
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_dlen8, tvb, offset, 1, ENC_NA);
offset += 1;
if (data_len > (tvb_reported_length(tvb) - offset))
{
data_len = tvb_reported_length(tvb) - offset;
}
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_array, tvb, offset, data_len, ENC_NA);
offset += data_len;
}
break;
case ZBNCP_CMD_GET_CALIBRATION_INFO:
if (ptype == ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE)
{
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_calibration_status, tvb, offset, 1, ENC_NA);
offset += 1;
proto_tree_add_item(zbncp_hl_body_tree, hf_zbncp_data_calibration_value, tvb, offset, 1, ENC_NA);
offset += 1;
}
break;
default:;
}
/* Dump the tail. */
if (offset < tvb_reported_length(tvb))
{
tvbuff_t *leftover_tvb = tvb_new_subset_remaining(tvb, offset);
call_data_dissector(leftover_tvb, pinfo, tree);
}
}
static void
dissect_zbncp_fragmentation_body(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset)
{
proto_tree *zbncp_body_tree = proto_tree_add_subtree_format(tree, tvb, offset, tvb_reported_length(tvb) - offset, ett_zbncp_ll_body, NULL, "ZBNCP Packet Body");
/* CRC */
proto_tree_add_item(zbncp_body_tree, hf_zbncp_body_data_crc16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
/* Dump the tail. */
if (offset < tvb_reported_length(tvb))
{
tvbuff_t *leftover_tvb = tvb_new_subset_remaining(tvb, offset);
call_data_dissector(leftover_tvb, pinfo, zbncp_body_tree);
}
}
static void
dissect_zbncp_body(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint offset, guint16 *cmd_id)
{
proto_tree *zbncp_body_tree = proto_tree_add_subtree_format(tree, tvb, offset, tvb_reported_length(tvb) - offset, ett_zbncp_ll_body, NULL, "ZBNCP Packet Body");
/* CRC */
proto_tree_add_item(zbncp_body_tree, hf_zbncp_body_data_crc16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
dissect_zbncp_high_level(tvb, pinfo, zbncp_body_tree, offset, cmd_id);
}
static guint
dissect_zbncp_ll_hdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset, guint8 *hdr_flags)
{
proto_tree *ncp_ll_hdr_tree;
proto_item *proto_root;
static int *const packet_flags[] = {
&hf_zbncp_hdr_flags_isack,
&hf_zbncp_hdr_flags_retrans,
&hf_zbncp_hdr_flags_packetseq,
&hf_zbncp_hdr_flags_ackseq,
&hf_zbncp_hdr_flags_first_frag,
&hf_zbncp_hdr_flags_last_frag,
NULL};
if (tvb_get_guint8(tvb, 0) != ZBNCP_SIGN_FST_BYTE ||
tvb_get_guint8(tvb, 1) != ZBNCP_SIGN_SEC_BYTE)
{
return 0;
}
col_set_str(pinfo->cinfo, COL_PROTOCOL, "ZB NCP");
proto_root = proto_tree_add_protocol_format(tree, zbncp_frame, tvb, 0, tvb_captured_length(tvb), "ZBNCP Low Level Header");
ncp_ll_hdr_tree = proto_item_add_subtree(proto_root, ett_zbncp_hdr);
/* hdr */
proto_tree_add_item(ncp_ll_hdr_tree, hf_zbncp_hdr_sign, tvb, offset, 2, ENC_ASCII);
offset += 2;
/* pkt lenght without sign */
proto_tree_add_item(ncp_ll_hdr_tree, hf_zbncp_packet_len, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
/* hl packet type */
proto_tree_add_item(ncp_ll_hdr_tree, hf_zbncp_hdr_type, tvb, offset, 1, ENC_NA);
offset += 1;
/* hdr flags */
*hdr_flags = tvb_get_guint8(tvb, offset);
proto_tree_add_bitmask(ncp_ll_hdr_tree, tvb, offset, hf_zbncp_hdr_flags, ett_zbncp_hdr_flags, packet_flags, ENC_NA);
offset += 1;
/* check is ack */
if (*hdr_flags & ZBNCP_HDR_FLAGS_ISACK_MASK)
{
col_set_str(pinfo->cinfo, COL_INFO, "ACK");
}
/* crc 8 */
proto_tree_add_item(ncp_ll_hdr_tree, hf_zbncp_hdr_crc8, tvb, offset++, 1, ENC_NA);
return offset;
}
static guint
dissect_zbncp_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
{
guint8 flags;
guint16 cmd_id;
conversation_t *conversation;
gchar *zbncp_ctx_str;
flags = 0;
offset = dissect_zbncp_ll_hdr(tvb, pinfo, tree, offset, &flags);
if (!offset)
{
return 0;
}
if (offset < tvb_reported_length(tvb))
{
if (ZBNCP_GET_PACKET_FLAGS_FIRST_FRAG_BIT(flags))
{
/* No fragmentation or first fragment */
dissect_zbncp_body(tvb, pinfo, tree, offset, &cmd_id);
/* First fragment */
if (!ZBNCP_GET_PACKET_FLAGS_LAST_FRAG_BIT(flags))
{
const gchar *tmp = val_to_str_const(cmd_id, zbncp_hl_call_id, "Unknown Call ID");
zbncp_ctx_str = wmem_alloc(wmem_file_scope(), 64);
if(zbncp_ctx_str != NULL)
{
memcpy(zbncp_ctx_str, tmp, strlen(tmp) + 1);
conversation = conversation_new(pinfo->num, &pinfo->src, &pinfo->dst,
conversation_pt_to_conversation_type(pinfo->ptype),
pinfo->srcport, pinfo->destport, 0);
conversation_add_proto_data(conversation, zbncp_frame, (void *)zbncp_ctx_str);
}
col_append_fstr(pinfo->cinfo, COL_INFO, ", first fragment");
}
}
else /* It's fragmentation frame */
{
/* Fragmentation frame */
dissect_zbncp_fragmentation_body(tvb, pinfo, tree, offset);
conversation = find_conversation(pinfo->num, &pinfo->src, &pinfo->dst,
conversation_pt_to_conversation_type(pinfo->ptype),
pinfo->srcport, pinfo->destport, 0);
if (conversation != NULL)
{
zbncp_ctx_str = (gchar *) conversation_get_proto_data(conversation, zbncp_frame);
if (zbncp_ctx_str != NULL)
{
col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", zbncp_ctx_str);
conversation_delete_proto_data(conversation, zbncp_frame);
}
}
if (ZBNCP_GET_PACKET_FLAGS_LAST_FRAG_BIT(flags))
{
col_append_fstr(pinfo->cinfo, COL_INFO, ", last fragment");
}
else
{
col_append_fstr(pinfo->cinfo, COL_INFO, ", fragment");
}
}
}
return tvb_captured_length(tvb);
}
/**
* Dissector for ZBOSS NCP packet with an additional dump info.
*
* @param tvb pointer to buffer containing raw packet.
* @param pinfo pointer to packet information fields.
* @param tree pointer to data tree wireshark uses to display packet.
*/
static int
dissect_zbncp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
{
tvbuff_t *new_tvb;
new_tvb = dissect_zbncp_dump_info(tvb, pinfo, tree);
dissect_zbncp_packet(new_tvb, pinfo, tree, 0);
return tvb_captured_length(tvb);
}
/**
* Proto ZBOSS Network Coprocessor product registration routine
*/
void proto_register_zbncp(void)
{
/* NCP protocol headers */
static hf_register_info hf_zbncp_phy[] = {
{&hf_zbncp_hdr_sign,
{"Signature", "zbncp.hdr.sign", FT_UINT16, BASE_HEX, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_packet_len,
{"Packet length", "zbncp.hdr.plen", FT_UINT16, BASE_DEC, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_hdr_type,
{"Packet type", "zbncp.hdr.ptype", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_hdr_flags,
{"Packet flags", "zbncp.hdr.flags", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_hdr_flags_isack,
{"isACK", "zbncp.hdr.flags.isack", FT_BOOLEAN, 8, NULL,
ZBNCP_HDR_FLAGS_ISACK_MASK, NULL, HFILL}},
{&hf_zbncp_hdr_flags_retrans,
{"Should retransmit", "zbncp.hdr.flags.retrans", FT_BOOLEAN, 8, NULL,
ZBNCP_HDR_FLAGS_RETRANS_MASK, NULL, HFILL}},
{&hf_zbncp_hdr_flags_packetseq,
{"Packet#", "zbncp.hdr.flags.packet_seq", FT_UINT8, BASE_DEC, NULL,
ZBNCP_HDR_FLAGS_PKT_SEQ_MASK, NULL, HFILL}},
{&hf_zbncp_hdr_flags_ackseq,
{"ACK#", "zbncp.hdr.flags.ack_seq", FT_UINT8, BASE_DEC, NULL,
ZBNCP_HDR_FLAGS_ACK_SEQ_MASK, NULL, HFILL}},
{&hf_zbncp_hdr_flags_first_frag,
{"First fragment", "zbncp.hdr.flags.first_frag", FT_BOOLEAN, 8, NULL,
ZBNCP_HDR_FLAGS_ISFIRST_MASK, NULL, HFILL}},
{&hf_zbncp_hdr_flags_last_frag,
{"Last fragment", "zbncp.hdr.flags.last_frag", FT_BOOLEAN, 8, NULL,
ZBNCP_HDR_FLAGS_ISLAST_MASK, NULL, HFILL}},
{&hf_zbncp_hdr_crc8,
{"CRC8", "zbncp.hdr.crc8", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_body_data_crc16,
{"CRC16", "zbncp.data.crc16", FT_UINT16, BASE_HEX, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_version,
{"Version", "zbncp.data.hl.vers", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_packet_type,
{"Packet type", "zbncp.data.hl.ptype", FT_UINT8, BASE_HEX, VALS(zbncp_hl_type), 0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_call_id,
{"Call/evt id", "zbncp.data.hl.id", FT_UINT16, BASE_HEX, VALS(zbncp_hl_call_id), 0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_tsn,
{"TSN", "zbncp.data.hl.tsn", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_status_cat,
{"Status category", "zbncp.data.hl.status_cat", FT_UINT8, BASE_HEX, VALS(zbncp_hl_status_cat), 0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_status,
{"Status", "zbncp.data.hl.status", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_status_generic,
{"Status", "zbncp.data.hl.status", FT_UINT8, BASE_HEX, VALS(zbncp_hl_status_generic), 0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_status_mac,
{"Status", "zbncp.data.hl.status", FT_UINT8, BASE_HEX, VALS(zb_mac_state), 0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_status_nwk,
{"Status", "zbncp.data.hl.status", FT_UINT8, BASE_HEX, VALS(zb_nwk_state), 0x0, NULL, HFILL}},
{&hf_zbncp_data_hl_status_cbke,
{"Status", "zbncp.data.hl.status", FT_UINT8, BASE_HEX, VALS(zb_cbke_state), 0x0, NULL, HFILL}},
{&hf_zbncp_data_fw_vers,
{"FW Version", "zbncp.data.fw_vers", FT_UINT32, BASE_HEX, NULL, 0x0, "NCP module firmware version", HFILL}},
{&hf_zbncp_data_stack_vers,
{"Stack Version", "zbncp.data.stack_vers", FT_UINT32, BASE_HEX, NULL, 0x0, "NCP module stack version", HFILL}},
{&hf_zbncp_data_proto_vers,
{"Protocol Version", "zbncp.data.proto_vers", FT_UINT32, BASE_HEX, NULL, 0x0, "NCP module protocol version", HFILL}},
{&hf_zbncp_data_reset_opt,
{"Options", "zbncp.data.rst_opt", FT_UINT8, BASE_HEX, VALS(zbncp_reset_opt), 0x0, "Force NCP module reboot", HFILL}},
{&hf_zbncp_data_zb_role,
{"Zigbee role", "zbncp.data.zb_role", FT_UINT8, BASE_HEX, VALS(zbncp_zb_role), 0x0, "Zigbee role code", HFILL}},
{&hf_zbncp_data_ch_list_len,
{"Channel list length", "zbncp.data.ch_list_len", FT_UINT8, BASE_HEX, NULL, 0x0, "Number of entries in the following Channel List array", HFILL}},
{&hf_zbncp_data_page,
{"Channel page", "zbncp.data.page", FT_UINT8, BASE_DEC_HEX, VALS(zboss_page_names), 0x0,
"IEEE802.15.4 page number", HFILL}},
{&hf_zbncp_data_ch_mask,
{"Channel mask", "zbncp.data.ch_mask", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_channel,
{"Channel", "zbncp.data.mask", FT_UINT8, BASE_DEC, NULL, 0x0,
"Channel number", HFILL}},
{&hf_zbncp_data_channel4,
{"Channel", "zbncp.data.mask", FT_UINT32, BASE_DEC, NULL, 0x0,
"Channel number", HFILL}},
{&hf_zbncp_data_pan_id,
{"PAN ID", "zbncp.data.pan_id", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_index,
{"Index", "zbncp.data.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_enable,
{"Enable", "zbncp.data.enable", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_bind_type,
{"Bind Type", "zbncp.data.bind_type", FT_UINT8, BASE_DEC, VALS(zbncp_bind_type_vals), 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_int_num,
{"MAC Interface Num", "zbncp.data.mac_int_num", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_ext_pan_id,
{"Ext PAN ID", "zbncp.data.ext_pan_id", FT_EUI64, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_coordinator_version,
{"Coordinator version", "zbncp.data.coord_version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_trust_center_addres,
{"IEEE trust center address", "zbncp.data.ieee_trust_center_addr", FT_EUI64, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_ieee_addr,
{"IEEE address", "zbncp.data.ieee_addr", FT_EUI64, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_remote_ieee_addr,
{"Remote IEEE address", "zbncp.data.rmt_ieee_addr", FT_EUI64, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_src_ieee_addr,
{"Source IEEE address", "zbncp.data.src_ieee_addr", FT_EUI64, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_dst_ieee_addr,
{"Destination IEEE address", "zbncp.data.dst_ieee_addr", FT_EUI64, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_partner_ieee_addr,
{"Partner IEEE address", "zbncp.data.partner_ieee_addr", FT_EUI64, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_keepalive,
{"Keepalive Timeout", "zbncp.data.keepalive", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_force_route_record_sending,
{"Force route record sending mode", "zbncp.data.force_route_rec_mode", FT_UINT8, BASE_DEC, VALS(zbncp_force_route_record_sending_modes), 0x0, NULL, HFILL}},
{&hf_zbncp_data_rx_on_idle,
{"Rx On When Idle", "zbncp.data.rx_on_idle", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_res_tx_power,
{"Resultant TX power", "zbncp.data.tx_power", FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_req_tx_power,
{"Required TX power", "zbncp.data.tx_power", FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_joined,
{"Joined", "zbncp.data.joined", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_joined_bit,
{"Device is joined", "zbncp.data.device_is_joined", FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}},
{&hf_zbncp_data_parent_bit,
{"Parent is lost", "zbncp.data.parent_is_lost", FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}},
{&hf_zbncp_data_authenticated,
{"Authenticated", "zbncp.data.auth", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_timeout,
{"Timeout", "zbncp.data.timeout", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_addr,
{"NWK address", "zbncp.data.nwk_addr", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_parent_addr,
{"NWK parent address", "zbncp.data.nwk_addr", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_dst_nwk_addr,
{"Destination NWK address", "zbncp.data.dst_nwk_addr", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_src_nwk_addr,
{"Source NWK address", "zbncp.data.src_nwk_addr", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_remote_nwk_addr,
{"Remote NWK address", "zbncp.data.rmt_nwk_addr", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_group_nwk_addr,
{"Group NWK address", "zbncp.data.group_nwk_addr", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_src_mac_addr,
{"Source MAC address", "zbncp.data.src_mac_addr", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_dst_mac_addr,
{"Destination MAC address", "zbncp.data.dst_mac_addr", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_key,
{"NWK Key", "zbncp.data.nwk_key", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_key_num,
{"Key number", "zbncp.data.key_num", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_serial_num,
{"Serial number", "zbncp.data.serial_num", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_size,
{"Size", "zbncp.data.size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_parameter_id,
{"Parameter ID", "zbncp.data.param_id", FT_UINT8, BASE_DEC, VALS(zbncp_parameter_id_list), 0x0, NULL, HFILL}},
{&hf_zbncp_data_value8_dec,
{"Value", "zbncp.data.value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_value16_dec,
{"Value", "zbncp.data.value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_ack_to_non_sleepy,
{"Value (for non-sleepy dev)", "zbncp.data.non_sleepy_value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_ack_to_sleepy,
{"Value (for sleepy dev)", "zbncp.data.sleepy_value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_min16,
{"Min", "zbncp.data.min_value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_max16,
{"Max", "zbncp.data.max_value", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_default8_sign,
{"Default", "zbncp.data.default_val", FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_current8_sign,
{"Current", "zbncp.data.current_val", FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_is_concentrator,
{"Is concentrator", "zbncp.data.is_conc", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_concentrator_radius,
{"Concentrator radius", "zbncp.data.conc_rad", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_time16,
{"Time", "zbncp.data.conc_time", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_lock_status,
{"Locking status", "zbncp.data.lock_status", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_nwk_leave_allowed,
{"NWK Leave Allowed", "zbncp.data.nwk_leave_allow", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nvram_dataset_quantity,
{"Dataset quantity", "zbncp.data.nvram_dataset_quantity", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nvram_dataset_type,
{"NVRAM Database type", "zbncp.data.nvram_database_type", FT_UINT16, BASE_HEX, VALS(zb_nvram_database_types), 0x0, NULL, HFILL}},
{&hf_zbncp_data_nvram_version,
{"NVRAM Version", "zbncp.data.nvram_version", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_dataset_version,
{"NVRAM Dataset Version", "zbncp.data.dataset_version", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_dataset_length,
{"NVRAM Dataset size", "zbncp.data.dataset_size", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nvram_dataset_data,
{"NVRAM Dataset data", "zbncp.data.dataset_data", FT_UINT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_tc_policy_type,
{"Trust center policy type", "zbncp.data.tc_policy_type", FT_UINT16, BASE_HEX, VALS(zbncp_tc_policy_types), 0x0, NULL, HFILL}},
{&hf_zbncp_data_tc_policy_value,
{"Trust center policy value", "zbncp.data.tc_policy_value", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_max_children,
{"Number of children", "zbncp.data.num_children", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_leave_allowed,
{"ZDO Leave Allowed", "zbncp.data.zdo_leave_allow", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_leave_wo_rejoin_allowed,
{"ZDO Leave Without Rejoin Allowed", "zbncp.data.zdo_leave_wo_rejoin_allow", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_reset_source,
{"Reset source", "zbncp.data.rst_src", FT_UINT8, BASE_DEC, VALS(zbncp_rst_src_list), 0x0, NULL, HFILL}},
{&hf_zbncp_data_vendor_data,
{"Vendor data", "zbncp.data.vendor_data", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_aps_key,
{"APS Key", "zbncp.data.aps_key", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_endpoint,
{"Endpoint", "zbncp.data.endpoint", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_group_num,
{"APS group number", "zbncp.data.aps_group_num", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_group,
{"APS group", "zbncp.data.aps_group", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_src_endpoint,
{"Source Endpoint", "zbncp.data.src_endpoint", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_dst_endpoint,
{"Destination Endpoint", "zbncp.data.dst_endpoint", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_poll_pkt_cnt,
{"Packet count", "zbncp.data.poll_pkt_cnt", FT_UINT8, BASE_DEC, NULL, 0x0, "The number of packets to poll", HFILL}},
{&hf_zbncp_data_poll_timeout,
{"Poll Timeout", "zbncp.data.poll_timeout", FT_UINT32, BASE_DEC, NULL, 0x0, "The duration of poll in ms", HFILL}},
{&hf_zbncp_data_poll_permit_flag,
{"Permit flag", "zbncp.data.poll_permit_flag", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_profile_id,
{"Profile ID", "zbncp.data.profile_id", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_device_id,
{"Device ID", "zbncp.data.device_id", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_dev_version,
{"Device Version", "zbncp.data.dev_vers", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_in_cl_cnt,
{"Input Cluster Count", "zbncp.data.in_cl_cnt", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_out_cl_cnt,
{"Output Cluster Count", "zbncp.data.out_cl_cnt", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_cluster_id,
{"Cluster ID", "zbncp.data.cluster_id", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_cap,
{"MAC capability", "zbncp.data.mac_cap", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_data_manuf_id,
{"Manufacturer ID", "zbncp.data.manuf_id", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_cur_pwr_mode,
{"Current Power Mode", "zbncp.data.pwr_mode", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_cur_pwr_lvl,
{"Current Power Level", "zbncp.data.pwr_lvl", FT_UINT8, BASE_DEC, VALS(zbncp_power_level), 0x0, NULL, HFILL}},
{&hf_zbncp_data_susp_period,
{"Suspension Period", "zbncp.data.susp_period", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_av_pwr_src,
{"Available Power Sources", "zbncp.data.av_pwr_src", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_data_cur_pwr_src,
{"Current Power Source", "zbncp.data.cur_pwr_src", FT_UINT8, BASE_HEX, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_data_pwr_src_const,
{"Constant (mains) power", "zbncp.data.pwr_src_const", FT_BOOLEAN, 8, NULL,
0x01, NULL, HFILL}},
{&hf_zbncp_data_pwr_src_recharge,
{"Rechargeable battery", "zbncp.data.pwr_src_recharge", FT_BOOLEAN, 8, NULL,
0x02, NULL, HFILL}},
{&hf_zbncp_data_pwr_src_disposable,
{"Disposable battery", "zbncp.data.pwr_src_disp", FT_BOOLEAN, 8, NULL,
0x04, NULL, HFILL}},
{&hf_zbncp_data_req_type,
{"Request Type", "zbncp.data.nwk_req_type", FT_UINT8, BASE_DEC, VALS(zbncp_nwk_req_type), 0x0, NULL, HFILL}},
{&hf_zbncp_data_start_idx,
{"Start Index", "zbncp.data.start_idx", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_start_idx_16b,
{"Start Index", "zbncp.data.start_idx", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_upd_idx,
{"Update Index", "zbncp.data.update_idx", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_entry_idx,
{"Entry Index", "zbncp.data.entry_idx", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_num_asoc_dec,
{"Num Assoc Dev", "zbncp.data.num_asoc_dev", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_pwr_desc,
{"Power Descriptor", "zbncp.data.pwr_desc", FT_UINT16, BASE_HEX, NULL,
0x0, NULL, HFILL}},
{&hf_zbncp_data_pwr_desc_cur_power_mode,
{"Current Power Mode", "zbncp.data.pwr_desc.pwr_mode", FT_UINT16, BASE_DEC, NULL,
0x000F, NULL, HFILL}},
{&hf_zbncp_data_pwr_desc_av_pwr_src,
{"Available Power Sources", "zbncp.data.pwr_desc.av_pwr_src", FT_UINT16, BASE_DEC, NULL,
0x00F0, NULL, HFILL}}, /* todo */
{&hf_zbncp_data_pwr_desc_cur_pwr_src,
{"Current Power Sources", "zbncp.data.pwr_desc.cur_pwr_src", FT_UINT16, BASE_DEC, NULL,
0x0F00, NULL, HFILL}}, /* todo */
{&hf_zbncp_data_pwr_desc_cur_pwr_lvl,
{"Current Power Level", "zbncp.data.cur_pwr_lvl", FT_UINT16, BASE_DEC, VALS(zbncp_power_level),
0xF000, NULL, HFILL}},
{&hf_zbncp_data_max_buf_size,
{"Max buffer size", "zbncp.data.max_buf_size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_max_inc_trans_size,
{"Max Incoming transfer size", "zbncp.data.max_inc_size", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_max_out_trans_size,
{"Max Outgoing transfer size", "zbncp.data.max_out_size", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_desc_cap,
{"Descriptor Capabilities", "zbncp.data.desc_cap", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_desc_cap_ext_act_ep_list_av,
{"Extended Active Endpoint List Available", "zbncp.data.desc_cap.active_ep_list", FT_BOOLEAN, 8, NULL,
0x1, NULL, HFILL}},
{&hf_zbncp_data_desc_cap_ext_simple_desc_list_av,
{"Extended Simple Descriptor List Available", "zbncp.data.desc_cap.simple_desc_list", FT_BOOLEAN, 8, NULL,
0x2, NULL, HFILL}},
{&hf_zbncp_data_flags8,
{"Flags", "zbncp.data.flags8", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_flags_permit_join,
{"Permit Joining", "zbncp.data.flags.perm_join", FT_BOOLEAN, 8, NULL,
0x1, NULL, HFILL}},
{&hf_zbncp_data_flags_router_cap,
{"Router capacity", "zbncp.data.flags.router_cap", FT_BOOLEAN, 8, NULL,
0x2, NULL, HFILL}},
{&hf_zbncp_data_flags_ed_cap,
{"ED capacity", "zbncp.data.flags.ed_cap", FT_BOOLEAN, 8, NULL,
0x4, NULL, HFILL}},
{&hf_zbncp_data_flags_stack_profile,
{"Stack profile", "zbncp.data.flags.stack_profile", FT_UINT8, BASE_DEC, NULL,
0xF0, NULL, HFILL}},
{&hf_zbncp_data_flags16,
{"Flags", "zbncp.data.flags16", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_flags_zb_role,
{"Zigbee role", "zbncp.data.flags.zb_role", FT_UINT16, BASE_HEX, VALS(zbncp_zb_role),
0x7, NULL, HFILL}},
{&hf_zbncp_data_flags_comp_desc_av,
{"Complex desc available", "zbncp.data.flags.comp_desc_av", FT_BOOLEAN, 16, NULL,
0x8, NULL, HFILL}},
{&hf_zbncp_data_flags_user_desc_av,
{"User desc available", "zbncp.data.flags.user_desc_av", FT_BOOLEAN, 16, NULL,
0x0010, NULL, HFILL}},
{&hf_zbncp_data_flags_freq_868,
{"868MHz BPSK Band", "zbncp.data.flags.freq.868mhz", FT_BOOLEAN, 16, NULL,
0x0800, NULL, HFILL}},
{&hf_zbncp_data_flags_freq_902,
{"902MHz BPSK Band", "zbncp.data.flags.freq.902mhz", FT_BOOLEAN, 16, NULL,
0x2000, NULL, HFILL}},
{&hf_zbncp_data_flags_freq_2400,
{"2.4GHz OQPSK Band", "zbncp.data.flags.freq.2400mhz", FT_BOOLEAN, 16, NULL,
0x4000, NULL, HFILL}},
{&hf_zbncp_data_flags_freq_eu_sub_ghz,
{"EU Sub-GHz FSK Band", "zbncp.data.flags.freq.eu_sub_ghz", FT_BOOLEAN, 16, NULL,
0x8000, NULL, HFILL}},
{&hf_zbncp_data_srv_msk,
{"Server mask", "zbncp.data.srv_msk", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_srv_msk_prim_tc,
{"Primary Trust Center", "zbncp.data.srv_msk.prim_tc", FT_BOOLEAN, 16, NULL,
0x0001, NULL, HFILL}},
{&hf_zbncp_data_srv_msk_backup_tc,
{"Backup Trust Center", "zbncp.data.srv_msk.backup_tc", FT_BOOLEAN, 16, NULL,
0x0002, NULL, HFILL}},
{&hf_zbncp_data_srv_msk_prim_bind_tbl_cache,
{"Primary Binding Table Cache", "zbncp.data.srv_msk.prim_bind_tbl_cache", FT_BOOLEAN, 16, NULL,
0x0004, NULL, HFILL}},
{&hf_zbncp_data_srv_msk_backup_bind_tbl_cache,
{"Backup Binding Table Cache", "zbncp.data.srv_msk.backup_bind_tbl_cache", FT_BOOLEAN, 16, NULL,
0x0008, NULL, HFILL}},
{&hf_zbncp_data_remote_bind_offset,
{"Remote Bind Offset", "zbncp.data.remote_bind_access", FT_UINT8, BASE_HEX, NULL,
0x0,
"Remote bind offset, divides the bind table in two parts [0:remote_bind_offset) are for localbindings and "
"[remote_bind_offset:tbl_size) to remote bindings",
HFILL}},
{&hf_zbncp_data_srv_msk_prim_disc_cache,
{"Primary Discovery Cache", "zbncp.data.srv_msk.prim_disc_cache", FT_BOOLEAN, 16, NULL,
0x0010, NULL, HFILL}},
{&hf_zbncp_data_srv_msk_backup_disc_cache,
{"Backup Discovery Cache", "zbncp.data.srv_msk.backup_disc_cache", FT_BOOLEAN, 16, NULL,
0x0020, NULL, HFILL}},
{&hf_zbncp_data_srv_msk_nwk_manager,
{"Network Manager", "zbncp.data.srv_msk.nwk_manager", FT_BOOLEAN, 16, NULL,
0x0040, NULL, HFILL}},
{&hf_zbncp_data_srv_msk_stack_compl_rev,
{"Stack Compliance Revision", "zbncp.data.srv_msk.stack_compl_rev", FT_UINT16, BASE_DEC, NULL,
0xFE00, NULL, HFILL}},
{&hf_zbncp_data_ep_cnt,
{"Endpoint Count", "zbncp.data.endpoint_cnt", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_dst_addr_mode,
{"Dst Address Mode", "zbncp.data.dst_addr_mode", FT_UINT8, BASE_HEX, VALS(zbncp_aps_addr_modes), 0x0, NULL, HFILL}},
{&hf_zbncp_data_leave_flags,
{"Leave flags", "zbncp.data.leave_flags", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_leave_flags_remove_chil,
{"Remove children", "zbncp.data.leave_flags.remove_chil", FT_BOOLEAN, 8, NULL,
0x40, NULL, HFILL}},
{&hf_zbncp_data_leave_flags_rejoin,
{"Rejoin", "zbncp.data.leave_flags.rejoin", FT_BOOLEAN, 8, NULL,
0x80, NULL, HFILL}},
{&hf_zbncp_data_permit_dur,
{"Permit Duration", "zbncp.data.permit_dur", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_tc_sign,
{"TC Significance", "zbncp.data.tc_sign", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_secur_rejoin,
{"Secure Rejoin", "zbncp.data.secure_rejoin", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_zdo_rejoin_flags,
{"Flags", "zbncp.data.zdo_rejoin.flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_zdo_rejoin_flags_tcsw_happened,
{"Trust Center Swap-out happened", "zbncp.data.zdo_rejoin.flags.tcsw_happened", FT_BOOLEAN, 8, NULL,
0x01, NULL, HFILL}},
{&hf_zbncp_data_dlen8,
{"Data Length", "zbncp.data.dlen8", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_dlen16,
{"Data Length", "zbncp.data.dlen16", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_param_len,
{"Param Length", "zbncp.data.param_len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_radius,
{"Radius", "zbncp.data.radius", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_time_between_disc,
{"Time between discoveries", "zbncp.data.time_between_disc", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_enable_flag,
{"Enable flag", "zbncp.data.enable_flag", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "0 - to disable, 1 - to enable", HFILL}},
{&hf_zbncp_data_array,
{"Data", "zbncp.data.data_arr", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_use_alias,
{"Use alias", "zbncp.data.use_alias", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_alias_src,
{"Alias source address", "zbncp.data.alias_src", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_alias_seq,
{"Alias sequence number", "zbncp.data.alias_seq", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_tx_opt,
{"TX Options", "zbncp.data.tx_opt", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_tx_opt_secur,
{"Security enabled transmission", "zbncp.data.secur", FT_BOOLEAN, 8, NULL,
0x01, NULL, HFILL}},
{&hf_zbncp_data_tx_opt_obsolete,
{"Obsolete", "zbncp.data.obsolete", FT_BOOLEAN, 8, NULL,
0x02, NULL, HFILL}},
{&hf_zbncp_data_tx_opt_ack,
{"ACK", "zbncp.data.ack", FT_BOOLEAN, 8, NULL,
0x04, NULL, HFILL}},
{&hf_zbncp_data_tx_opt_frag,
{"Fragmentation permitted", "zbncp.data.frag", FT_BOOLEAN, 8, NULL,
0x08, NULL, HFILL}},
{&hf_zbncp_data_tx_opt_inc_ext_nonce,
{"Include extended nonce", "zbncp.data.ext_nonce", FT_BOOLEAN, 8, NULL,
0x10, NULL, HFILL}},
{&hf_zbncp_data_tx_opt_force_mesh_route,
{"Force mesh route discovery for this request", "zbncp.data.force_mesh_route", FT_BOOLEAN, 8, NULL,
0x20, NULL, HFILL}},
{&hf_zbncp_data_tx_opt_send_route_record,
{"Send route record for this request", "zbncp.data.send_route_record", FT_BOOLEAN, 8, NULL,
0x40, NULL, HFILL}},
{&hf_zbncp_data_lqi,
{"LQI", "zbncp.data.lqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_rssi,
{"RSSI", "zbncp.data.rssi", FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_do_cleanup,
{"Do cleanup", "zbncp.data.do_clean", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_max_rx_bcast,
{"max_rx_bcast", "zbncp.data.max_rx_bcast", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_tx_bcast,
{"max_tx_bcast", "zbncp.data.max_tx_bcast", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_rx_ucast,
{"mac_rx_ucast", "zbncp.data.mac_rx_ucast", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_tx_ucast_total_zcl,
{"mac_tx_ucast_total_zcl", "zbncp.data.mac_tx_ucast_total_zcl", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_tx_ucast_failures_zcl,
{"mac_tx_ucast_failures_zcl", "zbncp.data.mac_tx_ucast_failures_zcl", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_tx_ucast_retries_zcl,
{"mac_tx_ucast_retries_zcl", "zbncp.data.mac_tx_ucast_retries_zcl", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_tx_ucast_total,
{"mac_tx_ucast_total", "zbncp.data.mac_tx_ucast_total", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_tx_ucast_failures,
{"mac_tx_ucast_failures", "zbncp.data.mac_tx_ucast_failures", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_tx_ucast_retries,
{"mac_tx_ucast_retries", "zbncp.data.mac_tx_ucast_retries", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_validate_drop_cnt,
{"mac_validate_drop_cnt", "zbncp.data.mac_validate_drop_cnt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_phy_cca_fail_count,
{"phy_cca_fail_count", "zbncp.data.phy_cca_fail_count", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_phy_to_mac_que_lim_reached,
{"phy_to_mac_que_lim_reached", "zbncp.data.phy_to_mac_que_lim_reached", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_period_of_time,
{"period_of_time", "zbncp.data.period_of_time", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_last_msg_lqi,
{"last_msg_lqi", "zbncp.data.last_msg_lqi", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_last_msg_rssi,
{"last_msg_rssi", "zbncp.data.last_msg_rssi", FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_number_of_resets,
{"number_of_resets", "zbncp.data.number_of_resets", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_tx_bcast,
{"aps_tx_bcast", "zbncp.data.aps_tx_bcast", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_tx_ucast_success,
{"aps_tx_ucast_success", "zbncp.data.aps_tx_ucast_success", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_tx_ucast_retry,
{"aps_tx_ucast_retry", "zbncp.data.aps_tx_ucast_retry", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_tx_ucast_fail,
{"aps_tx_ucast_fail", "zbncp.data.aps_tx_ucast_fail", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_route_disc_initiated,
{"route_disc_initiated", "zbncp.data.route_disc_initiated", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_neighbor_added,
{"nwk_neighbor_added", "zbncp.data.nwk_neighbor_added", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_neighbor_removed,
{"nwk_neighbor_removed", "zbncp.data.nwk_neighbor_removed", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_neighbor_stale,
{"nwk_neighbor_stale", "zbncp.data.nwk_neighbor_stale", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_upd_status_code,
{"Device update status code", "zbncp.data.dev_upd_status_code", FT_UINT8, BASE_DEC, VALS(zbncp_dev_update_status_code), 0x0, NULL, HFILL}},
{&hf_zbncp_data_join_indication,
{"join_indication", "zbncp.data.join_indication", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_childs_removed,
{"childs_removed", "zbncp.data.childs_removed", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_fc_failure,
{"nwk_fc_failure", "zbncp.data.nwk_fc_failure", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_unauthorized_key,
{"aps_unauthorized_key", "zbncp.data.aps_unauthorized_key", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_decrypt_failure,
{"nwk_decrypt_failure", "zbncp.data.nwk_decrypt_failure", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_decrypt_failure,
{"aps_decrypt_failure", "zbncp.data.aps_decrypt_failure", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_packet_buffer_allocate_failures,
{"packet_buffer_allocate_failures", "zbncp.data.packet_buffer_allocate_failures", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_average_mac_retry_per_aps_message_sent,
{"average_mac_retry_per_aps_message_sent", "zbncp.data.avg_mac_retry", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_fc_failure,
{"aps_fc_failure", "zbncp.data.aps_fc_failure", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_retry_overflow,
{"nwk_retry_overflow", "zbncp.data.nwk_retry_overflow", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_bcast_table_full,
{"nwk_bcast_table_full", "zbncp.data.nwk_bcast_table_full", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_status,
{"status", "zbncp.data.status", FT_INT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_auth_type,
{"Authorization type", "zbncp.data.zdo_auth_type", FT_UINT8, BASE_DEC, VALS(zbncp_zdo_auth_types), 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_leg_auth_status_code,
{"Status code", "zbncp.data.zdo_status_code", FT_UINT8, BASE_DEC, VALS(zbncp_zdo_leg_auth_status_codes), 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_tclk_auth_status_code,
{"Status code", "zbncp.data.zdo_status_code", FT_UINT8, BASE_DEC, VALS(zbncp_zdo_tclk_auth_status_codes), 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_server_mask,
{"Server mask", "zbncp.data.zdo_serv_mask", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_start_entry_idx,
{"Start entry index", "zbncp.data.zdo_start_idx", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_scan_duration,
{"Scan duration", "zbncp.data.zdo_scan_duration", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_scan_cnt,
{"Scan count", "zbncp.data.zdo_scan_cnt", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_zdo_scan_mgr_addr,
{"Manager NWK address", "zbncp.data.zdo_mgr_addr", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_cnt,
{"APS counter", "zbncp.data.aps_cnt", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_fc,
{"APS FC", "zbncp.data.aps_fc", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_fc_deliv_mode,
{"Delivery mode", "zbncp.data.aps_fc.deliv_mode", FT_UINT8, BASE_DEC, VALS(zbncp_deliv_mode),
0x0C, NULL, HFILL}},
{&hf_zbncp_data_aps_fc_secur,
{"Security", "zbncp.data.aps_fc.secur", FT_BOOLEAN, 8, NULL,
0x20, NULL, HFILL}},
{&hf_zbncp_data_aps_fc_ack_retrans,
{"ACK & retransmit", "zbncp.data.aps_fc.ack_retrans", FT_BOOLEAN, 8, NULL,
0x40, NULL, HFILL}},
{&hf_zbncp_data_aps_key_attr,
{"APS key source & attr", "zbncp.data.aps_key_attr", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_aps_key_attr_key_src,
{"Key source", "zbncp.data.aps_key_attr.key_src", FT_UINT8, BASE_HEX, VALS(zbncp_aps_key_src),
0x1, NULL, HFILL}},
{&hf_zbncp_data_aps_key_attr_key_used,
{"Key used", "zbncp.data.aps_key_attr.key_used", FT_UINT8, BASE_HEX, VALS(zbncp_aps_key_used),
0x6, NULL, HFILL}},
{&hf_zbncp_data_pkt_len,
{"Packet length", "zbncp.data.pkt_len", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_pkt,
{"Packet", "zbncp.data.pkt", FT_UINT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_scan_dur,
{"Scan Duration", "zbncp.data.scan_dur", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_distr_nwk_flag,
{"Distributed Network Flag", "zbncp.data.distr_nwk_flag", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_count,
{"Network Count", "zbncp.data.nwk_cnt", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_nwk_upd_id,
{"NWK Update ID", "zbncp.data.nwk_upd_id", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_rejoin,
{"Rejoin", "zbncp.data.rejoin", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_rejoin_nwk,
{"Rejoin Network", "zbncp.data.rejoin_nwk", FT_UINT8, BASE_DEC, VALS(zbncp_rejoin_nwk), 0x0, NULL, HFILL}},
{&hf_zbncp_data_secur_en,
{"Security Enable", "zbncp.data.secur_en", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_enh_beacon,
{"Enhanced Beacon", "zbncp.data.enh_beacon", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_beacon_type,
{"Beacon Type", "zbncp.data.beacon_type", FT_UINT8, BASE_DEC, VALS(zbncp_beacon_type), 0x0, NULL, HFILL}},
{&hf_zbncp_data_beacon_order,
{"Beacon Order", "zbncp.data.becon_order", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_superframe_order,
{"Superframe Order", "zbncp.data.supeframe_order", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_battery_life_ext,
{"Battery Life Extension", "zbncp.data.battery_life_ext", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_if,
{"MAC interface #", "zbncp.data.mac_if", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_ed_config,
{"ED config", "zbncp.data.ed_cfg", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_timeout_cnt,
{"Timeout Counter", "zbncp.data.timeout_cnt", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_keepalive_mode,
{"Keepalive mode", "zbncp.data.keepalive", FT_UINT8, BASE_DEC, VALS(zbncp_keepalive_mode), 0x0, NULL, HFILL}},
{&hf_zbncp_data_dev_timeout,
{"Device Timeout", "zbncp.data.dev_timeout", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_relationship,
{"Relationship", "zbncp.data.relationship", FT_UINT8, BASE_HEX, VALS(zbncp_relationship), 0x0, NULL, HFILL}},
{&hf_zbncp_data_tx_fail_cnt,
{"Transmit Failure Cnt", "zbncp.data.tx_fail_cnt", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_out_cost,
{"Outgoing Cost", "zbncp.data.out_cost", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_age,
{"Age", "zbncp.data.age", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_trace_mask,
{"Trace mask", "zbncp.data.trace_mask", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_trace_wireless_traf,
{"Wireless traffic", "zbncp.data.trace_wireless_traf", FT_UINT32, BASE_DEC, NULL, 0x1, NULL, HFILL}},
{&hf_zbncp_data_trace_reserved,
{"Reserved", "zbncp.data.trace_reserved", FT_UINT32, BASE_DEC, NULL, 0x2, NULL, HFILL}},
{&hf_zbncp_data_trace_ncp_ll_proto,
{"NCP LL protocol", "zbncp.data.trace_ncp_ll_proto", FT_UINT32, BASE_DEC, NULL, 0x4, NULL, HFILL}},
{&hf_zbncp_data_trace_host_int_line,
{"HOST INT line", "zbncp.data.trace_host_int_line", FT_UINT32, BASE_DEC, NULL, 0x8, NULL, HFILL}},
{&hf_zbncp_data_trace_sleep_awake,
{"Sleep/awake", "zbncp.data.trace_sleep_awake", FT_UINT32, BASE_DEC, NULL, 0x10, NULL, HFILL}},
{&hf_zbncp_data_keepalive_rec,
{"Keepalive Received", "zbncp.data.keepalive_rec", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_mac_if_idx,
{"MAC Interface Index", "zbncp.data.mac_if_idx", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_fast_poll_int,
{"Fast Poll Interval", "zbncp.data.fast_poll", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_long_poll_int,
{"Long Poll Interval", "zbncp.data.long_poll", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_fast_poll_flag,
{"Fast Poll Flag", "zbncp.data.fast_poll_flag", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_stop_fast_poll_result,
{"Stop Fast Poll Result", "zbncp.data.stop_fast_poll_result", FT_UINT8, BASE_HEX, VALS(zbncp_stop_fast_poll_result), 0x0, NULL, HFILL}},
{&hf_zbncp_data_time,
{"Time", "zbncp.data.time", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_pan_id_cnt,
{"Pan ID count", "zbncp.data.pan_id_cnt", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_ic,
{"Install Code", "zbncp.data.ic", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_ic_table_size,
{"IC Table Size", "zbncp.data.table_size", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_ic_ent_cnt,
{"Entry Count", "zbncp.data.entry_count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_cs,
{"Suite", "zbncp.data.cs", FT_UINT8, BASE_DEC, VALS(zbncp_cs), 0, NULL, HFILL}},
{&hf_zbncp_data_ca_pub_key,
{"CA Public Key", "zbncp.data.ca_pub_key", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_ca_priv_key,
{"Device Private Key", "zbncp.data.ca_priv_key", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_cert,
{"Certificate", "zbncp.data.cert", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_issuer,
{"Issuer", "zbncp.data.issuer", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_ic_en,
{"Enable IC", "zbncp.data.ic_en", FT_BOOLEAN, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_key_type,
{"Key type", "zbncp.data.key_type", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_data_tx_power,
{"TX Power", "zbncp.data.tx_power", FT_INT8, BASE_DEC, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_tx_time,
{"TX Time", "zbncp.data.tx_time", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_seed,
{"Seed", "zbncp.data.seed", FT_INT16, BASE_DEC, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_link_key,
{"Link Key", "zbncp.data.link_key", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_aps_link_key_type,
{"APS Link Key Type", "zbncp.data.link_key_type", FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_key_src,
{"Key source", "zbncp.data.key_src", FT_UINT8, BASE_DEC, VALS(zbncp_key_src), 0, NULL, HFILL}},
{&hf_zbncp_data_key_attr,
{"Key attributes", "zbncp.data.key_attr", FT_UINT8, BASE_DEC, VALS(zbncp_key_attr), 0, NULL, HFILL}},
{&hf_zbncp_data_out_frame_cnt,
{"Outgoing frame counter", "zbncp.data.out_cnt", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_inc_frame_cnt,
{"Incoming frame counter", "zbncp.data.inc_cnt", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_dump_type,
{"Dump Type", "zbncp.data.dump_type", FT_UINT8, BASE_DEC, VALS(zbncp_dump_type), 0, NULL, HFILL}},
{&hf_zbncp_data_dump_text,
{"Dump", "zbncp.data.dump_text", FT_STRING, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_dump_bin,
{"Dump", "zbncp.data.dump_bin", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_offset,
{"Offset", "zbncp.data.offset", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_do_erase,
{"Do erase", "zbncp.data.do_erase", FT_BOOLEAN, BASE_NONE, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_calibration_status,
{"Calibration status", "zbncp.data.calibration_status", FT_UINT8, BASE_HEX, VALS(zbncp_calibration_status), 0, NULL, HFILL}},
{&hf_zbncp_data_calibration_value,
{"Calibration value", "zbncp.data.calibration_value", FT_UINT8, BASE_HEX, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_zgp_key_type,
{"Key type", "zbncp.data.zgp_key_type", FT_UINT8, BASE_HEX, VALS(zbncp_zgp_key_types), 0, NULL, HFILL}},
{&hf_zbncp_data_zgp_link_key,
{"Link key", "zbncp.data.zgp_link_key", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_prod_conf_hdr_crc,
{"Production confgi crc", "zbncp.data.prod_conf.hdr.crc", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_prod_conf_hdr_len,
{"Length (with application section)", "zbncp.data.prod_conf.hdr.len", FT_UINT16, BASE_DEC, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_prod_conf_hdr_version,
{"Version", "zbncp.data.prod_conf.hdr.version", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}},
{&hf_zbncp_data_prod_conf_body,
{"Production config body", "zbncp.data.prod_conf.body", FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}},
/* ZBOSS NCP dump */
{&hf_zbncp_dump_preambule,
{"ZBNCP Dump preambule", "zbncp.dump.preambule", FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL}},
{&hf_zbncp_dump_version,
{"ZBNCP Dump version", "zbncp.dump.version", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{&hf_zbncp_dump_type,
{"Frame type", "zbncp.dump.ftype", FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL}},
{&hf_zbncp_dump_options,
{"Options", "zbncp.dump.options", FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL}},
{&hf_zbncp_dump_options_dir,
{"Direction", "zbncp.dump.options.direction", FT_BOOLEAN, 8, NULL, ZBNCP_DUMP_DIR_MASK,
NULL, HFILL}},
{&hf_zbncp_dump_options_int_state,
{"HOST INT", "zbncp.dump.options.int_state", FT_BOOLEAN, 8, NULL, ZBNCP_DUMP_HOST_INT_DUMP_MASK,
NULL, HFILL}},
{&hf_zbncp_dump_options_tx_conflict,
{"Potential TX/TX conflict", "zbncp.dump.options.tx_conflict", FT_BOOLEAN, 8, NULL, ZBNCP_DUMP_POTENTIAL_TX_RX_ERROR_MASK,
NULL, HFILL}},
/* Capability Information Fields */
{&hf_ieee802154_cinfo_alt_coord,
{"Alternate PAN Coordinator", "zbncp.wpan.cinfo.alt_coord", FT_BOOLEAN, 8, NULL, IEEE802154_CMD_CINFO_ALT_PAN_COORD,
"Whether this device can act as a PAN coordinator or not.", HFILL}},
{&hf_ieee802154_cinfo_device_type,
{"Device Type", "zbncp.wpan.cinfo.device_type", FT_BOOLEAN, 8, TFS(&tfs_cinfo_device_type), IEEE802154_CMD_CINFO_DEVICE_TYPE,
"Whether this device is RFD (reduced-function device) or FFD (full-function device).", HFILL}},
{&hf_ieee802154_cinfo_power_src,
{"Power Source", "zbncp.wpan.cinfo.power_src", FT_BOOLEAN, 8, TFS(&tfs_cinfo_power_src), IEEE802154_CMD_CINFO_POWER_SRC,
"Whether this device is operating on AC/mains or battery power.", HFILL}},
{&hf_ieee802154_cinfo_idle_rx,
{"Receive On When Idle", "zbncp.wpan.cinfo.idle_rx", FT_BOOLEAN, 8, NULL, IEEE802154_CMD_CINFO_IDLE_RX,
"Whether this device can receive packets while idle or not.", HFILL}},
{&hf_ieee802154_cinfo_sec_capable,
{"Security Capability", "zbncp.wpan.cinfo.sec_capable", FT_BOOLEAN, 8, NULL, IEEE802154_CMD_CINFO_SEC_CAPABLE,
"Whether this device is capable of receiving encrypted packets.", HFILL}},
{&hf_ieee802154_cinfo_alloc_addr,
{"Allocate Address", "zbncp.wpan.cinfo.alloc_addr", FT_BOOLEAN, 8, NULL, IEEE802154_CMD_CINFO_ALLOC_ADDR,
"Whether this device wishes to use a 16-bit short address instead of its IEEE 802.15.4 64-bit long address.", HFILL}}};
/* Protocol subtrees */
static gint *ett[] =
{
&ett_zbncp_hdr,
&ett_zbncp_hdr_flags,
&ett_zbncp_ll_body,
&ett_zbncp_hl_hdr,
&ett_zbncp_hl_body,
&ett_zbncp_data_in_cl_list,
&ett_zbncp_data_out_cl_list,
&ett_zbncp_data_mac_cap,
&ett_zbncp_data_pwr_src,
&ett_zbncp_data_cur_pwr_src,
&ett_zbncp_data_asoc_nwk_list,
&ett_zbncp_data_pwr_desc,
&ett_zbncp_data_desc_cap,
&ett_zbncp_data_flags,
&ett_zbncp_data_server_mask,
&ett_zbncp_data_ep_list,
&ett_zbncp_data_leave_flags,
&ett_zbncp_data_tx_opt,
&ett_zbncp_data_zdo_rejoin_flags,
&ett_zbncp_data_apc_fc,
&ett_zbncp_data_prod_conf_hdr,
&ett_zbncp_data_aps_key_attr,
&ett_zbncp_data_ch_list,
&ett_zbncp_data_channel,
&ett_zbncp_data_nwk_descr,
&ett_zbncp_data_cmd_opt,
&ett_zbncp_data_joind_bitmask,
&ett_zbncp_data_trace_bitmask,
&ett_zbncp_dump,
&ett_zbncp_dump_opt
};
zbncp_frame = proto_register_protocol("ZBOSS Network Coprocessor product", "ZB NCP",
ZBNCP_PROTOABBREV);
proto_register_field_array(zbncp_frame, hf_zbncp_phy, array_length(hf_zbncp_phy));
proto_register_subtree_array(ett, array_length(ett));
zbncp_handle = register_dissector("zbncp", dissect_zbncp, proto_zbncp);
} /* proto_register_zbncp */
void proto_reg_handoff_zbncp(void)
{
zbncp_handle = create_dissector_handle(dissect_zbncp, zbncp_frame);
dissector_add_uint("wtap_encap", WTAP_ENCAP_ZBNCP, zbncp_handle);
}