aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-zbee-nwk-gp.c
diff options
context:
space:
mode:
authorVladlen Popov <vladlen.popov@yahoo.com>2016-10-18 13:56:31 +0300
committerMichael Mann <mmann78@netscape.net>2016-10-18 13:07:40 +0000
commit5d2c54ed2029dd98c44e17672e9c63ad0172e87b (patch)
tree31bc696eaff9ebd2624e54fc27fa2bd85f66dd6c /epan/dissectors/packet-zbee-nwk-gp.c
parent256f834293e54be5d54a6f9c55472876851cbbbf (diff)
ZigBee Green Power: fix commissioning cmd dissection
Dissect fields: number of gpd commands, GPD cmd list, Cluster list Change-Id: Ifda60987072c3526d5f0ae4687ddf2b6e46bfb93 Reviewed-on: https://code.wireshark.org/review/18259 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: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-zbee-nwk-gp.c')
-rw-r--r--epan/dissectors/packet-zbee-nwk-gp.c123
1 files changed, 122 insertions, 1 deletions
diff --git a/epan/dissectors/packet-zbee-nwk-gp.c b/epan/dissectors/packet-zbee-nwk-gp.c
index 27912f1b51..f7069469f1 100644
--- a/epan/dissectors/packet-zbee-nwk-gp.c
+++ b/epan/dissectors/packet-zbee-nwk-gp.c
@@ -143,6 +143,10 @@ typedef struct {
#define ZBEE_NWK_GP_CMD_COMMISSIONING_MS_EXT_GCLP 0x04
#define ZBEE_NWK_GP_CMD_COMMISSIONING_MS_EXT_CRP 0x08
+/* Definitions for GP Commissioning command Number of server ClusterIDs (bitmask) */
+#define ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_SRV 0x0F
+#define ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_CLI 0xF0
+
/* Definitions for GP Decommissioning command opt field (bitmask). */
#define ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_PAN_ID_PRESENT 0x01
#define ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_SEC_KEY_PRESENT 0x02
@@ -257,6 +261,14 @@ static int hf_zbee_nwk_gp_cmd_comm_ms_ext_crp = -1;
static int hf_zbee_nwk_gp_cmd_comm_ms_ext_gclp = -1;
static int hf_zbee_nwk_gp_cmd_comm_ms_ext_mip = -1;
static int hf_zbee_nwk_gp_cmd_comm_ms_ext_mmip = -1;
+static int hf_zbee_nwk_gp_cmd_comm_gpd_cmd_num = -1;
+static int hf_zbee_nwk_gp_cmd_comm_gpd_cmd_id_list = -1;
+static int hf_zbee_nwk_gp_cmd_comm_length_of_clid_list = -1;
+static int hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_server = -1;
+static int hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_client = -1;
+static int hf_zbee_nwk_cmd_comm_clid_list_server = -1;
+static int hf_zbee_nwk_cmd_comm_clid_list_client = -1;
+static int hf_zbee_nwk_cmd_comm_cluster_id = -1;
/* Commissioning reply. */
static int hf_zbee_nwk_gp_cmd_comm_rep_opt = -1;
@@ -307,6 +319,10 @@ static gint ett_zbee_nwk_cmd_ms_ext = -1;
static gint ett_zbee_nwk_cmd_options = -1;
static gint ett_zbee_nwk_fcf = -1;
static gint ett_zbee_nwk_fcf_ext = -1;
+static gint ett_zbee_nwk_cmd_comm_gpd_cmd_id_list = -1;
+static gint ett_zbee_nwk_cmd_comm_length_of_clid_list = -1;
+static gint ett_zbee_nwk_cmd_comm_clid_list_server = -1;
+static gint ett_zbee_nwk_cmd_comm_clid_list_client = -1;
/* Common. */
static GSList *zbee_gp_keyring = NULL;
@@ -659,6 +675,18 @@ dissect_zbee_nwk_gp_cmd_commissioning(tvbuff_t *tvb, packet_info *pinfo _U_, pro
guint8 comm_ext_options = 0;
guint8 ms_ext_options = 0;
guint16 manufacturer_id = 0;
+
+ guint8 i;
+ guint8 gpd_cmd_num = 0;
+ proto_item *gpd_cmd_list;
+ proto_tree *gpd_cmd_list_tree;
+
+ guint8 length_of_clid_list_bm;
+ guint8 server_clid_num;
+ guint8 client_clid_num;
+ proto_item *server_clid_list, *client_clid_list;
+ proto_tree *server_clid_list_tree, *client_clid_list_tree;
+
static const int * options[] = {
&hf_zbee_nwk_gp_cmd_comm_opt_mac_sec_num_cap,
&hf_zbee_nwk_gp_cmd_comm_opt_rx_on_cap,
@@ -684,6 +712,11 @@ dissect_zbee_nwk_gp_cmd_commissioning(tvbuff_t *tvb, packet_info *pinfo _U_, pro
&hf_zbee_nwk_gp_cmd_comm_ms_ext_crp,
NULL
};
+ static const int * length_of_clid_list[] = {
+ &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_server,
+ &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_client,
+ NULL
+ };
/* Get Device ID and display it. */
proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_device_id, tvb, offset, 1, ENC_LITTLE_ENDIAN);
@@ -740,6 +773,58 @@ dissect_zbee_nwk_gp_cmd_commissioning(tvbuff_t *tvb, packet_info *pinfo _U_, pro
break;
}
}
+ if (ms_ext_options & ZBEE_NWK_GP_CMD_COMMISSIONING_MS_EXT_GCLP) {
+ /* Get and display number of GPD commands */
+ gpd_cmd_num = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_gpd_cmd_num, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+ /* Display GPD command list */
+ if (gpd_cmd_num > 0) {
+ gpd_cmd_list = proto_tree_add_item(tree, hf_zbee_nwk_gp_cmd_comm_gpd_cmd_id_list,
+ tvb, offset, gpd_cmd_num, ENC_NA);
+ gpd_cmd_list_tree = proto_item_add_subtree(gpd_cmd_list, ett_zbee_nwk_cmd_comm_gpd_cmd_id_list);
+ for (i = 0; i < gpd_cmd_num; i++, offset++) {
+ /* Display command id */
+ proto_tree_add_item(gpd_cmd_list_tree, hf_zbee_nwk_gp_command_id,
+ tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ }
+ }
+ }
+ if (ms_ext_options & ZBEE_NWK_GP_CMD_COMMISSIONING_MS_EXT_CRP) {
+ /* Get and display Cluster List */
+ length_of_clid_list_bm = tvb_get_guint8(tvb, offset);
+ server_clid_num = (length_of_clid_list_bm & ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_SRV) >>
+ ws_ctz(ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_SRV);
+ client_clid_num = (length_of_clid_list_bm & ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_CLI ) >>
+ ws_ctz(ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_CLI);
+
+ proto_tree_add_bitmask(tree, tvb, offset, hf_zbee_nwk_gp_cmd_comm_length_of_clid_list,
+ ett_zbee_nwk_cmd_comm_length_of_clid_list, length_of_clid_list, ENC_NA);
+ offset += 1;
+
+ if (server_clid_num > 0) {
+ /* Display server cluster list */
+ server_clid_list = proto_tree_add_item(tree, hf_zbee_nwk_cmd_comm_clid_list_server,
+ tvb, offset, 2*server_clid_num, ENC_NA);
+ server_clid_list_tree = proto_item_add_subtree(server_clid_list, ett_zbee_nwk_cmd_comm_clid_list_server);
+ /* Retrieve server clusters */
+ for (i = 0; i < server_clid_num; i++, offset += 2) {
+ proto_tree_add_item(server_clid_list_tree, hf_zbee_nwk_cmd_comm_cluster_id,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ }
+ }
+ if (client_clid_num > 0) {
+ /* Display client cluster list */
+ client_clid_list = proto_tree_add_item(tree, hf_zbee_nwk_cmd_comm_clid_list_client,
+ tvb, offset, 2*client_clid_num, ENC_NA);
+ client_clid_list_tree = proto_item_add_subtree(client_clid_list, ett_zbee_nwk_cmd_comm_clid_list_client);
+ /* Retrieve client clusters */
+ for (i = 0; i < client_clid_num; i++, offset += 2) {
+ proto_tree_add_item(client_clid_list_tree, hf_zbee_nwk_cmd_comm_cluster_id,
+ tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ }
+ }
+ }
}
return offset;
} /* dissect_zbee_nwk_gp_cmd_commissioning */
@@ -1606,6 +1691,38 @@ proto_register_zbee_nwk_gp(void)
{ "Manufacturer Model ID present", "zbee_nwk_gp.cmd.comm.ms_ext.mmip", FT_BOOLEAN, 8, NULL,
ZBEE_NWK_GP_CMD_COMMISSIONING_MS_EXT_MMIP , NULL, HFILL }},
+ { &hf_zbee_nwk_gp_cmd_comm_gpd_cmd_num,
+ { "Number of GPD commands", "zbee_nwk_gp.cmd.comm.gpd_cmd_num", FT_UINT8, BASE_DEC, NULL,
+ 0x0 , NULL, HFILL }},
+
+ { &hf_zbee_nwk_gp_cmd_comm_gpd_cmd_id_list,
+ { "GPD CommandID list", "zbee_nwk_gp.cmd.comm.gpd_cmd_id_list", FT_NONE, BASE_NONE, NULL,
+ 0x0 , NULL, HFILL }},
+
+ { &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list,
+ { "Length of ClusterID list", "zbee_nwk_gp.cmd.comm.length_of_clid_list", FT_UINT8, BASE_HEX, NULL,
+ 0x0 , NULL, HFILL }},
+
+ { &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_server,
+ { "Number of server ClusterIDs", "zbee_nwk_gp.cmd.comm.length_of_clid_list_srv", FT_UINT8, BASE_DEC, NULL,
+ ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_SRV, NULL, HFILL }},
+
+ { &hf_zbee_nwk_gp_cmd_comm_length_of_clid_list_client,
+ { "Number of client ClusterIDs", "zbee_nwk_gp.cmd.comm.length_of_clid_list_cli", FT_UINT8, BASE_DEC, NULL,
+ ZBEE_NWK_GP_CMD_COMMISSIONING_CLID_LIST_LEN_CLI, NULL, HFILL }},
+
+ { &hf_zbee_nwk_cmd_comm_clid_list_server,
+ { "Cluster ID List Server", "zbee_nwk_gp.cmd.comm.clid_list_server", FT_NONE, BASE_NONE, NULL,
+ 0x0 , NULL, HFILL }},
+
+ { &hf_zbee_nwk_cmd_comm_clid_list_client,
+ { "ClusterID List Client", "zbee_nwk_gp.cmd.comm.clid_list_client", FT_NONE, BASE_NONE, NULL,
+ 0x0 , NULL, HFILL }},
+
+ { &hf_zbee_nwk_cmd_comm_cluster_id,
+ { "Cluster ID", "zbee_nwk_gp.cmd.comm.cluster_id", FT_UINT16, BASE_HEX, NULL,
+ 0x0 , NULL, HFILL }},
+
{ &hf_zbee_nwk_gp_cmd_comm_rep_opt_key_encr,
{ "GPD Key Encryption", "zbee_nwk_gp.cmd.comm_reply.opt.sec_key_encr", FT_BOOLEAN, 8, NULL,
ZBEE_NWK_GP_CMD_COMMISSIONING_REP_OPT_KEY_ENCR, NULL, HFILL }},
@@ -1703,7 +1820,11 @@ proto_register_zbee_nwk_gp(void)
&ett_zbee_nwk_cmd_ms_ext,
&ett_zbee_nwk_cmd_options,
&ett_zbee_nwk_fcf,
- &ett_zbee_nwk_fcf_ext
+ &ett_zbee_nwk_fcf_ext,
+ &ett_zbee_nwk_cmd_comm_gpd_cmd_id_list,
+ &ett_zbee_nwk_cmd_comm_length_of_clid_list,
+ &ett_zbee_nwk_cmd_comm_clid_list_server,
+ &ett_zbee_nwk_cmd_comm_clid_list_client
};
static uat_field_t key_uat_fields[] = {