From 8e97359883475cc65a92036854b911be043c7a69 Mon Sep 17 00:00:00 2001 From: Chris Brandson Date: Thu, 20 May 2021 16:32:14 -0700 Subject: [PATCH] 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 --- epan/dissectors/packet-zbee-zdp-binding.c | 99 +++++----- epan/dissectors/packet-zbee-zdp-discovery.c | 205 ++++++++++---------- epan/dissectors/packet-zbee-zdp.c | 65 ++++++- 3 files changed, 221 insertions(+), 148 deletions(-) diff --git a/epan/dissectors/packet-zbee-zdp-binding.c b/epan/dissectors/packet-zbee-zdp-binding.c index 9d3e48c4ed..c4c7084e85 100644 --- a/epan/dissectors/packet-zbee-zdp-binding.c +++ b/epan/dissectors/packet-zbee-zdp-binding.c @@ -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= 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 +#include #include #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", 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", 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);