aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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")