diff options
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/CMakeLists.txt | 1 | ||||
-rw-r--r-- | epan/dissectors/packet-ieee802154.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-ieee802154.h | 1 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-aps.c | 8 | ||||
-rw-r--r-- | epan/dissectors/packet-zbncp.c | 5870 | ||||
-rw-r--r-- | epan/dissectors/packet-zbncp.h | 390 |
6 files changed, 6271 insertions, 1 deletions
diff --git a/epan/dissectors/CMakeLists.txt b/epan/dissectors/CMakeLists.txt index f55312545e..79bfa17e30 100644 --- a/epan/dissectors/CMakeLists.txt +++ b/epan/dissectors/CMakeLists.txt @@ -2038,6 +2038,7 @@ set(DISSECTOR_SRC ${CMAKE_CURRENT_SOURCE_DIR}/packet-zbee-zdp-binding.c ${CMAKE_CURRENT_SOURCE_DIR}/packet-zbee-zdp-discovery.c ${CMAKE_CURRENT_SOURCE_DIR}/packet-zbee-zdp-management.c + ${CMAKE_CURRENT_SOURCE_DIR}/packet-zbncp.c ${CMAKE_CURRENT_SOURCE_DIR}/packet-zebra.c ${CMAKE_CURRENT_SOURCE_DIR}/packet-zep.c ${CMAKE_CURRENT_SOURCE_DIR}/packet-ziop.c diff --git a/epan/dissectors/packet-ieee802154.c b/epan/dissectors/packet-ieee802154.c index 442a1e9049..43065dec6d 100644 --- a/epan/dissectors/packet-ieee802154.c +++ b/epan/dissectors/packet-ieee802154.c @@ -1011,7 +1011,7 @@ static const value_string ieee802154_psie_names[] = { { 0, NULL } }; -static const value_string zboss_page_names[] = { +const value_string zboss_page_names[] = { { 0, "2.4 GHz" }, { 28, "863-868 MHz band"}, { 29, "868-870, 870-876 MHz band" }, diff --git a/epan/dissectors/packet-ieee802154.h b/epan/dissectors/packet-ieee802154.h index 938ed4f456..b755e9d4bc 100644 --- a/epan/dissectors/packet-ieee802154.h +++ b/epan/dissectors/packet-ieee802154.h @@ -597,6 +597,7 @@ extern gboolean ieee802154_long_addr_invalidate(guint64, guint); extern ieee802154_map_tab_t ieee802154_map; extern const value_string ieee802154_mpx_kmp_id_vals[]; +extern const value_string zboss_page_names[]; extern guint ieee802154_fcs_len; diff --git a/epan/dissectors/packet-zbee-aps.c b/epan/dissectors/packet-zbee-aps.c index f3594879d9..4067b4fabb 100644 --- a/epan/dissectors/packet-zbee-aps.c +++ b/epan/dissectors/packet-zbee-aps.c @@ -51,6 +51,7 @@ static guint dissect_zbee_t2 (tvbuff_t *tvb, proto_tree *tree, /* Helper routine. */ static guint zbee_apf_transaction_len (tvbuff_t *tvb, guint offset, guint8 type); +void dissect_zbee_aps_status_code(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset); void proto_register_zbee_aps(void); /******************** @@ -1920,6 +1921,13 @@ static const enum_val_t zbee_zcl_protocol_version_enums[] = { gint gPREF_zbee_se_protocol_version = ZBEE_SE_VERSION_1_4; +void +dissect_zbee_aps_status_code(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset) +{ + guint status = tvb_get_guint8(tvb, offset); + proto_tree_add_item(tree, hf_zbee_aps_cmd_status, tvb, offset, 1, ENC_LITTLE_ENDIAN); + col_append_fstr(pinfo->cinfo, COL_INFO, ", %s", val_to_str_const(status, zbee_aps_status_names, "Unknown Status")); +} /** *ZigBee APS protocol registration routine. * diff --git a/epan/dissectors/packet-zbncp.c b/epan/dissectors/packet-zbncp.c new file mode 100644 index 0000000000..73201d06a9 --- /dev/null +++ b/epan/dissectors/packet-zbncp.c @@ -0,0 +1,5870 @@ +/* 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_endpoint_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_endpoint_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.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, + 0x10, NULL, HFILL}}, + + {&hf_zbncp_data_flags_freq_868, + {"868MHz BPSK Band", "zbncp.data.flags.freq.868mhz", FT_BOOLEAN, 16, NULL, + 0x800, 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, + 0x1, NULL, HFILL}}, + + {&hf_zbncp_data_srv_msk_backup_tc, + {"Backup Trust Center", "zbncp.data.srv_msk.backup_tc", FT_BOOLEAN, 16, NULL, + 0x2, 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, + 0x4, 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, + 0x8, 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, + 0x10, NULL, HFILL}}, + + {&hf_zbncp_data_srv_msk_backup_disc_cache, + {"Backup Discovery Cache", "zbncp.data.srv_msk.backup_disc_cache", FT_BOOLEAN, 16, NULL, + 0x20, NULL, HFILL}}, + + {&hf_zbncp_data_srv_msk_nwk_manager, + {"Network Manager", "zbncp.data.srv_msk.nwk_manager", FT_BOOLEAN, 16, NULL, + 0x40, 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.force_mesh_route", 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_mask", FT_UINT32, BASE_DEC, NULL, 0x1, NULL, HFILL}}, + + {&hf_zbncp_data_trace_reserved, + {"Reserved", "zbncp.data.trace_mask", FT_UINT32, BASE_DEC, NULL, 0x2, NULL, HFILL}}, + + {&hf_zbncp_data_trace_ncp_ll_proto, + {"NCP LL protocol", "zbncp.data.trace_mask", FT_UINT32, BASE_DEC, NULL, 0x4, NULL, HFILL}}, + + {&hf_zbncp_data_trace_host_int_line, + {"HOST INT line", "zbncp.data.trace_mask", FT_UINT32, BASE_DEC, NULL, 0x8, NULL, HFILL}}, + + {&hf_zbncp_data_trace_sleep_awake, + {"Sleep/awake", "zbncp.data.trace_mask", 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); +} diff --git a/epan/dissectors/packet-zbncp.h b/epan/dissectors/packet-zbncp.h new file mode 100644 index 0000000000..7221b81d9b --- /dev/null +++ b/epan/dissectors/packet-zbncp.h @@ -0,0 +1,390 @@ + +/* packet-zbncp.h + * 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 + */ + +#ifndef _PACKET_ZBNCP_H +#define _PACKET_ZBNCP_H + +#define ZBNCP_HIGH_LVL_PACKET_TYPE_REQUEST 0x00 +#define ZBNCP_HIGH_LVL_PACKET_TYPE_RESPONSE 0x01 +#define ZBNCP_HIGH_LVL_PACKET_TYPE_INDICATION 0x02 + +#define ZBNCP_HIGH_LVL_STAT_CAT_GENERIC 0x00 +#define ZBNCP_HIGH_LVL_STAT_CAT_SYSTEM 0x01 +#define ZBNCP_HIGH_LVL_STAT_CAT_MAC 0x02 +#define ZBNCP_HIGH_LVL_STAT_CAT_NWK 0x03 +#define ZBNCP_HIGH_LVL_STAT_CAT_APS 0x04 +#define ZBNCP_HIGH_LVL_STAT_CAT_ZDO 0x05 +#define ZBNCP_HIGH_LVL_STAT_CAT_CBKE 0x06 + +#define ZBNCP_CMD_GET_MODULE_VERSION 0x0001 +#define ZBNCP_CMD_NCP_RESET 0x0002 +#define ZBNCP_CMD_NCP_FACTORY_RESET 0x0003 +#define ZBNCP_CMD_GET_ZIGBEE_ROLE 0x0004 +#define ZBNCP_CMD_SET_ZIGBEE_ROLE 0x0005 +#define ZBNCP_CMD_GET_ZIGBEE_CHANNEL_MASK 0x0006 +#define ZBNCP_CMD_SET_ZIGBEE_CHANNEL_MASK 0x0007 +#define ZBNCP_CMD_GET_ZIGBEE_CHANNEL 0x0008 +#define ZBNCP_CMD_GET_PAN_ID 0x0009 +#define ZBNCP_CMD_SET_PAN_ID 0x000A +#define ZBNCP_CMD_GET_LOCAL_IEEE_ADDR 0x000B +#define ZBNCP_CMD_SET_LOCAL_IEEE_ADDR 0x000C +#define ZBNCP_CMD_SET_TRACE 0x000D +#define ZBNCP_CMD_GET_KEEPALIVE_TIMEOUT 0x000E +#define ZBNCP_CMD_SET_KEEPALIVE_TIMEOUT 0x000F +#define ZBNCP_CMD_GET_TX_POWER 0x0010 +#define ZBNCP_CMD_SET_TX_POWER 0x0011 +#define ZBNCP_CMD_GET_RX_ON_WHEN_IDLE 0x0012 +#define ZBNCP_CMD_SET_RX_ON_WHEN_IDLE 0x0013 +#define ZBNCP_CMD_GET_JOINED 0x0014 +#define ZBNCP_CMD_GET_AUTHENTICATED 0x0015 +#define ZBNCP_CMD_GET_ED_TIMEOUT 0x0016 +#define ZBNCP_CMD_SET_ED_TIMEOUT 0x0017 +#define ZBNCP_CMD_ADD_VISIBLE_DEV 0x0018 +#define ZBNCP_CMD_ADD_INVISIBLE_SHORT 0x0019 +#define ZBNCP_CMD_RM_INVISIBLE_SHORT 0x001A +#define ZBNCP_CMD_SET_NWK_KEY 0x001B +#define ZBNCP_CMD_GET_SERIAL_NUMBER 0x001C +#define ZBNCP_CMD_GET_VENDOR_DATA 0x001D +#define ZBNCP_CMD_GET_NWK_KEYS 0x001E +#define ZBNCP_CMD_GET_APS_KEY_BY_IEEE 0x001F +#define ZBNCP_CMD_BIG_PKT_TO_NCP 0x0020 +#define ZBNCP_CMD_GET_PARENT_ADDR 0x0022 +#define ZBNCP_CMD_GET_EXT_PAN_ID 0x0023 +#define ZBNCP_CMD_GET_COORDINATOR_VERSION 0x0024 +#define ZBNCP_CMD_GET_SHORT_ADDRESS 0x0025 +#define ZBNCP_CMD_GET_TRUST_CENTER_ADDRESS 0x0026 +#define ZBNCP_CMD_DEBUG_WRITE 0x0027 +#define ZBNCP_CMD_GET_CONFIG_PARAMETER 0x0028 +#define ZBNCP_CMD_GET_LOCK_STATUS 0x0029 +#define ZBNCP_CMD_GET_TRACE 0x002A +#define ZBNCP_CMD_NCP_RESET_IND 0x002B +#define ZBNCP_CMD_SET_NWK_LEAVE_ALLOWED 0x002C +#define ZBNCP_CMD_GET_NWK_LEAVE_ALLOWED 0x002D +#define ZBNCP_CMD_NVRAM_WRITE 0x002E +#define ZBNCP_CMD_NVRAM_READ 0x002F +#define ZBNCP_CMD_NVRAM_ERASE 0x0030 +#define ZBCNP_CMD_NVRAM_CLEAR 0x0031 +#define ZBNCP_CMD_SET_TC_POLICY 0x0032 +#define ZBNCP_CMD_SET_EXTENDED_PAN_ID 0x0033 +#define ZBNCP_CMD_SET_MAX_CHILDREN 0x0034 +#define ZBNCP_CMD_GET_MAX_CHILDREN 0x0035 +#define ZBNCP_CMD_SET_ZDO_LEAVE_ALLOWED 0x0036 +#define ZBNCP_CMD_GET_ZDO_LEAVE_ALLOWED 0x0037 +#define ZBNCP_CMD_SET_LEAVE_WO_REJOIN_ALLOWED 0x0038 +#define ZBNCP_CMD_GET_LEAVE_WO_REJOIN_ALLOWED 0x0039 +#define ZBNCP_CMD_DISABLE_GPPB 0x003A +#define ZBNCP_CMD_GP_SET_SHARED_KEY_TYPE 0x003B +#define ZBNCP_CMD_GP_SET_DEFAULT_LINK_KEY 0x003C +#define ZBNCP_CMD_PRODUCTION_CONFIG_READ 0x003D + +#define ZBNCP_CMD_AF_SET_SIMPLE_DESC 0x0101 +#define ZBNCP_CMD_AF_DEL_EP 0x0102 +#define ZBNCP_CMD_AF_SET_NODE_DESC 0x0103 +#define ZBNCP_CMD_AF_SET_POWER_DESC 0x0104 +#define ZBNCP_CMD_AF_SUBGHZ_SUSPEND_IND 0x0105 +#define ZBNCP_CMD_AF_SUBGHZ_RESUME_IND 0x0106 + +#define ZBNCP_CMD_ZDO_NWK_ADDR_REQ 0x0201 +#define ZBNCP_CMD_ZDO_IEEE_ADDR_REQ 0x0202 +#define ZBNCP_CMD_ZDO_POWER_DESC_REQ 0x0203 +#define ZBNCP_CMD_ZDO_NODE_DESC_REQ 0x0204 +#define ZBNCP_CMD_ZDO_SIMPLE_DESC_REQ 0x0205 +#define ZBNCP_CMD_ZDO_ACTIVE_EP_REQ 0x0206 +#define ZBNCP_CMD_ZDO_MATCH_DESC_REQ 0x0207 +#define ZBNCP_CMD_ZDO_BIND_REQ 0x0208 +#define ZBNCP_CMD_ZDO_UNBIND_REQ 0x0209 +#define ZBNCP_CMD_ZDO_MGMT_LEAVE_REQ 0x020A +#define ZBNCP_CMD_ZDO_PERMIT_JOINING_REQ 0x020B +#define ZBNCP_CMD_ZDO_DEV_ANNCE_IND 0x020C +#define ZBNCP_CMD_ZDO_REJOIN 0x020D +#define ZBNCP_CMD_ZDO_SYSTEM_SRV_DISCOVERY_REQ 0x020E +#define ZBNCP_CMD_ZDO_MGMT_BIND_REQ 0x020F +#define ZBNCP_CMD_ZDO_MGMT_LQI_REQ 0x0210 +#define ZBNCP_CMD_ZDO_MGMT_NWK_UPDATE_REQ 0x0211 +#define ZBNCP_CMD_ZDO_REMOTE_CMD_IND 0x0212 +#define ZBNCP_CMD_ZDO_GET_STATS 0x0213 +#define ZBNCP_CMD_ZDO_DEV_AUTHORIZED_IND 0x0214 +#define ZBNCP_CMD_ZDO_DEV_UPDATE_IND 0x0215 +#define ZBNCP_CMD_ZDO_SET_NODE_DESC_MANUF_CODE 0x0216 +#define ZBNCP_CMD_HL_ZDO_GET_DIAG_DATA_REQ 0x0217 + +#define ZBNCP_CMD_APSDE_DATA_REQ 0x0301 +#define ZBNCP_CMD_APSME_BIND 0x0302 +#define ZBNCP_CMD_APSME_UNBIND 0x0303 +#define ZBNCP_CMD_APSME_ADD_GROUP 0x0304 +#define ZBNCP_CMD_APSME_RM_GROUP 0x0305 +#define ZBNCP_CMD_APSDE_DATA_IND 0x0306 +#define ZBNCP_CMD_APSME_RM_ALL_GROUPS 0x0307 +#define ZBNCP_CMD_APS_GET_GROUP_TABLE 0x0309 +#define ZBNCP_CMD_APSME_UNBIND_ALL 0x030A +#define ZBNCP_CMD_APSME_GET_BIND_ENTRY_BY_ID 0x030B +#define ZBNCP_CMD_APSME_RM_BIND_ENTRY_BY_ID 0x030C +#define ZBNCP_CMD_APSME_CLEAR_BIND_TABLE 0x030D +#define ZBNCP_CMD_APSME_REMOTE_BIND_IND 0x030E +#define ZBNCP_CMD_APSME_REMOTE_UNBIND_IND 0x030F +#define ZBNCP_CMD_APSME_SET_REMOTE_BIND_OFFSET 0x0310 +#define ZBNCP_CMD_APSME_GET_REMOTE_BIND_OFFSET 0x0311 + +#define ZBNCP_CMD_NWK_FORMATION 0x0401 +#define ZBNCP_CMD_NWK_DISCOVERY 0x0402 +#define ZBNCP_CMD_NWK_NLME_JOIN 0x0403 +#define ZBNCP_CMD_NWK_PERMIT_JOINING 0x0404 +#define ZBNCP_CMD_NWK_GET_IEEE_BY_SHORT 0x0405 +#define ZBNCP_CMD_NWK_GET_SHORT_BY_IEEE 0x0406 +#define ZBNCP_CMD_NWK_GET_NEIGHBOR_BY_IEEE 0x0407 +#define ZBNCP_CMD_NWK_STARTED_IND 0x0408 +#define ZBNCP_CMD_NWK_REJOINED_IND 0x0409 +#define ZBNCP_CMD_NWK_REJOIN_FAILED_IND 0x040A +#define ZBNCP_CMD_NWK_LEAVE_IND 0x040B +#define ZBNCP_CMD_PIM_SET_FAST_POLL_INTERVAL 0x040E +#define ZBNCP_CMD_PIM_SET_LONG_POLL_INTERVAL 0x040F +#define ZBNCP_CMD_PIM_START_FAST_POLL 0x0410 +#define ZBNCP_CMD_PIM_START_POLL 0x0412 +#define ZBNCP_CMD_PIM_SET_ADAPTIVE_POLL 0x0413 +#define ZBNCP_CMD_PIM_STOP_FAST_POLL 0x0414 +#define ZBNCP_CMD_PIM_STOP_POLL 0x0415 +#define ZBNCP_CMD_PIM_ENABLE_TURBO_POLL 0x0416 +#define ZBNCP_CMD_PIM_DISABLE_TURBO_POLL 0x0417 +#define ZBNCP_CMD_NWK_GET_FIRST_NBT_ENTRY 0x0418 +#define ZBNCP_CMD_NWK_GET_NEXT_NBT_ENTRY 0x0419 +#define ZBNCP_CMD_NWK_PAN_ID_CONFLICT_RESOLVE 0x041A +#define ZBNCP_CMD_NWK_PAN_ID_CONFLICT_IND 0x041B +#define ZBNCP_CMD_NWK_ADDRESS_UPDATE_IND 0x041C +#define ZBNCP_CMD_NWK_START_WITHOUT_FORMATION 0x041D +#define ZBNCP_CMD_NWK_NLME_ROUTER_START 0x041E +#define ZBNCP_CMD_PIM_SINGLE_POLL 0x041F +#define ZBNCP_CMD_PARENT_LOST_IND 0x0420 +#define ZBNCP_CMD_PIM_START_TURBO_POLL_PACKETS 0x0424 +#define ZBNCP_CMD_PIM_START_TURBO_POLL_CONTINUOUS 0x0425 +#define ZBNCP_CMD_PIM_TURBO_POLL_CONTINUOUS_LEAVE 0x0426 +#define ZBNCP_CMD_PIM_TURBO_POLL_PACKETS_LEAVE 0x0427 +#define ZBNCP_CMD_PIM_PERMIT_TURBO_POLL 0x0428 +#define ZBNCP_CMD_PIM_SET_FAST_POLL_TIMEOUT 0x0429 +#define ZBNCP_CMD_PIM_GET_LONG_POLL_INTERVAL 0x042A +#define ZBNCP_CMD_PIM_GET_IN_FAST_POLL_FLAG 0x042B +#define ZBNCP_CMD_SET_KEEPALIVE_MODE 0x042C +#define ZBNCP_CMD_START_CONCENTRATOR_MODE 0x042D +#define ZBNCP_CMD_STOP_CONCENTRATOR_MODE 0x042E +#define ZBNCP_CMD_NWK_ENABLE_PAN_ID_CONFLICT_RESOLUTION 0x042F +#define ZBNCP_CMD_NWK_ENABLE_AUTO_PAN_ID_CONFLICT_RESOLUTION 0x0430 +#define ZBNCP_CMD_PIM_TURBO_POLL_CANCEL_PACKET 0x0431 +#define ZBNCP_CMD_SET_FORCE_ROUTE_RECORD 0x0432 +#define ZBNCP_CMD_GET_FORCE_ROUTE_RECORD 0x0433 +#define ZBNCP_CMD_NWK_NBR_ITERATOR_NEXT 0x0434 + +#define ZBNCP_CMD_SECUR_SET_LOCAL_IC 0x0501 +#define ZBNCP_CMD_SECUR_ADD_IC 0x0502 +#define ZBNCP_CMD_SECUR_DEL_IC 0x0503 +#define ZBNCP_CMD_SECUR_ADD_CERT 0x0504 +#define ZBNCP_CMD_SECUR_DEL_CERT 0x0505 +#define ZBNCP_CMD_SECUR_START_KE 0x0506 +#define ZBNCP_CMD_SECUR_START_PARTNER_LK 0x0507 +#define ZBNCP_CMD_SECUR_CBKE_SRV_FINISHED_IND 0x0508 +#define ZBNCP_CMD_SECUR_PARTNER_LK_FINISHED_IND 0x0509 +#define ZBNCP_CMD_SECUR_JOIN_USES_IC 0x050A +#define ZBNCP_CMD_SECUR_GET_IC_BY_IEEE 0x050B +#define ZBNCP_CMD_SECUR_GET_CERT 0x050C +#define ZBNCP_CMD_SECUR_GET_LOCAL_IC 0x050D +#define ZBNCP_CMD_SECUR_TCLK_IND 0x050E +#define ZBNCP_CMD_SECUR_TCLK_EXCHANGE_FAILED_IND 0x050F +#define ZBNCP_CMD_SECUR_KE_WHITELIST_ADD 0x0510 +#define ZBNCP_CMD_SECUR_KE_WHITELIST_DEL 0x0511 +#define ZBNCP_CMD_SECUR_KE_WHITELIST_DEL_ALL 0x0512 +#define ZBNCP_CMD_SECUR_GET_KEY_IDX 0x0513 +#define ZBNCP_CMD_SECUR_GET_KEY 0x0514 +#define ZBNCP_CMD_SECUR_ERASE_KEY 0x0515 +#define ZBNCP_CMD_SECUR_CLEAR_KEY_TABLE 0x0516 +#define ZBNCP_CMD_SECUR_NWK_INITIATE_KEY_SWITCH_PROCEDURE 0x0517 +#define ZBNCP_CMD_SECUR_GET_IC_LIST 0x0518 +#define ZBNCP_CMD_SECUR_GET_IC_BY_IDX 0x0519 +#define ZBNCP_CMD_SECUR_REMOVE_ALL_IC 0x051A +#define ZBNCP_CMD_SECUR_PARTNER_LK_ENABLE 0x051B + +#define ZBNCP_CMD_MANUF_MODE_START 0x0601 +#define ZBNCP_CMD_MANUF_MODE_END 0x0602 +#define ZBNCP_CMD_MANUF_SET_CHANNEL 0x0603 +#define ZBNCP_CMD_MANUF_GET_CHANNEL 0x0604 +#define ZBNCP_CMD_MANUF_SET_POWER 0x0605 +#define ZBNCP_CMD_MANUF_GET_POWER 0x0606 +#define ZBNCP_CMD_MANUF_START_TONE 0x0607 +#define ZBNCP_CMD_MANUF_STOP_TONE 0x0608 +#define ZBNCP_CMD_MANUF_START_STREAM_RANDOM 0x0609 +#define ZBNCP_CMD_MANUF_STOP_STREAM_RANDOM 0x060A +#define ZBNCP_CMD_NCP_HL_MANUF_SEND_SINGLE_PACKET 0x060B +#define ZBNCP_CMD_MANUF_START_TEST_RX 0x060C +#define ZBNCP_CMD_MANUF_STOP_TEST_RX 0x060D +#define ZBNCP_CMD_MANUF_RX_PACKET_IND 0x060E + +#define ZBNCP_CMD_OTA_RUN_BOOTLOADER 0x0701 +#define ZBNCP_CMD_OTA_START_UPGRADE_IND 0x0702 +#define ZBNCP_CMD_OTA_SEND_PORTION_FW 0x0703 + +#define ZBNCP_CMD_READ_NVRAM_RESERVED 0x0801 +#define ZBNCP_CMD_WRITE_NVRAM_RESERVED 0x0802 +#define ZBNCP_CMD_GET_CALIBRATION_INFO 0x0803 + +/* MAC enums */ +#define MAC_ENUM_SUCCESS 0x00 +#define MAC_ENUM_BEACON_LOSS 0xe0 +#define MAC_ENUM_CHANNEL_ACCESS_FAILURE 0xe1 +#define MAC_ENUM_COUNTER_ERROR 0xdb +#define MAC_ENUM_DENIED 0xe2 +#define MAC_ENUM_DISABLE_TRX_FAILURE 0xe3 +#define MAC_ENUM_FRAME_TOO_LONG 0xe5 +#define MAC_ENUM_IMPROPER_KEY_TYPE 0xdc +#define MAC_ENUM_IMPROPER_SECURITY_LEVEL 0xdd +#define MAC_ENUM_INVALID_ADDRESS 0xf5 +#define MAC_ENUM_INVALID_GTS 0xe6 +#define MAC_ENUM_INVALID_HANDLE 0xe7 +#define MAC_ENUM_INVALID_INDEX 0xf9 +#define MAC_ENUM_INVALID_PARAMETER 0xe8 +#define MAC_ENUM_LIMIT_REACHED 0xfa +#define MAC_ENUM_NO_ACK 0xe9 +#define MAC_ENUM_NO_BEACON 0xea +#define MAC_ENUM_NO_DATA 0xeb +#define MAC_ENUM_NO_SHORT_ADDRESS 0xec +#define MAC_ENUM_ON_TIME_TOO_LONG 0xf6 +#define MAC_ENUM_OUT_OF_CAP 0xed +#define MAC_ENUM_PAN_ID_CONFLICT 0xee +#define MAC_ENUM_PAST_TIME 0xf7 +#define MAC_ENUM_READ_ONLY 0xfb +#define MAC_ENUM_REALIGNMENT 0xef +#define MAC_ENUM_SCAN_IN_PROGRESS 0xfc +#define MAC_ENUM_SECURITY_ERROR 0xe4 +#define MAC_ENUM_SUPERFRAME_OVERLAP 0xfd +#define MAC_ENUM_TRACKING_OFF 0xf8 +#define MAC_ENUM_TRANSACTION_EXPIRED 0xf0 +#define MAC_ENUM_TRANSACTION_OVERFLOW 0xf1 +#define MAC_ENUM_TX_ACTIVE 0xf2 +#define MAC_ENUM_UNAVAILABLE_KEY 0xf3 +#define MAC_ENUM_UNSUPPORTED_LEGACY 0xde +#define MAC_ENUM_UNSUPPORTED_SECURITY 0xdf + +/* NVRAM database types enum */ +#define ZB_NVRAM_RESERVED 0 /**< Reserved value */ +#define ZB_NVRAM_COMMON_DATA 1 /**< Dataset, contains common Zigbee data */ +#define ZB_NVRAM_HA_DATA 2 /**< Dataset, contains HA profile Zigbee data */ +#define ZB_NVRAM_ZCL_REPORTING_DATA 3 /**< Dataset, contains ZCL reporting data */ +#define ZB_NVRAM_APS_SECURE_DATA_GAP 4 /**< Reserved value */ +#define ZB_NVRAM_APS_BINDING_DATA_GAP 5 /**< Reserved value */ +#define ZB_NVRAM_HA_POLL_CONTROL_DATA 6 /**< Dataset, contains HA POLL CONTROL data */ +#define ZB_IB_COUNTERS 7 /**< Dataset, contains NIB outgoing frame counter */ +#define ZB_NVRAM_DATASET_GRPW_DATA 8 /**< Green Power dataset */ +#define ZB_NVRAM_APP_DATA1 9 /**< Application-specific data #1 */ +#define ZB_NVRAM_APP_DATA2 10 /**< Application-specific data #2 */ +#define ZB_NVRAM_ADDR_MAP 11 /**< Dataset stores address map info */ +#define ZB_NVRAM_NEIGHBOUR_TBL 12 /**< Dataset stores Neighbor table info */ +#define ZB_NVRAM_INSTALLCODES 13 /**< Dataset contains APS installcodes data */ +#define ZB_NVRAM_APS_SECURE_DATA 14 /**< Dataset, contains APS secure keys data */ +#define ZB_NVRAM_APS_BINDING_DATA 15 /**< Dataset, contains APS binding data */ +#define ZB_NVRAM_DATASET_GP_PRPOXYT 16 /**< Green Power Proxy table */ +#define ZB_NVRAM_DATASET_GP_SINKT 17 /**< Green Power Sink table */ +#define ZB_NVRAM_DATASET_GP_CLUSTER 18 /**< Green Power Cluster data */ +#define ZB_NVRAM_APS_GROUPS_DATA 19 /**< Dataset, contains APS groups data */ +#define ZB_NVRAM_DATASET_SE_CERTDB 20 /**< Smart Energy Dataset - Certificates DataBase */ +#define ZB_NVRAM_DATASET_GP_APP_TBL 22 /**< Dataset, contains ZCL WWAH data */ +#define ZB_NVRAM_APP_DATA3 27 /**< Application-specific data #3 */ +#define ZB_NVRAM_APP_DATA4 28 /**< Application-specific data #4 */ +#define ZB_NVRAM_KE_WHITELIST 29 +#define ZB_NVRAM_ZDO_DIAGNOSTICS_DATA 31 /**< Dataset of the Diagnostics cluster */ +#define ZB_NVRAM_DATASET_NUMBER 32 /**< Count of Dataset */ +#define ZB_NVRAM_DATA_SET_TYPE_PAGE_HDR 30 /**< Special internal dataset type */ + + +/* NWK statuses */ +#define ZBNCP_NWK_STATUS_SUCCESS 0x00 +#define ZBNCP_NWK_STATUS_INVALID_PARAMETER 0xc1 +#define ZBNCP_NWK_STATUS_INVALID_REQUEST 0xc2 +#define ZBNCP_NWK_STATUS_NOT_PERMITTED 0xc3 +#define ZBNCP_NWK_STATUS_ALREADY_PRESENT 0xc5 +#define ZBNCP_NWK_STATUS_SYNC_FAILURE 0xc6 +#define ZBNCP_NWK_STATUS_NEIGHBOR_TABLE_FULL 0xc7 +#define ZBNCP_NWK_STATUS_UNKNOWN_DEVICE 0xc8 +#define ZBNCP_NWK_STATUS_UNSUPPORTED_ATTRIBUTE 0xc9 +#define ZBNCP_NWK_STATUS_NO_NETWORKS 0xca +#define ZBNCP_NWK_STATUS_MAX_FRM_COUNTER 0xcc +#define ZBNCP_NWK_STATUS_NO_KEY 0xcd +#define ZBNCP_NWK_STATUS_ROUTE_DISCOVERY_FAILED 0xd0 +#define ZBNCP_NWK_STATUS_ROUTE_ERROR 0xd1 +#define ZBNCP_NWK_STATUS_BT_TABLE_FULL 0xd2 +#define ZBNCP_NWK_STATUS_FRAME_NOT_BUFFERED 0xd3 +#define ZBNCP_NWK_STATUS_INVALID_INTERFACE 0xd5 + +/* CBKE statuses */ +#define ZBNCP_CBKE_STATUS_OK 0x00 +#define ZBNCP_CBKE_STATUS_UNKNOWN_ISSUER 0x01 +#define ZBNCP_CBKE_STATUS_BAD_KEY_CONFIRM 0x02 +#define ZBNCP_CBKE_STATUS_BAD_MESSAGE 0x03 +#define ZBNCP_CBKE_STATUS_NO_RESOURCES 0x04 +#define ZBNCP_CBKE_STATUS_UNSUPPORTED_SUITE 0x05 +#define ZBNCP_CBKE_STATUS_INVALID_CERTIFICATE 0x06 +#define ZBNCP_CBKE_STATUS_NO_KE_EP 0x07 + +/* ZB NCP LL HDR PACKET FLAGS BITS */ +#define ZBNCP_GET_PACKET_FLAGS_ACK_BIT(x) ((x) & 0x1) +#define ZBNCP_GET_PACKET_FLAGS_RETRANS_BIT(x) (((x) >> 1) & 0x1) +#define ZBNCP_GET_PACKET_FLAGS_SECNUM_BIT(x) (((x) >> 2) & 0x3) +#define ZBNCP_GET_PACKET_FLAGS_ACKNUM_BIT(x) (((x) >> 4) & 0x3) +#define ZBNCP_GET_PACKET_FLAGS_FIRST_FRAG_BIT(x) (((x) >> 6) & 0x1) +#define ZBNCP_GET_PACKET_FLAGS_LAST_FRAG_BIT(x) (((x) >> 7) & 0x1) + +/* Parameter ID enum */ +#define ZBNCP_PARAMETER_ID_IEEE_ADDR_TABLE_SIZE 1 +#define ZBNCP_PARAMETER_ID_NEIGHBOR_TABLE_SIZE 2 +#define ZBNCP_PARAMETER_ID_APS_SRC_BINDING_TABLE_SIZE 3 +#define ZBNCP_PARAMETER_ID_APS_GROUP_TABLE_SIZE 4 +#define ZBNCP_PARAMETER_ID_NWK_ROUTING_TABLE_SIZE 5 +#define ZBNCP_PARAMETER_ID_NWK_ROUTE_DISCOVERY_TABLE_SIZE 6 +#define ZBNCP_PARAMETER_ID_IOBUF_POOL_SIZE 7 +#define ZBNCP_PARAMETER_ID_PANID_TABLE_SIZE 8 +#define ZBNCP_PARAMETER_ID_APS_DUPS_TABLE_SIZE 9 +#define ZBNCP_PARAMETER_ID_APS_BIND_TRANS_TABLE_SIZE 10 +#define ZBNCP_PARAMETER_ID_N_APS_RETRANS_ENTRIES 11 +#define ZBNCP_PARAMETER_ID_NWK_MAX_HOPS 12 +#define ZBNCP_PARAMETER_ID_NIB_MAX_CHILDREN 13 +#define ZBNCP_PARAMETER_ID_N_APS_KEY_PAIR_ARR_MAX_SIZE 14 +#define ZBNCP_PARAMETER_ID_NWK_MAX_SRC_ROUTES 15 +#define ZBNCP_PARAMETER_ID_APS_MAX_WINDOW_SIZE 16 +#define ZBNCP_PARAMETER_ID_APS_INTERFRAME_DELAY 17 +#define ZBNCP_PARAMETER_ID_ZDO_ED_BIND_TIMEOUT 18 +#define ZBNCP_PARAMETER_ID_NIB_PASSIVE_ASK_TIMEOUT 19 +#define ZBNCP_PARAMETER_ID_APS_ACK_TIMEOUTS 20 +#define ZBNCP_PARAMETER_ID_MAC_BEACON_JITTER 21 +#define ZBNCP_PARAMETER_ID_TX_POWER 22 +#define ZBNCP_PARAMETER_ID_ZLL_DEFAULT_RSSI_THRESHOLD 23 +#define ZBNCP_PARAMETER_ID_NIB_MTORR 24 + +#define ZB_APSDE_DST_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT 0x00 /*!< DstAddress and DstEndpoint not present */ +#define ZB_APSDE_DST_ADDR_MODE_16_GROUP_ENDP_NOT_PRESENT 0x01 /*!< 16-bit group address for DstAddress; DstEndpoint not present */ +#define ZB_APSDE_DST_ADDR_MODE_16_ENDP_PRESENT 0x02 /*!< 16-bit address for DstAddress and DstEndpoint present */ +#define ZB_APSDE_DST_ADDR_MODE_64_ENDP_PRESENT 0x03 /*!< 64-bit extended address for DstAddress and DstEndpoint present */ +#define ZB_APSDE_DST_ADDR_MODE_BIND_TBL_ID 0x04 /*!< According to the dst binding table */ + +/* ZDO Auth types */ +#define ZB_ZDO_AUTH_LEGACY_TYPE 0x00 +#define ZB_ZDO_AUTH_TCLK_TYPE 0x01 + +#define ZBNCP_CMD_APSDE_DATA_REQ_DST_ADDR_MODE_OFFSET ( \ + 8 /* union - short or long addr */ \ + + 2 /* profile id */ \ + + 2 /* cluster id */ \ + + 1 /* dst ep */ \ + + 1 /* src ep */ \ + + 1) /* radius */ + +#define ZBNCP_CMD_APSDE_DATA_REQ_RSP_DST_ADDR_MODE_OFFSET ( \ +8 /* union - short or long addr */ \ ++ 1 /* dst ep */ \ ++ 1 /* src ep */ \ ++ 4) /* tx time */ + +#endif |