Bug Summary

File:builds/wireshark/wireshark/epan/dissectors/packet-zbee-nwk-gp.c
Warning:line 1175, column 13
Value stored to 'offset' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name packet-zbee-nwk-gp.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -fno-delete-null-pointer-checks -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -ffloat16-excess-precision=fast -fbfloat16-excess-precision=fast -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/builds/wireshark/wireshark/build -fcoverage-compilation-dir=/builds/wireshark/wireshark/build -resource-dir /usr/lib/llvm-22/lib/clang/22 -isystem /usr/include/glib-2.0 -isystem /usr/lib/x86_64-linux-gnu/glib-2.0/include -isystem /builds/wireshark/wireshark/epan/dissectors -isystem /builds/wireshark/wireshark/build/epan/dissectors -isystem /usr/include/mit-krb5 -isystem /usr/include/libxml2 -isystem /builds/wireshark/wireshark/epan -D CARES_NO_DEPRECATED -D G_DISABLE_DEPRECATED -D G_DISABLE_SINGLE_INCLUDES -D WS_BUILD_DLL -D WS_DEBUG -D WS_DEBUG_UTF_8 -I /builds/wireshark/wireshark/build -I /builds/wireshark/wireshark -I /builds/wireshark/wireshark/include -D _GLIBCXX_ASSERTIONS -internal-isystem /usr/lib/llvm-22/lib/clang/22/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fmacro-prefix-map=/builds/wireshark/wireshark/= -fmacro-prefix-map=/builds/wireshark/wireshark/build/= -fmacro-prefix-map=../= -Wno-format-nonliteral -std=gnu17 -ferror-limit 19 -fvisibility=hidden -fwrapv -fwrapv-pointer -fstrict-flex-arrays=3 -stack-protector 2 -fstack-clash-protection -fcf-protection=full -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fexceptions -fcolor-diagnostics -analyzer-output=html -faddrsig -fdwarf2-cfi-asm -o /builds/wireshark/wireshark/sbout/2026-08-10-100407-3660-1 -x c /builds/wireshark/wireshark/epan/dissectors/packet-zbee-nwk-gp.c
1/* packet-zbee-nwk-gp.c
2 * Dissector routines for the ZigBee Green Power profile (GP)
3 * Copyright 2013 DSR Corporation, http://dsr-wireless.com/
4 *
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <[email protected]>
7 * Copyright 1998 Gerald Combs
8 *
9 * Used Owen Kirby's packet-zbee-aps module as a template. Based
10 * on ZigBee Cluster Library Specification document 075123r02ZB
11 *
12 * SPDX-License-Identifier: GPL-2.0-or-later
13 */
14
15/* Include files. */
16#include "config.h"
17
18#include <epan/packet.h>
19#include <epan/exceptions.h>
20#include <epan/expert.h>
21#include <epan/prefs.h>
22#include <epan/uat.h>
23#include <wsutil/bits_ctz.h>
24#include <wsutil/pint.h>
25#include "packet-zbee.h"
26#include "packet-zbee-nwk.h"
27#include "packet-zbee-security.h"
28#include "packet-zbee-aps.h"
29#include "packet-zbee-zcl.h"
30
31void proto_register_zbee_nwk_gp(void);
32void proto_reg_handoff_zbee_nwk_gp(void);
33
34/**************************/
35/* Defines. */
36/**************************/
37
38/* ZigBee NWK GP FCF frame types. */
39#define ZBEE_NWK_GP_FCF_DATA0x00 0x00
40#define ZBEE_NWK_GP_FCF_MAINTENANCE0x01 0x01
41
42/* ZigBee NWK GP FCF fields. */
43#define ZBEE_NWK_GP_FCF_AUTO_COMMISSIONING0x40 0x40
44#define ZBEE_NWK_GP_FCF_CONTROL_EXTENSION0x80 0x80
45#define ZBEE_NWK_GP_FCF_FRAME_TYPE0x03 0x03
46#define ZBEE_NWK_GP_FCF_VERSION0x3C 0x3C
47
48/* Extended NWK Frame Control field. */
49#define ZBEE_NWK_GP_FCF_EXT_APP_ID0x07 0x07 /* 0 - 2 b. */
50#define ZBEE_NWK_GP_FCF_EXT_SECURITY_LEVEL0x18 0x18 /* 3 - 4 b. */
51#define ZBEE_NWK_GP_FCF_EXT_SECURITY_KEY0x20 0x20 /* 5 b. */
52#define ZBEE_NWK_GP_FCF_EXT_RX_AFTER_TX0x40 0x40 /* 6 b. */
53#define ZBEE_NWK_GP_FCF_EXT_DIRECTION0x80 0x80 /* 7 b. */
54
55/* Definitions for application IDs. */
56#define ZBEE_NWK_GP_APP_ID_DEFAULT0x00 0x00
57#define ZBEE_NWK_GP_APP_ID_LPED0x01 0x01
58#define ZBEE_NWK_GP_APP_ID_ZGP0x02 0x02
59
60/* Definitions for GP directions. */
61#define ZBEE_NWK_GP_FC_EXT_DIRECTION_DEFAULT0x00 0x00
62#define ZBEE_NWK_GP_FC_EXT_DIRECTION_FROM_ZGPD0x00 0x00
63#define ZBEE_NWK_GP_FC_EXT_DIRECTION_FROM_ZGPP0x01 0x01
64
65/* Definitions for ZGPD Source IDs. */
66#define ZBEE_NWK_GP_ZGPD_SRCID_ALL0xFFFFFFFF 0xFFFFFFFF
67#define ZBEE_NWK_GP_ZGPD_SRCID_UNKNOWN0x00000000 0x00000000
68
69/* Security level values. */
70#define ZBEE_NWK_GP_SECURITY_LEVEL_NO0x00 0x00
71#define ZBEE_NWK_GP_SECURITY_LEVEL_1LSB0x01 0x01
72#define ZBEE_NWK_GP_SECURITY_LEVEL_FULL0x02 0x02
73#define ZBEE_NWK_GP_SECURITY_LEVEL_FULLENCR0x03 0x03
74
75/* GP Security key types. */
76#define ZBEE_NWK_GP_SECURITY_KEY_TYPE_NO_KEY0x00 0x00
77#define ZBEE_NWK_GP_SECURITY_KEY_TYPE_ZB_NWK_KEY0x01 0x01
78#define ZBEE_NWK_GP_SECURITY_KEY_TYPE_GPD_GROUP_KEY0x02 0x02
79#define ZBEE_NWK_GP_SECURITY_KEY_TYPE_NWK_KEY_DERIVED_GPD_KEY_GROUP_KEY0x03 0x03
80#define ZBEE_NWK_GP_SECURITY_KEY_TYPE_PRECONFIGURED_INDIVIDUAL_GPD_KEY0x04 0x04
81#define ZBEE_NWK_GP_SECURITY_KEY_TYPE_DERIVED_INDIVIDUAL_GPD_KEY0x07 0x07
82
83typedef struct {
84 /* FCF Data. */
85 uint8_t frame_type;
86 bool_Bool nwk_frame_control_extension;
87
88 /* Ext FCF Data. */
89 uint8_t application_id;
90 uint8_t security_level;
91 uint8_t direction;
92
93 /* Src ID. */
94 uint32_t source_id;
95
96 /* GPD Endpoint */
97 uint8_t endpoint;
98
99 /* Security Frame Counter. */
100 uint32_t security_frame_counter;
101
102 /* MIC. */
103 uint8_t mic_size;
104 uint32_t mic;
105
106 /* Application Payload. */
107 uint8_t payload_len;
108
109 /* Source IEEE address from parent */
110 uint64_t ieee_packet_src64;
111} zbee_nwk_green_power_packet;
112
113/* Definitions for GP Commissioning command opt field (bitmask). */
114#define ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_MAC_SEQ0x01 0x01
115#define ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_RX_ON_CAP0x02 0x02
116#define ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_APPLICATION_INFO0x04 0x04
117#define ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_PAN_ID_REQ0x10 0x10
118#define ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_GP_SEC_KEY_REQ0x20 0x20
119#define ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_FIXED_LOCATION0x40 0x40
120#define ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_EXT_OPTIONS0x80 0x80
121
122/* Definitions for GP Commissioning command ext_opt field (bitmask). */
123#define ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_SEC_LEVEL_CAP0x03 0x03
124#define ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_KEY_TYPE0x1C 0x1C
125#define ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_GPD_KEY_PRESENT0x20 0x20
126#define ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_GPD_KEY_ENCR0x40 0x40
127#define ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_OUT_COUNTER0x80 0x80
128
129/* Definitions for GP Commissioning command application information field (bitmask). */
130#define ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_MIP0x01 0x01
131#define ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_MMIP0x02 0x02
132#define ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_GCLP0x04 0x04
133#define ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_CRP0x08 0x08
134#define ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_SIP0x10 0x10
135#define ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_ADCF0x20 0x20
136#define ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_RES0xC0 0xC0
137
138/* Definitions for GP Commissioning command switch information field. */
139#define ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_INFO_LEN0x02 0x02
140#define ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_CONF_NUM_CONTACTS0x0F 0x0F
141#define ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_CONF_SWITCH_TYPE0x30 0x30
142#define ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_CONF_RES0xC0 0xC0
143
144/* Definitions for GP Commissioning command Number of server ClusterIDs (bitmask) */
145#define ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_SRV0x0F 0x0F
146#define ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_CLI0xF0 0xF0
147
148/* Definitions for GP Decommissioning command opt field (bitmask). */
149#define ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_PAN_ID_PRESENT0x01 0x01
150#define ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_KEY_PRESENT0x02 0x02
151#define ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_KEY_ENCR0x04 0x04
152#define ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_LEVEL0x18 0x18
153#define ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_KEY_TYPE0xE0 0xE0
154
155/* Definition for GP read attributes command opt field (bitmask). */
156#define ZBEE_NWK_GP_CMD_READ_ATTRIBUTE_OPT_MULTI_RECORD0x01 0x01
157#define ZBEE_NWK_GP_CMD_READ_ATTRIBUTE_OPT_MAN_FIELD_PRESENT0x02 0x02
158
159#define ZBEE_NWK_GP_CMD_ZCL_TUNNEL_OPT_FRAME_TYPE0x03 0x03
160#define ZBEE_NWK_GP_CMD_ZCL_TUNNEL_OPT_MAN_FIELD_PRESENT0x04 0x04
161#define ZBEE_NWK_GP_CMD_ZCL_TUNNEL_OPT_DIRECTION0x08 0x08
162
163/* Definition for GP Application Description command opt fields bitmasks */
164#define ZBEE_NWK_GP_CMD_APP_DESC_REPORT_DESC_OPT_TIMEOUT_PRESENT0x01 0x01
165#define ZBEE_NWK_GP_CMD_APP_DESC_DATA_PT_DESC_OPT_ATTR_NUM0x07 0x07
166#define ZBEE_NWK_GP_CMD_APP_DESC_DATA_PT_DESC_OPT_SERVER0x08 0x08
167#define ZBEE_NWK_GP_CMD_APP_DESC_DATA_PT_DESC_OPT_MANU_ID_PRESENT0x10 0x10
168#define ZBEE_NWK_GP_CMD_APP_DESC_ATTR_REC_OPT_LEN_REMAIN0x0F 0x0F
169#define ZBEE_NWK_GP_CMD_APP_DESC_ATTR_REC_OPT_REPORTED0x10 0x10
170#define ZBEE_NWK_GP_CMD_APP_DESC_ATTR_REC_OPT_VAL_PRESENT0x20 0x20
171
172/* Definitions for GP Channel Request command. */
173#define ZBEE_NWK_GP_CMD_CHANNEL_REQUEST_1ST0x0F 0x0F
174#define ZBEE_NWK_GP_CMD_CHANNEL_REQUEST_2ND0xF0 0xF0
175
176/* GP Channel Configuration command. */
177#define ZBEE_NWK_GP_CMD_CHANNEL_CONFIGURATION_OPERATION_CH0x0F 0x0F
178
179/* GP GENERIC IDS. */
180#define GPD_DEVICE_ID_GENERIC_GP_SIMPLE_GENERIC_1STATE_SWITCH0x00 0x00
181#define GPD_DEVICE_ID_GENERIC_GP_SIMPLE_GENERIC_2STATE_SWITCH0x01 0x01
182#define GPD_DEVICE_ID_GENERIC_GP_ON_OFF_SWITCH0x02 0x02
183#define GPD_DEVICE_ID_GENERIC_GP_LEVEL_CONTROL_SWITCH0x03 0x03
184#define GPD_DEVICE_ID_GENERIC_GP_SIMPLE_SENSOR0x04 0x04
185#define GPD_DEVICE_ID_GENERIC_GP_ADVANCED_GENERIC_1STATE_SWITCH0x05 0x05
186#define GPD_DEVICE_ID_GENERIC_GP_ADVANCED_GENERIC_2STATE_SWITCH0x06 0x06
187
188/* GP LIGHTING IDS. */
189#define GPD_DEVICE_ID_LIGHTING_GP_COLOR_DIMMER_SWITCH0x10 0x10
190#define GPD_DEVICE_ID_LIGHTING_GP_LIGHT_SENSOR0x11 0x11
191#define GPD_DEVICE_ID_LIGHTING_GP_OCCUPANCY_SENSOR0x12 0x12
192
193/* GP CLOSURES IDS. */
194#define GPD_DEVICE_ID_CLOSURES_GP_DOOR_LOCK_CONTROLLER0x20 0x20
195
196/* HVAC IDS. */
197#define GPD_DEVICE_ID_HVAC_GP_TEMPERATURE_SENSOR0x30 0x30
198#define GPD_DEVICE_ID_HVAC_GP_PRESSURE_SENSOR0x31 0x31
199#define GPD_DEVICE_ID_HVAC_GP_FLOW_SENSOR0x32 0x32
200#define GPD_DEVICE_ID_HVAC_GP_INDOOR_ENVIRONMENT_SENSOR0x33 0x33
201
202/* Manufacturer specific device. */
203#define GPD_DEVICE_ID_MANUFACTURER_SPECIFIC0xFE 0xFE
204
205/* GPD manufacturers. */
206#define ZBEE_NWK_GP_MANUF_ID_GREENPEAK0x10D0 0x10D0
207
208/* GPD devices by GreenPeak. */
209#define ZBEE_NWK_GP_MANUF_GREENPEAK_IZDS0x0000 0x0000
210#define ZBEE_NWK_GP_MANUF_GREENPEAK_IZDWS0x0001 0x0001
211#define ZBEE_NWK_GP_MANUF_GREENPEAK_IZLS0x0002 0x0002
212#define ZBEE_NWK_GP_MANUF_GREENPEAK_IZRHS0x0003 0x0003
213
214/*********************/
215/* Global variables. */
216/*********************/
217
218/* GP proto handle. */
219static int proto_zbee_nwk_gp;
220
221/* GP NWK FC. */
222static int hf_zbee_nwk_gp_auto_commissioning;
223static int hf_zbee_nwk_gp_fc_ext;
224static int hf_zbee_nwk_gp_fcf;
225static int hf_zbee_nwk_gp_frame_type;
226static int hf_zbee_nwk_gp_proto_version;
227
228/* GP NWK FC extension. */
229static int hf_zbee_nwk_gp_fc_ext_field;
230static int hf_zbee_nwk_gp_fc_ext_app_id;
231static int hf_zbee_nwk_gp_fc_ext_direction;
232static int hf_zbee_nwk_gp_fc_ext_rx_after_tx;
233static int hf_zbee_nwk_gp_fc_ext_sec_key;
234static int hf_zbee_nwk_gp_fc_ext_sec_level;
235
236/* ZGPD Src ID. */
237static int hf_zbee_nwk_gp_zgpd_src_id;
238
239/* ZGPD Endpoint */
240static int hf_zbee_nwk_gp_zgpd_endpoint;
241
242/* Security frame counter. */
243static int hf_zbee_nwk_gp_security_frame_counter;
244
245/* Security MIC. */
246static int hf_zbee_nwk_gp_security_mic_2b;
247static int hf_zbee_nwk_gp_security_mic_4b;
248
249/* Payload subframe. */
250static int hf_zbee_nwk_gp_command_id;
251
252/* Commissioning. */
253static int hf_zbee_nwk_gp_cmd_comm_device_id;
254static int hf_zbee_nwk_gp_cmd_comm_ext_opt;
255static int hf_zbee_nwk_gp_cmd_comm_ext_opt_gpd_key_encr;
256static int hf_zbee_nwk_gp_cmd_comm_ext_opt_gpd_key_present;
257static int hf_zbee_nwk_gp_cmd_comm_ext_opt_key_type;
258static int hf_zbee_nwk_gp_cmd_comm_ext_opt_outgoing_counter;
259static int hf_zbee_nwk_gp_cmd_comm_ext_opt_sec_level_cap;
260static int hf_zbee_nwk_gp_cmd_comm_security_key;
261static int hf_zbee_nwk_gp_cmd_comm_gpd_sec_key_mic;
262static int hf_zbee_nwk_gp_cmd_comm_opt_ext_opt;
263static int hf_zbee_nwk_gp_cmd_comm_opt;
264static int hf_zbee_nwk_gp_cmd_comm_opt_fixed_location;
265static int hf_zbee_nwk_gp_cmd_comm_opt_mac_sec_num_cap;
266static int hf_zbee_nwk_gp_cmd_comm_opt_appli_info_present;
267static int hf_zbee_nwk_gp_cmd_comm_opt_panid_req;
268static int hf_zbee_nwk_gp_cmd_comm_opt_rx_on_cap;
269static int hf_zbee_nwk_gp_cmd_comm_opt_sec_key_req;
270static int hf_zbee_nwk_gp_cmd_comm_outgoing_counter;
271static int hf_zbee_nwk_gp_cmd_comm_manufacturer_greenpeak_dev_id;
272static int hf_zbee_nwk_gp_cmd_comm_manufacturer_dev_id;
273static int hf_zbee_nwk_gp_cmd_comm_manufacturer_id;
274static int hf_zbee_nwk_gp_cmd_comm_appli_info;
275static int hf_zbee_nwk_gp_cmd_comm_appli_info_crp;
276static int hf_zbee_nwk_gp_cmd_comm_appli_info_gclp;
277static int hf_zbee_nwk_gp_cmd_comm_appli_info_mip;
278static int hf_zbee_nwk_gp_cmd_comm_appli_info_mmip;
279static int hf_zbee_nwk_gp_cmd_comm_appli_info_sip;
280static int hf_zbee_nwk_gp_cmd_comm_appli_info_adcf;
281static int hf_zbee_nwk_gp_cmd_comm_appli_info_res;
282static int hf_zbee_nwk_gp_cmd_comm_gpd_cmd_num;
283static int hf_zbee_nwk_gp_cmd_comm_gpd_cmd_id_list;
284static int hf_zbee_nwk_gp_cmd_comm_length_of_clid_list;
285static int hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_server;
286static int hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_client;
287static int hf_zbee_nwk_cmd_comm_clid_list_server;
288static int hf_zbee_nwk_cmd_comm_clid_list_client;
289static int hf_zbee_nwk_cmd_comm_cluster_id;
290static int hf_zbee_nwk_gp_cmd_comm_switch_info;
291static int hf_zbee_nwk_gp_cmd_comm_switch_info_length;
292static int hf_zbee_nwk_gp_cmd_comm_switch_info_generic_switch_config;
293static int hf_zbee_nwk_gp_cmd_comm_switch_info_num_contacts;
294static int hf_zbee_nwk_gp_cmd_comm_switch_info_switch_type;
295static int hf_zbee_nwk_gp_cmd_comm_switch_info_reserved;
296static int hf_zbee_nwk_gp_cmd_comm_switch_info_current_contact_status;
297
298/* Commissioning reply. */
299static int hf_zbee_nwk_gp_cmd_comm_rep_opt;
300static int hf_zbee_nwk_gp_cmd_comm_rep_opt_key_encr;
301static int hf_zbee_nwk_gp_cmd_comm_rep_opt_panid_present;
302static int hf_zbee_nwk_gp_cmd_comm_rep_opt_sec_key_present;
303static int hf_zbee_nwk_gp_cmd_comm_rep_opt_sec_level;
304static int hf_zbee_nwk_gp_cmd_comm_rep_opt_sec_type;
305static int hf_zbee_nwk_gp_cmd_comm_rep_pan_id;
306static int hf_zbee_nwk_gp_cmd_comm_rep_frame_counter;
307
308/* Read attribute and read attribute response. */
309static int hf_zbee_nwk_gp_cmd_read_att_opt_multi_rec;
310static int hf_zbee_nwk_gp_cmd_read_att_opt_man_field_present;
311static int hf_zbee_nwk_gp_cmd_read_att_opt;
312static int hf_zbee_nwk_gp_cmd_read_att_record_len;
313
314/* ZCL Tunnel */
315static int hf_zbee_nwk_gp_cmd_zcl_tunnel_opt_frame_type;
316static int hf_zbee_nwk_gp_cmd_zcl_tunnel_opt_man_field_present;
317static int hf_zbee_nwk_gp_cmd_zcl_tunnel_opt_direction;
318static int hf_zbee_nwk_gp_cmd_zcl_tunnel_opt;
319static int hf_zbee_nwk_gp_cmd_zcl_tunnel_command_id;
320static int hf_zbee_nwk_gp_cmd_zcl_tunnel_payload_len;
321
322/* Compact Attribute Reporting */
323static int hf_zbee_nwk_gp_cmd_compact_attr_report_report_id;
324static int hf_zbee_nwk_gp_cmd_compact_attr_report_data_points;
325
326/* Application Description */
327static int hf_zbee_nwk_gp_cmd_app_desc_total_report;
328static int hf_zbee_nwk_gp_cmd_app_desc_num_report;
329static int hf_zbee_nwk_gp_cmd_app_desc_report_desc_id;
330static int hf_zbee_nwk_gp_cmd_app_desc_report_desc_opt;
331static int hf_zbee_nwk_gp_cmd_app_desc_report_desc_opt_timeout_present;
332static int hf_zbee_nwk_gp_cmd_app_desc_report_desc_timeout;
333static int hf_zbee_nwk_gp_cmd_app_desc_report_desc_len_remain;
334static int hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt;
335static int hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt_num_recs;
336static int hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt_server;
337static int hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt_manu_id_present;
338static int hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_cluster_id;
339static int hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_manu_id;
340static int hf_zbee_nwk_gp_cmd_app_desc_attr_rec_id;
341static int hf_zbee_nwk_gp_cmd_app_desc_attr_rec_data_type;
342static int hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt;
343static int hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt_len_remain;
344static int hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt_reported;
345static int hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt_val_present;
346static int hf_zbee_nwk_gp_cmd_app_desc_attr_rec_offset;
347static int hf_zbee_nwk_gp_cmd_app_desc_attr_rec_val;
348
349/* Common to commands returning data */
350static int hf_zbee_nwk_gp_zcl_attr_status;
351static int hf_zbee_nwk_gp_zcl_attr_data_type;
352static int hf_zbee_nwk_gp_zcl_attr_cluster_id;
353
354/* Common to all manufacturer specific commands */
355static int hf_zbee_zcl_gp_cmd_ms_manufacturer_code;
356
357/* Channel request. */
358static int hf_zbee_nwk_gp_cmd_channel_request_toggling_behaviour;
359static int hf_zbee_nwk_gp_cmd_channel_request_toggling_behaviour_1st;
360static int hf_zbee_nwk_gp_cmd_channel_request_toggling_behaviour_2nd;
361
362/* Channel Configuration command. */
363static int hf_zbee_nwk_gp_cmd_operational_channel;
364static int hf_zbee_nwk_gp_cmd_channel_configuration;
365
366/* Move Color command. */
367static int hf_zbee_nwk_gp_cmd_move_color_ratex;
368static int hf_zbee_nwk_gp_cmd_move_color_ratey;
369
370/* Move Up/Down command. */
371static int hf_zbee_nwk_gp_cmd_move_up_down_rate;
372
373/* Step Color command. */
374static int hf_zbee_nwk_gp_cmd_step_color_stepx;
375static int hf_zbee_nwk_gp_cmd_step_color_stepy;
376static int hf_zbee_nwk_gp_cmd_step_color_transition_time;
377
378/* Step Up/Down command. */
379static int hf_zbee_nwk_gp_cmd_step_up_down_step_size;
380static int hf_zbee_nwk_gp_cmd_step_up_down_transition_time;
381
382static expert_field ei_zbee_nwk_gp_no_payload;
383static expert_field ei_zbee_nwk_gp_inval_residual_data;
384static expert_field ei_zbee_nwk_gp_com_rep_no_out_cnt;
385
386/* Proto tree elements. */
387static int ett_zbee_nwk;
388static int ett_zbee_nwk_cmd;
389static int ett_zbee_nwk_cmd_cinfo;
390static int ett_zbee_nwk_cmd_appli_info;
391static int ett_zbee_nwk_cmd_options;
392static int ett_zbee_nwk_fcf;
393static int ett_zbee_nwk_fcf_ext;
394static int ett_zbee_nwk_clu_rec;
395static int ett_zbee_nwk_att_rec;
396static int ett_zbee_nwk_cmd_app_desc_report_desc;
397static int ett_zbee_nwk_cmd_app_desc_data_pt_desc;
398static int ett_zbee_nwk_cmd_app_desc_data_pt_options;
399static int ett_zbee_nwk_cmd_app_desc_att_rec;
400static int ett_zbee_nwk_cmd_comm_gpd_cmd_id_list;
401static int ett_zbee_nwk_cmd_comm_length_of_clid_list;
402static int ett_zbee_nwk_cmd_comm_clid_list_server;
403static int ett_zbee_nwk_cmd_comm_clid_list_client;
404static int ett_zbee_nwk_cmd_comm_switch_info;
405static int ett_zbee_nwk_cmd_comm_switch_info_generic_switch_config;
406
407/* Common. */
408static GSList *zbee_gp_keyring;
409static unsigned num_uat_key_records;
410
411typedef struct {
412 char *string;
413 uint8_t byte_order;
414 char *label;
415 uint8_t key[ZBEE_SEC_CONST_KEYSIZE16];
416} uat_key_record_t;
417
418static const uint8_t empty_key[ZBEE_SEC_CONST_KEYSIZE16] = {
419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
421};
422static uat_key_record_t *gp_uat_key_records;
423static uat_t *zbee_gp_sec_key_table_uat;
424
425/* UAT. */
426UAT_CSTRING_CB_DEF(gp_uat_key_records, string, uat_key_record_t)static void gp_uat_key_records_string_set_cb(void* rec, const
char* buf, unsigned len, const void* u1 __attribute__((unused
)), const void* u2 __attribute__((unused))) { char* new_buf =
g_strndup(buf,len); (__builtin_object_size (((((uat_key_record_t
*)rec)->string)), 0) != ((size_t) - 1)) ? g_free_sized (((
(uat_key_record_t*)rec)->string), __builtin_object_size ((
(((uat_key_record_t*)rec)->string)), 0)) : (g_free) ((((uat_key_record_t
*)rec)->string)); (((uat_key_record_t*)rec)->string) = new_buf
; } static void gp_uat_key_records_string_tostr_cb(void* rec,
char** out_ptr, unsigned* out_len, const void* u1 __attribute__
((unused)), const void* u2 __attribute__((unused))) { if (((uat_key_record_t
*)rec)->string ) { *out_ptr = g_strdup_inline ((((uat_key_record_t
*)rec)->string)); *out_len = (unsigned)strlen((((uat_key_record_t
*)rec)->string)); } else { *out_ptr = g_strdup_inline ("")
; *out_len = 0; } }
427UAT_VS_DEF(gp_uat_key_records, byte_order, uat_key_record_t, uint8_t, 0, "Normal")static void gp_uat_key_records_byte_order_set_cb(void* rec, const
char* buf, unsigned len, const void* vs, const void* u2 __attribute__
((unused))) { unsigned i; char* str = g_strndup(buf,len); const
char* cstr; ((uat_key_record_t*)rec)->byte_order = 0; for
(i=0; ( cstr = ((const value_string*)vs)[i].strptr ) ;i++) { if
((strcmp ((const char *) (cstr), (const char *) (str)) == 0)
) { ((uat_key_record_t*)rec)->byte_order = (uint8_t)((const
value_string*)vs)[i].value; (__builtin_object_size ((str), 0
) != ((size_t) - 1)) ? g_free_sized (str, __builtin_object_size
((str), 0)) : (g_free) (str); return; } } (__builtin_object_size
((str), 0) != ((size_t) - 1)) ? g_free_sized (str, __builtin_object_size
((str), 0)) : (g_free) (str); } static void gp_uat_key_records_byte_order_tostr_cb
(void* rec, char** out_ptr, unsigned* out_len, const void* vs
, const void* u2 __attribute__((unused))) { unsigned i; for(i
=0;((const value_string*)vs)[i].strptr;i++) { if ( ((const value_string
*)vs)[i].value == ((uat_key_record_t*)rec)->byte_order ) {
*out_ptr = g_strdup_inline (((const value_string*)vs)[i].strptr
); *out_len = (unsigned)strlen(*out_ptr); return; } } *out_ptr
= g_strdup_inline ("Normal"); *out_len = (unsigned)strlen("Normal"
); }
428UAT_CSTRING_CB_DEF(gp_uat_key_records, label, uat_key_record_t)static void gp_uat_key_records_label_set_cb(void* rec, const char
* buf, unsigned len, const void* u1 __attribute__((unused)), const
void* u2 __attribute__((unused))) { char* new_buf = g_strndup
(buf,len); (__builtin_object_size (((((uat_key_record_t*)rec)
->label)), 0) != ((size_t) - 1)) ? g_free_sized ((((uat_key_record_t
*)rec)->label), __builtin_object_size (((((uat_key_record_t
*)rec)->label)), 0)) : (g_free) ((((uat_key_record_t*)rec)
->label)); (((uat_key_record_t*)rec)->label) = new_buf;
} static void gp_uat_key_records_label_tostr_cb(void* rec, char
** out_ptr, unsigned* out_len, const void* u1 __attribute__((
unused)), const void* u2 __attribute__((unused))) { if (((uat_key_record_t
*)rec)->label ) { *out_ptr = g_strdup_inline ((((uat_key_record_t
*)rec)->label)); *out_len = (unsigned)strlen((((uat_key_record_t
*)rec)->label)); } else { *out_ptr = g_strdup_inline ("");
*out_len = 0; } }
429
430/****************/
431/* Field names. */
432/****************/
433
434/* Byte order. */
435static const value_string byte_order_vals[] = {
436 { 0, "Normal"},
437 { 1, "Reverse"},
438
439 { 0, NULL((void*)0) }
440};
441
442/* Application ID names. */
443static const value_string zbee_nwk_gp_app_id_names[] = {
444 { ZBEE_NWK_GP_APP_ID_LPED0x01, "LPED" },
445 { ZBEE_NWK_GP_APP_ID_ZGP0x02, "ZGP" },
446
447 { 0, NULL((void*)0) }
448};
449
450/* Green Power commands. */
451
452/* Abbreviations:
453 * GPDF commands sent:
454 * From GPD w/o payload: "F "
455 * From GPD w payload: "FP"
456 * To GPD: "T "
457 */
458
459#define zbee_nwk_gp_cmd_names_VALUE_STRING_LIST(XXX)XXX( ZB_GP_CMD_ID_IDENTIFY , 0x00, "Identify" ) XXX( ZB_GP_CMD_ID_RECALL_SCENE0
, 0x10, "Recall Scene 0" ) XXX( ZB_GP_CMD_ID_RECALL_SCENE1 ,
0x11, "Recall Scene 1" ) XXX( ZB_GP_CMD_ID_RECALL_SCENE2 , 0x12
, "Recall Scene 2" ) XXX( ZB_GP_CMD_ID_RECALL_SCENE3 , 0x13, "Recall Scene 3"
) XXX( ZB_GP_CMD_ID_RECALL_SCENE4 , 0x14, "Recall Scene 4" )
XXX( ZB_GP_CMD_ID_RECALL_SCENE5 , 0x15, "Recall Scene 5" ) XXX
( ZB_GP_CMD_ID_RECALL_SCENE6 , 0x16, "Recall Scene 6" ) XXX( ZB_GP_CMD_ID_RECALL_SCENE7
, 0x17, "Recall Scene 7" ) XXX( ZB_GP_CMD_ID_STORE_SCENE0 , 0x18
, "Store Scene 0" ) XXX( ZB_GP_CMD_ID_STORE_SCENE1 , 0x19, "Store Scene 1"
) XXX( ZB_GP_CMD_ID_STORE_SCENE2 , 0x1A, "Store Scene 2" ) XXX
( ZB_GP_CMD_ID_STORE_SCENE3 , 0x1B, "Store Scene 3" ) XXX( ZB_GP_CMD_ID_STORE_SCENE4
, 0x1C, "Store Scene 4" ) XXX( ZB_GP_CMD_ID_STORE_SCENE5 , 0x1D
, "Store Scene 5" ) XXX( ZB_GP_CMD_ID_STORE_SCENE6 , 0x1E, "Store Scene 6"
) XXX( ZB_GP_CMD_ID_STORE_SCENE7 , 0x1F, "Store Scene 7" ) XXX
( ZB_GP_CMD_ID_OFF , 0x20, "Off" ) XXX( ZB_GP_CMD_ID_ON , 0x21
, "On" ) XXX( ZB_GP_CMD_ID_TOGGLE , 0x22, "Toggle" ) XXX( ZB_GP_CMD_ID_RELEASE
, 0x23, "Release" ) XXX( ZB_GP_CMD_ID_MOVE_UP , 0x30, "Move Up"
) XXX( ZB_GP_CMD_ID_MOVE_DOWN , 0x31, "Move Down" ) XXX( ZB_GP_CMD_ID_STEP_UP
, 0x32, "Step Up" ) XXX( ZB_GP_CMD_ID_STEP_DOWN , 0x33, "Step Down"
) XXX( ZB_GP_CMD_ID_LEVEL_CONTROL_STOP , 0x34, "Level Control/Stop"
) XXX( ZB_GP_CMD_ID_MOVE_UP_WITH_ON_OFF , 0x35, "Move Up (with On/Off)"
) XXX( ZB_GP_CMD_ID_MOVE_DOWN_WITH_ON_OFF , 0x36, "Move Down (with On/Off)"
) XXX( ZB_GP_CMD_ID_STEP_UP_WITH_ON_OFF , 0x37, "Step Up (with On/Off)"
) XXX( ZB_GP_CMD_ID_STEP_DOWN_WITH_ON_OFF , 0x38, "Step Down (with On/Off)"
) XXX( ZB_GP_CMD_ID_MOVE_HUE_STOP , 0x40, "Move Hue Stop" ) XXX
( ZB_GP_CMD_ID_MOVE_HUE_UP , 0x41, "Move Hue Up" ) XXX( ZB_GP_CMD_ID_MOVE_HUE_DOWN
, 0x42, "Move Hue Down" ) XXX( ZB_GP_CMD_ID_STEP_HUE_UP , 0x43
, "Step Hue Up" ) XXX( ZB_GP_CMD_ID_STEP_HUW_DOWN , 0x44, "Step Hue Down"
) XXX( ZB_GP_CMD_ID_MOVE_SATURATION_STOP , 0x45, "Move Saturation Stop"
) XXX( ZB_GP_CMD_ID_MOVE_SATURATION_UP , 0x46, "Move Saturation Up"
) XXX( ZB_GP_CMD_ID_MOVE_SATURATION_DOWN , 0x47, "Move Saturation Down"
) XXX( ZB_GP_CMD_ID_STEP_SATURATION_UP , 0x48, "Step Saturation Up"
) XXX( ZB_GP_CMD_ID_STEP_SATURATION_DOWN , 0x49, "Step Saturation Down"
) XXX( ZB_GP_CMD_ID_MOVE_COLOR , 0x4A, "Move Color" ) XXX( ZB_GP_CMD_ID_STEP_COLOR
, 0x4B, "Step Color" ) XXX( ZB_GP_CMD_ID_LOCK_DOOR , 0x50, "Lock Door"
) XXX( ZB_GP_CMD_ID_UNLOCK_DOOR , 0x51, "Unlock Door" ) XXX(
ZB_GP_CMD_ID_PRESS11 , 0x60, "Press 1 of 1" ) XXX( ZB_GP_CMD_ID_RELEASE11
, 0x61, "Release 1 of 1" ) XXX( ZB_GP_CMD_ID_PRESS12 , 0x62,
"Press 1 of 2" ) XXX( ZB_GP_CMD_ID_RELEASE12 , 0x63, "Release 1 of 2"
) XXX( ZB_GP_CMD_ID_PRESS22 , 0x64, "Press 2 of 2" ) XXX( ZB_GP_CMD_ID_RELEASE22
, 0x65, "Release 2 of 2" ) XXX( ZB_GP_CMD_ID_SHORT_PRESS11 ,
0x66, "Short press 1 of 1" ) XXX( ZB_GP_CMD_ID_SHORT_PRESS12
, 0x67, "Short press 1 of 2" ) XXX( ZB_GP_CMD_ID_SHORT_PRESS22
, 0x68, "Short press 2 of 2" ) XXX( ZB_GP_CMD_ID_ATTRIBUTE_REPORTING
, 0xA0, "Attribute reporting" ) XXX( ZB_GP_CMD_ID_MANUFACTURE_SPECIFIC_ATTR_REPORTING
, 0xA1, "Manufacturer-specific attribute reporting" ) XXX( ZB_GP_CMD_ID_MULTI_CLUSTER_REPORTING
, 0xA2, "Multi-cluster reporting" ) XXX( ZB_GP_CMD_ID_MANUFACTURER_SPECIFIC_MCLUSTER_REPORTING
, 0xA3, "Manufacturer-specific multi-cluster reporting" ) XXX
( ZB_GP_CMD_ID_REQUEST_ATTRIBUTES , 0xA4, "Request Attributes"
) XXX( ZB_GP_CMD_ID_READ_ATTRIBUTES_RESPONSE , 0xA5, "Read Attributes Response"
) XXX( ZB_GP_CMD_ID_ZCL_TUNNELING , 0xA6, "ZCL Tunneling" ) XXX
( ZB_GP_CMD_ID_COMPACT_ATTR_REPORT , 0xA8, "Compact Attribute Reporting"
) XXX( ZB_GP_CMD_ID_ANY_SENSOR_COMMAND_A0_A3 , 0xAF, "Any GPD sensor command (0xA0 - 0xA3)"
) XXX( ZB_GP_CMD_ID_COMMISSIONING , 0xE0, "Commissioning" ) XXX
( ZB_GP_CMD_ID_DECOMMISSIONING , 0xE1, "Decommissioning" ) XXX
( ZB_GP_CMD_ID_SUCCESS , 0xE2, "Success" ) XXX( ZB_GP_CMD_ID_CHANNEL_REQUEST
, 0xE3, "Channel Request" ) XXX( ZB_GP_CMD_ID_APPLICATION_DESC
, 0xE4, "Application Description" ) XXX( ZB_GP_CMD_ID_COMMISSIONING_REPLY
, 0xF0, "Commissioning Reply" ) XXX( ZB_GP_CMD_ID_WRITE_ATTRIBUTES
, 0xF1, "Write Attributes" ) XXX( ZB_GP_CMD_ID_READ_ATTRIBUTES
, 0xF2, "Read Attributes" ) XXX( ZB_GP_CMD_ID_CHANNEL_CONFIGURATION
, 0xF3, "Channel Configuration" )
\
460 XXX( /*F */ ZB_GP_CMD_ID_IDENTIFY , 0x00, "Identify" ) \
461 XXX( /*F */ ZB_GP_CMD_ID_RECALL_SCENE0 , 0x10, "Recall Scene 0" ) \
462 XXX( /*F */ ZB_GP_CMD_ID_RECALL_SCENE1 , 0x11, "Recall Scene 1" ) \
463 XXX( /*F */ ZB_GP_CMD_ID_RECALL_SCENE2 , 0x12, "Recall Scene 2" ) \
464 XXX( /*F */ ZB_GP_CMD_ID_RECALL_SCENE3 , 0x13, "Recall Scene 3" ) \
465 XXX( /*F */ ZB_GP_CMD_ID_RECALL_SCENE4 , 0x14, "Recall Scene 4" ) \
466 XXX( /*F */ ZB_GP_CMD_ID_RECALL_SCENE5 , 0x15, "Recall Scene 5" ) \
467 XXX( /*F */ ZB_GP_CMD_ID_RECALL_SCENE6 , 0x16, "Recall Scene 6" ) \
468 XXX( /*F */ ZB_GP_CMD_ID_RECALL_SCENE7 , 0x17, "Recall Scene 7" ) \
469 XXX( /*F */ ZB_GP_CMD_ID_STORE_SCENE0 , 0x18, "Store Scene 0" ) \
470 XXX( /*F */ ZB_GP_CMD_ID_STORE_SCENE1 , 0x19, "Store Scene 1" ) \
471 XXX( /*F */ ZB_GP_CMD_ID_STORE_SCENE2 , 0x1A, "Store Scene 2" ) \
472 XXX( /*F */ ZB_GP_CMD_ID_STORE_SCENE3 , 0x1B, "Store Scene 3" ) \
473 XXX( /*F */ ZB_GP_CMD_ID_STORE_SCENE4 , 0x1C, "Store Scene 4" ) \
474 XXX( /*F */ ZB_GP_CMD_ID_STORE_SCENE5 , 0x1D, "Store Scene 5" ) \
475 XXX( /*F */ ZB_GP_CMD_ID_STORE_SCENE6 , 0x1E, "Store Scene 6" ) \
476 XXX( /*F */ ZB_GP_CMD_ID_STORE_SCENE7 , 0x1F, "Store Scene 7" ) \
477 XXX( /*F */ ZB_GP_CMD_ID_OFF , 0x20, "Off" ) \
478 XXX( /*F */ ZB_GP_CMD_ID_ON , 0x21, "On" ) \
479 XXX( /*F */ ZB_GP_CMD_ID_TOGGLE , 0x22, "Toggle" ) \
480 XXX( /*F */ ZB_GP_CMD_ID_RELEASE , 0x23, "Release" ) \
481 XXX( /*FP*/ ZB_GP_CMD_ID_MOVE_UP , 0x30, "Move Up" ) \
482 XXX( /*FP*/ ZB_GP_CMD_ID_MOVE_DOWN , 0x31, "Move Down" ) \
483 XXX( /*FP*/ ZB_GP_CMD_ID_STEP_UP , 0x32, "Step Up" ) \
484 XXX( /*FP*/ ZB_GP_CMD_ID_STEP_DOWN , 0x33, "Step Down" ) \
485 XXX( /*F */ ZB_GP_CMD_ID_LEVEL_CONTROL_STOP , 0x34, "Level Control/Stop" ) \
486 XXX( /*FP*/ ZB_GP_CMD_ID_MOVE_UP_WITH_ON_OFF , 0x35, "Move Up (with On/Off)" ) \
487 XXX( /*FP*/ ZB_GP_CMD_ID_MOVE_DOWN_WITH_ON_OFF , 0x36, "Move Down (with On/Off)" ) \
488 XXX( /*FP*/ ZB_GP_CMD_ID_STEP_UP_WITH_ON_OFF , 0x37, "Step Up (with On/Off)" ) \
489 XXX( /*FP*/ ZB_GP_CMD_ID_STEP_DOWN_WITH_ON_OFF , 0x38, "Step Down (with On/Off)" ) \
490 XXX( /*F */ ZB_GP_CMD_ID_MOVE_HUE_STOP , 0x40, "Move Hue Stop" ) \
491 XXX( /*FP*/ ZB_GP_CMD_ID_MOVE_HUE_UP , 0x41, "Move Hue Up" ) \
492 XXX( /*FP*/ ZB_GP_CMD_ID_MOVE_HUE_DOWN , 0x42, "Move Hue Down" ) \
493 XXX( /*FP*/ ZB_GP_CMD_ID_STEP_HUE_UP , 0x43, "Step Hue Up" ) \
494 XXX( /*FP*/ ZB_GP_CMD_ID_STEP_HUW_DOWN , 0x44, "Step Hue Down" ) \
495 XXX( /*F */ ZB_GP_CMD_ID_MOVE_SATURATION_STOP , 0x45, "Move Saturation Stop" ) \
496 XXX( /*FP*/ ZB_GP_CMD_ID_MOVE_SATURATION_UP , 0x46, "Move Saturation Up" ) \
497 XXX( /*FP*/ ZB_GP_CMD_ID_MOVE_SATURATION_DOWN , 0x47, "Move Saturation Down" ) \
498 XXX( /*FP*/ ZB_GP_CMD_ID_STEP_SATURATION_UP , 0x48, "Step Saturation Up" ) \
499 XXX( /*FP*/ ZB_GP_CMD_ID_STEP_SATURATION_DOWN , 0x49, "Step Saturation Down" ) \
500 XXX( /*FP*/ ZB_GP_CMD_ID_MOVE_COLOR , 0x4A, "Move Color" ) \
501 XXX( /*FP*/ ZB_GP_CMD_ID_STEP_COLOR , 0x4B, "Step Color" ) \
502 XXX( /*F */ ZB_GP_CMD_ID_LOCK_DOOR , 0x50, "Lock Door" ) \
503 XXX( /*F */ ZB_GP_CMD_ID_UNLOCK_DOOR , 0x51, "Unlock Door" ) \
504 XXX( /*F */ ZB_GP_CMD_ID_PRESS11 , 0x60, "Press 1 of 1" ) \
505 XXX( /*F */ ZB_GP_CMD_ID_RELEASE11 , 0x61, "Release 1 of 1" ) \
506 XXX( /*F */ ZB_GP_CMD_ID_PRESS12 , 0x62, "Press 1 of 2" ) \
507 XXX( /*F */ ZB_GP_CMD_ID_RELEASE12 , 0x63, "Release 1 of 2" ) \
508 XXX( /*F */ ZB_GP_CMD_ID_PRESS22 , 0x64, "Press 2 of 2" ) \
509 XXX( /*F */ ZB_GP_CMD_ID_RELEASE22 , 0x65, "Release 2 of 2" ) \
510 XXX( /*F */ ZB_GP_CMD_ID_SHORT_PRESS11 , 0x66, "Short press 1 of 1" ) \
511 XXX( /*F */ ZB_GP_CMD_ID_SHORT_PRESS12 , 0x67, "Short press 1 of 2" ) \
512 XXX( /*F */ ZB_GP_CMD_ID_SHORT_PRESS22 , 0x68, "Short press 2 of 2" ) \
513 XXX( /*FP*/ ZB_GP_CMD_ID_ATTRIBUTE_REPORTING , 0xA0, "Attribute reporting" ) \
514 XXX( /*FP*/ ZB_GP_CMD_ID_MANUFACTURE_SPECIFIC_ATTR_REPORTING , 0xA1, "Manufacturer-specific attribute reporting" ) \
515 XXX( /*FP*/ ZB_GP_CMD_ID_MULTI_CLUSTER_REPORTING , 0xA2, "Multi-cluster reporting" ) \
516 XXX( /*FP*/ ZB_GP_CMD_ID_MANUFACTURER_SPECIFIC_MCLUSTER_REPORTING , 0xA3, "Manufacturer-specific multi-cluster reporting" ) \
517 XXX( /*FP*/ ZB_GP_CMD_ID_REQUEST_ATTRIBUTES , 0xA4, "Request Attributes" ) \
518 XXX( /*FP*/ ZB_GP_CMD_ID_READ_ATTRIBUTES_RESPONSE , 0xA5, "Read Attributes Response" ) \
519 XXX( /*FP*/ ZB_GP_CMD_ID_ZCL_TUNNELING , 0xA6, "ZCL Tunneling" ) \
520 XXX( /*FP*/ ZB_GP_CMD_ID_COMPACT_ATTR_REPORT , 0xA8, "Compact Attribute Reporting" ) \
521 XXX( /*FP*/ ZB_GP_CMD_ID_ANY_SENSOR_COMMAND_A0_A3 , 0xAF, "Any GPD sensor command (0xA0 - 0xA3)" ) \
522 XXX( /*FP*/ ZB_GP_CMD_ID_COMMISSIONING , 0xE0, "Commissioning" ) \
523 XXX( /*F */ ZB_GP_CMD_ID_DECOMMISSIONING , 0xE1, "Decommissioning" ) \
524 XXX( /*F */ ZB_GP_CMD_ID_SUCCESS , 0xE2, "Success" ) \
525 XXX( /*FP*/ ZB_GP_CMD_ID_CHANNEL_REQUEST , 0xE3, "Channel Request" ) \
526 XXX( /*FP*/ ZB_GP_CMD_ID_APPLICATION_DESC , 0xE4, "Application Description" ) \
527 XXX( /*T */ ZB_GP_CMD_ID_COMMISSIONING_REPLY , 0xF0, "Commissioning Reply" ) \
528 XXX( /*T */ ZB_GP_CMD_ID_WRITE_ATTRIBUTES , 0xF1, "Write Attributes" ) \
529 XXX( /*T */ ZB_GP_CMD_ID_READ_ATTRIBUTES , 0xF2, "Read Attributes" ) \
530 XXX( /*T */ ZB_GP_CMD_ID_CHANNEL_CONFIGURATION , 0xF3, "Channel Configuration" )
531
532VALUE_STRING_ENUM(zbee_nwk_gp_cmd_names)enum { ZB_GP_CMD_ID_IDENTIFY = 0x00, ZB_GP_CMD_ID_RECALL_SCENE0
= 0x10, ZB_GP_CMD_ID_RECALL_SCENE1 = 0x11, ZB_GP_CMD_ID_RECALL_SCENE2
= 0x12, ZB_GP_CMD_ID_RECALL_SCENE3 = 0x13, ZB_GP_CMD_ID_RECALL_SCENE4
= 0x14, ZB_GP_CMD_ID_RECALL_SCENE5 = 0x15, ZB_GP_CMD_ID_RECALL_SCENE6
= 0x16, ZB_GP_CMD_ID_RECALL_SCENE7 = 0x17, ZB_GP_CMD_ID_STORE_SCENE0
= 0x18, ZB_GP_CMD_ID_STORE_SCENE1 = 0x19, ZB_GP_CMD_ID_STORE_SCENE2
= 0x1A, ZB_GP_CMD_ID_STORE_SCENE3 = 0x1B, ZB_GP_CMD_ID_STORE_SCENE4
= 0x1C, ZB_GP_CMD_ID_STORE_SCENE5 = 0x1D, ZB_GP_CMD_ID_STORE_SCENE6
= 0x1E, ZB_GP_CMD_ID_STORE_SCENE7 = 0x1F, ZB_GP_CMD_ID_OFF =
0x20, ZB_GP_CMD_ID_ON = 0x21, ZB_GP_CMD_ID_TOGGLE = 0x22, ZB_GP_CMD_ID_RELEASE
= 0x23, ZB_GP_CMD_ID_MOVE_UP = 0x30, ZB_GP_CMD_ID_MOVE_DOWN =
0x31, ZB_GP_CMD_ID_STEP_UP = 0x32, ZB_GP_CMD_ID_STEP_DOWN = 0x33
, ZB_GP_CMD_ID_LEVEL_CONTROL_STOP = 0x34, ZB_GP_CMD_ID_MOVE_UP_WITH_ON_OFF
= 0x35, ZB_GP_CMD_ID_MOVE_DOWN_WITH_ON_OFF = 0x36, ZB_GP_CMD_ID_STEP_UP_WITH_ON_OFF
= 0x37, ZB_GP_CMD_ID_STEP_DOWN_WITH_ON_OFF = 0x38, ZB_GP_CMD_ID_MOVE_HUE_STOP
= 0x40, ZB_GP_CMD_ID_MOVE_HUE_UP = 0x41, ZB_GP_CMD_ID_MOVE_HUE_DOWN
= 0x42, ZB_GP_CMD_ID_STEP_HUE_UP = 0x43, ZB_GP_CMD_ID_STEP_HUW_DOWN
= 0x44, ZB_GP_CMD_ID_MOVE_SATURATION_STOP = 0x45, ZB_GP_CMD_ID_MOVE_SATURATION_UP
= 0x46, ZB_GP_CMD_ID_MOVE_SATURATION_DOWN = 0x47, ZB_GP_CMD_ID_STEP_SATURATION_UP
= 0x48, ZB_GP_CMD_ID_STEP_SATURATION_DOWN = 0x49, ZB_GP_CMD_ID_MOVE_COLOR
= 0x4A, ZB_GP_CMD_ID_STEP_COLOR = 0x4B, ZB_GP_CMD_ID_LOCK_DOOR
= 0x50, ZB_GP_CMD_ID_UNLOCK_DOOR = 0x51, ZB_GP_CMD_ID_PRESS11
= 0x60, ZB_GP_CMD_ID_RELEASE11 = 0x61, ZB_GP_CMD_ID_PRESS12 =
0x62, ZB_GP_CMD_ID_RELEASE12 = 0x63, ZB_GP_CMD_ID_PRESS22 = 0x64
, ZB_GP_CMD_ID_RELEASE22 = 0x65, ZB_GP_CMD_ID_SHORT_PRESS11 =
0x66, ZB_GP_CMD_ID_SHORT_PRESS12 = 0x67, ZB_GP_CMD_ID_SHORT_PRESS22
= 0x68, ZB_GP_CMD_ID_ATTRIBUTE_REPORTING = 0xA0, ZB_GP_CMD_ID_MANUFACTURE_SPECIFIC_ATTR_REPORTING
= 0xA1, ZB_GP_CMD_ID_MULTI_CLUSTER_REPORTING = 0xA2, ZB_GP_CMD_ID_MANUFACTURER_SPECIFIC_MCLUSTER_REPORTING
= 0xA3, ZB_GP_CMD_ID_REQUEST_ATTRIBUTES = 0xA4, ZB_GP_CMD_ID_READ_ATTRIBUTES_RESPONSE
= 0xA5, ZB_GP_CMD_ID_ZCL_TUNNELING = 0xA6, ZB_GP_CMD_ID_COMPACT_ATTR_REPORT
= 0xA8, ZB_GP_CMD_ID_ANY_SENSOR_COMMAND_A0_A3 = 0xAF, ZB_GP_CMD_ID_COMMISSIONING
= 0xE0, ZB_GP_CMD_ID_DECOMMISSIONING = 0xE1, ZB_GP_CMD_ID_SUCCESS
= 0xE2, ZB_GP_CMD_ID_CHANNEL_REQUEST = 0xE3, ZB_GP_CMD_ID_APPLICATION_DESC
= 0xE4, ZB_GP_CMD_ID_COMMISSIONING_REPLY = 0xF0, ZB_GP_CMD_ID_WRITE_ATTRIBUTES
= 0xF1, ZB_GP_CMD_ID_READ_ATTRIBUTES = 0xF2, ZB_GP_CMD_ID_CHANNEL_CONFIGURATION
= 0xF3, _zbee_nwk_gp_cmd_names_ENUM_DUMMY = 0 }
;
533
534VALUE_STRING_ARRAY(zbee_nwk_gp_cmd_names)static const value_string zbee_nwk_gp_cmd_names[] = { { 0x00,
"Identify" }, { 0x10, "Recall Scene 0" }, { 0x11, "Recall Scene 1"
}, { 0x12, "Recall Scene 2" }, { 0x13, "Recall Scene 3" }, {
0x14, "Recall Scene 4" }, { 0x15, "Recall Scene 5" }, { 0x16
, "Recall Scene 6" }, { 0x17, "Recall Scene 7" }, { 0x18, "Store Scene 0"
}, { 0x19, "Store Scene 1" }, { 0x1A, "Store Scene 2" }, { 0x1B
, "Store Scene 3" }, { 0x1C, "Store Scene 4" }, { 0x1D, "Store Scene 5"
}, { 0x1E, "Store Scene 6" }, { 0x1F, "Store Scene 7" }, { 0x20
, "Off" }, { 0x21, "On" }, { 0x22, "Toggle" }, { 0x23, "Release"
}, { 0x30, "Move Up" }, { 0x31, "Move Down" }, { 0x32, "Step Up"
}, { 0x33, "Step Down" }, { 0x34, "Level Control/Stop" }, { 0x35
, "Move Up (with On/Off)" }, { 0x36, "Move Down (with On/Off)"
}, { 0x37, "Step Up (with On/Off)" }, { 0x38, "Step Down (with On/Off)"
}, { 0x40, "Move Hue Stop" }, { 0x41, "Move Hue Up" }, { 0x42
, "Move Hue Down" }, { 0x43, "Step Hue Up" }, { 0x44, "Step Hue Down"
}, { 0x45, "Move Saturation Stop" }, { 0x46, "Move Saturation Up"
}, { 0x47, "Move Saturation Down" }, { 0x48, "Step Saturation Up"
}, { 0x49, "Step Saturation Down" }, { 0x4A, "Move Color" },
{ 0x4B, "Step Color" }, { 0x50, "Lock Door" }, { 0x51, "Unlock Door"
}, { 0x60, "Press 1 of 1" }, { 0x61, "Release 1 of 1" }, { 0x62
, "Press 1 of 2" }, { 0x63, "Release 1 of 2" }, { 0x64, "Press 2 of 2"
}, { 0x65, "Release 2 of 2" }, { 0x66, "Short press 1 of 1" }
, { 0x67, "Short press 1 of 2" }, { 0x68, "Short press 2 of 2"
}, { 0xA0, "Attribute reporting" }, { 0xA1, "Manufacturer-specific attribute reporting"
}, { 0xA2, "Multi-cluster reporting" }, { 0xA3, "Manufacturer-specific multi-cluster reporting"
}, { 0xA4, "Request Attributes" }, { 0xA5, "Read Attributes Response"
}, { 0xA6, "ZCL Tunneling" }, { 0xA8, "Compact Attribute Reporting"
}, { 0xAF, "Any GPD sensor command (0xA0 - 0xA3)" }, { 0xE0,
"Commissioning" }, { 0xE1, "Decommissioning" }, { 0xE2, "Success"
}, { 0xE3, "Channel Request" }, { 0xE4, "Application Description"
}, { 0xF0, "Commissioning Reply" }, { 0xF1, "Write Attributes"
}, { 0xF2, "Read Attributes" }, { 0xF3, "Channel Configuration"
}, { 0, ((void*)0) } }
;
535value_string_ext zbee_nwk_gp_cmd_names_ext = VALUE_STRING_EXT_INIT(zbee_nwk_gp_cmd_names){ _try_val_to_str_ext_init, 0, (sizeof (zbee_nwk_gp_cmd_names
) / sizeof ((zbee_nwk_gp_cmd_names)[0]))-1, zbee_nwk_gp_cmd_names
, "zbee_nwk_gp_cmd_names", ((void*)0) }
;
536
537
538/* Green Power devices. */
539const value_string zbee_nwk_gp_device_ids_names[] = {
540
541 /* GP GENERIC */
542 { GPD_DEVICE_ID_GENERIC_GP_SIMPLE_GENERIC_1STATE_SWITCH0x00, "Generic: GP Simple Generic 1-state Switch" },
543 { GPD_DEVICE_ID_GENERIC_GP_SIMPLE_GENERIC_2STATE_SWITCH0x01, "Generic: GP Simple Generic 2-state Switch" },
544 { GPD_DEVICE_ID_GENERIC_GP_ON_OFF_SWITCH0x02, "Generic: GP On/Off Switch" },
545 { GPD_DEVICE_ID_GENERIC_GP_LEVEL_CONTROL_SWITCH0x03, "Generic: GP Level Control Switch" },
546 { GPD_DEVICE_ID_GENERIC_GP_SIMPLE_SENSOR0x04, "Generic: GP Simple Sensor" },
547 { GPD_DEVICE_ID_GENERIC_GP_ADVANCED_GENERIC_1STATE_SWITCH0x05, "Generic: GP Advanced Generic 1-state Switch" },
548 { GPD_DEVICE_ID_GENERIC_GP_ADVANCED_GENERIC_2STATE_SWITCH0x06, "Generic: GP Advanced Generic 2-state Switch" },
549
550 /* GP LIGHTING */
551 { GPD_DEVICE_ID_LIGHTING_GP_COLOR_DIMMER_SWITCH0x10, "Lighting: GP Color Dimmer Switch" },
552 { GPD_DEVICE_ID_LIGHTING_GP_LIGHT_SENSOR0x11, "Lighting: GP Light Sensor" },
553 { GPD_DEVICE_ID_LIGHTING_GP_OCCUPANCY_SENSOR0x12, "Lighting: GP Occupancy Sensor" },
554
555 /* GP CLOSURES */
556 { GPD_DEVICE_ID_CLOSURES_GP_DOOR_LOCK_CONTROLLER0x20, "Closures: GP Door Lock Controller" },
557
558 /* HVAC */
559 { GPD_DEVICE_ID_HVAC_GP_TEMPERATURE_SENSOR0x30, "HVAC: GP Temperature Sensor" },
560 { GPD_DEVICE_ID_HVAC_GP_PRESSURE_SENSOR0x31, "HVAC: GP Pressure Sensor" },
561 { GPD_DEVICE_ID_HVAC_GP_FLOW_SENSOR0x32, "HVAC: GP Flow Sensor" },
562 { GPD_DEVICE_ID_HVAC_GP_INDOOR_ENVIRONMENT_SENSOR0x33, "HVAC: GP Indoor Environment Sensor" },
563
564 /* CUSTOM */
565 { GPD_DEVICE_ID_MANUFACTURER_SPECIFIC0xFE, "Manufacturer Specific" },
566
567 { 0, NULL((void*)0) }
568};
569static value_string_ext zbee_nwk_gp_device_ids_names_ext = VALUE_STRING_EXT_INIT(zbee_nwk_gp_device_ids_names){ _try_val_to_str_ext_init, 0, (sizeof (zbee_nwk_gp_device_ids_names
) / sizeof ((zbee_nwk_gp_device_ids_names)[0]))-1, zbee_nwk_gp_device_ids_names
, "zbee_nwk_gp_device_ids_names", ((void*)0) }
;
570
571/* GP directions. */
572static const value_string zbee_nwk_gp_directions[] = {
573 { ZBEE_NWK_GP_FC_EXT_DIRECTION_FROM_ZGPD0x00, "From ZGPD" },
574 { ZBEE_NWK_GP_FC_EXT_DIRECTION_FROM_ZGPP0x01, "From ZGPP" },
575
576 { 0, NULL((void*)0) }
577};
578
579/* Frame types for Green Power profile. */
580static const value_string zbee_nwk_gp_frame_types[] = {
581 { ZBEE_NWK_GP_FCF_DATA0x00, "Data" },
582 { ZBEE_NWK_GP_FCF_MAINTENANCE0x01, "Maintenance" },
583
584 { 0, NULL((void*)0) }
585};
586
587/* GreenPeak Green Power devices. */
588static const value_string zbee_nwk_gp_manufacturer_greenpeak_dev_names[] = {
589 { ZBEE_NWK_GP_MANUF_GREENPEAK_IZDS0x0000, "IAS Zone Door Sensor" },
590 { ZBEE_NWK_GP_MANUF_GREENPEAK_IZDWS0x0001, "IAS Zone Door/Window Sensor" },
591 { ZBEE_NWK_GP_MANUF_GREENPEAK_IZLS0x0002, "IAS Zone Leakage Sensor" },
592 { ZBEE_NWK_GP_MANUF_GREENPEAK_IZRHS0x0003, "IAS Zone Relative Humidity Sensor" },
593
594 { 0, NULL((void*)0) }
595};
596
597/* GP Generic switch type names. */
598static const value_string zbee_nwk_gp_switch_type_names[] = {
599 { 0x00, "Unknown: exact configuration apart from number of contacts unknown" },
600 { 0x01, "Button switch" },
601 { 0x02, "Rocker switch" },
602 { 0x03, "Reserved" },
603
604 { 0, NULL((void*)0) }
605};
606
607/* GP Src ID names. */
608static const value_string zbee_nwk_gp_src_id_names[] = {
609 { ZBEE_NWK_GP_ZGPD_SRCID_ALL0xFFFFFFFF, "All" },
610 { ZBEE_NWK_GP_ZGPD_SRCID_UNKNOWN0x00000000, "Unspecified" },
611
612 { 0, NULL((void*)0) }
613};
614
615/* GP security key type names. */
616static const value_string zbee_nwk_gp_src_sec_keys_type_names[] = {
617 { ZBEE_NWK_GP_SECURITY_KEY_TYPE_NO_KEY0x00, "No key" },
618 { ZBEE_NWK_GP_SECURITY_KEY_TYPE_ZB_NWK_KEY0x01, "ZigBee NWK key" },
619 { ZBEE_NWK_GP_SECURITY_KEY_TYPE_GPD_GROUP_KEY0x02, "GPD group key" },
620 { ZBEE_NWK_GP_SECURITY_KEY_TYPE_NWK_KEY_DERIVED_GPD_KEY_GROUP_KEY0x03, "NWK key derived GPD group key" },
621 { ZBEE_NWK_GP_SECURITY_KEY_TYPE_PRECONFIGURED_INDIVIDUAL_GPD_KEY0x04, "Individual, out of the box GPD key" },
622 { ZBEE_NWK_GP_SECURITY_KEY_TYPE_DERIVED_INDIVIDUAL_GPD_KEY0x07, "Derived individual GPD key" },
623
624 { 0, NULL((void*)0) }
625};
626
627/* GP security levels. */
628static const value_string zbee_nwk_gp_src_sec_levels_names[] = {
629 { ZBEE_NWK_GP_SECURITY_LEVEL_NO0x00, "No security" },
630 { ZBEE_NWK_GP_SECURITY_LEVEL_1LSB0x01, "1 LSB of frame counter and short MIC only" },
631 { ZBEE_NWK_GP_SECURITY_LEVEL_FULL0x02, "Full frame counter and full MIC only" },
632 { ZBEE_NWK_GP_SECURITY_LEVEL_FULLENCR0x03, "Encryption with full frame counter and full MIC" },
633
634 { 0, NULL((void*)0) }
635};
636
637/*************************/
638/* Function definitions. */
639/*************************/
640
641/* UAT record copy callback. */
642static void *
643uat_key_record_copy_cb(void *n, const void *o, size_t siz _U___attribute__((unused)))
644{
645 uat_key_record_t *new_key = (uat_key_record_t *)n;
646 const uat_key_record_t *old_key = (const uat_key_record_t *)o;
647
648 new_key->string = g_strdup(old_key->string)g_strdup_inline (old_key->string);
649 new_key->label = g_strdup(old_key->label)g_strdup_inline (old_key->label);
650
651 return new_key;
652}
653
654/* UAT record free callback. */
655static void
656uat_key_record_free_cb(void *r)
657{
658 uat_key_record_t *key = (uat_key_record_t *)r;
659 g_free(key->string)(__builtin_object_size ((key->string), 0) != ((size_t) - 1
)) ? g_free_sized (key->string, __builtin_object_size ((key
->string), 0)) : (g_free) (key->string)
;
660 g_free(key->label)(__builtin_object_size ((key->label), 0) != ((size_t) - 1)
) ? g_free_sized (key->label, __builtin_object_size ((key->
label), 0)) : (g_free) (key->label)
;
661}
662
663/**
664 *Parses a key string from left to right into a buffer with increasing (normal byte order) or decreasing (reverse
665 *
666 *@param key_str pointer to the string
667 *@param key_buf destination buffer in memory
668 *@param byte_order byte order
669*/
670static bool_Bool
671zbee_gp_security_parse_key(const char *key_str, uint8_t *key_buf, bool_Bool byte_order)
672{
673 bool_Bool string_mode = false0;
674 char temp;
675 int i, j;
676
677 memset(key_buf, 0, ZBEE_SEC_CONST_KEYSIZE16);
678 if (key_str == NULL((void*)0)) {
679 return false0;
680 }
681 if ((temp = *key_str++) == '"') {
682 string_mode = true1;
683 temp = *key_str++;
684 }
685 j = byte_order ? ZBEE_SEC_CONST_KEYSIZE16 - 1 : 0;
686 for (i = ZBEE_SEC_CONST_KEYSIZE16 - 1; i >= 0; i--) {
687 if (string_mode) {
688 if (g_ascii_isprint(temp)((g_ascii_table[(guchar) (temp)] & G_ASCII_PRINT) != 0)) {
689 key_buf[j] = temp;
690 temp = *key_str++;
691 } else {
692 return false0;
693 }
694 } else {
695 if ((temp == ':') || (temp == '-') || (temp == ' ')) {
696 temp = *(key_str++);
697 }
698 if (g_ascii_isxdigit(temp)((g_ascii_table[(guchar) (temp)] & G_ASCII_XDIGIT) != 0)) {
699 key_buf[j] = g_ascii_xdigit_value(temp) << 4;
700 } else {
701 return false0;
702 }
703 temp = *(key_str++);
704 if (g_ascii_isxdigit(temp)((g_ascii_table[(guchar) (temp)] & G_ASCII_XDIGIT) != 0)) {
705 key_buf[j] |= g_ascii_xdigit_value(temp);
706 } else {
707 return false0;
708 }
709 temp = *(key_str++);
710 }
711 if (byte_order) {
712 j--;
713 } else {
714 j++;
715 }
716 }
717 return true1;
718}
719
720/* UAT record update callback. */
721static bool_Bool
722uat_key_record_update_cb(void *r, char **err)
723{
724 uat_key_record_t *rec = (uat_key_record_t *)r;
725
726 if (rec->string == NULL((void*)0)) {
727 *err = g_strdup("Key can't be blank.")g_strdup_inline ("Key can't be blank.");
728 return false0;
729 } else {
730 g_strstrip(rec->string)g_strchomp (g_strchug (rec->string));
731 if (rec->string[0] != 0) {
732 *err = NULL((void*)0);
733 if (!zbee_gp_security_parse_key(rec->string, rec->key, rec->byte_order)) {
734 *err = ws_strdup_printf("Expecting %d hexadecimal bytes or a %d character double-quoted string",wmem_strdup_printf(((void*)0), "Expecting %d hexadecimal bytes or a %d character double-quoted string"
, 16, 16)
735 ZBEE_SEC_CONST_KEYSIZE, ZBEE_SEC_CONST_KEYSIZE)wmem_strdup_printf(((void*)0), "Expecting %d hexadecimal bytes or a %d character double-quoted string"
, 16, 16)
;
736 return false0;
737 }
738 } else {
739 *err = g_strdup("Key can't be blank.")g_strdup_inline ("Key can't be blank.");
740 return false0;
741 }
742 }
743 return true1;
744}
745
746static void uat_key_record_post_update_cb(void) {
747 unsigned i;
748
749 for (i = 0; i < num_uat_key_records; i++) {
750 if (memcmp(gp_uat_key_records[i].key, empty_key, ZBEE_SEC_CONST_KEYSIZE16) == 0) {
751 /* key was not loaded from string yet */
752 zbee_gp_security_parse_key(gp_uat_key_records[i].string, gp_uat_key_records[i].key,
753 gp_uat_key_records[i].byte_order);
754 }
755 }
756}
757
758/**
759 *Fills in ZigBee GP security nonce from the provided packet structure.
760 *
761 *@param packet ZigBee NWK packet.
762 *@param nonce nonce buffer.
763*/
764static void
765zbee_gp_make_nonce(zbee_nwk_green_power_packet *packet, uint8_t *nonce)
766{
767 memset(nonce, 0, ZBEE_SEC_CONST_NONCE_LEN(16 -2 -1));
768
769 /* Source address */
770 if (packet->application_id == ZBEE_NWK_GP_APP_ID_DEFAULT0x00)
771 {
772 if (packet->direction == ZBEE_NWK_GP_FC_EXT_DIRECTION_FROM_ZGPD0x00) {
773 phtoleu32(nonce, packet->source_id);
774 }
775 phtoleu32(nonce+4, packet->source_id);
776 }
777 else if (packet->application_id == ZBEE_NWK_GP_APP_ID_ZGP0x02)
778 {
779 phtoleu64(nonce, packet->ieee_packet_src64);
780 }
781
782 /* Frame counter */
783 phtoleu32(nonce+8, packet->security_frame_counter);
784
785 /* Security control */
786 if ((packet->application_id == ZBEE_NWK_GP_APP_ID_ZGP0x02) &&
787 (packet->direction != ZBEE_NWK_GP_FC_EXT_DIRECTION_FROM_ZGPD0x00)) {
788 nonce[12] = (char)0xc5; /* Security level = 0b101, Key Identifier = 0x00,
789 Extended nonce = 0b0, Reserved = 0b00 */
790 } else {
791 nonce[12] = (char)0x05; /* Security level = 0b101, Key Identifier = 0x00,
792 Extended nonce = 0b0, Reserved = 0b11 */
793 }
794}
795
796/**
797 *Creates a nonce and decrypts secured ZigBee GP payload.
798 *
799 *@param packet ZigBee NWK packet.
800 *@param enc_buffer encoded payload buffer.
801 *@param offset payload offset.
802 *@param dec_buffer decoded payload buffer.
803 *@param payload_len payload length.
804 *@param mic_len MIC length.
805 *@param key key.
806*/
807static bool_Bool
808zbee_gp_decrypt_payload(zbee_nwk_green_power_packet *packet, const uint8_t *enc_buffer, const unsigned offset, uint8_t
809 *dec_buffer, unsigned payload_len, unsigned mic_len, uint8_t *key)
810{
811 uint8_t *key_buffer = key;
812 uint8_t nonce[ZBEE_SEC_CONST_NONCE_LEN(16 -2 -1)];
813
814 zbee_gp_make_nonce(packet, nonce);
815 if (zbee_sec_ccm_decrypt(key_buffer, nonce, enc_buffer, enc_buffer + offset, dec_buffer, offset, payload_len,
816 mic_len)) {
817 return true1;
818 }
819
820 return false0;
821}
822
823/**
824 *Dissector for ZigBee Green Power commissioning.
825 *
826 *@param tvb pointer to buffer containing raw packet.
827 *@param pinfo pointer to packet information fields.
828 *@param tree pointer to data tree Wireshark uses to display packet.
829 *@param packet packet data.
830 *@param offset current payload offset.
831 *@return payload processed offset.
832*/
833static unsigned
834dissect_zbee_nwk_gp_cmd_commissioning(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
835 zbee_nwk_green_power_packet *packet, unsigned offset)
836{
837 uint8_t comm_options;
838 uint8_t comm_ext_options = 0;
839 uint8_t appli_info_options = 0;
840 uint16_t manufacturer_id = 0;
841
842 uint8_t i;
843 uint8_t gpd_cmd_num = 0;
844 proto_item *gpd_cmd_list;
845 proto_tree *gpd_cmd_list_tree;
846
847 uint8_t length_of_clid_list_bm;
848 uint8_t server_clid_num;
849 uint8_t client_clid_num;
850 proto_item *server_clid_list, *client_clid_list;
851 proto_tree *server_clid_list_tree, *client_clid_list_tree;
852 uint8_t switch_info_length;
853 proto_item *switch_info;
854 proto_tree *switch_info_tree;
855
856 void *enc_buffer;
857 uint8_t *enc_buffer_withA;
858 uint8_t *dec_buffer;
859 bool_Bool gp_decrypted;
860 GSList *GSList_i;
861 tvbuff_t *payload_tvb;
862
863 static int * const options[] = {
864 &hf_zbee_nwk_gp_cmd_comm_opt_mac_sec_num_cap,
865 &hf_zbee_nwk_gp_cmd_comm_opt_rx_on_cap,
866 &hf_zbee_nwk_gp_cmd_comm_opt_appli_info_present,
867 &hf_zbee_nwk_gp_cmd_comm_opt_panid_req,
868 &hf_zbee_nwk_gp_cmd_comm_opt_sec_key_req,
869 &hf_zbee_nwk_gp_cmd_comm_opt_fixed_location,
870 &hf_zbee_nwk_gp_cmd_comm_opt_ext_opt,
871 NULL((void*)0)
872 };
873 static int * const ext_options[] = {
874 &hf_zbee_nwk_gp_cmd_comm_ext_opt_sec_level_cap,
875 &hf_zbee_nwk_gp_cmd_comm_ext_opt_key_type,
876 &hf_zbee_nwk_gp_cmd_comm_ext_opt_gpd_key_present,
877 &hf_zbee_nwk_gp_cmd_comm_ext_opt_gpd_key_encr,
878 &hf_zbee_nwk_gp_cmd_comm_ext_opt_outgoing_counter,
879 NULL((void*)0)
880 };
881 static int * const appli_info[] = {
882 &hf_zbee_nwk_gp_cmd_comm_appli_info_mip,
883 &hf_zbee_nwk_gp_cmd_comm_appli_info_mmip,
884 &hf_zbee_nwk_gp_cmd_comm_appli_info_gclp,
885 &hf_zbee_nwk_gp_cmd_comm_appli_info_crp,
886 &hf_zbee_nwk_gp_cmd_comm_appli_info_sip,
887 &hf_zbee_nwk_gp_cmd_comm_appli_info_adcf,
888 &hf_zbee_nwk_gp_cmd_comm_appli_info_res,
889 NULL((void*)0)
890 };
891 static int * const length_of_clid_list[] = {
892 &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_server,
893 &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_client,
894 NULL((void*)0)
895 };
896 static int * const generic_switch_config[] = {
897 &hf_zbee_nwk_gp_cmd_comm_switch_info_num_contacts,
898 &hf_zbee_nwk_gp_cmd_comm_switch_info_switch_type,
899 &hf_zbee_nwk_gp_cmd_comm_switch_info_reserved,
900 NULL((void*)0)
901 };
902
903 /* Get Device ID and display it. */
904 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_device_id, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
905 offset += 1;
906 /* Get Options Field, build subtree and display the results. */
907 comm_options = tvb_get_uint8(tvb, offset);
908 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_comm_opt, ett_zbee_nwk_cmd_options, options, ENC_NA0x00000000);
909 offset += 1;
910
911 if (comm_options & ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_EXT_OPTIONS0x80) {
912 /* Get extended Options Field, build subtree and display the results. */
913 comm_ext_options = tvb_get_uint8(tvb, offset);
914 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_comm_ext_opt, ett_zbee_nwk_cmd_options, ext_options, ENC_NA0x00000000);
915 offset += 1;
916 if (comm_ext_options & ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_GPD_KEY_PRESENT0x20) {
917 /* Get security key and display it. */
918 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_security_key, tvb, offset, ZBEE_SEC_CONST_KEYSIZE16, ENC_NA0x00000000);
919 offset += ZBEE_SEC_CONST_KEYSIZE16;
920
921 /* Key is encrypted */
922 if (comm_ext_options & ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_GPD_KEY_ENCR0x40) {
923 /* Get Security MIC and display it. */
924 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_gpd_sec_key_mic, tvb, offset, 4, ENC_LITTLE_ENDIAN0x80000000);
925 offset += 4;
926
927 if (packet != NULL((void*)0))
928 {
929 /* Decrypt the security key */
930 dec_buffer = (uint8_t *)wmem_alloc(pinfo->pool, ZBEE_SEC_CONST_KEYSIZE16);
931 enc_buffer_withA = (uint8_t *)wmem_alloc(pinfo->pool, 4 + ZBEE_SEC_CONST_KEYSIZE16 + 4); /* CCM* a (this is SrcID) + encKey + MIC */
932 enc_buffer = tvb_memdup(pinfo->pool, tvb, offset - ZBEE_SEC_CONST_KEYSIZE16 - 4, ZBEE_SEC_CONST_KEYSIZE16 + 4);
933 phtoleu32(enc_buffer_withA, packet->source_id);
934 memcpy(enc_buffer_withA+4, enc_buffer, ZBEE_SEC_CONST_KEYSIZE16 + 4);
935 gp_decrypted = false0;
936
937 for (GSList_i = zbee_gp_keyring; GSList_i && !gp_decrypted; GSList_i = g_slist_next(GSList_i)((GSList_i) ? (((GSList *)(GSList_i))->next) : ((void*)0))) {
938 packet->security_frame_counter = packet->source_id; /* for Nonce creation*/
939 gp_decrypted = zbee_gp_decrypt_payload(packet, enc_buffer_withA, 4
940 , dec_buffer, ZBEE_SEC_CONST_KEYSIZE16, 4, ((key_record_t *)(GSList_i->data))->key);
941 }
942
943 if (gp_decrypted) {
944 key_record_t key_record;
945
946 key_record.frame_num = 0;
947 key_record.label = NULL((void*)0);
948 memcpy(key_record.key, dec_buffer, ZBEE_SEC_CONST_KEYSIZE16);
949 zbee_gp_keyring = g_slist_prepend(zbee_gp_keyring, g_memdup2(&key_record, sizeof(key_record_t)));
950
951 payload_tvb = tvb_new_child_real_data(tvb, dec_buffer, ZBEE_SEC_CONST_KEYSIZE16, ZBEE_SEC_CONST_KEYSIZE16);
952 add_new_data_source(pinfo, payload_tvb, "Decrypted security key");
953 }
954 }
955 }
956 else
957 {
958 key_record_t key_record;
959 void *key;
960
961 key_record.frame_num = 0;
962 key_record.label = NULL((void*)0);
963 key = tvb_memdup(pinfo->pool, tvb, offset - ZBEE_SEC_CONST_KEYSIZE16, ZBEE_SEC_CONST_KEYSIZE16);
964 memcpy(key_record.key, key, ZBEE_SEC_CONST_KEYSIZE16);
965 zbee_gp_keyring = g_slist_prepend(zbee_gp_keyring, g_memdup2(&key_record, sizeof(key_record_t)));
966 }
967 }
968
969 if (comm_ext_options & ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_OUT_COUNTER0x80) {
970 /* Get GPD Outgoing Frame Counter and display it. */
971 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_outgoing_counter, tvb, offset, 4, ENC_LITTLE_ENDIAN0x80000000);
972 offset += 4;
973 }
974 }
975 /* Display manufacturer specific data. */
976 if (comm_options & ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_APPLICATION_INFO0x04) {
977 /* Display application information. */
978 appli_info_options = tvb_get_uint8(tvb, offset);
979 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_comm_appli_info, ett_zbee_nwk_cmd_appli_info, appli_info, ENC_NA0x00000000);
980 offset += 1;
981 if (appli_info_options & ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_MIP0x01) {
982 /* Get Manufacturer ID. */
983 proto_tree_add_item_ret_uint16(tree, hf_zbee_nwk_gp_cmd_comm_manufacturer_id, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &manufacturer_id);
984 offset += 2;
985 }
986 if (appli_info_options & ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_MMIP0x02) {
987 /* Get Manufacturer Device ID. */
988 switch (manufacturer_id) {
989 case ZBEE_NWK_GP_MANUF_ID_GREENPEAK0x10D0:
990 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_manufacturer_greenpeak_dev_id, tvb, offset, 2,
991 ENC_LITTLE_ENDIAN0x80000000);
992 offset += 2;
993 break;
994 default:
995 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_manufacturer_dev_id, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
996 offset += 2;
997 break;
998 }
999 }
1000 if (appli_info_options & ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_GCLP0x04) {
1001 /* Get and display number of GPD commands */
1002 proto_tree_add_item_ret_uint8(tree, hf_zbee_nwk_gp_cmd_comm_gpd_cmd_num, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000, &gpd_cmd_num);
1003 offset += 1;
1004 /* Display GPD command list */
1005 if (gpd_cmd_num > 0) {
1006 gpd_cmd_list = proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_gpd_cmd_id_list,
1007 tvb, offset, gpd_cmd_num, ENC_NA0x00000000);
1008 gpd_cmd_list_tree = proto_item_add_subtree(gpd_cmd_list, ett_zbee_nwk_cmd_comm_gpd_cmd_id_list);
1009 for (i = 0; i < gpd_cmd_num; i++, offset++) {
1010 /* Display command id */
1011 proto_tree_add_item(gpd_cmd_list_tree, hf_zbee_nwk_gp_command_id,
1012 tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1013 }
1014 }
1015 }
1016 if (appli_info_options & ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_CRP0x08) {
1017 /* Get and display Cluster List */
1018 length_of_clid_list_bm = tvb_get_uint8(tvb, offset);
1019 server_clid_num = (length_of_clid_list_bm & ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_SRV0x0F) >>
1020 ws_ctz(ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_SRV0x0F);
1021 client_clid_num = (length_of_clid_list_bm & ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_CLI0xF0 ) >>
1022 ws_ctz(ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_CLI0xF0);
1023
1024 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_comm_length_of_clid_list,
1025 ett_zbee_nwk_cmd_comm_length_of_clid_list, length_of_clid_list, ENC_NA0x00000000);
1026 offset += 1;
1027
1028 if (server_clid_num > 0) {
1029 /* Display server cluster list */
1030 server_clid_list = proto_tree_add_item(tree, hf_zbee_nwk_cmd_comm_clid_list_server,
1031 tvb, offset, 2*server_clid_num, ENC_NA0x00000000);
1032 server_clid_list_tree = proto_item_add_subtree(server_clid_list, ett_zbee_nwk_cmd_comm_clid_list_server);
1033 /* Retrieve server clusters */
1034 for (i = 0; i < server_clid_num; i++, offset += 2) {
1035 proto_tree_add_item(server_clid_list_tree, hf_zbee_nwk_cmd_comm_cluster_id,
1036 tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1037 }
1038 }
1039 if (client_clid_num > 0) {
1040 /* Display client cluster list */
1041 client_clid_list = proto_tree_add_item(tree, hf_zbee_nwk_cmd_comm_clid_list_client,
1042 tvb, offset, 2*client_clid_num, ENC_NA0x00000000);
1043 client_clid_list_tree = proto_item_add_subtree(client_clid_list, ett_zbee_nwk_cmd_comm_clid_list_client);
1044 /* Retrieve client clusters */
1045 for (i = 0; i < client_clid_num; i++, offset += 2) {
1046 proto_tree_add_item(client_clid_list_tree, hf_zbee_nwk_cmd_comm_cluster_id,
1047 tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1048 }
1049 }
1050 }
1051 if (appli_info_options & ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_SIP0x10) {
1052 /* Get and display Switch Information. */
1053 switch_info_length = tvb_get_uint8(tvb, offset);
1054 switch_info = proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_switch_info,
1055 tvb, offset, 1 + switch_info_length, ENC_NA0x00000000);
1056 switch_info_tree = proto_item_add_subtree(switch_info, ett_zbee_nwk_cmd_comm_switch_info);
1057 proto_tree_add_item(switch_info_tree, hf_zbee_nwk_gp_cmd_comm_switch_info_length,
1058 tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1059 offset += 1;
1060
1061 if (switch_info_length >= 1) {
1062 proto_tree_add_bitmask(switch_info_tree, tvb, offset,
1063 hf_zbee_nwk_gp_cmd_comm_switch_info_generic_switch_config,
1064 ett_zbee_nwk_cmd_comm_switch_info_generic_switch_config, generic_switch_config, ENC_NA0x00000000);
1065 offset += 1;
1066 }
1067
1068 if (switch_info_length >= ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_INFO_LEN0x02) {
1069 proto_tree_add_item(switch_info_tree,
1070 hf_zbee_nwk_gp_cmd_comm_switch_info_current_contact_status,
1071 tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1072 offset += 1;
1073 }
1074
1075 /* Guard against future spec revisions that may increase Switch info length beyond the currently defined value of 0x02. */
1076 if (switch_info_length > ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_INFO_LEN0x02) {
1077 offset += switch_info_length - ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_INFO_LEN0x02;
1078 }
1079 }
1080 }
1081 return offset;
1082} /* dissect_zbee_nwk_gp_cmd_commissioning */
1083
1084/**
1085 *Dissector for ZigBee Green Power channel request.
1086 *
1087 *@param tvb pointer to buffer containing raw packet.
1088 *@param pinfo pointer to packet information fields.
1089 *@param tree pointer to data tree Wireshark uses to display packet.
1090 *@param packet packet data.
1091 *@param offset current payload offset.
1092 *@return payload processed offset.
1093*/
1094static unsigned
1095dissect_zbee_nwk_gp_cmd_channel_request(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1096 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1097{
1098 static int * const channels[] = {
1099 &hf_zbee_nwk_gp_cmd_channel_request_toggling_behaviour_1st,
1100 &hf_zbee_nwk_gp_cmd_channel_request_toggling_behaviour_2nd,
1101 NULL((void*)0)
1102 };
1103
1104 /* Get Command Options Field, build subtree and display the results. */
1105 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_channel_request_toggling_behaviour, ett_zbee_nwk_cmd_options, channels, ENC_NA0x00000000);
1106 offset += 1;
1107 return offset;
1108} /* dissect_zbee_nwk_gp_cmd_channel_request */
1109
1110/**
1111 * Dissector for ZigBee Green Power Application Description Attribute Records.
1112 *
1113 *@param tvb pointer to buffer containing raw packet.
1114 *@param pinfo pointer to packet information fields.
1115 *@param tree pointer to data tree Wireshark uses to display packet.
1116 *@param packet packet data.
1117 *@param offset current payload offset.
1118 *@param num_attr_recs number of attribute records to parse.
1119 *@return payload processed offset.
1120 */
1121static unsigned
1122dissect_zbee_nwk_gp_report_desc_attr_rec(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1123 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset, unsigned num_attr_recs)
1124{
1125 uint8_t attr_rec_opt, len_remain;
1126 proto_tree *subtree = NULL((void*)0);
1127 unsigned i, end;
1128
1129 static int * const options[] = {
1130 &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt_len_remain,
1131 &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt_reported,
1132 &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt_val_present,
1133 NULL((void*)0)
1134 };
1135
1136 for (i = 0; i < num_attr_recs; i++) {
1137 subtree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_zbee_nwk_cmd_app_desc_att_rec,
1138 NULL((void*)0), "Attribute Record %u", i);
1139
1140 /* Attribute ID */
1141 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_attr_rec_id, tvb, offset,
1142 2, ENC_LITTLE_ENDIAN0x80000000);
1143 offset += 2;
1144
1145 /* Attribute Data Type */
1146 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_attr_rec_data_type, tvb,
1147 offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1148 offset++;
1149
1150 /* Attribute Options */
1151 attr_rec_opt = tvb_get_uint8(tvb, offset);
1152 proto_tree_add_bitmask(subtree, tvb, offset, hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt,
1153 ett_zbee_nwk_cmd_options, options, ENC_NA0x00000000);
1154
1155 /* Extract remaining attribute record length (add 1 since stored value is decremented by 1) */
1156 len_remain = (attr_rec_opt & ZBEE_NWK_GP_CMD_APP_DESC_ATTR_REC_OPT_LEN_REMAIN0x0F) + 1;
1157 offset++;
1158
1159 /* Determine the offset at the end of the packet so we can calculate the attribute value length later */
1160 end = offset + len_remain;
1161
1162 /* Attribute Offset within Report */
1163 if (attr_rec_opt & ZBEE_NWK_GP_CMD_APP_DESC_ATTR_REC_OPT_REPORTED0x10) {
1164 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_attr_rec_offset,
1165 tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1166 offset++;
1167 }
1168
1169 /* Optional Attribute Value */
1170 if (attr_rec_opt & ZBEE_NWK_GP_CMD_APP_DESC_ATTR_REC_OPT_VAL_PRESENT0x20) {
1171 unsigned val_len = end - offset;
1172
1173 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_attr_rec_val,
1174 tvb, offset, val_len, ENC_NA0x00000000);
1175 offset += val_len;
Value stored to 'offset' is never read
1176 }
1177 offset = end;
1178 }
1179
1180 return offset;
1181} /* dissect_zbee_nwk_gp_report_desc_attr_rec */
1182
1183/**
1184 * Dissector for ZigBee Green Power Application Description Data Point Descriptors.
1185 *
1186 *@param tvb pointer to buffer containing raw packet.
1187 *@param pinfo pointer to packet information fields.
1188 *@param tree pointer to data tree Wireshark uses to display packet.
1189 *@param packet packet data.
1190 *@param offset current payload offset.
1191 *@param len_remain remaining length of report descriptor containing data point descriptors
1192 *@return payload processed offset.
1193 */
1194static unsigned
1195dissect_zbee_nwk_gp_report_desc_data_pt_desc(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1196 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset, uint8_t len_remain)
1197{
1198 uint8_t data_pt_opt, raw_recs;
1199 proto_item *ti, *opt_item;
1200 proto_tree *subtree, *mask_tree;
1201 unsigned i = 0;
1202 unsigned end = offset + len_remain;
1203 static int * const options[] = {
1204 /* We are manually adding the 'number of attribute records' field */
1205 &hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt_server,
1206 &hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt_manu_id_present,
1207 NULL((void*)0)
1208 };
1209
1210 while (offset < end)
1211 {
1212 unsigned start_offset = offset;
1213
1214 /* Create the container for this descriptor */
1215 subtree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_zbee_nwk_cmd_app_desc_data_pt_desc,
1216 &ti, "Data Point Descriptor %u", i++);
1217
1218 data_pt_opt = tvb_get_uint8(tvb, offset);
1219 raw_recs = data_pt_opt & ZBEE_NWK_GP_CMD_APP_DESC_DATA_PT_DESC_OPT_ATTR_NUM0x07;
1220
1221 /** Options */
1222 opt_item = proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt,
1223 tvb, offset, 1, ENC_NA0x00000000);
1224
1225 mask_tree = proto_item_add_subtree(opt_item, ett_zbee_nwk_cmd_app_desc_data_pt_options);
1226
1227 proto_tree_add_uint_format_value(mask_tree, hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt_num_recs,
1228 tvb, offset, 1, raw_recs, "%u", raw_recs + 1);
1229
1230 proto_tree_add_bitmask_list(mask_tree, tvb, offset, 1, options, ENC_NA0x00000000);
1231
1232 offset++;
1233
1234 /* Cluster ID */
1235 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_cluster_id,
1236 tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1237 offset += 2;
1238
1239 /* Optional Manufacturer ID */
1240 if (data_pt_opt & ZBEE_NWK_GP_CMD_APP_DESC_DATA_PT_DESC_OPT_MANU_ID_PRESENT0x10) {
1241 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_manu_id,
1242 tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1243 offset += 2;
1244 }
1245
1246 /* Logic for the next function call remains the same */
1247 offset = dissect_zbee_nwk_gp_report_desc_attr_rec(tvb, pinfo, subtree, packet, offset, raw_recs + 1);
1248
1249 if (ti) {
1250 proto_item_set_len(ti, offset - start_offset);
1251 }
1252 }
1253
1254 return offset;
1255} /* dissect_zbee_nwk_gp_report_desc_data_pt_desc */
1256
1257/**
1258 * Dissector for ZigBee Green Power Application Description Report Descriptors.
1259 *
1260 *@param tvb pointer to buffer containing raw packet.
1261 *@param pinfo pointer to packet information fields.
1262 *@param tree pointer to data tree Wireshark uses to display packet.
1263 *@param packet packet data.
1264 *@param offset current payload offset.
1265 *@param num_reports number of report descriptors to parse.
1266 *@return payload processed offset.
1267 */
1268static unsigned
1269dissect_zbee_nwk_gp_report_desc(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1270 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset, unsigned num_reports)
1271{
1272 uint8_t report_opt, len_remain;
1273 proto_tree *subtree = NULL((void*)0);
1274 unsigned i;
1275
1276 static int * const options[] = {
1277 &hf_zbee_nwk_gp_cmd_app_desc_report_desc_opt_timeout_present,
1278 NULL((void*)0)
1279 };
1280
1281 for (i = 0; i < num_reports; i++) {
1282 subtree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_zbee_nwk_cmd_app_desc_report_desc,
1283 NULL((void*)0), "Report Descriptor %u", i);
1284
1285 /* Report Identifier */
1286 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_report_desc_id, tvb,
1287 offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1288 offset++;
1289
1290 /* Report Options */
1291 report_opt = tvb_get_uint8(tvb, offset);
1292 proto_tree_add_bitmask(subtree, tvb, offset, hf_zbee_nwk_gp_cmd_app_desc_report_desc_opt,
1293 ett_zbee_nwk_cmd_options, options, ENC_NA0x00000000);
1294 offset++;
1295
1296 /* Optional Timeout Period */
1297 if (report_opt & ZBEE_NWK_GP_CMD_APP_DESC_REPORT_DESC_OPT_TIMEOUT_PRESENT0x01) {
1298 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_report_desc_timeout,
1299 tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1300 offset += 2;
1301 }
1302
1303 /* Remaining Length */
1304 len_remain = tvb_get_uint8(tvb, offset);
1305 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_app_desc_report_desc_len_remain,
1306 tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1307 offset++;
1308
1309 /* Dissect the data point descriptors */
1310 offset = dissect_zbee_nwk_gp_report_desc_data_pt_desc(tvb, pinfo, subtree, packet, offset, len_remain);
1311 }
1312
1313 return offset;
1314} /* dissect_zbee_nwk_gp_report_desc */
1315
1316
1317/**
1318 * Dissector for ZigBee Green Power Application Description.
1319 *
1320 *@param tvb pointer to buffer containing raw packet.
1321 *@param pinfo pointer to packet information fields.
1322 *@param tree pointer to data tree Wireshark uses to display packet.
1323 *@param packet packet data.
1324 *@param offset current payload offset.
1325 *@return payload processed offset.
1326*/
1327static unsigned
1328dissect_zbee_nwk_gp_cmd_application_desc(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1329 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1330{
1331 uint8_t num_reports;
1332
1333 /* Total number of reports */
1334 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_app_desc_total_report, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1335 offset++;
1336
1337 /* Number of reports */
1338 num_reports = tvb_get_uint8(tvb, offset);
1339 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_app_desc_num_report, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1340 offset++;
1341
1342 /* Dissect the report descriptors */
1343 offset = dissect_zbee_nwk_gp_report_desc(tvb, pinfo, tree, packet, offset, num_reports);
1344
1345 return offset;
1346} /* dissect_zbee_nwk_gp_cmd_application_desc */
1347
1348/**
1349 *Dissector for ZigBee Green Power channel configuration.
1350 *
1351 *@param tvb pointer to buffer containing raw packet.
1352 *@param pinfo pointer to packet information fields.
1353 *@param tree pointer to data tree Wireshark uses to display packet.
1354 *@param packet packet data.
1355 *@param offset current payload offset.
1356 *@return payload processed offset.
1357*/
1358static unsigned
1359dissect_zbee_nwk_gp_cmd_channel_configuration(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1360 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1361{
1362 static int * const channels[] = {
1363 &hf_zbee_nwk_gp_cmd_channel_configuration,
1364 NULL((void*)0)
1365 };
1366
1367 /* Get Command Options Field, build subtree and display the results. */
1368 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_operational_channel, ett_zbee_nwk_cmd_options, channels, ENC_NA0x00000000);
1369
1370 offset += 1;
1371 return offset;
1372} /* dissect_zbee_nwk_gp_cmd_channel_configuration */
1373
1374/**
1375 *Dissector for ZigBee Green Power commands attrib reporting.
1376 *
1377 *@param tvb pointer to buffer containing raw packet.
1378 *@param pinfo pointer to packet information fields.
1379 *@param tree pointer to data tree Wireshark uses to display packet.
1380 *@param packet packet data.
1381 *@param offset current payload offset.
1382 *@param mfr_code manufacturer code.
1383 *@return payload processed offset.
1384*/
1385static unsigned
1386dissect_zbee_nwk_gp_cmd_attr_reporting(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1387 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset, uint16_t mfr_code)
1388{
1389 uint16_t cluster_id;
1390 proto_tree *field_tree;
1391
1392 /* Get cluster ID and add it into the tree. */
1393 proto_tree_add_item_ret_uint16(tree, hf_zbee_nwk_gp_zcl_attr_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &cluster_id);
1394
1395 offset += 2;
1396 /* Create subtree and parse ZCL Write Attribute Payload. */
1397 field_tree = proto_tree_add_subtree_format(tree, tvb, offset, 2, ett_zbee_nwk_cmd_options, NULL((void*)0),
1398 "Attribute reporting command for cluster: 0x%04X", cluster_id);
1399
1400 dissect_zcl_report_attr(tvb, pinfo, field_tree, &offset, cluster_id, mfr_code, ZBEE_ZCL_FCF_TO_CLIENT0x01);
1401
1402 return offset;
1403} /* dissect_zbee_nwk_gp_cmd_attr_reporting */
1404
1405
1406/**
1407 * Dissector for ZigBee Green Power manufacturer specific attribute reporting.
1408 *
1409 *@param tvb pointer to buffer containing raw packet.
1410 *@param pinfo pointer to packet information fields.
1411 *@param tree pointer to data tree Wireshark uses to display packet.
1412 *@param packet packet data.
1413 *@param offset current payload offset.
1414 *@return payload processed offset.
1415 */
1416static unsigned
1417dissect_zbee_nwk_gp_cmd_MS_attr_reporting(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1418 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1419{
1420 uint16_t mfr_code;
1421
1422 /*dissect manufacturer ID*/
1423 proto_tree_add_item_ret_uint16(tree, hf_zbee_zcl_gp_cmd_ms_manufacturer_code, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &mfr_code);
1424 offset += 2;
1425
1426 offset = dissect_zbee_nwk_gp_cmd_attr_reporting(tvb, pinfo, tree, packet, offset, mfr_code);
1427
1428 return offset;
1429}/*dissect_zbee_nwk_gp_cmd_MS_attr_reporting*/
1430
1431
1432
1433
1434/**
1435 *Dissector for ZigBee Green Power commissioning reply.
1436 *
1437 *@param tvb pointer to buffer containing raw packet.
1438 *@param pinfo pointer to packet information fields.
1439 *@param tree pointer to data tree Wireshark uses to display packet.
1440 *@param packet packet data.
1441 *@param offset current payload offset.
1442 *@return payload processed offset.
1443*/
1444static unsigned
1445dissect_zbee_nwk_gp_cmd_commissioning_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
1446 zbee_nwk_green_power_packet *packet, unsigned offset)
1447{
1448 uint8_t cr_options;
1449 uint8_t cr_sec_level;
1450
1451 void *enc_buffer;
1452 uint8_t *enc_buffer_withA;
1453 uint8_t *dec_buffer;
1454 bool_Bool gp_decrypted;
1455 GSList *GSList_i;
1456 tvbuff_t *payload_tvb;
1457
1458 static int * const options[] = {
1459 &hf_zbee_nwk_gp_cmd_comm_rep_opt_panid_present,
1460 &hf_zbee_nwk_gp_cmd_comm_rep_opt_sec_key_present,
1461 &hf_zbee_nwk_gp_cmd_comm_rep_opt_key_encr,
1462 &hf_zbee_nwk_gp_cmd_comm_rep_opt_sec_level,
1463 &hf_zbee_nwk_gp_cmd_comm_rep_opt_sec_type,
1464 NULL((void*)0)
1465 };
1466
1467 /* Get Options Field, build subtree and display the results. */
1468 cr_options = tvb_get_uint8(tvb, offset);
1469 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_comm_rep_opt, ett_zbee_nwk_cmd_options, options, ENC_NA0x00000000);
1470 offset += 1;
1471
1472 /* Parse and display security Pan ID value. */
1473 if (cr_options & ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_PAN_ID_PRESENT0x01) {
1474 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_rep_pan_id, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1475 offset += 2;
1476 }
1477
1478 cr_sec_level = (cr_options & ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_LEVEL0x18) >>
1479 ws_ctz(ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_LEVEL0x18);
1480
1481 /* Parse and display security key. */
1482 if (cr_options & ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_KEY_PRESENT0x02) {
1483 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_security_key, tvb, offset, ZBEE_SEC_CONST_KEYSIZE16, ENC_NA0x00000000);
1484 offset += ZBEE_SEC_CONST_KEYSIZE16;
1485
1486 /* Key is present clear, add to the key ring */
1487 if (!(cr_options & ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_KEY_ENCR0x04)) {
1488 key_record_t key_record;
1489 void *key;
1490
1491 key_record.frame_num = 0;
1492 key_record.label = NULL((void*)0);
1493 key = tvb_memdup(pinfo->pool, tvb, offset - ZBEE_SEC_CONST_KEYSIZE16, ZBEE_SEC_CONST_KEYSIZE16);
1494 memcpy(key_record.key, key, ZBEE_SEC_CONST_KEYSIZE16);
1495 zbee_gp_keyring = g_slist_prepend(zbee_gp_keyring, g_memdup2(&key_record, sizeof(key_record_t)));
1496 }
1497 }
1498 /* Parse and display security MIC. */
1499 if ((cr_options & ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_KEY_ENCR0x04) &&
1500 (cr_options & ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_KEY_PRESENT0x02)) {
1501 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_gpd_sec_key_mic, tvb, offset, 4, ENC_LITTLE_ENDIAN0x80000000);
1502 offset += 4;
1503 }
1504
1505 /* Parse and display Frame Counter and decrypt key */
1506 if ((cr_options & ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_KEY_ENCR0x04) &&
1507 (cr_options & ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_KEY_PRESENT0x02) &&
1508 ((cr_sec_level == ZBEE_NWK_GP_SECURITY_LEVEL_FULL0x02) ||
1509 (cr_sec_level == ZBEE_NWK_GP_SECURITY_LEVEL_FULLENCR0x03))) {
1510 if (offset + 4 <= tvb_captured_length(tvb)){
1511 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_rep_frame_counter, tvb, offset, 4, ENC_LITTLE_ENDIAN0x80000000);
1512 offset += 4;
1513
1514 if (packet != NULL((void*)0))
1515 {
1516 /* decrypt the security key*/
1517 dec_buffer = (uint8_t *)wmem_alloc(pinfo->pool, ZBEE_SEC_CONST_KEYSIZE16);
1518 enc_buffer_withA = (uint8_t *)wmem_alloc(pinfo->pool, 4 + ZBEE_SEC_CONST_KEYSIZE16 + 4); /* CCM* a (this is SrcID) + encKey + MIC */
1519 enc_buffer = tvb_memdup(pinfo->pool, tvb, offset - ZBEE_SEC_CONST_KEYSIZE16 - 4 - 4, ZBEE_SEC_CONST_KEYSIZE16 + 4);
1520 phtoleu32(enc_buffer_withA, packet->source_id); /* enc_buffer_withA = CCM* a (srcID) | enc_buffer */
1521 memcpy(enc_buffer_withA+4, enc_buffer, ZBEE_SEC_CONST_KEYSIZE16 + 4);
1522 gp_decrypted = false0;
1523
1524 for (GSList_i = zbee_gp_keyring; GSList_i && !gp_decrypted; GSList_i = g_slist_next(GSList_i)((GSList_i) ? (((GSList *)(GSList_i))->next) : ((void*)0))) {
1525 packet->security_frame_counter = tvb_get_uint32(tvb, offset - 4, ENC_LITTLE_ENDIAN0x80000000); /*for Nonce creation */
1526 gp_decrypted = zbee_gp_decrypt_payload(packet, enc_buffer_withA, 4
1527 , dec_buffer, ZBEE_SEC_CONST_KEYSIZE16, 4, ((key_record_t *)(GSList_i->data))->key);
1528 }
1529
1530 if (gp_decrypted) {
1531 key_record_t key_record;
1532
1533 key_record.frame_num = 0;
1534 key_record.label = NULL((void*)0);
1535 memcpy(key_record.key, dec_buffer, ZBEE_SEC_CONST_KEYSIZE16);
1536 zbee_gp_keyring = g_slist_prepend(zbee_gp_keyring, g_memdup2(&key_record, sizeof(key_record_t)));
1537
1538 payload_tvb = tvb_new_child_real_data(tvb, dec_buffer, ZBEE_SEC_CONST_KEYSIZE16, ZBEE_SEC_CONST_KEYSIZE16);
1539 add_new_data_source(pinfo, payload_tvb, "Decrypted security key");
1540 }
1541 }
1542 }
1543 else{
1544 /* This field is new in 2016 specification, older implementation may exist without it */
1545 proto_tree_add_expert_remaining(tree, pinfo, &ei_zbee_nwk_gp_com_rep_no_out_cnt, tvb, 0);
1546 }
1547 }
1548 return offset;
1549} /* dissect_zbee_nwk_gp_cmd_commissioning_reply */
1550
1551/**
1552 * Dissector for ZigBee Green Power read attributes and request attributes commands.
1553 *
1554 *@param tvb pointer to buffer containing raw packet.
1555 *@param pinfo pointer to packet information fields.
1556 *@param tree pointer to data tree Wireshark uses to display packet.
1557 *@param packet packet data.
1558 *@param offset current payload offset.
1559 *@return payload processed offset.
1560 */
1561static unsigned
1562dissect_zbee_nwk_gp_cmd_read_attributes(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1563 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1564{
1565 uint8_t cr_options = 0;
1566 proto_tree *subtree = NULL((void*)0);
1567 uint16_t cluster_id;
1568 uint16_t mfr_code = ZBEE_MFG_CODE_NONE0x0000;
1569 uint8_t record_list_len;
1570 unsigned tvb_len;
1571 uint8_t i;
1572
1573 static int * const options[] = {
1574 &hf_zbee_nwk_gp_cmd_read_att_opt_multi_rec,
1575 &hf_zbee_nwk_gp_cmd_read_att_opt_man_field_present,
1576 NULL((void*)0)
1577 };
1578
1579 /* Get Options Field, build subtree and display the results. */
1580 cr_options = tvb_get_uint8(tvb, offset);
1581 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_read_att_opt, ett_zbee_nwk_cmd_options, options, ENC_NA0x00000000);
1582
1583 offset += 1;
1584 /* Parse and display manufacturer ID value. */
1585 if (cr_options & ZBEE_NWK_GP_CMD_READ_ATTRIBUTE_OPT_MAN_FIELD_PRESENT0x02) {
1586 proto_tree_add_item_ret_uint16(tree, hf_zbee_zcl_gp_cmd_ms_manufacturer_code, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &mfr_code);
1587 offset += 2;
1588 }
1589
1590 tvb_len = tvb_captured_length(tvb);
1591 while (offset < tvb_len)
1592 {
1593 /* Create subtree and parse attributes list. */
1594 subtree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_zbee_nwk_clu_rec, NULL((void*)0), "Cluster Record Request");
1595
1596 /* Get cluster ID and add it into the subtree. */
1597 proto_tree_add_item_ret_uint16(subtree, hf_zbee_nwk_gp_zcl_attr_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &cluster_id);
1598 offset += 2;
1599 /* Get length of record list (number of attributes * 2). */
1600 proto_tree_add_item_ret_uint8(subtree, hf_zbee_nwk_gp_cmd_read_att_record_len, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000, &record_list_len);
1601 offset += 1;
1602
1603 for(i=0 ; i<record_list_len ; i+=2)
1604 {
1605 /* Dissect the attribute identifier */
1606 dissect_zcl_attr_id(tvb, subtree, &offset, cluster_id, mfr_code, ZBEE_ZCL_FCF_TO_CLIENT0x01);
1607 }
1608 }
1609 return offset;
1610} /* dissect_zbee_nwk_gp_cmd_read_attributes */
1611/**
1612 * Dissector for ZigBee Green Power write attributes commands.
1613 *
1614 *@param tvb pointer to buffer containing raw packet.
1615 *@param pinfo pointer to packet information fields.
1616 *@param tree pointer to data tree Wireshark uses to display packet.
1617 *@param packet packet data.
1618 *@param offset current payload offset.
1619 *@return payload processed offset.
1620 */
1621static unsigned
1622dissect_zbee_nwk_gp_cmd_write_attributes(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
1623 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1624{
1625 uint8_t cr_options = 0;
1626 proto_tree *subtree = NULL((void*)0);
1627 proto_tree *att_tree = NULL((void*)0);
1628 uint16_t mfr_code = ZBEE_MFG_CODE_NONE0x0000;
1629 uint16_t cluster_id;
1630 uint8_t record_list_len;
1631 unsigned tvb_len;
1632 uint16_t attr_id;
1633 unsigned end_byte;
1634 //uint8_t i;
1635
1636 static int * const options[] = {
1637 &hf_zbee_nwk_gp_cmd_read_att_opt_multi_rec,
1638 &hf_zbee_nwk_gp_cmd_read_att_opt_man_field_present,
1639 NULL((void*)0)
1640 };
1641
1642 /* Get Options Field, build subtree and display the results. */
1643 cr_options = tvb_get_uint8(tvb, offset);
1644 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_read_att_opt, ett_zbee_nwk_cmd_options, options, ENC_NA0x00000000);
1645
1646 offset += 1;
1647 /* Parse and display manufacturer ID value. */
1648 if (cr_options & ZBEE_NWK_GP_CMD_READ_ATTRIBUTE_OPT_MAN_FIELD_PRESENT0x02) {
1649 proto_tree_add_item_ret_uint16(tree, hf_zbee_zcl_gp_cmd_ms_manufacturer_code, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &mfr_code);
1650 offset += 2;
1651 }
1652
1653 tvb_len = tvb_captured_length(tvb);
1654 while (offset < tvb_len)
1655 {
1656 /* Create subtree and parse attributes list. */
1657 subtree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_zbee_nwk_clu_rec, NULL((void*)0), "Write Cluster Record");
1658
1659 /* Get cluster ID and add it into the subtree. */
1660 proto_tree_add_item_ret_uint16(subtree, hf_zbee_nwk_gp_zcl_attr_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &cluster_id);
1661 offset += 2;
1662 /* Get length of record list. */
1663 record_list_len = tvb_get_uint8(tvb, offset);
1664 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_read_att_record_len, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1665 offset += 1;
1666
1667 end_byte = offset + record_list_len;
1668 while ( offset < end_byte)
1669 {
1670 /* Create subtree for attribute status field */
1671 att_tree = proto_tree_add_subtree_format(subtree, tvb, offset, 0, ett_zbee_nwk_att_rec, NULL((void*)0), "Write Attribute record");
1672
1673 /* Dissect the attribute identifier */
1674 attr_id = tvb_get_letohs(tvb, offset);
1675 dissect_zcl_attr_id(tvb, att_tree, &offset, cluster_id, mfr_code, ZBEE_ZCL_FCF_TO_CLIENT0x01);
1676
1677 /* Dissect the attribute data type and data */
1678 dissect_zcl_attr_data_type_val(tvb, pinfo, att_tree, &offset, attr_id, cluster_id, mfr_code, ZBEE_ZCL_FCF_TO_CLIENT0x01);
1679 }
1680 }
1681 return offset;
1682} /* dissect_zbee_nwk_gp_cmd_write_attributes */
1683
1684
1685/**
1686 * Dissector for ZigBee Green Power read attribute response command.
1687 *
1688 *@param tvb pointer to buffer containing raw packet.
1689 *@param pinfo pointer to packet information fields.
1690 *@param tree pointer to data tree Wireshark uses to display packet.
1691 *@param packet packet data.
1692 *@param offset current payload offset.
1693 *@return payload processed offset.
1694 */
1695static unsigned
1696dissect_zbee_nwk_gp_cmd_read_attributes_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
1697 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1698{
1699 uint8_t cr_options;
1700 proto_tree *subtree = NULL((void*)0);
1701 proto_tree *att_tree = NULL((void*)0);
1702 uint16_t cluster_id;
1703 uint16_t attr_id;
1704 uint16_t mfr_code = ZBEE_MFG_CODE_NONE0x0000;
1705 uint8_t record_list_len;
1706 unsigned tvb_len;
1707 unsigned end_byte;
1708
1709 static int * const options[] = {
1710 &hf_zbee_nwk_gp_cmd_read_att_opt_multi_rec,
1711 &hf_zbee_nwk_gp_cmd_read_att_opt_man_field_present,
1712 NULL((void*)0)
1713 };
1714
1715 /* Get Options Field, build subtree and display the results. */
1716 cr_options = tvb_get_uint8(tvb, offset);
1717 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_read_att_opt, ett_zbee_nwk_cmd_options, options, ENC_NA0x00000000);
1718 offset += 1;
1719
1720 /* Parse and display manufacturer ID value. */
1721 if (cr_options & ZBEE_NWK_GP_CMD_READ_ATTRIBUTE_OPT_MAN_FIELD_PRESENT0x02) {
1722 proto_tree_add_item_ret_uint16(tree, hf_zbee_zcl_gp_cmd_ms_manufacturer_code, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &mfr_code);
1723 offset += 2;
1724 }
1725
1726 tvb_len = tvb_captured_length(tvb);
1727 while (offset < tvb_len)
1728 {
1729 /* Create subtree and parse attributes list. */
1730 subtree = proto_tree_add_subtree_format(tree, tvb, offset,0, ett_zbee_nwk_clu_rec, NULL((void*)0), "Cluster record");
1731
1732 /* Get cluster ID and add it into the subtree. */
1733 proto_tree_add_item_ret_uint16(subtree, hf_zbee_nwk_gp_zcl_attr_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &cluster_id);
1734 offset += 2;
1735 /* Get length of record list in bytes. */
1736 record_list_len = tvb_get_uint8(tvb, offset);
1737 proto_tree_add_item(subtree, hf_zbee_nwk_gp_cmd_read_att_record_len, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1738 offset += 1;
1739
1740 end_byte = offset + record_list_len;
1741 while ( offset < end_byte)
1742 {
1743 /* Create subtree for attribute status field */
1744 /* TODO ett_ could be an array to permit not to unroll all always */
1745 att_tree = proto_tree_add_subtree_format(subtree, tvb, offset, 0, ett_zbee_nwk_att_rec, NULL((void*)0), "Read Attribute record");
1746
1747 /* Dissect the attribute identifier */
1748 attr_id = tvb_get_letohs(tvb, offset);
1749 dissect_zcl_attr_id(tvb, att_tree, &offset, cluster_id, mfr_code, ZBEE_ZCL_FCF_TO_CLIENT0x01);
1750
1751 /* Dissect the status and optionally the data type and value */
1752 if (dissect_zcl_attr_uint8(tvb, att_tree, &offset, &hf_zbee_nwk_gp_zcl_attr_status)
1753 == ZBEE_ZCL_STAT_SUCCESS0x00)
1754 {
1755 /* Dissect the attribute data type and data */
1756 dissect_zcl_attr_data_type_val(tvb, pinfo, att_tree, &offset, attr_id, cluster_id, mfr_code, ZBEE_ZCL_FCF_TO_CLIENT0x01);
1757 }
1758 else
1759 {
1760 /* Data type field is always present (not like in ZCL read attribute response command) */
1761 dissect_zcl_attr_data(tvb, pinfo, att_tree, &offset,
1762 dissect_zcl_attr_uint8(tvb, att_tree, &offset, &hf_zbee_nwk_gp_zcl_attr_data_type), ZBEE_ZCL_FCF_TO_CLIENT0x01 );
1763 }
1764 }
1765 }
1766 return offset;
1767} /* dissect_zbee_nwk_gp_cmd_read_attributes_response */
1768
1769/**
1770 * Dissector for ZigBee Green Power ZCL tunneling command.
1771 *
1772 *@param tvb pointer to buffer containing raw packet.
1773 *@param pinfo pointer to packet information fields.
1774 *@param tree pointer to data tree Wireshark uses to display packet.
1775 *@param packet packet data.
1776 *@param offset current payload offset.
1777 *@return payload processed offset.
1778 */
1779static unsigned
1780dissect_zbee_nwk_gp_cmd_zcl_tunneling(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1781 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1782{
1783 uint8_t tun_options;
1784
1785 static int * const options[] = {
1786 &hf_zbee_nwk_gp_cmd_zcl_tunnel_opt_frame_type,
1787 &hf_zbee_nwk_gp_cmd_zcl_tunnel_opt_man_field_present,
1788 &hf_zbee_nwk_gp_cmd_zcl_tunnel_opt_direction,
1789 NULL((void*)0)
1790 };
1791
1792 /* Get Options Field, build subtree and display the results. */
1793 tun_options = tvb_get_uint8(tvb, offset);
1794 proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_zcl_tunnel_opt, ett_zbee_nwk_cmd_options, options, ENC_NA0x00000000);
1795 offset += 1;
1796
1797 /* Parse and display manufacturer ID value. */
1798 if (tun_options & ZBEE_NWK_GP_CMD_ZCL_TUNNEL_OPT_MAN_FIELD_PRESENT0x04) {
1799 proto_tree_add_item(tree, hf_zbee_zcl_gp_cmd_ms_manufacturer_code, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1800 offset += 2;
1801 }
1802
1803 proto_tree_add_item(tree, hf_zbee_nwk_gp_zcl_attr_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1804 offset += 2;
1805
1806 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_zcl_tunnel_command_id, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1807 offset += 1;
1808
1809 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_zcl_tunnel_payload_len, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1810 offset += 1;
1811
1812 /* We're not parsing the ZCL payload, as it's non-trivial and will require a lot of refactoring of the
1813 * ZCL data parsers to make work. For now, let it just show up as raw data. */
1814
1815 return offset;
1816} /* dissect_zbee_nwk_gp_cmd_zcl_tunneling */
1817
1818/**
1819 * Dissector for ZigBee Green Power Compact Attribute Reporting command.
1820 *
1821 *@param tvb pointer to buffer containing raw packet.
1822 *@param pinfo pointer to packet information fields.
1823 *@param tree pointer to data tree Wireshark uses to display packet.
1824 *@param packet packet data.
1825 *@param offset current payload offset.
1826 *@return payload processed offset.
1827 */
1828static unsigned
1829dissect_zbee_nwk_gp_cmd_compact_attr_report(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1830 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1831{
1832 int len_remaining;
1833
1834 /* Report Identifier */
1835 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_compact_attr_report_report_id, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1836 offset++;
1837
1838 /* Data points */
1839 len_remaining = tvb_reported_length_remaining(tvb, offset);
1840 if (len_remaining > 0) {
1841 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_compact_attr_report_data_points,
1842 tvb, offset, len_remaining, ENC_NA0x00000000);
1843 offset += len_remaining;
1844 }
1845
1846 return offset;
1847} /* dissect_zbee_nwk_gp_cmd_compact_attr_report */
1848
1849/**
1850 *Dissector for ZigBee Green Power multi-cluster reporting command.
1851 *
1852 *@param tvb pointer to buffer containing raw packet.
1853 *@param pinfo pointer to packet information fields.
1854 *@param tree pointer to data tree Wireshark uses to display packet.
1855 *@param packet packet data.
1856 *@param offset current payload offset.
1857 *@param mfr_code manufacturer code.
1858 *@return payload processed offset.
1859 */
1860static unsigned
1861dissect_zbee_nwk_gp_cmd_multi_cluster_reporting(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1862 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset, uint16_t mfr_code)
1863{
1864 proto_tree *subtree = NULL((void*)0);
1865 uint16_t cluster_id;
1866 uint16_t attr_id;
1867 unsigned tvb_len;
1868
1869 tvb_len = tvb_captured_length(tvb);
1870 while (offset < tvb_len)
1871 {
1872 /* Create subtree and parse attributes list. */
1873 subtree = proto_tree_add_subtree_format(tree, tvb, offset, 0, ett_zbee_nwk_clu_rec, NULL((void*)0), "Cluster record"); //TODO for cluster %% blabla
1874
1875 /* Get cluster ID and add it into the subtree. */
1876 proto_tree_add_item_ret_uint16(subtree, hf_zbee_nwk_gp_zcl_attr_cluster_id, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &cluster_id);
1877 offset += 2;
1878
1879 /* Dissect the attribute identifier */
1880 attr_id = tvb_get_letohs(tvb, offset);
1881 dissect_zcl_attr_id(tvb, subtree, &offset, cluster_id, mfr_code, ZBEE_ZCL_FCF_TO_CLIENT0x01);
1882
1883 /* Dissect the attribute data type and data */
1884 dissect_zcl_attr_data_type_val(tvb, pinfo, subtree, &offset, attr_id, cluster_id, mfr_code, ZBEE_ZCL_FCF_TO_CLIENT0x01);
1885 // TODO how to dissect when data type is different from expected one for this attribute ? this shouldn't happen
1886 }
1887 return offset;
1888} /* dissect_zbee_nwk_gp_cmd_multi_cluster_reporting */
1889
1890
1891/**
1892 *Dissector for ZigBee Green Power commands manufacturer specific attrib reporting.
1893 *
1894 *@param tvb pointer to buffer containing raw packet.
1895 *@param pinfo pointer to packet information fields.
1896 *@param tree pointer to data tree Wireshark uses to display packet.
1897 *@param packet packet data.
1898 *@param offset current payload offset.
1899 *@return payload processed offset.
1900 */
1901static unsigned
1902dissect_zbee_nwk_gp_cmd_MS_multi_cluster_reporting(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1903 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1904{
1905 uint16_t mfr_code;
1906
1907 /*dissect manufacturer ID*/
1908 proto_tree_add_item_ret_uint16(tree, hf_zbee_zcl_gp_cmd_ms_manufacturer_code, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000, &mfr_code);
1909 offset += 2;
1910
1911 offset = dissect_zbee_nwk_gp_cmd_multi_cluster_reporting(tvb, pinfo, tree, packet, offset, mfr_code);
1912
1913 return offset;
1914}/*dissect_zbee_nwk_gp_cmd_MS_multi_cluster_reporting*/
1915
1916/**
1917 *Dissector for ZigBee Green Power Move Color.
1918 *
1919 *@param tvb pointer to buffer containing raw packet.
1920 *@param pinfo pointer to packet information fields.
1921 *@param tree pointer to data tree Wireshark uses to display packet.
1922 *@param packet packet data.
1923 *@param offset current payload offset.
1924 *@return payload processed offset.
1925*/
1926static unsigned
1927dissect_zbee_nwk_gp_cmd_move_color(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1928 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1929{
1930 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_move_color_ratex, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1931 offset += 2;
1932 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_move_color_ratey, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1933 offset += 2;
1934 return offset;
1935} /* dissect_zbee_nwk_gp_cmd_move_color */
1936
1937/**
1938 *Dissector for ZigBee Green Power Move Up/Down.
1939 *
1940 *@param tvb pointer to buffer containing raw packet.
1941 *@param pinfo pointer to packet information fields.
1942 *@param tree pointer to data tree Wireshark uses to display packet.
1943 *@param packet packet data.
1944 *@param offset current payload offset.
1945 *@return payload processed offset.
1946*/
1947static unsigned
1948dissect_zbee_nwk_gp_cmd_move_up_down(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1949 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1950{
1951 /* Optional rate field. */
1952 if (tvb_reported_length(tvb) - offset >= 1) {
1953 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_move_up_down_rate, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
1954 offset += 1;
1955 }
1956 return offset;
1957} /* dissect_zbee_nwk_gp_cmd_move_up_down */
1958
1959/**
1960 *Dissector for ZigBee Green Power Step Color.
1961 *
1962 *@param tvb pointer to buffer containing raw packet.
1963 *@param pinfo pointer to packet information fields.
1964 *@param tree pointer to data tree Wireshark uses to display packet.
1965 *@param packet packet data.
1966 *@param offset current payload offset.
1967 *@return payload processed offset.
1968*/
1969static unsigned
1970dissect_zbee_nwk_gp_cmd_step_color(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1971 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1972{
1973 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_step_color_stepx, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1974 offset += 2;
1975 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_step_color_stepy, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1976 offset += 2;
1977 /* Optional time field. */
1978 if (tvb_reported_length(tvb) - offset >= 2) {
1979 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_step_color_transition_time, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
1980 offset += 2;
1981 }
1982 return offset;
1983} /* dissect_zbee_nwk_gp_cmd_step_color */
1984
1985/**
1986 *Dissector for ZigBee Green Power Step Up/Down.
1987 *
1988 *@param tvb pointer to buffer containing raw packet.
1989 *@param pinfo pointer to packet information fields.
1990 *@param tree pointer to data tree Wireshark uses to display packet.
1991 *@param packet packet data.
1992 *@param offset current payload offset.
1993 *@return payload processed offset.
1994*/
1995static unsigned
1996dissect_zbee_nwk_gp_cmd_step_up_down(tvbuff_t *tvb, packet_info *pinfo _U___attribute__((unused)), proto_tree *tree,
1997 zbee_nwk_green_power_packet *packet _U___attribute__((unused)), unsigned offset)
1998{
1999 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_step_up_down_step_size, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
2000 offset += 1;
2001 /* Optional time field. */
2002 if (tvb_reported_length(tvb) - offset >= 2) {
2003 proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_step_up_down_transition_time, tvb, offset, 2, ENC_LITTLE_ENDIAN0x80000000);
2004 offset += 2;
2005 }
2006 return offset;
2007} /* dissect_zbee_nwk_gp_cmd_step_up_down */
2008
2009/**
2010 *Dissector for ZigBee Green Power commands.
2011 *
2012 *@param tvb pointer to buffer containing raw packet.
2013 *@param pinfo pointer to packet information fields.
2014 *@param tree pointer to data tree Wireshark uses to display packet.
2015 *@param data raw packet private data.
2016 *@return payload processed offset
2017*/
2018static int
2019dissect_zbee_nwk_gp_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
2020{
2021 unsigned offset = 0;
2022 uint8_t cmd_id = tvb_get_uint8(tvb, offset);
2023 proto_item *cmd_root;
2024 proto_tree *cmd_tree;
2025 zbee_nwk_green_power_packet *packet = (zbee_nwk_green_power_packet *)data;
2026
2027 /* Create a subtree for the command. */
2028 cmd_tree = proto_tree_add_subtree_format(tree, tvb, offset, -1, ett_zbee_nwk_cmd, &cmd_root,
2029 "Command Frame: %s", val_to_str_ext_const(cmd_id,
2030 &zbee_nwk_gp_cmd_names_ext,
2031 "Unknown Command Frame"));
2032 /* Add the command ID. */
2033 proto_tree_add_uint(cmd_tree, hf_zbee_nwk_gp_command_id, tvb, offset, 1, cmd_id);
2034
2035 offset += 1;
2036 /* Add the command name to the info column. */
2037 col_set_str(pinfo->cinfo, COL_INFO, val_to_str_ext_const(cmd_id, &zbee_nwk_gp_cmd_names_ext, "Unknown command"));
2038 /* Handle the command for one of the following devices:
2039 * - Door Lock Controller (IDs: 0x50 - 0x51);
2040 * - GP Flow Sensor (IDs: 0xE0, 0xA0 - 0xA3);
2041 * - GP Temperature Sensor (IDs: 0xE0, 0xA0 - 0xA3); */
2042 switch(cmd_id) {
2043 /* Payloadless GPDF commands sent by GPD. */
2044 case ZB_GP_CMD_ID_IDENTIFY:
2045 case ZB_GP_CMD_ID_RECALL_SCENE0:
2046 case ZB_GP_CMD_ID_RECALL_SCENE1:
2047 case ZB_GP_CMD_ID_RECALL_SCENE2:
2048 case ZB_GP_CMD_ID_RECALL_SCENE3:
2049 case ZB_GP_CMD_ID_RECALL_SCENE4:
2050 case ZB_GP_CMD_ID_RECALL_SCENE5:
2051 case ZB_GP_CMD_ID_RECALL_SCENE6:
2052 case ZB_GP_CMD_ID_RECALL_SCENE7:
2053 case ZB_GP_CMD_ID_STORE_SCENE0:
2054 case ZB_GP_CMD_ID_STORE_SCENE1:
2055 case ZB_GP_CMD_ID_STORE_SCENE2:
2056 case ZB_GP_CMD_ID_STORE_SCENE3:
2057 case ZB_GP_CMD_ID_STORE_SCENE4:
2058 case ZB_GP_CMD_ID_STORE_SCENE5:
2059 case ZB_GP_CMD_ID_STORE_SCENE6:
2060 case ZB_GP_CMD_ID_STORE_SCENE7:
2061 case ZB_GP_CMD_ID_OFF:
2062 case ZB_GP_CMD_ID_ON:
2063 case ZB_GP_CMD_ID_TOGGLE:
2064 case ZB_GP_CMD_ID_RELEASE:
2065 case ZB_GP_CMD_ID_LEVEL_CONTROL_STOP:
2066 case ZB_GP_CMD_ID_MOVE_HUE_STOP:
2067 case ZB_GP_CMD_ID_MOVE_SATURATION_STOP:
2068 case ZB_GP_CMD_ID_LOCK_DOOR:
2069 case ZB_GP_CMD_ID_UNLOCK_DOOR:
2070 case ZB_GP_CMD_ID_PRESS11:
2071 case ZB_GP_CMD_ID_RELEASE11:
2072 case ZB_GP_CMD_ID_PRESS12:
2073 case ZB_GP_CMD_ID_RELEASE12:
2074 case ZB_GP_CMD_ID_PRESS22:
2075 case ZB_GP_CMD_ID_RELEASE22:
2076 case ZB_GP_CMD_ID_SHORT_PRESS11:
2077 case ZB_GP_CMD_ID_SHORT_PRESS12:
2078 case ZB_GP_CMD_ID_SHORT_PRESS22:
2079 case ZB_GP_CMD_ID_DECOMMISSIONING:
2080 case ZB_GP_CMD_ID_SUCCESS:
2081 break;
2082 /* GPDF commands with payload sent by GPD. */
2083 case ZB_GP_CMD_ID_MOVE_UP:
2084 case ZB_GP_CMD_ID_MOVE_DOWN:
2085 case ZB_GP_CMD_ID_MOVE_UP_WITH_ON_OFF:
2086 case ZB_GP_CMD_ID_MOVE_DOWN_WITH_ON_OFF:
2087 case ZB_GP_CMD_ID_MOVE_HUE_UP:
2088 case ZB_GP_CMD_ID_MOVE_HUE_DOWN:
2089 case ZB_GP_CMD_ID_MOVE_SATURATION_UP:
2090 case ZB_GP_CMD_ID_MOVE_SATURATION_DOWN:
2091 offset = dissect_zbee_nwk_gp_cmd_move_up_down(tvb, pinfo, cmd_tree, packet, offset);
2092 break;
2093 case ZB_GP_CMD_ID_STEP_UP:
2094 case ZB_GP_CMD_ID_STEP_DOWN:
2095 case ZB_GP_CMD_ID_STEP_UP_WITH_ON_OFF:
2096 case ZB_GP_CMD_ID_STEP_DOWN_WITH_ON_OFF:
2097 case ZB_GP_CMD_ID_STEP_HUE_UP:
2098 case ZB_GP_CMD_ID_STEP_HUW_DOWN:
2099 case ZB_GP_CMD_ID_STEP_SATURATION_UP:
2100 case ZB_GP_CMD_ID_STEP_SATURATION_DOWN:
2101 offset = dissect_zbee_nwk_gp_cmd_step_up_down(tvb, pinfo, cmd_tree, packet, offset);
2102 break;
2103 case ZB_GP_CMD_ID_MOVE_COLOR:
2104 offset = dissect_zbee_nwk_gp_cmd_move_color(tvb, pinfo, cmd_tree, packet, offset);
2105 break;
2106 case ZB_GP_CMD_ID_STEP_COLOR:
2107 offset = dissect_zbee_nwk_gp_cmd_step_color(tvb, pinfo, cmd_tree, packet, offset);
2108 break;
2109 case ZB_GP_CMD_ID_ATTRIBUTE_REPORTING:
2110 offset = dissect_zbee_nwk_gp_cmd_attr_reporting(tvb, pinfo, cmd_tree, packet, offset, ZBEE_MFG_CODE_NONE0x0000);
2111 break;
2112 case ZB_GP_CMD_ID_MANUFACTURE_SPECIFIC_ATTR_REPORTING:
2113 offset = dissect_zbee_nwk_gp_cmd_MS_attr_reporting(tvb, pinfo, cmd_tree, packet, offset);
2114 break;
2115 case ZB_GP_CMD_ID_MULTI_CLUSTER_REPORTING:
2116 offset = dissect_zbee_nwk_gp_cmd_multi_cluster_reporting(tvb, pinfo, cmd_tree, packet, offset, ZBEE_MFG_CODE_NONE0x0000);
2117 break;
2118 case ZB_GP_CMD_ID_MANUFACTURER_SPECIFIC_MCLUSTER_REPORTING:
2119 offset = dissect_zbee_nwk_gp_cmd_MS_multi_cluster_reporting(tvb, pinfo, cmd_tree, packet, offset);
2120 break;
2121 case ZB_GP_CMD_ID_READ_ATTRIBUTES_RESPONSE:
2122 offset = dissect_zbee_nwk_gp_cmd_read_attributes_response(tvb, pinfo, cmd_tree, packet, offset);
2123 break;
2124 case ZB_GP_CMD_ID_ZCL_TUNNELING:
2125 offset = dissect_zbee_nwk_gp_cmd_zcl_tunneling(tvb, pinfo, cmd_tree, packet, offset);
2126 break;
2127 case ZB_GP_CMD_ID_COMPACT_ATTR_REPORT:
2128 offset = dissect_zbee_nwk_gp_cmd_compact_attr_report(tvb, pinfo, cmd_tree, packet, offset);
2129 break;
2130 case ZB_GP_CMD_ID_ANY_SENSOR_COMMAND_A0_A3:
2131 /* TODO: implement it. */
2132 break;
2133 case ZB_GP_CMD_ID_COMMISSIONING:
2134 offset = dissect_zbee_nwk_gp_cmd_commissioning(tvb, pinfo, cmd_tree, packet, offset);
2135 break;
2136 case ZB_GP_CMD_ID_CHANNEL_REQUEST:
2137 offset = dissect_zbee_nwk_gp_cmd_channel_request(tvb, pinfo, cmd_tree, packet, offset);
2138 break;
2139 case ZB_GP_CMD_ID_APPLICATION_DESC:
2140 offset = dissect_zbee_nwk_gp_cmd_application_desc(tvb, pinfo, cmd_tree, packet, offset);
2141 break;
2142 case ZB_GP_CMD_ID_REQUEST_ATTRIBUTES:
2143 /* GPDF commands sent to GPD. */
2144 case ZB_GP_CMD_ID_READ_ATTRIBUTES:
2145 offset = dissect_zbee_nwk_gp_cmd_read_attributes(tvb, pinfo, cmd_tree, packet, offset);
2146 break;
2147 case ZB_GP_CMD_ID_COMMISSIONING_REPLY:
2148 offset = dissect_zbee_nwk_gp_cmd_commissioning_reply(tvb, pinfo, cmd_tree, packet, offset);
2149 break;
2150 case ZB_GP_CMD_ID_WRITE_ATTRIBUTES:
2151 offset = dissect_zbee_nwk_gp_cmd_write_attributes(tvb, pinfo, cmd_tree, packet, offset);
2152 break;
2153 case ZB_GP_CMD_ID_CHANNEL_CONFIGURATION:
2154 offset = dissect_zbee_nwk_gp_cmd_channel_configuration(tvb, pinfo, cmd_tree, packet, offset);
2155 break;
2156 }
2157 if (offset < tvb_reported_length(tvb)) {
2158 /* There are leftover bytes! */
2159 proto_tree *root;
2160 tvbuff_t *leftover_tvb = tvb_new_subset_remaining(tvb, offset);
2161
2162 /* Correct the length of the command tree. */
2163 root = proto_tree_get_root(tree);
2164 proto_item_set_len(cmd_root, offset);
2165
2166 /* Dump the tail. */
2167 call_data_dissector(leftover_tvb, pinfo, root);
2168 }
2169 return offset;
2170} /* dissect_zbee_nwk_gp_cmd */
2171
2172/**
2173 *ZigBee NWK packet dissection routine for Green Power profile.
2174 *
2175 *@param tvb pointer to buffer containing raw packet.
2176 *@param pinfo pointer to packet information fields.
2177 *@param tree pointer to data tree Wireshark uses to display packet.
2178 *@param data raw packet private data.
2179*/
2180static int
2181dissect_zbee_nwk_gp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
2182{
2183 ieee802154_packet *ieee_packet = (ieee802154_packet *)data;
2184 bool_Bool gp_decrypted;
2185 GSList *GSList_i;
2186 unsigned offset = 0;
2187 uint8_t *dec_buffer;
2188 uint8_t *enc_buffer;
2189 uint8_t fcf;
2190 proto_tree *nwk_tree;
2191 proto_item *proto_root;
2192 proto_item *ti = NULL((void*)0);
2193 tvbuff_t *payload_tvb;
2194 zbee_nwk_green_power_packet packet;
2195 static int * const fields[] = {
2196 &hf_zbee_nwk_gp_frame_type,
2197 &hf_zbee_nwk_gp_proto_version,
2198 &hf_zbee_nwk_gp_auto_commissioning,
2199 &hf_zbee_nwk_gp_fc_ext,
2200 NULL((void*)0)
2201 };
2202 static int * const ext_fields[] = {
2203 &hf_zbee_nwk_gp_fc_ext_app_id,
2204 &hf_zbee_nwk_gp_fc_ext_sec_level,
2205 &hf_zbee_nwk_gp_fc_ext_sec_key,
2206 &hf_zbee_nwk_gp_fc_ext_rx_after_tx,
2207 &hf_zbee_nwk_gp_fc_ext_direction,
2208 NULL((void*)0)
2209 };
2210
2211 if (data == NULL((void*)0))
2212 return 0;
2213
2214 memset(&packet, 0, sizeof(packet));
2215 packet.ieee_packet_src64 = ieee_packet->src64;
2216 /* Add ourself to the protocol column, clear the info column and create the protocol tree. */
2217 col_set_str(pinfo->cinfo, COL_PROTOCOL, "ZigBee Green Power");
2218 col_clear(pinfo->cinfo, COL_INFO);
2219
2220 proto_root = proto_tree_add_protocol_format(tree, proto_zbee_nwk_gp, tvb, offset, tvb_captured_length(tvb),
2221 "ZGP stub NWK header");
2222 nwk_tree = proto_item_add_subtree(proto_root, ett_zbee_nwk);
2223
2224 enc_buffer = (uint8_t *)tvb_memdup(pinfo->pool, tvb, 0, tvb_captured_length(tvb));
2225 /* Get and parse the FCF. */
2226 fcf = tvb_get_uint8(tvb, offset);
2227 packet.frame_type = zbee_get_bit_field(fcf, ZBEE_NWK_GP_FCF_FRAME_TYPE0x03);
2228 packet.nwk_frame_control_extension = zbee_get_bit_field(fcf, ZBEE_NWK_GP_FCF_CONTROL_EXTENSION0x80);
2229
2230 /* Display the FCF. */
2231 ti = proto_tree_add_bitmask(nwk_tree, tvb, offset, hf_zbee_nwk_gp_fcf, ett_zbee_nwk_fcf, fields, ENC_NA0x00000000);
2232 proto_item_append_text(ti, " %s", val_to_str_const(packet.frame_type, zbee_nwk_gp_frame_types, "Unknown Frame Type"));
2233 offset += 1;
2234
2235 /* Add the frame type to the info column and protocol root. */
2236 proto_item_append_text(proto_root, " %s", val_to_str_const(packet.frame_type, zbee_nwk_gp_frame_types, "Unknown type"));
2237 col_set_str(pinfo->cinfo, COL_INFO, val_to_str_const(packet.frame_type, zbee_nwk_gp_frame_types, "Reserved frame type"));
2238
2239 if (packet.nwk_frame_control_extension) {
2240 /* Display ext FCF. */
2241 fcf = tvb_get_uint8(tvb, offset);
2242 packet.application_id = zbee_get_bit_field(fcf, ZBEE_NWK_GP_FCF_EXT_APP_ID0x07);
2243 packet.security_level = zbee_get_bit_field(fcf, ZBEE_NWK_GP_FCF_EXT_SECURITY_LEVEL0x18);
2244 packet.direction = zbee_get_bit_field(fcf, ZBEE_NWK_GP_FCF_EXT_DIRECTION0x80);
2245
2246 /* Create a subtree for the extended FCF. */
2247 proto_tree_add_bitmask(nwk_tree, tvb, offset, hf_zbee_nwk_gp_fc_ext_field, ett_zbee_nwk_fcf_ext, ext_fields, ENC_NA0x00000000);
2248 offset += 1;
2249 }
2250 if ((packet.frame_type == ZBEE_NWK_GP_FCF_DATA0x00 && !packet.nwk_frame_control_extension) || (packet.frame_type ==
2251 ZBEE_NWK_GP_FCF_DATA0x00 && packet.nwk_frame_control_extension && packet.application_id ==
2252 ZBEE_NWK_GP_APP_ID_DEFAULT0x00) || (packet.frame_type == ZBEE_NWK_GP_FCF_MAINTENANCE0x01 &&
2253 packet.nwk_frame_control_extension && packet.application_id == ZBEE_NWK_GP_APP_ID_DEFAULT0x00 && tvb_get_uint8(tvb,
2254 offset) != ZB_GP_CMD_ID_CHANNEL_CONFIGURATION)) {
2255 /* Display GPD Src ID. */
2256 packet.source_id = tvb_get_letohl(tvb, offset);
2257 proto_tree_add_item(nwk_tree, hf_zbee_nwk_gp_zgpd_src_id, tvb, offset, 4, ENC_LITTLE_ENDIAN0x80000000);
2258 proto_item_append_text(proto_root, ", GPD Src ID: 0x%08x", packet.source_id);
2259
2260 col_append_fstr(pinfo->cinfo, COL_INFO, ", GPD Src ID: 0x%08x", packet.source_id);
2261
2262 col_clear(pinfo->cinfo, COL_DEF_SRC);
2263 col_append_fstr(pinfo->cinfo, COL_DEF_SRC, "0x%08x", packet.source_id);
2264
2265 offset += 4;
2266 }
2267 if (packet.application_id == ZBEE_NWK_GP_APP_ID_ZGP0x02) {
2268 /* Display GPD endpoint */
2269 packet.endpoint = tvb_get_uint8(tvb, offset);
2270 proto_tree_add_item(nwk_tree, hf_zbee_nwk_gp_zgpd_endpoint, tvb, offset, 1, ENC_LITTLE_ENDIAN0x80000000);
2271 proto_item_append_text(proto_root, ", Endpoint: %d", packet.endpoint);
2272
2273 col_append_fstr(pinfo->cinfo, COL_INFO, ", Endpoint: %d", packet.endpoint);
2274 offset += 1;
2275 }
2276 /* Display Security Frame Counter. */
2277 packet.mic_size = 0;
2278 if (packet.nwk_frame_control_extension) {
2279 if (packet.application_id == ZBEE_NWK_GP_APP_ID_DEFAULT0x00 || packet.application_id == ZBEE_NWK_GP_APP_ID_ZGP0x02
2280 || packet.application_id == ZBEE_NWK_GP_APP_ID_LPED0x01) {
2281 if (packet.security_level == ZBEE_NWK_GP_SECURITY_LEVEL_1LSB0x01
2282 && packet.application_id != ZBEE_NWK_GP_APP_ID_LPED0x01) {
2283 packet.mic_size = 2;
2284 } else if (packet.security_level == ZBEE_NWK_GP_SECURITY_LEVEL_FULL0x02 || packet.security_level ==
2285 ZBEE_NWK_GP_SECURITY_LEVEL_FULLENCR0x03) {
2286 /* Get Security Frame Counter and display it. */
2287 packet.mic_size = 4;
2288 packet.security_frame_counter = tvb_get_letohl(tvb, offset);
2289 proto_tree_add_item(nwk_tree, hf_zbee_nwk_gp_security_frame_counter, tvb, offset, 4,
2290 ENC_LITTLE_ENDIAN0x80000000);
2291 offset += 4;
2292 }
2293 }
2294 }
2295 /* Parse application payload. */
2296 /* This is a uint8_t, but tvb_reported_length might be larger; e.g.,
2297 * SCOP over TCP, presumably with errors. It's bogus either way; perhaps
2298 * we should warn.
2299 */
2300 packet.payload_len = tvb_reported_length(tvb) - offset - packet.mic_size;
2301 /* Ensure that the payload exists. */
2302 if (packet.payload_len <= 0) {
2303 proto_tree_add_expert_remaining(nwk_tree, pinfo, &ei_zbee_nwk_gp_no_payload, tvb, 0);
2304 return offset;
2305 }
2306 /* OK, payload exists. Parse MIC field if needed. */
2307 if (packet.mic_size == 2) {
2308 packet.mic = tvb_get_letohs(tvb, offset + packet.payload_len);
2309 } else if (packet.mic_size == 4) {
2310 packet.mic = tvb_get_letohl(tvb, offset + packet.payload_len);
2311 }
2312 /* Save packet private data. */
2313 data = (void *)&packet;
2314 payload_tvb = tvb_new_subset_length(tvb, offset, packet.payload_len);
2315 if (packet.security_level != ZBEE_NWK_GP_SECURITY_LEVEL_FULLENCR0x03) {
2316 dissect_zbee_nwk_gp_cmd(payload_tvb, pinfo, nwk_tree, data);
2317 }
2318 offset += packet.payload_len;
2319 /* Display MIC field. */
2320 if (packet.mic_size) {
2321 proto_tree_add_uint(nwk_tree, packet.mic_size == 4 ? hf_zbee_nwk_gp_security_mic_4b :
2322 hf_zbee_nwk_gp_security_mic_2b, tvb, offset, packet.mic_size, packet.mic);
2323 offset += packet.mic_size;
2324 }
2325 if ((offset < tvb_captured_length(tvb)) && (packet.security_level != ZBEE_NWK_GP_SECURITY_LEVEL_FULLENCR0x03)) {
2326 proto_tree_add_expert_remaining(nwk_tree, pinfo, &ei_zbee_nwk_gp_inval_residual_data, tvb, offset);
2327 return offset;
2328 }
2329 if (packet.security_level == ZBEE_NWK_GP_SECURITY_LEVEL_FULLENCR0x03) {
2330 gp_decrypted = false0;
2331
2332 if (tvb_captured_length(tvb) >= tvb_reported_length(tvb)) {
2333 dec_buffer = (uint8_t *)wmem_alloc(pinfo->pool, packet.payload_len);
2334 for (GSList_i = zbee_gp_keyring; GSList_i && !gp_decrypted; GSList_i = g_slist_next(GSList_i)((GSList_i) ? (((GSList *)(GSList_i))->next) : ((void*)0))) {
2335 gp_decrypted = zbee_gp_decrypt_payload(&packet, enc_buffer, offset - packet.payload_len -
2336 packet.mic_size, dec_buffer, packet.payload_len, packet.mic_size,
2337 ((key_record_t *)(GSList_i->data))->key);
2338 }
2339 }
2340
2341 if (gp_decrypted) {
2342 payload_tvb = tvb_new_child_real_data(tvb, dec_buffer, packet.payload_len, packet.payload_len);
2343 add_new_data_source(pinfo, payload_tvb, "Decrypted GP Payload");
2344 dissect_zbee_nwk_gp_cmd(payload_tvb, pinfo, nwk_tree, data);
2345 } else {
2346 payload_tvb = tvb_new_subset_length(tvb, offset - packet.payload_len - packet.mic_size, packet.payload_len);
2347 call_data_dissector(payload_tvb, pinfo, tree);
2348 }
2349 }
2350 return tvb_captured_length(tvb);
2351} /* dissect_zbee_nwk_gp */
2352
2353/**
2354 *Heuristic interpreter for the ZigBee Green Power dissectors.
2355 *
2356 *@param tvb pointer to buffer containing raw packet.
2357 *@param pinfo pointer to packet information fields.
2358 *@param tree pointer to data tree Wireshark uses to display packet.
2359 *@param data raw packet private data.
2360*/
2361static bool_Bool
2362dissect_zbee_nwk_heur_gp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
2363{
2364 ieee802154_packet *packet = (ieee802154_packet *)data;
2365 uint8_t fcf;
2366
2367 /* We must have the IEEE 802.15.4 headers. */
2368 if (packet == NULL((void*)0)) return false0;
2369
2370 /* If the frame type and version are not sane, then it's probably not ZGP. */
2371 fcf = tvb_get_uint8(tvb, 0);
2372 if (zbee_get_bit_field(fcf, ZBEE_NWK_GP_FCF_VERSION0x3C) != ZBEE_VERSION_GREEN_POWER3) return false0;
2373 if (!try_val_to_str(zbee_get_bit_field(fcf, ZBEE_NWK_FCF_FRAME_TYPE0x0003), zbee_nwk_gp_frame_types)) return false0;
2374
2375 /* ZigBee greenpower frames are either sent to broadcast or the extended address. */
2376 if (packet->dst_addr_mode == IEEE802154_FCF_ADDR_SHORT0x2 && packet->dst16 == IEEE802154_BCAST_ADDR0xFFFF) {
2377 dissect_zbee_nwk_gp(tvb, pinfo, tree, data);
2378 return true1;
2379 }
2380 /* 64-bit destination addressing mode support. */
2381 if (packet->dst_addr_mode == IEEE802154_FCF_ADDR_EXT0x3) {
2382 dissect_zbee_nwk_gp(tvb, pinfo, tree, data);
2383 return true1;
2384 }
2385
2386 return false0;
2387} /* dissect_zbee_nwk_heur_gp */
2388
2389/**
2390 *Init routine for the ZigBee GP profile security.
2391 *
2392*/
2393static void
2394gp_init_zbee_security(void)
2395{
2396 unsigned i;
2397 key_record_t key_record;
2398
2399 for (i = 0; gp_uat_key_records && (i < num_uat_key_records); i++) {
2400 key_record.frame_num = 0;
2401 key_record.label = g_strdup(gp_uat_key_records[i].label)g_strdup_inline (gp_uat_key_records[i].label);
2402 memcpy(key_record.key, gp_uat_key_records[i].key, ZBEE_SEC_CONST_KEYSIZE16);
2403 zbee_gp_keyring = g_slist_prepend(zbee_gp_keyring, g_memdup2(&key_record, sizeof(key_record_t)));
2404 }
2405}
2406
2407static void zbee_free_key_record(void *ptr)
2408{
2409 key_record_t *k;
2410
2411 k = (key_record_t *)ptr;
2412 if (!k)
2413 return;
2414
2415 g_free(k->label)(__builtin_object_size ((k->label), 0) != ((size_t) - 1)) ?
g_free_sized (k->label, __builtin_object_size ((k->label
), 0)) : (g_free) (k->label)
;
2416 g_free(k)(__builtin_object_size ((k), 0) != ((size_t) - 1)) ? g_free_sized
(k, __builtin_object_size ((k), 0)) : (g_free) (k)
;
2417}
2418
2419static void
2420gp_cleanup_zbee_security(void)
2421{
2422 if (!zbee_gp_keyring)
2423 return;
2424
2425 g_slist_free_full(zbee_gp_keyring, zbee_free_key_record);
2426 zbee_gp_keyring = NULL((void*)0);
2427}
2428
2429/**
2430 *ZigBee NWK GP protocol registration routine.
2431 *
2432*/
2433void
2434proto_register_zbee_nwk_gp(void)
2435{
2436 module_t *gp_zbee_prefs;
2437 expert_module_t* expert_zbee_nwk_gp;
2438
2439 static hf_register_info hf[] = {
2440 { &hf_zbee_nwk_gp_auto_commissioning,
2441 { "Auto Commissioning", "zbee_nwk_gp.auto_commissioning", FT_BOOLEAN, 8, NULL((void*)0),
2442 ZBEE_NWK_GP_FCF_AUTO_COMMISSIONING0x40, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2443
2444 { &hf_zbee_nwk_gp_fc_ext,
2445 { "NWK Frame Extension", "zbee_nwk_gp.fc_extension", FT_BOOLEAN, 8, NULL((void*)0), ZBEE_NWK_GP_FCF_CONTROL_EXTENSION0x80,
2446 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2447
2448 { &hf_zbee_nwk_gp_fcf,
2449 { "Frame Control Field", "zbee_nwk_gp.fcf", FT_UINT8, BASE_HEX, NULL((void*)0),
2450 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2451
2452 { &hf_zbee_nwk_gp_frame_type,
2453 { "Frame Type", "zbee_nwk_gp.frame_type", FT_UINT8, BASE_HEX, VALS(zbee_nwk_gp_frame_types)((0 ? (const struct _value_string*)0 : ((zbee_nwk_gp_frame_types
))))
,
2454 ZBEE_NWK_GP_FCF_FRAME_TYPE0x03, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2455
2456 { &hf_zbee_nwk_gp_proto_version,
2457 { "Protocol Version", "zbee_nwk_gp.proto_version", FT_UINT8, BASE_DEC, NULL((void*)0), ZBEE_NWK_GP_FCF_VERSION0x3C, NULL((void*)0),
2458 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2459
2460 { &hf_zbee_nwk_gp_fc_ext_field,
2461 { "Extended NWK Frame Control Field", "zbee_nwk_gp.fc_ext", FT_UINT8, BASE_HEX, NULL((void*)0),
2462 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2463
2464 { &hf_zbee_nwk_gp_fc_ext_app_id,
2465 { "Application ID", "zbee_nwk_gp.fc_ext_app_id", FT_UINT8, BASE_HEX, VALS(zbee_nwk_gp_app_id_names)((0 ? (const struct _value_string*)0 : ((zbee_nwk_gp_app_id_names
))))
,
2466 ZBEE_NWK_GP_FCF_EXT_APP_ID0x07, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2467
2468 { &hf_zbee_nwk_gp_fc_ext_direction,
2469 { "Direction", "zbee_nwk_gp.fc_ext_direction", FT_UINT8, BASE_HEX, VALS(zbee_nwk_gp_directions)((0 ? (const struct _value_string*)0 : ((zbee_nwk_gp_directions
))))
,
2470 ZBEE_NWK_GP_FCF_EXT_DIRECTION0x80, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2471
2472 { &hf_zbee_nwk_gp_fc_ext_rx_after_tx,
2473 { "Rx After Tx", "zbee_nwk_gp.fc_ext_rxaftertx", FT_BOOLEAN, 8, NULL((void*)0), ZBEE_NWK_GP_FCF_EXT_RX_AFTER_TX0x40, NULL((void*)0),
2474 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2475
2476 { &hf_zbee_nwk_gp_fc_ext_sec_key,
2477 { "Security Key", "zbee_nwk_gp.fc_ext_security_key", FT_BOOLEAN, 8, NULL((void*)0), ZBEE_NWK_GP_FCF_EXT_SECURITY_KEY0x20,
2478 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2479
2480 { &hf_zbee_nwk_gp_fc_ext_sec_level,
2481 { "Security Level", "zbee_nwk_gp.fc_ext_security_level", FT_UINT8, BASE_HEX,
2482 VALS(zbee_nwk_gp_src_sec_levels_names)((0 ? (const struct _value_string*)0 : ((zbee_nwk_gp_src_sec_levels_names
))))
, ZBEE_NWK_GP_FCF_EXT_SECURITY_LEVEL0x18, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2483
2484 { &hf_zbee_nwk_gp_zgpd_src_id,
2485 { "Src ID", "zbee_nwk_gp.source_id", FT_UINT32, BASE_HEX, VALS(zbee_nwk_gp_src_id_names)((0 ? (const struct _value_string*)0 : ((zbee_nwk_gp_src_id_names
))))
, 0x0, NULL((void*)0),
2486 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2487
2488 { &hf_zbee_nwk_gp_zgpd_endpoint,
2489 { "Endpoint", "zbee_nwk_gp.endpoint", FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2490
2491 { &hf_zbee_nwk_gp_security_frame_counter,
2492 { "Security Frame Counter", "zbee_nwk_gp.security_frame_counter", FT_UINT32, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0),
2493 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2494
2495 { &hf_zbee_nwk_gp_security_mic_2b,
2496 { "Security MIC", "zbee_nwk_gp.security_mic2", FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2497
2498 { &hf_zbee_nwk_gp_security_mic_4b,
2499 { "Security MIC", "zbee_nwk_gp.security_mic4", FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2500
2501 { &hf_zbee_nwk_gp_command_id,
2502 { "ZGPD Command ID", "zbee_nwk_gp.command_id", FT_UINT8, BASE_HEX | BASE_EXT_STRING0x00000200, &zbee_nwk_gp_cmd_names_ext, 0x0, NULL((void*)0),
2503 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2504
2505 { &hf_zbee_nwk_gp_cmd_comm_device_id,
2506 { "ZGPD Device ID", "zbee_nwk_gp.cmd.comm.dev_id", FT_UINT8, BASE_HEX | BASE_EXT_STRING0x00000200, &zbee_nwk_gp_device_ids_names_ext,
2507 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2508
2509 { &hf_zbee_nwk_gp_cmd_comm_ext_opt_gpd_key_encr,
2510 { "GPD Key Encryption", "zbee_nwk_gp.cmd.comm.ext_opt.gpd_key_encr", FT_BOOLEAN, 8, NULL((void*)0),
2511 ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_GPD_KEY_ENCR0x40, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2512
2513 { &hf_zbee_nwk_gp_cmd_comm_ext_opt_gpd_key_present,
2514 { "GPD Key Present", "zbee_nwk_gp.cmd.comm.ext_opt.gpd_key_present", FT_BOOLEAN, 8, NULL((void*)0),
2515 ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_GPD_KEY_PRESENT0x20, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2516
2517 { &hf_zbee_nwk_gp_cmd_comm_ext_opt_key_type,
2518 { "Key Type", "zbee_nwk_gp.cmd.comm.ext_opt.key_type", FT_UINT8, BASE_HEX,
2519 VALS(zbee_nwk_gp_src_sec_keys_type_names)((0 ? (const struct _value_string*)0 : ((zbee_nwk_gp_src_sec_keys_type_names
))))
, ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_KEY_TYPE0x1C, NULL((void*)0),
2520 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2521
2522 { &hf_zbee_nwk_gp_cmd_comm_outgoing_counter,
2523 { "GPD Outgoing Counter", "zbee_nwk_gp.cmd.comm.out_counter", FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0),
2524 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2525
2526 { &hf_zbee_nwk_gp_cmd_comm_ext_opt_sec_level_cap,
2527 { "Security Level Capabilities", "zbee_nwk_gp.cmd.comm.ext_opt.seclevel_cap", FT_UINT8, BASE_HEX, NULL((void*)0),
2528 ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_SEC_LEVEL_CAP0x03, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2529
2530 { &hf_zbee_nwk_gp_cmd_comm_security_key,
2531 { "Security Key", "zbee_nwk_gp.cmd.comm.security_key", FT_BYTES, BASE_NONE, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2532
2533 { &hf_zbee_nwk_gp_cmd_comm_gpd_sec_key_mic,
2534 { "GPD Key MIC", "zbee_nwk_gp.cmd.comm.gpd_key_mic", FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2535
2536 { &hf_zbee_nwk_gp_cmd_comm_opt_ext_opt,
2537 { "Extended Option Field", "zbee_nwk_gp.cmd.comm.opt.ext_opt_field", FT_BOOLEAN, 8, NULL((void*)0),
2538 ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_EXT_OPTIONS0x80, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2539
2540 { &hf_zbee_nwk_gp_cmd_comm_opt,
2541 { "Options Field", "zbee_nwk_gp.cmd.comm.opt", FT_UINT8, BASE_HEX, NULL((void*)0),
2542 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2543
2544 { &hf_zbee_nwk_gp_cmd_comm_opt_fixed_location,
2545 { "Fixed Location", "zbee_nwk_gp.cmd.comm.opt.fixed_location", FT_BOOLEAN, 8, NULL((void*)0),
2546 ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_FIXED_LOCATION0x40, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2547
2548 { &hf_zbee_nwk_gp_cmd_comm_opt_mac_sec_num_cap,
2549 { "MAC Sequence number capability", "zbee_nwk_gp.cmd.comm.opt.mac_seq_num_cap", FT_BOOLEAN, 8, NULL((void*)0),
2550 ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_MAC_SEQ0x01, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2551
2552 { &hf_zbee_nwk_gp_cmd_comm_opt_appli_info_present,
2553 { "Application information present", "zbee_nwk_gp.cmd.comm.opt.appli_info_present", FT_BOOLEAN, 8, NULL((void*)0),
2554 ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_APPLICATION_INFO0x04, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2555
2556 { &hf_zbee_nwk_gp_cmd_comm_opt_panid_req,
2557 { "PANId request", "zbee_nwk_gp.cmd.comm.opt.panid_req", FT_BOOLEAN, 8, NULL((void*)0),
2558 ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_PAN_ID_REQ0x10, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2559
2560 { &hf_zbee_nwk_gp_cmd_comm_opt_rx_on_cap,
2561 { "RxOnCapability", "zbee_nwk_gp.cmd.comm.opt.rxon_cap", FT_BOOLEAN, 8, NULL((void*)0),
2562 ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_RX_ON_CAP0x02, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2563
2564 { &hf_zbee_nwk_gp_cmd_comm_opt_sec_key_req,
2565 { "GP Security Key Request", "zbee_nwk_gp.cmd.comm.opt.seq_key_req", FT_BOOLEAN, 8, NULL((void*)0),
2566 ZBEE_NWK_GP_CMD_COMMISSIONING_OPT_GP_SEC_KEY_REQ0x20, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2567
2568 { &hf_zbee_nwk_gp_cmd_comm_ext_opt,
2569 { "Extended Options Field", "zbee_nwk_gp.cmd.comm.ext_opt", FT_UINT8, BASE_HEX, NULL((void*)0),
2570 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2571
2572 { &hf_zbee_nwk_gp_cmd_comm_ext_opt_outgoing_counter,
2573 { "GPD Outgoing present", "zbee_nwk_gp.cmd.comm.ext_opt.outgoing_counter", FT_BOOLEAN, 8, NULL((void*)0),
2574 ZBEE_NWK_GP_CMD_COMMISSIONING_EXT_OPT_OUT_COUNTER0x80, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2575
2576 { &hf_zbee_nwk_gp_cmd_comm_manufacturer_greenpeak_dev_id,
2577 { "Manufacturer Model ID", "zbee_nwk_gp.cmd.comm.manufacturer_model_id", FT_UINT16, BASE_HEX,
2578 VALS(zbee_nwk_gp_manufacturer_greenpeak_dev_names)((0 ? (const struct _value_string*)0 : ((zbee_nwk_gp_manufacturer_greenpeak_dev_names
))))
, 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2579
2580 { &hf_zbee_nwk_gp_cmd_comm_manufacturer_dev_id,
2581 { "Manufacturer Model ID", "zbee_nwk_gp.cmd.comm.manufacturer_model_id", FT_UINT16, BASE_HEX,
2582 NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2583
2584 { &hf_zbee_nwk_gp_cmd_comm_manufacturer_id,
2585 { "Manufacturer ID", "zbee_nwk_gp.cmd.comm.manufacturer_id", FT_UINT16, BASE_HEX,
2586 VALS(zbee_mfr_code_names)((0 ? (const struct _value_string*)0 : ((zbee_mfr_code_names)
)))
, 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2587
2588 { &hf_zbee_nwk_gp_cmd_comm_appli_info_crp,
2589 { "Cluster reports present", "zbee_nwk_gp.cmd.comm.appli_info.crp", FT_BOOLEAN, 8, NULL((void*)0),
2590 ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_CRP0x08 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2591
2592 { &hf_zbee_nwk_gp_cmd_comm_appli_info_gclp,
2593 { "GP commands list present", "zbee_nwk_gp.cmd.comm.appli_info.gclp", FT_BOOLEAN, 8, NULL((void*)0),
2594 ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_GCLP0x04 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2595
2596 { &hf_zbee_nwk_gp_cmd_comm_appli_info,
2597 { "Application information Field", "zbee_nwk_gp.cmd.comm.appli_info", FT_UINT8, BASE_HEX, NULL((void*)0),
2598 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2599
2600 { &hf_zbee_nwk_gp_cmd_comm_appli_info_mip,
2601 { "Manufacturer ID present", "zbee_nwk_gp.cmd.comm.appli_info.mip", FT_BOOLEAN, 8, NULL((void*)0),
2602 ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_MIP0x01 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2603
2604 { &hf_zbee_nwk_gp_cmd_comm_appli_info_mmip,
2605 { "Manufacturer Model ID present", "zbee_nwk_gp.cmd.comm.appli_info.mmip", FT_BOOLEAN, 8, NULL((void*)0),
2606 ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_MMIP0x02 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2607
2608 { &hf_zbee_nwk_gp_cmd_comm_appli_info_sip,
2609 { "Switch information present", "zbee_nwk_gp.cmd.comm.appli_info.sip", FT_BOOLEAN, 8, NULL((void*)0),
2610 ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_SIP0x10 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2611
2612 { &hf_zbee_nwk_gp_cmd_comm_appli_info_adcf,
2613 { "GPD Application Description command follows", "zbee_nwk_gp.cmd.comm.appli_info.adcf", FT_BOOLEAN, 8, NULL((void*)0),
2614 ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_ADCF0x20 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2615
2616 { &hf_zbee_nwk_gp_cmd_comm_appli_info_res,
2617 { "Reserved", "zbee_nwk_gp.cmd.comm.appli_info.reserved", FT_UINT8, BASE_HEX, NULL((void*)0),
2618 ZBEE_NWK_GP_CMD_COMMISSIONING_APPLI_INFO_RES0xC0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2619
2620 { &hf_zbee_nwk_gp_cmd_comm_gpd_cmd_num,
2621 { "Number of GPD commands", "zbee_nwk_gp.cmd.comm.gpd_cmd_num", FT_UINT8, BASE_DEC, NULL((void*)0),
2622 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2623
2624 { &hf_zbee_nwk_gp_cmd_comm_gpd_cmd_id_list,
2625 { "GPD CommandID list", "zbee_nwk_gp.cmd.comm.gpd_cmd_id_list", FT_NONE, BASE_NONE, NULL((void*)0),
2626 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2627
2628 { &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list,
2629 { "Length of ClusterID list", "zbee_nwk_gp.cmd.comm.length_of_clid_list", FT_UINT8, BASE_HEX, NULL((void*)0),
2630 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2631
2632 { &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_server,
2633 { "Number of server ClusterIDs", "zbee_nwk_gp.cmd.comm.length_of_clid_list_srv", FT_UINT8, BASE_DEC, NULL((void*)0),
2634 ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_SRV0x0F, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2635
2636 { &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_client,
2637 { "Number of client ClusterIDs", "zbee_nwk_gp.cmd.comm.length_of_clid_list_cli", FT_UINT8, BASE_DEC, NULL((void*)0),
2638 ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_CLI0xF0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2639
2640 { &hf_zbee_nwk_cmd_comm_clid_list_server,
2641 { "Cluster ID List Server", "zbee_nwk_gp.cmd.comm.clid_list_server", FT_NONE, BASE_NONE, NULL((void*)0),
2642 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2643
2644 { &hf_zbee_nwk_cmd_comm_clid_list_client,
2645 { "ClusterID List Client", "zbee_nwk_gp.cmd.comm.clid_list_client", FT_NONE, BASE_NONE, NULL((void*)0),
2646 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2647
2648 { &hf_zbee_nwk_cmd_comm_cluster_id,
2649 { "Cluster ID", "zbee_nwk_gp.cmd.comm.cluster_id", FT_UINT16, BASE_HEX | BASE_RANGE_STRING0x00000100, RVALS(zbee_aps_cid_names)((0 ? (const struct _range_string*)0 : ((zbee_aps_cid_names))
))
,
2650 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2651
2652 { &hf_zbee_nwk_gp_cmd_comm_switch_info,
2653 { "Switch information", "zbee_nwk_gp.cmd.comm.switch_info", FT_NONE, BASE_NONE, NULL((void*)0),
2654 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2655
2656 { &hf_zbee_nwk_gp_cmd_comm_switch_info_length,
2657 { "Switch info length", "zbee_nwk_gp.cmd.comm.switch_info.length", FT_UINT8, BASE_DEC, NULL((void*)0),
2658 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2659
2660 { &hf_zbee_nwk_gp_cmd_comm_switch_info_generic_switch_config,
2661 { "Generic switch configuration", "zbee_nwk_gp.cmd.comm.switch_info.generic_switch_config", FT_UINT8, BASE_HEX, NULL((void*)0),
2662 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2663
2664 { &hf_zbee_nwk_gp_cmd_comm_switch_info_num_contacts,
2665 { "Number of contacts", "zbee_nwk_gp.cmd.comm.switch_info.num_contacts", FT_UINT8, BASE_DEC, NULL((void*)0),
2666 ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_CONF_NUM_CONTACTS0x0F , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2667
2668 { &hf_zbee_nwk_gp_cmd_comm_switch_info_switch_type,
2669 { "Switch type", "zbee_nwk_gp.cmd.comm.switch_info.switch_type", FT_UINT8, BASE_HEX, VALS(zbee_nwk_gp_switch_type_names)((0 ? (const struct _value_string*)0 : ((zbee_nwk_gp_switch_type_names
))))
,
2670 ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_CONF_SWITCH_TYPE0x30 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2671
2672 { &hf_zbee_nwk_gp_cmd_comm_switch_info_reserved,
2673 { "Reserved", "zbee_nwk_gp.cmd.comm.switch_info.reserved", FT_UINT8, BASE_HEX, NULL((void*)0),
2674 ZBEE_NWK_GP_CMD_COMMISSIONING_SWITCH_CONF_RES0xC0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2675
2676 { &hf_zbee_nwk_gp_cmd_comm_switch_info_current_contact_status,
2677 { "Current contact status", "zbee_nwk_gp.cmd.comm.switch_info.current_contact_status", FT_UINT8, BASE_HEX, NULL((void*)0),
2678 0x0 , NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2679
2680 { &hf_zbee_nwk_gp_cmd_comm_rep_opt_key_encr,
2681 { "GPD Key Encryption", "zbee_nwk_gp.cmd.comm_reply.opt.sec_key_encr", FT_BOOLEAN, 8, NULL((void*)0),
2682 ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_KEY_ENCR0x04, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2683
2684 { &hf_zbee_nwk_gp_cmd_comm_rep_opt,
2685 { "Options Field", "zbee_nwk_gp.cmd.comm_reply.opt", FT_UINT8, BASE_HEX, NULL((void*)0),
2686 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2687
2688 { &hf_zbee_nwk_gp_cmd_comm_rep_opt_panid_present,
2689 { "PANID Present", "zbee_nwk_gp.cmd.comm_reply.opt.pan_id_present", FT_BOOLEAN, 8, NULL((void*)0),
2690 ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_PAN_ID_PRESENT0x01, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2691
2692 { &hf_zbee_nwk_gp_cmd_comm_rep_opt_sec_key_present,
2693 { "GPD Security Key Present", "zbee_nwk_gp.cmd.comm_reply.opt.sec_key_present", FT_BOOLEAN, 8, NULL((void*)0),
2694 ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_KEY_PRESENT0x02, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2695
2696 { &hf_zbee_nwk_gp_cmd_comm_rep_opt_sec_level,
2697 { "Security Level", "zbee_nwk_gp.cmd.comm_reply.opt.sec_level", FT_UINT8, BASE_HEX, NULL((void*)0),
2698 ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_LEVEL0x18, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2699
2700 { &hf_zbee_nwk_gp_cmd_comm_rep_opt_sec_type,
2701 { "Key Type", "zbee_nwk_gp.cmd.comm_reply.opt.key_type", FT_UINT8, BASE_HEX, NULL((void*)0),
2702 ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_KEY_TYPE0xE0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2703
2704 { &hf_zbee_nwk_gp_cmd_comm_rep_pan_id,
2705 { "PAN ID", "zbee_nwk_gp.cmd.comm_reply.pan_id", FT_UINT16, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2706
2707 { &hf_zbee_nwk_gp_cmd_comm_rep_frame_counter,
2708 { "Frame Counter", "zbee_nwk_gp.cmd.comm_reply.frame_counter", FT_UINT32, BASE_HEX, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2709
2710 { &hf_zbee_nwk_gp_cmd_read_att_opt_multi_rec,
2711 { "Multi-record", "zbee_nwk_gp.cmd.read_att.opt.multi_record", FT_BOOLEAN, 8, NULL((void*)0),
2712 ZBEE_NWK_GP_CMD_READ_ATTRIBUTE_OPT_MULTI_RECORD0x01, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2713
2714 { &hf_zbee_nwk_gp_cmd_read_att_opt_man_field_present,
2715 { "Manufacturer field present", "zbee_nwk_gp.cmd.read_att.opt.man_field_present", FT_BOOLEAN, 8, NULL((void*)0),
2716 ZBEE_NWK_GP_CMD_READ_ATTRIBUTE_OPT_MAN_FIELD_PRESENT0x02, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2717
2718 { &hf_zbee_nwk_gp_cmd_read_att_opt,
2719 { "Option field", "zbee_nwk_gp.cmd.read_att.opt", FT_UINT8, BASE_HEX, NULL((void*)0),
2720 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2721
2722 { &hf_zbee_nwk_gp_cmd_zcl_tunnel_opt_frame_type,
2723 { "Frame type", "zbee_nwk_gp.cmd.zcl_tunnel.opt.frame_type", FT_UINT8, BASE_HEX, NULL((void*)0),
2724 ZBEE_NWK_GP_CMD_ZCL_TUNNEL_OPT_FRAME_TYPE0x03, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2725
2726 { &hf_zbee_nwk_gp_cmd_zcl_tunnel_opt_man_field_present,
2727 { "Manufacturer field present", "zbee_nwk_gp.cmd.zcl_tunnel.opt.man_field_present", FT_BOOLEAN, 8, NULL((void*)0),
2728 ZBEE_NWK_GP_CMD_ZCL_TUNNEL_OPT_MAN_FIELD_PRESENT0x04, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2729
2730 { &hf_zbee_nwk_gp_cmd_zcl_tunnel_opt_direction,
2731 { "Direction", "zbee_nwk_gp.cmd.zcl_tunnel.opt.direction", FT_UINT8, BASE_HEX, NULL((void*)0),
2732 ZBEE_NWK_GP_CMD_ZCL_TUNNEL_OPT_DIRECTION0x08, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2733
2734 { &hf_zbee_nwk_gp_cmd_zcl_tunnel_opt,
2735 { "Option field", "zbee_nwk_gp.cmd.zcl_tunnel.opt", FT_UINT8, BASE_HEX, NULL((void*)0),
2736 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2737
2738 { &hf_zbee_nwk_gp_cmd_zcl_tunnel_command_id,
2739 { "Zigbee Command ID", "zbee_nwk_gp.cmd.zcl_tunnel.command_id", FT_UINT8, BASE_HEX, NULL((void*)0), 0x0,
2740 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2741
2742 { &hf_zbee_nwk_gp_cmd_zcl_tunnel_payload_len,
2743 { "Length of Payload", "zbee_nwk_gp.cmd.zcl_tunnel.payload_len", FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
2744 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2745
2746 { &hf_zbee_nwk_gp_cmd_compact_attr_report_report_id,
2747 { "Report Identifier", "zbee_nwk_gp.cmd.compact_attr_report.report_id", FT_UINT8, BASE_HEX, NULL((void*)0),
2748 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2749
2750 { &hf_zbee_nwk_gp_cmd_compact_attr_report_data_points,
2751 { "Data Points", "zbee_nwk_gp.cmd.compact_attr_report.data_points", FT_BYTES, BASE_NONE, NULL((void*)0),
2752 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2753
2754 { &hf_zbee_nwk_gp_cmd_app_desc_total_report,
2755 { "Total Number of Reports", "zbee_nwk_gp.app_desc.total_report", FT_UINT8, BASE_DEC, NULL((void*)0),
2756 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2757
2758 { &hf_zbee_nwk_gp_cmd_app_desc_num_report,
2759 { "Number of Reports", "zbee_nwk_gp.app_desc.num_report", FT_UINT8, BASE_DEC, NULL((void*)0),
2760 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2761
2762 { &hf_zbee_nwk_gp_cmd_app_desc_report_desc_id,
2763 { "Report Identifier", "zbee_nwk_gp.app_desc.report_desc.id", FT_UINT8, BASE_HEX, NULL((void*)0),
2764 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2765
2766 { &hf_zbee_nwk_gp_cmd_app_desc_report_desc_opt,
2767 { "Report Options", "zbee_nwk_gp.app_desc.report_desc.opt", FT_UINT8, BASE_HEX, NULL((void*)0),
2768 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2769
2770 { &hf_zbee_nwk_gp_cmd_app_desc_report_desc_opt_timeout_present,
2771 { "Timeout Present", "zbee_nwk_gp.app_desc.report_desc.opt.timeout_present", FT_BOOLEAN, 8, NULL((void*)0),
2772 ZBEE_NWK_GP_CMD_APP_DESC_REPORT_DESC_OPT_TIMEOUT_PRESENT0x01, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2773
2774 { &hf_zbee_nwk_gp_cmd_app_desc_report_desc_timeout,
2775 { "Timeout Period", "zbee_nwk_gp.app_desc.report_desc.timeout", FT_UINT16, BASE_DEC, NULL((void*)0),
2776 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2777
2778 { &hf_zbee_nwk_gp_cmd_app_desc_report_desc_len_remain,
2779 { "Remaining Length", "zbee_nwk_gp.app_desc.report_desc.len_remain", FT_UINT8, BASE_DEC, NULL((void*)0),
2780 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2781
2782 { &hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt,
2783 { "Data Point Options", "zbee_nwk_gp.app_desc.data_pt_desc.opt", FT_UINT8, BASE_HEX, NULL((void*)0),
2784 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2785
2786 { &hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt_num_recs,
2787 { "Number of Attribute Records", "zbee_nwk_gp.app_desc.data_pt_desc.opt.num_recs", FT_UINT8, BASE_DEC, NULL((void*)0),
2788 ZBEE_NWK_GP_CMD_APP_DESC_DATA_PT_DESC_OPT_ATTR_NUM0x07, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2789
2790 { &hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt_server,
2791 { "Server", "zbee_nwk_gp.app_desc.data_pt_desc.opt.server", FT_BOOLEAN, 8, NULL((void*)0),
2792 ZBEE_NWK_GP_CMD_APP_DESC_DATA_PT_DESC_OPT_SERVER0x08, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2793
2794 { &hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_opt_manu_id_present,
2795 { "Manufacturer ID Present", "zbee_nwk_gp.app_desc.data_pt_desc.opt.manu_id_present", FT_BOOLEAN, 8, NULL((void*)0),
2796 ZBEE_NWK_GP_CMD_APP_DESC_DATA_PT_DESC_OPT_MANU_ID_PRESENT0x10, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2797
2798 { &hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_cluster_id,
2799 { "Cluster ID", "zbee_nwk_gp.app_desc.data_pt_desc.cluster_id", FT_UINT16, BASE_HEX | BASE_RANGE_STRING0x00000100, RVALS(zbee_aps_cid_names)((0 ? (const struct _range_string*)0 : ((zbee_aps_cid_names))
))
,
2800 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2801
2802 { &hf_zbee_nwk_gp_cmd_app_desc_data_pt_desc_manu_id,
2803 { "Manufacturer ID", "zbee_nwk_gp.app_desc.data_pt_desc.manu_id", FT_UINT16, BASE_HEX, VALS(zbee_mfr_code_names)((0 ? (const struct _value_string*)0 : ((zbee_mfr_code_names)
)))
,
2804 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2805
2806 { &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_id,
2807 { "Attribute ID", "zbee_nwk_gp.app_desc.attr_rec.id", FT_UINT16, BASE_HEX, NULL((void*)0),
2808 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2809
2810 { &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_data_type,
2811 { "Attribute Data Type", "zbee_nwk_gp.app_desc.attr_rec.data_type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_short_data_type_names)((0 ? (const struct _value_string*)0 : ((zbee_zcl_short_data_type_names
))))
,
2812 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2813
2814 { &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt,
2815 { "Attribute Options", "zbee_nwk_gp.app_desc.attr_rec.opt", FT_UINT8, BASE_HEX, NULL((void*)0),
2816 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2817
2818 { &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt_len_remain,
2819 { "Remaining Attribute Record Length", "zbee_nwk_gp.app_desc.attr_rec.opt.len_remain", FT_UINT8, BASE_DEC, NULL((void*)0),
2820 ZBEE_NWK_GP_CMD_APP_DESC_ATTR_REC_OPT_LEN_REMAIN0x0F, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2821
2822 { &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt_reported,
2823 { "Reported", "zbee_nwk_gp.app_desc.attr_rec.opt.reported", FT_BOOLEAN, 8, NULL((void*)0),
2824 ZBEE_NWK_GP_CMD_APP_DESC_ATTR_REC_OPT_REPORTED0x10, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2825
2826 { &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_opt_val_present,
2827 { "Attribute Value Present", "zbee_nwk_gp.app_desc.attr_rec.opt.val_present", FT_BOOLEAN, 8, NULL((void*)0),
2828 ZBEE_NWK_GP_CMD_APP_DESC_ATTR_REC_OPT_VAL_PRESENT0x20, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2829
2830 { &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_offset,
2831 { "Attribute Offset within Report", "zbee_nwk_gp.app_desc.attr_rec.offset", FT_UINT8, BASE_DEC, NULL((void*)0),
2832 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2833
2834 { &hf_zbee_nwk_gp_cmd_app_desc_attr_rec_val,
2835 { "Attribute Value", "zbee_nwk_gp.app_desc.attr_rec.val", FT_BYTES, BASE_NONE, NULL((void*)0),
2836 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2837
2838 { &hf_zbee_zcl_gp_cmd_ms_manufacturer_code,
2839 { "Manufacturer Code", "zbee_nwk_gp.cmd.manufacturer_code", FT_UINT16, BASE_HEX, VALS(zbee_mfr_code_names)((0 ? (const struct _value_string*)0 : ((zbee_mfr_code_names)
)))
,
2840 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2841
2842 { &hf_zbee_nwk_gp_cmd_read_att_record_len,
2843 { "Length of Record List", "zbee_nwk_gp.cmd.read_att.record_len", FT_UINT8, BASE_DEC, NULL((void*)0), 0x0,
2844 NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2845
2846 { &hf_zbee_nwk_gp_zcl_attr_status,
2847 { "Status", "zbee_nwk_gp.zcl.attr.status", FT_UINT8, BASE_HEX, VALS(zbee_zcl_status_names)((0 ? (const struct _value_string*)0 : ((zbee_zcl_status_names
))))
,
2848 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2849
2850 { &hf_zbee_nwk_gp_zcl_attr_data_type,
2851 { "Data Type", "zbee_nwk_gp.zcl.attr.datatype", FT_UINT8, BASE_HEX, VALS(zbee_zcl_short_data_type_names)((0 ? (const struct _value_string*)0 : ((zbee_zcl_short_data_type_names
))))
,
2852 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) } },
2853
2854 { &hf_zbee_nwk_gp_zcl_attr_cluster_id,
2855 { "ZigBee Cluster ID", "zbee_nwk_gp.zcl.attr.cluster_id", FT_UINT16, BASE_HEX | BASE_RANGE_STRING0x00000100, RVALS(zbee_aps_cid_names)((0 ? (const struct _range_string*)0 : ((zbee_aps_cid_names))
))
,
2856 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2857
2858 { &hf_zbee_nwk_gp_cmd_channel_request_toggling_behaviour,
2859 { "Channel Toggling Behaviour", "zbee_nwk_gp.cmd.ch_req", FT_UINT8, BASE_HEX, NULL((void*)0),
2860 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2861
2862 { &hf_zbee_nwk_gp_cmd_channel_request_toggling_behaviour_1st,
2863 { "Rx channel in the next attempt", "zbee_nwk_gp.cmd.ch_req.1st", FT_UINT8, BASE_HEX, NULL((void*)0),
2864 ZBEE_NWK_GP_CMD_CHANNEL_REQUEST_1ST0x0F, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2865
2866 { &hf_zbee_nwk_gp_cmd_channel_request_toggling_behaviour_2nd,
2867 { "Rx channel in the second next attempt", "zbee_nwk_gp.ch_req.2nd", FT_UINT8, BASE_HEX, NULL((void*)0),
2868 ZBEE_NWK_GP_CMD_CHANNEL_REQUEST_2ND0xF0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2869
2870 { &hf_zbee_nwk_gp_cmd_operational_channel,
2871 { "Operational Channel", "zbee_nwk_gp.cmd.configuration_ch", FT_UINT8, BASE_HEX, NULL((void*)0),
2872 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2873
2874 { &hf_zbee_nwk_gp_cmd_channel_configuration,
2875 { "Operation channel", "zbee_nwk_gp.cmd.configuration_ch.operation_ch", FT_UINT8, BASE_HEX, NULL((void*)0),
2876 ZBEE_NWK_GP_CMD_CHANNEL_CONFIGURATION_OPERATION_CH0x0F, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2877
2878 { &hf_zbee_nwk_gp_cmd_move_color_ratex,
2879 { "RateX", "zbee_nwk_gp.cmd.move_color.ratex", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2880
2881 { &hf_zbee_nwk_gp_cmd_move_color_ratey,
2882 { "RateY", "zbee_nwk_gp.cmd.move_color.ratey", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2883
2884 { &hf_zbee_nwk_gp_cmd_move_up_down_rate,
2885 { "Rate", "zbee_nwk_gp.cmd.move_up_down.rate", FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2886
2887 { &hf_zbee_nwk_gp_cmd_step_color_stepx,
2888 { "StepX", "zbee_nwk_gp.cmd.step_color.stepx", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2889
2890 { &hf_zbee_nwk_gp_cmd_step_color_stepy,
2891 { "StepY", "zbee_nwk_gp.cmd.step_color.stepy", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2892
2893 { &hf_zbee_nwk_gp_cmd_step_color_transition_time,
2894 { "Transition Time", "zbee_nwk_gp.cmd.step_color.transition_time", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0),
2895 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2896
2897 { &hf_zbee_nwk_gp_cmd_step_up_down_step_size,
2898 { "Step Size", "zbee_nwk_gp.cmd.step_up_down.step_size", FT_UINT8, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0), HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }},
2899
2900 { &hf_zbee_nwk_gp_cmd_step_up_down_transition_time,
2901 { "Transition Time", "zbee_nwk_gp.cmd.step_up_down.transition_time", FT_UINT16, BASE_DEC, NULL((void*)0), 0x0, NULL((void*)0),
2902 HFILL-1, 0, HF_REF_TYPE_NONE, -1, ((void*)0) }}
2903 };
2904
2905 static ei_register_info ei[] = {
2906 { &ei_zbee_nwk_gp_no_payload,
2907 { "zbee_nwk_gp.no_payload", PI_MALFORMED0x07000000, PI_ERROR0x00800000,
2908 "Payload is missing", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
2909 { &ei_zbee_nwk_gp_inval_residual_data,
2910 { "zbee_nwk_gp.inval_residual_data", PI_MALFORMED0x07000000, PI_ERROR0x00800000,
2911 "Invalid residual data", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}},
2912 { &ei_zbee_nwk_gp_com_rep_no_out_cnt,
2913 { "zbee_nwk_gp.com_rep_no_out_cnt", PI_DEBUG0x08000000, PI_WARN0x00600000,
2914 "Missing outgoing frame counter", EXPFILL0, ((void*)0), 0, ((void*)0), {0, {((void*)0), ((void*)0), FT_NONE
, BASE_NONE, ((void*)0), 0, ((void*)0), -1, 0, HF_REF_TYPE_NONE
, -1, ((void*)0)}}
}}
2915 };
2916
2917 static int *ett[] = {
2918 &ett_zbee_nwk,
2919 &ett_zbee_nwk_cmd,
2920 &ett_zbee_nwk_cmd_cinfo,
2921 &ett_zbee_nwk_cmd_appli_info,
2922 &ett_zbee_nwk_cmd_options,
2923 &ett_zbee_nwk_fcf,
2924 &ett_zbee_nwk_fcf_ext,
2925 &ett_zbee_nwk_clu_rec,
2926 &ett_zbee_nwk_att_rec,
2927 &ett_zbee_nwk_cmd_app_desc_report_desc,
2928 &ett_zbee_nwk_cmd_app_desc_data_pt_desc,
2929 &ett_zbee_nwk_cmd_app_desc_data_pt_options,
2930 &ett_zbee_nwk_cmd_app_desc_att_rec,
2931 &ett_zbee_nwk_cmd_comm_gpd_cmd_id_list,
2932 &ett_zbee_nwk_cmd_comm_length_of_clid_list,
2933 &ett_zbee_nwk_cmd_comm_clid_list_server,
2934 &ett_zbee_nwk_cmd_comm_clid_list_client,
2935 &ett_zbee_nwk_cmd_comm_switch_info,
2936 &ett_zbee_nwk_cmd_comm_switch_info_generic_switch_config
2937 };
2938
2939 static uat_field_t key_uat_fields[] = {
2940 UAT_FLD_CSTRING(gp_uat_key_records, string, "Key", "A 16-byte key."){"string", "Key", PT_TXTMOD_STRING,{uat_fld_chk_str,gp_uat_key_records_string_set_cb
,gp_uat_key_records_string_tostr_cb},{0,0,0},0,"A 16-byte key."
,((void*)0)}
,
2941 UAT_FLD_VS(gp_uat_key_records, byte_order, "Byte Order", byte_order_vals, "Byte order of a key."){"byte_order", "Byte Order", PT_TXTMOD_ENUM,{uat_fld_chk_enum
,gp_uat_key_records_byte_order_set_cb,gp_uat_key_records_byte_order_tostr_cb
},{&(byte_order_vals),&(byte_order_vals),&(byte_order_vals
)},&(byte_order_vals),"Byte order of a key.",((void*)0)}
,
2942 UAT_FLD_LSTRING(gp_uat_key_records, label, "Label", "User label for a key."){"label", "Label", PT_TXTMOD_STRING,{0,gp_uat_key_records_label_set_cb
,gp_uat_key_records_label_tostr_cb},{0,0,0},0,"User label for a key."
,((void*)0)}
,
2943 UAT_END_FIELDS{((void*)0),((void*)0),PT_TXTMOD_NONE,{0,0,0},{0,0,0},0,0,((void
*)0)}
2944 };
2945
2946 proto_zbee_nwk_gp = proto_register_protocol("ZigBee Green Power Profile", "ZigBee Green Power",
2947 ZBEE_PROTOABBREV_NWK_GP"zbee_nwk_gp");
2948
2949 gp_zbee_prefs = prefs_register_protocol(proto_zbee_nwk_gp, NULL((void*)0));
2950
2951 zbee_gp_sec_key_table_uat = uat_new("ZigBee GP Security Keys", sizeof(uat_key_record_t), "zigbee_gp_keys", true1,
2952 &gp_uat_key_records, &num_uat_key_records, UAT_AFFECTS_DISSECTION0x00000001, NULL((void*)0), uat_key_record_copy_cb,
2953 uat_key_record_update_cb, uat_key_record_free_cb, uat_key_record_post_update_cb, NULL((void*)0), key_uat_fields);
2954
2955 prefs_register_uat_preference(gp_zbee_prefs, "gp_key_table", "Pre-configured GP Security Keys",
2956 "Pre-configured GP Security Keys.", zbee_gp_sec_key_table_uat);
2957
2958 register_init_routine(gp_init_zbee_security);
2959 register_cleanup_routine(gp_cleanup_zbee_security);
2960
2961 /* Register the Wireshark protocol. */
2962 proto_register_field_array(proto_zbee_nwk_gp, hf, array_length(hf)(sizeof (hf) / sizeof (hf)[0]));
2963 proto_register_subtree_array(ett, array_length(ett)(sizeof (ett) / sizeof (ett)[0]));
2964
2965 expert_zbee_nwk_gp = expert_register_protocol(proto_zbee_nwk_gp);
2966 expert_register_field_array(expert_zbee_nwk_gp, ei, array_length(ei)(sizeof (ei) / sizeof (ei)[0]));
2967
2968 /* Register the dissectors. */
2969 register_dissector(ZBEE_PROTOABBREV_NWK_GP"zbee_nwk_gp", dissect_zbee_nwk_gp, proto_zbee_nwk_gp);
2970 register_dissector(ZBEE_PROTOABBREV_NWK_GP_CMD"zbee_nwk_gp_cmd", dissect_zbee_nwk_gp_cmd, proto_zbee_nwk_gp);
2971} /* proto_register_zbee_nwk_gp */
2972
2973/**
2974 *Registers the ZigBee dissector with Wireshark.
2975 *
2976*/
2977void
2978proto_reg_handoff_zbee_nwk_gp(void)
2979{
2980 /* Register our dissector with IEEE 802.15.4. */
2981 dissector_add_for_decode_as(IEEE802154_PROTOABBREV_WPAN_PANID"wpan.panid", find_dissector(ZBEE_PROTOABBREV_NWK_GP"zbee_nwk_gp"));
2982 heur_dissector_add(IEEE802154_PROTOABBREV_WPAN"wpan", dissect_zbee_nwk_heur_gp, "ZigBee Green Power over IEEE 802.15.4", "zbee_nwk_gp_wlan", proto_zbee_nwk_gp, HEURISTIC_ENABLE);
2983} /* proto_reg_handoff_zbee */
2984
2985/*
2986 * Editor modelines
2987 *
2988 * Local Variables:
2989 * c-basic-offset: 4
2990 * tab-width: 8
2991 * indent-tabs-mode: nil
2992 * End:
2993 *
2994 * ex: set shiftwidth=4 tabstop=8 expandtab:
2995 * :indentSize=4:tabSize=8:noTabs=true:
2996 */