aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2013-12-26 15:08:18 +0000
committerMichael Mann <mmann78@netscape.net>2013-12-26 15:08:18 +0000
commitf563d1d4f8d20f3c12e154b74168cee044b687c7 (patch)
tree4712975d012e5ea2f43fe887b2183f76f96c8759
parent60b1c303828139a96b424c8fe99dc3607940faee (diff)
ZigBee Test Profile #2 and ZDP fixes. Bug 9584 (https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=9584)
From DSR Corporation svn path=/trunk/; revision=54466
-rw-r--r--epan/dissectors/packet-zbee-aps.c143
-rw-r--r--epan/dissectors/packet-zbee-aps.h28
-rw-r--r--epan/dissectors/packet-zbee-zdp.c41
-rw-r--r--epan/dissectors/packet-zbee-zdp.h8
4 files changed, 207 insertions, 13 deletions
diff --git a/epan/dissectors/packet-zbee-aps.c b/epan/dissectors/packet-zbee-aps.c
index c64633b8ad..dd9e491fe2 100644
--- a/epan/dissectors/packet-zbee-aps.c
+++ b/epan/dissectors/packet-zbee-aps.c
@@ -42,6 +42,7 @@
#include "packet-zbee-nwk.h"
#include "packet-zbee-security.h"
#include "packet-zbee-aps.h"
+#include "packet-zbee-zdp.h"
/*************************
* Function Declarations *
@@ -61,6 +62,7 @@ static guint dissect_zbee_aps_switch_key (tvbuff_t *tvb, packet_info *pinf
static guint dissect_zbee_aps_auth_challenge (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
static guint dissect_zbee_aps_auth_data (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset);
static guint dissect_zbee_aps_tunnel (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset, void *data);
+static guint dissect_zbee_t2 (tvbuff_t *tvb, proto_tree *tree, guint16 cluster_id);
/* Helper routine. */
static guint zbee_apf_transaction_len (tvbuff_t *tvb, guint offset, guint8 type);
@@ -134,9 +136,23 @@ static int hf_zbee_aps_reassembled_length = -1;
static gint ett_zbee_aps_fragment = -1;
static gint ett_zbee_aps_fragments = -1;
+/* Test Profile #2 indices. */
+static int hf_zbee_aps_t2_cluster = -1;
+static int hf_zbee_aps_t2_btres_octet_sequence = -1;
+static int hf_zbee_aps_t2_btres_octet_sequence_length_requested = -1;
+static int hf_zbee_aps_t2_btres_status = -1;
+static int hf_zbee_aps_t2_btreq_octet_sequence = -1;
+static int hf_zbee_aps_t2_btreq_octet_sequence_length = -1;
+
+/* ZDP indices. */
+static int hf_zbee_aps_zdp_cluster = -1;
+
/* Subtree indices for the ZigBee 2004 & earlier Application Framework. */
static gint ett_zbee_apf = -1;
+/* Subtree indices for the ZigBee Test Profile #2. */
+static gint ett_zbee_aps_t2 = -1;
+
static expert_field ei_zbee_aps_invalid_delivery_mode = EI_INIT;
static expert_field ei_zbee_aps_missing_payload = EI_INIT;
@@ -587,6 +603,37 @@ const value_string zbee_aps_cid_names[] = {
{ 0, NULL }
};
+/* APS Test Profile #2 Cluster Names */
+const value_string zbee_aps_t2_cid_names[] = {
+ { ZBEE_APS_T2_CID_BR, "Broadcast Request"},
+ { ZBEE_APS_T2_CID_BTADR, "Broadcast to All Devices Response"},
+ { ZBEE_APS_T2_CID_BTARACR, "Broadcast to All Routers and Coordinator Response"},
+ { ZBEE_APS_T2_CID_BTARXOWIDR, "Broadcast to All RXOnWhenIdle Devices Response"},
+ { ZBEE_APS_T2_CID_BTGREQ, "Buffer Test Group Request"},
+ { ZBEE_APS_T2_CID_BTGRES, "Buffer Test Group Response"},
+ { ZBEE_APS_T2_CID_BTREQ, "Buffer Test Request"},
+ { ZBEE_APS_T2_CID_BTRES, "Buffer Test Response"},
+ { ZBEE_APS_T2_CID_FNDR, "Freeform No Data Response"},
+ { ZBEE_APS_T2_CID_FREQ, "Freeform Request"},
+ { ZBEE_APS_T2_CID_FRES, "Freeform Response"},
+ { ZBEE_APS_T2_CID_PCR, "Packet Count Response"},
+ { ZBEE_APS_T2_CID_RDREQ, "Route Discovery Request"},
+ { ZBEE_APS_T2_CID_RDRES, "Route Discovery Response"},
+ { ZBEE_APS_T2_CID_RESPC, "Reset Packet Count"},
+ { ZBEE_APS_T2_CID_RETPC, "Retreive Packet Count"},
+ { ZBEE_APS_T2_CID_TCP, "Transmit Counted Packets"},
+
+ { 0, NULL }
+};
+
+/* APS Test Profile #2 Buffer Test Response Status Names */
+const value_string zbee_aps_t2_btres_status_names[] = {
+ { ZBEE_APS_T2_CID_BTRES_S_SBT, "Successful Buffer Test"},
+ { ZBEE_APS_T2_CID_BTRES_S_TFOFA, "Transmission Failure on First Attempt"},
+
+ { 0, NULL }
+};
+
/*FUNCTION:------------------------------------------------------
* NAME
* dissect_zbee_aps
@@ -761,8 +808,20 @@ dissect_zbee_aps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
if (nwk->version >= ZBEE_VERSION_2007) {
/* Cluster ID is 16-bits long in ZigBee 2007 and later. */
nwk->cluster_id = tvb_get_letohs(tvb, offset);
- proto_tree_add_item(aps_tree, hf_zbee_aps_cluster, tvb, offset,2, ENC_LITTLE_ENDIAN);
- offset +=2;
+ switch (tvb_get_letohs(tvb, offset + 2)) {
+ case ZBEE_DEVICE_PROFILE:
+ proto_tree_add_uint_format(aps_tree, hf_zbee_aps_zdp_cluster, tvb, offset, 2, nwk->cluster_id,
+ "%s (Cluster ID: 0x%04x)", val_to_str(nwk->cluster_id, zbee_zdp_cluster_names,
+ "Unknown Device Profile Cluster"), nwk->cluster_id);
+ break;
+ case ZBEE_PROFILE_T2:
+ proto_tree_add_item(aps_tree, hf_zbee_aps_t2_cluster, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ break;
+ default:
+ proto_tree_add_item(aps_tree, hf_zbee_aps_cluster, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ break;
+ }
+ offset += 2;
}
else {
/* Cluster ID is 8-bits long in ZigBee 2004 and earlier. */
@@ -960,6 +1019,11 @@ dissect_zbee_aps_no_endpt:
* If we get this far, then no subdissectors have been called, use the data
* dissector to display the leftover bytes, if any.
*/
+
+ if (payload_tvb && (packet.profile == ZBEE_PROFILE_T2)) {
+ payload_tvb = tvb_new_subset_remaining(payload_tvb, dissect_zbee_t2(payload_tvb, aps_tree, nwk->cluster_id));
+ }
+
if (payload_tvb) {
call_dissector(data_handle, payload_tvb, pinfo, tree);
}
@@ -1602,6 +1666,51 @@ dissect_app_end:
/*FUNCTION:------------------------------------------------------
* NAME
+ * dissect_zbee_t2
+ * DESCRIPTION
+ * ZigBee Test Profile #2 dissector for Wireshark.
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * packet_into *pinfo - pointer to packet information fields.
+ * guint16 clisuer_id - ZigBee Test Profile #2 cluster ID.
+ * RETURNS
+ * guint
+ *---------------------------------------------------------------
+ */
+static guint
+dissect_zbee_t2(tvbuff_t *tvb, proto_tree *tree, guint16 cluster_id)
+{
+ guint offset = 0;
+ guint8 payload_length;
+ proto_item *ti;
+ proto_tree *t2_tree;
+
+ ti = proto_tree_add_text(tree, tvb, 0, tvb_length(tvb), "ZigBee Test Profile #2");
+ t2_tree = proto_item_add_subtree(ti, ett_zbee_aps_t2);
+ switch (cluster_id) {
+ case ZBEE_APS_T2_CID_BTRES:
+ payload_length = tvb_get_guint8(tvb, offset);
+ proto_tree_add_uint(t2_tree, hf_zbee_aps_t2_btres_octet_sequence_length_requested, tvb, offset, 1,
+ payload_length);
+ offset += 1;
+ proto_tree_add_item(t2_tree, hf_zbee_aps_t2_btres_status, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(t2_tree, hf_zbee_aps_t2_btres_octet_sequence, tvb, offset, payload_length, ENC_NA);
+ offset += payload_length;
+ break;
+ case ZBEE_APS_T2_CID_BTREQ:
+ payload_length = tvb_get_guint8(tvb, offset);
+ proto_tree_add_uint(t2_tree, hf_zbee_aps_t2_btreq_octet_sequence_length, tvb, offset, 1, payload_length);
+ offset += 1;
+ proto_tree_add_item(t2_tree, hf_zbee_aps_t2_btreq_octet_sequence, tvb, offset, payload_length, ENC_NA);
+ offset += payload_length;
+ break;
+ }
+ return offset;
+} /* dissect_zbee_t2 */
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
* zbee_apf_transaction_len
* DESCRIPTION
* Peeks into the application framework, and determines the
@@ -1872,7 +1981,32 @@ void proto_register_zbee_aps(void)
{ &hf_zbee_aps_reassembled_length,
{ "Reassembled ZigBee APS length", "zbee_aps.reassembled.length", FT_UINT32, BASE_DEC, NULL, 0x0,
- NULL, HFILL }}
+ NULL, HFILL }},
+
+ { &hf_zbee_aps_t2_cluster,
+ { "Cluster", "zbee_aps.t2.cluster", FT_UINT16, BASE_HEX, VALS(zbee_aps_t2_cid_names), 0x0, NULL,
+ HFILL }},
+
+ { &hf_zbee_aps_t2_btres_octet_sequence,
+ { "Octet Sequence", "zbee_aps.t2.btres.octet_sequence", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+
+ { &hf_zbee_aps_t2_btres_octet_sequence_length_requested,
+ { "Octet Sequence Length Requested", "zbee_aps.t2.btres.octet_sequence_length_requested", FT_UINT8,
+ BASE_DEC, NULL, 0x0, NULL, HFILL }},
+
+ { &hf_zbee_aps_t2_btres_status,
+ { "Status", "zbee_aps.t2.btres.status", FT_UINT8, BASE_HEX, VALS(zbee_aps_t2_btres_status_names), 0x0,
+ NULL, HFILL }},
+
+ { &hf_zbee_aps_t2_btreq_octet_sequence,
+ { "Octet Sequence", "zbee_aps.t2.btreq.octet_sequence", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+
+ { &hf_zbee_aps_t2_btreq_octet_sequence_length,
+ { "Octet Sequence Length", "zbee_aps.t2.btreq.octet_sequence_length", FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_zbee_aps_zdp_cluster,
+ { "Cluster", "zbee_aps.zdp_cluster", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}
};
static hf_register_info hf_apf[] = {
@@ -1892,7 +2026,8 @@ void proto_register_zbee_aps(void)
&ett_zbee_aps_ext,
&ett_zbee_aps_cmd,
&ett_zbee_aps_fragment,
- &ett_zbee_aps_fragments
+ &ett_zbee_aps_fragments,
+ &ett_zbee_aps_t2
};
static gint *ett_apf[] = {
diff --git a/epan/dissectors/packet-zbee-aps.h b/epan/dissectors/packet-zbee-aps.h
index 527074304b..b22bbe08ca 100644
--- a/epan/dissectors/packet-zbee-aps.h
+++ b/epan/dissectors/packet-zbee-aps.h
@@ -219,6 +219,27 @@
#define ZBEE_ZCL_CID_APPLIANCE_EVENTS_AND_ALERT 0x0b02
#define ZBEE_ZCL_CID_APPLIANCE_STATISTICS 0x0b03
+/* ZCL Test Profile #2 Clusters */
+#define ZBEE_APS_T2_CID_TCP 0x0001
+#define ZBEE_APS_T2_CID_RESPC 0x0002
+#define ZBEE_APS_T2_CID_RETPC 0x0003
+#define ZBEE_APS_T2_CID_PCR 0x0004
+#define ZBEE_APS_T2_CID_BTREQ 0x001c
+#define ZBEE_APS_T2_CID_BTGREQ 0x001d
+#define ZBEE_APS_T2_CID_BTRES 0x0054
+#define ZBEE_APS_T2_CID_BTRES_S_SBT 0x00
+#define ZBEE_APS_T2_CID_BTRES_S_TFOFA 0x01
+#define ZBEE_APS_T2_CID_BTGRES 0x0055
+#define ZBEE_APS_T2_CID_RDREQ 0x1000
+#define ZBEE_APS_T2_CID_RDRES 0x1001
+#define ZBEE_APS_T2_CID_FREQ 0xa0a8
+#define ZBEE_APS_T2_CID_FRES 0xe000
+#define ZBEE_APS_T2_CID_FNDR 0xe001
+#define ZBEE_APS_T2_CID_BR 0xf000
+#define ZBEE_APS_T2_CID_BTADR 0xf001
+#define ZBEE_APS_T2_CID_BTARXOWIDR 0xf00a
+#define ZBEE_APS_T2_CID_BTARACR 0xf00e
+
/* Structure to contain the APS frame information */
typedef struct{
gboolean indirect_mode; /* ZigBee 2004 and Earlier */
@@ -246,4 +267,11 @@ typedef struct{
gboolean src_present;
} zbee_aps_packet;
+/**************************************
+ * Value Strings
+ **************************************
+ */
+
+extern const value_string zbee_aps_cid_names[];
+
#endif /* PACKET_ZBEE_APS_H*/
diff --git a/epan/dissectors/packet-zbee-zdp.c b/epan/dissectors/packet-zbee-zdp.c
index 778cb29a33..c91d48e699 100644
--- a/epan/dissectors/packet-zbee-zdp.c
+++ b/epan/dissectors/packet-zbee-zdp.c
@@ -103,7 +103,10 @@ static int hf_zbee_zdp_node_freq_900 = -1;
static int hf_zbee_zdp_node_freq_2400 = -1;
static int hf_zbee_zdp_node_manufacturer = -1;
static int hf_zbee_zdp_node_max_buffer = -1;
-static int hf_zbee_zdp_node_max_transfer = -1;
+static int hf_zbee_zdp_node_max_incoming_transfer = -1;
+static int hf_zbee_zdp_node_max_outgoing_transfer = -1;
+static int hf_zbee_zdp_dcf_eaela = -1;
+static int hf_zbee_zdp_dcf_esdla = -1;
/* Power descriptor indicies. */
static int hf_zbee_zdp_power_mode = -1;
@@ -182,6 +185,7 @@ static gint ett_zbee_zdp_bind_table = -1;
gint ett_zbee_zdp_lqi = -1;
gint ett_zbee_zdp_rtg = -1;
gint ett_zbee_zdp_cache = -1;
+ gint ett_zbee_zdp_descriptor_capability_field = -1;
/* Data dissector handle. */
static dissector_handle_t data_handle;
@@ -196,7 +200,7 @@ static const value_string zbee_zdp_req_types[] = {
{ 0, NULL }
};
-static const value_string zbee_zdp_cluster_names[] = {
+const value_string zbee_zdp_cluster_names[] = {
{ ZBEE_ZDP_REQ_NWK_ADDR, "Network Address Request" },
{ ZBEE_ZDP_REQ_IEEE_ADDR, "Extended Address Request" },
{ ZBEE_ZDP_REQ_NODE_DESC, "Node Descriptor Request" },
@@ -661,7 +665,7 @@ zdp_parse_server_flags(proto_tree *tree, gint ettindex, tvbuff_t *tvb, guint *of
flags = tvb_get_letohs(tvb, *offset);
if (tree) {
if (ettindex != -1) {
- ti = proto_tree_add_text(tree, tvb, *offset, (int)sizeof(guint8), "Server Flags");
+ ti = proto_tree_add_text(tree, tvb, *offset, 2, "Server Flags");
field_tree = proto_item_add_subtree(ti, ettindex);
}
else field_tree = tree;
@@ -702,6 +706,7 @@ zdp_parse_node_desc(proto_tree *tree, gint ettindex, tvbuff_t *tvb, guint *offse
proto_item *field_root = NULL;
proto_tree *field_tree = NULL;
+ guint8 d_c_field;
guint16 flags;
/*guint8 capability;*/
/*guint16 mfr_code;*/
@@ -737,11 +742,20 @@ zdp_parse_node_desc(proto_tree *tree, gint ettindex, tvbuff_t *tvb, guint *offse
/*capability =*/ zdp_parse_cinfo(field_tree, ett_zbee_zdp_cinfo, tvb, offset);
/*mfr_code =*/ zbee_parse_uint(field_tree, hf_zbee_zdp_node_manufacturer, tvb, offset, (int)sizeof(guint16), NULL);
/*max_buff =*/ zbee_parse_uint(field_tree, hf_zbee_zdp_node_max_buffer, tvb, offset, (int)sizeof(guint8), NULL);
- /*max_transfer =*/ zbee_parse_uint(field_tree, hf_zbee_zdp_node_max_transfer, tvb, offset, (int)sizeof(guint16), NULL);
+ /*max_incoming_transfer =*/ zbee_parse_uint(field_tree, hf_zbee_zdp_node_max_incoming_transfer, tvb, offset, 2, NULL);
/* Get and display the server flags. */
if (version >= ZBEE_VERSION_2007) {
zdp_parse_server_flags(field_tree, ett_zbee_zdp_server, tvb, offset);
+ zbee_parse_uint(field_tree, hf_zbee_zdp_node_max_outgoing_transfer, tvb, offset, 2, NULL);
+ d_c_field = tvb_get_guint8(tvb, *offset);
+ if (tree) {
+ ti = proto_tree_add_text(field_tree, tvb, *offset, 1, "Descriptor Capability Field");
+ field_tree = proto_item_add_subtree(ti, ett_zbee_zdp_descriptor_capability_field);
+ }
+ proto_tree_add_boolean(field_tree, hf_zbee_zdp_dcf_eaela, tvb, *offset, 1, d_c_field & ZBEE_ZDP_DCF_EAELA);
+ proto_tree_add_boolean(field_tree, hf_zbee_zdp_dcf_esdla, tvb, *offset, 1, d_c_field & ZBEE_ZDP_DCF_ESDLA);
+ *offset += 1;
}
/* Correct the length of the subtree. */
@@ -1415,6 +1429,14 @@ void proto_register_zbee_zdp(void)
{ "Allocate Short Address", "zbee_zdp.cinfo.alloc", FT_BOOLEAN, 8, NULL, ZBEE_CINFO_ALLOC,
"Flag requesting the parent to allocate a short address for this device.", HFILL }},
+ { &hf_zbee_zdp_dcf_eaela,
+ { "Extended Active Endpoint List Available", "zbee_zdp.dcf.eaela", FT_BOOLEAN, 8, NULL, ZBEE_ZDP_DCF_EAELA,
+ NULL, HFILL }},
+
+ { &hf_zbee_zdp_dcf_esdla,
+ { "Extended Simple Descriptor List Available", "zbee_zdp.dcf.esdla", FT_BOOLEAN, 8, NULL, ZBEE_ZDP_DCF_ESDLA,
+ NULL, HFILL }},
+
{ &hf_zbee_zdp_server_pri_trust,
{ "Primary Trust Center", "zbee_zdp.server.pri_trust", FT_BOOLEAN, 16, NULL, ZBEE_ZDP_NODE_SERVER_PRIMARY_TRUST,
NULL, HFILL }},
@@ -1471,8 +1493,12 @@ void proto_register_zbee_zdp(void)
{ "Max Buffer Size", "zbee_zdp.node.max_buffer", FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
- { &hf_zbee_zdp_node_max_transfer,
- { "Max Transfer Size", "zbee_zdp.node.max_transfer", FT_UINT16, BASE_DEC, NULL, 0x0,
+ { &hf_zbee_zdp_node_max_incoming_transfer,
+ { "Max Incoming Transfer Size", "zbee_zdp.node.max_incoming_transfer", FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }},
+
+ { &hf_zbee_zdp_node_max_outgoing_transfer,
+ { "Max Outgoing Transfer Size", "zbee_zdp.node.max_outgoing_transfer", FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }},
{ &hf_zbee_zdp_power_mode,
@@ -1659,7 +1685,8 @@ void proto_register_zbee_zdp(void)
&ett_zbee_zdp_nwk,
&ett_zbee_zdp_lqi,
&ett_zbee_zdp_rtg,
- &ett_zbee_zdp_cache
+ &ett_zbee_zdp_cache,
+ &ett_zbee_zdp_descriptor_capability_field,
};
/* Register ZigBee ZDP protocol with Wireshark. */
diff --git a/epan/dissectors/packet-zbee-zdp.h b/epan/dissectors/packet-zbee-zdp.h
index fa022bef2c..c1af4160cd 100644
--- a/epan/dissectors/packet-zbee-zdp.h
+++ b/epan/dissectors/packet-zbee-zdp.h
@@ -178,13 +178,16 @@
#define ZBEE_ZDP_ADDR_MODE_GROUP 0x01
#define ZBEE_ZDP_ADDR_MODE_UNICAST 0x03
-#define ZBEE_ZDP_MGMT_LEAVE_CHILDREN 0x80
-#define ZBEE_ZDP_MGMT_LEAVE_REJOIN 0x40
+#define ZBEE_ZDP_MGMT_LEAVE_CHILDREN 0x40
+#define ZBEE_ZDP_MGMT_LEAVE_REJOIN 0x80
#define ZBEE_ZDP_NWKUPDATE_SCAN_MAX 0x05
#define ZBEE_ZDP_NWKUPDATE_CHANNEL_HOP 0xfe
#define ZBEE_ZDP_NWKUPDATE_PARAMETERS 0xff
+#define ZBEE_ZDP_DCF_EAELA 0x01
+#define ZBEE_ZDP_DCF_ESDLA 0x02
+
/**************************************
* Field Indicies
**************************************
@@ -376,5 +379,6 @@ extern void dissect_zbee_zdp_rsp_mgmt_cache (tvbuff_t *tvb, packet_info
extern void dissect_zbee_zdp_rsp_mgmt_nwkupdate (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
extern void zdp_parse_bind_table_entry(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint8 version);
+extern const value_string zbee_zdp_cluster_names[];
#endif /* PACKET_ZBEE_ZDP_H */