diff options
author | Michael Mann <mmann78@netscape.net> | 2013-12-26 15:08:18 +0000 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2013-12-26 15:08:18 +0000 |
commit | f563d1d4f8d20f3c12e154b74168cee044b687c7 (patch) | |
tree | 4712975d012e5ea2f43fe887b2183f76f96c8759 | |
parent | 60b1c303828139a96b424c8fe99dc3607940faee (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.c | 143 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-aps.h | 28 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zdp.c | 41 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zdp.h | 8 |
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 */ |