From 1cdd09190d7557a22b9959a3d1c955763e92320f Mon Sep 17 00:00:00 2001 From: Chris Brandson Date: Fri, 17 Jun 2016 15:12:12 -0700 Subject: ZigBee updated ZDO support to comply with R22 Update ZDO support for R22 (and IEEE 802.15.4-2015) - Add support for the new IEEE Joining List request / response - Changed Network Update to support channel pages - Added Network Update Enhanced request - Added decoding of EU Sub-GHz Frequency Band Change-Id: I3a513a486f6d3784897fc8b783411c678e3f905e Reviewed-on: https://code.wireshark.org/review/16040 Petri-Dish: Anders Broman Tested-by: Petri Dish Buildbot Reviewed-by: Michael Mann Reviewed-by: Anders Broman --- epan/dissectors/packet-zbee-zdp-management.c | 104 ++++++++++++++++++++++++--- epan/dissectors/packet-zbee-zdp.c | 94 ++++++++++++++++++++++-- epan/dissectors/packet-zbee-zdp.h | 25 ++++++- 3 files changed, 207 insertions(+), 16 deletions(-) diff --git a/epan/dissectors/packet-zbee-zdp-management.c b/epan/dissectors/packet-zbee-zdp-management.c index 00aff27dbc..00b68bed82 100644 --- a/epan/dissectors/packet-zbee-zdp-management.c +++ b/epan/dissectors/packet-zbee-zdp-management.c @@ -397,29 +397,79 @@ void dissect_zbee_zdp_req_mgmt_nwkupdate(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint offset = 0; - /*guint32 channels;*/ guint8 duration; - /*guint8 count;*/ - /*guint8 update_id;*/ - /*guint16 manager;*/ - /*channels =*/ zdp_parse_chanmask(tree, tvb, &offset, hf_zbee_zdp_channel_mask); + zdp_parse_chanmask(tree, tvb, &offset, hf_zbee_zdp_channel_page, hf_zbee_zdp_channel_mask); duration = zbee_parse_uint(tree, hf_zbee_zdp_duration, tvb, &offset, 1, NULL); if (duration == ZBEE_ZDP_NWKUPDATE_PARAMETERS) { - /*update_id =*/ zbee_parse_uint(tree, hf_zbee_zdp_update_id, tvb, &offset, 1, NULL); - /*manager =*/ zbee_parse_uint(tree, hf_zbee_zdp_manager, tvb, &offset, 2, NULL); + zbee_parse_uint(tree, hf_zbee_zdp_update_id, tvb, &offset, 1, NULL); + zbee_parse_uint(tree, hf_zbee_zdp_manager, tvb, &offset, 2, NULL); } else if (duration == ZBEE_ZDP_NWKUPDATE_CHANNEL_HOP) { - /*update_id =*/ zbee_parse_uint(tree, hf_zbee_zdp_update_id, tvb, &offset, 1, NULL); + zbee_parse_uint(tree, hf_zbee_zdp_update_id, tvb, &offset, 1, NULL); } else if (duration <= ZBEE_ZDP_NWKUPDATE_SCAN_MAX) { - /*count =*/ zbee_parse_uint(tree, hf_zbee_zdp_scan_count, tvb, &offset, 1, NULL); + zbee_parse_uint(tree, hf_zbee_zdp_scan_count, tvb, &offset, 1, NULL); } /* Dump any leftover bytes. */ zdp_dump_excess(tvb, offset, pinfo, tree); } /* dissect_zbee_zdp_req_mgmt_nwkupdate */ +/** + *ZigBee Device Profile dissector for the enhanced nwk update request. + * + *@param tvb pointer to buffer containing raw packet. + *@param pinfo pointer to packet information fields + *@param tree pointer to data tree Wireshark uses to display packet. +*/ +void +dissect_zbee_zdp_req_mgmt_nwkupdate_enh(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +{ + guint offset = 0; + guint8 duration; + guint8 count; + int i; + + count = zbee_parse_uint(tree, hf_zbee_zdp_channel_page_count, tvb, &offset, 1, NULL); + for (i=0; i 0) { + zbee_parse_uint(tree, hf_zbee_zdp_ieee_join_list_start, tvb, &offset, 1, NULL); + list_count = zbee_parse_uint(tree, hf_zbee_zdp_ieee_join_list_count, tvb, &offset, 1, NULL); + + for(i=0; i> 27); + mask &= ZBEE_ZDP_NWKUPDATE_CHANNEL; + + proto_tree_add_uint(tree, hf_page, tvb, *offset, 4, page); ti = proto_tree_add_uint_format(tree, hf_channel, tvb, *offset, 4, mask, "Channels: "); /* Check if there are any channels to display. */ @@ -712,6 +738,7 @@ zdp_parse_node_desc(proto_tree *tree, gint ettindex, tvbuff_t *tvb, guint *offse &hf_zbee_zdp_node_freq_868, &hf_zbee_zdp_node_freq_900, &hf_zbee_zdp_node_freq_2400, + &hf_zbee_zdp_node_freq_eu_sub_ghz, NULL }; @@ -1132,6 +1159,12 @@ dissect_zbee_zdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data case ZBEE_ZDP_REQ_MGMT_NWKUPDATE: dissect_zbee_zdp_req_mgmt_nwkupdate(zdp_tvb, pinfo, zdp_tree); break; + case ZBEE_ZDP_REQ_MGMT_NWKUPDATE_ENH: + dissect_zbee_zdp_req_mgmt_nwkupdate_enh(zdp_tvb, pinfo, zdp_tree); + break; + case ZBEE_ZDP_REQ_MGMT_IEEE_JOIN_LIST: + dissect_zbee_zdp_req_mgmt_ieee_join_list(zdp_tvb, pinfo, zdp_tree); + break; case ZBEE_ZDP_RSP_NWK_ADDR: dissect_zbee_zdp_rsp_nwk_addr(zdp_tvb, pinfo, zdp_tree); break; @@ -1255,6 +1288,9 @@ dissect_zbee_zdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data case ZBEE_ZDP_RSP_MGMT_NWKUPDATE: dissect_zbee_zdp_rsp_mgmt_nwkupdate(zdp_tvb, pinfo, zdp_tree); break; + case ZBEE_ZDP_RSP_MGMT_IEEE_JOIN_LIST: + dissect_zbee_zdp_rsp_mgmt_ieee_join_list(zdp_tvb, pinfo, zdp_tree); + break; default: /* Invalid Cluster Identifier. */ call_data_dissector(zdp_tvb, pinfo, tree); @@ -1446,15 +1482,19 @@ void proto_register_zbee_zdp(void) NULL, HFILL }}, { &hf_zbee_zdp_node_freq_868, - { "868MHz Band", "zbee_zdp.node.freq.868mhz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_868MHZ, + { "868MHz BPSK Band", "zbee_zdp.node.freq.868mhz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_868MHZ, NULL, HFILL }}, { &hf_zbee_zdp_node_freq_900, - { "900MHz Band", "zbee_zdp.node.freq.900mhz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_900MHZ, + { "902MHz BPSK Band", "zbee_zdp.node.freq.900mhz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_900MHZ, NULL, HFILL }}, { &hf_zbee_zdp_node_freq_2400, - { "2.4GHz Band", "zbee_zdp.node.freq.2400mhz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_2400MHZ, + { "2.4GHz OQPSK Band", "zbee_zdp.node.freq.2400mhz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_2400MHZ, + NULL, HFILL }}, + + { &hf_zbee_zdp_node_freq_eu_sub_ghz, + { "EU Sub-GHz FSK Band", "zbee_zdp.node.freq.eu_sub_ghz", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_FREQ_EU_SUB_GHZ, NULL, HFILL }}, { &hf_zbee_zdp_node_manufacturer, @@ -1637,6 +1677,14 @@ void proto_register_zbee_zdp(void) { "Channel List Count", "zbee_zdp.channel_count", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_zbee_zdp_channel_page_count, + { "Channel Page Count", "zbee_zdp.channel_page_count", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + { &hf_zbee_zdp_channel_page, + { "Channel Page", "zbee_zdp.channel_page", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + { &hf_zbee_zdp_channel_mask, { "Channels", "zbee_zdp.channel_mask", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, @@ -1724,18 +1772,54 @@ void proto_register_zbee_zdp(void) { &hf_zbee_zdp_rtg, { "Routing Table", "zbee_zdp.routing", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_zbee_zdp_rtg_entry, { "Routing Table Entry", "zbee_zdp.routing.entry", FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL }}, + { &hf_zbee_zdp_rtg_destination, { "Destination", "zbee_zdp.routing.destination", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_zbee_zdp_rtg_status, { "Status", "zbee_zdp.routing.status", FT_UINT8, BASE_DEC, VALS(zbee_zdp_rtg_status_vals), 0x0, NULL, HFILL }}, + { &hf_zbee_zdp_rtg_next_hop, { "Next Hop", "zbee_zdp.routing.next_hop", FT_UINT16, BASE_HEX, NULL, 0x0, - NULL, HFILL }} + NULL, HFILL }}, + + { &hf_zbee_zdp_ieee_join_start_index, + { "Start Index", "zbee_zdp.ieee_joining_list.start_index", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + { &hf_zbee_zdp_ieee_join_status, + { "Status", "zbee_zdp.ieee_joining_list.status", FT_UINT8, BASE_HEX, VALS(zbee_zdp_status_names), 0x0, + NULL, HFILL }}, + + { &hf_zbee_zdp_ieee_join_update_id, + { "Update Id", "zbee_zdp.ieee_joining_list.update_id", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + { &hf_zbee_zdp_ieee_join_policy, + { "Policy", "zbee_zdp.ieee_joining_list.policy", FT_UINT8, BASE_DEC, VALS(zbee_zdp_ieee_join_policy_vals), 0x0, + NULL, HFILL }}, + + { &hf_zbee_zdp_ieee_join_list_total, + { "List Total Count", "zbee_zdp.ieee_joining_list.total", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + { &hf_zbee_zdp_ieee_join_list_start, + { "List Start", "zbee_zdp.ieee_joining_list.start", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + { &hf_zbee_zdp_ieee_join_list_count, + { "List Count", "zbee_zdp.ieee_joining_list.count", FT_UINT8, BASE_DEC, NULL, 0x0, + NULL, HFILL }}, + + { &hf_zbee_zdp_ieee_join_list_ieee, + { "IEEE", "zbee_zdp.ieee_joining_list.ieee", FT_EUI64, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, }; diff --git a/epan/dissectors/packet-zbee-zdp.h b/epan/dissectors/packet-zbee-zdp.h index a7726ce16c..b580990909 100644 --- a/epan/dissectors/packet-zbee-zdp.h +++ b/epan/dissectors/packet-zbee-zdp.h @@ -72,6 +72,8 @@ #define ZBEE_ZDP_REQ_MGMT_PERMIT_JOIN 0x0036 /* ZigBee 2006 & later. */ #define ZBEE_ZDP_REQ_MGMT_CACHE 0x0037 /* ZigBee 2006 & later. */ #define ZBEE_ZDP_REQ_MGMT_NWKUPDATE 0x0038 /* ZigBee 2007 & later. */ +#define ZBEE_ZDP_REQ_MGMT_NWKUPDATE_ENH 0x0039 /* R22 */ +#define ZBEE_ZDP_REQ_MGMT_IEEE_JOIN_LIST 0x003a /* R22 */ #define ZBEE_ZDP_RSP_NWK_ADDR 0x8000 #define ZBEE_ZDP_RSP_IEEE_ADDR 0x8001 @@ -114,6 +116,8 @@ #define ZBEE_ZDP_RSP_MGMT_PERMIT_JOIN 0x8036 /* ZigBee 2006 & later. */ #define ZBEE_ZDP_RSP_MGMT_CACHE 0x8037 /* ZigBee 2006 & later. */ #define ZBEE_ZDP_RSP_MGMT_NWKUPDATE 0x8038 /* ZigBee 2007 & later. */ +/* ZBEE_ZDP_REQ_MGMT_NWKUPDATE_ENH returns ZBEE_ZDP_RSP_MGMT_NWKUPDATE so cluster 0x8039 is unused */ +#define ZBEE_ZDP_RSP_MGMT_IEEE_JOIN_LIST 0x803a /* R22 */ #define ZBEE_ZDP_MSG_RESPONSE_BIT 0x8000 #define ZBEE_ZDP_MSG_MASK (ZBEE_ZDP_MSG_RESPONSE_BIT-1) @@ -151,6 +155,7 @@ #define ZBEE_ZDP_NODE_FREQ_868MHZ 0x0800 #define ZBEE_ZDP_NODE_FREQ_900MHZ 0x2000 #define ZBEE_ZDP_NODE_FREQ_2400MHZ 0x4000 +#define ZBEE_ZDP_NODE_FREQ_EU_SUB_GHZ 0x8000 #define ZBEE_ZDP_NODE_SERVER_PRIMARY_TRUST 0x0001 #define ZBEE_ZDP_NODE_SERVER_BACKUP_TRUST 0x0002 @@ -189,9 +194,14 @@ #define ZBEE_ZDP_NWKUPDATE_CHANNEL_HOP 0xfe #define ZBEE_ZDP_NWKUPDATE_PARAMETERS 0xff +#define ZBEE_ZDP_NWKUPDATE_PAGE 0xF8000000 +#define ZBEE_ZDP_NWKUPDATE_CHANNEL 0x07FFFFFF + #define ZBEE_ZDP_DCF_EAELA 0x01 #define ZBEE_ZDP_DCF_ESDLA 0x02 + + /************************************** * Field Indicies ************************************** @@ -253,6 +263,8 @@ extern int hf_zbee_zdp_tx_total; extern int hf_zbee_zdp_tx_fail; extern int hf_zbee_zdp_channel_count; extern int hf_zbee_zdp_channel_mask; +extern int hf_zbee_zdp_channel_page; +extern int hf_zbee_zdp_channel_page_count; extern int hf_zbee_zdp_channel_energy; extern int hf_zbee_zdp_pan_eui64; extern int hf_zbee_zdp_pan_uint; @@ -272,6 +284,14 @@ extern int hf_zbee_zdp_table_entry_relationship_18; extern int hf_zbee_zdp_depth; extern int hf_zbee_zdp_permit_joining_03; extern int hf_zbee_zdp_lqi; +extern int hf_zbee_zdp_ieee_join_start_index; +extern int hf_zbee_zdp_ieee_join_status; +extern int hf_zbee_zdp_ieee_join_update_id; +extern int hf_zbee_zdp_ieee_join_policy; +extern int hf_zbee_zdp_ieee_join_list_total; +extern int hf_zbee_zdp_ieee_join_list_start; +extern int hf_zbee_zdp_ieee_join_list_count; +extern int hf_zbee_zdp_ieee_join_list_ieee; /* Routing Table */ extern int hf_zbee_zdp_rtg; @@ -321,7 +341,7 @@ extern void zdp_parse_complex_desc (proto_tree *tree, gint ettindex, tvb extern void zdp_parse_bind_table_entry (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint8 version); extern guint8 zdp_parse_status (proto_tree *tree, tvbuff_t *tvb, guint *offset); -extern guint32 zdp_parse_chanmask (proto_tree *tree, tvbuff_t *tvb, guint *offset, int hf_channel); +extern guint32 zdp_parse_chanmask (proto_tree *tree, tvbuff_t *tvb, guint *offset, int hf_page, int hf_channel); extern guint8 zdp_parse_cinfo (proto_tree *tree, gint ettindex, tvbuff_t *tvb, guint *offset); extern guint16 zdp_parse_server_flags (proto_tree *tree, gint ettindex, tvbuff_t *tvb, guint *offset); @@ -371,6 +391,8 @@ extern void dissect_zbee_zdp_req_mgmt_direct_join (tvbuff_t *tvb, packet_i extern void dissect_zbee_zdp_req_mgmt_permit_join (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); extern void dissect_zbee_zdp_req_mgmt_cache (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); extern void dissect_zbee_zdp_req_mgmt_nwkupdate (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); +extern void dissect_zbee_zdp_req_mgmt_nwkupdate_enh (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); +extern void dissect_zbee_zdp_req_mgmt_ieee_join_list (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); extern void dissect_zbee_zdp_rsp_nwk_addr (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); extern void dissect_zbee_zdp_rsp_ext_addr (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); @@ -415,6 +437,7 @@ extern void dissect_zbee_zdp_rsp_mgmt_direct_join (tvbuff_t *tvb, packet_i extern void dissect_zbee_zdp_rsp_mgmt_permit_join (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); extern void dissect_zbee_zdp_rsp_mgmt_cache (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); extern void dissect_zbee_zdp_rsp_mgmt_nwkupdate (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); +extern void dissect_zbee_zdp_rsp_mgmt_ieee_join_list (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree); extern const value_string zbee_zdp_cluster_names[]; extern const value_string zbee_zdp_rtg_status_vals[]; -- cgit v1.2.1