diff options
author | Deepthi Mary <deepthi.kalaiarasan@microchip.com> | 2022-07-05 07:25:46 +0000 |
---|---|---|
committer | A Wireshark GitLab Utility <6629907-ws-gitlab-utility@users.noreply.gitlab.com> | 2022-07-05 07:25:46 +0000 |
commit | dfa160832dbe4c165f8391fbc13fc966b937b02c (patch) | |
tree | a08c078423d023576b851b01a392d44fb9f0c241 | |
parent | a877f2d5f3ba7a036139f355e7067b002713772c (diff) |
Adding 9 zbee zcl frames
-rw-r--r-- | epan/dissectors/packet-zbee-zcl.c | 215 | ||||
-rw-r--r-- | epan/dissectors/packet-zbee-zcl.h | 6 |
2 files changed, 218 insertions, 3 deletions
diff --git a/epan/dissectors/packet-zbee-zcl.c b/epan/dissectors/packet-zbee-zcl.c index cdcad11e1d..9a5ce64547 100644 --- a/epan/dissectors/packet-zbee-zcl.c +++ b/epan/dissectors/packet-zbee-zcl.c @@ -39,6 +39,12 @@ static void dissect_zcl_read_report_config_resp (tvbuff_t *tvb, packet_info *pin static void dissect_zcl_default_resp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset); static void dissect_zcl_discover_attr (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset); static void dissect_zcl_discover_attr_resp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset, guint16 cluster_id, guint16 mfr_code, gboolean direction); +static void dissect_zcl_read_attr_struct(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, guint* offset, guint16 cluster_id, guint16 mfr_code, gboolean direction); +static void dissect_zcl_write_attr_struct(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, guint* offset, guint16 cluster_id, guint16 mfr_code, gboolean direction); +static void dissect_zcl_write_attr_struct_resp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, guint* offset, guint16 cluster_id, guint16 mfr_code, gboolean direction); +static void dissect_zcl_discover_cmd_rec(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, guint* offset); +static void dissect_zcl_discover_cmd_rec_resp(tvbuff_t* tvb, packet_info* pinfo, proto_tree* tree, guint* offset); +//static void dissect_zcl_discover_attr_extended_resp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset, guint16 cluster_id, guint16 mfr_code, gboolean direction); /* Helper routines */ static void dissect_zcl_attr_data_general(tvbuff_t *tvb, proto_tree *tree, guint *offset, guint16 attr_id, guint data_type, guint16 cluster_id, guint16 mfr_code, gboolean client_attr); @@ -48,7 +54,7 @@ static void dissect_zcl_array_type(tvbuff_t *tvb, proto_tree *tree, guint *offse static void dissect_zcl_set_type(tvbuff_t *tvb, proto_tree *tree, guint *offset, guint8 elements_type, guint16 elements_num, gboolean client_attr); static zbee_zcl_cluster_desc *zbee_zcl_get_cluster_desc(guint16 cluster_id, guint16 mfr_code); - +static void dissect_zcl_discover_cmd_attr_extended_resp(tvbuff_t* tvb, packet_info* pinfo _U_, proto_tree* tree, guint* offset, guint16 cluster_id, guint16 mfr_code, gboolean direction); /******************** * Global Variables * ******************** @@ -61,12 +67,16 @@ static int hf_zbee_zcl_fcf_dir = -1; static int hf_zbee_zcl_fcf_disable_default_resp = -1; static int hf_zbee_zcl_mfr_code = -1; static int hf_zbee_zcl_tran_seqno = -1; - static int hf_zbee_zcl_cmd_id = -1; static int hf_zbee_zcl_cs_cmd_id = -1; static int hf_zbee_zcl_cmd_id_rsp = -1; static int hf_zbee_zcl_attr_id = -1; static int hf_zbee_zcl_attr_data_type = -1; +static int hf_zbee_zcl_attr_access_ctrl = -1; +static int hf_zbee_zcl_indicator = -1; +static int hf_zbee_zcl_index = -1; +static int hf_zbee_zcl_cmd_start = -1; +static int hf_zbee_zcl_cmd_maxnum = -1; static int hf_zbee_zcl_attr_boolean = -1; static int hf_zbee_zcl_attr_bitmap8 = -1; static int hf_zbee_zcl_attr_bitmap16 = -1; @@ -124,6 +134,7 @@ static int hf_zbee_zcl_attr_bag_elements_num = -1; 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_sel[ZBEE_ZCL_NUM_IND_FIELD]; static gint ett_zbee_zcl_array_elements[ZBEE_ZCL_NUM_ARRAY_ELEM_ETT]; static expert_field ei_cfg_rpt_rsp_short_non_success = EI_INIT; @@ -1191,6 +1202,7 @@ static int dissect_zbee_zcl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, break; case ZBEE_ZCL_CMD_DISCOVER_ATTR: + case ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED: dissect_zcl_discover_attr(tvb, pinfo, zcl_tree, &offset); break; @@ -1198,11 +1210,37 @@ static int dissect_zbee_zcl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, dissect_zcl_discover_attr_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction); break; - /* BUGBUG: don't dissect these for now */ + /* BUGBUG: don't dissect these for now*/ case ZBEE_ZCL_CMD_READ_ATTR_STRUCT: + dissect_zcl_read_attr_struct(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction); + break; + case ZBEE_ZCL_CMD_WRITE_ATTR_STRUCT: + dissect_zcl_write_attr_struct(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction); + break; + case ZBEE_ZCL_CMD_WRITE_ATTR_STRUCT_RESP: + dissect_zcl_write_attr_struct_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction); break; + + case ZBEE_ZCL_CMD_DISCOVER_CMDS_REC: + case ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN: + dissect_zcl_discover_cmd_rec(tvb, pinfo, zcl_tree, &offset); + break; + + case ZBEE_ZCL_CMD_DISCOVER_CMDS_REC_RESP: + case ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN_RESP: + dissect_zcl_discover_cmd_rec_resp(tvb, pinfo, zcl_tree, &offset); + break; + + /* case ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN_RESP: + dissect_zcl_discover_cmd_gen_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction); + break;*/ + + case ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED_RESP: + dissect_zcl_discover_cmd_attr_extended_resp(tvb, pinfo, zcl_tree, &offset, cluster_id, packet.mfr_code, packet.direction); + break; + } /* switch */ } zcl_dump_data(tvb, offset, pinfo, zcl_tree); @@ -1695,6 +1733,155 @@ static void dissect_zcl_discover_attr_resp(tvbuff_t *tvb, packet_info *pinfo _U_ } /* dissect_zcl_discover_attr_resp */ +static void dissect_zcl_read_attr_struct(tvbuff_t* tvb, packet_info* pinfo _U_, proto_tree* tree, guint* offset, + guint16 cluster_id, guint16 mfr_code, gboolean direction) +{ + proto_tree *sub_tree = NULL; + guint tvb_len; + guint i = 0, j=0; +// guint16 attr_id; + guint8 indicator; + gboolean client_attr = direction == ZBEE_ZCL_FCF_TO_CLIENT; + tvb_len = tvb_captured_length(tvb); + while (*offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT) { + /* Create subtree for aelector field */ + sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_sel[i], NULL, "Selector"); + i++; + /* Dissect the attribute identifier */ +// attr_id = tvb_get_letohs(tvb, *offset); + dissect_zcl_attr_id(tvb, tree, offset, cluster_id, mfr_code, client_attr); + proto_tree_add_item(sub_tree, hf_zbee_zcl_indicator, tvb, *offset, 1, ENC_LITTLE_ENDIAN); + indicator = tvb_get_guint8(tvb, *offset); + *offset += 1; + j=0; + while (j < indicator) { + proto_tree_add_item(sub_tree, hf_zbee_zcl_index, tvb, *offset, 2, ENC_LITTLE_ENDIAN); + //index = tvb_get_letohs(tvb, offset); + /*index = dissect_zcl_array_type();*/ + j++; + *offset += 2; + } + } + +}/*dissect_zcl_read_attr_struct*/ + +static void dissect_zcl_write_attr_struct(tvbuff_t* tvb, packet_info* pinfo _U_, proto_tree* tree, guint* offset, + guint16 cluster_id, guint16 mfr_code, gboolean direction) +{ + proto_tree *sub_tree = NULL; + proto_tree *sub_tree_1 = NULL; + guint tvb_len, indicator; + guint i = 0, j=0; + guint16 attr_id; + gboolean client_attr = direction == ZBEE_ZCL_FCF_TO_CLIENT; + tvb_len = tvb_captured_length(tvb); + while(*offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT){ + /* Create subtree for aelector field */ + sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Attribute Record"); + sub_tree_1 = proto_tree_add_subtree(sub_tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Selector"); + i++; + /* Dissect the attribute identifier */ + attr_id = tvb_get_letohs(tvb, *offset); + dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr); + if(sub_tree_1){ + proto_tree_add_item(sub_tree, hf_zbee_zcl_indicator, tvb, 0, 1, ENC_LITTLE_ENDIAN); + indicator = tvb_get_guint8(tvb, *offset); + (* offset) += 1; + j=0; + while (j < indicator) { + proto_tree_add_item(sub_tree, hf_zbee_zcl_index, tvb, 0, 2, ENC_LITTLE_ENDIAN); + j++; + (* offset) += 2; + } + } + /* Dissect the attribute data type and data */ + dissect_zcl_attr_data_type_val(tvb, sub_tree, offset, attr_id, cluster_id, mfr_code, client_attr); + } + /* Set end for subtree */ + proto_item_set_end(proto_tree_get_parent(sub_tree_1), tvb, *offset); +} + +static void dissect_zcl_write_attr_struct_resp(tvbuff_t* tvb, packet_info* pinfo _U_, proto_tree* tree, guint* offset, guint16 cluster_id, guint16 mfr_code, gboolean direction){ + + proto_tree *sub_tree; + proto_tree *sub_tree_1; + guint tvb_len, indicator; + guint i = 0,j = 0; + gboolean client_attr = direction == ZBEE_ZCL_FCF_TO_SERVER; + tvb_len = tvb_captured_length(tvb); + while (*offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT) { + /* Create subtree for attribute status field */ + sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Write Attribute Record"); + sub_tree_1 = proto_tree_add_subtree(sub_tree, tvb, *offset, 0, ett_zbee_zcl_attr[i], NULL, "Selector"); + i++; + /* Dissect the status */ + if (dissect_zcl_attr_uint8(tvb, sub_tree, offset, &hf_zbee_zcl_attr_status) != + ZBEE_ZCL_STAT_SUCCESS) { + /* Dissect the failed attribute identifier */ + dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr); + if (sub_tree_1) { + proto_tree_add_item(sub_tree, hf_zbee_zcl_indicator, tvb, 0, 1, ENC_LITTLE_ENDIAN); + indicator = tvb_get_guint8(tvb, *offset); + *offset += 1; + j = 0; + while (j < indicator) { + proto_tree_add_item(sub_tree, hf_zbee_zcl_index, tvb, 0, 2, ENC_LITTLE_ENDIAN); + //index = tvb_get_letohs(tvb, offset); + /*index = dissect_zcl_array_type();*/ + j++; + *offset += 2; + } + } + } + } + /* Set end for subtree */ +// proto_item_set_end(proto_tree_get_parent(sub_tree_1), tvb, *offset); +} +static void dissect_zcl_discover_cmd_rec(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint *offset) +{ + dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_cmd_start); + /* Dissect the number of maximum attribute identifiers */ + dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_cmd_maxnum); + return; +} +static void dissect_zcl_discover_cmd_rec_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint *offset) +{ + guint tvb_len; + guint i = 0; + gint discovery_complete = -1; + discovery_complete = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_dis); + if(discovery_complete == 0){ + tvb_len = tvb_captured_length(tvb); + while ( *offset < tvb_len && i < (tvb_len-1) ) { + /* Dissect the command identifiers */ + dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_cs_cmd_id); + i++; + } + } +} + +static void dissect_zcl_discover_cmd_attr_extended_resp(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, guint *offset, guint16 cluster_id, guint16 mfr_code, gboolean direction){ + proto_tree* sub_tree = NULL; + guint tvb_len; + guint i = 0; + gint discovery_complete = -1; + guint16 attr_id = 0; + gboolean client_attr = direction == ZBEE_ZCL_FCF_TO_SERVER; + discovery_complete = dissect_zcl_attr_uint8(tvb, tree, offset, &hf_zbee_zcl_attr_dis); + if(discovery_complete == 0){ + tvb_len = tvb_captured_length(tvb); + while ( *offset < tvb_len && i < ZBEE_ZCL_NUM_ATTR_ETT ){ + sub_tree = proto_tree_add_subtree(tree, tvb, *offset, 4, ett_zbee_zcl_attr[i], NULL, "Extended Attribute Information"); + i++; + attr_id = tvb_get_letohs(tvb, *offset); + dissect_zcl_attr_id(tvb, sub_tree, offset, cluster_id, mfr_code, client_attr); + dissect_zcl_attr_data_type_val(tvb, sub_tree, offset, attr_id, cluster_id, mfr_code, client_attr); + proto_tree_add_item(sub_tree, hf_zbee_zcl_attr_access_ctrl, tvb, 0, 1, ENC_LITTLE_ENDIAN); + *offset += 1; + } + } +} + /** *Dissects Attribute ID field. This could be done with the * @@ -2558,10 +2745,27 @@ void proto_register_zbee_zcl(void) { "Direction", "zbee_zcl.attr.dir", FT_UINT8, BASE_HEX, VALS(zbee_zcl_dir_names), 0x0, NULL, HFILL }}, + { &hf_zbee_zcl_indicator, + { "Indicator", "zbee_zcl.attr.ind", FT_UINT8, BASE_DEC, NULL, + 0X0, NULL, HFILL}}, + + { &hf_zbee_zcl_index, + { "Indicator", "zbee_zcl.attr.index", FT_UINT16, BASE_DEC, NULL, 0X0, NULL, HFILL}}, + + { &hf_zbee_zcl_attr_access_ctrl, + { "Attribute Access Control", "zbee_zcl.attr.access.ctrl", FT_UINT8, BASE_HEX, NULL, 0X0, NULL, HFILL}}, + { &hf_zbee_zcl_attr_dis, { "Discovery", "zbee_zcl.attr.dis", FT_UINT8, BASE_HEX, VALS(zbee_zcl_dis_names), 0x0, NULL, HFILL }}, + { &hf_zbee_zcl_cmd_start, + {"Start Command", "zbee_zcl.cmd.start", FT_UINT8, BASE_HEX, NULL, + 0X0, NULL, HFILL}}, + + { &hf_zbee_zcl_cmd_maxnum, + {"Maximum Number", "zbee_zcl.cmd.maxnum", FT_UINT8, BASE_HEX, NULL, 0X0, NULL, HFILL}}, + { &hf_zbee_zcl_attr_cid, { "Cluster", "zbee_zcl.attr.cid", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, @@ -2623,6 +2827,11 @@ void proto_register_zbee_zcl(void) ett[j] = &ett_zbee_zcl_attr[i]; } + + for(i=0; i<ZBEE_ZCL_NUM_IND_FIELD; i++){ + ett_zbee_zcl_sel[i] = -1; + } + for ( i = 0; i < ZBEE_ZCL_NUM_ARRAY_ELEM_ETT; i++, j++ ) { ett_zbee_zcl_array_elements[i] = -1; ett[j] = &ett_zbee_zcl_array_elements[i]; diff --git a/epan/dissectors/packet-zbee-zcl.h b/epan/dissectors/packet-zbee-zcl.h index 6e342e47ac..313d4dcb87 100644 --- a/epan/dissectors/packet-zbee-zcl.h +++ b/epan/dissectors/packet-zbee-zcl.h @@ -45,6 +45,11 @@ typedef struct{ #define ZBEE_ZCL_CMD_WRITE_ATTR_STRUCT_RESP 0x10 #define ZBEE_ZCL_CMD_DISCOVER_CMDS_REC 0x11 #define ZBEE_ZCL_CMD_DISCOVER_CMDS_REC_RESP 0x12 +#define ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN 0X13 +#define ZBEE_ZCL_CMD_DISCOVER_CMDS_GEN_RESP 0X14 +#define ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED 0x15 +#define ZBEE_ZCL_CMD_DISCOVER_ATTR_EXTENDED_RESP 0x16 + /* ZCL Data Types */ #define ZBEE_ZCL_NO_DATA 0x00 @@ -123,6 +128,7 @@ typedef struct{ #define ZBEE_ZCL_INVALID_LONG_STR_LENGTH 0xffff #define ZBEE_ZCL_NUM_INDIVIDUAL_ETT 2 #define ZBEE_ZCL_NUM_ATTR_ETT 64 +#define ZBEE_ZCL_NUM_IND_FIELD 16 #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) #define ZBEE_ZCL_DIR_REPORTED 0 |