Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-zbee-zcl.c
blob39a4a94803a2213c9269718d5df899f04c9f8bc9
1 /* packet-zbee-zcl.c
2 * Dissector routines for the ZigBee Cluster Library (ZCL)
3 * By Fred Fierling <fff@exegin.com>
4 * Copyright 2009 Exegin Technologies Limited
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * Used Owen Kirby's packet-zbee-aps module as a template. Based
11 * on ZigBee Cluster Library Specification document 075123r02ZB
13 * SPDX-License-Identifier: GPL-2.0-or-later
16 /* Include Files */
17 #include "config.h"
19 #include <epan/packet.h>
20 #include <epan/expert.h>
21 #include <epan/to_str.h>
22 #include <epan/tfs.h>
24 #include <wsutil/array.h>
25 #include <wsutil/epochs.h>
27 #include "packet-zbee.h"
28 #include "packet-zbee-nwk.h"
29 #include "packet-zbee-zcl.h"
31 /*************************
32 * Function Declarations *
33 *************************
35 void proto_register_zbee_zcl(void);
36 void proto_reg_handoff_zbee_zcl(void);
38 /* Command Dissector Helpers */
39 static void dissect_zcl_write_attr_resp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
40 static void dissect_zcl_config_report (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
41 static void dissect_zcl_config_report_resp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
42 static void dissect_zcl_read_report_config (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
43 static void dissect_zcl_read_report_config_resp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
44 static void dissect_zcl_default_resp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset);
45 static void dissect_zcl_discover_attr (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset);
46 static void dissect_zcl_discover_attr_resp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
47 static void dissect_zcl_read_attr_struct(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, unsigned* offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
48 static void dissect_zcl_write_attr_struct(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, unsigned* offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
49 static void dissect_zcl_write_attr_struct_resp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, unsigned* offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
50 static void dissect_zcl_discover_cmd_rec(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, unsigned* offset);
51 static void dissect_zcl_discover_cmd_rec_resp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, unsigned* offset);
52 //static void dissect_zcl_discover_attr_extended_resp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
54 /* Helper routines */
55 static void dissect_zcl_attr_data_general(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint16_t attr_id, unsigned data_type, uint16_t cluster_id, uint16_t mfr_code, bool client_attr);
56 static void zcl_dump_data(tvbuff_t *tvb, unsigned offset, packet_info *pinfo, proto_tree *tree);
58 static void dissect_zcl_array_type(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint8_t elements_type, uint16_t elements_num, bool client_attr);
59 static void dissect_zcl_set_type(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint8_t elements_type, uint16_t elements_num, bool client_attr);
61 static zbee_zcl_cluster_desc *zbee_zcl_get_cluster_desc(uint16_t cluster_id, uint16_t mfr_code);
62 static void dissect_zcl_discover_cmd_attr_extended_resp(tvbuff_t* tvb, packet_info* pinfo _U_, proto_tree* tree, unsigned* offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
63 /********************
64 * Global Variables *
65 ********************
68 #define ZBEE_ZCL_INVALID_STR_LENGTH 0xff
69 #define ZBEE_ZCL_INVALID_LONG_STR_LENGTH 0xffff
71 /* Header Field Indices. */
72 static int proto_zbee_zcl;
73 static int hf_zbee_zcl_fcf_frame_type;
74 static int hf_zbee_zcl_fcf_mfr_spec;
75 static int hf_zbee_zcl_fcf_dir;
76 static int hf_zbee_zcl_fcf_disable_default_resp;
77 static int hf_zbee_zcl_mfr_code;
78 static int hf_zbee_zcl_tran_seqno;
79 static int hf_zbee_zcl_cmd_id;
80 static int hf_zbee_zcl_cs_cmd_id;
81 static int hf_zbee_zcl_cmd_id_rsp;
82 static int hf_zbee_zcl_attr_id;
83 static int hf_zbee_zcl_attr_data_type;
84 static int hf_zbee_zcl_attr_access_ctrl;
85 static int hf_zbee_zcl_indicator;
86 static int hf_zbee_zcl_index;
87 static int hf_zbee_zcl_cmd_start;
88 static int hf_zbee_zcl_cmd_maxnum;
89 static int hf_zbee_zcl_attr_boolean;
90 static int hf_zbee_zcl_attr_bitmap8;
91 static int hf_zbee_zcl_attr_bitmap16;
92 static int hf_zbee_zcl_attr_bitmap24;
93 static int hf_zbee_zcl_attr_bitmap32;
94 static int hf_zbee_zcl_attr_bitmap40;
95 static int hf_zbee_zcl_attr_bitmap48;
96 static int hf_zbee_zcl_attr_bitmap56;
97 static int hf_zbee_zcl_attr_bitmap64;
98 static int hf_zbee_zcl_attr_uint8;
99 static int hf_zbee_zcl_attr_uint16;
100 static int hf_zbee_zcl_attr_uint24;
101 static int hf_zbee_zcl_attr_uint32;
102 static int hf_zbee_zcl_attr_uint40;
103 static int hf_zbee_zcl_attr_uint48;
104 static int hf_zbee_zcl_attr_uint56;
105 static int hf_zbee_zcl_attr_uint64;
106 static int hf_zbee_zcl_attr_int8;
107 static int hf_zbee_zcl_attr_int16;
108 static int hf_zbee_zcl_attr_int24;
109 static int hf_zbee_zcl_attr_int32;
110 static int hf_zbee_zcl_attr_int64;
111 /* static int hf_zbee_zcl_attr_semi; */
112 static int hf_zbee_zcl_attr_float;
113 static int hf_zbee_zcl_attr_double;
114 static int hf_zbee_zcl_attr_bytes;
115 static int hf_zbee_zcl_attr_minint;
116 static int hf_zbee_zcl_attr_maxint;
117 static int hf_zbee_zcl_attr_timeout;
118 static int hf_zbee_zcl_attr_cid;
119 static int hf_zbee_zcl_attr_hours;
120 static int hf_zbee_zcl_attr_mins;
121 static int hf_zbee_zcl_attr_secs;
122 static int hf_zbee_zcl_attr_csecs;
123 static int hf_zbee_zcl_attr_yy;
124 static int hf_zbee_zcl_attr_mm;
125 static int hf_zbee_zcl_attr_md;
126 static int hf_zbee_zcl_attr_wd;
127 static int hf_zbee_zcl_attr_utc;
128 static int hf_zbee_zcl_attr_utc_raw;
129 static int hf_zbee_zcl_attr_status;
130 static int hf_zbee_zcl_attr_dir;
131 static int hf_zbee_zcl_attr_dis;
132 static int hf_zbee_zcl_attr_start;
133 static int hf_zbee_zcl_attr_maxnum;
134 static int hf_zbee_zcl_attr_str;
135 static int hf_zbee_zcl_attr_ostr;
136 static int hf_zbee_zcl_attr_array_elements_type;
137 static int hf_zbee_zcl_attr_array_elements_num;
138 static int hf_zbee_zcl_attr_set_elements_type;
139 static int hf_zbee_zcl_attr_set_elements_num;
140 static int hf_zbee_zcl_attr_bag_elements_type;
141 static int hf_zbee_zcl_attr_bag_elements_num;
143 /* Subtree indices. */
145 #define ZBEE_ZCL_NUM_INDIVIDUAL_ETT 2
146 #define ZBEE_ZCL_NUM_ATTR_ETT 64
147 #define ZBEE_ZCL_NUM_SEL_ETT 16
148 #define ZBEE_ZCL_NUM_ARRAY_ELEM_ETT 16
149 #define ZBEE_ZCL_NUM_TOTAL_ETT (ZBEE_ZCL_NUM_INDIVIDUAL_ETT + ZBEE_ZCL_NUM_ATTR_ETT + ZBEE_ZCL_NUM_SEL_ETT + ZBEE_ZCL_NUM_ARRAY_ELEM_ETT)
151 static int ett_zbee_zcl;
152 static int ett_zbee_zcl_fcf;
153 static int ett_zbee_zcl_attr[ZBEE_ZCL_NUM_ATTR_ETT];
154 static int ett_zbee_zcl_sel[ZBEE_ZCL_NUM_SEL_ETT];
155 static int ett_zbee_zcl_array_elements[ZBEE_ZCL_NUM_ARRAY_ELEM_ETT];
157 static expert_field ei_cfg_rpt_rsp_short_non_success;
158 static expert_field ei_zbee_zero_length_element;
160 /* Dissector List. */
161 static dissector_table_t zbee_zcl_dissector_table;
163 /* Global variables */
164 static uint16_t zcl_cluster_id = -1;
165 static uint16_t zcl_mfr_code = -1;
167 static GList *acluster_desc;
169 /********************/
170 /* Field Names */
171 /********************/
172 /* Frame Type Names */
173 static const value_string zbee_zcl_frame_types[] = {
174 { ZBEE_ZCL_FCF_PROFILE_WIDE, "Profile-wide" },
175 { ZBEE_ZCL_FCF_CLUSTER_SPEC, "Cluster-specific" },
176 { 0, NULL }
178 /* ZCL Command Names */
179 static const value_string zbee_zcl_cmd_names[] = {
180 { ZBEE_ZCL_CMD_READ_ATTR, "Read Attributes" },
181 { ZBEE_ZCL_CMD_READ_ATTR_RESP, "Read Attributes Response" },
182 { ZBEE_ZCL_CMD_WRITE_ATTR, "Write Attributes" },
183 { ZBEE_ZCL_CMD_WRITE_ATTR_UNDIVIDED, "Write Attributes Undivided" },
184 { ZBEE_ZCL_CMD_WRITE_ATTR_RESP, "Write Attributes Response" },
185 { ZBEE_ZCL_CMD_WRITE_ATTR_NO_RESP, "Write Attributes No Response" },
186 { ZBEE_ZCL_CMD_CONFIG_REPORT, "Configure Reporting" },
187 { ZBEE_ZCL_CMD_CONFIG_REPORT_RESP, "Configure Reporting Response" },
188 { ZBEE_ZCL_CMD_READ_REPORT_CONFIG, "Read Reporting Configuration" },
189 { ZBEE_ZCL_CMD_READ_REPORT_CONFIG_RESP, "Read Reporting Configuration Response" },
190 { ZBEE_ZCL_CMD_REPORT_ATTR, "Report Attributes" },
191 { ZBEE_ZCL_CMD_DEFAULT_RESP, "Default Response" },
192 { ZBEE_ZCL_CMD_DISCOVER_ATTR, "Discover Attributes" },
193 { ZBEE_ZCL_CMD_DISCOVER_ATTR_RESP, "Discover Attributes Response" },
194 { ZBEE_ZCL_CMD_READ_ATTR_STRUCT, "Read Attributes Structured" },
195 { ZBEE_ZCL_CMD_WRITE_ATTR_STRUCT, "Write Attributes Structured" },
196 { ZBEE_ZCL_CMD_WRITE_ATTR_STRUCT_RESP, "Write Attributes Structured Response" },
197 { ZBEE_ZCL_CMD_DISCOVER_CMDS_REC, "Discover Commands Received" },
198 { ZBEE_ZCL_CMD_DISCOVER_CMDS_REC_RESP, "Discover Commands Received Response" },
199 { ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN, "Discover Commands Generated" },
200 { ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN_RESP, "Discover Commands Generated Response" },
201 { ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED, "Discover Attributes Extended" },
202 { ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED_RESP, "Discover Attributes Extended Response" },
203 { 0, NULL }
207 static value_string_ext zbee_zcl_cmd_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_cmd_names);
209 /* ZCL Cluster-Specific Command Names */
210 static const value_string zbee_zcl_cs_cmd_names[] = {
211 { 0, NULL }
214 /* ZigBee Manufacturer Code Table */
215 /* Per: 053874r74, June 2021 */
216 const value_string zbee_mfr_code_names[] = {
217 { ZBEE_MFG_CODE_PANASONIC_RF4CE, ZBEE_MFG_PANASONIC },
218 { ZBEE_MFG_CODE_SONY_RF4CE, ZBEE_MFG_SONY },
219 { ZBEE_MFG_CODE_SAMSUNG_RF4CE, ZBEE_MFG_SAMSUNG },
220 { ZBEE_MFG_CODE_PHILIPS_RF4CE, ZBEE_MFG_PHILIPS },
221 { ZBEE_MFG_CODE_FREESCALE_RF4CE, ZBEE_MFG_FREESCALE },
222 { ZBEE_MFG_CODE_OKI_SEMI_RF4CE, ZBEE_MFG_OKI_SEMI },
223 { ZBEE_MFG_CODE_TI_RF4CE, ZBEE_MFG_TI },
224 { ZBEE_MFG_CODE_CIRRONET, ZBEE_MFG_CIRRONET },
225 { ZBEE_MFG_CODE_CHIPCON, ZBEE_MFG_CHIPCON },
226 { ZBEE_MFG_CODE_EMBER, ZBEE_MFG_EMBER },
227 { ZBEE_MFG_CODE_NTS, ZBEE_MFG_NTS },
228 { ZBEE_MFG_CODE_FREESCALE, ZBEE_MFG_FREESCALE },
229 { ZBEE_MFG_CODE_IPCOM, ZBEE_MFG_IPCOM },
230 { ZBEE_MFG_CODE_SAN_JUAN, ZBEE_MFG_SAN_JUAN },
231 { ZBEE_MFG_CODE_TUV, ZBEE_MFG_TUV },
232 { ZBEE_MFG_CODE_COMPXS, ZBEE_MFG_COMPXS },
233 { ZBEE_MFG_CODE_BM, ZBEE_MFG_BM },
234 { ZBEE_MFG_CODE_AWAREPOINT, ZBEE_MFG_AWAREPOINT },
235 { ZBEE_MFG_CODE_PHILIPS, ZBEE_MFG_PHILIPS },
236 { ZBEE_MFG_CODE_LUXOFT, ZBEE_MFG_LUXOFT },
237 { ZBEE_MFG_CODE_KORWIN, ZBEE_MFG_KORWIN },
238 { ZBEE_MFG_CODE_1_RF, ZBEE_MFG_1_RF },
239 { ZBEE_MFG_CODE_STG, ZBEE_MFG_STG },
240 { ZBEE_MFG_CODE_TELEGESIS, ZBEE_MFG_TELEGESIS },
241 { ZBEE_MFG_CODE_VISIONIC, ZBEE_MFG_VISIONIC },
242 { ZBEE_MFG_CODE_INSTA, ZBEE_MFG_INSTA },
243 { ZBEE_MFG_CODE_ATALUM, ZBEE_MFG_ATALUM },
244 { ZBEE_MFG_CODE_ATMEL, ZBEE_MFG_ATMEL },
245 { ZBEE_MFG_CODE_DEVELCO, ZBEE_MFG_DEVELCO },
246 { ZBEE_MFG_CODE_HONEYWELL1, ZBEE_MFG_HONEYWELL },
247 { ZBEE_MFG_CODE_RADIO_PULSE, ZBEE_MFG_RADIO_PULSE },
248 { ZBEE_MFG_CODE_RENESAS, ZBEE_MFG_RENESAS },
249 { ZBEE_MFG_CODE_XANADU, ZBEE_MFG_XANADU },
250 { ZBEE_MFG_CODE_NEC, ZBEE_MFG_NEC },
251 { ZBEE_MFG_CODE_YAMATAKE, ZBEE_MFG_YAMATAKE },
252 { ZBEE_MFG_CODE_TENDRIL, ZBEE_MFG_TENDRIL },
253 { ZBEE_MFG_CODE_ASSA, ZBEE_MFG_ASSA },
254 { ZBEE_MFG_CODE_MAXSTREAM, ZBEE_MFG_MAXSTREAM },
255 { ZBEE_MFG_CODE_NEUROCOM, ZBEE_MFG_NEUROCOM },
256 { ZBEE_MFG_CODE_III, ZBEE_MFG_III },
257 { ZBEE_MFG_CODE_VANTAGE, ZBEE_MFG_VANTAGE },
258 { ZBEE_MFG_CODE_ICONTROL, ZBEE_MFG_ICONTROL },
259 { ZBEE_MFG_CODE_RAYMARINE, ZBEE_MFG_RAYMARINE },
260 { ZBEE_MFG_CODE_LSR, ZBEE_MFG_LSR },
261 { ZBEE_MFG_CODE_ONITY, ZBEE_MFG_ONITY },
262 { ZBEE_MFG_CODE_MONO, ZBEE_MFG_MONO },
263 { ZBEE_MFG_CODE_RFT, ZBEE_MFG_RFT },
264 { ZBEE_MFG_CODE_ITRON, ZBEE_MFG_ITRON },
265 { ZBEE_MFG_CODE_TRITECH, ZBEE_MFG_TRITECH },
266 { ZBEE_MFG_CODE_EMBEDIT, ZBEE_MFG_EMBEDIT },
267 { ZBEE_MFG_CODE_S3C, ZBEE_MFG_S3C },
268 { ZBEE_MFG_CODE_SIEMENS, ZBEE_MFG_SIEMENS },
269 { ZBEE_MFG_CODE_MINDTECH, ZBEE_MFG_MINDTECH },
270 { ZBEE_MFG_CODE_LGE, ZBEE_MFG_LGE },
271 { ZBEE_MFG_CODE_MITSUBISHI, ZBEE_MFG_MITSUBISHI },
272 { ZBEE_MFG_CODE_JOHNSON, ZBEE_MFG_JOHNSON },
273 { ZBEE_MFG_CODE_PRI, ZBEE_MFG_PRI },
274 { ZBEE_MFG_CODE_KNICK, ZBEE_MFG_KNICK },
275 { ZBEE_MFG_CODE_VICONICS, ZBEE_MFG_VICONICS },
276 { ZBEE_MFG_CODE_FLEXIPANEL, ZBEE_MFG_FLEXIPANEL },
277 { ZBEE_MFG_CODE_PIASIM, ZBEE_MFG_PIASIM },
278 { ZBEE_MFG_CODE_TRANE, ZBEE_MFG_TRANE },
279 { ZBEE_MFG_CODE_JENNIC, ZBEE_MFG_JENNIC },
280 { ZBEE_MFG_CODE_LIG, ZBEE_MFG_LIG },
281 { ZBEE_MFG_CODE_ALERTME, ZBEE_MFG_ALERTME },
282 { ZBEE_MFG_CODE_DAINTREE, ZBEE_MFG_DAINTREE },
283 { ZBEE_MFG_CODE_AIJI, ZBEE_MFG_AIJI },
284 { ZBEE_MFG_CODE_TEL_ITALIA, ZBEE_MFG_TEL_ITALIA },
285 { ZBEE_MFG_CODE_MIKROKRETS, ZBEE_MFG_MIKROKRETS },
286 { ZBEE_MFG_CODE_OKI_SEMI, ZBEE_MFG_OKI_SEMI },
287 { ZBEE_MFG_CODE_NEWPORT, ZBEE_MFG_NEWPORT },
288 { ZBEE_MFG_CODE_C4, ZBEE_MFG_C4 },
289 { ZBEE_MFG_CODE_STM, ZBEE_MFG_STM },
290 { ZBEE_MFG_CODE_ASN, ZBEE_MFG_ASN },
291 { ZBEE_MFG_CODE_DCSI, ZBEE_MFG_DCSI },
292 { ZBEE_MFG_CODE_FRANCE_TEL, ZBEE_MFG_FRANCE_TEL },
293 { ZBEE_MFG_CODE_MUNET, ZBEE_MFG_MUNET },
294 { ZBEE_MFG_CODE_AUTANI, ZBEE_MFG_AUTANI },
295 { ZBEE_MFG_CODE_COL_VNET, ZBEE_MFG_COL_VNET },
296 { ZBEE_MFG_CODE_AEROCOMM, ZBEE_MFG_AEROCOMM },
297 { ZBEE_MFG_CODE_SI_LABS, ZBEE_MFG_SI_LABS },
298 { ZBEE_MFG_CODE_INNCOM, ZBEE_MFG_INNCOM },
299 { ZBEE_MFG_CODE_CANNON, ZBEE_MFG_CANNON },
300 { ZBEE_MFG_CODE_SYNAPSE, ZBEE_MFG_SYNAPSE },
301 { ZBEE_MFG_CODE_FPS, ZBEE_MFG_FPS },
302 { ZBEE_MFG_CODE_CLS, ZBEE_MFG_CLS },
303 { ZBEE_MFG_CODE_CRANE, ZBEE_MFG_CRANE },
304 { ZBEE_MFG_CODE_MOBILARM, ZBEE_MFG_MOBILARM },
305 { ZBEE_MFG_CODE_IMONITOR, ZBEE_MFG_IMONITOR },
306 { ZBEE_MFG_CODE_BARTECH, ZBEE_MFG_BARTECH },
307 { ZBEE_MFG_CODE_MESHNETICS, ZBEE_MFG_MESHNETICS },
308 { ZBEE_MFG_CODE_LS_IND, ZBEE_MFG_LS_IND },
309 { ZBEE_MFG_CODE_CASON, ZBEE_MFG_CASON },
310 { ZBEE_MFG_CODE_WLESS_GLUE, ZBEE_MFG_WLESS_GLUE },
311 { ZBEE_MFG_CODE_ELSTER, ZBEE_MFG_ELSTER },
312 { ZBEE_MFG_CODE_SMS_TEC, ZBEE_MFG_SMS_TEC },
313 { ZBEE_MFG_CODE_ONSET, ZBEE_MFG_ONSET },
314 { ZBEE_MFG_CODE_RIGA, ZBEE_MFG_RIGA },
315 { ZBEE_MFG_CODE_ENERGATE, ZBEE_MFG_ENERGATE },
316 { ZBEE_MFG_CODE_CONMED, ZBEE_MFG_CONMED },
317 { ZBEE_MFG_CODE_POWERMAND, ZBEE_MFG_POWERMAND },
318 { ZBEE_MFG_CODE_SCHNEIDER, ZBEE_MFG_SCHNEIDER },
319 { ZBEE_MFG_CODE_EATON, ZBEE_MFG_EATON },
320 { ZBEE_MFG_CODE_TELULAR, ZBEE_MFG_TELULAR },
321 { ZBEE_MFG_CODE_DELPHI, ZBEE_MFG_DELPHI },
322 { ZBEE_MFG_CODE_EPISENSOR, ZBEE_MFG_EPISENSOR },
323 { ZBEE_MFG_CODE_LANDIS_GYR, ZBEE_MFG_LANDIS_GYR },
324 { ZBEE_MFG_CODE_KABA, ZBEE_MFG_KABA },
325 { ZBEE_MFG_CODE_SHURE, ZBEE_MFG_SHURE },
326 { ZBEE_MFG_CODE_COMVERGE, ZBEE_MFG_COMVERGE },
327 { ZBEE_MFG_CODE_DBS_LODGING, ZBEE_MFG_DBS_LODGING },
328 { ZBEE_MFG_CODE_ENERGY_AWARE, ZBEE_MFG_ENERGY_AWARE },
329 { ZBEE_MFG_CODE_HIDALGO, ZBEE_MFG_HIDALGO },
330 { ZBEE_MFG_CODE_AIR2APP, ZBEE_MFG_AIR2APP },
331 { ZBEE_MFG_CODE_AMX, ZBEE_MFG_AMX },
332 { ZBEE_MFG_CODE_EDMI, ZBEE_MFG_EDMI },
333 { ZBEE_MFG_CODE_CYAN, ZBEE_MFG_CYAN },
334 { ZBEE_MFG_CODE_SYS_SPA, ZBEE_MFG_SYS_SPA },
335 { ZBEE_MFG_CODE_TELIT, ZBEE_MFG_TELIT },
336 { ZBEE_MFG_CODE_KAGA, ZBEE_MFG_KAGA },
337 { ZBEE_MFG_CODE_4_NOKS, ZBEE_MFG_4_NOKS },
338 { ZBEE_MFG_CODE_CERTICOM, ZBEE_MFG_CERTICOM },
339 { ZBEE_MFG_CODE_GRIDPOINT, ZBEE_MFG_GRIDPOINT },
340 { ZBEE_MFG_CODE_PROFILE_SYS, ZBEE_MFG_PROFILE_SYS },
341 { ZBEE_MFG_CODE_COMPACTA, ZBEE_MFG_COMPACTA },
342 { ZBEE_MFG_CODE_FREESTYLE, ZBEE_MFG_FREESTYLE },
343 { ZBEE_MFG_CODE_ALEKTRONA, ZBEE_MFG_ALEKTRONA },
344 { ZBEE_MFG_CODE_COMPUTIME, ZBEE_MFG_COMPUTIME },
345 { ZBEE_MFG_CODE_REMOTE_TECH, ZBEE_MFG_REMOTE_TECH },
346 { ZBEE_MFG_CODE_WAVECOM, ZBEE_MFG_WAVECOM },
347 { ZBEE_MFG_CODE_ENERGY, ZBEE_MFG_ENERGY },
348 { ZBEE_MFG_CODE_GE, ZBEE_MFG_GE },
349 { ZBEE_MFG_CODE_JETLUN, ZBEE_MFG_JETLUN },
350 { ZBEE_MFG_CODE_CIPHER, ZBEE_MFG_CIPHER },
351 { ZBEE_MFG_CODE_CORPORATE, ZBEE_MFG_CORPORATE },
352 { ZBEE_MFG_CODE_ECOBEE, ZBEE_MFG_ECOBEE },
353 { ZBEE_MFG_CODE_SMK, ZBEE_MFG_SMK },
354 { ZBEE_MFG_CODE_MESHWORKS, ZBEE_MFG_MESHWORKS },
355 { ZBEE_MFG_CODE_ELLIPS, ZBEE_MFG_ELLIPS },
356 { ZBEE_MFG_CODE_SECURE, ZBEE_MFG_SECURE },
357 { ZBEE_MFG_CODE_CEDO, ZBEE_MFG_CEDO },
358 { ZBEE_MFG_CODE_TOSHIBA, ZBEE_MFG_TOSHIBA },
359 { ZBEE_MFG_CODE_DIGI, ZBEE_MFG_DIGI },
360 { ZBEE_MFG_CODE_UBILOGIX, ZBEE_MFG_UBILOGIX },
361 { ZBEE_MFG_CODE_ECHELON, ZBEE_MFG_ECHELON },
362 { ZBEE_MFG_CODE_GREEN_ENERGY, ZBEE_MFG_GREEN_ENERGY },
363 { ZBEE_MFG_CODE_SILVER_SPRING, ZBEE_MFG_SILVER_SPRING },
364 { ZBEE_MFG_CODE_BLACK, ZBEE_MFG_BLACK },
365 { ZBEE_MFG_CODE_AZTECH_ASSOC, ZBEE_MFG_AZTECH_ASSOC },
366 { ZBEE_MFG_CODE_A_AND_D, ZBEE_MFG_A_AND_D },
367 { ZBEE_MFG_CODE_RAINFOREST, ZBEE_MFG_RAINFOREST },
368 { ZBEE_MFG_CODE_CARRIER, ZBEE_MFG_CARRIER },
369 { ZBEE_MFG_CODE_SYCHIP, ZBEE_MFG_SYCHIP },
370 { ZBEE_MFG_CODE_OPEN_PEAK, ZBEE_MFG_OPEN_PEAK },
371 { ZBEE_MFG_CODE_PASSIVE, ZBEE_MFG_PASSIVE },
372 { ZBEE_MFG_CODE_MMB, ZBEE_MFG_MMB },
373 { ZBEE_MFG_CODE_LEVITON, ZBEE_MFG_LEVITON },
374 { ZBEE_MFG_CODE_KOREA_ELEC, ZBEE_MFG_KOREA_ELEC },
375 { ZBEE_MFG_CODE_COMCAST1, ZBEE_MFG_COMCAST },
376 { ZBEE_MFG_CODE_NEC_ELEC, ZBEE_MFG_NEC_ELEC },
377 { ZBEE_MFG_CODE_NETVOX, ZBEE_MFG_NETVOX },
378 { ZBEE_MFG_CODE_UCONTROL, ZBEE_MFG_UCONTROL },
379 { ZBEE_MFG_CODE_EMBEDIA, ZBEE_MFG_EMBEDIA },
380 { ZBEE_MFG_CODE_SENSUS, ZBEE_MFG_SENSUS },
381 { ZBEE_MFG_CODE_SUNRISE, ZBEE_MFG_SUNRISE },
382 { ZBEE_MFG_CODE_MEMTECH, ZBEE_MFG_MEMTECH },
383 { ZBEE_MFG_CODE_FREEBOX, ZBEE_MFG_FREEBOX },
384 { ZBEE_MFG_CODE_M2_LABS, ZBEE_MFG_M2_LABS },
385 { ZBEE_MFG_CODE_BRITISH_GAS, ZBEE_MFG_BRITISH_GAS },
386 { ZBEE_MFG_CODE_SENTEC, ZBEE_MFG_SENTEC },
387 { ZBEE_MFG_CODE_NAVETAS, ZBEE_MFG_NAVETAS },
388 { ZBEE_MFG_CODE_LIGHTSPEED, ZBEE_MFG_LIGHTSPEED },
389 { ZBEE_MFG_CODE_OKI, ZBEE_MFG_OKI },
390 { ZBEE_MFG_CODE_SISTEMAS, ZBEE_MFG_SISTEMAS },
391 { ZBEE_MFG_CODE_DOMETIC, ZBEE_MFG_DOMETIC },
392 { ZBEE_MFG_CODE_APLS, ZBEE_MFG_APLS },
393 { ZBEE_MFG_CODE_ENERGY_HUB, ZBEE_MFG_ENERGY_HUB },
394 { ZBEE_MFG_CODE_KAMSTRUP, ZBEE_MFG_KAMSTRUP },
395 { ZBEE_MFG_CODE_ECHOSTAR, ZBEE_MFG_ECHOSTAR },
396 { ZBEE_MFG_CODE_ENERNOC, ZBEE_MFG_ENERNOC },
397 { ZBEE_MFG_CODE_ELTAV, ZBEE_MFG_ELTAV },
398 { ZBEE_MFG_CODE_BELKIN, ZBEE_MFG_BELKIN },
399 { ZBEE_MFG_CODE_XSTREAMHD, ZBEE_MFG_XSTREAMHD },
400 { ZBEE_MFG_CODE_SATURN_SOUTH, ZBEE_MFG_SATURN_SOUTH },
401 { ZBEE_MFG_CODE_GREENTRAP, ZBEE_MFG_GREENTRAP },
402 { ZBEE_MFG_CODE_SMARTSYNCH, ZBEE_MFG_SMARTSYNCH },
403 { ZBEE_MFG_CODE_NYCE, ZBEE_MFG_NYCE },
404 { ZBEE_MFG_CODE_ICM_CONTROLS, ZBEE_MFG_ICM_CONTROLS },
405 { ZBEE_MFG_CODE_MILLENNIUM, ZBEE_MFG_MILLENNIUM },
406 { ZBEE_MFG_CODE_MOTOROLA, ZBEE_MFG_MOTOROLA },
407 { ZBEE_MFG_CODE_EMERSON, ZBEE_MFG_EMERSON },
408 { ZBEE_MFG_CODE_RADIO_THERMOSTAT, ZBEE_MFG_RADIO_THERMOSTAT },
409 { ZBEE_MFG_CODE_OMRON, ZBEE_MFG_OMRON },
410 { ZBEE_MFG_CODE_GIINII, ZBEE_MFG_GIINII },
411 { ZBEE_MFG_CODE_FUJITSU, ZBEE_MFG_FUJITSU },
412 { ZBEE_MFG_CODE_PEEL, ZBEE_MFG_PEEL },
413 { ZBEE_MFG_CODE_ACCENT, ZBEE_MFG_ACCENT },
414 { ZBEE_MFG_CODE_BYTESNAP, ZBEE_MFG_BYTESNAP },
415 { ZBEE_MFG_CODE_NEC_TOKIN, ZBEE_MFG_NEC_TOKIN },
416 { ZBEE_MFG_CODE_G4S_JUSTICE, ZBEE_MFG_G4S_JUSTICE },
417 { ZBEE_MFG_CODE_TRILLIANT, ZBEE_MFG_TRILLIANT },
418 { ZBEE_MFG_CODE_ELECTROLUX, ZBEE_MFG_ELECTROLUX },
419 { ZBEE_MFG_CODE_ONZO, ZBEE_MFG_ONZO },
420 { ZBEE_MFG_CODE_ENTEK, ZBEE_MFG_ENTEK },
421 { ZBEE_MFG_CODE_PHILIPS2, ZBEE_MFG_PHILIPS },
422 { ZBEE_MFG_CODE_MAINSTREAM, ZBEE_MFG_MAINSTREAM },
423 { ZBEE_MFG_CODE_INDESIT, ZBEE_MFG_INDESIT },
424 { ZBEE_MFG_CODE_THINKECO, ZBEE_MFG_THINKECO },
425 { ZBEE_MFG_CODE_2D2C, ZBEE_MFG_2D2C },
426 { ZBEE_MFG_CODE_GREENPEAK, ZBEE_MFG_GREENPEAK },
427 { ZBEE_MFG_CODE_INTERCEL, ZBEE_MFG_INTERCEL },
428 { ZBEE_MFG_CODE_LG, ZBEE_MFG_LG },
429 { ZBEE_MFG_CODE_MITSUMI1, ZBEE_MFG_MITSUMI1 },
430 { ZBEE_MFG_CODE_MITSUMI2, ZBEE_MFG_MITSUMI2 },
431 { ZBEE_MFG_CODE_ZENTRUM, ZBEE_MFG_ZENTRUM },
432 { ZBEE_MFG_CODE_NEST, ZBEE_MFG_NEST },
433 { ZBEE_MFG_CODE_EXEGIN, ZBEE_MFG_EXEGIN },
434 { ZBEE_MFG_CODE_HONEYWELL2, ZBEE_MFG_HONEYWELL },
435 { ZBEE_MFG_CODE_TAKAHATA, ZBEE_MFG_TAKAHATA },
436 { ZBEE_MFG_CODE_SUMITOMO, ZBEE_MFG_SUMITOMO },
437 { ZBEE_MFG_CODE_GE_ENERGY, ZBEE_MFG_GE_ENERGY },
438 { ZBEE_MFG_CODE_GE_APPLIANCES, ZBEE_MFG_GE_APPLIANCES },
439 { ZBEE_MFG_CODE_RADIOCRAFTS, ZBEE_MFG_RADIOCRAFTS },
440 { ZBEE_MFG_CODE_CEIVA, ZBEE_MFG_CEIVA },
441 { ZBEE_MFG_CODE_TEC_CO, ZBEE_MFG_TEC_CO },
442 { ZBEE_MFG_CODE_CHAMELEON, ZBEE_MFG_CHAMELEON },
443 { ZBEE_MFG_CODE_SAMSUNG, ZBEE_MFG_SAMSUNG },
444 { ZBEE_MFG_CODE_RUWIDO, ZBEE_MFG_RUWIDO },
445 { ZBEE_MFG_CODE_HUAWEI_1, ZBEE_MFG_HUAWEI },
446 { ZBEE_MFG_CODE_HUAWEI_2, ZBEE_MFG_HUAWEI },
447 { ZBEE_MFG_CODE_GREENWAVE, ZBEE_MFG_GREENWAVE },
448 { ZBEE_MFG_CODE_BGLOBAL, ZBEE_MFG_BGLOBAL },
449 { ZBEE_MFG_CODE_MINDTECK, ZBEE_MFG_MINDTECK },
450 { ZBEE_MFG_CODE_INGERSOLL_RAND, ZBEE_MFG_INGERSOLL_RAND },
451 { ZBEE_MFG_CODE_DIUS, ZBEE_MFG_DIUS },
452 { ZBEE_MFG_CODE_EMBEDDED, ZBEE_MFG_EMBEDDED },
453 { ZBEE_MFG_CODE_ABB, ZBEE_MFG_ABB },
454 { ZBEE_MFG_CODE_SONY, ZBEE_MFG_SONY },
455 { ZBEE_MFG_CODE_GENUS, ZBEE_MFG_GENUS },
456 { ZBEE_MFG_CODE_UNIVERSAL1, ZBEE_MFG_UNIVERSAL },
457 { ZBEE_MFG_CODE_UNIVERSAL2, ZBEE_MFG_UNIVERSAL },
458 { ZBEE_MFG_CODE_METRUM, ZBEE_MFG_METRUM },
459 { ZBEE_MFG_CODE_CISCO, ZBEE_MFG_CISCO },
460 { ZBEE_MFG_CODE_UBISYS, ZBEE_MFG_UBISYS },
461 { ZBEE_MFG_CODE_CONSERT, ZBEE_MFG_CONSERT },
462 { ZBEE_MFG_CODE_CRESTRON, ZBEE_MFG_CRESTRON },
463 { ZBEE_MFG_CODE_ENPHASE, ZBEE_MFG_ENPHASE },
464 { ZBEE_MFG_CODE_INVENSYS, ZBEE_MFG_INVENSYS },
465 { ZBEE_MFG_CODE_MUELLER, ZBEE_MFG_MUELLER },
466 { ZBEE_MFG_CODE_AAC_TECH, ZBEE_MFG_AAC_TECH },
467 { ZBEE_MFG_CODE_U_NEXT, ZBEE_MFG_U_NEXT },
468 { ZBEE_MFG_CODE_STEELCASE, ZBEE_MFG_STEELCASE },
469 { ZBEE_MFG_CODE_TELEMATICS, ZBEE_MFG_TELEMATICS },
470 { ZBEE_MFG_CODE_SAMIL, ZBEE_MFG_SAMIL },
471 { ZBEE_MFG_CODE_PACE, ZBEE_MFG_PACE },
472 { ZBEE_MFG_CODE_OSBORNE, ZBEE_MFG_OSBORNE },
473 { ZBEE_MFG_CODE_POWERWATCH, ZBEE_MFG_POWERWATCH },
474 { ZBEE_MFG_CODE_CANDELED, ZBEE_MFG_CANDELED },
475 { ZBEE_MFG_CODE_FLEXGRID, ZBEE_MFG_FLEXGRID },
476 { ZBEE_MFG_CODE_HUMAX, ZBEE_MFG_HUMAX },
477 { ZBEE_MFG_CODE_UNIVERSAL, ZBEE_MFG_UNIVERSAL },
478 { ZBEE_MFG_CODE_ADVANCED_ENERGY, ZBEE_MFG_ADVANCED_ENERGY },
479 { ZBEE_MFG_CODE_BEGA, ZBEE_MFG_BEGA },
480 { ZBEE_MFG_CODE_BRUNEL, ZBEE_MFG_BRUNEL },
481 { ZBEE_MFG_CODE_PANASONIC, ZBEE_MFG_PANASONIC },
482 { ZBEE_MFG_CODE_ESYSTEMS, ZBEE_MFG_ESYSTEMS },
483 { ZBEE_MFG_CODE_PANAMAX, ZBEE_MFG_PANAMAX },
484 { ZBEE_MFG_CODE_PHYSICAL, ZBEE_MFG_PHYSICAL },
485 { ZBEE_MFG_CODE_EM_LITE, ZBEE_MFG_EM_LITE },
486 { ZBEE_MFG_CODE_OSRAM, ZBEE_MFG_OSRAM },
487 { ZBEE_MFG_CODE_2_SAVE, ZBEE_MFG_2_SAVE },
488 { ZBEE_MFG_CODE_PLANET, ZBEE_MFG_PLANET },
489 { ZBEE_MFG_CODE_AMBIENT, ZBEE_MFG_AMBIENT },
490 { ZBEE_MFG_CODE_PROFALUX, ZBEE_MFG_PROFALUX },
491 { ZBEE_MFG_CODE_BILLION, ZBEE_MFG_BILLION },
492 { ZBEE_MFG_CODE_EMBERTEC, ZBEE_MFG_EMBERTEC },
493 { ZBEE_MFG_CODE_IT_WATCHDOGS, ZBEE_MFG_IT_WATCHDOGS },
494 { ZBEE_MFG_CODE_RELOC, ZBEE_MFG_RELOC },
495 { ZBEE_MFG_CODE_INTEL, ZBEE_MFG_INTEL },
496 { ZBEE_MFG_CODE_TREND, ZBEE_MFG_TREND },
497 { ZBEE_MFG_CODE_MOXA, ZBEE_MFG_MOXA },
498 { ZBEE_MFG_CODE_QEES, ZBEE_MFG_QEES },
499 { ZBEE_MFG_CODE_SAYME, ZBEE_MFG_SAYME },
500 { ZBEE_MFG_CODE_PENTAIR, ZBEE_MFG_PENTAIR },
501 { ZBEE_MFG_CODE_ORBIT, ZBEE_MFG_ORBIT },
502 { ZBEE_MFG_CODE_CALIFORNIA, ZBEE_MFG_CALIFORNIA },
503 { ZBEE_MFG_CODE_COMCAST2, ZBEE_MFG_COMCAST },
504 { ZBEE_MFG_CODE_IDT, ZBEE_MFG_IDT },
505 { ZBEE_MFG_CODE_PIXELA, ZBEE_MFG_PIXELA },
506 { ZBEE_MFG_CODE_TIVO, ZBEE_MFG_TIVO },
507 { ZBEE_MFG_CODE_FIDURE, ZBEE_MFG_FIDURE },
508 { ZBEE_MFG_CODE_MARVELL, ZBEE_MFG_MARVELL },
509 { ZBEE_MFG_CODE_WASION, ZBEE_MFG_WASION },
510 { ZBEE_MFG_CODE_JASCO, ZBEE_MFG_JASCO },
511 { ZBEE_MFG_CODE_SHENZHEN, ZBEE_MFG_SHENZHEN },
512 { ZBEE_MFG_CODE_NETCOMM, ZBEE_MFG_NETCOMM },
513 { ZBEE_MFG_CODE_DEFINE, ZBEE_MFG_DEFINE },
514 { ZBEE_MFG_CODE_IN_HOME_DISP, ZBEE_MFG_IN_HOME_DISP },
515 { ZBEE_MFG_CODE_MIELE, ZBEE_MFG_MIELE },
516 { ZBEE_MFG_CODE_TELEVES, ZBEE_MFG_TELEVES },
517 { ZBEE_MFG_CODE_LABELEC, ZBEE_MFG_LABELEC },
518 { ZBEE_MFG_CODE_CHINA_ELEC, ZBEE_MFG_CHINA_ELEC },
519 { ZBEE_MFG_CODE_VECTORFORM, ZBEE_MFG_VECTORFORM },
520 { ZBEE_MFG_CODE_BUSCH_JAEGER, ZBEE_MFG_BUSCH_JAEGER },
521 { ZBEE_MFG_CODE_REDPINE, ZBEE_MFG_REDPINE },
522 { ZBEE_MFG_CODE_BRIDGES, ZBEE_MFG_BRIDGES },
523 { ZBEE_MFG_CODE_SERCOMM, ZBEE_MFG_SERCOMM },
524 { ZBEE_MFG_CODE_WSH, ZBEE_MFG_WSH },
525 { ZBEE_MFG_CODE_BOSCH, ZBEE_MFG_BOSCH },
526 { ZBEE_MFG_CODE_EZEX, ZBEE_MFG_EZEX },
527 { ZBEE_MFG_CODE_DRESDEN, ZBEE_MFG_DRESDEN },
528 { ZBEE_MFG_CODE_MEAZON, ZBEE_MFG_MEAZON },
529 { ZBEE_MFG_CODE_CROW, ZBEE_MFG_CROW },
530 { ZBEE_MFG_CODE_HARVARD, ZBEE_MFG_HARVARD },
531 { ZBEE_MFG_CODE_ANDSON, ZBEE_MFG_ANDSON },
532 { ZBEE_MFG_CODE_ADHOCO, ZBEE_MFG_ADHOCO },
533 { ZBEE_MFG_CODE_WAXMAN, ZBEE_MFG_WAXMAN },
534 { ZBEE_MFG_CODE_OWON, ZBEE_MFG_OWON },
535 { ZBEE_MFG_CODE_HITRON, ZBEE_MFG_HITRON },
536 { ZBEE_MFG_CODE_SCEMTEC, ZBEE_MFG_SCEMTEC },
537 { ZBEE_MFG_CODE_WEBEE, ZBEE_MFG_WEBEE },
538 { ZBEE_MFG_CODE_GRID2HOME, ZBEE_MFG_GRID2HOME },
539 { ZBEE_MFG_CODE_TELINK, ZBEE_MFG_TELINK },
540 { ZBEE_MFG_CODE_JASMINE, ZBEE_MFG_JASMINE },
541 { ZBEE_MFG_CODE_BIDGELY, ZBEE_MFG_BIDGELY },
542 { ZBEE_MFG_CODE_LUTRON, ZBEE_MFG_LUTRON },
543 { ZBEE_MFG_CODE_IJENKO, ZBEE_MFG_IJENKO },
544 { ZBEE_MFG_CODE_STARFIELD, ZBEE_MFG_STARFIELD },
545 { ZBEE_MFG_CODE_TCP, ZBEE_MFG_TCP },
546 { ZBEE_MFG_CODE_ROGERS, ZBEE_MFG_ROGERS },
547 { ZBEE_MFG_CODE_CREE, ZBEE_MFG_CREE },
548 { ZBEE_MFG_CODE_ROBERT_BOSCH_LLC, ZBEE_MFG_ROBERT_BOSCH_LLC },
549 { ZBEE_MFG_CODE_IBIS, ZBEE_MFG_IBIS },
550 { ZBEE_MFG_CODE_QUIRKY, ZBEE_MFG_QUIRKY },
551 { ZBEE_MFG_CODE_EFERGY, ZBEE_MFG_EFERGY },
552 { ZBEE_MFG_CODE_SMARTLABS, ZBEE_MFG_SMARTLABS },
553 { ZBEE_MFG_CODE_EVERSPRING, ZBEE_MFG_EVERSPRING },
554 { ZBEE_MFG_CODE_SWANN, ZBEE_MFG_SWANN },
555 { ZBEE_MFG_CODE_SONETER, ZBEE_MFG_SONETER },
556 { ZBEE_MFG_CODE_SAMSUNG_SDS, ZBEE_MFG_SAMSUNG_SDS },
557 { ZBEE_MFG_CODE_UNIBAND_ELECTRO, ZBEE_MFG_UNIBAND_ELECTRO },
558 { ZBEE_MFG_CODE_ACCTON_TECHNOLOGY, ZBEE_MFG_ACCTON_TECHNOLOGY },
559 { ZBEE_MFG_CODE_BOSCH_THERMOTECH, ZBEE_MFG_BOSCH_THERMOTECH },
560 { ZBEE_MFG_CODE_WINCOR_NIXDORF, ZBEE_MFG_WINCOR_NIXDORF },
561 { ZBEE_MFG_CODE_OHSUNG_ELECTRO, ZBEE_MFG_OHSUNG_ELECTRO },
562 { ZBEE_MFG_CODE_ZEN_WITHIN, ZBEE_MFG_ZEN_WITHIN },
563 { ZBEE_MFG_CODE_TECH_4_HOME, ZBEE_MFG_TECH_4_HOME },
564 { ZBEE_MFG_CODE_NANOLEAF, ZBEE_MFG_NANOLEAF },
565 { ZBEE_MFG_CODE_KEEN_HOME, ZBEE_MFG_KEEN_HOME },
566 { ZBEE_MFG_CODE_POLY_CONTROL, ZBEE_MFG_POLY_CONTROL },
567 { ZBEE_MFG_CODE_EASTFIELD_LIGHT, ZBEE_MFG_EASTFIELD_LIGHT },
568 { ZBEE_MFG_CODE_IP_DATATEL, ZBEE_MFG_IP_DATATEL },
569 { ZBEE_MFG_CODE_LUMI_UNITED_TECH, ZBEE_MFG_LUMI_UNITED_TECH },
570 { ZBEE_MFG_CODE_SENGLED_OPTOELEC, ZBEE_MFG_SENGLED_OPTOELEC },
571 { ZBEE_MFG_CODE_REMOTE_SOLUTION, ZBEE_MFG_REMOTE_SOLUTION },
572 { ZBEE_MFG_CODE_ABB_GENWAY_XIAMEN, ZBEE_MFG_ABB_GENWAY_XIAMEN },
573 { ZBEE_MFG_CODE_ZHEJIANG_REXENSE, ZBEE_MFG_ZHEJIANG_REXENSE },
574 { ZBEE_MFG_CODE_FOREE_TECHNOLOGY, ZBEE_MFG_FOREE_TECHNOLOGY },
575 { ZBEE_MFG_CODE_OPEN_ACCESS_TECH, ZBEE_MFG_OPEN_ACCESS_TECH },
576 { ZBEE_MFG_CODE_INNR_LIGHTNING, ZBEE_MFG_INNR_LIGHTNING },
577 { ZBEE_MFG_CODE_TECHWORLD, ZBEE_MFG_TECHWORLD },
578 { ZBEE_MFG_CODE_LEEDARSON_LIGHT, ZBEE_MFG_LEEDARSON_LIGHT },
579 { ZBEE_MFG_CODE_ARZEL_ZONING, ZBEE_MFG_ARZEL_ZONING },
580 { ZBEE_MFG_CODE_HOLLEY_TECH, ZBEE_MFG_HOLLEY_TECH },
581 { ZBEE_MFG_CODE_BELDON_TECH, ZBEE_MFG_BELDON_TECH },
582 { ZBEE_MFG_CODE_FLEXTRONICS, ZBEE_MFG_FLEXTRONICS },
583 { ZBEE_MFG_CODE_SHENZHEN_MEIAN, ZBEE_MFG_SHENZHEN_MEIAN },
584 { ZBEE_MFG_CODE_LOWES, ZBEE_MFG_LOWES },
585 { ZBEE_MFG_CODE_SIGMA_CONNECT, ZBEE_MFG_SIGMA_CONNECT },
586 { ZBEE_MFG_CODE_WULIAN, ZBEE_MFG_WULIAN },
587 { ZBEE_MFG_CODE_PLUGWISE_BV, ZBEE_MFG_PLUGWISE_BV },
588 { ZBEE_MFG_CODE_TITAN_PRODUCTS, ZBEE_MFG_TITAN_PRODUCTS },
589 { ZBEE_MFG_CODE_ECOSPECTRAL, ZBEE_MFG_ECOSPECTRAL },
590 { ZBEE_MFG_CODE_D_LINK, ZBEE_MFG_D_LINK },
591 { ZBEE_MFG_CODE_TECHNICOLOR_HOME, ZBEE_MFG_TECHNICOLOR_HOME },
592 { ZBEE_MFG_CODE_OPPLE_LIGHTING, ZBEE_MFG_OPPLE_LIGHTING },
593 { ZBEE_MFG_CODE_WISTRON_NEWEB, ZBEE_MFG_WISTRON_NEWEB },
594 { ZBEE_MFG_CODE_QMOTION_SHADES, ZBEE_MFG_QMOTION_SHADES },
595 { ZBEE_MFG_CODE_INSTA_ELEKTRO, ZBEE_MFG_INSTA_ELEKTRO },
596 { ZBEE_MFG_CODE_SHANGHAI_VANCOUNT, ZBEE_MFG_SHANGHAI_VANCOUNT },
597 { ZBEE_MFG_CODE_IKEA_OF_SWEDEN, ZBEE_MFG_IKEA_OF_SWEDEN },
598 { ZBEE_MFG_CODE_RT_RK, ZBEE_MFG_RT_RK },
599 { ZBEE_MFG_CODE_SHENZHEN_FEIBIT, ZBEE_MFG_SHENZHEN_FEIBIT },
600 { ZBEE_MFG_CODE_EU_CONTROLS, ZBEE_MFG_EU_CONTROLS },
601 { ZBEE_MFG_CODE_TELKONET, ZBEE_MFG_TELKONET },
602 { ZBEE_MFG_CODE_THERMAL_SOLUTION, ZBEE_MFG_THERMAL_SOLUTION },
603 { ZBEE_MFG_CODE_POM_CUBE, ZBEE_MFG_POM_CUBE },
604 { ZBEE_MFG_CODE_EI_ELECTRONICS, ZBEE_MFG_EI_ELECTRONICS },
605 { ZBEE_MFG_CODE_OPTOGA, ZBEE_MFG_OPTOGA },
606 { ZBEE_MFG_CODE_STELPRO, ZBEE_MFG_STELPRO },
607 { ZBEE_MFG_CODE_LYNXUS_TECH, ZBEE_MFG_LYNXUS_TECH },
608 { ZBEE_MFG_CODE_SEMICONDUCTOR_COM, ZBEE_MFG_SEMICONDUCTOR_COM },
609 { ZBEE_MFG_CODE_TP_LINK, ZBEE_MFG_TP_LINK },
610 { ZBEE_MFG_CODE_LEDVANCE_LLC, ZBEE_MFG_LEDVANCE_LLC },
611 { ZBEE_MFG_CODE_NORTEK, ZBEE_MFG_NORTEK },
612 { ZBEE_MFG_CODE_IREVO_ASSA_ABBLOY, ZBEE_MFG_IREVO_ASSA_ABBLOY },
613 { ZBEE_MFG_CODE_MIDEA, ZBEE_MFG_MIDEA },
614 { ZBEE_MFG_CODE_ZF_FRIEDRICHSHAF, ZBEE_MFG_ZF_FRIEDRICHSHAF },
615 { ZBEE_MFG_CODE_CHECKIT, ZBEE_MFG_CHECKIT },
616 { ZBEE_MFG_CODE_ACLARA, ZBEE_MFG_ACLARA },
617 { ZBEE_MFG_CODE_NOKIA, ZBEE_MFG_NOKIA },
618 { ZBEE_MFG_CODE_GOLDCARD_HIGHTECH, ZBEE_MFG_GOLDCARD_HIGHTECH },
619 { ZBEE_MFG_CODE_GEORGE_WILSON, ZBEE_MFG_GEORGE_WILSON },
620 { ZBEE_MFG_CODE_EASY_SAVER_CO, ZBEE_MFG_EASY_SAVER_CO },
621 { ZBEE_MFG_CODE_ZTE_CORPORATION, ZBEE_MFG_ZTE_CORPORATION },
622 { ZBEE_MFG_CODE_ARRIS, ZBEE_MFG_ARRIS },
623 { ZBEE_MFG_CODE_RELIANCE_BIG_TV, ZBEE_MFG_RELIANCE_BIG_TV },
624 { ZBEE_MFG_CODE_INSIGHT_ENERGY, ZBEE_MFG_INSIGHT_ENERGY },
625 { ZBEE_MFG_CODE_THOMAS_RESEARCH, ZBEE_MFG_THOMAS_RESEARCH },
626 { ZBEE_MFG_CODE_LI_SENG_TECH, ZBEE_MFG_LI_SENG_TECH },
627 { ZBEE_MFG_CODE_SYSTEM_LEVEL_SOLU, ZBEE_MFG_SYSTEM_LEVEL_SOLU },
628 { ZBEE_MFG_CODE_MATRIX_LABS, ZBEE_MFG_MATRIX_LABS },
629 { ZBEE_MFG_CODE_SINOPE_TECH, ZBEE_MFG_SINOPE_TECH },
630 { ZBEE_MFG_CODE_JIUZHOU_GREEBLE, ZBEE_MFG_JIUZHOU_GREEBLE },
631 { ZBEE_MFG_CODE_GUANGZHOU_LANVEE, ZBEE_MFG_GUANGZHOU_LANVEE },
632 { ZBEE_MFG_CODE_VENSTAR, ZBEE_MFG_VENSTAR },
633 { ZBEE_MFG_CODE_SLV, ZBEE_MFG_SLV },
634 { ZBEE_MFG_CODE_HALO_SMART_LABS, ZBEE_MFG_HALO_SMART_LABS },
635 { ZBEE_MFG_CODE_SCOUT_SECURITY, ZBEE_MFG_SCOUT_SECURITY },
636 { ZBEE_MFG_CODE_ALIBABA_CHINA, ZBEE_MFG_ALIBABA_CHINA },
637 { ZBEE_MFG_CODE_RESOLUTION_PROD, ZBEE_MFG_RESOLUTION_PROD },
638 { ZBEE_MFG_CODE_SMARTLOK_INC, ZBEE_MFG_SMARTLOK_INC },
639 { ZBEE_MFG_CODE_LUX_PRODUCTS_CORP, ZBEE_MFG_LUX_PRODUCTS_CORP },
640 { ZBEE_MFG_CODE_VIMAR_SPA, ZBEE_MFG_VIMAR_SPA },
641 { ZBEE_MFG_CODE_UNIVERSAL_LIGHT, ZBEE_MFG_UNIVERSAL_LIGHT },
642 { ZBEE_MFG_CODE_ROBERT_BOSCH_GMBH, ZBEE_MFG_ROBERT_BOSCH_GMBH },
643 { ZBEE_MFG_CODE_ACCENTURE, ZBEE_MFG_ACCENTURE },
644 { ZBEE_MFG_CODE_HEIMAN_TECHNOLOGY, ZBEE_MFG_HEIMAN_TECHNOLOGY },
645 { ZBEE_MFG_CODE_SHENZHEN_HOMA, ZBEE_MFG_SHENZHEN_HOMA },
646 { ZBEE_MFG_CODE_VISION_ELECTRO, ZBEE_MFG_VISION_ELECTRO },
647 { ZBEE_MFG_CODE_LENOVO, ZBEE_MFG_LENOVO },
648 { ZBEE_MFG_CODE_PRESCIENSE_RD, ZBEE_MFG_PRESCIENSE_RD },
649 { ZBEE_MFG_CODE_SHENZHEN_SEASTAR, ZBEE_MFG_SHENZHEN_SEASTAR },
650 { ZBEE_MFG_CODE_SENSATIVE_AB, ZBEE_MFG_SENSATIVE_AB },
651 { ZBEE_MFG_CODE_SOLAREDGE, ZBEE_MFG_SOLAREDGE },
652 { ZBEE_MFG_CODE_ZIPATO, ZBEE_MFG_ZIPATO },
653 { ZBEE_MFG_CODE_CHINA_FIRE_SEC, ZBEE_MFG_CHINA_FIRE_SEC },
654 { ZBEE_MFG_CODE_QUBY_BV, ZBEE_MFG_QUBY_BV },
655 { ZBEE_MFG_CODE_HANGZHOU_ROOMBANK, ZBEE_MFG_HANGZHOU_ROOMBANK },
656 { ZBEE_MFG_CODE_AMAZON_LAB126, ZBEE_MFG_AMAZON_LAB126 },
657 { ZBEE_MFG_CODE_PAULMANN_LICHT, ZBEE_MFG_PAULMANN_LICHT },
658 { ZBEE_MFG_CODE_SHENZHEN_ORVIBO, ZBEE_MFG_SHENZHEN_ORVIBO },
659 { ZBEE_MFG_CODE_TCI_TELECOMM, ZBEE_MFG_TCI_TELECOMM },
660 { ZBEE_MFG_CODE_MUELLER_LICHT_INT, ZBEE_MFG_MUELLER_LICHT_INT },
661 { ZBEE_MFG_CODE_AURORA_LIMITED, ZBEE_MFG_AURORA_LIMITED },
662 { ZBEE_MFG_CODE_SMART_DCC, ZBEE_MFG_SMART_DCC },
663 { ZBEE_MFG_CODE_SHANGHAI_UMEINFO, ZBEE_MFG_SHANGHAI_UMEINFO },
664 { ZBEE_MFG_CODE_CARBON_TRACK, ZBEE_MFG_CARBON_TRACK },
665 { ZBEE_MFG_CODE_SOMFY, ZBEE_MFG_SOMFY },
666 { ZBEE_MFG_CODE_VIESSMAN_ELEKTRO, ZBEE_MFG_VIESSMAN_ELEKTRO },
667 { ZBEE_MFG_CODE_HILDEBRAND_TECH, ZBEE_MFG_HILDEBRAND_TECH },
668 { ZBEE_MFG_CODE_ONKYO_TECH, ZBEE_MFG_ONKYO_TECH },
669 { ZBEE_MFG_CODE_SHENZHEN_SUNRICH, ZBEE_MFG_SHENZHEN_SUNRICH },
670 { ZBEE_MFG_CODE_XIU_XIU_TECH, ZBEE_MFG_XIU_XIU_TECH },
671 { ZBEE_MFG_CODE_ZUMTOBEL_GROUP, ZBEE_MFG_ZUMTOBEL_GROUP },
672 { ZBEE_MFG_CODE_SHENZHEN_KAADAS, ZBEE_MFG_SHENZHEN_KAADAS },
673 { ZBEE_MFG_CODE_SHANGHAI_XIAOYAN, ZBEE_MFG_SHANGHAI_XIAOYAN },
674 { ZBEE_MFG_CODE_CYPRESS_SEMICOND, ZBEE_MFG_CYPRESS_SEMICOND },
675 { ZBEE_MFG_CODE_XAL_GMBH, ZBEE_MFG_XAL_GMBH },
676 { ZBEE_MFG_CODE_INERGY_SYSTEMS, ZBEE_MFG_INERGY_SYSTEMS },
677 { ZBEE_MFG_CODE_ALFRED_KARCHER, ZBEE_MFG_ALFRED_KARCHER },
678 { ZBEE_MFG_CODE_ADUROLIGHT_MANU, ZBEE_MFG_ADUROLIGHT_MANU },
679 { ZBEE_MFG_CODE_GROUPE_MULLER, ZBEE_MFG_GROUPE_MULLER },
680 { ZBEE_MFG_CODE_V_MARK_ENTERPRI, ZBEE_MFG_V_MARK_ENTERPRI },
681 { ZBEE_MFG_CODE_LEAD_ENERGY_AG, ZBEE_MFG_LEAD_ENERGY_AG },
682 { ZBEE_MFG_CODE_UIOT_GROUP, ZBEE_MFG_UIOT_GROUP },
683 { ZBEE_MFG_CODE_AXXESS_INDUSTRIES, ZBEE_MFG_AXXESS_INDUSTRIES },
684 { ZBEE_MFG_CODE_THIRD_REALITY_INC, ZBEE_MFG_THIRD_REALITY_INC },
685 { ZBEE_MFG_CODE_DSR_CORPORATION, ZBEE_MFG_DSR_CORPORATION },
686 { ZBEE_MFG_CODE_GUANGZHOU_VENSI, ZBEE_MFG_GUANGZHOU_VENSI },
687 { ZBEE_MFG_CODE_SCHLAGE_LOCK_ALL, ZBEE_MFG_SCHLAGE_LOCK_ALL },
688 { ZBEE_MFG_CODE_NET2GRID, ZBEE_MFG_NET2GRID },
689 { ZBEE_MFG_CODE_AIRAM_ELECTRIC, ZBEE_MFG_AIRAM_ELECTRIC },
690 { ZBEE_MFG_CODE_IMMAX_WPB_CZ, ZBEE_MFG_IMMAX_WPB_CZ },
691 { ZBEE_MFG_CODE_ZIV_AUTOMATION, ZBEE_MFG_ZIV_AUTOMATION },
692 { ZBEE_MFG_CODE_HANGZHOU_IMAGIC, ZBEE_MFG_HANGZHOU_IMAGIC },
693 { ZBEE_MFG_CODE_XIAMEN_LEELEN, ZBEE_MFG_XIAMEN_LEELEN },
694 { ZBEE_MFG_CODE_OVERKIZ_SAS, ZBEE_MFG_OVERKIZ_SAS },
695 { ZBEE_MFG_CODE_FLONIDAN, ZBEE_MFG_FLONIDAN },
696 { ZBEE_MFG_CODE_HDL_AUTOATION, ZBEE_MFG_HDL_AUTOATION },
697 { ZBEE_MFG_CODE_ARDOMUS_NETWORKS, ZBEE_MFG_ARDOMUS_NETWORKS},
698 { ZBEE_MFG_CODE_SAMJIN_CO, ZBEE_MFG_SAMJIN_CO},
699 { ZBEE_MFG_CODE_SPRUE_AEGIS_PLC, ZBEE_MFG_SPRUE_AEGIS_PLC },
700 { ZBEE_MFG_CODE_INDRA_SISTEMAS, ZBEE_MFG_INDRA_SISTEMAS },
701 { ZBEE_MFG_CODE_JBT_SMART_LIGHT, ZBEE_MFG_JBT_SMART_LIGHT },
702 { ZBEE_MFG_CODE_GE_LIGHTING_CURRE, ZBEE_MFG_GE_LIGHTING_CURRE },
703 { ZBEE_MFG_CODE_DANFOSS, ZBEE_MFG_DANFOSS },
704 { ZBEE_MFG_CODE_NIVISS_PHP_SP, ZBEE_MFG_NIVISS_PHP_SP },
705 { ZBEE_MFG_CODE_FENGLIYUAN_ENERGY, ZBEE_MFG_FENGLIYUAN_ENERGY },
706 { ZBEE_MFG_CODE_NEXELEC, ZBEE_MFG_NEXELEC },
707 { ZBEE_MFG_CODE_SICHUAN_BEHOME_PR, ZBEE_MFG_SICHUAN_BEHOME_PR },
708 { ZBEE_MFG_CODE_FUJIAN_STARNET, ZBEE_MFG_FUJIAN_STARNET },
709 { ZBEE_MFG_CODE_TOSHIBA_VISUAL_SO, ZBEE_MFG_TOSHIBA_VISUAL_SO },
710 { ZBEE_MFG_CODE_LATCHABLE_INC, ZBEE_MFG_LATCHABLE_INC },
711 { ZBEE_MFG_CODE_LS_DEUTSCHLAND, ZBEE_MFG_LS_DEUTSCHLAND },
712 { ZBEE_MFG_CODE_GLEDOPTO_CO_LTD, ZBEE_MFG_GLEDOPTO_CO_LTD },
713 { ZBEE_MFG_CODE_THE_HOME_DEPOT, ZBEE_MFG_THE_HOME_DEPOT },
714 { ZBEE_MFG_CODE_NEONLITE_INTERNAT, ZBEE_MFG_NEONLITE_INTERNAT },
715 { ZBEE_MFG_CODE_ARLO_TECHNOLOGIES, ZBEE_MFG_ARLO_TECHNOLOGIES },
716 { ZBEE_MFG_CODE_XINGLUO_TECH, ZBEE_MFG_XINGLUO_TECH },
717 { ZBEE_MFG_CODE_SIMON_ELECTRIC_CH, ZBEE_MFG_SIMON_ELECTRIC_CH },
718 { ZBEE_MFG_CODE_HANGZHOU_GREATSTA, ZBEE_MFG_HANGZHOU_GREATSTA },
719 { ZBEE_MFG_CODE_SEQUENTRIC_ENERGY, ZBEE_MFG_SEQUENTRIC_ENERGY },
720 { ZBEE_MFG_CODE_SOLUM_CO_LTD, ZBEE_MFG_SOLUM_CO_LTD },
721 { ZBEE_MFG_CODE_EAGLERISE_ELEC, ZBEE_MFG_EAGLERISE_ELEC },
722 { ZBEE_MFG_CODE_FANTEM_TECH, ZBEE_MFG_FANTEM_TECH },
723 { ZBEE_MFG_CODE_YUNDING_NETWORK, ZBEE_MFG_YUNDING_NETWORK },
724 { ZBEE_MFG_CODE_ATLANTIC_GROUP, ZBEE_MFG_ATLANTIC_GROUP },
725 { ZBEE_MFG_CODE_XIAMEN_INTRETECH, ZBEE_MFG_XIAMEN_INTRETECH },
726 { ZBEE_MFG_CODE_TUYA_GLOBAL_INC, ZBEE_MFG_TUYA_GLOBAL_INC },
727 { ZBEE_MFG_CODE_XIAMEN_DNAKE_INTE, ZBEE_MFG_XIAMEN_DNAKE_INTE },
728 { ZBEE_MFG_CODE_NIKO_NV, ZBEE_MFG_NIKO_NV },
729 { ZBEE_MFG_CODE_EMPORIA_ENERGY, ZBEE_MFG_EMPORIA_ENERGY },
730 { ZBEE_MFG_CODE_SIKOM_AS, ZBEE_MFG_SIKOM_AS },
731 { ZBEE_MFG_CODE_AXIS_LABS_INC, ZBEE_MFG_AXIS_LABS_INC },
732 { ZBEE_MFG_CODE_CURRENT_PRODUCTS, ZBEE_MFG_CURRENT_PRODUCTS },
733 { ZBEE_MFG_CODE_METERSIT_SRL, ZBEE_MFG_METERSIT_SRL },
734 { ZBEE_MFG_CODE_HORNBACH_BAUMARKT, ZBEE_MFG_HORNBACH_BAUMARKT },
735 { ZBEE_MFG_CODE_DICEWORLD_SRL_A, ZBEE_MFG_DICEWORLD_SRL_A },
736 { ZBEE_MFG_CODE_ARC_TECHNOLOGY, ZBEE_MFG_ARC_TECHNOLOGY },
737 { ZBEE_MFG_CODE_KONKE_INFORMATION, ZBEE_MFG_KONKE_INFORMATION },
738 { ZBEE_MFG_CODE_SALTO_SYSTEMS_SL, ZBEE_MFG_SALTO_SYSTEMS_SL },
739 { ZBEE_MFG_CODE_SHYUGJ_TECHNOLOGY, ZBEE_MFG_SHYUGJ_TECHNOLOGY },
740 { ZBEE_MFG_CODE_BRAYDEN_AUTOMA, ZBEE_MFG_BRAYDEN_AUTOMA },
741 { ZBEE_MFG_CODE_ENVIRONEXUS_PTY, ZBEE_MFG_ENVIRONEXUS_PTY },
742 { ZBEE_MFG_CODE_ELTRA_NV_SA, ZBEE_MFG_ELTRA_NV_SA },
743 { ZBEE_MFG_CODE_XIAMOMI_COMMUNI, ZBEE_MFG_XIAMOMI_COMMUNI },
744 { ZBEE_MFG_CODE_SHUNCOM_ELECTRON, ZBEE_MFG_SHUNCOM_ELECTRON },
745 { ZBEE_MFG_CODE_VOLTALIS_SA, ZBEE_MFG_VOLTALIS_SA },
746 { ZBEE_MFG_CODE_FEELUX_CO_LTD, ZBEE_MFG_FEELUX_CO_LTD },
747 { ZBEE_MFG_CODE_SMARTPLUS_INC, ZBEE_MFG_SMARTPLUS_INC },
748 { ZBEE_MFG_CODE_HALEMEIER_GMBH, ZBEE_MFG_HALEMEIER_GMBH },
749 { ZBEE_MFG_CODE_TRUST_INTL, ZBEE_MFG_TRUST_INTL },
750 { ZBEE_MFG_CODE_DUKE_ENERGY, ZBEE_MFG_DUKE_ENERGY },
751 { ZBEE_MFG_CODE_CALIX, ZBEE_MFG_CALIX },
752 { ZBEE_MFG_CODE_ADEO, ZBEE_MFG_ADEO },
753 { ZBEE_MFG_CODE_CONNECTED_RESP, ZBEE_MFG_CONNECTED_RESP },
754 { ZBEE_MFG_CODE_STROYENERGOKOM, ZBEE_MFG_STROYENERGOKOM },
755 { ZBEE_MFG_CODE_LUMITECH_LIGHT, ZBEE_MFG_LUMITECH_LIGHT },
756 { ZBEE_MFG_CODE_VERDANT_ENVIRO , ZBEE_MFG_VERDANT_ENVIRO },
757 { ZBEE_MFG_CODE_ALFRED_INTL, ZBEE_MFG_ALFRED_INTL },
758 { ZBEE_MFG_CODE_SANSI_LED_LIGHT, ZBEE_MFG_SANSI_LED_LIGHT },
759 { ZBEE_MFG_CODE_MINDTREE, ZBEE_MFG_MINDTREE },
760 { ZBEE_MFG_CODE_NORDIC_SEMI, ZBEE_MFG_NORDIC_SEMI },
761 { ZBEE_MFG_CODE_SITERWELL_ELEC, ZBEE_MFG_SITERWELL_ELEC },
762 { ZBEE_MFG_CODE_BRILONER_LEUCHTEN, ZBEE_MFG_BRILONER_LEUCHTEN },
763 { ZBEE_MFG_CODE_SHENZHEN_SEI_TECH, ZBEE_MFG_SHENZHEN_SEI_TECH },
764 { ZBEE_MFG_CODE_COPPER_LABS, ZBEE_MFG_COPPER_LABS },
765 { ZBEE_MFG_CODE_DELTA_DORE, ZBEE_MFG_DELTA_DORE },
766 { ZBEE_MFG_CODE_HAGER_GROUP, ZBEE_MFG_HAGER_GROUP },
767 { ZBEE_MFG_CODE_SHENZHEN_COOLKIT, ZBEE_MFG_SHENZHEN_COOLKIT },
768 { ZBEE_MFG_CODE_HANGZHOU_SKY_LIGHT,ZBEE_MFG_HANGZHOU_SKY_LIGHT },
769 { ZBEE_MFG_CODE_E_ON_SE, ZBEE_MFG_E_ON_SE },
770 { ZBEE_MFG_CODE_LIDL_STIFTUNG, ZBEE_MFG_LIDL_STIFTUNG },
771 { ZBEE_MFG_CODE_SICHUAN_CHANGHONG, ZBEE_MFG_SICHUAN_CHANGHONG },
772 { ZBEE_MFG_CODE_NODON, ZBEE_MFG_NODON },
773 { ZBEE_MFG_CODE_JIANGXI_INNOTECH, ZBEE_MFG_JIANGXI_INNOTECH },
774 { ZBEE_MFG_CODE_MERCATOR_PTY, ZBEE_MFG_MERCATOR_PTY },
775 { ZBEE_MFG_CODE_BEIJING_RUYING, ZBEE_MFG_BEIJING_RUYING },
776 { ZBEE_MFG_CODE_EGLO_LEUCHTEN, ZBEE_MFG_EGLO_LEUCHTEN },
777 { ZBEE_MFG_CODE_PIETRO_FIORENTINI, ZBEE_MFG_PIETRO_FIORENTINI },
778 { ZBEE_MFG_CODE_ZEHNDER_GROUP, ZBEE_MFG_ZEHNDER_GROUP },
779 { ZBEE_MFG_CODE_BRK_BRANDS, ZBEE_MFG_BRK_BRANDS },
780 { ZBEE_MFG_CODE_ASKEY_COMPUTER, ZBEE_MFG_ASKEY_COMPUTER },
781 { ZBEE_MFG_CODE_PASSIVEBOLT, ZBEE_MFG_PASSIVEBOLT },
782 { ZBEE_MFG_CODE_AVM_AUDIOVISUELLE, ZBEE_MFG_AVM_AUDIOVISUELLE },
783 { ZBEE_MFG_CODE_NINGBO_SUNTECH, ZBEE_MFG_NINGBO_SUNTECH },
784 { ZBEE_MFG_CODE_SOCIETE_EN_COMMAND,ZBEE_MFG_SOCIETE_EN_COMMAND },
785 { ZBEE_MFG_CODE_VIVINT_SMART_HOME, ZBEE_MFG_VIVINT_SMART_HOME },
786 { ZBEE_MFG_CODE_NAMRON, ZBEE_MFG_NAMRON },
787 { ZBEE_MFG_CODE_RADEMACHER_GERA, ZBEE_MFG_RADEMACHER_GERA },
788 { ZBEE_MFG_CODE_OMO_SYSTEMS, ZBEE_MFG_OMO_SYSTEMS },
789 { ZBEE_MFG_CODE_SIGLIS, ZBEE_MFG_SIGLIS },
790 { ZBEE_MFG_CODE_IMHOTEP_CREATION, ZBEE_MFG_IMHOTEP_CREATION },
791 { ZBEE_MFG_CODE_ICASA, ZBEE_MFG_ICASA },
792 { ZBEE_MFG_CODE_LEVEL_HOME, ZBEE_MFG_LEVEL_HOME },
793 { ZBEE_MFG_CODE_TIS_CONTROL, ZBEE_MFG_TIS_CONTROL },
794 { ZBEE_MFG_CODE_RADISYS_INDIA, ZBEE_MFG_RADISYS_INDIA },
795 { ZBEE_MFG_CODE_VEEA, ZBEE_MFG_VEEA },
796 { ZBEE_MFG_CODE_FELL_TECHNOLOGY, ZBEE_MFG_FELL_TECHNOLOGY },
797 { ZBEE_MFG_CODE_SOWILO_DESIGN, ZBEE_MFG_SOWILO_DESIGN },
798 { ZBEE_MFG_CODE_LEXI_DEVICES, ZBEE_MFG_LEXI_DEVICES },
799 { ZBEE_MFG_CODE_LIFI_LABS, ZBEE_MFG_LIFI_LABS },
800 { ZBEE_MFG_CODE_GRUNDFOS_HOLDING, ZBEE_MFG_GRUNDFOS_HOLDING },
801 { ZBEE_MFG_CODE_SOURCING_CREATION, ZBEE_MFG_SOURCING_CREATION },
802 { ZBEE_MFG_CODE_KRAKEN_TECH, ZBEE_MFG_KRAKEN_TECHNOLOGIES },
803 { ZBEE_MFG_CODE_EVE_SYSTEMS, ZBEE_MFG_EVE_SYSTEMS },
804 { ZBEE_MFG_CODE_LITE_ON_TECH, ZBEE_MFG_LITE_ON_TECHNOLOGY },
805 { ZBEE_MFG_CODE_FOCALCREST, ZBEE_MFG_FOCALCREST },
806 { ZBEE_MFG_CODE_BOUFFALO_LAB, ZBEE_MFG_BOUFFALO_LAB },
807 { ZBEE_MFG_CODE_WYZE_LABS, ZBEE_MFG_WYZE_LABS },
809 { ZBEE_MFG_CODE_DATEK_WIRLESS, ZBEE_MFG_DATEK_WIRLESS },
810 { ZBEE_MFG_CODE_GEWISS_SPA, ZBEE_MFG_GEWISS_SPA },
811 { ZBEE_MFG_CODE_CLIMAX_TECH, ZBEE_MFG_CLIMAX_TECH },
812 { 0, NULL }
814 static value_string_ext zbee_mfr_code_names_ext = VALUE_STRING_EXT_INIT(zbee_mfr_code_names);
815 /* ZCL Attribute Status Names */
816 const value_string zbee_zcl_status_names[] = {
817 { ZBEE_ZCL_STAT_SUCCESS, "Success"},
818 { ZBEE_ZCL_STAT_FAILURE, "Failure"},
819 { ZBEE_ZCL_STAT_NOT_AUTHORIZED, "Not Authorized"},
820 { ZBEE_ZCL_STAT_RESERVED_FIELD_NOT_ZERO, "Reserved Field Not Zero"},
821 { ZBEE_ZCL_STAT_MALFORMED_CMD, "Malformed Command"},
822 { ZBEE_ZCL_STAT_UNSUP_CLUSTER_CMD, "Unsupported Cluster Command"},
823 { ZBEE_ZCL_STAT_UNSUP_GENERAL_CMD, "Unsupported General Command"},
824 { ZBEE_ZCL_STAT_UNSUP_MFR_CLUSTER_CMD, "Unsupported Manufacturer Cluster Command"},
825 { ZBEE_ZCL_STAT_UNSUP_MFR_GENERAL_CMD, "Unsupported Manufacturer General Command"},
826 { ZBEE_ZCL_STAT_INVALID_FIELD, "Invalid Field"},
827 { ZBEE_ZCL_STAT_UNSUPPORTED_ATTR, "Unsupported Attribute"},
828 { ZBEE_ZCL_STAT_INVALID_VALUE, "Invalid Value"},
829 { ZBEE_ZCL_STAT_READ_ONLY, "Read Only"},
830 { ZBEE_ZCL_STAT_INSUFFICIENT_SPACE, "Insufficient Space"},
831 { ZBEE_ZCL_STAT_DUPLICATE_EXISTS, "Duplicate Exists"},
832 { ZBEE_ZCL_STAT_NOT_FOUND, "Not Found"},
833 { ZBEE_ZCL_STAT_UNREPORTABLE_ATTR, "Unreportable Attribute"},
834 { ZBEE_ZCL_STAT_INVALID_DATA_TYPE, "Invalid Data Type"},
835 { ZBEE_ZCL_STAT_INVALID_SELECTOR, "Invalid Selector"},
836 { ZBEE_ZCL_STAT_WRITE_ONLY, "Write Only"},
837 { ZBEE_ZCL_STAT_INCONSISTENT_STARTUP_STATE, "Inconsistent Startup State"},
838 { ZBEE_ZCL_STAT_DEFINED_OUT_OF_BAND, "Defined Out of Band"},
839 { ZBEE_ZCL_STAT_INCONSISTENT, "Inconsistent Value"},
840 { ZBEE_ZCL_STAT_ACTION_DENIED, "Action Denied"},
841 { ZBEE_ZCL_STAT_TIMEOUT, "Timeout"},
842 { ZBEE_ZCL_STAT_OTA_ABORT, "Ota Abort"},
843 { ZBEE_ZCL_STAT_OTA_INVALID_IMAGE, "Ota Invalid Image"},
844 { ZBEE_ZCL_STAT_OTA_WAIT_FOR_DATA, "Ota Wait For Data"},
845 { ZBEE_ZCL_STAT_OTA_NO_IMAGE_AVAILABLE, "Ota No Image Available"},
846 { ZBEE_ZCL_STAT_OTA_REQUIRE_MORE_IMAGE, "Ota Require More Image"},
847 { ZBEE_ZCL_STAT_OTA_NOTIFICATION_PENDING, "Ota Notification Pending"},
848 { ZBEE_ZCL_STAT_HARDWARE_FAILURE, "Hardware Failure"},
849 { ZBEE_ZCL_STAT_SOFTWARE_FAILURE, "Software Failure"},
850 { ZBEE_ZCL_STAT_CALIBRATION_ERROR, "Calibration Error"},
851 { ZBEE_ZCL_STAT_UNSUPPORTED_CLUSTER, "Unsupported Cluster"},
852 { ZBEE_ZCL_STAT_LIMIT_REACHED, "Limit Reached"},
853 { 0, NULL }
856 static value_string_ext zbee_zcl_status_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_status_names);
858 /* ZCL Attribute Data Names */
859 static const value_string zbee_zcl_data_type_names[] = {
860 { ZBEE_ZCL_NO_DATA, "No Data" },
861 { ZBEE_ZCL_8_BIT_DATA, "8-Bit Data" },
862 { ZBEE_ZCL_16_BIT_DATA, "16-Bit Data" },
863 { ZBEE_ZCL_24_BIT_DATA, "24-Bit Data" },
864 { ZBEE_ZCL_32_BIT_DATA, "32-Bit Data" },
865 { ZBEE_ZCL_40_BIT_DATA, "40-Bit Data" },
866 { ZBEE_ZCL_48_BIT_DATA, "48-Bit Data" },
867 { ZBEE_ZCL_56_BIT_DATA, "56-Bit Data" },
868 { ZBEE_ZCL_64_BIT_DATA, "64-Bit Data" },
870 { ZBEE_ZCL_BOOLEAN, "Boolean" },
872 { ZBEE_ZCL_8_BIT_BITMAP, "8-Bit Bitmap" },
873 { ZBEE_ZCL_16_BIT_BITMAP, "16-Bit Bitmap" },
874 { ZBEE_ZCL_24_BIT_BITMAP, "24-Bit Bitmap" },
875 { ZBEE_ZCL_32_BIT_BITMAP, "32-Bit Bitmap" },
876 { ZBEE_ZCL_40_BIT_BITMAP, "40-Bit Bitmap" },
877 { ZBEE_ZCL_48_BIT_BITMAP, "48-Bit Bitmap" },
878 { ZBEE_ZCL_56_BIT_BITMAP, "56-Bit Bitmap" },
879 { ZBEE_ZCL_64_BIT_BITMAP, "64-Bit Bitmap" },
881 { ZBEE_ZCL_8_BIT_UINT, "8-Bit Unsigned Integer" },
882 { ZBEE_ZCL_16_BIT_UINT, "16-Bit Unsigned Integer" },
883 { ZBEE_ZCL_24_BIT_UINT, "24-Bit Unsigned Integer" },
884 { ZBEE_ZCL_32_BIT_UINT, "32-Bit Unsigned Integer" },
885 { ZBEE_ZCL_40_BIT_UINT, "40-Bit Unsigned Integer" },
886 { ZBEE_ZCL_48_BIT_UINT, "48-Bit Unsigned Integer" },
887 { ZBEE_ZCL_56_BIT_UINT, "56-Bit Unsigned Integer" },
888 { ZBEE_ZCL_64_BIT_UINT, "64-Bit Unsigned Integer" },
890 { ZBEE_ZCL_8_BIT_INT, "8-Bit Signed Integer" },
891 { ZBEE_ZCL_16_BIT_INT, "16-Bit Signed Integer" },
892 { ZBEE_ZCL_24_BIT_INT, "24-Bit Signed Integer" },
893 { ZBEE_ZCL_32_BIT_INT, "32-Bit Signed Integer" },
894 { ZBEE_ZCL_40_BIT_INT, "40-Bit Signed Integer" },
895 { ZBEE_ZCL_48_BIT_INT, "48-Bit Signed Integer" },
896 { ZBEE_ZCL_56_BIT_INT, "56-Bit Signed Integer" },
897 { ZBEE_ZCL_64_BIT_INT, "64-Bit Signed Integer" },
899 { ZBEE_ZCL_8_BIT_ENUM, "8-Bit Enumeration" },
900 { ZBEE_ZCL_16_BIT_ENUM, "16-Bit Enumeration" },
902 { ZBEE_ZCL_SEMI_FLOAT, "Semi-precision Floating Point" },
903 { ZBEE_ZCL_SINGLE_FLOAT, "Single Precision Floating Point" },
904 { ZBEE_ZCL_DOUBLE_FLOAT, "Double Precision Floating Point" },
906 { ZBEE_ZCL_OCTET_STRING, "Octet String" },
907 { ZBEE_ZCL_CHAR_STRING, "Character String" },
908 { ZBEE_ZCL_LONG_OCTET_STRING, "Long Octet String" },
909 { ZBEE_ZCL_LONG_CHAR_STRING, "Long Character String" },
911 { ZBEE_ZCL_ARRAY, "Array" },
912 { ZBEE_ZCL_STRUCT, "Structure" },
914 { ZBEE_ZCL_SET, "Set Collection" },
915 { ZBEE_ZCL_BAG, "Bag Collection" },
917 { ZBEE_ZCL_TIME, "Time of Day" },
918 { ZBEE_ZCL_DATE, "Date" },
919 { ZBEE_ZCL_UTC, "UTC Time" },
921 { ZBEE_ZCL_CLUSTER_ID, "Cluster ID" },
922 { ZBEE_ZCL_ATTR_ID, "Attribute ID" },
923 { ZBEE_ZCL_BACNET_OID, "BACnet OID" },
925 { ZBEE_ZCL_IEEE_ADDR, "IEEE Address" },
926 { ZBEE_ZCL_SECURITY_KEY, "128-Bit Security Key" },
928 { ZBEE_ZCL_UNKNOWN, "Unknown" },
930 { 0, NULL }
932 static value_string_ext zbee_zcl_data_type_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_data_type_names);
934 /* ZCL Attribute Short Data Names */
935 const value_string zbee_zcl_short_data_type_names[] = {
936 { ZBEE_ZCL_NO_DATA, "No Data" },
937 { ZBEE_ZCL_8_BIT_DATA, "Data8" },
938 { ZBEE_ZCL_16_BIT_DATA, "Data16" },
939 { ZBEE_ZCL_24_BIT_DATA, "Data24" },
940 { ZBEE_ZCL_32_BIT_DATA, "Data32" },
941 { ZBEE_ZCL_40_BIT_DATA, "Data40" },
942 { ZBEE_ZCL_48_BIT_DATA, "Data48" },
943 { ZBEE_ZCL_56_BIT_DATA, "Data56" },
944 { ZBEE_ZCL_64_BIT_DATA, "Data64" },
946 { ZBEE_ZCL_BOOLEAN, "Boolean" },
948 { ZBEE_ZCL_8_BIT_BITMAP, "Bit8" },
949 { ZBEE_ZCL_16_BIT_BITMAP, "Bit16" },
950 { ZBEE_ZCL_24_BIT_BITMAP, "Bit24" },
951 { ZBEE_ZCL_32_BIT_BITMAP, "Bit32" },
952 { ZBEE_ZCL_40_BIT_BITMAP, "Bit40" },
953 { ZBEE_ZCL_48_BIT_BITMAP, "Bit48" },
954 { ZBEE_ZCL_56_BIT_BITMAP, "Bit56" },
955 { ZBEE_ZCL_64_BIT_BITMAP, "Bit64" },
957 { ZBEE_ZCL_8_BIT_UINT, "Uint8" },
958 { ZBEE_ZCL_16_BIT_UINT, "Uint16" },
959 { ZBEE_ZCL_24_BIT_UINT, "Uint24" },
960 { ZBEE_ZCL_32_BIT_UINT, "Uint32" },
961 { ZBEE_ZCL_40_BIT_UINT, "Uint40" },
962 { ZBEE_ZCL_48_BIT_UINT, "Uint48" },
963 { ZBEE_ZCL_56_BIT_UINT, "Uint56" },
964 { ZBEE_ZCL_64_BIT_UINT, "Uint64" },
966 { ZBEE_ZCL_8_BIT_INT, "Int8" },
967 { ZBEE_ZCL_16_BIT_INT, "Int16" },
968 { ZBEE_ZCL_24_BIT_INT, "Int24" },
969 { ZBEE_ZCL_32_BIT_INT, "Int32" },
970 { ZBEE_ZCL_40_BIT_INT, "Int40" },
971 { ZBEE_ZCL_48_BIT_INT, "Int48" },
972 { ZBEE_ZCL_56_BIT_INT, "Int56" },
973 { ZBEE_ZCL_64_BIT_INT, "Int64" },
975 { ZBEE_ZCL_8_BIT_ENUM, "Enum8" },
976 { ZBEE_ZCL_16_BIT_ENUM, "Enum16" },
978 { ZBEE_ZCL_SEMI_FLOAT, "Semi Float" },
979 { ZBEE_ZCL_SINGLE_FLOAT, "Float" },
980 { ZBEE_ZCL_DOUBLE_FLOAT, "Double Float" },
982 { ZBEE_ZCL_OCTET_STRING, "Oct String" },
983 { ZBEE_ZCL_CHAR_STRING, "Char String" },
984 { ZBEE_ZCL_LONG_OCTET_STRING, "Long Oct String" },
985 { ZBEE_ZCL_LONG_CHAR_STRING, "Long Char String" },
987 { ZBEE_ZCL_ARRAY, "Array" },
988 { ZBEE_ZCL_STRUCT, "Structure" },
990 { ZBEE_ZCL_SET, "Set" },
991 { ZBEE_ZCL_BAG, "Bag" },
993 { ZBEE_ZCL_TIME, "Time" },
994 { ZBEE_ZCL_DATE, "Date" },
995 { ZBEE_ZCL_UTC, "UTC" },
997 { ZBEE_ZCL_CLUSTER_ID, "Cluster" },
998 { ZBEE_ZCL_ATTR_ID, "Attribute" },
999 { ZBEE_ZCL_BACNET_OID, "BACnet" },
1001 { ZBEE_ZCL_IEEE_ADDR, "EUI" },
1002 { ZBEE_ZCL_SECURITY_KEY, "Key" },
1004 { ZBEE_ZCL_UNKNOWN, "Unknown" },
1006 { 0, NULL }
1008 static value_string_ext zbee_zcl_short_data_type_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_short_data_type_names);
1010 /* ZCL Attribute English Weekday Names */
1011 static const value_string zbee_zcl_wd_names[] = {
1012 { 1, "Monday" },
1013 { 2, "Tuesday" },
1014 { 3, "Wednesday" },
1015 { 4, "Thursday" },
1016 { 5, "Friday" },
1017 { 6, "Saturday" },
1018 { 7, "Sunday" },
1020 { 0, NULL }
1022 static value_string_ext zbee_zcl_wd_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_wd_names);
1024 /* Attribute Direction Names */
1025 static const value_string zbee_zcl_dir_names[] = {
1026 { ZBEE_ZCL_DIR_RECEIVED, "Received" },
1027 { ZBEE_ZCL_DIR_REPORTED, "Reported" },
1029 { 0, NULL }
1032 /* Attribute Discovery Names */
1033 static const value_string zbee_zcl_dis_names[] = {
1034 { 0, "Incomplete" },
1035 { 1, "Complete" },
1037 { 0, NULL }
1041 *ZigBee Cluster Library dissector for wireshark.
1043 *@param tvb pointer to buffer containing raw packet.
1044 *@param pinfo pointer to packet information fields.
1045 *@param tree pointer to data tree wireshark uses to display packet.
1046 *@param data raw packet private data.
1048 static int dissect_zbee_zcl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
1050 tvbuff_t *payload_tvb;
1051 dissector_handle_t cluster_handle;
1053 proto_tree *zcl_tree;
1054 proto_tree *sub_tree = NULL;
1056 proto_item *proto_root;
1058 zbee_nwk_packet *nwk;
1059 zbee_zcl_packet packet;
1060 zbee_zcl_cluster_desc *desc;
1061 uint16_t cluster_id;
1063 uint8_t fcf;
1064 unsigned offset = 0;
1066 /* Reject the packet if data is NULL */
1067 if (data == NULL)
1068 return 0;
1069 nwk = (zbee_nwk_packet *)data;
1071 /* Init. */
1072 memset(&packet, 0, sizeof(zbee_zcl_packet));
1074 /* Fill the zcl cluster id */
1075 cluster_id = zcl_cluster_id = nwk->cluster_id;
1077 /* Create the protocol tree */
1078 proto_root = proto_tree_add_protocol_format(tree, proto_zbee_zcl, tvb, offset,
1079 -1, "ZigBee Cluster Library Frame");
1081 zcl_tree = proto_item_add_subtree(proto_root, ett_zbee_zcl);
1083 /* Clear info column */
1084 col_clear(pinfo->cinfo, COL_INFO);
1086 /* Get the FCF */
1087 fcf = tvb_get_uint8(tvb, offset);
1088 packet.frame_type = zbee_get_bit_field(fcf, ZBEE_ZCL_FCF_FRAME_TYPE);
1089 packet.mfr_spec = zbee_get_bit_field(fcf, ZBEE_ZCL_FCF_MFR_SPEC);
1090 packet.direction = zbee_get_bit_field(fcf, ZBEE_ZCL_FCF_DIRECTION);
1091 packet.disable_default_resp = zbee_get_bit_field(fcf, ZBEE_ZCL_FCF_DISABLE_DEFAULT_RESP);
1093 /* Display the FCF */
1094 if ( tree ) {
1095 /* Create the subtree */
1096 sub_tree = proto_tree_add_subtree_format(zcl_tree, tvb, offset, 1,
1097 ett_zbee_zcl_fcf, NULL, "Frame Control Field: %s (0x%02x)",
1098 val_to_str_const(packet.frame_type, zbee_zcl_frame_types, "Unknown"), fcf);
1100 /* Add the frame type */
1101 proto_tree_add_item(sub_tree, hf_zbee_zcl_fcf_frame_type, tvb, offset, 1, ENC_NA);
1103 /* Add the manufacturer specific, direction, and disable default response flags */
1104 proto_tree_add_item(sub_tree, hf_zbee_zcl_fcf_mfr_spec, tvb, offset, 1, ENC_NA);
1105 proto_tree_add_item(sub_tree, hf_zbee_zcl_fcf_dir, tvb, offset, 1, ENC_NA);
1106 proto_tree_add_item(sub_tree, hf_zbee_zcl_fcf_disable_default_resp, tvb, offset, 1, ENC_NA);
1108 offset += 1;
1110 /* If the manufacturer code is present, get and display it. */
1111 if (packet.mfr_spec) {
1112 packet.mfr_code = tvb_get_letohs(tvb, offset);
1114 if ( tree ) {
1115 proto_tree_add_uint(zcl_tree, hf_zbee_zcl_mfr_code, tvb, offset, 2,
1116 packet.mfr_code);
1118 proto_item_append_text(proto_root, ", Mfr: %s (0x%04x)",
1119 val_to_str_ext_const(packet.mfr_code, &zbee_mfr_code_names_ext, "Unknown"),
1120 packet.mfr_code);
1122 offset += 2;
1125 /* Fill the zcl mfr code id */
1126 zcl_mfr_code = packet.mfr_code;
1128 /* Add the transaction sequence number to the tree */
1129 packet.tran_seqno = tvb_get_uint8(tvb, offset);
1131 proto_tree_add_uint(zcl_tree, hf_zbee_zcl_tran_seqno, tvb, offset, 1, packet.tran_seqno);
1132 offset += 1;
1134 /* Display the command and sequence number on the proto root and info column. */
1135 packet.cmd_id = tvb_get_uint8(tvb, offset);
1137 /* Get the manufacturer specific cluster handle */
1138 cluster_handle = dissector_get_uint_handle(zbee_zcl_dissector_table, ZCL_CLUSTER_MFR_KEY(cluster_id, packet.mfr_code));
1140 desc = zbee_zcl_get_cluster_desc(cluster_id, packet.mfr_code);
1141 if (desc != NULL) {
1142 col_append_fstr(pinfo->cinfo, COL_INFO, "%s: ", desc->name);
1145 /* Add command ID to the tree. */
1146 if ( packet.frame_type == ZBEE_ZCL_FCF_PROFILE_WIDE ) {
1147 /* Profile-wide commands. */
1148 if ( tree ) {
1149 proto_item_append_text(proto_root, ", Command: %s, Seq: %u",
1150 val_to_str_ext_const(packet.cmd_id, &zbee_zcl_cmd_names_ext, "Unknown Command"),
1151 packet.tran_seqno);
1154 col_set_str(pinfo->cinfo, COL_INFO, "ZCL: ");
1155 col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
1156 val_to_str_ext_const(packet.cmd_id, &zbee_zcl_cmd_names_ext, "Unknown Command"),
1157 packet.tran_seqno);
1159 proto_tree_add_uint(zcl_tree, hf_zbee_zcl_cmd_id, tvb, offset, 1, packet.cmd_id);
1160 offset += 1;
1161 } else {
1162 /* Cluster-specific commands. */
1163 payload_tvb = tvb_new_subset_remaining(tvb, offset);
1164 if (cluster_handle != NULL) {
1165 /* Call the specific cluster dissector registered. */
1166 call_dissector_with_data(cluster_handle, payload_tvb, pinfo, zcl_tree, &packet);
1167 return tvb_captured_length(tvb);
1168 } else {
1169 col_append_fstr(pinfo->cinfo, COL_INFO, "Unknown Command: 0x%02x, Seq: %u", packet.cmd_id,
1170 packet.tran_seqno);
1172 proto_tree_add_uint(zcl_tree, hf_zbee_zcl_cs_cmd_id, tvb, offset, 1, packet.cmd_id);
1173 offset += 1;
1175 /* Don't decode the tail. */
1176 zcl_dump_data(tvb, offset, pinfo, zcl_tree);
1177 return tvb_captured_length(tvb);
1180 if ( zcl_tree ) {
1181 /* Handle the contents of the command frame. */
1182 switch ( packet.cmd_id ) {
1183 case ZBEE_ZCL_CMD_READ_ATTR:
1184 dissect_zcl_read_attr(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1185 break;
1187 case ZBEE_ZCL_CMD_READ_ATTR_RESP:
1188 dissect_zcl_read_attr_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1189 break;
1191 case ZBEE_ZCL_CMD_WRITE_ATTR:
1192 case ZBEE_ZCL_CMD_WRITE_ATTR_UNDIVIDED:
1193 case ZBEE_ZCL_CMD_WRITE_ATTR_NO_RESP:
1194 dissect_zcl_write_attr(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1195 break;
1197 case ZBEE_ZCL_CMD_REPORT_ATTR:
1198 dissect_zcl_report_attr(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1199 break;
1201 case ZBEE_ZCL_CMD_WRITE_ATTR_RESP:
1202 dissect_zcl_write_attr_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1203 break;
1205 case ZBEE_ZCL_CMD_CONFIG_REPORT:
1206 dissect_zcl_config_report(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1207 break;
1209 case ZBEE_ZCL_CMD_CONFIG_REPORT_RESP:
1210 dissect_zcl_config_report_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1211 break;
1213 case ZBEE_ZCL_CMD_READ_REPORT_CONFIG:
1214 dissect_zcl_read_report_config(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1215 break;
1217 case ZBEE_ZCL_CMD_READ_REPORT_CONFIG_RESP:
1218 dissect_zcl_read_report_config_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1219 break;
1221 case ZBEE_ZCL_CMD_DEFAULT_RESP:
1222 dissect_zcl_default_resp(tvb, pinfo, zcl_tree, &offset);
1223 break;
1225 case ZBEE_ZCL_CMD_DISCOVER_ATTR:
1226 case ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED:
1227 dissect_zcl_discover_attr(tvb, pinfo, zcl_tree, &offset);
1228 break;
1230 case ZBEE_ZCL_CMD_DISCOVER_ATTR_RESP:
1231 dissect_zcl_discover_attr_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1232 break;
1234 /* BUGBUG: don't dissect these for now*/
1235 case ZBEE_ZCL_CMD_READ_ATTR_STRUCT:
1236 dissect_zcl_read_attr_struct(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1237 break;
1239 case ZBEE_ZCL_CMD_WRITE_ATTR_STRUCT:
1240 dissect_zcl_write_attr_struct(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1241 break;
1243 case ZBEE_ZCL_CMD_WRITE_ATTR_STRUCT_RESP:
1244 dissect_zcl_write_attr_struct_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1245 break;
1247 case ZBEE_ZCL_CMD_DISCOVER_CMDS_REC:
1248 case ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN:
1249 dissect_zcl_discover_cmd_rec(tvb, pinfo, zcl_tree, &offset);
1250 break;
1252 case ZBEE_ZCL_CMD_DISCOVER_CMDS_REC_RESP:
1253 case ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN_RESP:
1254 dissect_zcl_discover_cmd_rec_resp(tvb, pinfo, zcl_tree, &offset);
1255 break;
1257 /* case ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN_RESP:
1258 dissect_zcl_discover_cmd_gen_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1259 break;*/
1261 case ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED_RESP:
1262 dissect_zcl_discover_cmd_attr_extended_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction);
1263 break;
1265 } /* switch */
1267 zcl_dump_data(tvb, offset, pinfo, zcl_tree);
1268 return tvb_captured_length(tvb);
1269 } /* dissect_zbee_zcl */
1272 *Helper dissector for ZCL Read Attributes and
1274 *@param tvb pointer to buffer containing raw packet.
1275 *@param pinfo pointer to packet information fields
1276 *@param tree pointer to data tree wireshark uses to display packet.
1277 *@param offset pointer from caller.
1278 *@param cluster_id cluster id
1279 *@param mfr_code manufacturer code.
1280 *@param direction ZCL direction
1282 void dissect_zcl_read_attr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1284 unsigned tvb_len;
1285 bool client_attr = direction == ZBEE_ZCL_FCF_TO_CLIENT;
1287 tvb_len = tvb_captured_length(tvb);
1288 while ( *offset < tvb_len ) {
1289 /* Dissect the attribute identifier */
1290 dissect_zcl_attr_id(tvb, tree, offset, cluster_id, mfr_code, client_attr);
1293 return;
1294 } /* dissect_zcl_read_attr */
1297 *Helper dissector for ZCL Read Attributes Response command.
1299 *@param tvb pointer to buffer containing raw packet.
1300 *@param pinfo pointer to packet information fields
1301 *@param tree pointer to data tree wireshark uses to display packet.
1302 *@param offset pointer to offset from caller
1303 *@param cluster_id cluster id
1304 *@param mfr_code manufacturer code.
1305 *@param direction ZCL direction
1307 void dissect_zcl_read_attr_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1309 proto_tree *sub_tree;
1311 unsigned tvb_len;
1312 unsigned i = 0;
1313 uint16_t attr_id;
1314 bool client_attr = direction == ZBEE_ZCL_FCF_TO_SERVER;
1316 tvb_len = tvb_captured_length(tvb);
1317 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1319 /* Create subtree for attribute status field */
1320 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Status Record");
1321 i++;
1323 /* Dissect the attribute identifier */
1324 attr_id = tvb_get_letohs(tvb, *offset);
1325 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr);
1327 /* Dissect the status and optionally the data type and value */
1328 if ( dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_status)
1329 == ZBEE_ZCL_STAT_SUCCESS ) {
1331 /* Dissect the attribute data type and data */
1332 dissect_zcl_attr_data_type_val(tvb, sub_tree, offset, attr_id, cluster_id, mfr_code, client_attr);
1335 /* Set end for subtree */
1336 proto_item_set_end(proto_tree_get_parent(sub_tree), tvb, *offset);
1338 } /* dissect_zcl_read_attr_resp */
1341 *Helper dissector for ZCL Report Attribute commands.
1343 *@param tvb pointer to buffer containing raw packet.
1344 *@param pinfo pointer to packet information fields
1345 *@param tree pointer to data tree wireshark uses to display packet.
1346 *@param offset pointer to offset from caller
1347 *@param cluster_id cluster id
1348 *@param mfr_code manufacturer code.
1349 *@param direction ZCL direction
1351 void dissect_zcl_write_attr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1353 proto_tree *sub_tree;
1355 unsigned tvb_len;
1356 unsigned i = 0;
1357 uint16_t attr_id;
1358 bool client_attr = direction == ZBEE_ZCL_FCF_TO_CLIENT;
1360 tvb_len = tvb_captured_length(tvb);
1361 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1363 /* Create subtree for attribute status field */
1364 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Attribute Field");
1365 i++;
1367 /* Dissect the attribute identifier */
1368 attr_id = tvb_get_letohs(tvb, *offset);
1369 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr);
1371 /* Dissect the attribute data type and data */
1372 dissect_zcl_attr_data_type_val(tvb, sub_tree, offset, attr_id, cluster_id, mfr_code, client_attr);
1374 /* Set end for subtree */
1375 proto_item_set_end(proto_tree_get_parent(sub_tree), tvb, *offset);
1377 } /* dissect_zcl_write_attr */
1380 *Helper dissector for ZCL Report Attribute commands.
1382 *@param tvb pointer to buffer containing raw packet.
1383 *@param pinfo pointer to packet information fields
1384 *@param tree pointer to data tree wireshark uses to display packet.
1385 *@param offset pointer to offset from caller
1386 *@param cluster_id cluster id
1387 *@param mfr_code manufacturer code.
1388 *@param direction ZCL direction
1390 void dissect_zcl_report_attr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1392 proto_tree *sub_tree;
1394 unsigned tvb_len;
1395 unsigned i = 0;
1396 uint16_t attr_id;
1397 bool client_attr = direction == ZBEE_ZCL_FCF_TO_SERVER;
1399 tvb_len = tvb_captured_length(tvb);
1400 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1402 /* Create subtree for attribute status field */
1403 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Attribute Field");
1404 i++;
1406 /* Dissect the attribute identifier */
1407 attr_id = tvb_get_letohs(tvb, *offset);
1408 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr);
1410 /* Dissect the attribute data type and data */
1411 dissect_zcl_attr_data_type_val(tvb, sub_tree, offset, attr_id, cluster_id, mfr_code, client_attr);
1413 /* Set end for subtree */
1414 proto_item_set_end(proto_tree_get_parent(sub_tree), tvb, *offset);
1416 } /* dissect_zcl_report_attr */
1419 *Helper dissector for ZCL Write Attribute Response command.
1421 *@param tvb pointer to buffer containing raw packet.
1422 *@param pinfo pointer to packet information fields
1423 *@param tree pointer to data tree wireshark uses to display packet.
1424 *@param offset pointer to offset from caller
1425 *@param cluster_id cluster id
1426 *@param mfr_code manufacturer code.
1427 *@param direction ZCL direction
1429 static void dissect_zcl_write_attr_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1431 proto_tree *sub_tree;
1433 unsigned tvb_len;
1434 unsigned i = 0;
1435 bool client_attr = direction == ZBEE_ZCL_FCF_TO_SERVER;
1437 tvb_len = tvb_captured_length(tvb);
1438 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1440 /* Create subtree for attribute status field */
1441 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Status Record");
1442 i++;
1444 /* Dissect the status */
1445 if ( dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_status) !=
1446 ZBEE_ZCL_STAT_SUCCESS ) {
1448 /* Dissect the failed attribute identifier */
1449 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr);
1452 /* Set end for subtree */
1453 proto_item_set_end(proto_tree_get_parent(sub_tree), tvb, *offset);
1456 } /* dissect_zcl_write_attr_resp */
1459 *Helper dissector for ZCL Report Attribute commands.
1461 *@param tvb pointer to buffer containing raw packet.
1462 *@param pinfo pointer to packet information fields
1463 *@param tree pointer to data tree wireshark uses to display packet.
1464 *@param offset pointer to offset from caller
1465 *@param cluster_id cluster identification
1466 *@param mfr_code manufacturer code.
1467 *@param direction ZCL direction
1469 static void dissect_zcl_read_report_config_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
1470 unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1472 proto_tree *sub_tree;
1474 unsigned tvb_len;
1475 unsigned i = 0;
1476 unsigned data_type;
1477 unsigned attr_status;
1478 unsigned attr_dir;
1479 uint16_t attr_id;
1481 tvb_len = tvb_captured_length(tvb);
1482 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1484 /* Create subtree for attribute status field */
1485 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 3, ett_zbee_zcl_attr[i], NULL, "Reporting Configuration Record");
1486 i++;
1488 /* Dissect the status */
1489 attr_status = dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_status);
1491 /* Dissect the direction and any reported configuration */
1492 attr_dir = dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_dir);
1494 /* Dissect the attribute id */
1495 attr_id = tvb_get_letohs(tvb, *offset);
1496 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, (direction == ZBEE_ZCL_FCF_TO_SERVER && attr_dir == ZBEE_ZCL_DIR_REPORTED) ||
1497 (direction == ZBEE_ZCL_FCF_TO_CLIENT && attr_dir == ZBEE_ZCL_DIR_RECEIVED));
1499 if ( attr_status == ZBEE_ZCL_STAT_SUCCESS ) {
1500 if ( attr_dir == ZBEE_ZCL_DIR_REPORTED ) {
1502 /* Dissect the attribute data type */
1503 data_type = dissect_zcl_attr_uint8(tvb, sub_tree, offset,
1504 &hf_zbee_zcl_attr_data_type);
1506 /* Dissect minimum reporting interval */
1507 proto_tree_add_item(tree, hf_zbee_zcl_attr_minint, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
1508 (*offset) += 2;
1510 /* Dissect maximum reporting interval */
1511 proto_tree_add_item(tree, hf_zbee_zcl_attr_maxint, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
1512 (*offset) += 2;
1514 if ( IS_ANALOG_SUBTYPE(data_type) ) {
1515 /* Dissect reportable change */
1516 dissect_zcl_attr_data_general(tvb, sub_tree, offset, attr_id, data_type, cluster_id, mfr_code, direction == ZBEE_ZCL_FCF_TO_SERVER);
1519 } else {
1520 /* Dissect timeout period */
1521 proto_tree_add_item(tree, hf_zbee_zcl_attr_timeout, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
1522 (*offset) += 2;
1527 } /* dissect_zcl_read_report_config_resp */
1530 *Helper dissector for ZCL Config Report Attribute commands.
1532 *@param tvb pointer to buffer containing raw packet.
1533 *@param pinfo pointer to packet information fields
1534 *@param tree pointer to data tree wireshark uses to display packet.
1535 *@param offset pointer to offset from caller
1536 *@param cluster_id cluster id
1537 *@param mfr_code manufacturer code.
1538 *@param direction ZCL direction
1540 static void dissect_zcl_config_report(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1542 proto_tree *sub_tree;
1544 unsigned tvb_len;
1545 unsigned i = 0;
1546 unsigned data_type;
1547 uint16_t attr_id;
1549 tvb_len = tvb_captured_length(tvb);
1550 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1552 /* Create subtree for attribute status field */
1553 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 3, ett_zbee_zcl_attr[i], NULL, "Reporting Configuration Record");
1554 i++;
1556 /* Dissect the direction and any reported configuration */
1557 if ( dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_dir)
1558 == ZBEE_ZCL_DIR_REPORTED ) {
1560 /* Dissect the attribute id */
1561 attr_id = tvb_get_letohs(tvb, *offset);
1562 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, direction == ZBEE_ZCL_FCF_TO_CLIENT);
1564 /* Dissect the attribute data type */
1565 data_type = dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_data_type);
1567 /* Dissect minimum reporting interval */
1568 proto_tree_add_item(tree, hf_zbee_zcl_attr_minint, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
1569 (*offset) += 2;
1571 /* Dissect maximum reporting interval */
1572 proto_tree_add_item(tree, hf_zbee_zcl_attr_maxint, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
1573 (*offset) += 2;
1575 if ( IS_ANALOG_SUBTYPE(data_type) ) {
1576 /* Dissect reportable change */
1577 dissect_zcl_attr_data_general(tvb, sub_tree, offset, attr_id, data_type, cluster_id, mfr_code, direction == ZBEE_ZCL_FCF_TO_CLIENT);
1579 } else {
1581 /* Dissect the attribute id */
1582 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, direction == ZBEE_ZCL_FCF_TO_SERVER);
1584 /* Dissect timeout period */
1585 proto_tree_add_item(tree, hf_zbee_zcl_attr_timeout, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
1586 (*offset) += 2;
1590 } /* dissect_zcl_config_report */
1593 *Helper dissector for ZCL Config Report Attribute Response commands.
1595 *@param tvb pointer to buffer containing raw packet.
1596 *@param pinfo pointer to packet information fields
1597 *@param tree pointer to data tree wireshark uses to display packet.
1598 *@param offset pointer to offset from caller
1599 *@param cluster_id cluster id
1600 *@param mfr_code manufacturer code.
1601 *@param direction ZCL direction
1603 static void dissect_zcl_config_report_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
1604 unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1606 proto_tree *sub_tree;
1608 unsigned tvb_len;
1609 unsigned i = 0;
1611 tvb_len = tvb_captured_length(tvb);
1613 /* Special case when all attributes configured successfully */
1614 if ( *offset == tvb_len - 1 ) {
1615 /* Dissect the status */
1616 if ( dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_status) !=
1617 ZBEE_ZCL_STAT_SUCCESS ) {
1618 expert_add_info(pinfo, tree->last_child, &ei_cfg_rpt_rsp_short_non_success);
1622 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1623 uint8_t attr_dir;
1625 /* Create subtree for attribute status field */
1626 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 3, ett_zbee_zcl_attr[i], NULL, "Attribute Status Record");
1627 i++;
1629 /* Dissect the status */
1630 dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_status);
1631 /* Dissect the direction */
1632 attr_dir = dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_dir);
1633 /* Dissect the attribute identifier */
1634 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, (direction == ZBEE_ZCL_FCF_TO_SERVER && attr_dir == ZBEE_ZCL_DIR_REPORTED) ||
1635 (direction == ZBEE_ZCL_FCF_TO_CLIENT && attr_dir == ZBEE_ZCL_DIR_RECEIVED));
1637 } /* dissect_zcl_config_report_resp */
1640 *Helper dissector for ZCL Read Report Configuration command.
1642 *@param tvb pointer to buffer containing raw packet.
1643 *@param pinfo pointer to packet information fields
1644 *@param tree pointer to data tree wireshark uses to display packet.
1645 *@param offset pointer to offset from caller
1646 *@param cluster_id cluster id
1647 *@param mfr_code manufacturer code.
1648 *@param direction ZCL direction
1650 static void dissect_zcl_read_report_config(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
1651 unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1653 proto_tree *sub_tree;
1655 unsigned tvb_len;
1656 unsigned i = 0;
1658 tvb_len = tvb_captured_length(tvb);
1659 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1660 uint8_t attr_dir;
1662 /* Create subtree for attribute status field */
1663 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 3, ett_zbee_zcl_attr[i], NULL, "Attribute Status Record");
1664 i++;
1666 /* Dissect the direction */
1667 attr_dir = dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_dir);
1669 /* Dissect the attribute identifier */
1670 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, (direction == ZBEE_ZCL_FCF_TO_SERVER && attr_dir == ZBEE_ZCL_DIR_RECEIVED) ||
1671 (direction == ZBEE_ZCL_FCF_TO_CLIENT && attr_dir == ZBEE_ZCL_DIR_REPORTED));
1674 } /* dissect_zcl_read_report_config */
1677 *Helper dissector for ZCL Default Response command.
1679 *@param tvb pointer to buffer containing raw packet.
1680 *@param pinfo pointer to packet information fields
1681 *@param tree pointer to data tree wireshark uses to display packet.
1682 *@param offset pointer to offset from caller.
1684 static void dissect_zcl_default_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset)
1686 /* The only way to tell if this is a profile-wide or cluster specific command */
1687 /* is the frame control of the original message to which this is the response. */
1688 /* So, display the originating command id and do not attempt to interpret */
1689 proto_tree_add_item(tree, hf_zbee_zcl_cmd_id_rsp, tvb, *offset, 1, ENC_NA);
1690 *offset += 1;
1692 /* Dissect the status */
1693 dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_status);
1694 } /* dissect_zcl_default_resp */
1697 *Helper dissector for ZCL Discover Attributes command.
1699 *@param tvb pointer to buffer containing raw packet.
1700 *@param pinfo pointer to packet information fields
1701 *@param tree pointer to data tree wireshark uses to display packet.
1702 *@param offset pointer to offset from caller
1704 static void dissect_zcl_discover_attr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset)
1706 /* Dissect the starting attribute identifier */
1707 proto_tree_add_item(tree, hf_zbee_zcl_attr_start, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
1708 *offset += 2;
1710 /* Dissect the number of maximum attribute identifiers */
1711 dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_maxnum);
1713 return;
1714 } /* dissect_zcl_discover_attr */
1718 *Helper dissector for ZCL Discover Attributes command.
1720 *@param tvb pointer to buffer containing raw packet.
1721 *@param pinfo pointer to packet information fields
1722 *@param tree pointer to data tree wireshark uses to display packet.
1723 *@param offset pointer to offset from caller
1724 *@param cluster_id cluster id
1725 *@param mfr_code manufacturer code.
1726 *@param direction ZCL direction
1728 static void dissect_zcl_discover_attr_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
1729 unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction)
1731 proto_tree *sub_tree = NULL;
1733 unsigned tvb_len;
1734 unsigned i = 0;
1735 bool client_attr = direction == ZBEE_ZCL_FCF_TO_SERVER;
1737 dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_dis);
1739 tvb_len = tvb_captured_length(tvb);
1740 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1742 /* Create subtree for attribute status field */
1743 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 3, ett_zbee_zcl_attr[i], NULL, "Attribute Status Record");
1744 i++;
1746 /* Dissect the attribute identifier */
1747 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr);
1749 /* Dissect the number of maximum attribute identifiers */
1750 dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_data_type);
1753 } /* dissect_zcl_discover_attr_resp */
1756 static void dissect_zcl_read_attr_struct(tvbuff_t* tvb, packet_info* pinfo _U_, proto_tree* tree, unsigned* offset,
1757 uint16_t cluster_id, uint16_t mfr_code, bool direction)
1759 proto_tree *sub_tree = NULL;
1760 unsigned tvb_len;
1761 unsigned i = 0, j=0;
1762 // uint16_t attr_id;
1763 uint8_t indicator;
1764 bool client_attr = direction == ZBEE_ZCL_FCF_TO_CLIENT;
1765 tvb_len = tvb_captured_length(tvb);
1766 while (*offset < tvb_len && i < ZBEE_ZCL_NUM_SEL_ETT) {
1767 /* Create subtree for selector field */
1768 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_sel[i], NULL, "Selector");
1769 i++;
1770 /* Dissect the attribute identifier */
1771 // attr_id = tvb_get_letohs(tvb, *offset);
1772 dissect_zcl_attr_id(tvb, tree, offset, cluster_id, mfr_code, client_attr);
1773 proto_tree_add_item(sub_tree, hf_zbee_zcl_indicator, tvb, *offset, 1, ENC_LITTLE_ENDIAN);
1774 indicator = tvb_get_uint8(tvb, *offset);
1775 *offset += 1;
1776 j=0;
1777 while (j < indicator) {
1778 proto_tree_add_item(sub_tree, hf_zbee_zcl_index, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
1779 //index = tvb_get_letohs(tvb, offset);
1780 /*index = dissect_zcl_array_type();*/
1781 j++;
1782 *offset += 2;
1786 }/*dissect_zcl_read_attr_struct*/
1788 static void dissect_zcl_write_attr_struct(tvbuff_t* tvb, packet_info* pinfo _U_, proto_tree* tree, unsigned* offset,
1789 uint16_t cluster_id, uint16_t mfr_code, bool direction)
1791 proto_tree *sub_tree = NULL;
1792 proto_tree *sub_tree_1 = NULL;
1793 unsigned tvb_len, indicator;
1794 unsigned i = 0, j=0;
1795 uint16_t attr_id;
1796 bool client_attr = direction == ZBEE_ZCL_FCF_TO_CLIENT;
1797 tvb_len = tvb_captured_length(tvb);
1798 while(*offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT){
1799 /* Create subtree for selector field */
1800 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Attribute Record");
1801 sub_tree_1 = proto_tree_add_subtree(sub_tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Selector");
1802 i++;
1803 /* Dissect the attribute identifier */
1804 attr_id = tvb_get_letohs(tvb, *offset);
1805 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr);
1806 if(sub_tree_1){
1807 proto_tree_add_item(sub_tree, hf_zbee_zcl_indicator, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1808 indicator = tvb_get_uint8(tvb, *offset);
1809 (* offset) += 1;
1810 j=0;
1811 while (j < indicator) {
1812 proto_tree_add_item(sub_tree, hf_zbee_zcl_index, tvb, 0, 2, ENC_LITTLE_ENDIAN);
1813 j++;
1814 (* offset) += 2;
1817 /* Dissect the attribute data type and data */
1818 dissect_zcl_attr_data_type_val(tvb, sub_tree, offset, attr_id, cluster_id, mfr_code, client_attr);
1820 /* Set end for subtree */
1821 proto_item_set_end(proto_tree_get_parent(sub_tree_1), tvb, *offset);
1824 static void dissect_zcl_write_attr_struct_resp(tvbuff_t* tvb, packet_info* pinfo _U_, proto_tree* tree, unsigned* offset, uint16_t cluster_id, uint16_t mfr_code, bool direction){
1826 proto_tree *sub_tree;
1827 proto_tree *sub_tree_1;
1828 unsigned tvb_len, indicator;
1829 unsigned i = 0,j = 0;
1830 bool client_attr = direction == ZBEE_ZCL_FCF_TO_SERVER;
1831 tvb_len = tvb_captured_length(tvb);
1832 while (*offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT) {
1833 /* Create subtree for attribute status field */
1834 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Write Attribute Record");
1835 sub_tree_1 = proto_tree_add_subtree(sub_tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Selector");
1836 i++;
1837 /* Dissect the status */
1838 if (dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_status) !=
1839 ZBEE_ZCL_STAT_SUCCESS) {
1840 /* Dissect the failed attribute identifier */
1841 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr);
1842 if (sub_tree_1) {
1843 proto_tree_add_item(sub_tree, hf_zbee_zcl_indicator, tvb, 0, 1, ENC_LITTLE_ENDIAN);
1844 indicator = tvb_get_uint8(tvb, *offset);
1845 *offset += 1;
1846 j = 0;
1847 while (j < indicator) {
1848 proto_tree_add_item(sub_tree, hf_zbee_zcl_index, tvb, 0, 2, ENC_LITTLE_ENDIAN);
1849 //index = tvb_get_letohs(tvb, offset);
1850 /*index = dissect_zcl_array_type();*/
1851 j++;
1852 *offset += 2;
1857 /* Set end for subtree */
1858 // proto_item_set_end(proto_tree_get_parent(sub_tree_1), tvb, *offset);
1860 static void dissect_zcl_discover_cmd_rec(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset)
1862 dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_cmd_start);
1863 /* Dissect the number of maximum attribute identifiers */
1864 dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_cmd_maxnum);
1865 return;
1868 static void dissect_zcl_discover_cmd_rec_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset)
1870 proto_tree* sub_tree = NULL;
1871 unsigned tvb_len;
1872 unsigned i = 0;
1874 /* Discovery Complete */
1875 dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_dis);
1877 tvb_len = tvb_captured_length(tvb);
1878 if ( *offset < tvb_len ) {
1879 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, *offset - tvb_len, ett_zbee_zcl_attr[i], NULL, "Command Identifiers");
1880 while ( *offset < tvb_len && i < (tvb_len-1) ) {
1881 /* Dissect the command identifiers */
1882 dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_cs_cmd_id);
1883 i++;
1888 static void dissect_zcl_discover_cmd_attr_extended_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction){
1889 proto_tree* sub_tree = NULL;
1890 unsigned tvb_len;
1891 unsigned i = 0;
1892 bool client_attr = direction == ZBEE_ZCL_FCF_TO_SERVER;
1894 /** Discovery Complete */
1895 dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_dis);
1897 tvb_len = tvb_captured_length(tvb);
1898 while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
1899 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 4, ett_zbee_zcl_attr[i], NULL, "Extended Attribute Information");
1900 i++;
1902 /** Attribute identifier */
1903 dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr);
1905 /** Attribute data type */
1906 dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_data_type);
1908 /** Attribute access control */
1909 dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_access_ctrl);
1914 *Dissects Attribute ID field. This could be done with the
1916 *@param tvb pointer to buffer containing raw packet.
1917 *@param tree pointer to data tree wireshark uses to display packet.
1918 *@param offset into the tvb to begin dissection.
1919 *@param cluster_id cluster id
1920 *@param mfr_code manufacturer code.
1921 *@param client_attr ZCL client
1923 void dissect_zcl_attr_id(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool client_attr)
1925 zbee_zcl_cluster_desc *desc;
1926 int hf_attr_id = hf_zbee_zcl_attr_id;
1928 /* Check if a cluster-specific attribute ID definition exists. */
1929 desc = zbee_zcl_get_cluster_desc(cluster_id, mfr_code);
1931 if (desc) {
1932 if (client_attr) {
1933 if (desc->hf_attr_client_id > 0) {
1934 hf_attr_id = desc->hf_attr_client_id;
1937 else {
1938 if (desc->hf_attr_server_id > 0) {
1939 hf_attr_id = desc->hf_attr_server_id;
1944 /* Add the identifier. */
1945 proto_tree_add_item(tree, hf_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
1946 *offset += 2;
1947 } /* dissect_zcl_attr_id */
1950 *Helper dissector for ZCL Attribute commands.
1952 *@param tvb pointer to buffer containing raw packet.
1953 *@param tree pointer to data tree wireshark uses to display packet.
1954 *@param offset into the tvb to begin dissection.
1955 *@param attr_id attribute id
1956 *@param cluster_id cluster id
1957 *@param mfr_code manufacturer code.
1958 *@param client_attr ZCL client
1960 void dissect_zcl_attr_data_type_val(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint16_t attr_id, uint16_t cluster_id, uint16_t mfr_code, bool client_attr)
1962 zbee_zcl_cluster_desc *desc;
1964 desc = zbee_zcl_get_cluster_desc(cluster_id, mfr_code);
1965 if ((desc != NULL) && (desc->fn_attr_data != NULL)) {
1966 desc->fn_attr_data(tree, tvb, offset, attr_id,
1967 dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_data_type), client_attr);
1969 else {
1970 dissect_zcl_attr_data(tvb, tree, offset,
1971 dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_data_type), client_attr);
1974 } /* dissect_zcl_attr_data_type_val */
1978 *Helper dissector for ZCL Attribute commands.
1980 *@param tvb pointer to buffer containing raw packet.
1981 *@param tree pointer to data tree wireshark uses to display packet.
1982 *@param offset into the tvb to begin dissection.
1983 *@param attr_id attribute identification
1984 *@param data_type type of data
1985 *@param cluster_id cluster id
1986 *@param mfr_code manufacturer code.
1987 *@param client_attr ZCL client
1989 static void dissect_zcl_attr_data_general(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint16_t attr_id, unsigned data_type, uint16_t cluster_id, uint16_t mfr_code, bool client_attr)
1991 zbee_zcl_cluster_desc *desc;
1993 desc = zbee_zcl_get_cluster_desc(cluster_id, mfr_code);
1994 if ((desc != NULL) && (desc->fn_attr_data != NULL)) {
1995 desc->fn_attr_data(tree, tvb, offset, attr_id, data_type, client_attr);
1997 else {
1998 dissect_zcl_attr_data(tvb, tree, offset, data_type, client_attr);
2001 } /*dissect_zcl_attr_data_general*/
2004 *Dissects the various types of ZCL attribute data.
2006 *@param tvb pointer to buffer containing raw packet.
2007 *@param tree pointer to data tree wireshark uses to display packet.
2008 *@param offset into the tvb to begin dissection.
2009 *@param client_attr ZCL client
2011 // NOLINTNEXTLINE(misc-no-recursion)
2012 void dissect_zcl_attr_data(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, unsigned data_type, bool client_attr)
2014 unsigned attr_uint;
2015 int attr_int;
2016 const uint8_t *attr_string;
2017 uint8_t attr_uint8[4];
2018 uint8_t elements_type;
2019 uint16_t elements_num;
2020 float attr_float;
2021 double attr_double;
2022 nstime_t attr_time;
2023 uint32_t utc_time;
2024 proto_item *attr_utc_item = NULL;
2026 /* Dissect attribute data type and data */
2027 // We can recurse here, but we should run out of packet before we run out of stack.
2028 switch ( data_type ) {
2029 case ZBEE_ZCL_NO_DATA:
2030 break;
2032 case ZBEE_ZCL_8_BIT_DATA:
2033 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 1, ENC_NA);
2034 (*offset) += 1;
2035 break;
2037 case ZBEE_ZCL_8_BIT_BITMAP:
2038 proto_tree_add_item(tree, hf_zbee_zcl_attr_bitmap8, tvb, *offset, 1, ENC_NA);
2039 proto_item_append_text(tree, ", Bitmap: %02x", tvb_get_uint8(tvb, *offset));
2040 (*offset) += 1;
2041 break;
2043 case ZBEE_ZCL_8_BIT_UINT:
2044 case ZBEE_ZCL_8_BIT_ENUM:
2045 /* Display 8 bit unsigned integer */
2046 attr_uint = tvb_get_uint8(tvb, *offset);
2047 proto_item_append_text(tree, ", %s: %u",
2048 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_uint);
2049 proto_tree_add_item(tree, hf_zbee_zcl_attr_uint8, tvb, *offset, 1, ENC_NA);
2050 *offset += 1;
2051 break;
2053 case ZBEE_ZCL_8_BIT_INT:
2054 /* Display 8 bit integer */
2055 attr_int = tvb_get_int8(tvb, *offset);
2056 proto_item_append_text(tree, ", %s: %-d",
2057 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_int);
2058 proto_tree_add_item(tree, hf_zbee_zcl_attr_int8, tvb, *offset, 1, ENC_NA);
2059 *offset += 1;
2060 break;
2062 case ZBEE_ZCL_BOOLEAN:
2063 attr_uint = tvb_get_uint8(tvb, *offset);
2064 proto_item_append_text(tree, ", %s: 0x%02x",
2065 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_uint);
2066 proto_tree_add_item(tree, hf_zbee_zcl_attr_boolean, tvb, *offset, 1, ENC_BIG_ENDIAN);
2067 *offset += 1;
2068 break;
2070 case ZBEE_ZCL_16_BIT_DATA:
2071 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 2, ENC_NA);
2072 (*offset) += 2;
2073 break;
2075 case ZBEE_ZCL_16_BIT_BITMAP:
2076 proto_tree_add_item(tree, hf_zbee_zcl_attr_bitmap16, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
2077 proto_item_append_text(tree, ", Bitmap: %04" PRIx16, tvb_get_letohs(tvb, *offset));
2078 (*offset) += 2;
2079 break;
2081 case ZBEE_ZCL_16_BIT_UINT:
2082 case ZBEE_ZCL_16_BIT_ENUM:
2083 /* Display 16 bit unsigned integer */
2084 attr_uint = tvb_get_letohs(tvb, *offset);
2085 proto_item_append_text(tree, ", %s: %u",
2086 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_uint);
2087 proto_tree_add_item(tree, hf_zbee_zcl_attr_uint16, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
2088 *offset += 2;
2089 break;
2091 case ZBEE_ZCL_16_BIT_INT:
2092 /* Display 16 bit integer */
2093 attr_int = tvb_get_letohis(tvb, *offset);
2094 proto_item_append_text(tree, ", %s: %-d",
2095 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_int);
2096 proto_tree_add_item(tree, hf_zbee_zcl_attr_int16, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
2097 *offset += 2;
2098 break;
2100 case ZBEE_ZCL_24_BIT_DATA:
2101 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 3, ENC_NA);
2102 (*offset) += 3;
2103 break;
2105 case ZBEE_ZCL_24_BIT_BITMAP:
2106 proto_tree_add_item(tree, hf_zbee_zcl_attr_bitmap24, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
2107 proto_item_append_text(tree, ", Bitmap: %06" PRIx32, tvb_get_letoh24(tvb, *offset));
2108 (*offset) += 3;
2109 break;
2111 case ZBEE_ZCL_24_BIT_UINT:
2112 /* Display 24 bit unsigned integer */
2113 attr_uint = tvb_get_letoh24(tvb, *offset);
2114 proto_item_append_text(tree, ", %s: %u",
2115 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_uint);
2116 proto_tree_add_item(tree, hf_zbee_zcl_attr_uint24, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
2117 *offset += 3;
2118 break;
2120 case ZBEE_ZCL_24_BIT_INT:
2121 /* Display 24 bit signed integer */
2122 attr_int = tvb_get_letohi24(tvb, *offset);
2123 /* sign extend into int32 */
2124 if (attr_int & INT24_SIGN_BITS) attr_int |= INT24_SIGN_BITS;
2125 proto_item_append_text(tree, ", %s: %-d",
2126 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_int);
2127 proto_tree_add_item(tree, hf_zbee_zcl_attr_int24, tvb, *offset, 3, ENC_LITTLE_ENDIAN);
2128 *offset += 3;
2129 break;
2131 case ZBEE_ZCL_32_BIT_DATA:
2132 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 4, ENC_NA);
2133 (*offset) += 4;
2134 break;
2136 case ZBEE_ZCL_32_BIT_BITMAP:
2137 proto_tree_add_item(tree, hf_zbee_zcl_attr_bitmap32, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
2138 proto_item_append_text(tree, ", Bitmap: %08" PRIx32, tvb_get_letohl(tvb, *offset));
2139 (*offset) += 4;
2140 break;
2142 case ZBEE_ZCL_32_BIT_UINT:
2143 /* Display 32 bit unsigned integer */
2144 attr_uint = tvb_get_letohl(tvb, *offset);
2145 proto_item_append_text(tree, ", %s: %u",
2146 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_uint);
2147 proto_tree_add_item(tree, hf_zbee_zcl_attr_uint32, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
2148 *offset += 4;
2149 break;
2151 case ZBEE_ZCL_32_BIT_INT:
2152 /* Display 32 bit signed integer */
2153 attr_int = tvb_get_letohil(tvb, *offset);
2154 proto_item_append_text(tree, ", %s: %-d",
2155 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_int);
2156 proto_tree_add_item(tree, hf_zbee_zcl_attr_int32, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
2157 *offset += 4;
2158 break;
2160 case ZBEE_ZCL_40_BIT_DATA:
2161 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 5, ENC_NA);
2162 (*offset) += 5;
2163 break;
2165 case ZBEE_ZCL_40_BIT_BITMAP:
2166 proto_tree_add_item(tree, hf_zbee_zcl_attr_bitmap40, tvb, *offset, 5, ENC_LITTLE_ENDIAN);
2167 proto_item_append_text(tree, ", Bitmap: %010" PRIx64, tvb_get_letoh40(tvb, *offset));
2168 (*offset) += 5;
2169 break;
2171 case ZBEE_ZCL_40_BIT_UINT:
2172 proto_tree_add_item(tree, hf_zbee_zcl_attr_uint40, tvb, *offset, 5, ENC_LITTLE_ENDIAN);
2173 proto_item_append_text(tree, ", Uint: %" PRIu64, tvb_get_letoh40(tvb, *offset));
2174 (*offset) += 5;
2175 break;
2177 case ZBEE_ZCL_40_BIT_INT:
2178 proto_tree_add_item(tree, hf_zbee_zcl_attr_int64, tvb, *offset, 5, ENC_LITTLE_ENDIAN);
2179 proto_item_append_text(tree, ", Int: %" PRId64, tvb_get_letohi40(tvb, *offset));
2180 (*offset) += 5;
2181 break;
2183 case ZBEE_ZCL_48_BIT_DATA:
2184 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 6, ENC_NA);
2185 (*offset) += 6;
2186 break;
2188 case ZBEE_ZCL_48_BIT_BITMAP:
2189 proto_tree_add_item(tree, hf_zbee_zcl_attr_bitmap48, tvb, *offset, 6, ENC_LITTLE_ENDIAN);
2190 proto_item_append_text(tree, ", Bitmap: %012" PRIx64, tvb_get_letoh48(tvb, *offset));
2191 (*offset) += 6;
2192 break;
2194 case ZBEE_ZCL_48_BIT_UINT:
2195 proto_tree_add_item(tree, hf_zbee_zcl_attr_uint48, tvb, *offset, 6, ENC_LITTLE_ENDIAN);
2196 proto_item_append_text(tree, ", Uint: %" PRIu64, tvb_get_letoh48(tvb, *offset));
2197 (*offset) += 6;
2198 break;
2200 case ZBEE_ZCL_48_BIT_INT:
2201 proto_tree_add_item(tree, hf_zbee_zcl_attr_int64, tvb, *offset, 6, ENC_LITTLE_ENDIAN);
2202 proto_item_append_text(tree, ", Int: %" PRId64, tvb_get_letohi48(tvb, *offset));
2203 (*offset) += 6;
2204 break;
2206 case ZBEE_ZCL_56_BIT_DATA:
2207 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 7, ENC_NA);
2208 (*offset) += 7;
2209 break;
2211 case ZBEE_ZCL_56_BIT_BITMAP:
2212 proto_tree_add_item(tree, hf_zbee_zcl_attr_bitmap56, tvb, *offset, 7, ENC_LITTLE_ENDIAN);
2213 proto_item_append_text(tree, ", Bitmap: %014" PRIx64, tvb_get_letoh56(tvb, *offset));
2214 (*offset) += 7;
2215 break;
2217 case ZBEE_ZCL_56_BIT_UINT:
2218 proto_tree_add_item(tree, hf_zbee_zcl_attr_uint56, tvb, *offset, 7, ENC_LITTLE_ENDIAN);
2219 proto_item_append_text(tree, ", Uint: %" PRIu64, tvb_get_letoh56(tvb, *offset));
2220 (*offset) += 7;
2221 break;
2223 case ZBEE_ZCL_56_BIT_INT:
2224 proto_tree_add_item(tree, hf_zbee_zcl_attr_int64, tvb, *offset, 7, ENC_LITTLE_ENDIAN);
2225 proto_item_append_text(tree, ", Int: %" PRId64, tvb_get_letohi56(tvb, *offset));
2226 (*offset) += 7;
2227 break;
2229 case ZBEE_ZCL_64_BIT_DATA:
2230 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 8, ENC_NA);
2231 (*offset) += 8;
2232 break;
2234 case ZBEE_ZCL_64_BIT_BITMAP:
2235 proto_tree_add_item(tree, hf_zbee_zcl_attr_bitmap64, tvb, *offset, 8, ENC_LITTLE_ENDIAN);
2236 proto_item_append_text(tree, ", Bitmap: %016" PRIx64, tvb_get_letoh64(tvb, *offset));
2237 (*offset) += 8;
2238 break;
2240 case ZBEE_ZCL_64_BIT_UINT:
2241 proto_tree_add_item(tree, hf_zbee_zcl_attr_uint64, tvb, *offset, 8, ENC_LITTLE_ENDIAN);
2242 proto_item_append_text(tree, ", Uint: %" PRIu64, tvb_get_letoh64(tvb, *offset));
2243 (*offset) += 8;
2244 break;
2246 case ZBEE_ZCL_64_BIT_INT:
2247 proto_tree_add_item(tree, hf_zbee_zcl_attr_int64, tvb, *offset, 8, ENC_LITTLE_ENDIAN);
2248 proto_item_append_text(tree, ", Int: %" PRIu64, tvb_get_letoh64(tvb, *offset));
2249 (*offset) += 8;
2250 break;
2252 case ZBEE_ZCL_SEMI_FLOAT:
2253 /* BUGBUG */
2254 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 2, ENC_NA);
2255 (*offset) += 2;
2256 break;
2258 case ZBEE_ZCL_SINGLE_FLOAT:
2259 attr_float = tvb_get_letohieee_float(tvb, *offset);
2260 proto_item_append_text(tree, ", %s: %g",
2261 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved"), attr_float);
2262 proto_tree_add_item(tree, hf_zbee_zcl_attr_float, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
2263 *offset += 4;
2264 break;
2266 case ZBEE_ZCL_DOUBLE_FLOAT:
2267 attr_double = tvb_get_letohieee_double(tvb, *offset);
2268 proto_item_append_text(tree, ", Double: %g", attr_double);
2269 proto_tree_add_item(tree, hf_zbee_zcl_attr_double, tvb, *offset, 8, ENC_LITTLE_ENDIAN);
2270 *offset += 8;
2271 break;
2273 case ZBEE_ZCL_OCTET_STRING:
2274 /* Display octet string */
2275 proto_tree_add_item_ret_length(tree, hf_zbee_zcl_attr_ostr, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, &attr_int);
2276 if (attr_int > 1)
2277 proto_item_append_text(tree, ", Octets: %s", tvb_bytes_to_str_punct(wmem_packet_scope(), tvb, (*offset)+1, attr_int-1, ':'));
2278 *offset += attr_int;
2279 break;
2281 case ZBEE_ZCL_CHAR_STRING:
2282 /* Display string */
2283 proto_tree_add_item_ret_string_and_length(tree, hf_zbee_zcl_attr_str, tvb, *offset, 1, ENC_NA|ENC_ZIGBEE, wmem_packet_scope(), &attr_string, &attr_int);
2284 proto_item_append_text(tree, ", String: %s", attr_string);
2285 *offset += attr_int;
2286 break;
2288 case ZBEE_ZCL_LONG_OCTET_STRING:
2289 /* Display long octet string */
2290 proto_tree_add_item_ret_length(tree, hf_zbee_zcl_attr_ostr, tvb, *offset, 2, ENC_LITTLE_ENDIAN|ENC_ZIGBEE, &attr_int);
2291 if (attr_int > 2)
2292 proto_item_append_text(tree, ", Octets: %s", tvb_bytes_to_str_punct(wmem_packet_scope(), tvb, (*offset)+2, attr_int-2, ':'));
2293 *offset += attr_int;
2294 break;
2296 case ZBEE_ZCL_LONG_CHAR_STRING:
2297 /* Display long string */
2298 proto_tree_add_item_ret_string_and_length(tree, hf_zbee_zcl_attr_str, tvb, *offset, 2, ENC_LITTLE_ENDIAN|ENC_ZIGBEE, wmem_packet_scope(), &attr_string, &attr_int);
2299 proto_item_append_text(tree, ", String: %s", attr_string);
2300 *offset += attr_int;
2301 break;
2303 case ZBEE_ZCL_ARRAY:
2304 /* BYTE 0 - Elements type */
2305 elements_type = tvb_get_uint8(tvb, *offset);
2306 proto_tree_add_uint(tree, hf_zbee_zcl_attr_array_elements_type, tvb, *offset, 1, elements_type);
2307 *offset += 1;
2308 /* BYTE 1-2 - Element number */
2309 elements_num = tvb_get_letohs(tvb, *offset);
2310 proto_tree_add_uint(tree, hf_zbee_zcl_attr_array_elements_num, tvb, *offset, 2, elements_num);
2311 *offset += 2;
2312 /* BYTE ... - Elements */
2313 dissect_zcl_array_type(tvb, tree, offset, elements_type, elements_num, client_attr);
2314 break;
2316 case ZBEE_ZCL_SET:
2317 /* BYTE 0 - Elements type */
2318 elements_type = tvb_get_uint8(tvb, *offset);
2319 proto_tree_add_uint(tree, hf_zbee_zcl_attr_set_elements_type, tvb, *offset, 1, elements_type);
2320 *offset += 1;
2321 /* BYTE 1-2 - Element number */
2322 elements_num = tvb_get_letohs(tvb, *offset);
2323 proto_tree_add_uint(tree, hf_zbee_zcl_attr_set_elements_num, tvb, *offset, 2, elements_num);
2324 *offset += 2;
2325 /* BYTE ... - Elements */
2326 dissect_zcl_set_type(tvb, tree, offset, elements_type, elements_num, client_attr);
2327 break;
2329 case ZBEE_ZCL_BAG: /* Same as ZBEE_ZCL_SET, but using different filter fields */
2330 /* BYTE 0 - Elements type */
2331 elements_type = tvb_get_uint8(tvb, *offset);
2332 proto_tree_add_uint(tree, hf_zbee_zcl_attr_bag_elements_type, tvb, *offset, 1, elements_type);
2333 *offset += 1;
2334 /* BYTE 1-2 - Element number */
2335 elements_num = tvb_get_letohs(tvb, *offset);
2336 proto_tree_add_uint(tree, hf_zbee_zcl_attr_bag_elements_num, tvb, *offset, 2, elements_num);
2337 *offset += 2;
2338 /* BYTE ... - Elements */
2339 dissect_zcl_set_type(tvb, tree, offset, elements_type, elements_num, client_attr);
2340 break;
2342 case ZBEE_ZCL_STRUCT:
2343 /* ToDo */
2344 break;
2346 case ZBEE_ZCL_TIME:
2347 /* Dissect Time of Day */
2348 attr_uint8[0] = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_hours);
2349 attr_uint8[1] = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_mins);
2350 attr_uint8[2] = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_secs);
2351 attr_uint8[3] = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_csecs);
2353 proto_item_append_text(tree, ", Time: %u:%u:%u.%u",
2354 attr_uint8[0], attr_uint8[1], attr_uint8[2], attr_uint8[3]);
2355 break;
2357 case ZBEE_ZCL_DATE:
2358 /* Dissect Date */
2359 attr_uint8[0] = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_yy);
2360 attr_uint8[1] = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_mm);
2361 attr_uint8[2] = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_md);
2362 attr_uint8[3] = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_wd);
2363 proto_item_append_text(tree, ", Date: %u/%u/%u %s",
2364 attr_uint8[0]+1900, attr_uint8[1], attr_uint8[2],
2365 val_to_str_ext_const(attr_uint8[3], &zbee_zcl_wd_names_ext, "Invalid Weekday") );
2366 break;
2368 case ZBEE_ZCL_UTC:
2369 /* Display UTC */
2370 utc_time = tvb_get_letohl(tvb, *offset);
2371 attr_time.secs = utc_time;
2372 attr_time.secs += EPOCH_DELTA_2000_01_01_00_00_00_UTC;
2373 attr_time.nsecs = 0;
2374 proto_item_append_text(tree, ", %s",
2375 val_to_str_ext_const(data_type, &zbee_zcl_short_data_type_names_ext, "Reserved") );
2376 attr_string = (const uint8_t *)abs_time_to_str(wmem_packet_scope(), &attr_time, ABSOLUTE_TIME_UTC, true);
2377 proto_tree_add_time_format(tree, hf_zbee_zcl_attr_utc, tvb, *offset, 4, &attr_time,
2378 "UTC Time: %s (%u)", attr_string, utc_time);
2380 /* The raw integer value is sometimes needed independent of the formatted time */
2381 attr_utc_item = proto_tree_add_item(tree, hf_zbee_zcl_attr_utc_raw, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
2382 proto_item_set_hidden(attr_utc_item);
2383 *offset += 4;
2384 break;
2386 case ZBEE_ZCL_CLUSTER_ID:
2387 proto_tree_add_item(tree, hf_zbee_zcl_attr_cid, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
2388 (*offset) += 2;
2389 break;
2391 case ZBEE_ZCL_ATTR_ID:
2392 dissect_zcl_attr_id(tvb, tree, offset, zcl_cluster_id, zcl_mfr_code, client_attr);
2393 break;
2395 case ZBEE_ZCL_BACNET_OID:
2396 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 4, ENC_NA);
2397 (*offset) += 4;
2398 break;
2400 case ZBEE_ZCL_IEEE_ADDR:
2401 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 8, ENC_NA);
2402 (*offset) += 8;
2403 break;
2405 case ZBEE_ZCL_SECURITY_KEY:
2406 proto_tree_add_item(tree, hf_zbee_zcl_attr_bytes, tvb, *offset, 16, ENC_NA);
2407 (*offset) += 16;
2408 break;
2410 default:
2411 break;
2414 } /* dissect_zcl_attr_data */
2417 *Helper dissector for ZCL Attribute commands.
2419 *@param tvb pointer to buffer containing raw packet.
2420 *@param tree pointer to data tree wireshark uses to display packet.
2421 *@param offset into the tvb to begin dissection.
2422 *@param hf_zbee_zcl pointer to header field index
2423 *@return dissected data
2425 unsigned dissect_zcl_attr_uint8(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, int *hf_zbee_zcl)
2427 unsigned attr_uint;
2429 attr_uint = tvb_get_uint8(tvb, *offset);
2430 proto_tree_add_uint(tree, *hf_zbee_zcl, tvb, *offset, 1, attr_uint);
2431 (*offset)++;
2433 return attr_uint;
2434 } /* dissect_zcl_attr_uint8 */
2437 *Helper dissector for ZCL attribute array type.
2439 *@param tvb pointer to buffer containing raw packet.
2440 *@param tree pointer to data tree wireshark uses to display packet.
2441 *@param offset into the tvb to begin dissection.
2442 *@param elements_type element type
2443 *@param elements_num elements number
2444 *@param client_attr ZCL client
2446 static void
2447 // NOLINTNEXTLINE(misc-no-recursion)
2448 dissect_zcl_array_type(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint8_t elements_type, uint16_t elements_num, bool client_attr)
2450 proto_tree *sub_tree;
2452 unsigned tvb_len;
2453 unsigned i = 1; /* First element has a 1-index value */
2455 tvb_len = tvb_captured_length(tvb);
2456 while ( (*offset < tvb_len) && (elements_num != 0) ) {
2458 /* Have "common" use case give individual tree control to all elements,
2459 but don't prevent dissection if list is large */
2460 if (i < ZBEE_ZCL_NUM_ARRAY_ELEM_ETT-1)
2461 sub_tree = proto_tree_add_subtree_format(tree, tvb, *offset, 0,
2462 ett_zbee_zcl_array_elements[i], NULL, "Element #%d", i);
2463 else
2464 sub_tree = proto_tree_add_subtree_format(tree, tvb, *offset, 0,
2465 ett_zbee_zcl_array_elements[ZBEE_ZCL_NUM_ARRAY_ELEM_ETT-1], NULL, "Element #%d", i);
2467 unsigned old_offset = *offset;
2468 dissect_zcl_attr_data(tvb, sub_tree, offset, elements_type, client_attr);
2469 if (old_offset >= *offset) {
2470 proto_tree_add_expert(sub_tree, NULL, &ei_zbee_zero_length_element, tvb, old_offset, -1);
2471 break;
2473 elements_num--;
2474 i++;
2476 } /* dissect_zcl_array_type */
2479 *Helper dissector for ZCL attribute set and bag types.
2481 *@param tvb pointer to buffer containing raw packet.
2482 *@param tree pointer to data tree wireshark uses to display packet.
2483 *@param offset into the tvb to begin dissection.
2484 *@param elements_type element type
2485 *@param elements_num elements number
2486 *@param client_attr ZCL client
2488 static void
2489 // NOLINTNEXTLINE(misc-no-recursion)
2490 dissect_zcl_set_type(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint8_t elements_type, uint16_t elements_num, bool client_attr)
2492 proto_tree *sub_tree;
2494 unsigned tvb_len;
2495 unsigned i = 1; /* First element has a 1-index value */
2497 tvb_len = tvb_captured_length(tvb);
2498 while ( (*offset < tvb_len) && (elements_num != 0) ) {
2499 /* Piggyback on array ett_ variables */
2500 /* Have "common" use case give individual tree control to all elements,
2501 but don't prevent dissection if list is large */
2502 if (i < ZBEE_ZCL_NUM_ARRAY_ELEM_ETT-1)
2503 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0,
2504 ett_zbee_zcl_array_elements[i], NULL, "Element");
2505 else
2506 sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0,
2507 ett_zbee_zcl_array_elements[ZBEE_ZCL_NUM_ARRAY_ELEM_ETT-1], NULL, "Element");
2509 unsigned old_offset = *offset;
2510 dissect_zcl_attr_data(tvb, sub_tree, offset, elements_type, client_attr);
2511 if (old_offset >= *offset) {
2512 proto_tree_add_expert(sub_tree, NULL, &ei_zbee_zero_length_element, tvb, old_offset, -1);
2513 break;
2515 elements_num--;
2516 i++;
2518 } /* dissect_zcl_set_type */
2521 *Helper functions dumps any remaining data into the data dissector.
2523 *@param tvb pointer to buffer containing raw packet.
2524 *@param offset offset after parsing last item.
2525 *@param pinfo packet information structure.
2526 *@param tree pointer to data tree Wireshark uses to display packet.
2528 static void zcl_dump_data(tvbuff_t *tvb, unsigned offset, packet_info *pinfo, proto_tree *tree)
2530 proto_tree *root = proto_tree_get_root(tree);
2531 unsigned length = tvb_captured_length_remaining(tvb, offset);
2532 tvbuff_t *remainder;
2534 if (length > 0) {
2535 remainder = tvb_new_subset_remaining(tvb, offset);
2536 call_data_dissector(remainder, pinfo, root);
2539 return;
2540 } /* zcl_dump_data */
2543 * This function decodes ZCL UTCTime into a string representation of the time
2544 * with the integer UTCTime value in brackets afterwards as the value is
2545 * sometimes also useful.
2547 * @param s string to display
2548 * @param value value to decode as ZCL 32 bit UTCTime
2550 void
2551 decode_zcl_utc_time(char *s, uint32_t value)
2553 char *start_time;
2554 time_t epoch_time = (time_t)value + EPOCH_DELTA_2000_01_01_00_00_00_UTC;
2555 start_time = abs_time_secs_to_str (NULL, epoch_time, ABSOLUTE_TIME_UTC, true);
2556 snprintf(s, ITEM_LABEL_LENGTH, "%s (%d)", start_time, value);
2557 wmem_free(NULL, start_time);
2558 } /* decode_zcl_utc_time */
2561 *This function decodes tenth of second time type variable
2564 void decode_zcl_time_in_100ms(char *s, uint16_t value)
2566 snprintf(s, ITEM_LABEL_LENGTH, "%d.%d seconds", value/10, value%10);
2567 return;
2568 } /* decode_zcl_time_in_100ms*/
2571 *This function decodes second time type variable
2574 void decode_zcl_time_in_seconds(char *s, uint16_t value)
2576 snprintf(s, ITEM_LABEL_LENGTH, "%d seconds", value);
2577 return;
2578 } /* decode_zcl_time_in_seconds*/
2581 *This function decodes minute time type variable
2584 void decode_zcl_time_in_minutes(char *s, uint16_t value)
2586 snprintf(s, ITEM_LABEL_LENGTH, "%d minutes", value);
2587 return;
2588 } /*decode_zcl_time_in_minutes*/
2590 static void
2591 cluster_desc_free(void *p, void *user_data _U_)
2593 g_free(p);
2596 static void
2597 zbee_shutdown(void)
2599 g_list_foreach(acluster_desc, cluster_desc_free, NULL);
2600 g_list_free(acluster_desc);
2604 *ZigBee ZCL protocol registration routine.
2607 void proto_register_zbee_zcl(void)
2609 unsigned i, j;
2611 static hf_register_info hf[] = {
2612 { &hf_zbee_zcl_fcf_frame_type,
2613 { "Frame Type", "zbee_zcl.type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_frame_types),
2614 ZBEE_ZCL_FCF_FRAME_TYPE, NULL, HFILL }},
2616 { &hf_zbee_zcl_fcf_mfr_spec,
2617 { "Manufacturer Specific", "zbee_zcl.ms", FT_BOOLEAN, 8, NULL,
2618 ZBEE_ZCL_FCF_MFR_SPEC, NULL, HFILL }},
2620 { &hf_zbee_zcl_fcf_dir,
2621 { "Direction", "zbee_zcl.dir", FT_BOOLEAN, 8, TFS(&tfs_s2c_c2s),
2622 ZBEE_ZCL_FCF_DIRECTION, NULL, HFILL }},
2624 { &hf_zbee_zcl_fcf_disable_default_resp,
2625 { "Disable Default Response", "zbee_zcl.ddr", FT_BOOLEAN, 8, NULL,
2626 ZBEE_ZCL_FCF_DISABLE_DEFAULT_RESP, NULL, HFILL }},
2628 { &hf_zbee_zcl_mfr_code,
2629 { "Manufacturer Code", "zbee_zcl.cmd.mc", FT_UINT16, BASE_HEX|BASE_EXT_STRING,
2630 &zbee_mfr_code_names_ext, 0x0, "Assigned manufacturer code.", HFILL }},
2632 { &hf_zbee_zcl_tran_seqno,
2633 { "Sequence Number", "zbee_zcl.cmd.tsn", FT_UINT8, BASE_DEC, NULL, 0x0,
2634 NULL, HFILL }},
2636 { &hf_zbee_zcl_cmd_id,
2637 { "Command", "zbee_zcl.cmd.id", FT_UINT8, BASE_HEX|BASE_EXT_STRING, &zbee_zcl_cmd_names_ext,
2638 0x0, NULL, HFILL }},
2640 { &hf_zbee_zcl_cs_cmd_id,
2641 { "Command", "zbee_zcl.cs.cmd.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_cs_cmd_names) /*"Unknown"*/,
2642 0x0, NULL, HFILL }},
2644 { &hf_zbee_zcl_cmd_id_rsp,
2645 { "Response to Command", "zbee_zcl.cmd.id.rsp", FT_UINT8, BASE_HEX, NULL,
2646 0x0, NULL, HFILL }},
2648 { &hf_zbee_zcl_attr_id,
2649 { "Attribute", "zbee_zcl.attr.id", FT_UINT16, BASE_HEX, NULL, 0x0,
2650 NULL, HFILL }},
2652 { &hf_zbee_zcl_attr_data_type,
2653 { "Data Type", "zbee_zcl.attr.data.type", FT_UINT8, BASE_HEX|BASE_EXT_STRING,
2654 &zbee_zcl_data_type_names_ext, 0x0, NULL, HFILL }},
2656 { &hf_zbee_zcl_attr_boolean,
2657 { "Boolean", "zbee_zcl.attr.boolean", FT_BOOLEAN, 8, NULL, 0xff,
2658 NULL, HFILL }},
2660 { &hf_zbee_zcl_attr_bitmap8,
2661 { "Bitmap8", "zbee_zcl.attr.bitmap8", FT_UINT8, BASE_HEX, NULL, 0x0,
2662 NULL, HFILL }},
2664 { &hf_zbee_zcl_attr_bitmap16,
2665 { "Bitmap16", "zbee_zcl.attr.bitmap16", FT_UINT16, BASE_HEX, NULL, 0x0,
2666 NULL, HFILL }},
2668 { &hf_zbee_zcl_attr_bitmap24,
2669 { "Bitmap24", "zbee_zcl.attr.bitmap24", FT_UINT24, BASE_HEX, NULL, 0x0,
2670 NULL, HFILL }},
2672 { &hf_zbee_zcl_attr_bitmap32,
2673 { "Bitmap32", "zbee_zcl.attr.bitmap32", FT_UINT32, BASE_HEX, NULL, 0x0,
2674 NULL, HFILL }},
2676 { &hf_zbee_zcl_attr_bitmap40,
2677 { "Bitmap40", "zbee_zcl.attr.bitmap40", FT_UINT64, BASE_HEX, NULL, 0x0,
2678 NULL, HFILL }},
2680 { &hf_zbee_zcl_attr_bitmap48,
2681 { "Bitmap48", "zbee_zcl.attr.bitmap48", FT_UINT64, BASE_HEX, NULL, 0x0,
2682 NULL, HFILL }},
2684 { &hf_zbee_zcl_attr_bitmap56,
2685 { "Bitmap56", "zbee_zcl.attr.bitmap56", FT_UINT64, BASE_HEX, NULL, 0x0,
2686 NULL, HFILL }},
2688 { &hf_zbee_zcl_attr_bitmap64,
2689 { "Bitmap64", "zbee_zcl.attr.bitmap64", FT_UINT64, BASE_HEX, NULL, 0x0,
2690 NULL, HFILL }},
2692 { &hf_zbee_zcl_attr_uint8,
2693 { "Uint8", "zbee_zcl.attr.uint8", FT_UINT8, BASE_DEC_HEX, NULL, 0x0,
2694 NULL, HFILL }},
2696 { &hf_zbee_zcl_attr_uint16,
2697 { "Uint16", "zbee_zcl.attr.uint16", FT_UINT16, BASE_DEC_HEX, NULL, 0x0,
2698 NULL, HFILL }},
2700 { &hf_zbee_zcl_attr_uint24,
2701 { "Uint24", "zbee_zcl.attr.uint24", FT_UINT24, BASE_DEC_HEX, NULL, 0x0,
2702 NULL, HFILL }},
2704 { &hf_zbee_zcl_attr_uint32,
2705 { "Uint32", "zbee_zcl.attr.uint32", FT_UINT32, BASE_DEC_HEX, NULL, 0x0,
2706 NULL, HFILL }},
2708 { &hf_zbee_zcl_attr_uint40,
2709 { "Uint40", "zbee_zcl.attr.uint40", FT_UINT64, BASE_DEC_HEX, NULL, 0x0,
2710 NULL, HFILL }},
2712 { &hf_zbee_zcl_attr_uint48,
2713 { "Uint48", "zbee_zcl.attr.uint48", FT_UINT64, BASE_DEC_HEX, NULL, 0x0,
2714 NULL, HFILL }},
2716 { &hf_zbee_zcl_attr_uint56,
2717 { "Uint56", "zbee_zcl.attr.uint56", FT_UINT64, BASE_DEC_HEX, NULL, 0x0,
2718 NULL, HFILL }},
2720 { &hf_zbee_zcl_attr_uint64,
2721 { "Uint64", "zbee_zcl.attr.uint64", FT_UINT64, BASE_DEC_HEX, NULL, 0x0,
2722 NULL, HFILL }},
2724 { &hf_zbee_zcl_attr_int8,
2725 { "Int8", "zbee_zcl.attr.int8", FT_INT8, BASE_DEC, NULL, 0x0,
2726 NULL, HFILL }},
2728 { &hf_zbee_zcl_attr_int16,
2729 { "Int16", "zbee_zcl.attr.int16", FT_INT16, BASE_DEC, NULL, 0x0,
2730 NULL, HFILL }},
2732 { &hf_zbee_zcl_attr_int24,
2733 { "Int24", "zbee_zcl.attr.int24", FT_INT24, BASE_DEC, NULL, 0x0,
2734 NULL, HFILL }},
2736 { &hf_zbee_zcl_attr_int32,
2737 { "Int32", "zbee_zcl.attr.int32", FT_INT32, BASE_DEC, NULL, 0x0,
2738 NULL, HFILL }},
2740 { &hf_zbee_zcl_attr_int64,
2741 { "Int64", "zbee_zcl.attr.int64", FT_INT64, BASE_DEC, NULL, 0x0,
2742 NULL, HFILL }},
2744 { &hf_zbee_zcl_attr_float,
2745 { "Float", "zbee_zcl.attr.float", FT_FLOAT, BASE_NONE, NULL, 0x0,
2746 NULL, HFILL }},
2748 { &hf_zbee_zcl_attr_double,
2749 { "Double Float", "zbee_zcl.attr.float", FT_DOUBLE, BASE_NONE, NULL, 0x0,
2750 NULL, HFILL }},
2752 { &hf_zbee_zcl_attr_bytes,
2753 { "Bytes", "zbee_zcl.attr.bytes", FT_BYTES, BASE_NONE, NULL, 0x0,
2754 NULL, HFILL }},
2756 { &hf_zbee_zcl_attr_minint,
2757 { "Minimum Interval", "zbee_zcl.attr.minint", FT_UINT16, BASE_DEC, NULL, 0x0,
2758 NULL, HFILL }},
2760 { &hf_zbee_zcl_attr_maxint,
2761 { "Maximum Interval", "zbee_zcl.attr.maxint", FT_UINT16, BASE_DEC, NULL, 0x0,
2762 NULL, HFILL }},
2764 { &hf_zbee_zcl_attr_timeout,
2765 { "Timeout", "zbee_zcl.attr.timeout", FT_UINT16, BASE_DEC, NULL, 0x0,
2766 NULL, HFILL }},
2768 { &hf_zbee_zcl_attr_hours,
2769 { "Hours", "zbee_zcl.attr.hours", FT_UINT8, BASE_DEC, NULL, 0x0,
2770 NULL, HFILL }},
2772 { &hf_zbee_zcl_attr_mins,
2773 { "Minutes", "zbee_zcl.attr.mins", FT_UINT8, BASE_DEC, NULL, 0x0,
2774 NULL, HFILL }},
2776 { &hf_zbee_zcl_attr_secs,
2777 { "Seconds", "zbee_zcl.attr.secs", FT_UINT8, BASE_DEC, NULL, 0x0,
2778 NULL, HFILL }},
2780 { &hf_zbee_zcl_attr_csecs,
2781 { "Centiseconds", "zbee_zcl.attr.csecs", FT_UINT8, BASE_DEC, NULL, 0x0,
2782 NULL, HFILL }},
2784 { &hf_zbee_zcl_attr_yy,
2785 { "Year", "zbee_zcl.attr.yy", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2787 { &hf_zbee_zcl_attr_mm,
2788 { "Month", "zbee_zcl.attr.mm", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2790 { &hf_zbee_zcl_attr_md,
2791 { "Day of Month", "zbee_zcl.attr.md", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2793 { &hf_zbee_zcl_attr_wd,
2794 { "Day of Week", "zbee_zcl.attr.wd", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2796 { &hf_zbee_zcl_attr_utc,
2797 { "UTC", "zbee_zcl.attr.utc", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0, NULL, HFILL }},
2799 { &hf_zbee_zcl_attr_utc_raw,
2800 { "UTC (raw value)", "zbee_zcl.attr.utc_raw", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
2802 { &hf_zbee_zcl_attr_status,
2803 { "Status", "zbee_zcl.attr.status", FT_UINT8, BASE_HEX|BASE_EXT_STRING, &zbee_zcl_status_names_ext,
2804 0x0, NULL, HFILL }},
2806 { &hf_zbee_zcl_attr_dir,
2807 { "Direction", "zbee_zcl.attr.dir", FT_UINT8, BASE_HEX, VALS(zbee_zcl_dir_names),
2808 0x0, NULL, HFILL }},
2810 { &hf_zbee_zcl_indicator,
2811 { "Indicator", "zbee_zcl.attr.ind", FT_UINT8, BASE_DEC, NULL,
2812 0x0, NULL, HFILL}},
2814 { &hf_zbee_zcl_index,
2815 { "Indicator", "zbee_zcl.attr.index", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
2817 { &hf_zbee_zcl_attr_access_ctrl,
2818 { "Attribute Access Control", "zbee_zcl.attr.access.ctrl", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2820 { &hf_zbee_zcl_attr_dis,
2821 { "Discovery", "zbee_zcl.attr.dis", FT_UINT8, BASE_HEX, VALS(zbee_zcl_dis_names),
2822 0x0, NULL, HFILL }},
2824 { &hf_zbee_zcl_cmd_start,
2825 {"Start Command", "zbee_zcl.cmd.start", FT_UINT8, BASE_HEX, NULL,
2826 0x0, NULL, HFILL}},
2828 { &hf_zbee_zcl_cmd_maxnum,
2829 {"Maximum Number", "zbee_zcl.cmd.maxnum", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
2831 { &hf_zbee_zcl_attr_cid,
2832 { "Cluster", "zbee_zcl.attr.cid", FT_UINT16, BASE_HEX, NULL, 0x0,
2833 NULL, HFILL }},
2835 { &hf_zbee_zcl_attr_start,
2836 { "Start Attribute", "zbee_zcl.attr.start", FT_UINT16, BASE_HEX, NULL, 0x0,
2837 NULL, HFILL }},
2839 { &hf_zbee_zcl_attr_maxnum,
2840 { "Maximum Number", "zbee_zcl.attr.maxnum", FT_UINT8, BASE_DEC, NULL, 0x0,
2841 NULL, HFILL }},
2843 { &hf_zbee_zcl_attr_str,
2844 { "String", "zbee_zcl.attr.str", FT_UINT_STRING, BASE_NONE, NULL, 0x0,
2845 NULL, HFILL }},
2847 { &hf_zbee_zcl_attr_ostr,
2848 { "Octet String", "zbee_zcl.attr.ostr", FT_UINT_BYTES, SEP_COLON, NULL, 0x0,
2849 NULL, HFILL }},
2851 { &hf_zbee_zcl_attr_array_elements_type,
2852 { "Elements Type", "zbee_zcl.attr.array.elements_type", FT_UINT8, BASE_HEX|BASE_EXT_STRING,
2853 &zbee_zcl_data_type_names_ext, 0x0,
2854 NULL, HFILL }},
2856 { &hf_zbee_zcl_attr_array_elements_num,
2857 { "Elements Number", "zbee_zcl.attr.array.elements_num", FT_UINT16, BASE_DEC, NULL, 0x0,
2858 NULL, HFILL }},
2860 { &hf_zbee_zcl_attr_set_elements_type,
2861 { "Elements Type", "zbee_zcl.attr.set.elements_type", FT_UINT8, BASE_HEX|BASE_EXT_STRING,
2862 &zbee_zcl_data_type_names_ext, 0x0,
2863 NULL, HFILL }},
2865 { &hf_zbee_zcl_attr_set_elements_num,
2866 { "Elements Number", "zbee_zcl.attr.set.elements_num", FT_UINT16, BASE_DEC, NULL, 0x0,
2867 NULL, HFILL }},
2869 { &hf_zbee_zcl_attr_bag_elements_type,
2870 { "Elements Type", "zbee_zcl.attr.bag.elements_type", FT_UINT8, BASE_HEX|BASE_EXT_STRING,
2871 &zbee_zcl_data_type_names_ext, 0x0,
2872 NULL, HFILL }},
2874 { &hf_zbee_zcl_attr_bag_elements_num,
2875 { "Elements Number", "zbee_zcl.attr.bag.elements_num", FT_UINT16, BASE_DEC, NULL, 0x0,
2876 NULL, HFILL }}
2879 /* ZCL subtrees */
2880 int *ett[ZBEE_ZCL_NUM_TOTAL_ETT];
2882 ett[0] = &ett_zbee_zcl;
2883 ett[1] = &ett_zbee_zcl_fcf;
2884 j = ZBEE_ZCL_NUM_INDIVIDUAL_ETT;
2886 /* initialize attribute subtree types */
2887 for ( i = 0; i < ZBEE_ZCL_NUM_ATTR_ETT; i++, j++) {
2888 ett[j] = &ett_zbee_zcl_attr[i];
2891 for( i = 0; i < ZBEE_ZCL_NUM_SEL_ETT; i++, j++) {
2892 ett[j] = &ett_zbee_zcl_sel[i];
2895 for ( i = 0; i < ZBEE_ZCL_NUM_ARRAY_ELEM_ETT; i++, j++ ) {
2896 ett[j] = &ett_zbee_zcl_array_elements[i];
2899 static ei_register_info ei[] = {
2900 { &ei_cfg_rpt_rsp_short_non_success,
2901 { "zbee_zcl.cfg_rpt_rsp_short_non_success", PI_PROTOCOL, PI_WARN,
2902 "Non-success response without full status records", EXPFILL }},
2903 { &ei_zbee_zero_length_element,
2904 { "zbee_zcl.zero_length_element", PI_PROTOCOL, PI_ERROR,
2905 "Element has zero length", EXPFILL }},
2908 expert_module_t *expert_zbee_zcl;
2910 /* Register ZigBee ZCL protocol with Wireshark. */
2911 proto_zbee_zcl = proto_register_protocol("ZigBee Cluster Library", "ZigBee ZCL", "zbee_zcl");
2912 proto_register_field_array(proto_zbee_zcl, hf, array_length(hf));
2913 proto_register_subtree_array(ett, array_length(ett));
2915 expert_zbee_zcl = expert_register_protocol(proto_zbee_zcl);
2916 expert_register_field_array(expert_zbee_zcl, ei, array_length(ei));
2918 /* Register the ZCL dissector and subdissector list. */
2919 zbee_zcl_dissector_table = register_dissector_table("zbee.zcl.cluster", "ZigBee ZCL Cluster ID", proto_zbee_zcl, FT_UINT16, BASE_HEX);
2920 register_dissector(ZBEE_PROTOABBREV_ZCL, dissect_zbee_zcl, proto_zbee_zcl);
2922 register_shutdown_routine(zbee_shutdown);
2923 } /* proto_register_zbee_zcl */
2926 *Finds the dissectors used in this module.
2929 void proto_reg_handoff_zbee_zcl(void)
2931 dissector_handle_t zbee_zcl_handle;
2933 /* Register our dissector for the appropriate profiles. */
2934 zbee_zcl_handle = find_dissector(ZBEE_PROTOABBREV_ZCL);
2935 dissector_add_uint("zbee.profile", ZBEE_PROFILE_IPM, zbee_zcl_handle);
2936 dissector_add_uint("zbee.profile", ZBEE_PROFILE_T1, zbee_zcl_handle);
2937 dissector_add_uint("zbee.profile", ZBEE_PROFILE_HA, zbee_zcl_handle);
2938 dissector_add_uint("zbee.profile", ZBEE_PROFILE_CBA, zbee_zcl_handle);
2939 dissector_add_uint("zbee.profile", ZBEE_PROFILE_WSN, zbee_zcl_handle);
2940 dissector_add_uint("zbee.profile", ZBEE_PROFILE_TA, zbee_zcl_handle);
2941 dissector_add_uint("zbee.profile", ZBEE_PROFILE_HC, zbee_zcl_handle);
2942 dissector_add_uint("zbee.profile", ZBEE_PROFILE_SE, zbee_zcl_handle);
2943 dissector_add_uint("zbee.profile", ZBEE_PROFILE_RS, zbee_zcl_handle);
2944 dissector_add_uint("zbee.profile", ZBEE_PROFILE_GP, zbee_zcl_handle);
2945 dissector_add_uint("zbee.profile", ZBEE_PROFILE_ZLL, zbee_zcl_handle);
2947 dissector_add_uint("zbee.profile", ZBEE_PROFILE_C4_CL, zbee_zcl_handle);
2948 } /* proto_reg_handoff_zbee_zcl */
2951 *Register the specific cluster.
2953 *@param proto_abbrev Protocol abbreviation
2954 *@param proto dissector
2955 *@param ett proto (not used at the moment)
2956 *@param cluster_id cluster identification
2957 *@param mfr_code manufacturer code.
2958 *@param hf_attr_server_id cluster-specific server attribute ID field.
2959 *@param hf_attr_client_id cluster-specific client attribute ID field.
2960 *@param hf_cmd_rx_id cluster-specific client-to-server command ID field, or -1.
2961 *@param hf_cmd_tx_id cluster-specific server-to-client command ID field, or -1.
2962 *@param fn_attr_data specific cluster attribute data decode function
2964 void
2965 zbee_zcl_init_cluster(const char *proto_abbrev, int proto, int ett, uint16_t cluster_id, uint16_t mfr_code, int hf_attr_server_id, int hf_attr_client_id, int hf_cmd_rx_id, int hf_cmd_tx_id, zbee_zcl_fn_attr_data fn_attr_data)
2967 zbee_zcl_cluster_desc *cluster_desc;
2968 dissector_handle_t dissector_handle;
2970 /* Register the dissector with the ZigBee application dissectors. */
2971 dissector_handle = find_dissector(proto_abbrev);
2972 dissector_add_uint("zbee.zcl.cluster", ZCL_CLUSTER_MFR_KEY(cluster_id, mfr_code), dissector_handle);
2974 /* Allocate a cluster descriptor */
2975 cluster_desc = g_new(zbee_zcl_cluster_desc, 1);
2977 /* Initialize the cluster descriptor */
2978 cluster_desc->proto_id = proto;
2979 cluster_desc->proto = find_protocol_by_id(proto);
2980 cluster_desc->name = proto_get_protocol_short_name(cluster_desc->proto);
2981 cluster_desc->ett = ett;
2982 cluster_desc->cluster_id = cluster_id;
2983 cluster_desc->mfr_code = mfr_code;
2984 cluster_desc->hf_attr_server_id = hf_attr_server_id;
2985 cluster_desc->hf_attr_client_id = hf_attr_client_id;
2986 cluster_desc->hf_cmd_rx_id = hf_cmd_rx_id;
2987 cluster_desc->hf_cmd_tx_id = hf_cmd_tx_id;
2988 cluster_desc->fn_attr_data = fn_attr_data;
2990 /* Add the cluster descriptor to the list */
2991 acluster_desc = g_list_append(acluster_desc, cluster_desc);
2995 *Retrieves the registered specific cluster manufacturer descriptor.
2997 *@param cluster_id cluster identification
2998 *@param mfr_code manufacturer code
2999 *@return cluster descriptor pointer
3001 static zbee_zcl_cluster_desc
3002 *zbee_zcl_get_cluster_desc(uint16_t cluster_id, uint16_t mfr_code)
3004 GList *gl;
3005 gl = acluster_desc;
3007 while (gl) {
3008 zbee_zcl_cluster_desc *cluster_desc = (zbee_zcl_cluster_desc *)gl->data;
3009 if((cluster_desc->cluster_id == cluster_id) && (cluster_desc->mfr_code == mfr_code)) {
3010 return cluster_desc;
3012 gl = gl->next;
3015 return NULL;
3019 * Editor modelines - https://www.wireshark.org/tools/modelines.html
3021 * Local variables:
3022 * c-basic-offset: 4
3023 * tab-width: 8
3024 * indent-tabs-mode: nil
3025 * End:
3027 * vi: set shiftwidth=4 tabstop=8 expandtab:
3028 * :indentSize=4:tabSize=8:noTabs=true: