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;
guint offset = 0;
guint8 status;
/*guint16 table_size;*/
guint32 i, table_count;
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;
status = zdp_parse_status(tree, tvb, &offset);
if (tree && table_count) {
field_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_zbee_zdp_bind, NULL, "Binding List");
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_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));
@ -627,7 +628,6 @@ dissect_zbee_zdp_rsp_replace_device(tvbuff_t *tvb, packet_info *pinfo, proto_tre
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* 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;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* 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;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */
@ -690,8 +688,11 @@ dissect_zbee_zdp_rsp_backup_bind_table(tvbuff_t *tvb, packet_info *pinfo, proto_
guint8 status;
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));
@ -711,24 +712,25 @@ dissect_zbee_zdp_rsp_recover_bind_table(tvbuff_t *tvb, packet_info *pinfo, proto
{
proto_tree *field_tree = NULL;
guint offset = 0;
guint8 status;
guint32 i, table_count;
guint8 status;
guint32 i, table_count;
status = zdp_parse_status(tree, tvb, &offset);
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);
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, -1, ett_zbee_zdp_bind, NULL, "Binding Table");
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 */
}
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));
@ -746,11 +748,10 @@ dissect_zbee_zdp_rsp_recover_bind_table(tvbuff_t *tvb, packet_info *pinfo, proto
void
dissect_zbee_zdp_rsp_backup_source_bind(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint8 status;
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* 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;
guint offset = 0;
guint8 status;
guint32 i, table_count;
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;
status = zdp_parse_status(tree, tvb, &offset);
if (tree && table_count) {
field_tree = proto_tree_add_subtree(tree, tvb, offset, table_count * (int)sizeof(guint64),
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;
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");
}
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));

View File

@ -966,21 +966,28 @@ dissect_zbee_zdp_rsp_complex_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree
guint8 status;
guint32 device, length;
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;
status = zdp_parse_status(tree, tvb, &offset);
if (length) {
zdp_parse_complex_desc(tree, -1, tvb, &offset, length);
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);
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));
/* Dump any leftover bytes. */
zdp_dump_excess(tvb, offset, pinfo, tree);
} /* 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;
gchar *user;
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;
status = zdp_parse_status(tree, tvb, &offset);
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);
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
offset += 2;
}
if ((version >= ZBEE_VERSION_2007) || (status == ZBEE_ZDP_STATUS_SUCCESS)) {
/* 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);
@ -1008,13 +1018,12 @@ dissect_zbee_zdp_rsp_user_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
}
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) {
proto_tree_add_string(tree, hf_zbee_zdp_user, tvb, offset, user_length, user);
}
offset += user_length;
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
if (status == ZBEE_ZDP_STATUS_SUCCESS) {
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;
guint32 device = 0;
status = zdp_parse_status(tree, tvb, &offset);
status = zdp_parse_status(tree, tvb, &offset);
if (version >= ZBEE_VERSION_2007) {
/* Device address present only on ZigBee 2006 & later. */
proto_tree_add_item_ret_uint(tree, hf_zbee_zdp_nwk_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN, &device);
offset += 2;
if ((status == ZBEE_ZDP_STATUS_SUCCESS) || (tvb_bytes_exist(tvb, offset, 2))) {
/* Device address present only on ZigBee 2006 & later. */
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));
/* Dump any leftover bytes. */
@ -1062,12 +1073,10 @@ dissect_zbee_zdp_rsp_user_desc_conf(tvbuff_t *tvb, packet_info *pinfo, proto_tre
void
dissect_zbee_zdp_rsp_discovery_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */
@ -1084,13 +1093,14 @@ dissect_zbee_zdp_rsp_discovery_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tr
void
dissect_zbee_zdp_rsp_system_server_disc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint8 status;
/*guint16 server;*/
guint offset = 0;
guint8 status;
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));
@ -1108,12 +1118,10 @@ dissect_zbee_zdp_rsp_system_server_disc(tvbuff_t *tvb, packet_info *pinfo, proto
void
dissect_zbee_zdp_rsp_discovery_store(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint8 status;
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */
@ -1130,12 +1138,10 @@ dissect_zbee_zdp_rsp_discovery_store(tvbuff_t *tvb, packet_info *pinfo, proto_tr
void
dissect_zbee_zdp_rsp_store_node_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */
@ -1152,12 +1158,10 @@ dissect_zbee_zdp_rsp_store_node_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tr
void
dissect_zbee_zdp_rsp_store_power_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */
@ -1174,12 +1178,10 @@ dissect_zbee_zdp_rsp_store_power_desc(tvbuff_t *tvb, packet_info *pinfo, proto_t
void
dissect_zbee_zdp_rsp_store_active_ep(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */
@ -1196,12 +1198,10 @@ dissect_zbee_zdp_rsp_store_active_ep(tvbuff_t *tvb, packet_info *pinfo, proto_tr
void
dissect_zbee_zdp_rsp_store_simple_desc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */
@ -1218,12 +1218,10 @@ dissect_zbee_zdp_rsp_store_simple_desc(tvbuff_t *tvb, packet_info *pinfo, proto_
void
dissect_zbee_zdp_rsp_remove_node_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
guint offset = 0;
guint8 status;
status = zdp_parse_status(tree, tvb, &offset);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */
@ -1240,10 +1238,10 @@ dissect_zbee_zdp_rsp_remove_node_cache(tvbuff_t *tvb, packet_info *pinfo, proto_
void
dissect_zbee_zdp_rsp_find_node_cache(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
guint offset = 0;
guint32 device, cache;
guint offset = 0;
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);
offset += 2;
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
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 i;
guint sizeof_cluster = (int)sizeof(guint16);
guint8 status;
guint32 device, cluster, in_count, out_count, idx;
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(tree, hf_zbee_zdp_endpoint, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
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;
status = zdp_parse_status(tree, tvb, &offset);
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);
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
offset += 2;
}
/* 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 */
if (status == ZBEE_ZDP_STATUS_SUCCESS) {
proto_tree_add_item(tree, hf_zbee_zdp_endpoint, tvb, offset, 1, ENC_LITTLE_ENDIAN);
offset += 1;
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;
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));
/* 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;
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_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 ((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);
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
offset += 2;
}
if (tree && ep_count) {
field_tree = proto_tree_add_subtree(tree, tvb, offset, ep_count*(int)sizeof(guint8),
/* on success require both, when unsuccessful okay to skip both but not just one */
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");
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);
offset += 1;
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);
offset += 1;
}
}
}
zbee_append_info(tree, pinfo, ", Nwk Addr: 0x%04x", device);
zbee_append_info(tree, pinfo, ", Status: %s", zdp_status_name(status));
/* Dump any leftover bytes. */

View File

@ -14,6 +14,7 @@
#include "config.h"
#include <epan/packet.h>
#include <epan/expert.h>
#include <wsutil/bits_ctz.h>
#include "packet-zbee.h"
@ -223,6 +224,9 @@ static gint ett_zbee_zdp_bind_table = -1;
gint ett_zbee_zdp_table_entry = -1;
static gint ett_zbee_zdp_descriptor_capability_field = -1;
/* Expert Info */
static expert_field ei_deprecated_command = EI_INIT;
/**************************************
* Value Strings
**************************************
@ -974,7 +978,7 @@ zdp_parse_complex_desc(proto_tree *tree, gint ettindex, tvbuff_t *tvb, guint *of
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]);
}
}
else if (tag == tag_icon) {
/* TODO: */
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;
case ZBEE_ZDP_REQ_COMPLEX_DESC:
dissect_zbee_zdp_req_complex_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_USER_DESC:
dissect_zbee_zdp_req_user_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_DISCOVERY_CACHE:
dissect_zbee_zdp_req_discovery_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_DEVICE_ANNCE:
dissect_zbee_zdp_device_annce(zdp_tvb, pinfo, zdp_tree);
break;
case ZBEE_ZDP_REQ_SET_USER_DESC:
dissect_zbee_zdp_req_set_user_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_SYSTEM_SERVER_DISC:
dissect_zbee_zdp_req_system_server_disc(zdp_tvb, pinfo, zdp_tree);
break;
case ZBEE_ZDP_REQ_STORE_DISCOVERY:
dissect_zbee_zdp_req_store_discovery(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_STORE_NODE_DESC:
dissect_zbee_zdp_req_store_node_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_STORE_POWER_DESC:
dissect_zbee_zdp_req_store_power_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_STORE_ACTIVE_EP:
dissect_zbee_zdp_req_store_active_ep(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_STORE_SIMPLE_DESC:
dissect_zbee_zdp_req_store_simple_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_REMOVE_NODE_CACHE:
dissect_zbee_zdp_req_remove_node_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_FIND_NODE_CACHE:
dissect_zbee_zdp_req_find_node_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_EXT_SIMPLE_DESC:
dissect_zbee_zdp_req_ext_simple_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_EXT_ACTIVE_EP:
dissect_zbee_zdp_req_ext_active_ep(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_PARENT_ANNCE:
dissect_zbee_zdp_parent_annce(zdp_tvb, pinfo, zdp_tree);
break;
case ZBEE_ZDP_REQ_END_DEVICE_BIND:
dissect_zbee_zdp_req_end_device_bind(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_BIND:
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;
case ZBEE_ZDP_REQ_BIND_REGISTER:
dissect_zbee_zdp_req_bind_register(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_REPLACE_DEVICE:
dissect_zbee_zdp_req_replace_device(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_STORE_BAK_BIND_ENTRY:
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;
case ZBEE_ZDP_REQ_REMOVE_BAK_BIND_ENTRY:
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;
case ZBEE_ZDP_REQ_BACKUP_BIND_TABLE:
dissect_zbee_zdp_req_backup_bind_table(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_RECOVER_BIND_TABLE:
dissect_zbee_zdp_req_recover_bind_table(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_BACKUP_SOURCE_BIND:
dissect_zbee_zdp_req_backup_source_bind(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_RECOVER_SOURCE_BIND:
dissect_zbee_zdp_req_recover_source_bind(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_MGMT_NWK_DISC:
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;
case ZBEE_ZDP_REQ_MGMT_DIRECT_JOIN:
dissect_zbee_zdp_req_mgmt_direct_join(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_MGMT_PERMIT_JOIN:
dissect_zbee_zdp_req_mgmt_permit_join(zdp_tvb, pinfo, zdp_tree);
break;
case ZBEE_ZDP_REQ_MGMT_CACHE:
dissect_zbee_zdp_req_mgmt_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_REQ_MGMT_NWKUPDATE:
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;
case ZBEE_ZDP_RSP_COMPLEX_DESC:
dissect_zbee_zdp_rsp_complex_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_USER_DESC:
dissect_zbee_zdp_rsp_user_desc(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_DISCOVERY_CACHE:
dissect_zbee_zdp_rsp_discovery_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_CONF_USER_DESC:
dissect_zbee_zdp_rsp_user_desc_conf(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_SYSTEM_SERVER_DISC:
dissect_zbee_zdp_rsp_system_server_disc(zdp_tvb, pinfo, zdp_tree);
break;
case ZBEE_ZDP_RSP_STORE_DISCOVERY:
dissect_zbee_zdp_rsp_discovery_store(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_STORE_NODE_DESC:
dissect_zbee_zdp_rsp_store_node_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_STORE_POWER_DESC:
dissect_zbee_zdp_rsp_store_power_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_STORE_ACTIVE_EP:
dissect_zbee_zdp_rsp_store_active_ep(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_STORE_SIMPLE_DESC:
dissect_zbee_zdp_rsp_store_simple_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_REMOVE_NODE_CACHE:
dissect_zbee_zdp_rsp_remove_node_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_FIND_NODE_CACHE:
dissect_zbee_zdp_rsp_find_node_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_EXT_SIMPLE_DESC:
dissect_zbee_zdp_rsp_ext_simple_desc(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_EXT_ACTIVE_EP:
dissect_zbee_zdp_rsp_ext_active_ep(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_PARENT_ANNCE:
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;
case ZBEE_ZDP_RSP_BIND_REGISTER:
dissect_zbee_zdp_rsp_bind_register(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_REPLACE_DEVICE:
dissect_zbee_zdp_rsp_replace_device(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_STORE_BAK_BIND_ENTRY:
dissect_zbee_zdp_rsp_store_bak_bind_entry(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_REMOVE_BAK_BIND_ENTRY:
dissect_zbee_zdp_rsp_remove_bak_bind_entry(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_BACKUP_BIND_TABLE:
dissect_zbee_zdp_rsp_backup_bind_table(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_RECOVER_BIND_TABLE:
dissect_zbee_zdp_rsp_recover_bind_table(zdp_tvb, pinfo, zdp_tree, nwk->version);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_BACKUP_SOURCE_BIND:
dissect_zbee_zdp_rsp_backup_source_bind(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_RECOVER_SOURCE_BIND:
dissect_zbee_zdp_rsp_recover_source_bind(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_MGMT_NWK_DISC:
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;
case ZBEE_ZDP_RSP_MGMT_DIRECT_JOIN:
dissect_zbee_zdp_rsp_mgmt_direct_join(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_RSP_MGMT_PERMIT_JOIN:
dissect_zbee_zdp_rsp_mgmt_permit_join(zdp_tvb, pinfo, zdp_tree);
break;
case ZBEE_ZDP_RSP_MGMT_CACHE:
dissect_zbee_zdp_rsp_mgmt_cache(zdp_tvb, pinfo, zdp_tree);
expert_add_info(pinfo, zdp_tree, &ei_deprecated_command);
break;
case ZBEE_ZDP_NOT_MGMT_NWKUPDATE:
case ZBEE_ZDP_NOT_MGMT_NWKUPDATE_ENH:
@ -1889,10 +1940,22 @@ void proto_register_zbee_zdp(void)
&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. */
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_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_dissector("zbee_zdp", dissect_zbee_zdp, proto_zbee_zdp);