diff options
Diffstat (limited to 'epan')
-rw-r--r-- | epan/CMakeLists.txt | 1 | ||||
-rw-r--r-- | epan/dissectors/Makefile.common | 1 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-aps.c | 202 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-aps.h | 11 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-nwk.c | 20 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-security.c | 91 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zcl-general.c | 752 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zcl-ha.c | 174 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zcl-meas-sensing.c | 122 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zcl-misc.c | 1115 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zcl-se.c | 1726 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zcl.c | 1360 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zcl.h | 13 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee.h | 1109 | ||||
-rw-r--r-- | epan/tfs.c | 3 | ||||
-rw-r--r-- | epan/tfs.h | 5 |
16 files changed, 4469 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 |