1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
|
/* packet-zbee-zcl.h
* Dissector routines for the ZigBee Cluster Library (ZCL)
* By Fred Fierling <fff@exegin.com>
* Copyright 2009 Exegin Technologies Limited
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef PACKET_ZBEE_ZCL_H
#define PACKET_ZBEE_ZCL_H
/* Structure to contain the ZCL frame information */
typedef struct{
bool mfr_spec;
bool direction;
bool disable_default_resp;
uint8_t frame_type;
uint16_t mfr_code;
uint8_t tran_seqno;
uint8_t cmd_id;
} zbee_zcl_packet;
/* ZCL Commands */
#define ZBEE_ZCL_CMD_READ_ATTR 0x00
#define ZBEE_ZCL_CMD_READ_ATTR_RESP 0x01
#define ZBEE_ZCL_CMD_WRITE_ATTR 0x02
#define ZBEE_ZCL_CMD_WRITE_ATTR_UNDIVIDED 0x03
#define ZBEE_ZCL_CMD_WRITE_ATTR_RESP 0x04
#define ZBEE_ZCL_CMD_WRITE_ATTR_NO_RESP 0x05
#define ZBEE_ZCL_CMD_CONFIG_REPORT 0x06
#define ZBEE_ZCL_CMD_CONFIG_REPORT_RESP 0x07
#define ZBEE_ZCL_CMD_READ_REPORT_CONFIG 0x08
#define ZBEE_ZCL_CMD_READ_REPORT_CONFIG_RESP 0x09
#define ZBEE_ZCL_CMD_REPORT_ATTR 0x0a
#define ZBEE_ZCL_CMD_DEFAULT_RESP 0x0b
#define ZBEE_ZCL_CMD_DISCOVER_ATTR 0x0c
#define ZBEE_ZCL_CMD_DISCOVER_ATTR_RESP 0x0d
#define ZBEE_ZCL_CMD_READ_ATTR_STRUCT 0x0e
#define ZBEE_ZCL_CMD_WRITE_ATTR_STRUCT 0x0f
#define ZBEE_ZCL_CMD_WRITE_ATTR_STRUCT_RESP 0x10
#define ZBEE_ZCL_CMD_DISCOVER_CMDS_REC 0x11
#define ZBEE_ZCL_CMD_DISCOVER_CMDS_REC_RESP 0x12
#define ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN 0X13
#define ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN_RESP 0X14
#define ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED 0x15
#define ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED_RESP 0x16
/* ZCL Data Types */
#define ZBEE_ZCL_NO_DATA 0x00
#define ZBEE_ZCL_8_BIT_DATA 0x08
#define ZBEE_ZCL_16_BIT_DATA 0x09
#define ZBEE_ZCL_24_BIT_DATA 0x0a
#define ZBEE_ZCL_32_BIT_DATA 0x0b
#define ZBEE_ZCL_40_BIT_DATA 0x0c
#define ZBEE_ZCL_48_BIT_DATA 0x0d
#define ZBEE_ZCL_56_BIT_DATA 0x0e
#define ZBEE_ZCL_64_BIT_DATA 0x0f
#define ZBEE_ZCL_BOOLEAN 0x10
#define ZBEE_ZCL_8_BIT_BITMAP 0x18
#define ZBEE_ZCL_16_BIT_BITMAP 0x19
#define ZBEE_ZCL_24_BIT_BITMAP 0x1a
#define ZBEE_ZCL_32_BIT_BITMAP 0x1b
#define ZBEE_ZCL_40_BIT_BITMAP 0x1c
#define ZBEE_ZCL_48_BIT_BITMAP 0x1d
#define ZBEE_ZCL_56_BIT_BITMAP 0x1e
#define ZBEE_ZCL_64_BIT_BITMAP 0x1f
#define ZBEE_ZCL_8_BIT_UINT 0x20
#define ZBEE_ZCL_16_BIT_UINT 0x21
#define ZBEE_ZCL_24_BIT_UINT 0x22
#define ZBEE_ZCL_32_BIT_UINT 0x23
#define ZBEE_ZCL_40_BIT_UINT 0x24
#define ZBEE_ZCL_48_BIT_UINT 0x25
#define ZBEE_ZCL_56_BIT_UINT 0x26
#define ZBEE_ZCL_64_BIT_UINT 0x27
#define ZBEE_ZCL_8_BIT_INT 0x28
#define ZBEE_ZCL_16_BIT_INT 0x29
#define ZBEE_ZCL_24_BIT_INT 0x2a
#define ZBEE_ZCL_32_BIT_INT 0x2b
#define ZBEE_ZCL_40_BIT_INT 0x2c
#define ZBEE_ZCL_48_BIT_INT 0x2d
#define ZBEE_ZCL_56_BIT_INT 0x2e
#define ZBEE_ZCL_64_BIT_INT 0x2f
#define ZBEE_ZCL_8_BIT_ENUM 0x30
#define ZBEE_ZCL_16_BIT_ENUM 0x31
#define ZBEE_ZCL_SEMI_FLOAT 0x38
#define ZBEE_ZCL_SINGLE_FLOAT 0x39
#define ZBEE_ZCL_DOUBLE_FLOAT 0x3a
#define ZBEE_ZCL_OCTET_STRING 0x41
#define ZBEE_ZCL_CHAR_STRING 0x42
#define ZBEE_ZCL_LONG_OCTET_STRING 0x43
#define ZBEE_ZCL_LONG_CHAR_STRING 0x44
#define ZBEE_ZCL_ARRAY 0x48
#define ZBEE_ZCL_STRUCT 0x4c
#define ZBEE_ZCL_SET 0x50
#define ZBEE_ZCL_BAG 0x51
#define ZBEE_ZCL_TIME 0xe0
#define ZBEE_ZCL_DATE 0xe1
#define ZBEE_ZCL_UTC 0xe2
#define ZBEE_ZCL_CLUSTER_ID 0xe8
#define ZBEE_ZCL_ATTR_ID 0xe9
#define ZBEE_ZCL_BACNET_OID 0xea
#define ZBEE_ZCL_IEEE_ADDR 0xf0
#define ZBEE_ZCL_SECURITY_KEY 0xf1
#define ZBEE_ZCL_UNKNOWN 0xff
/* ZCL Miscellaneous */
#define ZBEE_ZCL_DIR_REPORTED 0
#define ZBEE_ZCL_DIR_RECEIVED 1
#define IS_ANALOG_SUBTYPE(x) ( (x & 0xF0) == 0x20 || (x & 0xF8) == 0x38 || (x & 0xF8) == 0xE0 )
/* ZCL Status Enumerations */
#define ZBEE_ZCL_STAT_SUCCESS 0x00
#define ZBEE_ZCL_STAT_FAILURE 0x01
#define ZBEE_ZCL_STAT_NOT_AUTHORIZED 0x7e
#define ZBEE_ZCL_STAT_RESERVED_FIELD_NOT_ZERO 0x7f
#define ZBEE_ZCL_STAT_MALFORMED_CMD 0x80
#define ZBEE_ZCL_STAT_UNSUP_CLUSTER_CMD 0x81
#define ZBEE_ZCL_STAT_UNSUP_GENERAL_CMD 0x82
#define ZBEE_ZCL_STAT_UNSUP_MFR_CLUSTER_CMD 0x83
#define ZBEE_ZCL_STAT_UNSUP_MFR_GENERAL_CMD 0x84
#define ZBEE_ZCL_STAT_INVALID_FIELD 0x85
#define ZBEE_ZCL_STAT_UNSUPPORTED_ATTR 0x86
#define ZBEE_ZCL_STAT_INVALID_VALUE 0x87
#define ZBEE_ZCL_STAT_READ_ONLY 0x88
#define ZBEE_ZCL_STAT_INSUFFICIENT_SPACE 0x89
#define ZBEE_ZCL_STAT_DUPLICATE_EXISTS 0x8a
#define ZBEE_ZCL_STAT_NOT_FOUND 0x8b
#define ZBEE_ZCL_STAT_UNREPORTABLE_ATTR 0x8c
#define ZBEE_ZCL_STAT_INVALID_DATA_TYPE 0x8d
#define ZBEE_ZCL_STAT_INVALID_SELECTOR 0x8e
#define ZBEE_ZCL_STAT_WRITE_ONLY 0x8f
#define ZBEE_ZCL_STAT_INCONSISTENT_STARTUP_STATE 0x90
#define ZBEE_ZCL_STAT_DEFINED_OUT_OF_BAND 0x91
#define ZBEE_ZCL_STAT_INCONSISTENT 0x92
#define ZBEE_ZCL_STAT_ACTION_DENIED 0x93
#define ZBEE_ZCL_STAT_TIMEOUT 0x94
#define ZBEE_ZCL_STAT_OTA_ABORT 0x95
#define ZBEE_ZCL_STAT_OTA_INVALID_IMAGE 0x96
#define ZBEE_ZCL_STAT_OTA_WAIT_FOR_DATA 0x97
#define ZBEE_ZCL_STAT_OTA_NO_IMAGE_AVAILABLE 0x98
#define ZBEE_ZCL_STAT_OTA_REQUIRE_MORE_IMAGE 0x99
#define ZBEE_ZCL_STAT_OTA_NOTIFICATION_PENDING 0x9a
#define ZBEE_ZCL_STAT_HARDWARE_FAILURE 0xc0
#define ZBEE_ZCL_STAT_SOFTWARE_FAILURE 0xc1
#define ZBEE_ZCL_STAT_CALIBRATION_ERROR 0xc2
#define ZBEE_ZCL_STAT_UNSUPPORTED_CLUSTER 0xc3
#define ZBEE_ZCL_STAT_LIMIT_REACHED 0xc4
/* Misc. */
#define INT24_SIGN_BITS 0xffff8000
#define MONTHS_PER_YEAR 12
#define YEAR_OFFSET 1900
/* ZigBee ZCL Cluster Key */
#define ZCL_CLUSTER_MFR_KEY(cluster_id,mfr_code) (((mfr_code)<<16) | (cluster_id))
typedef void (*zbee_zcl_fn_attr_data)(proto_tree *tree, tvbuff_t *tvb, unsigned *offset, uint16_t attr_id, unsigned data_type, bool client_attr);
typedef struct _zbee_zcl_cluster_desc {
int proto_id;
protocol_t *proto;
const char *name;
int ett;
int hf_attr_server_id;
int hf_attr_client_id;
int hf_cmd_rx_id;
int hf_cmd_tx_id;
uint16_t cluster_id;
uint16_t mfr_code;
zbee_zcl_fn_attr_data fn_attr_data;
} zbee_zcl_cluster_desc;
extern const value_string zbee_zcl_short_data_type_names[];
extern const value_string zbee_mfr_code_names[];
extern const value_string zbee_zcl_status_names[];
/* Dissector functions */
extern void dissect_zcl_read_attr (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
extern void dissect_zcl_write_attr (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
extern void dissect_zcl_report_attr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
extern void dissect_zcl_read_attr_resp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool direction);
extern void dissect_zcl_attr_id(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint16_t cluster_id, uint16_t mfr_code, bool client_attr);
extern void dissect_zcl_attr_data_type_val(tvbuff_t *tvb, proto_tree *tree, unsigned *offset, uint16_t attr_id, uint16_t cluster_id, uint16_t mfr_code, bool client_attr);
extern unsigned dissect_zcl_attr_uint8 (tvbuff_t *tvb, proto_tree *tree, unsigned *offset, int *length);
/* Helper functions */
/* Exported DLL functions */
void decode_zcl_utc_time (char *s, uint32_t value);
WS_DLL_PUBLIC void decode_zcl_time_in_100ms (char *s, uint16_t value);
WS_DLL_PUBLIC void decode_zcl_time_in_seconds (char *s, uint16_t value);
WS_DLL_PUBLIC void decode_zcl_time_in_minutes (char *s, uint16_t value);
WS_DLL_PUBLIC void dissect_zcl_attr_data (tvbuff_t *tvb, proto_tree *tree, unsigned *offset, unsigned data_type, bool client_attr);
WS_DLL_PUBLIC void 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);
/* Cluster-specific commands and parameters */
#define ZBEE_ZCL_CSC_IAS_ZONE_C_ERC_NEP 0x02
#define ZBEE_ZCL_CSC_IAS_ZONE_C_ERC_NS 0x01
#define ZBEE_ZCL_CSC_IAS_ZONE_C_ERC_S 0x00
#define ZBEE_ZCL_CSC_IAS_ZONE_C_ERC_TMZ 0x03
#define ZBEE_ZCL_CSC_IAS_ZONE_C_ZER 0x00
#define ZBEE_ZCL_CSC_IAS_ZONE_S_ZER 0x01
#define ZBEE_ZCL_CSC_IAS_ZONE_S_ZSCN 0x00
#define ZBEE_ZCL_CSC_POLL_CONTROL_C_CIR 0x00
#define ZBEE_ZCL_CSC_POLL_CONTROL_C_FPS 0x01
#define ZBEE_ZCL_CSC_POLL_CONTROL_C_SLPI 0x02
#define ZBEE_ZCL_CSC_POLL_CONTROL_C_SSPI 0x03
#define ZBEE_ZCL_CSC_POLL_CONTROL_S_CI 0x00
#define ZBEE_ZCL_CSC_THERMOSTAT_C_CWS 0x03
#define ZBEE_ZCL_CSC_THERMOSTAT_C_GWS 0x02
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SRL 0x00
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS 0x01
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_AV 0x80
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_FR 0x20
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_MO 0x02
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_SA 0x40
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_SU 0x01
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_TH 0x10
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_TU 0x04
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_WE 0x08
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_B 0x03
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_C 0x02
#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_H 0x01
#define ZBEE_ZCL_CSC_THERMOSTAT_S_GWSR 0x00
#endif /* PACKET_ZBEE_ZCL_H*/
|