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
19 #include <epan/packet.h>
20 #include <epan/expert.h>
21 #include <epan/to_str.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);
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
);
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 /********************/
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" },
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" },
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
[] = {
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
},
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"},
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" },
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" },
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
[] = {
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" },
1032 /* Attribute Discovery Names */
1033 static const value_string zbee_zcl_dis_names
[] = {
1034 { 0, "Incomplete" },
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
;
1064 unsigned offset
= 0;
1066 /* Reject the packet if data is NULL */
1069 nwk
= (zbee_nwk_packet
*)data
;
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
);
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 */
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
);
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
);
1115 proto_tree_add_uint(zcl_tree
, hf_zbee_zcl_mfr_code
, tvb
, offset
, 2,
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"),
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
);
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
);
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. */
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"),
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"),
1159 proto_tree_add_uint(zcl_tree
, hf_zbee_zcl_cmd_id
, tvb
, offset
, 1, packet
.cmd_id
);
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
);
1169 col_append_fstr(pinfo
->cinfo
, COL_INFO
, "Unknown Command: 0x%02x, Seq: %u", packet
.cmd_id
,
1172 proto_tree_add_uint(zcl_tree
, hf_zbee_zcl_cs_cmd_id
, tvb
, offset
, 1, packet
.cmd_id
);
1175 /* Don't decode the tail. */
1176 zcl_dump_data(tvb
, offset
, pinfo
, zcl_tree
);
1177 return tvb_captured_length(tvb
);
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
);
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
);
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
);
1197 case ZBEE_ZCL_CMD_REPORT_ATTR
:
1198 dissect_zcl_report_attr(tvb
, pinfo
, zcl_tree
, &offset
, cluster_id
, packet
.mfr_code
, packet
.direction
);
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
);
1205 case ZBEE_ZCL_CMD_CONFIG_REPORT
:
1206 dissect_zcl_config_report(tvb
, pinfo
, zcl_tree
, &offset
, cluster_id
, packet
.mfr_code
, packet
.direction
);
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
);
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
);
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
);
1221 case ZBEE_ZCL_CMD_DEFAULT_RESP
:
1222 dissect_zcl_default_resp(tvb
, pinfo
, zcl_tree
, &offset
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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);
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
);
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
)
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
);
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
;
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");
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
;
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");
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
;
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");
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
;
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");
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
;
1477 unsigned attr_status
;
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");
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
);
1510 /* Dissect maximum reporting interval */
1511 proto_tree_add_item(tree
, hf_zbee_zcl_attr_maxint
, tvb
, *offset
, 2, ENC_LITTLE_ENDIAN
);
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
);
1520 /* Dissect timeout period */
1521 proto_tree_add_item(tree
, hf_zbee_zcl_attr_timeout
, tvb
, *offset
, 2, ENC_LITTLE_ENDIAN
);
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
;
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");
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
);
1571 /* Dissect maximum reporting interval */
1572 proto_tree_add_item(tree
, hf_zbee_zcl_attr_maxint
, tvb
, *offset
, 2, ENC_LITTLE_ENDIAN
);
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
);
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
);
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
;
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
) {
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");
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
;
1658 tvb_len
= tvb_captured_length(tvb
);
1659 while ( *offset
< tvb_len
&& i
< ZBEE_ZCL_NUM_ATTR_ETT
) {
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");
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
);
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
);
1710 /* Dissect the number of maximum attribute identifiers */
1711 dissect_zcl_attr_uint8(tvb
, tree
, offset
, &hf_zbee_zcl_attr_maxnum
);
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
;
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");
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
;
1761 unsigned i
= 0, j
=0;
1762 // uint16_t attr_id;
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");
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
);
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();*/
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;
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");
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
);
1807 proto_tree_add_item(sub_tree
, hf_zbee_zcl_indicator
, tvb
, 0, 1, ENC_LITTLE_ENDIAN
);
1808 indicator
= tvb_get_uint8(tvb
, *offset
);
1811 while (j
< indicator
) {
1812 proto_tree_add_item(sub_tree
, hf_zbee_zcl_index
, tvb
, 0, 2, ENC_LITTLE_ENDIAN
);
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");
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
);
1843 proto_tree_add_item(sub_tree
, hf_zbee_zcl_indicator
, tvb
, 0, 1, ENC_LITTLE_ENDIAN
);
1844 indicator
= tvb_get_uint8(tvb
, *offset
);
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();*/
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
);
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
;
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
);
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
;
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");
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
);
1933 if (desc
->hf_attr_client_id
> 0) {
1934 hf_attr_id
= desc
->hf_attr_client_id
;
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
);
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
);
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
);
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
)
2016 const uint8_t *attr_string
;
2017 uint8_t attr_uint8
[4];
2018 uint8_t elements_type
;
2019 uint16_t elements_num
;
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
:
2032 case ZBEE_ZCL_8_BIT_DATA
:
2033 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 1, ENC_NA
);
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
));
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
);
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
);
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
);
2070 case ZBEE_ZCL_16_BIT_DATA
:
2071 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 2, ENC_NA
);
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
));
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
);
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
);
2100 case ZBEE_ZCL_24_BIT_DATA
:
2101 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 3, ENC_NA
);
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
));
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
);
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
);
2131 case ZBEE_ZCL_32_BIT_DATA
:
2132 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 4, ENC_NA
);
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
));
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
);
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
);
2160 case ZBEE_ZCL_40_BIT_DATA
:
2161 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 5, ENC_NA
);
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
));
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
));
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
));
2183 case ZBEE_ZCL_48_BIT_DATA
:
2184 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 6, ENC_NA
);
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
));
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
));
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
));
2206 case ZBEE_ZCL_56_BIT_DATA
:
2207 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 7, ENC_NA
);
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
));
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
));
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
));
2229 case ZBEE_ZCL_64_BIT_DATA
:
2230 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 8, ENC_NA
);
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
));
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
));
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
));
2252 case ZBEE_ZCL_SEMI_FLOAT
:
2254 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 2, ENC_NA
);
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
);
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
);
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
);
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
;
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
;
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
);
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
;
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
;
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
);
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
);
2312 /* BYTE ... - Elements */
2313 dissect_zcl_array_type(tvb
, tree
, offset
, elements_type
, elements_num
, client_attr
);
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
);
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
);
2325 /* BYTE ... - Elements */
2326 dissect_zcl_set_type(tvb
, tree
, offset
, elements_type
, elements_num
, client_attr
);
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
);
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
);
2338 /* BYTE ... - Elements */
2339 dissect_zcl_set_type(tvb
, tree
, offset
, elements_type
, elements_num
, client_attr
);
2342 case ZBEE_ZCL_STRUCT
:
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]);
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") );
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
);
2386 case ZBEE_ZCL_CLUSTER_ID
:
2387 proto_tree_add_item(tree
, hf_zbee_zcl_attr_cid
, tvb
, *offset
, 2, ENC_LITTLE_ENDIAN
);
2391 case ZBEE_ZCL_ATTR_ID
:
2392 dissect_zcl_attr_id(tvb
, tree
, offset
, zcl_cluster_id
, zcl_mfr_code
, client_attr
);
2395 case ZBEE_ZCL_BACNET_OID
:
2396 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 4, ENC_NA
);
2400 case ZBEE_ZCL_IEEE_ADDR
:
2401 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 8, ENC_NA
);
2405 case ZBEE_ZCL_SECURITY_KEY
:
2406 proto_tree_add_item(tree
, hf_zbee_zcl_attr_bytes
, tvb
, *offset
, 16, ENC_NA
);
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
)
2429 attr_uint
= tvb_get_uint8(tvb
, *offset
);
2430 proto_tree_add_uint(tree
, *hf_zbee_zcl
, tvb
, *offset
, 1, 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
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
;
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
);
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);
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
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
;
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");
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);
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
;
2535 remainder
= tvb_new_subset_remaining(tvb
, offset
);
2536 call_data_dissector(remainder
, pinfo
, root
);
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
2551 decode_zcl_utc_time(char *s
, uint32_t value
)
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);
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
);
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
);
2588 } /*decode_zcl_time_in_minutes*/
2591 cluster_desc_free(void *p
, void *user_data _U_
)
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)
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,
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,
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,
2660 { &hf_zbee_zcl_attr_bitmap8
,
2661 { "Bitmap8", "zbee_zcl.attr.bitmap8", FT_UINT8
, BASE_HEX
, NULL
, 0x0,
2664 { &hf_zbee_zcl_attr_bitmap16
,
2665 { "Bitmap16", "zbee_zcl.attr.bitmap16", FT_UINT16
, BASE_HEX
, NULL
, 0x0,
2668 { &hf_zbee_zcl_attr_bitmap24
,
2669 { "Bitmap24", "zbee_zcl.attr.bitmap24", FT_UINT24
, BASE_HEX
, NULL
, 0x0,
2672 { &hf_zbee_zcl_attr_bitmap32
,
2673 { "Bitmap32", "zbee_zcl.attr.bitmap32", FT_UINT32
, BASE_HEX
, NULL
, 0x0,
2676 { &hf_zbee_zcl_attr_bitmap40
,
2677 { "Bitmap40", "zbee_zcl.attr.bitmap40", FT_UINT64
, BASE_HEX
, NULL
, 0x0,
2680 { &hf_zbee_zcl_attr_bitmap48
,
2681 { "Bitmap48", "zbee_zcl.attr.bitmap48", FT_UINT64
, BASE_HEX
, NULL
, 0x0,
2684 { &hf_zbee_zcl_attr_bitmap56
,
2685 { "Bitmap56", "zbee_zcl.attr.bitmap56", FT_UINT64
, BASE_HEX
, NULL
, 0x0,
2688 { &hf_zbee_zcl_attr_bitmap64
,
2689 { "Bitmap64", "zbee_zcl.attr.bitmap64", FT_UINT64
, BASE_HEX
, NULL
, 0x0,
2692 { &hf_zbee_zcl_attr_uint8
,
2693 { "Uint8", "zbee_zcl.attr.uint8", FT_UINT8
, BASE_DEC_HEX
, NULL
, 0x0,
2696 { &hf_zbee_zcl_attr_uint16
,
2697 { "Uint16", "zbee_zcl.attr.uint16", FT_UINT16
, BASE_DEC_HEX
, NULL
, 0x0,
2700 { &hf_zbee_zcl_attr_uint24
,
2701 { "Uint24", "zbee_zcl.attr.uint24", FT_UINT24
, BASE_DEC_HEX
, NULL
, 0x0,
2704 { &hf_zbee_zcl_attr_uint32
,
2705 { "Uint32", "zbee_zcl.attr.uint32", FT_UINT32
, BASE_DEC_HEX
, NULL
, 0x0,
2708 { &hf_zbee_zcl_attr_uint40
,
2709 { "Uint40", "zbee_zcl.attr.uint40", FT_UINT64
, BASE_DEC_HEX
, NULL
, 0x0,
2712 { &hf_zbee_zcl_attr_uint48
,
2713 { "Uint48", "zbee_zcl.attr.uint48", FT_UINT64
, BASE_DEC_HEX
, NULL
, 0x0,
2716 { &hf_zbee_zcl_attr_uint56
,
2717 { "Uint56", "zbee_zcl.attr.uint56", FT_UINT64
, BASE_DEC_HEX
, NULL
, 0x0,
2720 { &hf_zbee_zcl_attr_uint64
,
2721 { "Uint64", "zbee_zcl.attr.uint64", FT_UINT64
, BASE_DEC_HEX
, NULL
, 0x0,
2724 { &hf_zbee_zcl_attr_int8
,
2725 { "Int8", "zbee_zcl.attr.int8", FT_INT8
, BASE_DEC
, NULL
, 0x0,
2728 { &hf_zbee_zcl_attr_int16
,
2729 { "Int16", "zbee_zcl.attr.int16", FT_INT16
, BASE_DEC
, NULL
, 0x0,
2732 { &hf_zbee_zcl_attr_int24
,
2733 { "Int24", "zbee_zcl.attr.int24", FT_INT24
, BASE_DEC
, NULL
, 0x0,
2736 { &hf_zbee_zcl_attr_int32
,
2737 { "Int32", "zbee_zcl.attr.int32", FT_INT32
, BASE_DEC
, NULL
, 0x0,
2740 { &hf_zbee_zcl_attr_int64
,
2741 { "Int64", "zbee_zcl.attr.int64", FT_INT64
, BASE_DEC
, NULL
, 0x0,
2744 { &hf_zbee_zcl_attr_float
,
2745 { "Float", "zbee_zcl.attr.float", FT_FLOAT
, BASE_NONE
, NULL
, 0x0,
2748 { &hf_zbee_zcl_attr_double
,
2749 { "Double Float", "zbee_zcl.attr.float", FT_DOUBLE
, BASE_NONE
, NULL
, 0x0,
2752 { &hf_zbee_zcl_attr_bytes
,
2753 { "Bytes", "zbee_zcl.attr.bytes", FT_BYTES
, BASE_NONE
, NULL
, 0x0,
2756 { &hf_zbee_zcl_attr_minint
,
2757 { "Minimum Interval", "zbee_zcl.attr.minint", FT_UINT16
, BASE_DEC
, NULL
, 0x0,
2760 { &hf_zbee_zcl_attr_maxint
,
2761 { "Maximum Interval", "zbee_zcl.attr.maxint", FT_UINT16
, BASE_DEC
, NULL
, 0x0,
2764 { &hf_zbee_zcl_attr_timeout
,
2765 { "Timeout", "zbee_zcl.attr.timeout", FT_UINT16
, BASE_DEC
, NULL
, 0x0,
2768 { &hf_zbee_zcl_attr_hours
,
2769 { "Hours", "zbee_zcl.attr.hours", FT_UINT8
, BASE_DEC
, NULL
, 0x0,
2772 { &hf_zbee_zcl_attr_mins
,
2773 { "Minutes", "zbee_zcl.attr.mins", FT_UINT8
, BASE_DEC
, NULL
, 0x0,
2776 { &hf_zbee_zcl_attr_secs
,
2777 { "Seconds", "zbee_zcl.attr.secs", FT_UINT8
, BASE_DEC
, NULL
, 0x0,
2780 { &hf_zbee_zcl_attr_csecs
,
2781 { "Centiseconds", "zbee_zcl.attr.csecs", FT_UINT8
, BASE_DEC
, NULL
, 0x0,
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
,
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
,
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,
2835 { &hf_zbee_zcl_attr_start
,
2836 { "Start Attribute", "zbee_zcl.attr.start", FT_UINT16
, BASE_HEX
, NULL
, 0x0,
2839 { &hf_zbee_zcl_attr_maxnum
,
2840 { "Maximum Number", "zbee_zcl.attr.maxnum", FT_UINT8
, BASE_DEC
, NULL
, 0x0,
2843 { &hf_zbee_zcl_attr_str
,
2844 { "String", "zbee_zcl.attr.str", FT_UINT_STRING
, BASE_NONE
, NULL
, 0x0,
2847 { &hf_zbee_zcl_attr_ostr
,
2848 { "Octet String", "zbee_zcl.attr.ostr", FT_UINT_BYTES
, SEP_COLON
, NULL
, 0x0,
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,
2856 { &hf_zbee_zcl_attr_array_elements_num
,
2857 { "Elements Number", "zbee_zcl.attr.array.elements_num", FT_UINT16
, BASE_DEC
, NULL
, 0x0,
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,
2865 { &hf_zbee_zcl_attr_set_elements_num
,
2866 { "Elements Number", "zbee_zcl.attr.set.elements_num", FT_UINT16
, BASE_DEC
, NULL
, 0x0,
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,
2874 { &hf_zbee_zcl_attr_bag_elements_num
,
2875 { "Elements Number", "zbee_zcl.attr.bag.elements_num", FT_UINT16
, BASE_DEC
, NULL
, 0x0,
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
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
)
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
;
3019 * Editor modelines - https://www.wireshark.org/tools/modelines.html
3024 * indent-tabs-mode: nil
3027 * vi: set shiftwidth=4 tabstop=8 expandtab:
3028 * :indentSize=4:tabSize=8:noTabs=true: