Coverage Report

Created: 2025-08-04 07:15

/src/wireshark/epan/dissectors/packet-zbee-zdp.c
Line
Count
Source (jump to first uncovered line)
1
/* packet-zbee-zdp.c
2
 * Dissector routines for the ZigBee Device Profile (ZDP)
3
 * By Owen Kirby <osk@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
 * SPDX-License-Identifier: GPL-2.0-or-later
11
 */
12
13
/*  Include Files */
14
#include "config.h"
15
16
#include <epan/packet.h>
17
#include <epan/expert.h>
18
#include <wsutil/bits_ctz.h>
19
#include <wsutil/str_util.h>
20
21
#include "packet-zbee.h"
22
#include "packet-zbee-aps.h"
23
#include "packet-zbee-nwk.h"
24
#include "packet-zbee-zdp.h"
25
#include "packet-zbee-zdp.h"
26
27
void proto_reg_handoff_zbee_zdp(void);
28
void proto_register_zbee_zdp(void);
29
30
/*************************/
31
/* Function Declarations */
32
/*************************/
33
/* Local Helper routines. */
34
static uint16_t zdp_convert_2003cluster     (uint8_t cluster);
35
36
37
/**************************************
38
 * Field indices
39
 **************************************
40
 */
41
/* Global field indices. */
42
static int proto_zbee_zdp;
43
static int hf_zbee_zdp_seqno;
44
#if 0
45
static int hf_zbee_zdp_length; /* Deprecates since ZigBee 2006. */
46
#endif
47
48
/* General indices. */
49
       int hf_zbee_zdp_ext_addr;
50
       int hf_zbee_zdp_nwk_addr;
51
       int hf_zbee_zdp_req_type;
52
       int hf_zbee_zdp_index;
53
static int hf_zbee_zdp_status;
54
       int hf_zbee_zdp_ep_count;
55
       int hf_zbee_zdp_endpoint;
56
       int hf_zbee_zdp_profile;
57
       int hf_zbee_zdp_cluster;
58
       int hf_zbee_zdp_addr_mode;
59
       int hf_zbee_zdp_table_size;
60
       int hf_zbee_zdp_table_count;
61
       int hf_zbee_zdp_in_count;
62
       int hf_zbee_zdp_out_count;
63
       int hf_zbee_zdp_in_cluster;
64
       int hf_zbee_zdp_out_cluster;
65
       int hf_zbee_zdp_assoc_device_count;
66
       int hf_zbee_zdp_assoc_device;
67
       int hf_zbee_zdp_cache_address;
68
69
/* Capability information indices. */
70
static int hf_zbee_zdp_cinfo;
71
static int hf_zbee_zdp_cinfo_alloc;
72
static int hf_zbee_zdp_cinfo_security;
73
static int hf_zbee_zdp_cinfo_idle_rx;
74
static int hf_zbee_zdp_cinfo_power;
75
static int hf_zbee_zdp_cinfo_ffd;
76
static int hf_zbee_zdp_cinfo_alt_coord;
77
78
/* Server mode flag indices. */
79
static int hf_zbee_zdp_server;
80
static int hf_zbee_zdp_server_pri_trust;
81
static int hf_zbee_zdp_server_bak_trust;
82
static int hf_zbee_zdp_server_pri_bind;
83
static int hf_zbee_zdp_server_bak_bind;
84
static int hf_zbee_zdp_server_pri_disc;
85
static int hf_zbee_zdp_server_bak_disc;
86
static int hf_zbee_zdp_server_network_manager;
87
static int hf_zbee_zdp_server_stk_compl_rev;
88
89
/* Node descriptor indices. */
90
static int hf_zbee_zdp_node_type;
91
static int hf_zbee_zdp_node_complex;
92
static int hf_zbee_zdp_node_user;
93
static int hf_zbee_zdp_node_frag_support;
94
static int hf_zbee_zdp_node_freq_868;
95
static int hf_zbee_zdp_node_freq_900;
96
static int hf_zbee_zdp_node_freq_2400;
97
static int hf_zbee_zdp_node_freq_eu_sub_ghz;
98
static int hf_zbee_zdp_node_manufacturer;
99
static int hf_zbee_zdp_node_max_buffer;
100
static int hf_zbee_zdp_node_max_incoming_transfer;
101
static int hf_zbee_zdp_node_max_outgoing_transfer;
102
static int hf_zbee_zdp_dcf;
103
static int hf_zbee_zdp_dcf_eaela;
104
static int hf_zbee_zdp_dcf_esdla;
105
106
/* Power descriptor indices. */
107
static int hf_zbee_zdp_power;
108
static int hf_zbee_zdp_power_mode;
109
static int hf_zbee_zdp_power_avail_ac;
110
static int hf_zbee_zdp_power_avail_recharge;
111
static int hf_zbee_zdp_power_avail_dispose;
112
static int hf_zbee_zdp_power_source_ac;
113
static int hf_zbee_zdp_power_source_recharge;
114
static int hf_zbee_zdp_power_source_dispose;
115
static int hf_zbee_zdp_power_level;
116
117
/* Simple descriptor indices. */
118
static int hf_zbee_zdp_simple_app_device;
119
static int hf_zbee_zdp_simple_zll_app_device;
120
static int hf_zbee_zdp_simple_ha_app_device;
121
static int hf_zbee_zdp_simple_app_version;
122
       int hf_zbee_zdp_simple_length;
123
124
/* Complex descriptor indices. */
125
       int hf_zbee_zdp_complex_length;
126
static int hf_zbee_zdp_complex;
127
128
/* User descriptor indices. */
129
       int hf_zbee_zdp_user;
130
       int hf_zbee_zdp_user_length;
131
132
/* Discovery indices. */
133
       int hf_zbee_zdp_cache;
134
       int hf_zbee_zdp_disc_node_size;
135
       int hf_zbee_zdp_disc_power_size;
136
       int hf_zbee_zdp_disc_ep_count;
137
       int hf_zbee_zdp_disc_simple_count;
138
       int hf_zbee_zdp_disc_simple_size;
139
140
/* Binding indices. */
141
       int hf_zbee_zdp_target;
142
       int hf_zbee_zdp_replacement;
143
       int hf_zbee_zdp_replacement_ep;
144
       int hf_zbee_zdp_bind_src;
145
       int hf_zbee_zdp_bind_src64;
146
       int hf_zbee_zdp_bind_src_ep;
147
       int hf_zbee_zdp_bind_dst;
148
       int hf_zbee_zdp_bind_dst64;
149
       int hf_zbee_zdp_bind_dst_ep;
150
151
/* Network Management indices. */
152
       int hf_zbee_zdp_duration;
153
       int hf_zbee_zdp_leave_children;
154
       int hf_zbee_zdp_leave_rejoin;
155
       int hf_zbee_zdp_significance;
156
       int hf_zbee_zdp_scan_count;
157
       int hf_zbee_zdp_update_id;
158
       int hf_zbee_zdp_manager;
159
       int hf_zbee_zdp_tx_total;
160
       int hf_zbee_zdp_tx_fail;
161
       int hf_zbee_zdp_tx_retries;
162
       int hf_zbee_zdp_period_time_results;
163
       int hf_zbee_zdp_channel_count;
164
       int hf_zbee_zdp_channel_mask;
165
       int hf_zbee_zdp_channel_page;
166
       int hf_zbee_zdp_channel_page_count;
167
       int hf_zbee_zdp_channel_energy;
168
       int hf_zbee_zdp_pan_eui64;
169
       int hf_zbee_zdp_pan_uint;
170
       int hf_zbee_zdp_channel;
171
       int hf_zbee_zdp_nwk_desc_profile;
172
       int hf_zbee_zdp_profile_version;
173
       int hf_zbee_zdp_beacon;
174
       int hf_zbee_zdp_superframe;
175
       int hf_zbee_zdp_permit_joining;
176
       int hf_zbee_zdp_extended_pan;
177
       int hf_zbee_zdp_addr;
178
       int hf_zbee_zdp_table_entry_type;
179
       int hf_zbee_zdp_table_entry_idle_rx_0c;
180
       int hf_zbee_zdp_table_entry_relationship_70;
181
       int hf_zbee_zdp_table_entry_idle_rx_04;
182
       int hf_zbee_zdp_table_entry_relationship_18;
183
       int hf_zbee_zdp_depth;
184
       int hf_zbee_zdp_permit_joining_03;
185
       int hf_zbee_zdp_lqi;
186
static int hf_zbee_zdp_scan_channel;
187
       int hf_zbee_zdp_ieee_join_start_index;
188
       int hf_zbee_zdp_ieee_join_update_id;
189
       int hf_zbee_zdp_ieee_join_policy;
190
       int hf_zbee_zdp_ieee_join_list_total;
191
       int hf_zbee_zdp_ieee_join_list_start;
192
       int hf_zbee_zdp_ieee_join_list_count;
193
       int hf_zbee_zdp_ieee_join_list_ieee;
194
       int hf_zbee_zdp_number_of_children;
195
       int hf_zbee_zdp_beacon_survey_scan_mask;
196
       int hf_zbee_zdp_beacon_survey_scan_mask_cnt;
197
       int hf_zbee_zdp_beacon_survey_conf_mask;
198
       int hf_zbee_zdp_beacon_survey_total;
199
       int hf_zbee_zdp_beacon_survey_cur_zbn;
200
       int hf_zbee_zdp_beacon_survey_cur_zbn_potent_parents;
201
       int hf_zbee_zdp_beacon_survey_other_zbn;
202
       int hf_zbee_zdp_beacon_survey_current_parent;
203
       int hf_zbee_zdp_beacon_survey_cnt_parents;
204
       int hf_zbee_zdp_beacon_survey_parent;
205
       int hf_zbee_zdp_tlv_count;
206
       int hf_zbee_zdp_tlv_id;
207
/* Routing Table */
208
       int hf_zbee_zdp_rtg;
209
       int hf_zbee_zdp_rtg_entry;
210
       int hf_zbee_zdp_rtg_destination;
211
       int hf_zbee_zdp_rtg_next_hop;
212
       int hf_zbee_zdp_rtg_status;
213
214
215
/* Subtree indices. */
216
static int ett_zbee_zdp;
217
       int ett_zbee_zdp_endpoint;
218
       int ett_zbee_zdp_match_in;
219
       int ett_zbee_zdp_match_out;
220
       int ett_zbee_zdp_node;
221
static int ett_zbee_zdp_node_in;
222
static int ett_zbee_zdp_node_out;
223
       int ett_zbee_zdp_power;
224
       int ett_zbee_zdp_simple;
225
       int ett_zbee_zdp_cinfo;
226
       int ett_zbee_zdp_server;
227
       int ett_zbee_zdp_simple_sizes;
228
       int ett_zbee_zdp_bind;
229
       int ett_zbee_zdp_bind_entry;
230
       int ett_zbee_zdp_bind_end_in;
231
       int ett_zbee_zdp_bind_end_out;
232
static int ett_zbee_zdp_bind_table;
233
       int ett_zbee_zdp_bind_source;
234
       int ett_zbee_zdp_assoc_device;
235
       int ett_zbee_zdp_nwk;
236
       int ett_zbee_zdp_perm_join_fc;
237
       int ett_zbee_zdp_lqi;
238
       int ett_zbee_zdp_rtg;
239
       int ett_zbee_zdp_cache;
240
       int ett_zbee_zdp_nwk_desc;
241
       int ett_zbee_zdp_table_entry;
242
static int ett_zbee_zdp_descriptor_capability_field;
243
244
/* Expert Info */
245
static expert_field ei_deprecated_command;
246
247
/**************************************
248
 * Value Strings
249
 **************************************
250
 */
251
static const value_string zbee_zdp_req_types[] = {
252
    { ZBEE_ZDP_REQ_TYPE_SINGLE,     "Single Device Response" },
253
    { ZBEE_ZDP_REQ_TYPE_EXTENDED,   "Extended Response" },
254
    { 0, NULL }
255
};
256
257
const value_string zbee_zdp_cluster_names[] = {
258
    { ZBEE_ZDP_REQ_NWK_ADDR,                      "Network Address Request" },
259
    { ZBEE_ZDP_REQ_IEEE_ADDR,                     "Extended Address Request" },
260
    { ZBEE_ZDP_REQ_NODE_DESC,                     "Node Descriptor Request" },
261
    { ZBEE_ZDP_REQ_POWER_DESC,                    "Power Descriptor Request" },
262
    { ZBEE_ZDP_REQ_SIMPLE_DESC,                   "Simple Descriptor Request" },
263
    { ZBEE_ZDP_REQ_ACTIVE_EP,                     "Active Endpoint Request" },
264
    { ZBEE_ZDP_REQ_MATCH_DESC,                    "Match Descriptor Request" },
265
    { ZBEE_ZDP_REQ_COMPLEX_DESC,                  "Complex Descriptor Request" },
266
    { ZBEE_ZDP_REQ_USER_DESC,                     "User Descriptor Request" },
267
    { ZBEE_ZDP_REQ_DISCOVERY_CACHE,               "Discovery Cache Request" },
268
    { ZBEE_ZDP_REQ_DEVICE_ANNCE,                  "Device Announcement" },
269
    { ZBEE_ZDP_REQ_PARENT_ANNCE,                  "Parent Announce" },
270
    { ZBEE_ZDP_REQ_SET_USER_DESC,                 "Set User Descriptor Request" },
271
    { ZBEE_ZDP_REQ_SYSTEM_SERVER_DISC,            "Server Discovery Request" },
272
    { ZBEE_ZDP_REQ_STORE_DISCOVERY,               "Store Discovery Request" },
273
    { ZBEE_ZDP_REQ_STORE_NODE_DESC,               "Store Node Descriptor Request" },
274
    { ZBEE_ZDP_REQ_STORE_POWER_DESC,              "Store Power Descriptor Request" },
275
    { ZBEE_ZDP_REQ_STORE_ACTIVE_EP,               "Store Active Endpoints Request" },
276
    { ZBEE_ZDP_REQ_STORE_SIMPLE_DESC,             "Store Simple Descriptor Request" },
277
    { ZBEE_ZDP_REQ_REMOVE_NODE_CACHE,             "Remove Node Cache Request" },
278
    { ZBEE_ZDP_REQ_FIND_NODE_CACHE,               "Find Node Cache Request" },
279
    { ZBEE_ZDP_REQ_EXT_SIMPLE_DESC,               "Extended Simple Descriptor Request" },
280
    { ZBEE_ZDP_REQ_EXT_ACTIVE_EP,                 "Extended Active Endpoint Request" },
281
    { ZBEE_ZDP_REQ_END_DEVICE_BIND,               "End Device Bind Request" },
282
    { ZBEE_ZDP_REQ_BIND,                          "Bind Request" },
283
    { ZBEE_ZDP_REQ_UNBIND,                        "Unbind Request" },
284
    { ZBEE_ZDP_REQ_BIND_REGISTER,                 "Bind Register Request" },
285
    { ZBEE_ZDP_REQ_REPLACE_DEVICE,                "Replace Device Request" },
286
    { ZBEE_ZDP_REQ_STORE_BAK_BIND_ENTRY,          "Store Backup Binding Request" },
287
    { ZBEE_ZDP_REQ_REMOVE_BAK_BIND_ENTRY,         "Remove Backup Binding Request" },
288
    { ZBEE_ZDP_REQ_BACKUP_BIND_TABLE,             "Backup Binding Table Request" },
289
    { ZBEE_ZDP_REQ_RECOVER_BIND_TABLE,            "Recover Binding Table Request" },
290
    { ZBEE_ZDP_REQ_BACKUP_SOURCE_BIND,            "Backup Source Binding Request" },
291
    { ZBEE_ZDP_REQ_RECOVER_SOURCE_BIND,           "Recover Source Binding Request" },
292
    { ZBEE_ZDP_REQ_CLEAR_ALL_BINDINGS,            "Clear All Bindings Request" },
293
294
    { ZBEE_ZDP_REQ_MGMT_NWK_DISC,                 "Network Discovery Request" },
295
    { ZBEE_ZDP_REQ_MGMT_LQI,                      "Link Quality Request" },
296
    { ZBEE_ZDP_REQ_MGMT_RTG,                      "Routing Table Request" },
297
    { ZBEE_ZDP_REQ_MGMT_BIND,                     "Binding Table Request" },
298
    { ZBEE_ZDP_REQ_MGMT_LEAVE,                    "Leave Request" },
299
    { ZBEE_ZDP_REQ_MGMT_DIRECT_JOIN,              "Direct Join Request" },
300
    { ZBEE_ZDP_REQ_MGMT_PERMIT_JOIN,              "Permit Join Request" },
301
    { ZBEE_ZDP_REQ_MGMT_CACHE,                    "Cache Request" },
302
    { ZBEE_ZDP_REQ_MGMT_NWKUPDATE,                "Network Update Request" },
303
    { ZBEE_ZDP_REQ_MGMT_NWKUPDATE_ENH,            "Network Update Enhanced Request" },
304
    { ZBEE_ZDP_REQ_MGMT_IEEE_JOIN_LIST,           "IEEE Joining List Request" },
305
    { ZBEE_ZDP_REQ_MGMT_NWK_BEACON_SURVEY,        "Beacon Survey Request"},
306
    { ZBEE_ZDP_REQ_SECURITY_START_KEY_NEGOTIATION,"Security Start Key Negotiation Request" },
307
    { ZBEE_ZDP_REQ_SECURITY_GET_AUTH_TOKEN,       "Security Get Authentication Token Request"},
308
    { ZBEE_ZDP_REQ_SECURITY_GET_AUTH_LEVEL,       "Security Get Authentication Level Request"},
309
    { ZBEE_ZDP_REQ_SECURITY_SET_CONFIGURATION,    "Security Set Configuration Request"},
310
    { ZBEE_ZDP_REQ_SECURITY_GET_CONFIGURATION,    "Security Get Configuration Request"},
311
    { ZBEE_ZDP_REQ_SECURITY_START_KEY_UPDATE,     "Security Start Key Update Request"},
312
    { ZBEE_ZDP_REQ_SECURITY_DECOMMISSION,         "Security Decommission Request"},
313
    { ZBEE_ZDP_REQ_SECURITY_CHALLENGE,            "Security Challenge Request"},
314
315
    { ZBEE_ZDP_RSP_NWK_ADDR,                      "Network Address Response" },
316
    { ZBEE_ZDP_RSP_IEEE_ADDR,                     "Extended Address Response" },
317
    { ZBEE_ZDP_RSP_NODE_DESC,                     "Node Descriptor Response" },
318
    { ZBEE_ZDP_RSP_POWER_DESC,                    "Power Descriptor Response" },
319
    { ZBEE_ZDP_RSP_SIMPLE_DESC,                   "Simple Descriptor Response" },
320
    { ZBEE_ZDP_RSP_ACTIVE_EP,                     "Active Endpoint Response" },
321
    { ZBEE_ZDP_RSP_MATCH_DESC,                    "Match Descriptor Response" },
322
    { ZBEE_ZDP_RSP_COMPLEX_DESC,                  "Complex Descriptor Response" },
323
    { ZBEE_ZDP_RSP_USER_DESC,                     "User Descriptor Response" },
324
    { ZBEE_ZDP_RSP_DISCOVERY_CACHE,               "Discovery Cache Response" },
325
    { ZBEE_ZDP_RSP_CONF_USER_DESC,                "Set User Descriptor Confirm" },
326
    { ZBEE_ZDP_RSP_SYSTEM_SERVER_DISC,            "Server Discovery Response" },
327
    { ZBEE_ZDP_RSP_STORE_DISCOVERY,               "Store Discovery Response" },
328
    { ZBEE_ZDP_RSP_STORE_NODE_DESC,               "Store Node Descriptor Response" },
329
    { ZBEE_ZDP_RSP_STORE_POWER_DESC,              "Store Power Descriptor Response" },
330
    { ZBEE_ZDP_RSP_STORE_ACTIVE_EP,               "Store Active Endpoints Response" },
331
    { ZBEE_ZDP_RSP_STORE_SIMPLE_DESC,             "Store Simple Descriptor Response" },
332
    { ZBEE_ZDP_RSP_REMOVE_NODE_CACHE,             "Remove Node Cache Response" },
333
    { ZBEE_ZDP_RSP_FIND_NODE_CACHE,               "Find Node Cache Response" },
334
    { ZBEE_ZDP_RSP_EXT_SIMPLE_DESC,               "Extended Simple Descriptor Response" },
335
    { ZBEE_ZDP_RSP_EXT_ACTIVE_EP,                 "Extended Active Endpoint Response" },
336
    { ZBEE_ZDP_RSP_PARENT_ANNCE,                  "Parent Announce Response" },
337
    { ZBEE_ZDP_RSP_END_DEVICE_BIND,               "End Device Bind Response" },
338
    { ZBEE_ZDP_RSP_BIND,                          "Bind Response" },
339
    { ZBEE_ZDP_RSP_UNBIND,                        "Unbind Response" },
340
    { ZBEE_ZDP_RSP_BIND_REGISTER,                 "Bind Register Response" },
341
    { ZBEE_ZDP_RSP_REPLACE_DEVICE,                "Replace Device Response" },
342
    { ZBEE_ZDP_RSP_STORE_BAK_BIND_ENTRY,          "Store Backup Binding Response" },
343
    { ZBEE_ZDP_RSP_REMOVE_BAK_BIND_ENTRY,         "Remove Backup Binding Response" },
344
    { ZBEE_ZDP_RSP_BACKUP_BIND_TABLE,             "Backup Binding Table Response" },
345
    { ZBEE_ZDP_RSP_RECOVER_BIND_TABLE,            "Recover Binding Table Response" },
346
    { ZBEE_ZDP_RSP_BACKUP_SOURCE_BIND,            "Backup Source Binding Response" },
347
    { ZBEE_ZDP_RSP_RECOVER_SOURCE_BIND,           "Recover Source Binding Response" },
348
    { ZBEE_ZDP_RSP_CLEAR_ALL_BINDINGS,            "Clear All Bindings Response" },
349
    { ZBEE_ZDP_RSP_MGMT_NWK_DISC,                 "Network Discovery Response" },
350
    { ZBEE_ZDP_RSP_MGMT_LQI,                      "Link Quality Response" },
351
    { ZBEE_ZDP_RSP_MGMT_RTG,                      "Routing Table Response" },
352
    { ZBEE_ZDP_RSP_MGMT_BIND,                     "Binding Table Response" },
353
    { ZBEE_ZDP_RSP_MGMT_LEAVE,                    "Leave Response" },
354
    { ZBEE_ZDP_RSP_MGMT_DIRECT_JOIN,              "Direct Join Response" },
355
    { ZBEE_ZDP_RSP_MGMT_PERMIT_JOIN,              "Permit Join Response" },
356
    { ZBEE_ZDP_RSP_MGMT_CACHE,                    "Cache Response" },
357
    { ZBEE_ZDP_NOT_MGMT_NWKUPDATE,                "Network Update Notify" },
358
    { ZBEE_ZDP_NOT_MGMT_NWKUPDATE_ENH,            "Network Enhanced Update Notify" },
359
    { ZBEE_ZDP_RSP_MGMT_IEEE_JOIN_LIST,           "IEEE Joining List Response" },
360
    { ZBEE_ZDP_NOT_MGMT_UNSOLICITED_NWKUPDATE,    "Unsolicited Enhanced Network Update Notify" },
361
    { ZBEE_ZDP_RSP_MGMT_NWK_BEACON_SURVEY,        "Beacon Survey Response"},
362
    { ZBEE_ZDP_RSP_SECURITY_START_KEY_NEGOTIATION,"Security Start Key Negotiation Response" },
363
    { ZBEE_ZDP_RSP_SECURITY_GET_AUTH_TOKEN,       "Security Get Authentication Token Response"},
364
    { ZBEE_ZDP_RSP_SECURITY_GET_AUTH_LEVEL,       "Security Get Authentication Level Response"},
365
    { ZBEE_ZDP_RSP_SECURITY_SET_CONFIGURATION,    "Security Set Configuration Response"},
366
    { ZBEE_ZDP_RSP_SECURITY_GET_CONFIGURATION,    "Security Get Configuration Response"},
367
    { ZBEE_ZDP_RSP_SECURITY_START_KEY_UPDATE,     "Security Start Key Update Response"},
368
    { ZBEE_ZDP_RSP_SECURITY_DECOMMISSION,         "Security Decommission Response"},
369
    { ZBEE_ZDP_RSP_SECURITY_CHALLENGE,            "Security Challenge Response"},
370
    { 0, NULL }
371
};
372
373
static const value_string zbee_zdp_status_names[] = {
374
    { ZBEE_ZDP_STATUS_SUCCESS,                    "Success" },
375
    { ZBEE_ZDP_STATUS_INV_REQUESTTYPE,            "Invalid Request Type" },
376
    { ZBEE_ZDP_STATUS_DEVICE_NOT_FOUND,           "Device Not Found" },
377
    { ZBEE_ZDP_STATUS_INVALID_EP,                 "Invalid Endpoint" },
378
    { ZBEE_ZDP_STATUS_NOT_ACTIVE,                 "Not Active" },
379
    { ZBEE_ZDP_STATUS_NOT_SUPPORTED,              "Not Supported" },
380
    { ZBEE_ZDP_STATUS_TIMEOUT,                    "Timeout" },
381
    { ZBEE_ZDP_STATUS_NO_MATCH,                   "No Match" },
382
    { ZBEE_ZDP_STATUS_NO_ENTRY,                   "No Entry" },
383
    { ZBEE_ZDP_STATUS_NO_DESCRIPTOR,              "No Descriptor" },
384
    { ZBEE_ZDP_STATUS_INSUFFICIENT_SPACE,         "Insufficient Space" },
385
    { ZBEE_ZDP_STATUS_NOT_PERMITTED,              "Not Permitted" },
386
    { ZBEE_ZDP_STATUS_TABLE_FULL,                 "Table Full" },
387
    { ZBEE_ZDP_STATUS_NOT_AUTHORIZED,             "Not Authorized" },
388
    { ZBEE_ZDP_STATUS_DEVICE_BINDING_TABLE_FULL,  "Device Binding Table Full" },
389
    { ZBEE_ZDP_STATUS_INVALID_INDEX,              "Invalid Index" },
390
    { ZBEE_ZDP_STATUS_RESPONSE_TOO_LARGE,         "Response Too Large" },
391
    { ZBEE_ZDP_STATUS_MISSING_TLV,                "Missing TLV" },
392
    { 0, NULL }
393
};
394
395
static const value_string zbee_zll_device_names[] = {
396
    { ZBEE_ZLL_DEVICE_ON_OFF_LIGHT,               "On/Off light" },
397
    { ZBEE_ZLL_DEVICE_ON_OFF_PLUG_IN_UNIT,        "On/Off plug-in unit" },
398
    { ZBEE_ZLL_DEVICE_DIMMABLE_LIGHT,             "Dimmable light" },
399
    { ZBEE_ZLL_DEVICE_DIMMABLE_PLUG_IN_UNIT,      "Dimmable plug-in unit" },
400
    { ZBEE_ZLL_DEVICE_COLOR_LIGHT,                "Color light" },
401
    { ZBEE_ZLL_DEVICE_EXTENDED_COLOR_LIGHT,       "Extended color light" },
402
    { ZBEE_ZLL_DEVICE_COLOR_TEMPERATURE_LIGHT,    "Color temperature light" },
403
    { ZBEE_ZLL_DEVICE_COLOR_CONTROLLER,           "Color controller" },
404
    { ZBEE_ZLL_DEVICE_COLOR_SCENE_CONTROLLER,     "Color scene controller" },
405
    { ZBEE_ZLL_DEVICE_NON_COLOR_CONTROLLER,       "Non-color controller" },
406
    { ZBEE_ZLL_DEVICE_NON_COLOR_SCENE_CONTROLLER, "Non-color scene controller" },
407
    { ZBEE_ZLL_DEVICE_CONTROL_BRIDGE,             "Control Bridge" },
408
    { ZBEE_ZLL_DEVICE_ON_OFF_SENSOR,              "On/Off sensor" },
409
    { 0, NULL }
410
};
411
412
static const value_string zbee_ha_device_names[] = {
413
    { ZBEE_HA_DEVICE_ON_OFF_LIGHT,               "On/Off light" },
414
    { ZBEE_HA_DEVICE_DIMMABLE_LIGHT,             "Dimmable light" },
415
    { ZBEE_HA_DEVICE_COLOR_DIMMABLE_LIGHT,       "Color dimmable light" },
416
    { ZBEE_HA_DEVICE_ON_OFF_LIGHT_SWITCH,        "On/Off light switch" },
417
    { ZBEE_HA_DEVICE_DIMMER_SWITCH,              "Dimmer switch" },
418
    { ZBEE_HA_DEVICE_COLOR_DIMMER_SWITCH,        "Color dimmer switch" },
419
    { ZBEE_HA_DEVICE_LIGHT_SENSOR,               "Light sensor" },
420
    { ZBEE_HA_DEVICE_OCCUPANCY_SENSOR,           "Occupancy sensor" },
421
    { ZBEE_HA_DEVICE_ON_OFF_BALLAST,             "On/Off ballast" },
422
    { ZBEE_HA_DEVICE_DIMMABLE_BALLAST,           "Dimmable ballast" },
423
    { ZBEE_HA_DEVICE_ON_OFF_PLUG_IN_UNIT,        "On/Off plug-in unit" },
424
    { ZBEE_HA_DEVICE_DIMMABLE_PLUG_IN_UNIT,      "Dimmable plug-in unit" },
425
    { ZBEE_HA_DEVICE_COLOR_TEMPERATURE_LIGHT,    "Color temperature light" },
426
    { ZBEE_HA_DEVICE_EXTENDED_COLOR_LIGHT,       "Extended color light" },
427
    { ZBEE_HA_DEVICE_LIGHT_LEVEL_SENSOR,         "Light level sensor" },
428
    { ZBEE_HA_DEVICE_COLOR_CONTROLLER,           "Color controller" },
429
    { ZBEE_HA_DEVICE_COLOR_SCENE_CONTROLLER,     "Color scene controller" },
430
    { ZBEE_HA_DEVICE_NON_COLOR_CONTROLLER,       "Non-color controller" },
431
    { ZBEE_HA_DEVICE_NON_COLOR_SCENE_CONTROLLER, "Non-color scene controller" },
432
    { ZBEE_HA_DEVICE_CONTROL_BRIDGE,             "Control Bridge" },
433
    { ZBEE_HA_DEVICE_ON_OFF_SENSOR,              "On/Off sensor" },
434
    { 0, NULL }
435
};
436
437
const value_string zbee_zdp_rtg_status_vals[] = {
438
    { 0x00,  "Active" },
439
    { 0x01,  "Discovery Underway" },
440
    { 0x02,  "Discovery Failed" },
441
    { 0x03,  "Inactive" },
442
    { 0, NULL }
443
};
444
445
static const value_string zbee_zdp_ieee_join_policy_vals[] = {
446
    { 0x00,  "All Join" },
447
    { 0x01,  "IEEE Join" },
448
    { 0x02,  "No Join" },
449
    { 0, NULL }
450
};
451
452
/* The reason this has it's own value_string and doesn't use
453
   tfs_get_string(), is that some hf_ fields use bitmasks larger
454
   than 0x01, and it's intentional that those other values be
455
   "Unknown" (which is what value_string will give us)
456
 */
457
static const value_string zbee_zdp_true_false_plus_vals[] = {
458
    { 0x00,  "False" },
459
    { 0x01,  "True" },
460
    { 0, NULL }
461
};
462
463
static const value_string zbee_zdp_table_entry_type_vals[] = {
464
    { 0x00,  "Coordinator" },
465
    { 0x01,  "Router" },
466
    { 0x02,  "End Device" },
467
    { 0, NULL }
468
};
469
470
static const value_string zbee_zdp_relationship_vals[] = {
471
    { 0x00,  "Parent" },
472
    { 0x01,  "Child" },
473
    { 0x02,  "Sibling" },
474
    { 0x03,  "None" },
475
    { 0x04,  "Previous Child" },
476
    { 0, NULL }
477
};
478
479
static const range_string zbee_zcl_zdp_address_modes[] = {
480
    { 0x0, 0x0, "Reserved" },
481
    { ZBEE_ZDP_ADDR_MODE_GROUP, ZBEE_ZDP_ADDR_MODE_GROUP, "Group" },
482
    { 0x02, 0x02, "Reserved" },
483
    { ZBEE_ZDP_ADDR_MODE_UNICAST, ZBEE_ZDP_ADDR_MODE_UNICAST, "Unicast" },
484
    { 0x03, 0xFF, "Reserved" },
485
    { 0, 0, NULL }
486
};
487
488
/*
489
    if (tree) {
490
        if (type == 0x00)       proto_item_append_text(ti, ", Type: Coordinator");
491
        else if (type == 0x01)  proto_item_append_text(ti, ", Type: Router");
492
        else if (type == 0x02)  proto_item_append_text(ti, ", Type: End Device");
493
        else                    proto_item_append_text(ti, ", Type: Unknown");
494
495
        if (idle_rx == 0x00)    proto_item_append_text(ti, ", Idle Rx: False");
496
        else if (idle_rx==0x01) proto_item_append_text(ti, ", Idle Rx: True");
497
        else                    proto_item_append_text(ti, ", Idle Rx: Unknown");
498
499
        if (rel == 0x00)        proto_item_append_text(ti, ", Relationship: Parent");
500
        else if (rel == 0x01)   proto_item_append_text(ti, ", Relationship: Child");
501
        else if (rel == 0x02)   proto_item_append_text(ti, ", Relationship: Sibling");
502
        else if (rel == 0x03)   proto_item_append_text(ti, ", Relationship: None");
503
        else if (rel == 0x04)   proto_item_append_text(ti, ", Relationship: Previous Child");
504
        else                    proto_item_append_text(ti, ", Relationship: Unknown");
505
    }
506
*/
507
508
/**
509
 *Returns a status name for a given status value.
510
 *
511
*/
512
const char *
513
zdp_status_name(uint8_t status)
514
770
{
515
770
    return val_to_str_const(status, zbee_zdp_status_names, "Reserved");
516
770
} /* zdp_status_name */
517
518
/**
519
 *Converts a ZigBee 2003 & earlier cluster ID to a 2006
520
 *
521
*/
522
static uint16_t
523
zdp_convert_2003cluster(uint8_t cluster)
524
4.03k
{
525
4.03k
    uint16_t cluster16 = (uint16_t)cluster;
526
527
4.03k
    if (cluster16 & ZBEE_ZDP_MSG_RESPONSE_BIT_2003) {
528
        /* Clear the 2003 request bit. */
529
2.20k
        cluster16 &= ~(ZBEE_ZDP_MSG_RESPONSE_BIT_2003);
530
        /* Set the 2006 request bit. */
531
2.20k
        cluster16 |= (ZBEE_ZDP_MSG_RESPONSE_BIT);
532
2.20k
    }
533
4.03k
    return cluster16;
534
4.03k
} /* zdp_convert_2003cluster */
535
536
/**
537
 *Helper functions dumps any excess data into the data dissector.
538
 *
539
 *@param tvb pointer to buffer containing raw packet.
540
 *@param offset offset after parsing last item.
541
 *@param pinfo packet information structure.
542
 *@param tree pointer to data tree Wireshark uses to display packet.
543
*/
544
void
545
zdp_dump_excess(tvbuff_t *tvb, unsigned offset, packet_info *pinfo, proto_tree *tree)
546
2.02k
{
547
2.02k
    proto_tree  *root = proto_tree_get_root(tree);
548
2.02k
    unsigned    length = tvb_captured_length_remaining(tvb, offset);
549
2.02k
    tvbuff_t    *excess;
550
551
2.02k
    if (length > 0) {
552
1.65k
        excess = tvb_new_subset_remaining(tvb, offset);
553
1.65k
        call_data_dissector(excess, pinfo, root);
554
1.65k
    }
555
2.02k
} /* zdp_dump_excess */
556
557
/**
558
 *ZigBee helper function. Appends the info to the info column
559
 *
560
 *@param item item to display info on.
561
 *@param pinfo packet info struct.
562
 *@param format format string.
563
*/
564
void
565
zbee_append_info(proto_item *item, packet_info *pinfo, const char *format, ...)
566
2.07k
{
567
2.07k
    static char     buffer[512];
568
2.07k
    va_list         ap;
569
570
2.07k
    va_start(ap, format);
571
2.07k
    vsnprintf(buffer, 512, format, ap);
572
2.07k
    va_end(ap);
573
574
2.07k
    proto_item_append_text(item, "%s", buffer);
575
576
2.07k
    col_append_str(pinfo->cinfo, COL_INFO, buffer);
577
2.07k
} /* zbee_add_info */
578
579
/**
580
 *ZigBee helper function. extracts an EUI64 address and displays
581
 *
582
 *@param tree pointer to data tree Wireshark uses to display packet.
583
 *@param hfindex index to field information.
584
 *@param tvb pointer to buffer containing raw packet.
585
 *@param offset pointer to value of offset.
586
 *@param length length of the value to extract.
587
 *@param ti optional pointer to get the created proto item.
588
 *@return the value read out of the tvbuff and added to the tree.
589
*/
590
uint64_t
591
zbee_parse_eui64(proto_tree *tree, int hfindex, tvbuff_t *tvb, unsigned *offset, unsigned length, proto_item **ti)
592
2.05k
{
593
2.05k
    proto_item          *item = NULL;
594
2.05k
    uint64_t            value;
595
596
    /* Get the value. */
597
2.05k
    value = tvb_get_letoh64(tvb, *offset);
598
599
    /* Display it. */
600
2.05k
    item = proto_tree_add_eui64(tree, hfindex, tvb, *offset, length, value);
601
602
    /* Increment the offset. */
603
2.05k
    *offset += (int)sizeof(uint64_t);
604
605
    /* return the item if requested. */
606
2.05k
    if (ti) *ti = item;
607
608
    /* return the value. */
609
2.05k
    return value;
610
2.05k
} /* zbee_parse_eui64 */
611
612
/**
613
 *Parses and displays the status value.
614
 *
615
 *@param tree pointer to data tree Wireshark uses to display packet.
616
 *@param tvb pointer to buffer containing raw packet.
617
 *@param offset offset into the tvb to find the status value.
618
*/
619
uint8_t
620
zdp_parse_status(proto_tree *tree, tvbuff_t *tvb, unsigned *offset)
621
2.18k
{
622
2.18k
    uint8_t     status;
623
624
    /* Get and display the flags. */
625
2.18k
    status = tvb_get_uint8(tvb, *offset);
626
2.18k
    proto_tree_add_uint(tree, hf_zbee_zdp_status, tvb, *offset, (int)sizeof(uint8_t), status);
627
628
2.18k
    *offset += (int)sizeof(uint8_t);
629
630
2.18k
    return status;
631
2.18k
} /* zdp_parse_status */
632
633
634
/**
635
 *Parses and displays the a channel mask.
636
 *
637
 *@param tree pointer to data tree Wireshark uses to display packet.
638
 *@param tvb pointer to buffer containing raw packet.
639
 *@param offset offset into the tvb to find the status value.
640
*/
641
uint32_t
642
zdp_parse_chanmask(proto_tree *tree, tvbuff_t *tvb, unsigned *offset, int hf_page, int hf_channel)
643
3.07k
{
644
3.07k
    int         i;
645
3.07k
    uint32_t    mask;
646
3.07k
    uint8_t     page;
647
3.07k
    proto_item  *ti;
648
649
    /* Get and display the channel mask. */
650
3.07k
    mask = tvb_get_letohl(tvb, *offset);
651
652
3.07k
    page = (uint8_t)((mask & ZBEE_ZDP_NWKUPDATE_PAGE) >> 27);
653
3.07k
    mask &= ZBEE_ZDP_NWKUPDATE_CHANNEL;
654
655
3.07k
    proto_tree_add_uint(tree, hf_page, tvb, *offset, 4, page);
656
3.07k
    ti = proto_tree_add_uint_format(tree, hf_channel, tvb, *offset, 4, mask, "Channels: ");
657
658
    /* Check if there are any channels to display. */
659
3.07k
    if (mask==0) {
660
338
        proto_item_append_text(ti, "None");
661
338
    }
662
    /* Display the first channel #. */
663
21.1k
    for (i=0; i<32; i++) {
664
20.6k
        if ((1<<i) & mask) {
665
2.58k
            proto_item_append_text(ti, "%d", i++);
666
2.58k
            break;
667
2.58k
        }
668
20.6k
    } /* for */
669
    /* Display the rest of the channels. */
670
61.3k
    for (;i<32; i++) {
671
58.3k
        if (!((1<<i) & mask)) {
672
            /* This channel isn't selected. */
673
46.9k
            continue;
674
46.9k
        }
675
        /* If the previous channel wasn't selected, then display the
676
         * channel number.
677
         */
678
11.3k
        if ( ! ((1<<(i-1)) & mask) ) {
679
10.1k
            proto_item_append_text(ti, ", %d", i);
680
10.1k
        }
681
        /*
682
         * If the next channel is selected too, skip past it and display
683
         * a range of values instead.
684
         */
685
11.3k
        if ((2<<i) & mask) {
686
19.4k
            while ((2<<i) & mask) i++;
687
5.00k
            proto_item_append_text(ti, "-%d", i);
688
5.00k
        }
689
11.3k
    } /* for */
690
691
3.07k
    *offset += (int)sizeof(uint32_t);
692
693
3.07k
    return mask;
694
3.07k
} /* zdp_parse_chanmask */
695
696
/**
697
 *Parses and displays MAC capability info flags.
698
 *
699
 *@param tree pointer to data tree Wireshark uses to display packet.
700
 *@param ettindex subtree index to create the node descriptor in, or -1
701
 *@param tvb pointer to buffer containing raw packet.
702
 *@param offset offset into the tvb to find the node descriptor.
703
*/
704
uint8_t
705
zdp_parse_cinfo(proto_tree *tree, int ettindex, tvbuff_t *tvb, unsigned *offset)
706
122
{
707
122
    uint8_t     flags;
708
122
    static int * const cinfo[] = {
709
122
        &hf_zbee_zdp_cinfo_alt_coord,
710
122
        &hf_zbee_zdp_cinfo_ffd,
711
122
        &hf_zbee_zdp_cinfo_power,
712
122
        &hf_zbee_zdp_cinfo_idle_rx,
713
122
        &hf_zbee_zdp_cinfo_security,
714
122
        &hf_zbee_zdp_cinfo_alloc,
715
122
        NULL
716
122
    };
717
718
    /* Get and display the flags. */
719
122
    proto_tree_add_bitmask_with_flags(tree, tvb, *offset, hf_zbee_zdp_cinfo, ettindex, cinfo, ENC_NA, BMT_NO_APPEND);
720
122
    flags = tvb_get_uint8(tvb, *offset);
721
122
    *offset += 1;
722
723
122
    return flags;
724
122
} /* zdp_parse_cinfo */
725
726
/**
727
 *Parses and displays server mode flags.
728
 *
729
 *@param tree pointer to data tree Wireshark uses to display packet.
730
 *@param ettindex subtree index to create the node descriptor in, or -1
731
 *@param tvb pointer to buffer containing raw packet.
732
 *@param offset offset into the tvb to find the node descriptor.
733
*/
734
uint16_t
735
zdp_parse_server_flags(proto_tree *tree, int ettindex, tvbuff_t *tvb, unsigned *offset)
736
33
{
737
33
    uint16_t     flags;
738
33
    static int * const server_flags[] = {
739
33
        &hf_zbee_zdp_server_pri_trust,
740
33
        &hf_zbee_zdp_server_bak_trust,
741
33
        &hf_zbee_zdp_server_pri_bind,
742
33
        &hf_zbee_zdp_server_bak_bind,
743
33
        &hf_zbee_zdp_server_pri_disc,
744
33
        &hf_zbee_zdp_server_bak_disc,
745
33
        &hf_zbee_zdp_server_network_manager,
746
33
        &hf_zbee_zdp_server_stk_compl_rev,
747
33
        NULL
748
33
    };
749
750
    /* Get and display the flags. */
751
33
    flags = tvb_get_letohs(tvb, *offset);
752
33
    proto_tree_add_bitmask_with_flags(tree, tvb, *offset, hf_zbee_zdp_server, ettindex, server_flags, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
753
33
    *offset += 2;
754
755
33
    return flags;
756
33
} /* zdp_parse_server_flags */
757
758
/**
759
 *Parses and displays a node descriptor to the specified
760
 *
761
 *@param tree pointer to data tree Wireshark uses to display packet.
762
 *@param ettindex subtree index to create the node descriptor in, or -1
763
 *@param tvb pointer to buffer containing raw packet.
764
 *@param offset offset into the tvb to find the node descriptor.
765
*/
766
void
767
zdp_parse_node_desc(proto_tree *tree, packet_info *pinfo, bool show_ver_flags, int ettindex, tvbuff_t *tvb, unsigned *offset, uint8_t version)
768
93
{
769
93
    proto_item  *ti;
770
93
    proto_item  *field_root = NULL;
771
93
    proto_tree  *field_tree = NULL;
772
773
93
    uint16_t    flags;
774
    /*uint8_t     capability;*/
775
    /*uint16_t    mfr_code;*/
776
    /*uint8_t     max_buff;*/
777
    /*uint16_t    max_transfer;*/
778
93
    static int * const nodes[] = {
779
93
        &hf_zbee_zdp_node_complex,
780
93
        &hf_zbee_zdp_node_user,
781
93
        &hf_zbee_zdp_node_frag_support,
782
93
        &hf_zbee_zdp_node_freq_868,
783
93
        &hf_zbee_zdp_node_freq_900,
784
93
        &hf_zbee_zdp_node_freq_2400,
785
93
        &hf_zbee_zdp_node_freq_eu_sub_ghz,
786
93
        NULL
787
93
    };
788
789
93
    if ((tree) && (ettindex != -1)) {
790
93
        field_tree = proto_tree_add_subtree(tree, tvb, *offset, -1, ettindex, &field_root, "Node Descriptor");
791
93
    }
792
0
    else
793
0
        field_tree = tree;
794
795
    /* Get and display the flags. */
796
93
    flags = tvb_get_letohs(tvb, *offset);
797
93
    if (tree) {
798
92
        uint16_t type = flags & ZBEE_ZDP_NODE_TYPE;
799
92
        ti = proto_tree_add_uint(field_tree, hf_zbee_zdp_node_type, tvb, *offset, 2, type);
800
        /* XXX - should probably be converted to proto_tree_add_bitmask */
801
92
        proto_tree_add_bitmask_list(field_tree, tvb, *offset, 2, nodes, ENC_LITTLE_ENDIAN);
802
803
        /* Enumerate the type field. */
804
92
        if (type == ZBEE_ZDP_NODE_TYPE_COORD)    proto_item_append_text(ti, " (Coordinator)");
805
68
        else if (type == ZBEE_ZDP_NODE_TYPE_FFD) proto_item_append_text(ti, " (Router)");
806
51
        else if (type == ZBEE_ZDP_NODE_TYPE_RFD) proto_item_append_text(ti, " (End Device)");
807
34
        else proto_item_append_text(ti, " (Reserved)");
808
92
    }
809
93
    *offset += 2;
810
811
    /* Get and display the capability flags. */
812
    /*capability      =*/ zdp_parse_cinfo(field_tree, ett_zbee_zdp_cinfo, tvb, offset);
813
93
    proto_tree_add_item(field_tree, hf_zbee_zdp_node_manufacturer, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
814
93
    *offset += 2;
815
93
    proto_tree_add_item(field_tree, hf_zbee_zdp_node_max_buffer, tvb, *offset, 1, ENC_LITTLE_ENDIAN);
816
93
    *offset += 1;
817
93
    proto_tree_add_item(field_tree, hf_zbee_zdp_node_max_incoming_transfer, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
818
93
    *offset += 2;
819
820
    /* Get and display the server flags. */
821
93
    if (version >= ZBEE_VERSION_2007) {
822
2
        uint16_t ver_flags;
823
2
        static int * const descriptors[] = {
824
2
            &hf_zbee_zdp_dcf_eaela,
825
2
            &hf_zbee_zdp_dcf_esdla,
826
2
            NULL
827
2
        };
828
829
2
        ver_flags = zdp_parse_server_flags(field_tree, ett_zbee_zdp_server, tvb, offset) & ZBEE_ZDP_NODE_SERVER_STACK_COMPL_REV;
830
2
        if (show_ver_flags && ver_flags) {
831
0
            zbee_append_info(tree, pinfo, ", Rev: %d",
832
0
                             (ver_flags >> ws_ctz(ZBEE_ZDP_NODE_SERVER_STACK_COMPL_REV)));
833
0
        }
834
2
        proto_tree_add_item(field_tree, hf_zbee_zdp_node_max_outgoing_transfer, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
835
2
        *offset += 2;
836
2
        proto_tree_add_bitmask_with_flags(field_tree, tvb, *offset, hf_zbee_zdp_dcf, ett_zbee_zdp_descriptor_capability_field, descriptors, ENC_NA, BMT_NO_APPEND);
837
2
        *offset += 1;
838
2
    }
839
840
    /* Correct the length of the subtree. */
841
93
    if (tree && (ettindex != -1)) {
842
88
        proto_item_set_len(field_root, *offset);
843
88
    }
844
845
93
} /* zdp_parse_node_desc */
846
847
848
static const value_string zbee_zdp_power_mode_vals[] = {
849
   { ZBEE_ZDP_POWER_MODE_RX_ON,              "Receiver Always On"          },
850
   { ZBEE_ZDP_POWER_MODE_RX_PERIODIC,        "Receiver Periodically On"    },
851
   { ZBEE_ZDP_POWER_MODE_RX_STIMULATE,       "Receiver On When Stimulated" },
852
853
   { 0,                    NULL }
854
};
855
856
static const value_string zbee_zdp_power_level_vals[] = {
857
   { ZBEE_ZDP_POWER_LEVEL_FULL,      "Full"          },
858
   { ZBEE_ZDP_POWER_LEVEL_OK,        "OK"    },
859
   { ZBEE_ZDP_POWER_LEVEL_LOW,       "Low" },
860
   { ZBEE_ZDP_POWER_LEVEL_CRITICAL,  "Critical" },
861
862
   { 0,                    NULL }
863
};
864
/**
865
 *Parses and displays a node descriptor to the specified
866
 *
867
 *@param tree pointer to data tree Wireshark uses to display packet.
868
 *@param ettindex subtree index to create the node descriptor in, or -1
869
 *@param tvb pointer to buffer containing raw packet.
870
 *@param offset offset into the tvb to find the node descriptor.
871
*/
872
void
873
zdp_parse_power_desc(proto_tree *tree, int ettindex, tvbuff_t *tvb, unsigned *offset)
874
17
{
875
17
    static int * const power_desc[] = {
876
17
        &hf_zbee_zdp_power_mode,
877
17
        &hf_zbee_zdp_power_avail_ac,
878
17
        &hf_zbee_zdp_power_avail_recharge,
879
17
        &hf_zbee_zdp_power_avail_dispose,
880
17
        &hf_zbee_zdp_power_source_ac,
881
17
        &hf_zbee_zdp_power_source_recharge,
882
17
        &hf_zbee_zdp_power_source_dispose,
883
17
        &hf_zbee_zdp_power_level,
884
17
        NULL
885
17
    };
886
887
17
    proto_tree_add_bitmask_with_flags(tree, tvb, *offset, hf_zbee_zdp_power, ettindex, power_desc, ENC_LITTLE_ENDIAN, BMT_NO_APPEND);
888
17
    *offset += 2;
889
17
} /* zdp_parse_power_desc */
890
891
/**
892
 *Parses and displays a simple descriptor to the specified
893
 *
894
 *@param tree pointer to data tree Wireshark uses to display packet.
895
 *@param ettindex subtree index to create the node descriptor in, or -1
896
 *@param tvb pointer to buffer containing raw packet.
897
 *@param offset offset into the tvb to find the node descriptor.
898
*/
899
void
900
zdp_parse_simple_desc(proto_tree *tree, int ettindex, tvbuff_t *tvb, unsigned *offset, uint8_t version)
901
118
{
902
118
    proto_item  *field_root = NULL;
903
118
    proto_tree  *field_tree = NULL, *cluster_tree = NULL;
904
118
    unsigned    i, sizeof_cluster;
905
906
118
    int         hf_app_device;
907
118
    uint32_t    profile;
908
118
    uint32_t    in_count, out_count;
909
910
118
    if ((tree) && (ettindex != -1)) {
911
118
        field_tree = proto_tree_add_subtree(tree, tvb, *offset, -1, ettindex, &field_root, "Simple Descriptor");
912
118
    }
913
0
    else field_tree = tree;
914
915
118
    proto_tree_add_item(field_tree, hf_zbee_zdp_endpoint, tvb, *offset, 1, ENC_LITTLE_ENDIAN);
916
118
    *offset += 1;
917
918
118
    proto_tree_add_item_ret_uint(field_tree, hf_zbee_zdp_profile, tvb, *offset, 2, ENC_LITTLE_ENDIAN, &profile);
919
118
    *offset += 2;
920
921
118
    switch (profile)
922
118
    {
923
0
    case ZBEE_PROFILE_ZLL: hf_app_device = hf_zbee_zdp_simple_zll_app_device; break;
924
0
    case ZBEE_PROFILE_HA:  hf_app_device = hf_zbee_zdp_simple_ha_app_device;  break;
925
115
    default:               hf_app_device = hf_zbee_zdp_simple_app_device;     break;
926
118
    }
927
115
    proto_tree_add_item(field_tree, hf_app_device, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
928
115
    *offset += 2;
929
930
115
    proto_tree_add_item(field_tree, hf_zbee_zdp_simple_app_version, tvb, *offset, 1, ENC_LITTLE_ENDIAN);
931
115
    *offset += 1;
932
933
115
    sizeof_cluster = (version >= ZBEE_VERSION_2007)?(int)sizeof(uint16_t):(int)sizeof(uint8_t);
934
935
115
    proto_tree_add_item_ret_uint(field_tree, hf_zbee_zdp_in_count, tvb, *offset, 1, ENC_LITTLE_ENDIAN, &in_count);
936
115
    *offset += 1;
937
938
115
    if ((tree) && (in_count)) {
939
81
        cluster_tree = proto_tree_add_subtree(field_tree, tvb, *offset, in_count*sizeof_cluster,
940
81
                                                ett_zbee_zdp_node_in, NULL, "Input Cluster List");
941
81
    }
942
3.35k
    for (i=0; i<in_count && tvb_bytes_exist(tvb, *offset, sizeof_cluster); i++) {
943
3.23k
        proto_tree_add_item(cluster_tree, hf_zbee_zdp_in_cluster, tvb, *offset, sizeof_cluster, ENC_LITTLE_ENDIAN);
944
3.23k
        *offset += sizeof_cluster;
945
3.23k
    }
946
947
115
    proto_tree_add_item_ret_uint(field_tree, hf_zbee_zdp_out_count, tvb, *offset, 1, ENC_LITTLE_ENDIAN, &out_count);
948
115
    *offset += 1;
949
115
    if ((tree) && (out_count)) {
950
47
        cluster_tree = proto_tree_add_subtree(field_tree, tvb, *offset, out_count*sizeof_cluster,
951
47
                                                ett_zbee_zdp_node_out, NULL, "Output Cluster List");
952
47
    }
953
1.24k
    for (i=0; (i<out_count) && tvb_bytes_exist(tvb, *offset, sizeof_cluster); i++) {
954
1.12k
        proto_tree_add_item(cluster_tree, hf_zbee_zdp_out_cluster, tvb, *offset, sizeof_cluster, ENC_LITTLE_ENDIAN);
955
1.12k
        *offset += sizeof_cluster;
956
1.12k
    }
957
958
115
    if (tree && (ettindex != -1)) {
959
71
        proto_item_set_len(field_root, *offset);
960
71
    }
961
115
} /* zdp_parse_simple_desc */
962
963
/**
964
 *Parses and displays a simple descriptor to the specified
965
 *
966
 *@param tree pointer to data tree Wireshark uses to display packet.
967
 *@param ettindex subtree index to create the node descriptor in, or -1
968
 *@param tvb pointer to buffer containing raw packet.
969
 *@param offset offset into the tvb to find the node descriptor.
970
 *@param length length of the complex descriptor.
971
*/
972
void
973
zdp_parse_complex_desc(packet_info *pinfo, proto_tree *tree, int ettindex, tvbuff_t *tvb, unsigned *offset, unsigned length)
974
97
{
975
97
    enum {
976
97
        tag_charset = 1,
977
97
        tag_mfr_name = 2,
978
97
        tag_model_name = 3,
979
97
        tag_serial_no = 4,
980
97
        tag_url = 5,
981
97
        tag_icon = 6,
982
97
        tag_icon_url = 7
983
97
    };
984
985
97
    static const char *tag_name[] = {
986
97
        "Reserved Tag",
987
97
        "languageChar",
988
97
        "manufacturerName",
989
97
        "modelName",
990
97
        "serialNumber",
991
97
        "deviceURL",
992
97
        "icon",
993
97
        "outliner"
994
97
    };
995
996
97
    proto_tree  *field_tree;
997
998
97
    char    *complex;
999
97
    uint8_t tag;
1000
1001
97
    if ((tree) && (ettindex != -1)) {
1002
0
        field_tree = proto_tree_add_subtree(tree, tvb, *offset, length, ettindex, NULL, "Complex Descriptor");
1003
0
    }
1004
97
    else
1005
97
        field_tree = tree;
1006
1007
97
    tag = tvb_get_uint8(tvb, *offset);
1008
97
    if (tag == tag_charset) {
1009
9
        char    *lang_str[2];
1010
9
        uint8_t ch;
1011
9
        uint8_t charset  = tvb_get_uint8(tvb, *offset + 3);
1012
9
        const char *charset_str;
1013
1014
9
        if (charset == 0x00) charset_str = "ASCII";
1015
4
        else                 charset_str = "Unknown Character Set";
1016
1017
9
        ch = tvb_get_uint8(tvb, *offset + 1);
1018
9
        lang_str[0] = format_char(pinfo->pool, ch);
1019
9
        ch = tvb_get_uint8(tvb, *offset + 2);
1020
9
        lang_str[1] = format_char(pinfo->pool, ch);
1021
1022
9
        complex = wmem_strdup_printf(pinfo->pool, "<%s>%s%s, %s</%s>", tag_name[tag_charset], lang_str[0], lang_str[1], charset_str, tag_name[tag_charset]);
1023
9
    }
1024
88
    else if (tag == tag_icon) {
1025
        /* TODO: */
1026
2
        complex = wmem_strdup_printf(pinfo->pool, "<%s>FixMe</%s>", tag_name[tag_icon], tag_name[tag_icon]);
1027
2
    }
1028
86
    else {
1029
86
        char *str;
1030
1031
86
        str = (char *) tvb_get_string_enc(pinfo->pool, tvb, *offset+1, length-1, ENC_ASCII);
1032
        /* Handles all string type XML tags. */
1033
86
        if (tag <= tag_icon_url) {
1034
7
            complex = wmem_strdup_printf(pinfo->pool, "<%s>%s</%s>", tag_name[tag], str, tag_name[tag]);
1035
7
        }
1036
79
        else {
1037
79
            complex = wmem_strdup_printf(pinfo->pool, "<%s>%s</%s>", tag_name[0], str, tag_name[0]);
1038
79
        }
1039
86
    }
1040
97
    proto_tree_add_string(field_tree, hf_zbee_zdp_complex, tvb, *offset, length, complex);
1041
97
    *offset += (length);
1042
97
} /* zdp_parse_complex_desc */
1043
1044
/**
1045
 *ZigBee Device Profile dissector for wireshark.
1046
 *
1047
 *@param tvb pointer to buffer containing raw packet.
1048
 *@param pinfo pointer to packet information fields
1049
 *@param tree pointer to data tree Wireshark uses to display packet.
1050
*/
1051
static int
1052
dissect_zbee_zdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
1053
4.45k
{
1054
4.45k
    proto_tree      *zdp_tree;
1055
4.45k
    proto_item      *proto_root;
1056
4.45k
    tvbuff_t        *zdp_tvb;
1057
1058
4.45k
    uint8_t         seqno;
1059
4.45k
    uint16_t        cluster;
1060
4.45k
    unsigned        offset = 0;
1061
4.45k
    zbee_nwk_packet *nwk;
1062
1063
    /* Reject the packet if data is NULL */
1064
4.45k
    if (data == NULL)
1065
0
        return 0;
1066
4.45k
    nwk = (zbee_nwk_packet *)data;
1067
1068
    /* Create the protocol tree. */
1069
4.45k
    proto_root = proto_tree_add_protocol_format(tree, proto_zbee_zdp, tvb, offset, tvb_captured_length(tvb), "ZigBee Device Profile");
1070
4.45k
    zdp_tree = proto_item_add_subtree(proto_root, ett_zbee_zdp);
1071
1072
#if 0
1073
    /* Overwrite the protocol column */
1074
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "ZigBee ZDP");
1075
#endif
1076
    /* Get and display the sequence number. */
1077
4.45k
    seqno = tvb_get_uint8(tvb, offset);
1078
4.45k
    proto_tree_add_uint(zdp_tree, hf_zbee_zdp_seqno, tvb, offset, (int)sizeof(uint8_t), seqno);
1079
1080
4.45k
    offset += (int)sizeof(uint8_t);
1081
1082
4.45k
    if (nwk->version <= ZBEE_VERSION_2004) {
1083
        /* ZigBee 2004 and earlier had different cluster identifiers, need to convert
1084
         * them into the ZigBee 2006 & later values. */
1085
4.03k
        cluster = zdp_convert_2003cluster((uint8_t)nwk->cluster_id);
1086
4.03k
    }
1087
419
    else {
1088
419
        cluster = nwk->cluster_id;
1089
419
    }
1090
1091
    /* Update info. */
1092
4.45k
    proto_item_append_text(zdp_tree, ", %s", val_to_str_const(cluster, zbee_zdp_cluster_names, "Unknown Cluster"));
1093
4.45k
    col_set_str(pinfo->cinfo, COL_INFO, val_to_str_const(cluster, zbee_zdp_cluster_names, "Unknown Cluster"));
1094
1095
    /* Create a new tvb for the zdp message. */
1096
4.45k
    zdp_tvb = tvb_new_subset_remaining(tvb, offset);
1097
1098
4.45k
    switch (cluster) {
1099
43
        case ZBEE_ZDP_REQ_NWK_ADDR:
1100
43
            dissect_zbee_zdp_req_nwk_addr(zdp_tvb, pinfo, zdp_tree);
1101
43
            break;
1102
31
        case ZBEE_ZDP_REQ_IEEE_ADDR:
1103
31
            dissect_zbee_zdp_req_ext_addr(zdp_tvb, pinfo, zdp_tree);
1104
31
            break;
1105
28
        case ZBEE_ZDP_REQ_NODE_DESC:
1106
28
            dissect_zbee_zdp_req_node_desc(zdp_tvb, pinfo, zdp_tree);
1107
28
            break;
1108
20
        case ZBEE_ZDP_REQ_POWER_DESC:
1109
20
            dissect_zbee_zdp_req_power_desc(zdp_tvb, pinfo, zdp_tree);
1110
20
            break;
1111
25
        case ZBEE_ZDP_REQ_SIMPLE_DESC:
1112
25
            dissect_zbee_zdp_req_simple_desc(zdp_tvb, pinfo, zdp_tree);
1113
25
            break;
1114
25
        case ZBEE_ZDP_REQ_ACTIVE_EP:
1115
25
            dissect_zbee_zdp_req_active_ep(zdp_tvb, pinfo, zdp_tree);
1116
25
            break;
1117
98
        case ZBEE_ZDP_REQ_MATCH_DESC:
1118
98
            dissect_zbee_zdp_req_match_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
1119
98
            break;
1120
13
        case ZBEE_ZDP_REQ_COMPLEX_DESC:
1121
13
            dissect_zbee_zdp_req_complex_desc(zdp_tvb, pinfo, zdp_tree);
1122
13
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1123
13
            break;
1124
12
        case ZBEE_ZDP_REQ_USER_DESC:
1125
12
            dissect_zbee_zdp_req_user_desc(zdp_tvb, pinfo, zdp_tree);
1126
12
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1127
12
            break;
1128
19
        case ZBEE_ZDP_REQ_DISCOVERY_CACHE:
1129
19
            dissect_zbee_zdp_req_discovery_cache(zdp_tvb, pinfo, zdp_tree);
1130
19
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1131
19
            break;
1132
11
        case ZBEE_ZDP_REQ_DEVICE_ANNCE:
1133
11
            dissect_zbee_zdp_device_annce(zdp_tvb, pinfo, zdp_tree);
1134
11
            break;
1135
18
        case ZBEE_ZDP_REQ_SET_USER_DESC:
1136
18
            dissect_zbee_zdp_req_set_user_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
1137
18
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1138
18
            break;
1139
26
        case ZBEE_ZDP_REQ_SYSTEM_SERVER_DISC:
1140
26
            dissect_zbee_zdp_req_system_server_disc(zdp_tvb, pinfo, zdp_tree);
1141
26
            break;
1142
75
        case ZBEE_ZDP_REQ_STORE_DISCOVERY:
1143
75
            dissect_zbee_zdp_req_store_discovery(zdp_tvb, pinfo, zdp_tree);
1144
75
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1145
75
            break;
1146
133
        case ZBEE_ZDP_REQ_STORE_NODE_DESC:
1147
133
            dissect_zbee_zdp_req_store_node_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
1148
133
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1149
133
            break;
1150
28
        case ZBEE_ZDP_REQ_STORE_POWER_DESC:
1151
28
            dissect_zbee_zdp_req_store_power_desc(zdp_tvb, pinfo, zdp_tree);
1152
28
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1153
28
            break;
1154
96
        case ZBEE_ZDP_REQ_STORE_ACTIVE_EP:
1155
96
            dissect_zbee_zdp_req_store_active_ep(zdp_tvb, pinfo, zdp_tree);
1156
96
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1157
96
            break;
1158
172
        case ZBEE_ZDP_REQ_STORE_SIMPLE_DESC:
1159
172
            dissect_zbee_zdp_req_store_simple_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
1160
172
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1161
172
            break;
1162
10
        case ZBEE_ZDP_REQ_REMOVE_NODE_CACHE:
1163
10
            dissect_zbee_zdp_req_remove_node_cache(zdp_tvb, pinfo, zdp_tree);
1164
10
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1165
10
            break;
1166
0
        case ZBEE_ZDP_REQ_FIND_NODE_CACHE:
1167
0
            dissect_zbee_zdp_req_find_node_cache(zdp_tvb, pinfo, zdp_tree);
1168
0
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1169
0
            break;
1170
1
        case ZBEE_ZDP_REQ_EXT_SIMPLE_DESC:
1171
1
            dissect_zbee_zdp_req_ext_simple_desc(zdp_tvb, pinfo, zdp_tree);
1172
1
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1173
1
            break;
1174
0
        case ZBEE_ZDP_REQ_EXT_ACTIVE_EP:
1175
0
            dissect_zbee_zdp_req_ext_active_ep(zdp_tvb, pinfo, zdp_tree);
1176
0
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1177
0
            break;
1178
30
        case ZBEE_ZDP_REQ_PARENT_ANNCE:
1179
30
            dissect_zbee_zdp_parent_annce(zdp_tvb, pinfo, zdp_tree);
1180
30
            break;
1181
79
        case ZBEE_ZDP_REQ_END_DEVICE_BIND:
1182
79
            dissect_zbee_zdp_req_end_device_bind(zdp_tvb, pinfo, zdp_tree, nwk->version);
1183
79
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1184
79
            break;
1185
34
        case ZBEE_ZDP_REQ_BIND:
1186
34
            dissect_zbee_zdp_req_bind(zdp_tvb, pinfo, zdp_tree, nwk->version);
1187
34
            break;
1188
1
        case ZBEE_ZDP_REQ_UNBIND:
1189
1
            dissect_zbee_zdp_req_unbind(zdp_tvb, pinfo, zdp_tree, nwk->version);
1190
1
            break;
1191
4
        case ZBEE_ZDP_REQ_BIND_REGISTER:
1192
4
            dissect_zbee_zdp_req_bind_register(zdp_tvb, pinfo, zdp_tree);
1193
4
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1194
4
            break;
1195
42
        case ZBEE_ZDP_REQ_REPLACE_DEVICE:
1196
42
            dissect_zbee_zdp_req_replace_device(zdp_tvb, pinfo, zdp_tree);
1197
42
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1198
42
            break;
1199
42
        case ZBEE_ZDP_REQ_STORE_BAK_BIND_ENTRY:
1200
42
            dissect_zbee_zdp_req_store_bak_bind_entry(zdp_tvb, pinfo, zdp_tree, nwk->version);
1201
42
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1202
42
            break;
1203
25
        case ZBEE_ZDP_REQ_REMOVE_BAK_BIND_ENTRY:
1204
25
            dissect_zbee_zdp_req_remove_bak_bind_entry(zdp_tvb, pinfo, zdp_tree, nwk->version);
1205
25
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1206
25
            break;
1207
67
        case ZBEE_ZDP_REQ_BACKUP_BIND_TABLE:
1208
67
            dissect_zbee_zdp_req_backup_bind_table(zdp_tvb, pinfo, zdp_tree, nwk->version);
1209
67
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1210
67
            break;
1211
18
        case ZBEE_ZDP_REQ_RECOVER_BIND_TABLE:
1212
18
            dissect_zbee_zdp_req_recover_bind_table(zdp_tvb, pinfo, zdp_tree);
1213
18
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1214
18
            break;
1215
15
        case ZBEE_ZDP_REQ_BACKUP_SOURCE_BIND:
1216
15
            dissect_zbee_zdp_req_backup_source_bind(zdp_tvb, pinfo, zdp_tree);
1217
15
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1218
15
            break;
1219
37
        case ZBEE_ZDP_REQ_RECOVER_SOURCE_BIND:
1220
37
            dissect_zbee_zdp_req_recover_source_bind(zdp_tvb, pinfo, zdp_tree);
1221
37
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1222
37
            break;
1223
101
        case ZBEE_ZDP_REQ_CLEAR_ALL_BINDINGS:
1224
101
            dissect_zbee_zdp_req_clear_all_bindings(zdp_tvb, pinfo, zdp_tree);
1225
101
            break;
1226
81
        case ZBEE_ZDP_REQ_MGMT_NWK_DISC:
1227
81
            dissect_zbee_zdp_req_mgmt_nwk_disc(zdp_tvb, pinfo, zdp_tree, hf_zbee_zdp_scan_channel);
1228
81
            break;
1229
15
        case ZBEE_ZDP_REQ_MGMT_LQI:
1230
15
            dissect_zbee_zdp_req_mgmt_lqi(zdp_tvb, pinfo, zdp_tree);
1231
15
            break;
1232
36
        case ZBEE_ZDP_REQ_MGMT_RTG:
1233
36
            dissect_zbee_zdp_req_mgmt_rtg(zdp_tvb, pinfo, zdp_tree);
1234
36
            break;
1235
20
        case ZBEE_ZDP_REQ_MGMT_BIND:
1236
20
            dissect_zbee_zdp_req_mgmt_bind(zdp_tvb, pinfo, zdp_tree);
1237
20
            break;
1238
47
        case ZBEE_ZDP_REQ_MGMT_LEAVE:
1239
47
            dissect_zbee_zdp_req_mgmt_leave(zdp_tvb, pinfo, zdp_tree, nwk->version);
1240
47
            break;
1241
25
        case ZBEE_ZDP_REQ_MGMT_DIRECT_JOIN:
1242
25
            dissect_zbee_zdp_req_mgmt_direct_join(zdp_tvb, pinfo, zdp_tree);
1243
25
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1244
25
            break;
1245
41
        case ZBEE_ZDP_REQ_MGMT_PERMIT_JOIN:
1246
41
            dissect_zbee_zdp_req_mgmt_permit_join(zdp_tvb, pinfo, zdp_tree);
1247
41
            break;
1248
2
        case ZBEE_ZDP_REQ_MGMT_CACHE:
1249
2
            dissect_zbee_zdp_req_mgmt_cache(zdp_tvb, pinfo, zdp_tree);
1250
2
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1251
2
            break;
1252
73
        case ZBEE_ZDP_REQ_MGMT_NWKUPDATE:
1253
73
            dissect_zbee_zdp_req_mgmt_nwkupdate(zdp_tvb, pinfo, zdp_tree);
1254
73
            break;
1255
132
        case ZBEE_ZDP_REQ_MGMT_NWKUPDATE_ENH:
1256
132
            dissect_zbee_zdp_req_mgmt_nwkupdate_enh(zdp_tvb, pinfo, zdp_tree);
1257
132
            break;
1258
20
        case ZBEE_ZDP_REQ_MGMT_IEEE_JOIN_LIST:
1259
20
            dissect_zbee_zdp_req_mgmt_ieee_join_list(zdp_tvb, pinfo, zdp_tree);
1260
20
            break;
1261
86
        case ZBEE_ZDP_REQ_MGMT_NWK_BEACON_SURVEY:
1262
86
            dissect_zbee_zdp_req_mgmt_nwk_beacon_survey(zdp_tvb, pinfo, zdp_tree);
1263
86
            break;
1264
31
        case ZBEE_ZDP_REQ_SECURITY_START_KEY_NEGOTIATION:
1265
31
            dissect_zbee_zdp_req_security_start_key_negotiation(zdp_tvb, pinfo, zdp_tree);
1266
31
            break;
1267
47
        case ZBEE_ZDP_REQ_SECURITY_GET_AUTH_TOKEN:
1268
47
            dissect_zbee_zdp_req_security_get_auth_token(zdp_tvb, pinfo, zdp_tree);
1269
47
            break;
1270
11
        case ZBEE_ZDP_REQ_SECURITY_GET_AUTH_LEVEL:
1271
11
            dissect_zbee_zdp_req_security_get_auth_level(zdp_tvb, pinfo, zdp_tree);
1272
11
            break;
1273
0
        case ZBEE_ZDP_REQ_SECURITY_SET_CONFIGURATION:
1274
0
            dissect_zbee_zdp_req_security_set_configuration(zdp_tvb, pinfo, zdp_tree);
1275
0
            break;
1276
9
        case ZBEE_ZDP_REQ_SECURITY_GET_CONFIGURATION:
1277
9
            dissect_zbee_zdp_req_security_get_configuration(zdp_tvb, pinfo, zdp_tree);
1278
9
            break;
1279
12
        case ZBEE_ZDP_REQ_SECURITY_START_KEY_UPDATE:
1280
12
            dissect_zbee_zdp_req_security_start_key_update(zdp_tvb, pinfo, zdp_tree);
1281
12
            break;
1282
41
        case ZBEE_ZDP_REQ_SECURITY_DECOMMISSION:
1283
41
            dissect_zbee_zdp_req_security_decommission(zdp_tvb, pinfo, zdp_tree);
1284
41
            break;
1285
38
        case ZBEE_ZDP_REQ_SECURITY_CHALLENGE:
1286
38
            dissect_zbee_zdp_req_security_challenge(zdp_tvb, pinfo, zdp_tree);
1287
38
            break;
1288
94
        case ZBEE_ZDP_RSP_NWK_ADDR:
1289
94
            dissect_zbee_zdp_rsp_nwk_addr(zdp_tvb, pinfo, zdp_tree);
1290
94
            break;
1291
106
        case ZBEE_ZDP_RSP_IEEE_ADDR:
1292
106
            dissect_zbee_zdp_rsp_ext_addr(zdp_tvb, pinfo, zdp_tree);
1293
106
            break;
1294
52
        case ZBEE_ZDP_RSP_NODE_DESC:
1295
52
            dissect_zbee_zdp_rsp_node_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
1296
52
            break;
1297
21
        case ZBEE_ZDP_RSP_POWER_DESC:
1298
21
            dissect_zbee_zdp_rsp_power_desc(zdp_tvb, pinfo, zdp_tree);
1299
21
            break;
1300
8
        case ZBEE_ZDP_RSP_SIMPLE_DESC:
1301
8
            dissect_zbee_zdp_rsp_simple_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
1302
8
            break;
1303
7
        case ZBEE_ZDP_RSP_ACTIVE_EP:
1304
7
            dissect_zbee_zdp_rsp_active_ep(zdp_tvb, pinfo, zdp_tree);
1305
7
            break;
1306
37
        case ZBEE_ZDP_RSP_MATCH_DESC:
1307
37
            dissect_zbee_zdp_rsp_match_desc(zdp_tvb, pinfo, zdp_tree);
1308
37
            break;
1309
199
        case ZBEE_ZDP_RSP_COMPLEX_DESC:
1310
199
            dissect_zbee_zdp_rsp_complex_desc(zdp_tvb, pinfo, zdp_tree);
1311
199
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1312
199
            break;
1313
34
        case ZBEE_ZDP_RSP_USER_DESC:
1314
34
            dissect_zbee_zdp_rsp_user_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
1315
34
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1316
34
            break;
1317
22
        case ZBEE_ZDP_RSP_DISCOVERY_CACHE:
1318
22
            dissect_zbee_zdp_rsp_discovery_cache(zdp_tvb, pinfo, zdp_tree);
1319
22
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1320
22
            break;
1321
20
        case ZBEE_ZDP_RSP_CONF_USER_DESC:
1322
20
            dissect_zbee_zdp_rsp_user_desc_conf(zdp_tvb, pinfo, zdp_tree, nwk->version);
1323
20
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1324
20
            break;
1325
5
        case ZBEE_ZDP_RSP_SYSTEM_SERVER_DISC:
1326
5
            dissect_zbee_zdp_rsp_system_server_disc(zdp_tvb, pinfo, zdp_tree);
1327
5
            break;
1328
0
        case ZBEE_ZDP_RSP_STORE_DISCOVERY:
1329
0
            dissect_zbee_zdp_rsp_discovery_store(zdp_tvb, pinfo, zdp_tree);
1330
0
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1331
0
            break;
1332
27
        case ZBEE_ZDP_RSP_STORE_NODE_DESC:
1333
27
            dissect_zbee_zdp_rsp_store_node_desc(zdp_tvb, pinfo, zdp_tree);
1334
27
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1335
27
            break;
1336
7
        case ZBEE_ZDP_RSP_STORE_POWER_DESC:
1337
7
            dissect_zbee_zdp_rsp_store_power_desc(zdp_tvb, pinfo, zdp_tree);
1338
7
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1339
7
            break;
1340
0
        case ZBEE_ZDP_RSP_STORE_ACTIVE_EP:
1341
0
            dissect_zbee_zdp_rsp_store_active_ep(zdp_tvb, pinfo, zdp_tree);
1342
0
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1343
0
            break;
1344
1
        case ZBEE_ZDP_RSP_STORE_SIMPLE_DESC:
1345
1
            dissect_zbee_zdp_rsp_store_simple_desc(zdp_tvb, pinfo, zdp_tree);
1346
1
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1347
1
            break;
1348
24
        case ZBEE_ZDP_RSP_REMOVE_NODE_CACHE:
1349
24
            dissect_zbee_zdp_rsp_remove_node_cache(zdp_tvb, pinfo, zdp_tree);
1350
24
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1351
24
            break;
1352
0
        case ZBEE_ZDP_RSP_FIND_NODE_CACHE:
1353
0
            dissect_zbee_zdp_rsp_find_node_cache(zdp_tvb, pinfo, zdp_tree);
1354
0
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1355
0
            break;
1356
55
        case ZBEE_ZDP_RSP_EXT_SIMPLE_DESC:
1357
55
            dissect_zbee_zdp_rsp_ext_simple_desc(zdp_tvb, pinfo, zdp_tree);
1358
55
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1359
55
            break;
1360
195
        case ZBEE_ZDP_RSP_EXT_ACTIVE_EP:
1361
195
            dissect_zbee_zdp_rsp_ext_active_ep(zdp_tvb, pinfo, zdp_tree);
1362
195
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1363
195
            break;
1364
35
        case ZBEE_ZDP_RSP_PARENT_ANNCE:
1365
35
            dissect_zbee_zdp_rsp_parent_annce(zdp_tvb, pinfo, zdp_tree);
1366
35
            break;
1367
22
        case ZBEE_ZDP_RSP_END_DEVICE_BIND:
1368
22
            dissect_zbee_zdp_rsp_end_device_bind(zdp_tvb, pinfo, zdp_tree);
1369
22
            break;
1370
0
        case ZBEE_ZDP_RSP_BIND:
1371
0
            dissect_zbee_zdp_rsp_bind(zdp_tvb, pinfo, zdp_tree);
1372
0
            break;
1373
6
        case ZBEE_ZDP_RSP_UNBIND:
1374
6
            dissect_zbee_zdp_rsp_unbind(zdp_tvb, pinfo, zdp_tree);
1375
6
            break;
1376
87
        case ZBEE_ZDP_RSP_BIND_REGISTER:
1377
87
            dissect_zbee_zdp_rsp_bind_register(zdp_tvb, pinfo, zdp_tree, nwk->version);
1378
87
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1379
87
            break;
1380
0
        case ZBEE_ZDP_RSP_REPLACE_DEVICE:
1381
0
            dissect_zbee_zdp_rsp_replace_device(zdp_tvb, pinfo, zdp_tree);
1382
0
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1383
0
            break;
1384
0
        case ZBEE_ZDP_RSP_STORE_BAK_BIND_ENTRY:
1385
0
            dissect_zbee_zdp_rsp_store_bak_bind_entry(zdp_tvb, pinfo, zdp_tree);
1386
0
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1387
0
            break;
1388
0
        case ZBEE_ZDP_RSP_REMOVE_BAK_BIND_ENTRY:
1389
0
            dissect_zbee_zdp_rsp_remove_bak_bind_entry(zdp_tvb, pinfo, zdp_tree);
1390
0
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1391
0
            break;
1392
1
        case ZBEE_ZDP_RSP_BACKUP_BIND_TABLE:
1393
1
            dissect_zbee_zdp_rsp_backup_bind_table(zdp_tvb, pinfo, zdp_tree);
1394
1
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1395
1
            break;
1396
56
        case ZBEE_ZDP_RSP_RECOVER_BIND_TABLE:
1397
56
            dissect_zbee_zdp_rsp_recover_bind_table(zdp_tvb, pinfo, zdp_tree, nwk->version);
1398
56
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1399
56
            break;
1400
18
        case ZBEE_ZDP_RSP_BACKUP_SOURCE_BIND:
1401
18
            dissect_zbee_zdp_rsp_backup_source_bind(zdp_tvb, pinfo, zdp_tree);
1402
18
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1403
18
            break;
1404
70
        case ZBEE_ZDP_RSP_RECOVER_SOURCE_BIND:
1405
70
            dissect_zbee_zdp_rsp_recover_source_bind(zdp_tvb, pinfo, zdp_tree);
1406
70
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1407
70
            break;
1408
10
        case ZBEE_ZDP_RSP_CLEAR_ALL_BINDINGS:
1409
10
            dissect_zbee_zdp_rsp_clear_all_bindings(zdp_tvb, pinfo, zdp_tree);
1410
10
            break;
1411
130
        case ZBEE_ZDP_RSP_MGMT_NWK_DISC:
1412
130
            dissect_zbee_zdp_rsp_mgmt_nwk_disc(zdp_tvb, pinfo, zdp_tree, nwk->version);
1413
130
            break;
1414
68
        case ZBEE_ZDP_RSP_MGMT_LQI:
1415
68
            dissect_zbee_zdp_rsp_mgmt_lqi(zdp_tvb, pinfo, zdp_tree, nwk->version);
1416
68
            break;
1417
9
        case ZBEE_ZDP_RSP_MGMT_RTG:
1418
9
            dissect_zbee_zdp_rsp_mgmt_rtg(zdp_tvb, pinfo, zdp_tree);
1419
9
            break;
1420
93
        case ZBEE_ZDP_RSP_MGMT_BIND:
1421
93
            dissect_zbee_zdp_rsp_mgmt_bind(zdp_tvb, pinfo, zdp_tree, nwk->version);
1422
93
            break;
1423
23
        case ZBEE_ZDP_RSP_MGMT_LEAVE:
1424
23
            dissect_zbee_zdp_rsp_mgmt_leave(zdp_tvb, pinfo, zdp_tree);
1425
23
            break;
1426
9
        case ZBEE_ZDP_RSP_MGMT_DIRECT_JOIN:
1427
9
            dissect_zbee_zdp_rsp_mgmt_direct_join(zdp_tvb, pinfo, zdp_tree);
1428
9
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1429
9
            break;
1430
21
        case ZBEE_ZDP_RSP_MGMT_PERMIT_JOIN:
1431
21
            dissect_zbee_zdp_rsp_mgmt_permit_join(zdp_tvb, pinfo, zdp_tree);
1432
21
            break;
1433
85
        case ZBEE_ZDP_RSP_MGMT_CACHE:
1434
85
            dissect_zbee_zdp_rsp_mgmt_cache(zdp_tvb, pinfo, zdp_tree);
1435
85
            expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
1436
85
            break;
1437
165
        case ZBEE_ZDP_NOT_MGMT_NWKUPDATE:
1438
171
        case ZBEE_ZDP_NOT_MGMT_NWKUPDATE_ENH:
1439
171
            dissect_zbee_zdp_not_mgmt_nwkupdate(zdp_tvb, pinfo, zdp_tree);
1440
171
            break;
1441
28
        case ZBEE_ZDP_RSP_MGMT_IEEE_JOIN_LIST:
1442
28
            dissect_zbee_zdp_rsp_mgmt_ieee_join_list(zdp_tvb, pinfo, zdp_tree);
1443
28
            break;
1444
0
        case ZBEE_ZDP_NOT_MGMT_UNSOLICITED_NWKUPDATE:
1445
0
            dissect_zbee_zdp_not_mgmt_unsolicited_nwkupdate(zdp_tvb, pinfo, zdp_tree);
1446
0
            break;
1447
160
        case ZBEE_ZDP_RSP_MGMT_NWK_BEACON_SURVEY:
1448
160
            dissect_zbee_zdp_rsp_mgmt_nwk_beacon_survey(zdp_tvb, pinfo, zdp_tree);
1449
160
            break;
1450
10
        case ZBEE_ZDP_RSP_SECURITY_START_KEY_NEGOTIATION:
1451
10
            dissect_zbee_zdp_rsp_security_start_key_negotiation(zdp_tvb, pinfo, zdp_tree);
1452
10
            break;
1453
0
        case ZBEE_ZDP_RSP_SECURITY_GET_AUTH_TOKEN:
1454
0
            dissect_zbee_zdp_rsp_security_get_auth_token(zdp_tvb, pinfo, zdp_tree);
1455
0
            break;
1456
57
        case ZBEE_ZDP_RSP_SECURITY_GET_AUTH_LEVEL:
1457
57
            dissect_zbee_zdp_rsp_security_get_auth_level(zdp_tvb, pinfo, zdp_tree);
1458
57
            break;
1459
58
        case ZBEE_ZDP_RSP_SECURITY_SET_CONFIGURATION:
1460
58
            dissect_zbee_zdp_rsp_security_set_configuration(zdp_tvb, pinfo, zdp_tree);
1461
58
            break;
1462
1
        case ZBEE_ZDP_RSP_SECURITY_GET_CONFIGURATION:
1463
1
            dissect_zbee_zdp_rsp_security_get_configuration(zdp_tvb, pinfo, zdp_tree);
1464
1
            break;
1465
34
        case ZBEE_ZDP_RSP_SECURITY_START_KEY_UPDATE:
1466
34
            dissect_zbee_zdp_rsp_security_start_key_update(zdp_tvb, pinfo, zdp_tree);
1467
34
            break;
1468
7
        case ZBEE_ZDP_RSP_SECURITY_DECOMMISSION:
1469
7
            dissect_zbee_zdp_rsp_security_decommission(zdp_tvb, pinfo, zdp_tree);
1470
7
            break;
1471
3
        case ZBEE_ZDP_RSP_SECURITY_CHALLENGE:
1472
3
            dissect_zbee_zdp_rsp_security_challenge(zdp_tvb, pinfo, zdp_tree);
1473
3
            break;
1474
125
        default:
1475
            /* Invalid Cluster Identifier. */
1476
125
            call_data_dissector(zdp_tvb, pinfo, tree);
1477
125
            break;
1478
4.45k
    } /* switch */
1479
1480
2.18k
    return tvb_captured_length(tvb);
1481
4.45k
} /* dissect_zbee_zdp */
1482
1483
/**
1484
 *ZigBee Device Profile protocol registration routine.
1485
 *
1486
*/
1487
void proto_register_zbee_zdp(void)
1488
14
{
1489
14
    static hf_register_info hf[] = {
1490
14
        { &hf_zbee_zdp_seqno,
1491
14
        { "Sequence Number",            "zbee_zdp.seqno", FT_UINT8, BASE_DEC, NULL, 0x0,
1492
14
            NULL, HFILL }},
1493
1494
#if 0
1495
        { &hf_zbee_zdp_length,
1496
        { "Length",                     "zbee_zdp.length", FT_UINT8, BASE_DEC, NULL, 0x0,
1497
            NULL, HFILL }},
1498
#endif
1499
1500
14
        { &hf_zbee_zdp_ext_addr,
1501
14
        { "Extended Address",           "zbee_zdp.ext_addr", FT_EUI64, BASE_NONE, NULL, 0x0,
1502
14
            NULL, HFILL }},
1503
1504
14
        { &hf_zbee_zdp_nwk_addr,
1505
14
        { "Nwk Addr of Interest",       "zbee_zdp.nwk_addr", FT_UINT16, BASE_HEX, NULL, 0x0,
1506
14
            NULL, HFILL }},
1507
1508
14
        { &hf_zbee_zdp_req_type,
1509
14
        { "Request Type",               "zbee_zdp.req_type", FT_UINT8, BASE_DEC, VALS(zbee_zdp_req_types), 0x0,
1510
14
            NULL, HFILL }},
1511
1512
14
        { &hf_zbee_zdp_index,
1513
14
        { "Index",                      "zbee_zdp.index", FT_UINT8, BASE_DEC, NULL, 0x0,
1514
14
            NULL, HFILL }},
1515
1516
14
        { &hf_zbee_zdp_status,
1517
14
        { "Status",                     "zbee_zdp.status", FT_UINT8, BASE_HEX, VALS(zbee_zdp_status_names), 0x0,
1518
14
            NULL, HFILL }},
1519
1520
14
        { &hf_zbee_zdp_endpoint,
1521
14
        { "Endpoint",                   "zbee_zdp.endpoint", FT_UINT8, BASE_DEC, NULL, 0x0,
1522
14
            NULL, HFILL }},
1523
1524
14
        { &hf_zbee_zdp_ep_count,
1525
14
        { "Endpoint Count",             "zbee_zdp.ep_count", FT_UINT8, BASE_DEC, NULL, 0x0,
1526
14
            NULL, HFILL }},
1527
1528
14
        { &hf_zbee_zdp_profile,
1529
14
        { "Profile",                    "zbee_zdp.profile", FT_UINT16, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_aps_apid_names), 0x0,
1530
14
            NULL, HFILL }},
1531
1532
14
        { &hf_zbee_zdp_addr_mode,
1533
14
        { "Address Mode",               "zbee_zdp.addr_mode", FT_UINT8, BASE_DEC | BASE_RANGE_STRING, RVALS(zbee_zcl_zdp_address_modes), 0x0,
1534
14
            NULL, HFILL }},
1535
1536
14
        { &hf_zbee_zdp_cluster,
1537
14
        { "Cluster",                    "zbee_zdp.cluster", FT_UINT16, BASE_HEX, NULL, 0x0,
1538
14
            NULL, HFILL }},
1539
1540
14
        { &hf_zbee_zdp_table_size,
1541
14
        { "Table Size",                 "zbee_zdp.table_size", FT_UINT16, BASE_DEC, NULL, 0x0,
1542
14
            "Number of entries in the table.", HFILL }},
1543
1544
14
        { &hf_zbee_zdp_table_count,
1545
14
        { "Table Count",                "zbee_zdp.table_count", FT_UINT16, BASE_DEC, NULL, 0x0,
1546
14
            "Number of table entries included in this message.", HFILL }},
1547
1548
14
        { &hf_zbee_zdp_cache_address,
1549
14
        { "Cache Address",                "zbee_zdp.cache_address", FT_EUI64, BASE_NONE, NULL, 0x0,
1550
14
            NULL, HFILL }},
1551
1552
14
        { &hf_zbee_zdp_in_count,
1553
14
        { "Input Cluster Count",        "zbee_zdp.in_count", FT_UINT8, BASE_DEC, NULL, 0x0,
1554
14
            NULL, HFILL }},
1555
1556
14
        { &hf_zbee_zdp_out_count,
1557
14
        { "Output Cluster Count",       "zbee_zdp.out_count", FT_UINT8, BASE_DEC, NULL, 0x0,
1558
14
            NULL, HFILL }},
1559
1560
14
        { &hf_zbee_zdp_in_cluster,
1561
14
        { "Input Cluster",              "zbee_zdp.in_cluster", FT_UINT16, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_aps_cid_names), 0x0,
1562
14
            NULL, HFILL }},
1563
1564
14
        { &hf_zbee_zdp_out_cluster,
1565
14
        { "Output Cluster",             "zbee_zdp.out_cluster", FT_UINT16, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_aps_cid_names), 0x0,
1566
14
            NULL, HFILL }},
1567
1568
14
        { &hf_zbee_zdp_assoc_device_count,
1569
14
        { "Associated Device Count",    "zbee_zdp.assoc_device_count", FT_UINT8, BASE_DEC, NULL, 0x0,
1570
14
            NULL, HFILL }},
1571
1572
14
        { &hf_zbee_zdp_assoc_device,
1573
14
        { "Associated Device",          "zbee_zdp.assoc_device", FT_UINT16, BASE_HEX, NULL, 0x0,
1574
14
            NULL, HFILL }},
1575
1576
14
        { &hf_zbee_zdp_cinfo,
1577
14
        { "Capability Information",    "zbee_zdp.cinfo", FT_UINT8, BASE_HEX, NULL, 0x0,
1578
14
            NULL, HFILL }},
1579
1580
14
        { &hf_zbee_zdp_cinfo_alt_coord,
1581
14
        { "Alternate Coordinator",      "zbee_zdp.cinfo.alt_coord", FT_BOOLEAN, 8, NULL, ZBEE_CINFO_ALT_COORD,
1582
14
            "Indicates that the device is able to operate as a PAN coordinator.", HFILL }},
1583
1584
14
        { &hf_zbee_zdp_cinfo_ffd,
1585
14
        { "Full-Function Device",       "zbee_zdp.cinfo.ffd", FT_BOOLEAN, 8, NULL, ZBEE_CINFO_FFD,
1586
14
            NULL, HFILL }},
1587
1588
14
        { &hf_zbee_zdp_cinfo_power,
1589
14
        { "AC Power",                   "zbee_zdp.cinfo.power", FT_BOOLEAN, 8, NULL, ZBEE_CINFO_POWER,
1590
14
            "Indicates this device is using AC/Mains power.", HFILL }},
1591
1592
14
        { &hf_zbee_zdp_cinfo_idle_rx,
1593
14
        { "Rx On When Idle",            "zbee_zdp.cinfo.idle_rx", FT_BOOLEAN, 8, NULL, ZBEE_CINFO_IDLE_RX,
1594
14
            "Indicates the receiver is active when the device is idle.", HFILL }},
1595
1596
14
        { &hf_zbee_zdp_cinfo_security,
1597
14
        { "Security Capability",        "zbee_zdp.cinfo.security", FT_BOOLEAN, 8, NULL, ZBEE_CINFO_SECURITY,
1598
14
            "Indicates this device is capable of performing encryption/decryption.", HFILL }},
1599
1600
14
        { &hf_zbee_zdp_cinfo_alloc,
1601
14
        { "Allocate Short Address",     "zbee_zdp.cinfo.alloc", FT_BOOLEAN, 8, NULL, ZBEE_CINFO_ALLOC,
1602
14
            "Flag requesting the parent to allocate a short address for this device.", HFILL }},
1603
1604
14
        { &hf_zbee_zdp_dcf,
1605
14
        { "Descriptor Capability Field", "zbee_zdp.dcf", FT_UINT8, BASE_HEX, NULL, 0,
1606
14
            NULL, HFILL }},
1607
1608
14
        { &hf_zbee_zdp_dcf_eaela,
1609
14
        { "Extended Active Endpoint List Available", "zbee_zdp.dcf.eaela", FT_BOOLEAN, 8, NULL, ZBEE_ZDP_DCF_EAELA,
1610
14
            NULL, HFILL }},
1611
1612
14
        { &hf_zbee_zdp_dcf_esdla,
1613
14
        { "Extended Simple Descriptor List Available", "zbee_zdp.dcf.esdla", FT_BOOLEAN, 8, NULL, ZBEE_ZDP_DCF_ESDLA,
1614
14
            NULL, HFILL }},
1615
1616
14
        { &hf_zbee_zdp_server,
1617
14
        { "Server Flags",          "zbee_zdp.server", FT_UINT16, BASE_HEX, NULL, 0x0,
1618
14
            NULL, HFILL }},
1619
1620
14
        { &hf_zbee_zdp_server_pri_trust,
1621
14
        { "Primary Trust Center",       "zbee_zdp.server.pri_trust", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_SERVER_PRIMARY_TRUST,
1622
14
            NULL, HFILL }},
1623
1624
14
        { &hf_zbee_zdp_server_bak_trust,
1625
14
        { "Backup Trust Center",        "zbee_zdp.server.bak_trust", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_SERVER_BACKUP_TRUST,
1626
14
            NULL, HFILL }},
1627
1628
14
        { &hf_zbee_zdp_server_pri_bind,
1629
14
        { "Primary Binding Table Cache","zbee_zdp.server.pri_bind", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_SERVER_PRIMARY_BIND,
1630
14
            NULL, HFILL }},
1631
1632
14
        { &hf_zbee_zdp_server_bak_bind,
1633
14
        { "Backup Binding Table Cache", "zbee_zdp.server.bak_bind", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_SERVER_BACKUP_BIND,
1634
14
            NULL, HFILL }},
1635
1636
14
        { &hf_zbee_zdp_server_pri_disc,
1637
14
        { "Primary Discovery Cache",    "zbee_zdp.server.pri_disc", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_SERVER_PRIMARY_DISC,
1638
14
            NULL, HFILL }},
1639
1640
14
        { &hf_zbee_zdp_server_bak_disc,
1641
14
        { "Backup Discovery Cache",     "zbee_zdp.server.bak_disc", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_SERVER_BACKUP_DISC,
1642
14
            NULL, HFILL }},
1643
1644
14
        { &hf_zbee_zdp_server_network_manager,
1645
14
        { "Network Manager",     "zbee_zdp.server.nwk_mgr", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_SERVER_NETWORK_MANAGER,
1646
14
            NULL, HFILL }},
1647
1648
14
        { &hf_zbee_zdp_server_stk_compl_rev,
1649
14
          { "Stack Compliance Revision",   "zbee_zdp.server.stack_compliance_revision", FT_UINT16, BASE_DEC, NULL, ZBEE_ZDP_NODE_SERVER_STACK_COMPL_REV,
1650
14
            NULL, HFILL }},
1651
1652
14
        { &hf_zbee_zdp_node_type,
1653
14
        { "Type",                       "zbee_zdp.node.type", FT_UINT16, BASE_DEC, NULL, ZBEE_ZDP_NODE_TYPE,
1654
14
            NULL, HFILL }},
1655
1656
14
        { &hf_zbee_zdp_node_complex,
1657
14
        { "Complex Descriptor",         "zbee_zdp.node.complex", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_COMPLEX,
1658
14
            NULL, HFILL }},
1659
1660
14
        { &hf_zbee_zdp_node_user,
1661
14
        { "User Descriptor",            "zbee_zdp.node.user", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_USER,
1662
14
            NULL, HFILL }},
1663
1664
14
        { &hf_zbee_zdp_node_frag_support,
1665
14
        { "Fragmentation Supported",    "zbee_zdp.node.frag_support", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FRAG_SUPPORT,
1666
14
            NULL, HFILL }},
1667
1668
14
        { &hf_zbee_zdp_node_freq_868,
1669
14
        { "868MHz BPSK Band",           "zbee_zdp.node.freq.868mhz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_868MHZ,
1670
14
            NULL, HFILL }},
1671
1672
14
        { &hf_zbee_zdp_node_freq_900,
1673
14
        { "900MHz BPSK Band",           "zbee_zdp.node.freq.900mhz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_900MHZ,
1674
14
            NULL, HFILL }},
1675
1676
14
        { &hf_zbee_zdp_node_freq_2400,
1677
14
        { "2.4GHz OQPSK Band",          "zbee_zdp.node.freq.2400mhz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_2400MHZ,
1678
14
            NULL, HFILL }},
1679
1680
14
        { &hf_zbee_zdp_node_freq_eu_sub_ghz,
1681
14
        { "EU Sub-GHz FSK Band",        "zbee_zdp.node.freq.eu_sub_ghz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_EU_SUB_GHZ,
1682
14
            NULL, HFILL }},
1683
1684
14
        { &hf_zbee_zdp_node_manufacturer,
1685
14
        { "Manufacturer Code",          "zbee_zdp.node.manufacturer", FT_UINT16, BASE_HEX, NULL, 0x0,
1686
14
            NULL, HFILL }},
1687
1688
14
        { &hf_zbee_zdp_node_max_buffer,
1689
14
        { "Max Buffer Size",            "zbee_zdp.node.max_buffer", FT_UINT8, BASE_DEC, NULL, 0x0,
1690
14
            NULL, HFILL }},
1691
1692
14
        { &hf_zbee_zdp_node_max_incoming_transfer,
1693
14
        { "Max Incoming Transfer Size", "zbee_zdp.node.max_incoming_transfer", FT_UINT16, BASE_DEC, NULL, 0x0,
1694
14
            NULL, HFILL }},
1695
1696
14
        { &hf_zbee_zdp_node_max_outgoing_transfer,
1697
14
        { "Max Outgoing Transfer Size", "zbee_zdp.node.max_outgoing_transfer", FT_UINT16, BASE_DEC, NULL, 0x0,
1698
14
            NULL, HFILL }},
1699
1700
14
        { &hf_zbee_zdp_power,
1701
14
        { "Power Descriptor", "zbee_zdp.power", FT_UINT16, BASE_HEX, NULL, 0x0,
1702
14
            NULL, HFILL }},
1703
1704
14
        { &hf_zbee_zdp_power_mode,
1705
14
        { "Mode",                       "zbee_zdp.power.mode", FT_UINT16, BASE_DEC, VALS(zbee_zdp_power_mode_vals), ZBEE_ZDP_POWER_MODE,
1706
14
            NULL, HFILL }},
1707
1708
14
        { &hf_zbee_zdp_power_avail_ac,
1709
14
        { "Available AC Power",         "zbee_zdp.power.avail.ac", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_POWER_AVAIL_AC,
1710
14
            NULL, HFILL }},
1711
1712
14
        { &hf_zbee_zdp_power_avail_recharge,
1713
14
        { "Available Rechargeable Battery", "zbee_zdp.power.avail.rech", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_POWER_AVAIL_RECHARGEABLE,
1714
14
            NULL, HFILL }},
1715
1716
14
        { &hf_zbee_zdp_power_avail_dispose,
1717
14
        { "Available Disposable Battery",  "zbee_zdp.power.avail.disp", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_POWER_AVAIL_DISPOSABLE,
1718
14
            NULL, HFILL }},
1719
1720
14
        { &hf_zbee_zdp_power_source_ac,
1721
14
        { "Using AC Power",             "zbee_zdp.power.source.ac", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_POWER_SOURCE_AC,
1722
14
            NULL, HFILL }},
1723
1724
14
        { &hf_zbee_zdp_power_source_recharge,
1725
14
        { "Using Rechargeable Battery", "zbee_zdp.power.source.recharge", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_POWER_SOURCE_RECHARGEABLE,
1726
14
            NULL, HFILL }},
1727
1728
14
        { &hf_zbee_zdp_power_source_dispose,
1729
14
        { "Using Disposable Battery",  "zbee_zdp.power.source.dispose", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_POWER_SOURCE_DISPOSABLE,
1730
14
            NULL, HFILL }},
1731
1732
14
        { &hf_zbee_zdp_power_level,
1733
14
        { "Level",                      "zbee_zdp.power.level", FT_UINT16, BASE_DEC, VALS(zbee_zdp_power_level_vals), ZBEE_ZDP_POWER_LEVEL,
1734
14
            NULL, HFILL }},
1735
1736
14
        { &hf_zbee_zdp_simple_app_device,
1737
14
        { "Application Device",         "zbee_zdp.app.device", FT_UINT16, BASE_HEX, NULL, 0x0,
1738
14
            NULL, HFILL }},
1739
1740
14
        { &hf_zbee_zdp_simple_zll_app_device,
1741
14
        { "Application Device",         "zbee_zdp.app.device", FT_UINT16, BASE_HEX, VALS(zbee_zll_device_names), 0x0,
1742
14
            NULL, HFILL }},
1743
1744
14
        { &hf_zbee_zdp_simple_ha_app_device,
1745
14
        { "Application Device",         "zbee_zdp.app.device", FT_UINT16, BASE_HEX, VALS(zbee_ha_device_names), 0x0,
1746
14
            NULL, HFILL }},
1747
1748
14
        { &hf_zbee_zdp_simple_app_version,
1749
14
        { "Application Version",        "zbee_zdp.app.version", FT_UINT16, BASE_HEX, NULL, 0x0,
1750
14
            NULL, HFILL }},
1751
1752
14
        { &hf_zbee_zdp_complex_length,
1753
14
        { "Complex Descriptor Length",  "zbee_zdp.complex_length", FT_UINT8, BASE_DEC, NULL, 0x0,
1754
14
            NULL, HFILL }},
1755
1756
14
        { &hf_zbee_zdp_complex,
1757
14
        { "Complex Descriptor",         "zbee_zdp.complex", FT_STRING, BASE_NONE, NULL, 0x0,
1758
14
            NULL, HFILL }},
1759
1760
14
        { &hf_zbee_zdp_user,
1761
14
        { "User Descriptor",            "zbee_zdp.user", FT_STRING, BASE_NONE, NULL, 0x0,
1762
14
            NULL, HFILL }},
1763
1764
14
        { &hf_zbee_zdp_user_length,
1765
14
        { "User Descriptor Length",     "zbee_zdp.user_length", FT_UINT8, BASE_DEC, NULL, 0x0,
1766
14
            NULL, HFILL }},
1767
1768
14
        { &hf_zbee_zdp_simple_length,
1769
14
        { "Simple Descriptor Length",   "zbee_zdp.simple_length", FT_UINT8, BASE_DEC, NULL, 0x0,
1770
14
            NULL, HFILL }},
1771
1772
14
        { &hf_zbee_zdp_disc_node_size,
1773
14
        { "Node Descriptor Size",       "zbee_zdp.node_size", FT_UINT8, BASE_DEC, NULL, 0x0,
1774
14
            NULL, HFILL }},
1775
1776
14
        { &hf_zbee_zdp_disc_power_size,
1777
14
        { "Power Descriptor Size",      "zbee_zdp.power_size", FT_UINT8, BASE_DEC, NULL, 0x0,
1778
14
            NULL, HFILL }},
1779
1780
14
        { &hf_zbee_zdp_cache,
1781
14
        { "Cache",                      "zbee_zdp.cache", FT_UINT16, BASE_HEX, NULL, 0x0,
1782
14
            "Address of the device containing the discovery cache.", HFILL }},
1783
1784
14
        { &hf_zbee_zdp_disc_ep_count,
1785
14
        { "Active Endpoint Count",      "zbee_zdp.ep_count", FT_UINT8, BASE_DEC, NULL, 0x0,
1786
14
            NULL, HFILL }},
1787
1788
14
        { &hf_zbee_zdp_disc_simple_count,
1789
14
        { "Simple Descriptor Count",    "zbee_zdp.simple_count", FT_UINT8, BASE_DEC, NULL, 0x0,
1790
14
            NULL, HFILL }},
1791
1792
14
        { &hf_zbee_zdp_disc_simple_size,
1793
14
        { "Simple Descriptor Size",     "zbee_zdp.simple_size", FT_UINT8, BASE_DEC, NULL, 0x0,
1794
14
            NULL, HFILL }},
1795
1796
14
        { &hf_zbee_zdp_target,
1797
14
        { "Target",                     "zbee_zdp.target", FT_UINT16, BASE_HEX, NULL, 0x0,
1798
14
            NULL, HFILL }},
1799
1800
14
        { &hf_zbee_zdp_replacement,
1801
14
        { "Replacement",                "zbee_zdp.replacement", FT_EUI64, BASE_NONE, NULL, 0x0,
1802
14
            NULL, HFILL }},
1803
1804
14
        { &hf_zbee_zdp_replacement_ep,
1805
14
        { "Replacement Endpoint",       "zbee_zdp.replacement_ep", FT_UINT8, BASE_DEC, NULL, 0x0,
1806
14
            NULL, HFILL }},
1807
1808
14
        { &hf_zbee_zdp_bind_src,
1809
14
        { "Source",                     "zbee_zdp.bind.src", FT_UINT16, BASE_HEX, NULL, 0x0,
1810
14
            NULL, HFILL }},
1811
1812
14
        { &hf_zbee_zdp_bind_src64,
1813
14
        { "Source",                     "zbee_zdp.bind.src64", FT_EUI64, BASE_NONE, NULL, 0x0,
1814
14
            NULL, HFILL }},
1815
1816
14
        { &hf_zbee_zdp_bind_src_ep,
1817
14
        { "Source Endpoint",            "zbee_zdp.bind.src_ep", FT_UINT8, BASE_DEC, NULL, 0x0,
1818
14
            NULL, HFILL }},
1819
1820
14
        { &hf_zbee_zdp_bind_dst,
1821
14
        { "Destination",                "zbee_zdp.bind.dst", FT_UINT16, BASE_HEX, NULL, 0x0,
1822
14
            NULL, HFILL }},
1823
1824
14
        { &hf_zbee_zdp_bind_dst64,
1825
14
        { "Destination",                "zbee_zdp.bind.dst64", FT_EUI64, BASE_NONE, NULL, 0x0,
1826
14
            NULL, HFILL }},
1827
1828
14
        { &hf_zbee_zdp_bind_dst_ep,
1829
14
        { "Destination Endpoint",       "zbee_zdp.bind.dst_ep", FT_UINT8, BASE_DEC, NULL, 0x0,
1830
14
            NULL, HFILL }},
1831
1832
14
        { &hf_zbee_zdp_duration,
1833
14
        { "Duration",                   "zbee_zdp.duration", FT_UINT8, BASE_DEC, NULL, 0x0,
1834
14
            NULL, HFILL }},
1835
1836
14
        { &hf_zbee_zdp_leave_children,
1837
14
        { "Remove Children",            "zbee_zdp.leave.children", FT_BOOLEAN, 8, NULL, ZBEE_ZDP_MGMT_LEAVE_CHILDREN,
1838
14
            NULL, HFILL }},
1839
1840
14
        { &hf_zbee_zdp_leave_rejoin,
1841
14
        { "Rejoin",                     "zbee_zdp.leave.rejoin", FT_BOOLEAN, 8, NULL, ZBEE_ZDP_MGMT_LEAVE_REJOIN,
1842
14
            NULL, HFILL }},
1843
1844
14
        { &hf_zbee_zdp_significance,
1845
14
        { "Significance",               "zbee_zdp.significance", FT_UINT8, BASE_DEC, NULL, 0x0,
1846
14
            NULL, HFILL }},
1847
1848
14
        { &hf_zbee_zdp_scan_count,
1849
14
        { "Scan Count",                 "zbee_zdp.scan_count", FT_UINT8, BASE_DEC, NULL, 0x0,
1850
14
            NULL, HFILL }},
1851
1852
14
        { &hf_zbee_zdp_update_id,
1853
14
        { "Update ID",                  "zbee_zdp.update_id", FT_UINT8, BASE_DEC, NULL, 0x0,
1854
14
            NULL, HFILL }},
1855
1856
14
        { &hf_zbee_zdp_manager,
1857
14
        { "Network Manager",            "zbee_zdp.manager", FT_UINT16, BASE_HEX, NULL, 0x0,
1858
14
            NULL, HFILL }},
1859
1860
14
        { &hf_zbee_zdp_tx_total,
1861
14
        { "Total Transmissions",        "zbee_zdp.tx_total", FT_UINT16, BASE_DEC, NULL, 0x0,
1862
14
            NULL, HFILL }},
1863
1864
14
        { &hf_zbee_zdp_tx_fail,
1865
14
        { "Failed Transmissions",       "zbee_zdp.tx_fail", FT_UINT16, BASE_DEC, NULL, 0x0,
1866
14
            NULL, HFILL }},
1867
1868
14
        { &hf_zbee_zdp_tx_retries,
1869
14
        { "Retried Transmissions",       "zbee_zdp.tx_retries", FT_UINT16, BASE_DEC, NULL, 0x0,
1870
14
            NULL, HFILL }},
1871
1872
14
        { &hf_zbee_zdp_period_time_results,
1873
14
        { "Period of Time For Results",  "zbee_zdp.period_time_results", FT_UINT8, BASE_DEC, NULL, 0x0,
1874
14
            NULL, HFILL }},
1875
1876
14
        { &hf_zbee_zdp_channel_count,
1877
14
        { "Channel List Count",         "zbee_zdp.channel_count", FT_UINT8, BASE_DEC, NULL, 0x0,
1878
14
            NULL, HFILL }},
1879
1880
14
        { &hf_zbee_zdp_channel_page_count,
1881
14
        { "Channel Page Count",         "zbee_zdp.channel_page_count", FT_UINT8, BASE_DEC, NULL, 0x0,
1882
14
            NULL, HFILL }},
1883
1884
14
        { &hf_zbee_zdp_channel_page,
1885
14
        { "Channel Page",               "zbee_zdp.channel_page", FT_UINT8, BASE_DEC, NULL, 0x0,
1886
14
            NULL, HFILL }},
1887
1888
14
        { &hf_zbee_zdp_channel_mask,
1889
14
        { "Channels",                   "zbee_zdp.channel_mask", FT_UINT32, BASE_HEX, NULL, 0x0,
1890
14
            NULL, HFILL }},
1891
1892
14
        { &hf_zbee_zdp_channel_energy,
1893
14
        { "Channel Energy",         "zbee_zdp.channel_energy", FT_UINT8, BASE_DEC, NULL, 0x0,
1894
14
            NULL, HFILL }},
1895
1896
14
        { &hf_zbee_zdp_pan_eui64,
1897
14
        { "Pan",         "zbee_zdp.pan.eui64", FT_EUI64, BASE_NONE, NULL, 0x0,
1898
14
            NULL, HFILL }},
1899
1900
14
        { &hf_zbee_zdp_pan_uint,
1901
14
        { "Pan",         "zbee_zdp.pan.uint", FT_UINT16, BASE_HEX, NULL, 0x0,
1902
14
            NULL, HFILL }},
1903
1904
14
        { &hf_zbee_zdp_channel,
1905
14
        { "Channel",         "zbee_zdp.channel", FT_UINT8, BASE_DEC, NULL, 0x0,
1906
14
            NULL, HFILL }},
1907
1908
14
        { &hf_zbee_zdp_nwk_desc_profile,
1909
14
        { "Profile",         "zbee_zdp.profile", FT_UINT16, BASE_HEX, NULL, 0x0F,
1910
14
            NULL, HFILL }},
1911
1912
14
        { &hf_zbee_zdp_profile_version,
1913
14
        { "Version",         "zbee_zdp.profile_version", FT_UINT8, BASE_DEC, NULL, 0xF0,
1914
14
            NULL, HFILL }},
1915
1916
14
        { &hf_zbee_zdp_beacon,
1917
14
        { "Beacon Order",         "zbee_zdp.beacon", FT_UINT8, BASE_DEC, NULL, 0x0F,
1918
14
            NULL, HFILL }},
1919
1920
14
        { &hf_zbee_zdp_superframe,
1921
14
        { "Superframe Order",         "zbee_zdp.superframe", FT_UINT8, BASE_DEC, NULL, 0xF0,
1922
14
            NULL, HFILL }},
1923
1924
14
        { &hf_zbee_zdp_permit_joining,
1925
14
        { "Permit Joining",         "zbee_zdp.permit_joining", FT_UINT8, BASE_DEC, VALS(zbee_zdp_true_false_plus_vals), 0x01,
1926
14
            NULL, HFILL }},
1927
1928
14
        { &hf_zbee_zdp_permit_joining_03,
1929
14
        { "Permit Joining",         "zbee_zdp.permit_joining", FT_UINT8, BASE_DEC, VALS(zbee_zdp_true_false_plus_vals), 0x03,
1930
14
            NULL, HFILL }},
1931
1932
14
        { &hf_zbee_zdp_extended_pan,
1933
14
        { "Extended Pan",         "zbee_zdp.extended_pan", FT_EUI64, BASE_NONE, NULL, 0x0,
1934
14
            NULL, HFILL }},
1935
1936
14
        { &hf_zbee_zdp_addr,
1937
14
        { "Addr",       "zbee_zdp.addr", FT_UINT16, BASE_HEX, NULL, 0x0,
1938
14
            NULL, HFILL }},
1939
1940
14
        { &hf_zbee_zdp_depth,
1941
14
        { "Depth",         "zbee_zdp.depth", FT_UINT8, BASE_DEC, NULL, 0x0,
1942
14
            NULL, HFILL }},
1943
1944
14
        { &hf_zbee_zdp_lqi,
1945
14
        { "LQI",         "zbee_zdp.lqi", FT_UINT8, BASE_DEC, NULL, 0x0,
1946
14
            NULL, HFILL }},
1947
1948
14
        { &hf_zbee_zdp_scan_channel,
1949
14
        { "Scan Channels",         "zbee_zdp.scan_channel", FT_UINT32, BASE_HEX, NULL, 0x0,
1950
14
            NULL, HFILL }},
1951
1952
14
        { &hf_zbee_zdp_table_entry_type,
1953
14
        { "Type",         "zbee_zdp.table_entry_type", FT_UINT8, BASE_DEC, VALS(zbee_zdp_table_entry_type_vals), 0x03,
1954
14
            NULL, HFILL }},
1955
1956
14
        { &hf_zbee_zdp_table_entry_idle_rx_0c,
1957
14
        { "Idle Rx",         "zbee_zdp.idle_rx", FT_UINT8, BASE_DEC, VALS(zbee_zdp_true_false_plus_vals), 0x0c,
1958
14
            NULL, HFILL }},
1959
1960
14
        { &hf_zbee_zdp_table_entry_idle_rx_04,
1961
14
        { "Idle Rx",         "zbee_zdp.idle_rx", FT_UINT8, BASE_DEC, VALS(zbee_zdp_true_false_plus_vals), 0x04,
1962
14
            NULL, HFILL }},
1963
1964
14
        { &hf_zbee_zdp_table_entry_relationship_18,
1965
14
        { "Relationship",         "zbee_zdp.relationship", FT_UINT8, BASE_DEC, VALS(zbee_zdp_relationship_vals), 0x18,
1966
14
            NULL, HFILL }},
1967
1968
14
        { &hf_zbee_zdp_table_entry_relationship_70,
1969
14
        { "Relationship",         "zbee_zdp.relationship", FT_UINT8, BASE_DEC, VALS(zbee_zdp_relationship_vals), 0x70,
1970
14
            NULL, HFILL }},
1971
1972
14
        { &hf_zbee_zdp_rtg,
1973
14
        { "Routing Table",         "zbee_zdp.routing", FT_NONE, BASE_NONE, NULL, 0x0,
1974
14
            NULL, HFILL }},
1975
1976
14
        { &hf_zbee_zdp_rtg_entry,
1977
14
        { "Routing Table Entry",         "zbee_zdp.routing.entry", FT_NONE, BASE_NONE, NULL, 0x0,
1978
14
            NULL, HFILL }},
1979
1980
14
        { &hf_zbee_zdp_rtg_destination,
1981
14
        { "Destination",         "zbee_zdp.routing.destination", FT_UINT16, BASE_HEX, NULL, 0x0,
1982
14
            NULL, HFILL }},
1983
1984
14
        { &hf_zbee_zdp_rtg_status,
1985
14
        { "Status",         "zbee_zdp.routing.status", FT_UINT8, BASE_DEC, VALS(zbee_zdp_rtg_status_vals), 0x0,
1986
14
            NULL, HFILL }},
1987
1988
14
        { &hf_zbee_zdp_rtg_next_hop,
1989
14
        { "Next Hop",         "zbee_zdp.routing.next_hop", FT_UINT16, BASE_HEX, NULL, 0x0,
1990
14
            NULL, HFILL }},
1991
1992
14
        { &hf_zbee_zdp_ieee_join_start_index,
1993
14
        { "Start Index",                "zbee_zdp.ieee_joining_list.start_index", FT_UINT8, BASE_DEC, NULL, 0x0,
1994
14
            NULL, HFILL }},
1995
1996
14
        { &hf_zbee_zdp_ieee_join_update_id,
1997
14
        { "Update Id",                "zbee_zdp.ieee_joining_list.update_id", FT_UINT8, BASE_DEC, NULL, 0x0,
1998
14
            NULL, HFILL }},
1999
2000
14
        { &hf_zbee_zdp_ieee_join_policy,
2001
14
        { "Policy",                "zbee_zdp.ieee_joining_list.policy", FT_UINT8, BASE_DEC, VALS(zbee_zdp_ieee_join_policy_vals), 0x0,
2002
14
            NULL, HFILL }},
2003
2004
14
        { &hf_zbee_zdp_ieee_join_list_total,
2005
14
        { "List Total Count",                "zbee_zdp.ieee_joining_list.total", FT_UINT8, BASE_DEC, NULL, 0x0,
2006
14
            NULL, HFILL }},
2007
2008
14
        { &hf_zbee_zdp_ieee_join_list_start,
2009
14
        { "List Start",                "zbee_zdp.ieee_joining_list.start", FT_UINT8, BASE_DEC, NULL, 0x0,
2010
14
            NULL, HFILL }},
2011
2012
14
        { &hf_zbee_zdp_ieee_join_list_count,
2013
14
        { "List Count",                "zbee_zdp.ieee_joining_list.count", FT_UINT8, BASE_DEC, NULL, 0x0,
2014
14
            NULL, HFILL }},
2015
2016
14
        { &hf_zbee_zdp_ieee_join_list_ieee,
2017
14
        { "IEEE",                "zbee_zdp.ieee_joining_list.ieee", FT_EUI64, BASE_NONE, NULL, 0x0,
2018
14
            NULL, HFILL }},
2019
2020
14
        { &hf_zbee_zdp_number_of_children,
2021
14
          { "NumberOfChildren",    "zbee_zdp.n_children", FT_UINT8, BASE_DEC, NULL, 0x0,
2022
14
            NULL, HFILL }},
2023
2024
14
        { &hf_zbee_zdp_beacon_survey_scan_mask,
2025
14
          { "ScanChannelItem",    "zbee_zdp.scan_ch_list", FT_UINT32, BASE_HEX, NULL, 0x0,
2026
14
            NULL, HFILL }},
2027
2028
14
        { &hf_zbee_zdp_beacon_survey_scan_mask_cnt,
2029
14
          { "ScanChannelCount",    "zbee_zdp.scan_ch_cnt", FT_UINT8, BASE_DEC, NULL, 0x0,
2030
14
            NULL, HFILL }},
2031
2032
14
        { &hf_zbee_zdp_beacon_survey_conf_mask,
2033
14
          { "Configuration Bitmask",    "zbee_zdp.conf_mask", FT_UINT8, BASE_HEX, NULL, 0x0,
2034
14
            NULL, HFILL }},
2035
2036
14
        { &hf_zbee_zdp_beacon_survey_total,
2037
14
          { "Total beacons surveyed", "zbee_zdp.total_beacons", FT_UINT8, BASE_DEC, NULL, 0x0,
2038
14
            NULL, HFILL }},
2039
2040
14
        { &hf_zbee_zdp_beacon_survey_cur_zbn,
2041
14
          { "On-network beacons", "zbee_zdp.on_nwk_beacons", FT_UINT8, BASE_DEC, NULL, 0x0,
2042
14
            NULL, HFILL }},
2043
2044
14
        { &hf_zbee_zdp_beacon_survey_cur_zbn_potent_parents,
2045
14
          { "Potential Parent Beacons", "zbee_zdp.num_of_parents", FT_UINT8, BASE_DEC, NULL, 0x0,
2046
14
            NULL, HFILL }},
2047
2048
14
        { &hf_zbee_zdp_beacon_survey_other_zbn,
2049
14
          { "Other Network Beacons", "zbee_zdp.other_nwk_beacons", FT_UINT8, BASE_DEC, NULL, 0x0,
2050
14
            NULL, HFILL }},
2051
2052
14
        { &hf_zbee_zdp_beacon_survey_current_parent,
2053
14
          { "Current Parent", "zbee_zdp.cur_parent", FT_UINT16, BASE_HEX, NULL, 0x0,
2054
14
            NULL, HFILL }},
2055
2056
14
        { &hf_zbee_zdp_beacon_survey_parent,
2057
14
          { "Potential Parent", "zbee_zdp.p_parent", FT_UINT16, BASE_HEX, NULL, 0x0,
2058
14
            NULL, HFILL }},
2059
2060
14
        { &hf_zbee_zdp_beacon_survey_cnt_parents,
2061
14
          { "Count of potential parents", "zbee_zdp.cnt_parents", FT_UINT8, BASE_DEC, NULL, 0x0,
2062
14
            NULL, HFILL }},
2063
2064
14
        { &hf_zbee_zdp_tlv_count,
2065
14
          { "TLV Count", "zbee_zdp.tlv_count", FT_UINT8, BASE_DEC, NULL, 0x0,
2066
14
            NULL, HFILL }},
2067
2068
14
        { &hf_zbee_zdp_tlv_id,
2069
14
          { "TLV_ID", "zbee_zdp.tlv_id", FT_UINT8, BASE_DEC, NULL, 0x0,
2070
14
            NULL, HFILL }},
2071
14
    };
2072
2073
    /*  APS subtrees */
2074
14
    static int *ett[] = {
2075
14
        &ett_zbee_zdp,
2076
14
        &ett_zbee_zdp_endpoint,
2077
14
        &ett_zbee_zdp_match_in,
2078
14
        &ett_zbee_zdp_match_out,
2079
14
        &ett_zbee_zdp_node,
2080
14
        &ett_zbee_zdp_node_in,
2081
14
        &ett_zbee_zdp_node_out,
2082
14
        &ett_zbee_zdp_power,
2083
14
        &ett_zbee_zdp_simple,
2084
14
        &ett_zbee_zdp_cinfo,
2085
14
        &ett_zbee_zdp_server,
2086
14
        &ett_zbee_zdp_simple_sizes,
2087
14
        &ett_zbee_zdp_bind,
2088
14
        &ett_zbee_zdp_bind_entry,
2089
14
        &ett_zbee_zdp_bind_end_in,
2090
14
        &ett_zbee_zdp_bind_end_out,
2091
14
        &ett_zbee_zdp_bind_table,
2092
14
        &ett_zbee_zdp_bind_source,
2093
14
        &ett_zbee_zdp_assoc_device,
2094
14
        &ett_zbee_zdp_nwk,
2095
14
        &ett_zbee_zdp_lqi,
2096
14
        &ett_zbee_zdp_rtg,
2097
14
        &ett_zbee_zdp_cache,
2098
14
        &ett_zbee_zdp_nwk_desc,
2099
14
        &ett_zbee_zdp_table_entry,
2100
14
        &ett_zbee_zdp_descriptor_capability_field,
2101
14
        &ett_zbee_zdp_perm_join_fc,
2102
14
    };
2103
2104
14
    expert_module_t *expert_zbee_zdp;
2105
2106
14
    static ei_register_info ei[] = {
2107
14
        {
2108
14
            &ei_deprecated_command,
2109
14
            { "zbee_zdp.zdo_command_deprecated", PI_DEPRECATED, PI_WARN,
2110
14
              "Deprecated ZDO Command", EXPFILL }
2111
14
        }
2112
14
    };
2113
2114
    /* Register ZigBee ZDP protocol with Wireshark. */
2115
14
    proto_zbee_zdp = proto_register_protocol("ZigBee Device Profile", "ZigBee ZDP", "zbee_zdp");
2116
14
    proto_register_field_array(proto_zbee_zdp, hf, array_length(hf));
2117
14
    proto_register_subtree_array(ett, array_length(ett));
2118
14
    expert_zbee_zdp = expert_register_protocol(proto_zbee_zdp);
2119
14
    expert_register_field_array(expert_zbee_zdp, ei, array_length(ei));
2120
2121
    /* Register the ZDP dissector. */
2122
14
    register_dissector("zbee_zdp", dissect_zbee_zdp, proto_zbee_zdp);
2123
14
} /* proto_register_zbee_zdp */
2124
2125
/**
2126
 *Registers the Zigbee Device Profile dissector with Wireshark.
2127
 *
2128
*/
2129
void proto_reg_handoff_zbee_zdp(void)
2130
14
{
2131
14
    dissector_handle_t  zdp_handle;
2132
2133
    /* Register our dissector with the ZigBee application dissectors. */
2134
14
    zdp_handle = find_dissector("zbee_zdp");
2135
14
    dissector_add_uint("zbee.profile", ZBEE_ZDP_PROFILE, zdp_handle);
2136
14
} /* proto_reg_handoff_zbee_zdp */
2137
2138
/*
2139
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
2140
 *
2141
 * Local variables:
2142
 * c-basic-offset: 4
2143
 * tab-width: 8
2144
 * indent-tabs-mode: nil
2145
 * End:
2146
 *
2147
 * vi: set shiftwidth=4 tabstop=8 expandtab:
2148
 * :indentSize=4:tabSize=8:noTabs=true:
2149
 */