diff options
author | Nikita Ryaskin <nikita.ryaskin@dsr-corporation.com> | 2019-03-01 16:41:39 +0300 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2019-03-04 13:01:15 +0000 |
commit | 94e676d5789f3c642ea70206d961a14ff00eab34 (patch) | |
tree | e020642a86c2bd1692c548c085f879cbf808572f /epan/dissectors/packet-zbee-zcl-se.c | |
parent | b2d93718ec82b9d4f68f7e9fcb6fc707f41a0f16 (diff) |
ZBEE ZCL: updated Energy Management Cluster dissection.
Implemented commands payload dissectors.
Change-Id: Ic1141cacf60754c97cb8e455d85e63239ecc7c79
Reviewed-on: https://code.wireshark.org/review/32307
Reviewed-by: Kenneth Soerensen <knnthsrnsn@gmail.com>
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-zbee-zcl-se.c')
-rw-r--r-- | epan/dissectors/packet-zbee-zcl-se.c | 326 |
1 files changed, 323 insertions, 3 deletions
diff --git a/epan/dissectors/packet-zbee-zcl-se.c b/epan/dissectors/packet-zbee-zcl-se.c index 9bd53492f5..8724295a19 100644 --- a/epan/dissectors/packet-zbee-zcl-se.c +++ b/epan/dissectors/packet-zbee-zcl-se.c @@ -10472,8 +10472,11 @@ VALUE_STRING_ARRAY(zbee_zcl_energy_management_srv_tx_cmd_names); void proto_register_zbee_zcl_energy_management(void); void proto_reg_handoff_zbee_zcl_energy_management(void); +static void dissect_zbee_zcl_energy_management_manage_event (tvbuff_t *tvb, proto_tree *tree, guint *offset); +static void dissect_zbee_zcl_energy_management_report_event_status (tvbuff_t *tvb, proto_tree *tree, guint *offset); + /* Attribute Dissector Helpers */ -static void dissect_zcl_energy_management_attr_data(proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr); +static void dissect_zcl_energy_management_attr_data (proto_tree *tree, tvbuff_t *tvb, guint *offset, guint16 attr_id, guint data_type, gboolean client_attr); /*************************/ /* Global Variables */ @@ -10486,9 +10489,97 @@ static int hf_zbee_zcl_energy_management_srv_tx_cmd_id = -1; static int hf_zbee_zcl_energy_management_srv_rx_cmd_id = -1; static int hf_zbee_zcl_energy_management_attr_id = -1; static int hf_zbee_zcl_energy_management_attr_reporting_status = -1; +static int hf_zbee_zcl_energy_management_issuer_event_id = -1; +static int hf_zbee_zcl_energy_management_device_class = -1; +static int hf_zbee_zcl_energy_management_device_class_hvac_compressor_or_furnace = -1; +static int hf_zbee_zcl_energy_management_device_class_strip_heaters_baseboard_heaters = -1; +static int hf_zbee_zcl_energy_management_device_class_water_heater = -1; +static int hf_zbee_zcl_energy_management_device_class_pool_pump_spa_jacuzzi = -1; +static int hf_zbee_zcl_energy_management_device_class_smart_appliances = -1; +static int hf_zbee_zcl_energy_management_device_class_irrigation_pump = -1; +static int hf_zbee_zcl_energy_management_device_class_managed_c_i_loads= -1; +static int hf_zbee_zcl_energy_management_device_class_simple_misc_loads = -1; +static int hf_zbee_zcl_energy_management_device_class_exterior_lighting = -1; +static int hf_zbee_zcl_energy_management_device_class_interior_lighting = -1; +static int hf_zbee_zcl_energy_management_device_class_electric_vehicle = -1; +static int hf_zbee_zcl_energy_management_device_class_generation_systems = -1; +static int hf_zbee_zcl_energy_management_device_class_reserved = -1; +static int hf_zbee_zcl_energy_management_utility_enrollment_group = -1; +static int hf_zbee_zcl_energy_management_action_required = -1; +static int hf_zbee_zcl_energy_management_action_required_opt_out_of_event = -1; +static int hf_zbee_zcl_energy_management_action_required_opt_into_event = -1; +static int hf_zbee_zcl_energy_management_action_required_disable_duty_cycling = -1; +static int hf_zbee_zcl_energy_management_action_required_enable_duty_cycling = -1; +static int hf_zbee_zcl_energy_management_action_required_reserved = -1; + +static int hf_zbee_zcl_energy_management_report_event_issuer_event_id = -1; +static int hf_zbee_zcl_energy_management_report_event_event_status = -1; +static int hf_zbee_zcl_energy_management_report_event_event_status_time = -1; +static int hf_zbee_zcl_energy_management_report_event_criticality_level_applied = -1; +static int hf_zbee_zcl_energy_management_report_event_cooling_temp_set_point_applied = -1; +static int hf_zbee_zcl_energy_management_report_event_heating_temp_set_point_applied = -1; +static int hf_zbee_zcl_energy_management_report_event_average_load_adjustment_percentage = -1; +static int hf_zbee_zcl_energy_management_report_event_duty_cycle = -1; +static int hf_zbee_zcl_energy_management_report_event_event_control = -1; +static int hf_zbee_zcl_energy_management_report_event_event_control_randomize_start_time = -1; +static int hf_zbee_zcl_energy_management_report_event_event_control_randomize_duration_time = -1; +static int hf_zbee_zcl_energy_management_report_event_event_control_reserved = -1; + + +static const int* zbee_zcl_energy_management_device_classes[] = { + &hf_zbee_zcl_energy_management_device_class_hvac_compressor_or_furnace, + &hf_zbee_zcl_energy_management_device_class_strip_heaters_baseboard_heaters, + &hf_zbee_zcl_energy_management_device_class_water_heater, + &hf_zbee_zcl_energy_management_device_class_pool_pump_spa_jacuzzi, + &hf_zbee_zcl_energy_management_device_class_smart_appliances, + &hf_zbee_zcl_energy_management_device_class_irrigation_pump, + &hf_zbee_zcl_energy_management_device_class_managed_c_i_loads, + &hf_zbee_zcl_energy_management_device_class_simple_misc_loads, + &hf_zbee_zcl_energy_management_device_class_exterior_lighting, + &hf_zbee_zcl_energy_management_device_class_interior_lighting, + &hf_zbee_zcl_energy_management_device_class_electric_vehicle, + &hf_zbee_zcl_energy_management_device_class_generation_systems, + &hf_zbee_zcl_energy_management_device_class_reserved, + NULL +}; + +static const int* zbee_zcl_energy_management_action_required[] = { + &hf_zbee_zcl_energy_management_action_required_opt_out_of_event, + &hf_zbee_zcl_energy_management_action_required_opt_into_event, + &hf_zbee_zcl_energy_management_action_required_disable_duty_cycling, + &hf_zbee_zcl_energy_management_action_required_enable_duty_cycling, + &hf_zbee_zcl_energy_management_action_required_reserved, + NULL +}; + +static const int* hf_zbee_zcl_energy_management_event_control_flags[] = { + &hf_zbee_zcl_energy_management_report_event_event_control_randomize_start_time, + &hf_zbee_zcl_energy_management_report_event_event_control_randomize_duration_time, + &hf_zbee_zcl_energy_management_report_event_event_control_reserved, + NULL +}; /* Initialize the subtree pointers */ static gint ett_zbee_zcl_energy_management = -1; +static gint ett_zbee_zcl_energy_management_device_class = -1; +static gint ett_zbee_zcl_energy_management_actions_required = -1; +static gint ett_zbee_zcl_energy_management_report_event_event_control = -1; + +static const range_string zbee_zcl_energy_management_load_control_event_criticality_level[] = { + { 0x0, 0x0, "Reserved" }, + { 0x1, 0x1, "Green" }, + { 0x2, 0x2, "1" }, + { 0x3, 0x3, "2" }, + { 0x4, 0x4, "3" }, + { 0x5, 0x5, "4" }, + { 0x6, 0x6, "5" }, + { 0x7, 0x7, "Emergency" }, + { 0x8, 0x8, "Planned Outage" }, + { 0x9, 0x9, "Service Disconnect" }, + { 0x0A, 0x0F, "Utility Defined" }, + { 0x10, 0xFF, "Reserved" }, + { 0, 0, NULL } +}; /*************************/ /* Function Bodies */ @@ -10527,6 +10618,97 @@ dissect_zcl_energy_management_attr_data(proto_tree *tree, tvbuff_t *tvb, guint * *@param pinfo pointer to packet information fields *@param tree pointer to data tree Wireshark uses to display packet. */ +static void +dissect_zbee_zcl_energy_management_manage_event(tvbuff_t *tvb, proto_tree *tree, guint *offset) +{ + /* Issuer Event ID */ + proto_tree_add_item(tree, hf_zbee_zcl_energy_management_issuer_event_id, tvb, + *offset, 4, ENC_LITTLE_ENDIAN); + *offset += 4; + + /* Device Class */ + proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_energy_management_device_class, ett_zbee_zcl_energy_management_device_class, + zbee_zcl_energy_management_device_classes, ENC_LITTLE_ENDIAN); + *offset += 2; + + /* Utility Enrollment Group */ + proto_tree_add_item(tree, hf_zbee_zcl_energy_management_utility_enrollment_group, tvb, + *offset, 1, ENC_NA); + *offset += 1; + + /* Action(s) Required */ + proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_energy_management_action_required, ett_zbee_zcl_energy_management_actions_required, + zbee_zcl_energy_management_action_required, ENC_NA); + *offset += 1; +} + +/** + *ZigBee ZCL Energy Management 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. +*/ +static void +dissect_zbee_zcl_energy_management_report_event_status(tvbuff_t *tvb, proto_tree *tree, guint *offset) +{ + /* Event Control */ + nstime_t event_status_time; + + /* Issuer Event ID */ + proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_issuer_event_id, tvb, + *offset, 4, ENC_LITTLE_ENDIAN); + *offset += 4; + + /* Event Status */ + proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_event_status, tvb, *offset, 1, ENC_NA); + *offset += 1; + + /* Event Status Time */ + event_status_time.secs = (time_t)tvb_get_letohl(tvb, *offset) + ZBEE_ZCL_NSTIME_UTC_OFFSET; + event_status_time.nsecs = 0; + proto_tree_add_time(tree, hf_zbee_zcl_energy_management_report_event_event_status_time, tvb, *offset, 4, &event_status_time); + *offset += 4; + + /* Criticality Level Applied */ + proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_criticality_level_applied, tvb, + *offset, 1, ENC_NA); + *offset += 1; + + /* Cooling Temperature Set Point Applied */ + proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_cooling_temp_set_point_applied, tvb, + *offset, 2, ENC_LITTLE_ENDIAN); + *offset += 2; + + /* Heating Temperature Set Point Applied */ + proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_heating_temp_set_point_applied, tvb, + *offset, 2, ENC_LITTLE_ENDIAN); + *offset += 2; + + /* Average Load Adjustment Percentage Applied */ + proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_average_load_adjustment_percentage, tvb, + *offset, 1, ENC_NA); + *offset += 1; + + /* Duty Cycle Applied */ + proto_tree_add_item(tree, hf_zbee_zcl_energy_management_report_event_duty_cycle, tvb, + *offset, 1, ENC_NA); + *offset += 1; + + /* Event Control */ + proto_tree_add_bitmask(tree, tvb, *offset, hf_zbee_zcl_drlc_report_event_event_control, ett_zbee_zcl_energy_management_report_event_event_control, + hf_zbee_zcl_energy_management_event_control_flags, ENC_LITTLE_ENDIAN); + *offset += 1; + +} /*dissect_zbee_zcl_energy_management_report_event_status*/ + +/** + *ZigBee ZCL Energy Management 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. +*/ static int dissect_zbee_zcl_energy_management(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) { @@ -10560,7 +10742,7 @@ dissect_zbee_zcl_energy_management(tvbuff_t *tvb, packet_info *pinfo, proto_tree switch (cmd_id) { case ZBEE_ZCL_CMD_ID_ENERGY_MANAGEMENT_MANAGE_EVENT: - /* Add function to dissect payload */ + dissect_zbee_zcl_energy_management_manage_event(tvb, tree, &offset); break; default: @@ -10586,7 +10768,7 @@ dissect_zbee_zcl_energy_management(tvbuff_t *tvb, packet_info *pinfo, proto_tree switch (cmd_id) { case ZBEE_ZCL_CMD_ID_ENERGY_MANAGEMENT_REPORT_EVENT_STATUS: - /* Add function to dissect payload */ + dissect_zbee_zcl_energy_management_report_event_status(tvb, tree, &offset); break; default: @@ -10623,11 +10805,149 @@ proto_register_zbee_zcl_energy_management(void) { "Command", "zbee_zcl_se.energy_management.cmd.srv_rx.id", FT_UINT8, BASE_HEX, VALS(zbee_zcl_energy_management_srv_rx_cmd_names), 0x00, NULL, HFILL } }, + { &hf_zbee_zcl_energy_management_issuer_event_id, + { "Issuer Event ID", "zbee_zcl_se.energy_management.issuer_id", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class, + { "Device Class", "zbee_zcl_se.energy_management.device_class", + FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_hvac_compressor_or_furnace, + { "HVAC Compressor or Furnace", "zbee_zcl_se.energy_management.device_class.hvac_compressor_or_furnace", + FT_BOOLEAN, 16, NULL, 0x0001, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_strip_heaters_baseboard_heaters, + { "Strip Heaters/Baseboard Heaters", "zbee_zcl_se.energy_management.device_class.strip_heaters_baseboard_heaters", + FT_BOOLEAN, 16, NULL, 0x0002, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_water_heater, + { "Water Heater", "zbee_zcl_se.energy_management.device_class.water_heater", + FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_pool_pump_spa_jacuzzi, + { "Pool Pump/Spa/Jacuzzi", "zbee_zcl_se.energy_management.device_class.pool_pump_spa_jacuzzi", + FT_BOOLEAN, 16, NULL, 0x0008, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_smart_appliances, + { "Smart Appliances", "zbee_zcl_se.energy_management.device_class.smart_appliances", + FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_irrigation_pump, + { "Irrigation Pump", "zbee_zcl_se.energy_management.device_class.irrigation_pump", + FT_BOOLEAN, 16, NULL, 0x0020, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_managed_c_i_loads, + { "Managed Commercial & Industrial (C&I) loads", "zbee_zcl_se.energy_management.device_class.managed_c_i_loads", + FT_BOOLEAN, 16, NULL, 0x0040, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_simple_misc_loads, + { "Simple misc. (Residential On/Off) loads", "zbee_zcl_se.energy_management.device_class.simple_misc_loads", + FT_BOOLEAN, 16, NULL, 0x0080, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_exterior_lighting, + { "Exterior Lighting", "zbee_zcl_se.energy_management.device_class.exterior_lighting", + FT_BOOLEAN, 16, NULL, 0x0100, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_interior_lighting, + { "Interior Lighting", "zbee_zcl_se.energy_management.device_class.interior_lighting", + FT_BOOLEAN, 16, NULL, 0x0200, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_electric_vehicle, + { "Electric Vehicle", "zbee_zcl_se.energy_management.device_class.electric_vehicle", + FT_BOOLEAN, 16, NULL, 0x0400, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_generation_systems, + { "Generation Systems", "zbee_zcl_se.energy_management.device_class.generation_systems", + FT_BOOLEAN, 16, NULL, 0x0800, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_device_class_reserved , + { "Reserved", "zbee_zcl_se.energy_management.device_class.reserved", + FT_UINT16, BASE_HEX, NULL, 0xF000, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_utility_enrollment_group, + { "Utility Enrollment Group", "zbee_zcl_se.energy_management.utility_enrollment_group", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_action_required, + { "Action(s) Required", "zbee_zcl_se.energy_management.action_required", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_action_required_opt_out_of_event, + { "Opt Out of Event", "zbee_zcl_se.energy_management.action_required.opt_out_of_event", + FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_action_required_opt_into_event, + { "Opt Into Event", "zbee_zcl_se.energy_management.action_required.opt_into_event", + FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_action_required_disable_duty_cycling, + { "Disable Duty Cycling", "zbee_zcl_se.energy_management.action_required.disable_duty_cycling", + FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_action_required_enable_duty_cycling, + { "Enable Duty Cycling", "zbee_zcl_se.energy_management.action_required.enable_duty_cycling", + FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_action_required_reserved, + { "Reserved", "zbee_zcl_se.energy_management.action_required.reserved", + FT_UINT8, BASE_HEX, NULL, 0xF0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_issuer_event_id, + { "Issuer Event ID", "zbee_zcl_se.energy_management.report_event.issuer_id", + FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_event_status, + { "Event Status", "zbee_zcl_se.energy_management.report_event.event_status", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_event_status_time, + { "Event Status Time", "zbee_zcl_se.energy_management.report_event.event_status_time", + FT_ABSOLUTE_TIME, ABSOLUTE_TIME_UTC, NULL, 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_criticality_level_applied , + { "Criticality Level Applied", "zbee_zcl_se.energy_management.report_event.criticality_level_applied", + FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(zbee_zcl_energy_management_load_control_event_criticality_level), 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_cooling_temp_set_point_applied, + { "Cooling Temperature Set Point Applied", "zbee_zcl_se.energy_management.report_event.cooling_temperature_set_point_applied", + FT_INT16, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_set_point), 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_heating_temp_set_point_applied, + { "Heating Temperature Set Point Applied", "zbee_zcl_se.energy_management.report_event.heating_temperature_set_point_applied", + FT_INT16, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_temp_set_point), 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_average_load_adjustment_percentage , + { "Average Load Adjustment Percentage Applied", "zbee_zcl_se.energy_management.report_event.average_load_adjustment_percentage_applied", + FT_INT8, BASE_CUSTOM, CF_FUNC(decode_zcl_drlc_average_load_adjustment_percentage), 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_duty_cycle, + { "Duty Cycle Applied", "zbee_zcl_se.energy_management.report_event.duty_cycle_applied", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_event_control, + { "Event Control", "zbee_zcl_se.energy_management.report_event.event_control", + FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_event_control_randomize_start_time, + { "Randomize Start time", "zbee_zcl_se.energy_management.report_event.randomize_start_time", + FT_BOOLEAN, 8, TFS(&zbee_zcl_drlc_randomize_start_tfs), 0x01, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_event_control_randomize_duration_time, + { "Randomize Duration time", "zbee_zcl_se.energy_management.report_event.randomize_duration_time", + FT_BOOLEAN, 8, TFS(&zbee_zcl_drlc_randomize_duration_tfs), 0x02, NULL, HFILL } }, + + { &hf_zbee_zcl_energy_management_report_event_event_control_reserved, + { "Reserved", "zbee_zcl_se.energy_management.reserved", + FT_UINT8, BASE_HEX, NULL, 0xFC, NULL, HFILL } }, }; /* ZCL Energy_Management subtrees */ gint *ett[] = { &ett_zbee_zcl_energy_management, + &ett_zbee_zcl_energy_management_device_class, + &ett_zbee_zcl_energy_management_actions_required, + &ett_zbee_zcl_energy_management_report_event_event_control, }; /* Register the ZigBee ZCL Energy Management cluster protocol name and description */ |