summaryrefslogtreecommitdiff
path: root/epan/dissectors/packet-zbee-zcl-general.c
diff options
context:
space:
mode:
authordsrsupport <eugene.exarevsky@dsr-company.com>2016-05-11 11:52:51 +0300
committerAnders Broman <a.broman58@gmail.com>2016-05-19 08:42:39 +0000
commita558178874d4b3ff218010bec4bb1f164ab29995 (patch)
tree9e0f46515b7c716cc5e26082caddccc21bfb34cb /epan/dissectors/packet-zbee-zcl-general.c
parent01830846ef9b81c38482a433cb7471d8c4193d70 (diff)
downloadwireshark-a558178874d4b3ff218010bec4bb1f164ab29995.tar.gz
ZigBee: implemented Green Power ZCL cluster dissector.
Implemented basic Green Power ZCL cluster support and parsing of some GP cluster commands. Implemented following commands parsing: GP_NOTIFICATION GP_COMMISSIONING_NOTIFICATION GP_PAIRING GP_PROXY_COMMISSIONING_MODE GP_RESPONSE That is enough for Green Power Basic Proxy commissioning. Change-Id: Icbe00667a6dfb89346288843ce8fa20d62b822dc Reviewed-on: https://code.wireshark.org/review/15363 Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-zbee-zcl-general.c')
-rw-r--r--epan/dissectors/packet-zbee-zcl-general.c1003
1 files changed, 1003 insertions, 0 deletions
diff --git a/epan/dissectors/packet-zbee-zcl-general.c b/epan/dissectors/packet-zbee-zcl-general.c
index f1dfe8e76b..45bcadf7df 100644
--- a/epan/dissectors/packet-zbee-zcl-general.c
+++ b/epan/dissectors/packet-zbee-zcl-general.c
@@ -12325,6 +12325,1009 @@ proto_reg_handoff_zbee_zcl_poll_ctrl(void)
);
} /*proto_reg_handoff_zbee_zcl_poll_ctrl*/
+
+
+/* ########################################################################## */
+/* #### (0x0021) GREEN POWER CLUSTER ######################################## */
+/* ########################################################################## */
+
+/*************************/
+/* Defines */
+/*************************/
+
+/* Green Power Attributes */
+
+#define ZBEE_ZCL_ATTR_GPS_MAX_SINK_TABLE_ENTRIES 0x0000
+#define ZBEE_ZCL_ATTR_GPS_SINK_TABLE 0x0001
+#define ZBEE_ZCL_ATTR_GPS_COMMUNICATION_MODE 0x0002
+#define ZBEE_ZCL_ATTR_GPS_COMMISSIONING_EXIT_MODE 0x0003
+#define ZBEE_ZCL_ATTR_GPS_COMMISSIONING_WINDOW 0x0004
+#define ZBEE_ZCL_ATTR_GPS_SECURITY_LEVEL 0x0005
+#define ZBEE_ZCL_ATTR_GPS_FUNCTIONALITY 0x0006
+#define ZBEE_ZCL_ATTR_GPS_ACTIVE_FUNCTIONALITY 0x0007
+#define ZBEE_ZCL_ATTR_GPP_MAX_PROXY_TABLE_ENTRIES 0x0010
+#define ZBEE_ZCL_ATTR_GPP_PROXY_TABLE 0x0011
+#define ZBEE_ZCL_ATTR_GPP_NOTIFICATION_RETRY_NUMBER 0x0012
+#define ZBEE_ZCL_ATTR_GPP_NOTIFICATION_RETRY_TIMER 0x0013
+#define ZBEE_ZCL_ATTR_GPP_MAX_SEARCH_COUNTER 0x0014
+#define ZBEE_ZCL_ATTR_GPP_BLOCKED_GPDID 0x0015
+#define ZBEE_ZCL_ATTR_GPP_FUNCTIONALITY 0x0016
+#define ZBEE_ZCL_ATTR_GPP_ACTIVE_FUNCTIONALITY 0x0017
+#define ZBEE_ZCL_ATTR_GP_SHARED_SECURITY_KEY_TYPE 0x0020
+#define ZBEE_ZCL_ATTR_GP_SHARED_SECURITY_KEY 0x0021
+#define ZBEE_ZCL_ATTR_GP_LINK_KEY 0x0022
+
+static const value_string zbee_zcl_gp_attr_names[] = {
+ { ZBEE_ZCL_ATTR_GPS_MAX_SINK_TABLE_ENTRIES, "gpsMaxSinkTableEntries" },
+ { ZBEE_ZCL_ATTR_GPS_SINK_TABLE, "SinkTable" },
+ { ZBEE_ZCL_ATTR_GPS_COMMUNICATION_MODE, "gpsCommunicationMode" },
+ { ZBEE_ZCL_ATTR_GPS_COMMISSIONING_EXIT_MODE, "gpsCommissioningExitMode" },
+ { ZBEE_ZCL_ATTR_GPS_COMMISSIONING_WINDOW, "gpsCommissioningWindow" },
+ { ZBEE_ZCL_ATTR_GPS_SECURITY_LEVEL, "gpsSecurityLevel" },
+ { ZBEE_ZCL_ATTR_GPS_FUNCTIONALITY, "gpsFunctionality" },
+ { ZBEE_ZCL_ATTR_GPS_ACTIVE_FUNCTIONALITY, "gpsActiveFunctionality" },
+ { ZBEE_ZCL_ATTR_GPP_MAX_PROXY_TABLE_ENTRIES, "gppMaxProxyTableEntries" },
+ { ZBEE_ZCL_ATTR_GPP_PROXY_TABLE, "ProxyTable" },
+ { ZBEE_ZCL_ATTR_GPP_NOTIFICATION_RETRY_NUMBER, "gppNotificationRetryNumber" },
+ { ZBEE_ZCL_ATTR_GPP_NOTIFICATION_RETRY_TIMER, "gppNotificationRetryTimer" },
+ { ZBEE_ZCL_ATTR_GPP_MAX_SEARCH_COUNTER, "gppMaxSearchCounter" },
+ { ZBEE_ZCL_ATTR_GPP_BLOCKED_GPDID, "gppBlockedGPDID" },
+ { ZBEE_ZCL_ATTR_GPP_FUNCTIONALITY, "gppFunctionality" },
+ { ZBEE_ZCL_ATTR_GPP_ACTIVE_FUNCTIONALITY, "gppActiveFunctionality" },
+ { ZBEE_ZCL_ATTR_GP_SHARED_SECURITY_KEY_TYPE, "gpSharedSecurityKeyType" },
+ { ZBEE_ZCL_ATTR_GP_SHARED_SECURITY_KEY, "gpSharedSecurityKey" },
+ { ZBEE_ZCL_ATTR_GP_LINK_KEY, "gpLinkKey" },
+ { 0, NULL }
+};
+
+/* Server-to-client command IDs. */
+#define ZBEE_ZCL_CMD_ID_GP_NOTIFICATION_RESPONSE 0x00
+#define ZBEE_ZCL_CMD_ID_GP_PAIRING 0x01
+#define ZBEE_ZCL_CMD_ID_GP_PROXY_COMMISSIONING_MODE 0x02
+#define ZBEE_ZCL_CMD_ID_GP_RESPONSE 0x06
+#define ZBEE_ZCL_CMD_ID_GP_TRANS_TBL_RESPONSE 0x08
+#define ZBEE_ZCL_CMD_ID_GP_SINK_TABLE_RESPONSE 0x0a
+#define ZBEE_ZCL_CMD_ID_GP_PROXY_TABLE_REQUEST 0x0b
+
+static const value_string zbee_zcl_gp_srv_tx_cmd_names[] = {
+ { ZBEE_ZCL_CMD_ID_GP_NOTIFICATION_RESPONSE, "GP Notification Response" },
+ { ZBEE_ZCL_CMD_ID_GP_PAIRING, "GP Pairing" },
+ { ZBEE_ZCL_CMD_ID_GP_PROXY_COMMISSIONING_MODE, "GP Proxy Commissioning Mode" },
+ { ZBEE_ZCL_CMD_ID_GP_RESPONSE, "GP Response" },
+ { ZBEE_ZCL_CMD_ID_GP_TRANS_TBL_RESPONSE, "GP Translation Table Response" },
+ { ZBEE_ZCL_CMD_ID_GP_SINK_TABLE_RESPONSE, "GP Sink Table Response" },
+ { ZBEE_ZCL_CMD_ID_GP_PROXY_TABLE_REQUEST, "GP Proxy Table Request" },
+ { 0, NULL }
+};
+
+/* Client-to-server command IDs. */
+#define ZBEE_CMD_ID_GP_NOTIFICATION 0x00
+#define ZBEE_CMD_ID_GP_PAIRING_SEARCH 0x01
+#define ZBEE_CMD_ID_GP_TUNNELING_STOP 0x03
+#define ZBEE_CMD_ID_GP_COMMISSIONING_NOTIFICATION 0x04
+#define ZBEE_CMD_ID_GP_SINK_COMMISSIONING_MODE 0x05
+#define ZBEE_CMD_ID_GP_TRANSLATION_TABLE_UPDATE_COMMAND 0x07
+#define ZBEE_CMD_ID_GP_TRANSLATION_TABLE_REQUEST 0x08
+#define ZBEE_CMD_ID_GP_PAIRING_CONFIGURATION 0x09
+#define ZBEE_CMD_ID_GP_SINK_TABLE_REQUEST 0x0a
+#define ZBEE_CMD_ID_GP_PROXY_TABLE_RESPONSE 0x0b
+
+static const value_string zbee_zcl_gp_srv_rx_cmd_names[] = {
+ { ZBEE_CMD_ID_GP_NOTIFICATION, "GP Notification" },
+ { ZBEE_CMD_ID_GP_PAIRING_SEARCH, "GP Pairing Search" },
+ { ZBEE_CMD_ID_GP_TUNNELING_STOP, "GP Tunneling Stop" },
+ { ZBEE_CMD_ID_GP_COMMISSIONING_NOTIFICATION, "GP Commissioning Notification" },
+ { ZBEE_CMD_ID_GP_SINK_COMMISSIONING_MODE, "GP Sink Commissioning Mode" },
+ { ZBEE_CMD_ID_GP_TRANSLATION_TABLE_UPDATE_COMMAND, "GP Translation Table Update" },
+ { ZBEE_CMD_ID_GP_TRANSLATION_TABLE_REQUEST, "GP Translation Table Request" },
+ { ZBEE_CMD_ID_GP_PAIRING_CONFIGURATION, "GP Pairing Configuration" },
+ { ZBEE_CMD_ID_GP_SINK_TABLE_REQUEST, "GP Sink Table Request" },
+ { ZBEE_CMD_ID_GP_PROXY_TABLE_RESPONSE, "GP Proxy Table Response" },
+ { 0, NULL }
+};
+
+static const value_string zbee_zcl_gp_comm_mode_actions[] = {
+ { 0, "Exit commissioning mode" },
+ { 1, "Enter commissioning mode" },
+ { 0, NULL }
+};
+
+static const value_string zbee_zcl_gp_app_ids[] = {
+ { 0, "0b000 4b SrcID; no Endpoint" },
+ { 2, "0b010 8b IEEE; Endpoint presents" },
+ { 0, NULL }
+};
+
+static const value_string zbee_zcl_gp_secur_levels[] = {
+ { 0, "No security" },
+ { 1, "Reserved" },
+ { 2, "4B frame counter and 4B MIC only" },
+ { 3, "Encryption & 4B frame counter and 4B MIC" },
+ { 0, NULL }
+};
+
+static const value_string zbee_zcl_gp_secur_key_types[] = {
+ { 0, "No key" },
+ { 1, "ZigBee NWK key" },
+ { 2, "GPD group key" },
+ { 3, "NWK-key derived GPD group key" },
+ { 4, "(individual) out-of-the-box GPD key" },
+ { 7, "Derived individual GPD key" },
+ { 0, NULL }
+};
+
+static const value_string zbee_zcl_gp_communication_modes[] = {
+ { 0, "Full unicast" },
+ { 1, "Groupcast to DGroupID" },
+ { 2, "Groupcast to pre-commissioned GroupID" },
+ { 3, "Lightweight unicast" },
+ { 0, NULL }
+};
+
+static const value_string zbee_zcl_gp_lqi_vals[] = {
+ { 0, "Poor" },
+ { 1, "Moderate" },
+ { 2, "High" },
+ { 3, "Excellent" },
+ { 0, NULL }
+};
+
+static const value_string zbee_zcl_gp_channels[] = {
+ { 0, "Channel 11" },
+ { 1, "Channel 12" },
+ { 2, "Channel 13" },
+ { 3, "Channel 14" },
+ { 4, "Channel 15" },
+ { 5, "Channel 16" },
+ { 6, "Channel 17" },
+ { 7, "Channel 18" },
+ { 8, "Channel 19" },
+ { 9, "Channel 20" },
+ { 10, "Channel 21" },
+ { 11, "Channel 22" },
+ { 12, "Channel 23" },
+ { 13, "Channel 24" },
+ { 14, "Channel 25" },
+ { 15, "Channel 26" },
+ { 0, NULL }
+};
+
+#define ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ACTION 1
+#define ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_EXIT_MODE (7<<1)
+#define ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ON_COMMISSIONING_WINDOW_EXPIRATION ((1<<0)<<1)
+#define ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ON_PAIRING_SUCCESS ((1<<1)<<1)
+#define ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ON_GP_PROXY_COMM_MODE ((1<<2)<<1)
+#define ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_CHANNEL_PRESENT (1<<4)
+#define ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_UNICAST (1<<5)
+
+
+#define ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_APP_ID (7<<0)
+#define ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_RX_AFTER_TX (1<<3)
+#define ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_SECUR_LEVEL (3<<4)
+#define ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_SECUR_KEY_TYPE (7<<6)
+#define ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_SECUR_FAILED (1<<9)
+#define ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_BIDIR_CAP (1<<10)
+#define ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_PROXY_INFO_PRESENT (1<<11)
+
+#define ZBEE_ZCL_GP_GPP_GPD_LINK_RSSI 0x3f
+#define ZBEE_ZCL_GP_GPP_GPD_LINK_LQI (3<<6)
+
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_APP_ID (7<<0)
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_ALSO_UNICAST (1<<3)
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_ALSO_DERIVED_GROUP (1<<4)
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_ALSO_COMMISSIONED_GROUP (1<<5)
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_SECUR_LEVEL (3<<6)
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_SECUR_KEY_TYPE (7<<8)
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_RX_AFTER_TX (1<<11)
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_TX_Q_FULL (1<<12)
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_BIDIR_CAP (1<<13)
+#define ZBEE_ZCL_GP_NOTIFICATION_OPTION_PROXY_INFO_PRESENT (1<<14)
+
+#define ZBEE_ZCL_GP_PAIRING_OPTION_APP_ID (7<<0)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_ADD_SINK (1<<3)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_REMOVE_GPD (1<<4)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_COMMUNICATION_MODE (3<<5)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_GPD_FIXED (1<<7)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_GPD_MAC_SEQ_NUM_CAP (1<<8)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_SECUR_LEVEL (3<<9)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_SECUR_KEY_TYPE (7<<11)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_GPD_FRAME_CNT_PRESENT (1<<14)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_GPD_SECUR_KEY_PRESENT (1<<15)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_ASSIGNED_ALIAS_PRESENT (1<<16)
+#define ZBEE_ZCL_GP_PAIRING_OPTION_FWD_RADIUS_PRESENT (1<<17)
+
+#define ZBEE_ZCL_GP_RESPONSE_OPTION_APP_ID (7<<0)
+#define ZBEE_ZCL_GP_RESPONSE_OPTION_TX_ON_ENDPOINT_MATCH (1<<3)
+
+#define ZBEE_ZCL_GP_RESPONSE_TX_CHANNEL (0xf<<0)
+
+/*************************/
+/* Global Variables */
+/*************************/
+/* Initialize the protocol and registered fields */
+static int proto_zbee_zcl_gp = -1;
+
+static int hf_zbee_zcl_gp_attr_id = -1;
+static int hf_zbee_zcl_gp_srv_rx_cmd_id = -1;
+static int hf_zbee_zcl_gp_srv_tx_cmd_id = -1;
+
+static gint ett_zbee_zcl_gp = -1;
+
+/* GP_PROXY_COMMISSIONING_MODE */
+static gint ett_zbee_gp_cmd_proxy_commissioning_mode_options = -1;
+static gint ett_zbee_gp_cmd_proxy_commissioning_mode_exit_mode = -1;
+static gint hf_zbee_gp_cmd_proxy_commissioning_mode_options = -1;
+static gint hf_zbee_gp_cmd_pcm_opt_action = -1;
+static gint hf_zbee_gp_cmd_pcm_opt_exit_mode = -1;
+static gint hf_zbee_gp_cmd_pcm_opt_channel_present = -1;
+static gint hf_zbee_gp_cmd_pcm_opt_unicast_comm = -1;
+static gint hf_zbee_gp_cmd_proxy_commissioning_mode_exit_mode = -1;
+static gint hf_zbee_gp_cmd_pcm_exit_mode_on_comm_window_expire = -1;
+static gint hf_zbee_gp_cmd_pcm_exit_mode_on_pairing_success = -1;
+static gint hf_zbee_gp_cmd_pcm_exit_mode_on_gp_proxy_comm_mode = -1;
+static gint hf_zbee_zcl_gp_commissioning_window = -1;
+static gint hf_zbee_zcl_gp_channel = -1;
+
+/* GP_COMMISSIONING_NOTIFICATION */
+static gint hf_zbee_gp_cmd_comm_notif_opt_app_id = -1;
+static gint hf_zbee_gp_cmd_comm_notif_opt_rx_after_tx = -1;
+static gint hf_zbee_gp_cmd_comm_notif_opt_secur_level = -1;
+static gint hf_zbee_gp_cmd_comm_notif_opt_secur_key_type = -1;
+static gint hf_zbee_gp_cmd_comm_notif_opt_secur_fail = -1;
+static gint hf_zbee_gp_cmd_comm_notif_opt_bidir_cap = -1;
+static gint hf_zbee_gp_cmd_comm_notif_opt_proxy_info_present = -1;
+static gint hf_zbee_gp_cmd_commissioning_notification_options = -1;
+static gint ett_zbee_gp_cmd_commissioning_notification_options = -1;
+static gint hf_zbee_gp_src_id = -1;
+static gint hf_zbee_gp_ieee = -1;
+static gint hf_zbee_gp_endpoint = -1;
+static gint hf_zbee_gp_secur_frame_counter = -1;
+static gint hf_zbee_gp_gpd_command_id = -1;
+static gint hf_zbee_gp_short_addr = -1;
+static gint hf_zbee_gp_gpp_gpd_link = -1;
+static gint hf_zbee_gp_mic = -1;
+static gint ett_zbee_gp_gpp_gpd_link = -1;
+static gint hf_zbee_gpp_gpd_link_rssi = -1;
+static gint hf_zbee_gpp_gpd_link_lqi = -1;
+static gint hf_zbee_gp_gpd_payload_size = -1;
+
+
+/* GP_NOTIFICATION */
+static gint hf_zbee_gp_cmd_notification_options = -1;
+static gint ett_zbee_gp_cmd_notification_options = -1;
+static gint hf_zbee_gp_cmd_notif_opt_app_id = -1;
+static gint hf_zbee_gp_cmd_notif_opt_also_unicast = -1;
+static gint hf_zbee_gp_cmd_notif_opt_also_derived_group = -1;
+static gint hf_zbee_gp_cmd_notif_opt_also_comm_group = -1;
+static gint hf_zbee_gp_cmd_notif_opt_secur_level = -1;
+static gint hf_zbee_gp_cmd_notif_opt_secur_key_type = -1;
+static gint hf_zbee_gp_cmd_notif_opt_rx_after_tx = -1;
+static gint hf_zbee_gp_cmd_notif_opt_tx_q_full = -1;
+static gint hf_zbee_gp_cmd_notif_opt_bidir_cap = -1;
+static gint hf_zbee_gp_cmd_notif_opt_proxy_info_present = -1;
+
+/* GP_PAIRING */
+static gint hf_zbee_gp_cmd_pairing_opt_app_id = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_add_sink = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_remove_gpd = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_communication_mode = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_gpd_fixed = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_gpd_mac_seq_num_cap = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_secur_level = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_secur_key_type = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_gpd_frame_cnt_present = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_gpd_secur_key_present = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_assigned_alias_present = -1;
+static gint hf_zbee_gp_cmd_pairing_opt_fwd_radius_present = -1;
+static gint hf_zbee_gp_cmd_pairing_options = -1;
+static gint ett_zbee_gp_cmd_pairing_options = -1;
+static gint hf_zbee_gp_sink_ieee = -1;
+static gint hf_zbee_gp_sink_nwk = -1;
+static gint hf_zbee_gp_sink_group_id = -1;
+static gint hf_zbee_gp_device_id = -1;
+static gint hf_zbee_gp_assigned_alias = -1;
+static gint hf_zbee_gp_forwarding_radius = -1;
+static gint hf_zbee_gp_gpd_key = -1;
+
+/* GP Response */
+static gint hf_zbee_gp_cmd_response_options = -1;
+static gint ett_zbee_gp_cmd_response_options = -1;
+static gint hf_zbee_gp_cmd_response_tx_channel = -1;
+static gint ett_zbee_gp_cmd_response_tx_channel = -1;
+static gint hf_zbee_gp_cmd_resp_opt_app_id = -1;
+static gint hf_zbee_gp_cmd_resp_opt_tx_on_ep_match = -1;
+static gint hf_zbee_gp_tmp_master_short_addr = -1;
+static gint hf_zbee_gp_cmd_resp_tx_channel = -1;
+
+/* reuse ZGPD command names */
+extern value_string_ext zbee_nwk_gp_cmd_names_ext;
+/* reuse devices table from ZGPD parser */
+extern const value_string zbee_nwk_gp_device_ids_names[];
+
+/*************************/
+/* Function Declarations */
+/*************************/
+void proto_register_zbee_zcl_gp(void);
+void proto_reg_handoff_zbee_zcl_gp(void);
+
+static dissector_handle_t zgp_handle;
+
+
+/**
+ * dissect_zbee_zcl_gp_payload
+ *
+ * ZigBee ZCL Green Power data payload cluster dissector for wireshark.
+ *
+ * @param tvb - pointer to buffer containing raw packet.
+ * @param pinfo - pointer to packet information fields
+ * @param tree - pointer to data tree Wireshark uses to display packet.
+ * @param offset - offset in a buffer
+ *
+ * @return new offset.
+ */
+static int
+dissect_zbee_zcl_gp_payload(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint offset)
+{
+ guint payload_size;
+
+ proto_tree_add_item(tree, hf_zbee_gp_gpd_command_id, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ payload_size = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_zbee_gp_gpd_payload_size, tvb, offset, 1, ENC_NA);
+ offset += 1;
+
+ if (payload_size != 0 && payload_size != 0xff) {
+ tvbuff_t *gtvb = tvb_new_composite();
+ gboolean writable = col_get_writable(pinfo->cinfo);
+
+ /* remove payload length and put command id instead */
+ tvb_composite_append(gtvb, tvb_new_subset_length(tvb, offset-2, 1));
+ tvb_composite_append(gtvb, tvb_new_subset_length(tvb, offset, payload_size));
+ tvb_composite_finalize(gtvb);
+ /* prevent overwriting COL_INFO */
+ col_set_writable(pinfo->cinfo, FALSE);
+ /* Actually dissect_zbee_nwk_gp_cmd wants zbee_nwk_green_power_packet*
+ * as a data but never uses it. */
+ call_dissector_only(zgp_handle, gtvb, pinfo, tree, NULL);
+ col_set_writable(pinfo->cinfo, writable);
+ offset += payload_size;
+ }
+ return offset;
+}
+
+/**
+ * dissect_zbee_zcl_gp
+ *
+ * ZigBee ZCL Green Power cluster dissector for wireshark.
+ *
+ * @param tvb - pointer to buffer containing raw packet.
+ * @param pinfo - pointer to packet information fields
+ * @param tree - pointer to data tree Wireshark uses to display packet.
+ * @param data - pointer to ZCL packet structure.
+ *
+ * @return length of parsed data.
+ */
+static int
+dissect_zbee_zcl_gp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
+{
+ static const int * gpp_gpd_link[] = {
+ &hf_zbee_gpp_gpd_link_rssi,
+ &hf_zbee_gpp_gpd_link_lqi,
+ NULL
+ };
+
+ zbee_zcl_packet *zcl;
+ volatile 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_gp_srv_rx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_gp_srv_rx_cmd_id, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ /* Handle the command dissection. */
+ switch (cmd_id) {
+ case ZBEE_CMD_ID_GP_NOTIFICATION:
+ {
+ static const int * n_options[] = {
+ &hf_zbee_gp_cmd_notif_opt_app_id,
+ &hf_zbee_gp_cmd_notif_opt_also_unicast,
+ &hf_zbee_gp_cmd_notif_opt_also_derived_group,
+ &hf_zbee_gp_cmd_notif_opt_also_comm_group,
+ &hf_zbee_gp_cmd_notif_opt_secur_level,
+ &hf_zbee_gp_cmd_notif_opt_secur_key_type,
+ &hf_zbee_gp_cmd_notif_opt_rx_after_tx,
+ &hf_zbee_gp_cmd_notif_opt_tx_q_full,
+ &hf_zbee_gp_cmd_notif_opt_bidir_cap,
+ &hf_zbee_gp_cmd_notif_opt_proxy_info_present,
+ NULL
+ };
+ guint16 options = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_gp_cmd_notification_options,
+ ett_zbee_gp_cmd_notification_options, n_options, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ if ((options & ZBEE_ZCL_GP_NOTIFICATION_OPTION_APP_ID) == 0) {
+ proto_tree_add_item(tree, hf_zbee_gp_src_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ }
+ else {
+ proto_tree_add_item(tree, hf_zbee_gp_ieee, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+ proto_tree_add_item(tree, hf_zbee_gp_endpoint, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ }
+ proto_tree_add_item(tree, hf_zbee_gp_secur_frame_counter, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ offset = dissect_zbee_zcl_gp_payload(tvb, pinfo, tree, offset);
+
+ if (options & ZBEE_ZCL_GP_NOTIFICATION_OPTION_PROXY_INFO_PRESENT) {
+ proto_tree_add_item(tree, hf_zbee_gp_short_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_gp_gpp_gpd_link,
+ ett_zbee_gp_gpp_gpd_link,
+ gpp_gpd_link, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ }
+ break;
+ }
+
+ case ZBEE_CMD_ID_GP_PAIRING_SEARCH:
+ case ZBEE_CMD_ID_GP_TUNNELING_STOP:
+ /* TODO: add commands parse */
+ break;
+
+ case ZBEE_CMD_ID_GP_COMMISSIONING_NOTIFICATION:
+ {
+ static const int * commn_options[] = {
+ &hf_zbee_gp_cmd_comm_notif_opt_app_id,
+ &hf_zbee_gp_cmd_comm_notif_opt_rx_after_tx,
+ &hf_zbee_gp_cmd_comm_notif_opt_secur_level,
+ &hf_zbee_gp_cmd_comm_notif_opt_secur_key_type,
+ &hf_zbee_gp_cmd_comm_notif_opt_secur_fail,
+ &hf_zbee_gp_cmd_comm_notif_opt_bidir_cap,
+ &hf_zbee_gp_cmd_comm_notif_opt_proxy_info_present,
+ NULL
+ };
+ guint16 options = tvb_get_guint16(tvb, offset, ENC_LITTLE_ENDIAN);
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_gp_cmd_commissioning_notification_options,
+ ett_zbee_gp_cmd_commissioning_notification_options, commn_options, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ if ((options & ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_APP_ID) == 0) {
+ proto_tree_add_item(tree, hf_zbee_gp_src_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ }
+ else {
+ proto_tree_add_item(tree, hf_zbee_gp_ieee, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+ proto_tree_add_item(tree, hf_zbee_gp_endpoint, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ }
+ proto_tree_add_item(tree, hf_zbee_gp_secur_frame_counter, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ offset = dissect_zbee_zcl_gp_payload(tvb, pinfo, tree, offset);
+
+ if (options & ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_PROXY_INFO_PRESENT) {
+ proto_tree_add_item(tree, hf_zbee_gp_short_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_gp_gpp_gpd_link,
+ ett_zbee_gp_gpp_gpd_link,
+ gpp_gpd_link, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ }
+ if (options & ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_SECUR_FAILED) {
+ proto_tree_add_item(tree, hf_zbee_gp_mic, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ }
+ break;
+ }
+
+ case ZBEE_CMD_ID_GP_SINK_COMMISSIONING_MODE:
+ case ZBEE_CMD_ID_GP_TRANSLATION_TABLE_UPDATE_COMMAND:
+ case ZBEE_CMD_ID_GP_TRANSLATION_TABLE_REQUEST:
+ case ZBEE_CMD_ID_GP_PAIRING_CONFIGURATION:
+ case ZBEE_CMD_ID_GP_SINK_TABLE_REQUEST:
+ case ZBEE_CMD_ID_GP_PROXY_TABLE_RESPONSE:
+ /* TODO: add commands parse */
+ 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_gp_srv_tx_cmd_names, "Unknown Command"),
+ zcl->tran_seqno);
+
+ /* Add the command ID. */
+ proto_tree_add_item(tree, hf_zbee_zcl_gp_srv_tx_cmd_id, tvb, offset, 1, ENC_NA);
+ offset++;
+
+ /* Handle the command dissection. */
+ switch (cmd_id) {
+ case ZBEE_ZCL_CMD_ID_GP_NOTIFICATION_RESPONSE:
+ /* TODO: add commands parse */
+ break;
+
+ case ZBEE_ZCL_CMD_ID_GP_PAIRING:
+ {
+ static const int * p_options[] = {
+ &hf_zbee_gp_cmd_pairing_opt_app_id,
+ &hf_zbee_gp_cmd_pairing_opt_add_sink,
+ &hf_zbee_gp_cmd_pairing_opt_remove_gpd,
+ &hf_zbee_gp_cmd_pairing_opt_communication_mode,
+ &hf_zbee_gp_cmd_pairing_opt_gpd_fixed,
+ &hf_zbee_gp_cmd_pairing_opt_gpd_mac_seq_num_cap,
+ &hf_zbee_gp_cmd_pairing_opt_secur_level,
+ &hf_zbee_gp_cmd_pairing_opt_secur_key_type,
+ &hf_zbee_gp_cmd_pairing_opt_gpd_frame_cnt_present,
+ &hf_zbee_gp_cmd_pairing_opt_gpd_secur_key_present,
+ &hf_zbee_gp_cmd_pairing_opt_assigned_alias_present,
+ &hf_zbee_gp_cmd_pairing_opt_fwd_radius_present,
+ NULL
+ };
+ guint32 options = tvb_get_guint24(tvb, offset, ENC_LITTLE_ENDIAN);
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_gp_cmd_pairing_options,
+ ett_zbee_gp_cmd_pairing_options, p_options, ENC_LITTLE_ENDIAN);
+ offset += 3;
+ if ((options & ZBEE_ZCL_GP_PAIRING_OPTION_APP_ID) == 0) {
+ proto_tree_add_item(tree, hf_zbee_gp_src_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ }
+ else {
+ proto_tree_add_item(tree, hf_zbee_gp_ieee, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+ proto_tree_add_item(tree, hf_zbee_gp_endpoint, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ }
+ if ((options & ZBEE_ZCL_GP_PAIRING_OPTION_REMOVE_GPD) == 0 &&
+ /* see Table 37 */
+ (options & ZBEE_ZCL_GP_PAIRING_OPTION_COMMUNICATION_MODE) == ZBEE_ZCL_GP_PAIRING_OPTION_COMMUNICATION_MODE) {
+ proto_tree_add_item(tree, hf_zbee_gp_sink_ieee, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+ proto_tree_add_item(tree, hf_zbee_gp_sink_nwk, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if ((options & ZBEE_ZCL_GP_PAIRING_OPTION_REMOVE_GPD) == 0 &&
+ (options & ZBEE_ZCL_GP_PAIRING_OPTION_COMMUNICATION_MODE) != ZBEE_ZCL_GP_PAIRING_OPTION_COMMUNICATION_MODE &&
+ (options & ZBEE_ZCL_GP_PAIRING_OPTION_COMMUNICATION_MODE) != 0) {
+ proto_tree_add_item(tree, hf_zbee_gp_sink_group_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if (options & ZBEE_ZCL_GP_PAIRING_OPTION_ADD_SINK) {
+ proto_tree_add_item(tree, hf_zbee_gp_device_id, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ }
+ if (options & ZBEE_ZCL_GP_PAIRING_OPTION_GPD_FRAME_CNT_PRESENT) {
+ proto_tree_add_item(tree, hf_zbee_gp_secur_frame_counter, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ }
+ if (options & ZBEE_ZCL_GP_PAIRING_OPTION_GPD_SECUR_KEY_PRESENT) {
+ proto_tree_add_item(tree, hf_zbee_gp_gpd_key, tvb, offset, 16, ENC_NA);
+ offset += 16;
+ }
+ if (options & ZBEE_ZCL_GP_PAIRING_OPTION_ASSIGNED_ALIAS_PRESENT) {
+ proto_tree_add_item(tree, hf_zbee_gp_assigned_alias, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if (options & ZBEE_ZCL_GP_PAIRING_OPTION_FWD_RADIUS_PRESENT) {
+ proto_tree_add_item(tree, hf_zbee_gp_forwarding_radius, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ }
+ break;
+ }
+
+ case ZBEE_ZCL_CMD_ID_GP_PROXY_COMMISSIONING_MODE:
+ {
+ static const int * pcm_options[] = {
+ &hf_zbee_gp_cmd_pcm_opt_action,
+ &hf_zbee_gp_cmd_pcm_opt_exit_mode,
+ &hf_zbee_gp_cmd_pcm_opt_channel_present,
+ &hf_zbee_gp_cmd_pcm_opt_unicast_comm,
+ NULL
+ };
+ guint8 options = tvb_get_guint8(tvb, offset);
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_gp_cmd_proxy_commissioning_mode_options,
+ ett_zbee_gp_cmd_proxy_commissioning_mode_options, pcm_options, ENC_NA);
+ if (options & ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ACTION) {
+ static const int * exit_mode[] = {
+ &hf_zbee_gp_cmd_pcm_exit_mode_on_comm_window_expire,
+ &hf_zbee_gp_cmd_pcm_exit_mode_on_pairing_success,
+ &hf_zbee_gp_cmd_pcm_exit_mode_on_gp_proxy_comm_mode,
+ NULL
+ };
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_gp_cmd_proxy_commissioning_mode_exit_mode,
+ ett_zbee_gp_cmd_proxy_commissioning_mode_exit_mode, exit_mode, ENC_NA);
+ }
+ offset += 1;
+ if (options & ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ON_COMMISSIONING_WINDOW_EXPIRATION) {
+ proto_tree_add_item(tree, hf_zbee_zcl_gp_commissioning_window, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ }
+ if (options & ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_CHANNEL_PRESENT) {
+ proto_tree_add_item(tree, hf_zbee_zcl_gp_channel, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ }
+ break;
+ }
+
+ case ZBEE_ZCL_CMD_ID_GP_RESPONSE:
+ {
+ static const int * rsp_options[] = {
+ &hf_zbee_gp_cmd_resp_opt_app_id,
+ &hf_zbee_gp_cmd_resp_opt_tx_on_ep_match,
+ NULL
+ };
+ static const int * tx_ch[] = {
+ &hf_zbee_gp_cmd_resp_tx_channel,
+ NULL
+ };
+ guint8 options = tvb_get_guint8(tvb, offset);
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_gp_cmd_response_options,
+ ett_zbee_gp_cmd_response_options, rsp_options, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ proto_tree_add_item(tree, hf_zbee_gp_tmp_master_short_addr, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2;
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_gp_cmd_response_tx_channel,
+ ett_zbee_gp_cmd_response_tx_channel, tx_ch, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ if ((options & ZBEE_ZCL_GP_RESPONSE_OPTION_APP_ID) == 0) {
+ proto_tree_add_item(tree, hf_zbee_gp_src_id, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ }
+ else {
+ proto_tree_add_item(tree, hf_zbee_gp_ieee, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+ proto_tree_add_item(tree, hf_zbee_gp_endpoint, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ }
+
+ offset = dissect_zbee_zcl_gp_payload(tvb, pinfo, tree, offset);
+ break;
+ }
+ case ZBEE_ZCL_CMD_ID_GP_TRANS_TBL_RESPONSE:
+ case ZBEE_ZCL_CMD_ID_GP_SINK_TABLE_RESPONSE:
+ case ZBEE_ZCL_CMD_ID_GP_PROXY_TABLE_REQUEST:
+ /* TODO: add commands parse */
+ break;
+ default:
+ break;
+ } /* switch */
+ }
+
+ /* Call the data dissector for any leftover bytes. */
+ if (tvb_captured_length(tvb) > offset) {
+ call_data_dissector(tvb_new_subset_remaining(tvb, offset), pinfo, tree);
+ }
+
+ return tvb_captured_length(tvb);
+} /* dissect_zbee_zcl_gp */
+
+
+/**
+ * dissect_zcl_gp_attr_data
+ *
+ * this function is called by ZCL foundation dissector in order to decode
+ * specific cluster attributes data.
+ *
+ * @param tree - pointer to data tree Wireshark uses to display packet.
+ * @param tvb - pointer to buffer containing raw packet.
+ * @param offset - pointer to buffer offset
+ * @param attr_id - attribute identifier
+ * @param data_type - attribute data type
+ */
+static void
+dissect_zcl_gp_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_gp_attr_data*/
+
+/**
+ * proto_register_zbee_zcl_gp
+ *
+ * ZigBee ZCL Green Power cluster protocol registration.
+ */
+void
+proto_register_zbee_zcl_gp(void)
+{
+ /* Setup list of header fields */
+ static hf_register_info hf[] = {
+
+ { &hf_zbee_zcl_gp_attr_id,
+ { "Attribute", "zbee_zcl_general.gp.attr_id", FT_UINT16, BASE_HEX, VALS(zbee_zcl_gp_attr_names),
+ 0x0, NULL, HFILL } },
+
+ { &hf_zbee_zcl_gp_srv_rx_cmd_id,
+ { "Command", "zbee_zcl_general.gp.cmd.srv_rx.id", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_gp_srv_rx_cmd_names), 0x0, NULL, HFILL }},
+
+ { &hf_zbee_zcl_gp_srv_tx_cmd_id,
+ { "Command", "zbee_zcl_general.gp.cmd.srv_tx.id", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_gp_srv_tx_cmd_names), 0x0, NULL, HFILL }},
+
+ /* GP Proxy Commissioning Mode command */
+ { &hf_zbee_gp_cmd_proxy_commissioning_mode_options,
+ { "Options", "zbee_zcl_general.gp.proxy_comm_mode.options", FT_UINT8, BASE_HEX,
+ NULL, 0x0, NULL, HFILL }},
+ { &hf_zbee_zcl_gp_commissioning_window,
+ { "Commissioning window", "zbee_zcl_general.gp.proxy_comm_mode.comm_window", FT_UINT16, BASE_DEC,
+ NULL, 0x0, "Commissioning window in seconds", HFILL }},
+ { &hf_zbee_zcl_gp_channel,
+ { "Channel", "zbee_zcl_general.gp.proxy_comm_mode.cnannel", FT_UINT8, BASE_DEC,
+ NULL, 0x0, "Identifier of the channel the devices SHOULD switch to on reception", HFILL }},
+ { &hf_zbee_gp_cmd_pcm_opt_action,
+ { "Action", "zbee_zcl_general.gp.proxy_comm_mode.opt.action", FT_UINT8, BASE_DEC,
+ VALS(zbee_zcl_gp_comm_mode_actions), ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ACTION, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pcm_opt_exit_mode,
+ { "Exit mode", "zbee_zcl_general.gp.proxy_comm_mode.opt.exit_mode", FT_UINT8, BASE_HEX,
+ NULL, ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_EXIT_MODE, "Commissioning mode exit requirements", HFILL }},
+ { &hf_zbee_gp_cmd_pcm_opt_channel_present,
+ { "Channel present", "zbee_zcl_general.gp.proxy_comm_mode.opt.ch_present", FT_BOOLEAN, 8,
+ NULL, ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_CHANNEL_PRESENT, "If set to 0b1, it indicates that the Channel field is present", HFILL }},
+ { &hf_zbee_gp_cmd_pcm_opt_unicast_comm,
+ { "Unicast", "zbee_zcl_general.gp.proxy_comm_mode.opt.unicast", FT_BOOLEAN, 8,
+ NULL, ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_UNICAST, "Send the GP Commissioning Notification commands in broadcast (0) vs unicast (1)", HFILL }},
+ { &hf_zbee_gp_cmd_proxy_commissioning_mode_exit_mode,
+ { "Exit mode", "zbee_zcl_general.gp.proxy_comm_mode.opt.exit_mode", FT_UINT8, BASE_HEX,
+ NULL, ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_EXIT_MODE, "Commissioning mode exit requirements", HFILL }},
+ { &hf_zbee_gp_cmd_pcm_exit_mode_on_comm_window_expire,
+ { "On Window expire", "zbee_zcl_general.gp.proxy_comm_mode.opt.exit_mode.win_expire", FT_BOOLEAN, 8,
+ NULL, ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ON_COMMISSIONING_WINDOW_EXPIRATION, "On CommissioningWindow expiration", HFILL }},
+ { &hf_zbee_gp_cmd_pcm_exit_mode_on_pairing_success,
+ { "On first Pairing success", "zbee_zcl_general.gp.proxy_comm_mode.opt.exit_mode.pair_succs", FT_BOOLEAN, 8,
+ NULL, ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ON_PAIRING_SUCCESS, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pcm_exit_mode_on_gp_proxy_comm_mode,
+ { "On GP Proxy Commissioning Mode", "zbee_zcl_general.gp.proxy_comm_mode.opt.exit_mode.proxy_comm_mode", FT_BOOLEAN, 8,
+ NULL, ZBEE_ZCL_GP_PROXY_COMMISSIONING_MODE_OPTION_ON_GP_PROXY_COMM_MODE, "On GP Proxy Commissioning Mode (exit)", HFILL }},
+
+ /* GP Commissioning Notification command */
+ { &hf_zbee_gp_cmd_commissioning_notification_options,
+ { "Options", "zbee_zcl_general.gp.comm_notif.options", FT_UINT16, BASE_HEX,
+ NULL, 0x0, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_comm_notif_opt_app_id,
+ { "ApplicationID", "zbee_zcl_general.gp.comm_notif.opt.app_id", FT_UINT16, BASE_HEX,
+ VALS(zbee_zcl_gp_app_ids), ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_APP_ID, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_comm_notif_opt_rx_after_tx,
+ { "RxAfterTx", "zbee_zcl_general.gp.comm_notif.opt.rx_after_tx", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_RX_AFTER_TX, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_comm_notif_opt_secur_level,
+ { "SecurityLevel", "zbee_zcl_general.gp.comm_notif.opt.secur_lev", FT_UINT16, BASE_HEX,
+ VALS(zbee_zcl_gp_secur_levels), ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_SECUR_LEVEL, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_comm_notif_opt_secur_key_type,
+ { "SecurityKeyType", "zbee_zcl_general.gp.comm_notif.opt.secur_key_type", FT_UINT16, BASE_HEX,
+ VALS(zbee_zcl_gp_secur_key_types), ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_SECUR_KEY_TYPE, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_comm_notif_opt_secur_fail,
+ { "Security processing failed", "zbee_zcl_general.gp.comm_notif.opt.secur_failed", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_SECUR_FAILED, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_comm_notif_opt_bidir_cap,
+ { "Bidirectional Capability", "zbee_zcl_general.gp.comm_notif.opt.bidir_cap", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_BIDIR_CAP, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_comm_notif_opt_proxy_info_present,
+ { "Proxy info present", "zbee_zcl_general.gp.comm_notif.opt.proxy_info", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_COMMISSIONING_NOTIFICATION_OPTION_PROXY_INFO_PRESENT, NULL, HFILL }},
+ { &hf_zbee_gp_src_id,
+ { "SrcID", "zbee_zcl_general.gp.src_id", FT_UINT32, BASE_HEX,
+ NULL, 0, "GPD Source identifier", HFILL }},
+ { &hf_zbee_gp_ieee,
+ { "GPD IEEE", "zbee_zcl_general.gp.gpd_ieee", FT_EUI64, BASE_NONE,
+ NULL, 0, "GPD IEEE address", HFILL }},
+ { &hf_zbee_gp_endpoint,
+ { "Endpoint", "zbee_zcl_general.gp.endpoint", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_secur_frame_counter,
+ { "Frame counter", "zbee_zcl_general.gp.frame_cnt", FT_UINT32, BASE_DEC,
+ NULL, 0, "GPD security frame counter", HFILL }},
+ { &hf_zbee_gp_gpd_command_id,
+ { "ZGPD CommandID", "zbee_zcl_general.gp.command_id", FT_UINT8, BASE_HEX | BASE_EXT_STRING,
+ &zbee_nwk_gp_cmd_names_ext, 0x0, NULL, HFILL }},
+ { &hf_zbee_gp_short_addr,
+ { "GPP short address", "zbee_zcl_general.gp.gpp_short", FT_UINT16, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_gpp_gpd_link,
+ { "GPP-GPD link", "zbee_zcl_general.gp.gpd_gpp_link", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_mic,
+ { "MIC", "zbee_zcl_general.gp.mic", FT_UINT32, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gpp_gpd_link_rssi,
+ { "RSSI", "zbee_zcl_general.gp.gpp_gpd_link.rssi", FT_UINT8, BASE_HEX,
+ NULL, ZBEE_ZCL_GP_GPP_GPD_LINK_RSSI, NULL, HFILL }},
+ { &hf_zbee_gpp_gpd_link_lqi,
+ { "LQI", "zbee_zcl_general.gp.gpp_gpd_link.lqi", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_gp_lqi_vals), ZBEE_ZCL_GP_GPP_GPD_LINK_LQI, NULL, HFILL }},
+ { &hf_zbee_gp_gpd_payload_size,
+ { "Payload size", "zbee_zcl_general.gp.payload_size", FT_UINT8, BASE_DEC,
+ NULL, 0, NULL, HFILL }},
+
+ /* GP Notification */
+ { &hf_zbee_gp_cmd_notification_options,
+ { "Options", "zbee_zcl_general.gp.notif.opt", FT_UINT16, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_app_id,
+ { "ApplicationID", "zbee_zcl_general.gp.notif.opt.app_id", FT_UINT16, BASE_HEX,
+ VALS(zbee_zcl_gp_app_ids), ZBEE_ZCL_GP_NOTIFICATION_OPTION_APP_ID, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_also_unicast,
+ { "Also Unicast", "zbee_zcl_general.gp.notif.opt.also_unicast", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_NOTIFICATION_OPTION_ALSO_UNICAST, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_also_derived_group,
+ { "Also Derived Group", "zbee_zcl_general.gp.notif.opt.also_derived_grp", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_NOTIFICATION_OPTION_ALSO_DERIVED_GROUP, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_also_comm_group,
+ { "Also Commissioned Group", "zbee_zcl_general.gp.notif.opt.also_comm_grp", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_NOTIFICATION_OPTION_ALSO_COMMISSIONED_GROUP, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_secur_level,
+ { "SecurityLevel", "zbee_zcl_general.gp.notif.opt.secur_lev", FT_UINT16, BASE_HEX,
+ VALS(zbee_zcl_gp_secur_levels), ZBEE_ZCL_GP_NOTIFICATION_OPTION_SECUR_LEVEL, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_secur_key_type,
+ { "SecurityKeyType", "zbee_zcl_general.gp.notif.opt.secur_key_type", FT_UINT16, BASE_HEX,
+ VALS(zbee_zcl_gp_secur_key_types), ZBEE_ZCL_GP_NOTIFICATION_OPTION_SECUR_KEY_TYPE, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_rx_after_tx,
+ { "RxAfterTx", "zbee_zcl_general.gp.comm_notif.opt.rx_after_tx", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_NOTIFICATION_OPTION_RX_AFTER_TX, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_tx_q_full,
+ { "gpTxQueueFull", "zbee_zcl_general.gp.comm_notif.opt.tx_q_full", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_NOTIFICATION_OPTION_TX_Q_FULL, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_bidir_cap,
+ { "Bidirectional Capability", "zbee_zcl_general.gp.notif.opt.bidir_cap", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_NOTIFICATION_OPTION_BIDIR_CAP, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_notif_opt_proxy_info_present,
+ { "Proxy info present", "zbee_zcl_general.gp.notif.opt.proxy_info", FT_BOOLEAN, 16,
+ NULL, ZBEE_ZCL_GP_NOTIFICATION_OPTION_PROXY_INFO_PRESENT, NULL, HFILL }},
+
+
+ /* GP Pairing */
+ { &hf_zbee_gp_cmd_pairing_opt_app_id,
+ { "ApplicationID", "zbee_zcl_general.gp.pairing.opt.app_id", FT_UINT24, BASE_HEX,
+ VALS(zbee_zcl_gp_app_ids), ZBEE_ZCL_GP_PAIRING_OPTION_APP_ID, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_add_sink,
+ { "Add Sink", "zbee_zcl_general.gp.pairing.opt.add_sink", FT_BOOLEAN, 24,
+ NULL, ZBEE_ZCL_GP_PAIRING_OPTION_ADD_SINK, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_remove_gpd,
+ { "Remove GPD", "zbee_zcl_general.gp.pairing.opt.remove_gpd", FT_BOOLEAN, 24,
+ NULL, ZBEE_ZCL_GP_PAIRING_OPTION_REMOVE_GPD, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_communication_mode,
+ { "Communication mode", "zbee_zcl_general.gp.pairing.opt.comm_mode", FT_UINT24, BASE_HEX,
+ VALS(zbee_zcl_gp_communication_modes), ZBEE_ZCL_GP_PAIRING_OPTION_COMMUNICATION_MODE, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_gpd_fixed,
+ { "GPD Fixed", "zbee_zcl_general.gp.pairing.opt.gpd_fixed", FT_BOOLEAN, 24,
+ NULL, ZBEE_ZCL_GP_PAIRING_OPTION_GPD_FIXED, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_gpd_mac_seq_num_cap,
+ { "MAC Seq number cap", "zbee_zcl_general.gp.pairing.opt.seq_num_cap", FT_BOOLEAN, 24,
+ NULL, ZBEE_ZCL_GP_PAIRING_OPTION_GPD_MAC_SEQ_NUM_CAP, "GPD MAC sequence number capabilities", HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_secur_level,
+ { "SecurityLevel", "zbee_zcl_general.gp.pairing.opt.secur_lev", FT_UINT24, BASE_HEX,
+ VALS(zbee_zcl_gp_secur_levels), ZBEE_ZCL_GP_PAIRING_OPTION_SECUR_LEVEL, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_secur_key_type,
+ { "SecurityKeyType", "zbee_zcl_general.gp.pairing.opt.secur_key_type", FT_UINT24, BASE_HEX,
+ VALS(zbee_zcl_gp_secur_key_types), ZBEE_ZCL_GP_PAIRING_OPTION_SECUR_KEY_TYPE, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_gpd_frame_cnt_present,
+ { "Frame Counter present", "zbee_zcl_general.gp.pairing.opt.seq_num_cap", FT_BOOLEAN, 24,
+ NULL, ZBEE_ZCL_GP_PAIRING_OPTION_GPD_FRAME_CNT_PRESENT, "GPD security Frame Counter present", HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_gpd_secur_key_present,
+ { "Key present", "zbee_zcl_general.gp.pairing.opt.key_present", FT_BOOLEAN, 24,
+ NULL, ZBEE_ZCL_GP_PAIRING_OPTION_GPD_SECUR_KEY_PRESENT, "GPD security key present", HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_assigned_alias_present,
+ { "Assigned Alias present", "zbee_zcl_general.gp.pairing.opt.asn_alias_present", FT_BOOLEAN, 24,
+ NULL, ZBEE_ZCL_GP_PAIRING_OPTION_ASSIGNED_ALIAS_PRESENT, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pairing_opt_fwd_radius_present,
+ { "Forwarding Radius present", "zbee_zcl_general.gp.pairing.opt.fwd_radius_present", FT_BOOLEAN, 24,
+ NULL, ZBEE_ZCL_GP_PAIRING_OPTION_FWD_RADIUS_PRESENT, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_pairing_options,
+ { "Options", "zbee_zcl_general.gp.pairing.opt", FT_UINT24, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_sink_ieee,
+ { "Sink IEEE", "zbee_zcl_general.gp.sink_ieee", FT_EUI64, BASE_NONE,
+ NULL, 0, "Sink IEEE address", HFILL }},
+ { &hf_zbee_gp_sink_nwk,
+ { "Sink NWK", "zbee_zcl_general.gp.sink_nwk", FT_UINT16, BASE_HEX,
+ NULL, 0, "Sink NWK address", HFILL }},
+ { &hf_zbee_gp_sink_group_id,
+ { "Sink GroupID", "zbee_zcl_general.gp.sink_grp", FT_UINT16, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_device_id,
+ { "DeviceID", "zbee_zcl_general.gp.dev_id", FT_UINT8, BASE_HEX,
+ VALS(zbee_nwk_gp_device_ids_names), 0, NULL, HFILL }},
+ { &hf_zbee_gp_assigned_alias,
+ { "Assigned alias", "zbee_zcl_general.gp.asn_alias", FT_UINT16, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_forwarding_radius,
+ { "Forwarding Radius", "zbee_zcl_general.gp.fw_radius", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_gpd_key,
+ { "GPD key", "zbee_zcl_general.gp.gpd_key", FT_BYTES, BASE_NONE,
+ NULL, 0, NULL, HFILL }},
+
+ /* GP Response */
+ { &hf_zbee_gp_cmd_response_options,
+ { "Options", "zbee_zcl_general.gp.response.opt", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_resp_opt_app_id,
+ { "ApplicationID", "zbee_zcl_general.gp.response.opt.app_id", FT_UINT8, BASE_HEX,
+ NULL, ZBEE_ZCL_GP_RESPONSE_OPTION_APP_ID, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_resp_opt_tx_on_ep_match,
+ { "Transmit on endpoint match", "zbee_zcl_general.gp.response.opt.tx_on_ep_match", FT_UINT8, BASE_HEX,
+ NULL, ZBEE_ZCL_GP_RESPONSE_OPTION_TX_ON_ENDPOINT_MATCH, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_response_tx_channel,
+ { "TempMaster Tx channel", "zbee_zcl_general.gp.response.tmpmaster_tx_chan", FT_UINT8, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ { &hf_zbee_gp_cmd_resp_tx_channel,
+ { "Transmit channel", "zbee_zcl_general.gp.response.opt.tx_chan", FT_UINT8, BASE_HEX,
+ VALS(zbee_zcl_gp_channels), ZBEE_ZCL_GP_RESPONSE_TX_CHANNEL, NULL, HFILL }},
+ { &hf_zbee_gp_tmp_master_short_addr,
+ { "TempMaster short address", "zbee_zcl_general.gp.response.tmpmaster_addr", FT_UINT16, BASE_HEX,
+ NULL, 0, NULL, HFILL }},
+ };
+
+ /* ZCL Green Power subtrees */
+ static gint *ett[] = {
+ &ett_zbee_zcl_gp,
+ &ett_zbee_gp_cmd_proxy_commissioning_mode_options,
+ &ett_zbee_gp_cmd_proxy_commissioning_mode_exit_mode,
+ &ett_zbee_gp_cmd_commissioning_notification_options,
+ &ett_zbee_gp_gpp_gpd_link,
+ &ett_zbee_gp_cmd_notification_options,
+ &ett_zbee_gp_cmd_pairing_options,
+ &ett_zbee_gp_cmd_response_options,
+ &ett_zbee_gp_cmd_response_tx_channel
+ };
+
+
+ /* Register the ZigBee ZCL Green Power cluster protocol name and description */
+ proto_zbee_zcl_gp = proto_register_protocol("ZigBee ZCL Green Power", "ZCL Green Power", ZBEE_PROTOABBREV_ZCL_GP);
+ proto_register_field_array(proto_zbee_zcl_gp, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ /* Register the ZigBee ZCL Green Power dissector. */
+ register_dissector(ZBEE_PROTOABBREV_ZCL_GP, dissect_zbee_zcl_gp, proto_zbee_zcl_gp);
+} /*proto_register_zbee_zcl_gp*/
+
+/**
+ * proto_reg_handoff_zbee_zcl_gp
+ *
+ * Hands off the ZCL Green Power dissector.
+ */
+void
+proto_reg_handoff_zbee_zcl_gp(void)
+{
+ dissector_handle_t handle;
+
+ /* Register our dissector with the ZigBee application dissectors. */
+ handle = find_dissector(ZBEE_PROTOABBREV_ZCL_GP);
+ dissector_add_uint("zbee.zcl.cluster", ZBEE_ZCL_CID_GP, handle);
+ zgp_handle = find_dissector(ZBEE_PROTOABBREV_NWK_GP_CMD);
+
+ zbee_zcl_init_cluster( proto_zbee_zcl_gp,
+ ett_zbee_zcl_gp,
+ ZBEE_ZCL_CID_GP,
+ hf_zbee_zcl_gp_attr_id,
+ hf_zbee_zcl_gp_srv_rx_cmd_id,
+ hf_zbee_zcl_gp_srv_tx_cmd_id,
+ (zbee_zcl_fn_attr_data)dissect_zcl_gp_attr_data
+ );
+} /*proto_reg_handoff_zbee_zcl_gp*/
+
+
/*
* Editor modelines - http://www.wireshark.org/tools/modelines.html
*