summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Brandson <chris.brandson@gmail.com>2014-11-07 14:11:02 -0800
committerAnders Broman <a.broman58@gmail.com>2014-12-17 11:53:26 +0000
commitdf639f509e812fff3c5eb4bdf4f77988c6ec122b (patch)
tree2d6733280c8596f2dfacc878c878b469d301428f
parentc5b720708e75562d1b8676fd5ab75f9d7b338652 (diff)
downloadwireshark-df639f509e812fff3c5eb4bdf4f77988c6ec122b.tar.gz
Fixed bug in ZigBee (zbee) decryption, added Key Establishment cluster and moved IAS, Thermostat and Poll clusters out of the ZCL foundation dissector.
Removed attrID and cmdID ZCL cluster functions. Bug in ZCL HVAC attribute registration. Fixed bug in ZCL command ID field registration. Update Manufacturer Codes and Profile Ids to ZigBee-053874r26 Oct 2014 Fixed broken fragmented ZigBee packet collection and reassembly Use protocol fields for Thermostat schedule transitions. Added support for Key Establishment Cluster (CBKE) at SE 1.2a Updated Message cluster to SE 1.2a spec Added attribute reporting status which is common to all SE 1.2a clusters Added SE 1.2a tunnel cluster support ZigBee Smart Energy (SE) decryption appears to have been broken for some time. For SE you do not know the Link Key until after successful completion of Key Establishment and then manually enter it into preferences. Entry in preferences was broken such that when the new Link Key was entered all existing link keys would be lost. This lead to the loss of the Network Key as well when the Transport Key message was re-processed without the Pre-Configured Link Key. The Link Key 'key ring' has been moved to the UAT post-update callback so that it will always be updated correctly after changes to the link keys in preferences The attribute reporting status attribute which is common to all SE clusters was accidentally shared, now each cluster has it's own instance ZigBee security added key display for decrypted packets ZigBee Security Preferences fixed UAT type for Label so key label is editable again Added definition for Retail Service profile Added dissection for profile-wide (General Command Frame) commands when the profile is unknown Added zbee-zcl-misc.c to precommit check whitelist as it contains ias and hvac clusters avoiding proliferation of too many small files Change-Id: I53d85ba9d782db6a0e7e78c51b0bc7cdcdbca3ad Reviewed-on: https://code.wireshark.org/review/5565 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--epan/CMakeLists.txt1
-rw-r--r--epan/dissectors/Makefile.common1
-rw-r--r--epan/dissectors/packet-zbee-aps.c202
-rw-r--r--epan/dissectors/packet-zbee-aps.h11
-rw-r--r--epan/dissectors/packet-zbee-nwk.c20
-rw-r--r--epan/dissectors/packet-zbee-security.c91
-rw-r--r--epan/dissectors/packet-zbee-zcl-general.c752
-rw-r--r--epan/dissectors/packet-zbee-zcl-ha.c174
-rw-r--r--epan/dissectors/packet-zbee-zcl-meas-sensing.c122
-rw-r--r--epan/dissectors/packet-zbee-zcl-misc.c1115
-rw-r--r--epan/dissectors/packet-zbee-zcl-se.c1726
-rw-r--r--epan/dissectors/packet-zbee-zcl.c1360
-rw-r--r--epan/dissectors/packet-zbee-zcl.h13
-rw-r--r--epan/dissectors/packet-zbee.h1109
-rw-r--r--epan/tfs.c3
-rw-r--r--epan/tfs.h5
-rwxr-xr-xtools/checkfiltername.pl2
17 files changed, 4471 insertions, 2236 deletions
diff --git a/epan/CMakeLists.txt b/epan/CMakeLists.txt
index 823cfc1511..294570549a 100644
--- a/epan/CMakeLists.txt
+++ b/epan/CMakeLists.txt
@@ -1424,6 +1424,7 @@ set(DISSECTOR_SRC
dissectors/packet-zbee-zcl-general.c
dissectors/packet-zbee-zcl-ha.c
dissectors/packet-zbee-zcl-meas-sensing.c
+ dissectors/packet-zbee-zcl-misc.c
dissectors/packet-zbee-zcl-se.c
dissectors/packet-zbee-zdp-binding.c
dissectors/packet-zbee-zdp-discovery.c
diff --git a/epan/dissectors/Makefile.common b/epan/dissectors/Makefile.common
index d58116b885..903f947c06 100644
--- a/epan/dissectors/Makefile.common
+++ b/epan/dissectors/Makefile.common
@@ -1334,6 +1334,7 @@ DISSECTOR_SRC = \
packet-zbee-zcl-general.c \
packet-zbee-zcl-ha.c \
packet-zbee-zcl-meas-sensing.c \
+ packet-zbee-zcl-misc.c \
packet-zbee-zcl-se.c \
packet-zbee-zdp-binding.c \
packet-zbee-zdp-discovery.c \
diff --git a/epan/dissectors/packet-zbee-aps.c b/epan/dissectors/packet-zbee-aps.c
index 3a4fadbe20..fe25445152 100644
--- a/epan/dissectors/packet-zbee-aps.c
+++ b/epan/dissectors/packet-zbee-aps.c
@@ -90,6 +90,7 @@ static int hf_zbee_aps_src = -1;
static int hf_zbee_aps_counter = -1;
static int hf_zbee_aps_fragmentation = -1;
static int hf_zbee_aps_block_number = -1;
+static int hf_zbee_aps_block_ack = -1;
static int hf_zbee_aps_block_ack1 = -1;
static int hf_zbee_aps_block_ack2 = -1;
static int hf_zbee_aps_block_ack3 = -1;
@@ -155,6 +156,7 @@ static int hf_zbee_aps_zdp_cluster = -1;
/* Subtree indices for the ZigBee 2004 & earlier Application Framework. */
static gint ett_zbee_apf = -1;
+static gint ett_zbee_aps_frag_ack = -1;
/* Subtree indices for the ZigBee Test Profile #2. */
static gint ett_zbee_aps_t2 = -1;
@@ -325,6 +327,7 @@ const range_string zbee_aps_apid_names[] = {
{ ZBEE_PROFILE_TA, ZBEE_PROFILE_TA, "Telecom Automation" },
{ ZBEE_PROFILE_HC, ZBEE_PROFILE_HC, "Health Care" },
{ ZBEE_PROFILE_SE, ZBEE_PROFILE_SE, "Smart Energy" },
+ { ZBEE_PROFILE_RS, ZBEE_PROFILE_RS, "Retail Services" },
{ ZBEE_PROFILE_STD_MIN, ZBEE_PROFILE_STD_MAX, "Unknown ZigBee Standard" },
{ ZBEE_PROFILE_T2, ZBEE_PROFILE_T2, "Test Profile #2" },
@@ -336,7 +339,7 @@ const range_string zbee_aps_apid_names[] = {
{ ZBEE_PROFILE_MFR_SPEC_ORG_MIN, ZBEE_PROFILE_MFR_SPEC_ORG_MAX,
"Unallocated Manufacturer-Specific" },
- { ZBEE_PROFILE_IEEE_1451_5, ZBEE_PROFILE_IEEE_1451_5, "IEEE_1451_5" },
+ { ZBEE_PROFILE_IEEE_1451_5, ZBEE_PROFILE_IEEE_1451_5, "IEEE_1451_5" },
/* Manufacturer Allocations */
{ ZBEE_PROFILE_CIRRONET_0_MIN, ZBEE_PROFILE_CIRRONET_0_MAX, ZBEE_MFG_CIRRONET },
@@ -458,33 +461,41 @@ const range_string zbee_aps_apid_names[] = {
{ ZBEE_PROFILE_4_NOKS_MIN, ZBEE_PROFILE_4_NOKS_MAX, ZBEE_MFG_4_NOKS },
{ ZBEE_PROFILE_PROFILE_SYS_MIN, ZBEE_PROFILE_PROFILE_SYS_MAX, ZBEE_MFG_PROFILE_SYS },
{ ZBEE_PROFILE_FREESTYLE_MIN, ZBEE_PROFILE_FREESTYLE_MAX, ZBEE_MFG_FREESTYLE },
- { ZBEE_PROFILE_REMOTE_MIN, ZBEE_PROFILE_REMOTE_MAX, ZBEE_MFG_REMOTE },
+ { ZBEE_PROFILE_REMOTE_MIN, ZBEE_PROFILE_REMOTE_MAX, ZBEE_MFG_REMOTE_TECH },
{ ZBEE_PROFILE_WAVECOM_MIN, ZBEE_PROFILE_WAVECOM_MAX, ZBEE_MFG_WAVECOM },
- { ZBEE_PROFILE_ENERGY_OPT_MIN, ZBEE_PROFILE_ENERGY_OPT_MAX, ZBEE_MFG_ENERGY_OPT },
+ { ZBEE_PROFILE_ENERGY_OPT_MIN, ZBEE_PROFILE_ENERGY_OPT_MAX, ZBEE_MFG_GREEN_ENERGY },
{ ZBEE_PROFILE_GE_MIN, ZBEE_PROFILE_GE_MAX, ZBEE_MFG_GE },
{ ZBEE_PROFILE_MESHWORKS_MIN, ZBEE_PROFILE_MESHWORKS_MAX, ZBEE_MFG_MESHWORKS },
{ ZBEE_PROFILE_ELLIPS_MIN, ZBEE_PROFILE_ELLIPS_MAX, ZBEE_MFG_ELLIPS },
{ ZBEE_PROFILE_CEDO_MIN, ZBEE_PROFILE_CEDO_MAX, ZBEE_MFG_CEDO },
- { ZBEE_PROFILE_A_D_MIN, ZBEE_PROFILE_A_D_MAX, ZBEE_MFG_A_D },
+ { ZBEE_PROFILE_A_D_MIN, ZBEE_PROFILE_A_D_MAX, ZBEE_MFG_A_AND_D },
{ ZBEE_PROFILE_CARRIER_MIN, ZBEE_PROFILE_CARRIER_MAX, ZBEE_MFG_CARRIER },
- { ZBEE_PROFILE_PASSIVESYS_MIN, ZBEE_PROFILE_PASSIVESYS_MAX, ZBEE_MFG_PASSIVESYS },
- { ZBEE_PROFILE_HOME_AUTO_MIN, ZBEE_PROFILE_HOME_AUTO_MAX, ZBEE_MFG_HOME_AUTO },
+ { ZBEE_PROFILE_PASSIVESYS_MIN, ZBEE_PROFILE_PASSIVESYS_MAX, ZBEE_MFG_PASSIVE },
{ ZBEE_PROFILE_SUNRISE_MIN, ZBEE_PROFILE_SUNRISE_MAX, ZBEE_MFG_SUNRISE },
- { ZBEE_PROFILE_MEMTEC_MIN, ZBEE_PROFILE_MEMTEC_MAX, ZBEE_MFG_MEMTEC },
+ { ZBEE_PROFILE_MEMTEC_MIN, ZBEE_PROFILE_MEMTEC_MAX, ZBEE_MFG_MEMTECH },
{ ZBEE_PROFILE_BRITISH_GAS_MIN, ZBEE_PROFILE_BRITISH_GAS_MAX, ZBEE_MFG_BRITISH_GAS },
{ ZBEE_PROFILE_SENTEC_MIN, ZBEE_PROFILE_SENTEC_MAX, ZBEE_MFG_SENTEC },
{ ZBEE_PROFILE_NAVETAS_MIN, ZBEE_PROFILE_NAVETAS_MAX, ZBEE_MFG_NAVETAS },
{ ZBEE_PROFILE_ENERNOC_MIN, ZBEE_PROFILE_ENERNOC_MAX, ZBEE_MFG_ENERNOC },
{ ZBEE_PROFILE_ELTAV_MIN, ZBEE_PROFILE_ELTAV_MAX, ZBEE_MFG_ELTAV },
{ ZBEE_PROFILE_XSTREAMHD_MIN, ZBEE_PROFILE_XSTREAMHD_MAX, ZBEE_MFG_XSTREAMHD },
- { ZBEE_PROFILE_GREEN_MIN, ZBEE_PROFILE_GREEN_MAX, ZBEE_MFG_GREEN },
{ ZBEE_PROFILE_OMRON_MIN, ZBEE_PROFILE_OMRON_MAX, ZBEE_MFG_OMRON },
{ ZBEE_PROFILE_NEC_TOKIN_MIN, ZBEE_PROFILE_NEC_TOKIN_MAX, ZBEE_MFG_NEC_TOKIN },
{ ZBEE_PROFILE_PEEL_MIN, ZBEE_PROFILE_PEEL_MAX, ZBEE_MFG_PEEL },
{ ZBEE_PROFILE_ELECTROLUX_MIN, ZBEE_PROFILE_ELECTROLUX_MAX, ZBEE_MFG_ELECTROLUX },
{ ZBEE_PROFILE_SAMSUNG_MIN, ZBEE_PROFILE_SAMSUNG_MAX, ZBEE_MFG_SAMSUNG },
{ ZBEE_PROFILE_MAINSTREAM_MIN, ZBEE_PROFILE_MAINSTREAM_MAX, ZBEE_MFG_MAINSTREAM },
-
+ { ZBEE_PROFILE_DIGI_MIN, ZBEE_PROFILE_DIGI_MAX, ZBEE_MFG_DIGI },
+ { ZBEE_PROFILE_RADIOCRAFTS_MIN, ZBEE_PROFILE_RADIOCRAFTS_MAX, ZBEE_MFG_RADIOCRAFTS },
+ { ZBEE_PROFILE_SCHNEIDER2_MIN, ZBEE_PROFILE_SCHNEIDER2_MAX, ZBEE_MFG_SCHNEIDER },
+ { ZBEE_PROFILE_HUAWEI_MIN, ZBEE_PROFILE_HUAWEI_MAX, ZBEE_MFG_HUAWEI },
+ { ZBEE_PROFILE_BGLOBAL_MIN, ZBEE_PROFILE_BGLOBAL_MAX, ZBEE_MFG_BGLOBAL },
+ { ZBEE_PROFILE_ABB_MIN, ZBEE_PROFILE_ABB_MAX, ZBEE_MFG_ABB },
+ { ZBEE_PROFILE_GENUS_MIN, ZBEE_PROFILE_GENUS_MAX, ZBEE_MFG_GENUS },
+ { ZBEE_PROFILE_UBISYS_MIN, ZBEE_PROFILE_UBISYS_MAX, ZBEE_MFG_UBISYS },
+ { ZBEE_PROFILE_CRESTRON_MIN, ZBEE_PROFILE_CRESTRON_MAX, ZBEE_MFG_CRESTRON },
+ { ZBEE_PROFILE_AAC_TECH_MIN, ZBEE_PROFILE_AAC_TECH_MAX, ZBEE_MFG_AAC_TECH },
+ { ZBEE_PROFILE_STEELCASE_MIN, ZBEE_PROFILE_STEELCASE_MAX, ZBEE_MFG_STEELCASE },
{ 0, 0, NULL }
};
@@ -499,8 +510,8 @@ const range_string zbee_aps_apid_abbrs[] = {
{ ZBEE_PROFILE_TA, ZBEE_PROFILE_TA, "TA" },
{ ZBEE_PROFILE_HC, ZBEE_PROFILE_HC, "HC" },
{ ZBEE_PROFILE_SE, ZBEE_PROFILE_SE, "SE" },
+ { ZBEE_PROFILE_RS, ZBEE_PROFILE_RS, "RS" },
{ ZBEE_PROFILE_T2, ZBEE_PROFILE_T2, "T2" },
-
/* Manufacturer Allocations */
{ ZBEE_PROFILE_C4_MIN, ZBEE_PROFILE_C4_MAX, "C4" },
@@ -592,13 +603,21 @@ const value_string zbee_aps_cid_names[] = {
{ ZBEE_ZCL_CID_BACNET_MULTISTATE_VALUE_REG, "BACnet Multistage Value (Regular)"},
{ ZBEE_ZCL_CID_BACNET_MULTISTATE_VALUE_EXT, "BACnet Multistage Value (Extended)"},
-/* Smart Energy */
+/* ZCL Cluster IDs - Smart Energy */
{ ZBEE_ZCL_CID_PRICE, "Price"},
{ ZBEE_ZCL_CID_DEMAND_RESPONSE_LOAD_CONTROL, "Demand Response and Load Control"},
{ ZBEE_ZCL_CID_SIMPLE_METERING, "Simple Metering"},
{ ZBEE_ZCL_CID_MESSAGE, "Message"},
- { ZBEE_ZCL_CID_SMART_ENERGY_TUNNELING, "Smart Energy Tunneling"},
+ { ZBEE_ZCL_CID_TUNNELING, "Tunneling"},
{ ZBEE_ZCL_CID_PRE_PAYMENT, "Pre-Payment"},
+ { ZBEE_ZCL_CID_ENERGY_MANAGEMENT, "Energy Management"},
+ { ZBEE_ZCL_CID_CALENDAR, "Calendar"},
+ { ZBEE_ZCL_CID_DEVICE_MANAGEMENT, "Device Management"},
+ { ZBEE_ZCL_CID_EVENTS, "Events"},
+ { ZBEE_ZCL_CID_MDU_PAIRING, "MDU Pairing"},
+
+/* ZCL Cluster IDs - Key Establishment */
+ { ZBEE_ZCL_CID_KE, "Key Establishment"},
/* ZCL Cluster IDs - Home Automation */
{ZBEE_ZCL_CID_APPLIANCE_IDENTIFICATION, "Appliance Identification"},
@@ -640,6 +659,16 @@ const value_string zbee_aps_t2_btres_status_names[] = {
{ 0, NULL }
};
+/* APS Fragmented Block Acknowledgements */
+#define ZBEE_APS_FRAG_BLOCK1_ACK 0x01
+#define ZBEE_APS_FRAG_BLOCK2_ACK 0x02
+#define ZBEE_APS_FRAG_BLOCK3_ACK 0x04
+#define ZBEE_APS_FRAG_BLOCK4_ACK 0x08
+#define ZBEE_APS_FRAG_BLOCK5_ACK 0x10
+#define ZBEE_APS_FRAG_BLOCK6_ACK 0x20
+#define ZBEE_APS_FRAG_BLOCK7_ACK 0x40
+#define ZBEE_APS_FRAG_BLOCK8_ACK 0x80
+
/*FUNCTION:------------------------------------------------------
* NAME
* dissect_zbee_aps
@@ -657,17 +686,30 @@ static int
dissect_zbee_aps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
{
tvbuff_t *payload_tvb = NULL;
- dissector_handle_t profile_handle = NULL;
-
- proto_tree *aps_tree;
- proto_tree *field_tree;
- proto_item *proto_root;
-
- zbee_aps_packet packet;
- zbee_nwk_packet *nwk;
-
- guint8 fcf;
- guint8 offset = 0;
+ dissector_handle_t profile_handle = NULL;
+ dissector_handle_t zcl_handle = NULL;
+
+ proto_tree *aps_tree;
+ proto_tree *field_tree;
+ proto_item *proto_root;
+
+ zbee_aps_packet packet;
+ zbee_nwk_packet *nwk;
+
+ guint8 fcf;
+ guint8 offset = 0;
+
+ static const int * frag_ack_flags[] = {
+ &hf_zbee_aps_block_ack1,
+ &hf_zbee_aps_block_ack2,
+ &hf_zbee_aps_block_ack3,
+ &hf_zbee_aps_block_ack4,
+ &hf_zbee_aps_block_ack5,
+ &hf_zbee_aps_block_ack6,
+ &hf_zbee_aps_block_ack7,
+ &hf_zbee_aps_block_ack8,
+ NULL
+ };
/* Reject the packet if data is NULL */
if (data == NULL)
@@ -678,7 +720,7 @@ dissect_zbee_aps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
memset(&packet, 0, sizeof(zbee_aps_packet));
/* Create the protocol tree */
- proto_root = proto_tree_add_protocol_format(tree, proto_zbee_aps, tvb, offset, tvb_length(tvb), "ZigBee Application Support Layer");
+ proto_root = proto_tree_add_protocol_format(tree, proto_zbee_aps, tvb, offset, tvb_captured_length(tvb), "ZigBee Application Support Layer");
aps_tree = proto_item_add_subtree(proto_root, ett_zbee_aps);
/* Set the protocol column, if the NWK layer hasn't already done so. */
@@ -782,7 +824,7 @@ dissect_zbee_aps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data
else {
/* Illegal Delivery Mode. */
expert_add_info(pinfo, proto_root, &ei_zbee_aps_invalid_delivery_mode);
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
}
@@ -890,29 +932,9 @@ dissect_zbee_aps_no_endpt:
offset += 1;
}
- /* If fragmentation is enabled, and this is an acknowledgement,
- * get and display the ack bitfield.
- */
+ /* If fragmentation is enabled, and this is an acknowledgement, get and display the ack bitfield. */
if ((packet.fragmentation != ZBEE_APS_EXT_FCF_FRAGMENT_NONE) && (packet.type == ZBEE_APS_FCF_ACK)) {
- packet.ack_bitfield = tvb_get_guint8(tvb, offset);
- if (tree) {
- proto_tree_add_uint_format_value(field_tree, hf_zbee_aps_block_ack1, tvb, offset, 1,
- packet.ack_bitfield, " (%d) %s", packet.block_number, (packet.ack_bitfield & 0x01)?"Acknowledged":"Not Acknowledged");
- proto_tree_add_uint_format_value(field_tree, hf_zbee_aps_block_ack2, tvb, offset, 1,
- packet.ack_bitfield, " (%d) %s", packet.block_number+1, (packet.ack_bitfield & 0x02)?"Acknowledged":"Not Acknowledged");
- proto_tree_add_uint_format_value(field_tree, hf_zbee_aps_block_ack3, tvb, offset, 1,
- packet.ack_bitfield, " (%d) %s", packet.block_number+2, (packet.ack_bitfield & 0x04)?"Acknowledged":"Not Acknowledged");
- proto_tree_add_uint_format_value(field_tree, hf_zbee_aps_block_ack4, tvb, offset, 1,
- packet.ack_bitfield, " (%d) %s", packet.block_number+3, (packet.ack_bitfield & 0x08)?"Acknowledged":"Not Acknowledged");
- proto_tree_add_uint_format_value(field_tree, hf_zbee_aps_block_ack5, tvb, offset, 1,
- packet.ack_bitfield, " (%d) %s", packet.block_number+4, (packet.ack_bitfield & 0x10)?"Acknowledged":"Not Acknowledged");
- proto_tree_add_uint_format_value(field_tree, hf_zbee_aps_block_ack6, tvb, offset, 1,
- packet.ack_bitfield, " (%d) %s", packet.block_number+5, (packet.ack_bitfield & 0x20)?"Acknowledged":"Not Acknowledged");
- proto_tree_add_uint_format_value(field_tree, hf_zbee_aps_block_ack7, tvb, offset, 1,
- packet.ack_bitfield, " (%d) %s", packet.block_number+6, (packet.ack_bitfield & 0x40)?"Acknowledged":"Not Acknowledged");
- proto_tree_add_uint_format_value(field_tree, hf_zbee_aps_block_ack8, tvb, offset, 1,
- packet.ack_bitfield, " (%d) %s", packet.block_number+7, (packet.ack_bitfield & 0x80)?"Acknowledged":"Not Acknowledged");
- }
+ proto_tree_add_bitmask(field_tree, tvb, offset, hf_zbee_aps_block_ack, ett_zbee_aps_frag_ack, frag_ack_flags, ENC_NA);
offset += 1;
}
}
@@ -924,15 +946,15 @@ dissect_zbee_aps_no_endpt:
}
/* If a payload is present, and security is enabled, decrypt the payload. */
- if ((offset < tvb_length(tvb)) && packet.security) {
+ if ((offset < tvb_captured_length(tvb)) && packet.security) {
payload_tvb = dissect_zbee_secure(tvb, pinfo, aps_tree, offset);
if (payload_tvb == NULL) {
/* If Payload_tvb is NULL, then the security dissector cleaned up. */
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
}
}
/* If the payload exists, create a tvb subset. */
- else if (offset < tvb_length(tvb)) {
+ else if (offset < tvb_captured_length(tvb)) {
payload_tvb = tvb_new_subset_remaining(tvb, offset);
}
@@ -940,6 +962,7 @@ dissect_zbee_aps_no_endpt:
if ((payload_tvb) && (packet.fragmentation != ZBEE_APS_EXT_FCF_FRAGMENT_NONE)) {
guint32 msg_id;
guint32 block_num;
+ guint32 num_blocks = -1;
fragment_head *frag_msg = NULL;
tvbuff_t *new_tvb;
@@ -957,7 +980,7 @@ dissect_zbee_aps_no_endpt:
* the block number is the block being sent.
*/
if (packet.fragmentation == ZBEE_APS_EXT_FCF_FRAGMENT_FIRST) {
- fragment_set_tot_len(&zbee_aps_reassembly_table, pinfo, msg_id, NULL, packet.block_number);
+ num_blocks = packet.block_number - 1;
block_num = 0; /* first packet. */
}
else {
@@ -967,23 +990,24 @@ dissect_zbee_aps_no_endpt:
/* Add this fragment to the reassembly handler. */
frag_msg = fragment_add_seq_check(&zbee_aps_reassembly_table,
payload_tvb, 0, pinfo, msg_id, NULL,
- block_num, tvb_length(payload_tvb), TRUE);
+ block_num, tvb_captured_length(payload_tvb), TRUE);
+
+ if (num_blocks > 0) {
+ fragment_set_tot_len(&zbee_aps_reassembly_table, pinfo, msg_id, NULL, num_blocks);
+ }
new_tvb = process_reassembled_data(payload_tvb, 0, pinfo, "Reassembled ZigBee APS" ,
frag_msg, &zbee_aps_frag_items, NULL, aps_tree);
- /* Update the info column regarding the fragmentation. */
- if (frag_msg) col_append_str(pinfo->cinfo, COL_INFO, " (Message Reassembled)");
- else col_append_fstr(pinfo->cinfo, COL_INFO, " (Message fragment %u)", packet.counter);
-
if (new_tvb) {
/* The reassembly handler defragmented the message, and created a new tvbuff. */
payload_tvb = new_tvb;
}
else {
/* The reassembly handler could not defragment the message. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, " (fragment %d)", block_num);
call_dissector(data_handle, payload_tvb, pinfo, tree);
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
}
}
@@ -1002,21 +1026,26 @@ dissect_zbee_aps_no_endpt:
profile_handle = zbee_apf_handle;
}
else if (profile_handle == NULL) {
- /* Could not locate a profile dissector. */
+ /* Could not locate a profile dissector, but there may
+ be profile-wide commands so try to dissect them */
+ zcl_handle = find_dissector(ZBEE_PROTOABBREV_ZCL);
+ if (zcl_handle) {
+ call_dissector_with_data(zcl_handle, payload_tvb, pinfo, tree, nwk);
+ }
break;
}
call_dissector_with_data(profile_handle, payload_tvb, pinfo, tree, nwk);
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
case ZBEE_APS_FCF_CMD:
if (!payload_tvb) {
/* Command packets MUST contain a payload. */
expert_add_info(pinfo, proto_root, &ei_zbee_aps_missing_payload);
THROW(BoundsError);
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
}
dissect_zbee_aps_cmd(payload_tvb, pinfo, aps_tree, nwk->version, data);
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
case ZBEE_APS_FCF_ACK:
/* Acks should never contain a payload. */
@@ -1039,7 +1068,7 @@ dissect_zbee_aps_no_endpt:
call_dissector(data_handle, payload_tvb, pinfo, tree);
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /* dissect_zbee_aps */
/*FUNCTION:------------------------------------------------------
@@ -1135,7 +1164,7 @@ static void dissect_zbee_aps_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
} /* switch */
/* Check for any excess bytes. */
- if (offset < tvb_length(tvb)) {
+ if (offset < tvb_captured_length(tvb)) {
/* There are leftover bytes! */
proto_tree *root;
tvbuff_t *leftover_tvb = tvb_new_subset_remaining(tvb, offset);
@@ -1592,7 +1621,7 @@ dissect_zbee_aps_tunnel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gui
tunnel_tvb = tvb_new_subset_remaining(tvb, offset);
root = proto_tree_get_root(tree);
call_dissector_with_data(zbee_aps_handle, tunnel_tvb, pinfo, root, data);
- offset = tvb_length(tvb);
+ offset = tvb_captured_length(tvb);
/* Done */
return offset;
@@ -1632,7 +1661,7 @@ static int dissect_zbee_apf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
/* Create the tree for the application framework. */
proto_root = proto_tree_add_protocol_format(tree, proto_zbee_apf, tvb, 0,
- tvb_length(tvb), "ZigBee Application Framework");
+ tvb_captured_length(tvb), "ZigBee Application Framework");
apf_tree = proto_item_add_subtree(proto_root, ett_zbee_apf);
/* Get the count and type. */
@@ -1664,13 +1693,13 @@ static int dissect_zbee_apf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
dissect_app_end:
- if (offset < tvb_length(tvb)) {
+ if (offset < tvb_captured_length(tvb)) {
/* There are bytes remaining! */
app_tvb = tvb_new_subset_remaining(tvb, offset);
call_dissector(data_handle, app_tvb, pinfo, tree);
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /* dissect_zbee_apf */
/*FUNCTION:------------------------------------------------------
@@ -1881,37 +1910,41 @@ void proto_register_zbee_aps(void)
{ "Block Number", "zbee_aps.block", FT_UINT8, BASE_DEC, NULL, 0x0,
"A block identifier within a fragmented transmission, or the number of expected blocks if the first block.", HFILL }},
+ { &hf_zbee_aps_block_ack,
+ { "Block Acknowledgements", "zbee_aps.block_acks", FT_UINT8, BASE_HEX,
+ NULL, 0x0, NULL, HFILL }},
+
{ &hf_zbee_aps_block_ack1,
- { "Block", "zbee_aps.block_ack", FT_BOOLEAN, 8, NULL, 0x01,
- NULL, HFILL }},
+ { "Block 1", "zbee_aps.block1_ack", FT_BOOLEAN, 8, TFS(&tfs_acknowledged_not_acknowledged),
+ ZBEE_APS_FRAG_BLOCK1_ACK, NULL, HFILL }},
{ &hf_zbee_aps_block_ack2,
- { "Block", "zbee_aps.block_ack", FT_BOOLEAN, 8, NULL, 0x02,
- NULL, HFILL }},
+ { "Block 2", "zbee_aps.block2_ack", FT_BOOLEAN, 8, TFS(&tfs_acknowledged_not_acknowledged),
+ ZBEE_APS_FRAG_BLOCK2_ACK, NULL, HFILL }},
{ &hf_zbee_aps_block_ack3,
- { "Block", "zbee_aps.block_ack", FT_BOOLEAN, 8, NULL, 0x04,
- NULL, HFILL }},
+ { "Block 3", "zbee_aps.block3_ack", FT_BOOLEAN, 8, TFS(&tfs_acknowledged_not_acknowledged),
+ ZBEE_APS_FRAG_BLOCK3_ACK, NULL, HFILL }},
{ &hf_zbee_aps_block_ack4,
- { "Block", "zbee_aps.block_ack", FT_BOOLEAN, 8, NULL, 0x08,
- NULL, HFILL }},
+ { "Block 4", "zbee_aps.block4_ack", FT_BOOLEAN, 8, TFS(&tfs_acknowledged_not_acknowledged),
+ ZBEE_APS_FRAG_BLOCK4_ACK, NULL, HFILL }},
{ &hf_zbee_aps_block_ack5,
- { "Block", "zbee_aps.block_ack", FT_BOOLEAN, 8, NULL, 0x10,
- NULL, HFILL }},
+ { "Block 5", "zbee_aps.block5_ack", FT_BOOLEAN, 8, TFS(&tfs_acknowledged_not_acknowledged),
+ ZBEE_APS_FRAG_BLOCK5_ACK, NULL, HFILL }},
{ &hf_zbee_aps_block_ack6,
- { "Block", "zbee_aps.block_ack", FT_BOOLEAN, 8, NULL, 0x20,
- NULL, HFILL }},
+ { "Block 6", "zbee_aps.block6_ack", FT_BOOLEAN, 8, TFS(&tfs_acknowledged_not_acknowledged),
+ ZBEE_APS_FRAG_BLOCK6_ACK, NULL, HFILL }},
{ &hf_zbee_aps_block_ack7,
- { "Block", "zbee_aps.block_ack", FT_BOOLEAN, 8, NULL, 0x40,
- NULL, HFILL }},
+ { "Block 7", "zbee_aps.block7_ack", FT_BOOLEAN, 8, TFS(&tfs_acknowledged_not_acknowledged),
+ ZBEE_APS_FRAG_BLOCK7_ACK, NULL, HFILL }},
{ &hf_zbee_aps_block_ack8,
- { "Block", "zbee_aps.block_ack", FT_BOOLEAN, 8, NULL, 0x80,
- NULL, HFILL }},
+ { "Block 8", "zbee_aps.block8_ack", FT_BOOLEAN, 8, TFS(&tfs_acknowledged_not_acknowledged),
+ ZBEE_APS_FRAG_BLOCK8_ACK, NULL, HFILL }},
{ &hf_zbee_aps_cmd_id,
{ "Command Identifier", "zbee_aps.cmd.id", FT_UINT8, BASE_HEX, VALS(zbee_aps_cmd_names), 0x0,
@@ -2067,7 +2100,8 @@ void proto_register_zbee_aps(void)
&ett_zbee_aps_cmd,
&ett_zbee_aps_fragment,
&ett_zbee_aps_fragments,
- &ett_zbee_aps_t2
+ &ett_zbee_aps_t2,
+ &ett_zbee_aps_frag_ack
};
static gint *ett_apf[] = {
diff --git a/epan/dissectors/packet-zbee-aps.h b/epan/dissectors/packet-zbee-aps.h
index ba37a8fe6d..b8f77709c8 100644
--- a/epan/dissectors/packet-zbee-aps.h
+++ b/epan/dissectors/packet-zbee-aps.h
@@ -208,8 +208,16 @@
#define ZBEE_ZCL_CID_DEMAND_RESPONSE_LOAD_CONTROL 0x0701
#define ZBEE_ZCL_CID_SIMPLE_METERING 0x0702
#define ZBEE_ZCL_CID_MESSAGE 0x0703
-#define ZBEE_ZCL_CID_SMART_ENERGY_TUNNELING 0x0704
+#define ZBEE_ZCL_CID_TUNNELING 0x0704
#define ZBEE_ZCL_CID_PRE_PAYMENT 0x0705
+#define ZBEE_ZCL_CID_ENERGY_MANAGEMENT 0x0706
+#define ZBEE_ZCL_CID_CALENDAR 0x0707
+#define ZBEE_ZCL_CID_DEVICE_MANAGEMENT 0x0708
+#define ZBEE_ZCL_CID_EVENTS 0x0709
+#define ZBEE_ZCL_CID_MDU_PAIRING 0x070A
+
+/* ZCL Cluster IDs - Key Establishment */
+#define ZBEE_ZCL_CID_KE 0x0800
/* ZCL Cluster IDs - Home Automation */
#define ZBEE_ZCL_CID_APPLIANCE_IDENTIFICATION 0x0b00
@@ -257,7 +265,6 @@ typedef struct{
/* Fragmentation Fields. */
guint8 fragmentation; /* ZigBee 2007 and Later */
guint8 block_number; /* ZigBee 2007 and Later */
- guint8 ack_bitfield; /* ZigBee 2007 and Later */
/* Some helpers for the upper layers. */
gboolean profile_present;
diff --git a/epan/dissectors/packet-zbee-nwk.c b/epan/dissectors/packet-zbee-nwk.c
index 2d7e96a941..b859e42a4f 100644
--- a/epan/dissectors/packet-zbee-nwk.c
+++ b/epan/dissectors/packet-zbee-nwk.c
@@ -649,7 +649,7 @@ dissect_zbee_nwk_full(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void
* Ensure that the payload exists. There are no valid ZigBee network
* packets that have no payload.
*/
- if (offset >= tvb_length(tvb)) {
+ if (offset >= tvb_captured_length(tvb)) {
/* Non-existent or truncated payload. */
expert_add_info(pinfo, proto_root, &ei_zbee_nwk_missing_payload);
THROW(BoundsError);
@@ -659,7 +659,7 @@ dissect_zbee_nwk_full(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void
payload_tvb = dissect_zbee_secure(tvb, pinfo, nwk_tree, offset);
if (payload_tvb == NULL) {
/* If Payload_tvb is NULL, then the security dissector cleaned up. */
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
}
}
/* Plaintext payload. */
@@ -680,7 +680,7 @@ dissect_zbee_nwk_full(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void
call_dissector(data_handle, payload_tvb, pinfo, tree);
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /* dissect_zbee_nwk */
/*FUNCTION:------------------------------------------------------
@@ -807,7 +807,7 @@ static void dissect_zbee_nwk_cmd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
} /* switch */
/* There is excess data in the packet. */
- if (offset < tvb_length(tvb)) {
+ if (offset < tvb_captured_length(tvb)) {
/* There are leftover bytes! */
tvbuff_t *leftover_tvb = tvb_new_subset_remaining(tvb, offset);
proto_tree *root = NULL;
@@ -1488,7 +1488,7 @@ static int dissect_zbee_beacon(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
offset += 3;
/* Get and display the update ID. */
- if(tvb_length_remaining(tvb, offset)) {
+ if(tvb_captured_length_remaining(tvb, offset)) {
proto_tree_add_item(beacon_tree, hf_zbee_beacon_update_id, tvb, offset, 1, ENC_NA);
offset += 1;
}
@@ -1504,7 +1504,7 @@ static int dissect_zbee_beacon(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
}
/* Check for leftover bytes. */
- if (offset < tvb_length(tvb)) {
+ if (offset < tvb_captured_length(tvb)) {
/* Bytes leftover! */
tvbuff_t *leftover_tvb = tvb_new_subset_remaining(tvb, offset);
proto_tree *root = NULL;
@@ -1519,7 +1519,7 @@ static int dissect_zbee_beacon(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
call_dissector(data_handle, leftover_tvb, pinfo, root);
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /* dissect_zbee_beacon */
/*FUNCTION:------------------------------------------------------
@@ -1612,7 +1612,7 @@ static int dissect_zbip_beacon(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
offset += 16;
/* Check for leftover bytes. */
- if (offset < tvb_length(tvb)) {
+ if (offset < tvb_captured_length(tvb)) {
/* TODO: There are TLV's to parse. */
/* Bytes leftover! */
tvbuff_t *leftover_tvb = tvb_new_subset_remaining(tvb, offset);
@@ -1627,7 +1627,7 @@ static int dissect_zbip_beacon(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
/* Dump the leftover to the data dissector. */
call_dissector(data_handle, leftover_tvb, pinfo, root);
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /* dissect_zbip_beacon */
/*FUNCTION:------------------------------------------------------
@@ -1973,7 +1973,7 @@ void proto_register_zbee_nwk(void)
register_init_routine(proto_init_zbee_nwk);
/* Register the protocol with Wireshark. */
- proto_zbee_nwk = proto_register_protocol("ZigBee Network Layer", "ZigBee NWK", ZBEE_PROTOABBREV_NWK);
+ proto_zbee_nwk = proto_register_protocol("ZigBee Network Layer", "ZigBee", ZBEE_PROTOABBREV_NWK);
proto_zbee_beacon = proto_register_protocol("ZigBee Beacon", "ZigBee Beacon", "zbee_beacon");
proto_zbip_beacon = proto_register_protocol("ZigBee IP Beacon", "ZigBee IP Beacon", "zbip_beacon");
proto_register_field_array(proto_zbee_nwk, hf, array_length(hf));
diff --git a/epan/dissectors/packet-zbee-security.c b/epan/dissectors/packet-zbee-security.c
index 438c20dd7e..145a625274 100644
--- a/epan/dissectors/packet-zbee-security.c
+++ b/epan/dissectors/packet-zbee-security.c
@@ -55,7 +55,6 @@ static gboolean zbee_sec_decrypt_payload(zbee_security_packet *, const gchar
guint, guint, guint8 *);
#endif
static gboolean zbee_security_parse_key(const gchar *, guint8 *, gboolean);
-static void proto_init_zbee_security(void);
/* Field pointers. */
static int hf_zbee_sec_field = -1;
@@ -65,6 +64,7 @@ static int hf_zbee_sec_counter = -1;
static int hf_zbee_sec_src64 = -1;
static int hf_zbee_sec_key_seqno = -1;
static int hf_zbee_sec_mic = -1;
+static int hf_zbee_sec_key = -1;
static int hf_zbee_sec_key_origin = -1;
static int hf_zbee_sec_decryption_key = -1;
@@ -130,10 +130,13 @@ typedef struct _uat_key_record_t {
gchar *string;
guint8 byte_order;
gchar *label;
- guint8 key[ZBEE_SEC_CONST_KEYSIZE];
} uat_key_record_t;
-/* */
+UAT_CSTRING_CB_DEF(uat_key_records, string, uat_key_record_t)
+UAT_VS_DEF(uat_key_records, byte_order, uat_key_record_t, guint8, 0, "Normal")
+UAT_CSTRING_CB_DEF(uat_key_records, label, uat_key_record_t)
+
+static GSList *zbee_pc_keyring = NULL;
static uat_key_record_t *uat_key_records = NULL;
static guint num_uat_key_records = 0;
@@ -153,11 +156,14 @@ static void* uat_key_record_copy_cb(void* n, const void* o, size_t siz _U_) {
new_key->label = NULL;
}
+ new_key->byte_order = old_key->byte_order;
+
return new_key;
}
static void uat_key_record_update_cb(void* r, const char** err) {
uat_key_record_t* rec = (uat_key_record_t *)r;
+ guint8 key[ZBEE_SEC_CONST_KEYSIZE];
if (rec->string == NULL) {
*err = g_strdup("Key can't be blank");
@@ -166,7 +172,7 @@ static void uat_key_record_update_cb(void* r, const char** err) {
if (rec->string[0] != 0) {
*err = NULL;
- if ( !zbee_security_parse_key(rec->string, rec->key, rec->byte_order) ) {
+ if ( !zbee_security_parse_key(rec->string, key, rec->byte_order) ) {
*err = g_strdup_printf("Expecting %d hexadecimal bytes or\n"
"a %d character double-quoted string", ZBEE_SEC_CONST_KEYSIZE, ZBEE_SEC_CONST_KEYSIZE);
}
@@ -183,11 +189,27 @@ static void uat_key_record_free_cb(void*r) {
if (key->label) g_free(key->label);
}
-UAT_CSTRING_CB_DEF(uat_key_records, string, uat_key_record_t)
-UAT_VS_DEF(uat_key_records, byte_order, uat_key_record_t, guint8, 0, "Normal")
-UAT_CSTRING_CB_DEF(uat_key_records, label, uat_key_record_t)
+static void uat_key_record_post_update(void) {
+ guint i;
+ key_record_t key_record;
+ guint8 key[ZBEE_SEC_CONST_KEYSIZE];
+
+ /* empty the key ring */
+ if (zbee_pc_keyring) {
+ g_slist_free(zbee_pc_keyring);
+ zbee_pc_keyring = NULL;
+ }
-static GSList *zbee_pc_keyring = NULL;
+ /* Load the pre-configured slist from the UAT. */
+ for (i=0; (uat_key_records) && (i<num_uat_key_records) ; i++) {
+ key_record.frame_num = ZBEE_SEC_PC_KEY; /* means it's a user PC key */
+ key_record.label = g_strdup(uat_key_records[i].label);
+ if (zbee_security_parse_key(uat_key_records[i].string, key, uat_key_records[i].byte_order)) {
+ memcpy(&key_record.key, key, ZBEE_SEC_CONST_KEYSIZE);
+ zbee_pc_keyring = g_slist_prepend(zbee_pc_keyring, g_memdup(&key_record, sizeof(key_record_t)));
+ }
+ }
+}
/*
* Enable this macro to use libgcrypt's CBC_MAC mode for the authentication
@@ -240,12 +262,16 @@ void zbee_security_register(module_t *zbee_prefs, int proto)
{ "Message Integrity Code", "zbee.sec.mic", FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
+ { &hf_zbee_sec_key,
+ { "Key", "zbee.sec.key", FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL }},
+
{ &hf_zbee_sec_key_origin,
{ "Key Origin", "zbee.sec.key.origin", FT_FRAMENUM, BASE_NONE, NULL, 0x0,
NULL, HFILL }},
{ &hf_zbee_sec_decryption_key,
- { "Decryption Key", "zbee.sec.decryption_key", FT_STRING, BASE_NONE, NULL, 0x0,
+ { "Key Label", "zbee.sec.decryption_key", FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL }}
};
@@ -268,7 +294,7 @@ void zbee_security_register(module_t *zbee_prefs, int proto)
"a 16-character string in double-quotes."),
UAT_FLD_VS(uat_key_records, byte_order, "Byte Order", byte_order_vals,
"Byte order of key."),
- UAT_FLD_LSTRING(uat_key_records, label, "Label", "User label for key."),
+ UAT_FLD_CSTRING(uat_key_records, label, "Label", "User label for key."),
UAT_END_FIELDS
};
@@ -295,7 +321,7 @@ void zbee_security_register(module_t *zbee_prefs, int proto)
uat_key_record_copy_cb,
uat_key_record_update_cb,
uat_key_record_free_cb,
- NULL, /* TODO: post_update */
+ uat_key_record_post_update,
key_uat_fields );
prefs_register_uat_preference(zbee_prefs,
@@ -309,8 +335,6 @@ void zbee_security_register(module_t *zbee_prefs, int proto)
expert_zbee_sec = expert_register_protocol(proto);
expert_register_field_array(expert_zbee_sec, ei, array_length(ei));
- /* Register the init routine. */
- register_init_routine(proto_init_zbee_security);
} /* zbee_security_register */
/*FUNCTION:------------------------------------------------------
@@ -443,6 +467,7 @@ dissect_zbee_secure(tvbuff_t *tvb, packet_info *pinfo, proto_tree* tree, guint o
#ifdef HAVE_LIBGCRYPT
proto_item *ti;
+ proto_item *key_item;
guint8 *enc_buffer;
guint8 *dec_buffer;
gboolean decrypted;
@@ -487,7 +512,7 @@ dissect_zbee_secure(tvbuff_t *tvb, packet_info *pinfo, proto_tree* tree, guint o
* is automatically freed before the next packet is processed.
*/
#ifdef HAVE_LIBGCRYPT
- enc_buffer = (guint8 *)tvb_memdup(wmem_packet_scope(), tvb, 0, tvb_length(tvb));
+ enc_buffer = (guint8 *)tvb_memdup(wmem_packet_scope(), tvb, 0, tvb_captured_length(tvb));
/*
* Override the const qualifiers and patch the security level field, we
* know it is safe to overide the const qualifiers because we just
@@ -603,7 +628,7 @@ dissect_zbee_secure(tvbuff_t *tvb, packet_info *pinfo, proto_tree* tree, guint o
if (mic_len) {
/* Display the MIC. */
if (tree) {
- proto_tree_add_item(sec_tree, hf_zbee_sec_mic, tvb, (gint)(tvb_length(tvb)-mic_len),
+ proto_tree_add_item(sec_tree, hf_zbee_sec_mic, tvb, (gint)(tvb_captured_length(tvb)-mic_len),
mic_len, ENC_NA);
}
}
@@ -716,6 +741,9 @@ dissect_zbee_secure(tvbuff_t *tvb, packet_info *pinfo, proto_tree* tree, guint o
if ( decrypted ) {
if ( tree && key_rec ) {
+ key_item = proto_tree_add_bytes(sec_tree, hf_zbee_sec_key, tvb, 0, ZBEE_SEC_CONST_KEYSIZE, key_rec->key);
+ PROTO_ITEM_SET_GENERATED(key_item);
+
if ( key_rec->frame_num == ZBEE_SEC_PC_KEY ) {
ti = proto_tree_add_string(sec_tree, hf_zbee_sec_decryption_key, tvb, 0, 0, key_rec->label);
} else {
@@ -1236,39 +1264,6 @@ zbee_sec_ccm_decrypt(const gchar *key _U_, /* Input */
}
#endif /* HAVE_LIBGCRYPT */
-/*FUNCTION:------------------------------------------------------
- * NAME
- * proto_init_zbee_security
- * DESCRIPTION
- * Init routine for the
- * PARAMETERS
- * none
- * RETURNS
- * void
- *---------------------------------------------------------------
- */
-static void
-proto_init_zbee_security(void)
-{
- guint i;
- key_record_t key_record;
-
- /* empty the key ring */
- if (zbee_pc_keyring) {
- g_slist_free(zbee_pc_keyring);
- zbee_pc_keyring = NULL;
- }
-
- /* Load the pre-configured slist from the UAT. */
- for (i=0; (uat_key_records) && (i<num_uat_key_records) ; i++) {
- key_record.frame_num = ZBEE_SEC_PC_KEY; /* means it's a user PC key */
- key_record.label = g_strdup(uat_key_records[i].label);
- memcpy(&key_record.key, &uat_key_records[i].key, ZBEE_SEC_CONST_KEYSIZE);
-
- zbee_pc_keyring = g_slist_prepend(zbee_pc_keyring, g_memdup(&key_record, sizeof(key_record_t)));
- } /* for */
-} /* proto_init_zbee_security */
-
/*
* Editor modelines - http://www.wireshark.org/tools/modelines.html
*
diff --git a/epan/dissectors/packet-zbee-zcl-general.c b/epan/dissectors/packet-zbee-zcl-general.c
index 31751bb762..b8b67f5e82 100644
--- a/epan/dissectors/packet-zbee-zcl-general.c
+++ b/epan/dissectors/packet-zbee-zcl-general.c
@@ -97,9 +97,7 @@ void proto_register_zbee_zcl_basic(void);
void proto_reg_handoff_zbee_zcl_basic(void);
/* Command Dissector Helpers */
-static void dissect_zcl_basic_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
-static void dissect_zcl_basic_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
-static void dissect_zcl_basic_cmd_id (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint8 cmd_dir);
+static void dissect_zcl_basic_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
/* Private functions prototype */
@@ -112,9 +110,11 @@ static int proto_zbee_zcl_basic = -1;
static int hf_zbee_zcl_basic_attr_id = -1;
static int hf_zbee_zcl_basic_pwr_src = -1;
static int hf_zbee_zcl_basic_dev_en = -1;
+static int hf_zbee_zcl_basic_alarm_mask = -1;
static int hf_zbee_zcl_basic_alarm_mask_gen_hw_fault = -1;
static int hf_zbee_zcl_basic_alarm_mask_gen_sw_fault = -1;
static int hf_zbee_zcl_basic_alarm_mask_reserved = -1;
+static int hf_zbee_zcl_basic_disable_local_cfg = -1;
static int hf_zbee_zcl_basic_disable_local_cfg_reset = -1;
static int hf_zbee_zcl_basic_disable_local_cfg_device_cfg = -1;
static int hf_zbee_zcl_basic_disable_local_cfg_reserved = -1;
@@ -223,34 +223,12 @@ dissect_zbee_zcl_basic(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void
}
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_basic*/
/*FUNCTION:------------------------------------------------------
* NAME
- * dissect_zcl_basic_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-void
-dissect_zcl_basic_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_basic_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_basic_attr_id*/
-
-
-/*FUNCTION:------------------------------------------------------
- * NAME
* dissect_zcl_basic_attr_data
* DESCRIPTION
* this function is called by ZCL foundation dissector in order to decode
@@ -268,9 +246,20 @@ dissect_zcl_basic_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
void
dissect_zcl_basic_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type)
{
- proto_item *ti = NULL;
- proto_tree *sub_tree = NULL;
- guint8 value8;
+
+ static const int * alarm_mask[] = {
+ &hf_zbee_zcl_basic_alarm_mask_gen_hw_fault,
+ &hf_zbee_zcl_basic_alarm_mask_gen_sw_fault,
+ &hf_zbee_zcl_basic_alarm_mask_reserved,
+ NULL
+ };
+
+ static const int * local_cfg[] = {
+ &hf_zbee_zcl_basic_disable_local_cfg_reset,
+ &hf_zbee_zcl_basic_disable_local_cfg_device_cfg,
+ &hf_zbee_zcl_basic_disable_local_cfg_reserved,
+ NULL
+ };
/* Dissect attribute data type and data */
switch (attr_id) {
@@ -286,22 +275,12 @@ dissect_zcl_basic_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guin
break;
case ZBEE_ZCL_ATTR_ID_BASIC_ALARM_MASK:
- value8 = tvb_get_guint8(tvb, *offset);
- ti = proto_tree_add_text(tree, tvb, *offset, 1, "Alarm Mask: 0x%02x", value8);
- sub_tree = proto_item_add_subtree(ti, ett_zbee_zcl_basic_alarm_mask);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_basic_alarm_mask_gen_hw_fault, tvb, *offset, 1, ENC_NA);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_basic_alarm_mask_gen_sw_fault, tvb, *offset, 1, ENC_NA);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_basic_alarm_mask_reserved, tvb, *offset, 1, ENC_NA);
+ proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_basic_alarm_mask , ett_zbee_zcl_basic_alarm_mask, alarm_mask, ENC_NA);
*offset += 1;
break;
case ZBEE_ZCL_ATTR_ID_BASIC_DISABLE_LOCAL_CFG:
- value8 = tvb_get_guint8(tvb, *offset);
- ti = proto_tree_add_text(tree, tvb, *offset, 1, "Disable Local Config: 0x%02x", value8);
- sub_tree = proto_item_add_subtree(ti, ett_zbee_zcl_basic_dis_local_cfg);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_basic_disable_local_cfg_reset, tvb, *offset, 1, ENC_NA);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_basic_disable_local_cfg_device_cfg, tvb, *offset, 1, ENC_NA);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_basic_disable_local_cfg_reserved, tvb, *offset, 1, ENC_NA);
+ proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_basic_disable_local_cfg , ett_zbee_zcl_basic_dis_local_cfg, local_cfg, ENC_NA);
*offset += 1;
break;
@@ -321,30 +300,6 @@ dissect_zcl_basic_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guin
} /*dissect_zcl_basic_attr_data*/
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_basic_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_basic_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_basic_srv_rx_cmd_id, tvb, *offset, 1, ENC_NA);
-
-} /*dissect_zcl_basic_cmd_id*/
-
/*FUNCTION:------------------------------------------------------
* NAME
@@ -376,6 +331,10 @@ proto_register_zbee_zcl_basic(void)
0x00, NULL, HFILL } },
/* start Alarm Mask fields */
+ { &hf_zbee_zcl_basic_alarm_mask,
+ { "Alarm Mask", "zbee_zcl_general.basic.attr.alarm_mask", FT_UINT8, BASE_HEX, NULL,
+ 0x0, NULL, HFILL } },
+
{ &hf_zbee_zcl_basic_alarm_mask_gen_hw_fault,
{ "General hardware fault", "zbee_zcl_general.basic.attr.alarm_mask.gen_hw_fault", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_BASIC_ALARM_GEN_HW_FAULT, NULL, HFILL } },
@@ -390,6 +349,10 @@ proto_register_zbee_zcl_basic(void)
/* end Alarm Mask fields */
/* start Disable Local Config fields */
+ { &hf_zbee_zcl_basic_disable_local_cfg,
+ { "Disable Local Config", "zbee_zcl_general.basic.attr.dis_loc_cfg", FT_UINT8, BASE_HEX, NULL,
+ 0x0, NULL, HFILL } },
+
{ &hf_zbee_zcl_basic_disable_local_cfg_reset,
{ "Reset (to factory defaults)", "zbee_zcl_general.basic.attr.dis_loc_cfg.reset", FT_UINT8, BASE_DEC, NULL,
ZBEE_ZCL_BASIC_DIS_LOC_CFG_RESET , NULL, HFILL } },
@@ -448,9 +411,10 @@ proto_reg_handoff_zbee_zcl_basic(void)
zbee_zcl_init_cluster( proto_zbee_zcl_basic,
ett_zbee_zcl_basic,
ZBEE_ZCL_CID_BASIC,
- (zbee_zcl_fn_attr_id)dissect_zcl_basic_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_basic_attr_data,
- (zbee_zcl_fn_cmd_id)dissect_zcl_basic_cmd_id
+ hf_zbee_zcl_basic_attr_id,
+ hf_zbee_zcl_basic_srv_rx_cmd_id,
+ -1,
+ (zbee_zcl_fn_attr_data)dissect_zcl_basic_attr_data
);
} /*proto_reg_handoff_zbee_zcl_basic*/
@@ -486,10 +450,7 @@ void proto_reg_handoff_zbee_zcl_identify(void);
/* Command Dissector Helpers */
static void dissect_zcl_identify_identify (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_identify_identifyqueryrsp (tvbuff_t *tvb, proto_tree *tree, guint *offset);
-
-static void dissect_zcl_identify_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
static void dissect_zcl_identify_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
-static void dissect_zcl_identify_cmd_id (proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir);
/* Private functions prototype */
@@ -615,7 +576,7 @@ dissect_zbee_zcl_identify(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, v
}
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_identify*/
@@ -664,29 +625,6 @@ dissect_zcl_identify_identifyqueryrsp(tvbuff_t *tvb, proto_tree *tree, guint *of
} /*dissect_zcl_identify_identifyqueryrsp*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_identify_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-void
-dissect_zcl_identify_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_identify_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_identify_attr_id*/
-
-
/*FUNCTION:------------------------------------------------------
* NAME
* dissect_zcl_identify_attr_data
@@ -721,30 +659,6 @@ dissect_zcl_identify_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, g
} /*dissect_zcl_identify_attr_data*/
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_identify_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_identify_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_identify_srv_rx_cmd_id, tvb, *offset, 1, ENC_NA);
- else
- proto_tree_add_item(tree, hf_zbee_zcl_identify_srv_tx_cmd_id, tvb, *offset, 1, ENC_NA);
-} /*dissect_zcl_identify_cmd_id*/
/*FUNCTION:------------------------------------------------------
* NAME
@@ -823,9 +737,10 @@ proto_reg_handoff_zbee_zcl_identify(void)
zbee_zcl_init_cluster( proto_zbee_zcl_identify,
ett_zbee_zcl_identify,
ZBEE_ZCL_CID_IDENTIFY,
- (zbee_zcl_fn_attr_id)dissect_zcl_identify_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_identify_attr_data,
- (zbee_zcl_fn_cmd_id)dissect_zcl_identify_cmd_id
+ hf_zbee_zcl_identify_attr_id,
+ hf_zbee_zcl_identify_srv_rx_cmd_id,
+ hf_zbee_zcl_identify_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_identify_attr_data
);
} /*proto_reg_handoff_zbee_zcl_identify*/
@@ -853,9 +768,7 @@ void proto_register_zbee_zcl_on_off(void);
void proto_reg_handoff_zbee_zcl_on_off(void);
/* Command Dissector Helpers */
-static void dissect_zcl_on_off_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
-static void dissect_zcl_on_off_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
-static void dissect_zcl_on_off_cmd_id (proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir);
+static void dissect_zcl_on_off_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
/* Private functions prototype */
@@ -936,30 +849,9 @@ dissect_zbee_zcl_on_off(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
/*offset++;*/
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_on_off*/
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_on_off_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-void
-dissect_zcl_on_off_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_on_off_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_on_off_attr_id*/
-
/*FUNCTION:------------------------------------------------------
* NAME
@@ -995,29 +887,6 @@ dissect_zcl_on_off_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, gui
} /*dissect_zcl_on_off_attr_data*/
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_on_off_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_on_off_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_on_off_srv_rx_cmd_id, tvb, *offset, 1, ENC_NA);
-} /*dissect_zcl_on_off_cmd_id*/
-
/*FUNCTION:------------------------------------------------------
* NAME
@@ -1081,9 +950,10 @@ proto_reg_handoff_zbee_zcl_on_off(void)
zbee_zcl_init_cluster( proto_zbee_zcl_on_off,
ett_zbee_zcl_on_off,
ZBEE_ZCL_CID_ON_OFF,
- (zbee_zcl_fn_attr_id)dissect_zcl_on_off_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_on_off_attr_data,
- (zbee_zcl_fn_cmd_id)dissect_zcl_on_off_cmd_id
+ hf_zbee_zcl_on_off_attr_id,
+ hf_zbee_zcl_on_off_srv_rx_cmd_id,
+ -1,
+ (zbee_zcl_fn_attr_data)dissect_zcl_on_off_attr_data
);
} /*proto_reg_handoff_zbee_zcl_on_off*/
@@ -1145,9 +1015,6 @@ static void dissect_zcl_part_wrhandshakeparam (tvbuff_t *tvb, packet_info
static void dissect_zcl_part_multiack (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_part_rdhandshakeparamrsp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset);
-static void dissect_zcl_part_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
-static void dissect_zcl_part_cmd_id (proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir);
-
/* Private functions prototype */
/*************************/
@@ -1160,6 +1027,7 @@ static int proto_zbee_zcl_part = -1;
static int hf_zbee_zcl_part_attr_id = -1;
static int hf_zbee_zcl_part_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_part_srv_rx_cmd_id = -1;
+static int hf_zbee_zcl_part_opt = -1;
static int hf_zbee_zcl_part_opt_first_block = -1;
static int hf_zbee_zcl_part_opt_indic_len = -1;
static int hf_zbee_zcl_part_opt_res = -1;
@@ -1168,6 +1036,7 @@ static int hf_zbee_zcl_part_part_indicator = -1;
static int hf_zbee_zcl_part_part_frame = -1;
static int hf_zbee_zcl_part_part_frame_len = -1;
static int hf_zbee_zcl_part_partitioned_cluster_id = -1;
+static int hf_zbee_zcl_part_ack_opt = -1;
static int hf_zbee_zcl_part_ack_opt_nack_id_len = -1;
static int hf_zbee_zcl_part_ack_opt_res = -1;
static int hf_zbee_zcl_part_nack_id = -1;
@@ -1312,7 +1181,7 @@ dissect_zbee_zcl_part(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void*
}
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_part*/
/*FUNCTION:------------------------------------------------------
@@ -1330,21 +1199,22 @@ dissect_zbee_zcl_part(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void*
*/
static void dissect_zcl_part_trasfpartframe(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
- proto_tree *sub_tree = NULL;
- proto_item *ti;
guint8 options;
guint16 u16len;
guint8 frame_len;
guint8 *data_frame;
+ static const int * part_opt[] = {
+ &hf_zbee_zcl_part_opt_first_block,
+ &hf_zbee_zcl_part_opt_indic_len,
+ &hf_zbee_zcl_part_opt_res,
+ NULL
+ };
+
/* Retrieve "Fragmentation Options" field */
options = tvb_get_guint8(tvb, *offset);
- ti = proto_tree_add_text(tree, tvb, *offset, 1, "Fragmentation Options: 0x%02x", options);
- sub_tree = proto_item_add_subtree(ti, ett_zbee_zcl_part_fragm_options);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_part_opt_first_block, tvb, *offset, 1, ENC_NA);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_part_opt_indic_len, tvb, *offset, 1, ENC_NA);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_part_opt_res, tvb, *offset, 1, ENC_NA);
+ proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_part_opt, ett_zbee_zcl_part_fragm_options, part_opt, ENC_NA);
*offset += 1;
/* Retrieve "PartitionIndicator" field */
@@ -1447,21 +1317,21 @@ dissect_zcl_part_wrhandshakeparam(tvbuff_t *tvb, packet_info *pinfo, proto_tree
static void
dissect_zcl_part_multiack(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
- proto_tree *sub_tree = NULL;
- proto_item *ti;
-
guint tvb_len = tvb_reported_length(tvb);
guint i = 0;
guint8 options;
guint16 first_frame_id;
guint16 nack_id;
+ static const int * ack_opts[] = {
+ &hf_zbee_zcl_part_ack_opt_nack_id_len,
+ &hf_zbee_zcl_part_ack_opt_res,
+ NULL
+ };
+
/* Retrieve "Ack Options" field */
options = tvb_get_guint8(tvb, *offset);
- ti = proto_tree_add_text(tree, tvb, *offset, 1, "Ack Options: 0x%02x", options);
- sub_tree = proto_item_add_subtree(ti, ett_zbee_zcl_part_ack_opts);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_part_ack_opt_nack_id_len, tvb, *offset, 1, ENC_NA);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_part_ack_opt_res, tvb, *offset, 1, ENC_NA);
+ proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_part_ack_opt, ett_zbee_zcl_part_ack_opts, ack_opts, ENC_NA);
*offset += 1;
/* Retrieve "First Frame ID" field */
@@ -1528,52 +1398,6 @@ dissect_zcl_part_rdhandshakeparamrsp(tvbuff_t *tvb, packet_info *pinfo, proto_tr
/*FUNCTION:------------------------------------------------------
* NAME
- * dissect_zcl_part_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_part_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_part_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_part_attr_id*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_part_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_part_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_part_srv_rx_cmd_id, tvb, *offset, 1, ENC_NA);
- else
- proto_tree_add_item(tree, hf_zbee_zcl_part_srv_tx_cmd_id, tvb, *offset, 1, ENC_NA);
-} /*dissect_zcl_part_cmd_id*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
* proto_register_zbee_zcl_part
* DESCRIPTION
* this function is called by ZCL foundation dissector in order to decode
@@ -1606,6 +1430,10 @@ void proto_register_zbee_zcl_part(void)
{ "Command", "zbee_zcl_general.part.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_part_srv_rx_cmd_names),
0x0, NULL, HFILL } },
+ { &hf_zbee_zcl_part_opt,
+ { "Fragmentation Options", "zbee_zcl_general.part.opt", FT_UINT8, BASE_HEX,
+ NULL, 0x0, NULL, HFILL }},
+
{ &hf_zbee_zcl_part_opt_first_block,
{ "First Block", "zbee_zcl_general.part.opt.first_block", FT_UINT8, BASE_HEX, NULL,
ZBEE_ZCL_PART_OPT_1_BLOCK, NULL, HFILL } },
@@ -1638,6 +1466,10 @@ void proto_register_zbee_zcl_part(void)
{ "Partitioned Cluster ID", "zbee_zcl_general.part.part_cluster_id", FT_UINT16, BASE_HEX, VALS(zbee_aps_cid_names),
0x00, NULL, HFILL } },
+ { &hf_zbee_zcl_part_ack_opt,
+ { "Ack Options", "zbee_zcl_general.ack_opt.part", FT_UINT8, BASE_HEX,
+ NULL, 0x0, NULL, HFILL }},
+
{ &hf_zbee_zcl_part_ack_opt_nack_id_len,
{ "Nack Id Length", "zbee_zcl_general.ack_opt.part.nack_id.len", FT_UINT8, BASE_HEX, VALS(zbee_zcl_part_id_length_names),
ZBEE_ZCL_PART_ACK_OPT_NACK_LEN, NULL, HFILL } },
@@ -1677,7 +1509,6 @@ void proto_register_zbee_zcl_part(void)
/* Register the ZigBee ZCL Partition dissector. */
new_register_dissector(ZBEE_PROTOABBREV_ZCL_PART, dissect_zbee_zcl_part, proto_zbee_zcl_part);
-
} /* proto_register_zbee_zcl_part */
@@ -1703,9 +1534,10 @@ void proto_reg_handoff_zbee_zcl_part(void)
zbee_zcl_init_cluster( proto_zbee_zcl_part,
ett_zbee_zcl_part,
ZBEE_ZCL_CID_PARTITION,
- (zbee_zcl_fn_attr_id)dissect_zcl_part_attr_id,
- NULL,
- (zbee_zcl_fn_cmd_id)dissect_zcl_part_cmd_id
+ hf_zbee_zcl_part_attr_id,
+ hf_zbee_zcl_part_srv_rx_cmd_id,
+ hf_zbee_zcl_part_srv_tx_cmd_id,
+ NULL
);
} /*proto_reg_handoff_zbee_zcl_part*/
@@ -2522,26 +2354,6 @@ dissect_zcl_ota_queryspecfilersp(tvbuff_t *tvb, proto_tree *tree, guint *offset)
} /*dissect_zcl_ota_queryspecfilersp*/
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_ota_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_ota_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_ota_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_ota_attr_id*/
/*FUNCTION:------------------------------------------------------
* NAME
@@ -2598,30 +2410,6 @@ dissect_zcl_ota_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint1
}
} /*dissect_zcl_ota_attr_data*/
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_ota_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_ota_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_ota_srv_rx_cmd_id, tvb, *offset, 1, ENC_NA);
- else
- proto_tree_add_item(tree, hf_zbee_zcl_ota_srv_tx_cmd_id, tvb, *offset, 1, ENC_NA);
-} /*dissect_zcl_ota_cmd_id*/
/*FUNCTION:------------------------------------------------------
* NAME
@@ -2735,7 +2523,7 @@ dissect_zbee_zcl_ota(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *
}
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_ota*/
/*FUNCTION:------------------------------------------------------
@@ -2914,9 +2702,10 @@ void proto_reg_handoff_zbee_zcl_ota(void)
zbee_zcl_init_cluster( proto_zbee_zcl_ota,
ett_zbee_zcl_ota,
ZBEE_ZCL_CID_OTA_UPGRADE,
- (zbee_zcl_fn_attr_id)dissect_zcl_ota_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_ota_attr_data,
- (zbee_zcl_fn_cmd_id)dissect_zcl_ota_cmd_id
+ hf_zbee_zcl_ota_attr_id,
+ hf_zbee_zcl_ota_srv_rx_cmd_id,
+ hf_zbee_zcl_ota_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_ota_attr_data
);
} /*proto_reg_handoff_zbee_zcl_ota*/
@@ -3011,9 +2800,7 @@ static void dissect_zcl_pwr_prof_pwrprofstatersp (tvbuff_t *tvb, prot
static void dissect_zcl_pwr_prof_pwrprofschedcontrsnotif (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_pwr_prof_pwrprofpriceext (tvbuff_t *tvb, proto_tree *tree, guint *offset);
-static void dissect_zcl_pwr_prof_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
static void dissect_zcl_pwr_prof_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
-static void dissect_zcl_pwr_prof_cmd_id (proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir);
/* Private functions prototype */
static void decode_power_profile_id (gchar *s, guint8 id);
@@ -3263,7 +3050,7 @@ dissect_zbee_zcl_pwr_prof (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_pwr_prof*/
/*FUNCTION:------------------------------------------------------
@@ -3665,28 +3452,6 @@ dissect_zcl_pwr_prof_pwrprofpriceext(tvbuff_t *tvb, proto_tree *tree, guint *off
/*FUNCTION:------------------------------------------------------
* NAME
- * dissect_zcl_pwr_prof_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_pwr_prof_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_pwr_prof_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_pwr_prof_attr_id*/
-
-
-/*FUNCTION:------------------------------------------------------
- * NAME
* dissect_zcl_pwr_prof_attr_data
* DESCRIPTION
* this function is called by ZCL foundation dissector in order to decode
@@ -3752,30 +3517,6 @@ dissect_zcl_pwr_prof_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, g
}
} /*dissect_zcl_pwr_prof_attr_data*/
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_pwr_prof_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_pwr_prof_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_pwr_prof_srv_rx_cmd_id, tvb, *offset, 1, ENC_NA);
- else
- proto_tree_add_item(tree, hf_zbee_zcl_pwr_prof_srv_tx_cmd_id, tvb, *offset, 1, ENC_NA);
-} /*dissect_zcl_pwr_prof_cmd_id*/
/*FUNCTION:------------------------------------------------------
* NAME
@@ -4065,7 +3806,6 @@ proto_register_zbee_zcl_pwr_prof(void)
/* Register the ZigBee ZCL Power Profile dissector. */
new_register_dissector(ZBEE_PROTOABBREV_ZCL_PWRPROF, dissect_zbee_zcl_pwr_prof, proto_zbee_zcl_pwr_prof);
-
} /* proto_register_zbee_zcl_pwr_prof */
@@ -4092,9 +3832,10 @@ proto_reg_handoff_zbee_zcl_pwr_prof(void)
zbee_zcl_init_cluster( proto_zbee_zcl_pwr_prof,
ett_zbee_zcl_pwr_prof,
ZBEE_ZCL_CID_POWER_PROFILE,
- (zbee_zcl_fn_attr_id)dissect_zcl_pwr_prof_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_pwr_prof_attr_data,
- (zbee_zcl_fn_cmd_id)dissect_zcl_pwr_prof_cmd_id
+ hf_zbee_zcl_pwr_prof_attr_id,
+ hf_zbee_zcl_pwr_prof_srv_rx_cmd_id,
+ hf_zbee_zcl_pwr_prof_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_pwr_prof_attr_data
);
} /*proto_reg_handoff_zbee_zcl_pwr_prof*/
@@ -4203,9 +3944,7 @@ static void dissect_zcl_appl_ctrl_wr_funcs (tvbuff_t *tvb, proto_tr
static void dissect_zcl_appl_ctrl_ovrl_warning (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_appl_ctrl_signal_state_rsp (tvbuff_t *tvb, proto_tree *tree, guint *offset);
-static void dissect_zcl_appl_ctrl_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
static void dissect_zcl_appl_ctrl_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
-static void dissect_zcl_appl_ctrl_cmd_id (proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir);
/* Private functions prototype */
@@ -4432,7 +4171,7 @@ dissect_zbee_zcl_appl_ctrl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
}
@@ -4593,28 +4332,6 @@ dissect_zcl_appl_ctrl_signal_state_rsp(tvbuff_t *tvb, proto_tree *tree, guint *o
proto_tree_add_item(tree, hf_zbee_zcl_appl_ctrl_status2_array, tvb, *offset, 3, ENC_BIG_ENDIAN);
} /*dissect_zcl_appl_ctrl_signal_state_rsp*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_appl_ctrl_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_appl_ctrl_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_appl_ctrl_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_appl_ctrl_attr_id*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* dissect_zcl_appl_ctrl_attr_data
@@ -4660,30 +4377,6 @@ dissect_zcl_appl_ctrl_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset,
}
} /*dissect_zcl_appl_ctrl_attr_data*/
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_appl_ctrl_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_appl_ctrl_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_appl_ctrl_srv_rx_cmd_id, tvb, *offset, 1, ENC_NA);
- else
- proto_tree_add_item(tree, hf_zbee_zcl_appl_ctrl_srv_tx_cmd_id, tvb, *offset, 1, ENC_NA);
-} /*dissect_zcl_appl_ctrl_cmd_id*/
/*FUNCTION:------------------------------------------------------
* NAME
@@ -4782,7 +4475,6 @@ proto_register_zbee_zcl_appl_ctrl(void)
/* Register the ZigBee ZCL Appliance Control dissector. */
new_register_dissector(ZBEE_PROTOABBREV_ZCL_APPLCTRL, dissect_zbee_zcl_appl_ctrl, proto_zbee_zcl_appl_ctrl);
-
} /*proto_register_zbee_zcl_appl_ctrl*/
@@ -4809,12 +4501,282 @@ proto_reg_handoff_zbee_zcl_appl_ctrl(void)
zbee_zcl_init_cluster( proto_zbee_zcl_appl_ctrl,
ett_zbee_zcl_appl_ctrl,
ZBEE_ZCL_CID_APPLIANCE_CONTROL,
- (zbee_zcl_fn_attr_id)dissect_zcl_appl_ctrl_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_appl_ctrl_attr_data,
- (zbee_zcl_fn_cmd_id)dissect_zcl_appl_ctrl_cmd_id
+ hf_zbee_zcl_appl_ctrl_attr_id,
+ hf_zbee_zcl_appl_ctrl_srv_rx_cmd_id,
+ hf_zbee_zcl_appl_ctrl_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_appl_ctrl_attr_data
);
} /*proto_reg_handoff_zbee_zcl_appl_ctrl*/
+/* ########################################################################## */
+/* #### (0x0020) POLL CONTROL CLUSTER ####################################### */
+/* ########################################################################## */
+
+/*************************/
+/* Defines */
+/*************************/
+
+#define ZBEE_ZCL_POLL_CTRL_NUM_ETT 1
+
+/* Poll Control Attributes */
+#define ZBEE_ZCL_ATTR_ID_POLL_CTRL_CHECK_IN 0x0000
+#define ZBEE_ZCL_ATTR_ID_POLL_CTRL_LONG_POLL 0x0001
+#define ZBEE_ZCL_ATTR_ID_POLL_CTRL_SHORT_POLL 0x0002
+#define ZBEE_ZCL_ATTR_ID_POLL_CTRL_FAST_POLL 0x0003
+#define ZBEE_ZCL_ATTR_ID_POLL_CTRL_CHECK_IN_MIN 0x0004
+#define ZBEE_ZCL_ATTR_ID_POLL_CTRL_LONG_POLL_MIN 0x0005
+#define ZBEE_ZCL_ATTR_ID_POLL_CTRL_FAST_POLL_TIMEOUT 0x0006
+
+static const value_string zbee_zcl_poll_ctrl_attr_names[] = {
+ { ZBEE_ZCL_ATTR_ID_POLL_CTRL_CHECK_IN, "Check-inInterval" },
+ { ZBEE_ZCL_ATTR_ID_POLL_CTRL_LONG_POLL, "LongPollInterval" },
+ { ZBEE_ZCL_ATTR_ID_POLL_CTRL_SHORT_POLL, "ShortPollInterval" },
+ { ZBEE_ZCL_ATTR_ID_POLL_CTRL_FAST_POLL, "FastPollTimeout" },
+ { ZBEE_ZCL_ATTR_ID_POLL_CTRL_CHECK_IN_MIN, "Check-inIntervalMin" },
+ { ZBEE_ZCL_ATTR_ID_POLL_CTRL_LONG_POLL_MIN, "LongPollIntervalMin" },
+ { ZBEE_ZCL_ATTR_ID_POLL_CTRL_FAST_POLL_TIMEOUT, "FastPollTimeoutMax" },
+ { 0, NULL }
+};
+
+/* Server-to-client command IDs. */
+#define ZBEE_ZCL_CMD_ID_POLL_CTRL_CHECK_IN 0x00
+static const value_string zbee_zcl_poll_ctrl_srv_tx_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_POLL_CTRL_CHECK_IN, "Check-in" },
+ { 0, NULL }
+};
+
+/* Client-to-server command IDs. */
+#define ZBEE_ZCL_CMD_ID_POLL_CTRL_CHECK_IN_RESPONSE 0x00
+#define ZBEE_ZCL_CMD_ID_POLL_CTRL_FAST_POLL_STOP 0x01
+#define ZBEE_ZCL_CMD_ID_POLL_CTRL_SET_LONG_POLL 0x02
+#define ZBEE_ZCL_CMD_ID_POLL_CTRL_SET_SHORT_POLL 0x03
+static const value_string zbee_zcl_poll_ctrl_srv_rx_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_POLL_CTRL_CHECK_IN_RESPONSE, "Check-in Response" },
+ { ZBEE_ZCL_CMD_ID_POLL_CTRL_FAST_POLL_STOP, "Fast Poll Stop" },
+ { ZBEE_ZCL_CMD_ID_POLL_CTRL_SET_LONG_POLL, "Set Long Poll Interval" },
+ { ZBEE_ZCL_CMD_ID_POLL_CTRL_SET_SHORT_POLL, "Set Short Poll Interval" },
+ { 0, NULL }
+};
+
+/*************************/
+/* Global Variables */
+/*************************/
+/* Initialize the protocol and registered fields */
+static int proto_zbee_zcl_poll_ctrl = -1;
+
+static int hf_zbee_zcl_poll_ctrl_attr_id = -1;
+static int hf_zbee_zcl_poll_ctrl_srv_rx_cmd_id = -1;
+static int hf_zbee_zcl_poll_ctrl_srv_tx_cmd_id = -1;
+static int hf_zbee_zcl_poll_ctrl_start_fast_polling = -1;
+static int hf_zbee_zcl_poll_ctrl_fast_poll_timeout = -1;
+static int hf_zbee_zcl_poll_ctrl_new_long_poll_interval = -1;
+static int hf_zbee_zcl_poll_ctrl_new_short_poll_interval = -1;
+
+static gint ett_zbee_zcl_poll_ctrl = -1;
+
+/*************************/
+/* Function Declarations */
+/*************************/
+void proto_register_zbee_zcl_poll_ctrl(void);
+void proto_reg_handoff_zbee_zcl_poll_ctrl(void);
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zbee_zcl_poll_ctrl
+ * DESCRIPTION
+ * ZigBee ZCL Poll Control cluster dissector for wireshark.
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * packet_info *pinfo - pointer to packet information fields
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * void *data - pointer to ZCL packet structure.
+ * RETURNS
+ * int - length of parsed data.
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zbee_zcl_poll_ctrl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+{
+ zbee_zcl_packet *zcl;
+ guint offset = 0;
+ guint8 cmd_id;
+
+ /* Reject the packet if data is NULL */
+ if (data == NULL)
+ return 0;
+ zcl = (zbee_zcl_packet *)data;
+ cmd_id = zcl->cmd_id;
+
+ if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_poll_ctrl_srv_rx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_poll_ctrl_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
+ offset++;
+
+ /* Handle the command dissection. */
+ switch (cmd_id) {
+ case ZBEE_ZCL_CMD_ID_POLL_CTRL_CHECK_IN_RESPONSE:
+ proto_tree_add_item(tree, hf_zbee_zcl_poll_ctrl_start_fast_polling, tvb, offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_item(tree, hf_zbee_zcl_poll_ctrl_fast_poll_timeout, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_POLL_CTRL_FAST_POLL_STOP:
+ /* no payload. */
+ break;
+
+ case ZBEE_ZCL_CMD_ID_POLL_CTRL_SET_LONG_POLL:
+ proto_tree_add_item(tree, hf_zbee_zcl_poll_ctrl_new_long_poll_interval, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_POLL_CTRL_SET_SHORT_POLL:
+ proto_tree_add_item(tree, hf_zbee_zcl_poll_ctrl_new_short_poll_interval, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ break;
+
+ default:
+ break;
+ } /* switch */
+ } else {
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_poll_ctrl_srv_tx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_poll_ctrl_srv_tx_cmd_id, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ /* Handle the command dissection. */
+ switch (cmd_id) {
+ case ZBEE_ZCL_CMD_ID_POLL_CTRL_CHECK_IN:
+ /* No payload - fall through. */
+ default:
+ break;
+ } /* switch */
+ }
+
+ return tvb_captured_length(tvb);
+} /* dissect_zbee_zcl_poll_ctrl */
+
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_poll_ctrl_attr_data
+ * DESCRIPTION
+ * this function is called by ZCL foundation dissector in order to decode
+ * specific cluster attributes data.
+ * PARAMETERS
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * guint *offset - pointer to buffer offset
+ * guint16 attr_id - attribute identifier
+ * guint data_type - attribute data type
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_poll_ctrl_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id _U_, guint data_type)
+{
+ /* Dissect attribute data type and data */
+ dissect_zcl_attr_data(tvb, tree, offset, data_type);
+
+} /*dissect_zcl_poll_ctrl_attr_data*/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_register_zbee_zcl_poll_ctrl
+ * DESCRIPTION
+ * ZigBee ZCL Poll Control cluster protocol registration.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * void
+ *---------------------------------------------------------------
+ */
+void
+proto_register_zbee_zcl_poll_ctrl(void)
+{
+ /* Setup list of header fields */
+ static hf_register_info hf[] = {
+
+ { &hf_zbee_zcl_poll_ctrl_attr_id,
+ { "Attribute", "zbee_zcl_general.poll.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_poll_ctrl_attr_names),
+ 0x0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_poll_ctrl_srv_rx_cmd_id,
+ { "Command", "zbee_zcl_general.poll.cmd.srv_rx.id", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_poll_ctrl_srv_rx_cmd_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_poll_ctrl_srv_tx_cmd_id,
+ { "Command", "zbee_zcl_general.poll.cmd.srv_tx.id", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_poll_ctrl_srv_tx_cmd_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_poll_ctrl_start_fast_polling,
+ { "Start Fast Polling", "zbee_zcl_general.poll.start", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0,
+ NULL, HFILL }},
+
+ { &hf_zbee_zcl_poll_ctrl_fast_poll_timeout,
+ { "Fast Poll Timeout (quarterseconds)", "zbee_zcl_general.poll.fast_timeout", FT_UINT16, BASE_DEC, NULL,
+ 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_poll_ctrl_new_long_poll_interval,
+ { "New Long Poll Interval", "zbee_zcl_general.poll.new_long_interval", FT_UINT32, BASE_DEC, NULL, 0x0, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_poll_ctrl_new_short_poll_interval,
+ { "New Short Poll Interval", "zbee_zcl_general.poll.new_short_interval", FT_UINT16, BASE_DEC, NULL, 0x0, NULL,
+ HFILL }}
+ };
+
+ /* ZCL Poll Control subtrees */
+ static gint *ett[ZBEE_ZCL_POLL_CTRL_NUM_ETT];
+
+ ett[0] = &ett_zbee_zcl_poll_ctrl;
+
+ /* Register the ZigBee ZCL Poll Control cluster protocol name and description */
+ proto_zbee_zcl_poll_ctrl = proto_register_protocol("ZigBee ZCL Poll Control", "ZCL Poll Control", ZBEE_PROTOABBREV_ZCL_POLL);
+ proto_register_field_array(proto_zbee_zcl_poll_ctrl, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ /* Register the ZigBee ZCL Poll Control dissector. */
+ new_register_dissector(ZBEE_PROTOABBREV_ZCL_POLL, dissect_zbee_zcl_poll_ctrl, proto_zbee_zcl_poll_ctrl);
+} /*proto_register_zbee_zcl_poll_ctrl*/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_reg_handoff_zbee_zcl_poll_ctrl
+ * DESCRIPTION
+ * Hands off the ZCL Poll Control dissector.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+void
+proto_reg_handoff_zbee_zcl_poll_ctrl(void)
+{
+ dissector_handle_t poll_handle;
+
+ /* Register our dissector with the ZigBee application dissectors. */
+ poll_handle = find_dissector(ZBEE_PROTOABBREV_ZCL_POLL);
+ dissector_add_uint("zbee.zcl.cluster", ZBEE_ZCL_CID_POLL_CONTROL, poll_handle);
+
+ zbee_zcl_init_cluster( proto_zbee_zcl_poll_ctrl,
+ ett_zbee_zcl_poll_ctrl,
+ ZBEE_ZCL_CID_POLL_CONTROL,
+ hf_zbee_zcl_poll_ctrl_attr_id,
+ hf_zbee_zcl_poll_ctrl_srv_rx_cmd_id,
+ hf_zbee_zcl_poll_ctrl_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_poll_ctrl_attr_data
+ );
+} /*proto_reg_handoff_zbee_zcl_poll_ctrl*/
+
/*
* Editor modelines - http://www.wireshark.org/tools/modelines.html
*
diff --git a/epan/dissectors/packet-zbee-zcl-ha.c b/epan/dissectors/packet-zbee-zcl-ha.c
index d22817c4b9..28acbf9756 100644
--- a/epan/dissectors/packet-zbee-zcl-ha.c
+++ b/epan/dissectors/packet-zbee-zcl-ha.c
@@ -109,8 +109,7 @@ void proto_register_zbee_zcl_appl_idt(void);
void proto_reg_handoff_zbee_zcl_appl_idt(void);
/* Command Dissector Helpers */
-static void dissect_zcl_appl_idt_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
-static void dissect_zcl_appl_idt_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
+static void dissect_zcl_appl_idt_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
/* Private functions prototype */
@@ -225,29 +224,6 @@ dissect_zbee_zcl_appl_idt(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree
return;
} /*dissect_zbee_zcl_appl_idt*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_appl_idt_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-void
-dissect_zcl_appl_idt_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_appl_idt_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_appl_idt_attr_id*/
-
-
/*FUNCTION:------------------------------------------------------
* NAME
* dissect_zcl_appl_idt_attr_data
@@ -322,7 +298,6 @@ dissect_zcl_appl_idt_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, g
} /*dissect_zcl_appl_idt_attr_data*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* proto_register_zbee_zcl_appl_idt
@@ -383,10 +358,8 @@ proto_register_zbee_zcl_appl_idt(void)
/* Register the ZigBee ZCL Appliance Identification dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_APPLIDT, dissect_zbee_zcl_appl_idt, proto_zbee_zcl_appl_idt);
-
} /*proto_register_zbee_zcl_appl_idt*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* proto_reg_handoff_zbee_zcl_appl_idt
@@ -404,9 +377,9 @@ proto_reg_handoff_zbee_zcl_appl_idt(void)
zbee_zcl_init_cluster( proto_zbee_zcl_appl_idt,
ett_zbee_zcl_appl_idt,
ZBEE_ZCL_CID_APPLIANCE_IDENTIFICATION,
- (zbee_zcl_fn_attr_id)dissect_zcl_appl_idt_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_appl_idt_attr_data,
- NULL
+ hf_zbee_zcl_appl_idt_attr_id,
+ -1, -1,
+ (zbee_zcl_fn_attr_data)dissect_zcl_appl_idt_attr_data
);
} /*proto_reg_handoff_zbee_zcl_appl_idt*/
@@ -461,7 +434,6 @@ void proto_register_zbee_zcl_met_idt(void);
void proto_reg_handoff_zbee_zcl_met_idt(void);
/* Command Dissector Helpers */
-static void dissect_zcl_met_idt_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
static void dissect_zcl_met_idt_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
/* Private functions prototype */
@@ -480,7 +452,6 @@ static int hf_zbee_zcl_met_idt_data_quality_id = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_met_idt = -1;
-
/* Attributes */
static const value_string zbee_zcl_met_idt_attr_names[] = {
{ ZBEE_ZCL_ATTR_ID_MET_IDT_COMPANY_NAME, "Company Name" },
@@ -542,29 +513,6 @@ dissect_zbee_zcl_met_idt(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *
return;
} /*dissect_zbee_zcl_met_idt*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_met_idt_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-void
-dissect_zcl_met_idt_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_met_idt_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_met_idt_attr_id*/
-
-
/*FUNCTION:------------------------------------------------------
* NAME
* dissect_zcl_met_idt_attr_data
@@ -641,10 +589,8 @@ proto_register_zbee_zcl_met_idt(void)
/* Register the ZigBee ZCL Meter Identification dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_METIDT, dissect_zbee_zcl_met_idt, proto_zbee_zcl_met_idt);
-
} /*proto_register_zbee_zcl_met_idt*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* proto_reg_handoff_zbee_zcl_met_idt
@@ -662,13 +608,12 @@ proto_reg_handoff_zbee_zcl_met_idt(void)
zbee_zcl_init_cluster( proto_zbee_zcl_met_idt,
ett_zbee_zcl_met_idt,
ZBEE_ZCL_CID_METER_IDENTIFICATION,
- (zbee_zcl_fn_attr_id)dissect_zcl_met_idt_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_met_idt_attr_data,
- NULL
+ hf_zbee_zcl_met_idt_attr_id,
+ -1, -1,
+ (zbee_zcl_fn_attr_data)dissect_zcl_met_idt_attr_data
);
} /*proto_reg_handoff_zbee_zcl_met_idt*/
-
/* ########################################################################## */
/* #### (0x0B02) APPLIANCE EVENTS AND ALERT CLUSTER ######################### */
/* ########################################################################## */
@@ -732,8 +677,6 @@ void proto_reg_handoff_zbee_zcl_appl_evtalt(void);
static void dissect_zcl_appl_evtalt_get_alerts_rsp (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_appl_evtalt_event_notif (tvbuff_t *tvb, proto_tree *tree, guint *offset);
-static void dissect_zcl_appl_evtalt_cmd_id (proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir);
-
/*************************/
/* Global Variables */
/*************************/
@@ -887,7 +830,7 @@ dissect_zbee_zcl_appl_evtalt(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
}
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_appl_evtalt*/
/*FUNCTION:------------------------------------------------------
@@ -912,7 +855,6 @@ dissect_zcl_appl_evtalt_alerts_struct(tvbuff_t *tvb, proto_tree *tree, guint *of
proto_tree_add_item(tree, hf_zbee_zcl_appl_evtalt_reserved, tvb, *offset, 3, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_zbee_zcl_appl_evtalt_proprietary, tvb, *offset, 3, ENC_BIG_ENDIAN);
*offset += 3;
-
} /*dissect_zcl_appl_evtalt_alerts_struct*/
/*FUNCTION:------------------------------------------------------
@@ -950,7 +892,6 @@ dissect_zcl_appl_evtalt_get_alerts_rsp(tvbuff_t *tvb, proto_tree *tree, guint *o
dissect_zcl_appl_evtalt_alerts_struct(tvb, sub_tree, offset);
}
-
} /*dissect_zcl_appl_evtalt_get_alerts_rsp*/
/*FUNCTION:------------------------------------------------------
@@ -975,36 +916,10 @@ dissect_zcl_appl_evtalt_event_notif(tvbuff_t *tvb, proto_tree *tree, guint *offs
/* Retrieve "Event Identification" field */
proto_tree_add_item(tree, hf_zbee_zcl_appl_evtalt_event_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
-
} /*dissect_zcl_appl_evtalt_event_notif*/
/*FUNCTION:------------------------------------------------------
* NAME
- * dissect_zcl_appl_evtalt_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_appl_evtalt_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_appl_evtalt_srv_rx_cmd_id, tvb, *offset, 1, ENC_NA);
- else
- proto_tree_add_item(tree, hf_zbee_zcl_appl_evtalt_srv_tx_cmd_id, tvb, *offset, 1, ENC_NA);
-} /*dissect_zcl_appl_evtalt_cmd_id*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
* proto_register_zbee_zcl_appl_evtalt
* DESCRIPTION
* this function registers the ZCL Appliance Events and Alert dissector
@@ -1015,7 +930,6 @@ dissect_zcl_appl_evtalt_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, g
* none
*---------------------------------------------------------------
*/
-
void
proto_register_zbee_zcl_appl_evtalt(void)
{
@@ -1087,10 +1001,8 @@ proto_register_zbee_zcl_appl_evtalt(void)
/* Register the ZigBee ZCL Appliance Control dissector. */
new_register_dissector(ZBEE_PROTOABBREV_ZCL_APPLEVTALT, dissect_zbee_zcl_appl_evtalt, proto_zbee_zcl_appl_evtalt);
-
} /*proto_register_zbee_zcl_appl_evtalt*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* proto_reg_handoff_zbee_zcl_appl_evtalt
@@ -1114,13 +1026,13 @@ proto_reg_handoff_zbee_zcl_appl_evtalt(void)
zbee_zcl_init_cluster( proto_zbee_zcl_appl_evtalt,
ett_zbee_zcl_appl_evtalt,
ZBEE_ZCL_CID_APPLIANCE_EVENTS_AND_ALERT,
- NULL,
- NULL,
- (zbee_zcl_fn_cmd_id)dissect_zcl_appl_evtalt_cmd_id
+ -1,
+ hf_zbee_zcl_appl_evtalt_srv_rx_cmd_id,
+ hf_zbee_zcl_appl_evtalt_srv_tx_cmd_id,
+ NULL
);
} /*proto_reg_handoff_zbee_zcl_appl_evtalt*/
-
/* ########################################################################## */
/* #### (0x0B03) APPLIANCE STATISTICS CLUSTER ############################### */
/* ########################################################################## */
@@ -1163,9 +1075,6 @@ static void dissect_zcl_appl_stats_log_req (tvbuff_t *tvb, proto_tr
static void dissect_zcl_appl_stats_log_rsp (tvbuff_t *tvb, proto_tree *tree, guint *offset);
static void dissect_zcl_appl_stats_log_queue_rsp (tvbuff_t *tvb, proto_tree *tree, guint *offset);
-static void dissect_zcl_appl_stats_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
-static void dissect_zcl_appl_stats_cmd_id (proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir);
-
/* Private functions prototype */
static void decode_zcl_appl_stats_utc_time (gchar *s, guint32 value);
@@ -1305,7 +1214,7 @@ dissect_zbee_zcl_appl_stats (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
}
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_appl_stats*/
/*FUNCTION:------------------------------------------------------
@@ -1402,53 +1311,6 @@ dissect_zcl_appl_stats_log_queue_rsp(tvbuff_t *tvb, proto_tree *tree, guint *off
}
}/*dissect_zcl_appl_stats_log_queue_rsp*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_appl_stats_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_appl_stats_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_appl_stats_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_appl_stats_attr_id*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
- * dissect_zcl_appl_stats_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_appl_stats_cmd_id(proto_tree* tree, tvbuff_t* tvb, guint* offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_appl_stats_srv_rx_cmd_id, tvb, *offset, 1, ENC_NA);
- else
- proto_tree_add_item(tree, hf_zbee_zcl_appl_stats_srv_tx_cmd_id, tvb, *offset, 1, ENC_NA);
-} /*dissect_zcl_appl_stats_cmd_id*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* decode_zcl_appl_stats_utc_time
@@ -1473,7 +1335,6 @@ decode_zcl_appl_stats_utc_time(gchar *s, guint32 value)
}
} /* decode_zcl_appl_stats_utc_time */
-
/*FUNCTION:------------------------------------------------------
* NAME
* proto_register_zbee_zcl_appl_stats
@@ -1545,10 +1406,8 @@ proto_register_zbee_zcl_appl_stats(void)
/* Register the ZigBee ZCL Appliance Statistics dissector. */
new_register_dissector(ZBEE_PROTOABBREV_ZCL_APPLSTATS, dissect_zbee_zcl_appl_stats, proto_zbee_zcl_appl_stats);
-
} /* proto_register_zbee_zcl_appl_stats */
-
/*FUNCTION:------------------------------------------------------
* NAME
* proto_reg_handoff_zbee_zcl_appl_stats
@@ -1572,9 +1431,10 @@ proto_reg_handoff_zbee_zcl_appl_stats(void)
zbee_zcl_init_cluster( proto_zbee_zcl_appl_stats,
ett_zbee_zcl_appl_stats,
ZBEE_ZCL_CID_APPLIANCE_STATISTICS,
- (zbee_zcl_fn_attr_id)dissect_zcl_appl_stats_attr_id,
- NULL,
- (zbee_zcl_fn_cmd_id)dissect_zcl_appl_stats_cmd_id
+ hf_zbee_zcl_appl_stats_attr_id,
+ hf_zbee_zcl_appl_stats_srv_rx_cmd_id,
+ hf_zbee_zcl_appl_stats_srv_tx_cmd_id,
+ NULL
);
} /*proto_reg_handoff_zbee_zcl_appl_stats*/
diff --git a/epan/dissectors/packet-zbee-zcl-meas-sensing.c b/epan/dissectors/packet-zbee-zcl-meas-sensing.c
index 5a39fc11ac..11eb20e520 100644
--- a/epan/dissectors/packet-zbee-zcl-meas-sensing.c
+++ b/epan/dissectors/packet-zbee-zcl-meas-sensing.c
@@ -80,7 +80,6 @@ void proto_register_zbee_zcl_illum_meas(void);
void proto_reg_handoff_zbee_zcl_illum_meas(void);
/* Command Dissector Helpers */
-static void dissect_zcl_illum_meas_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
static void dissect_zcl_illum_meas_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
/* Private functions prototype */
@@ -147,27 +146,6 @@ dissect_zbee_zcl_illum_meas(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tre
/*FUNCTION:------------------------------------------------------
* NAME
- * dissect_zcl_illum_meas_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_illum_meas_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_illum_meas_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_illum_meas_attr_id*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
* dissect_zcl_illum_meas_attr_data
* DESCRIPTION
* this function is called by ZCL foundation dissector in order to decode
@@ -217,7 +195,6 @@ dissect_zcl_illum_meas_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset,
dissect_zcl_attr_data(tvb, tree, offset, data_type);
break;
}
-
} /*dissect_zcl_illum_meas_attr_data*/
/*FUNCTION:------------------------------------------------------
@@ -386,9 +363,9 @@ proto_reg_handoff_zbee_zcl_illum_meas(void)
zbee_zcl_init_cluster( proto_zbee_zcl_illum_meas,
ett_zbee_zcl_illum_meas,
ZBEE_ZCL_CID_ILLUMINANCE_MEASUREMENT,
- (zbee_zcl_fn_attr_id)dissect_zcl_illum_meas_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_illum_meas_attr_data,
- NULL
+ hf_zbee_zcl_illum_meas_attr_id,
+ -1, -1,
+ (zbee_zcl_fn_attr_data)dissect_zcl_illum_meas_attr_data
);
} /*proto_reg_handoff_zbee_zcl_illum_meas*/
@@ -433,7 +410,6 @@ void proto_register_zbee_zcl_temp_meas(void);
void proto_reg_handoff_zbee_zcl_temp_meas(void);
/* Command Dissector Helpers */
-static void dissect_zcl_temp_meas_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
static void dissect_zcl_temp_meas_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
/* Private functions prototype */
@@ -492,27 +468,6 @@ dissect_zbee_zcl_temp_meas(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree
/*FUNCTION:------------------------------------------------------
* NAME
- * dissect_zcl_temp_meas_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_temp_meas_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_temp_meas_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_temp_meas_attr_id*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
* dissect_zcl_temp_meas_attr_data
* DESCRIPTION
* this function is called by ZCL foundation dissector in order to decode
@@ -698,10 +653,8 @@ proto_register_zbee_zcl_temp_meas(void)
/* Register the ZigBee ZCL Temperature Measurement dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_TEMPMEAS, dissect_zbee_zcl_temp_meas, proto_zbee_zcl_temp_meas);
-
} /*proto_register_zbee_zcl_temp_meas*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* proto_reg_handoff_zbee_zcl_temp_meas
@@ -719,9 +672,9 @@ proto_reg_handoff_zbee_zcl_temp_meas(void)
zbee_zcl_init_cluster( proto_zbee_zcl_temp_meas,
ett_zbee_zcl_temp_meas,
ZBEE_ZCL_CID_TEMPERATURE_MEASUREMENT,
- (zbee_zcl_fn_attr_id)dissect_zcl_temp_meas_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_temp_meas_attr_data,
- NULL
+ hf_zbee_zcl_temp_meas_attr_id,
+ -1, -1,
+ (zbee_zcl_fn_attr_data)dissect_zcl_temp_meas_attr_data
);
} /*proto_reg_handoff_zbee_zcl_temp_meas*/
@@ -774,7 +727,6 @@ void proto_register_zbee_zcl_press_meas(void);
void proto_reg_handoff_zbee_zcl_press_meas(void);
/* Command Dissector Helpers */
-static void dissect_zcl_press_meas_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
static void dissect_zcl_press_meas_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
/* Private functions prototype */
@@ -843,27 +795,6 @@ dissect_zbee_zcl_press_meas(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tre
/*FUNCTION:------------------------------------------------------
* NAME
- * dissect_zcl_press_meas_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_press_meas_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_press_meas_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_press_meas_attr_id*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
* dissect_zcl_press_meas_attr_data
* DESCRIPTION
* this function is called by ZCL foundation dissector in order to decode
@@ -933,10 +864,8 @@ dissect_zcl_press_meas_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset,
dissect_zcl_attr_data(tvb, tree, offset, data_type);
break;
}
-
} /*dissect_zcl_press_meas_attr_data*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* decode_press_meas_value
@@ -1096,10 +1025,8 @@ proto_register_zbee_zcl_press_meas(void)
/* Register the ZigBee ZCL Pressure Measurement dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_PRESSMEAS, dissect_zbee_zcl_press_meas, proto_zbee_zcl_press_meas);
-
} /*proto_register_zbee_zcl_press_meas*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* proto_reg_handoff_zbee_zcl_press_meas
@@ -1117,9 +1044,9 @@ proto_reg_handoff_zbee_zcl_press_meas(void)
zbee_zcl_init_cluster( proto_zbee_zcl_press_meas,
ett_zbee_zcl_press_meas,
ZBEE_ZCL_CID_PRESSURE_MEASUREMENT,
- (zbee_zcl_fn_attr_id)dissect_zcl_press_meas_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_press_meas_attr_data,
- NULL
+ hf_zbee_zcl_press_meas_attr_id,
+ -1, -1,
+ (zbee_zcl_fn_attr_data)dissect_zcl_press_meas_attr_data
);
} /*proto_reg_handoff_zbee_zcl_press_meas*/
@@ -1165,7 +1092,6 @@ void proto_register_zbee_zcl_relhum_meas(void);
void proto_reg_handoff_zbee_zcl_relhum_meas(void);
/* Command Dissector Helpers */
-static void dissect_zcl_relhum_meas_attr_id (proto_tree *tree, tvbuff_t *tvb, guint *offset);
static void dissect_zcl_relhum_meas_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
/* Private functions prototype */
@@ -1224,27 +1150,6 @@ dissect_zbee_zcl_relhum_meas(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tr
/*FUNCTION:------------------------------------------------------
* NAME
- * dissect_zcl_relhum_meas_attr_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster attributes identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_relhum_meas_attr_id(proto_tree *tree, tvbuff_t *tvb, guint *offset)
-{
- proto_tree_add_item(tree, hf_zbee_zcl_relhum_meas_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
-} /*dissect_zcl_relhum_meas_attr_id*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
* dissect_zcl_relhum_meas_attr_data
* DESCRIPTION
* this function is called by ZCL foundation dissector in order to decode
@@ -1289,10 +1194,8 @@ dissect_zcl_relhum_meas_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset
dissect_zcl_attr_data(tvb, tree, offset, data_type);
break;
}
-
} /*dissect_zcl_relhum_meas_attr_data*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* decode_relhum_meas_value
@@ -1430,7 +1333,6 @@ proto_register_zbee_zcl_relhum_meas(void)
/* Register the ZigBee ZCL Relative Humidity Measurement dissector. */
register_dissector(ZBEE_PROTOABBREV_ZCL_RELHUMMEAS, dissect_zbee_zcl_relhum_meas, proto_zbee_zcl_relhum_meas);
-
} /*proto_register_zbee_zcl_relhum_meas*/
@@ -1451,9 +1353,9 @@ proto_reg_handoff_zbee_zcl_relhum_meas(void)
zbee_zcl_init_cluster( proto_zbee_zcl_relhum_meas,
ett_zbee_zcl_relhum_meas,
ZBEE_ZCL_CID_REL_HUMIDITY_MEASUREMENT,
- (zbee_zcl_fn_attr_id)dissect_zcl_relhum_meas_attr_id,
- (zbee_zcl_fn_attr_data)dissect_zcl_relhum_meas_attr_data,
- NULL
+ hf_zbee_zcl_relhum_meas_attr_id,
+ -1, -1,
+ (zbee_zcl_fn_attr_data)dissect_zcl_relhum_meas_attr_data
);
} /*proto_reg_handoff_zbee_zcl_relhum_meas*/
diff --git a/epan/dissectors/packet-zbee-zcl-misc.c b/epan/dissectors/packet-zbee-zcl-misc.c
new file mode 100644
index 0000000000..4a9862d4b6
--- /dev/null
+++ b/epan/dissectors/packet-zbee-zcl-misc.c
@@ -0,0 +1,1115 @@
+/* packet-zbee-zcl-misc.c
+ * Dissector routines for the ZigBee ZCL SE clusters like
+ * Messaging
+ * By Fabio Tarabelloni <fabio.tarabelloni@reloc.it>
+ * Copyright 2013 RELOC s.r.l.
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* Include Files */
+#include "config.h"
+
+#include <string.h>
+#include <glib.h>
+#include <epan/packet.h>
+#include <epan/to_str.h>
+
+#include "packet-zbee.h"
+#include "packet-zbee-aps.h"
+#include "packet-zbee-zcl.h"
+
+/* ########################################################################## */
+/* #### (0x0201) THERMOSTAT CLUSTER ######################################### */
+/* ########################################################################## */
+
+/* Cluster-specific commands and parameters */
+#define ZBEE_ZCL_CSC_POLL_CONTROL_C_CIR 0x00
+#define ZBEE_ZCL_CSC_POLL_CONTROL_C_FPS 0x01
+#define ZBEE_ZCL_CSC_POLL_CONTROL_C_SLPI 0x02
+#define ZBEE_ZCL_CSC_POLL_CONTROL_C_SSPI 0x03
+#define ZBEE_ZCL_CSC_POLL_CONTROL_S_CI 0x00
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_CWS 0x03
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_GWS 0x02
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SRL 0x00
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS 0x01
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_AV 0x80
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_FR 0x20
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_MO 0x02
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_SA 0x40
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_SU 0x01
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_TH 0x10
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_TU 0x04
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_WE 0x08
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_B 0x03
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_C 0x02
+#define ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_H 0x01
+#define ZBEE_ZCL_CSC_THERMOSTAT_S_GWSR 0x00
+
+#define ZBEE_ZCL_THERMOSTAT_NUM_ETT 3
+
+/* Thermostat Information Attributes */
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_LOCAL_TEMP 0x0000
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_OUTDOOR_TEMP 0x0001
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_OCCUPANCY 0x0002
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_ABS_MIN_HEAT_SETPOINT 0x0003
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_ABS_MAX_HEAT_SETPOINT 0x0004
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_ABS_MIN_COOL_SETPOINT 0x0005
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_ABS_MAX_COOL_SETPOINT 0x0006
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_PI_COOL_DEMAND 0x0007
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_PI_HEAT_DEMAND 0x0008
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_HVAC_TYPE_CONFIG 0x0009
+/* Thermostat Settings Attributes */
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_LOCAL_TEMP_CALIBRATION 0x0010
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_OCCUPIED_COOL_SETPOINT 0x0011
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_OCCUPIED_HEAT_SETPOINT 0x0012
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_UNOCCUPIED_COOL_SETPOINT 0x0013
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_UNOCCUPIED_HEAT_SETPOINT 0x0014
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_MIN_HEAT_SETPOINT 0x0015
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_MAX_HEAT_SETPOINT 0x0016
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_MIN_COOL_SETPOINT 0x0017
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_MAX_COOL_SETPOINT 0x0018
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_MIN_SETPOINT_DEADBAND 0x0019
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_REMOTE_SENSING 0x001A
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_CONTROL_SEQUENCE 0x001B
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_SYSTEM_MODE 0x001C
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_ALARM_MASK 0x001D
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_RUNNING_MODE 0x001E
+/* Schedule & HVAC Relay Attributes. */
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_START_OF_WEEK 0x0020
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_NUM_WEEKLY_TRANSITIONS 0x0021
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_NUM_DAILY_TRANSITIONS 0x0022
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_SETPOINT_HOLD 0x0023
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_SETPOINT_HOLD_DURATION 0x0024
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_PROGRAMMING_MODE 0x0025
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_RUNNING_STATE 0x0029
+/* Setpoint Change Tracking Attributes. */
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_SETPOINT_CHANGE_SOURCE 0x0030
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_SETPOINT_CHANGE_AMOUNT 0x0031
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_SETPOINT_CHANGE_TIME 0x0032
+/* Air Conditioning Atrributes. */
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_AC_TYPE 0x0040
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_AC_CAPACITY 0x0041
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_AC_REFRIGERANT_TYPE 0x0042
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_AC_COMPRESSOR_TYPE 0x0043
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_AC_ERROR_CODE 0x0044
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_AC_LOUVER_POSITION 0x0045
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_AC_COIL_TEMPERATURE 0x0046
+#define ZBEE_ZCL_ATTR_ID_THERMOSTAT_AC_CAPACITY_FORMAT 0x0047
+
+static const value_string zbee_zcl_thermostat_attr_names[] = {
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_LOCAL_TEMP, "LocalTemperature" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_OUTDOOR_TEMP, "OutdoorTemperature" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_OCCUPANCY, "Occupancy" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_ABS_MIN_HEAT_SETPOINT, "AbsMinHeatSetpointLimit" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_ABS_MAX_HEAT_SETPOINT, "AbsMaxHeatSetpointLimit" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_ABS_MIN_COOL_SETPOINT, "AbsMinCoolSetpointLimit" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_ABS_MAX_COOL_SETPOINT, "AbsMaxCoolSetpointLimit" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_PI_COOL_DEMAND, "PICoolingDemand" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_PI_HEAT_DEMAND, "PIHeatingDemand" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_HVAC_TYPE_CONFIG, "HVACSystemTypeConfiguration" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_LOCAL_TEMP_CALIBRATION, "LocalTemperatureCalibration" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_OCCUPIED_COOL_SETPOINT, "OccupiedCoolingSetpoint" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_OCCUPIED_HEAT_SETPOINT, "OccupiedHeatingSetpoint" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_UNOCCUPIED_COOL_SETPOINT, "UnoccupiedCoolingSetpoint" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_UNOCCUPIED_HEAT_SETPOINT, "UnoccupiedHeatingSetpoint" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_MIN_HEAT_SETPOINT, "MinHeatSetpointLimit" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_MAX_HEAT_SETPOINT, "MaxHeatSetpointLimit" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_MIN_COOL_SETPOINT, "MinCoolSetpointLimit" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_MAX_COOL_SETPOINT, "MaxCoolSetpointLimit" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_MIN_SETPOINT_DEADBAND, "MinSetpointDeadBand" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_REMOTE_SENSING, "RemoteSensing" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_CONTROL_SEQUENCE, "ControlSequenceOfOperation" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_SYSTEM_MODE, "SystemMode" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_ALARM_MASK, "AlarmMask" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_RUNNING_MODE, "ThermostatRunningMode" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_START_OF_WEEK, "StartOfWeek" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_NUM_WEEKLY_TRANSITIONS, "NumberOfWeeklyTransitions" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_NUM_DAILY_TRANSITIONS, "NumberOfDailyTransitions" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_SETPOINT_HOLD, "TemperatureSetpointHold" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_SETPOINT_HOLD_DURATION, "TemperatureSetpointHoldDuration" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_PROGRAMMING_MODE, "ThermostatProgrammingOperationMode" },
+ { ZBEE_ZCL_ATTR_ID_THERMOSTAT_RUNNING_STATE, "ThermostatRunningState" },
+ { 0, NULL }
+};
+
+/* RemoteSensing bitmask. */
+#define ZBEE_ZCL_THERMOSTAT_REMOTE_SENSE_LOCAL 0x01
+#define ZBEE_ZCL_THERMOSTAT_REMOTE_SENSE_OUTDOOR 0x02
+#define ZBEE_ZCL_THERMOSTAT_REMOTE_SENSE_OCCUPANCY 0x04
+
+#define ZBEE_ZCL_THERMOSTAT_ALARM_INIT_FAILURE 0x01
+#define ZBEE_ZCL_THERMOSTAT_ALARM_HARDWARE_FAILURE 0x02
+#define ZBEE_ZCL_THERMOSTAT_ALARM_CALIBRATION_FAILURE 0x04
+
+/* Programming operation mode bits. */
+#define ZBEE_ZCL_THERMOSTAT_PROGRAM_MODE_SCHEDULE 0x01
+#define ZBEE_ZCL_THERMOSTAT_PROGRAM_MODE_AUTO 0x02
+#define ZBEE_ZCL_THERMOSTAT_PROGRAM_MODE_ENERGY_STAR 0x04
+
+/* HVAC Running State bits. */
+#define ZBEE_ZCL_THERMOSTAT_RUNNING_STATE_HEAT 0x0001
+#define ZBEE_ZCL_THERMOSTAT_RUNNING_STATE_COOL 0x0002
+#define ZBEE_ZCL_THERMOSTAT_RUNNING_STATE_FAN 0x0004
+#define ZBEE_ZCL_THERMOSTAT_RUNNING_STATE_HEAT2 0x0008
+#define ZBEE_ZCL_THERMOSTAT_RUNNING_STATE_COOL2 0x0010
+#define ZBEE_ZCL_THERMOSTAT_RUNNING_STATE_FAN2 0x0020
+#define ZBEE_ZCL_THERMOSTAT_RUNNING_STATE_FAN3 0x0040
+
+/* Client-to-server commands. */
+#define ZBEE_ZCL_CMD_ID_THERMOSTAT_SETPOINT 0x00
+#define ZBEE_ZCL_CMD_ID_THERMOSTAT_SET_SCHEDULE 0x01
+#define ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_SCHEDULE 0x02
+#define ZBEE_ZCL_CMD_ID_THERMOSTAT_CLEAR_SCHEDULE 0x03
+#define ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_RELAY_LOG 0x04
+static const value_string zbee_zcl_thermostat_srv_rx_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_THERMOSTAT_SETPOINT, "Setpoint Raise/Lower" },
+ { ZBEE_ZCL_CMD_ID_THERMOSTAT_SET_SCHEDULE, "Set Weekly Schedule" },
+ { ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_SCHEDULE, "Get Weekly Schedule" },
+ { ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_RELAY_LOG, "Get Relay Status Log" },
+ { 0, NULL }
+};
+
+#define ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_SCHEDULE_RESPONSE 0x00
+#define ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_RELAY_LOG_RESPONSE 0x01
+static const value_string zbee_zcl_thermostat_srv_tx_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_SCHEDULE_RESPONSE, "Get Weekly Schedule Response" },
+ { ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_RELAY_LOG_RESPONSE,"Get Relay Status Log Response" },
+ { 0, NULL }
+};
+
+#define ZBEE_ZCL_CMD_THERMOSTAT_SCHEDULE_MODE_SEQUENCE_HEAT 0x01
+#define ZBEE_ZCL_CMD_THERMOSTAT_SCHEDULE_MODE_SEQUENCE_COOL 0x02
+
+/* Setpoint mode names. */
+static const value_string zbee_zcl_thermostat_setpoint_mode_names[] = {
+ { 0, "Heat" },
+ { 1, "Cool" },
+ { 2, "Both" },
+ { 0, NULL }
+};
+
+/*************************/
+/* Global Variables */
+/*************************/
+static int proto_zbee_zcl_thermostat = -1;
+
+static int hf_zbee_zcl_thermostat_attr_id = -1;
+static int hf_zbee_zcl_thermostat_srv_rx_cmd_id = -1;
+static int hf_zbee_zcl_thermostat_srv_tx_cmd_id = -1;
+static int hf_zbee_zcl_thermostat_setpoint_mode = -1;
+static int hf_zbee_zcl_thermostat_setpoint_amount = -1;
+
+static int hf_zbee_zcl_thermostat_schedule_num_trans = -1;
+static int hf_zbee_zcl_thermostat_schedule_day_sequence = -1;
+static int hf_zbee_zcl_thermostat_schedule_day_sunday = -1;
+static int hf_zbee_zcl_thermostat_schedule_day_monday = -1;
+static int hf_zbee_zcl_thermostat_schedule_day_tuesday = -1;
+static int hf_zbee_zcl_thermostat_schedule_day_wednesday = -1;
+static int hf_zbee_zcl_thermostat_schedule_day_thursday = -1;
+static int hf_zbee_zcl_thermostat_schedule_day_friday = -1;
+static int hf_zbee_zcl_thermostat_schedule_day_saturday = -1;
+static int hf_zbee_zcl_thermostat_schedule_day_vacation = -1;
+static int hf_zbee_zcl_thermostat_schedule_mode_sequence = -1;
+static int hf_zbee_zcl_thermostat_schedule_mode_heat = -1;
+static int hf_zbee_zcl_thermostat_schedule_mode_cool = -1;
+static int hf_zbee_zcl_thermostat_schedule_time = -1;
+static int hf_zbee_zcl_thermostat_schedule_heat = -1;
+static int hf_zbee_zcl_thermostat_schedule_cool = -1;
+
+static gint ett_zbee_zcl_thermostat = -1;
+static gint ett_zbee_zcl_thermostat_schedule_days = -1;
+static gint ett_zbee_zcl_thermostat_schedule_mode = -1;
+
+/*************************/
+/* Function Declarations */
+/*************************/
+void proto_register_zbee_zcl_thermostat(void);
+void proto_reg_handoff_zbee_zcl_thermostat(void);
+
+/* Attribute Dissector Helpers */
+static void dissect_zcl_thermostat_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
+
+static int dissect_zcl_thermostat_schedule(proto_tree *tree, tvbuff_t *tvb, guint offset);
+static void dissect_zcl_thermostat_schedule_days(proto_tree *tree, tvbuff_t *tvb, guint offset);
+static void dissect_zcl_thermostat_schedule_mode(proto_tree *tree, tvbuff_t *tvb, guint offset);
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_thermostat_schedule_days
+ * DESCRIPTION
+ * Helper function to dissect a Thermostat scheduling days bitmask.
+ * PARAMETERS
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * guint offset - payload offset of the ZoneStatus value.
+ * RETURNS
+ * void
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_thermostat_schedule_days(proto_tree *tree, tvbuff_t *tvb, guint offset)
+{
+
+ static const int * thermostat_schedule_days[] = {
+ &hf_zbee_zcl_thermostat_schedule_day_sunday,
+ &hf_zbee_zcl_thermostat_schedule_day_monday,
+ &hf_zbee_zcl_thermostat_schedule_day_tuesday,
+ &hf_zbee_zcl_thermostat_schedule_day_wednesday,
+ &hf_zbee_zcl_thermostat_schedule_day_thursday,
+ &hf_zbee_zcl_thermostat_schedule_day_friday,
+ &hf_zbee_zcl_thermostat_schedule_day_saturday,
+ &hf_zbee_zcl_thermostat_schedule_day_vacation,
+ NULL
+ };
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_zcl_thermostat_schedule_day_sequence,
+ ett_zbee_zcl_thermostat_schedule_days, thermostat_schedule_days, ENC_NA);
+
+} /* dissect_zcl_thermostat_schedule_days */
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_thermostat_schedule_mode
+ * DESCRIPTION
+ * Helper function to dissect a Thermostat scheduling mode bitmask.
+ * PARAMETERS
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * guint offset - payload offset of the ZoneStatus value.
+ * RETURNS
+ * void
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_thermostat_schedule_mode(proto_tree *tree, tvbuff_t *tvb, guint offset)
+{
+
+ static const int * thermostat_schedule_modes[] = {
+ &hf_zbee_zcl_thermostat_schedule_mode_heat,
+ &hf_zbee_zcl_thermostat_schedule_mode_cool,
+ NULL
+ };
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_zcl_thermostat_schedule_mode_sequence,
+ ett_zbee_zcl_thermostat_schedule_mode, thermostat_schedule_modes, ENC_NA);
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_thermostat_cmd_schedule
+ * DESCRIPTION
+ * Helper function to dissect a Thermostat schedule, which has
+ * a common format in both the Set Weekly Schedule, and Get
+ * Weekly Schedule Response commands.
+ * PARAMETERS
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * guint offset - payload offset of the ZoneStatus value.
+ * RETURNS
+ * int - length of parsed data.
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zcl_thermostat_schedule(proto_tree *tree, tvbuff_t *tvb, guint offset)
+{
+ guint start = offset;
+ guint8 num_transitions;
+ guint8 mode_sequence;
+ int i;
+
+ num_transitions = tvb_get_guint8(tvb, offset);
+ proto_tree_add_uint(tree, hf_zbee_zcl_thermostat_schedule_num_trans, tvb, offset, 1,
+ num_transitions);
+ offset++;
+
+ dissect_zcl_thermostat_schedule_days(tree, tvb, offset);
+ offset++;
+
+ mode_sequence = tvb_get_guint8(tvb, offset);
+ dissect_zcl_thermostat_schedule_mode(tree, tvb, offset);
+ offset++;
+
+ /* Parse the list of setpoint transitions. */
+ for (i = 0; i < num_transitions; i++) {
+ nstime_t tv;
+ tv.secs = tvb_get_letohs(tvb, offset) * 60;
+ tv.nsecs = 0;
+ proto_tree_add_time(tree, hf_zbee_zcl_thermostat_schedule_time, tvb, offset, 2, &tv);
+ offset += 2;
+
+ if (mode_sequence & ZBEE_ZCL_CMD_THERMOSTAT_SCHEDULE_MODE_SEQUENCE_HEAT) {
+ float setpoint = (gint16)tvb_get_letohs(tvb, offset);
+ proto_tree_add_float(tree, hf_zbee_zcl_thermostat_schedule_heat,
+ tvb, offset, 2, (setpoint / 100.0f));
+ offset += 2;
+ }
+ if (mode_sequence & ZBEE_ZCL_CMD_THERMOSTAT_SCHEDULE_MODE_SEQUENCE_COOL) {
+ float setpoint = (gint16)tvb_get_letohs(tvb, offset);
+ proto_tree_add_float(tree, hf_zbee_zcl_thermostat_schedule_cool,
+ tvb, offset, 2, (setpoint / 100.0f));
+ offset += 2;
+ }
+ } /* for */
+
+ /* Return the number of bytes parsed. */
+ return (offset - start);
+} /* dissect_zcl_thermostat_cmd_schedule */
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zbee_zcl_thermostat
+ * DESCRIPTION
+ * ZigBee ZCL Thermostat cluster dissector for wireshark.
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * packet_info *pinfo - pointer to packet information fields
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * void *data - pointer to ZCL packet structure.
+ * RETURNS
+ * int - length of parsed data.
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zbee_zcl_thermostat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+{
+ zbee_zcl_packet *zcl;
+ guint offset = 0;
+ guint8 cmd_id;
+ float amount;
+
+ /* Reject the packet if data is NULL */
+ if (data == NULL)
+ return 0;
+ zcl = (zbee_zcl_packet *)data;
+ cmd_id = zcl->cmd_id;
+
+ if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_thermostat_srv_rx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_thermostat_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
+ offset++;
+
+ /* Handle the command dissection. */
+ switch (cmd_id) {
+ case ZBEE_ZCL_CMD_ID_THERMOSTAT_SETPOINT:
+ /* Setpoint Raise/Lower. */
+ proto_tree_add_item(tree, hf_zbee_zcl_thermostat_setpoint_mode,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ amount = (gint8)tvb_get_guint8(tvb, offset);
+ proto_tree_add_float(tree, hf_zbee_zcl_thermostat_setpoint_amount,
+ tvb, offset, 1, (amount / 100.0f));
+ offset++;
+ break;
+
+ case ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_SCHEDULE:
+ /* Get Weekly Schedule. */
+ dissect_zcl_thermostat_schedule_days(tree, tvb, offset);
+ offset++;
+ dissect_zcl_thermostat_schedule_mode(tree, tvb, offset);
+ offset++;
+ break;
+
+ case ZBEE_ZCL_CMD_ID_THERMOSTAT_SET_SCHEDULE:
+ /* Set Weekly Schedule. */
+ dissect_zcl_thermostat_schedule(tree, tvb, offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_RELAY_LOG:
+ /* No Payload - fall-through. */
+ default:
+ break;
+ } /* switch */
+ } else {
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_thermostat_srv_tx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_thermostat_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
+ offset++;
+
+ /* Handle the command dissection. */
+ switch (cmd_id) {
+ case ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_SCHEDULE_RESPONSE:
+ /* Get Weekly Schedule Response. */
+ dissect_zcl_thermostat_schedule(tree, tvb, offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_THERMOSTAT_GET_RELAY_LOG_RESPONSE:
+ /* TODO: Implement Me! */
+ default:
+ break;
+ } /* switch */
+ }
+
+ return tvb_captured_length(tvb);
+} /* dissect_zbee_zcl_thermostat */
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_thermostat_attr_data
+ * DESCRIPTION
+ * this function is called by ZCL foundation dissector in order to decode
+ * specific cluster attributes data.
+ * PARAMETERS
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * guint *offset - pointer to buffer offset
+ * guint16 attr_id - attribute identifier
+ * guint data_type - attribute data type
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_thermostat_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type)
+{
+ /* Dissect attribute data type and data */
+ switch (attr_id) {
+ default:
+ dissect_zcl_attr_data(tvb, tree, offset, data_type);
+ break;
+ }
+} /*dissect_zcl_thermostat_attr_data*/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_register_zbee_zcl_ias_zone
+ * DESCRIPTION
+ * ZigBee ZCL IAS Zone cluste protocol registration.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * void
+ *---------------------------------------------------------------
+ */
+void
+proto_register_zbee_zcl_thermostat(void)
+{
+ /* Setup list of header fields */
+ static hf_register_info hf[] = {
+
+ { &hf_zbee_zcl_thermostat_attr_id,
+ { "Attribute", "zbee_zcl_hvac.thermostat.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_thermostat_attr_names),
+ 0x0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_thermostat_srv_rx_cmd_id,
+ { "Command", "zbee_zcl_hvac.thermostat.cmd.srv_rx.id", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_thermostat_srv_rx_cmd_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_thermostat_srv_tx_cmd_id,
+ { "Command", "zbee_zcl_hvac.thermostat.cmd.srv_tx.id", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_thermostat_srv_tx_cmd_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_thermostat_setpoint_mode,
+ { "Mode", "zbee_zcl_hvac.thermostat.mode", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_thermostat_setpoint_mode_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_thermostat_setpoint_amount,
+ { "Amount", "zbee_zcl_hvac.thermostat.amount", FT_FLOAT, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_num_trans,
+ { "Number of Transitions for Sequence", "zbee_zcl_hvac.thermostat.num_trans", FT_UINT8, BASE_HEX, NULL,
+ 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_day_sequence,
+ { "Days of Week for Sequence", "zbee_zcl_hvac.thermostat.day_sequence", FT_UINT8, BASE_HEX, NULL,
+ 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_day_sunday,
+ { "Sunday", "zbee_zcl_hvac.thermostat.day.sunday", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x01, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_day_monday,
+ { "Monday", "zbee_zcl_hvac.thermostat.day.monday", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x02, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_day_tuesday,
+ { "Tuesday", "zbee_zcl_hvac.thermostat.day.tuesday", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x04, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_day_wednesday,
+ { "Wednesday", "zbee_zcl_hvac.thermostat.day.wednesday", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x08, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_day_thursday,
+ { "Thursday", "zbee_zcl_hvac.thermostat.day.thursday", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x10, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_day_friday,
+ { "Friday", "zbee_zcl_hvac.thermostat.day.friday", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x20, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_day_saturday,
+ { "Saturday", "zbee_zcl_hvac.thermostat.day.saturday", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x40, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_day_vacation,
+ { "Away/Vacation", "zbee_zcl_hvac.thermostat.day.vacation", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x80, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_mode_sequence,
+ { "Mode for Sequence", "zbee_zcl_hvac.thermostat.mode_sequence", FT_UINT8, BASE_HEX, NULL,
+ 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_mode_heat,
+ { "Heating", "zbee_zcl_hvac.thermostat.mode.heat", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x01, NULL, HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_mode_cool,
+ { "Cooling", "zbee_zcl_hvac.thermostat.mode.cool", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x02, NULL, HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_time,
+ { "Transition Time", "zbee_zcl_hvac.thermostat.time", FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0,
+ "Setpoint transition time relative to midnight of the scheduled day", HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_heat,
+ { "Heating Setpoint", "zbee_zcl_hvac.thermostat.heat", FT_FLOAT, BASE_NONE, NULL, 0x0,
+ "Heating setpoint in degrees Celcius", HFILL }},
+
+ { &hf_zbee_zcl_thermostat_schedule_cool,
+ { "Cooling Setpoint", "zbee_zcl_hvac.thermostat.cool", FT_FLOAT, BASE_NONE, NULL, 0x0,
+ "Cooling setpoint in degrees Celcius", HFILL }}
+ };
+
+ /* ZCL IAS Zone subtrees */
+ static gint *ett[ZBEE_ZCL_THERMOSTAT_NUM_ETT];
+
+ ett[0] = &ett_zbee_zcl_thermostat;
+ ett[1] = &ett_zbee_zcl_thermostat_schedule_days;
+ ett[2] = &ett_zbee_zcl_thermostat_schedule_mode;
+
+ /* Register the ZigBee ZCL IAS Zoben cluster protocol name and description */
+ proto_zbee_zcl_thermostat = proto_register_protocol("ZigBee ZCL Thermostat", "ZCL Thermostat", ZBEE_PROTOABBREV_ZCL_THERMOSTAT);
+ proto_register_field_array(proto_zbee_zcl_thermostat, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ /* Register the ZigBee ZCL IAS Zone dissector. */
+ new_register_dissector(ZBEE_PROTOABBREV_ZCL_THERMOSTAT, dissect_zbee_zcl_thermostat, proto_zbee_zcl_thermostat);
+} /*proto_register_zbee_zcl_thermostat*/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_reg_handoff_zbee_zcl_thermostat
+ * DESCRIPTION
+ * Hands off the ZCL Thermostat dissector.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+void
+proto_reg_handoff_zbee_zcl_thermostat(void)
+{
+ dissector_handle_t thermostat_handle;
+
+ /* Register our dissector with the ZigBee application dissectors. */
+ thermostat_handle = find_dissector(ZBEE_PROTOABBREV_ZCL_THERMOSTAT);
+ dissector_add_uint("zbee.zcl.cluster", ZBEE_ZCL_CID_THERMOSTAT, thermostat_handle);
+
+ zbee_zcl_init_cluster( proto_zbee_zcl_thermostat,
+ ett_zbee_zcl_thermostat,
+ ZBEE_ZCL_CID_THERMOSTAT,
+ hf_zbee_zcl_thermostat_attr_id,
+ hf_zbee_zcl_thermostat_srv_rx_cmd_id,
+ hf_zbee_zcl_thermostat_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_thermostat_attr_data
+ );
+} /*proto_reg_handoff_zbee_zcl_thermostat*/
+
+/* ########################################################################## */
+/* #### (0x0500) IAS ZONE CLUSTER ########################################### */
+/* ########################################################################## */
+
+#define ZBEE_ZCL_IAS_ZONE_NUM_ETT 2
+
+/* IAS Zone Server Attributes */
+#define ZBEE_ZCL_ATTR_ID_IAS_ZONE_STATE 0x0000
+#define ZBEE_ZCL_ATTR_ID_IAS_ZONE_TYPE 0x0001
+#define ZBEE_ZCL_ATTR_ID_IAS_ZONE_STATUS 0x0002
+#define ZBEE_ZCL_ATTR_ID_IAS_CIE_ADDRESS 0x0010
+
+static const value_string zbee_zcl_ias_zone_attr_names[] = {
+ { ZBEE_ZCL_ATTR_ID_IAS_ZONE_STATE, "ZoneState" },
+ { ZBEE_ZCL_ATTR_ID_IAS_ZONE_TYPE, "ZoneType" },
+ { ZBEE_ZCL_ATTR_ID_IAS_ZONE_STATUS, "ZoneStatus" },
+ { ZBEE_ZCL_ATTR_ID_IAS_CIE_ADDRESS, "IAS_CIE_Address" },
+ { 0, NULL }
+};
+
+/* IAS Zone States */
+#define ZBEE_IAS_ZONE_STATE_NOT_ENROLLED 0x00
+#define ZBEE_IAS_ZONE_STATE_ENROLLED 0x01
+static const value_string zbee_ias_state_names[] = {
+ { ZBEE_IAS_ZONE_STATE_NOT_ENROLLED, "Not Enrolled" },
+ { ZBEE_IAS_ZONE_STATE_ENROLLED, "Enrolled" },
+ { 0, NULL }
+};
+
+/* IAS Zone Type values. */
+#define ZBEE_IAS_ZONE_TYPE_STANDARD_CIE 0x0000
+#define ZBEE_IAS_ZONE_TYPE_MOTION_SENSOR 0x000D
+#define ZBEE_IAS_ZONE_TYPE_CONTACT_SWITCH 0x0015
+#define ZBEE_IAS_ZONE_TYPE_FIRE_SENSOR 0x0028
+#define ZBEE_IAS_ZONE_TYPE_WATER_SENSOR 0x002A
+#define ZBEE_IAS_ZONE_TYPE_GAS_SENSOR 0x002B
+#define ZBEE_IAS_ZONE_TYPE_PERSONAL_EMERGENCY 0x002C
+#define ZBEE_IAS_ZONE_TYPE_VIBRATION_SENSOR 0x002D
+#define ZBEE_IAS_ZONE_TYPE_REMOTE_CONTROL 0x010F
+#define ZBEE_IAS_ZONE_TYPE_KEY_FOB 0x0115
+#define ZBEE_IAS_ZONE_TYPE_KEYPAD 0x021D
+#define ZBEE_IAS_ZONE_TYPE_STANDARD_WARNING 0x0225
+#define ZBEE_IAS_ZONE_TYPE_INVALID_ZONE_TYPE 0xFFFF
+
+#define ZBEE_IAS_ZONE_STATUS_ALARM1 0x0001
+#define ZBEE_IAS_ZONE_STATUS_ALARM2 0x0002
+#define ZBEE_IAS_ZONE_STATUS_TAMPER 0x0004
+#define ZBEE_IAS_ZONE_STATUS_BATTERY 0x0008
+#define ZBEE_IAS_ZONE_STATUS_SUPERVISION 0x0010
+#define ZBEE_IAS_ZONE_STATUS_RESTORE 0x0020
+#define ZBEE_IAS_ZONE_STATUS_TROUBLE 0x0040
+#define ZBEE_IAS_ZONE_STATUS_AC_MAINS 0x0080
+
+static const value_string zbee_ias_type_names[] = {
+ { ZBEE_IAS_ZONE_TYPE_STANDARD_CIE, "Standard CIE" },
+ { ZBEE_IAS_ZONE_TYPE_MOTION_SENSOR, "Motion sensor" },
+ { ZBEE_IAS_ZONE_TYPE_CONTACT_SWITCH, "Contact switch" },
+ { ZBEE_IAS_ZONE_TYPE_FIRE_SENSOR, "Fire sensor" },
+ { ZBEE_IAS_ZONE_TYPE_WATER_SENSOR, "Water sensor" },
+ { ZBEE_IAS_ZONE_TYPE_GAS_SENSOR, "Gas sensor" },
+ { ZBEE_IAS_ZONE_TYPE_PERSONAL_EMERGENCY, "Personal emergency device" },
+ { ZBEE_IAS_ZONE_TYPE_VIBRATION_SENSOR, "Vibration/movement sensor" },
+ { ZBEE_IAS_ZONE_TYPE_REMOTE_CONTROL, "Remote control" },
+ { ZBEE_IAS_ZONE_TYPE_KEY_FOB, "Key fob" },
+ { ZBEE_IAS_ZONE_TYPE_KEYPAD, "Keypad" },
+ { ZBEE_IAS_ZONE_TYPE_STANDARD_WARNING, "Standard warning device" },
+ { ZBEE_IAS_ZONE_TYPE_INVALID_ZONE_TYPE, "Invalid zone type" },
+ { 0, NULL }
+};
+
+/* Server-to-client command IDs. */
+#define ZBEE_ZCL_CMD_ID_IAS_ZONE_ENROLL_NOTIFY 0x00
+#define ZBEE_ZCL_CMD_ID_IAS_ZONE_ENROLL_REQUEST 0x01
+static const value_string zbee_zcl_ias_zone_srv_tx_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_IAS_ZONE_ENROLL_REQUEST, "Zone Enroll Request" },
+ { ZBEE_ZCL_CMD_ID_IAS_ZONE_ENROLL_NOTIFY, "Zone Status Change Notification" },
+ { 0, NULL }
+};
+
+/* Client-to-server command IDs. */
+#define ZBEE_ZCL_CMD_ID_IAS_ZONE_ENROLL_RESPONSE 0x00
+static const value_string zbee_zcl_ias_zone_srv_rx_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_IAS_ZONE_ENROLL_RESPONSE, "Zone Enroll Response" },
+ { 0, NULL }
+};
+
+
+static const value_string zbee_zcl_ias_zone_enroll_code_names[] = {
+ { 0, "Success" },
+ { 1, "Not Supported" },
+ { 2, "No enroll permit" },
+ { 3, "Too many zones" },
+ { 0, NULL }
+};
+
+/*************************/
+/* Global Variables */
+/*************************/
+/* Initialize the protocol and registered fields */
+static int proto_zbee_zcl_ias_zone = -1;
+
+static int hf_zbee_zcl_ias_zone_attr_id = -1;
+static int hf_zbee_zcl_ias_zone_srv_rx_cmd_id = -1;
+static int hf_zbee_zcl_ias_zone_srv_tx_cmd_id = -1;
+static int hf_zbee_zcl_ias_zone_enroll_code = -1;
+static int hf_zbee_zcl_ias_zone_zone_id = -1;
+static int hf_zbee_zcl_ias_zone_state = -1;
+static int hf_zbee_zcl_ias_zone_type = -1;
+static int hf_zbee_zcl_ias_zone_status = -1;
+static int hf_zbee_zcl_ias_zone_delay = -1;
+static int hf_zbee_zcl_ias_zone_ext_status = -1;
+static int hf_zbee_zcl_ias_zone_status_ac_mains = -1;
+static int hf_zbee_zcl_ias_zone_status_alarm1 = -1;
+static int hf_zbee_zcl_ias_zone_status_alarm2 = -1;
+static int hf_zbee_zcl_ias_zone_status_battery = -1;
+static int hf_zbee_zcl_ias_zone_status_restore_reports = -1;
+static int hf_zbee_zcl_ias_zone_status_supervision_reports = -1;
+static int hf_zbee_zcl_ias_zone_status_tamper = -1;
+static int hf_zbee_zcl_ias_zone_status_trouble = -1;
+
+static const true_false_string tfs_ac_mains = {
+ "AC/Mains fault",
+ "AC/Mains OK"
+};
+
+static const true_false_string tfs_alarmed_or_not = {
+ "Opened or alarmed",
+ "Closed or not alarmed"
+};
+
+static const true_false_string tfs_battery = {
+ "Low battery",
+ "Battery OK"
+};
+
+static const true_false_string tfs_reports_or_not = {
+ "Reports",
+ "Does not report"
+};
+
+static const true_false_string tfs_reports_restore = {
+ "Reports restore",
+ "Does not report restore"
+};
+
+static const true_false_string tfs_tampered_or_not = {
+ "Tampered",
+ "Not tampered"
+};
+
+static const true_false_string tfs_trouble_failure = {
+ "Trouble/Failure",
+ "OK"
+};
+
+static gint ett_zbee_zcl_ias_zone = -1;
+static gint ett_zbee_zcl_ias_zone_status = -1;
+
+/*************************/
+/* Function Declarations */
+/*************************/
+void proto_register_zbee_zcl_ias_zone(void);
+void proto_reg_handoff_zbee_zcl_ias_zone(void);
+
+/* Command Dissector Helpers. */
+static int dissect_zbee_zcl_ias_zone (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data);
+
+/* Attribute Dissector Helpers */
+static void dissect_zcl_ias_zone_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
+
+/* ZoneStatus bitmask helper */
+static void dissect_zcl_ias_zone_status (proto_tree *tree, tvbuff_t *tvb, guint offset);
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ias_zone_status
+ * DESCRIPTION
+ * Helper function to dissect the IAS ZoneStatus bitmask.
+ * PARAMETERS
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * guint offset - payload offset of the ZoneStatus value.
+ * RETURNS
+ * int - length of parsed data.
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_ias_zone_status(proto_tree *tree, tvbuff_t *tvb, guint offset)
+{
+ static const int * ias_zone_statuses[] = {
+ &hf_zbee_zcl_ias_zone_status_alarm1,
+ &hf_zbee_zcl_ias_zone_status_alarm2,
+ &hf_zbee_zcl_ias_zone_status_tamper,
+ &hf_zbee_zcl_ias_zone_status_battery,
+ &hf_zbee_zcl_ias_zone_status_supervision_reports,
+ &hf_zbee_zcl_ias_zone_status_restore_reports,
+ &hf_zbee_zcl_ias_zone_status_trouble,
+ &hf_zbee_zcl_ias_zone_status_ac_mains,
+ NULL
+ };
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_zcl_ias_zone_status, ett_zbee_zcl_ias_zone_status, ias_zone_statuses, ENC_NA);
+
+} /* dissect_zcl_ias_zone_status */
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zbee_zcl_ias_zone
+ * DESCRIPTION
+ * ZigBee ZCL IAS Zone cluster dissector for wireshark.
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * packet_info *pinfo - pointer to packet information fields
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * void *data - pointer to ZCL packet structure.
+ * RETURNS
+ * int - length of parsed data.
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zbee_zcl_ias_zone(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+{
+ zbee_zcl_packet *zcl;
+ guint offset = 0;
+ guint8 cmd_id;
+
+ /* Reject the packet if data is NULL */
+ if (data == NULL)
+ return 0;
+ zcl = (zbee_zcl_packet *)data;
+ cmd_id = zcl->cmd_id;
+
+ if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_ias_zone_srv_rx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_ias_zone_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
+ offset++;
+
+ /* Handle the command dissection. */
+ switch (cmd_id) {
+ case ZBEE_ZCL_CMD_ID_IAS_ZONE_ENROLL_RESPONSE:
+ proto_tree_add_item(tree, hf_zbee_zcl_ias_zone_enroll_code, tvb, offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_item(tree, hf_zbee_zcl_ias_zone_zone_id, tvb, offset, 1, ENC_NA);
+ offset++;
+ break;
+
+ default:
+ break;
+ } /* switch */
+ } else {
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_ias_zone_srv_tx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_ias_zone_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
+ offset++;
+
+ /* Handle the command dissection. */
+ switch (cmd_id) {
+ case ZBEE_ZCL_CMD_ID_IAS_ZONE_ENROLL_NOTIFY:
+ dissect_zcl_ias_zone_status(tree, tvb, offset);
+ offset += 2;
+ proto_tree_add_item(tree, hf_zbee_zcl_ias_zone_ext_status, tvb, offset,
+ 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_zbee_zcl_ias_zone_zone_id, tvb, offset, 1,
+ ENC_NA);
+ offset += 1;
+ proto_tree_add_item(tree, hf_zbee_zcl_ias_zone_delay, tvb, offset, 2,
+ ENC_LITTLE_ENDIAN);
+
+ case ZBEE_ZCL_CMD_ID_IAS_ZONE_ENROLL_REQUEST:
+ default:
+ break;
+ } /* switch */
+ }
+
+ return tvb_captured_length(tvb);
+} /* dissect_zbee_zcl_ias_zone */
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ias_zone_attr_data
+ * DESCRIPTION
+ * this function is called by ZCL foundation dissector in order to decode
+ * specific cluster attributes data.
+ * PARAMETERS
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * guint *offset - pointer to buffer offset
+ * guint16 attr_id - attribute identifier
+ * guint data_type - attribute data type
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_ias_zone_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type)
+{
+ /* Dissect attribute data type and data */
+ switch (attr_id) {
+ case ZBEE_ZCL_ATTR_ID_IAS_ZONE_STATE:
+ proto_tree_add_item(tree, hf_zbee_zcl_ias_zone_state, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+ break;
+
+ case ZBEE_ZCL_ATTR_ID_IAS_ZONE_TYPE:
+ proto_tree_add_item(tree, hf_zbee_zcl_ias_zone_type, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+ break;
+
+ case ZBEE_ZCL_ATTR_ID_IAS_ZONE_STATUS:
+ dissect_zcl_ias_zone_status(tree, tvb, *offset);
+ *offset += 2;
+ break;
+
+ case ZBEE_ZCL_ATTR_ID_IAS_CIE_ADDRESS:
+ default:
+ dissect_zcl_attr_data(tvb, tree, offset, data_type);
+ break;
+ }
+} /*dissect_zcl_ias_zone_attr_data*/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_reg_handoff_zbee_zcl_ias_zone
+ * DESCRIPTION
+ * Hands off the ZCL IAS Zone dissector.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+void
+proto_reg_handoff_zbee_zcl_ias_zone(void)
+{
+ dissector_handle_t zone_handle;
+
+ /* Register our dissector with the ZigBee application dissectors. */
+ zone_handle = find_dissector(ZBEE_PROTOABBREV_ZCL_IAS_ZONE);
+ dissector_add_uint("zbee.zcl.cluster", ZBEE_ZCL_CID_IAS_ZONE, zone_handle);
+
+ zbee_zcl_init_cluster( proto_zbee_zcl_ias_zone,
+ ett_zbee_zcl_ias_zone,
+ ZBEE_ZCL_CID_IAS_ZONE,
+ hf_zbee_zcl_ias_zone_attr_id,
+ hf_zbee_zcl_ias_zone_srv_rx_cmd_id,
+ hf_zbee_zcl_ias_zone_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_ias_zone_attr_data
+ );
+} /*proto_reg_handoff_zbee_zcl_ias_zone*/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_register_zbee_zcl_ias_zone
+ * DESCRIPTION
+ * ZigBee ZCL IAS Zone cluste protocol registration.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * void
+ *---------------------------------------------------------------
+ */
+void
+proto_register_zbee_zcl_ias_zone(void)
+{
+ /* Setup list of header fields */
+ static hf_register_info hf[] = {
+
+ { &hf_zbee_zcl_ias_zone_attr_id,
+ { "Attribute", "zbee_zcl_ias.zone.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_ias_zone_attr_names),
+ 0x0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ias_zone_srv_rx_cmd_id,
+ { "Command", "zbee_zcl_ias.zone.cmd.srv_rx.id", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_ias_zone_srv_rx_cmd_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_srv_tx_cmd_id,
+ { "Command", "zbee_zcl_ias.zone.cmd.srv_tx.id", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_ias_zone_srv_tx_cmd_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_enroll_code,
+ { "Enroll response code", "zbee_zcl_ias.zone.enroll_code", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_ias_zone_enroll_code_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_zone_id,
+ { "Zone ID", "zbee_zcl_ias.zone.zone_id", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_state,
+ { "ZoneState", "zbee_zcl_ias.zone.state", FT_UINT16, BASE_HEX, VALS(zbee_ias_state_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_type,
+ { "ZoneType", "zbee_zcl_ias.zone.type", FT_UINT16, BASE_HEX, VALS(zbee_ias_type_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_status,
+ { "ZoneStatus", "zbee_zcl_ias.zone.status", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_delay,
+ { "Delay (in quarterseconds)", "zbee_zcl_ias.zone.delay", FT_UINT16, BASE_DEC, NULL, 0x0, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_ext_status,
+ { "Extended Status", "zbee_zcl_ias.zone.ext_status", FT_UINT8, BASE_HEX, NULL, 0x0, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_status_alarm1,
+ { "Alarm 1", "zbee_zcl_ias.zone.status.alarm_1", FT_BOOLEAN, 16, TFS(&tfs_alarmed_or_not), ZBEE_IAS_ZONE_STATUS_ALARM1, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_status_alarm2,
+ { "Alarm 2", "zbee_zcl_ias.zone.status.alarm_2", FT_BOOLEAN, 16, TFS(&tfs_alarmed_or_not), ZBEE_IAS_ZONE_STATUS_ALARM2, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_status_battery,
+ { "Battery", "zbee_zcl_ias.zone.status.battery", FT_BOOLEAN, 16, TFS(&tfs_battery), ZBEE_IAS_ZONE_STATUS_BATTERY, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_status_tamper,
+ { "Tamper", "zbee_zcl_ias.zone.status.tamper", FT_BOOLEAN, 16, TFS(&tfs_tampered_or_not), ZBEE_IAS_ZONE_STATUS_TAMPER, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_status_supervision_reports,
+ { "Supervision Reports", "zbee_zcl_ias.zone.status.supervision_reports", FT_BOOLEAN, 16,
+ TFS(&tfs_reports_or_not), ZBEE_IAS_ZONE_STATUS_SUPERVISION, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_status_restore_reports,
+ { "Restore Reports", "zbee_zcl_ias.zone.status.restore_reports", FT_BOOLEAN, 16,
+ TFS(&tfs_reports_restore), ZBEE_IAS_ZONE_STATUS_RESTORE, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_status_trouble,
+ { "Trouble", "zbee_zcl_ias.zone.status.trouble", FT_BOOLEAN, 16, TFS(&tfs_trouble_failure), ZBEE_IAS_ZONE_STATUS_TROUBLE, NULL,
+ HFILL }},
+
+ { &hf_zbee_zcl_ias_zone_status_ac_mains,
+ { "AC (mains)", "zbee_zcl_ias.zone.status.ac_mains", FT_BOOLEAN, 16, TFS(&tfs_ac_mains), ZBEE_IAS_ZONE_STATUS_AC_MAINS, NULL,
+ HFILL }}
+ };
+
+ /* ZCL IAS Zone subtrees */
+ static gint *ett[ZBEE_ZCL_IAS_ZONE_NUM_ETT];
+
+ ett[0] = &ett_zbee_zcl_ias_zone;
+ ett[1] = &ett_zbee_zcl_ias_zone_status;
+
+ /* Register the ZigBee ZCL IAS Zoben cluster protocol name and description */
+ proto_zbee_zcl_ias_zone = proto_register_protocol("ZigBee ZCL IAS Zone", "ZCL IAS Zone", ZBEE_PROTOABBREV_ZCL_IAS_ZONE);
+ proto_register_field_array(proto_zbee_zcl_ias_zone, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ /* Register the ZigBee ZCL IAS Zone dissector. */
+ new_register_dissector(ZBEE_PROTOABBREV_ZCL_IAS_ZONE, dissect_zbee_zcl_ias_zone, proto_zbee_zcl_ias_zone);
+} /*proto_register_zbee_zcl_ias_zone*/
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */
diff --git a/epan/dissectors/packet-zbee-zcl-se.c b/epan/dissectors/packet-zbee-zcl-se.c
index 6258b0004c..518b3b961e 100644
--- a/epan/dissectors/packet-zbee-zcl-se.c
+++ b/epan/dissectors/packet-zbee-zcl-se.c
@@ -1,4 +1,4 @@
-/* packet-zbee-zcl-ha.c
+/* packet-zbee-zcl-se.c
* Dissector routines for the ZigBee ZCL SE clusters like
* Messaging
* By Fabio Tarabelloni <fabio.tarabelloni@reloc.it>
@@ -28,38 +28,64 @@
#include <string.h>
#include <glib.h>
+
+#include <epan/prefs.h>
+#include <epan/expert.h>
#include <epan/packet.h>
#include <epan/to_str.h>
#include "packet-zbee.h"
#include "packet-zbee-aps.h"
#include "packet-zbee-zcl.h"
+#include "packet-zbee-security.h"
/* ########################################################################## */
-/* #### (0x0703) MESSAGING CLUSTER ########################################## */
+/* #### common to all SE clusters ########################################### */
/* ########################################################################## */
+#define ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS 0xFFFE
+#define ZBEE_ZCL_SE_ATTR_REPORT_PENDING 0x00
+#define ZBEE_ZCL_SE_ATTR_REPORT_COMPLETE 0x01
+
+static const value_string zbee_zcl_se_reporting_status_names[] = {
+ { ZBEE_ZCL_SE_ATTR_REPORT_PENDING, "Pending" },
+ { ZBEE_ZCL_SE_ATTR_REPORT_COMPLETE, "Complete" },
+ { 0, NULL }
+};
+
+#define ZBEE_ZCL_SE_ATTR_NAMES \
+ { ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS, "Attribute Reporting Status" }
+
/*************************/
-/* Defines */
+/* Global Variables */
/*************************/
-#define ZBEE_ZCL_MSG_NUM_GENERIC_ETT 2
-#define ZBEE_ZCL_MSG_NUM_ETT (ZBEE_ZCL_MSG_NUM_GENERIC_ETT)
+/* ########################################################################## */
+/* #### (0x0703) MESSAGING CLUSTER ########################################## */
+/* ########################################################################## */
-/* Attributes - None */
+/* Attributes - None (other than Attribute Reporting Status) */
+static const value_string zbee_zcl_msg_attr_names[] = {
+ ZBEE_ZCL_SE_ATTR_NAMES,
+ { 0, NULL }
+};
/* Server Commands Received */
#define ZBEE_ZCL_CMD_ID_MSG_GET_LAST_MSG 0x00 /* Get Last Message */
#define ZBEE_ZCL_CMD_ID_MSG_MSG_CONFIRM 0x01 /* Message Confirmation */
+#define ZBEE_ZCL_CMD_ID_MSG_GET_MESSAGE_CANCEL 0x02 /* Get Message Cancellation */
/* Server Commands Generated */
#define ZBEE_ZCL_CMD_ID_MSG_DISPLAY_MSG 0x00 /* Display Message */
#define ZBEE_ZCL_CMD_ID_MSG_CANCEL_MSG 0x01 /* Cancel Message */
+#define ZBEE_ZCL_CMD_ID_MSG_DISPLAY_PROTECTED_MSG 0x02 /* Display Protected Message */
+#define ZBEE_ZCL_CMD_ID_MSG_CANCEL_ALL_MSG 0x03 /* Cancel All Messages */
/* Message Control Field Bit Map */
#define ZBEE_ZCL_MSG_CTRL_TX_MASK 0x03
#define ZBEE_ZCL_MSG_CTRL_IMPORTANCE_MASK 0x0C
-#define ZBEE_ZCL_MSG_CTRL_RESERVED_MASK 0x70
+#define ZBEE_ZCL_MSG_CTRL_RESERVED_MASK 0x50
+#define ZBEE_ZCL_MSG_CTRL_ENHANCED_CONFIRM_MASK 0x20
#define ZBEE_ZCL_MSG_CTRL_CONFIRM_MASK 0x80
#define ZBEE_ZCL_MSG_CTRL_TX_NORMAL_ONLY 0x00 /* Normal Transmission Only */
@@ -71,6 +97,10 @@
#define ZBEE_ZCL_MSG_CTRL_IMPORTANCE_HIGH 0x02 /* High */
#define ZBEE_ZCL_MSG_CTRL_IMPORTANCE_CRITICAL 0x03 /* Critical */
+#define ZBEE_ZCL_MSG_EXT_CTRL_STATUS_MASK 0x01
+
+#define ZBEE_ZCL_MSG_CONFIRM_CTRL_MASK 0x01
+
#define ZBEE_ZCL_MSG_START_TIME_NOW 0x00000000 /* Now */
/*************************/
@@ -79,11 +109,15 @@
void proto_register_zbee_zcl_msg(void);
void proto_reg_handoff_zbee_zcl_msg(void);
+/* Attribute Dissector Helpers */
+static void dissect_zcl_msg_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
+
/* Command Dissector Helpers */
static void dissect_zcl_msg_display (tvbuff_t *tvb, proto_tree *tree, guint *offset);
-static void dissect_zcl_msg_cancel (tvbuff_t *tvb, proto_tree *tree, guint *offset);
+static void dissect_zcl_msg_cancel (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset);
static void dissect_zcl_msg_confirm (tvbuff_t *tvb, proto_tree *tree, guint *offset);
-static void dissect_zcl_msg_cmd_id (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint8 cmd_dir);
+static void dissect_zcl_msg_cancel_all (tvbuff_t *tvb, proto_tree *tree, guint *offset);
+static void dissect_zcl_msg_get_cancel (tvbuff_t *tvb, proto_tree *tree, guint *offset);
/* Private functions prototype */
static void decode_zcl_msg_duration (gchar *s, guint16 value);
@@ -97,26 +131,40 @@ static int proto_zbee_zcl_msg = -1;
static int hf_zbee_zcl_msg_srv_tx_cmd_id = -1;
static int hf_zbee_zcl_msg_srv_rx_cmd_id = -1;
+static int hf_zbee_zcl_msg_attr_id = -1;
+static int hf_zbee_zcl_msg_attr_reporting_status = -1;
static int hf_zbee_zcl_msg_message_id = -1;
static int hf_zbee_zcl_msg_ctrl = -1;
static int hf_zbee_zcl_msg_ctrl_tx = -1;
static int hf_zbee_zcl_msg_ctrl_importance = -1;
+static int hf_zbee_zcl_msg_ctrl_enh_confirm = -1;
static int hf_zbee_zcl_msg_ctrl_reserved = -1;
static int hf_zbee_zcl_msg_ctrl_confirm = -1;
+static int hf_zbee_zcl_msg_ext_ctrl = -1;
+static int hf_zbee_zcl_msg_ext_ctrl_status = -1;
static int hf_zbee_zcl_msg_start_time = -1;
static int hf_zbee_zcl_msg_duration = -1;
-static int hf_zbee_zcl_msg_message_length =- 1;
+static int hf_zbee_zcl_msg_message_length = - 1;
static int hf_zbee_zcl_msg_message = -1;
static int hf_zbee_zcl_msg_confirm_time = -1;
+static int hf_zbee_zcl_msg_confirm_ctrl = -1;
+static int hf_zbee_zcl_msg_confirm_response = -1;
+static int hf_zbee_zcl_msg_confirm_response_length = - 1;
+static int hf_zbee_zcl_msg_implementation_time = -1;
+static int hf_zbee_zcl_msg_earliest_time = -1;
/* Initialize the subtree pointers */
static gint ett_zbee_zcl_msg = -1;
static gint ett_zbee_zcl_msg_message_control = -1;
+static gint ett_zbee_zcl_msg_ext_message_control = -1;
+
+static expert_field ei_zbee_zcl_msg_msg_ctrl_depreciated = EI_INIT;
/* Server Commands Received */
static const value_string zbee_zcl_msg_srv_rx_cmd_names[] = {
{ ZBEE_ZCL_CMD_ID_MSG_GET_LAST_MSG, "Get Last Message" },
{ ZBEE_ZCL_CMD_ID_MSG_MSG_CONFIRM, "Message Confirmation" },
+ { ZBEE_ZCL_CMD_ID_MSG_GET_MESSAGE_CANCEL, "Get Message Cancellation" },
{ 0, NULL }
};
@@ -124,6 +172,8 @@ static const value_string zbee_zcl_msg_srv_rx_cmd_names[] = {
static const value_string zbee_zcl_msg_srv_tx_cmd_names[] = {
{ ZBEE_ZCL_CMD_ID_MSG_DISPLAY_MSG, "Display Message" },
{ ZBEE_ZCL_CMD_ID_MSG_CANCEL_MSG, "Cancel Message" },
+ { ZBEE_ZCL_CMD_ID_MSG_DISPLAY_PROTECTED_MSG, "Display Protected Message"},
+ { ZBEE_ZCL_CMD_ID_MSG_CANCEL_ALL_MSG, "Cancel All Messages" },
{ 0, NULL }
};
@@ -144,13 +194,46 @@ static const value_string zbee_zcl_msg_ctrl_importance_names[] = {
{ 0, NULL }
};
-
/*************************/
/* Function Bodies */
/*************************/
/*FUNCTION:------------------------------------------------------
* NAME
+ * dissect_zcl_msg_attr_data
+ * DESCRIPTION
+ * this function is called by ZCL foundation dissector in order to decode
+ * specific cluster attributes data.
+ * PARAMETERS
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * guint *offset - pointer to buffer offset
+ * guint16 attr_id - attribute identifier
+ * guint data_type - attribute data type
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_msg_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type)
+{
+ switch (attr_id) {
+ /* no cluster specific attributes */
+
+ /* applies to all SE clusters */
+ case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS:
+ proto_tree_add_item(tree, hf_zbee_zcl_msg_attr_reporting_status, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+ break;
+
+ default: /* Catch all */
+ dissect_zcl_attr_data(tvb, tree, offset, data_type);
+ break;
+ }
+} /*dissect_zcl_ias_zone_attr_data*/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
* dissect_zbee_zcl_msg
* DESCRIPTION
* ZigBee ZCL Messaging cluster dissector for wireshark.
@@ -203,6 +286,10 @@ dissect_zbee_zcl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void*
dissect_zcl_msg_confirm(tvb, payload_tree, &offset);
break;
+ case ZBEE_ZCL_CMD_ID_MSG_GET_MESSAGE_CANCEL:
+ dissect_zcl_msg_get_cancel(tvb, payload_tree, &offset);
+ break;
+
default:
break;
}
@@ -230,7 +317,15 @@ dissect_zbee_zcl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void*
break;
case ZBEE_ZCL_CMD_ID_MSG_CANCEL_MSG:
- dissect_zcl_msg_cancel(tvb, payload_tree, &offset);
+ dissect_zcl_msg_cancel(tvb, pinfo, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_MSG_DISPLAY_PROTECTED_MSG:
+ dissect_zcl_msg_display(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_MSG_CANCEL_ALL_MSG:
+ dissect_zcl_msg_cancel_all(tvb, payload_tree, &offset);
break;
default:
@@ -239,7 +334,7 @@ dissect_zbee_zcl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void*
}
}
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /*dissect_zbee_zcl_msg*/
/*FUNCTION:------------------------------------------------------
@@ -258,43 +353,55 @@ dissect_zbee_zcl_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void*
static void
dissect_zcl_msg_display(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
- guint msg_len;
+ guint msg_len;
guint8 *msg_data;
static const int * message_ctrl_flags[] = {
&hf_zbee_zcl_msg_ctrl_tx,
&hf_zbee_zcl_msg_ctrl_importance,
+ &hf_zbee_zcl_msg_ctrl_enh_confirm,
&hf_zbee_zcl_msg_ctrl_reserved,
&hf_zbee_zcl_msg_ctrl_confirm,
NULL
};
- /* Retrieve "Message ID" field */
+ static const int * message_ext_ctrl_flags[] = {
+ &hf_zbee_zcl_msg_ext_ctrl_status,
+ NULL
+ };
+
+ /* Message ID */
proto_tree_add_item(tree, hf_zbee_zcl_msg_message_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
- /* Retrieve "Message Control" field */
+ /* Message Control */
proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_msg_ctrl, ett_zbee_zcl_msg_message_control, message_ctrl_flags, ENC_NA);
*offset += 1;
- /* Retrieve "Start Time" field */
+ /* Start Time */
proto_tree_add_item(tree, hf_zbee_zcl_msg_start_time, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
- /* Retrieve "Duration In Minutes" field */
+ /* Duration In Minutes*/
proto_tree_add_item(tree, hf_zbee_zcl_msg_duration, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
- /* Retrieve "Message Length" field */
+ /* Message Length */
msg_len = tvb_get_guint8(tvb, *offset); /* string length */
- proto_tree_add_item(tree, hf_zbee_zcl_msg_message_length, tvb, *offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_zbee_zcl_msg_message_length, tvb, *offset, 1, ENC_NA);
*offset += 1;
- /* Retrieve "Message" field */
+ /* Message */
msg_data = tvb_get_string_enc(wmem_packet_scope(), tvb, *offset, msg_len, ENC_LITTLE_ENDIAN);
proto_tree_add_string(tree, hf_zbee_zcl_msg_message, tvb, *offset, msg_len, msg_data);
*offset += msg_len;
+ /* (Optional) Extended Message Control */
+ if (tvb_reported_length_remaining(tvb, *offset) > 0) {
+ proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_msg_ext_ctrl, ett_zbee_zcl_msg_ext_message_control, message_ext_ctrl_flags, ENC_NA);
+ *offset += 1;
+ }
+
} /*dissect_zcl_msg_display*/
/*FUNCTION:------------------------------------------------------
@@ -311,24 +418,78 @@ dissect_zcl_msg_display(tvbuff_t *tvb, proto_tree *tree, guint *offset)
*---------------------------------------------------------------
*/
static void
-dissect_zcl_msg_cancel(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+dissect_zcl_msg_cancel(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset)
{
- static const int * message_ctrl_flags[] = {
- &hf_zbee_zcl_msg_ctrl_tx,
- &hf_zbee_zcl_msg_ctrl_importance,
- &hf_zbee_zcl_msg_ctrl_reserved,
- &hf_zbee_zcl_msg_ctrl_confirm,
- NULL
- };
+ gint8 msg_ctrl;
- /* Retrieve "Message ID" field */
+ /* Message ID */
proto_tree_add_item(tree, hf_zbee_zcl_msg_message_id, tvb, *offset, 4, ENC_LITTLE_ENDIAN);
*offset += 4;
- /* Retrieve "Message Control" field */
- proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_msg_ctrl, ett_zbee_zcl_msg_message_control, message_ctrl_flags, ENC_NA);
+ /* Message Control */
+ msg_ctrl = tvb_get_guint8(tvb, *offset);
+ proto_tree_add_item(tree, hf_zbee_zcl_msg_ctrl, tvb, *offset, 1, ENC_NA);
*offset += 1;
-}
+
+ if (msg_ctrl != 0x00) {
+ expert_add_info(pinfo, tree, &ei_zbee_zcl_msg_msg_ctrl_depreciated);
+ }
+
+} /* dissect_zcl_msg_cancel */
+
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_msg_cancel_all
+ * DESCRIPTION
+ * Send Cancel All command
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_msg_cancel_all(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ nstime_t impl_time;
+
+ /* Retrieve "Confirmation Time" field */
+ impl_time.secs = tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
+ impl_time.nsecs = 0;
+ proto_tree_add_time(tree, hf_zbee_zcl_msg_implementation_time, tvb, *offset, 4, &impl_time);
+ *offset += 4;
+
+} /* dissect_zcl_msg_cancel_all */
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_msg_get_cancel
+ * DESCRIPTION
+ * Send Cancel All command
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_msg_get_cancel(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ nstime_t impl_time;
+
+ /* Earliest Implementation Time */
+ impl_time.secs = tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET;
+ impl_time.nsecs = 0;
+ proto_tree_add_time(tree, hf_zbee_zcl_msg_earliest_time, tvb, *offset, 4, &impl_time);
+ *offset += 4;
+
+} /* dissect_zcl_msg_get_cancel */
+
/*FUNCTION:------------------------------------------------------
* NAME
@@ -346,6 +507,8 @@ dissect_zcl_msg_cancel(tvbuff_t *tvb, proto_tree *tree, guint *offset)
static void
dissect_zcl_msg_confirm(tvbuff_t *tvb, proto_tree *tree, guint *offset)
{
+ guint msg_len;
+ guint8 *msg_data;
nstime_t confirm_time;
/* Retrieve "Message ID" field */
@@ -357,7 +520,26 @@ dissect_zcl_msg_confirm(tvbuff_t *tvb, proto_tree *tree, guint *offset)
confirm_time.nsecs = 0;
proto_tree_add_time(tree, hf_zbee_zcl_msg_confirm_time, tvb, *offset, 4, &confirm_time);
*offset += 4;
-}
+
+ /* (Optional) Confirm Control */
+ if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
+ proto_tree_add_item(tree, hf_zbee_zcl_msg_confirm_ctrl, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ /* (Optional) Response Text Length */
+ if ( tvb_reported_length_remaining(tvb, *offset) <= 0 ) return;
+ msg_len = tvb_get_guint8(tvb, *offset); /* string length */
+ proto_tree_add_item(tree, hf_zbee_zcl_msg_confirm_response_length, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ /* (Optional) Response Text, but is we have a length we expect to find the subsequent string */
+ if (msg_len > 0) {
+ msg_data = tvb_get_string_enc(wmem_packet_scope(), tvb, *offset, msg_len, ENC_LITTLE_ENDIAN);
+ proto_tree_add_string(tree, hf_zbee_zcl_msg_confirm_response, tvb, *offset, msg_len, msg_data);
+ *offset += msg_len;
+ }
+
+} /* dissect_zcl_msg_confirm */
/*FUNCTION:------------------------------------------------------
* NAME
@@ -405,32 +587,6 @@ decode_zcl_msg_start_time(gchar *s, guint32 value)
/*FUNCTION:------------------------------------------------------
* NAME
- * dissect_zcl_msg_cmd_id
- * DESCRIPTION
- * this function is called by ZCL foundation dissector in order to decode
- * specific cluster command identifier.
- * PARAMETERS
- * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
- * tvbuff_t *tvb - pointer to buffer containing raw packet.
- * guint *offset - pointer to buffer offset
- * guint8 cmd_dir - command direction
- *
- * RETURNS
- * none
- *---------------------------------------------------------------
- */
-static void
-dissect_zcl_msg_cmd_id(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint8 cmd_dir)
-{
- if (cmd_dir == ZBEE_ZCL_FCF_TO_CLIENT)
- proto_tree_add_item(tree, hf_zbee_zcl_msg_srv_rx_cmd_id, tvb, *offset, 1, ENC_LITTLE_ENDIAN);
- else
- proto_tree_add_item(tree, hf_zbee_zcl_msg_srv_tx_cmd_id, tvb, *offset, 1, ENC_LITTLE_ENDIAN);
-
-} /*dissect_zcl_msg_cmd_id*/
-
-/*FUNCTION:------------------------------------------------------
- * NAME
* proto_register_zbee_zcl_msg
* DESCRIPTION
* this function registers the ZCL Messaging dissector
@@ -446,6 +602,14 @@ proto_register_zbee_zcl_msg(void)
{
static hf_register_info hf[] = {
+ { &hf_zbee_zcl_msg_attr_id,
+ { "Attribute", "zbee_zcl_se.msg.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_msg_attr_names),
+ 0x0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_msg_attr_reporting_status, /* common to all SE clusters */
+ { "Attribute Reporting Status", "zbee_zcl_se.msg.attr.attr_reporting_status",
+ FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
+
{ &hf_zbee_zcl_msg_srv_tx_cmd_id,
{ "Command", "zbee_zcl_se.msg.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_msg_srv_tx_cmd_names),
0x00, NULL, HFILL } },
@@ -471,15 +635,29 @@ proto_register_zbee_zcl_msg(void)
{ "Importance", "zbee_zcl_se.msg.message.ctrl.importance", FT_UINT8, BASE_HEX, VALS(zbee_zcl_msg_ctrl_importance_names),
ZBEE_ZCL_MSG_CTRL_IMPORTANCE_MASK, NULL, HFILL } },
+ { &hf_zbee_zcl_msg_ctrl_enh_confirm,
+ { "Confirmation", "zbee_zcl_se.msg.message.ctrl.enhconfirm", FT_BOOLEAN, 8, TFS(&tfs_required_not_required),
+ ZBEE_ZCL_MSG_CTRL_ENHANCED_CONFIRM_MASK, NULL, HFILL } },
+
{ &hf_zbee_zcl_msg_ctrl_reserved,
{ "Reserved", "zbee_zcl_se.msg.message.ctrl.reserved", FT_UINT8, BASE_HEX, NULL,
ZBEE_ZCL_MSG_CTRL_RESERVED_MASK, NULL, HFILL } },
{ &hf_zbee_zcl_msg_ctrl_confirm,
- { "Confirmation", "zbee_zcl_se.msg.message.ctrl.confirm", FT_BOOLEAN, 8, TFS(&tfs_requested_not_requested),
+ { "Confirmation", "zbee_zcl_se.msg.message.ctrl.confirm", FT_BOOLEAN, 8, TFS(&tfs_required_not_required),
ZBEE_ZCL_MSG_CTRL_CONFIRM_MASK, NULL, HFILL } },
/* End of 'Message Control' fields */
+/* Start of 'Extended Message Control' fields */
+ { &hf_zbee_zcl_msg_ext_ctrl,
+ { "Extended Message Control", "zbee_zcl_se.msg.message.ext.ctrl", FT_UINT8, BASE_HEX, NULL,
+ 0x0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_msg_ext_ctrl_status,
+ { "Message Confirmation Satus", "zbee_zcl_se.msg.message.ext.ctrl.status", FT_BOOLEAN, 8, TFS(&tfs_confirmed_unconfirmed),
+ ZBEE_ZCL_MSG_EXT_CTRL_STATUS_MASK, NULL, HFILL } },
+/* End of 'Extended Message Control' fields */
+
{ &hf_zbee_zcl_msg_start_time,
{ "Start Time", "zbee_zcl_se.msg.message.start_time", FT_UINT32, BASE_CUSTOM, decode_zcl_msg_start_time,
0x00, NULL, HFILL } },
@@ -498,27 +676,55 @@ proto_register_zbee_zcl_msg(void)
{ &hf_zbee_zcl_msg_confirm_time,
{ "Confirmation Time", "zbee_zcl_se.msg.message.confirm_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL,
- 0x0, NULL, HFILL }}
+ 0x0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_msg_confirm_ctrl,
+ { "Confirmation Control", "zbee_zcl_se.msg.message.confirm.ctrl", FT_BOOLEAN, 8, TFS(&tfs_no_yes),
+ ZBEE_ZCL_MSG_CONFIRM_CTRL_MASK, NULL, HFILL } },
+
+ { &hf_zbee_zcl_msg_confirm_response_length,
+ { "Response Length", "zbee_zcl_se.msg.message.length", FT_UINT8, BASE_DEC, NULL,
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_msg_confirm_response,
+ { "Response", "zbee_zcl_se.msg.message", FT_STRING, BASE_NONE, NULL,
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_msg_implementation_time,
+ { "Implementation Time", "zbee_zcl_se.msg.impl_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_msg_earliest_time,
+ { "Earliest Implementation Time", "zbee_zcl_se.msg.earliest_impl_time", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
+ 0, NULL, HFILL } },
};
/* ZCL Messaging subtrees */
- gint *ett[ZBEE_ZCL_MSG_NUM_ETT];
+ gint *ett[] = {
+ &ett_zbee_zcl_msg,
+ &ett_zbee_zcl_msg_message_control,
+ &ett_zbee_zcl_msg_ext_message_control,
+ };
- ett[0] = &ett_zbee_zcl_msg;
- ett[1] = &ett_zbee_zcl_msg_message_control;
+ /* Expert Info */
+ expert_module_t* expert_zbee_zcl_msg;
+ static ei_register_info ei[] = {
+ { &ei_zbee_zcl_msg_msg_ctrl_depreciated, { "zbee_zcl_se.msg.msg_ctrl.depreciated", PI_PROTOCOL, PI_WARN, "Message Control depreciated in this message, should be 0x00", EXPFILL }},
+ };
/* Register the ZigBee ZCL Messaging cluster protocol name and description */
proto_zbee_zcl_msg = proto_register_protocol("ZigBee ZCL Messaging", "ZCL Messaging", ZBEE_PROTOABBREV_ZCL_MSG);
proto_register_field_array(proto_zbee_zcl_msg, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
+ expert_zbee_zcl_msg = expert_register_protocol(proto_zbee_zcl_msg);
+ expert_register_field_array(expert_zbee_zcl_msg, ei, array_length(ei));
+
/* Register the ZigBee ZCL Messaging dissector. */
new_register_dissector(ZBEE_PROTOABBREV_ZCL_MSG, dissect_zbee_zcl_msg, proto_zbee_zcl_msg);
-
} /*proto_register_zbee_zcl_msg*/
-
/*FUNCTION:------------------------------------------------------
* NAME
* proto_reg_handoff_zbee_zcl_msg
@@ -542,12 +748,1392 @@ proto_reg_handoff_zbee_zcl_msg(void)
zbee_zcl_init_cluster( proto_zbee_zcl_msg,
ett_zbee_zcl_msg,
ZBEE_ZCL_CID_MESSAGE,
- NULL,
- NULL,
- (zbee_zcl_fn_cmd_id)dissect_zcl_msg_cmd_id
+ hf_zbee_zcl_msg_attr_id,
+ hf_zbee_zcl_msg_srv_rx_cmd_id,
+ hf_zbee_zcl_msg_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_msg_attr_data
);
} /*proto_reg_handoff_zbee_zcl_msg*/
+/* ########################################################################## */
+/* #### (0x0704 TUNNELING CLUSTER ########################################### */
+/* ########################################################################## */
+
+/* Attributes */
+#define ZBEE_ZCL_ATTR_ID_TUN_CLOSE_TIMEOUT 0x0000 /* Close Tunnel Timeout */
+
+static const value_string zbee_zcl_tun_attr_names[] = {
+ { ZBEE_ZCL_ATTR_ID_TUN_CLOSE_TIMEOUT, "Close Tunnel Timeout" },
+ ZBEE_ZCL_SE_ATTR_NAMES,
+ { 0, NULL }
+};
+
+/* Server Commands Received */
+#define ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL 0x00 /* Request Tunnel */
+#define ZBEE_ZCL_CMD_ID_TUN_CLOSE_TUNNEL 0x01 /* Close Tunnel */
+#define ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA 0x02 /* Transfer Data */
+#define ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR 0x03 /* Transfer Data Error */
+#define ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA 0x04 /* Ack Transfer Data */
+#define ZBEE_ZCL_CMD_ID_TUN_READY_DATA 0x05 /* Ready Data */
+#define ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS 0x06 /* Get Supported Tunnel Protocols */
+
+/* Server Commands Generated */
+#define ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL_RSP 0x00 /* Request Tunnel Response*/
+#define ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_TX 0x01 /* Transfer Data */
+#define ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR_TX 0x02 /* Transfer Data Error */
+#define ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA_TX 0x03 /* Ack Transfer Data */
+#define ZBEE_ZCL_CMD_ID_TUN_READY_DATA_TX 0x04 /* Ready Data */
+#define ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS_RSP 0x05 /* Get Supported Tunnel Protocols */
+#define ZBEE_ZCL_CMD_ID_TUN_CLOSURE_NOTIFY 0x06 /* Tunnel Closure Notification */
+
+/*************************/
+/* Function Declarations */
+/*************************/
+void proto_register_zbee_zcl_tun(void);
+void proto_reg_handoff_zbee_zcl_tun(void);
+
+/* Attribute Dissector Helpers */
+static void dissect_zcl_tun_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
+
+/* Private functions prototype */
+
+/*************************/
+/* Global Variables */
+/*************************/
+
+/* Initialize the protocol and registered fields */
+static int proto_zbee_zcl_tun = -1;
+
+static int hf_zbee_zcl_tun_srv_tx_cmd_id = -1;
+static int hf_zbee_zcl_tun_srv_rx_cmd_id = -1;
+static int hf_zbee_zcl_tun_attr_id = -1;
+static int hf_zbee_zcl_tun_attr_reporting_status = -1;
+static int hf_zbee_zcl_tun_attr_close_timeout = -1;
+static int hf_zbee_zcl_tun_protocol_id = -1;
+static int hf_zbee_zcl_tun_manufacturer_code = -1;
+static int hf_zbee_zcl_tun_flow_control_support = -1;
+static int hf_zbee_zcl_tun_max_in_size = -1;
+static int hf_zbee_zcl_tun_tunnel_id = -1;
+static int hf_zbee_zcl_tun_num_octets_left = -1;
+static int hf_zbee_zcl_tun_protocol_offset = -1;
+static int hf_zbee_zcl_tun_protocol_list_complete = -1;
+static int hf_zbee_zcl_tun_protocol_count = -1;
+static int hf_zbee_zcl_tun_transfer_status = -1;
+static int hf_zbee_zcl_tun_transfer_data = -1;
+static int hf_zbee_zcl_tun_transfer_data_status = -1;
+
+/* Initialize the subtree pointers */
+static gint ett_zbee_zcl_tun = -1;
+
+/* Subdissector handles. */
+static dissector_handle_t ipv4_handle;
+static dissector_handle_t ipv6_handle;
+
+/* Server Commands Received */
+static const value_string zbee_zcl_tun_srv_rx_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL, "Request Tunnel" },
+ { ZBEE_ZCL_CMD_ID_TUN_CLOSE_TUNNEL, "Close Tunnel" },
+ { ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA, "Transfer Data" },
+ { ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR, "Transfer Data Error" },
+ { ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA, "Ack Transfer Data" },
+ { ZBEE_ZCL_CMD_ID_TUN_READY_DATA, "Ready Data" },
+ { ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS, "Get Supported Protocols" },
+ { 0, NULL }
+};
+
+/* Server Commands Generated */
+static const value_string zbee_zcl_tun_srv_tx_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL_RSP, "Request Tunnel Response" },
+ { ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_TX, "Transfer Data" },
+ { ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR_TX, "Transfer Data Error" },
+ { ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA_TX, "Ack Transfer Data" },
+ { ZBEE_ZCL_CMD_ID_TUN_READY_DATA_TX, "Ready Data" },
+ { ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS_RSP, "Get Supported Tunnel Protocols" },
+ { ZBEE_ZCL_CMD_ID_TUN_CLOSURE_NOTIFY, "Tunnel Closure Notification" },
+ { 0, NULL }
+};
+
+#define ZBEE_ZCL_TUN_PROTO_DLMS 0x00
+#define ZBEE_ZCL_TUN_PROTO_IEC_61107 0x01
+#define ZBEE_ZCL_TUN_PROTO_ANSI_C12 0x02
+#define ZBEE_ZCL_TUN_PROTO_M_BUS 0x03
+#define ZBEE_ZCL_TUN_PROTO_SML 0x04
+#define ZBEE_ZCL_TUN_PROTO_CLIMATE_TALK 0x05
+#define ZBEE_ZCL_TUN_PROTO_GB_HRGP 0x06
+#define ZBEE_ZCL_TUN_PROTO_IPV6 0x07
+#define ZBEE_ZCL_TUN_PROTO_IPV4 0x08
+#define ZBEE_ZCL_TUN_PROTO_NULL 0x09
+#define ZBEE_ZCL_TUN_PROTO_TEST 199
+#define ZBEE_ZCL_TUN_PROTO_MANUFACTURER 200
+#define ZBEE_ZCL_TUN_PROTO_RESERVED 0xFF
+
+static const value_string zbee_zcl_tun_protocol_names[] = {
+ { ZBEE_ZCL_TUN_PROTO_DLMS, "DLMS/COSEM (IEC 62056)" },
+ { ZBEE_ZCL_TUN_PROTO_IEC_61107, "IEC 61107" },
+ { ZBEE_ZCL_TUN_PROTO_ANSI_C12, "ANSI C12" },
+ { ZBEE_ZCL_TUN_PROTO_M_BUS, "M-BUS" },
+ { ZBEE_ZCL_TUN_PROTO_SML, "SML" },
+ { ZBEE_ZCL_TUN_PROTO_CLIMATE_TALK, "ClimateTalk" },
+ { ZBEE_ZCL_TUN_PROTO_GB_HRGP, "GB-HRGP" },
+ { ZBEE_ZCL_TUN_PROTO_IPV6, "IPv6" },
+ { ZBEE_ZCL_TUN_PROTO_IPV4, "IPv4" },
+ { ZBEE_ZCL_TUN_PROTO_NULL, "null" },
+ { ZBEE_ZCL_TUN_PROTO_TEST, "test" },
+ { ZBEE_ZCL_TUN_PROTO_MANUFACTURER, "Manufacturer Specific" },
+ { ZBEE_ZCL_TUN_PROTO_RESERVED, "Reserved" },
+ { 0, NULL }
+};
+
+#define ZBEE_ZCL_TUN_TRANS_STATUS_NO_TUNNEL 0x00
+#define ZBEE_ZCL_TUN_TRANS_STATUS_WRONG_DEV 0x01
+#define ZBEE_ZCL_TUN_TRANS_STATUS_OVERFLOW 0x02
+
+static const value_string zbee_zcl_tun_trans_data_status_names[] = {
+ { ZBEE_ZCL_TUN_TRANS_STATUS_NO_TUNNEL, "Tunnel ID Does Not Exist" },
+ { ZBEE_ZCL_TUN_TRANS_STATUS_WRONG_DEV, "Wrong Device" },
+ { ZBEE_ZCL_TUN_TRANS_STATUS_OVERFLOW, "Data Overflow" },
+ { 0, NULL }
+};
+
+#define ZBEE_ZCL_TUN_STATUS_SUCCESS 0x00
+#define ZBEE_ZCL_TUN_STATUS_BUSY 0x01
+#define ZBEE_ZCL_TUN_STATUS_NO_MORE_IDS 0x02
+#define ZBEE_ZCL_TUN_STATUS_PROTO_NOT_SUPP 0x03
+#define ZBEE_ZCL_TUN_STATUS_FLOW_CONTROL_NOT_SUPP 0x04
+
+static const value_string zbee_zcl_tun_status_names[] = {
+ { ZBEE_ZCL_TUN_STATUS_SUCCESS, "Success" },
+ { ZBEE_ZCL_TUN_STATUS_BUSY, "Busy" },
+ { ZBEE_ZCL_TUN_STATUS_NO_MORE_IDS, "No More Tunnel IDs" },
+ { ZBEE_ZCL_TUN_STATUS_PROTO_NOT_SUPP, "Protocol Not Supported" },
+ { ZBEE_ZCL_TUN_STATUS_FLOW_CONTROL_NOT_SUPP, "Flow Control Not Supported" },
+ { 0, NULL }
+};
+
+/*************************/
+/* Function Bodies */
+/*************************/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_attr_data
+ * DESCRIPTION
+ * this function is called by ZCL foundation dissector in order to decode
+ * specific cluster attributes data.
+ * PARAMETERS
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * guint *offset - pointer to buffer offset
+ * guint16 attr_id - attribute identifier
+ * guint data_type - attribute data type
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type)
+{
+ switch (attr_id) {
+ /* cluster specific attributes */
+ case ZBEE_ZCL_ATTR_ID_TUN_CLOSE_TIMEOUT:
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_attr_close_timeout, tvb, *offset, 2, ENC_NA);
+ *offset += 2;
+ break;
+
+ /* applies to all SE clusters */
+ case ZBEE_ZCL_ATTR_ID_SE_ATTR_REPORT_STATUS:
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_attr_reporting_status, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+ break;
+
+ default: /* Catch all */
+ dissect_zcl_attr_data(tvb, tree, offset, data_type);
+ break;
+ }
+} /*dissect_zcl_ias_zone_attr_data*/
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_request_tunnel
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_request_tunnel(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_id, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_manufacturer_code, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_flow_control_support, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_max_in_size, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_close_tunnel
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_close_tunnel(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_transfer_data
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_transfer_data(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ gint length;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+
+ length = tvb_reported_length_remaining(tvb, *offset);
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_transfer_data, tvb, *offset, length, ENC_NA);
+ *offset += length;
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_transfer_data_error
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_transfer_data_error(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_transfer_data_status, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_ack_transfer_data
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_ack_transfer_data(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_num_octets_left, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_ready_data
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_ready_data(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_num_octets_left, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_get_supported
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_get_supported(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_offset, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+}
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_request_tunnel_rsp
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_request_tunnel_rsp(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_transfer_status, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_max_in_size, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_get_supported_rsp
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_get_supported_rsp(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ guint16 mfg_code;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_list_complete, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_count, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ while (tvb_reported_length_remaining(tvb, *offset) > 0) {
+ mfg_code = tvb_get_letohs(tvb, *offset);
+ if (mfg_code == 0xFFFF) {
+ proto_tree_add_string(tree, hf_zbee_zcl_tun_manufacturer_code, tvb, *offset, 2, "Standard Protcol (Mfg Code 0xFFFF)");
+ }
+ else {
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_manufacturer_code, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ }
+ *offset += 2;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_protocol_id, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+ }
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_tun_closure_notify
+ * DESCRIPTION
+ * This function manages the Display Message payload
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_tun_closure_notify(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_tunnel_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zbee_zcl_tun
+ * DESCRIPTION
+ * ZigBee ZCL Messaging cluster dissector for wireshark.
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * packet_info *pinfo - pointer to packet information fields
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zbee_zcl_tun(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+{
+ proto_tree *payload_tree;
+ zbee_zcl_packet *zcl;
+ guint offset = 0;
+ guint8 cmd_id;
+ gint rem_len;
+
+ /* Reject the packet if data is NULL */
+ if (data == NULL)
+ return 0;
+ zcl = (zbee_zcl_packet *)data;
+ cmd_id = zcl->cmd_id;
+
+ /* Create a subtree for the ZCL Command frame, and add the command ID to it. */
+ if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_tun_srv_rx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
+
+ /* Check is this command has a payload, than add the payload tree */
+ rem_len = tvb_reported_length_remaining(tvb, ++offset);
+ if (rem_len > 0) {
+ payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_tun, NULL, "Payload");
+
+ /* Call the appropriate command dissector */
+ switch (cmd_id) {
+
+ case ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL:
+ dissect_zcl_tun_request_tunnel(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_CLOSE_TUNNEL:
+ dissect_zcl_tun_close_tunnel(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA:
+ dissect_zcl_tun_transfer_data(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR:
+ dissect_zcl_tun_transfer_data_error(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA:
+ dissect_zcl_tun_ack_transfer_data(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_READY_DATA:
+ dissect_zcl_tun_ready_data(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS:
+ dissect_zcl_tun_get_supported(tvb, payload_tree, &offset);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ else { /* ZBEE_ZCL_FCF_TO_CLIENT */
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_tun_srv_tx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_tun_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
+
+ /* Check is this command has a payload, than add the payload tree */
+ rem_len = tvb_reported_length_remaining(tvb, ++offset);
+ if (rem_len > 0) {
+ payload_tree = proto_tree_add_subtree(tree, tvb, offset, rem_len, ett_zbee_zcl_tun, NULL, "Payload");
+
+ /* Call the appropriate command dissector */
+ switch (cmd_id) {
+
+ case ZBEE_ZCL_CMD_ID_TUN_REQUEST_TUNNEL_RSP:
+ dissect_zcl_tun_request_tunnel_rsp(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_TX:
+ dissect_zcl_tun_transfer_data(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_TRANSFER_DATA_ERROR_TX:
+ dissect_zcl_tun_transfer_data_error(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_ACK_TRANSFER_DATA_TX:
+ dissect_zcl_tun_ack_transfer_data(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_READY_DATA_TX:
+ dissect_zcl_tun_ready_data(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_GET_SUPPORTED_PROTOCOLS_RSP:
+ dissect_zcl_tun_get_supported_rsp(tvb, payload_tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_TUN_CLOSURE_NOTIFY:
+ dissect_zcl_tun_closure_notify(tvb, payload_tree, &offset);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ return tvb_captured_length(tvb);
+} /*dissect_zbee_zcl_tun*/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_register_zbee_zcl_tun
+ * DESCRIPTION
+ * this function registers the ZCL Messaging dissector
+ * and all its information.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+void
+proto_register_zbee_zcl_tun(void)
+{
+ static hf_register_info hf[] = {
+
+ { &hf_zbee_zcl_tun_attr_id,
+ { "Attribute", "zbee_zcl_se.tun.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_tun_attr_names),
+ 0x0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_attr_reporting_status, /* common to all SE clusters */
+ { "Attribute Reporting Status", "zbee_zcl_se.tun.attr.attr_reporting_status",
+ FT_UINT8, BASE_HEX, VALS(zbee_zcl_se_reporting_status_names), 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_attr_close_timeout,
+ { "Close Tunnel Timeout", "zbee_zcl_se.tun.attr.close_tunnel", FT_UINT16, BASE_DEC, NULL,
+ 0x0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_srv_tx_cmd_id,
+ { "Command", "zbee_zcl_se.tun.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_srv_tx_cmd_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_srv_rx_cmd_id,
+ { "Command", "zbee_zcl_se.tun.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_srv_rx_cmd_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_protocol_id,
+ { "Protocol ID", "zbee_zcl_se.tun.protocol_id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_protocol_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_manufacturer_code,
+ { "Manufacturer Code", "zbee_zcl_se.tun.manufacturer_code", FT_UINT16, BASE_HEX, VALS(zbee_mfr_code_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_flow_control_support,
+ { "Flow Control Supported", "zbee_zcl_se.tun.flow_control_supported", FT_BOOLEAN, 8, TFS(&tfs_true_false),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_max_in_size,
+ { "Max Incoming Transfer Size", "zbee_zcl_se.tun.max_in_transfer_size", FT_UINT16, BASE_HEX, NULL,
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_tunnel_id,
+ { "Tunnel Id", "zbee_zcl_se.tun.tunnel_id", FT_UINT16, BASE_HEX, NULL,
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_num_octets_left,
+ { "Num Octets Left", "zbee_zcl_se.tun.octets_left", FT_UINT16, BASE_HEX, NULL,
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_protocol_offset,
+ { "Protocol Offset", "zbee_zcl_se.tun.protocol_offset", FT_UINT8, BASE_HEX, NULL,
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_transfer_status,
+ { "Transfer Status", "zbee_zcl_se.tun.transfer_status", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_status_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_transfer_data,
+ { "Transfer Data", "zbee_zcl_se.tun.transfer_data", FT_BYTES, BASE_NONE, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_transfer_data_status,
+ { "Transfer Data Status", "zbee_zcl_se.tun.transfer_data_status", FT_UINT8, BASE_HEX, VALS(zbee_zcl_tun_trans_data_status_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_protocol_count,
+ { "Protocol Count", "zbee_zcl_se.tun.protocol_count", FT_UINT8, BASE_HEX, NULL,
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_tun_protocol_list_complete,
+ { "List Complete", "zbee_zcl_se.tun.protocol_list_complete", FT_BOOLEAN, 8, TFS(&tfs_true_false),
+ 0x00, NULL, HFILL } },
+
+ };
+
+ /* ZCL Messaging subtrees */
+ gint *ett[] = {
+ &ett_zbee_zcl_tun,
+ };
+
+ /* Register the ZigBee ZCL Messaging cluster protocol name and description */
+ proto_zbee_zcl_tun = proto_register_protocol("ZigBee ZCL Tunneling", "ZCL Tunneling", ZBEE_PROTOABBREV_ZCL_TUN);
+ proto_register_field_array(proto_zbee_zcl_tun, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ /* Register the ZigBee ZCL Messaging dissector. */
+ new_register_dissector(ZBEE_PROTOABBREV_ZCL_TUN, dissect_zbee_zcl_tun, proto_zbee_zcl_tun);
+
+} /* proto_register_zbee_zcl_tun */
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_reg_handoff_zbee_zcl_tun
+ * DESCRIPTION
+ * Hands off the Zcl Messaging dissector.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * void
+ *---------------------------------------------------------------
+ */
+void
+proto_reg_handoff_zbee_zcl_tun(void)
+{
+ dissector_handle_t msg_handle;
+
+ ipv4_handle = find_dissector("ipv4");
+ ipv6_handle = find_dissector("ipv6");
+
+ /* Register our dissector with the ZigBee application dissectors. */
+ msg_handle = find_dissector(ZBEE_PROTOABBREV_ZCL_TUN);
+ dissector_add_uint("zbee.zcl.cluster", ZBEE_ZCL_CID_TUNNELING, msg_handle);
+
+ zbee_zcl_init_cluster( proto_zbee_zcl_tun,
+ ett_zbee_zcl_tun,
+ ZBEE_ZCL_CID_TUNNELING,
+ hf_zbee_zcl_tun_attr_id,
+ hf_zbee_zcl_tun_srv_rx_cmd_id,
+ hf_zbee_zcl_tun_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_tun_attr_data
+ );
+} /* proto_reg_handoff_zbee_zcl_tun */
+
+/* ########################################################################## */
+/* #### (0x0800) KEY ESTABLISHMENT ########################################## */
+/* ########################################################################## */
+
+/*************************/
+/* Defines */
+/*************************/
+
+/* Initialize the subtree pointers */
+static gint ett_zbee_zcl_ke = -1;
+static gint ett_zbee_zcl_ke_cert = -1;
+static gint ett_zbee_zcl_ke_key_usage = -1;
+
+/* Attributes */
+#define ZBEE_ZCL_ATTR_ID_KE_SUITE 0x0000 /* Key Establishment Suite */
+
+/*************************/
+/* Function Declarations */
+/*************************/
+
+void proto_register_zbee_zcl_ke(void);
+void proto_reg_handoff_zbee_zcl_ke(void);
+
+/* Private functions prototype */
+
+/*************************/
+/* Global Variables */
+/*************************/
+
+/* Initialize the protocol and registered fields */
+static int proto_zbee_zcl_ke = -1;
+static int hf_zbee_zcl_ke_srv_tx_cmd_id = -1;
+static int hf_zbee_zcl_ke_srv_rx_cmd_id = -1;
+static int hf_zbee_zcl_ke_attr_id = -1;
+static int hf_zbee_zcl_ke_suite = -1;
+static int hf_zbee_zcl_ke_ephemeral_time = -1;
+static int hf_zbee_zcl_ke_confirm_time = -1;
+static int hf_zbee_zcl_ke_status = -1;
+static int hf_zbee_zcl_ke_wait_time = -1;
+static int hf_zbee_zcl_ke_cert_reconstr = -1;
+static int hf_zbee_zcl_ke_cert_subject = -1;
+static int hf_zbee_zcl_ke_cert_issuer = -1;
+static int hf_zbee_zcl_ke_cert_profile_attr = -1;
+static int hf_zbee_zcl_ke_cert_type = -1;
+static int hf_zbee_zcl_ke_cert_serialno = -1;
+static int hf_zbee_zcl_ke_cert_curve = -1;
+static int hf_zbee_zcl_ke_cert_hash = -1;
+static int hf_zbee_zcl_ke_cert_valid_from = -1;
+static int hf_zbee_zcl_ke_cert_valid_to = -1;
+static int hf_zbee_zcl_ke_cert_key_usage_agreement = -1;
+static int hf_zbee_zcl_ke_cert_key_usage_signature = -1;
+static int hf_zbee_zcl_ke_ephemeral_qeu = -1;
+static int hf_zbee_zcl_ke_ephemeral_qev = -1;
+static int hf_zbee_zcl_ke_macu = -1;
+static int hf_zbee_zcl_ke_macv = -1;
+
+/* Server Commands Received and Generates (symmetrical) */
+#define ZBEE_ZCL_CMD_ID_KE_INITIATE 0x00 /* Initiate Key Establishment */
+#define ZBEE_ZCL_CMD_ID_KE_EPHEMERAL 0x01 /* Ephemeral Data Request */
+#define ZBEE_ZCL_CMD_ID_KE_CONFIRM 0x02 /* Confirm Key Data Request */
+#define ZBEE_ZCL_CMD_ID_KE_TERMINATE 0x03 /* Terminate Key Establishment */
+
+#define ZBEE_ZCL_KE_SUITE_1 0x0001
+#define ZBEE_ZCL_KE_SUITE_2 0x0002
+
+#define ZBEE_ZCL_KE_TYPE_NO_EXT 0x00 /* no extensions were used */
+
+#define ZBEE_ZCL_KE_CURVE_SECT283K1 0x0D
+
+#define ZBEE_ZCL_KE_HASH_AES_MMO 0x08
+
+#define ZBEE_ZCL_KE_USAGE_KEY_AGREEMENT 0x08
+#define ZBEE_ZCL_KE_USAGE_DIGITAL_SIGNATURE 0x80
+
+/* Attributes */
+static const value_string zbee_zcl_ke_attr_names[] = {
+ { ZBEE_ZCL_ATTR_ID_KE_SUITE, "Supported Key Establishment Suites" },
+ { 0, NULL }
+};
+
+/* Server Commands Received and Generated */
+static const value_string zbee_zcl_ke_srv_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_KE_INITIATE, "Initiate Key Establishment" },
+ { ZBEE_ZCL_CMD_ID_KE_EPHEMERAL, "Ephemeral Data" },
+ { ZBEE_ZCL_CMD_ID_KE_CONFIRM, "Confirm Key Data" },
+ { ZBEE_ZCL_CMD_ID_KE_TERMINATE, "Terminate Key Establishment" },
+ { 0, NULL }
+};
+
+/* Suite Names */
+static const value_string zbee_zcl_ke_suite_names[] = {
+ { ZBEE_ZCL_KE_SUITE_1, "Crypto Suite 1 (CBKE K163)" },
+ { ZBEE_ZCL_KE_SUITE_2, "Crypto Suite 2 (CBKE K283)" },
+ { 0, NULL }
+};
+
+/* Crypto Suite 2 Type Names */
+static const value_string zbee_zcl_ke_type_names[] = {
+ { ZBEE_ZCL_KE_TYPE_NO_EXT, "No Extensions" },
+ { 0, NULL }
+};
+
+/* Crypto Suite 2 Curve Names */
+static const value_string zbee_zcl_ke_curve_names[] = {
+ { ZBEE_ZCL_KE_CURVE_SECT283K1, "sect283k1" },
+ { 0, NULL }
+};
+
+/* Crypto Suite 2 Hash Names */
+static const value_string zbee_zcl_ke_hash_names[] = {
+ { ZBEE_ZCL_KE_HASH_AES_MMO, "AES MMO" },
+ { 0, NULL }
+};
+
+#define ZBEE_ZCL_KE_STATUS_RESERVED 0x00
+#define ZBEE_ZCL_KE_STATUS_UNKNOWN_ISSUER 0x01
+#define ZBEE_ZCL_KE_STATUS_BAD_KEY_CONFIRM 0x02
+#define ZBEE_ZCL_KE_STATUS_BAD_MESSAGE 0x03
+#define ZBEE_ZCL_KE_STATUS_NO_RESOURCES 0x04
+#define ZBEE_ZCL_KE_STATUS_UNSUPPORTED_SUITE 0x05
+#define ZBEE_ZCL_KE_STATUS_INVALID_CERTIFICATE 0x06
+
+static const value_string zbee_zcl_ke_status_names[] = {
+ { ZBEE_ZCL_KE_STATUS_RESERVED, "Reserved" },
+ { ZBEE_ZCL_KE_STATUS_UNKNOWN_ISSUER, "Unknown Issuer"},
+ { ZBEE_ZCL_KE_STATUS_BAD_KEY_CONFIRM, "Bad Key Confirm"},
+ { ZBEE_ZCL_KE_STATUS_BAD_MESSAGE, "Bad Message"},
+ { ZBEE_ZCL_KE_STATUS_NO_RESOURCES, "No Resources"},
+ { ZBEE_ZCL_KE_STATUS_UNSUPPORTED_SUITE, "Unsupported Suite"},
+ { ZBEE_ZCL_KE_STATUS_INVALID_CERTIFICATE, "Invalid Certificate"},
+ { 0, NULL }
+};
+
+/*************************/
+/* Function Bodies */
+/*************************/
+
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ke_suite1_certificate
+ * DESCRIPTION
+ * This function dissects the Suite 1 Certificate
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_ke_suite1_certificate(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_reconstr, tvb, *offset, 22, ENC_NA);
+ *offset += 22;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_subject, tvb, *offset, 8, ENC_NA);
+ *offset += 8;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_issuer, tvb, *offset, 8, ENC_NA);
+ *offset += 8;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_profile_attr, tvb, *offset, 10, ENC_NA);
+ *offset += 10;
+
+} /*dissect_zcl_ke_suite1_certificate*/
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ke_suite2_certificate
+ * DESCRIPTION
+ * This function dissects the Suite 2 Certificate
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_ke_suite2_certificate(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ nstime_t valid_from_time;
+ nstime_t valid_to_time;
+ guint32 valid_to;
+ guint8 key_usage;
+ proto_tree *usage_tree;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_type, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_serialno, tvb, *offset, 8, ENC_NA);
+ *offset += 8;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_curve, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_hash, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_issuer, tvb, *offset, 8, ENC_NA);
+ *offset += 8;
+
+ valid_from_time.secs = tvb_get_ntoh40(tvb, *offset);
+ valid_from_time.nsecs = 0;
+ proto_tree_add_time(tree, hf_zbee_zcl_ke_cert_valid_from, tvb, *offset, 5, &valid_from_time);
+ *offset += 5;
+
+ valid_to = tvb_get_ntohl(tvb, *offset);
+ if (valid_to == 0xFFFFFFFF) {
+ proto_tree_add_time_format(tree, hf_zbee_zcl_ke_cert_valid_to, tvb, *offset, 4, &valid_to_time, "Valid To: does not expire (0xFFFFFFFF)");
+ }
+ else {
+ valid_to_time.secs = valid_from_time.secs + valid_to;
+ valid_to_time.nsecs = 0;
+ proto_tree_add_time(tree, hf_zbee_zcl_ke_cert_valid_to, tvb, *offset, 4, &valid_to_time);
+ }
+ *offset += 4;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_subject, tvb, *offset, 8, ENC_NA);
+ *offset += 8;
+
+ key_usage = tvb_get_guint8(tvb, *offset);
+ usage_tree = proto_tree_add_subtree_format(tree, tvb, *offset, 1, ett_zbee_zcl_ke_key_usage, NULL, "Key Usage (0x%02x)", key_usage);
+
+ proto_tree_add_item(usage_tree, hf_zbee_zcl_ke_cert_key_usage_agreement, tvb, *offset, 1, ENC_NA);
+ proto_tree_add_item(usage_tree, hf_zbee_zcl_ke_cert_key_usage_signature, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_cert_reconstr, tvb, *offset, 37, ENC_NA);
+ *offset += 37;
+
+} /*dissect_zcl_ke_suite2_certificate*/
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ke_initiate_req
+ * DESCRIPTION
+ * This function manages the Initiate Key Establishment message
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_ke_initiate(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ gint rem_len;
+ proto_tree *subtree;
+ guint16 suite;
+
+ suite = tvb_get_letohs(tvb, *offset);
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_suite, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_ephemeral_time, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_confirm_time, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ rem_len = tvb_reported_length_remaining(tvb, *offset);
+ subtree = proto_tree_add_subtree(tree, tvb, *offset, rem_len, ett_zbee_zcl_ke_cert, NULL, "Implicit Certificate");
+
+ switch (suite) {
+ case ZBEE_ZCL_KE_SUITE_1:
+ dissect_zcl_ke_suite1_certificate(tvb, subtree, offset);
+ break;
+
+ case ZBEE_ZCL_KE_SUITE_2:
+ dissect_zcl_ke_suite2_certificate(tvb, subtree, offset);
+ break;
+
+ default:
+ break;
+ }
+} /* dissect_zcl_ke_initiate */
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ke_ephemeral_qeu
+ * DESCRIPTION
+ * This function dissects the Ephemeral Data QEU
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zcl_ke_ephemeral_qeu(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ gint length;
+
+ /* size depends on suite but without a session we don't know that here */
+ /* so just report what we have */
+ length = tvb_reported_length_remaining(tvb, *offset);
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_ephemeral_qeu, tvb, *offset, length, ENC_NA);
+ *offset += length;
+ return tvb_captured_length(tvb);
+}
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ke_ephemeral_qev
+ * DESCRIPTION
+ * This function dissects the Ephemeral Data QEV
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zcl_ke_ephemeral_qev(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ gint length;
+
+ /* size depends on suite but without a session we don't know that here */
+ /* so just report what we have */
+ length = tvb_reported_length_remaining(tvb, *offset);
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_ephemeral_qev, tvb, *offset, length, ENC_NA);
+ *offset += length;
+ return tvb_captured_length(tvb);
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ke_confirm_macu
+ * DESCRIPTION
+ * This function dissects the Confirm MACU
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zcl_ke_confirm_macu(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_macu, tvb, *offset, ZBEE_SEC_CONST_BLOCKSIZE, ENC_NA);
+ *offset += ZBEE_SEC_CONST_BLOCKSIZE;
+ return tvb_captured_length(tvb);
+}
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ke_confirm_macv
+ * DESCRIPTION
+ * This function dissects the Confirm MACV
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zcl_ke_confirm_macv(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_macv, tvb, *offset, ZBEE_SEC_CONST_BLOCKSIZE, ENC_NA);
+ *offset += ZBEE_SEC_CONST_BLOCKSIZE;
+ return tvb_captured_length(tvb);
+}
+
+ /*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zcl_ke_terminate
+ * DESCRIPTION
+ * This function dissects the Terminate Key Establishment message
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * offset - offset
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static void
+dissect_zcl_ke_terminate(tvbuff_t *tvb, proto_tree *tree, guint *offset)
+{
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_status, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_wait_time, tvb, *offset, 1, ENC_NA);
+ *offset += 1;
+
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_suite, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
+ *offset += 2;
+}
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * dissect_zbee_zcl_ke
+ * DESCRIPTION
+ * ZigBee ZCL Key Establishment cluster dissector for wireshark.
+ * PARAMETERS
+ * tvbuff_t *tvb - pointer to buffer containing raw packet.
+ * packet_info *pinfo - pointer to packet information fields
+ * proto_tree *tree - pointer to data tree Wireshark uses to display packet.
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+static int
+dissect_zbee_zcl_ke(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+{
+ zbee_zcl_packet *zcl;
+ guint offset = 0;
+ guint8 cmd_id;
+ gint rem_len;
+
+ /* Reject the packet if data is NULL */
+ if (data == NULL)
+ return 0;
+ zcl = (zbee_zcl_packet *)data;
+ cmd_id = zcl->cmd_id;
+
+ /* Create a subtree for the ZCL Command frame, and add the command ID to it. */
+ if (zcl->direction == ZBEE_ZCL_FCF_TO_SERVER) {
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_ke_srv_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_srv_rx_cmd_id, tvb, offset, 1, cmd_id);
+
+ /* Check is this command has a payload, than add the payload tree */
+ rem_len = tvb_reported_length_remaining(tvb, offset);
+ offset += 1; /* delay from last add_item */
+ if (rem_len > 0) {
+
+ /* Call the appropriate command dissector */
+ switch (cmd_id) {
+ case ZBEE_ZCL_CMD_ID_KE_INITIATE:
+ dissect_zcl_ke_initiate(tvb, tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_KE_EPHEMERAL:
+ return dissect_zcl_ke_ephemeral_qeu(tvb, tree, &offset);
+
+ case ZBEE_ZCL_CMD_ID_KE_CONFIRM:
+ return dissect_zcl_ke_confirm_macu(tvb, tree, &offset);
+
+ case ZBEE_ZCL_CMD_ID_KE_TERMINATE:
+ dissect_zcl_ke_terminate(tvb, tree, &offset);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ else { /* ZBEE_ZCL_FCF_TO_CLIENT */
+ /* Append the command name to the info column. */
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s, Seq: %u",
+ val_to_str_const(cmd_id, zbee_zcl_ke_srv_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_ke_srv_tx_cmd_id, tvb, offset, 1, cmd_id);
+
+ /* Check is this command has a payload, than add the payload tree */
+ rem_len = tvb_reported_length_remaining(tvb, ++offset);
+ if (rem_len > 0) {
+ /* Call the appropriate command dissector */
+ switch (cmd_id) {
+ case ZBEE_ZCL_CMD_ID_KE_INITIATE:
+ dissect_zcl_ke_initiate(tvb, tree, &offset);
+ break;
+
+ case ZBEE_ZCL_CMD_ID_KE_EPHEMERAL:
+ return dissect_zcl_ke_ephemeral_qev(tvb, tree, &offset);
+
+ case ZBEE_ZCL_CMD_ID_KE_CONFIRM:
+ return dissect_zcl_ke_confirm_macv(tvb, tree, &offset);
+
+ case ZBEE_ZCL_CMD_ID_KE_TERMINATE:
+ dissect_zcl_ke_terminate(tvb, tree, &offset);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ return tvb_captured_length(tvb);
+} /*dissect_zbee_zcl_ke*/
+
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_register_zbee_zcl_ke
+ * DESCRIPTION
+ * this function registers the ZCL Messaging dissector
+ * and all its information.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * none
+ *---------------------------------------------------------------
+ */
+void
+proto_register_zbee_zcl_ke(void)
+{
+ static hf_register_info hf[] = {
+
+ { &hf_zbee_zcl_ke_attr_id,
+ { "Attribute", "zbee_zcl_se.ke.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_ke_attr_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_srv_tx_cmd_id,
+ { "Command", "zbee_zcl_se.ke.cmd.srv_tx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_srv_cmd_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_srv_rx_cmd_id,
+ { "Command", "zbee_zcl_se.ke.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_srv_cmd_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_suite,
+ { "Key Establishment Suite", "zbee_zcl_se.ke.attr.suite", FT_UINT16, BASE_HEX, VALS(zbee_zcl_ke_suite_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_ephemeral_time,
+ { "Ephemeral Data Generate Time", "zbee_zcl_se.ke.init.ephemeral.time", FT_UINT8, BASE_DEC, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_confirm_time,
+ { "Confirm Key Generate Time", "zbee_zcl_se.ke.init.confirm.time", FT_UINT8, BASE_DEC, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_status,
+ { "Status", "zbee_zcl_se.ke.terminate.status", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_status_names),
+ 0x00, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_wait_time,
+ { "Wait Time", "zbee_zcl_se.ke.terminate.wait.time", FT_UINT8, BASE_DEC, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_reconstr,
+ { "Public Key", "zbee_zcl_se.ke.cert.reconst", FT_BYTES, BASE_NONE, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_subject,
+ { "Subject", "zbee_zcl_se.ke.cert.subject", FT_BYTES, BASE_NONE, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_issuer,
+ { "Issuer", "zbee_zcl_se.ke.cert.issuer", FT_BYTES, BASE_NONE, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_profile_attr,
+ { "Profile Attribute Data", "zbee_zcl_se.ke.cert.profile", FT_BYTES, BASE_NONE, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_type,
+ { "Type", "zbee_zcl_se.ke.cert.type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_type_names),
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_serialno,
+ { "Serial No", "zbee_zcl_se.ke.cert.type", FT_UINT64, BASE_HEX, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_curve,
+ { "Curve", "zbee_zcl_se.ke.cert.curve", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_curve_names),
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_hash,
+ { "Hash", "zbee_zcl_se.ke.cert.hash", FT_UINT8, BASE_HEX, VALS(zbee_zcl_ke_hash_names),
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_valid_from,
+ { "Valid From", "zbee_zcl_se.ke.cert.valid.from", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_valid_to,
+ { "Valid To", "zbee_zcl_se.ke.cert.valid.to", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_cert_key_usage_agreement,
+ { "Key Agreement", "zbee_zcl_se.ke.cert.key.usage.agreement", FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled),
+ ZBEE_ZCL_KE_USAGE_KEY_AGREEMENT, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ke_cert_key_usage_signature,
+ { "Digital Signature", "zbee_zcl_se.ke.cert.key.usage.signature", FT_BOOLEAN, 8, TFS(&tfs_enabled_disabled),
+ ZBEE_ZCL_KE_USAGE_DIGITAL_SIGNATURE, NULL, HFILL }},
+
+ { &hf_zbee_zcl_ke_ephemeral_qeu,
+ { "Ephemeral Data (QEU)", "zbee_zcl_se.ke.qeu", FT_BYTES, BASE_NONE, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_ephemeral_qev,
+ { "Ephemeral Data (QEV)", "zbee_zcl_se.ke.qev", FT_BYTES, BASE_NONE, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_macu,
+ { "Message Authentication Code (MACU)", "zbee_zcl_se.ke.macu", FT_BYTES, BASE_NONE, NULL,
+ 0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_ke_macv,
+ { "Message Authentication Code (MACV)", "zbee_zcl_se.ke.macv", FT_BYTES, BASE_NONE, NULL,
+ 0, NULL, HFILL } },
+ };
+
+ /* subtrees */
+ gint *ett[] = {
+ &ett_zbee_zcl_ke,
+ &ett_zbee_zcl_ke_cert,
+ &ett_zbee_zcl_ke_key_usage,
+ };
+
+ /* Register the ZigBee ZCL Messaging cluster protocol name and description */
+ proto_zbee_zcl_ke = proto_register_protocol("ZigBee ZCL Key Establishment", "ZCL Key Establishment", ZBEE_PROTOABBREV_ZCL_KE);
+ proto_register_field_array(proto_zbee_zcl_ke, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ /* Register the ZigBee ZCL Messaging dissector. */
+ new_register_dissector(ZBEE_PROTOABBREV_ZCL_KE, dissect_zbee_zcl_ke, proto_zbee_zcl_ke);
+} /*proto_register_zbee_zcl_ke*/
+
+/*FUNCTION:------------------------------------------------------
+ * NAME
+ * proto_reg_handoff_zbee_zcl_ke
+ * DESCRIPTION
+ * Hands off the Zcl Key Establishment dissector.
+ * PARAMETERS
+ * none
+ * RETURNS
+ * void
+ *---------------------------------------------------------------
+ */
+void
+proto_reg_handoff_zbee_zcl_ke(void)
+{
+ dissector_handle_t ke_handle;
+
+ /* Register our dissector with the ZigBee application dissectors. */
+ ke_handle = find_dissector(ZBEE_PROTOABBREV_ZCL_KE);
+ dissector_add_uint("zbee.zcl.cluster", ZBEE_ZCL_CID_KE, ke_handle);
+
+ zbee_zcl_init_cluster( proto_zbee_zcl_ke,
+ ett_zbee_zcl_ke,
+ ZBEE_ZCL_CID_KE,
+ hf_zbee_zcl_ke_attr_id,
+ hf_zbee_zcl_ke_srv_rx_cmd_id,
+ hf_zbee_zcl_ke_srv_tx_cmd_id,
+ NULL
+ );
+} /*proto_reg_handoff_zbee_zcl_ke*/
+
/*
* Editor modelines - http://www.wireshark.org/tools/modelines.html
*
diff --git a/epan/dissectors/packet-zbee-zcl.c b/epan/dissectors/packet-zbee-zcl.c
index ac57361869..8ee1c37d55 100644
--- a/epan/dissectors/packet-zbee-zcl.c
+++ b/epan/dissectors/packet-zbee-zcl.c
@@ -123,61 +123,11 @@ static int hf_zbee_zcl_attr_set_elements_num = -1;
static int hf_zbee_zcl_attr_bag_elements_type = -1;
static int hf_zbee_zcl_attr_bag_elements_num = -1;
-static int hf_zbee_zcl_ias_zone_client_cmd_id = -1;
-static int hf_zbee_zcl_ias_zone_client_zer_erc = -1;
-static int hf_zbee_zcl_ias_zone_client_zer_zone_id = -1;
-static int hf_zbee_zcl_ias_zone_server_cmd_id = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_ac_mains = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_alarm1 = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_alarm2 = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_battery = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_delay = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_ext_status = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_restore_reports = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_supervision_reports = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_tamper = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_trouble = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_zone_id = -1;
-static int hf_zbee_zcl_ias_zone_server_scn_zone_status = -1;
-static int hf_zbee_zcl_poll_control_client_cir_fpt = -1;
-static int hf_zbee_zcl_poll_control_client_cir_sfp = -1;
-static int hf_zbee_zcl_poll_control_client_cmd_id = -1;
-static int hf_zbee_zcl_poll_control_client_slpi_nlpi = -1;
-static int hf_zbee_zcl_poll_control_client_sspi_nspi = -1;
-static int hf_zbee_zcl_poll_control_server_cmd_id = -1;
-static int hf_zbee_zcl_thermostat_client_cmd_id = -1;
-static int hf_zbee_zcl_thermostat_client_gws_days_to_return = -1;
-static int hf_zbee_zcl_thermostat_client_gws_mtr = -1;
-static int hf_zbee_zcl_thermostat_client_gws_mtr_cool = -1;
-static int hf_zbee_zcl_thermostat_client_gws_mtr_heat = -1;
-static int hf_zbee_zcl_thermostat_client_setpointrl_amount_field = -1;
-static int hf_zbee_zcl_thermostat_client_setpointrl_modes = -1;
-static int hf_zbee_zcl_thermostat_client_sws_dow = -1;
-static int hf_zbee_zcl_thermostat_client_sws_mfs = -1;
-static int hf_zbee_zcl_thermostat_client_sws_mfs_cool = -1;
-static int hf_zbee_zcl_thermostat_client_sws_mfs_heat = -1;
-static int hf_zbee_zcl_thermostat_client_sws_n_trans = -1;
-static int hf_zbee_zcl_thermostat_server_cmd_id = -1;
-static int hf_zbee_zcl_thermostat_server_gwsr_dow = -1;
-static int hf_zbee_zcl_thermostat_server_gwsr_mfs = -1;
-static int hf_zbee_zcl_thermostat_server_gwsr_mfs_cool = -1;
-static int hf_zbee_zcl_thermostat_server_gwsr_mfs_heat = -1;
-static int hf_zbee_zcl_thermostat_server_gwsr_n_trans = -1;
-
/* Subtree indices. */
static gint ett_zbee_zcl = -1;
static gint ett_zbee_zcl_fcf = -1;
static gint ett_zbee_zcl_attr[ZBEE_ZCL_NUM_ATTR_ETT];
static gint ett_zbee_zcl_array_elements[ZBEE_ZCL_NUM_ARRAY_ELEM_ETT];
-
-static gint ett_zbee_zcl_ias_zone_server_scn_zone_status = -1;
-static gint ett_zbee_zcl_thermostat_client_gws_days_to_return = -1;
-static gint ett_zbee_zcl_thermostat_client_gws_mtr = -1;
-static gint ett_zbee_zcl_thermostat_client_sws_dow_for_sequence = -1;
-static gint ett_zbee_zcl_thermostat_client_sws_mfs = -1;
-static gint ett_zbee_zcl_thermostat_server_gwsr_dow_for_sequence = -1;
-static gint ett_zbee_zcl_thermostat_server_gwsr_mfs = -1;
-
/* Dissector Handles. */
static dissector_handle_t data_handle;
@@ -230,280 +180,356 @@ static const value_string zbee_zcl_cs_cmd_names[] = {
{ 0, NULL }
};
-
-/* ZigBee Manufacturer Name Table */
-/* Per: 053298r19, December 2011 */
+/* ZigBee Manufacturer Code Table */
+/* Per: 053874r26, October 2014 */
const value_string zbee_mfr_code_names[] = {
-
- { ZBEE_MFG_CODE_SAMSUNG, ZBEE_MFG_SAMSUNG },
- { ZBEE_MFG_CODE_CIRRONET, ZBEE_MFG_CIRRONET },
- { ZBEE_MFG_CODE_CHIPCON, ZBEE_MFG_CHIPCON },
- { ZBEE_MFG_CODE_EMBER, ZBEE_MFG_EMBER },
- { ZBEE_MFG_CODE_NTS, ZBEE_MFG_NTS },
- { ZBEE_MFG_CODE_FREESCALE, ZBEE_MFG_FREESCALE },
- { ZBEE_MFG_CODE_IPCOM, ZBEE_MFG_IPCOM },
- { ZBEE_MFG_CODE_SAN_JUAN, ZBEE_MFG_SAN_JUAN },
- { ZBEE_MFG_CODE_TUV, ZBEE_MFG_TUV },
- { ZBEE_MFG_CODE_COMPXS, ZBEE_MFG_COMPXS },
- { ZBEE_MFG_CODE_BM, ZBEE_MFG_BM },
- { ZBEE_MFG_CODE_AWAREPOINT, ZBEE_MFG_AWAREPOINT },
- { ZBEE_MFG_CODE_PHILIPS, ZBEE_MFG_PHILIPS },
- { ZBEE_MFG_CODE_LUXOFT, ZBEE_MFG_LUXOFT },
- { ZBEE_MFG_CODE_KORWIN, ZBEE_MFG_KORWIN },
- { ZBEE_MFG_CODE_1_RF, ZBEE_MFG_1_RF },
- { ZBEE_MFG_CODE_STG, ZBEE_MFG_STG },
-
- { ZBEE_MFG_CODE_TELEGESIS, ZBEE_MFG_TELEGESIS },
- { ZBEE_MFG_CODE_VISIONIC, ZBEE_MFG_VISIONIC },
- { ZBEE_MFG_CODE_INSTA, ZBEE_MFG_INSTA },
- { ZBEE_MFG_CODE_ATALUM, ZBEE_MFG_ATALUM },
- { ZBEE_MFG_CODE_ATMEL, ZBEE_MFG_ATMEL },
- { ZBEE_MFG_CODE_DEVELCO, ZBEE_MFG_DEVELCO },
- { ZBEE_MFG_CODE_HONEYWELL, ZBEE_MFG_HONEYWELL },
- { 0x1017, "Unknown" }, /**/
- { ZBEE_MFG_CODE_RENESAS, ZBEE_MFG_RENESAS },
- { ZBEE_MFG_CODE_XANADU, ZBEE_MFG_XANADU },
- { ZBEE_MFG_CODE_NEC, ZBEE_MFG_NEC },
- { ZBEE_MFG_CODE_YAMATAKE, ZBEE_MFG_YAMATAKE },
- { ZBEE_MFG_CODE_TENDRIL, ZBEE_MFG_TENDRIL },
- { ZBEE_MFG_CODE_ASSA, ZBEE_MFG_ASSA },
- { ZBEE_MFG_CODE_MAXSTREAM, ZBEE_MFG_MAXSTREAM },
- { ZBEE_MFG_CODE_NEUROCOM, ZBEE_MFG_NEUROCOM },
-
- { ZBEE_MFG_CODE_III, ZBEE_MFG_III },
- { ZBEE_MFG_CODE_VANTAGE, ZBEE_MFG_VANTAGE },
- { ZBEE_MFG_CODE_ICONTROL, ZBEE_MFG_ICONTROL },
- { ZBEE_MFG_CODE_RAYMARINE, ZBEE_MFG_RAYMARINE },
- { ZBEE_MFG_CODE_LSR, ZBEE_MFG_LSR },
- { ZBEE_MFG_CODE_ONITY, ZBEE_MFG_ONITY },
- { ZBEE_MFG_CODE_MONO, ZBEE_MFG_MONO },
- { ZBEE_MFG_CODE_RFT, ZBEE_MFG_RFT },
- { ZBEE_MFG_CODE_ITRON, ZBEE_MFG_ITRON },
- { ZBEE_MFG_CODE_TRITECH, ZBEE_MFG_TRITECH },
- { ZBEE_MFG_CODE_EMBEDIT, ZBEE_MFG_EMBEDIT },
- { ZBEE_MFG_CODE_S3C, ZBEE_MFG_S3C },
- { ZBEE_MFG_CODE_SIEMENS, ZBEE_MFG_SIEMENS },
- { ZBEE_MFG_CODE_MINDTECH, ZBEE_MFG_MINDTECH },
- { ZBEE_MFG_CODE_LGE, ZBEE_MFG_LGE },
- { ZBEE_MFG_CODE_MITSUBISHI, ZBEE_MFG_MITSUBISHI },
-
- { ZBEE_MFG_CODE_JOHNSON, ZBEE_MFG_JOHNSON },
- { ZBEE_MFG_CODE_PRI, ZBEE_MFG_PRI },
- { ZBEE_MFG_CODE_KNICK, ZBEE_MFG_KNICK },
- { ZBEE_MFG_CODE_VICONICS, ZBEE_MFG_VICONICS },
- { ZBEE_MFG_CODE_FLEXIPANEL, ZBEE_MFG_FLEXIPANEL },
- { 0x1035, "Unknown" }, /**/
- { ZBEE_MFG_CODE_TRANE, ZBEE_MFG_TRANE },
- { ZBEE_MFG_CODE_JENNIC, ZBEE_MFG_JENNIC },
- { ZBEE_MFG_CODE_LIG, ZBEE_MFG_LIG },
- { ZBEE_MFG_CODE_ALERTME, ZBEE_MFG_ALERTME },
- { ZBEE_MFG_CODE_DAINTREE, ZBEE_MFG_DAINTREE },
- { ZBEE_MFG_CODE_AIJI, ZBEE_MFG_AIJI },
- { ZBEE_MFG_CODE_TEL_ITALIA, ZBEE_MFG_TEL_ITALIA },
- { ZBEE_MFG_CODE_MIKROKRETS, ZBEE_MFG_MIKROKRETS },
- { ZBEE_MFG_CODE_OKI, ZBEE_MFG_OKI },
- { ZBEE_MFG_CODE_NEWPORT, ZBEE_MFG_NEWPORT },
-
- { ZBEE_MFG_CODE_C4, ZBEE_MFG_C4 },
- { ZBEE_MFG_CODE_STM, ZBEE_MFG_STM },
- { ZBEE_MFG_CODE_ASN, ZBEE_MFG_ASN },
- { ZBEE_MFG_CODE_DCSI, ZBEE_MFG_DCSI },
- { ZBEE_MFG_CODE_FRANCE_TEL, ZBEE_MFG_FRANCE_TEL },
- { ZBEE_MFG_CODE_MUNET, ZBEE_MFG_MUNET },
- { ZBEE_MFG_CODE_AUTANI, ZBEE_MFG_AUTANI },
- { ZBEE_MFG_CODE_COL_VNET, ZBEE_MFG_COL_VNET },
- { ZBEE_MFG_CODE_AEROCOMM, ZBEE_MFG_AEROCOMM },
- { ZBEE_MFG_CODE_SI_LABS, ZBEE_MFG_SI_LABS },
- { ZBEE_MFG_CODE_INNCOM, ZBEE_MFG_INNCOM },
- { ZBEE_MFG_CODE_CANNON, ZBEE_MFG_CANNON },
- { ZBEE_MFG_CODE_SYNAPSE, ZBEE_MFG_SYNAPSE },
- { ZBEE_MFG_CODE_FPS, ZBEE_MFG_FPS },
- { ZBEE_MFG_CODE_CLS, ZBEE_MFG_CLS },
- { ZBEE_MFG_CODE_CRANE, ZBEE_MFG_CRANE },
-
- { ZBEE_MFG_CODE_MOBILARM, ZBEE_MFG_MOBILARM },
- { ZBEE_MFG_CODE_IMONITOR, ZBEE_MFG_IMONITOR },
- { ZBEE_MFG_CODE_BARTECH, ZBEE_MFG_BARTECH },
- { ZBEE_MFG_CODE_MESHNETICS, ZBEE_MFG_MESHNETICS },
- { ZBEE_MFG_CODE_LS_IND, ZBEE_MFG_LS_IND },
- { ZBEE_MFG_CODE_CASON, ZBEE_MFG_CASON },
- { ZBEE_MFG_CODE_WLESS_GLUE, ZBEE_MFG_WLESS_GLUE },
- { ZBEE_MFG_CODE_ELSTER, ZBEE_MFG_ELSTER },
- { ZBEE_MFG_CODE_SMS_TEC, ZBEE_MFG_SMS_TEC },
- { ZBEE_MFG_CODE_ONSET, ZBEE_MFG_ONSET },
- { ZBEE_MFG_CODE_RIGA, ZBEE_MFG_RIGA },
- { ZBEE_MFG_CODE_ENERGATE, ZBEE_MFG_ENERGATE },
- { ZBEE_MFG_CODE_CONMED, ZBEE_MFG_CONMED },
- { ZBEE_MFG_CODE_POWERMAND, ZBEE_MFG_POWERMAND },
- { ZBEE_MFG_CODE_SCHNEIDER, ZBEE_MFG_SCHNEIDER },
- { ZBEE_MFG_CODE_EATON, ZBEE_MFG_EATON },
-
- { ZBEE_MFG_CODE_TELULAR, ZBEE_MFG_TELULAR },
- { ZBEE_MFG_CODE_DELPHI, ZBEE_MFG_DELPHI },
- { ZBEE_MFG_CODE_EPISENSOR, ZBEE_MFG_EPISENSOR },
- { ZBEE_MFG_CODE_LANDIS_GYR, ZBEE_MFG_LANDIS_GYR },
- { ZBEE_MFG_CODE_KABA, ZBEE_MFG_KABA },
- { ZBEE_MFG_CODE_SHURE, ZBEE_MFG_SHURE },
- { ZBEE_MFG_CODE_COMVERGE, ZBEE_MFG_COMVERGE },
- { 0x1067, "Unknown" }, /**/
- { 0x1068, "Unknown" }, /**/
- { ZBEE_MFG_CODE_HIDALGO, ZBEE_MFG_HIDALGO },
- { ZBEE_MFG_CODE_AIR2APP, ZBEE_MFG_AIR2APP },
- { ZBEE_MFG_CODE_AMX, ZBEE_MFG_AMX },
- { ZBEE_MFG_CODE_EDMI, ZBEE_MFG_EDMI },
- { ZBEE_MFG_CODE_CYAN, ZBEE_MFG_CYAN },
- { ZBEE_MFG_CODE_SYS_SPA, ZBEE_MFG_SYS_SPA },
- { ZBEE_MFG_CODE_TELIT, ZBEE_MFG_TELIT },
-
- { ZBEE_MFG_CODE_KAGA, ZBEE_MFG_KAGA },
- { ZBEE_MFG_CODE_4_NOKS, ZBEE_MFG_4_NOKS },
- { 0x1072, "Unknown" }, /**/
- { 0x1073, "Unknown" }, /**/
- { ZBEE_MFG_CODE_PROFILE_SYS,ZBEE_MFG_PROFILE_SYS },
- { 0x1075, "Unknown" }, /**/
- { ZBEE_MFG_CODE_FREESTYLE, ZBEE_MFG_FREESTYLE },
- { 0x1077, "Unknown" }, /**/
- { 0x1078, "Unknown" }, /**/
- { ZBEE_MFG_CODE_REMOTE ,ZBEE_MFG_REMOTE },
- { ZBEE_MFG_CODE_WAVECOM, ZBEE_MFG_WAVECOM },
- { ZBEE_MFG_CODE_ENERGY_OPT, ZBEE_MFG_ENERGY_OPT },
- { ZBEE_MFG_CODE_GE, ZBEE_MFG_GE },
- { 0x107d, "Unknown" }, /**/
- { 0x107e, "Unknown" }, /**/
- { 0x107f, "Unknown" }, /**/
-
- { 0x1080, "Unknown" }, /**/
- { 0x1081, "Unknown" }, /**/
- { ZBEE_MFG_CODE_MESHWORKS, ZBEE_MFG_MESHWORKS },
- { ZBEE_MFG_CODE_ELLIPS, ZBEE_MFG_ELLIPS },
- { 0x1084, "Unknown" }, /**/
- { ZBEE_MFG_CODE_CEDO, ZBEE_MFG_CEDO },
- { 0x1086, "Unknown" }, /**/
- { ZBEE_MFG_CODE_DIGI, ZBEE_MFG_DIGI },
- { 0x1088, "Unknown" }, /**/
- { 0x1089, "Unknown" }, /**/
- { 0x108a, "Unknown" }, /**/
- { 0x108b, "Unknown" }, /**/
- { 0x108c, "Unknown" }, /**/
- { 0x108d, "Unknown" }, /**/
- { 0x108e, "Unknown" }, /**/
- { 0x108f, "Unknown" }, /**/
-
- { 0x1090, "Unknown" }, /**/
- { 0x1091, "Unknown" }, /**/
- { 0x1092, "Unknown" }, /**/
- { 0x1093, "Unknown" }, /**/
- { ZBEE_MFG_CODE_A_D, ZBEE_MFG_A_D },
- { 0x1095, "Unknown" }, /**/
- { ZBEE_MFG_CODE_CARRIER, ZBEE_MFG_CARRIER },
- { ZBEE_MFG_CODE_SYCHIP, ZBEE_MFG_SYCHIP },
- { 0x1098, "Unknown" }, /**/
- { ZBEE_MFG_CODE_PASSIVESYS, ZBEE_MFG_PASSIVESYS },
- { ZBEE_MFG_CODE_MMB, ZBEE_MFG_MMB },
- { ZBEE_MFG_CODE_HOME_AUTO, ZBEE_MFG_HOME_AUTO },
- { 0x109c, "Unknown" }, /**/
- { 0x109d, "Unknown" }, /**/
- { 0x109e, "Unknown" }, /**/
- { 0x109f, "Unknown" }, /**/
-
- { 0x10a0, "Unknown" }, /**/
- { 0x10a1, "Unknown" }, /**/
- { 0x10a2, "Unknown" }, /**/
- { ZBEE_MFG_CODE_SUNRISE, ZBEE_MFG_SUNRISE },
- { ZBEE_MFG_CODE_MEMTEC, ZBEE_MFG_MEMTEC },
- { 0x10a5, "Unknown" }, /**/
- { 0x10a6, "Unknown" }, /**/
- { ZBEE_MFG_CODE_BRITISH_GAS,ZBEE_MFG_BRITISH_GAS },
- { ZBEE_MFG_CODE_SENTEC, ZBEE_MFG_SENTEC },
- { ZBEE_MFG_CODE_NAVETAS, ZBEE_MFG_NAVETAS },
- { 0x10aa, "Unknown" }, /**/
- { 0x10ab, "Unknown" }, /**/
- { 0x10ac, "Unknown" }, /**/
- { 0x10ad, "Unknown" }, /**/
- { 0x10ae, "Unknown" }, /**/
- { 0x10af, "Unknown" }, /**/
-
- { 0x10b0, "Unknown" }, /**/
- { 0x10b1, "Unknown" }, /**/
- { ZBEE_MFG_CODE_ENERNOC, ZBEE_MFG_ENERNOC },
- { ZBEE_MFG_CODE_ELTAV, ZBEE_MFG_ELTAV },
- { 0x10b4, "Unknown" }, /**/
- { ZBEE_MFG_CODE_XSTREAMHD, ZBEE_MFG_XSTREAMHD },
- { 0x10b6, "Unknown" }, /**/
- { ZBEE_MFG_CODE_GREEN, ZBEE_MFG_GREEN },
- { 0x10b8, "Unknown" }, /**/
- { 0x10b9, "Unknown" }, /**/
- { 0x10ba, "Unknown" }, /**/
- { 0x10bb, "Unknown" }, /**/
- { 0x10bc, "Unknown" }, /**/
- { 0x10bd, "Unknown" }, /**/
- { 0x10be, "Unknown" }, /**/
- { ZBEE_MFG_CODE_OMRON, ZBEE_MFG_OMRON },
- { 0x10c0, "Unknown" }, /**/
- { 0x10c1, "Unknown" }, /**/
- { ZBEE_MFG_CODE_PEEL, ZBEE_MFG_PEEL },
- { 0x10c3, "Unknown" }, /**/
- { 0x10c4, "Unknown" }, /**/
- { ZBEE_MFG_CODE_NEC_TOKIN, ZBEE_MFG_NEC_TOKIN },
- { ZBEE_MFG_CODE_G4S_JUSTICE,ZBEE_MFG_G4S_JUSTICE },
- { 0x10c7, "Unknown" }, /**/
- { ZBEE_MFG_CODE_ELECTROLUX, ZBEE_MFG_ELECTROLUX },
- { 0x10c9, "Unknown" }, /**/
- { 0x10ca, "Unknown" }, /**/
- { 0x10cb, "Unknown" }, /**/
- { ZBEE_MFG_CODE_MAINSTREAM, ZBEE_MFG_MAINSTREAM },
- { ZBEE_MFG_CODE_INDESIT_C, ZBEE_MFG_INDESIT_C },
- { 0x10ce, "Unknown" }, /**/
- { 0x10cf, "Unknown" }, /**/
- { 0x10d0, "Unknown" }, /**/
- { 0x10d1, "Unknown" }, /**/
- { 0x10d2, "Unknown" }, /**/
- { 0x10d3, "Unknown" }, /**/
- { 0x10d4, "Unknown" }, /**/
- { 0x10d5, "Unknown" }, /**/
- { 0x10d6, "Unknown" }, /**/
- { 0x10d7, "Unknown" }, /**/
- { 0x10d8, "Unknown" }, /**/
- { 0x10d9, "Unknown" }, /**/
- { 0x10da, "Unknown" }, /**/
- { 0x10db, "Unknown" }, /**/
- { 0x10dc, "Unknown" }, /**/
- { ZBEE_MFG_CODE_RADIOCRAFTS,ZBEE_MFG_RADIOCRAFTS },
- { 0x10de, "Unknown" }, /**/
- { 0x10df, "Unknown" }, /**/
- { 0x10e0, "Unknown" }, /**/
- { 0x10e1, "Unknown" }, /**/
- { 0x10e2, "Unknown" }, /**/
- { ZBEE_MFG_CODE_HUAWEI_1, ZBEE_MFG_HUAWEI },
- { ZBEE_MFG_CODE_HUAWEI_2, ZBEE_MFG_HUAWEI },
- { 0x10e5, "Unknown" }, /**/
- { ZBEE_MFG_CODE_BGLOBAL, ZBEE_MFG_BGLOBAL },
- { 0x10e7, "Unknown" }, /**/
- { 0x10e8, "Unknown" }, /**/
- { 0x10e9, "Unknown" }, /**/
- { 0x10ea, "Unknown" }, /**/
- { ZBEE_MFG_CODE_ABB, ZBEE_MFG_ABB },
- { 0x10ec, "Unknown" }, /**/
- { ZBEE_MFG_CODE_GENUS, ZBEE_MFG_GENUS },
- { 0x10ee, "Unknown" }, /**/
- { 0x10ef, "Unknown" }, /**/
- { 0x10f0, "Unknown" }, /**/
- { 0x10f1, "Unknown" }, /**/
- { 0x10f2, "Unknown" }, /**/
- { 0x10f3, "Unknown" }, /**/
- { 0x10f4, "Unknown" }, /**/
- { 0x10f5, "Unknown" }, /**/
- { 0x10f6, "Unknown" }, /**/
- { 0x10f7, "Unknown" }, /**/
- { 0x10f8, "Unknown" }, /**/
- { 0x10f9, "Unknown" }, /**/
- { 0x10fa, "Unknown" }, /**/
- { 0x10fb, "Unknown" }, /**/
- { 0x10fc, "Unknown" }, /**/
- { 0x10fd, "Unknown" }, /**/
- { 0x10fe, "Unknown" }, /**/
- { 0x10ff, "Unknown" }, /**/
- { ZBEE_MFG_CODE_RELOC, ZBEE_MFG_RELOC },
+ { ZBEE_MFG_CODE_PANASONIC_RF4CE, ZBEE_MFG_PANASONIC },
+ { ZBEE_MFG_CODE_SONY_RF4CE, ZBEE_MFG_SONY },
+ { ZBEE_MFG_CODE_SAMSUNG_RF4CE, ZBEE_MFG_SAMSUNG },
+ { ZBEE_MFG_CODE_PHILIPS_RF4CE, ZBEE_MFG_PHILIPS },
+ { ZBEE_MFG_CODE_FREESCALE_RF4CE, ZBEE_MFG_FREESCALE },
+ { ZBEE_MFG_CODE_OKI_SEMI_RF4CE, ZBEE_MFG_OKI_SEMI },
+ { ZBEE_MFG_CODE_TI_RF4CE, ZBEE_MFG_TI },
+
+ { ZBEE_MFG_CODE_CIRRONET, ZBEE_MFG_CIRRONET },
+ { ZBEE_MFG_CODE_CHIPCON, ZBEE_MFG_CHIPCON },
+ { ZBEE_MFG_CODE_EMBER, ZBEE_MFG_EMBER },
+ { ZBEE_MFG_CODE_NTS, ZBEE_MFG_NTS },
+ { ZBEE_MFG_CODE_FREESCALE, ZBEE_MFG_FREESCALE },
+ { ZBEE_MFG_CODE_IPCOM, ZBEE_MFG_IPCOM },
+ { ZBEE_MFG_CODE_SAN_JUAN, ZBEE_MFG_SAN_JUAN },
+ { ZBEE_MFG_CODE_TUV, ZBEE_MFG_TUV },
+ { ZBEE_MFG_CODE_COMPXS, ZBEE_MFG_COMPXS },
+ { ZBEE_MFG_CODE_BM, ZBEE_MFG_BM },
+ { ZBEE_MFG_CODE_AWAREPOINT, ZBEE_MFG_AWAREPOINT },
+ { ZBEE_MFG_CODE_PHILIPS, ZBEE_MFG_PHILIPS },
+ { ZBEE_MFG_CODE_LUXOFT, ZBEE_MFG_LUXOFT },
+ { ZBEE_MFG_CODE_KORWIN, ZBEE_MFG_KORWIN },
+ { ZBEE_MFG_CODE_1_RF, ZBEE_MFG_1_RF },
+ { ZBEE_MFG_CODE_STG, ZBEE_MFG_STG },
+
+ { ZBEE_MFG_CODE_TELEGESIS, ZBEE_MFG_TELEGESIS },
+ { ZBEE_MFG_CODE_VISIONIC, ZBEE_MFG_VISIONIC },
+ { ZBEE_MFG_CODE_INSTA, ZBEE_MFG_INSTA },
+ { ZBEE_MFG_CODE_ATALUM, ZBEE_MFG_ATALUM },
+ { ZBEE_MFG_CODE_ATMEL, ZBEE_MFG_ATMEL },
+ { ZBEE_MFG_CODE_DEVELCO, ZBEE_MFG_DEVELCO },
+ { ZBEE_MFG_CODE_HONEYWELL2, ZBEE_MFG_HONEYWELL },
+ { ZBEE_MFG_CODE_RADIO_PULSE, ZBEE_MFG_RADIO_PULSE },
+ { ZBEE_MFG_CODE_RENESAS, ZBEE_MFG_RENESAS },
+ { ZBEE_MFG_CODE_XANADU, ZBEE_MFG_XANADU },
+ { ZBEE_MFG_CODE_NEC, ZBEE_MFG_NEC },
+ { ZBEE_MFG_CODE_YAMATAKE, ZBEE_MFG_YAMATAKE },
+ { ZBEE_MFG_CODE_TENDRIL, ZBEE_MFG_TENDRIL },
+ { ZBEE_MFG_CODE_ASSA, ZBEE_MFG_ASSA },
+ { ZBEE_MFG_CODE_MAXSTREAM, ZBEE_MFG_MAXSTREAM },
+ { ZBEE_MFG_CODE_NEUROCOM, ZBEE_MFG_NEUROCOM },
+
+ { ZBEE_MFG_CODE_III, ZBEE_MFG_III },
+ { ZBEE_MFG_CODE_VANTAGE, ZBEE_MFG_VANTAGE },
+ { ZBEE_MFG_CODE_ICONTROL, ZBEE_MFG_ICONTROL },
+ { ZBEE_MFG_CODE_RAYMARINE, ZBEE_MFG_RAYMARINE },
+ { ZBEE_MFG_CODE_LSR, ZBEE_MFG_LSR },
+ { ZBEE_MFG_CODE_ONITY, ZBEE_MFG_ONITY },
+ { ZBEE_MFG_CODE_MONO, ZBEE_MFG_MONO },
+ { ZBEE_MFG_CODE_RFT, ZBEE_MFG_RFT },
+ { ZBEE_MFG_CODE_ITRON, ZBEE_MFG_ITRON },
+ { ZBEE_MFG_CODE_TRITECH, ZBEE_MFG_TRITECH },
+ { ZBEE_MFG_CODE_EMBEDIT, ZBEE_MFG_EMBEDIT },
+ { ZBEE_MFG_CODE_S3C, ZBEE_MFG_S3C },
+ { ZBEE_MFG_CODE_SIEMENS, ZBEE_MFG_SIEMENS },
+ { ZBEE_MFG_CODE_MINDTECH, ZBEE_MFG_MINDTECH },
+ { ZBEE_MFG_CODE_LGE, ZBEE_MFG_LGE },
+ { ZBEE_MFG_CODE_MITSUBISHI, ZBEE_MFG_MITSUBISHI },
+
+ { ZBEE_MFG_CODE_JOHNSON, ZBEE_MFG_JOHNSON },
+ { ZBEE_MFG_CODE_PRI, ZBEE_MFG_PRI },
+ { ZBEE_MFG_CODE_KNICK, ZBEE_MFG_KNICK },
+ { ZBEE_MFG_CODE_VICONICS, ZBEE_MFG_VICONICS },
+ { ZBEE_MFG_CODE_FLEXIPANEL, ZBEE_MFG_FLEXIPANEL },
+ { ZBEE_MFG_CODE_PIASIM, ZBEE_MFG_PIASIM },
+ { ZBEE_MFG_CODE_TRANE, ZBEE_MFG_TRANE },
+ { ZBEE_MFG_CODE_JENNIC, ZBEE_MFG_JENNIC },
+ { ZBEE_MFG_CODE_LIG, ZBEE_MFG_LIG },
+ { ZBEE_MFG_CODE_ALERTME, ZBEE_MFG_ALERTME },
+ { ZBEE_MFG_CODE_DAINTREE, ZBEE_MFG_DAINTREE },
+ { ZBEE_MFG_CODE_AIJI, ZBEE_MFG_AIJI },
+ { ZBEE_MFG_CODE_TEL_ITALIA, ZBEE_MFG_TEL_ITALIA },
+ { ZBEE_MFG_CODE_MIKROKRETS, ZBEE_MFG_MIKROKRETS },
+ { ZBEE_MFG_CODE_OKI_SEMI, ZBEE_MFG_OKI_SEMI },
+ { ZBEE_MFG_CODE_NEWPORT, ZBEE_MFG_NEWPORT },
+ { ZBEE_MFG_CODE_C4, ZBEE_MFG_C4 },
+ { ZBEE_MFG_CODE_STM, ZBEE_MFG_STM },
+ { ZBEE_MFG_CODE_ASN, ZBEE_MFG_ASN },
+ { ZBEE_MFG_CODE_DCSI, ZBEE_MFG_DCSI },
+ { ZBEE_MFG_CODE_FRANCE_TEL, ZBEE_MFG_FRANCE_TEL },
+ { ZBEE_MFG_CODE_MUNET, ZBEE_MFG_MUNET },
+ { ZBEE_MFG_CODE_AUTANI, ZBEE_MFG_AUTANI },
+ { ZBEE_MFG_CODE_COL_VNET, ZBEE_MFG_COL_VNET },
+ { ZBEE_MFG_CODE_AEROCOMM, ZBEE_MFG_AEROCOMM },
+ { ZBEE_MFG_CODE_SI_LABS, ZBEE_MFG_SI_LABS },
+ { ZBEE_MFG_CODE_INNCOM, ZBEE_MFG_INNCOM },
+ { ZBEE_MFG_CODE_CANNON, ZBEE_MFG_CANNON },
+ { ZBEE_MFG_CODE_SYNAPSE, ZBEE_MFG_SYNAPSE },
+ { ZBEE_MFG_CODE_FPS, ZBEE_MFG_FPS },
+ { ZBEE_MFG_CODE_CLS, ZBEE_MFG_CLS },
+ { ZBEE_MFG_CODE_CRANE, ZBEE_MFG_CRANE },
+ { ZBEE_MFG_CODE_MOBILARM, ZBEE_MFG_MOBILARM },
+ { ZBEE_MFG_CODE_IMONITOR, ZBEE_MFG_IMONITOR },
+ { ZBEE_MFG_CODE_BARTECH, ZBEE_MFG_BARTECH },
+ { ZBEE_MFG_CODE_MESHNETICS, ZBEE_MFG_MESHNETICS },
+ { ZBEE_MFG_CODE_LS_IND, ZBEE_MFG_LS_IND },
+ { ZBEE_MFG_CODE_CASON, ZBEE_MFG_CASON },
+ { ZBEE_MFG_CODE_WLESS_GLUE, ZBEE_MFG_WLESS_GLUE },
+ { ZBEE_MFG_CODE_ELSTER, ZBEE_MFG_ELSTER },
+ { ZBEE_MFG_CODE_SMS_TEC, ZBEE_MFG_SMS_TEC },
+ { ZBEE_MFG_CODE_ONSET, ZBEE_MFG_ONSET },
+ { ZBEE_MFG_CODE_RIGA, ZBEE_MFG_RIGA },
+ { ZBEE_MFG_CODE_ENERGATE, ZBEE_MFG_ENERGATE },
+ { ZBEE_MFG_CODE_CONMED, ZBEE_MFG_CONMED },
+ { ZBEE_MFG_CODE_POWERMAND, ZBEE_MFG_POWERMAND },
+ { ZBEE_MFG_CODE_SCHNEIDER, ZBEE_MFG_SCHNEIDER },
+ { ZBEE_MFG_CODE_EATON, ZBEE_MFG_EATON },
+ { ZBEE_MFG_CODE_TELULAR, ZBEE_MFG_TELULAR },
+ { ZBEE_MFG_CODE_DELPHI, ZBEE_MFG_DELPHI },
+ { ZBEE_MFG_CODE_EPISENSOR, ZBEE_MFG_EPISENSOR },
+ { ZBEE_MFG_CODE_LANDIS_GYR, ZBEE_MFG_LANDIS_GYR },
+ { ZBEE_MFG_CODE_KABA, ZBEE_MFG_KABA },
+ { ZBEE_MFG_CODE_SHURE, ZBEE_MFG_SHURE },
+ { ZBEE_MFG_CODE_COMVERGE, ZBEE_MFG_COMVERGE },
+ { ZBEE_MFG_CODE_DBS_LODGING, ZBEE_MFG_DBS_LODGING },
+ { ZBEE_MFG_CODE_ENERGY_AWARE, ZBEE_MFG_ENERGY_AWARE },
+ { ZBEE_MFG_CODE_HIDALGO, ZBEE_MFG_HIDALGO },
+ { ZBEE_MFG_CODE_AIR2APP, ZBEE_MFG_AIR2APP },
+ { ZBEE_MFG_CODE_AMX, ZBEE_MFG_AMX },
+ { ZBEE_MFG_CODE_EDMI, ZBEE_MFG_EDMI },
+ { ZBEE_MFG_CODE_CYAN, ZBEE_MFG_CYAN },
+ { ZBEE_MFG_CODE_SYS_SPA, ZBEE_MFG_SYS_SPA },
+ { ZBEE_MFG_CODE_TELIT, ZBEE_MFG_TELIT },
+ { ZBEE_MFG_CODE_KAGA, ZBEE_MFG_KAGA },
+ { ZBEE_MFG_CODE_4_NOKS, ZBEE_MFG_4_NOKS },
+ { ZBEE_MFG_CODE_CERTICOM, ZBEE_MFG_CERTICOM },
+ { ZBEE_MFG_CODE_GRIDPOINT, ZBEE_MFG_GRIDPOINT },
+ { ZBEE_MFG_CODE_PROFILE_SYS, ZBEE_MFG_PROFILE_SYS },
+ { ZBEE_MFG_CODE_COMPACTA, ZBEE_MFG_COMPACTA },
+ { ZBEE_MFG_CODE_FREESTYLE, ZBEE_MFG_FREESTYLE },
+ { ZBEE_MFG_CODE_ALEKTRONA, ZBEE_MFG_ALEKTRONA },
+ { ZBEE_MFG_CODE_COMPUTIME, ZBEE_MFG_COMPUTIME },
+ { ZBEE_MFG_CODE_REMOTE_TECH, ZBEE_MFG_REMOTE_TECH },
+ { ZBEE_MFG_CODE_WAVECOM, ZBEE_MFG_WAVECOM },
+ { ZBEE_MFG_CODE_ENERGY, ZBEE_MFG_ENERGY },
+ { ZBEE_MFG_CODE_GE, ZBEE_MFG_GE },
+ { ZBEE_MFG_CODE_JETLUN, ZBEE_MFG_JETLUN },
+ { ZBEE_MFG_CODE_CIPHER, ZBEE_MFG_CIPHER },
+ { ZBEE_MFG_CODE_CORPORATE, ZBEE_MFG_CORPORATE },
+ { ZBEE_MFG_CODE_ECOBEE, ZBEE_MFG_ECOBEE },
+ { ZBEE_MFG_CODE_SMK, ZBEE_MFG_SMK },
+ { ZBEE_MFG_CODE_MESHWORKS, ZBEE_MFG_MESHWORKS },
+ { ZBEE_MFG_CODE_ELLIPS, ZBEE_MFG_ELLIPS },
+ { ZBEE_MFG_CODE_SECURE, ZBEE_MFG_SECURE },
+ { ZBEE_MFG_CODE_CEDO, ZBEE_MFG_CEDO },
+ { ZBEE_MFG_CODE_TOSHIBA, ZBEE_MFG_TOSHIBA },
+ { ZBEE_MFG_CODE_DIGI, ZBEE_MFG_DIGI },
+ { ZBEE_MFG_CODE_UBILOGIX, ZBEE_MFG_UBILOGIX },
+ { ZBEE_MFG_CODE_ECHELON, ZBEE_MFG_ECHELON },
+ { ZBEE_MFG_CODE_GREEN_ENERGY, ZBEE_MFG_GREEN_ENERGY },
+ { ZBEE_MFG_CODE_SILVER_SPRING, ZBEE_MFG_SILVER_SPRING },
+ { ZBEE_MFG_CODE_BLACK, ZBEE_MFG_BLACK },
+ { ZBEE_MFG_CODE_AZTECH_ASSOC, ZBEE_MFG_AZTECH_ASSOC },
+ { ZBEE_MFG_CODE_A_AND_D, ZBEE_MFG_A_AND_D },
+ { ZBEE_MFG_CODE_RAINFOREST, ZBEE_MFG_RAINFOREST },
+ { ZBEE_MFG_CODE_CARRIER, ZBEE_MFG_CARRIER },
+ { ZBEE_MFG_CODE_SYCHIP, ZBEE_MFG_SYCHIP },
+ { ZBEE_MFG_CODE_OPEN_PEAK, ZBEE_MFG_OPEN_PEAK },
+ { ZBEE_MFG_CODE_PASSIVE, ZBEE_MFG_PASSIVE },
+ { ZBEE_MFG_CODE_G4S_JUSTICE, ZBEE_MFG_G4S_JUSTICE },
+ { ZBEE_MFG_CODE_MMB, ZBEE_MFG_MMB },
+ { ZBEE_MFG_CODE_LEVITON, ZBEE_MFG_LEVITON },
+ { ZBEE_MFG_CODE_KOREA_ELEC, ZBEE_MFG_KOREA_ELEC },
+ { ZBEE_MFG_CODE_COMCAST1, ZBEE_MFG_COMCAST },
+ { ZBEE_MFG_CODE_NEC_ELEC, ZBEE_MFG_NEC_ELEC },
+ { ZBEE_MFG_CODE_NETVOX, ZBEE_MFG_NETVOX },
+ { ZBEE_MFG_CODE_UCONTROL, ZBEE_MFG_UCONTROL },
+ { ZBEE_MFG_CODE_EMBEDIA, ZBEE_MFG_EMBEDIA },
+ { ZBEE_MFG_CODE_SENSUS, ZBEE_MFG_SENSUS },
+ { ZBEE_MFG_CODE_SUNRISE, ZBEE_MFG_SUNRISE },
+ { ZBEE_MFG_CODE_MEMTECH, ZBEE_MFG_MEMTECH },
+ { ZBEE_MFG_CODE_FREEBOX, ZBEE_MFG_FREEBOX },
+ { ZBEE_MFG_CODE_M2_LABS, ZBEE_MFG_M2_LABS },
+ { ZBEE_MFG_CODE_BRITISH_GAS, ZBEE_MFG_BRITISH_GAS },
+ { ZBEE_MFG_CODE_SENTEC, ZBEE_MFG_SENTEC },
+ { ZBEE_MFG_CODE_NAVETAS, ZBEE_MFG_NAVETAS },
+ { ZBEE_MFG_CODE_LIGHTSPEED, ZBEE_MFG_LIGHTSPEED },
+ { ZBEE_MFG_CODE_OKI, ZBEE_MFG_OKI },
+ { ZBEE_MFG_CODE_SISTEMAS, ZBEE_MFG_SISTEMAS },
+ { ZBEE_MFG_CODE_DOMETIC, ZBEE_MFG_DOMETIC },
+ { ZBEE_MFG_CODE_APLS, ZBEE_MFG_APLS },
+ { ZBEE_MFG_CODE_ENERGY_HUB, ZBEE_MFG_ENERGY_HUB },
+ { ZBEE_MFG_CODE_KAMSTRUP, ZBEE_MFG_KAMSTRUP },
+ { ZBEE_MFG_CODE_ECHOSTAR, ZBEE_MFG_ECHOSTAR },
+ { ZBEE_MFG_CODE_ENERNOC, ZBEE_MFG_ENERNOC },
+ { ZBEE_MFG_CODE_ELTAV, ZBEE_MFG_ELTAV },
+ { ZBEE_MFG_CODE_BELKIN, ZBEE_MFG_BELKIN },
+ { ZBEE_MFG_CODE_XSTREAMHD, ZBEE_MFG_XSTREAMHD },
+ { ZBEE_MFG_CODE_SATURN_SOUTH, ZBEE_MFG_SATURN_SOUTH },
+ { ZBEE_MFG_CODE_GREENTRAP, ZBEE_MFG_GREENTRAP },
+ { ZBEE_MFG_CODE_SMARTSYNCH, ZBEE_MFG_SMARTSYNCH },
+ { ZBEE_MFG_CODE_NYCE, ZBEE_MFG_NYCE },
+ { ZBEE_MFG_CODE_ICM_CONTROLS, ZBEE_MFG_ICM_CONTROLS },
+ { ZBEE_MFG_CODE_MILLENNIUM, ZBEE_MFG_MILLENNIUM },
+ { ZBEE_MFG_CODE_MOTOROLA, ZBEE_MFG_MOTOROLA },
+ { ZBEE_MFG_CODE_EMERSON, ZBEE_MFG_EMERSON },
+ { ZBEE_MFG_CODE_RADIO_THERMOSTAT, ZBEE_MFG_RADIO_THERMOSTAT },
+ { ZBEE_MFG_CODE_OMRON, ZBEE_MFG_OMRON },
+ { ZBEE_MFG_CODE_GIINII, ZBEE_MFG_GIINII },
+ { ZBEE_MFG_CODE_FUJITSU, ZBEE_MFG_FUJITSU },
+ { ZBEE_MFG_CODE_PEEL, ZBEE_MFG_PEEL },
+ { ZBEE_MFG_CODE_ACCENT, ZBEE_MFG_ACCENT },
+ { ZBEE_MFG_CODE_BYTESNAP, ZBEE_MFG_BYTESNAP },
+ { ZBEE_MFG_CODE_NEC_TOKIN, ZBEE_MFG_NEC_TOKIN },
+ { ZBEE_MFG_CODE_G4S_JUSTICE, ZBEE_MFG_G4S_JUSTICE },
+ { ZBEE_MFG_CODE_TRILLIANT, ZBEE_MFG_TRILLIANT },
+ { ZBEE_MFG_CODE_ELECTROLUX, ZBEE_MFG_ELECTROLUX },
+ { ZBEE_MFG_CODE_ONZO, ZBEE_MFG_ONZO },
+ { ZBEE_MFG_CODE_ENTEK, ZBEE_MFG_ENTEK },
+ { ZBEE_MFG_CODE_PHILIPS2, ZBEE_MFG_PHILIPS },
+ { ZBEE_MFG_CODE_MAINSTREAM, ZBEE_MFG_MAINSTREAM },
+ { ZBEE_MFG_CODE_INDESIT, ZBEE_MFG_INDESIT },
+ { ZBEE_MFG_CODE_THINKECO, ZBEE_MFG_THINKECO },
+ { ZBEE_MFG_CODE_2D2C, ZBEE_MFG_2D2C },
+ { ZBEE_MFG_CODE_GREENPEAK, ZBEE_MFG_GREENPEAK },
+ { ZBEE_MFG_CODE_INTERCEL, ZBEE_MFG_INTERCEL },
+ { ZBEE_MFG_CODE_LG, ZBEE_MFG_LG },
+ { ZBEE_MFG_CODE_MITSUMI1, ZBEE_MFG_MITSUMI1 },
+ { ZBEE_MFG_CODE_MITSUMI2, ZBEE_MFG_MITSUMI2 },
+ { ZBEE_MFG_CODE_ZENTRUM, ZBEE_MFG_ZENTRUM },
+ { ZBEE_MFG_CODE_NEST, ZBEE_MFG_NEST },
+ { ZBEE_MFG_CODE_EXEGIN, ZBEE_MFG_EXEGIN },
+ { ZBEE_MFG_CODE_HONEYWELL1, ZBEE_MFG_HONEYWELL },
+ { ZBEE_MFG_CODE_TAKAHATA, ZBEE_MFG_TAKAHATA },
+ { ZBEE_MFG_CODE_SUMITOMO, ZBEE_MFG_SUMITOMO },
+ { ZBEE_MFG_CODE_GE_ENERGY, ZBEE_MFG_GE_ENERGY },
+ { ZBEE_MFG_CODE_GE_APPLIANCES, ZBEE_MFG_GE_APPLIANCES },
+ { ZBEE_MFG_CODE_RADIOCRAFTS, ZBEE_MFG_RADIOCRAFTS },
+ { ZBEE_MFG_CODE_CEIVA, ZBEE_MFG_CEIVA },
+ { ZBEE_MFG_CODE_TEC_CO, ZBEE_MFG_TEC_CO },
+ { ZBEE_MFG_CODE_CHAMELEON, ZBEE_MFG_CHAMELEON },
+ { ZBEE_MFG_CODE_SAMSUNG, ZBEE_MFG_SAMSUNG },
+ { ZBEE_MFG_CODE_RUWIDO, ZBEE_MFG_RUWIDO },
+ { ZBEE_MFG_CODE_HUAWEI_1, ZBEE_MFG_HUAWEI },
+ { ZBEE_MFG_CODE_HUAWEI_2, ZBEE_MFG_HUAWEI },
+ { ZBEE_MFG_CODE_GREENWAVE, ZBEE_MFG_GREENWAVE },
+ { ZBEE_MFG_CODE_BGLOBAL, ZBEE_MFG_BGLOBAL },
+ { ZBEE_MFG_CODE_MINDTECK, ZBEE_MFG_MINDTECK },
+ { ZBEE_MFG_CODE_INGERSOLL_RAND, ZBEE_MFG_INGERSOLL_RAND },
+ { ZBEE_MFG_CODE_DIUS, ZBEE_MFG_DIUS },
+ { ZBEE_MFG_CODE_EMBEDDED, ZBEE_MFG_EMBEDDED },
+ { ZBEE_MFG_CODE_ABB, ZBEE_MFG_ABB },
+ { ZBEE_MFG_CODE_SONY, ZBEE_MFG_SONY },
+ { ZBEE_MFG_CODE_GENUS, ZBEE_MFG_GENUS },
+ { ZBEE_MFG_CODE_EMBEDDED, ZBEE_MFG_EMBEDDED },
+ { ZBEE_MFG_CODE_ABB, ZBEE_MFG_ABB },
+ { ZBEE_MFG_CODE_SONY, ZBEE_MFG_SONY },
+ { ZBEE_MFG_CODE_GENUS, ZBEE_MFG_GENUS },
+ { ZBEE_MFG_CODE_UNIVERSAL1, ZBEE_MFG_UNIVERSAL },
+ { ZBEE_MFG_CODE_UNIVERSAL2, ZBEE_MFG_UNIVERSAL },
+ { ZBEE_MFG_CODE_METRUM, ZBEE_MFG_METRUM },
+ { ZBEE_MFG_CODE_CISCO, ZBEE_MFG_CISCO },
+ { ZBEE_MFG_CODE_UBISYS, ZBEE_MFG_UBISYS },
+ { ZBEE_MFG_CODE_CONSERT, ZBEE_MFG_CONSERT },
+ { ZBEE_MFG_CODE_CRESTRON, ZBEE_MFG_CRESTRON },
+ { ZBEE_MFG_CODE_ENPHASE, ZBEE_MFG_ENPHASE },
+ { ZBEE_MFG_CODE_INVENSYS, ZBEE_MFG_INVENSYS },
+ { ZBEE_MFG_CODE_MUELLER, ZBEE_MFG_MUELLER },
+ { ZBEE_MFG_CODE_AAC_TECH, ZBEE_MFG_AAC_TECH },
+ { ZBEE_MFG_CODE_U_NEXT, ZBEE_MFG_U_NEXT },
+ { ZBEE_MFG_CODE_STEELCASE, ZBEE_MFG_STEELCASE },
+ { ZBEE_MFG_CODE_TELEMATICS, ZBEE_MFG_TELEMATICS },
+ { ZBEE_MFG_CODE_SAMIL, ZBEE_MFG_SAMIL },
+ { ZBEE_MFG_CODE_PACE, ZBEE_MFG_PACE },
+ { ZBEE_MFG_CODE_OSBORNE, ZBEE_MFG_OSBORNE },
+ { ZBEE_MFG_CODE_POWERWATCH, ZBEE_MFG_POWERWATCH },
+ { ZBEE_MFG_CODE_CANDELED, ZBEE_MFG_CANDELED },
+ { ZBEE_MFG_CODE_FLEXGRID, ZBEE_MFG_FLEXGRID },
+ { ZBEE_MFG_CODE_HUMAX, ZBEE_MFG_HUMAX },
+ { ZBEE_MFG_CODE_UNIVERSAL, ZBEE_MFG_UNIVERSAL },
+ { ZBEE_MFG_CODE_ADVANCED_ENERGY, ZBEE_MFG_ADVANCED_ENERGY },
+ { ZBEE_MFG_CODE_BEGA, ZBEE_MFG_BEGA },
+ { ZBEE_MFG_CODE_BRUNEL, ZBEE_MFG_BRUNEL },
+ { ZBEE_MFG_CODE_PANASONIC, ZBEE_MFG_PANASONIC },
+ { ZBEE_MFG_CODE_ESYSTEMS, ZBEE_MFG_ESYSTEMS },
+ { ZBEE_MFG_CODE_PANAMAX, ZBEE_MFG_PANAMAX },
+ { ZBEE_MFG_CODE_PHYSICAL, ZBEE_MFG_PHYSICAL },
+ { ZBEE_MFG_CODE_EM_LITE, ZBEE_MFG_EM_LITE },
+ { ZBEE_MFG_CODE_OSRAM, ZBEE_MFG_OSRAM },
+ { ZBEE_MFG_CODE_2_SAVE, ZBEE_MFG_2_SAVE },
+ { ZBEE_MFG_CODE_PLANET, ZBEE_MFG_PLANET },
+ { ZBEE_MFG_CODE_AMBIENT, ZBEE_MFG_AMBIENT },
+ { ZBEE_MFG_CODE_PROFALUX, ZBEE_MFG_PROFALUX },
+ { ZBEE_MFG_CODE_BILLION, ZBEE_MFG_BILLION },
+ { ZBEE_MFG_CODE_EMBERTEC, ZBEE_MFG_EMBERTEC },
+ { ZBEE_MFG_CODE_IT_WATCHDOGS, ZBEE_MFG_IT_WATCHDOGS },
+ { ZBEE_MFG_CODE_RELOC, ZBEE_MFG_RELOC },
+ { ZBEE_MFG_CODE_INTEL, ZBEE_MFG_INTEL },
+ { ZBEE_MFG_CODE_TREND, ZBEE_MFG_TREND },
+ { ZBEE_MFG_CODE_MOXA, ZBEE_MFG_MOXA },
+ { ZBEE_MFG_CODE_QEES, ZBEE_MFG_QEES },
+ { ZBEE_MFG_CODE_SAYME, ZBEE_MFG_SAYME },
+ { ZBEE_MFG_CODE_PENTAIR, ZBEE_MFG_PENTAIR },
+ { ZBEE_MFG_CODE_ORBIT, ZBEE_MFG_ORBIT },
+ { ZBEE_MFG_CODE_CALIFORNIA, ZBEE_MFG_CALIFORNIA },
+ { ZBEE_MFG_CODE_COMCAST2, ZBEE_MFG_COMCAST },
+ { ZBEE_MFG_CODE_IDT, ZBEE_MFG_IDT },
+ { ZBEE_MFG_CODE_PIXELA, ZBEE_MFG_PIXELA },
+ { ZBEE_MFG_CODE_TIVO, ZBEE_MFG_TIVO },
+ { ZBEE_MFG_CODE_FIDURE, ZBEE_MFG_FIDURE },
+ { ZBEE_MFG_CODE_MARVELL, ZBEE_MFG_MARVELL },
+ { ZBEE_MFG_CODE_WASION, ZBEE_MFG_WASION },
+ { ZBEE_MFG_CODE_JASCO, ZBEE_MFG_JASCO },
+ { ZBEE_MFG_CODE_SHENZHEN, ZBEE_MFG_SHENZHEN },
+ { ZBEE_MFG_CODE_NETCOMM, ZBEE_MFG_NETCOMM },
+ { ZBEE_MFG_CODE_DEFINE, ZBEE_MFG_DEFINE },
+ { ZBEE_MFG_CODE_IN_HOME_DISP, ZBEE_MFG_IN_HOME_DISP },
+ { ZBEE_MFG_CODE_MIELE, ZBEE_MFG_MIELE },
+ { ZBEE_MFG_CODE_TELEVES, ZBEE_MFG_TELEVES },
+ { ZBEE_MFG_CODE_LABELEC, ZBEE_MFG_LABELEC },
+ { ZBEE_MFG_CODE_CHINA_ELEC, ZBEE_MFG_CHINA_ELEC },
+ { ZBEE_MFG_CODE_VECTORFORM, ZBEE_MFG_VECTORFORM },
+ { ZBEE_MFG_CODE_BUSCH_JAEGER, ZBEE_MFG_BUSCH_JAEGER },
+ { ZBEE_MFG_CODE_REDPINE, ZBEE_MFG_REDPINE },
+ { ZBEE_MFG_CODE_BRIDGES, ZBEE_MFG_BRIDGES },
+ { ZBEE_MFG_CODE_SERCOMM, ZBEE_MFG_SERCOMM },
+ { ZBEE_MFG_CODE_WSH, ZBEE_MFG_WSH },
+ { ZBEE_MFG_CODE_BOSCH, ZBEE_MFG_BOSCH },
+ { ZBEE_MFG_CODE_EZEX, ZBEE_MFG_EZEX },
+ { ZBEE_MFG_CODE_DRESDEN, ZBEE_MFG_DRESDEN },
+ { ZBEE_MFG_CODE_MEAZON, ZBEE_MFG_MEAZON },
+ { ZBEE_MFG_CODE_CROW, ZBEE_MFG_CROW },
+ { ZBEE_MFG_CODE_HARVARD, ZBEE_MFG_HARVARD },
+ { ZBEE_MFG_CODE_ANDSON, ZBEE_MFG_ANDSON },
+ { ZBEE_MFG_CODE_ADHOCO, ZBEE_MFG_ADHOCO },
+ { ZBEE_MFG_CODE_WAXMAN, ZBEE_MFG_WAXMAN },
+ { ZBEE_MFG_CODE_OWON, ZBEE_MFG_OWON },
+ { ZBEE_MFG_CODE_HITRON, ZBEE_MFG_HITRON },
+ { ZBEE_MFG_CODE_SCEMTEC, ZBEE_MFG_SCEMTEC },
+ { ZBEE_MFG_CODE_WEBEE, ZBEE_MFG_WEBEE },
+ { ZBEE_MFG_CODE_GRID2HOME, ZBEE_MFG_GRID2HOME },
+ { ZBEE_MFG_CODE_TELINK, ZBEE_MFG_TELINK },
+ { ZBEE_MFG_CODE_JASMINE, ZBEE_MFG_JASMINE },
+ { ZBEE_MFG_CODE_BIDGELY, ZBEE_MFG_BIDGELY },
+ { ZBEE_MFG_CODE_LUTRON, ZBEE_MFG_LUTRON },
+ { ZBEE_MFG_CODE_IJENKO, ZBEE_MFG_IJENKO },
+ { ZBEE_MFG_CODE_STARFIELD, ZBEE_MFG_STARFIELD },
+ { ZBEE_MFG_CODE_TCP, ZBEE_MFG_TCP },
+ { ZBEE_MFG_CODE_ROGERS, ZBEE_MFG_ROGERS },
+ { ZBEE_MFG_CODE_CREE, ZBEE_MFG_CREE },
+ { ZBEE_MFG_CODE_ROBERT_BOSCH, ZBEE_MFG_ROBERT_BOSCH },
+ { ZBEE_MFG_CODE_IBIS, ZBEE_MFG_IBIS },
+ { ZBEE_MFG_CODE_QUIRKY, ZBEE_MFG_QUIRKY },
+ { ZBEE_MFG_CODE_EFERGY, ZBEE_MFG_EFERGY },
+ { ZBEE_MFG_CODE_SMARTLABS, ZBEE_MFG_SMARTLABS },
+ { ZBEE_MFG_CODE_EVERSPRING, ZBEE_MFG_EVERSPRING },
+ { ZBEE_MFG_CODE_SWANN, ZBEE_MFG_SWANN },
{ 0, NULL }
};
static value_string_ext zbee_mfr_code_names_ext = VALUE_STRING_EXT_INIT(zbee_mfr_code_names);
@@ -541,7 +567,6 @@ const value_string zbee_zcl_status_names[] = {
{ ZBEE_ZCL_STAT_HARDWARE_FAILURE, "Hardware Failure"},
{ ZBEE_ZCL_STAT_SOFTWARE_FAILURE, "Software Failure"},
{ ZBEE_ZCL_STAT_CALIBRATION_ERROR, "Calibration Error"},
-
{ 0, NULL }
};
static value_string_ext zbee_zcl_status_names_ext = VALUE_STRING_EXT_INIT(zbee_zcl_status_names);
@@ -728,88 +753,6 @@ static const value_string zbee_zcl_dis_names[] = {
{ 0, NULL }
};
-/* ZCL IAS Zone Client Commands */
-static const value_string zbee_zcl_ias_zone_client_cmd_names[] = {
- { ZBEE_ZCL_CSC_IAS_ZONE_C_ZER, "Zone Enroll Response" },
-
- { 0, NULL }
-};
-
-/* ZCL IAS Zone Client Enroll Response Code Commands */
-static const value_string zbee_zcl_ias_zone_client_erc[] = {
- { ZBEE_ZCL_CSC_IAS_ZONE_C_ERC_NEP, "No enroll permit" },
- { ZBEE_ZCL_CSC_IAS_ZONE_C_ERC_NS, "Not supported" },
- { ZBEE_ZCL_CSC_IAS_ZONE_C_ERC_S, "Success" },
- { ZBEE_ZCL_CSC_IAS_ZONE_C_ERC_TMZ, "Too many zones" },
-
- { 0, NULL }
-};
-
-/* ZCL IAS Zone Server Commands */
-static const value_string zbee_zcl_ias_zone_server_cmd_names[] = {
- { ZBEE_ZCL_CSC_IAS_ZONE_S_ZER, "Zone Enroll Request" },
- { ZBEE_ZCL_CSC_IAS_ZONE_S_ZSCN, "Zone Status Change Notification" },
-
- { 0, NULL }
-};
-
-/* ZCL Poll Control Client Commands */
-static const value_string zbee_zcl_poll_control_client_cmd_names[] = {
- { ZBEE_ZCL_CSC_POLL_CONTROL_C_CIR, "Check-in Response" },
- { ZBEE_ZCL_CSC_POLL_CONTROL_C_FPS, "Fast Poll Stop" },
- { ZBEE_ZCL_CSC_POLL_CONTROL_C_SLPI, "Set Long Poll Interval" },
- { ZBEE_ZCL_CSC_POLL_CONTROL_C_SSPI, "Set Short Poll Interval" },
-
- { 0, NULL }
-};
-
-/* ZCL Poll Control Server Commands */
-static const value_string zbee_zcl_poll_control_server_cmd_names[] = {
- { ZBEE_ZCL_CSC_POLL_CONTROL_S_CI, "Check-in" },
-
- { 0, NULL }
-};
-
-/* ZCL Thermostat Client Commands */
-static const value_string zbee_zcl_thermostat_client_cmd_names[] = {
- { ZBEE_ZCL_CSC_THERMOSTAT_C_CWS, "Clear Weekly Schedule" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_GWS, "Get Weekly Schedule" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SRL, "Setpoint Raise/Lower" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS, "Set Weekly Schedule" },
-
- { 0, NULL }
-};
-
-/* ZCL Thermostat Client Setpoint Raise/Lower Mode Fields */
-static const value_string zbee_zcl_thermostat_client_setpointrl_mf[] = {
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_B, "Both (adjust Heat Setpoint and Cool Setpoint)" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_C, "Cool (adjust Cool Setpoint)" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_H, "Heat (adjust Heat Setpoint)" },
-
- { 0, NULL }
-};
-
-/* ZCL Thermostat Client Weekly Schedule Day of Week for Sequence */
-static const value_string zbee_zcl_thermostat_client_ws_dow[] = {
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_AV, "Away or Vacation" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_FR, "Friday" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_MO, "Monday" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_SA, "Saturday" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_SU, "Sunday" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_TH, "Thursday" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_TU, "Tuesday" },
- { ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_DOW_WE, "Wednesday" },
-
- { 0, NULL }
-};
-
-/* ZCL Thermostat Server Commands */
-static const value_string zbee_zcl_thermostat_server_cmd_names[] = {
- { ZBEE_ZCL_CSC_THERMOSTAT_S_GWSR, "Get Weekly Schedule Response" },
-
- { 0, NULL }
-};
-
/*FUNCTION:------------------------------------------------------
* NAME
* dissect_zbee_zcl
@@ -833,7 +776,6 @@ static int dissect_zbee_zcl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
proto_tree *sub_tree = NULL;
proto_item *proto_root;
- proto_item *ti;
zbee_nwk_packet *nwk;
zbee_zcl_packet packet;
@@ -842,7 +784,6 @@ static int dissect_zbee_zcl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
guint8 fcf;
guint offset = 0;
- guint i;
/* Reject the packet if data is NULL */
if (data == NULL)
@@ -920,6 +861,7 @@ static int dissect_zbee_zcl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
/* Add command ID to the tree. */
if ( packet.frame_type == ZBEE_ZCL_FCF_PROFILE_WIDE ) {
+ /* Profile-wide commands. */
if ( tree ) {
proto_item_append_text(proto_root, ", Command: %s, Seq: %u",
val_to_str_ext_const(packet.cmd_id, &zbee_zcl_cmd_names_ext, "Unknown Command"),
@@ -934,340 +876,22 @@ static int dissect_zbee_zcl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
proto_tree_add_uint(zcl_tree, hf_zbee_zcl_cmd_id, tvb, offset, 1, packet.cmd_id);
offset += 1;
} else {
- /* Cluster-specific. */
- guint8 mode_for_sequence, number_of_transitions;
-
+ /* Cluster-specific commands. */
payload_tvb = tvb_new_subset_remaining(tvb, offset);
if (cluster_handle != NULL) {
/* Call the specific cluster dissector registered. */
call_dissector_with_data(cluster_handle, payload_tvb, pinfo, zcl_tree, &packet);
- return tvb_length(tvb);
- }
- proto_item_append_text(proto_root, ", Cluster-specific Command: 0x%02x, Seq: %u", packet.cmd_id,
- packet.tran_seqno);
- switch (cluster_id) {
- case ZBEE_ZCL_CID_IAS_ZONE:
- if (packet.direction == ZBEE_ZCL_DIR_REPORTED) {
- /* We have a client. */
- col_append_fstr(pinfo->cinfo, COL_INFO, "Client Command: %s, Seq: %u", val_to_str(packet.cmd_id,
- zbee_zcl_ias_zone_client_cmd_names, "Unknown IAS Zone Client Command"), packet.tran_seqno);
- if (zcl_tree) {
- proto_tree_add_uint(zcl_tree, hf_zbee_zcl_ias_zone_client_cmd_id, tvb, offset, 1,
- packet.cmd_id);
- offset += 1;
- switch (packet.cmd_id) {
- case ZBEE_ZCL_CSC_IAS_ZONE_C_ZER:
- /* Zone Enroll Response. */
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_ias_zone_client_zer_erc, tvb, offset, 1,
- ENC_NA);
- offset += 1;
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_ias_zone_client_zer_zone_id, tvb, offset, 1,
- ENC_NA);
- offset += 1;
- break;
- }
- }
- } else {
- /* We have a server. */
- col_append_fstr(pinfo->cinfo, COL_INFO, "Server Command: %s, Seq: %u", val_to_str(packet.cmd_id,
- zbee_zcl_ias_zone_server_cmd_names, "Unknown IAS Zone Server Command"), packet.tran_seqno);
- if (zcl_tree) {
- proto_tree_add_uint(zcl_tree, hf_zbee_zcl_ias_zone_server_cmd_id, tvb, offset, 1,
- packet.cmd_id);
- offset += 1;
- switch (packet.cmd_id) {
- case ZBEE_ZCL_CSC_IAS_ZONE_S_ZSCN:
- /* Zone Status Change Notification. */
- ti = proto_tree_add_item(zcl_tree, hf_zbee_zcl_ias_zone_server_scn_zone_status, tvb,
- offset, 2, ENC_LITTLE_ENDIAN);
- sub_tree = proto_item_add_subtree(ti, ett_zbee_zcl_ias_zone_server_scn_zone_status);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_ias_zone_server_scn_alarm1, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_ias_zone_server_scn_alarm2, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_ias_zone_server_scn_tamper, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_ias_zone_server_scn_battery, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_ias_zone_server_scn_supervision_reports, tvb,
- offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_ias_zone_server_scn_restore_reports, tvb,
- offset, 2, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_ias_zone_server_scn_trouble, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_ias_zone_server_scn_ac_mains, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- offset += 2;
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_ias_zone_server_scn_ext_status, tvb, offset,
- 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_ias_zone_server_scn_zone_id, tvb, offset, 1,
- ENC_NA);
- offset += 1;
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_ias_zone_server_scn_delay, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- offset += 2;
- break;
- }
- }
- }
- break;
- case ZBEE_ZCL_CID_POLL_CONTROL:
- if (packet.direction == ZBEE_ZCL_DIR_REPORTED) {
- /* We have a client. */
- col_append_fstr(pinfo->cinfo, COL_INFO, "Client Command: %s, Seq: %u", val_to_str(packet.cmd_id,
- zbee_zcl_poll_control_client_cmd_names, "Unknown Poll Control Client Command"),
- packet.tran_seqno);
- if (zcl_tree) {
- proto_tree_add_uint(zcl_tree, hf_zbee_zcl_poll_control_client_cmd_id, tvb, offset, 1,
- packet.cmd_id);
- offset += 1;
- switch (packet.cmd_id) {
- case ZBEE_ZCL_CSC_POLL_CONTROL_C_CIR:
- /* Check-in Response. */
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_poll_control_client_cir_sfp, tvb, offset, 1,
- ENC_NA);
- offset += 1;
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_poll_control_client_cir_fpt, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- offset += 2;
- break;
- case ZBEE_ZCL_CSC_POLL_CONTROL_C_SLPI:
- /* Set Long Poll Interval. */
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_poll_control_client_slpi_nlpi, tvb, offset, 4,
- ENC_LITTLE_ENDIAN);
- offset += 4;
- break;
- case ZBEE_ZCL_CSC_POLL_CONTROL_C_SSPI:
- /* Set Short Poll Interval. */
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_poll_control_client_sspi_nspi, tvb, offset, 2,
- ENC_LITTLE_ENDIAN);
- offset += 2;
- break;
- }
- }
- } else {
- /* We have a server. */
- col_append_fstr(pinfo->cinfo, COL_INFO, "Server Command: %s, Seq: %u", val_to_str(packet.cmd_id,
- zbee_zcl_poll_control_server_cmd_names, "Unknown Poll Control Server Command"),
- packet.tran_seqno);
- proto_tree_add_uint(zcl_tree, hf_zbee_zcl_poll_control_server_cmd_id, tvb, offset, 1,
- packet.cmd_id);
- offset += 1;
- /* switch (packet.cmd_id) {
- }
- */
- }
- break;
- case ZBEE_ZCL_CID_THERMOSTAT:
- if (packet.direction == ZBEE_ZCL_DIR_REPORTED) {
- /* We have a client. */
- col_append_fstr(pinfo->cinfo, COL_INFO, "Client Command: %s, Seq: %u", val_to_str(packet.cmd_id,
- zbee_zcl_thermostat_client_cmd_names, "Unknown Thermostat Client Command"), packet.tran_seqno);
- if (zcl_tree) {
- proto_tree_add_uint(zcl_tree, hf_zbee_zcl_thermostat_client_cmd_id, tvb, offset, 1,
- packet.cmd_id);
- offset += 1;
- switch (packet.cmd_id) {
- case ZBEE_ZCL_CSC_THERMOSTAT_C_GWS:
- /* Get Weekly Schedule. */
- ti = proto_tree_add_uint_format(zcl_tree,
- hf_zbee_zcl_thermostat_client_gws_days_to_return, tvb, offset, 1,
- tvb_get_guint8(tvb, offset), "Days To Return");
- sub_tree = proto_item_add_subtree(ti,
- ett_zbee_zcl_thermostat_client_gws_days_to_return);
- for (i = 0; i < 8; ++i) {
- if (tvb_get_guint8(tvb, offset) & (0x01 << i)) {
- proto_tree_add_uint(sub_tree, hf_zbee_zcl_thermostat_client_gws_days_to_return,
- tvb, offset, 1, tvb_get_guint8(tvb, offset) & (0x01 << i));
- }
- }
- offset += 1;
- ti = proto_tree_add_uint_format(zcl_tree, hf_zbee_zcl_thermostat_client_gws_mtr, tvb,
- offset, 1, tvb_get_guint8(tvb, offset), "Mode To Return");
- sub_tree = proto_item_add_subtree(ti, ett_zbee_zcl_thermostat_client_gws_mtr);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_thermostat_client_gws_mtr_heat, tvb, offset,
- 1, ENC_NA);
- proto_tree_add_item(sub_tree, hf_zbee_zcl_thermostat_client_gws_mtr_cool, tvb, offset,
- 1, ENC_NA);
- offset += 1;
- break;
- case ZBEE_ZCL_CSC_THERMOSTAT_C_SRL:
- /* Setpoint Raise/Lower. */
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_thermostat_client_setpointrl_modes, tvb,
- offset, 1, ENC_NA);
- offset += 1;
- proto_tree_add_item(zcl_tree, hf_zbee_zcl_thermostat_client_setpointrl_amount_field,
- tvb, offset, 1, ENC_NA);
- offset += 1;
- break;
- case ZBEE_ZCL_CSC_THERMOSTAT_C_SWS:
- {
- static const int * modes[] = {
- &hf_zbee_zcl_thermostat_client_sws_mfs_heat,
- &hf_zbee_zcl_thermostat_client_sws_mfs_cool,
- NULL
- };
-
- /* Set Weekly Schedule. */
- number_of_transitions = tvb_get_guint8(tvb, offset);
- proto_tree_add_uint(zcl_tree, hf_zbee_zcl_thermostat_client_sws_n_trans, tvb, offset, 1,
- number_of_transitions);
- offset += 1;
- ti = proto_tree_add_uint_format(zcl_tree, hf_zbee_zcl_thermostat_client_sws_dow, tvb,
- offset, 1, tvb_get_guint8(tvb, offset), "Day of Week for Sequence");
- sub_tree = proto_item_add_subtree(ti,
- ett_zbee_zcl_thermostat_client_sws_dow_for_sequence);
- for (i = 0; i < 8; ++i) {
- if (tvb_get_guint8(tvb, offset) & (0x01 << i)) {
- proto_tree_add_uint(sub_tree, hf_zbee_zcl_thermostat_client_sws_dow, tvb,
- offset, 1, tvb_get_guint8(tvb, offset) & (0x01 << i));
- }
- }
- offset += 1;
- mode_for_sequence = tvb_get_guint8(tvb, offset);
- proto_tree_add_bitmask(zcl_tree, tvb, offset, hf_zbee_zcl_thermostat_client_sws_mfs, ett_zbee_zcl_thermostat_client_sws_mfs, modes, ENC_NA);
- offset += 1;
- for (i = 1; i <= number_of_transitions; ++i) {
- switch (mode_for_sequence) {
- case ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_B:
- /* Both Cool Set Point and Heat Set Point. */
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Transition Time %d (minutes since midnight): %d", i,
- tvb_get_letohs(tvb, offset));
- offset += 2;
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Heat Set Point %d (with 0.01 C resolution): %d", i, tvb_get_letohs(tvb,
- offset));
- offset += 2;
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Cool Set Point %d (with 0.01 C resolution): %d", i, tvb_get_letohs(tvb,
- offset));
- offset += 2;
- break;
- case ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_C:
- /* Cool Set Point. */
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Transition Time %d (minutes since midnight): %d", i,
- tvb_get_letohs(tvb, offset));
- offset += 2;
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Cool Set Point %d (with 0.01 C resolution): %d", i, tvb_get_letohs(tvb,
- offset));
- offset += 2;
- break;
- case ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_H:
- /* Heat Set Point. */
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Transition Time %d (minutes since midnight): %d", i,
- tvb_get_letohs(tvb, offset));
- offset += 2;
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Heat Set Point %d (with 0.01 C resolution): %d", i, tvb_get_letohs(tvb,
- offset));
- offset += 2;
- break;
- }
- }
- }
- break;
- }
- }
- } else {
- /* We have a server. */
- col_append_fstr(pinfo->cinfo, COL_INFO, "Server Command: %s, Seq: %u", val_to_str(packet.cmd_id,
- zbee_zcl_thermostat_server_cmd_names, "Unknown Thermostat Server Command"), packet.tran_seqno);
- if (zcl_tree) {
- proto_tree_add_uint(zcl_tree, hf_zbee_zcl_thermostat_server_cmd_id, tvb, offset, 1,
- packet.cmd_id);
- offset += 1;
- switch (packet.cmd_id) {
- case ZBEE_ZCL_CSC_THERMOSTAT_S_GWSR:
- {
- static const int * modes[] = {
- &hf_zbee_zcl_thermostat_server_gwsr_mfs_heat,
- &hf_zbee_zcl_thermostat_server_gwsr_mfs_cool,
- NULL
- };
-
- /* Get Weekly Schedule Response. */
- number_of_transitions = tvb_get_guint8(tvb, offset);
- proto_tree_add_uint(zcl_tree, hf_zbee_zcl_thermostat_server_gwsr_n_trans, tvb, offset,
- 1, number_of_transitions);
- offset += 1;
- ti = proto_tree_add_uint_format(zcl_tree, hf_zbee_zcl_thermostat_server_gwsr_dow, tvb,
- offset, 1, tvb_get_guint8(tvb, offset), "Day of Week for Sequence");
- sub_tree = proto_item_add_subtree(ti,
- ett_zbee_zcl_thermostat_server_gwsr_dow_for_sequence);
- for (i = 0; i < 8; ++i) {
- if (tvb_get_guint8(tvb, offset) & (0x01 << i)) {
- proto_tree_add_uint(sub_tree, hf_zbee_zcl_thermostat_server_gwsr_dow, tvb,
- offset, 1, tvb_get_guint8(tvb, offset) & (0x01 << i));
- }
- }
- offset += 1;
- mode_for_sequence = tvb_get_guint8(tvb, offset);
- proto_tree_add_bitmask(zcl_tree, tvb, offset, hf_zbee_zcl_thermostat_server_gwsr_mfs, ett_zbee_zcl_thermostat_server_gwsr_mfs, modes, ENC_NA);
- offset += 1;
- for (i = 1; i <= number_of_transitions; ++i) {
- switch (mode_for_sequence) {
- case ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_B:
- /* Both Cool Set Point and Heat Set Point. */
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Transition Time %d (minutes since midnight): %d", i,
- tvb_get_letohs(tvb, offset));
- offset += 2;
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Heat Set Point %d (with 0.01 C resolution): %d", i, tvb_get_letohs(tvb,
- offset));
- offset += 2;
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Cool Set Point %d (with 0.01 C resolution): %d", i, tvb_get_letohs(tvb,
- offset));
- offset += 2;
- break;
- case ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_C:
- /* Cool Set Point. */
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Transition Time %d (minutes since midnight): %d", i,
- tvb_get_letohs(tvb, offset));
- offset += 2;
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Cool Set Point %d (with 0.01 C resolution): %d", i, tvb_get_letohs(tvb,
- offset));
- offset += 2;
- break;
- case ZBEE_ZCL_CSC_THERMOSTAT_C_SWS_SP_H:
- /* Heat Set Point. */
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Transition Time %d (minutes since midnight): %d", i,
- tvb_get_letohs(tvb, offset));
- offset += 2;
- proto_tree_add_text(zcl_tree, tvb, offset, 2,
- "Heat Set Point %d (with 0.01 C resolution): %d", i, tvb_get_letohs(tvb,
- offset));
- offset += 2;
- break;
- }
- }
- }
- break;
- }
- }
- }
- break;
- default:
- col_append_fstr(pinfo->cinfo, COL_INFO, "Unknown Command: 0x%02x, Seq: %u", packet.cmd_id,
- packet.tran_seqno);
- if (zcl_tree) {
- proto_tree_add_uint(zcl_tree, hf_zbee_zcl_cs_cmd_id, tvb, offset, 1, packet.cmd_id);
- offset += 1;
- }
- break;
+ return tvb_captured_length(tvb);
+ } else {
+ col_append_fstr(pinfo->cinfo, COL_INFO, "Unknown Command: 0x%02x, Seq: %u", packet.cmd_id,
+ packet.tran_seqno);
+
+ proto_tree_add_uint(zcl_tree, hf_zbee_zcl_cs_cmd_id, tvb, offset, 1, packet.cmd_id);
+ offset += 1;
}
/* Don't decode the tail. */
zcl_dump_data(tvb, offset, pinfo, zcl_tree);
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
}
if ( zcl_tree ) {
@@ -1328,7 +952,7 @@ static int dissect_zbee_zcl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
} /* switch */
}
zcl_dump_data(tvb, offset, pinfo, zcl_tree);
- return tvb_length(tvb);
+ return tvb_captured_length(tvb);
} /* dissect_zbee_zcl */
/*FUNCTION:------------------------------------------------------
@@ -1350,7 +974,7 @@ void dissect_zcl_read_attr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tr
{
guint tvb_len;
- tvb_len = tvb_length(tvb);
+ tvb_len = tvb_captured_length(tvb);
while ( *offset < tvb_len ) {
/* Dissect the attribute identifier */
dissect_zcl_attr_id(tvb, tree, offset, cluster_id);
@@ -1381,7 +1005,7 @@ void dissect_zcl_read_attr_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tre
guint i = 0;
guint16 attr_id;
- tvb_len = tvb_length(tvb);
+ tvb_len = tvb_captured_length(tvb);
while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
/* Create subtree for attribute status field */
@@ -1424,7 +1048,7 @@ void dissect_zcl_write_attr(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t
guint i = 0;
guint16 attr_id;
- tvb_len = tvb_length(tvb);
+ tvb_len = tvb_captured_length(tvb);
while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
/* Create subtree for attribute status field */
@@ -1461,7 +1085,7 @@ static void dissect_zcl_write_attr_resp(tvbuff_t *tvb, packet_info *pinfo _U_, p
guint tvb_len;
guint i = 0;
- tvb_len = tvb_length(tvb);
+ tvb_len = tvb_captured_length(tvb);
while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
/* Create subtree for attribute status field */
@@ -1503,7 +1127,7 @@ static void dissect_zcl_read_report_config_resp(tvbuff_t *tvb, packet_info *pinf
guint attr_dir;
guint16 attr_id;
- tvb_len = tvb_length(tvb);
+ tvb_len = tvb_captured_length(tvb);
while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
/* Create subtree for attribute status field */
@@ -1571,7 +1195,7 @@ static void dissect_zcl_config_report(tvbuff_t *tvb, packet_info *pinfo _U_, pro
guint data_type;
guint16 attr_id;
- tvb_len = tvb_length(tvb);
+ tvb_len = tvb_captured_length(tvb);
while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
/* Create subtree for attribute status field */
@@ -1636,7 +1260,7 @@ static void dissect_zcl_config_report_resp(tvbuff_t *tvb, packet_info *pinfo _U_
guint tvb_len;
guint i = 0;
- tvb_len = tvb_length(tvb);
+ tvb_len = tvb_captured_length(tvb);
while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
/* Create subtree for attribute status field */
@@ -1677,7 +1301,7 @@ static void dissect_zcl_read_report_config(tvbuff_t *tvb, packet_info *pinfo _U_
guint tvb_len;
guint i = 0;
- tvb_len = tvb_length(tvb);
+ tvb_len = tvb_captured_length(tvb);
while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
/* Create subtree for attribute status field */
@@ -1712,21 +1336,21 @@ static void dissect_zcl_default_resp(tvbuff_t *tvb, packet_info *pinfo _U_, prot
guint *offset, guint16 cluster_id, guint8 dir)
{
zbee_zcl_cluster_desc *desc;
+ int hf_cmd_id = hf_zbee_zcl_cs_cmd_id;
- /* Call the specific cluster function retrieves the command id */
+ /* Retreive the cluster-specific command ID definition, with the direction
+ * inverted, since this a response to the originating command. */
desc = zbee_zcl_get_cluster_desc(cluster_id);
- if ((desc != NULL) && (desc->fn_cmd_id != NULL)) {
- desc->fn_cmd_id(tree, tvb, offset, dir);
- }
- else {
- proto_tree_add_item(tree, hf_zbee_zcl_cmd_id, tvb, *offset, 1, ENC_NA);
+ if (dir == ZBEE_ZCL_FCF_TO_SERVER) {
+ if (desc && (desc->hf_cmd_tx_id >= 0)) hf_cmd_id = desc->hf_cmd_tx_id;
+ } else {
+ if (desc && (desc->hf_cmd_rx_id >= 0)) hf_cmd_id = desc->hf_cmd_rx_id;
}
+ proto_tree_add_item(tree, hf_cmd_id, tvb, *offset, 1, ENC_NA);
*offset += 1;
/* Dissect the status */
dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_status);
-
- return;
} /* dissect_zcl_default_resp */
/*FUNCTION:------------------------------------------------------
@@ -1781,7 +1405,7 @@ static void dissect_zcl_discover_attr_resp(tvbuff_t *tvb, packet_info *pinfo _U_
/* XXX - tree is never available!!!*/
dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_dis);
- tvb_len = tvb_length(tvb);
+ tvb_len = tvb_captured_length(tvb);
while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ) {
/* Create subtree for attribute status field */
@@ -1816,16 +1440,14 @@ static void dissect_zcl_discover_attr_resp(tvbuff_t *tvb, packet_info *pinfo _U_
static void dissect_zcl_attr_id(tvbuff_t *tvb, proto_tree *tree, guint *offset, guint16 cluster_id)
{
zbee_zcl_cluster_desc *desc;
+ int hf_attr_id = hf_zbee_zcl_attr_id;
+ /* Check if a cluster-specific attribute ID definition exists. */
desc = zbee_zcl_get_cluster_desc(cluster_id);
- if ((desc != NULL) && (desc->fn_attr_id != NULL)) {
- desc->fn_attr_id(tree, tvb, offset);
- }
- else {
- /* Add the identifier */
- proto_tree_add_item(tree, hf_zbee_zcl_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
- }
+ if (desc && (desc->hf_attr_id >= 0)) hf_attr_id = desc->hf_attr_id;
+ /* Add the identifier. */
+ proto_tree_add_item(tree, hf_attr_id, tvb, *offset, 2, ENC_LITTLE_ENDIAN);
*offset += 2;
} /* dissect_zcl_attr_id */
@@ -2154,7 +1776,7 @@ void dissect_zcl_attr_data(tvbuff_t *tvb, proto_tree *tree, guint *offset, guint
case ZBEE_ZCL_DOUBLE_FLOAT:
attr_double = tvb_get_letohieee_double(tvb, *offset);
- proto_item_append_text(tree, ", Double: %lg", attr_double);
+ proto_item_append_text(tree, ", Double: %g", attr_double);
proto_tree_add_item(tree, hf_zbee_zcl_attr_double, tvb, *offset, 8, ENC_LITTLE_ENDIAN);
*offset += 8;
@@ -2462,7 +2084,7 @@ dissect_zcl_set_type(tvbuff_t *tvb, proto_tree *tree, guint *offset, guint8 elem
static void zcl_dump_data(tvbuff_t *tvb, guint offset, packet_info *pinfo, proto_tree *tree)
{
proto_tree *root = proto_tree_get_root(tree);
- guint length = tvb_length_remaining(tvb, offset);
+ guint length = tvb_captured_length_remaining(tvb, offset);
tvbuff_t *remainder;
if (length > 0) {
@@ -2519,47 +2141,11 @@ void decode_zcl_time_in_minutes(gchar *s, guint16 value)
void proto_register_zbee_zcl(void)
{
guint i, j;
-
static const true_false_string tfs_client_server = {
"To Client",
"To Server"
};
- static const true_false_string tfs_ac_mains = {
- "AC/Mains fault",
- "AC/Mains OK"
- };
-
- static const true_false_string tfs_alarmed_or_not = {
- "Opened or alarmed",
- "Closed or not alarmed"
- };
-
- static const true_false_string tfs_battery = {
- "Low battery",
- "Battery OK"
- };
-
- static const true_false_string tfs_reports_or_not = {
- "Reports",
- "Does not report"
- };
-
- static const true_false_string tfs_reports_restore = {
- "Reports restore",
- "Does not report restore"
- };
-
- static const true_false_string tfs_tampered_or_not = {
- "Tampered",
- "Not tampered"
- };
-
- static const true_false_string tfs_trouble_failure = {
- "Trouble/Failure",
- "OK"
- };
-
static hf_register_info hf[] = {
{ &hf_zbee_zcl_fcf_frame_type,
{ "Frame Type", "zbee_zcl.type", FT_UINT8, BASE_HEX, VALS(zbee_zcl_frame_types),
@@ -2761,161 +2347,7 @@ void proto_register_zbee_zcl(void)
{ &hf_zbee_zcl_attr_bag_elements_num,
{ "Elements Number", "zbee_zcl.attr.bag.elements_num", FT_UINT16, BASE_DEC, NULL, 0x0,
- NULL, HFILL }},
-
- { &hf_zbee_zcl_ias_zone_client_cmd_id,
- { "Command", "zbee_zcl.ias_zone.client.cmd_id", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_ias_zone_client_cmd_names), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_ias_zone_client_zer_erc,
- { "Enroll response code", "zbee_zcl.ias_zone.client.zer.erc", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_ias_zone_client_erc), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_ias_zone_client_zer_zone_id,
- { "Zone ID", "zbee_zcl.ias_zone.client.zer.zone_id", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_cmd_id,
- { "Command", "zbee_zcl.ias_zone.server.cmd_id", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_ias_zone_server_cmd_names), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_ac_mains,
- { "AC (mains)", "zbee_zcl.ias_zone.server.scn.ac_mains", FT_BOOLEAN, 16, TFS(&tfs_ac_mains), 0x80, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_alarm1,
- { "Alarm 1", "zbee_zcl.ias_zone.server.scn.alarm_1", FT_BOOLEAN, 16, TFS(&tfs_alarmed_or_not), 0x01, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_alarm2,
- { "Alarm 2", "zbee_zcl.ias_zone.server.scn.alarm_2", FT_BOOLEAN, 16, TFS(&tfs_alarmed_or_not), 0x02, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_battery,
- { "Battery", "zbee_zcl.ias_zone.server.scn.battery", FT_BOOLEAN, 16, TFS(&tfs_battery), 0x08, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_delay,
- { "Delay (in quarterseconds)", "zbee_zcl.ias_zone.server.scn.delay", FT_UINT16, BASE_DEC, NULL, 0x0, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_ext_status,
- { "Extended Status", "zbee_zcl.ias_zone.server.scn.ext_status", FT_UINT8, BASE_HEX, NULL, 0x0, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_restore_reports,
- { "Restore Reports", "zbee_zcl.ias_zone.server.scn.restore_reports", FT_BOOLEAN, 16,
- TFS(&tfs_reports_restore), 0x20, NULL, HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_supervision_reports,
- { "Supervision Reports", "zbee_zcl.ias_zone.server.scn.supervision_reports", FT_BOOLEAN, 16,
- TFS(&tfs_reports_or_not), 0x10, NULL, HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_tamper,
- { "Tamper", "zbee_zcl.ias_zone.server.scn.tamper", FT_BOOLEAN, 16, TFS(&tfs_tampered_or_not), 0x04, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_trouble,
- { "Trouble", "zbee_zcl.ias_zone.server.scn.trouble", FT_BOOLEAN, 16, TFS(&tfs_trouble_failure), 0x40, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_zone_id,
- { "Zone ID", "zbee_zcl.ias_zone.server.scn.zone_id", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_ias_zone_server_scn_zone_status,
- { "Zone Status", "zbee_zcl.ias_zone.server.scn.zone_status", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_poll_control_client_cir_fpt,
- { "Fast Poll Timeout (quarterseconds)", "zbee_zcl.poll_control.client.cir.fpt", FT_UINT16, BASE_DEC, NULL,
- 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_poll_control_client_cir_sfp,
- { "Start Fast Polling", "zbee_zcl.poll_control.client.cir.sfp", FT_BOOLEAN, 8, TFS(&tfs_true_false), 0x0,
- NULL, HFILL }},
-
- { &hf_zbee_zcl_poll_control_client_cmd_id,
- { "Command", "zbee_zcl.poll_control.client.cmd_id", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_poll_control_client_cmd_names), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_poll_control_client_slpi_nlpi,
- { "New Long Poll Interval", "zbee_zcl.poll_control.client.slpi_nlpi", FT_UINT32, BASE_DEC, NULL, 0x0, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_poll_control_client_sspi_nspi,
- { "New Short Poll Interval", "zbee_zcl.poll_control.client.sspi.nspi", FT_UINT16, BASE_DEC, NULL, 0x0, NULL,
- HFILL }},
-
- { &hf_zbee_zcl_poll_control_server_cmd_id,
- { "Command", "zbee_zcl.poll_control.server.cmd_id", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_poll_control_server_cmd_names), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_cmd_id,
- { "Command", "zbee_zcl.thermostat.client.cmd_id", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_thermostat_client_cmd_names), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_gws_days_to_return,
- { "Days To Return", "zbee_zcl.thermostat.client.gws.days_to_return", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_thermostat_client_ws_dow), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_gws_mtr,
- { "Mode to Return", "zbee_zcl.thermostat.client.gws.mtr", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_gws_mtr_cool,
- { "Cool Setpoint Field Present in Payload", "zbee_zcl.thermostat.client.gws.mtr.cool", FT_BOOLEAN, 8, NULL,
- 0x02, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_gws_mtr_heat,
- { "Heat Setpoint Field Present in Payload", "zbee_zcl.thermostat.client.gws.mtr.heat", FT_BOOLEAN, 8, NULL,
- 0x01, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_setpointrl_amount_field,
- { "Amount Field: increased/decreased by (in steps of 0.1 C)",
- "zbee_zcl.thermostat.client.sprl.amount_field", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_setpointrl_modes,
- { "Mode Field", "zbee_zcl.thermostat.client.sprl.mode_field", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_thermostat_client_setpointrl_mf), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_sws_dow,
- { "Day of Week for Sequence", "zbee_zcl.thermostat.client.sws.dow", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_thermostat_client_ws_dow), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_sws_mfs,
- { "Mode for Sequence", "zbee_zcl.thermostat.client.sws.mfs", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_sws_mfs_cool,
- { "Cool Setpoint Field Present in Payload", "zbee_zcl.thermostat.client.sws.mfs.cool", FT_BOOLEAN, 8, NULL,
- 0x02, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_sws_mfs_heat,
- { "Heat Setpoint Field Present in Payload", "zbee_zcl.thermostat.client.sws.mfs.heat", FT_BOOLEAN, 8, NULL,
- 0x01, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_client_sws_n_trans,
- { "Number of Transitions for Sequence", "zbee_zcl.thermostat.client.sws.n_trans", FT_UINT8, BASE_HEX, NULL,
- 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_server_cmd_id,
- { "Command", "zbee_zcl.thermostat.server.cmd_id", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_thermostat_server_cmd_names), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_server_gwsr_dow,
- { "Day of Week for Sequence", "zbee_zcl.thermostat.server.gwsr.dow", FT_UINT8, BASE_HEX,
- VALS(zbee_zcl_thermostat_client_ws_dow), 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_server_gwsr_mfs,
- { "Mode for Sequence", "zbee_zcl.thermostat.server.gwsr.mfs", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_server_gwsr_mfs_cool,
- { "Cool Setpoint Field Present in Payload", "zbee_zcl.thermostat.server.gwsr.mfs_cool", FT_BOOLEAN, 8, NULL,
- 0x02, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_server_gwsr_mfs_heat,
- { "Heat Setpoint Field Present in Payload", "zbee_zcl.thermostat.server.gwsr.mfs_heat", FT_BOOLEAN, 8, NULL,
- 0x01, NULL, HFILL }},
-
- { &hf_zbee_zcl_thermostat_server_gwsr_n_trans,
- { "Number of Transitions for Sequence", "zbee_zcl.thermostat.server.gwsr.n_trans", FT_UINT8, BASE_HEX, NULL,
- 0x0, NULL, HFILL }}
+ NULL, HFILL }}
};
/* ZCL subtrees */
@@ -2923,14 +2355,6 @@ void proto_register_zbee_zcl(void)
ett[0] = &ett_zbee_zcl;
ett[1] = &ett_zbee_zcl_fcf;
- ett[2] = &ett_zbee_zcl_ias_zone_server_scn_zone_status;
- ett[3] = &ett_zbee_zcl_thermostat_client_gws_days_to_return;
- ett[4] = &ett_zbee_zcl_thermostat_client_gws_mtr;
- ett[5] = &ett_zbee_zcl_thermostat_client_sws_dow_for_sequence;
- ett[6] = &ett_zbee_zcl_thermostat_client_sws_mfs;
- ett[7] = &ett_zbee_zcl_thermostat_server_gwsr_dow_for_sequence;
- ett[8] = &ett_zbee_zcl_thermostat_server_gwsr_mfs;
-
j = ZBEE_ZCL_NUM_INDIVIDUAL_ETT;
/* initialize attribute subtree types */
@@ -2952,7 +2376,6 @@ void proto_register_zbee_zcl(void)
/* Register the ZCL dissector and subdissector list. */
zbee_zcl_dissector_table = register_dissector_table("zbee.zcl.cluster", "ZigBee ZCL Cluster ID", FT_UINT16, BASE_HEX);
new_register_dissector(ZBEE_PROTOABBREV_ZCL, dissect_zbee_zcl, proto_zbee_zcl);
-
} /* proto_register_zbee_zcl */
/*FUNCTION:------------------------------------------------------
@@ -2983,6 +2406,7 @@ void proto_reg_handoff_zbee_zcl(void)
dissector_add_uint("zbee.profile", ZBEE_PROFILE_TA, zbee_zcl_handle);
dissector_add_uint("zbee.profile", ZBEE_PROFILE_HC, zbee_zcl_handle);
dissector_add_uint("zbee.profile", ZBEE_PROFILE_SE, zbee_zcl_handle);
+ dissector_add_uint("zbee.profile", ZBEE_PROFILE_RS, zbee_zcl_handle);
dissector_add_uint("zbee.profile", ZBEE_PROFILE_C4_CL, zbee_zcl_handle);
} /* proto_reg_handoff_zbee_zcl */
@@ -2997,15 +2421,16 @@ void proto_reg_handoff_zbee_zcl(void)
* proto - dissector proto
* ett - ett proto (not used at the moment)
* cluster_id - cluster id
- * fn_attr_id - specific cluster attribute id decode function
+ * hf_attr_id - cluster-specific attribute ID field.
+ * hf_cmd_rx_id - cluster-specific client-to-server command ID field, or -1.
+ * hf_cmd_tx_id - cluster-specific server-to-client command ID field, or -1.
* fn_attr_data - specific cluster attribute data decode function
- * fn_cmd_id - specific cluster command id decode function
* RETURNS
* void
*---------------------------------------------------------------
*/
void
-zbee_zcl_init_cluster(int proto, gint ett, guint16 cluster_id, zbee_zcl_fn_attr_id fn_attr_id, zbee_zcl_fn_attr_data fn_attr_data, zbee_zcl_fn_cmd_id fn_cmd_id)
+zbee_zcl_init_cluster(int proto, gint ett, guint16 cluster_id, int hf_attr_id, int hf_cmd_rx_id, int hf_cmd_tx_id, zbee_zcl_fn_attr_data fn_attr_data)
{
zbee_zcl_cluster_desc *cluster_desc;
cluster_desc = g_new(zbee_zcl_cluster_desc, 1);
@@ -3013,9 +2438,10 @@ zbee_zcl_init_cluster(int proto, gint ett, guint16 cluster_id, zbee_zcl_fn_attr_
cluster_desc->proto = find_protocol_by_id(proto);
cluster_desc->name = proto_get_protocol_short_name(cluster_desc->proto);
cluster_desc->cluster_id = cluster_id;
- cluster_desc->fn_attr_id = fn_attr_id;
+ cluster_desc->hf_attr_id = hf_attr_id;
+ cluster_desc->hf_cmd_rx_id = hf_cmd_rx_id;
+ cluster_desc->hf_cmd_tx_id = hf_cmd_tx_id;
cluster_desc->fn_attr_data = fn_attr_data;
- cluster_desc->fn_cmd_id = fn_cmd_id;
acluster_desc = g_list_append(acluster_desc, cluster_desc);
cluster_desc->proto_id = proto;
diff --git a/epan/dissectors/packet-zbee-zcl.h b/epan/dissectors/packet-zbee-zcl.h
index 626db333e0..4672457b63 100644
--- a/epan/dissectors/packet-zbee-zcl.h
+++ b/epan/dissectors/packet-zbee-zcl.h
@@ -133,7 +133,7 @@ typedef struct{
/* ZCL Miscellaneous */
#define ZBEE_ZCL_INVALID_STR_LENGTH 0xff
#define ZBEE_ZCL_INVALID_LONG_STR_LENGTH 0xffff
-#define ZBEE_ZCL_NUM_INDIVIDUAL_ETT 9
+#define ZBEE_ZCL_NUM_INDIVIDUAL_ETT 2
#define ZBEE_ZCL_NUM_ATTR_ETT 64
#define ZBEE_ZCL_NUM_ARRAY_ELEM_ETT 16
#define ZBEE_ZCL_NUM_TOTAL_ETT (ZBEE_ZCL_NUM_INDIVIDUAL_ETT + ZBEE_ZCL_NUM_ATTR_ETT + ZBEE_ZCL_NUM_ARRAY_ELEM_ETT)
@@ -181,19 +181,18 @@ typedef struct{
#define MONTHS_PER_YEAR 12
#define YEAR_OFFSET 1900
-typedef void (*zbee_zcl_fn_attr_id) (proto_tree *tree, tvbuff_t *tvb, guint *offset);
-typedef void (*zbee_zcl_fn_attr_data) (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
-typedef void (*zbee_zcl_fn_cmd_id) (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint8 dir);
+typedef void (*zbee_zcl_fn_attr_data)(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type);
typedef struct _zbee_zcl_cluster_desc {
int proto_id;
protocol_t *proto;
const char *name;
int ett;
+ int hf_attr_id;
+ int hf_cmd_rx_id;
+ int hf_cmd_tx_id;
guint16 cluster_id;
- zbee_zcl_fn_attr_id fn_attr_id;
zbee_zcl_fn_attr_data fn_attr_data;
- zbee_zcl_fn_cmd_id fn_cmd_id;
} zbee_zcl_cluster_desc;
extern const value_string zbee_zcl_short_data_type_names[];
@@ -209,7 +208,7 @@ extern void dissect_zcl_read_attr_resp (tvbuff_t *tvb, packet_info *pinfo, proto
void decode_zcl_time_in_seconds (gchar *s, guint16 value);
void decode_zcl_time_in_minutes (gchar *s, guint16 value);
void dissect_zcl_attr_data (tvbuff_t *tvb, proto_tree *tree, guint *offset, guint data_type);
-void zbee_zcl_init_cluster(int proto, gint ett, guint16 cluster_id, zbee_zcl_fn_attr_id fn_attr_id, zbee_zcl_fn_attr_data fn_attr_data, zbee_zcl_fn_cmd_id fn_cmd_id);
+void zbee_zcl_init_cluster(int proto, gint ett, guint16 cluster_id, int hf_attr_id, int hf_cmd_rx_id, int hf_cmd_tx_id, zbee_zcl_fn_attr_data fn_attr_data);
zbee_zcl_cluster_desc *zbee_zcl_get_cluster_desc(guint16 cluster_id);
/* Cluster-specific commands and parameters */
diff --git a/epan/dissectors/packet-zbee.h b/epan/dissectors/packet-zbee.h
index eb145c3ead..0c9a54e82e 100644
--- a/epan/dissectors/packet-zbee.h
+++ b/epan/dissectors/packet-zbee.h
@@ -65,6 +65,7 @@
#define ZBEE_PROFILE_TA 0x0107
#define ZBEE_PROFILE_HC 0x0108
#define ZBEE_PROFILE_SE 0x0109
+#define ZBEE_PROFILE_RS 0x010a
#define ZBEE_PROFILE_STD_MIN 0x0000
#define ZBEE_PROFILE_STD_MAX 0x7eff
@@ -218,7 +219,6 @@
#define ZBEE_PROFILE_C4_CL 0xc25d
#define ZBEE_PROFILE_C4_MIN 0xc25c
#define ZBEE_PROFILE_C4_MAX 0xc265
-
#define ZBEE_PROFILE_STM_MIN 0xc266
#define ZBEE_PROFILE_STM_MAX 0xc26f
#define ZBEE_PROFILE_ASN_0_MIN 0xc270
@@ -383,403 +383,740 @@
#define ZBEE_PROFILE_MAINSTREAM_MIN 0xc4e8
#define ZBEE_PROFILE_MAINSTREAM_MAX 0xc4e9
+#define ZBEE_PROFILE_DIGI_MIN 0xc4f0
+#define ZBEE_PROFILE_DIGI_MAX 0xc4f1
+#define ZBEE_PROFILE_RADIOCRAFTS_MIN 0xc4f2
+#define ZBEE_PROFILE_RADIOCRAFTS_MAX 0xc4f3
+#define ZBEE_PROFILE_SCHNEIDER2_MIN 0xc4f4
+#define ZBEE_PROFILE_SCHNEIDER2_MAX 0xc4f5
+#define ZBEE_PROFILE_HUAWEI_MIN 0xc4f6
+#define ZBEE_PROFILE_HUAWEI_MAX 0xc4ff
+#define ZBEE_PROFILE_BGLOBAL_MIN 0xc500
+#define ZBEE_PROFILE_BGLOBAL_MAX 0xc505
+#define ZBEE_PROFILE_ABB_MIN 0xc506
+#define ZBEE_PROFILE_ABB_MAX 0xc507
+#define ZBEE_PROFILE_GENUS_MIN 0xc508
+#define ZBEE_PROFILE_GENUS_MAX 0xc509
+#define ZBEE_PROFILE_UBISYS_MIN 0xc50a
+#define ZBEE_PROFILE_UBISYS_MAX 0xc50b
+#define ZBEE_PROFILE_CRESTRON_MIN 0xc50c
+#define ZBEE_PROFILE_CRESTRON_MAX 0xc50d
+#define ZBEE_PROFILE_AAC_TECH_MIN 0xc50e
+#define ZBEE_PROFILE_AAC_TECH_MAX 0xc50f
+#define ZBEE_PROFILE_STEELCASE_MIN 0xc510
+#define ZBEE_PROFILE_STEELCASE_MAX 0xc511
+
/* Unallocated Manufacturer IDs */
#define ZBEE_PROFILE_UNALLOCATED_MIN 0xc000
#define ZBEE_PROFILE_UNALLOCATED_MAX 0xffff
/* Frame Control Field */
-#define ZBEE_ZCL_FCF_FRAME_TYPE 0x03
-#define ZBEE_ZCL_FCF_MFR_SPEC 0x04
-#define ZBEE_ZCL_FCF_DIRECTION 0x08
-#define ZBEE_ZCL_FCF_DISABLE_DEFAULT_RESP 0x10
+#define ZBEE_ZCL_FCF_FRAME_TYPE 0x03
+#define ZBEE_ZCL_FCF_MFR_SPEC 0x04
+#define ZBEE_ZCL_FCF_DIRECTION 0x08
+#define ZBEE_ZCL_FCF_DISABLE_DEFAULT_RESP 0x10
-#define ZBEE_ZCL_FCF_PROFILE_WIDE 0x00
-#define ZBEE_ZCL_FCF_CLUSTER_SPEC 0x01
+#define ZBEE_ZCL_FCF_PROFILE_WIDE 0x00
+#define ZBEE_ZCL_FCF_CLUSTER_SPEC 0x01
-#define ZBEE_ZCL_FCF_TO_SERVER 0x00
-#define ZBEE_ZCL_FCF_TO_CLIENT 0x01
+#define ZBEE_ZCL_FCF_TO_SERVER 0x00
+#define ZBEE_ZCL_FCF_TO_CLIENT 0x01
/* Manufacturer Codes */
/* Codes less than 0x1000 were issued for RF4CE */
-#define ZBEE_MFG_CODE_SAMSUNG 0x0003
-/**/
-#define ZBEE_MFG_CODE_CIRRONET 0x1000
-#define ZBEE_MFG_CODE_CHIPCON 0x1001
-#define ZBEE_MFG_CODE_EMBER 0x1002
-#define ZBEE_MFG_CODE_NTS 0x1003
-#define ZBEE_MFG_CODE_FREESCALE 0x1004
-#define ZBEE_MFG_CODE_IPCOM 0x1005
-#define ZBEE_MFG_CODE_SAN_JUAN 0x1006
-#define ZBEE_MFG_CODE_TUV 0x1007
-#define ZBEE_MFG_CODE_COMPXS 0x1008
-#define ZBEE_MFG_CODE_BM 0x1009
-#define ZBEE_MFG_CODE_AWAREPOINT 0x100a
-#define ZBEE_MFG_CODE_PHILIPS 0x100b
-#define ZBEE_MFG_CODE_LUXOFT 0x100c
-#define ZBEE_MFG_CODE_KORWIN 0x100d
-#define ZBEE_MFG_CODE_1_RF 0x100e
-#define ZBEE_MFG_CODE_STG 0x100f
-
-#define ZBEE_MFG_CODE_TELEGESIS 0x1010
-#define ZBEE_MFG_CODE_VISIONIC 0x1011
-#define ZBEE_MFG_CODE_INSTA 0x1012
-#define ZBEE_MFG_CODE_ATALUM 0x1013
-#define ZBEE_MFG_CODE_ATMEL 0x1014
-#define ZBEE_MFG_CODE_DEVELCO 0x1015
-#define ZBEE_MFG_CODE_HONEYWELL 0x1016
-/**/
-#define ZBEE_MFG_CODE_RENESAS 0x1018
-#define ZBEE_MFG_CODE_XANADU 0x1019
-#define ZBEE_MFG_CODE_NEC 0x101a
-#define ZBEE_MFG_CODE_YAMATAKE 0x101b
-#define ZBEE_MFG_CODE_TENDRIL 0x101c
-#define ZBEE_MFG_CODE_ASSA 0x101d
-#define ZBEE_MFG_CODE_MAXSTREAM 0x101e
-#define ZBEE_MFG_CODE_NEUROCOM 0x101f
-
-#define ZBEE_MFG_CODE_III 0x1020
-#define ZBEE_MFG_CODE_VANTAGE 0x1021
-#define ZBEE_MFG_CODE_ICONTROL 0x1022
-#define ZBEE_MFG_CODE_RAYMARINE 0x1023
-#define ZBEE_MFG_CODE_LSR 0x1024
-#define ZBEE_MFG_CODE_ONITY 0x1025
-#define ZBEE_MFG_CODE_MONO 0x1026
-#define ZBEE_MFG_CODE_RFT 0x1027
-#define ZBEE_MFG_CODE_ITRON 0x1028
-#define ZBEE_MFG_CODE_TRITECH 0x1029
-#define ZBEE_MFG_CODE_EMBEDIT 0x102a
-#define ZBEE_MFG_CODE_S3C 0x102b
-#define ZBEE_MFG_CODE_SIEMENS 0x102c
-#define ZBEE_MFG_CODE_MINDTECH 0x102d
-#define ZBEE_MFG_CODE_LGE 0x102e
-#define ZBEE_MFG_CODE_MITSUBISHI 0x102f
-
-#define ZBEE_MFG_CODE_JOHNSON 0x1030
-#define ZBEE_MFG_CODE_PRI 0x1031
-#define ZBEE_MFG_CODE_KNICK 0x1032
-#define ZBEE_MFG_CODE_VICONICS 0x1033
-#define ZBEE_MFG_CODE_FLEXIPANEL 0x1034
-/**/
-#define ZBEE_MFG_CODE_TRANE 0x1036
-#define ZBEE_MFG_CODE_JENNIC 0x1037
-#define ZBEE_MFG_CODE_LIG 0x1038
-#define ZBEE_MFG_CODE_ALERTME 0x1039
-#define ZBEE_MFG_CODE_DAINTREE 0x103a
-#define ZBEE_MFG_CODE_AIJI 0x103b
-#define ZBEE_MFG_CODE_TEL_ITALIA 0x103c
-#define ZBEE_MFG_CODE_MIKROKRETS 0x103d
-#define ZBEE_MFG_CODE_OKI 0x103e
-#define ZBEE_MFG_CODE_NEWPORT 0x103f
-
-#define ZBEE_MFG_CODE_C4 0x1040
-#define ZBEE_MFG_CODE_STM 0x1041
-#define ZBEE_MFG_CODE_ASN 0x1042
-#define ZBEE_MFG_CODE_DCSI 0x1043
-#define ZBEE_MFG_CODE_FRANCE_TEL 0x1044
-#define ZBEE_MFG_CODE_MUNET 0x1045
-#define ZBEE_MFG_CODE_AUTANI 0x1046
-#define ZBEE_MFG_CODE_COL_VNET 0x1047
-#define ZBEE_MFG_CODE_AEROCOMM 0x1048
-#define ZBEE_MFG_CODE_SI_LABS 0x1049
-#define ZBEE_MFG_CODE_INNCOM 0x104a
-#define ZBEE_MFG_CODE_CANNON 0x104b
-#define ZBEE_MFG_CODE_SYNAPSE 0x104c
-#define ZBEE_MFG_CODE_FPS 0x104d
-#define ZBEE_MFG_CODE_CLS 0x104e
-#define ZBEE_MFG_CODE_CRANE 0x104F
-
-#define ZBEE_MFG_CODE_MOBILARM 0x1050
-#define ZBEE_MFG_CODE_IMONITOR 0x1051
-#define ZBEE_MFG_CODE_BARTECH 0x1052
-#define ZBEE_MFG_CODE_MESHNETICS 0x1053
-#define ZBEE_MFG_CODE_LS_IND 0x1054
-#define ZBEE_MFG_CODE_CASON 0x1055
-#define ZBEE_MFG_CODE_WLESS_GLUE 0x1056
-#define ZBEE_MFG_CODE_ELSTER 0x1057
-#define ZBEE_MFG_CODE_SMS_TEC 0x1058
-#define ZBEE_MFG_CODE_ONSET 0x1059
-#define ZBEE_MFG_CODE_RIGA 0x105a
-#define ZBEE_MFG_CODE_ENERGATE 0x105b
-#define ZBEE_MFG_CODE_CONMED 0x105c
-#define ZBEE_MFG_CODE_POWERMAND 0x105d
-#define ZBEE_MFG_CODE_SCHNEIDER 0x105e
-#define ZBEE_MFG_CODE_EATON 0x105f
-
-#define ZBEE_MFG_CODE_TELULAR 0x1060
-#define ZBEE_MFG_CODE_DELPHI 0x1061
-#define ZBEE_MFG_CODE_EPISENSOR 0x1062
-#define ZBEE_MFG_CODE_LANDIS_GYR 0x1063
-#define ZBEE_MFG_CODE_KABA 0x1064
-#define ZBEE_MFG_CODE_SHURE 0x1065
-#define ZBEE_MFG_CODE_COMVERGE 0x1066
-/**/
-#define ZBEE_MFG_CODE_HIDALGO 0x1069
-#define ZBEE_MFG_CODE_AIR2APP 0x106a
-#define ZBEE_MFG_CODE_AMX 0x106b
-#define ZBEE_MFG_CODE_EDMI 0x106c
-#define ZBEE_MFG_CODE_CYAN 0x106d
-#define ZBEE_MFG_CODE_SYS_SPA 0x106e
-#define ZBEE_MFG_CODE_TELIT 0x106f
-
-#define ZBEE_MFG_CODE_KAGA 0x1070
-#define ZBEE_MFG_CODE_4_NOKS 0x1071
-/**/
-#define ZBEE_MFG_CODE_PROFILE_SYS 0x1074
-/**/
-#define ZBEE_MFG_CODE_FREESTYLE 0x1076
-/**/
-#define ZBEE_MFG_CODE_REMOTE 0x1079
-#define ZBEE_MFG_CODE_WAVECOM 0x107a
-#define ZBEE_MFG_CODE_ENERGY_OPT 0x107b
-#define ZBEE_MFG_CODE_GE 0x107c
-/**/
-#define ZBEE_MFG_CODE_MESHWORKS 0x1082
-#define ZBEE_MFG_CODE_ELLIPS 0x1083
-/**/
-#define ZBEE_MFG_CODE_CEDO 0x1085
-/**/
-#define ZBEE_MFG_CODE_DIGI 0x1087
-/**/
-#define ZBEE_MFG_CODE_A_D 0x1094
-/**/
-#define ZBEE_MFG_CODE_CARRIER 0x1096
-#define ZBEE_MFG_CODE_SYCHIP 0x1097
-/**/
-#define ZBEE_MFG_CODE_PASSIVESYS 0x1099
-#define ZBEE_MFG_CODE_MMB 0x109a
-#define ZBEE_MFG_CODE_HOME_AUTO 0x109b
-/**/
-#define ZBEE_MFG_CODE_SUNRISE 0x10a3
-#define ZBEE_MFG_CODE_MEMTEC 0x10a4
-/**/
-#define ZBEE_MFG_CODE_BRITISH_GAS 0x10a7
-#define ZBEE_MFG_CODE_SENTEC 0x10a8
-#define ZBEE_MFG_CODE_NAVETAS 0x10a9
-/**/
-#define ZBEE_MFG_CODE_ENERNOC 0x10b2
-#define ZBEE_MFG_CODE_ELTAV 0x10b3
-/**/
-#define ZBEE_MFG_CODE_XSTREAMHD 0x10b5
-/**/
-#define ZBEE_MFG_CODE_GREEN 0x10b7
-/**/
-#define ZBEE_MFG_CODE_OMRON 0x10bf
-/**/
-#define ZBEE_MFG_CODE_PEEL 0x10c2
-/**/
-#define ZBEE_MFG_CODE_NEC_TOKIN 0x10c5
-/**/
-#define ZBEE_MFG_CODE_G4S_JUSTICE 0x10c6
-/**/
-#define ZBEE_MFG_CODE_ELECTROLUX 0x10c8
-/**/
-/**/
-#define ZBEE_MFG_CODE_MAINSTREAM 0x10cc
-#define ZBEE_MFG_CODE_INDESIT_C 0x10cd
-/**/
-#define ZBEE_MFG_CODE_RADIOCRAFTS 0x10dd
-/**/
-#define ZBEE_MFG_CODE_HUAWEI_1 0x10e3
-#define ZBEE_MFG_CODE_HUAWEI_2 0x10e4
-/**/
-#define ZBEE_MFG_CODE_BGLOBAL 0x10e6
-/**/
-#define ZBEE_MFG_CODE_ABB 0x10eb
-/**/
-#define ZBEE_MFG_CODE_GENUS 0x10ed
-/**/
-#define ZBEE_MFG_CODE_RELOC 0x1114
+#define ZBEE_MFG_CODE_PANASONIC_RF4CE 0x0001
+#define ZBEE_MFG_CODE_SONY_RF4CE 0x0002
+#define ZBEE_MFG_CODE_SAMSUNG_RF4CE 0x0003
+#define ZBEE_MFG_CODE_PHILIPS_RF4CE 0x0004
+#define ZBEE_MFG_CODE_FREESCALE_RF4CE 0x0005
+#define ZBEE_MFG_CODE_OKI_SEMI_RF4CE 0x0006
+#define ZBEE_MFG_CODE_TI_RF4CE 0x0007
-/* Manufacturer Names */
-#define ZBEE_MFG_CIRRONET "Cirronet"
-#define ZBEE_MFG_CHIPCON "Chipcon"
-#define ZBEE_MFG_EMBER "Ember"
-#define ZBEE_MFG_NTS "National Tech"
-#define ZBEE_MFG_FREESCALE "Freescale"
-#define ZBEE_MFG_IPCOM "IPCom"
-#define ZBEE_MFG_SAN_JUAN "San Juan Software"
-#define ZBEE_MFG_TUV "TUV"
-#define ZBEE_MFG_COMPXS "CompXs"
-#define ZBEE_MFG_BM "BM SpA"
-#define ZBEE_MFG_AWAREPOINT "AwarePoint"
-#define ZBEE_MFG_PHILIPS "Philips"
-#define ZBEE_MFG_LUXOFT "Luxoft"
-#define ZBEE_MFG_KORWIN "Korvin"
-#define ZBEE_MFG_1_RF "One RF"
-#define ZBEE_MFG_STG "Software Technology Group"
-
-#define ZBEE_MFG_TELEGESIS "Telegesis"
-#define ZBEE_MFG_VISIONIC "Visionic"
-#define ZBEE_MFG_INSTA "Insta"
-#define ZBEE_MFG_ATALUM "Atalum"
-#define ZBEE_MFG_ATMEL "Atmel"
-#define ZBEE_MFG_DEVELCO "Develco"
-#define ZBEE_MFG_HONEYWELL "Honeywell"
-/**/
-#define ZBEE_MFG_RENESAS "Renesas"
-#define ZBEE_MFG_XANADU "Xanadu Wireless"
-#define ZBEE_MFG_NEC "NEC Engineering"
-#define ZBEE_MFG_YAMATAKE "Yamatake"
-#define ZBEE_MFG_TENDRIL "Tendril"
-#define ZBEE_MFG_ASSA "Assa Abloy"
-#define ZBEE_MFG_MAXSTREAM "Maxstream"
-#define ZBEE_MFG_NEUROCOM "Neurocom"
-
-#define ZBEE_MFG_III "Institute for Information Industry"
-#define ZBEE_MFG_VANTAGE "Vantage Controls"
-#define ZBEE_MFG_ICONTROL "iControl"
-#define ZBEE_MFG_RAYMARINE "Raymarine"
-#define ZBEE_MFG_LSR "LS Research"
-#define ZBEE_MFG_ONITY "Onity"
-#define ZBEE_MFG_MONO "Mono Products"
-#define ZBEE_MFG_RFT "RF Tech"
-#define ZBEE_MFG_ITRON "Itron"
-#define ZBEE_MFG_TRITECH "Tritech"
-#define ZBEE_MFG_EMBEDIT "Embedit"
-#define ZBEE_MFG_S3C "S3C"
-#define ZBEE_MFG_SIEMENS "Siemens"
-#define ZBEE_MFG_MINDTECH "Mindtech"
-#define ZBEE_MFG_LGE "LG Electronics"
-#define ZBEE_MFG_MITSUBISHI "Mitsubishi"
-
-#define ZBEE_MFG_JOHNSON "Johnson Controls"
-#define ZBEE_MFG_PRI "PRI"
-#define ZBEE_MFG_KNICK "Knick"
-#define ZBEE_MFG_VICONICS "Viconics"
-#define ZBEE_MFG_FLEXIPANEL "Flexipanel"
-/**/
-#define ZBEE_MFG_TRANE "Trane"
-#define ZBEE_MFG_JENNIC "Jennic"
-#define ZBEE_MFG_LIG "Living Independently"
-#define ZBEE_MFG_ALERTME "AlertMe"
-#define ZBEE_MFG_DAINTREE "Daintree"
-#define ZBEE_MFG_AIJI "Aiji"
-#define ZBEE_MFG_TEL_ITALIA "Telecom Italia"
-#define ZBEE_MFG_MIKROKRETS "Mikrokrets"
-#define ZBEE_MFG_OKI "Oki Semi"
-#define ZBEE_MFG_NEWPORT "Newport Electronics"
-
-#define ZBEE_MFG_C4 "Control4"
-#define ZBEE_MFG_STM "STMicro"
-#define ZBEE_MFG_ASN "Ad-Sol Nissin"
-#define ZBEE_MFG_DCSI "DCSI"
-#define ZBEE_MFG_FRANCE_TEL "France Telecom"
-#define ZBEE_MFG_MUNET "muNet"
-#define ZBEE_MFG_AUTANI "Autani"
-#define ZBEE_MFG_COL_VNET "Colorado vNet"
-#define ZBEE_MFG_AEROCOMM "Aerocomm"
-#define ZBEE_MFG_SI_LABS "Silicon Labs"
-#define ZBEE_MFG_INNCOM "Inncom"
-#define ZBEE_MFG_CANNON "Cannon"
-#define ZBEE_MFG_SYNAPSE "Synapse"
-#define ZBEE_MFG_FPS "Fisher Pierce/Sunrise"
-#define ZBEE_MFG_CLS "CentraLite"
-#define ZBEE_MFG_CRANE "Crane"
-
-#define ZBEE_MFG_MOBILARM "Mobilarm"
-#define ZBEE_MFG_IMONITOR "iMonitor"
-#define ZBEE_MFG_BARTECH "Bartech"
-#define ZBEE_MFG_MESHNETICS "Meshnetics"
-#define ZBEE_MFG_LS_IND "LS Industrial"
-#define ZBEE_MFG_CASON "Cason"
-#define ZBEE_MFG_WLESS_GLUE "Wireless Glue"
-#define ZBEE_MFG_ELSTER "Elster"
-#define ZBEE_MFG_SMS_TEC "SMS Tec"
-#define ZBEE_MFG_ONSET "Onset Computer"
-#define ZBEE_MFG_RIGA "Riga Development"
-#define ZBEE_MFG_ENERGATE "Energate"
-#define ZBEE_MFG_CONMED "ConMed Linvatec"
-#define ZBEE_MFG_POWERMAND "PowerMand"
-#define ZBEE_MFG_SCHNEIDER "Schneider Electric"
-#define ZBEE_MFG_EATON "Eaton"
-
-#define ZBEE_MFG_TELULAR "Telular"
-#define ZBEE_MFG_DELPHI "Delphi Medical"
-#define ZBEE_MFG_EPISENSOR "EpiSensor"
-#define ZBEE_MFG_LANDIS_GYR "Landis+Gyr"
-#define ZBEE_MFG_KABA "Kaba Group"
-#define ZBEE_MFG_SHURE "Shure"
-#define ZBEE_MFG_COMVERGE "Comverge"
-/**/
-#define ZBEE_MFG_HIDALGO "Hidalgo"
-#define ZBEE_MFG_AIR2APP "Air2App"
-#define ZBEE_MFG_AMX "AMX"
-#define ZBEE_MFG_EDMI "EDMI"
-#define ZBEE_MFG_CYAN "Cyan Ltd."
-#define ZBEE_MFG_SYS_SPA "System SPA"
-#define ZBEE_MFG_TELIT "Telit"
-
-#define ZBEE_MFG_KAGA "Kaga Electronics"
-#define ZBEE_MFG_4_NOKS "4-noks s.r.l."
-
-#define ZBEE_MFG_PROFILE_SYS "Profile Systems LLC"
-/**/
-#define ZBEE_MFG_FREESTYLE "Freestyle Energy Ltd"
-/**/
-#define ZBEE_MFG_REMOTE "Remote Technology, Inc."
-#define ZBEE_MFG_WAVECOM "Wavecom S.A."
-#define ZBEE_MFG_ENERGY_OPT "Energy Optimizer Ltd"
-#define ZBEE_MFG_GE "General Electric"
-/**/
-#define ZBEE_MFG_MESHWORKS "MeshWorks Wireless"
-#define ZBEE_MFG_ELLIPS "Ellips B.V."
-/**/
-#define ZBEE_MFG_CEDO "CEDO"
-/**/
-#define ZBEE_MFG_DIGI "Digi"
-/**/
-#define ZBEE_MFG_A_D "A&D Co. Ltd."
-/**/
-#define ZBEE_MFG_CARRIER "Carrier Electronics"
-#define ZBEE_MFG_SYCHIP "SyChip"
-/**/
-#define ZBEE_MFG_PASSIVESYS "PassiveSystems"
+/* Manufacturer Codes for non RF4CE devices */
+#define ZBEE_MFG_CODE_CIRRONET 0x1000
+#define ZBEE_MFG_CODE_CHIPCON 0x1001
+#define ZBEE_MFG_CODE_EMBER 0x1002
+#define ZBEE_MFG_CODE_NTS 0x1003
+#define ZBEE_MFG_CODE_FREESCALE 0x1004
+#define ZBEE_MFG_CODE_IPCOM 0x1005
+#define ZBEE_MFG_CODE_SAN_JUAN 0x1006
+#define ZBEE_MFG_CODE_TUV 0x1007
+#define ZBEE_MFG_CODE_COMPXS 0x1008
+#define ZBEE_MFG_CODE_BM 0x1009
+#define ZBEE_MFG_CODE_AWAREPOINT 0x100a
+#define ZBEE_MFG_CODE_PHILIPS 0x100b
+#define ZBEE_MFG_CODE_LUXOFT 0x100c
+#define ZBEE_MFG_CODE_KORWIN 0x100d
+#define ZBEE_MFG_CODE_1_RF 0x100e
+#define ZBEE_MFG_CODE_STG 0x100f
-#define ZBEE_MFG_G4S_JUSTICE "G4S Justice Services"
-#define ZBEE_MFG_MMB "MMB Research"
+#define ZBEE_MFG_CODE_TELEGESIS 0x1010
+#define ZBEE_MFG_CODE_VISIONIC 0x1011
+#define ZBEE_MFG_CODE_INSTA 0x1012
+#define ZBEE_MFG_CODE_ATALUM 0x1013
+#define ZBEE_MFG_CODE_ATMEL 0x1014
+#define ZBEE_MFG_CODE_DEVELCO 0x1015
+#define ZBEE_MFG_CODE_HONEYWELL1 0x1016
+#define ZBEE_MFG_CODE_RADIO_PULSE 0x1017
+#define ZBEE_MFG_CODE_RENESAS 0x1018
+#define ZBEE_MFG_CODE_XANADU 0x1019
+#define ZBEE_MFG_CODE_NEC 0x101a
+#define ZBEE_MFG_CODE_YAMATAKE 0x101b
+#define ZBEE_MFG_CODE_TENDRIL 0x101c
+#define ZBEE_MFG_CODE_ASSA 0x101d
+#define ZBEE_MFG_CODE_MAXSTREAM 0x101e
+#define ZBEE_MFG_CODE_NEUROCOM 0x101f
+#define ZBEE_MFG_CODE_III 0x1020
+#define ZBEE_MFG_CODE_VANTAGE 0x1021
+#define ZBEE_MFG_CODE_ICONTROL 0x1022
+#define ZBEE_MFG_CODE_RAYMARINE 0x1023
+#define ZBEE_MFG_CODE_LSR 0x1024
+#define ZBEE_MFG_CODE_ONITY 0x1025
+#define ZBEE_MFG_CODE_MONO 0x1026
+#define ZBEE_MFG_CODE_RFT 0x1027
+#define ZBEE_MFG_CODE_ITRON 0x1028
+#define ZBEE_MFG_CODE_TRITECH 0x1029
+#define ZBEE_MFG_CODE_EMBEDIT 0x102a
+#define ZBEE_MFG_CODE_S3C 0x102b
+#define ZBEE_MFG_CODE_SIEMENS 0x102c
+#define ZBEE_MFG_CODE_MINDTECH 0x102d
+#define ZBEE_MFG_CODE_LGE 0x102e
+#define ZBEE_MFG_CODE_MITSUBISHI 0x102f
+
+#define ZBEE_MFG_CODE_JOHNSON 0x1030
+#define ZBEE_MFG_CODE_PRI 0x1031
+#define ZBEE_MFG_CODE_KNICK 0x1032
+#define ZBEE_MFG_CODE_VICONICS 0x1033
+#define ZBEE_MFG_CODE_FLEXIPANEL 0x1034
+#define ZBEE_MFG_CODE_PIASIM 0x1035
+#define ZBEE_MFG_CODE_TRANE 0x1036
+#define ZBEE_MFG_CODE_JENNIC 0x1037
+#define ZBEE_MFG_CODE_LIG 0x1038
+#define ZBEE_MFG_CODE_ALERTME 0x1039
+#define ZBEE_MFG_CODE_DAINTREE 0x103a
+#define ZBEE_MFG_CODE_AIJI 0x103b
+#define ZBEE_MFG_CODE_TEL_ITALIA 0x103c
+#define ZBEE_MFG_CODE_MIKROKRETS 0x103d
+#define ZBEE_MFG_CODE_OKI_SEMI 0x103e
+#define ZBEE_MFG_CODE_NEWPORT 0x103f
+
+#define ZBEE_MFG_CODE_C4 0x1040
+#define ZBEE_MFG_CODE_STM 0x1041
+#define ZBEE_MFG_CODE_ASN 0x1042
+#define ZBEE_MFG_CODE_DCSI 0x1043
+#define ZBEE_MFG_CODE_FRANCE_TEL 0x1044
+#define ZBEE_MFG_CODE_MUNET 0x1045
+#define ZBEE_MFG_CODE_AUTANI 0x1046
+#define ZBEE_MFG_CODE_COL_VNET 0x1047
+#define ZBEE_MFG_CODE_AEROCOMM 0x1048
+#define ZBEE_MFG_CODE_SI_LABS 0x1049
+#define ZBEE_MFG_CODE_INNCOM 0x104a
+#define ZBEE_MFG_CODE_CANNON 0x104b
+#define ZBEE_MFG_CODE_SYNAPSE 0x104c
+#define ZBEE_MFG_CODE_FPS 0x104d
+#define ZBEE_MFG_CODE_CLS 0x104e
+#define ZBEE_MFG_CODE_CRANE 0x104F
+
+#define ZBEE_MFG_CODE_MOBILARM 0x1050
+#define ZBEE_MFG_CODE_IMONITOR 0x1051
+#define ZBEE_MFG_CODE_BARTECH 0x1052
+#define ZBEE_MFG_CODE_MESHNETICS 0x1053
+#define ZBEE_MFG_CODE_LS_IND 0x1054
+#define ZBEE_MFG_CODE_CASON 0x1055
+#define ZBEE_MFG_CODE_WLESS_GLUE 0x1056
+#define ZBEE_MFG_CODE_ELSTER 0x1057
+#define ZBEE_MFG_CODE_SMS_TEC 0x1058
+#define ZBEE_MFG_CODE_ONSET 0x1059
+#define ZBEE_MFG_CODE_RIGA 0x105a
+#define ZBEE_MFG_CODE_ENERGATE 0x105b
+#define ZBEE_MFG_CODE_CONMED 0x105c
+#define ZBEE_MFG_CODE_POWERMAND 0x105d
+#define ZBEE_MFG_CODE_SCHNEIDER 0x105e
+#define ZBEE_MFG_CODE_EATON 0x105f
+
+#define ZBEE_MFG_CODE_TELULAR 0x1060
+#define ZBEE_MFG_CODE_DELPHI 0x1061
+#define ZBEE_MFG_CODE_EPISENSOR 0x1062
+#define ZBEE_MFG_CODE_LANDIS_GYR 0x1063
+#define ZBEE_MFG_CODE_KABA 0x1064
+#define ZBEE_MFG_CODE_SHURE 0x1065
+#define ZBEE_MFG_CODE_COMVERGE 0x1066
+#define ZBEE_MFG_CODE_DBS_LODGING 0x1067
+#define ZBEE_MFG_CODE_ENERGY_AWARE 0x1068
+#define ZBEE_MFG_CODE_HIDALGO 0x1069
+#define ZBEE_MFG_CODE_AIR2APP 0x106a
+#define ZBEE_MFG_CODE_AMX 0x106b
+#define ZBEE_MFG_CODE_EDMI 0x106c
+#define ZBEE_MFG_CODE_CYAN 0x106d
+#define ZBEE_MFG_CODE_SYS_SPA 0x106e
+#define ZBEE_MFG_CODE_TELIT 0x106f
+
+#define ZBEE_MFG_CODE_KAGA 0x1070
+#define ZBEE_MFG_CODE_4_NOKS 0x1071
+#define ZBEE_MFG_CODE_CERTICOM 0x1072
+#define ZBEE_MFG_CODE_GRIDPOINT 0x1073
+#define ZBEE_MFG_CODE_PROFILE_SYS 0x1074
+#define ZBEE_MFG_CODE_COMPACTA 0x1075
+#define ZBEE_MFG_CODE_FREESTYLE 0x1076
+#define ZBEE_MFG_CODE_ALEKTRONA 0x1077
+#define ZBEE_MFG_CODE_COMPUTIME 0x1078
+#define ZBEE_MFG_CODE_REMOTE_TECH 0x1079
+#define ZBEE_MFG_CODE_WAVECOM 0x107a
+#define ZBEE_MFG_CODE_ENERGY 0x107b
+#define ZBEE_MFG_CODE_GE 0x107c
+#define ZBEE_MFG_CODE_JETLUN 0x107d
+#define ZBEE_MFG_CODE_CIPHER 0x107e
+#define ZBEE_MFG_CODE_CORPORATE 0x107f
+
+#define ZBEE_MFG_CODE_ECOBEE 0x1080
+#define ZBEE_MFG_CODE_SMK 0x1081
+#define ZBEE_MFG_CODE_MESHWORKS 0x1082
+#define ZBEE_MFG_CODE_ELLIPS 0x1083
+#define ZBEE_MFG_CODE_SECURE 0x1084
+#define ZBEE_MFG_CODE_CEDO 0x1085
+#define ZBEE_MFG_CODE_TOSHIBA 0x1086
+#define ZBEE_MFG_CODE_DIGI 0x1087
+#define ZBEE_MFG_CODE_UBILOGIX 0x1088
+#define ZBEE_MFG_CODE_ECHELON 0x1089
+/* */
+
+#define ZBEE_MFG_CODE_GREEN_ENERGY 0x1090
+#define ZBEE_MFG_CODE_SILVER_SPRING 0x1091
+#define ZBEE_MFG_CODE_BLACK 0x1092
+#define ZBEE_MFG_CODE_AZTECH_ASSOC 0x1093
+#define ZBEE_MFG_CODE_A_AND_D 0x1094
+#define ZBEE_MFG_CODE_RAINFOREST 0x1095
+#define ZBEE_MFG_CODE_CARRIER 0x1096
+#define ZBEE_MFG_CODE_SYCHIP 0x1097
+#define ZBEE_MFG_CODE_OPEN_PEAK 0x1098
+#define ZBEE_MFG_CODE_PASSIVE 0x1099
+#define ZBEE_MFG_CODE_MMB 0x109a
+#define ZBEE_MFG_CODE_LEVITON 0x109b
+#define ZBEE_MFG_CODE_KOREA_ELEC 0x109c
+#define ZBEE_MFG_CODE_COMCAST1 0x109d
+#define ZBEE_MFG_CODE_NEC_ELEC 0x109e
+#define ZBEE_MFG_CODE_NETVOX 0x109f
+
+#define ZBEE_MFG_CODE_UCONTROL 0x10a0
+#define ZBEE_MFG_CODE_EMBEDIA 0x10a1
+#define ZBEE_MFG_CODE_SENSUS 0x10a2
+#define ZBEE_MFG_CODE_SUNRISE 0x10a3
+#define ZBEE_MFG_CODE_MEMTECH 0x10a4
+#define ZBEE_MFG_CODE_FREEBOX 0x10a5
+#define ZBEE_MFG_CODE_M2_LABS 0x10a6
+#define ZBEE_MFG_CODE_BRITISH_GAS 0x10a7
+#define ZBEE_MFG_CODE_SENTEC 0x10a8
+#define ZBEE_MFG_CODE_NAVETAS 0x10a9
+#define ZBEE_MFG_CODE_LIGHTSPEED 0x10aa
+#define ZBEE_MFG_CODE_OKI 0x10ab
+#define ZBEE_MFG_CODE_SISTEMAS 0x10ac
+#define ZBEE_MFG_CODE_DOMETIC 0x10ad
+#define ZBEE_MFG_CODE_APLS 0x10ae
+#define ZBEE_MFG_CODE_ENERGY_HUB 0x10af
+
+#define ZBEE_MFG_CODE_KAMSTRUP 0x10b0
+#define ZBEE_MFG_CODE_ECHOSTAR 0x10b1
+#define ZBEE_MFG_CODE_ENERNOC 0x10b2
+#define ZBEE_MFG_CODE_ELTAV 0x10b3
+#define ZBEE_MFG_CODE_BELKIN 0x10b4
+#define ZBEE_MFG_CODE_XSTREAMHD 0x10b5
+#define ZBEE_MFG_CODE_SATURN_SOUTH 0x10b6
+#define ZBEE_MFG_CODE_GREENTRAP 0x10b7
+#define ZBEE_MFG_CODE_SMARTSYNCH 0x10b8
+#define ZBEE_MFG_CODE_NYCE 0x10b9
+#define ZBEE_MFG_CODE_ICM_CONTROLS 0x10ba
+#define ZBEE_MFG_CODE_MILLENNIUM 0x10bb
+#define ZBEE_MFG_CODE_MOTOROLA 0x10bc
+#define ZBEE_MFG_CODE_EMERSON 0x10bd
+#define ZBEE_MFG_CODE_RADIO_THERMOSTAT 0x10be
+#define ZBEE_MFG_CODE_OMRON 0x10bf
+
+#define ZBEE_MFG_CODE_GIINII 0x10c0
+#define ZBEE_MFG_CODE_FUJITSU 0x10c1
+#define ZBEE_MFG_CODE_PEEL 0x10c2
+#define ZBEE_MFG_CODE_ACCENT 0x10c3
+#define ZBEE_MFG_CODE_BYTESNAP 0x10c4
+#define ZBEE_MFG_CODE_NEC_TOKIN 0x10c5
+#define ZBEE_MFG_CODE_G4S_JUSTICE 0x10c6
+#define ZBEE_MFG_CODE_TRILLIANT 0x10c7
+#define ZBEE_MFG_CODE_ELECTROLUX 0x10c8
+#define ZBEE_MFG_CODE_ONZO 0x10c9
+#define ZBEE_MFG_CODE_ENTEK 0x10ca
+#define ZBEE_MFG_CODE_PHILIPS2 0x10cb
+#define ZBEE_MFG_CODE_MAINSTREAM 0x10cc
+#define ZBEE_MFG_CODE_INDESIT 0x10cd
+#define ZBEE_MFG_CODE_THINKECO 0x10ce
+#define ZBEE_MFG_CODE_2D2C 0x10cf
+
+#define ZBEE_MFG_CODE_GREENPEAK 0x10d0
+#define ZBEE_MFG_CODE_INTERCEL 0x10d1
+#define ZBEE_MFG_CODE_LG 0x10d2
+#define ZBEE_MFG_CODE_MITSUMI1 0x10d3
+#define ZBEE_MFG_CODE_MITSUMI2 0x10d4
+#define ZBEE_MFG_CODE_ZENTRUM 0x10d5
+#define ZBEE_MFG_CODE_NEST 0x10d6
+#define ZBEE_MFG_CODE_EXEGIN 0x10d7
+#define ZBEE_MFG_CODE_HONEYWELL2 0x10d8
+#define ZBEE_MFG_CODE_TAKAHATA 0x10d9
+#define ZBEE_MFG_CODE_SUMITOMO 0x10da
+#define ZBEE_MFG_CODE_GE_ENERGY 0x10db
+#define ZBEE_MFG_CODE_GE_APPLIANCES 0x10dc
+#define ZBEE_MFG_CODE_RADIOCRAFTS 0x10dd
+#define ZBEE_MFG_CODE_CEIVA 0x10de
+#define ZBEE_MFG_CODE_TEC_CO 0x10df
+
+#define ZBEE_MFG_CODE_CHAMELEON 0x10e0
+#define ZBEE_MFG_CODE_SAMSUNG 0x10e1
+#define ZBEE_MFG_CODE_RUWIDO 0x10e2
+#define ZBEE_MFG_CODE_HUAWEI_1 0x10e3
+#define ZBEE_MFG_CODE_HUAWEI_2 0x10e4
+#define ZBEE_MFG_CODE_GREENWAVE 0x10e5
+#define ZBEE_MFG_CODE_BGLOBAL 0x10e6
+#define ZBEE_MFG_CODE_MINDTECK 0x10e7
+#define ZBEE_MFG_CODE_INGERSOLL_RAND 0x10e8
+#define ZBEE_MFG_CODE_DIUS 0x10e9
+#define ZBEE_MFG_CODE_EMBEDDED 0x10ea
+#define ZBEE_MFG_CODE_ABB 0x10eb
+#define ZBEE_MFG_CODE_SONY 0x10ec
+#define ZBEE_MFG_CODE_GENUS 0x10ed
+#define ZBEE_MFG_CODE_EMBEDDED 0x10ea
+#define ZBEE_MFG_CODE_ABB 0x10eb
+#define ZBEE_MFG_CODE_SONY 0x10ec
+#define ZBEE_MFG_CODE_GENUS 0x10ed
+#define ZBEE_MFG_CODE_UNIVERSAL1 0x10ee
+#define ZBEE_MFG_CODE_UNIVERSAL2 0x10ef
+#define ZBEE_MFG_CODE_METRUM 0x10f0
+#define ZBEE_MFG_CODE_CISCO 0x10f1
+#define ZBEE_MFG_CODE_UBISYS 0x10f2
+#define ZBEE_MFG_CODE_CONSERT 0x10f3
+#define ZBEE_MFG_CODE_CRESTRON 0x10f4
+#define ZBEE_MFG_CODE_ENPHASE 0x10f5
+#define ZBEE_MFG_CODE_INVENSYS 0x10f6
+#define ZBEE_MFG_CODE_MUELLER 0x10f7
+#define ZBEE_MFG_CODE_AAC_TECH 0x10f8
+#define ZBEE_MFG_CODE_U_NEXT 0x10f9
+#define ZBEE_MFG_CODE_STEELCASE 0x10fa
+#define ZBEE_MFG_CODE_TELEMATICS 0x10fb
+#define ZBEE_MFG_CODE_SAMIL 0x10fc
+#define ZBEE_MFG_CODE_PACE 0x10fd
+#define ZBEE_MFG_CODE_OSBORNE 0x10fe
+#define ZBEE_MFG_CODE_POWERWATCH 0x10ff
+#define ZBEE_MFG_CODE_CANDELED 0x1100
+#define ZBEE_MFG_CODE_FLEXGRID 0x1101
+#define ZBEE_MFG_CODE_HUMAX 0x1102
+#define ZBEE_MFG_CODE_UNIVERSAL 0x1103
+#define ZBEE_MFG_CODE_ADVANCED_ENERGY 0x1104
+#define ZBEE_MFG_CODE_BEGA 0x1105
+#define ZBEE_MFG_CODE_BRUNEL 0x1106
+#define ZBEE_MFG_CODE_PANASONIC 0x1107
+#define ZBEE_MFG_CODE_ESYSTEMS 0x1108
+#define ZBEE_MFG_CODE_PANAMAX 0x1109
+#define ZBEE_MFG_CODE_PHYSICAL 0x110a
+#define ZBEE_MFG_CODE_EM_LITE 0x110b
+#define ZBEE_MFG_CODE_OSRAM 0x110c
+#define ZBEE_MFG_CODE_2_SAVE 0x110d
+#define ZBEE_MFG_CODE_PLANET 0x110e
+#define ZBEE_MFG_CODE_AMBIENT 0x110f
+#define ZBEE_MFG_CODE_PROFALUX 0x1110
+#define ZBEE_MFG_CODE_BILLION 0x1111
+#define ZBEE_MFG_CODE_EMBERTEC 0x1112
+#define ZBEE_MFG_CODE_IT_WATCHDOGS 0x1113
+#define ZBEE_MFG_CODE_RELOC 0x1114
+#define ZBEE_MFG_CODE_INTEL 0x1115
+#define ZBEE_MFG_CODE_TREND 0x1116
+#define ZBEE_MFG_CODE_MOXA 0x1117
+#define ZBEE_MFG_CODE_QEES 0x1118
+#define ZBEE_MFG_CODE_SAYME 0x1119
+#define ZBEE_MFG_CODE_PENTAIR 0x111a
+#define ZBEE_MFG_CODE_ORBIT 0x111b
+#define ZBEE_MFG_CODE_CALIFORNIA 0x111c
+#define ZBEE_MFG_CODE_COMCAST2 0x111d
+#define ZBEE_MFG_CODE_IDT 0x111e
+#define ZBEE_MFG_CODE_PIXELA 0x111f
+#define ZBEE_MFG_CODE_TIVO 0x1120
+#define ZBEE_MFG_CODE_FIDURE 0x1121
+#define ZBEE_MFG_CODE_MARVELL 0x1122
+#define ZBEE_MFG_CODE_WASION 0x1123
+#define ZBEE_MFG_CODE_JASCO 0x1124
+#define ZBEE_MFG_CODE_SHENZHEN 0x1125
+#define ZBEE_MFG_CODE_NETCOMM 0x1126
+#define ZBEE_MFG_CODE_DEFINE 0x1127
+#define ZBEE_MFG_CODE_IN_HOME_DISP 0x1128
+#define ZBEE_MFG_CODE_MIELE 0x1129
+#define ZBEE_MFG_CODE_TELEVES 0x112a
+#define ZBEE_MFG_CODE_LABELEC 0x112b
+#define ZBEE_MFG_CODE_CHINA_ELEC 0x112c
+#define ZBEE_MFG_CODE_VECTORFORM 0x112d
+#define ZBEE_MFG_CODE_BUSCH_JAEGER 0x112e
+#define ZBEE_MFG_CODE_REDPINE 0x112f
+#define ZBEE_MFG_CODE_BRIDGES 0x1130
+#define ZBEE_MFG_CODE_SERCOMM 0x1131
+#define ZBEE_MFG_CODE_WSH 0x1132
+#define ZBEE_MFG_CODE_BOSCH 0x1133
+#define ZBEE_MFG_CODE_EZEX 0x1134
+#define ZBEE_MFG_CODE_DRESDEN 0x1135
+#define ZBEE_MFG_CODE_MEAZON 0x1136
+#define ZBEE_MFG_CODE_CROW 0x1137
+#define ZBEE_MFG_CODE_HARVARD 0x1138
+#define ZBEE_MFG_CODE_ANDSON 0x1139
+#define ZBEE_MFG_CODE_ADHOCO 0x113a
+#define ZBEE_MFG_CODE_WAXMAN 0x113b
+#define ZBEE_MFG_CODE_OWON 0x113c
+#define ZBEE_MFG_CODE_HITRON 0x113d
+#define ZBEE_MFG_CODE_SCEMTEC 0x113e
+#define ZBEE_MFG_CODE_WEBEE 0x113f
+#define ZBEE_MFG_CODE_GRID2HOME 0x1140
+#define ZBEE_MFG_CODE_TELINK 0x1141
+#define ZBEE_MFG_CODE_JASMINE 0x1142
+#define ZBEE_MFG_CODE_BIDGELY 0x1143
+#define ZBEE_MFG_CODE_LUTRON 0x1144
+#define ZBEE_MFG_CODE_IJENKO 0x1145
+#define ZBEE_MFG_CODE_STARFIELD 0x1146
+#define ZBEE_MFG_CODE_TCP 0x1147
+#define ZBEE_MFG_CODE_ROGERS 0x1148
+#define ZBEE_MFG_CODE_CREE 0x1149
+#define ZBEE_MFG_CODE_ROBERT_BOSCH 0x114a
+#define ZBEE_MFG_CODE_IBIS 0x114b
+#define ZBEE_MFG_CODE_QUIRKY 0x114c
+#define ZBEE_MFG_CODE_EFERGY 0x114d
+#define ZBEE_MFG_CODE_SMARTLABS 0x114e
+#define ZBEE_MFG_CODE_EVERSPRING 0x114f
+#define ZBEE_MFG_CODE_SWANN 0x1150
+
+/* Manufacturer Names */
+#define ZBEE_MFG_CIRRONET "Cirronet"
+#define ZBEE_MFG_CHIPCON "Chipcon"
+#define ZBEE_MFG_EMBER "Ember"
+#define ZBEE_MFG_NTS "National Tech"
+#define ZBEE_MFG_FREESCALE "Freescale"
+#define ZBEE_MFG_IPCOM "IPCom"
+#define ZBEE_MFG_SAN_JUAN "San Juan Software"
+#define ZBEE_MFG_TUV "TUV"
+#define ZBEE_MFG_COMPXS "CompXs"
+#define ZBEE_MFG_BM "BM SpA"
+#define ZBEE_MFG_AWAREPOINT "AwarePoint"
+#define ZBEE_MFG_PHILIPS "Philips"
+#define ZBEE_MFG_LUXOFT "Luxoft"
+#define ZBEE_MFG_KORWIN "Korvin"
+#define ZBEE_MFG_1_RF "One RF"
+#define ZBEE_MFG_STG "Software Technology Group"
+#define ZBEE_MFG_TELEGESIS "Telegesis"
+#define ZBEE_MFG_VISIONIC "Visionic"
+#define ZBEE_MFG_INSTA "Insta"
+#define ZBEE_MFG_ATALUM "Atalum"
+#define ZBEE_MFG_ATMEL "Atmel"
+#define ZBEE_MFG_DEVELCO "Develco"
+#define ZBEE_MFG_HONEYWELL "Honeywell"
+#define ZBEE_MFG_RADIO_PULSE "RadioPulse"
+#define ZBEE_MFG_RENESAS "Renesas"
+#define ZBEE_MFG_XANADU "Xanadu Wireless"
+#define ZBEE_MFG_NEC "NEC Engineering"
+#define ZBEE_MFG_YAMATAKE "Yamatake"
+#define ZBEE_MFG_TENDRIL "Tendril"
+#define ZBEE_MFG_ASSA "Assa Abloy"
+#define ZBEE_MFG_MAXSTREAM "Maxstream"
+#define ZBEE_MFG_NEUROCOM "Neurocom"
+
+#define ZBEE_MFG_III "Institute for Information Industry"
+#define ZBEE_MFG_VANTAGE "Vantage Controls"
+#define ZBEE_MFG_ICONTROL "iControl"
+#define ZBEE_MFG_RAYMARINE "Raymarine"
+#define ZBEE_MFG_LSR "LS Research"
+#define ZBEE_MFG_ONITY "Onity"
+#define ZBEE_MFG_MONO "Mono Products"
+#define ZBEE_MFG_RFT "RF Tech"
+#define ZBEE_MFG_ITRON "Itron"
+#define ZBEE_MFG_TRITECH "Tritech"
+#define ZBEE_MFG_EMBEDIT "Embedit"
+#define ZBEE_MFG_S3C "S3C"
+#define ZBEE_MFG_SIEMENS "Siemens"
+#define ZBEE_MFG_MINDTECH "Mindtech"
+#define ZBEE_MFG_LGE "LG Electronics"
+#define ZBEE_MFG_MITSUBISHI "Mitsubishi"
+#define ZBEE_MFG_JOHNSON "Johnson Controls"
+#define ZBEE_MFG_PRI "PRI"
+#define ZBEE_MFG_KNICK "Knick"
+#define ZBEE_MFG_VICONICS "Viconics"
+#define ZBEE_MFG_FLEXIPANEL "Flexipanel"
+#define ZBEE_MFG_PIASIM "Piasim Corporation"
+#define ZBEE_MFG_TRANE "Trane"
+#define ZBEE_MFG_JENNIC "Jennic"
+#define ZBEE_MFG_LIG "Living Independently"
+#define ZBEE_MFG_ALERTME "AlertMe"
+#define ZBEE_MFG_DAINTREE "Daintree"
+#define ZBEE_MFG_AIJI "Aiji"
+#define ZBEE_MFG_TEL_ITALIA "Telecom Italia"
+#define ZBEE_MFG_MIKROKRETS "Mikrokrets"
+#define ZBEE_MFG_OKI_SEMI "Oki Semi"
+#define ZBEE_MFG_NEWPORT "Newport Electronics"
+#define ZBEE_MFG_C4 "Control4"
+#define ZBEE_MFG_STM "STMicro"
+#define ZBEE_MFG_ASN "Ad-Sol Nissin"
+#define ZBEE_MFG_DCSI "DCSI"
+#define ZBEE_MFG_FRANCE_TEL "France Telecom"
+#define ZBEE_MFG_MUNET "muNet"
+#define ZBEE_MFG_AUTANI "Autani"
+#define ZBEE_MFG_COL_VNET "Colorado vNet"
+#define ZBEE_MFG_AEROCOMM "Aerocomm"
+#define ZBEE_MFG_SI_LABS "Silicon Labs"
+#define ZBEE_MFG_INNCOM "Inncom"
+#define ZBEE_MFG_CANNON "Cannon"
+#define ZBEE_MFG_SYNAPSE "Synapse"
+#define ZBEE_MFG_FPS "Fisher Pierce/Sunrise"
+#define ZBEE_MFG_CLS "CentraLite"
+#define ZBEE_MFG_CRANE "Crane"
+#define ZBEE_MFG_MOBILARM "Mobilarm"
+#define ZBEE_MFG_IMONITOR "iMonitor"
+#define ZBEE_MFG_BARTECH "Bartech"
+#define ZBEE_MFG_MESHNETICS "Meshnetics"
+#define ZBEE_MFG_LS_IND "LS Industrial"
+#define ZBEE_MFG_CASON "Cason"
+#define ZBEE_MFG_WLESS_GLUE "Wireless Glue"
+#define ZBEE_MFG_ELSTER "Elster"
+#define ZBEE_MFG_SMS_TEC "SMS Tec"
+#define ZBEE_MFG_ONSET "Onset Computer"
+#define ZBEE_MFG_RIGA "Riga Development"
+#define ZBEE_MFG_ENERGATE "Energate"
+#define ZBEE_MFG_CONMED "ConMed Linvatec"
+#define ZBEE_MFG_POWERMAND "PowerMand"
+#define ZBEE_MFG_SCHNEIDER "Schneider Electric"
+#define ZBEE_MFG_EATON "Eaton"
+#define ZBEE_MFG_TELULAR "Telular"
+#define ZBEE_MFG_DELPHI "Delphi Medical"
+#define ZBEE_MFG_EPISENSOR "EpiSensor"
+#define ZBEE_MFG_LANDIS_GYR "Landis+Gyr"
+#define ZBEE_MFG_KABA "Kaba Group"
+#define ZBEE_MFG_SHURE "Shure"
+#define ZBEE_MFG_COMVERGE "Comverge"
+#define ZBEE_MFG_DBS_LODGING "DBS Lodging"
+#define ZBEE_MFG_ENERGY_AWARE "Energy Aware"
+#define ZBEE_MFG_HIDALGO "Hidalgo"
+#define ZBEE_MFG_AIR2APP "Air2App"
+#define ZBEE_MFG_AMX "AMX"
+#define ZBEE_MFG_EDMI "EDMI Pty"
+#define ZBEE_MFG_CYAN "Cyan Ltd"
+#define ZBEE_MFG_SYS_SPA "System SPA"
+#define ZBEE_MFG_TELIT "Telit"
+#define ZBEE_MFG_KAGA "Kaga Electronics"
+#define ZBEE_MFG_4_NOKS "4-noks s.r.l."
+#define ZBEE_MFG_CERTICOM "Certicom"
+#define ZBEE_MFG_GRIDPOINT "Gridpoint"
+#define ZBEE_MFG_PROFILE_SYS "Profile Systems"
+#define ZBEE_MFG_COMPACTA "Compacta International"
+#define ZBEE_MFG_FREESTYLE "Freestyle Technology"
+#define ZBEE_MFG_ALEKTRONA "Alektrona"
+#define ZBEE_MFG_COMPUTIME "Computime"
+#define ZBEE_MFG_REMOTE_TECH "Remote Technologies"
+#define ZBEE_MFG_WAVECOM "Wavecom"
+#define ZBEE_MFG_ENERGY "Energy Optimizers"
+#define ZBEE_MFG_GE "GE"
+#define ZBEE_MFG_JETLUN "Jetlun"
+#define ZBEE_MFG_CIPHER "Cipher Systems"
+#define ZBEE_MFG_CORPORATE "Corporate Systems Eng"
+#define ZBEE_MFG_ECOBEE "ecobee"
+#define ZBEE_MFG_SMK "SMK"
+#define ZBEE_MFG_MESHWORKS "Meshworks Wireless"
+#define ZBEE_MFG_ELLIPS "Ellips B.V."
+#define ZBEE_MFG_SECURE "Secure electrans"
+#define ZBEE_MFG_CEDO "CEDO"
+#define ZBEE_MFG_TOSHIBA "Toshiba"
+#define ZBEE_MFG_DIGI "Digi International"
+#define ZBEE_MFG_UBILOGIX "Ubilogix"
+#define ZBEE_MFG_ECHELON "Echelon"
+#define ZBEE_MFG_GREEN_ENERGY "Green Energy Options"
+#define ZBEE_MFG_SILVER_SPRING "Silver Spring Networks"
+#define ZBEE_MFG_BLACK "Black & Decker"
+#define ZBEE_MFG_AZTECH_ASSOC "Aztech AssociatesInc."
+#define ZBEE_MFG_A_AND_D "A&D Co"
+#define ZBEE_MFG_RAINFOREST "Rainforest Automation"
+#define ZBEE_MFG_CARRIER "Carrier Electronics"
+#define ZBEE_MFG_SYCHIP "SyChip/Murata"
+#define ZBEE_MFG_OPEN_PEAK "OpenPeak"
+#define ZBEE_MFG_PASSIVE "Passive Systems"
+#define ZBEE_MFG_G4S_JUSTICE "G4S JusticeServices"
+#define ZBEE_MFG_MMB "MMBResearch"
+#define ZBEE_MFG_LEVITON "Leviton"
+#define ZBEE_MFG_KOREA_ELEC "Korea Electric Power Data Network"
+#define ZBEE_MFG_COMCAST "Comcast"
+#define ZBEE_MFG_NEC_ELEC "NEC Electronics"
+#define ZBEE_MFG_NETVOX "Netvox"
+#define ZBEE_MFG_UCONTROL "U-Control"
+#define ZBEE_MFG_EMBEDIA "Embedia Technologies"
+#define ZBEE_MFG_SENSUS "Sensus"
+#define ZBEE_MFG_SUNRISE "SunriseTechnologies"
+#define ZBEE_MFG_MEMTECH "MemtechCorp"
+#define ZBEE_MFG_FREEBOX "Freebox"
+#define ZBEE_MFG_M2_LABS "M2 Labs"
+#define ZBEE_MFG_BRITISH_GAS "BritishGas"
+#define ZBEE_MFG_SENTEC "Sentec"
+#define ZBEE_MFG_NAVETAS "Navetas"
+#define ZBEE_MFG_LIGHTSPEED "Lightspeed Technologies"
+#define ZBEE_MFG_OKI "Oki Electric"
+#define ZBEE_MFG_SISTEMAS "Sistemas Inteligentes"
+#define ZBEE_MFG_DOMETIC "Dometic"
+#define ZBEE_MFG_APLS "Alps"
+#define ZBEE_MFG_ENERGY_HUB "EnergyHub"
+#define ZBEE_MFG_KAMSTRUP "Kamstrup"
+#define ZBEE_MFG_ECHOSTAR "EchoStar"
+#define ZBEE_MFG_ENERNOC "EnerNOC"
+#define ZBEE_MFG_ELTAV "Eltav"
+#define ZBEE_MFG_BELKIN "Belkin"
+#define ZBEE_MFG_XSTREAMHD "XStreamHD Wireless"
+#define ZBEE_MFG_SATURN_SOUTH "Saturn South"
+#define ZBEE_MFG_GREENTRAP "GreenTrapOnline"
+#define ZBEE_MFG_SMARTSYNCH "SmartSynch"
+#define ZBEE_MFG_NYCE "Nyce Control"
+#define ZBEE_MFG_ICM_CONTROLS "ICM Controls"
+#define ZBEE_MFG_MILLENNIUM "Millennium Electronics"
+#define ZBEE_MFG_MOTOROLA "Motorola"
+#define ZBEE_MFG_EMERSON "EmersonWhite-Rodgers"
+#define ZBEE_MFG_RADIO_THERMOSTAT "Radio Thermostat"
+#define ZBEE_MFG_OMRON "OMRONCorporation"
+#define ZBEE_MFG_GIINII "GiiNii GlobalLimited"
+#define ZBEE_MFG_FUJITSU "Fujitsu GeneralLimited"
+#define ZBEE_MFG_PEEL "Peel Technologies"
+#define ZBEE_MFG_ACCENT "Accent"
+#define ZBEE_MFG_BYTESNAP "ByteSnap Design"
+#define ZBEE_MFG_NEC_TOKIN "NEC TOKIN Corporation"
+#define ZBEE_MFG_TRILLIANT "Trilliant Networks"
+#define ZBEE_MFG_ELECTROLUX "Electrolux Italia"
+#define ZBEE_MFG_ONZO "OnzoLtd"
+#define ZBEE_MFG_ENTEK "EnTekSystems"
/**/
-#define ZBEE_MFG_HOME_AUTO "Home Automation Inc."
-/**/
-#define ZBEE_MFG_SUNRISE "Sunrise Technologies"
-#define ZBEE_MFG_MEMTEC "Memtec Corp"
-/**/
-#define ZBEE_MFG_BRITISH_GAS "British Gas"
-#define ZBEE_MFG_SENTEC "Sentec Ltd."
-#define ZBEE_MFG_NAVETAS "Navetas"
-/**/
-#define ZBEE_MFG_ENERNOC "EnerNOC"
-#define ZBEE_MFG_ELTAV "Eltav"
-/**/
-#define ZBEE_MFG_XSTREAMHD "XStreamHD"
-/**/
-#define ZBEE_MFG_GREEN "GreenTrapOnline"
-/**/
-#define ZBEE_MFG_OMRON "Omron Corporation"
-/**/
-#define ZBEE_MFG_PEEL "Peel Technologies"
-/**/
-#define ZBEE_MFG_NEC_TOKIN "NEC TOKIN Corporation"
-/**/
-#define ZBEE_MFG_ELECTROLUX "Electrolux Italia S.p.A"
-/**/
-#define ZBEE_MFG_SAMSUNG "Samsung Electronics Co., Ltd."
-/**/
-#define ZBEE_MFG_MAINSTREAM "Mainstream Engineering"
-#define ZBEE_MFG_INDESIT_C "Indesit Company"
-/**/
-#define ZBEE_MFG_RADIOCRAFTS "Radiocrafts AS"
-/**/
-#define ZBEE_MFG_HUAWEI "Huawei Technologies Co., Ltd."
-/**/
-#define ZBEE_MFG_BGLOBAL "BGlobal Metering Ltd"
-/**/
-#define ZBEE_MFG_ABB "ABB"
-/**/
-#define ZBEE_MFG_GENUS "Genus Power Infrastructures Limited"
-/**/
-#define ZBEE_MFG_RELOC "RELOC"
+#define ZBEE_MFG_MAINSTREAM "MainstreamEngineering"
+#define ZBEE_MFG_INDESIT "IndesitCompany"
+#define ZBEE_MFG_THINKECO "THINKECO"
+#define ZBEE_MFG_2D2C "2D2C"
+#define ZBEE_MFG_GREENPEAK "GreenPeak"
+#define ZBEE_MFG_INTERCEL "InterCEL"
+#define ZBEE_MFG_LG "LG Electronics"
+#define ZBEE_MFG_MITSUMI1 "Mitsumi Electric"
+#define ZBEE_MFG_MITSUMI2 "Mitsumi Electric"
+#define ZBEE_MFG_ZENTRUM "Zentrum Mikroelektronik Dresden"
+#define ZBEE_MFG_NEST "Nest Labs"
+#define ZBEE_MFG_EXEGIN "Exegin Technologies"
+#define ZBEE_MFG_HONEYWELL "Honeywell"
+#define ZBEE_MFG_TAKAHATA "Takahata Precision"
+#define ZBEE_MFG_SUMITOMO "Sumitomo Electric Networks"
+#define ZBEE_MFG_GE_ENERGY "GE Energy"
+#define ZBEE_MFG_GE_APPLIANCES "GE Appliances"
+#define ZBEE_MFG_RADIOCRAFTS "Radiocrafts AS"
+#define ZBEE_MFG_CEIVA "Ceiva"
+#define ZBEE_MFG_TEC_CO "TEC CO Co., Ltd"
+#define ZBEE_MFG_CHAMELEON "Chameleon Technology (UK) Ltd"
+#define ZBEE_MFG_SAMSUNG "Samsung"
+#define ZBEE_MFG_RUWIDO "ruwido austria gmbh"
+#define ZBEE_MFG_HUAWEI "Huawei Technologies Co., Ltd."
+#define ZBEE_MFG_GREENWAVE "Greenwave Reality"
+#define ZBEE_MFG_BGLOBAL "BGlobal Metering Ltd"
+#define ZBEE_MFG_MINDTECK "Mindteck"
+#define ZBEE_MFG_INGERSOLL_RAND "Ingersoll-Rand"
+#define ZBEE_MFG_DIUS "Dius Computing Pty Ltd"
+#define ZBEE_MFG_EMBEDDED "Embedded Automation, Inc."
+#define ZBEE_MFG_ABB "ABB"
+#define ZBEE_MFG_SONY "Sony"
+#define ZBEE_MFG_GENUS "Genus Power Infrastructures Limited"
+#define ZBEE_MFG_UNIVERSA L "Universal Electronics, Inc."
+#define ZBEE_MFG_METRUM "Metrum Technologies, LLC"
+#define ZBEE_MFG_CISCO "Cisco"
+#define ZBEE_MFG_UBISYS "Ubisys technologies GmbH"
+#define ZBEE_MFG_CONSERT "Consert"
+#define ZBEE_MFG_CRESTRON "Crestron Electronics"
+#define ZBEE_MFG_ENPHASE "Enphase Energy"
+#define ZBEE_MFG_INVENSYS "Invensys Controls"
+#define ZBEE_MFG_MUELLER "Mueller Systems, LLC"
+#define ZBEE_MFG_AAC_TECH "AAC Technologies Holding"
+#define ZBEE_MFG_U_NEXT "U-NEXT Co., Ltd"
+#define ZBEE_MFG_STEELCASE "Steelcase Inc."
+#define ZBEE_MFG_TELEMATICS "Telematics Wireless"
+#define ZBEE_MFG_SAMIL "Samil Power Co., Ltd"
+#define ZBEE_MFG_PACE "Pace Plc"
+#define ZBEE_MFG_OSBORNE "Osborne Coinage Co."
+#define ZBEE_MFG_POWERWATCH "Powerwatch"
+#define ZBEE_MFG_CANDELED "CANDELED GmbH"
+#define ZBEE_MFG_FLEXGRID "FlexGrid S.R.L"
+#define ZBEE_MFG_HUMAX "Humax"
+#define ZBEE_MFG_UNIVERSAL "Universal Devices"
+#define ZBEE_MFG_ADVANCED_ENERGY "Advanced Energy"
+#define ZBEE_MFG_BEGA "BEGA Gantenbrink-Leuchten"
+#define ZBEE_MFG_BRUNEL "Brunel University"
+#define ZBEE_MFG_PANASONIC "Panasonic R&D Center Singapore"
+#define ZBEE_MFG_ESYSTEMS "eSystems Research"
+#define ZBEE_MFG_PANAMAX "Panamax"
+#define ZBEE_MFG_PHYSICAL "Physical Graph Corporation"
+#define ZBEE_MFG_EM_LITE "EM-Lite Ltd."
+#define ZBEE_MFG_OSRAM "Osram Sylvania"
+#define ZBEE_MFG_2_SAVE "2 Save Energy Ltd."
+#define ZBEE_MFG_PLANET "Planet Innovation Products Pty Ltd"
+#define ZBEE_MFG_AMBIENT "Ambient Devices, Inc."
+#define ZBEE_MFG_PROFALUX "Profalux"
+#define ZBEE_MFG_BILLION "Billion Electric Company (BEC)"
+#define ZBEE_MFG_EMBERTEC "Embertec Pty Ltd"
+#define ZBEE_MFG_IT_WATCHDOGS "IT Watchdogs"
+#define ZBEE_MFG_RELOC "Reloc"
+#define ZBEE_MFG_INTEL "Intel Corporation"
+#define ZBEE_MFG_TREND "Trend Electronics Limited"
+#define ZBEE_MFG_MOXA "Moxa"
+#define ZBEE_MFG_QEES "QEES"
+#define ZBEE_MFG_SAYME "SAYME Wireless Sensor Networks"
+#define ZBEE_MFG_PENTAIR "Pentair Aquatic Systems"
+#define ZBEE_MFG_ORBIT "Orbit Irrigation"
+#define ZBEE_MFG_CALIFORNIA "California Eastern Laboratories"
+#define ZBEE_MFG_COMCAST "Comcast"
+#define ZBEE_MFG_IDT "IDT Technology Limited"
+#define ZBEE_MFG_PIXELA "Pixela"
+#define ZBEE_MFG_TIVO "TiVo"
+#define ZBEE_MFG_FIDURE "Fidure"
+#define ZBEE_MFG_MARVELL "Marvell Semiconductor"
+#define ZBEE_MFG_WASION "Wasion Group"
+#define ZBEE_MFG_JASCO "Jasco Products"
+#define ZBEE_MFG_SHENZHEN "Shenzhen Kaifa Technology"
+#define ZBEE_MFG_NETCOMM "Netcomm Wireless"
+#define ZBEE_MFG_DEFINE "Define Instruments"
+#define ZBEE_MFG_IN_HOME_DISP "In Home Displays"
+#define ZBEE_MFG_MIELE "Miele & Cie. KG"
+#define ZBEE_MFG_TELEVES "Televes S.A."
+#define ZBEE_MFG_LABELEC "Labelec"
+#define ZBEE_MFG_CHINA_ELEC "China Electronics Standardization Institute"
+#define ZBEE_MFG_VECTORFORM "Vectorform"
+#define ZBEE_MFG_BUSCH_JAEGER "Busch-Jaeger Elektro"
+#define ZBEE_MFG_REDPINE "Redpine Signals"
+#define ZBEE_MFG_BRIDGES "Bridges Electronic Technology"
+#define ZBEE_MFG_SERCOMM "Sercomm"
+#define ZBEE_MFG_WSH "WSH GmbH wirsindheller"
+#define ZBEE_MFG_BOSCH "Bosch Security Systems"
+#define ZBEE_MFG_EZEX "eZEX Corporation"
+#define ZBEE_MFG_DRESDEN "Dresden Elektronik Ingenieurtechnik GmbH"
+#define ZBEE_MFG_MEAZON "MEAZON S.A."
+#define ZBEE_MFG_CROW "Crow Electronic Engineering"
+#define ZBEE_MFG_HARVARD "Harvard Engineering"
+#define ZBEE_MFG_ANDSON "Andson(Beijing) Technology"
+#define ZBEE_MFG_ADHOCO "Adhoco AG"
+#define ZBEE_MFG_WAXMAN "Waxman Consumer Products Group"
+#define ZBEE_MFG_OWON "Owon Technology"
+#define ZBEE_MFG_HITRON "Hitron Technologies"
+#define ZBEE_MFG_SCEMTEC "Scemtec Steuerungstechnik GmbH"
+#define ZBEE_MFG_WEBEE "Webee"
+#define ZBEE_MFG_GRID2HOME "Grid2Home"
+#define ZBEE_MFG_TELINK "Telink Micro"
+#define ZBEE_MFG_JASMINE "Jasmine Systems"
+#define ZBEE_MFG_BIDGELY "Bidgely"
+#define ZBEE_MFG_LUTRON "Lutron"
+#define ZBEE_MFG_IJENKO "IJENKO"
+#define ZBEE_MFG_STARFIELD "Starfield Electronic"
+#define ZBEE_MFG_TCP "TCP"
+#define ZBEE_MFG_ROGERS "Rogers Communications Partnership"
+#define ZBEE_MFG_CREE "Cree"
+#define ZBEE_MFG_ROBERT_BOSCH "Robert Bosch"
+#define ZBEE_MFG_IBIS "Ibis Networks"
+#define ZBEE_MFG_QUIRKY "Quirky"
+#define ZBEE_MFG_EFERGY "Efergy Technologies"
+#define ZBEE_MFG_SMARTLABS "Smartlabs"
+#define ZBEE_MFG_EVERSPRING "Everspring Industry"
+#define ZBEE_MFG_SWANN "Swann Communications"
+#define ZBEE_MFG_TI "Texas Instruments"
/* Protocol Abbreviations */
#define ZBEE_PROTOABBREV_NWK "zbee_nwk"
@@ -789,19 +1126,25 @@
#define ZBEE_PROTOABBREV_ZCL_APPLCTRL "zbee_zcl_general.applctrl"
#define ZBEE_PROTOABBREV_ZCL_BASIC "zbee_zcl_general.basic"
#define ZBEE_PROTOABBREV_ZCL_IDENTIFY "zbee_zcl_general.identify"
+#define ZBEE_PROTOABBREV_ZCL_THERMOSTAT "zbee_zcl_hvac.thermostat"
#define ZBEE_PROTOABBREV_ZCL_APPLEVTALT "zbee_zcl_ha.applevtalt"
#define ZBEE_PROTOABBREV_ZCL_APPLIDT "zbee_zcl_ha.applident"
#define ZBEE_PROTOABBREV_ZCL_APPLSTATS "zbee_zcl_ha.applstats"
#define ZBEE_PROTOABBREV_ZCL_METIDT "zbee_zcl_ha.metidt"
+#define ZBEE_PROTOABBREV_ZCL_IAS_ZONE "zbee_zcl_ias.zone"
#define ZBEE_PROTOABBREV_ZCL_ONOFF "zbee_zcl_general.onoff"
#define ZBEE_PROTOABBREV_ZCL_OTA "zbee_zcl_general.ota"
#define ZBEE_PROTOABBREV_ZCL_PART "zbee_zcl_general.part"
+#define ZBEE_PROTOABBREV_ZCL_POLL "zbee_zcl_general.poll"
#define ZBEE_PROTOABBREV_ZCL_PWRPROF "zbee_zcl_general.pwrprof"
#define ZBEE_PROTOABBREV_ZCL_ILLUMMEAS "zbee_zcl_meas_sensing.illummeas"
#define ZBEE_PROTOABBREV_ZCL_PRESSMEAS "zbee_zcl_meas_sensing.pressmeas"
#define ZBEE_PROTOABBREV_ZCL_RELHUMMEAS "zbee_zcl_meas_sensing.relhummeas"
#define ZBEE_PROTOABBREV_ZCL_TEMPMEAS "zbee_zcl_meas_sensing.tempmeas"
+#define ZBEE_PROTOABBREV_ZCL_CAL "zbee_zcl_se.cal"
+#define ZBEE_PROTOABBREV_ZCL_KE "zbee_zcl_se.ke"
#define ZBEE_PROTOABBREV_ZCL_MSG "zbee_zcl_se.msg"
+#define ZBEE_PROTOABBREV_ZCL_TUN "zbee_zcl_se.tun"
/* Helper Functions */
extern guint zbee_get_bit_field(guint input, guint mask);
diff --git a/epan/tfs.c b/epan/tfs.c
index f092590285..769069fd4e 100644
--- a/epan/tfs.c
+++ b/epan/tfs.c
@@ -83,5 +83,6 @@ const true_false_string tfs_included_not_included = { "Included", "Not included"
const true_false_string tfs_allocated_by_receiver_sender = {"allocated by receiver", "allocated by sender"};
const true_false_string tfs_asynchronous_synchronous = { "Asynchronous", "Synchronous" };
const true_false_string tfs_protocol_sensative_bit_transparent = { "Protocol sensitive", "Bit transparent" };
-const true_false_string tfs_full_half = { "Full", "Half" };
+const true_false_string tfs_full_half = { "Full", "Half" };
+const true_false_string tfs_acknowledged_not_acknowledged = { "Acknowledged", "Not Acknowledged" };
diff --git a/epan/tfs.h b/epan/tfs.h
index eb4a89a567..7ba9dea0ca 100644
--- a/epan/tfs.h
+++ b/epan/tfs.h
@@ -32,8 +32,8 @@
/** Struct for boolean enumerations */
typedef struct true_false_string {
- const char *true_string; /**< The string presented when true */
- const char *false_string; /**< The string presented when false */
+ const char *true_string; /**< The string presented when true */
+ const char *false_string; /**< The string presented when false */
} true_false_string;
/*
@@ -95,5 +95,6 @@ WS_DLL_PUBLIC const true_false_string tfs_allocated_by_receiver_sender;
WS_DLL_PUBLIC const true_false_string tfs_asynchronous_synchronous;
WS_DLL_PUBLIC const true_false_string tfs_protocol_sensative_bit_transparent;
WS_DLL_PUBLIC const true_false_string tfs_full_half;
+WS_DLL_PUBLIC const true_false_string tfs_acknowledged_not_acknowledged;
#endif
diff --git a/tools/checkfiltername.pl b/tools/checkfiltername.pl
index f728c9a07e..96d4887079 100755
--- a/tools/checkfiltername.pl
+++ b/tools/checkfiltername.pl
@@ -430,6 +430,8 @@ sub is_from_other_protocol_whitelist {
if (($proto_filename eq "packet-wps.c") && (index($_[0], "eap") >= 0)) {return 1;}
if (($proto_filename eq "packet-wsp.c") && (index($_[0], "wap") >= 0)) {return 1;}
if (($proto_filename eq "packet-xot.c") && (index($_[0], "x25") >= 0)) {return 1;}
+ if (($proto_filename eq "packet-zbee-zcl-misc.c") && (index($_[0], "zbee_zcl_hvac") >= 0)) {return 1;}
+ if (($proto_filename eq "packet-zbee-zcl-misc.c") && (index($_[0], "zbee_zcl_ias") >= 0)) {return 1;}
#Understand why, but I think it could be prefixed with "dissector"
#prefix (which isn't necessarily "protocol")