Added expert info to mark depreciated Zigbee ZDO commands and made

dissection of ZDO responses with a status other than SUCCESS more
lenient, i.e. dissect what is possible and avoid reporting malformed
This commit is contained in:
Chris Brandson 2021-05-20 16:32:14 -07:00 committed by Wireshark GitLab Utility
parent a714805628
commit 8e97359883
3 changed files with 221 additions and 148 deletions

View File

@ -589,23 +589,24 @@ dissect_zbee_zdp_rsp_bind_register(tvbuff_t *tvb, packet_info *pinfo, proto_tree
{ {
proto_tree *field_tree = NULL; proto_tree *field_tree = NULL;
guint offset = 0; guint offset = 0;
guint8 status; guint8 status;
/*guint16 table_size;*/
guint32 i, table_count; guint32 i, table_count;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
proto_tree_add_item(tree, hf_zbee_zdp_table_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_table_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &table_count);
offset += 2;
if (tree && table_count) { if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
field_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_zbee_zdp_bind, NULL, "Binding List"); proto_tree_add_item(tree, hf_zbee_zdp_table_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_table_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &table_count);
offset += 2;
if (tree && table_count) {
field_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_zbee_zdp_bind, NULL, "Binding List");
}
for (i=0; i<table_count; i++) {
zdp_parse_bind_table_entry(field_tree, tvb, &offset, version);
} /* for */
} }
for (i=0; i<table_count; i++) {
zdp_parse_bind_table_entry(field_tree, tvb, &offset, version);
} /* for */
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
@ -627,7 +628,6 @@ dissect_zbee_zdp_rsp_replace_device(tvbuff_t *tvb, packet_info *pinfo, proto_tre
guint8 status; guint8 status;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -648,7 +648,6 @@ dissect_zbee_zdp_rsp_store_bak_bind_entry(tvbuff_t *tvb, packet_info *pinfo, pro
guint8 status; guint8 status;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -669,7 +668,6 @@ dissect_zbee_zdp_rsp_remove_bak_bind_entry(tvbuff_t *tvb, packet_info *pinfo, pr
guint8 status; guint8 status;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -690,8 +688,11 @@ dissect_zbee_zdp_rsp_backup_bind_table(tvbuff_t *tvb, packet_info *pinfo, proto_
guint8 status; guint8 status;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
proto_tree_add_item(tree, hf_zbee_zdp_table_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2; if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
proto_tree_add_item(tree, hf_zbee_zdp_table_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
}
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
@ -711,24 +712,25 @@ dissect_zbee_zdp_rsp_recover_bind_table(tvbuff_t *tvb, packet_info *pinfo, proto
{ {
proto_tree *field_tree = NULL; proto_tree *field_tree = NULL;
guint offset = 0; guint offset = 0;
guint8 status;
guint32 i, table_count;
guint8 status; status = zdp_parse_status(tree, tvb, &offset);
guint32 i, table_count; if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
proto_tree_add_item(tree, hf_zbee_zdp_table_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_zbee_zdp_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_table_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &table_count);
offset += 2;
status = zdp_parse_status(tree, tvb, &offset); if (tree && table_count) {
proto_tree_add_item(tree, hf_zbee_zdp_table_size, tvb, offset, 2, ENC_LITTLE_ENDIAN); field_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_zbee_zdp_bind, NULL, "Binding Table");
offset += 2; }
proto_tree_add_item(tree, hf_zbee_zdp_index, tvb, offset, 2, ENC_LITTLE_ENDIAN); for (i=0; i<table_count; i++) {
offset += 2; zdp_parse_bind_table_entry(field_tree, tvb, &offset, version);
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_table_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &table_count); } /* for */
offset += 2;
if (tree && table_count) {
field_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_zbee_zdp_bind, NULL, "Binding Table");
} }
for (i=0; i<table_count; i++) {
zdp_parse_bind_table_entry(field_tree, tvb, &offset, version);
} /* for */
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
@ -746,11 +748,10 @@ dissect_zbee_zdp_rsp_recover_bind_table(tvbuff_t *tvb, packet_info *pinfo, proto
void void
dissect_zbee_zdp_rsp_backup_source_bind(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_backup_source_bind(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint8 status; guint8 status;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -769,25 +770,27 @@ dissect_zbee_zdp_rsp_recover_source_bind(tvbuff_t *tvb, packet_info *pinfo, prot
{ {
proto_tree *field_tree = NULL; proto_tree *field_tree = NULL;
guint offset = 0; guint offset = 0;
guint8 status; guint8 status;
guint32 i, table_count; guint32 i, table_count;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
proto_tree_add_item(tree, hf_zbee_zdp_table_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_zbee_zdp_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_table_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &table_count);
offset += 2;
if (tree && table_count) { if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
field_tree = proto_tree_add_subtree(tree, tvb, offset, table_count * (int)sizeof(guint64), proto_tree_add_item(tree, hf_zbee_zdp_table_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item(tree, hf_zbee_zdp_index, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_table_count, tvb, offset, 2, ENC_LITTLE_ENDIAN, &table_count);
offset += 2;
if (tree && table_count) {
field_tree = proto_tree_add_subtree(tree, tvb, offset, table_count * (int)sizeof(guint64),
ett_zbee_zdp_bind_source, NULL, "Source Table"); ett_zbee_zdp_bind_source, NULL, "Source Table");
}
for (i=0; i<table_count; i++) {
(void)zbee_parse_eui64(field_tree, hf_zbee_zdp_bind_src64, tvb, &offset, (int)sizeof(guint64), NULL);
} /* for */
} }
for (i=0; i<table_count; i++) {
(void)zbee_parse_eui64(field_tree, hf_zbee_zdp_bind_src64, tvb, &offset, (int)sizeof(guint64), NULL);
} /* for */
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));

View File

@ -966,21 +966,28 @@ dissect_zbee_zdp_rsp_complex_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree
guint8 status; guint8 status;
guint32 device, length; guint32 device, length;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device);
offset += 2;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_complex_length, tvb, offset, 1, ENC_LITTLE_ENDIAN, &length);
offset += 1;
if (length) { if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
zdp_parse_complex_desc(tree, -1, tvb, &offset, length); proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device);
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
offset += 2;
}
if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 1))) {
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_complex_length, tvb, offset, 1, ENC_LITTLE_ENDIAN, &length);
offset += 1;
if (length) {
zdp_parse_complex_desc(tree, -1, tvb, &offset, length);
}
/* Dump any leftover bytes. */
zdp_dump_excess(tvb, offset, pinfo, tree);
} }
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */
zdp_dump_excess(tvb, offset, pinfo, tree);
} /* dissect_zbee_zdp_rsp_complex_desc */ } /* dissect_zbee_zdp_rsp_complex_desc */
/** /**
@ -998,9 +1005,12 @@ dissect_zbee_zdp_rsp_user_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
guint32 device, user_length; guint32 device, user_length;
gchar *user; gchar *user;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device); if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
offset += 2; proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device);
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
offset += 2;
}
if ((version >= ZBEE_VERSION_2007) || (status == ZBEE_ZDP_STATUS_SUCCESS)) { if ((version >= ZBEE_VERSION_2007) || (status == ZBEE_ZDP_STATUS_SUCCESS)) {
/* In ZigBee 2003 & earlier, the length field is omitted if not successful. */ /* In ZigBee 2003 & earlier, the length field is omitted if not successful. */
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_user_length, tvb, offset, 1, ENC_LITTLE_ENDIAN, &user_length); proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_user_length, tvb, offset, 1, ENC_LITTLE_ENDIAN, &user_length);
@ -1008,13 +1018,12 @@ dissect_zbee_zdp_rsp_user_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
} }
else user_length = 0; else user_length = 0;
user = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, user_length, ENC_ASCII); user = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, user_length, ENC_ASCII);
if (tree) { if (tree) {
proto_tree_add_string(tree, hf_zbee_zdp_user, tvb, offset, user_length, user); proto_tree_add_string(tree, hf_zbee_zdp_user, tvb, offset, user_length, user);
} }
offset += user_length; offset += user_length;
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
if (status == ZBEE_ZDP_STATUS_SUCCESS) { if (status == ZBEE_ZDP_STATUS_SUCCESS) {
zbee_append_info(tree, pinfo, ", Desc: \'%s\'", user); zbee_append_info(tree, pinfo, ", Desc: \'%s\'", user);
} }
@ -1038,14 +1047,16 @@ dissect_zbee_zdp_rsp_user_desc_conf(tvbuff_t *tvb, packet_info *pinfo, proto_tre
guint8 status; guint8 status;
guint32 device = 0; guint32 device = 0;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
if (version >= ZBEE_VERSION_2007) { if (version >= ZBEE_VERSION_2007) {
/* Device address present only on ZigBee 2006 & later. */ if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device); /* Device address present only on ZigBee 2006 & later. */
offset += 2; proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device);
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
offset += 2;
}
} }
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -1062,12 +1073,10 @@ dissect_zbee_zdp_rsp_user_desc_conf(tvbuff_t *tvb, packet_info *pinfo, proto_tre
void void
dissect_zbee_zdp_rsp_discovery_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_discovery_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint8 status;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -1084,13 +1093,14 @@ dissect_zbee_zdp_rsp_discovery_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tr
void void
dissect_zbee_zdp_rsp_system_server_disc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_system_server_disc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint8 status;
guint8 status;
/*guint16 server;*/
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
/*server =*/ zdp_parse_server_flags(tree, ett_zbee_zdp_server, tvb, &offset);
if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
zdp_parse_server_flags(tree, ett_zbee_zdp_server, tvb, &offset);
}
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
@ -1108,12 +1118,10 @@ dissect_zbee_zdp_rsp_system_server_disc(tvbuff_t *tvb, packet_info *pinfo, proto
void void
dissect_zbee_zdp_rsp_discovery_store(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_discovery_store(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint8 status;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -1130,12 +1138,10 @@ dissect_zbee_zdp_rsp_discovery_store(tvbuff_t *tvb, packet_info *pinfo, proto_tr
void void
dissect_zbee_zdp_rsp_store_node_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_store_node_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint8 status;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -1152,12 +1158,10 @@ dissect_zbee_zdp_rsp_store_node_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tr
void void
dissect_zbee_zdp_rsp_store_power_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_store_power_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint8 status;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -1174,12 +1178,10 @@ dissect_zbee_zdp_rsp_store_power_desc(tvbuff_t *tvb, packet_info *pinfo, proto_t
void void
dissect_zbee_zdp_rsp_store_active_ep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_store_active_ep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint8 status;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -1196,12 +1198,10 @@ dissect_zbee_zdp_rsp_store_active_ep(tvbuff_t *tvb, packet_info *pinfo, proto_tr
void void
dissect_zbee_zdp_rsp_store_simple_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_store_simple_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint8 status;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -1218,12 +1218,10 @@ dissect_zbee_zdp_rsp_store_simple_desc(tvbuff_t *tvb, packet_info *pinfo, proto_
void void
dissect_zbee_zdp_rsp_remove_node_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_remove_node_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint8 status;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -1240,10 +1238,10 @@ dissect_zbee_zdp_rsp_remove_node_cache(tvbuff_t *tvb, packet_info *pinfo, proto_
void void
dissect_zbee_zdp_rsp_find_node_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_find_node_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
guint offset = 0; guint offset = 0;
guint32 device, cache;
guint32 device, cache;
/* Find Node Cache does NOT start with status */
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_cache, tvb, offset, 2, ENC_LITTLE_ENDIAN, &cache); proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_cache, tvb, offset, 2, ENC_LITTLE_ENDIAN, &cache);
offset += 2; offset += 2;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device); proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device);
@ -1267,39 +1265,42 @@ dissect_zbee_zdp_rsp_find_node_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tr
void void
dissect_zbee_zdp_rsp_ext_simple_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) dissect_zbee_zdp_rsp_ext_simple_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{ {
proto_item *ti; proto_item *ti;
guint offset = 0; guint offset = 0;
guint i; guint i;
guint sizeof_cluster = (int)sizeof(guint16); guint sizeof_cluster = (int)sizeof(guint16);
guint8 status; guint8 status;
guint32 device, cluster, in_count, out_count, idx; guint32 device, cluster, in_count, out_count, idx;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device); if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
offset += 2; proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device);
proto_tree_add_item(tree, hf_zbee_zdp_endpoint, tvb, offset, 1, ENC_LITTLE_ENDIAN); zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
offset += 1; offset += 2;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_in_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &in_count); }
offset += 1;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_out_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &out_count);
offset += 1;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_index, tvb, offset, 1, ENC_LITTLE_ENDIAN, &idx);
offset += 1;
/* Display the input cluster list. */ if (status == ZBEE_ZDP_STATUS_SUCCESS) {
for (i=idx; (i<in_count) && tvb_bytes_exist(tvb, offset, sizeof_cluster); i++) { proto_tree_add_item(tree, hf_zbee_zdp_endpoint, tvb, offset, 1, ENC_LITTLE_ENDIAN);
ti = proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_in_cluster, tvb, offset, sizeof_cluster, ENC_LITTLE_ENDIAN, &cluster); offset += 1;
offset += sizeof_cluster; proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_in_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &in_count);
proto_item_append_text(ti, " (%s)", rval_to_str(cluster, zbee_aps_cid_names, "Unknown Cluster")); offset += 1;
} /* for */ proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_out_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &out_count);
for (i-=in_count; (i<out_count) && tvb_bytes_exist(tvb, offset, sizeof_cluster); i++) { offset += 1;
ti = proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_out_cluster, tvb, offset, sizeof_cluster, ENC_LITTLE_ENDIAN, &cluster); proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_index, tvb, offset, 1, ENC_LITTLE_ENDIAN, &idx);
offset += sizeof_cluster; offset += 1;
proto_item_append_text(ti, " (%s)", rval_to_str(cluster, zbee_aps_cid_names, "Unknown Cluster"));
} /* for */
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device); /* Display the input cluster list. */
for (i=idx; (i<in_count) && tvb_bytes_exist(tvb, offset, sizeof_cluster); i++) {
ti = proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_in_cluster, tvb, offset, sizeof_cluster, ENC_LITTLE_ENDIAN, &cluster);
offset += sizeof_cluster;
proto_item_append_text(ti, " (%s)", rval_to_str(cluster, zbee_aps_cid_names, "Unknown Cluster"));
} /* for */
for (i-=in_count; (i<out_count) && tvb_bytes_exist(tvb, offset, sizeof_cluster); i++) {
ti = proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_out_cluster, tvb, offset, sizeof_cluster, ENC_LITTLE_ENDIAN, &cluster);
offset += sizeof_cluster;
proto_item_append_text(ti, " (%s)", rval_to_str(cluster, zbee_aps_cid_names, "Unknown Cluster"));
} /* for */
}
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */
@ -1324,23 +1325,29 @@ dissect_zbee_zdp_rsp_ext_active_ep(tvbuff_t *tvb, packet_info *pinfo, proto_tree
guint32 device, ep_count, idx; guint32 device, ep_count, idx;
status = zdp_parse_status(tree, tvb, &offset); status = zdp_parse_status(tree, tvb, &offset);
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device); if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
offset += 2; proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device);
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_ep_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &ep_count); zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
offset += 1; offset += 2;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_index, tvb, offset, 1, ENC_LITTLE_ENDIAN, &idx); }
offset += 1;
if (tree && ep_count) { /* on success require both, when unsuccessful okay to skip both but not just one */
field_tree = proto_tree_add_subtree(tree, tvb, offset, ep_count*(int)sizeof(guint8), if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 1))) {
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_ep_count, tvb, offset, 1, ENC_LITTLE_ENDIAN, &ep_count);
offset += 1;
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_index, tvb, offset, 1, ENC_LITTLE_ENDIAN, &idx);
offset += 1;
if (tree && ep_count) {
field_tree = proto_tree_add_subtree(tree, tvb, offset, ep_count*(int)sizeof(guint8),
ett_zbee_zdp_endpoint, NULL, "Active Endpoint List"); ett_zbee_zdp_endpoint, NULL, "Active Endpoint List");
for (i=idx; (i<ep_count) && tvb_bytes_exist(tvb, offset, (int)sizeof(guint8)); i++) { for (i=idx; (i<ep_count) && tvb_bytes_exist(tvb, offset, (int)sizeof(guint8)); i++) {
proto_tree_add_item(field_tree, hf_zbee_zdp_endpoint, tvb, offset, 1, ENC_LITTLE_ENDIAN); proto_tree_add_item(field_tree, hf_zbee_zdp_endpoint, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1; offset += 1;
}
} }
} }
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status)); zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */ /* Dump any leftover bytes. */

View File

@ -14,6 +14,7 @@
#include "config.h" #include "config.h"
#include <epan/packet.h> #include <epan/packet.h>
#include <epan/expert.h>
#include <wsutil/bits_ctz.h> #include <wsutil/bits_ctz.h>
#include "packet-zbee.h" #include "packet-zbee.h"
@ -223,6 +224,9 @@ static gint ett_zbee_zdp_bind_table = -1;
gint ett_zbee_zdp_table_entry = -1; gint ett_zbee_zdp_table_entry = -1;
static gint ett_zbee_zdp_descriptor_capability_field = -1; static gint ett_zbee_zdp_descriptor_capability_field = -1;
/* Expert Info */
static expert_field ei_deprecated_command = EI_INIT;
/************************************** /**************************************
* Value Strings * Value Strings
************************************** **************************************
@ -974,7 +978,7 @@ zdp_parse_complex_desc(proto_tree *tree, gint ettindex, tvbuff_t *tvb, guint *of
lang_str[2] = '\0'; lang_str[2] = '\0';
g_snprintf(complex, max_len, "<%s>%s, %s</%s>", tag_name[tag_charset], lang_str, charset_str, tag_name[tag_charset]); g_snprintf(complex, max_len, "<%s>%s, %s</%s>", tag_name[tag_charset], lang_str, charset_str, tag_name[tag_charset]);
} }
else if (tag == tag_icon) { else if (tag == tag_icon) {
/* TODO: */ /* TODO: */
g_snprintf(complex, max_len, "<%s>FixMe</%s>", tag_name[tag_icon], tag_name[tag_icon]); g_snprintf(complex, max_len, "<%s>FixMe</%s>", tag_name[tag_icon], tag_name[tag_icon]);
@ -1075,54 +1079,68 @@ dissect_zbee_zdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
break; break;
case ZBEE_ZDP_REQ_COMPLEX_DESC: case ZBEE_ZDP_REQ_COMPLEX_DESC:
dissect_zbee_zdp_req_complex_desc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_complex_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_USER_DESC: case ZBEE_ZDP_REQ_USER_DESC:
dissect_zbee_zdp_req_user_desc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_user_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_DISCOVERY_CACHE: case ZBEE_ZDP_REQ_DISCOVERY_CACHE:
dissect_zbee_zdp_req_discovery_cache(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_discovery_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_DEVICE_ANNCE: case ZBEE_ZDP_REQ_DEVICE_ANNCE:
dissect_zbee_zdp_device_annce(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_device_annce(zdp_tvb, pinfo, zdp_tree);
break; break;
case ZBEE_ZDP_REQ_SET_USER_DESC: case ZBEE_ZDP_REQ_SET_USER_DESC:
dissect_zbee_zdp_req_set_user_desc(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_req_set_user_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_SYSTEM_SERVER_DISC: case ZBEE_ZDP_REQ_SYSTEM_SERVER_DISC:
dissect_zbee_zdp_req_system_server_disc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_system_server_disc(zdp_tvb, pinfo, zdp_tree);
break; break;
case ZBEE_ZDP_REQ_STORE_DISCOVERY: case ZBEE_ZDP_REQ_STORE_DISCOVERY:
dissect_zbee_zdp_req_store_discovery(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_store_discovery(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_STORE_NODE_DESC: case ZBEE_ZDP_REQ_STORE_NODE_DESC:
dissect_zbee_zdp_req_store_node_desc(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_req_store_node_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_STORE_POWER_DESC: case ZBEE_ZDP_REQ_STORE_POWER_DESC:
dissect_zbee_zdp_req_store_power_desc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_store_power_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_STORE_ACTIVE_EP: case ZBEE_ZDP_REQ_STORE_ACTIVE_EP:
dissect_zbee_zdp_req_store_active_ep(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_store_active_ep(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_STORE_SIMPLE_DESC: case ZBEE_ZDP_REQ_STORE_SIMPLE_DESC:
dissect_zbee_zdp_req_store_simple_desc(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_req_store_simple_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_REMOVE_NODE_CACHE: case ZBEE_ZDP_REQ_REMOVE_NODE_CACHE:
dissect_zbee_zdp_req_remove_node_cache(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_remove_node_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_FIND_NODE_CACHE: case ZBEE_ZDP_REQ_FIND_NODE_CACHE:
dissect_zbee_zdp_req_find_node_cache(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_find_node_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_EXT_SIMPLE_DESC: case ZBEE_ZDP_REQ_EXT_SIMPLE_DESC:
dissect_zbee_zdp_req_ext_simple_desc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_ext_simple_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_EXT_ACTIVE_EP: case ZBEE_ZDP_REQ_EXT_ACTIVE_EP:
dissect_zbee_zdp_req_ext_active_ep(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_ext_active_ep(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_PARENT_ANNCE: case ZBEE_ZDP_REQ_PARENT_ANNCE:
dissect_zbee_zdp_parent_annce(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_parent_annce(zdp_tvb, pinfo, zdp_tree);
break; break;
case ZBEE_ZDP_REQ_END_DEVICE_BIND: case ZBEE_ZDP_REQ_END_DEVICE_BIND:
dissect_zbee_zdp_req_end_device_bind(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_req_end_device_bind(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_BIND: case ZBEE_ZDP_REQ_BIND:
dissect_zbee_zdp_req_bind(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_req_bind(zdp_tvb, pinfo, zdp_tree, nwk->version);
@ -1132,27 +1150,35 @@ dissect_zbee_zdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
break; break;
case ZBEE_ZDP_REQ_BIND_REGISTER: case ZBEE_ZDP_REQ_BIND_REGISTER:
dissect_zbee_zdp_req_bind_register(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_bind_register(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_REPLACE_DEVICE: case ZBEE_ZDP_REQ_REPLACE_DEVICE:
dissect_zbee_zdp_req_replace_device(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_replace_device(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_STORE_BAK_BIND_ENTRY: case ZBEE_ZDP_REQ_STORE_BAK_BIND_ENTRY:
dissect_zbee_zdp_req_store_bak_bind_entry(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_req_store_bak_bind_entry(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_REMOVE_BAK_BIND_ENTRY: case ZBEE_ZDP_REQ_REMOVE_BAK_BIND_ENTRY:
dissect_zbee_zdp_req_remove_bak_bind_entry(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_req_remove_bak_bind_entry(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_BACKUP_BIND_TABLE: case ZBEE_ZDP_REQ_BACKUP_BIND_TABLE:
dissect_zbee_zdp_req_backup_bind_table(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_req_backup_bind_table(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_RECOVER_BIND_TABLE: case ZBEE_ZDP_REQ_RECOVER_BIND_TABLE:
dissect_zbee_zdp_req_recover_bind_table(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_recover_bind_table(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_BACKUP_SOURCE_BIND: case ZBEE_ZDP_REQ_BACKUP_SOURCE_BIND:
dissect_zbee_zdp_req_backup_source_bind(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_backup_source_bind(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_RECOVER_SOURCE_BIND: case ZBEE_ZDP_REQ_RECOVER_SOURCE_BIND:
dissect_zbee_zdp_req_recover_source_bind(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_recover_source_bind(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_MGMT_NWK_DISC: case ZBEE_ZDP_REQ_MGMT_NWK_DISC:
dissect_zbee_zdp_req_mgmt_nwk_disc(zdp_tvb, pinfo, zdp_tree, hf_zbee_zdp_scan_channel); dissect_zbee_zdp_req_mgmt_nwk_disc(zdp_tvb, pinfo, zdp_tree, hf_zbee_zdp_scan_channel);
@ -1171,12 +1197,14 @@ dissect_zbee_zdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
break; break;
case ZBEE_ZDP_REQ_MGMT_DIRECT_JOIN: case ZBEE_ZDP_REQ_MGMT_DIRECT_JOIN:
dissect_zbee_zdp_req_mgmt_direct_join(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_mgmt_direct_join(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_MGMT_PERMIT_JOIN: case ZBEE_ZDP_REQ_MGMT_PERMIT_JOIN:
dissect_zbee_zdp_req_mgmt_permit_join(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_mgmt_permit_join(zdp_tvb, pinfo, zdp_tree);
break; break;
case ZBEE_ZDP_REQ_MGMT_CACHE: case ZBEE_ZDP_REQ_MGMT_CACHE:
dissect_zbee_zdp_req_mgmt_cache(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_mgmt_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_REQ_MGMT_NWKUPDATE: case ZBEE_ZDP_REQ_MGMT_NWKUPDATE:
dissect_zbee_zdp_req_mgmt_nwkupdate(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_req_mgmt_nwkupdate(zdp_tvb, pinfo, zdp_tree);
@ -1210,45 +1238,58 @@ dissect_zbee_zdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
break; break;
case ZBEE_ZDP_RSP_COMPLEX_DESC: case ZBEE_ZDP_RSP_COMPLEX_DESC:
dissect_zbee_zdp_rsp_complex_desc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_complex_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_USER_DESC: case ZBEE_ZDP_RSP_USER_DESC:
dissect_zbee_zdp_rsp_user_desc(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_rsp_user_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_DISCOVERY_CACHE: case ZBEE_ZDP_RSP_DISCOVERY_CACHE:
dissect_zbee_zdp_rsp_discovery_cache(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_discovery_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_CONF_USER_DESC: case ZBEE_ZDP_RSP_CONF_USER_DESC:
dissect_zbee_zdp_rsp_user_desc_conf(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_rsp_user_desc_conf(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_SYSTEM_SERVER_DISC: case ZBEE_ZDP_RSP_SYSTEM_SERVER_DISC:
dissect_zbee_zdp_rsp_system_server_disc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_system_server_disc(zdp_tvb, pinfo, zdp_tree);
break; break;
case ZBEE_ZDP_RSP_STORE_DISCOVERY: case ZBEE_ZDP_RSP_STORE_DISCOVERY:
dissect_zbee_zdp_rsp_discovery_store(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_discovery_store(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_STORE_NODE_DESC: case ZBEE_ZDP_RSP_STORE_NODE_DESC:
dissect_zbee_zdp_rsp_store_node_desc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_store_node_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_STORE_POWER_DESC: case ZBEE_ZDP_RSP_STORE_POWER_DESC:
dissect_zbee_zdp_rsp_store_power_desc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_store_power_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_STORE_ACTIVE_EP: case ZBEE_ZDP_RSP_STORE_ACTIVE_EP:
dissect_zbee_zdp_rsp_store_active_ep(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_store_active_ep(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_STORE_SIMPLE_DESC: case ZBEE_ZDP_RSP_STORE_SIMPLE_DESC:
dissect_zbee_zdp_rsp_store_simple_desc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_store_simple_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_REMOVE_NODE_CACHE: case ZBEE_ZDP_RSP_REMOVE_NODE_CACHE:
dissect_zbee_zdp_rsp_remove_node_cache(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_remove_node_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_FIND_NODE_CACHE: case ZBEE_ZDP_RSP_FIND_NODE_CACHE:
dissect_zbee_zdp_rsp_find_node_cache(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_find_node_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_EXT_SIMPLE_DESC: case ZBEE_ZDP_RSP_EXT_SIMPLE_DESC:
dissect_zbee_zdp_rsp_ext_simple_desc(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_ext_simple_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_EXT_ACTIVE_EP: case ZBEE_ZDP_RSP_EXT_ACTIVE_EP:
dissect_zbee_zdp_rsp_ext_active_ep(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_ext_active_ep(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_PARENT_ANNCE: case ZBEE_ZDP_RSP_PARENT_ANNCE:
dissect_zbee_zdp_rsp_parent_annce(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_parent_annce(zdp_tvb, pinfo, zdp_tree);
@ -1264,27 +1305,35 @@ dissect_zbee_zdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
break; break;
case ZBEE_ZDP_RSP_BIND_REGISTER: case ZBEE_ZDP_RSP_BIND_REGISTER:
dissect_zbee_zdp_rsp_bind_register(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_rsp_bind_register(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_REPLACE_DEVICE: case ZBEE_ZDP_RSP_REPLACE_DEVICE:
dissect_zbee_zdp_rsp_replace_device(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_replace_device(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_STORE_BAK_BIND_ENTRY: case ZBEE_ZDP_RSP_STORE_BAK_BIND_ENTRY:
dissect_zbee_zdp_rsp_store_bak_bind_entry(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_store_bak_bind_entry(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_REMOVE_BAK_BIND_ENTRY: case ZBEE_ZDP_RSP_REMOVE_BAK_BIND_ENTRY:
dissect_zbee_zdp_rsp_remove_bak_bind_entry(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_remove_bak_bind_entry(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_BACKUP_BIND_TABLE: case ZBEE_ZDP_RSP_BACKUP_BIND_TABLE:
dissect_zbee_zdp_rsp_backup_bind_table(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_backup_bind_table(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_RECOVER_BIND_TABLE: case ZBEE_ZDP_RSP_RECOVER_BIND_TABLE:
dissect_zbee_zdp_rsp_recover_bind_table(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_rsp_recover_bind_table(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_BACKUP_SOURCE_BIND: case ZBEE_ZDP_RSP_BACKUP_SOURCE_BIND:
dissect_zbee_zdp_rsp_backup_source_bind(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_backup_source_bind(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_RECOVER_SOURCE_BIND: case ZBEE_ZDP_RSP_RECOVER_SOURCE_BIND:
dissect_zbee_zdp_rsp_recover_source_bind(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_recover_source_bind(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_MGMT_NWK_DISC: case ZBEE_ZDP_RSP_MGMT_NWK_DISC:
dissect_zbee_zdp_rsp_mgmt_nwk_disc(zdp_tvb, pinfo, zdp_tree, nwk->version); dissect_zbee_zdp_rsp_mgmt_nwk_disc(zdp_tvb, pinfo, zdp_tree, nwk->version);
@ -1303,12 +1352,14 @@ dissect_zbee_zdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
break; break;
case ZBEE_ZDP_RSP_MGMT_DIRECT_JOIN: case ZBEE_ZDP_RSP_MGMT_DIRECT_JOIN:
dissect_zbee_zdp_rsp_mgmt_direct_join(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_mgmt_direct_join(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_RSP_MGMT_PERMIT_JOIN: case ZBEE_ZDP_RSP_MGMT_PERMIT_JOIN:
dissect_zbee_zdp_rsp_mgmt_permit_join(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_mgmt_permit_join(zdp_tvb, pinfo, zdp_tree);
break; break;
case ZBEE_ZDP_RSP_MGMT_CACHE: case ZBEE_ZDP_RSP_MGMT_CACHE:
dissect_zbee_zdp_rsp_mgmt_cache(zdp_tvb, pinfo, zdp_tree); dissect_zbee_zdp_rsp_mgmt_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break; break;
case ZBEE_ZDP_NOT_MGMT_NWKUPDATE: case ZBEE_ZDP_NOT_MGMT_NWKUPDATE:
case ZBEE_ZDP_NOT_MGMT_NWKUPDATE_ENH: case ZBEE_ZDP_NOT_MGMT_NWKUPDATE_ENH:
@ -1889,10 +1940,22 @@ void proto_register_zbee_zdp(void)
&ett_zbee_zdp_descriptor_capability_field, &ett_zbee_zdp_descriptor_capability_field,
}; };
expert_module_t *expert_zbee_zdp;
static ei_register_info ei[] = {
{
&ei_deprecated_command,
{ "zbee_zdp.zdo_command_depreciated", PI_DEPRECATED, PI_WARN,
"Depreciated ZDO Command", EXPFILL }
}
};
/* Register ZigBee ZDP protocol with Wireshark. */ /* Register ZigBee ZDP protocol with Wireshark. */
proto_zbee_zdp = proto_register_protocol("ZigBee Device Profile", "ZigBee ZDP", "zbee_zdp"); proto_zbee_zdp = proto_register_protocol("ZigBee Device Profile", "ZigBee ZDP", "zbee_zdp");
proto_register_field_array(proto_zbee_zdp, hf, array_length(hf)); proto_register_field_array(proto_zbee_zdp, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett)); proto_register_subtree_array(ett, array_length(ett));
expert_zbee_zdp = expert_register_protocol(proto_zbee_zdp);
expert_register_field_array(expert_zbee_zdp, ei, array_length(ei));
/* Register the ZDP dissector. */ /* Register the ZDP dissector. */
register_dissector("zbee_zdp", dissect_zbee_zdp, proto_zbee_zdp); register_dissector("zbee_zdp", dissect_zbee_zdp, proto_zbee_zdp);