Coverage Report

Created: 2026-07-12 07:10

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