Coverage Report

Created: 2025-12-27 06:52

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