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