2008-12-23 21:00:04 +00:00
/* Routines for LTE MAC disassembly
*
* Martin Mathieson
*
* $ Id $
*
* 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 .
*
2010-09-21 03:14:49 +00:00
2008-12-23 21:00:04 +00:00
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
2012-06-28 22:56:06 +00:00
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2008-12-23 21:00:04 +00:00
*/
2012-09-20 02:03:38 +00:00
# include "config.h"
2008-12-23 21:00:04 +00:00
# include <string.h>
# include <epan/packet.h>
2013-11-10 15:59:37 +00:00
# include <epan/exceptions.h>
2008-12-23 21:00:04 +00:00
# include <epan/expert.h>
2009-01-08 14:09:38 +00:00
# include <epan/prefs.h>
2009-02-12 12:08:05 +00:00
# include <epan/tap.h>
2009-09-18 16:27:02 +00:00
# include <epan/uat.h>
2013-08-30 14:49:55 +00:00
# include <epan/wmem/wmem.h>
2008-12-23 21:00:04 +00:00
# include "packet-mac-lte.h"
2009-09-10 22:53:57 +00:00
# include "packet-rlc-lte.h"
2008-12-23 21:00:04 +00:00
2013-12-14 12:45:57 +00:00
void proto_register_mac_lte ( void ) ;
void proto_reg_handoff_mac_lte ( void ) ;
2008-12-23 21:00:04 +00:00
/* Described in:
* 3 GPP TS 36.321 Evolved Universal Terrestrial Radio Access ( E - UTRA )
2012-09-21 20:11:11 +00:00
* Medium Access Control ( MAC ) protocol specification v11 .0 .0
2008-12-23 21:00:04 +00:00
*/
/* Initialize the protocol and registered fields. */
int proto_mac_lte = - 1 ;
2009-02-12 12:08:05 +00:00
static int mac_lte_tap = - 1 ;
2012-10-06 14:59:51 +00:00
static dissector_handle_t rlc_lte_handle ;
2008-12-23 21:00:04 +00:00
/* Decoding context */
2010-03-09 01:41:36 +00:00
static int hf_mac_lte_context = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_context_radio_type = - 1 ;
static int hf_mac_lte_context_direction = - 1 ;
static int hf_mac_lte_context_rnti = - 1 ;
static int hf_mac_lte_context_rnti_type = - 1 ;
static int hf_mac_lte_context_ueid = - 1 ;
2011-11-21 16:18:33 +00:00
static int hf_mac_lte_context_sysframe_number = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_context_subframe_number = - 1 ;
2010-04-22 13:54:30 +00:00
static int hf_mac_lte_context_grant_subframe_number = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_context_predefined_frame = - 1 ;
static int hf_mac_lte_context_length = - 1 ;
2009-08-26 09:13:14 +00:00
static int hf_mac_lte_context_ul_grant_size = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_context_bch_transport_channel = - 1 ;
2009-03-16 15:39:52 +00:00
static int hf_mac_lte_context_retx_count = - 1 ;
2011-11-25 11:19:03 +00:00
static int hf_mac_lte_context_retx_reason = - 1 ;
2009-03-23 22:16:25 +00:00
static int hf_mac_lte_context_crc_status = - 1 ;
2013-04-15 20:56:49 +00:00
static int hf_mac_lte_context_carrier_id = - 1 ;
2009-10-26 15:39:00 +00:00
static int hf_mac_lte_context_rapid = - 1 ;
static int hf_mac_lte_context_rach_attempt_number = - 1 ;
2011-04-15 23:32:44 +00:00
/* Inferred context */
static int hf_mac_lte_ues_ul_per_tti = - 1 ;
static int hf_mac_lte_ues_dl_per_tti = - 1 ;
2010-03-14 17:56:37 +00:00
/* Extra PHY context */
static int hf_mac_lte_context_phy_ul = - 1 ;
static int hf_mac_lte_context_phy_ul_modulation_type = - 1 ;
static int hf_mac_lte_context_phy_ul_tbs_index = - 1 ;
static int hf_mac_lte_context_phy_ul_resource_block_length = - 1 ;
static int hf_mac_lte_context_phy_ul_resource_block_start = - 1 ;
2010-12-05 23:34:11 +00:00
static int hf_mac_lte_context_phy_ul_harq_id = - 1 ;
static int hf_mac_lte_context_phy_ul_ndi = - 1 ;
2010-03-14 17:56:37 +00:00
static int hf_mac_lte_context_phy_dl = - 1 ;
static int hf_mac_lte_context_phy_dl_dci_format = - 1 ;
static int hf_mac_lte_context_phy_dl_resource_allocation_type = - 1 ;
static int hf_mac_lte_context_phy_dl_aggregation_level = - 1 ;
static int hf_mac_lte_context_phy_dl_mcs_index = - 1 ;
static int hf_mac_lte_context_phy_dl_redundancy_version_index = - 1 ;
static int hf_mac_lte_context_phy_dl_retx = - 1 ;
static int hf_mac_lte_context_phy_dl_resource_block_length = - 1 ;
2010-11-02 15:20:38 +00:00
static int hf_mac_lte_context_phy_dl_harq_id = - 1 ;
static int hf_mac_lte_context_phy_dl_ndi = - 1 ;
2010-12-05 23:34:11 +00:00
static int hf_mac_lte_context_phy_dl_tb = - 1 ;
2010-03-14 17:56:37 +00:00
2009-10-26 15:39:00 +00:00
/* Out-of-band events */
static int hf_mac_lte_oob_send_preamble = - 1 ;
2012-03-25 23:46:01 +00:00
static int hf_mac_lte_number_of_srs = - 1 ;
2008-12-23 21:00:04 +00:00
2011-12-22 18:05:48 +00:00
/* MAC SCH/MCH header fields */
2010-03-03 11:57:21 +00:00
static int hf_mac_lte_ulsch = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_ulsch_header = - 1 ;
2010-03-03 11:57:21 +00:00
static int hf_mac_lte_dlsch = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_dlsch_header = - 1 ;
static int hf_mac_lte_sch_subheader = - 1 ;
2011-12-22 18:05:48 +00:00
static int hf_mac_lte_mch = - 1 ;
static int hf_mac_lte_mch_header = - 1 ;
static int hf_mac_lte_mch_subheader = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_sch_reserved = - 1 ;
static int hf_mac_lte_dlsch_lcid = - 1 ;
static int hf_mac_lte_ulsch_lcid = - 1 ;
static int hf_mac_lte_sch_extended = - 1 ;
static int hf_mac_lte_sch_format = - 1 ;
static int hf_mac_lte_sch_length = - 1 ;
2011-12-22 18:05:48 +00:00
static int hf_mac_lte_mch_reserved = - 1 ;
static int hf_mac_lte_mch_lcid = - 1 ;
static int hf_mac_lte_mch_extended = - 1 ;
static int hf_mac_lte_mch_format = - 1 ;
static int hf_mac_lte_mch_length = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_sch_header_only = - 1 ;
2011-12-22 18:05:48 +00:00
static int hf_mac_lte_mch_header_only = - 1 ;
2008-12-23 21:00:04 +00:00
/* Data */
static int hf_mac_lte_sch_sdu = - 1 ;
2011-12-22 18:05:48 +00:00
static int hf_mac_lte_mch_sdu = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_bch_pdu = - 1 ;
static int hf_mac_lte_pch_pdu = - 1 ;
static int hf_mac_lte_predefined_pdu = - 1 ;
2009-07-14 13:08:23 +00:00
static int hf_mac_lte_raw_pdu = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_padding_data = - 1 ;
2009-05-01 14:23:47 +00:00
static int hf_mac_lte_padding_length = - 1 ;
2008-12-23 21:00:04 +00:00
/* RAR fields */
2009-04-20 16:46:46 +00:00
static int hf_mac_lte_rar = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_rar_headers = - 1 ;
static int hf_mac_lte_rar_header = - 1 ;
static int hf_mac_lte_rar_extension = - 1 ;
static int hf_mac_lte_rar_t = - 1 ;
static int hf_mac_lte_rar_bi = - 1 ;
static int hf_mac_lte_rar_rapid = - 1 ;
2013-02-16 00:05:37 +00:00
static int hf_mac_lte_rar_no_of_rapids = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_rar_reserved = - 1 ;
static int hf_mac_lte_rar_body = - 1 ;
static int hf_mac_lte_rar_reserved2 = - 1 ;
static int hf_mac_lte_rar_ta = - 1 ;
static int hf_mac_lte_rar_ul_grant = - 1 ;
2009-04-27 11:12:01 +00:00
static int hf_mac_lte_rar_ul_grant_hopping = - 1 ;
static int hf_mac_lte_rar_ul_grant_fsrba = - 1 ;
static int hf_mac_lte_rar_ul_grant_tmcs = - 1 ;
static int hf_mac_lte_rar_ul_grant_tcsp = - 1 ;
static int hf_mac_lte_rar_ul_grant_ul_delay = - 1 ;
static int hf_mac_lte_rar_ul_grant_cqi_request = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_rar_temporary_crnti = - 1 ;
/* Common channel control values */
2009-06-11 13:55:49 +00:00
static int hf_mac_lte_control_bsr = - 1 ;
static int hf_mac_lte_control_bsr_lcg_id = - 1 ;
2009-10-25 23:03:11 +00:00
static int hf_mac_lte_control_short_bsr_buffer_size = - 1 ;
static int hf_mac_lte_control_long_bsr_buffer_size_0 = - 1 ;
static int hf_mac_lte_control_long_bsr_buffer_size_1 = - 1 ;
static int hf_mac_lte_control_long_bsr_buffer_size_2 = - 1 ;
static int hf_mac_lte_control_long_bsr_buffer_size_3 = - 1 ;
2012-04-25 20:02:12 +00:00
static int hf_mac_lte_control_short_ext_bsr_buffer_size = - 1 ;
static int hf_mac_lte_control_long_ext_bsr_buffer_size_0 = - 1 ;
static int hf_mac_lte_control_long_ext_bsr_buffer_size_1 = - 1 ;
static int hf_mac_lte_control_long_ext_bsr_buffer_size_2 = - 1 ;
static int hf_mac_lte_control_long_ext_bsr_buffer_size_3 = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_control_crnti = - 1 ;
static int hf_mac_lte_control_timing_advance = - 1 ;
2012-09-21 20:11:11 +00:00
static int hf_mac_lte_control_timing_advance_group_id = - 1 ;
static int hf_mac_lte_control_timing_advance_command = - 1 ;
2009-08-01 09:52:12 +00:00
static int hf_mac_lte_control_ue_contention_resolution = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_control_ue_contention_resolution_identity = - 1 ;
2009-08-01 09:52:12 +00:00
static int hf_mac_lte_control_ue_contention_resolution_msg3 = - 1 ;
static int hf_mac_lte_control_ue_contention_resolution_msg3_matched = - 1 ;
2010-02-23 22:28:42 +00:00
static int hf_mac_lte_control_ue_contention_resolution_time_since_msg3 = - 1 ;
2008-12-23 21:00:04 +00:00
static int hf_mac_lte_control_power_headroom = - 1 ;
2009-08-05 08:02:12 +00:00
static int hf_mac_lte_control_power_headroom_reserved = - 1 ;
static int hf_mac_lte_control_power_headroom_level = - 1 ;
2012-04-25 20:02:12 +00:00
static int hf_mac_lte_control_ext_power_headroom = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_c7 = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_c6 = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_c5 = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_c4 = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_c3 = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_c2 = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_c1 = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_reserved = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_power_backoff = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_value = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_level = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_reserved2 = - 1 ;
static int hf_mac_lte_control_ext_power_headroom_pcmaxc = - 1 ;
static int hf_mac_lte_control_activation_deactivation = - 1 ;
static int hf_mac_lte_control_activation_deactivation_c7 = - 1 ;
static int hf_mac_lte_control_activation_deactivation_c6 = - 1 ;
static int hf_mac_lte_control_activation_deactivation_c5 = - 1 ;
static int hf_mac_lte_control_activation_deactivation_c4 = - 1 ;
static int hf_mac_lte_control_activation_deactivation_c3 = - 1 ;
static int hf_mac_lte_control_activation_deactivation_c2 = - 1 ;
static int hf_mac_lte_control_activation_deactivation_c1 = - 1 ;
static int hf_mac_lte_control_activation_deactivation_reserved = - 1 ;
2011-12-22 18:05:48 +00:00
static int hf_mac_lte_control_mch_scheduling_info = - 1 ;
static int hf_mac_lte_control_mch_scheduling_info_lcid = - 1 ;
static int hf_mac_lte_control_mch_scheduling_info_stop_mtch = - 1 ;
2008-12-23 21:00:04 +00:00
2011-07-28 16:52:02 +00:00
static int hf_mac_lte_dl_harq_resend_original_frame = - 1 ;
static int hf_mac_lte_dl_harq_resend_time_since_previous_frame = - 1 ;
static int hf_mac_lte_dl_harq_resend_next_frame = - 1 ;
static int hf_mac_lte_dl_harq_resend_time_until_next_frame = - 1 ;
2009-10-13 13:36:58 +00:00
2009-11-25 16:00:58 +00:00
static int hf_mac_lte_ul_harq_resend_original_frame = - 1 ;
2011-04-11 21:33:33 +00:00
static int hf_mac_lte_ul_harq_resend_time_since_previous_frame = - 1 ;
2011-07-18 11:57:38 +00:00
static int hf_mac_lte_ul_harq_resend_next_frame = - 1 ;
static int hf_mac_lte_ul_harq_resend_time_until_next_frame = - 1 ;
2009-12-02 17:46:27 +00:00
static int hf_mac_lte_grant_answering_sr = - 1 ;
static int hf_mac_lte_failure_answering_sr = - 1 ;
2009-12-04 11:13:20 +00:00
static int hf_mac_lte_sr_leading_to_failure = - 1 ;
static int hf_mac_lte_sr_leading_to_grant = - 1 ;
2009-12-14 16:04:14 +00:00
static int hf_mac_lte_sr_time_since_request = - 1 ;
static int hf_mac_lte_sr_time_until_answer = - 1 ;
2009-12-02 17:46:27 +00:00
2013-08-30 04:08:57 +00:00
static int hf_mac_lte_drx_config = - 1 ;
static int hf_mac_lte_drx_config_frame_num = - 1 ;
2013-09-23 17:34:18 +00:00
static int hf_mac_lte_drx_config_previous_frame_num = - 1 ;
2013-08-30 04:08:57 +00:00
static int hf_mac_lte_drx_config_long_cycle = - 1 ;
static int hf_mac_lte_drx_config_cycle_offset = - 1 ;
static int hf_mac_lte_drx_config_onduration_timer = - 1 ;
static int hf_mac_lte_drx_config_inactivity_timer = - 1 ;
static int hf_mac_lte_drx_config_retransmission_timer = - 1 ;
static int hf_mac_lte_drx_config_short_cycle = - 1 ;
static int hf_mac_lte_drx_config_short_cycle_timer = - 1 ;
static int hf_mac_lte_drx_state = - 1 ;
static int hf_mac_lte_drx_state_long_cycle_offset = - 1 ;
2014-01-28 03:06:03 +00:00
/* static int hf_mac_lte_drx_state_long_cycle_on = -1; */
2013-10-04 16:05:18 +00:00
static int hf_mac_lte_drx_state_short_cycle_offset = - 1 ;
2014-01-28 03:06:03 +00:00
/* static int hf_mac_lte_drx_state_short_cycle_on = -1; */
2013-10-21 21:20:39 +00:00
static int hf_mac_lte_drx_state_inactivity_remaining = - 1 ;
static int hf_mac_lte_drx_state_onduration_remaining = - 1 ;
2013-10-22 15:56:14 +00:00
static int hf_mac_lte_drx_state_retransmission_remaining = - 1 ;
static int hf_mac_lte_drx_state_rtt_remaining = - 1 ;
2013-10-22 16:52:45 +00:00
static int hf_mac_lte_drx_state_short_cycle_remaining = - 1 ;
2008-12-23 21:00:04 +00:00
/* Subtrees. */
static int ett_mac_lte = - 1 ;
static int ett_mac_lte_context = - 1 ;
2010-03-14 17:56:37 +00:00
static int ett_mac_lte_phy_context = - 1 ;
2008-12-23 21:00:04 +00:00
static int ett_mac_lte_ulsch_header = - 1 ;
static int ett_mac_lte_dlsch_header = - 1 ;
2011-12-22 18:05:48 +00:00
static int ett_mac_lte_mch_header = - 1 ;
2008-12-23 21:00:04 +00:00
static int ett_mac_lte_sch_subheader = - 1 ;
2011-12-22 18:05:48 +00:00
static int ett_mac_lte_mch_subheader = - 1 ;
2008-12-23 21:00:04 +00:00
static int ett_mac_lte_rar_headers = - 1 ;
static int ett_mac_lte_rar_header = - 1 ;
static int ett_mac_lte_rar_body = - 1 ;
2009-04-27 11:12:01 +00:00
static int ett_mac_lte_rar_ul_grant = - 1 ;
2009-06-11 13:55:49 +00:00
static int ett_mac_lte_bsr = - 1 ;
2008-12-23 21:00:04 +00:00
static int ett_mac_lte_bch = - 1 ;
static int ett_mac_lte_pch = - 1 ;
2012-04-25 20:02:12 +00:00
static int ett_mac_lte_activation_deactivation = - 1 ;
2009-08-01 09:52:12 +00:00
static int ett_mac_lte_contention_resolution = - 1 ;
2012-09-21 20:11:11 +00:00
static int ett_mac_lte_timing_advance = - 1 ;
2009-08-05 08:02:12 +00:00
static int ett_mac_lte_power_headroom = - 1 ;
2012-04-25 20:02:12 +00:00
static int ett_mac_lte_extended_power_headroom = - 1 ;
static int ett_mac_lte_extended_power_headroom_cell = - 1 ;
2011-12-22 18:05:48 +00:00
static int ett_mac_lte_mch_scheduling_info = - 1 ;
2010-03-22 19:20:37 +00:00
static int ett_mac_lte_oob = - 1 ;
2013-08-30 04:08:57 +00:00
static int ett_mac_lte_drx_config = - 1 ;
static int ett_mac_lte_drx_state = - 1 ;
2008-12-23 21:00:04 +00:00
2013-09-05 01:05:16 +00:00
static expert_field ei_mac_lte_context_rnti_type = EI_INIT ;
static expert_field ei_mac_lte_lcid_unexpected = EI_INIT ;
static expert_field ei_mac_lte_ul_mac_frame_retx = EI_INIT ;
static expert_field ei_mac_lte_oob_sr_failure = EI_INIT ;
static expert_field ei_mac_lte_control_timing_advance_command_correction_needed = EI_INIT ;
static expert_field ei_mac_lte_sch_header_only = EI_INIT ;
static expert_field ei_mac_lte_control_timing_advance_command_no_correction = EI_INIT ;
static expert_field ei_mac_lte_rar_timing_advance_not_zero_note = EI_INIT ;
static expert_field ei_mac_lte_padding_data_start_and_end = EI_INIT ;
static expert_field ei_mac_lte_bch_pdu = EI_INIT ;
static expert_field ei_mac_lte_rach_preamble_sent_note = EI_INIT ;
static expert_field ei_mac_lte_pch_pdu = EI_INIT ;
static expert_field ei_mac_lte_ul_harq_resend_next_frame = EI_INIT ;
static expert_field ei_mac_lte_control_bsr_multiple = EI_INIT ;
static expert_field ei_mac_lte_padding_data_multiple = EI_INIT ;
static expert_field ei_mac_lte_context_sysframe_number = EI_INIT ;
static expert_field ei_mac_lte_rar_bi_present = EI_INIT ;
static expert_field ei_mac_lte_control_element_size_invalid = EI_INIT ;
static expert_field ei_mac_lte_bsr_warn_threshold_exceeded = EI_INIT ;
static expert_field ei_mac_lte_too_many_subheaders = EI_INIT ;
static expert_field ei_mac_lte_oob_send_sr = EI_INIT ;
static expert_field ei_mac_lte_orig_tx_ul_frame_not_found = EI_INIT ;
static expert_field ei_mac_lte_control_ue_contention_resolution_msg3_matched = EI_INIT ;
static expert_field ei_mac_lte_sr_results_not_grant_or_failure_indication = EI_INIT ;
static expert_field ei_mac_lte_context_crc_status = EI_INIT ;
static expert_field ei_mac_lte_sr_invalid_event = EI_INIT ;
static expert_field ei_mac_lte_control_subheader_after_data_subheader = EI_INIT ;
static expert_field ei_mac_lte_rar_bi_not_first_subheader = EI_INIT ;
static expert_field ei_mac_lte_context_length = EI_INIT ;
static expert_field ei_mac_lte_reserved_not_zero = EI_INIT ;
static expert_field ei_mac_lte_rar_timing_advance_not_zero_warn = EI_INIT ;
static expert_field ei_mac_lte_dlsch_lcid = EI_INIT ;
static expert_field ei_mac_lte_padding_data_before_control_subheader = EI_INIT ;
static expert_field ei_mac_lte_rach_preamble_sent_warn = EI_INIT ;
2008-12-23 21:00:04 +00:00
2011-05-11 11:10:30 +00:00
2009-02-19 22:25:36 +00:00
/* Constants and value strings */
2008-12-23 21:00:04 +00:00
static const value_string radio_type_vals [ ] =
{
{ FDD_RADIO , " FDD " } ,
{ TDD_RADIO , " TDD " } ,
{ 0 , NULL }
} ;
static const value_string direction_vals [ ] =
{
{ DIRECTION_UPLINK , " Uplink " } ,
{ DIRECTION_DOWNLINK , " Downlink " } ,
{ 0 , NULL }
} ;
static const value_string rnti_type_vals [ ] =
{
{ NO_RNTI , " NO-RNTI " } ,
{ P_RNTI , " P-RNTI " } ,
{ RA_RNTI , " RA-RNTI " } ,
{ C_RNTI , " C-RNTI " } ,
{ SI_RNTI , " SI-RNTI " } ,
2009-09-02 16:39:39 +00:00
{ SPS_RNTI , " SPS-RNTI " } ,
2011-12-22 18:05:48 +00:00
{ M_RNTI , " M-RNTI " } ,
2008-12-23 21:00:04 +00:00
{ 0 , NULL }
} ;
static const value_string bch_transport_channel_vals [ ] =
{
{ SI_RNTI , " DL-SCH " } ,
{ NO_RNTI , " BCH " } ,
{ 0 , NULL }
} ;
2009-03-23 22:16:25 +00:00
static const value_string crc_status_vals [ ] =
{
2010-12-05 23:34:11 +00:00
{ crc_success , " OK " } ,
{ crc_fail , " Failed " } ,
{ crc_high_code_rate , " High Code Rate " } ,
{ crc_pdsch_lost , " PDSCH Lost " } ,
{ crc_duplicate_nonzero_rv , " Duplicate_nonzero_rv " } ,
2012-11-10 23:23:25 +00:00
{ crc_false_dci , " False DCI " } ,
2009-03-23 22:16:25 +00:00
{ 0 , NULL }
} ;
2013-04-15 20:56:49 +00:00
static const value_string carrier_id_vals [ ] =
{
{ carrier_id_primary , " Primary " } ,
{ carrier_id_secondary_1 , " Secondary-1 " } ,
{ carrier_id_secondary_2 , " Secondary-2 " } ,
{ carrier_id_secondary_3 , " Secondary-3 " } ,
{ carrier_id_secondary_4 , " Secondary-4 " } ,
{ 0 , NULL }
} ;
2008-12-23 21:00:04 +00:00
2010-03-14 17:56:37 +00:00
static const value_string dci_format_vals [ ] =
{
{ 0 , " 0 " } ,
{ 1 , " 1 " } ,
{ 2 , " 1A " } ,
{ 3 , " 1B " } ,
{ 4 , " 1C " } ,
{ 5 , " 1D " } ,
{ 6 , " 2 " } ,
{ 7 , " 2A " } ,
{ 8 , " 3/3A " } ,
{ 0 , NULL }
} ;
static const value_string aggregation_level_vals [ ] =
{
{ 0 , " 1 " } ,
{ 1 , " 2 " } ,
{ 2 , " 4 " } ,
{ 3 , " 8 " } ,
{ 0 , NULL }
} ;
static const value_string modulation_type_vals [ ] =
{
{ 2 , " QPSK " } ,
{ 4 , " QAM16 " } ,
{ 6 , " QAM64 " } ,
{ 0 , NULL }
} ;
2012-04-25 20:02:12 +00:00
static const true_false_string mac_lte_scell_ph_vals = {
" Reported " ,
" Not reported "
} ;
static const true_false_string mac_lte_power_backoff_vals = {
" Applied " ,
" Not applied "
} ;
static const true_false_string mac_lte_ph_value_vals = {
" Based on reference format " ,
" Based on real transmission "
} ;
2008-12-23 21:00:04 +00:00
2012-04-25 20:02:12 +00:00
static const true_false_string mac_lte_scell_status_vals = {
" Activated " ,
" Deactivated "
} ;
# define ACTIVATION_DEACTIVATION_LCID 0x1b
2008-12-23 21:00:04 +00:00
# define UE_CONTENTION_RESOLUTION_IDENTITY_LCID 0x1c
# define TIMING_ADVANCE_LCID 0x1d
# define DRX_COMMAND_LCID 0x1e
# define PADDING_LCID 0x1f
static const value_string dlsch_lcid_vals [ ] =
{
{ 0 , " CCCH " } ,
2009-02-18 11:40:13 +00:00
{ 1 , " 1 " } ,
{ 2 , " 2 " } ,
{ 3 , " 3 " } ,
{ 4 , " 4 " } ,
{ 5 , " 5 " } ,
{ 6 , " 6 " } ,
{ 7 , " 7 " } ,
{ 8 , " 8 " } ,
{ 9 , " 9 " } ,
{ 10 , " 10 " } ,
2012-04-25 20:02:12 +00:00
{ ACTIVATION_DEACTIVATION_LCID , " Activation/Deactivation " } ,
2008-12-23 21:00:04 +00:00
{ UE_CONTENTION_RESOLUTION_IDENTITY_LCID , " UE Contention Resolution Identity " } ,
{ TIMING_ADVANCE_LCID , " Timing Advance " } ,
{ DRX_COMMAND_LCID , " DRX Command " } ,
{ PADDING_LCID , " Padding " } ,
{ 0 , NULL }
} ;
2012-04-25 20:02:12 +00:00
# define EXTENDED_POWER_HEADROOM_REPORT_LCID 0x19
# define POWER_HEADROOM_REPORT_LCID 0x1a
# define CRNTI_LCID 0x1b
# define TRUNCATED_BSR_LCID 0x1c
# define SHORT_BSR_LCID 0x1d
# define LONG_BSR_LCID 0x1e
2008-12-23 21:00:04 +00:00
static const value_string ulsch_lcid_vals [ ] =
{
2012-04-25 20:02:12 +00:00
{ 0 , " CCCH " } ,
{ 1 , " 1 " } ,
{ 2 , " 2 " } ,
{ 3 , " 3 " } ,
{ 4 , " 4 " } ,
{ 5 , " 5 " } ,
{ 6 , " 6 " } ,
{ 7 , " 7 " } ,
{ 8 , " 8 " } ,
{ 9 , " 9 " } ,
{ 10 , " 10 " } ,
{ EXTENDED_POWER_HEADROOM_REPORT_LCID , " Extended Power Headroom Report " } ,
{ POWER_HEADROOM_REPORT_LCID , " Power Headroom Report " } ,
{ CRNTI_LCID , " C-RNTI " } ,
{ TRUNCATED_BSR_LCID , " Truncated BSR " } ,
{ SHORT_BSR_LCID , " Short BSR " } ,
{ LONG_BSR_LCID , " Long BSR " } ,
{ PADDING_LCID , " Padding " } ,
2008-12-23 21:00:04 +00:00
{ 0 , NULL }
} ;
2011-12-22 18:05:48 +00:00
# define MCH_SCHEDULING_INFO_LCID 0x1e
static const value_string mch_lcid_vals [ ] =
{
{ 0 , " MCCH " } ,
{ 1 , " 1 " } ,
{ 2 , " 2 " } ,
{ 3 , " 3 " } ,
{ 4 , " 4 " } ,
{ 5 , " 5 " } ,
{ 6 , " 6 " } ,
{ 7 , " 7 " } ,
{ 8 , " 8 " } ,
{ 9 , " 9 " } ,
{ 10 , " 10 " } ,
{ 11 , " 11 " } ,
{ 12 , " 12 " } ,
{ 13 , " 13 " } ,
{ 14 , " 14 " } ,
{ 15 , " 15 " } ,
{ 16 , " 16 " } ,
{ 17 , " 17 " } ,
{ 18 , " 18 " } ,
{ 19 , " 19 " } ,
{ 20 , " 20 " } ,
{ 21 , " 21 " } ,
{ 22 , " 22 " } ,
{ 23 , " 23 " } ,
{ 24 , " 24 " } ,
{ 25 , " 25 " } ,
{ 26 , " 26 " } ,
{ 27 , " 27 " } ,
{ 28 , " 28 " } ,
{ MCH_SCHEDULING_INFO_LCID , " MCH Scheduling Information " } ,
{ PADDING_LCID , " Padding " } ,
{ 0 , NULL }
} ;
2008-12-23 21:00:04 +00:00
static const value_string format_vals [ ] =
{
{ 0 , " Data length is < 128 bytes " } ,
{ 1 , " Data length is >= 128 bytes " } ,
{ 0 , NULL }
} ;
static const value_string rar_type_vals [ ] =
{
{ 0 , " Backoff Indicator present " } ,
{ 1 , " RAPID present " } ,
{ 0 , NULL }
} ;
static const value_string rar_bi_vals [ ] =
{
{ 0 , " 0 " } ,
{ 1 , " 10 " } ,
{ 2 , " 20 " } ,
{ 3 , " 30 " } ,
{ 4 , " 40 " } ,
{ 5 , " 60 " } ,
{ 6 , " 80 " } ,
{ 7 , " 120 " } ,
{ 8 , " 160 " } ,
{ 9 , " 240 " } ,
{ 10 , " 320 " } ,
{ 11 , " 480 " } ,
{ 12 , " 960 " } ,
{ 0 , NULL }
} ;
static const value_string buffer_size_vals [ ] =
{
{ 0 , " BS = 0 " } ,
2012-04-25 20:02:12 +00:00
{ 1 , " 0 < BS <= 10 " } ,
{ 2 , " 10 < BS <= 12 " } ,
{ 3 , " 12 < BS <= 14 " } ,
{ 4 , " 14 < BS <= 17 " } ,
{ 5 , " 17 < BS <= 19 " } ,
{ 6 , " 19 < BS <= 22 " } ,
{ 7 , " 22 < BS <= 26 " } ,
{ 8 , " 26 < BS <= 31 " } ,
{ 9 , " 31 < BS <= 36 " } ,
{ 10 , " 36 < BS <= 42 " } ,
{ 11 , " 42 < BS <= 49 " } ,
{ 12 , " 49 < BS <= 57 " } ,
{ 13 , " 47 < BS <= 67 " } ,
{ 14 , " 67 < BS <= 78 " } ,
{ 15 , " 78 < BS <= 91 " } ,
{ 16 , " 91 < BS <= 107 " } ,
2008-12-23 21:00:04 +00:00
{ 17 , " 107 < BS <= 125 " } ,
{ 18 , " 125 < BS <= 146 " } ,
{ 19 , " 146 < BS <= 171 " } ,
{ 20 , " 171 < BS <= 200 " } ,
{ 21 , " 200 < BS <= 234 " } ,
{ 22 , " 234 < BS <= 274 " } ,
{ 23 , " 274 < BS <= 321 " } ,
{ 24 , " 321 < BS <= 376 " } ,
{ 25 , " 376 < BS <= 440 " } ,
{ 26 , " 440 < BS <= 515 " } ,
{ 27 , " 515 < BS <= 603 " } ,
{ 28 , " 603 < BS <= 706 " } ,
{ 29 , " 706 < BS <= 826 " } ,
{ 30 , " 826 < BS <= 967 " } ,
2012-04-25 20:02:12 +00:00
{ 31 , " 967 < BS <= 1132 " } ,
2008-12-23 21:00:04 +00:00
{ 32 , " 1132 < BS <= 1326 " } ,
{ 33 , " 1326 < BS <= 1552 " } ,
{ 34 , " 1552 < BS <= 1817 " } ,
{ 35 , " 1817 < BS <= 2127 " } ,
{ 36 , " 2127 < BS <= 2490 " } ,
{ 37 , " 2490 < BS <= 2915 " } ,
{ 38 , " 2915 < BS <= 3413 " } ,
{ 39 , " 3413 < BS <= 3995 " } ,
{ 40 , " 3995 < BS <= 4677 " } ,
{ 41 , " 4677 < BS <= 5476 " } ,
{ 42 , " 5476 < BS <= 6411 " } ,
{ 43 , " 6411 < BS <= 7505 " } ,
{ 44 , " 7505 < BS <= 8787 " } ,
{ 45 , " 8787 < BS <= 10276 " } ,
{ 46 , " 10287 < BS <= 12043 " } ,
{ 47 , " 12043 < BS <= 14099 " } ,
{ 48 , " 14099 < BS <= 16507 " } ,
{ 49 , " 16507 < BS <= 19325 " } ,
{ 50 , " 19325 < BS <= 22624 " } ,
{ 51 , " 22624 < BS <= 26487 " } ,
{ 52 , " 26487 < BS <= 31009 " } ,
{ 53 , " 31009 < BS <= 36304 " } ,
{ 54 , " 36304 < BS <= 42502 " } ,
{ 55 , " 42502 < BS <= 49759 " } ,
{ 56 , " 49759 < BS <= 58255 " } ,
{ 57 , " 58255 < BS <= 68201 " } ,
{ 58 , " 68201 < BS <= 79846 " } ,
{ 59 , " 79846 < BS <= 93479 " } ,
{ 60 , " 93479 < BS <= 109439 " } ,
{ 61 , " 109439 < BS <= 128125 " } ,
{ 62 , " 128125 < BS <= 150000 " } ,
{ 63 , " BS > 150000 " } ,
{ 0 , NULL }
} ;
2012-04-18 16:55:06 +00:00
static value_string_ext buffer_size_vals_ext = VALUE_STRING_EXT_INIT ( buffer_size_vals ) ;
2008-12-23 21:00:04 +00:00
2012-04-25 20:02:12 +00:00
static const value_string ext_buffer_size_vals [ ] =
{
{ 0 , " BS = 0 " } ,
{ 1 , " 0 < BS <= 10 " } ,
{ 2 , " 10 < BS <= 13 " } ,
{ 3 , " 13 < BS <= 16 " } ,
{ 4 , " 16 < BS <= 19 " } ,
{ 5 , " 19 < BS <= 23 " } ,
{ 6 , " 23 < BS <= 29 " } ,
{ 7 , " 29 < BS <= 35 " } ,
{ 8 , " 35 < BS <= 43 " } ,
{ 9 , " 43 < BS <= 53 " } ,
{ 10 , " 53 < BS <= 65 " } ,
{ 11 , " 65 < BS <= 80 " } ,
{ 12 , " 80 < BS <= 98 " } ,
{ 13 , " 98 < BS <= 120 " } ,
{ 14 , " 120 < BS <= 147 " } ,
{ 15 , " 147 < BS <= 181 " } ,
{ 16 , " 181 < BS <= 223 " } ,
{ 17 , " 223 < BS <= 274 " } ,
{ 18 , " 274 < BS <= 337 " } ,
{ 19 , " 337 < BS <= 414 " } ,
{ 20 , " 414 < BS <= 509 " } ,
{ 21 , " 509 < BS <= 625 " } ,
{ 22 , " 625 < BS <= 769 " } ,
{ 23 , " 769 < BS <= 945 " } ,
{ 24 , " 945 < BS <= 1162 " } ,
{ 25 , " 1162 < BS <= 1429 " } ,
{ 26 , " 1429 < BS <= 1757 " } ,
{ 27 , " 1757 < BS <= 2161 " } ,
{ 28 , " 2161 < BS <= 2657 " } ,
{ 29 , " 2657 < BS <= 3267 " } ,
{ 30 , " 3267 < BS <= 4017 " } ,
{ 31 , " 4017 < BS <= 4940 " } ,
{ 32 , " 4940 < BS <= 6074 " } ,
{ 33 , " 6074 < BS <= 7469 " } ,
{ 34 , " 7469 < BS <= 9185 " } ,
{ 35 , " 9185 < BS <= 11294 " } ,
{ 36 , " 11294 < BS <= 13888 " } ,
{ 37 , " 13888 < BS <= 17077 " } ,
{ 38 , " 17077 < BS <= 20999 " } ,
{ 39 , " 20999 < BS <= 25822 " } ,
{ 40 , " 25822 < BS <= 31752 " } ,
{ 41 , " 31752 < BS <= 39045 " } ,
{ 42 , " 39045 < BS <= 48012 " } ,
{ 43 , " 48012 < BS <= 59039 " } ,
{ 44 , " 59039 < BS <= 72598 " } ,
{ 45 , " 72598 < BS <= 89272 " } ,
{ 46 , " 89272 < BS <= 109774 " } ,
{ 47 , " 109774 < BS <= 134986 " } ,
{ 48 , " 134986 < BS <= 165989 " } ,
{ 49 , " 165989 < BS <= 204111 " } ,
{ 50 , " 204111 < BS <= 250990 " } ,
{ 51 , " 250990 < BS <= 308634 " } ,
{ 52 , " 308634 < BS <= 379519 " } ,
{ 53 , " 379519 < BS <= 466683 " } ,
{ 54 , " 466683 < BS <= 573866 " } ,
{ 55 , " 573866 < BS <= 705666 " } ,
{ 56 , " 705666 < BS <= 867737 " } ,
{ 57 , " 867737 < BS <= 1067031 " } ,
{ 58 , " 1067031 < BS <= 1312097 " } ,
{ 59 , " 1312097 < BS <= 1613447 " } ,
{ 60 , " 1613447 < BS <= 1984009 " } ,
{ 61 , " 1984009 < BS <= 2439678 " } ,
{ 62 , " 2439678 < BS <= 3000000 " } ,
{ 63 , " BS > 3000000 " } ,
{ 0 , NULL }
} ;
static value_string_ext ext_buffer_size_vals_ext = VALUE_STRING_EXT_INIT ( ext_buffer_size_vals ) ;
static const value_string power_headroom_vals [ ] =
2010-01-27 18:42:40 +00:00
{
{ 0 , " -23 <= PH < -22 " } ,
{ 1 , " -22 <= PH < -21 " } ,
{ 2 , " -21 <= PH < -20 " } ,
{ 3 , " -20 <= PH < -19 " } ,
{ 4 , " -19 <= PH < -18 " } ,
{ 5 , " -18 <= PH < -17 " } ,
{ 6 , " -17 <= PH < -16 " } ,
{ 7 , " -16 <= PH < -15 " } ,
{ 8 , " -15 <= PH < -14 " } ,
{ 9 , " -14 <= PH < -13 " } ,
{ 10 , " -13 <= PH < -12 " } ,
{ 11 , " -12 <= PH < -11 " } ,
{ 12 , " -11 <= PH < -10 " } ,
{ 13 , " -10 <= PH < -9 " } ,
{ 14 , " -9 <= PH < -8 " } ,
{ 15 , " -8 <= PH < -7 " } ,
{ 16 , " -7 <= PH < -6 " } ,
{ 17 , " -6 <= PH < -5 " } ,
{ 18 , " -5 <= PH < -4 " } ,
{ 19 , " -4 <= PH < -3 " } ,
{ 20 , " -3 <= PH < -2 " } ,
{ 21 , " -2 <= PH < -1 " } ,
{ 22 , " -1 <= PH < 0 " } ,
{ 23 , " 0 <= PH < 1 " } ,
{ 24 , " 1 <= PH < 2 " } ,
{ 25 , " 2 <= PH < 3 " } ,
{ 26 , " 3 <= PH < 4 " } ,
{ 27 , " 4 <= PH < 5 " } ,
{ 28 , " 5 <= PH < 6 " } ,
{ 29 , " 6 <= PH < 7 " } ,
{ 30 , " 7 <= PH < 8 " } ,
{ 31 , " 8 <= PH < 9 " } ,
{ 32 , " 9 <= PH < 10 " } ,
{ 33 , " 10 <= PH < 11 " } ,
{ 34 , " 11 <= PH < 12 " } ,
{ 35 , " 12 <= PH < 13 " } ,
{ 36 , " 13 <= PH < 14 " } ,
{ 37 , " 14 <= PH < 15 " } ,
{ 38 , " 15 <= PH < 16 " } ,
{ 39 , " 16 <= PH < 17 " } ,
{ 40 , " 17 <= PH < 18 " } ,
{ 41 , " 18 <= PH < 19 " } ,
{ 42 , " 19 <= PH < 20 " } ,
{ 43 , " 20 <= PH < 21 " } ,
{ 44 , " 21 <= PH < 22 " } ,
{ 45 , " 22 <= PH < 23 " } ,
{ 46 , " 23 <= PH < 24 " } ,
{ 47 , " 24 <= PH < 25 " } ,
{ 48 , " 25 <= PH < 26 " } ,
{ 49 , " 26 <= PH < 27 " } ,
{ 50 , " 27 <= PH < 28 " } ,
{ 51 , " 28 <= PH < 29 " } ,
{ 52 , " 29 <= PH < 30 " } ,
{ 53 , " 30 <= PH < 31 " } ,
{ 54 , " 31 <= PH < 32 " } ,
{ 55 , " 32 <= PH < 33 " } ,
{ 56 , " 33 <= PH < 34 " } ,
{ 57 , " 34 <= PH < 35 " } ,
{ 58 , " 34 <= PH < 36 " } ,
{ 59 , " 36 <= PH < 37 " } ,
{ 60 , " 37 <= PH < 38 " } ,
{ 61 , " 38 <= PH < 39 " } ,
{ 62 , " 39 <= PH < 40 " } ,
{ 63 , " PH >= 40 " } ,
{ 0 , NULL }
} ;
2012-04-25 20:02:12 +00:00
static value_string_ext power_headroom_vals_ext = VALUE_STRING_EXT_INIT ( power_headroom_vals ) ;
static const value_string pcmaxc_vals [ ] =
{
{ 0 , " Pcmax,c < -29 " } ,
{ 1 , " -29 <= Pcmax,c < -28 " } ,
{ 2 , " -28 <= Pcmax,c < -27 " } ,
{ 3 , " -27 <= Pcmax,c < -26 " } ,
{ 4 , " -26 <= Pcmax,c < -25 " } ,
{ 5 , " -25 <= Pcmax,c < -24 " } ,
{ 6 , " -24 <= Pcmax,c < -23 " } ,
{ 7 , " -23 <= Pcmax,c < -22 " } ,
{ 8 , " -22 <= Pcmax,c < -21 " } ,
{ 9 , " -21 <= Pcmax,c < -20 " } ,
{ 10 , " -20 <= Pcmax,c < -19 " } ,
{ 11 , " -19 <= Pcmax,c < -18 " } ,
{ 12 , " -18 <= Pcmax,c < -17 " } ,
{ 13 , " -17 <= Pcmax,c < -16 " } ,
{ 14 , " -16 <= Pcmax,c < -15 " } ,
{ 15 , " -15 <= Pcmax,c < -14 " } ,
{ 16 , " -14 <= Pcmax,c < -13 " } ,
{ 17 , " -13 <= Pcmax,c < -12 " } ,
{ 18 , " -12 <= Pcmax,c < -11 " } ,
{ 19 , " -11 <= Pcmax,c < -10 " } ,
{ 20 , " -10 <= Pcmax,c < -9 " } ,
{ 21 , " -9 <= Pcmax,c < -8 " } ,
{ 22 , " -8 <= Pcmax,c < -7 " } ,
{ 23 , " -7 <= Pcmax,c < -6 " } ,
{ 24 , " -6 <= Pcmax,c < -5 " } ,
{ 25 , " -5 <= Pcmax,c < -4 " } ,
{ 26 , " -4 <= Pcmax,c < -3 " } ,
{ 27 , " -3 <= Pcmax,c < -2 " } ,
{ 28 , " -2 <= Pcmax,c < -1 " } ,
{ 29 , " -1 <= Pcmax,c < 0 " } ,
{ 30 , " 0 <= Pcmax,c < 1 " } ,
{ 31 , " 1 <= Pcmax,c < 2 " } ,
{ 32 , " 2 <= Pcmax,c < 3 " } ,
{ 33 , " 3 <= Pcmax,c < 4 " } ,
{ 34 , " 4 <= Pcmax,c < 5 " } ,
{ 35 , " 5 <= Pcmax,c < 6 " } ,
{ 36 , " 6 <= Pcmax,c < 7 " } ,
{ 37 , " 7 <= Pcmax,c < 8 " } ,
{ 38 , " 8 <= Pcmax,c < 9 " } ,
{ 39 , " 9 <= Pcmax,c < 10 " } ,
{ 40 , " 10 <= Pcmax,c < 11 " } ,
{ 41 , " 11 <= Pcmax,c < 12 " } ,
{ 42 , " 12 <= Pcmax,c < 13 " } ,
{ 43 , " 13 <= Pcmax,c < 14 " } ,
{ 44 , " 14 <= Pcmax,c < 15 " } ,
{ 45 , " 15 <= Pcmax,c < 16 " } ,
{ 46 , " 16 <= Pcmax,c < 17 " } ,
{ 47 , " 17 <= Pcmax,c < 18 " } ,
{ 48 , " 18 <= Pcmax,c < 19 " } ,
{ 49 , " 19 <= Pcmax,c < 20 " } ,
{ 50 , " 20 <= Pcmax,c < 21 " } ,
{ 51 , " 21 <= Pcmax,c < 22 " } ,
{ 52 , " 22 <= Pcmax,c < 23 " } ,
{ 53 , " 23 <= Pcmax,c < 24 " } ,
{ 54 , " 24 <= Pcmax,c < 25 " } ,
{ 55 , " 25 <= Pcmax,c < 26 " } ,
{ 56 , " 26 <= Pcmax,c < 27 " } ,
{ 57 , " 27 <= Pcmax,c < 28 " } ,
{ 58 , " 28 <= Pcmax,c < 29 " } ,
{ 59 , " 29 <= Pcmax,c < 30 " } ,
{ 60 , " 30 <= Pcmax,c < 31 " } ,
{ 61 , " 31 <= Pcmax,c < 32 " } ,
{ 62 , " 32 <= Pcmax,c < 33 " } ,
{ 63 , " 33 <= Pcmax,c " } ,
{ 0 , NULL }
} ;
static value_string_ext pcmaxc_vals_ext = VALUE_STRING_EXT_INIT ( pcmaxc_vals ) ;
2010-01-27 18:42:40 +00:00
2008-12-23 21:00:04 +00:00
static const value_string header_only_vals [ ] =
{
{ 0 , " MAC PDU Headers and body present " } ,
{ 1 , " MAC PDU Headers only " } ,
{ 0 , NULL }
} ;
static const value_string predefined_frame_vals [ ] =
{
{ 0 , " Real MAC PDU present - will dissect " } ,
{ 1 , " Predefined frame present - will not dissect " } ,
{ 0 , NULL }
} ;
2011-11-25 11:19:03 +00:00
static const value_string ul_retx_grant_vals [ ] =
{
{ 0 , " PDCCH ReTx " } ,
{ 1 , " PHICH NACK " } ,
{ 0 , NULL }
} ;
2010-10-07 14:44:00 +00:00
2009-12-02 17:46:27 +00:00
/**************************************************************************/
/* Preferences state */
/**************************************************************************/
2009-03-16 15:39:52 +00:00
/* If this PDU has been NACK'd (by HARQ) more than a certain number of times,
we trigger an expert warning . */
static gint global_mac_lte_retx_counter_trigger = 3 ;
2009-04-20 16:46:46 +00:00
/* By default try to decode transparent data (BCH, PCH and CCCH) data using LTE RRC dissector */
static gboolean global_mac_lte_attempt_rrc_decode = TRUE ;
2009-07-14 13:08:23 +00:00
/* Whether should attempt to dissect frames failing CRC check */
static gboolean global_mac_lte_dissect_crc_failures = FALSE ;
2009-09-10 22:53:57 +00:00
/* Whether should attempt to decode lcid 1&2 SDUs as srb1/2 (i.e. AM RLC) */
2010-03-14 17:56:37 +00:00
static gboolean global_mac_lte_attempt_srb_decode = TRUE ;
2009-08-01 09:52:12 +00:00
2012-10-01 19:51:07 +00:00
/* Whether should attempt to decode MCH LCID 0 as MCCH */
static gboolean global_mac_lte_attempt_mcch_decode = FALSE ;
2012-12-11 23:20:22 +00:00
/* Whether should call RLC dissector to decode MTCH LCIDs */
static gboolean global_mac_lte_call_rlc_for_mtch = FALSE ;
2011-04-17 11:22:03 +00:00
/* Where to take LCID -> DRB mappings from */
enum lcid_drb_source {
FromStaticTable , FromConfigurationProtocol
} ;
static gint global_mac_lte_lcid_drb_source = ( gint ) FromStaticTable ;
2009-11-18 13:47:08 +00:00
/* Threshold for warning in expert info about high BSR values */
static gint global_mac_lte_bsr_warn_threshold = 50 ; /* default is 19325 -> 22624 */
2009-12-02 17:46:27 +00:00
/* Whether or not to track SRs and related frames */
2010-02-08 15:01:08 +00:00
static gboolean global_mac_lte_track_sr = TRUE ;
2010-03-14 17:56:37 +00:00
/* Which layer info to show in the info column */
enum layer_to_show {
ShowPHYLayer , ShowMACLayer , ShowRLCLayer
} ;
2010-10-20 09:58:40 +00:00
/* Which layer's details to show in Info column */
2010-03-14 17:56:37 +00:00
static gint global_mac_lte_layer_to_show = ( gint ) ShowRLCLayer ;
2009-12-02 17:46:27 +00:00
2013-06-18 23:36:35 +00:00
/* Whether to decode Contention Resolution body as UL CCCH */
static gboolean global_mac_lte_decode_cr_body = FALSE ;
2013-08-30 04:08:57 +00:00
/* Whether to record config and try to show DRX state for each configured UE */
static gboolean global_mac_lte_show_drx = FALSE ;
2010-10-20 09:58:40 +00:00
/* When showing RLC info, count PDUs so can append info column properly */
static guint8 s_number_of_rlc_pdus_shown = 0 ;
2009-10-13 13:36:58 +00:00
2009-09-18 16:27:02 +00:00
/***********************************************************************/
/* How to dissect lcid 3-10 (presume drb logical channels) */
static const value_string drb_lcid_vals [ ] = {
{ 3 , " LCID 3 " } ,
{ 4 , " LCID 4 " } ,
{ 5 , " LCID 5 " } ,
{ 6 , " LCID 6 " } ,
{ 7 , " LCID 7 " } ,
{ 8 , " LCID 8 " } ,
{ 9 , " LCID 9 " } ,
{ 10 , " LCID 10 " } ,
{ 0 , NULL }
} ;
typedef enum rlc_channel_type_t {
rlcRaw ,
rlcTM ,
rlcUM5 ,
rlcUM10 ,
rlcAM
} rlc_channel_type_t ;
static const value_string rlc_channel_type_vals [ ] = {
{ rlcTM , " TM " } ,
{ rlcUM5 , " UM, SN Len=5 " } ,
{ rlcUM10 , " UM, SN Len=10 " } ,
{ rlcAM , " AM " } ,
{ 0 , NULL }
} ;
2009-09-18 22:01:30 +00:00
2009-09-18 16:27:02 +00:00
/* Mapping type */
2011-04-17 11:22:03 +00:00
typedef struct lcid_drb_mapping_t {
2009-09-18 16:27:02 +00:00
guint16 lcid ;
2011-04-17 11:22:03 +00:00
gint drbid ;
2009-09-18 16:27:02 +00:00
rlc_channel_type_t channel_type ;
} lcid_drb_mapping_t ;
/* Mapping entity */
static lcid_drb_mapping_t * lcid_drb_mappings = NULL ;
static guint num_lcid_drb_mappings = 0 ;
2013-03-12 06:40:13 +00:00
UAT_VS_DEF ( lcid_drb_mappings , lcid , lcid_drb_mapping_t , guint16 , 3 , " LCID 3 " )
2009-09-18 16:27:02 +00:00
UAT_DEC_CB_DEF ( lcid_drb_mappings , drbid , lcid_drb_mapping_t )
2013-03-12 06:40:13 +00:00
UAT_VS_DEF ( lcid_drb_mappings , channel_type , lcid_drb_mapping_t , rlc_channel_type_t , rlcAM , " AM " )
2009-09-18 16:27:02 +00:00
/* UAT object */
static uat_t * lcid_drb_mappings_uat ;
2011-04-17 11:22:03 +00:00
/* Dynamic mappings (set by configuration protocol)
LCID is the index into the array of these */
typedef struct dynamic_lcid_drb_mapping_t {
gboolean valid ;
gint drbid ;
rlc_channel_type_t channel_type ;
2011-11-28 14:52:11 +00:00
guint8 ul_priority ;
2011-04-17 11:22:03 +00:00
} dynamic_lcid_drb_mapping_t ;
2012-10-12 03:00:38 +00:00
typedef struct ue_dynamic_drb_mappings_t {
2013-06-18 21:02:00 +00:00
dynamic_lcid_drb_mapping_t mapping [ 11 ] ; /* Index is LCID */
guint8 drb_to_lcid_mappings [ 32 ] ; /* Also map drbid -> lcid */
2012-10-12 03:00:38 +00:00
} ue_dynamic_drb_mappings_t ;
static GHashTable * mac_lte_ue_channels_hash = NULL ;
2011-04-17 11:22:03 +00:00
2009-09-10 22:53:57 +00:00
extern int proto_rlc_lte ;
2009-09-18 16:27:02 +00:00
/***************************************************************/
2009-08-01 09:52:12 +00:00
/***************************************************************/
/* Keeping track of Msg3 bodies so they can be compared with */
/* Contention Resolution bodies. */
typedef struct Msg3Data {
2010-02-23 22:28:42 +00:00
guint8 data [ 6 ] ;
nstime_t msg3Time ;
guint32 framenum ;
2009-08-01 09:52:12 +00:00
} Msg3Data ;
/* This table stores (RNTI -> Msg3Data*). Will be populated when
Msg3 frames are first read . */
static GHashTable * mac_lte_msg3_hash = NULL ;
/* Hash table functions for mac_lte_msg3_hash. Hash is just the (RNTI) key */
2009-10-13 13:36:58 +00:00
static gint mac_lte_rnti_hash_equal ( gconstpointer v , gconstpointer v2 )
2009-08-01 09:52:12 +00:00
{
return ( v = = v2 ) ;
}
2009-10-13 13:36:58 +00:00
static guint mac_lte_rnti_hash_func ( gconstpointer v )
2009-08-01 09:52:12 +00:00
{
return GPOINTER_TO_UINT ( v ) ;
}
typedef enum ContentionResolutionStatus {
NoMsg3 ,
Msg3Match ,
Msg3NoMatch
} ContentionResolutionStatus ;
typedef struct ContentionResolutionResult {
ContentionResolutionStatus status ;
guint msg3FrameNum ;
2010-02-23 22:28:42 +00:00
guint msSinceMsg3 ;
2009-08-01 09:52:12 +00:00
} ContentionResolutionResult ;
/* This table stores (CRFrameNum -> CRResult). It is assigned during the first
pass and used thereafter */
static GHashTable * mac_lte_cr_result_hash = NULL ;
/* Hash table functions for mac_lte_cr_result_hash. Hash is just the (framenum) key */
2009-10-13 13:36:58 +00:00
static gint mac_lte_framenum_hash_equal ( gconstpointer v , gconstpointer v2 )
2009-08-01 09:52:12 +00:00
{
return ( v = = v2 ) ;
}
2009-10-13 13:36:58 +00:00
static guint mac_lte_framenum_hash_func ( gconstpointer v )
2009-08-01 09:52:12 +00:00
{
return GPOINTER_TO_UINT ( v ) ;
}
2009-10-13 13:36:58 +00:00
/**************************************************************************/
/****************************************************************/
/* Keeping track of last DL frames per C-RNTI so can guess when */
/* there has been a HARQ retransmission */
2010-12-26 23:40:22 +00:00
/* TODO: this should be simplified now that harq-id & ndi are */
/* being logged! */
2009-10-13 13:36:58 +00:00
/* Could be bigger, but more than enough to flag suspected resends */
# define MAX_EXPECTED_PDU_LENGTH 2048
2009-11-25 16:00:58 +00:00
typedef struct LastFrameData {
2009-10-14 10:43:17 +00:00
gboolean inUse ;
2009-10-13 13:36:58 +00:00
guint32 framenum ;
2011-01-14 14:25:24 +00:00
gboolean ndi ;
2009-10-13 13:36:58 +00:00
nstime_t received_time ;
gint length ;
guint8 data [ MAX_EXPECTED_PDU_LENGTH ] ;
2009-11-25 16:00:58 +00:00
} LastFrameData ;
2009-10-13 13:36:58 +00:00
2011-01-14 14:25:24 +00:00
typedef struct DLHarqBuffers {
2011-03-22 14:39:02 +00:00
LastFrameData harqid [ 2 ] [ 15 ] ; /* 2 blocks (1 for each antenna) needed for DL */
2011-01-14 14:25:24 +00:00
} DLHarqBuffers ;
2009-10-13 13:36:58 +00:00
2009-10-14 10:43:17 +00:00
2011-01-14 14:25:24 +00:00
/* This table stores (RNTI -> DLHARQBuffers*). Will be populated when
2009-10-13 13:36:58 +00:00
DL frames are first read . */
static GHashTable * mac_lte_dl_harq_hash = NULL ;
2009-08-01 09:52:12 +00:00
2009-10-13 13:36:58 +00:00
typedef struct DLHARQResult {
2011-07-28 16:52:02 +00:00
gboolean previousSet , nextSet ;
2009-10-13 13:36:58 +00:00
guint previousFrameNum ;
2011-04-11 21:33:33 +00:00
guint timeSincePreviousFrame ;
2011-07-28 16:52:02 +00:00
guint nextFrameNum ;
guint timeToNextFrame ;
2009-10-13 13:36:58 +00:00
} DLHARQResult ;
2011-01-14 14:25:24 +00:00
/* This table stores (FrameNumber -> *DLHARQResult). It is assigned during the first
2009-10-13 13:36:58 +00:00
pass and used thereafter */
static GHashTable * mac_lte_dl_harq_result_hash = NULL ;
2009-08-01 09:52:12 +00:00
/**************************************************************************/
2009-11-25 16:00:58 +00:00
/*****************************************************************/
/* Keeping track of last UL frames per C-RNTI so can verify when */
/* told that a frame is a retx */
2011-01-14 14:25:24 +00:00
typedef struct ULHarqBuffers {
LastFrameData harqid [ 8 ] ;
} ULHarqBuffers ;
/* This table stores (RNTI -> ULHarqBuffers*). Will be populated when
2009-11-25 16:00:58 +00:00
UL frames are first read . */
static GHashTable * mac_lte_ul_harq_hash = NULL ;
typedef struct ULHARQResult {
2011-07-18 11:57:38 +00:00
gboolean previousSet , nextSet ;
2009-11-25 16:00:58 +00:00
guint previousFrameNum ;
2011-04-11 21:33:33 +00:00
guint timeSincePreviousFrame ;
2011-07-18 11:57:38 +00:00
guint nextFrameNum ;
guint timeToNextFrame ;
2009-11-25 16:00:58 +00:00
} ULHARQResult ;
2011-07-18 11:57:38 +00:00
/* This table stores (FrameNum -> ULHARQResult). It is assigned during the first
2009-11-25 16:00:58 +00:00
pass and used thereafter */
static GHashTable * mac_lte_ul_harq_result_hash = NULL ;
/**************************************************************************/
2009-12-02 17:46:27 +00:00
/**************************************************************************/
/* Tracking of Scheduling Requests (SRs). */
/* Keep track of: */
/* - last grant before SR */
/* - SR failures following request */
/* - grant following SR */
typedef enum SREvent {
SR_Grant ,
SR_Request ,
SR_Failure
} SREvent ;
2009-12-14 11:23:24 +00:00
static const value_string sr_event_vals [ ] =
{
{ SR_Grant , " Grant " } ,
{ SR_Request , " SR Request " } ,
{ SR_Failure , " SR Failure " } ,
{ 0 , NULL }
} ;
2009-12-02 17:46:27 +00:00
typedef enum SRStatus {
None ,
SR_Outstanding ,
SR_Failed
} SRStatus ;
2009-12-14 11:23:24 +00:00
static const value_string sr_status_vals [ ] =
{
{ None , " Receiving grants " } ,
{ SR_Outstanding , " SR Request outstanding " } ,
{ SR_Failed , " SR has Failed " } ,
{ 0 , NULL }
} ;
2009-12-02 17:46:27 +00:00
typedef struct SRState {
2010-02-23 22:28:42 +00:00
SRStatus status ;
guint32 lastSRFramenum ;
guint32 lastGrantFramenum ;
nstime_t requestTime ;
2009-12-02 17:46:27 +00:00
} SRState ;
/* This table keeps track of the SR state for each UE.
( RNTI - > SRState ) */
static GHashTable * mac_lte_ue_sr_state = NULL ;
2009-11-25 16:00:58 +00:00
2009-12-02 17:46:27 +00:00
typedef enum SRResultType {
GrantAnsweringSR ,
2009-12-04 11:13:20 +00:00
FailureAnsweringSR ,
SRLeadingToGrant ,
2009-12-14 11:23:24 +00:00
SRLeadingToFailure ,
InvalidSREvent
2009-12-02 17:46:27 +00:00
} SRResultType ;
2009-12-04 11:13:20 +00:00
2009-12-02 17:46:27 +00:00
typedef struct SRResult {
SRResultType type ;
guint32 frameNum ;
2009-12-14 16:04:14 +00:00
guint32 timeDifference ;
2009-12-14 11:23:24 +00:00
/* These 2 are only used with InvalidSREvent */
SRStatus status ;
SREvent event ;
2009-12-02 17:46:27 +00:00
} SRResult ;
/* Entries in this table are created during the first pass
It maps ( SRFrameNum - > SRResult ) */
static GHashTable * mac_lte_sr_request_hash = NULL ;
2013-08-30 04:08:57 +00:00
/**************************************************************************/
2013-10-13 22:00:09 +00:00
2013-08-30 04:08:57 +00:00
/**************************************************************************/
/* DRX State */
2013-09-27 16:18:09 +00:00
/* Config for current cycle/timer state for a configured UE */
2013-08-30 04:08:57 +00:00
2013-10-09 22:10:15 +00:00
/* Entries in this table are maintained during the first pass
It maps ( UEId - > drx_state_t ) . */
2013-09-27 16:18:09 +00:00
static GHashTable * mac_lte_drx_ue_state = NULL ;
2013-08-30 04:08:57 +00:00
2013-10-08 17:13:34 +00:00
typedef struct drx_running_state_t
{
2013-09-27 16:18:09 +00:00
gboolean firstCycleStartSet ;
2013-09-05 13:11:54 +00:00
/* Cycle information */
2013-09-04 16:56:37 +00:00
gboolean inShortCycle ;
2013-09-05 13:11:54 +00:00
/* Timers */
2013-12-11 11:03:29 +00:00
nstime_t currentTime ; /* absolute time of last PDU. Used to detect whole
missing SFN cycle */
guint64 currentTicks ;
2013-10-02 16:51:10 +00:00
guint16 currentSFN ;
guint16 currentSF ;
2013-09-05 13:11:54 +00:00
2013-12-11 11:03:29 +00:00
/* These timers are absolute times when these events expire */
2013-10-04 16:05:18 +00:00
guint64 onDurationTimer ;
2013-09-04 16:56:37 +00:00
guint64 inactivityTimer ;
guint64 RTT [ 8 ] ;
guint64 retransmissionTimer [ 8 ] ;
2013-09-27 16:18:09 +00:00
guint64 shortCycleTimer ;
2013-10-13 19:56:52 +00:00
2013-10-08 17:13:34 +00:00
} drx_running_state_t ;
2013-10-09 22:10:15 +00:00
/* Have 2 states for each PDU. One for before the PDU/event, and one after.
Only then can show if we don ' t think it should have been active at that point . . . */
2013-10-08 17:13:34 +00:00
typedef struct drx_state_t {
2013-10-09 22:10:15 +00:00
drx_config_t config ;
drx_running_state_t state_before ;
drx_running_state_t state_after ;
2013-09-04 16:56:37 +00:00
} drx_state_t ;
2013-12-11 11:03:29 +00:00
typedef struct drx_state_key_t {
guint32 frameNumber ;
guint pdu_instance ;
} drx_state_key_t ;
2013-08-30 04:08:57 +00:00
/* Entries in this table are written during the first pass
2013-12-11 11:03:29 +00:00
It maps ( drx_state_key_t - > drx_state_t ) , so state at that point may be shown . */
2013-09-27 16:18:09 +00:00
static GHashTable * mac_lte_drx_frame_result = NULL ;
2013-08-30 04:08:57 +00:00
2013-12-11 11:03:29 +00:00
static gint mac_lte_framenum_instance_hash_equal ( gconstpointer v , gconstpointer v2 )
{
2013-12-14 14:33:46 +00:00
const drx_state_key_t * p1 = ( const drx_state_key_t * ) v ;
const drx_state_key_t * p2 = ( const drx_state_key_t * ) v2 ;
2013-12-11 11:03:29 +00:00
return ( ( p1 - > frameNumber = = p2 - > frameNumber ) & &
( p1 - > pdu_instance = = p2 - > pdu_instance ) ) ;
}
static guint mac_lte_framenum_instance_hash_func ( gconstpointer v )
{
2013-12-14 14:33:46 +00:00
const drx_state_key_t * p1 = ( const drx_state_key_t * ) v ;
/* XXX which one return ? */
2013-12-11 11:03:29 +00:00
return p1 - > frameNumber + ( p1 - > pdu_instance > > 8 ) ;
return GPOINTER_TO_UINT ( v ) ;
}
2013-09-27 16:18:09 +00:00
/* Initialise the UE DRX state */
2013-10-22 16:52:45 +00:00
static void init_drx_ue_state ( drx_state_t * drx_state , gboolean at_init )
2013-09-04 16:56:37 +00:00
{
int i ;
2013-10-09 22:10:15 +00:00
drx_state - > state_before . inShortCycle = FALSE ;
2013-10-22 16:52:45 +00:00
if ( at_init ) {
drx_state - > state_before . onDurationTimer = G_GUINT64_CONSTANT ( 0 ) ;
}
2013-10-09 22:10:15 +00:00
drx_state - > state_before . inactivityTimer = G_GUINT64_CONSTANT ( 0 ) ;
2013-09-04 16:56:37 +00:00
for ( i = 0 ; i < 8 ; i + + ) {
2013-10-09 22:10:15 +00:00
drx_state - > state_before . RTT [ i ] = G_GUINT64_CONSTANT ( 0 ) ;
drx_state - > state_before . retransmissionTimer [ i ] = G_GUINT64_CONSTANT ( 0 ) ;
2013-09-04 16:56:37 +00:00
}
2013-10-09 22:10:15 +00:00
drx_state - > state_before . shortCycleTimer = G_GUINT64_CONSTANT ( 0 ) ;
2013-09-04 16:56:37 +00:00
}
2013-09-27 16:18:09 +00:00
typedef enum drx_timer_type_t {
2013-10-04 16:05:18 +00:00
drx_onduration_timer ,
2013-09-27 16:18:09 +00:00
drx_inactivity_timer ,
drx_rtt_timer ,
drx_retx_timer ,
drx_short_cycle_timer
} drx_timer_type_t ;
2013-09-23 17:34:18 +00:00
2013-09-27 16:18:09 +00:00
/* Start the specified timer. Use the time period in the config */
2013-10-03 15:04:39 +00:00
static void mac_lte_drx_start_timer ( drx_state_t * p_state , drx_timer_type_t timer_type , guint8 timer_id )
2013-09-27 16:18:09 +00:00
{
2013-10-03 15:04:39 +00:00
/* Get current time in ms */
guint64 * pTimer ;
guint16 timerLength ;
/* Get pointer to timer value, and fetch from config how much to add to it */
switch ( timer_type ) {
2013-10-04 16:05:18 +00:00
case drx_onduration_timer :
2013-10-09 22:10:15 +00:00
pTimer = & ( p_state - > state_before . onDurationTimer ) ;
2013-10-04 16:05:18 +00:00
timerLength = p_state - > config . onDurationTimer ;
break ;
2013-10-03 15:04:39 +00:00
case drx_inactivity_timer :
2013-10-09 22:10:15 +00:00
pTimer = & ( p_state - > state_before . inactivityTimer ) ;
2013-10-03 15:04:39 +00:00
timerLength = p_state - > config . inactivityTimer ;
break ;
case drx_rtt_timer :
2013-10-09 22:10:15 +00:00
pTimer = & ( p_state - > state_before . RTT [ timer_id ] ) ;
2013-10-03 15:04:39 +00:00
timerLength = 8 ;
break ;
case drx_retx_timer :
2013-10-09 22:10:15 +00:00
pTimer = & ( p_state - > state_before . retransmissionTimer [ timer_id ] ) ;
2013-10-03 15:04:39 +00:00
timerLength = p_state - > config . retransmissionTimer ;
break ;
case drx_short_cycle_timer :
2013-10-03 21:46:20 +00:00
default :
2013-10-09 22:10:15 +00:00
pTimer = & ( p_state - > state_before . shortCycleTimer ) ;
2013-10-03 15:04:39 +00:00
timerLength = p_state - > config . shortCycle * p_state - > config . shortCycleTimer ;
break ;
}
/* Set timer */
2013-12-11 11:03:29 +00:00
* pTimer = p_state - > state_before . currentTicks + timerLength ;
2013-09-27 16:18:09 +00:00
}
2013-09-23 17:34:18 +00:00
2013-09-27 16:18:09 +00:00
/* Stop the specified timer. */
2013-10-08 17:13:34 +00:00
static void mac_lte_drx_stop_timer ( drx_state_t * p_state , drx_timer_type_t timer_type , guint8 timer_id )
2013-09-27 16:18:09 +00:00
{
2013-10-03 15:04:39 +00:00
/* Set indicated timer value to 0 */
switch ( timer_type ) {
2013-10-04 16:05:18 +00:00
case drx_onduration_timer :
2013-10-09 22:10:15 +00:00
p_state - > state_before . onDurationTimer = G_GUINT64_CONSTANT ( 0 ) ;
2013-10-04 16:05:18 +00:00
break ;
2013-10-03 15:04:39 +00:00
case drx_inactivity_timer :
2013-10-09 22:10:15 +00:00
p_state - > state_before . inactivityTimer = G_GUINT64_CONSTANT ( 0 ) ;
2013-10-03 15:04:39 +00:00
break ;
case drx_rtt_timer :
2013-10-09 22:10:15 +00:00
p_state - > state_before . RTT [ timer_id ] = G_GUINT64_CONSTANT ( 0 ) ;
2013-10-03 15:04:39 +00:00
break ;
case drx_retx_timer :
2013-10-09 22:10:15 +00:00
p_state - > state_before . retransmissionTimer [ timer_id ] = G_GUINT64_CONSTANT ( 0 ) ;
2013-10-03 15:04:39 +00:00
break ;
case drx_short_cycle_timer :
2013-10-09 22:10:15 +00:00
p_state - > state_before . shortCycleTimer = G_GUINT64_CONSTANT ( 0 ) ;
2013-10-03 15:04:39 +00:00
break ;
}
2013-09-27 16:18:09 +00:00
}
/* Has the specified timer expired? */
2013-10-04 16:05:18 +00:00
static gboolean mac_lte_drx_has_timer_expired ( drx_state_t * p_state , drx_timer_type_t timer_type , guint8 timer_id ,
2013-10-21 21:20:39 +00:00
gboolean before_event ,
2013-10-04 16:05:18 +00:00
guint64 * time_until_expires )
2013-09-27 16:18:09 +00:00
{
2013-10-21 21:20:39 +00:00
guint64 * pTimer = NULL ;
drx_running_state_t * state_to_use ;
if ( before_event ) {
state_to_use = & p_state - > state_before ;
}
else {
state_to_use = & p_state - > state_after ;
}
2013-10-03 15:04:39 +00:00
/* Get pointer to timer value */
switch ( timer_type ) {
2013-10-04 16:05:18 +00:00
case drx_onduration_timer :
2013-10-21 21:20:39 +00:00
pTimer = & ( state_to_use - > onDurationTimer ) ;
2013-10-13 19:56:52 +00:00
break ;
2013-10-03 15:04:39 +00:00
case drx_inactivity_timer :
2013-10-21 21:20:39 +00:00
pTimer = & ( state_to_use - > inactivityTimer ) ;
2013-10-03 15:04:39 +00:00
break ;
case drx_rtt_timer :
2013-10-21 21:20:39 +00:00
pTimer = & ( state_to_use - > RTT [ timer_id ] ) ;
2013-10-03 15:04:39 +00:00
break ;
case drx_retx_timer :
2013-10-21 21:20:39 +00:00
pTimer = & ( state_to_use - > retransmissionTimer [ timer_id ] ) ;
2013-10-03 15:04:39 +00:00
break ;
case drx_short_cycle_timer :
2013-10-21 21:20:39 +00:00
pTimer = & ( state_to_use - > shortCycleTimer ) ;
2013-10-03 15:04:39 +00:00
break ;
default :
return FALSE ;
}
/* TODO: verify using SFN/SF ? */
2013-12-11 11:03:29 +00:00
if ( state_to_use - > currentTicks = = * pTimer ) {
* time_until_expires = 0 ;
2013-10-04 16:05:18 +00:00
return TRUE ;
}
2013-12-12 19:20:30 +00:00
2013-12-11 11:03:29 +00:00
if ( state_to_use - > currentTicks > * pTimer ) {
* time_until_expires = 0 ;
}
2013-10-04 16:05:18 +00:00
else {
2013-12-11 11:03:29 +00:00
* time_until_expires = * pTimer - state_to_use - > currentTicks ;
2013-10-04 16:05:18 +00:00
}
2013-12-11 11:03:29 +00:00
return FALSE ;
2013-09-27 16:18:09 +00:00
}
2013-09-23 17:34:18 +00:00
2013-09-04 16:56:37 +00:00
2013-10-02 16:51:10 +00:00
/* Handling of triggers that can prompt changes in state */
2013-09-27 16:18:09 +00:00
2013-10-02 16:51:10 +00:00
static void mac_lte_drx_new_ulsch_data ( guint16 ueid )
2013-09-27 16:18:09 +00:00
{
2013-10-02 16:51:10 +00:00
/* Look up state of this UE */
drx_state_t * ue_state = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_ue_state , GUINT_TO_POINTER ( ( guint ) ueid ) ) ;
/* Start inactivity timer */
if ( ue_state ! = NULL ) {
2013-10-21 21:20:39 +00:00
mac_lte_drx_start_timer ( ue_state , drx_inactivity_timer , 0 ) ;
2013-10-02 16:51:10 +00:00
}
}
static void mac_lte_drx_new_dlsch_data ( guint16 ueid )
{
/* Look up state of this UE */
drx_state_t * ue_state = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_ue_state ,
GUINT_TO_POINTER ( ( guint ) ueid ) ) ;
/* Start retransmission timer */
if ( ue_state ! = NULL ) {
2013-10-21 21:20:39 +00:00
mac_lte_drx_start_timer ( ue_state , drx_inactivity_timer , 0 ) ;
2013-10-13 19:56:52 +00:00
}
2013-10-02 16:51:10 +00:00
}
static void mac_lte_drx_dl_crc_error ( guint16 ueid )
{
/* Look up state of this UE */
drx_state_t * ue_state = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_ue_state ,
GUINT_TO_POINTER ( ( guint ) ueid ) ) ;
/* Start timer */
if ( ue_state ! = NULL ) {
2013-10-21 21:20:39 +00:00
mac_lte_drx_start_timer ( ue_state , drx_retx_timer , 0 ) ;
2013-10-02 16:51:10 +00:00
}
}
/* A DRX control element has been received */
static void mac_lte_drx_control_element_received ( guint16 ueid )
{
/* Look up state of this UE */
drx_state_t * ue_state = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_ue_state ,
GUINT_TO_POINTER ( ( guint ) ueid ) ) ;
/* Start timers */
if ( ue_state ! = NULL ) {
2013-10-04 16:05:18 +00:00
mac_lte_drx_stop_timer ( ue_state , drx_onduration_timer , 0 ) ;
2013-10-02 16:51:10 +00:00
mac_lte_drx_stop_timer ( ue_state , drx_inactivity_timer , 0 ) ;
2013-10-13 19:56:52 +00:00
}
2013-10-02 16:51:10 +00:00
}
/* Update the DRX state of the UE based on previous info and current time.
This is called every time a UE with DRX configured has an UL or DL PDU */
2013-10-03 15:04:39 +00:00
static void update_drx_info ( packet_info * pinfo , mac_lte_info * p_mac_lte_info )
2013-10-02 16:51:10 +00:00
{
int harq_id ;
2013-10-04 16:05:18 +00:00
guint64 time_until_expires ;
2013-10-03 15:04:39 +00:00
/* Look up state of this UE */
drx_state_t * ue_state = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_ue_state ,
GUINT_TO_POINTER ( ( guint ) p_mac_lte_info - > ueid ) ) ;
2013-10-13 19:56:52 +00:00
2013-10-03 15:04:39 +00:00
if ( ue_state ! = NULL ) {
2013-12-11 11:03:29 +00:00
/* We loop until we find this subframe */
2013-10-03 15:04:39 +00:00
guint16 SFN = p_mac_lte_info - > sysframeNumber ;
guint16 SF = p_mac_lte_info - > subframeNumber ;
2013-10-02 16:51:10 +00:00
2013-10-03 15:04:39 +00:00
/* Make sure the first time reference has been set */
2013-10-09 22:10:15 +00:00
if ( ! ue_state - > state_before . firstCycleStartSet ) {
2013-10-03 15:04:39 +00:00
/* Set current time to now */
2013-10-09 22:10:15 +00:00
ue_state - > state_before . currentSFN = SFN ;
ue_state - > state_before . currentSF = SF ;
2013-12-11 11:03:29 +00:00
ue_state - > state_before . currentTicks = SFN * 10 + SF ;
ue_state - > state_before . firstCycleStartSet = TRUE ;
2013-10-02 16:51:10 +00:00
}
2013-10-13 19:56:52 +00:00
2013-10-03 15:04:39 +00:00
/* Will loop around these checks, once for each subframe between previous
currentTime for this UE , and the time now ! ! ! */
/* It *should* be possible to just deal with the elapsed time all at once,
but much harder to get right , so loop . */
2013-10-13 19:56:52 +00:00
2013-10-22 16:52:45 +00:00
/* If > ~10s since last PDU, just zero all timers (except onDuration) */
if ( ( pinfo - > fd - > abs_ts . secs - ue_state - > state_before . currentTime . secs ) > = 9 ) {
init_drx_ue_state ( ue_state , FALSE ) ;
}
2013-10-09 22:10:15 +00:00
while ( ( ue_state - > state_before . currentSFN ! = SFN ) | | ( ue_state - > state_before . currentSF ! = SF ) ) {
2013-10-13 19:56:52 +00:00
2013-10-21 21:20:39 +00:00
/* Check for timers that have expired and change state accordingly */
2013-10-13 19:56:52 +00:00
2013-10-04 16:05:18 +00:00
/* See if onDuration timer should be started */
2013-12-11 11:03:29 +00:00
guint16 subframes = ue_state - > state_before . currentSFN * 10 + ue_state - > state_before . currentSF ;
2013-10-09 22:10:15 +00:00
if ( ! ue_state - > state_before . inShortCycle ) {
2013-12-11 11:03:29 +00:00
if ( ( subframes % ue_state - > config . longCycle ) = = ue_state - > config . cycleOffset ) {
2013-10-04 16:05:18 +00:00
mac_lte_drx_start_timer ( ue_state , drx_onduration_timer , 0 ) ;
}
}
else {
2013-12-11 11:03:29 +00:00
if ( ( subframes % ue_state - > config . shortCycle ) = = ( ue_state - > config . cycleOffset % ue_state - > config . shortCycle ) ) {
2013-10-04 16:05:18 +00:00
mac_lte_drx_start_timer ( ue_state , drx_onduration_timer , 0 ) ;
2013-10-13 19:56:52 +00:00
}
2013-10-04 16:05:18 +00:00
}
2013-10-03 15:04:39 +00:00
/* Check for HARQ RTT Timer expiring.
In practice only one could expire in any given subframe . . . */
for ( harq_id = 0 ; harq_id < 8 ; harq_id + + ) {
2013-10-21 21:20:39 +00:00
if ( mac_lte_drx_has_timer_expired ( ue_state , drx_rtt_timer , harq_id , TRUE , & time_until_expires ) ) {
2013-10-04 16:05:18 +00:00
/* Start the Retransmission timer */
mac_lte_drx_start_timer ( ue_state , drx_retx_timer , harq_id ) ;
2013-10-03 15:04:39 +00:00
}
2013-10-02 16:51:10 +00:00
}
2013-10-13 19:56:52 +00:00
2013-10-03 15:04:39 +00:00
/* Reception of DRX command is dealt with separately at the moment... */
2013-10-13 19:56:52 +00:00
2013-10-03 15:04:39 +00:00
/* Inactivity timer expired */
2013-10-21 21:20:39 +00:00
if ( mac_lte_drx_has_timer_expired ( ue_state , drx_inactivity_timer , 0 , TRUE , & time_until_expires ) ) {
2013-10-03 15:04:39 +00:00
if ( ue_state - > config . shortCycleConfigured ) {
2013-10-21 21:20:39 +00:00
ue_state - > state_before . inShortCycle = TRUE ;
mac_lte_drx_start_timer ( ue_state , drx_short_cycle_timer , 0 ) ;
2013-10-03 15:04:39 +00:00
}
2013-10-02 16:51:10 +00:00
}
2013-10-04 16:05:18 +00:00
2013-10-03 15:04:39 +00:00
/* Move subframe along by one */
2013-10-09 22:10:15 +00:00
if ( ue_state - > state_before . currentSF = = 9 ) {
ue_state - > state_before . currentSF = 0 ;
if ( ue_state - > state_before . currentSFN = = 1023 ) {
ue_state - > state_before . currentSFN = 0 ;
2013-10-07 21:57:07 +00:00
}
else {
2013-10-09 22:10:15 +00:00
ue_state - > state_before . currentSFN + + ;
2013-10-07 21:57:07 +00:00
}
2013-10-03 15:04:39 +00:00
}
else {
2013-10-09 22:10:15 +00:00
ue_state - > state_before . currentSF + + ;
2013-10-03 15:04:39 +00:00
}
2013-12-11 11:03:29 +00:00
ue_state - > state_before . currentTicks + + ;
2013-10-07 21:57:07 +00:00
}
2013-10-13 19:56:52 +00:00
2013-10-07 21:57:07 +00:00
/* Set current time to now */
2013-10-09 22:10:15 +00:00
ue_state - > state_before . currentTime = pinfo - > fd - > abs_ts ;
2013-09-27 16:18:09 +00:00
}
}
2013-09-04 16:56:37 +00:00
2013-12-11 11:03:29 +00:00
/* Convenience function to get a pointer for the hash_func to work with */
static gpointer get_drx_result_hash_key ( guint32 frameNumber ,
guint pdu_instance ,
gboolean do_persist )
{
static drx_state_key_t key ;
drx_state_key_t * p_key ;
/* Only allocate a struct when will be adding entry */
if ( do_persist ) {
p_key = wmem_new0 ( wmem_file_scope ( ) , drx_state_key_t ) ;
}
else {
memset ( & key , 0 , sizeof ( drx_state_key_t ) ) ;
p_key = & key ;
}
/* Fill in details, and return pointer */
p_key - > frameNumber = frameNumber ;
p_key - > pdu_instance = pdu_instance ;
return p_key ;
}
2013-09-04 16:56:37 +00:00
/* Set DRX information to display for the current MAC frame.
Only called on first pass through frames . */
2013-12-11 11:03:29 +00:00
static void set_drx_info ( packet_info * pinfo , mac_lte_info * p_mac_lte_info , gboolean before_event , guint pdu_instance )
2013-08-30 04:08:57 +00:00
{
/* Look up state of this UE */
2013-09-27 16:18:09 +00:00
drx_state_t * ue_state = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_ue_state ,
GUINT_TO_POINTER ( ( guint ) p_mac_lte_info - > ueid ) ) ;
2013-10-21 21:20:39 +00:00
drx_state_t * frame_result ;
2013-09-27 16:18:09 +00:00
if ( ue_state ! = NULL ) {
2013-10-13 22:00:09 +00:00
/* Should only need to allocate frame_result and add to the result table when
before PDU is processed */
if ( before_event ) {
/* Copy UE snapshot for this frame, and add to result table */
2013-10-21 21:20:39 +00:00
frame_result = wmem_new ( wmem_file_scope ( ) , drx_state_t ) ;
2013-09-27 16:18:09 +00:00
2013-10-13 22:00:09 +00:00
/* Deep-copy this snapshot for this frame */
* frame_result = * ue_state ;
2013-09-27 16:18:09 +00:00
2013-10-13 22:00:09 +00:00
/* And store in table */
2013-12-11 11:03:29 +00:00
g_hash_table_insert ( mac_lte_drx_frame_result , get_drx_result_hash_key ( pinfo - > fd - > num , pdu_instance , TRUE ) , frame_result ) ;
2013-10-13 22:00:09 +00:00
}
else {
/* After update, so just copy ue_state 'state' info after part of frame */
2013-10-21 21:20:39 +00:00
frame_result = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_frame_result ,
2013-12-11 11:03:29 +00:00
get_drx_result_hash_key ( pinfo - > fd - > num , pdu_instance , FALSE ) ) ;
2013-10-13 22:00:09 +00:00
if ( frame_result ! = NULL ) {
2013-10-21 21:20:39 +00:00
/* Deep-copy updated state from UE */
2013-10-13 22:00:09 +00:00
frame_result - > state_after = ue_state - > state_before ;
}
}
2013-08-30 04:08:57 +00:00
}
}
/* Show DRX information associated with this MAC frame */
2013-09-27 16:29:05 +00:00
static void show_drx_info ( packet_info * pinfo , proto_tree * tree , tvbuff_t * tvb ,
2013-12-11 11:03:29 +00:00
mac_lte_info * p_mac_lte_info , gboolean before_event , guint pdu_instance )
2013-08-30 04:08:57 +00:00
{
2013-10-13 22:00:09 +00:00
drx_state_t * frame_state ;
drx_running_state_t * state_to_show ;
guint64 time_until_expires ;
2013-10-22 15:56:14 +00:00
guint n ;
2013-08-30 04:08:57 +00:00
/* Look up entry by frame number in result table */
2013-10-07 21:57:07 +00:00
frame_state = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_frame_result ,
2013-12-11 11:03:29 +00:00
get_drx_result_hash_key ( pinfo - > fd - > num , pdu_instance , FALSE ) ) ;
2013-08-30 04:08:57 +00:00
/* Show available information */
2013-10-07 21:57:07 +00:00
if ( frame_state ! = NULL ) {
2013-08-30 04:08:57 +00:00
proto_tree * drx_config_tree , * drx_state_tree ;
proto_item * drx_config_ti , * drx_state_ti , * ti ;
2013-10-13 22:00:09 +00:00
/* Show config only if 'before */
if ( before_event ) {
/************************************/
/* Create config subtree */
drx_config_ti = proto_tree_add_string_format ( tree , hf_mac_lte_drx_config ,
tvb , 0 , 0 , " " , " DRX Config " ) ;
drx_config_tree = proto_item_add_subtree ( drx_config_ti , ett_mac_lte_drx_config ) ;
PROTO_ITEM_SET_GENERATED ( drx_config_ti ) ;
/* Link back to configuration (RRC) frame */
ti = proto_tree_add_uint ( drx_config_tree , hf_mac_lte_drx_config_frame_num , tvb ,
0 , 0 , frame_state - > config . frameNum ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2013-09-23 17:34:18 +00:00
2013-10-13 22:00:09 +00:00
/* Link back to any previous config frame (only from current config frame) */
if ( ( frame_state - > config . frameNum = = pinfo - > fd - > num ) & &
( frame_state - > config . previousFrameNum ! = 0 ) ) {
ti = proto_tree_add_uint ( drx_config_tree , hf_mac_lte_drx_config_previous_frame_num , tvb ,
0 , 0 , frame_state - > config . previousFrameNum ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
2013-08-30 04:08:57 +00:00
2013-10-13 22:00:09 +00:00
/* Config fields */
ti = proto_tree_add_uint ( drx_config_tree , hf_mac_lte_drx_config_long_cycle , tvb ,
0 , 0 , frame_state - > config . longCycle ) ;
2013-08-30 04:08:57 +00:00
PROTO_ITEM_SET_GENERATED ( ti ) ;
2013-10-13 22:00:09 +00:00
ti = proto_tree_add_uint ( drx_config_tree , hf_mac_lte_drx_config_cycle_offset , tvb ,
0 , 0 , frame_state - > config . cycleOffset ) ;
2013-08-30 04:08:57 +00:00
PROTO_ITEM_SET_GENERATED ( ti ) ;
2013-10-13 22:00:09 +00:00
ti = proto_tree_add_uint ( drx_config_tree , hf_mac_lte_drx_config_onduration_timer , tvb ,
0 , 0 , frame_state - > config . onDurationTimer ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( drx_config_tree , hf_mac_lte_drx_config_inactivity_timer , tvb ,
0 , 0 , frame_state - > config . inactivityTimer ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( drx_config_tree , hf_mac_lte_drx_config_retransmission_timer , tvb ,
0 , 0 , frame_state - > config . retransmissionTimer ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2013-10-16 20:35:08 +00:00
2013-10-13 22:00:09 +00:00
if ( frame_state - > config . shortCycleConfigured ) {
ti = proto_tree_add_uint ( drx_config_tree , hf_mac_lte_drx_config_short_cycle , tvb ,
0 , 0 , frame_state - > config . shortCycle ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( drx_config_tree , hf_mac_lte_drx_config_short_cycle_timer , tvb ,
0 , 0 , frame_state - > config . shortCycleTimer ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
2013-08-30 04:08:57 +00:00
2013-10-13 22:00:09 +00:00
proto_item_append_text ( drx_config_ti , " (Long-cycle=%u cycle-offset=%u onDuration=%u) " ,
frame_state - > config . longCycle , frame_state - > config . cycleOffset ,
frame_state - > config . onDurationTimer ) ;
if ( frame_state - > config . shortCycleConfigured ) {
proto_item_append_text ( drx_config_ti , " (Short-cycle=%u Short-cycle-timer=%u) " ,
frame_state - > config . shortCycle , frame_state - > config . shortCycleTimer ) ;
}
2013-08-30 04:08:57 +00:00
}
2013-09-04 16:56:37 +00:00
/*************************************/
/* Create state subtree */
2013-08-30 04:08:57 +00:00
drx_state_ti = proto_tree_add_string_format ( tree , hf_mac_lte_drx_state ,
2013-10-13 22:00:09 +00:00
tvb , 0 , 0 , " " ,
( before_event ) ? " DRX State Before " : " DRX State After " ) ;
2013-10-22 15:56:14 +00:00
/* Get appropriate state pointer to use below */
2013-10-13 22:00:09 +00:00
if ( before_event ) {
state_to_show = & frame_state - > state_before ;
}
else {
state_to_show = & frame_state - > state_after ;
}
2013-08-30 04:08:57 +00:00
drx_state_tree = proto_item_add_subtree ( drx_state_ti , ett_mac_lte_drx_state ) ;
PROTO_ITEM_SET_GENERATED ( drx_state_ti ) ;
2013-10-04 16:05:18 +00:00
/* Show cycle information */
2013-09-04 16:56:37 +00:00
2013-10-13 22:00:09 +00:00
if ( ! state_to_show - > inShortCycle ) {
2013-10-04 16:05:18 +00:00
/* Show where we are in current long cycle */
guint16 offset_into_long_cycle = ( ( p_mac_lte_info - > sysframeNumber * 10 ) + p_mac_lte_info - > subframeNumber ) %
2013-10-07 21:57:07 +00:00
frame_state - > config . longCycle ;
2013-10-04 16:05:18 +00:00
ti = proto_tree_add_uint ( drx_state_tree , hf_mac_lte_drx_state_long_cycle_offset , tvb ,
0 , 0 , offset_into_long_cycle ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
else {
/* Show where we are inside short cycle */
guint16 offset_into_short_cycle = ( ( p_mac_lte_info - > sysframeNumber * 10 ) + p_mac_lte_info - > subframeNumber ) %
2013-10-07 21:57:07 +00:00
frame_state - > config . shortCycle ;
2013-10-04 16:05:18 +00:00
ti = proto_tree_add_uint ( drx_state_tree , hf_mac_lte_drx_state_short_cycle_offset , tvb ,
0 , 0 , offset_into_short_cycle ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2013-08-30 04:08:57 +00:00
2013-10-22 16:52:45 +00:00
/* Is short-cycle-timer running? */
if ( ! mac_lte_drx_has_timer_expired ( frame_state , drx_short_cycle_timer , 0 , before_event , & time_until_expires ) ) {
2013-12-11 11:03:29 +00:00
if ( time_until_expires ) {
ti = proto_tree_add_uint ( drx_state_tree , hf_mac_lte_drx_state_short_cycle_remaining , tvb ,
0 , 0 , ( guint16 ) time_until_expires ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
2013-10-22 16:52:45 +00:00
}
2013-10-04 16:05:18 +00:00
}
2013-10-03 15:04:39 +00:00
2013-10-22 15:56:14 +00:00
/* Show which timers are still running and how long they have to go.
TODO : Complain if it looks like DRX looks like it should be on
TODO : if PDU is a retranmission , would be good to check to see if DRX
would have been on for original Tx ! */
2013-10-07 21:57:07 +00:00
2013-10-22 15:56:14 +00:00
/* Is onduration timer running? */
2013-10-21 21:20:39 +00:00
if ( ! mac_lte_drx_has_timer_expired ( frame_state , drx_onduration_timer , 0 , before_event , & time_until_expires ) ) {
2013-12-11 11:03:29 +00:00
if ( time_until_expires ) {
ti = proto_tree_add_uint ( drx_state_tree , hf_mac_lte_drx_state_onduration_remaining , tvb ,
0 , 0 , ( guint16 ) time_until_expires ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
2013-10-21 21:20:39 +00:00
}
/* Is inactivity timer running? */
if ( ! mac_lte_drx_has_timer_expired ( frame_state , drx_inactivity_timer , 0 , before_event , & time_until_expires ) ) {
2013-12-11 11:03:29 +00:00
if ( time_until_expires ) {
ti = proto_tree_add_uint ( drx_state_tree , hf_mac_lte_drx_state_inactivity_remaining , tvb ,
0 , 0 , ( guint16 ) time_until_expires ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
2013-10-07 21:57:07 +00:00
}
2013-10-21 21:20:39 +00:00
2013-10-22 15:56:14 +00:00
/* Are any of the Retransmission timers running? */
for ( n = 0 ; n < 8 ; n + + ) {
if ( ! mac_lte_drx_has_timer_expired ( frame_state , drx_retx_timer , n , before_event , & time_until_expires ) ) {
2013-12-11 11:03:29 +00:00
if ( time_until_expires ) {
ti = proto_tree_add_uint ( drx_state_tree , hf_mac_lte_drx_state_retransmission_remaining , tvb ,
0 , 0 , ( guint16 ) time_until_expires ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
proto_item_append_text ( ti , " (harqid=%u) " , n ) ;
}
2013-10-22 15:56:14 +00:00
}
}
/* Are any of the RTT timers running? */
for ( n = 0 ; n < 8 ; n + + ) {
if ( ! mac_lte_drx_has_timer_expired ( frame_state , drx_rtt_timer , n , before_event , & time_until_expires ) ) {
2013-12-11 11:03:29 +00:00
if ( time_until_expires ) {
ti = proto_tree_add_uint ( drx_state_tree , hf_mac_lte_drx_state_rtt_remaining , tvb ,
0 , 0 , ( guint16 ) time_until_expires ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
proto_item_append_text ( ti , " (harqid=%u) " , n ) ;
}
2013-10-22 15:56:14 +00:00
}
}
2013-08-30 04:08:57 +00:00
}
}
2009-12-02 17:46:27 +00:00
/**************************************************************************/
2009-11-25 16:00:58 +00:00
2009-08-01 09:52:12 +00:00
2009-05-28 02:24:27 +00:00
/* Forward declarations */
2013-12-11 11:03:29 +00:00
int dissect_mac_lte ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * ) ;
2009-05-28 02:24:27 +00:00
2011-11-28 14:52:11 +00:00
static guint8 get_mac_lte_channel_priority ( guint16 ueid _U_ , guint8 lcid ,
guint8 direction ) ;
2009-05-28 02:24:27 +00:00
/* Heuristic dissection */
static gboolean global_mac_lte_heur = FALSE ;
2010-07-20 08:27:34 +00:00
static void call_with_catch_all ( dissector_handle_t handle , tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree )
{
/* Call it (catch exceptions so that stats will be updated) */
TRY {
2012-09-11 08:28:07 +00:00
call_dissector_only ( handle , tvb , pinfo , tree , NULL ) ;
2010-07-20 08:27:34 +00:00
}
CATCH_ALL {
}
ENDTRY
}
2012-01-19 02:58:53 +00:00
/* Dissect context fields in the format described in packet-mac-lte.h.
Return TRUE if the necessary information was successfully found */
gboolean dissect_mac_lte_context_fields ( struct mac_lte_info * p_mac_lte_info , tvbuff_t * tvb ,
gint * p_offset )
2009-05-28 02:24:27 +00:00
{
2012-01-19 02:58:53 +00:00
gint offset = * p_offset ;
guint8 tag = 0 ;
2010-10-20 09:58:40 +00:00
2009-05-28 02:24:27 +00:00
/* Read fixed fields */
p_mac_lte_info - > radioType = tvb_get_guint8 ( tvb , offset + + ) ;
p_mac_lte_info - > direction = tvb_get_guint8 ( tvb , offset + + ) ;
2010-03-14 17:56:37 +00:00
if ( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) {
p_mac_lte_info - > detailed_phy_info . ul_info . present = FALSE ;
}
else {
p_mac_lte_info - > detailed_phy_info . dl_info . present = FALSE ;
}
2010-09-21 03:14:49 +00:00
2009-05-28 02:24:27 +00:00
p_mac_lte_info - > rntiType = tvb_get_guint8 ( tvb , offset + + ) ;
2010-11-13 15:32:29 +00:00
/* Initialize RNTI with a default value in case optional field is not present */
2011-01-17 15:01:22 +00:00
switch ( p_mac_lte_info - > rntiType ) {
2011-12-22 18:05:48 +00:00
case M_RNTI :
p_mac_lte_info - > rnti = 0xFFFD ;
break ;
2010-11-13 15:32:29 +00:00
case P_RNTI :
p_mac_lte_info - > rnti = 0xFFFE ;
break ;
case SI_RNTI :
p_mac_lte_info - > rnti = 0xFFFF ;
break ;
case RA_RNTI :
case C_RNTI :
case SPS_RNTI :
p_mac_lte_info - > rnti = 0x0001 ;
break ;
default :
break ;
}
2011-01-16 20:51:21 +00:00
2009-05-28 02:24:27 +00:00
/* Read optional fields */
while ( tag ! = MAC_LTE_PAYLOAD_TAG ) {
/* Process next tag */
tag = tvb_get_guint8 ( tvb , offset + + ) ;
switch ( tag ) {
case MAC_LTE_RNTI_TAG :
p_mac_lte_info - > rnti = tvb_get_ntohs ( tvb , offset ) ;
offset + = 2 ;
break ;
case MAC_LTE_UEID_TAG :
p_mac_lte_info - > ueid = tvb_get_ntohs ( tvb , offset ) ;
offset + = 2 ;
break ;
2013-12-19 21:40:38 +00:00
case MAC_LTE_FRAME_SUBFRAME_TAG :
{
guint16 sfn_sf = tvb_get_ntohs ( tvb , offset ) ;
p_mac_lte_info - > sysframeNumber = ( sfn_sf > > 4 ) & 0x03ff ;
p_mac_lte_info - > subframeNumber = sfn_sf & 0x000f ;
offset + = 2 ;
}
2009-05-28 02:24:27 +00:00
break ;
2012-04-25 20:02:12 +00:00
case MAC_LTE_PREDEFINED_DATA_TAG :
2009-05-28 02:24:27 +00:00
p_mac_lte_info - > isPredefinedData = tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
break ;
case MAC_LTE_RETX_TAG :
p_mac_lte_info - > reTxCount = tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
break ;
case MAC_LTE_CRC_STATUS_TAG :
2013-12-11 11:03:29 +00:00
p_mac_lte_info - > crcStatusValid = TRUE ;
2013-12-22 21:16:31 +00:00
p_mac_lte_info - > crcStatus =
2012-12-16 00:02:50 +00:00
( mac_lte_crc_status ) tvb_get_guint8 ( tvb , offset ) ;
2009-05-28 02:24:27 +00:00
offset + + ;
break ;
2012-04-25 20:02:12 +00:00
case MAC_LTE_EXT_BSR_SIZES_TAG :
p_mac_lte_info - > isExtendedBSRSizes = TRUE ;
break ;
2013-12-19 22:40:49 +00:00
case MAC_LTE_SEND_PREAMBLE_TAG :
p_mac_lte_info - > oob_event = ltemac_send_preamble ;
p_mac_lte_info - > rapid = tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
p_mac_lte_info - > rach_attempt_number = tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
break ;
2013-12-22 21:16:31 +00:00
case MAC_LTE_CARRIER_ID_TAG :
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > carrierId =
2013-12-22 21:16:31 +00:00
( mac_lte_carrier_id ) tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
break ;
case MAC_LTE_PHY_TAG :
{
gint len , offset1 ;
len = tvb_get_guint8 ( tvb , offset + + ) ;
offset1 = offset ;
if ( p_mac_lte_info - > direction = = DIRECTION_DOWNLINK ) {
if ( len < 10 )
goto next ;
p_mac_lte_info - > detailed_phy_info . dl_info . present = TRUE ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . dci_format =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . resource_allocation_type =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . aggregation_level =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . mcs_index =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . redundancy_version_index =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . resource_block_length =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . harq_id =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . ndi =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . transport_block =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > dl_retx =
2013-12-22 21:16:31 +00:00
( mac_lte_dl_retx ) tvb_get_guint8 ( tvb , offset ) ;
} else {
if ( len < 6 )
goto next ;
p_mac_lte_info - > detailed_phy_info . ul_info . present = TRUE ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . ul_info . modulation_type =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . ul_info . tbs_index =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . ul_info . resource_block_length =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . ul_info . resource_block_start =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . ul_info . harq_id =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
offset + + ;
2014-02-25 16:27:32 +00:00
p_mac_lte_info - > detailed_phy_info . ul_info . ndi =
2013-12-22 21:16:31 +00:00
tvb_get_guint8 ( tvb , offset ) ;
}
next :
offset = offset1 + len ;
}
break ;
2009-05-28 02:24:27 +00:00
case MAC_LTE_PAYLOAD_TAG :
/* Have reached data, so set payload length and get out of loop */
2012-08-19 01:56:39 +00:00
/* TODO: this is not correct if there is padding which isn't in frame */
2009-05-28 02:24:27 +00:00
p_mac_lte_info - > length = tvb_length_remaining ( tvb , offset ) ;
continue ;
default :
/* It must be a recognised tag */
return FALSE ;
}
}
2012-01-19 02:58:53 +00:00
/* Pass out where offset is now */
* p_offset = offset ;
return TRUE ;
}
/* Heuristic dissector looks for supported framing protocol (see wiki page) */
static gboolean dissect_mac_lte_heur ( tvbuff_t * tvb , packet_info * pinfo ,
2012-09-10 21:40:21 +00:00
proto_tree * tree , void * data _U_ )
2012-01-19 02:58:53 +00:00
{
gint offset = 0 ;
struct mac_lte_info * p_mac_lte_info ;
tvbuff_t * mac_tvb ;
gboolean infoAlreadySet = FALSE ;
/* This is a heuristic dissector, which means we get all the UDP
* traffic not sent to a known dissector and not claimed by
* a heuristic dissector called before us !
*/
if ( ! global_mac_lte_heur ) {
return FALSE ;
}
/* Do this again on re-dissection to re-discover offset of actual PDU */
/* Needs to be at least as long as:
- the signature string
- fixed header bytes
- tag for data
- at least one byte of MAC PDU payload */
2013-06-17 18:44:19 +00:00
if ( tvb_length_remaining ( tvb , offset ) < ( gint ) ( strlen ( MAC_LTE_START_STRING ) + 3 + 2 ) ) {
2012-01-19 02:58:53 +00:00
return FALSE ;
}
/* OK, compare with signature string */
if ( tvb_strneql ( tvb , offset , MAC_LTE_START_STRING , strlen ( MAC_LTE_START_STRING ) ) ! = 0 ) {
return FALSE ;
}
offset + = ( gint ) strlen ( MAC_LTE_START_STRING ) ;
/* If redissecting, use previous info struct (if available) */
2013-11-23 02:20:13 +00:00
p_mac_lte_info = ( mac_lte_info * ) p_get_proto_data ( wmem_file_scope ( ) , pinfo , proto_mac_lte , 0 ) ;
2012-01-19 02:58:53 +00:00
if ( p_mac_lte_info = = NULL ) {
/* Allocate new info struct for this frame */
2013-08-30 14:49:55 +00:00
p_mac_lte_info = wmem_new0 ( wmem_file_scope ( ) , struct mac_lte_info ) ;
2012-01-19 02:58:53 +00:00
infoAlreadySet = FALSE ;
}
else {
infoAlreadySet = TRUE ;
}
/* Dissect the fields to populate p_mac_lte */
if ( ! dissect_mac_lte_context_fields ( p_mac_lte_info , tvb , & offset ) ) {
return FALSE ;
}
2009-12-04 17:39:39 +00:00
if ( ! infoAlreadySet ) {
/* Store info in packet */
2013-11-23 02:20:13 +00:00
p_add_proto_data ( wmem_file_scope ( ) , pinfo , proto_mac_lte , 0 , p_mac_lte_info ) ;
2009-12-04 17:39:39 +00:00
}
2009-05-28 02:24:27 +00:00
/**************************************/
/* OK, now dissect as MAC LTE */
/* Create tvb that starts at actual MAC PDU */
2013-02-19 23:17:07 +00:00
mac_tvb = tvb_new_subset_remaining ( tvb , offset ) ;
2013-12-11 11:03:29 +00:00
dissect_mac_lte ( mac_tvb , pinfo , tree , NULL ) ;
2010-10-20 09:58:40 +00:00
2009-05-28 02:24:27 +00:00
return TRUE ;
}
2009-01-08 14:09:38 +00:00
2010-03-09 01:41:36 +00:00
/* Write the given formatted text to:
2010-03-14 17:56:37 +00:00
- the info column ( if pinfo ! = NULL )
- 1 or 2 other labels ( optional )
*/
static void write_pdu_label_and_info ( proto_item * ti1 , proto_item * ti2 ,
2010-03-09 01:41:36 +00:00
packet_info * pinfo , const char * format , . . . )
{
# define MAX_INFO_BUFFER 256
static char info_buffer [ MAX_INFO_BUFFER ] ;
va_list ap ;
2012-08-21 17:12:13 +00:00
if ( ( ti1 = = NULL ) & & ( ti2 = = NULL ) & & ( pinfo = = NULL ) ) {
return ;
}
2010-03-09 01:41:36 +00:00
va_start ( ap , format ) ;
g_vsnprintf ( info_buffer , MAX_INFO_BUFFER , format , ap ) ;
va_end ( ap ) ;
/* Add to indicated places */
2010-03-14 17:56:37 +00:00
if ( pinfo ! = NULL ) {
col_append_str ( pinfo - > cinfo , COL_INFO , info_buffer ) ;
}
if ( ti1 ! = NULL ) {
2012-09-19 16:56:59 +00:00
proto_item_append_text ( ti1 , " %s " , info_buffer ) ;
2010-03-14 17:56:37 +00:00
}
if ( ti2 ! = NULL ) {
2012-09-19 16:56:59 +00:00
proto_item_append_text ( ti2 , " %s " , info_buffer ) ;
2010-03-09 01:41:36 +00:00
}
}
2012-11-29 22:25:18 +00:00
/* Version of function above, where no g_vsnprintf() call needed */
static void write_pdu_label_and_info_literal ( proto_item * ti1 , proto_item * ti2 ,
packet_info * pinfo , const char * info_buffer )
{
if ( ( ti1 = = NULL ) & & ( ti2 = = NULL ) & & ( pinfo = = NULL ) ) {
return ;
}
/* Add to indicated places */
if ( pinfo ! = NULL ) {
col_append_str ( pinfo - > cinfo , COL_INFO , info_buffer ) ;
}
if ( ti1 ! = NULL ) {
proto_item_append_text ( ti1 , " %s " , info_buffer ) ;
}
if ( ti2 ! = NULL ) {
proto_item_append_text ( ti2 , " %s " , info_buffer ) ;
}
}
2010-03-14 17:56:37 +00:00
/* Show extra PHY parameters (if present) */
static void show_extra_phy_parameters ( packet_info * pinfo , tvbuff_t * tvb , proto_tree * tree ,
struct mac_lte_info * p_mac_lte_info )
{
proto_item * phy_ti ;
proto_tree * phy_tree ;
proto_item * ti ;
2010-10-18 17:02:19 +00:00
if ( global_mac_lte_layer_to_show = = ShowPHYLayer ) {
/* Clear the info column */
col_clear ( pinfo - > cinfo , COL_INFO ) ;
}
2010-10-15 21:32:35 +00:00
2010-03-14 17:56:37 +00:00
if ( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) {
if ( p_mac_lte_info - > detailed_phy_info . ul_info . present ) {
/* Create root */
phy_ti = proto_tree_add_string_format ( tree , hf_mac_lte_context_phy_ul ,
tvb , 0 , 0 , " " , " UL PHY Context " ) ;
phy_tree = proto_item_add_subtree ( phy_ti , ett_mac_lte_phy_context ) ;
PROTO_ITEM_SET_GENERATED ( phy_ti ) ;
/* Add items */
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_ul_modulation_type ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . ul_info . modulation_type ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-09-21 03:14:49 +00:00
2010-03-14 17:56:37 +00:00
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_ul_tbs_index ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . ul_info . tbs_index ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_ul_resource_block_length ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . ul_info . resource_block_length ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_ul_resource_block_start ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . ul_info . resource_block_start ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-12-05 23:34:11 +00:00
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_ul_harq_id ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . ul_info . harq_id ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_ul_ndi ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . ul_info . ndi ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2012-09-19 16:56:59 +00:00
proto_item_append_text ( phy_ti , " ( " ) ;
2010-03-14 17:56:37 +00:00
write_pdu_label_and_info ( phy_ti , NULL ,
( global_mac_lte_layer_to_show = = ShowPHYLayer ) ? pinfo : NULL ,
2010-10-15 21:32:35 +00:00
" UL: UEId=%u RNTI=%u %s Tbs_Index=%u RB_len=%u RB_start=%u " ,
p_mac_lte_info - > ueid ,
p_mac_lte_info - > rnti ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( p_mac_lte_info - > detailed_phy_info . ul_info . modulation_type ,
modulation_type_vals , " Unknown " ) ,
p_mac_lte_info - > detailed_phy_info . ul_info . tbs_index ,
p_mac_lte_info - > detailed_phy_info . ul_info . resource_block_length ,
p_mac_lte_info - > detailed_phy_info . ul_info . resource_block_start ) ;
2012-09-19 16:56:59 +00:00
proto_item_append_text ( phy_ti , " ) " ) ;
2010-03-14 17:56:37 +00:00
/* Don't want columns to be replaced now */
if ( global_mac_lte_layer_to_show = = ShowPHYLayer ) {
col_set_writable ( pinfo - > cinfo , FALSE ) ;
}
}
}
else {
if ( p_mac_lte_info - > detailed_phy_info . dl_info . present ) {
/* Create root */
phy_ti = proto_tree_add_string_format ( tree , hf_mac_lte_context_phy_dl ,
tvb , 0 , 0 , " " , " DL PHY Context " ) ;
phy_tree = proto_item_add_subtree ( phy_ti , ett_mac_lte_phy_context ) ;
PROTO_ITEM_SET_GENERATED ( phy_ti ) ;
/* Add items */
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_dl_dci_format ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . dl_info . dci_format ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_dl_resource_allocation_type ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . dl_info . resource_allocation_type ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_dl_aggregation_level ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . dl_info . aggregation_level ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_dl_mcs_index ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . dl_info . mcs_index ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_dl_redundancy_version_index ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . dl_info . redundancy_version_index ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2011-01-27 16:09:24 +00:00
ti = proto_tree_add_boolean ( phy_tree , hf_mac_lte_context_phy_dl_retx ,
tvb , 0 , 0 ,
p_mac_lte_info - > dl_retx ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-03-14 17:56:37 +00:00
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_dl_resource_block_length ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . dl_info . resource_block_length ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-11-02 15:20:38 +00:00
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_dl_harq_id ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . dl_info . harq_id ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_dl_ndi ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . dl_info . ndi ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-12-05 23:34:11 +00:00
ti = proto_tree_add_uint ( phy_tree , hf_mac_lte_context_phy_dl_tb ,
tvb , 0 , 0 ,
p_mac_lte_info - > detailed_phy_info . dl_info . transport_block ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-11-02 15:20:38 +00:00
2012-09-19 16:56:59 +00:00
proto_item_append_text ( phy_ti , " ( " ) ;
2010-03-14 17:56:37 +00:00
write_pdu_label_and_info ( phy_ti , NULL ,
( global_mac_lte_layer_to_show = = ShowPHYLayer ) ? pinfo : NULL ,
2010-10-15 21:32:35 +00:00
" DL: UEId=%u RNTI=%u DCI_Format=%s Res_Alloc=%u Aggr_Level=%s MCS=%u RV=%u "
2013-12-22 21:16:31 +00:00
" Res_Block_len=%u HARQ_id=%u NDI=%u " ,
2010-10-15 21:32:35 +00:00
p_mac_lte_info - > ueid ,
p_mac_lte_info - > rnti ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( p_mac_lte_info - > detailed_phy_info . dl_info . dci_format ,
dci_format_vals , " Unknown " ) ,
p_mac_lte_info - > detailed_phy_info . dl_info . resource_allocation_type ,
val_to_str_const ( p_mac_lte_info - > detailed_phy_info . dl_info . aggregation_level ,
aggregation_level_vals , " Unknown " ) ,
p_mac_lte_info - > detailed_phy_info . dl_info . mcs_index ,
p_mac_lte_info - > detailed_phy_info . dl_info . redundancy_version_index ,
p_mac_lte_info - > detailed_phy_info . dl_info . resource_block_length ,
2010-11-02 15:20:38 +00:00
p_mac_lte_info - > detailed_phy_info . dl_info . harq_id ,
p_mac_lte_info - > detailed_phy_info . dl_info . ndi ) ;
2012-09-19 16:56:59 +00:00
proto_item_append_text ( phy_ti , " ) " ) ;
2010-03-14 17:56:37 +00:00
/* Don't want columns to be replaced now */
if ( global_mac_lte_layer_to_show = = ShowPHYLayer ) {
col_set_writable ( pinfo - > cinfo , FALSE ) ;
}
}
2010-09-21 03:14:49 +00:00
}
2010-03-14 17:56:37 +00:00
}
2010-03-09 01:41:36 +00:00
2009-01-08 14:09:38 +00:00
/* Dissect a single Random Access Reponse body */
static gint dissect_rar_entry ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree ,
2010-03-09 01:41:36 +00:00
proto_item * pdu_ti ,
2009-05-01 10:30:18 +00:00
gint offset , guint8 rapid )
2009-01-08 14:09:38 +00:00
{
2012-03-16 02:00:29 +00:00
guint8 reserved ;
guint start_body_offset = offset ;
2009-01-08 14:09:38 +00:00
proto_item * ti ;
proto_item * rar_body_ti ;
proto_tree * rar_body_tree ;
2009-11-29 22:45:06 +00:00
proto_tree * ul_grant_tree ;
2009-04-27 11:12:01 +00:00
proto_item * ul_grant_ti ;
2012-03-16 02:00:29 +00:00
guint16 timing_advance ;
guint32 ul_grant ;
guint16 temp_crnti ;
2009-01-08 14:09:38 +00:00
/* Create tree for this Body */
rar_body_ti = proto_tree_add_item ( tree ,
hf_mac_lte_rar_body ,
2011-10-15 18:46:26 +00:00
tvb , offset , 0 , ENC_ASCII | ENC_NA ) ;
2009-01-08 14:09:38 +00:00
rar_body_tree = proto_item_add_subtree ( rar_body_ti , ett_mac_lte_rar_body ) ;
/* Dissect an RAR entry */
/* Check reserved bit */
reserved = ( tvb_get_guint8 ( tvb , offset ) & 0x80 ) > > 7 ;
2011-10-06 03:35:44 +00:00
ti = proto_tree_add_item ( rar_body_tree , hf_mac_lte_rar_reserved2 , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-11-29 22:45:06 +00:00
if ( reserved ! = 0 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_reserved_not_zero , " RAR body Reserved bit not zero (found 0x%x) " , reserved ) ;
2009-01-08 14:09:38 +00:00
}
/* Timing Advance */
timing_advance = ( tvb_get_ntohs ( tvb , offset ) & 0x7ff0 ) > > 4 ;
2011-10-06 03:35:44 +00:00
ti = proto_tree_add_item ( rar_body_tree , hf_mac_lte_rar_ta , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2009-09-18 16:27:02 +00:00
if ( timing_advance ! = 0 ) {
2013-09-05 01:05:16 +00:00
if ( timing_advance < = 31 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_rar_timing_advance_not_zero_note ,
2009-09-18 16:27:02 +00:00
" RAR Timing advance not zero (%u) " , timing_advance ) ;
2013-09-05 01:05:16 +00:00
} else {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_rar_timing_advance_not_zero_warn ,
2013-09-05 01:05:16 +00:00
" RAR Timing advance not zero (%u) " , timing_advance ) ;
}
2009-09-18 16:27:02 +00:00
}
2009-01-08 14:09:38 +00:00
offset + + ;
/* UL Grant */
ul_grant = ( tvb_get_ntohl ( tvb , offset ) & 0x0fffff00 ) > > 8 ;
2011-10-06 03:35:44 +00:00
ul_grant_ti = proto_tree_add_item ( rar_body_tree , hf_mac_lte_rar_ul_grant , tvb , offset , 3 , ENC_BIG_ENDIAN ) ;
2009-04-27 11:12:01 +00:00
/* Break these 20 bits down as described in 36.213, section 6.2 */
2009-11-29 22:45:06 +00:00
/* Create subtree for UL grant break-down */
ul_grant_tree = proto_item_add_subtree ( ul_grant_ti , ett_mac_lte_rar_ul_grant ) ;
2009-04-27 11:12:01 +00:00
2009-11-29 22:45:06 +00:00
/* Hopping flag (1 bit) */
proto_tree_add_item ( ul_grant_tree , hf_mac_lte_rar_ul_grant_hopping ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-04-27 11:12:01 +00:00
2009-11-29 22:45:06 +00:00
/* Fixed sized resource block assignment (10 bits) */
proto_tree_add_item ( ul_grant_tree , hf_mac_lte_rar_ul_grant_fsrba ,
2011-10-06 03:35:44 +00:00
tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2009-04-27 11:12:01 +00:00
2009-11-29 22:45:06 +00:00
/* Truncated Modulation and coding scheme (4 bits) */
proto_tree_add_item ( ul_grant_tree , hf_mac_lte_rar_ul_grant_tmcs ,
2011-10-06 03:35:44 +00:00
tvb , offset + 1 , 2 , ENC_BIG_ENDIAN ) ;
2009-04-27 11:12:01 +00:00
2009-11-29 22:45:06 +00:00
/* TPC command for scheduled PUSCH (3 bits) */
proto_tree_add_item ( ul_grant_tree , hf_mac_lte_rar_ul_grant_tcsp ,
2011-10-06 03:35:44 +00:00
tvb , offset + 2 , 1 , ENC_BIG_ENDIAN ) ;
2009-04-27 11:12:01 +00:00
2009-11-29 22:45:06 +00:00
/* UL delay (1 bit) */
proto_tree_add_item ( ul_grant_tree , hf_mac_lte_rar_ul_grant_ul_delay ,
2011-10-06 03:35:44 +00:00
tvb , offset + 2 , 1 , ENC_BIG_ENDIAN ) ;
2009-04-27 11:12:01 +00:00
2009-11-29 22:45:06 +00:00
/* CQI request (1 bit) */
proto_tree_add_item ( ul_grant_tree , hf_mac_lte_rar_ul_grant_cqi_request ,
2011-10-06 03:35:44 +00:00
tvb , offset + 2 , 1 , ENC_BIG_ENDIAN ) ;
2009-04-27 11:12:01 +00:00
2009-01-08 14:09:38 +00:00
offset + = 3 ;
/* Temporary C-RNTI */
temp_crnti = tvb_get_ntohs ( tvb , offset ) ;
2011-10-06 03:35:44 +00:00
proto_tree_add_item ( rar_body_tree , hf_mac_lte_rar_temporary_crnti , tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2009-01-08 14:09:38 +00:00
offset + = 2 ;
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , rar_body_ti , pinfo ,
" (RAPID=%u: TA=%u, UL-Grant=%u, Temp C-RNTI=%u) " ,
rapid , timing_advance , ul_grant , temp_crnti ) ;
2009-01-08 14:09:38 +00:00
proto_item_set_len ( rar_body_ti , offset - start_body_offset ) ;
return offset ;
}
2010-12-28 20:47:48 +00:00
# define MAX_RAR_PDUS 64
2008-12-23 21:00:04 +00:00
/* Dissect Random Access Reponse (RAR) PDU */
2009-10-25 23:03:11 +00:00
static void dissect_rar ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * pdu_ti ,
2009-04-21 12:35:50 +00:00
gint offset , mac_lte_info * p_mac_lte_info , mac_lte_tap_info * tap_info )
2008-12-23 21:00:04 +00:00
{
2012-03-16 02:00:29 +00:00
gint number_of_rars = 0 ; /* No of RAR bodies expected following headers */
2013-08-30 14:49:55 +00:00
guint8 * rapids = ( guint8 * ) wmem_alloc ( wmem_packet_scope ( ) , MAX_RAR_PDUS * sizeof ( guint8 ) ) ;
2012-03-16 02:00:29 +00:00
gboolean backoff_indicator_seen = FALSE ;
guint8 backoff_indicator = 0 ;
guint8 extension ;
gint n ;
2008-12-23 21:00:04 +00:00
proto_tree * rar_headers_tree ;
2009-04-20 16:46:46 +00:00
proto_item * ti ;
2008-12-23 21:00:04 +00:00
proto_item * rar_headers_ti ;
2010-08-12 09:03:05 +00:00
proto_item * padding_length_ti ;
2012-03-16 02:00:29 +00:00
int start_headers_offset = offset ;
2008-12-23 21:00:04 +00:00
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
2013-12-19 21:40:38 +00:00
" RAR (RA-RNTI=%u, SFN=%-4u, SF=%u) " ,
p_mac_lte_info - > rnti , p_mac_lte_info - > sysframeNumber , p_mac_lte_info - > subframeNumber ) ;
2009-04-17 11:38:06 +00:00
2009-04-20 16:46:46 +00:00
/* Create hidden 'virtual root' so can filter on mac-lte.rar */
2011-10-04 22:44:31 +00:00
ti = proto_tree_add_item ( tree , hf_mac_lte_rar , tvb , offset , - 1 , ENC_NA ) ;
2009-04-20 16:46:46 +00:00
PROTO_ITEM_SET_HIDDEN ( ti ) ;
2008-12-23 21:00:04 +00:00
/* Create headers tree */
rar_headers_ti = proto_tree_add_item ( tree ,
hf_mac_lte_rar_headers ,
2011-10-15 18:46:26 +00:00
tvb , offset , 0 , ENC_ASCII | ENC_NA ) ;
2008-12-23 21:00:04 +00:00
rar_headers_tree = proto_item_add_subtree ( rar_headers_ti , ett_mac_lte_rar_headers ) ;
/***************************/
/* Read the header entries */
do {
int start_header_offset = offset ;
proto_tree * rar_header_tree ;
proto_item * rar_header_ti ;
guint8 type_value ;
guint8 first_byte = tvb_get_guint8 ( tvb , offset ) ;
/* Create tree for this header */
rar_header_ti = proto_tree_add_item ( rar_headers_tree ,
hf_mac_lte_rar_header ,
2011-10-15 18:46:26 +00:00
tvb , offset , 0 , ENC_ASCII | ENC_NA ) ;
2008-12-23 21:00:04 +00:00
rar_header_tree = proto_item_add_subtree ( rar_header_ti , ett_mac_lte_rar_header ) ;
/* Extension */
extension = ( first_byte & 0x80 ) > > 7 ;
2011-10-06 03:35:44 +00:00
proto_tree_add_item ( rar_header_tree , hf_mac_lte_rar_extension , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2008-12-23 21:00:04 +00:00
/* Type */
type_value = ( first_byte & 0x40 ) > > 6 ;
2011-10-06 03:35:44 +00:00
proto_tree_add_item ( rar_header_tree , hf_mac_lte_rar_t , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2008-12-23 21:00:04 +00:00
if ( type_value = = 0 ) {
2009-05-14 17:12:37 +00:00
/* Backoff Indicator (BI) case */
2008-12-23 21:00:04 +00:00
guint8 reserved ;
2010-01-18 23:16:10 +00:00
proto_item * tii ;
2009-04-27 11:12:01 +00:00
proto_item * bi_ti ;
2008-12-23 21:00:04 +00:00
/* 2 Reserved bits */
reserved = ( tvb_get_guint8 ( tvb , offset ) & 0x30 ) > > 4 ;
2011-10-06 03:35:44 +00:00
tii = proto_tree_add_item ( rar_header_tree , hf_mac_lte_rar_reserved , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-11-29 22:45:06 +00:00
if ( reserved ! = 0 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , tii , & ei_mac_lte_reserved_not_zero ,
2009-07-22 13:21:15 +00:00
" RAR header Reserved bits not zero (found 0x%x) " , reserved ) ;
2008-12-23 21:00:04 +00:00
}
/* Backoff Indicator */
backoff_indicator = tvb_get_guint8 ( tvb , offset ) & 0x0f ;
2011-10-06 03:35:44 +00:00
bi_ti = proto_tree_add_item ( rar_header_tree , hf_mac_lte_rar_bi , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-05-14 17:12:37 +00:00
/* As of March 2009 spec, it must be first, and may only appear once */
2009-04-27 11:12:01 +00:00
if ( backoff_indicator_seen ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , bi_ti , & ei_mac_lte_rar_bi_present ) ;
2009-04-27 11:12:01 +00:00
}
2008-12-23 21:00:04 +00:00
backoff_indicator_seen = TRUE ;
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , rar_header_ti , pinfo ,
" (Backoff Indicator=%sms) " ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( backoff_indicator , rar_bi_vals , " Illegal-value " ) ) ;
2009-07-14 17:43:20 +00:00
/* If present, it must be the first subheader */
2009-05-14 17:12:37 +00:00
if ( number_of_rars > 0 ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , bi_ti , & ei_mac_lte_rar_bi_not_first_subheader ) ;
2009-05-14 17:12:37 +00:00
}
2008-12-23 21:00:04 +00:00
}
else {
/* RAPID case */
2009-07-22 13:21:15 +00:00
/* TODO: complain if the same RAPID appears twice in same frame? */
2009-05-01 10:30:18 +00:00
rapids [ number_of_rars ] = tvb_get_guint8 ( tvb , offset ) & 0x3f ;
2011-10-06 03:35:44 +00:00
proto_tree_add_item ( rar_header_tree , hf_mac_lte_rar_rapid , tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2008-12-23 21:00:04 +00:00
2009-07-14 17:43:20 +00:00
proto_item_append_text ( rar_header_ti , " (RAPID=%u) " , rapids [ number_of_rars ] ) ;
2009-05-01 10:30:18 +00:00
number_of_rars + + ;
2008-12-23 21:00:04 +00:00
}
offset + + ;
/* Finalise length of header tree selection */
proto_item_set_len ( rar_header_ti , offset - start_header_offset ) ;
2010-12-28 20:47:48 +00:00
} while ( extension & & number_of_rars < MAX_RAR_PDUS ) ;
2008-12-23 21:00:04 +00:00
/* Append summary to headers root */
2009-07-30 16:53:33 +00:00
proto_item_append_text ( rar_headers_ti , " (%u RARs " , number_of_rars ) ;
2013-02-16 00:05:37 +00:00
ti = proto_tree_add_uint ( rar_headers_tree , hf_mac_lte_rar_no_of_rapids , tvb , 0 , 0 , number_of_rars ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-07-30 16:53:33 +00:00
if ( backoff_indicator_seen ) {
proto_item_append_text ( rar_headers_ti , " , BI=%sms) " ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( backoff_indicator , rar_bi_vals , " Illegal-value " ) ) ;
2009-07-30 16:53:33 +00:00
}
else {
2012-09-19 16:56:59 +00:00
proto_item_append_text ( rar_headers_ti , " ) " ) ;
2009-07-30 16:53:33 +00:00
}
2008-12-23 21:00:04 +00:00
/* Set length for headers root */
proto_item_set_len ( rar_headers_ti , offset - start_headers_offset ) ;
/***************************/
/* Read any indicated RARs */
for ( n = 0 ; n < number_of_rars ; n + + ) {
2010-03-09 01:41:36 +00:00
offset = dissect_rar_entry ( tvb , pinfo , tree , pdu_ti , offset , rapids [ n ] ) ;
2008-12-23 21:00:04 +00:00
}
2009-04-21 12:35:50 +00:00
/* Update TAP info */
tap_info - > number_of_rars + = number_of_rars ;
2009-04-30 13:18:56 +00:00
2010-08-12 09:03:05 +00:00
/* Padding may follow */
if ( tvb_length_remaining ( tvb , offset ) > 0 ) {
proto_tree_add_item ( tree , hf_mac_lte_padding_data ,
2011-10-04 22:44:31 +00:00
tvb , offset , - 1 , ENC_NA ) ;
2009-04-30 13:18:56 +00:00
}
2010-08-12 09:03:05 +00:00
padding_length_ti = proto_tree_add_int ( tree , hf_mac_lte_padding_length ,
tvb , offset , 0 ,
p_mac_lte_info - > length - offset ) ;
PROTO_ITEM_SET_GENERATED ( padding_length_ti ) ;
/* Update padding bytes in stats */
tap_info - > padding_bytes + = ( p_mac_lte_info - > length - offset ) ;
2008-12-23 21:00:04 +00:00
}
/* Dissect BCH PDU */
static void dissect_bch ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree ,
2010-03-09 01:41:36 +00:00
proto_item * pdu_ti ,
2008-12-23 21:00:04 +00:00
int offset , mac_lte_info * p_mac_lte_info )
{
proto_item * ti ;
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
" BCH PDU (%u bytes, on %s transport) " ,
tvb_length_remaining ( tvb , offset ) ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( p_mac_lte_info - > rntiType ,
bch_transport_channel_vals ,
" Unknown " ) ) ;
2008-12-23 21:00:04 +00:00
/* Show which transport layer it came in on (inferred from RNTI type) */
ti = proto_tree_add_uint ( tree , hf_mac_lte_context_bch_transport_channel ,
tvb , offset , 0 , p_mac_lte_info - > rntiType ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-04-20 16:46:46 +00:00
/****************************************/
/* Whole frame is BCH data */
2009-05-01 10:30:18 +00:00
/* Raw data */
2008-12-23 21:00:04 +00:00
ti = proto_tree_add_item ( tree , hf_mac_lte_bch_pdu ,
2011-10-04 22:44:31 +00:00
tvb , offset , - 1 , ENC_NA ) ;
2008-12-23 21:00:04 +00:00
2009-04-20 16:46:46 +00:00
if ( global_mac_lte_attempt_rrc_decode ) {
/* Attempt to decode payload using LTE RRC dissector */
2013-02-19 23:17:07 +00:00
tvbuff_t * rrc_tvb = tvb_new_subset_remaining ( tvb , offset ) ;
2009-04-20 16:46:46 +00:00
/* Get appropriate dissector handle */
dissector_handle_t protocol_handle = 0 ;
if ( p_mac_lte_info - > rntiType = = SI_RNTI ) {
2011-07-25 13:34:40 +00:00
protocol_handle = find_dissector ( " lte_rrc.bcch_dl_sch " ) ;
2009-04-20 16:46:46 +00:00
}
else {
2011-07-25 13:34:40 +00:00
protocol_handle = find_dissector ( " lte_rrc.bcch_bch " ) ;
2009-04-20 16:46:46 +00:00
}
2009-05-01 10:30:18 +00:00
/* Hide raw view of bytes */
PROTO_ITEM_SET_HIDDEN ( ti ) ;
2010-07-20 08:27:34 +00:00
call_with_catch_all ( protocol_handle , rrc_tvb , pinfo , tree ) ;
2009-04-20 16:46:46 +00:00
}
2008-12-23 21:00:04 +00:00
/* Check that this *is* downlink! */
if ( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , ti , & ei_mac_lte_bch_pdu ) ;
2008-12-23 21:00:04 +00:00
}
}
/* Dissect PCH PDU */
static void dissect_pch ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree ,
2013-08-08 14:45:45 +00:00
proto_item * pdu_ti , int offset , guint8 direction , mac_lte_tap_info * tap_info )
2008-12-23 21:00:04 +00:00
{
proto_item * ti ;
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
" PCH PDU (%u bytes) " ,
tvb_length_remaining ( tvb , offset ) ) ;
2008-12-23 21:00:04 +00:00
2009-04-20 16:46:46 +00:00
/****************************************/
/* Whole frame is PCH data */
/* Always show as raw data */
2008-12-23 21:00:04 +00:00
ti = proto_tree_add_item ( tree , hf_mac_lte_pch_pdu ,
2011-10-04 22:44:31 +00:00
tvb , offset , - 1 , ENC_NA ) ;
2008-12-23 21:00:04 +00:00
2013-08-08 14:45:45 +00:00
/* Get number of paging IDs for tap */
2013-08-12 09:56:30 +00:00
tap_info - > number_of_paging_ids = ( tvb_get_guint8 ( tvb , offset ) & 0x40 ) ?
( ( tvb_get_ntohs ( tvb , offset ) > > 7 ) & 0x000f ) + 1 : 0 ;
2013-08-08 14:45:45 +00:00
2009-04-20 16:46:46 +00:00
if ( global_mac_lte_attempt_rrc_decode ) {
2009-05-01 10:30:18 +00:00
2009-04-20 16:46:46 +00:00
/* Attempt to decode payload using LTE RRC dissector */
2013-02-19 23:17:07 +00:00
tvbuff_t * rrc_tvb = tvb_new_subset_remaining ( tvb , offset ) ;
2009-04-20 16:46:46 +00:00
/* Get appropriate dissector handle */
2012-09-23 21:01:05 +00:00
dissector_handle_t protocol_handle = find_dissector ( " lte_rrc.pcch " ) ;
2009-04-20 16:46:46 +00:00
2009-05-01 10:30:18 +00:00
/* Hide raw view of bytes */
PROTO_ITEM_SET_HIDDEN ( ti ) ;
2009-06-17 12:13:29 +00:00
/* Call it (catch exceptions so that stats will be updated) */
2012-09-23 21:01:05 +00:00
call_with_catch_all ( protocol_handle , rrc_tvb , pinfo , tree ) ;
2009-04-20 16:46:46 +00:00
}
2008-12-23 21:00:04 +00:00
/* Check that this *is* downlink! */
if ( direction = = DIRECTION_UPLINK ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , ti , & ei_mac_lte_pch_pdu ) ;
2008-12-23 21:00:04 +00:00
}
}
/* Does this header entry correspond to a fixed-sized control element? */
static int is_fixed_sized_control_element ( guint8 lcid , guint8 direction )
{
if ( direction = = DIRECTION_UPLINK ) {
/* Uplink */
switch ( lcid ) {
case POWER_HEADROOM_REPORT_LCID :
case CRNTI_LCID :
case TRUNCATED_BSR_LCID :
case SHORT_BSR_LCID :
case LONG_BSR_LCID :
return TRUE ;
default :
return FALSE ;
}
}
else {
/* Assume Downlink */
switch ( lcid ) {
2012-04-25 20:02:12 +00:00
case ACTIVATION_DEACTIVATION_LCID :
2008-12-23 21:00:04 +00:00
case UE_CONTENTION_RESOLUTION_IDENTITY_LCID :
case TIMING_ADVANCE_LCID :
case DRX_COMMAND_LCID :
return TRUE ;
default :
return FALSE ;
}
}
}
2009-02-21 21:22:41 +00:00
/* Is this a BSR report header? */
static int is_bsr_lcid ( guint8 lcid )
{
return ( ( lcid = = TRUNCATED_BSR_LCID ) | |
( lcid = = SHORT_BSR_LCID ) | |
( lcid = = LONG_BSR_LCID ) ) ;
}
2008-12-23 21:00:04 +00:00
2009-10-22 10:31:13 +00:00
/* Helper function to call RLC dissector for SDUs (where channel params are known) */
2009-09-18 16:27:02 +00:00
static void call_rlc_dissector ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree ,
2010-03-09 01:41:36 +00:00
proto_item * pdu_ti ,
2009-09-18 16:27:02 +00:00
int offset , guint16 data_length ,
guint8 mode , guint8 direction , guint16 ueid ,
guint16 channelType , guint16 channelId ,
2011-11-28 14:52:11 +00:00
guint8 UMSequenceNumberLength ,
guint8 priority )
2009-09-18 16:27:02 +00:00
{
2012-10-01 19:51:07 +00:00
tvbuff_t * rb_tvb = tvb_new_subset ( tvb , offset , data_length , data_length ) ;
2009-09-18 16:27:02 +00:00
struct rlc_lte_info * p_rlc_lte_info ;
/* Resuse or create RLC info */
2013-11-23 02:20:13 +00:00
p_rlc_lte_info = ( rlc_lte_info * ) p_get_proto_data ( wmem_file_scope ( ) , pinfo , proto_rlc_lte , 0 ) ;
2010-01-26 14:55:26 +00:00
if ( p_rlc_lte_info = = NULL ) {
2013-08-30 14:49:55 +00:00
p_rlc_lte_info = wmem_new0 ( wmem_file_scope ( ) , struct rlc_lte_info ) ;
2010-01-26 14:55:26 +00:00
}
2009-09-18 16:27:02 +00:00
/* Fill in struct details for srb channels */
p_rlc_lte_info - > rlcMode = mode ;
p_rlc_lte_info - > direction = direction ;
2011-11-28 14:52:11 +00:00
p_rlc_lte_info - > priority = priority ;
2009-09-18 16:27:02 +00:00
p_rlc_lte_info - > ueid = ueid ;
p_rlc_lte_info - > channelType = channelType ;
p_rlc_lte_info - > channelId = channelId ;
p_rlc_lte_info - > pduLength = data_length ;
p_rlc_lte_info - > UMSequenceNumberLength = UMSequenceNumberLength ;
/* Store info in packet */
2013-11-23 02:20:13 +00:00
p_add_proto_data ( wmem_file_scope ( ) , pinfo , proto_rlc_lte , 0 , p_rlc_lte_info ) ;
2009-09-18 16:27:02 +00:00
2010-03-14 17:56:37 +00:00
if ( global_mac_lte_layer_to_show ! = ShowRLCLayer ) {
2010-02-08 15:01:08 +00:00
/* Don't want these columns replaced */
col_set_writable ( pinfo - > cinfo , FALSE ) ;
}
else {
/* Clear info column before first RLC PDU */
if ( s_number_of_rlc_pdus_shown = = 0 ) {
col_clear ( pinfo - > cinfo , COL_INFO ) ;
}
else {
/* Add a separator and protect column contents here */
2012-11-29 22:25:18 +00:00
write_pdu_label_and_info_literal ( pdu_ti , NULL , pinfo , " || " ) ;
2010-02-08 15:01:08 +00:00
col_set_fence ( pinfo - > cinfo , COL_INFO ) ;
}
}
s_number_of_rlc_pdus_shown + + ;
2009-09-18 16:27:02 +00:00
/* Call it (catch exceptions so that stats will be updated) */
2012-10-06 14:59:51 +00:00
call_with_catch_all ( rlc_lte_handle , rb_tvb , pinfo , tree ) ;
2009-09-18 16:27:02 +00:00
2012-03-08 13:20:33 +00:00
/* Let columns be written to again */
2009-09-18 16:27:02 +00:00
col_set_writable ( pinfo - > cinfo , TRUE ) ;
}
2011-01-27 16:09:24 +00:00
/* For DL frames, look for previous Tx. Add link back if found */
static void TrackReportedDLHARQResend ( packet_info * pinfo , tvbuff_t * tvb , volatile int length ,
proto_tree * tree , mac_lte_info * p_mac_lte_info )
2008-12-23 21:00:04 +00:00
{
2009-11-25 16:00:58 +00:00
DLHARQResult * result = NULL ;
2011-07-28 16:52:02 +00:00
DLHARQResult * original_result = NULL ;
2009-11-25 16:00:58 +00:00
2011-01-14 14:25:24 +00:00
/* If don't have detailed DL PHy info, just give up */
if ( ! p_mac_lte_info - > detailed_phy_info . dl_info . present ) {
2011-01-27 16:09:24 +00:00
return ;
2011-01-14 11:21:28 +00:00
}
2010-07-05 10:35:17 +00:00
/* TDD may not work... */
2010-03-01 22:52:34 +00:00
2009-11-25 16:00:58 +00:00
if ( ! pinfo - > fd - > flags . visited ) {
/* First time, so set result and update DL harq table */
LastFrameData * lastData = NULL ;
LastFrameData * thisData = NULL ;
2011-01-14 14:25:24 +00:00
DLHarqBuffers * ueData ;
2010-04-22 13:54:30 +00:00
2011-01-14 14:25:24 +00:00
/* Read these for convenience */
guint8 harq_id = p_mac_lte_info - > detailed_phy_info . dl_info . harq_id ;
guint8 transport_block = p_mac_lte_info - > detailed_phy_info . dl_info . transport_block ;
2010-04-22 13:54:30 +00:00
2011-01-14 14:25:24 +00:00
/* Check harq-id bounds, give up if invalid */
2013-06-16 15:11:21 +00:00
if ( ( harq_id > = 15 ) | | ( transport_block > 1 ) ) {
2011-01-27 16:09:24 +00:00
return ;
2011-01-14 14:25:24 +00:00
}
2010-04-22 13:54:30 +00:00
2011-01-14 14:25:24 +00:00
/* Look up entry for this UE/RNTI */
2013-03-08 06:06:56 +00:00
ueData = ( DLHarqBuffers * ) g_hash_table_lookup ( mac_lte_dl_harq_hash , GUINT_TO_POINTER ( ( guint ) p_mac_lte_info - > rnti ) ) ;
2010-04-22 13:54:30 +00:00
2011-01-14 14:25:24 +00:00
if ( ueData ! = NULL ) {
/* Get previous info for this harq-id */
2011-01-27 16:09:24 +00:00
lastData = & ( ueData - > harqid [ transport_block ] [ harq_id ] ) ;
2011-01-14 14:25:24 +00:00
if ( lastData - > inUse ) {
2011-01-27 16:09:24 +00:00
/* Compare time difference, ndi, data to see if this looks like a retx */
if ( ( length = = lastData - > length ) & &
2011-01-14 14:25:24 +00:00
( p_mac_lte_info - > detailed_phy_info . dl_info . ndi = = lastData - > ndi ) & &
2011-01-27 16:09:24 +00:00
tvb_memeql ( tvb , 0 , lastData - > data , MIN ( lastData - > length , MAX_EXPECTED_PDU_LENGTH ) ) = = 0 ) {
2011-01-14 14:25:24 +00:00
/* Work out gap between frames */
gint seconds_between_packets = ( gint )
( pinfo - > fd - > abs_ts . secs - lastData - > received_time . secs ) ;
gint nseconds_between_packets =
pinfo - > fd - > abs_ts . nsecs - lastData - > received_time . nsecs ;
/* Round difference to nearest millisecond */
gint total_gap = ( seconds_between_packets * 1000 ) +
( ( nseconds_between_packets + 500000 ) / 1000000 ) ;
/* Expect to be within (say) 8-13 subframes since previous */
if ( ( total_gap > = 8 ) & & ( total_gap < = 13 ) ) {
2011-07-28 16:52:02 +00:00
/* Resend detected! Store result pointing back. */
2013-08-30 14:49:55 +00:00
result = wmem_new0 ( wmem_file_scope ( ) , DLHARQResult ) ;
2011-07-28 16:52:02 +00:00
result - > previousSet = TRUE ;
2011-01-14 14:25:24 +00:00
result - > previousFrameNum = lastData - > framenum ;
2011-04-11 21:33:33 +00:00
result - > timeSincePreviousFrame = total_gap ;
2011-01-14 14:25:24 +00:00
g_hash_table_insert ( mac_lte_dl_harq_result_hash , GUINT_TO_POINTER ( pinfo - > fd - > num ) , result ) ;
2011-07-28 16:52:02 +00:00
/* Now make previous frame point forward to here */
2013-03-08 06:06:56 +00:00
original_result = ( DLHARQResult * ) g_hash_table_lookup ( mac_lte_dl_harq_result_hash , GUINT_TO_POINTER ( lastData - > framenum ) ) ;
2011-07-28 16:52:02 +00:00
if ( original_result = = NULL ) {
2013-08-30 14:49:55 +00:00
original_result = wmem_new0 ( wmem_file_scope ( ) , DLHARQResult ) ;
2011-07-28 16:52:02 +00:00
g_hash_table_insert ( mac_lte_dl_harq_result_hash , GUINT_TO_POINTER ( lastData - > framenum ) , original_result ) ;
}
original_result - > nextSet = TRUE ;
original_result - > nextFrameNum = pinfo - > fd - > num ;
original_result - > timeToNextFrame = total_gap ;
2009-11-25 16:00:58 +00:00
}
}
}
}
else {
/* Allocate entry in table for this UE/RNTI */
2013-08-30 14:49:55 +00:00
ueData = wmem_new0 ( wmem_file_scope ( ) , DLHarqBuffers ) ;
2009-11-25 16:00:58 +00:00
g_hash_table_insert ( mac_lte_dl_harq_hash , GUINT_TO_POINTER ( ( guint ) p_mac_lte_info - > rnti ) , ueData ) ;
}
2008-12-23 21:00:04 +00:00
2009-11-25 16:00:58 +00:00
/* Store this frame's details in table */
2011-01-27 16:09:24 +00:00
thisData = & ( ueData - > harqid [ transport_block ] [ harq_id ] ) ;
2009-11-25 16:00:58 +00:00
thisData - > inUse = TRUE ;
2011-01-27 16:09:24 +00:00
thisData - > length = length ;
tvb_memcpy ( tvb , thisData - > data , 0 , MIN ( thisData - > length , MAX_EXPECTED_PDU_LENGTH ) ) ;
2011-01-14 14:25:24 +00:00
thisData - > ndi = p_mac_lte_info - > detailed_phy_info . dl_info . ndi ;
2009-11-25 16:00:58 +00:00
thisData - > framenum = pinfo - > fd - > num ;
thisData - > received_time = pinfo - > fd - > abs_ts ;
}
else {
/* Not first time, so just set whats already stored in result */
2013-03-08 06:06:56 +00:00
result = ( DLHARQResult * ) g_hash_table_lookup ( mac_lte_dl_harq_result_hash , GUINT_TO_POINTER ( pinfo - > fd - > num ) ) ;
2009-11-25 16:00:58 +00:00
}
2008-12-23 21:00:04 +00:00
2010-07-05 10:35:17 +00:00
2011-01-27 16:09:24 +00:00
/***************************************************/
/* Show link back to original frame (if available) */
2009-11-25 16:00:58 +00:00
if ( result ! = NULL ) {
2011-07-28 16:52:02 +00:00
if ( result - > previousSet ) {
proto_item * gap_ti ;
proto_item * original_ti = proto_tree_add_uint ( tree , hf_mac_lte_dl_harq_resend_original_frame ,
tvb , 0 , 0 , result - > previousFrameNum ) ;
PROTO_ITEM_SET_GENERATED ( original_ti ) ;
gap_ti = proto_tree_add_uint ( tree , hf_mac_lte_dl_harq_resend_time_since_previous_frame ,
tvb , 0 , 0 , result - > timeSincePreviousFrame ) ;
PROTO_ITEM_SET_GENERATED ( gap_ti ) ;
}
2011-04-11 21:33:33 +00:00
2011-07-28 16:52:02 +00:00
if ( result - > nextSet ) {
proto_item * gap_ti ;
proto_item * next_ti = proto_tree_add_uint ( tree , hf_mac_lte_dl_harq_resend_next_frame ,
tvb , 0 , 0 , result - > nextFrameNum ) ;
PROTO_ITEM_SET_GENERATED ( next_ti ) ;
gap_ti = proto_tree_add_uint ( tree , hf_mac_lte_dl_harq_resend_time_until_next_frame ,
tvb , 0 , 0 , result - > timeToNextFrame ) ;
PROTO_ITEM_SET_GENERATED ( gap_ti ) ;
}
2011-04-11 21:33:33 +00:00
2009-11-25 16:00:58 +00:00
}
}
2008-12-23 21:00:04 +00:00
2010-03-01 22:52:34 +00:00
/* Return TRUE if the given packet is thought to be a retx */
int is_mac_lte_frame_retx ( packet_info * pinfo , guint8 direction )
{
2013-11-23 02:20:13 +00:00
struct mac_lte_info * p_mac_lte_info = ( struct mac_lte_info * ) p_get_proto_data ( wmem_file_scope ( ) , pinfo , proto_mac_lte , 0 ) ;
2012-01-26 15:19:32 +00:00
2013-07-03 21:26:12 +00:00
if ( p_mac_lte_info = = NULL ) {
return FALSE ;
}
2010-03-01 22:52:34 +00:00
if ( direction = = DIRECTION_UPLINK ) {
/* For UL, retx count is stored in per-packet struct */
2013-07-03 21:26:12 +00:00
return ( p_mac_lte_info - > reTxCount > 0 ) ;
2010-03-01 22:52:34 +00:00
}
else {
2012-01-26 15:19:32 +00:00
/* Use answer if told directly */
if ( p_mac_lte_info - > dl_retx = = dl_retx_yes ) {
return TRUE ;
}
else {
/* Otherwise look up in table */
2013-03-08 06:06:56 +00:00
DLHARQResult * result = ( DLHARQResult * ) g_hash_table_lookup ( mac_lte_dl_harq_result_hash , GUINT_TO_POINTER ( pinfo - > fd - > num ) ) ;
2012-01-26 15:19:32 +00:00
return ( ( result ! = NULL ) & & result - > previousSet ) ;
}
2010-03-01 22:52:34 +00:00
}
}
2009-11-25 16:00:58 +00:00
/* Track UL frames, so that when a retx is indicated, we can search for
the original tx . We will either find it , and provide a link back to it ,
or flag that we couldn ' t find as an expert error */
static void TrackReportedULHARQResend ( packet_info * pinfo , tvbuff_t * tvb , volatile int offset ,
proto_tree * tree , mac_lte_info * p_mac_lte_info ,
proto_item * retx_ti )
{
ULHARQResult * result = NULL ;
2008-12-23 21:00:04 +00:00
2011-01-14 14:25:24 +00:00
/* If don't have detailed DL PHY info, just give up */
if ( ! p_mac_lte_info - > detailed_phy_info . ul_info . present ) {
2010-03-01 22:52:34 +00:00
return ;
}
2011-01-14 14:25:24 +00:00
/* Give up if harqid is out of range */
if ( p_mac_lte_info - > detailed_phy_info . ul_info . harq_id > = 8 ) {
2011-01-14 11:21:28 +00:00
return ;
}
2009-11-25 16:00:58 +00:00
if ( ! pinfo - > fd - > flags . visited ) {
/* First time, so set result and update UL harq table */
LastFrameData * lastData = NULL ;
LastFrameData * thisData = NULL ;
2009-10-13 13:36:58 +00:00
2009-11-25 16:00:58 +00:00
/* Look up entry for this UE/RNTI */
2013-03-08 06:06:56 +00:00
ULHarqBuffers * ueData = ( ULHarqBuffers * ) g_hash_table_lookup (
2013-10-16 20:35:08 +00:00
mac_lte_ul_harq_hash , GUINT_TO_POINTER ( ( guint ) p_mac_lte_info - > rnti ) ) ;
2009-11-25 16:00:58 +00:00
if ( ueData ! = NULL ) {
if ( p_mac_lte_info - > reTxCount > = 1 ) {
2011-01-14 14:25:24 +00:00
/* Looking for frame previously on this harq-id */
lastData = & ( ueData - > harqid [ p_mac_lte_info - > detailed_phy_info . ul_info . harq_id ] ) ;
2009-10-14 10:43:17 +00:00
if ( lastData - > inUse ) {
/* Compare time, sf, data to see if this looks like a retx */
if ( ( tvb_length_remaining ( tvb , offset ) = = lastData - > length ) & &
2011-01-14 14:25:24 +00:00
( p_mac_lte_info - > detailed_phy_info . ul_info . ndi = = lastData - > ndi ) & &
2011-01-17 15:01:22 +00:00
tvb_memeql ( tvb , offset , lastData - > data , MIN ( lastData - > length , MAX_EXPECTED_PDU_LENGTH ) ) = = 0 ) {
2009-10-14 10:43:17 +00:00
2009-10-13 13:36:58 +00:00
/* Work out gap between frames */
gint seconds_between_packets = ( gint )
( pinfo - > fd - > abs_ts . secs - lastData - > received_time . secs ) ;
gint nseconds_between_packets =
pinfo - > fd - > abs_ts . nsecs - lastData - > received_time . nsecs ;
2010-03-02 18:41:35 +00:00
/* Round to nearest ms */
2009-10-13 13:36:58 +00:00
gint total_gap = ( seconds_between_packets * 1000 ) +
2010-03-02 18:41:35 +00:00
( ( nseconds_between_packets + 500000 ) / 1000000 ) ;
2009-10-13 13:36:58 +00:00
2011-03-02 11:33:46 +00:00
/* Could be as many as max-tx (which we don't know) * 8ms ago.
32 is the most I ' ve seen . . . */
if ( total_gap < = 33 ) {
2012-10-06 15:52:14 +00:00
ULHARQResult * original_result ;
2011-02-21 14:43:16 +00:00
2011-07-18 11:57:38 +00:00
/* Original detected!!! Store result pointing back */
2013-08-30 14:49:55 +00:00
result = wmem_new0 ( wmem_file_scope ( ) , ULHARQResult ) ;
2011-07-18 11:57:38 +00:00
result - > previousSet = TRUE ;
2009-10-13 13:36:58 +00:00
result - > previousFrameNum = lastData - > framenum ;
2011-04-11 21:33:33 +00:00
result - > timeSincePreviousFrame = total_gap ;
2009-11-25 16:00:58 +00:00
g_hash_table_insert ( mac_lte_ul_harq_result_hash , GUINT_TO_POINTER ( pinfo - > fd - > num ) , result ) ;
2011-07-18 11:57:38 +00:00
/* Now make previous frame point forward to here */
2013-03-08 06:06:56 +00:00
original_result = ( ULHARQResult * ) g_hash_table_lookup ( mac_lte_ul_harq_result_hash , GUINT_TO_POINTER ( lastData - > framenum ) ) ;
2011-07-18 11:57:38 +00:00
if ( original_result = = NULL ) {
2013-08-30 14:49:55 +00:00
original_result = wmem_new0 ( wmem_file_scope ( ) , ULHARQResult ) ;
2011-07-18 11:57:38 +00:00
g_hash_table_insert ( mac_lte_ul_harq_result_hash , GUINT_TO_POINTER ( lastData - > framenum ) , original_result ) ;
}
original_result - > nextSet = TRUE ;
original_result - > nextFrameNum = pinfo - > fd - > num ;
original_result - > timeToNextFrame = total_gap ;
2009-10-13 13:36:58 +00:00
}
2009-10-14 10:43:17 +00:00
}
2009-10-13 13:36:58 +00:00
}
}
}
else {
2009-11-25 16:00:58 +00:00
/* Allocate entry in table for this UE/RNTI */
2013-08-30 14:49:55 +00:00
ueData = wmem_new0 ( wmem_file_scope ( ) , ULHarqBuffers ) ;
2009-11-25 16:00:58 +00:00
g_hash_table_insert ( mac_lte_ul_harq_hash , GUINT_TO_POINTER ( ( guint ) p_mac_lte_info - > rnti ) , ueData ) ;
2009-10-13 13:36:58 +00:00
}
2009-11-25 16:00:58 +00:00
/* Store this frame's details in table */
2011-01-14 14:25:24 +00:00
thisData = & ( ueData - > harqid [ p_mac_lte_info - > detailed_phy_info . ul_info . harq_id ] ) ;
2009-11-25 16:00:58 +00:00
thisData - > inUse = TRUE ;
thisData - > length = tvb_length_remaining ( tvb , offset ) ;
2011-01-17 15:01:22 +00:00
tvb_memcpy ( tvb , thisData - > data , offset , MIN ( thisData - > length , MAX_EXPECTED_PDU_LENGTH ) ) ;
2011-01-14 14:25:24 +00:00
thisData - > ndi = p_mac_lte_info - > detailed_phy_info . ul_info . ndi ;
2009-11-25 16:00:58 +00:00
thisData - > framenum = pinfo - > fd - > num ;
thisData - > received_time = pinfo - > fd - > abs_ts ;
}
else {
2011-07-18 11:57:38 +00:00
/* Not first time, so just get whats already stored in result */
2013-03-08 06:06:56 +00:00
result = ( ULHARQResult * ) g_hash_table_lookup ( mac_lte_ul_harq_result_hash , GUINT_TO_POINTER ( pinfo - > fd - > num ) ) ;
2009-11-25 16:00:58 +00:00
}
2011-07-18 11:57:38 +00:00
/* Show any link back to previous Tx */
2009-11-25 16:00:58 +00:00
if ( retx_ti ! = NULL ) {
2009-10-13 13:36:58 +00:00
if ( result ! = NULL ) {
2011-07-18 11:57:38 +00:00
if ( result - > previousSet ) {
proto_item * original_ti , * gap_ti ;
2009-11-25 16:00:58 +00:00
2011-07-18 11:57:38 +00:00
original_ti = proto_tree_add_uint ( tree , hf_mac_lte_ul_harq_resend_original_frame ,
tvb , 0 , 0 , result - > previousFrameNum ) ;
PROTO_ITEM_SET_GENERATED ( original_ti ) ;
2011-04-11 21:33:33 +00:00
2011-07-18 11:57:38 +00:00
gap_ti = proto_tree_add_uint ( tree , hf_mac_lte_ul_harq_resend_time_since_previous_frame ,
tvb , 0 , 0 , result - > timeSincePreviousFrame ) ;
PROTO_ITEM_SET_GENERATED ( gap_ti ) ;
}
2009-10-13 13:36:58 +00:00
}
else {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , retx_ti , & ei_mac_lte_orig_tx_ul_frame_not_found ,
2009-11-25 16:00:58 +00:00
" Original Tx of UL frame not found (UE %u) !! " , p_mac_lte_info - > ueid ) ;
2009-10-13 13:36:58 +00:00
}
}
2011-07-18 11:57:38 +00:00
/* Show link forward to any known next Tx */
if ( ( result ! = NULL ) & & result - > nextSet ) {
proto_item * next_ti , * gap_ti ;
next_ti = proto_tree_add_uint ( tree , hf_mac_lte_ul_harq_resend_next_frame ,
tvb , 0 , 0 , result - > nextFrameNum ) ;
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , next_ti , & ei_mac_lte_ul_harq_resend_next_frame ,
2011-07-18 11:57:38 +00:00
" UL MAC PDU (UE %u) needed to be retransmitted " , p_mac_lte_info - > ueid ) ;
PROTO_ITEM_SET_GENERATED ( next_ti ) ;
gap_ti = proto_tree_add_uint ( tree , hf_mac_lte_ul_harq_resend_time_until_next_frame ,
tvb , 0 , 0 , result - > timeToNextFrame ) ;
PROTO_ITEM_SET_GENERATED ( gap_ti ) ;
}
2009-11-25 16:00:58 +00:00
}
2009-12-02 17:46:27 +00:00
/* Look up SRResult associated with a given frame. Will create one if necessary
if can_create is set */
static SRResult * GetSRResult ( guint32 frameNum , gboolean can_create )
{
SRResult * result ;
2013-03-08 06:06:56 +00:00
result = ( SRResult * ) g_hash_table_lookup ( mac_lte_sr_request_hash , GUINT_TO_POINTER ( frameNum ) ) ;
2009-12-02 17:46:27 +00:00
if ( ( result = = NULL ) & & can_create ) {
2013-08-30 14:49:55 +00:00
result = wmem_new0 ( wmem_file_scope ( ) , SRResult ) ;
2009-12-02 17:46:27 +00:00
g_hash_table_insert ( mac_lte_sr_request_hash , GUINT_TO_POINTER ( ( guint ) frameNum ) , result ) ;
}
return result ;
}
/* Keep track of SR requests, failures and related grants, in order to show them
2009-12-14 16:04:14 +00:00
as generated fields in these frames */
2011-03-06 22:52:33 +00:00
static void TrackSRInfo ( SREvent event , packet_info * pinfo , proto_tree * tree ,
2011-05-11 11:10:30 +00:00
tvbuff_t * tvb , mac_lte_info * p_mac_lte_info , gint idx , proto_item * event_ti )
2009-12-02 17:46:27 +00:00
{
2012-03-16 02:00:29 +00:00
SRResult * result = NULL ;
SRState * state ;
SRResult * resultForSRFrame = NULL ;
2011-05-11 11:10:30 +00:00
2012-03-16 02:00:29 +00:00
guint16 rnti ;
guint16 ueid ;
2009-12-02 17:46:27 +00:00
proto_item * ti ;
2011-05-11 11:10:30 +00:00
/* Get appropriate identifiers */
2011-07-18 11:57:38 +00:00
if ( event = = SR_Request ) {
2011-05-11 11:10:30 +00:00
rnti = p_mac_lte_info - > oob_rnti [ idx ] ;
ueid = p_mac_lte_info - > oob_ueid [ idx ] ;
}
2011-07-18 11:57:38 +00:00
else {
rnti = p_mac_lte_info - > rnti ;
ueid = p_mac_lte_info - > ueid ;
}
2011-05-11 11:10:30 +00:00
2009-12-02 17:46:27 +00:00
/* Create state for this RNTI if necessary */
2013-03-08 06:06:56 +00:00
state = ( SRState * ) g_hash_table_lookup ( mac_lte_ue_sr_state , GUINT_TO_POINTER ( ( guint ) rnti ) ) ;
2009-12-02 17:46:27 +00:00
if ( state = = NULL ) {
/* Allocate status for this RNTI */
2013-08-30 14:49:55 +00:00
state = wmem_new ( wmem_file_scope ( ) , SRState ) ;
2009-12-02 17:46:27 +00:00
state - > status = None ;
2011-05-11 11:10:30 +00:00
g_hash_table_insert ( mac_lte_ue_sr_state , GUINT_TO_POINTER ( ( guint ) rnti ) , state ) ;
2009-12-02 17:46:27 +00:00
}
/* First time through - update state with new info */
if ( ! pinfo - > fd - > flags . visited ) {
2009-12-14 16:04:14 +00:00
guint32 timeSinceRequest ;
/* Store time of request */
if ( event = = SR_Request ) {
state - > requestTime = pinfo - > fd - > abs_ts ;
}
2009-12-02 17:46:27 +00:00
switch ( state - > status ) {
case None :
switch ( event ) {
case SR_Grant :
/* Got another grant - fine */
/* update state */
state - > lastGrantFramenum = pinfo - > fd - > num ;
break ;
case SR_Request :
/* Sent an SR - fine */
/* Update state */
state - > status = SR_Outstanding ;
state - > lastSRFramenum = pinfo - > fd - > num ;
break ;
case SR_Failure :
/* This is an error, since we hadn't send an SR... */
2009-12-14 11:23:24 +00:00
result = GetSRResult ( pinfo - > fd - > num , TRUE ) ;
result - > type = InvalidSREvent ;
result - > status = None ;
result - > event = SR_Failure ;
2009-12-02 17:46:27 +00:00
break ;
}
break ;
case SR_Outstanding :
2009-12-14 16:50:42 +00:00
timeSinceRequest = ( guint32 ) ( ( ( pinfo - > fd - > abs_ts . secs - state - > requestTime . secs ) * 1000 ) +
( ( pinfo - > fd - > abs_ts . nsecs - state - > requestTime . nsecs ) / 1000000 ) ) ;
2009-12-14 16:04:14 +00:00
2009-12-02 17:46:27 +00:00
switch ( event ) {
case SR_Grant :
/* Got grant we were waiting for, so state goes to None */
/* Update state */
state - > status = None ;
/* Set result info */
result = GetSRResult ( pinfo - > fd - > num , TRUE ) ;
result - > type = GrantAnsweringSR ;
result - > frameNum = state - > lastSRFramenum ;
2009-12-14 16:04:14 +00:00
result - > timeDifference = timeSinceRequest ;
2009-12-04 11:13:20 +00:00
/* Also set forward link for SR */
resultForSRFrame = GetSRResult ( state - > lastSRFramenum , TRUE ) ;
resultForSRFrame - > type = SRLeadingToGrant ;
resultForSRFrame - > frameNum = pinfo - > fd - > num ;
2009-12-14 16:04:14 +00:00
resultForSRFrame - > timeDifference = timeSinceRequest ;
2009-12-02 17:46:27 +00:00
break ;
case SR_Request :
/* Another request when already have one pending */
2009-12-14 11:23:24 +00:00
result = GetSRResult ( pinfo - > fd - > num , TRUE ) ;
result - > type = InvalidSREvent ;
result - > status = SR_Outstanding ;
2011-08-03 17:05:30 +00:00
result - > event = SR_Request ;
2009-12-02 17:46:27 +00:00
break ;
case SR_Failure :
/* We sent an SR but it failed */
/* Update state */
state - > status = SR_Failed ;
2009-12-04 11:13:20 +00:00
/* Set result info for failure frame */
2009-12-02 17:46:27 +00:00
result = GetSRResult ( pinfo - > fd - > num , TRUE ) ;
result - > type = FailureAnsweringSR ;
result - > frameNum = state - > lastSRFramenum ;
2009-12-14 16:04:14 +00:00
result - > timeDifference = timeSinceRequest ;
2009-12-04 11:13:20 +00:00
/* Also set forward link for SR */
resultForSRFrame = GetSRResult ( state - > lastSRFramenum , TRUE ) ;
resultForSRFrame - > type = SRLeadingToFailure ;
resultForSRFrame - > frameNum = pinfo - > fd - > num ;
2009-12-14 16:04:14 +00:00
resultForSRFrame - > timeDifference = timeSinceRequest ;
2009-12-02 17:46:27 +00:00
break ;
}
break ;
case SR_Failed :
switch ( event ) {
case SR_Grant :
/* Got a grant, presumably after a subsequent RACH - fine */
/* Update state */
state - > status = None ;
break ;
case SR_Request :
2011-03-01 14:58:51 +00:00
/* Tried another SR after previous one failed.
Presumably a subsequent RACH was tried in - between . . . */
state - > status = SR_Outstanding ;
2009-12-14 11:23:24 +00:00
result = GetSRResult ( pinfo - > fd - > num , TRUE ) ;
2011-03-01 14:58:51 +00:00
result - > status = SR_Outstanding ;
2009-12-14 11:23:24 +00:00
result - > event = SR_Request ;
2009-12-02 17:46:27 +00:00
break ;
case SR_Failure :
/* 2 failures in a row.... */
2009-12-14 11:23:24 +00:00
result = GetSRResult ( pinfo - > fd - > num , TRUE ) ;
result - > type = InvalidSREvent ;
result - > status = SR_Failed ;
result - > event = SR_Failure ;
2009-12-02 17:46:27 +00:00
break ;
}
break ;
}
}
2009-12-18 12:32:14 +00:00
/* Get stored result for this frame */
2009-12-02 17:46:27 +00:00
result = GetSRResult ( pinfo - > fd - > num , FALSE ) ;
if ( result = = NULL ) {
2009-12-04 11:13:20 +00:00
/* For an SR frame, there should always be either a PDCCH grant or indication
that the SR has failed */
if ( event = = SR_Request ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , event_ti , & ei_mac_lte_sr_results_not_grant_or_failure_indication ,
2011-04-11 21:33:33 +00:00
" UE %u: SR results in neither a grant nor a failure indication " ,
2011-05-11 11:10:30 +00:00
ueid ) ;
2009-12-04 11:13:20 +00:00
}
2009-12-02 17:46:27 +00:00
return ;
}
2009-12-04 11:13:20 +00:00
2009-12-02 17:46:27 +00:00
/* Show result info */
switch ( result - > type ) {
case GrantAnsweringSR :
ti = proto_tree_add_uint ( tree , hf_mac_lte_grant_answering_sr ,
tvb , 0 , 0 , result - > frameNum ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-12-14 16:04:14 +00:00
ti = proto_tree_add_uint ( tree , hf_mac_lte_sr_time_since_request ,
tvb , 0 , 0 , result - > timeDifference ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-12-02 17:46:27 +00:00
break ;
2009-12-18 12:32:14 +00:00
2009-12-02 17:46:27 +00:00
case FailureAnsweringSR :
ti = proto_tree_add_uint ( tree , hf_mac_lte_failure_answering_sr ,
tvb , 0 , 0 , result - > frameNum ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-12-14 16:04:14 +00:00
ti = proto_tree_add_uint ( tree , hf_mac_lte_sr_time_since_request ,
tvb , 0 , 0 , result - > timeDifference ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-12-02 17:46:27 +00:00
break ;
2009-12-18 12:32:14 +00:00
2009-12-04 11:13:20 +00:00
case SRLeadingToGrant :
ti = proto_tree_add_uint ( tree , hf_mac_lte_sr_leading_to_grant ,
tvb , 0 , 0 , result - > frameNum ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-12-14 16:04:14 +00:00
ti = proto_tree_add_uint ( tree , hf_mac_lte_sr_time_until_answer ,
tvb , 0 , 0 , result - > timeDifference ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-12-04 11:13:20 +00:00
break ;
2009-12-18 12:32:14 +00:00
2009-12-04 11:13:20 +00:00
case SRLeadingToFailure :
ti = proto_tree_add_uint ( tree , hf_mac_lte_sr_leading_to_failure ,
tvb , 0 , 0 , result - > frameNum ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-12-14 16:04:14 +00:00
ti = proto_tree_add_uint ( tree , hf_mac_lte_sr_time_until_answer ,
tvb , 0 , 0 , result - > timeDifference ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-12-04 11:13:20 +00:00
break ;
2009-12-18 12:32:14 +00:00
2009-12-14 11:23:24 +00:00
case InvalidSREvent :
2013-09-05 01:05:16 +00:00
proto_tree_add_expert_format ( tree , pinfo , & ei_mac_lte_sr_invalid_event ,
2011-04-11 21:33:33 +00:00
tvb , 0 , 0 , " UE %u: Invalid SR event - state=%s, event=%s " ,
2011-05-11 11:10:30 +00:00
ueid ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( result - > status , sr_status_vals , " Unknown " ) ,
val_to_str_const ( result - > event , sr_event_vals , " Unknown " ) ) ;
2009-12-17 13:15:29 +00:00
break ;
2009-12-02 17:46:27 +00:00
}
}
2011-04-11 21:33:33 +00:00
/********************************************************/
/* Count number of UEs/TTI (in both directions) */
/********************************************************/
2011-04-15 23:32:44 +00:00
/* For keeping track during first pass */
2011-04-11 21:33:33 +00:00
typedef struct tti_info_t {
guint16 subframe ;
nstime_t ttiStartTime ;
guint ues_in_tti ;
} tti_info_t ;
2011-04-20 10:23:41 +00:00
2011-04-11 21:33:33 +00:00
static tti_info_t UL_tti_info ;
static tti_info_t DL_tti_info ;
2011-04-15 23:32:44 +00:00
/* For associating with frame and displaying */
typedef struct TTIInfoResult_t {
guint ues_in_tti ;
} TTIInfoResult_t ;
/* This table stores (FrameNumber -> *TTIInfoResult_t). It is assigned during the first
pass and used thereafter */
static GHashTable * mac_lte_tti_info_result_hash = NULL ;
2011-04-16 10:56:18 +00:00
/* Work out which UE this is within TTI (within direction). Return answer */
static guint16 count_ues_tti ( mac_lte_info * p_mac_lte_info , packet_info * pinfo )
2011-04-11 21:33:33 +00:00
{
2011-04-15 23:32:44 +00:00
gboolean same_tti = FALSE ;
2011-04-16 10:56:18 +00:00
tti_info_t * tti_info ;
/* Just return any previous result */
2013-03-08 06:06:56 +00:00
TTIInfoResult_t * result = ( TTIInfoResult_t * ) g_hash_table_lookup ( mac_lte_tti_info_result_hash , GUINT_TO_POINTER ( pinfo - > fd - > num ) ) ;
2011-04-16 10:56:18 +00:00
if ( result ! = NULL ) {
return result - > ues_in_tti ;
}
2011-04-15 23:32:44 +00:00
2011-04-11 21:33:33 +00:00
/* Set tti_info based upon direction */
if ( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) {
tti_info = & UL_tti_info ;
}
else {
tti_info = & DL_tti_info ;
}
2011-04-15 23:32:44 +00:00
/* Work out if we are still in the same tti as before */
if ( tti_info - > subframe = = p_mac_lte_info - > subframeNumber ) {
gint seconds_between_packets = ( gint )
( pinfo - > fd - > abs_ts . secs - tti_info - > ttiStartTime . secs ) ;
gint nseconds_between_packets =
pinfo - > fd - > abs_ts . nsecs - tti_info - > ttiStartTime . nsecs ;
2011-04-20 10:23:41 +00:00
/* Round difference to nearest microsecond */
2011-04-15 23:32:44 +00:00
gint total_us_gap = ( seconds_between_packets * 1000000 ) +
( ( nseconds_between_packets + 500 ) / 1000 ) ;
if ( total_us_gap < 1000 ) {
same_tti = TRUE ;
}
}
/* Update global state */
if ( ! same_tti ) {
tti_info - > subframe = p_mac_lte_info - > subframeNumber ;
tti_info - > ttiStartTime = pinfo - > fd - > abs_ts ;
tti_info - > ues_in_tti = 1 ;
}
else {
tti_info - > ues_in_tti + + ;
}
/* Set result state for this frame */
2013-08-30 14:49:55 +00:00
result = wmem_new ( wmem_file_scope ( ) , TTIInfoResult_t ) ;
2011-04-15 23:32:44 +00:00
result - > ues_in_tti = tti_info - > ues_in_tti ;
g_hash_table_insert ( mac_lte_tti_info_result_hash ,
GUINT_TO_POINTER ( pinfo - > fd - > num ) , result ) ;
2011-04-16 10:56:18 +00:00
return tti_info - > ues_in_tti ;
2011-04-11 21:33:33 +00:00
}
2009-11-25 16:00:58 +00:00
2011-04-16 10:56:18 +00:00
/* Show which UE this is (within direction) for this TTI */
2011-04-15 23:32:44 +00:00
static void show_ues_tti ( packet_info * pinfo , mac_lte_info * p_mac_lte_info , tvbuff_t * tvb , proto_tree * context_tree )
{
/* Look up result */
2013-03-08 06:06:56 +00:00
TTIInfoResult_t * result = ( TTIInfoResult_t * ) g_hash_table_lookup ( mac_lte_tti_info_result_hash , GUINT_TO_POINTER ( pinfo - > fd - > num ) ) ;
2011-04-15 23:32:44 +00:00
if ( result ! = NULL ) {
proto_item * ti = proto_tree_add_uint ( context_tree ,
( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) ?
hf_mac_lte_ues_ul_per_tti :
hf_mac_lte_ues_dl_per_tti ,
tvb , 0 , 0 , result - > ues_in_tti ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
}
2009-11-25 16:00:58 +00:00
2011-04-17 11:22:03 +00:00
/* Lookup channel details for lcid */
2012-10-12 03:00:38 +00:00
static void lookup_rlc_channel_from_lcid ( guint16 ueid ,
guint8 lcid ,
2011-04-17 11:22:03 +00:00
rlc_channel_type_t * rlc_channel_type ,
guint8 * UM_seqnum_length ,
gint * drb_id )
{
/* Zero params (in case no match is found) */
* rlc_channel_type = rlcRaw ;
* UM_seqnum_length = 0 ;
2012-03-16 02:00:29 +00:00
* drb_id = 0 ;
2011-04-17 11:22:03 +00:00
if ( global_mac_lte_lcid_drb_source = = ( int ) FromStaticTable ) {
/* Look up in static (UAT) table */
guint m ;
for ( m = 0 ; m < num_lcid_drb_mappings ; m + + ) {
if ( lcid = = lcid_drb_mappings [ m ] . lcid ) {
* rlc_channel_type = lcid_drb_mappings [ m ] . channel_type ;
/* Set UM_seqnum_length */
switch ( * rlc_channel_type ) {
case rlcUM5 :
* UM_seqnum_length = 5 ;
break ;
case rlcUM10 :
* UM_seqnum_length = 10 ;
break ;
default :
break ;
}
/* Set drb_id */
* drb_id = lcid_drb_mappings [ m ] . drbid ;
break ;
}
}
}
else {
2012-10-12 03:00:38 +00:00
/* Look up the mappings for this UE */
2013-03-08 06:06:56 +00:00
ue_dynamic_drb_mappings_t * ue_mappings = ( ue_dynamic_drb_mappings_t * ) g_hash_table_lookup ( mac_lte_ue_channels_hash , GUINT_TO_POINTER ( ( guint ) ueid ) ) ;
2012-10-12 03:00:38 +00:00
if ( ! ue_mappings ) {
return ;
}
2011-04-17 11:22:03 +00:00
/* Look up setting gleaned from configuration protocol */
2012-10-12 03:00:38 +00:00
if ( ! ue_mappings - > mapping [ lcid ] . valid ) {
2011-04-17 11:22:03 +00:00
return ;
}
2012-10-12 03:00:38 +00:00
* rlc_channel_type = ue_mappings - > mapping [ lcid ] . channel_type ;
2011-04-17 11:22:03 +00:00
/* Set UM_seqnum_length */
switch ( * rlc_channel_type ) {
case rlcUM5 :
* UM_seqnum_length = 5 ;
break ;
case rlcUM10 :
* UM_seqnum_length = 10 ;
break ;
default :
break ;
}
/* Set drb_id */
2012-10-12 03:00:38 +00:00
* drb_id = ue_mappings - > mapping [ lcid ] . drbid ;
2011-04-17 11:22:03 +00:00
}
}
2009-11-25 16:00:58 +00:00
# define MAX_HEADERS_IN_PDU 1024
/* UL-SCH and DL-SCH formats have much in common, so handle them in a common
function */
static void dissect_ulsch_or_dlsch ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree ,
proto_item * pdu_ti ,
2010-07-20 08:27:34 +00:00
volatile guint32 offset , guint8 direction ,
2009-11-25 16:00:58 +00:00
mac_lte_info * p_mac_lte_info , mac_lte_tap_info * tap_info ,
2010-07-05 10:35:17 +00:00
proto_item * retx_ti ,
2013-12-11 11:03:29 +00:00
proto_tree * context_tree ,
guint pdu_instance )
2009-11-25 16:00:58 +00:00
{
2012-03-16 02:00:29 +00:00
guint8 extension ;
volatile guint16 n ;
2011-12-22 18:05:48 +00:00
proto_item * truncated_ti ;
proto_item * padding_length_ti ;
proto_item * hidden_root_ti ;
2009-11-25 16:00:58 +00:00
/* Keep track of LCIDs and lengths as we dissect the header */
2011-12-22 18:05:48 +00:00
volatile guint16 number_of_headers = 0 ;
2012-03-16 02:00:29 +00:00
guint8 lcids [ MAX_HEADERS_IN_PDU ] ;
gint16 pdu_lengths [ MAX_HEADERS_IN_PDU ] ;
2009-11-25 16:00:58 +00:00
proto_item * pdu_header_ti ;
proto_tree * pdu_header_tree ;
gboolean have_seen_data_header = FALSE ;
2011-06-06 16:07:09 +00:00
guint8 number_of_padding_subheaders = 0 ;
2011-05-23 16:11:32 +00:00
gboolean have_seen_non_padding_control = FALSE ;
2009-11-25 16:00:58 +00:00
gboolean have_seen_bsr = FALSE ;
gboolean expecting_body_data = FALSE ;
volatile guint32 is_truncated = FALSE ;
2011-04-15 23:32:44 +00:00
/* Maintain/show UEs/TTI count */
2011-04-16 10:56:18 +00:00
tap_info - > ueInTTI = count_ues_tti ( p_mac_lte_info , pinfo ) ;
2011-04-15 23:32:44 +00:00
show_ues_tti ( pinfo , p_mac_lte_info , tvb , context_tree ) ;
2011-04-11 21:33:33 +00:00
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
2013-12-19 21:40:38 +00:00
" %s: (SFN=%-4u, SF=%u) UEId=%-3u " ,
2010-03-09 01:41:36 +00:00
( direction = = DIRECTION_UPLINK ) ? " UL-SCH " : " DL-SCH " ,
2013-12-19 21:40:38 +00:00
p_mac_lte_info - > sysframeNumber ,
2010-03-09 01:41:36 +00:00
p_mac_lte_info - > subframeNumber ,
p_mac_lte_info - > ueid ) ;
2009-11-25 16:00:58 +00:00
2009-12-29 22:55:39 +00:00
tap_info - > raw_length = p_mac_lte_info - > length ;
2009-11-25 16:00:58 +00:00
2013-09-23 17:34:18 +00:00
/******************************************************/
/* DRX information */
/* Update DRX state of UE */
2013-10-09 22:10:15 +00:00
if ( global_mac_lte_show_drx ) {
2013-12-12 19:20:30 +00:00
if ( ! pinfo - > fd - > flags . visited ) {
2013-10-03 15:04:39 +00:00
2013-10-09 22:10:15 +00:00
/* Update UE state to this subframe (but before this event is processed) */
update_drx_info ( pinfo , p_mac_lte_info ) ;
2013-10-03 15:04:39 +00:00
2013-10-09 22:10:15 +00:00
/* Store 'before' snapshot of UE state for this frame */
2013-12-11 11:03:29 +00:00
set_drx_info ( pinfo , p_mac_lte_info , TRUE , pdu_instance ) ;
2013-10-21 21:20:39 +00:00
}
2013-10-13 19:56:52 +00:00
2013-10-21 21:20:39 +00:00
/* Show current DRX state in tree as 'before' */
2013-12-11 11:03:29 +00:00
show_drx_info ( pinfo , tree , tvb , p_mac_lte_info , TRUE , pdu_instance ) ;
2013-10-21 21:20:39 +00:00
/* Changes of state caused by events */
if ( ! pinfo - > fd - > flags . visited ) {
2013-12-22 21:16:31 +00:00
if ( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) {
if ( p_mac_lte_info - > reTxCount = = 0 ) {
mac_lte_drx_new_ulsch_data ( p_mac_lte_info - > ueid ) ;
}
2013-09-23 17:34:18 +00:00
}
else {
2013-10-09 22:10:15 +00:00
/* Downlink */
2013-12-22 21:16:31 +00:00
if ( ( p_mac_lte_info - > crcStatusValid ) & & ( p_mac_lte_info - > crcStatus ! = crc_success ) ) {
2013-10-09 22:10:15 +00:00
mac_lte_drx_dl_crc_error ( p_mac_lte_info - > ueid ) ;
}
2013-10-21 21:20:39 +00:00
else if ( p_mac_lte_info - > reTxCount = = 0 ) {
2013-10-09 22:10:15 +00:00
mac_lte_drx_new_dlsch_data ( p_mac_lte_info - > ueid ) ;
}
2013-09-23 17:34:18 +00:00
}
2013-10-03 15:04:39 +00:00
}
2013-08-30 04:08:57 +00:00
}
2013-10-09 22:10:15 +00:00
2009-11-25 16:00:58 +00:00
/* For uplink frames, if this is logged as a resend, look for original tx */
2011-04-17 21:43:20 +00:00
if ( direction = = DIRECTION_UPLINK ) {
2009-11-25 16:00:58 +00:00
TrackReportedULHARQResend ( pinfo , tvb , offset , tree , p_mac_lte_info , retx_ti ) ;
}
2010-12-26 23:40:22 +00:00
/* For uplink grants, update SR status. N.B. only newTx grant should stop SR */
if ( ( direction = = DIRECTION_UPLINK ) & & ( p_mac_lte_info - > reTxCount = = 0 ) & &
global_mac_lte_track_sr ) {
2011-05-11 11:10:30 +00:00
TrackSRInfo ( SR_Grant , pinfo , tree , tvb , p_mac_lte_info , 0 , NULL ) ;
2009-12-02 17:46:27 +00:00
}
2009-10-13 13:36:58 +00:00
2010-03-03 11:57:21 +00:00
/* Add hidden item to filter on */
hidden_root_ti = proto_tree_add_string_format ( tree ,
( direction = = DIRECTION_UPLINK ) ?
hf_mac_lte_ulsch :
hf_mac_lte_dlsch ,
tvb , offset , 0 ,
" " ,
" Hidden header " ) ;
PROTO_ITEM_SET_HIDDEN ( hidden_root_ti ) ;
2008-12-23 21:00:04 +00:00
/* Add PDU block header subtree */
pdu_header_ti = proto_tree_add_string_format ( tree ,
( direction = = DIRECTION_UPLINK ) ?
hf_mac_lte_ulsch_header :
hf_mac_lte_dlsch_header ,
tvb , offset , 0 ,
" " ,
" MAC PDU Header " ) ;
pdu_header_tree = proto_item_add_subtree ( pdu_header_ti ,
( direction = = DIRECTION_UPLINK ) ?
ett_mac_lte_ulsch_header :
ett_mac_lte_dlsch_header ) ;
/************************************************************************/
/* Dissect each sub-header. */
do {
guint8 reserved ;
guint64 length = 0 ;
proto_item * pdu_subheader_ti ;
proto_tree * pdu_subheader_tree ;
proto_item * lcid_ti ;
proto_item * ti ;
gint offset_start_subheader = offset ;
guint8 first_byte = tvb_get_guint8 ( tvb , offset ) ;
2011-05-19 01:03:56 +00:00
/* Add PDU block header subtree.
Default with length of 1 byte . */
2008-12-23 21:00:04 +00:00
pdu_subheader_ti = proto_tree_add_string_format ( pdu_header_tree ,
hf_mac_lte_sch_subheader ,
2011-05-19 01:03:56 +00:00
tvb , offset , 1 ,
2008-12-23 21:00:04 +00:00
" " ,
" Sub-header " ) ;
pdu_subheader_tree = proto_item_add_subtree ( pdu_subheader_ti ,
ett_mac_lte_sch_subheader ) ;
/* Check 1st 2 reserved bits */
reserved = ( first_byte & 0xc0 ) > > 6 ;
ti = proto_tree_add_item ( pdu_subheader_tree , hf_mac_lte_sch_reserved ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-11-29 22:45:06 +00:00
if ( reserved ! = 0 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_reserved_not_zero ,
2010-06-10 15:28:41 +00:00
" %cL-SCH header Reserved bits not zero " ,
( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) ? ' U ' : ' D ' ) ;
2008-12-23 21:00:04 +00:00
}
/* Extended bit */
extension = ( first_byte & 0x20 ) > > 5 ;
proto_tree_add_item ( pdu_subheader_tree , hf_mac_lte_sch_extended ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2008-12-23 21:00:04 +00:00
/* LCID. Has different meaning depending upon direction. */
lcids [ number_of_headers ] = first_byte & 0x1f ;
if ( direction = = DIRECTION_UPLINK ) {
2011-05-19 01:03:56 +00:00
2008-12-23 21:00:04 +00:00
lcid_ti = proto_tree_add_item ( pdu_subheader_tree , hf_mac_lte_ulsch_lcid ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
" (%s " ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( lcids [ number_of_headers ] ,
ulsch_lcid_vals , " (Unknown LCID) " ) ) ;
2008-12-23 21:00:04 +00:00
}
else {
2011-05-19 01:03:56 +00:00
/* Downlink */
2008-12-23 21:00:04 +00:00
lcid_ti = proto_tree_add_item ( pdu_subheader_tree , hf_mac_lte_dlsch_lcid ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
" (%s " ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( lcids [ number_of_headers ] ,
dlsch_lcid_vals , " (Unknown LCID) " ) ) ;
2011-05-19 01:03:56 +00:00
2011-01-17 15:01:22 +00:00
if ( lcids [ number_of_headers ] = = DRX_COMMAND_LCID ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , lcid_ti , & ei_mac_lte_dlsch_lcid ,
2011-01-17 15:01:22 +00:00
" DRX command received for UE %u (RNTI %u) " ,
p_mac_lte_info - > ueid , p_mac_lte_info - > rnti ) ;
}
2008-12-23 21:00:04 +00:00
}
offset + + ;
/* Remember if we've seen a data subheader */
if ( lcids [ number_of_headers ] < = 10 ) {
have_seen_data_header = TRUE ;
2009-06-04 15:08:56 +00:00
expecting_body_data = TRUE ;
2008-12-23 21:00:04 +00:00
}
/* Show an expert item if a contol subheader (except Padding) appears
* after * a data PDU */
if ( have_seen_data_header & &
( lcids [ number_of_headers ] > 10 ) & & ( lcids [ number_of_headers ] ! = PADDING_LCID ) ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , lcid_ti , & ei_mac_lte_control_subheader_after_data_subheader ,
2010-06-10 15:28:41 +00:00
" %cL-SCH Control subheaders should not appear after data subheaders " ,
( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) ? ' U ' : ' D ' ) ;
2010-07-19 14:14:47 +00:00
return ;
2008-12-23 21:00:04 +00:00
}
2009-02-21 21:22:41 +00:00
/* Show an expert item if we're seeing more then one BSR in a frame */
if ( ( direction = = DIRECTION_UPLINK ) & & is_bsr_lcid ( lcids [ number_of_headers ] ) ) {
if ( have_seen_bsr ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , lcid_ti , & ei_mac_lte_control_bsr_multiple ) ;
2010-07-19 14:14:47 +00:00
return ;
2009-02-21 21:22:41 +00:00
}
have_seen_bsr = TRUE ;
}
2008-12-23 21:00:04 +00:00
2011-05-23 16:11:32 +00:00
/* Should not see padding after non-padding control... */
if ( ( lcids [ number_of_headers ] > 10 ) & &
( lcids [ number_of_headers ] = = PADDING_LCID ) & &
2011-06-06 16:07:09 +00:00
extension )
{
number_of_padding_subheaders + + ;
if ( number_of_padding_subheaders > 2 ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , lcid_ti , & ei_mac_lte_padding_data_multiple ) ;
2011-06-06 16:07:09 +00:00
}
if ( have_seen_non_padding_control ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , lcid_ti , & ei_mac_lte_padding_data_before_control_subheader ) ;
2011-06-06 16:07:09 +00:00
}
2011-05-23 16:11:32 +00:00
}
2013-04-25 21:07:32 +00:00
/* Also flag if we have final padding but also padding subheaders
at the start ! */
if ( ! extension & & ( lcids [ number_of_headers ] = = PADDING_LCID ) & &
( number_of_padding_subheaders > 0 ) ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , lcid_ti , & ei_mac_lte_padding_data_start_and_end ) ;
2013-04-25 21:07:32 +00:00
}
2011-05-23 16:11:32 +00:00
/* Remember that we've seen non-padding control */
if ( ( lcids [ number_of_headers ] > 10 ) & &
( lcids [ number_of_headers ] ! = PADDING_LCID ) ) {
have_seen_non_padding_control = TRUE ;
}
2009-04-20 16:46:46 +00:00
2008-12-23 21:00:04 +00:00
/********************************************************************/
/* Length field follows if not the last header or for a fixed-sized
control element */
if ( ! extension ) {
2011-05-19 01:03:56 +00:00
/* Last one... */
2008-12-23 21:00:04 +00:00
if ( is_fixed_sized_control_element ( lcids [ number_of_headers ] , direction ) ) {
pdu_lengths [ number_of_headers ] = 0 ;
}
else {
pdu_lengths [ number_of_headers ] = - 1 ;
}
}
else {
2011-05-19 01:03:56 +00:00
/* Not the last one */
2008-12-23 21:00:04 +00:00
if ( ! is_fixed_sized_control_element ( lcids [ number_of_headers ] , direction ) & &
( lcids [ number_of_headers ] ! = PADDING_LCID ) ) {
guint8 format ;
/* F(ormat) bit tells us how long the length field is */
format = ( tvb_get_guint8 ( tvb , offset ) & 0x80 ) > > 7 ;
proto_tree_add_item ( pdu_subheader_tree , hf_mac_lte_sch_format ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2008-12-23 21:00:04 +00:00
/* Now read length field itself */
if ( format ) {
/* >= 128 - use 15 bits */
proto_tree_add_bits_ret_val ( pdu_subheader_tree , hf_mac_lte_sch_length ,
2011-10-24 19:57:53 +00:00
tvb , offset * 8 + 1 , 15 , & length , ENC_BIG_ENDIAN ) ;
2008-12-23 21:00:04 +00:00
offset + = 2 ;
}
else {
/* Less than 128 - only 7 bits */
proto_tree_add_bits_ret_val ( pdu_subheader_tree , hf_mac_lte_sch_length ,
2011-10-24 19:57:53 +00:00
tvb , offset * 8 + 1 , 7 , & length , ENC_BIG_ENDIAN ) ;
2008-12-23 21:00:04 +00:00
offset + + ;
}
2008-12-23 21:51:52 +00:00
pdu_lengths [ number_of_headers ] = ( gint16 ) length ;
2008-12-23 21:00:04 +00:00
}
else {
pdu_lengths [ number_of_headers ] = 0 ;
}
}
/* Close off description in info column */
2009-07-13 11:23:40 +00:00
switch ( pdu_lengths [ number_of_headers ] ) {
case 0 :
2012-11-29 22:25:18 +00:00
write_pdu_label_and_info_literal ( pdu_ti , NULL , pinfo , " ) " ) ;
2009-07-13 11:23:40 +00:00
break ;
case - 1 :
2012-11-29 22:25:18 +00:00
write_pdu_label_and_info_literal ( pdu_ti , NULL , pinfo , " :remainder) " ) ;
2009-07-13 11:23:40 +00:00
break ;
default :
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo , " :%u bytes) " ,
pdu_lengths [ number_of_headers ] ) ;
2009-07-13 11:23:40 +00:00
break ;
2008-12-23 21:00:04 +00:00
}
/* Append summary to subheader root */
proto_item_append_text ( pdu_subheader_ti , " (lcid=%s " ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( lcids [ number_of_headers ] ,
( direction = = DIRECTION_UPLINK ) ?
ulsch_lcid_vals :
dlsch_lcid_vals ,
" Unknown " ) ) ;
2008-12-23 21:00:04 +00:00
switch ( pdu_lengths [ number_of_headers ] ) {
case - 1 :
2012-09-19 16:56:59 +00:00
proto_item_append_text ( pdu_subheader_ti , " , length is remainder) " ) ;
2011-02-11 00:29:40 +00:00
proto_item_append_text ( pdu_header_ti , " (%s:remainder) " ,
val_to_str_const ( lcids [ number_of_headers ] ,
( direction = = DIRECTION_UPLINK ) ? ulsch_lcid_vals : dlsch_lcid_vals ,
" Unknown " ) ) ;
2008-12-23 21:00:04 +00:00
break ;
case 0 :
2012-09-19 16:56:59 +00:00
proto_item_append_text ( pdu_subheader_ti , " ) " ) ;
2011-02-11 00:29:40 +00:00
proto_item_append_text ( pdu_header_ti , " (%s) " ,
val_to_str_const ( lcids [ number_of_headers ] ,
( direction = = DIRECTION_UPLINK ) ? ulsch_lcid_vals : dlsch_lcid_vals ,
" Unknown " ) ) ;
2008-12-23 21:00:04 +00:00
break ;
default :
proto_item_append_text ( pdu_subheader_ti , " , length=%u) " ,
pdu_lengths [ number_of_headers ] ) ;
2011-10-21 02:10:19 +00:00
proto_item_append_text ( pdu_header_ti , " (%s:%u) " ,
2011-02-11 00:29:40 +00:00
val_to_str_const ( lcids [ number_of_headers ] ,
( direction = = DIRECTION_UPLINK ) ? ulsch_lcid_vals : dlsch_lcid_vals ,
" Unknown " ) ,
pdu_lengths [ number_of_headers ] ) ;
2008-12-23 21:00:04 +00:00
break ;
}
/* Flag unknown lcid values in expert info */
2013-03-29 00:26:23 +00:00
if ( try_val_to_str ( lcids [ number_of_headers ] ,
2010-03-14 17:56:37 +00:00
( direction = = DIRECTION_UPLINK ) ? ulsch_lcid_vals : dlsch_lcid_vals ) = = NULL ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , pdu_subheader_ti , & ei_mac_lte_lcid_unexpected ,
2010-06-10 15:28:41 +00:00
" %cL-SCH: Unexpected LCID received (%u) " ,
( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) ? ' U ' : ' D ' ,
lcids [ number_of_headers ] ) ;
2008-12-23 21:00:04 +00:00
}
/* Set length of this subheader */
2011-05-19 01:03:56 +00:00
proto_item_set_len ( pdu_subheader_ti , offset - offset_start_subheader ) ;
2008-12-23 21:00:04 +00:00
number_of_headers + + ;
2012-01-26 15:19:32 +00:00
} while ( ( number_of_headers < MAX_HEADERS_IN_PDU ) & & extension ) ;
/* Check that we didn't reach the end of the subheader array... */
2012-01-26 19:25:08 +00:00
if ( number_of_headers > = MAX_HEADERS_IN_PDU ) {
2013-09-05 01:05:16 +00:00
proto_tree_add_expert_format ( tree , pinfo , & ei_mac_lte_too_many_subheaders , tvb , offset , 1 ,
2012-01-26 15:19:32 +00:00
" Reached %u subheaders - frame obviously malformed " ,
MAX_HEADERS_IN_PDU ) ;
return ;
}
2008-12-23 21:00:04 +00:00
/* Append summary to overall PDU header root */
2012-03-08 13:20:33 +00:00
proto_item_append_text ( pdu_header_ti , " [%u subheaders] " ,
2008-12-23 21:00:04 +00:00
number_of_headers ) ;
/* And set its length to offset */
proto_item_set_len ( pdu_header_ti , offset ) ;
2012-01-22 02:52:50 +00:00
/* For DL, see if this is a retx. Use whole PDU present (i.e. ignore padding if not logged) */
if ( direction = = DIRECTION_DOWNLINK ) {
/* Result will be added to context tree */
TrackReportedDLHARQResend ( pinfo , tvb , tvb_length_remaining ( tvb , 0 ) , context_tree , p_mac_lte_info ) ;
tap_info - > isPHYRetx = ( p_mac_lte_info - > dl_retx = = dl_retx_yes ) ;
}
2009-06-04 15:08:56 +00:00
2009-09-10 18:12:41 +00:00
/************************************************************************/
/* Dissect SDUs / control elements / padding. */
/************************************************************************/
/* Dissect control element bodies first */
for ( n = 0 ; n < number_of_headers ; n + + ) {
/* Get out of loop once see any data SDU subheaders */
if ( lcids [ n ] < = 10 ) {
2013-07-06 21:07:42 +00:00
/* Update tap sdu count for this channel */
tap_info - > sdus_for_lcid [ lcids [ n ] ] + + ;
2009-09-10 18:12:41 +00:00
break ;
}
/* Process what should be a valid control PDU type */
if ( direction = = DIRECTION_DOWNLINK ) {
/****************************/
/* DL-SCH Control PDUs */
switch ( lcids [ n ] ) {
2012-04-25 20:02:12 +00:00
case ACTIVATION_DEACTIVATION_LCID :
{
proto_item * ad_ti ;
proto_tree * ad_tree ;
proto_item * ti ;
guint8 reserved ;
/* Create AD root */
ad_ti = proto_tree_add_string_format ( tree ,
hf_mac_lte_control_activation_deactivation ,
tvb , offset , 1 ,
" " ,
" Activation/Deactivation " ) ;
ad_tree = proto_item_add_subtree ( ad_ti , ett_mac_lte_activation_deactivation ) ;
proto_tree_add_item ( ad_tree , hf_mac_lte_control_activation_deactivation_c7 ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ad_tree , hf_mac_lte_control_activation_deactivation_c6 ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ad_tree , hf_mac_lte_control_activation_deactivation_c5 ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ad_tree , hf_mac_lte_control_activation_deactivation_c4 ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ad_tree , hf_mac_lte_control_activation_deactivation_c3 ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ad_tree , hf_mac_lte_control_activation_deactivation_c2 ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ad_tree , hf_mac_lte_control_activation_deactivation_c1 ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
ti = proto_tree_add_item ( ad_tree , hf_mac_lte_control_activation_deactivation_reserved ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
reserved = tvb_get_guint8 ( tvb , offset ) & 0x01 ;
if ( reserved ! = 0 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_reserved_not_zero ,
2012-04-25 20:02:12 +00:00
" Activation/Deactivation Reserved bit not zero " ) ;
}
offset + + ;
}
break ;
2009-09-10 18:12:41 +00:00
case UE_CONTENTION_RESOLUTION_IDENTITY_LCID :
{
proto_item * cr_ti ;
proto_tree * cr_tree ;
proto_item * ti ;
ContentionResolutionResult * crResult ;
/* Create CR root */
cr_ti = proto_tree_add_string_format ( tree ,
hf_mac_lte_control_ue_contention_resolution ,
tvb , offset , 6 ,
" " ,
" Contention Resolution " ) ;
cr_tree = proto_item_add_subtree ( cr_ti , ett_mac_lte_contention_resolution ) ;
2013-06-18 23:36:35 +00:00
/* Contention resolution body */
2009-09-10 18:12:41 +00:00
proto_tree_add_item ( cr_tree , hf_mac_lte_control_ue_contention_resolution_identity ,
2011-10-04 22:44:31 +00:00
tvb , offset , 6 , ENC_NA ) ;
2013-06-18 23:36:35 +00:00
if ( global_mac_lte_decode_cr_body ) {
tvbuff_t * cr_body_tvb = tvb_new_subset ( tvb , offset , 6 , 6 ) ;
dissector_handle_t ul_ccch_handle = find_dissector ( " lte_rrc.ul_ccch " ) ;
if ( ul_ccch_handle ! = 0 ) {
call_with_catch_all ( ul_ccch_handle , cr_body_tvb , pinfo , cr_tree ) ;
}
}
2009-09-10 18:12:41 +00:00
/* Get pointer to result struct for this frame */
2013-03-08 06:06:56 +00:00
crResult = ( ContentionResolutionResult * ) g_hash_table_lookup ( mac_lte_cr_result_hash , GUINT_TO_POINTER ( pinfo - > fd - > num ) ) ;
2009-09-10 18:12:41 +00:00
if ( crResult = = NULL ) {
/* Need to set result by looking for and comparing with Msg3 */
Msg3Data * msg3Data ;
guint msg3Key = p_mac_lte_info - > rnti ;
/* Allocate result and add it to the table */
2013-08-30 14:49:55 +00:00
crResult = wmem_new ( wmem_file_scope ( ) , ContentionResolutionResult ) ;
2009-09-10 18:12:41 +00:00
g_hash_table_insert ( mac_lte_cr_result_hash , GUINT_TO_POINTER ( pinfo - > fd - > num ) , crResult ) ;
/* Look for Msg3 */
2013-03-08 06:06:56 +00:00
msg3Data = ( Msg3Data * ) g_hash_table_lookup ( mac_lte_msg3_hash , GUINT_TO_POINTER ( msg3Key ) ) ;
2009-09-10 18:12:41 +00:00
/* Compare CCCH bytes */
if ( msg3Data ! = NULL ) {
2010-02-23 22:28:42 +00:00
crResult - > msSinceMsg3 = ( guint32 ) ( ( ( pinfo - > fd - > abs_ts . secs - msg3Data - > msg3Time . secs ) * 1000 ) +
( ( pinfo - > fd - > abs_ts . nsecs - msg3Data - > msg3Time . nsecs ) / 1000000 ) ) ;
2009-09-10 18:12:41 +00:00
crResult - > msg3FrameNum = msg3Data - > framenum ;
2010-02-23 22:28:42 +00:00
/* Compare the 6 bytes */
2011-01-17 15:01:22 +00:00
if ( tvb_memeql ( tvb , offset , msg3Data - > data , 6 ) = = 0 ) {
2009-09-10 18:12:41 +00:00
crResult - > status = Msg3Match ;
}
else {
crResult - > status = Msg3NoMatch ;
}
}
else {
crResult - > status = NoMsg3 ;
}
}
/* Now show CR result in tree */
switch ( crResult - > status ) {
case NoMsg3 :
2012-09-19 16:56:59 +00:00
proto_item_append_text ( cr_ti , " (no corresponding Msg3 found!) " ) ;
2009-09-10 18:12:41 +00:00
break ;
case Msg3Match :
ti = proto_tree_add_uint ( cr_tree , hf_mac_lte_control_ue_contention_resolution_msg3 ,
tvb , 0 , 0 , crResult - > msg3FrameNum ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-02-23 22:28:42 +00:00
ti = proto_tree_add_uint ( cr_tree , hf_mac_lte_control_ue_contention_resolution_time_since_msg3 ,
tvb , 0 , 0 , crResult - > msSinceMsg3 ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-09-10 18:12:41 +00:00
ti = proto_tree_add_boolean ( cr_tree , hf_mac_lte_control_ue_contention_resolution_msg3_matched ,
tvb , 0 , 0 , TRUE ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-02-23 22:28:42 +00:00
proto_item_append_text ( cr_ti , " (matches Msg3 from frame %u, %ums ago) " ,
crResult - > msg3FrameNum , crResult - > msSinceMsg3 ) ;
2009-09-10 18:12:41 +00:00
break ;
case Msg3NoMatch :
ti = proto_tree_add_uint ( cr_tree , hf_mac_lte_control_ue_contention_resolution_msg3 ,
tvb , 0 , 0 , crResult - > msg3FrameNum ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-02-23 22:28:42 +00:00
ti = proto_tree_add_uint ( cr_tree , hf_mac_lte_control_ue_contention_resolution_time_since_msg3 ,
tvb , 0 , 0 , crResult - > msSinceMsg3 ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-09-10 18:12:41 +00:00
ti = proto_tree_add_boolean ( cr_tree , hf_mac_lte_control_ue_contention_resolution_msg3_matched ,
tvb , 0 , 0 , FALSE ) ;
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_control_ue_contention_resolution_msg3_matched ,
2009-09-10 18:12:41 +00:00
" CR body in Msg4 doesn't match Msg3 CCCH in frame %u " ,
crResult - > msg3FrameNum ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-02-23 22:28:42 +00:00
proto_item_append_text ( cr_ti , " (doesn't match Msg3 from frame %u, %u ago) " ,
crResult - > msg3FrameNum , crResult - > msSinceMsg3 ) ;
2009-09-10 18:12:41 +00:00
break ;
} ;
offset + = 6 ;
}
break ;
case TIMING_ADVANCE_LCID :
{
2009-09-18 16:27:02 +00:00
proto_item * ta_ti ;
2012-09-21 20:11:11 +00:00
proto_item * ta_value_ti ;
proto_tree * ta_tree ;
2009-09-18 16:27:02 +00:00
guint8 ta_value ;
2009-09-10 18:12:41 +00:00
2012-09-21 20:11:11 +00:00
/* Create TA root */
ta_ti = proto_tree_add_string_format ( tree ,
hf_mac_lte_control_timing_advance ,
tvb , offset , 1 ,
" " ,
" Timing Advance " ) ;
ta_tree = proto_item_add_subtree ( ta_ti , ett_mac_lte_timing_advance ) ;
/* TAG Id */
proto_tree_add_item ( ta_tree , hf_mac_lte_control_timing_advance_group_id ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-10-22 10:31:13 +00:00
/* TA value */
2009-09-18 16:27:02 +00:00
ta_value = tvb_get_guint8 ( tvb , offset ) & 0x3f ;
2012-09-21 20:11:11 +00:00
ta_value_ti = proto_tree_add_item ( ta_tree , hf_mac_lte_control_timing_advance_command ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2010-04-22 17:46:12 +00:00
if ( ta_value = = 31 ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , ta_value_ti , & ei_mac_lte_control_timing_advance_command_no_correction ) ;
2010-04-22 17:46:12 +00:00
}
else {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ta_value_ti , & ei_mac_lte_control_timing_advance_command_correction_needed ,
2010-04-22 17:46:12 +00:00
" Timing Advance control element received (%u) %s correction needed " ,
ta_value ,
( ta_value < 31 ) ? " -ve " : " +ve " ) ;
2010-04-22 13:54:30 +00:00
}
2009-09-10 18:12:41 +00:00
offset + + ;
}
break ;
case DRX_COMMAND_LCID :
/* No payload */
2013-10-01 16:19:42 +00:00
mac_lte_drx_control_element_received ( p_mac_lte_info - > ueid ) ;
2009-09-10 18:12:41 +00:00
break ;
case PADDING_LCID :
/* No payload (in this position) */
2009-12-29 22:55:39 +00:00
tap_info - > padding_bytes + + ;
2009-09-10 18:12:41 +00:00
break ;
default :
break ;
}
}
else {
/**********************************/
/* UL-SCH Control PDUs */
switch ( lcids [ n ] ) {
2012-04-25 20:02:12 +00:00
case EXTENDED_POWER_HEADROOM_REPORT_LCID :
{
proto_item * ephr_ti ;
proto_tree * ephr_tree ;
proto_item * ti ;
proto_tree * ephr_cell_tree ;
proto_item * ephr_cell_ti ;
guint8 scell_bitmap ;
guint8 scell_count ;
guint8 byte ;
guint i ;
guint32 curr_offset = offset ;
guint32 computed_header_offset ;
if ( pdu_lengths [ n ] = = - 1 ) {
/* Control Element size is the remaining PDU */
pdu_lengths [ n ] = ( gint16 ) tvb_length_remaining ( tvb , curr_offset ) ;
}
/* Create EPHR root */
ephr_ti = proto_tree_add_string_format ( tree ,
hf_mac_lte_control_ext_power_headroom ,
tvb , curr_offset , pdu_lengths [ n ] ,
" " ,
" Extended Power Headroom " ) ;
ephr_tree = proto_item_add_subtree ( ephr_ti , ett_mac_lte_extended_power_headroom ) ;
scell_bitmap = tvb_get_guint8 ( tvb , curr_offset ) ;
proto_tree_add_item ( ephr_tree , hf_mac_lte_control_ext_power_headroom_c7 ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_tree , hf_mac_lte_control_ext_power_headroom_c6 ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_tree , hf_mac_lte_control_ext_power_headroom_c5 ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_tree , hf_mac_lte_control_ext_power_headroom_c4 ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_tree , hf_mac_lte_control_ext_power_headroom_c3 ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_tree , hf_mac_lte_control_ext_power_headroom_c2 ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_tree , hf_mac_lte_control_ext_power_headroom_c1 ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
/* Check Reserved bit */
ti = proto_tree_add_item ( ephr_tree , hf_mac_lte_control_ext_power_headroom_reserved ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
if ( scell_bitmap & 0x01 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_reserved_not_zero ,
2012-04-25 20:02:12 +00:00
" Extended Power Headroom Reserved bit not zero " ) ;
}
curr_offset + + ;
/* Compute expected header size to deduce if PH Type 2 report is present or not */
/* First count the number of SCells */
for ( i = 0 , scell_count = 0 ; i < 7 ; i + + ) {
if ( scell_bitmap & ( 0x80 > > i ) ) {
scell_count + + ;
}
}
/* Now quickly parse the header */
computed_header_offset = curr_offset ;
for ( i = 0 ; i < scell_count ; i + + ) {
if ( tvb_get_guint8 ( tvb , computed_header_offset ) & 0x80 ) {
computed_header_offset + + ;
}
computed_header_offset + + ;
}
if ( ( gint16 ) ( computed_header_offset + 1 - curr_offset ) ! = pdu_lengths [ n ] ) {
/* PH Type 2 is present */
if ( tvb_get_guint8 ( tvb , computed_header_offset ) & 0x80 ) {
computed_header_offset + + ;
}
computed_header_offset + + ;
if ( ( gint16 ) ( computed_header_offset + 1 - curr_offset ) ! = pdu_lengths [ n ] ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ephr_ti , & ei_mac_lte_control_element_size_invalid ,
2012-04-25 20:02:12 +00:00
" Control Element has an unexpected size (computed=%d, actual=%d) " ,
computed_header_offset + 1 - curr_offset , pdu_lengths [ n ] ) ;
offset + = pdu_lengths [ n ] ;
break ;
}
byte = tvb_get_guint8 ( tvb , curr_offset ) ;
ephr_cell_ti = proto_tree_add_text ( ephr_tree , tvb , curr_offset , ( ( byte & 0x80 ) ? 2 : 1 ) , " PCell " ) ;
ephr_cell_tree = proto_item_add_subtree ( ephr_cell_ti , ett_mac_lte_extended_power_headroom_cell ) ;
proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_power_backoff ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_value ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_level ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_item_append_text ( ephr_cell_ti , " (%s) " ,
val_to_str_ext_const ( ( byte & 0x3f ) , & power_headroom_vals_ext , " Unknown " ) ) ;
curr_offset + + ;
if ( byte & 0x80 ) {
/* Pcmax,c field is present */
byte = tvb_get_guint8 ( tvb , curr_offset ) ;
/* Check 2 Reserved bits */
ti = proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_reserved2 ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
if ( byte & 0xc0 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_reserved_not_zero ,
2012-04-25 20:02:12 +00:00
" Extended Power Headroom Reserved bits not zero (found 0x%x) " ,
( byte & 0xc0 ) > > 6 ) ;
}
proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_pcmaxc ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_item_append_text ( ephr_cell_ti , " (%s) " ,
val_to_str_ext_const ( ( byte & 0x3f ) , & pcmaxc_vals_ext , " Unknown " ) ) ;
curr_offset + + ;
}
} else {
if ( ( gint16 ) ( computed_header_offset + 1 - curr_offset ) ! = pdu_lengths [ n ] ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ephr_ti , & ei_mac_lte_control_element_size_invalid ,
2012-04-25 20:02:12 +00:00
" Control Element has an unexpected size (computed=%d, actual=%d) " ,
computed_header_offset + 1 - curr_offset , pdu_lengths [ n ] ) ;
offset + = pdu_lengths [ n ] ;
break ;
}
}
for ( i = 1 , scell_bitmap > > = 1 ; i < = 7 ; i + + , scell_bitmap > > = 1 ) {
if ( scell_bitmap & 0x01 ) {
byte = tvb_get_guint8 ( tvb , curr_offset ) ;
ephr_cell_ti = proto_tree_add_text ( ephr_tree , tvb , curr_offset , ( ( byte & 0x80 ) ? 2 : 1 ) , " SCell Index %u " , i ) ;
ephr_cell_tree = proto_item_add_subtree ( ephr_cell_ti , ett_mac_lte_extended_power_headroom_cell ) ;
proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_power_backoff ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_value ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_level ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_item_append_text ( ephr_cell_ti , " (%s) " ,
val_to_str_ext_const ( ( byte & 0x3f ) , & power_headroom_vals_ext , " Unknown " ) ) ;
curr_offset + + ;
if ( byte & 0x80 ) {
/* Pcmax,c field is present */
byte = tvb_get_guint8 ( tvb , curr_offset ) ;
/* Check 2 Reserved bits */
ti = proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_reserved2 ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
if ( byte & 0xc0 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_reserved_not_zero ,
2012-04-25 20:02:12 +00:00
" Extended Power Headroom Reserved bits not zero (found 0x%x) " ,
( byte & 0xc0 ) > > 6 ) ;
}
proto_tree_add_item ( ephr_cell_tree , hf_mac_lte_control_ext_power_headroom_pcmaxc ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
proto_item_append_text ( ephr_cell_ti , " (%s) " ,
val_to_str_ext_const ( ( byte & 0x3f ) , & pcmaxc_vals_ext , " Unknown " ) ) ;
curr_offset + + ;
}
}
}
offset + = pdu_lengths [ n ] ;
}
break ;
2009-09-10 18:12:41 +00:00
case POWER_HEADROOM_REPORT_LCID :
{
proto_item * phr_ti ;
proto_tree * phr_tree ;
proto_item * ti ;
guint8 reserved ;
guint8 level ;
/* Create PHR root */
phr_ti = proto_tree_add_string_format ( tree ,
hf_mac_lte_control_power_headroom ,
tvb , offset , 1 ,
" " ,
" Power Headroom " ) ;
phr_tree = proto_item_add_subtree ( phr_ti , ett_mac_lte_power_headroom ) ;
/* Check 2 Reserved bits */
reserved = ( tvb_get_guint8 ( tvb , offset ) & 0xc0 ) > > 6 ;
ti = proto_tree_add_item ( phr_tree , hf_mac_lte_control_power_headroom_reserved ,
2011-10-16 23:38:49 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-11-29 22:45:06 +00:00
if ( reserved ! = 0 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_reserved_not_zero ,
2009-09-10 18:12:41 +00:00
" Power Headroom Reserved bits not zero (found 0x%x) " , reserved ) ;
}
/* Level */
level = tvb_get_guint8 ( tvb , offset ) & 0x3f ;
proto_tree_add_item ( phr_tree , hf_mac_lte_control_power_headroom_level ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-09-10 18:12:41 +00:00
/* Show value in root label */
2010-03-14 17:56:37 +00:00
proto_item_append_text ( phr_ti , " (%s) " ,
2012-04-25 20:02:12 +00:00
val_to_str_ext_const ( level , & power_headroom_vals_ext , " Unknown " ) ) ;
2009-09-10 18:12:41 +00:00
offset + + ;
}
break ;
case CRNTI_LCID :
proto_tree_add_item ( tree , hf_mac_lte_control_crnti ,
2011-10-06 03:35:44 +00:00
tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2009-09-10 18:12:41 +00:00
offset + = 2 ;
break ;
case TRUNCATED_BSR_LCID :
case SHORT_BSR_LCID :
{
proto_tree * bsr_tree ;
proto_item * bsr_ti ;
2009-11-18 13:47:08 +00:00
proto_item * buffer_size_ti ;
2009-09-10 18:12:41 +00:00
guint8 lcgid ;
guint8 buffer_size ;
2012-04-25 20:02:12 +00:00
int hfindex ;
value_string_ext * p_vs_ext ;
if ( p_mac_lte_info - > isExtendedBSRSizes ) {
hfindex = hf_mac_lte_control_short_ext_bsr_buffer_size ;
p_vs_ext = & ext_buffer_size_vals_ext ;
} else {
hfindex = hf_mac_lte_control_short_bsr_buffer_size ;
p_vs_ext = & buffer_size_vals_ext ;
}
2009-09-10 18:12:41 +00:00
bsr_ti = proto_tree_add_string_format ( tree ,
hf_mac_lte_control_bsr ,
tvb , offset , 1 ,
" " ,
2009-10-25 23:03:11 +00:00
" Short BSR " ) ;
2009-09-10 18:12:41 +00:00
bsr_tree = proto_item_add_subtree ( bsr_ti , ett_mac_lte_bsr ) ;
/* LCG ID */
lcgid = ( tvb_get_guint8 ( tvb , offset ) & 0xc0 ) > > 6 ;
proto_tree_add_item ( bsr_tree , hf_mac_lte_control_bsr_lcg_id ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-09-10 18:12:41 +00:00
/* Buffer Size */
buffer_size = tvb_get_guint8 ( tvb , offset ) & 0x3f ;
2012-04-25 20:02:12 +00:00
buffer_size_ti = proto_tree_add_item ( bsr_tree , hfindex ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-09-10 18:12:41 +00:00
offset + + ;
2009-11-18 13:47:08 +00:00
if ( buffer_size > = global_mac_lte_bsr_warn_threshold ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , buffer_size_ti , & ei_mac_lte_bsr_warn_threshold_exceeded ,
2009-11-18 13:47:08 +00:00
" UE %u - BSR for LCG %u exceeds threshold: %u (%s) " ,
p_mac_lte_info - > ueid ,
lcgid ,
2012-04-25 20:02:12 +00:00
buffer_size ,
val_to_str_ext_const ( buffer_size , p_vs_ext , " Unknown " ) ) ;
2009-11-18 13:47:08 +00:00
}
2009-09-10 18:12:41 +00:00
proto_item_append_text ( bsr_ti , " (lcgid=%u %s) " ,
lcgid ,
2012-04-18 16:55:06 +00:00
val_to_str_ext_const ( buffer_size , & buffer_size_vals_ext , " Unknown " ) ) ;
2009-09-10 18:12:41 +00:00
}
break ;
case LONG_BSR_LCID :
{
proto_tree * bsr_tree ;
proto_item * bsr_ti ;
2009-11-18 13:47:08 +00:00
proto_item * buffer_size_ti ;
2009-10-22 10:31:13 +00:00
guint8 buffer_size [ 4 ] ;
2012-04-25 20:02:12 +00:00
int hfindex [ 4 ] ;
value_string_ext * p_vs_ext ;
if ( p_mac_lte_info - > isExtendedBSRSizes ) {
hfindex [ 0 ] = hf_mac_lte_control_long_ext_bsr_buffer_size_0 ;
hfindex [ 1 ] = hf_mac_lte_control_long_ext_bsr_buffer_size_1 ;
hfindex [ 2 ] = hf_mac_lte_control_long_ext_bsr_buffer_size_2 ;
hfindex [ 3 ] = hf_mac_lte_control_long_ext_bsr_buffer_size_3 ;
p_vs_ext = & ext_buffer_size_vals_ext ;
} else {
hfindex [ 0 ] = hf_mac_lte_control_long_bsr_buffer_size_0 ;
hfindex [ 1 ] = hf_mac_lte_control_long_bsr_buffer_size_1 ;
hfindex [ 2 ] = hf_mac_lte_control_long_bsr_buffer_size_2 ;
hfindex [ 3 ] = hf_mac_lte_control_long_bsr_buffer_size_3 ;
p_vs_ext = & buffer_size_vals_ext ;
}
2009-09-10 18:12:41 +00:00
bsr_ti = proto_tree_add_string_format ( tree ,
hf_mac_lte_control_bsr ,
tvb , offset , 3 ,
" " ,
" Long BSR " ) ;
bsr_tree = proto_item_add_subtree ( bsr_ti , ett_mac_lte_bsr ) ;
2009-11-18 13:47:08 +00:00
/* LCID Group 0 */
2012-04-25 20:02:12 +00:00
buffer_size_ti = proto_tree_add_item ( bsr_tree , hfindex [ 0 ] ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-10-22 10:31:13 +00:00
buffer_size [ 0 ] = ( tvb_get_guint8 ( tvb , offset ) & 0xfc ) > > 2 ;
2009-11-18 13:47:08 +00:00
if ( buffer_size [ 0 ] > = global_mac_lte_bsr_warn_threshold ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , buffer_size_ti , & ei_mac_lte_bsr_warn_threshold_exceeded ,
2009-11-18 13:47:08 +00:00
" UE %u - BSR for LCG 0 exceeds threshold: %u (%s) " ,
p_mac_lte_info - > ueid ,
2012-04-25 20:02:12 +00:00
buffer_size [ 0 ] ,
val_to_str_ext_const ( buffer_size [ 0 ] , p_vs_ext , " Unknown " ) ) ;
2009-11-18 13:47:08 +00:00
}
/* LCID Group 1 */
2012-04-25 20:02:12 +00:00
buffer_size_ti = proto_tree_add_item ( bsr_tree , hfindex [ 1 ] ,
2011-10-06 03:35:44 +00:00
tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2009-10-22 11:45:40 +00:00
buffer_size [ 1 ] = ( ( tvb_get_guint8 ( tvb , offset ) & 0x03 ) < < 4 ) | ( ( tvb_get_guint8 ( tvb , offset + 1 ) & 0xf0 ) > > 4 ) ;
2009-09-10 18:12:41 +00:00
offset + + ;
2009-11-18 13:47:08 +00:00
if ( buffer_size [ 1 ] > = global_mac_lte_bsr_warn_threshold ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , buffer_size_ti , & ei_mac_lte_bsr_warn_threshold_exceeded ,
2009-11-18 13:47:08 +00:00
" UE %u - BSR for LCG 1 exceeds threshold: %u (%s) " ,
p_mac_lte_info - > ueid ,
2012-04-25 20:02:12 +00:00
buffer_size [ 1 ] ,
val_to_str_ext_const ( buffer_size [ 1 ] , p_vs_ext , " Unknown " ) ) ;
2009-11-18 13:47:08 +00:00
}
/* LCID Group 2 */
2012-04-25 20:02:12 +00:00
buffer_size_ti = proto_tree_add_item ( bsr_tree , hfindex [ 2 ] ,
2011-10-06 03:35:44 +00:00
tvb , offset , 2 , ENC_BIG_ENDIAN ) ;
2009-11-18 13:47:08 +00:00
2009-10-22 11:45:40 +00:00
buffer_size [ 2 ] = ( ( tvb_get_guint8 ( tvb , offset ) & 0x0f ) < < 2 ) | ( ( tvb_get_guint8 ( tvb , offset + 1 ) & 0xc0 ) > > 6 ) ;
2009-09-10 18:12:41 +00:00
offset + + ;
2009-11-18 13:47:08 +00:00
if ( buffer_size [ 2 ] > = global_mac_lte_bsr_warn_threshold ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , buffer_size_ti , & ei_mac_lte_bsr_warn_threshold_exceeded ,
2009-11-18 13:47:08 +00:00
" UE %u - BSR for LCG 2 exceeds threshold: %u (%s) " ,
p_mac_lte_info - > ueid ,
2012-04-25 20:02:12 +00:00
buffer_size [ 2 ] ,
val_to_str_ext_const ( buffer_size [ 2 ] , p_vs_ext , " Unknown " ) ) ;
2009-11-18 13:47:08 +00:00
}
/* LCID Group 3 */
2012-04-25 20:02:12 +00:00
buffer_size_ti = proto_tree_add_item ( bsr_tree , hfindex [ 3 ] ,
2011-10-06 03:35:44 +00:00
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2009-10-22 10:31:13 +00:00
buffer_size [ 3 ] = tvb_get_guint8 ( tvb , offset ) & 0x3f ;
2009-09-10 18:12:41 +00:00
offset + + ;
2009-11-18 13:47:08 +00:00
if ( buffer_size [ 3 ] > = global_mac_lte_bsr_warn_threshold ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , buffer_size_ti , & ei_mac_lte_bsr_warn_threshold_exceeded ,
2009-11-18 13:47:08 +00:00
" UE %u - BSR for LCG 3 exceeds threshold: %u (%s) " ,
p_mac_lte_info - > ueid ,
2012-04-25 20:02:12 +00:00
buffer_size [ 3 ] ,
val_to_str_ext_const ( buffer_size [ 3 ] , p_vs_ext , " Unknown " ) ) ;
2009-11-18 13:47:08 +00:00
}
2009-10-22 10:31:13 +00:00
2009-11-18 13:47:08 +00:00
/* Append summary to parent */
2009-10-22 11:45:40 +00:00
proto_item_append_text ( bsr_ti , " 0:(%s) 1:(%s) 2:(%s) 3:(%s) " ,
2012-04-25 20:02:12 +00:00
val_to_str_ext_const ( buffer_size [ 0 ] , p_vs_ext , " Unknown " ) ,
val_to_str_ext_const ( buffer_size [ 1 ] , p_vs_ext , " Unknown " ) ,
val_to_str_ext_const ( buffer_size [ 2 ] , p_vs_ext , " Unknown " ) ,
val_to_str_ext_const ( buffer_size [ 3 ] , p_vs_ext , " Unknown " ) ) ;
2009-09-10 18:12:41 +00:00
}
break ;
case PADDING_LCID :
/* No payload, in this position */
2009-12-29 22:55:39 +00:00
tap_info - > padding_bytes + + ;
2009-09-10 18:12:41 +00:00
break ;
default :
break ;
}
}
}
/* There might not be any data, if only headers (plus control data) were logged */
is_truncated = ( ( tvb_length_remaining ( tvb , offset ) = = 0 ) & & expecting_body_data ) ;
2008-12-23 21:00:04 +00:00
truncated_ti = proto_tree_add_uint ( tree , hf_mac_lte_sch_header_only , tvb , 0 , 0 ,
2009-09-10 18:12:41 +00:00
is_truncated ) ;
if ( is_truncated ) {
2009-05-06 22:01:33 +00:00
PROTO_ITEM_SET_GENERATED ( truncated_ti ) ;
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , truncated_ti , & ei_mac_lte_sch_header_only ) ;
2008-12-23 21:00:04 +00:00
return ;
}
2009-05-06 22:01:33 +00:00
else {
PROTO_ITEM_SET_HIDDEN ( truncated_ti ) ;
}
2008-12-23 21:00:04 +00:00
2009-09-10 18:12:41 +00:00
/* Now process remaining bodies, which should all be data */
for ( ; n < number_of_headers ; n + + ) {
2008-12-23 21:00:04 +00:00
/* Data SDUs treated identically for Uplink or downlink channels */
2009-09-10 18:12:41 +00:00
proto_item * sdu_ti ;
2009-12-04 17:39:39 +00:00
const guint8 * pdu_data ;
2009-09-10 18:12:41 +00:00
volatile guint16 data_length ;
2009-12-04 17:39:39 +00:00
int i ;
2010-01-12 16:12:27 +00:00
char buff [ 64 ] ;
2012-08-19 01:56:39 +00:00
gboolean rlc_called_for_sdu = FALSE ;
2009-08-01 09:52:12 +00:00
2009-09-10 18:12:41 +00:00
/* Break out if meet padding */
if ( lcids [ n ] = = PADDING_LCID ) {
break ;
}
2009-04-20 16:46:46 +00:00
2009-09-10 22:53:57 +00:00
/* Work out length */
2009-09-10 18:12:41 +00:00
data_length = ( pdu_lengths [ n ] = = - 1 ) ?
tvb_length_remaining ( tvb , offset ) :
pdu_lengths [ n ] ;
2009-09-18 16:27:02 +00:00
/* Dissect SDU as raw bytes */
2009-09-10 18:12:41 +00:00
sdu_ti = proto_tree_add_bytes_format ( tree , hf_mac_lte_sch_sdu , tvb , offset , pdu_lengths [ n ] ,
Modify proto_tree_add_bytes_format() and proto_tree_add_bytes_format_value()
so that if the start_ptr is NULL the bytes are extracted from the given TVB
using the given offset and length.
Replace a bunch of:
proto_tree_add_bytes_format*(tree, hf, tvb, offset, length, tvb_get_ptr(tvb, offset, length), [...])
with:
proto_tree_add_bytes_format*(tree, hf, tvb, offset, length, NULL, [...])
svn path=/trunk/; revision=35896
2011-02-10 16:31:00 +00:00
NULL , " SDU (%s, length=%u bytes): " ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( lcids [ n ] ,
( direction = = DIRECTION_UPLINK ) ?
ulsch_lcid_vals :
dlsch_lcid_vals ,
" Unknown " ) ,
2009-09-10 18:12:41 +00:00
data_length ) ;
/* Look for Msg3 data so that it may be compared with later
Contention Resolution body */
if ( ( lcids [ n ] = = 0 ) & & ( direction = = DIRECTION_UPLINK ) & & ( data_length = = 6 ) ) {
if ( ! pinfo - > fd - > flags . visited ) {
guint key = p_mac_lte_info - > rnti ;
2013-03-08 06:06:56 +00:00
Msg3Data * data = ( Msg3Data * ) g_hash_table_lookup ( mac_lte_msg3_hash , GUINT_TO_POINTER ( key ) ) ;
2009-09-10 18:12:41 +00:00
/* Look for previous entry for this UE */
if ( data = = NULL ) {
/* Allocate space for data and add to table */
2013-08-30 14:49:55 +00:00
data = wmem_new ( wmem_file_scope ( ) , Msg3Data ) ;
2009-09-10 18:12:41 +00:00
g_hash_table_insert ( mac_lte_msg3_hash , GUINT_TO_POINTER ( key ) , data ) ;
2009-04-20 16:46:46 +00:00
}
2009-05-01 10:30:18 +00:00
2009-09-10 18:12:41 +00:00
/* Fill in data details */
data - > framenum = pinfo - > fd - > num ;
2011-01-17 15:01:22 +00:00
tvb_memcpy ( tvb , data - > data , offset , data_length ) ;
2010-02-23 22:28:42 +00:00
data - > msg3Time = pinfo - > fd - > abs_ts ;
2009-04-20 16:46:46 +00:00
}
2008-12-23 21:00:04 +00:00
}
2009-08-01 09:52:12 +00:00
2009-09-10 18:12:41 +00:00
/* CCCH frames can be dissected directly by LTE RRC... */
if ( ( lcids [ n ] = = 0 ) & & global_mac_lte_attempt_rrc_decode ) {
tvbuff_t * rrc_tvb = tvb_new_subset ( tvb , offset , data_length , data_length ) ;
2008-12-23 21:00:04 +00:00
2009-09-10 18:12:41 +00:00
/* Get appropriate dissector handle */
volatile dissector_handle_t protocol_handle = 0 ;
if ( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) {
2010-06-18 07:07:55 +00:00
protocol_handle = find_dissector ( " lte_rrc.ul_ccch " ) ;
2008-12-23 21:00:04 +00:00
}
else {
2010-06-18 07:07:55 +00:00
protocol_handle = find_dissector ( " lte_rrc.dl_ccch " ) ;
2009-09-10 18:12:41 +00:00
}
2009-05-01 14:23:47 +00:00
2009-09-10 18:12:41 +00:00
/* Hide raw view of bytes */
PROTO_ITEM_SET_HIDDEN ( sdu_ti ) ;
2012-08-19 01:56:39 +00:00
rlc_called_for_sdu = TRUE ;
2009-08-05 08:02:12 +00:00
2010-07-20 08:27:34 +00:00
call_with_catch_all ( protocol_handle , rrc_tvb , pinfo , tree ) ;
2009-09-10 18:12:41 +00:00
}
2008-12-23 21:00:04 +00:00
2009-09-10 22:53:57 +00:00
/* LCID 1 and 2 can be assumed to be srb1&2, so can dissect as RLC AM */
2010-07-19 14:14:47 +00:00
else if ( ( lcids [ n ] = = 1 ) | | ( lcids [ n ] = = 2 ) ) {
2009-09-18 16:27:02 +00:00
if ( global_mac_lte_attempt_srb_decode ) {
/* Call RLC dissector */
2010-03-09 01:41:36 +00:00
call_rlc_dissector ( tvb , pinfo , tree , pdu_ti , offset , data_length ,
2009-09-18 16:27:02 +00:00
RLC_AM_MODE , direction , p_mac_lte_info - > ueid ,
2011-11-28 14:52:11 +00:00
CHANNEL_TYPE_SRB , lcids [ n ] , 0 ,
get_mac_lte_channel_priority ( p_mac_lte_info - > ueid ,
lcids [ n ] , direction ) ) ;
2009-09-10 22:53:57 +00:00
2009-09-18 16:27:02 +00:00
/* Hide raw view of bytes */
PROTO_ITEM_SET_HIDDEN ( sdu_ti ) ;
2012-08-19 01:56:39 +00:00
rlc_called_for_sdu = TRUE ;
2009-09-10 22:53:57 +00:00
}
2009-09-18 16:27:02 +00:00
}
2009-09-10 22:53:57 +00:00
2009-09-18 16:27:02 +00:00
else if ( ( lcids [ n ] > = 2 ) & & ( lcids [ n ] < = 10 ) ) {
/* Look for mapping for this LCID to drb channel set by UAT table */
2011-04-17 11:22:03 +00:00
rlc_channel_type_t rlc_channel_type ;
guint8 UM_seqnum_length ;
gint drb_id ;
2011-11-28 14:52:11 +00:00
guint8 priority = get_mac_lte_channel_priority ( p_mac_lte_info - > ueid ,
lcids [ n ] , direction ) ;
2009-09-10 22:53:57 +00:00
2012-10-12 03:00:38 +00:00
lookup_rlc_channel_from_lcid ( p_mac_lte_info - > ueid ,
lcids [ n ] ,
2011-04-17 11:22:03 +00:00
& rlc_channel_type ,
& UM_seqnum_length ,
& drb_id ) ;
2009-09-10 22:53:57 +00:00
2009-09-18 16:27:02 +00:00
/* Dissect according to channel type */
switch ( rlc_channel_type ) {
case rlcUM5 :
2010-03-09 01:41:36 +00:00
call_rlc_dissector ( tvb , pinfo , tree , pdu_ti , offset , data_length ,
2009-09-18 16:27:02 +00:00
RLC_UM_MODE , direction , p_mac_lte_info - > ueid ,
2011-11-28 14:52:11 +00:00
CHANNEL_TYPE_DRB , ( guint16 ) drb_id , UM_seqnum_length ,
priority ) ;
2009-09-18 16:27:02 +00:00
break ;
case rlcUM10 :
2010-03-09 01:41:36 +00:00
call_rlc_dissector ( tvb , pinfo , tree , pdu_ti , offset , data_length ,
2009-09-18 16:27:02 +00:00
RLC_UM_MODE , direction , p_mac_lte_info - > ueid ,
2011-11-28 14:52:11 +00:00
CHANNEL_TYPE_DRB , ( guint16 ) drb_id , UM_seqnum_length ,
priority ) ;
2009-09-18 16:27:02 +00:00
break ;
case rlcAM :
2010-03-09 01:41:36 +00:00
call_rlc_dissector ( tvb , pinfo , tree , pdu_ti , offset , data_length ,
2009-09-18 16:27:02 +00:00
RLC_AM_MODE , direction , p_mac_lte_info - > ueid ,
2011-11-28 14:52:11 +00:00
CHANNEL_TYPE_DRB , ( guint16 ) drb_id , 0 ,
priority ) ;
2009-09-18 16:27:02 +00:00
break ;
case rlcTM :
2010-03-09 01:41:36 +00:00
call_rlc_dissector ( tvb , pinfo , tree , pdu_ti , offset , data_length ,
2009-09-18 16:27:02 +00:00
RLC_TM_MODE , direction , p_mac_lte_info - > ueid ,
2011-11-28 14:52:11 +00:00
CHANNEL_TYPE_DRB , ( guint16 ) drb_id , 0 ,
priority ) ;
2009-09-18 16:27:02 +00:00
break ;
case rlcRaw :
/* Nothing to do! */
break ;
2009-09-10 22:53:57 +00:00
}
2009-09-18 16:27:02 +00:00
if ( rlc_channel_type ! = rlcRaw ) {
/* Hide raw view of bytes */
PROTO_ITEM_SET_HIDDEN ( sdu_ti ) ;
2012-08-19 01:56:39 +00:00
rlc_called_for_sdu = TRUE ;
2009-09-10 22:53:57 +00:00
}
}
2012-08-19 01:56:39 +00:00
/* Show bytes too, if won't be hidden (slow). There must be a nicer way of doing this! */
if ( ! rlc_called_for_sdu ) {
pdu_data = tvb_get_ptr ( tvb , offset , pdu_lengths [ n ] ) ;
for ( i = 0 ; i < data_length ; i + + ) {
g_snprintf ( buff + ( i * 2 ) , 3 , " %02x " , pdu_data [ i ] ) ;
if ( i > = 30 ) {
g_snprintf ( buff + ( i * 2 ) , 4 , " ... " ) ;
break ;
}
}
2012-09-19 16:56:59 +00:00
proto_item_append_text ( sdu_ti , " %s " , buff ) ;
2012-08-19 01:56:39 +00:00
}
2009-09-10 18:12:41 +00:00
offset + = data_length ;
2009-08-05 08:02:12 +00:00
2009-09-10 18:12:41 +00:00
/* Update tap byte count for this channel */
tap_info - > bytes_for_lcid [ lcids [ n ] ] + = data_length ;
}
2008-12-23 21:00:04 +00:00
2011-01-27 16:09:24 +00:00
2009-09-10 18:12:41 +00:00
/* Now padding, if present, extends to the end of the PDU */
if ( lcids [ number_of_headers - 1 ] = = PADDING_LCID ) {
if ( tvb_length_remaining ( tvb , offset ) > 0 ) {
proto_tree_add_item ( tree , hf_mac_lte_padding_data ,
2011-10-04 22:44:31 +00:00
tvb , offset , - 1 , ENC_NA ) ;
2009-09-10 18:12:41 +00:00
}
padding_length_ti = proto_tree_add_int ( tree , hf_mac_lte_padding_length ,
tvb , offset , 0 ,
p_mac_lte_info - > length - offset ) ;
PROTO_ITEM_SET_GENERATED ( padding_length_ti ) ;
2009-12-29 22:55:39 +00:00
/* Update padding bytes in stats */
tap_info - > padding_bytes + = ( p_mac_lte_info - > length - offset ) ;
2009-09-10 18:12:41 +00:00
/* Make sure the PDU isn't bigger than reported! */
if ( offset > p_mac_lte_info - > length ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , padding_length_ti , & ei_mac_lte_context_length ,
2012-03-08 04:49:59 +00:00
" %s MAC PDU is longer than reported length (reported=%u, actual=%u) " ,
( direction = = DIRECTION_UPLINK ) ? " UL-SCH " : " DL-SCH " ,
2009-09-10 18:12:41 +00:00
p_mac_lte_info - > length , offset ) ;
2008-12-23 21:00:04 +00:00
}
}
2009-10-22 17:22:27 +00:00
else {
/* There is no padding at the end of the frame */
2009-11-08 00:39:22 +00:00
if ( ! is_truncated & & ( offset < p_mac_lte_info - > length ) ) {
2009-10-22 17:22:27 +00:00
/* There is a problem if we haven't used all of the PDU */
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , pdu_ti , & ei_mac_lte_context_length ,
2012-03-08 04:49:59 +00:00
" %s PDU for UE %u is shorter than reported length (reported=%u, actual=%u) " ,
( direction = = DIRECTION_UPLINK ) ? " UL-SCH " : " DL-SCH " ,
2010-03-14 17:56:37 +00:00
p_mac_lte_info - > ueid , p_mac_lte_info - > length , offset ) ;
2009-10-22 17:22:27 +00:00
}
2009-09-10 18:12:41 +00:00
2010-05-24 16:28:34 +00:00
if ( ! is_truncated & & ( offset > p_mac_lte_info - > length ) ) {
/* There is a problem if the PDU is longer than rpeported */
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , pdu_ti , & ei_mac_lte_context_length ,
2012-03-08 04:49:59 +00:00
" %s PDU for UE %u is longer than reported length (reported=%u, actual=%u) " ,
( direction = = DIRECTION_UPLINK ) ? " UL-SCH " : " DL-SCH " ,
2010-05-24 16:28:34 +00:00
p_mac_lte_info - > ueid , p_mac_lte_info - > length , offset ) ;
}
}
2013-10-21 21:20:39 +00:00
/* Can now store updated DRX info and show its info in the tree */
if ( global_mac_lte_show_drx ) {
if ( ! pinfo - > fd - > flags . visited ) {
/* Store 'after' snapshot of UE state for this frame */
2013-12-11 11:03:29 +00:00
set_drx_info ( pinfo , p_mac_lte_info , FALSE , pdu_instance ) ;
2013-10-21 21:20:39 +00:00
}
/* Show current DRX state in tree as 'after' */
2013-12-11 11:03:29 +00:00
show_drx_info ( pinfo , tree , tvb , p_mac_lte_info , FALSE , pdu_instance ) ;
2013-10-21 21:20:39 +00:00
}
2008-12-23 21:00:04 +00:00
}
2011-12-22 18:05:48 +00:00
static void dissect_mch ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , proto_item * pdu_ti ,
volatile guint32 offset , mac_lte_info * p_mac_lte_info )
{
2012-03-16 02:00:29 +00:00
guint8 extension ;
volatile guint16 n ;
2011-12-22 18:05:48 +00:00
proto_item * truncated_ti ;
proto_item * padding_length_ti ;
proto_item * hidden_root_ti ;
/* Keep track of LCIDs and lengths as we dissect the header */
volatile guint16 number_of_headers = 0 ;
guint8 lcids [ MAX_HEADERS_IN_PDU ] ;
gint16 pdu_lengths [ MAX_HEADERS_IN_PDU ] ;
2012-09-18 17:26:00 +00:00
proto_item * pdu_header_ti , * sched_info_ti = NULL ;
2011-12-22 18:05:48 +00:00
proto_tree * pdu_header_tree ;
gboolean have_seen_data_header = FALSE ;
guint8 number_of_padding_subheaders = 0 ;
gboolean have_seen_non_padding_control = FALSE ;
gboolean expecting_body_data = FALSE ;
volatile guint32 is_truncated = FALSE ;
2012-11-29 22:25:18 +00:00
write_pdu_label_and_info_literal ( pdu_ti , NULL , pinfo , " MCH: " ) ;
2011-12-22 18:05:48 +00:00
/* Add hidden item to filter on */
hidden_root_ti = proto_tree_add_string_format ( tree , hf_mac_lte_mch , tvb ,
offset , 0 , " " , " Hidden header " ) ;
PROTO_ITEM_SET_HIDDEN ( hidden_root_ti ) ;
/* Add PDU block header subtree */
pdu_header_ti = proto_tree_add_string_format ( tree , hf_mac_lte_mch_header ,
tvb , offset , 0 ,
" " ,
" MAC PDU Header " ) ;
pdu_header_tree = proto_item_add_subtree ( pdu_header_ti , ett_mac_lte_mch_header ) ;
/************************************************************************/
/* Dissect each sub-header. */
do {
guint8 reserved ;
guint64 length = 0 ;
proto_item * pdu_subheader_ti ;
proto_tree * pdu_subheader_tree ;
proto_item * lcid_ti ;
proto_item * ti ;
gint offset_start_subheader = offset ;
guint8 first_byte = tvb_get_guint8 ( tvb , offset ) ;
/* Add PDU block header subtree.
Default with length of 1 byte . */
pdu_subheader_ti = proto_tree_add_string_format ( pdu_header_tree ,
hf_mac_lte_mch_subheader ,
tvb , offset , 1 ,
" " ,
" Sub-header " ) ;
pdu_subheader_tree = proto_item_add_subtree ( pdu_subheader_ti ,
ett_mac_lte_mch_subheader ) ;
/* Check 1st 2 reserved bits */
reserved = ( first_byte & 0xc0 ) > > 6 ;
ti = proto_tree_add_item ( pdu_subheader_tree , hf_mac_lte_mch_reserved ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
if ( reserved ! = 0 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_reserved_not_zero ,
2011-12-22 18:05:48 +00:00
" MCH header Reserved bits not zero " ) ;
}
/* Extended bit */
extension = ( first_byte & 0x20 ) > > 5 ;
proto_tree_add_item ( pdu_subheader_tree , hf_mac_lte_mch_extended ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
/* LCID */
lcids [ number_of_headers ] = first_byte & 0x1f ;
lcid_ti = proto_tree_add_item ( pdu_subheader_tree , hf_mac_lte_mch_lcid ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
2012-09-18 17:26:00 +00:00
if ( lcids [ number_of_headers ] = = MCH_SCHEDULING_INFO_LCID ) {
sched_info_ti = lcid_ti ;
}
2011-12-22 18:05:48 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
" (%s " ,
val_to_str_const ( lcids [ number_of_headers ] ,
mch_lcid_vals , " (Unknown LCID) " ) ) ;
offset + + ;
/* Remember if we've seen a data subheader */
if ( lcids [ number_of_headers ] < = 28 ) {
have_seen_data_header = TRUE ;
expecting_body_data = TRUE ;
}
/* Show an expert item if a contol subheader (except Padding) appears
* after * a data PDU */
if ( have_seen_data_header & &
( lcids [ number_of_headers ] > 28 ) & & ( lcids [ number_of_headers ] ! = PADDING_LCID ) ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , lcid_ti , & ei_mac_lte_control_subheader_after_data_subheader ,
2011-12-22 18:05:48 +00:00
" MCH Control subheaders should not appear after data subheaders " ) ;
return ;
}
/* Should not see padding after non-padding control... */
if ( ( lcids [ number_of_headers ] > 28 ) & &
( lcids [ number_of_headers ] = = PADDING_LCID ) & &
extension )
{
number_of_padding_subheaders + + ;
if ( number_of_padding_subheaders > 2 ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , lcid_ti , & ei_mac_lte_padding_data_multiple ) ;
2011-12-22 18:05:48 +00:00
}
if ( have_seen_non_padding_control ) {
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , lcid_ti , & ei_mac_lte_padding_data_before_control_subheader ) ;
2011-12-22 18:05:48 +00:00
}
}
/* Remember that we've seen non-padding control */
if ( ( lcids [ number_of_headers ] > 28 ) & &
( lcids [ number_of_headers ] ! = PADDING_LCID ) ) {
have_seen_non_padding_control = TRUE ;
}
/********************************************************************/
/* Length field follows if not the last header or for a fixed-sized
control element */
if ( ! extension ) {
/* Last one... */
pdu_lengths [ number_of_headers ] = - 1 ;
}
else {
/* Not the last one */
if ( lcids [ number_of_headers ] ! = PADDING_LCID ) {
guint8 format ;
/* F(ormat) bit tells us how long the length field is */
format = ( tvb_get_guint8 ( tvb , offset ) & 0x80 ) > > 7 ;
proto_tree_add_item ( pdu_subheader_tree , hf_mac_lte_mch_format ,
tvb , offset , 1 , ENC_BIG_ENDIAN ) ;
/* Now read length field itself */
if ( format ) {
/* >= 128 - use 15 bits */
proto_tree_add_bits_ret_val ( pdu_subheader_tree , hf_mac_lte_mch_length ,
tvb , offset * 8 + 1 , 15 , & length , ENC_BIG_ENDIAN ) ;
offset + = 2 ;
}
else {
/* Less than 128 - only 7 bits */
proto_tree_add_bits_ret_val ( pdu_subheader_tree , hf_mac_lte_mch_length ,
tvb , offset * 8 + 1 , 7 , & length , ENC_BIG_ENDIAN ) ;
offset + + ;
}
pdu_lengths [ number_of_headers ] = ( gint16 ) length ;
}
else {
pdu_lengths [ number_of_headers ] = 0 ;
}
}
/* Close off description in info column */
switch ( pdu_lengths [ number_of_headers ] ) {
case 0 :
2012-11-29 22:25:18 +00:00
write_pdu_label_and_info_literal ( pdu_ti , NULL , pinfo , " ) " ) ;
2011-12-22 18:05:48 +00:00
break ;
case - 1 :
2012-11-29 22:25:18 +00:00
write_pdu_label_and_info_literal ( pdu_ti , NULL , pinfo , " :remainder) " ) ;
2011-12-22 18:05:48 +00:00
break ;
default :
write_pdu_label_and_info ( pdu_ti , NULL , pinfo , " :%u bytes) " ,
pdu_lengths [ number_of_headers ] ) ;
break ;
}
/* Append summary to subheader root */
proto_item_append_text ( pdu_subheader_ti , " (lcid=%s " ,
val_to_str_const ( lcids [ number_of_headers ] ,
mch_lcid_vals , " Unknown " ) ) ;
switch ( pdu_lengths [ number_of_headers ] ) {
case - 1 :
2012-09-19 16:56:59 +00:00
proto_item_append_text ( pdu_subheader_ti , " , length is remainder) " ) ;
2011-12-22 18:05:48 +00:00
proto_item_append_text ( pdu_header_ti , " (%s:remainder) " ,
val_to_str_const ( lcids [ number_of_headers ] ,
mch_lcid_vals ,
" Unknown " ) ) ;
break ;
case 0 :
2012-09-19 16:56:59 +00:00
proto_item_append_text ( pdu_subheader_ti , " ) " ) ;
2011-12-22 18:05:48 +00:00
proto_item_append_text ( pdu_header_ti , " (%s) " ,
val_to_str_const ( lcids [ number_of_headers ] ,
mch_lcid_vals ,
" Unknown " ) ) ;
break ;
default :
proto_item_append_text ( pdu_subheader_ti , " , length=%u) " ,
pdu_lengths [ number_of_headers ] ) ;
proto_item_append_text ( pdu_header_ti , " (%s:%u) " ,
val_to_str_const ( lcids [ number_of_headers ] ,
mch_lcid_vals ,
" Unknown " ) ,
pdu_lengths [ number_of_headers ] ) ;
break ;
}
/* Flag unknown lcid values in expert info */
2013-03-29 00:26:23 +00:00
if ( try_val_to_str ( lcids [ number_of_headers ] , mch_lcid_vals ) = = NULL ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , pdu_subheader_ti , & ei_mac_lte_lcid_unexpected ,
2011-12-22 18:05:48 +00:00
" MCH: Unexpected LCID received (%u) " ,
lcids [ number_of_headers ] ) ;
}
/* Set length of this subheader */
proto_item_set_len ( pdu_subheader_ti , offset - offset_start_subheader ) ;
number_of_headers + + ;
2012-01-26 15:19:32 +00:00
} while ( ( number_of_headers < MAX_HEADERS_IN_PDU ) & & extension ) ;
/* Check that we didn't reach the end of the subheader array... */
2012-01-26 19:25:08 +00:00
if ( number_of_headers > = MAX_HEADERS_IN_PDU ) {
2013-09-05 01:05:16 +00:00
proto_tree_add_expert_format ( tree , pinfo , & ei_mac_lte_too_many_subheaders , tvb , offset , 1 ,
2012-01-26 15:19:32 +00:00
" Reached %u subheaders - frame obviously malformed " ,
MAX_HEADERS_IN_PDU ) ;
return ;
}
2011-12-22 18:05:48 +00:00
/* Append summary to overall PDU header root */
proto_item_append_text ( pdu_header_ti , " (%u subheaders) " ,
number_of_headers ) ;
/* And set its length to offset */
proto_item_set_len ( pdu_header_ti , offset ) ;
/************************************************************************/
/* Dissect SDUs / control elements / padding. */
/************************************************************************/
/* Dissect control element bodies first */
for ( n = 0 ; n < number_of_headers ; n + + ) {
/* Get out of loop once see any data SDU subheaders */
if ( lcids [ n ] < = 28 ) {
break ;
}
/* Process what should be a valid control PDU type */
switch ( lcids [ n ] ) {
case MCH_SCHEDULING_INFO_LCID :
{
guint32 curr_offset = offset ;
gint16 i ;
2011-12-27 00:27:46 +00:00
guint16 stop_mtch_val ;
proto_item * mch_sched_info_ti , * ti ;
2011-12-22 18:05:48 +00:00
proto_tree * mch_sched_info_tree ;
2012-09-18 17:26:00 +00:00
if ( pdu_lengths [ n ] = = - 1 ) {
/* Control Element size is the remaining PDU */
pdu_lengths [ n ] = ( gint16 ) tvb_length_remaining ( tvb , curr_offset ) ;
}
if ( pdu_lengths [ n ] & 0x01 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , sched_info_ti , & ei_mac_lte_context_length ,
2012-09-18 17:26:00 +00:00
" MCH Scheduling Information MAC Control Element should have an even size " ) ;
}
2011-12-22 18:05:48 +00:00
mch_sched_info_ti = proto_tree_add_string_format ( tree ,
hf_mac_lte_control_mch_scheduling_info ,
tvb , curr_offset , pdu_lengths [ n ] ,
" " ,
" MCH Scheduling Information " ) ;
mch_sched_info_tree = proto_item_add_subtree ( mch_sched_info_ti , ett_mac_lte_mch_scheduling_info ) ;
for ( i = 0 ; i < ( pdu_lengths [ n ] / 2 ) ; i + + ) {
proto_tree_add_item ( mch_sched_info_tree , hf_mac_lte_control_mch_scheduling_info_lcid ,
tvb , curr_offset , 1 , ENC_BIG_ENDIAN ) ;
2011-12-27 00:27:46 +00:00
stop_mtch_val = tvb_get_ntohs ( tvb , curr_offset ) & 0x7ff ;
ti = proto_tree_add_item ( mch_sched_info_tree , hf_mac_lte_control_mch_scheduling_info_stop_mtch ,
tvb , curr_offset , 2 , ENC_BIG_ENDIAN ) ;
if ( ( stop_mtch_val > = 2043 ) & & ( stop_mtch_val < = 2046 ) ) {
2012-09-19 16:56:59 +00:00
proto_item_append_text ( ti , " (reserved) " ) ;
2011-12-27 00:27:46 +00:00
}
else if ( stop_mtch_val = = 2047 ) {
2012-09-19 16:56:59 +00:00
proto_item_append_text ( ti , " (MTCH is not scheduled) " ) ;
2011-12-27 00:27:46 +00:00
}
2011-12-22 18:05:48 +00:00
curr_offset + = 2 ;
}
offset + = pdu_lengths [ n ] ;
}
break ;
case PADDING_LCID :
/* No payload (in this position) */
break ;
default :
break ;
}
}
/* There might not be any data, if only headers (plus control data) were logged */
is_truncated = ( ( tvb_length_remaining ( tvb , offset ) = = 0 ) & & expecting_body_data ) ;
truncated_ti = proto_tree_add_uint ( tree , hf_mac_lte_mch_header_only , tvb , 0 , 0 ,
is_truncated ) ;
if ( is_truncated ) {
PROTO_ITEM_SET_GENERATED ( truncated_ti ) ;
2013-09-05 01:05:16 +00:00
expert_add_info ( pinfo , truncated_ti , & ei_mac_lte_sch_header_only ) ;
2011-12-22 18:05:48 +00:00
return ;
}
else {
PROTO_ITEM_SET_HIDDEN ( truncated_ti ) ;
}
/* Now process remaining bodies, which should all be data */
for ( ; n < number_of_headers ; n + + ) {
proto_item * sdu_ti ;
const guint8 * pdu_data ;
volatile guint16 data_length ;
int i ;
char buff [ 64 ] ;
/* Break out if meet padding */
if ( lcids [ n ] = = PADDING_LCID ) {
break ;
}
/* Work out length */
data_length = ( pdu_lengths [ n ] = = - 1 ) ?
tvb_length_remaining ( tvb , offset ) :
pdu_lengths [ n ] ;
2012-10-01 19:51:07 +00:00
if ( ( lcids [ n ] = = 0 ) & & global_mac_lte_attempt_mcch_decode ) {
/* Call RLC dissector */
call_rlc_dissector ( tvb , pinfo , tree , pdu_ti , offset , data_length ,
RLC_UM_MODE , DIRECTION_DOWNLINK , 0 ,
CHANNEL_TYPE_MCCH , 0 , 5 , 0 ) ;
2012-12-11 23:20:22 +00:00
} else if ( ( lcids [ n ] < = 28 ) & & global_mac_lte_call_rlc_for_mtch ) {
/* Call RLC dissector */
call_rlc_dissector ( tvb , pinfo , tree , pdu_ti , offset , data_length ,
RLC_UM_MODE , DIRECTION_DOWNLINK , 0 ,
CHANNEL_TYPE_MTCH , 0 , 5 , 0 ) ;
2012-10-01 19:51:07 +00:00
} else {
/* Dissect SDU as raw bytes */
sdu_ti = proto_tree_add_bytes_format ( tree , hf_mac_lte_mch_sdu , tvb , offset , pdu_lengths [ n ] ,
NULL , " SDU (%s, length=%u bytes): " ,
val_to_str_const ( lcids [ n ] , mch_lcid_vals , " Unknown " ) ,
data_length ) ;
/* Show bytes too. There must be a nicer way of doing this! */
pdu_data = tvb_get_ptr ( tvb , offset , pdu_lengths [ n ] ) ;
for ( i = 0 ; i < data_length ; i + + ) {
g_snprintf ( buff + ( i * 2 ) , 3 , " %02x " , pdu_data [ i ] ) ;
if ( i > = 30 ) {
g_snprintf ( buff + ( i * 2 ) , 4 , " ... " ) ;
break ;
}
2011-12-22 18:05:48 +00:00
}
2012-10-01 19:51:07 +00:00
proto_item_append_text ( sdu_ti , " %s " , buff ) ;
2011-12-22 18:05:48 +00:00
}
offset + = data_length ;
}
/* Now padding, if present, extends to the end of the PDU */
if ( lcids [ number_of_headers - 1 ] = = PADDING_LCID ) {
if ( tvb_length_remaining ( tvb , offset ) > 0 ) {
proto_tree_add_item ( tree , hf_mac_lte_padding_data ,
tvb , offset , - 1 , ENC_NA ) ;
}
padding_length_ti = proto_tree_add_int ( tree , hf_mac_lte_padding_length ,
tvb , offset , 0 ,
p_mac_lte_info - > length - offset ) ;
PROTO_ITEM_SET_GENERATED ( padding_length_ti ) ;
/* Make sure the PDU isn't bigger than reported! */
if ( offset > p_mac_lte_info - > length ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , padding_length_ti , & ei_mac_lte_context_length ,
2011-12-22 18:05:48 +00:00
" MAC PDU is longer than reported length (reported=%u, actual=%u) " ,
p_mac_lte_info - > length , offset ) ;
}
}
else {
/* There is no padding at the end of the frame */
if ( ! is_truncated & & ( offset < p_mac_lte_info - > length ) ) {
/* There is a problem if we haven't used all of the PDU */
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , pdu_ti , & ei_mac_lte_context_length ,
2011-12-22 18:05:48 +00:00
" PDU is shorter than reported length (reported=%u, actual=%u) " ,
p_mac_lte_info - > length , offset ) ;
}
if ( ! is_truncated & & ( offset > p_mac_lte_info - > length ) ) {
/* There is a problem if the PDU is longer than rpeported */
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , pdu_ti , & ei_mac_lte_context_length ,
2011-12-22 18:05:48 +00:00
" PDU is longer than reported length (reported=%u, actual=%u) " ,
p_mac_lte_info - > length , offset ) ;
}
}
}
2008-12-23 21:00:04 +00:00
/*****************************/
/* Main dissection function. */
2013-12-11 11:03:29 +00:00
/* 'data' will be cast to an int, where it can then be used to differentiate
multiple MAC PDUs logged in the same frame ( e . g . in the LTE eNB LI API definition from
the Small Cell Forum )
*/
int dissect_mac_lte ( tvbuff_t * tvb , packet_info * pinfo , proto_tree * tree , void * data )
2008-12-23 21:00:04 +00:00
{
2012-03-16 02:00:29 +00:00
proto_tree * mac_lte_tree ;
proto_item * pdu_ti ;
proto_tree * context_tree ;
proto_item * context_ti ;
proto_item * retx_ti = NULL ;
proto_item * ti ;
gint offset = 0 ;
2012-10-06 15:52:14 +00:00
struct mac_lte_info * p_mac_lte_info ;
2012-03-16 02:00:29 +00:00
gint n ;
2013-12-11 11:03:29 +00:00
guint pdu_instance = GPOINTER_TO_UINT ( data ) ;
2008-12-23 21:00:04 +00:00
2010-07-13 16:25:34 +00:00
/* Allocate and zero tap struct */
2013-12-11 11:03:29 +00:00
mac_lte_tap_info * tap_info = ( mac_lte_tap_info * ) wmem_alloc0 ( wmem_file_scope ( ) , sizeof ( mac_lte_tap_info ) ) ;
2009-02-12 12:08:05 +00:00
2009-01-08 14:09:38 +00:00
/* Set protocol name */
2009-07-13 11:23:40 +00:00
col_set_str ( pinfo - > cinfo , COL_PROTOCOL , " MAC-LTE " ) ;
2008-12-23 21:00:04 +00:00
/* Create protocol tree. */
2011-10-21 02:10:19 +00:00
pdu_ti = proto_tree_add_item ( tree , proto_mac_lte , tvb , offset , - 1 , ENC_NA ) ;
2012-09-19 16:56:59 +00:00
proto_item_append_text ( pdu_ti , " " ) ;
2009-10-22 17:22:27 +00:00
mac_lte_tree = proto_item_add_subtree ( pdu_ti , ett_mac_lte ) ;
2008-12-23 21:00:04 +00:00
/* Look for packet info! */
2013-11-23 02:20:13 +00:00
p_mac_lte_info = ( mac_lte_info * ) p_get_proto_data ( wmem_file_scope ( ) , pinfo , proto_mac_lte , 0 ) ;
2008-12-23 21:00:04 +00:00
/* Can't dissect anything without it... */
if ( p_mac_lte_info = = NULL ) {
2010-01-18 23:16:10 +00:00
proto_item * tii =
2008-12-23 21:00:04 +00:00
proto_tree_add_text ( mac_lte_tree , tvb , offset , - 1 ,
" Can't dissect LTE MAC frame because no per-frame info was attached! " ) ;
2010-01-18 23:16:10 +00:00
PROTO_ITEM_SET_GENERATED ( tii ) ;
2013-12-11 11:03:29 +00:00
return 0 ;
2008-12-23 21:00:04 +00:00
}
2009-05-28 02:24:27 +00:00
/* Clear info column */
2009-07-13 11:23:40 +00:00
col_clear ( pinfo - > cinfo , COL_INFO ) ;
2009-05-28 02:24:27 +00:00
2008-12-23 21:00:04 +00:00
/*****************************************/
/* Show context information */
2010-03-09 01:41:36 +00:00
/* Create context root */
context_ti = proto_tree_add_string_format ( mac_lte_tree , hf_mac_lte_context ,
tvb , offset , 0 , " " , " Context " ) ;
context_tree = proto_item_add_subtree ( context_ti , ett_mac_lte_context ) ;
PROTO_ITEM_SET_GENERATED ( context_ti ) ;
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_radio_type ,
2009-01-09 16:12:49 +00:00
tvb , 0 , 0 , p_mac_lte_info - > radioType ) ;
2008-12-23 21:00:04 +00:00
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_direction ,
2008-12-23 21:00:04 +00:00
tvb , 0 , 0 , p_mac_lte_info - > direction ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
if ( p_mac_lte_info - > ueid ! = 0 ) {
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_ueid ,
2008-12-23 21:00:04 +00:00
tvb , 0 , 0 , p_mac_lte_info - > ueid ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
2009-10-26 15:39:00 +00:00
/* There are several out-of-band MAC events that may be indicated in the context info. */
/* Handle them here */
if ( p_mac_lte_info - > length = = 0 ) {
2010-03-22 19:20:37 +00:00
proto_item * preamble_ti ;
proto_tree * preamble_tree ;
2009-10-26 15:39:00 +00:00
switch ( p_mac_lte_info - > oob_event ) {
case ltemac_send_preamble :
2010-03-22 19:20:37 +00:00
preamble_ti = proto_tree_add_item ( mac_lte_tree , hf_mac_lte_oob_send_preamble ,
2011-10-15 18:46:26 +00:00
tvb , 0 , 0 , ENC_ASCII | ENC_NA ) ;
2010-03-22 19:20:37 +00:00
preamble_tree = proto_item_add_subtree ( preamble_ti , ett_mac_lte_oob ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
ti = proto_tree_add_uint ( preamble_tree , hf_mac_lte_context_rapid ,
2009-10-26 15:39:00 +00:00
tvb , 0 , 0 , p_mac_lte_info - > rapid ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-03-22 19:20:37 +00:00
ti = proto_tree_add_uint ( preamble_tree , hf_mac_lte_context_rach_attempt_number ,
2009-10-26 15:39:00 +00:00
tvb , 0 , 0 , p_mac_lte_info - > rach_attempt_number ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
/* Info column */
2010-03-22 19:20:37 +00:00
write_pdu_label_and_info ( pdu_ti , preamble_ti , pinfo ,
2013-02-16 00:05:37 +00:00
" RACH Preamble chosen for UE %u (RAPID=%u, attempt=%u) " ,
p_mac_lte_info - > ueid , p_mac_lte_info - > rapid ,
p_mac_lte_info - > rach_attempt_number ) ;
2009-10-26 15:39:00 +00:00
2009-11-19 18:11:38 +00:00
/* Add expert info (a note, unless attempt > 1) */
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti ,
2013-09-05 01:05:16 +00:00
( p_mac_lte_info - > rach_attempt_number > 1 ) ? & ei_mac_lte_rach_preamble_sent_warn : & ei_mac_lte_rach_preamble_sent_note ,
2009-11-08 00:39:22 +00:00
" RACH Preamble sent for UE %u (RAPID=%u, attempt=%u) " ,
2009-10-26 15:39:00 +00:00
p_mac_lte_info - > ueid , p_mac_lte_info - > rapid ,
p_mac_lte_info - > rach_attempt_number ) ;
break ;
case ltemac_send_sr :
2012-03-25 23:46:01 +00:00
/* Count of SRs */
ti = proto_tree_add_uint ( mac_lte_tree , hf_mac_lte_number_of_srs ,
tvb , 0 , 0 , p_mac_lte_info - > number_of_srs ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2011-05-11 11:10:30 +00:00
for ( n = 0 ; n < p_mac_lte_info - > number_of_srs ; n + + ) {
proto_item * sr_ti ;
proto_tree * sr_tree ;
2011-10-21 02:10:19 +00:00
2011-05-11 11:10:30 +00:00
/* SR event is subtree */
2013-09-05 01:05:16 +00:00
sr_ti = proto_tree_add_expert_format ( mac_lte_tree , pinfo , & ei_mac_lte_oob_send_sr ,
tvb , 0 , 0 ,
" Scheduling Request sent for UE %u (RNTI %u) " , p_mac_lte_info - > oob_ueid [ n ] , p_mac_lte_info - > oob_rnti [ n ] ) ;
2011-05-11 11:10:30 +00:00
sr_tree = proto_item_add_subtree ( sr_ti , ett_mac_lte_oob ) ;
PROTO_ITEM_SET_GENERATED ( sr_ti ) ;
/* RNTI */
ti = proto_tree_add_uint ( sr_tree , hf_mac_lte_context_rnti ,
tvb , 0 , 0 , p_mac_lte_info - > oob_rnti [ n ] ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
/* UEID */
ti = proto_tree_add_uint ( sr_tree , hf_mac_lte_context_ueid ,
tvb , 0 , 0 , p_mac_lte_info - > oob_ueid [ n ] ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
/* Add summary to root. */
proto_item_append_text ( sr_ti , " (UE=%u C-RNTI=%u) " ,
p_mac_lte_info - > oob_ueid [ n ] ,
p_mac_lte_info - > oob_rnti [ n ] ) ;
/* Info column */
if ( n = = 0 ) {
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
" Scheduling Requests (%u) sent: (UE=%u C-RNTI=%u) " ,
p_mac_lte_info - > number_of_srs ,
p_mac_lte_info - > oob_ueid [ n ] ,
p_mac_lte_info - > oob_rnti [ n ] ) ;
}
else {
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
" (UE=%u C-RNTI=%u) " ,
p_mac_lte_info - > oob_ueid [ n ] ,
p_mac_lte_info - > oob_rnti [ n ] ) ;
}
2009-10-26 15:39:00 +00:00
2011-05-11 11:10:30 +00:00
/* Update SR status for this UE */
if ( global_mac_lte_track_sr ) {
TrackSRInfo ( SR_Request , pinfo , mac_lte_tree , tvb , p_mac_lte_info , n , sr_ti ) ;
}
2009-12-02 17:46:27 +00:00
}
2009-10-26 15:39:00 +00:00
break ;
case ltemac_sr_failure :
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_rnti ,
2009-10-26 15:39:00 +00:00
tvb , 0 , 0 , p_mac_lte_info - > rnti ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-03-22 19:20:37 +00:00
2013-09-05 01:05:16 +00:00
proto_tree_add_expert_format ( mac_lte_tree , pinfo , & ei_mac_lte_oob_sr_failure ,
tvb , 0 , 0 , " Scheduling Request failed for UE %u (RNTI %u) " ,
p_mac_lte_info - > ueid , p_mac_lte_info - > rnti ) ;
2009-10-26 15:39:00 +00:00
PROTO_ITEM_SET_GENERATED ( ti ) ;
/* Info column */
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
2010-03-23 13:24:01 +00:00
" Scheduling Request FAILED for UE %u (C-RNTI=%u) " ,
p_mac_lte_info - > ueid ,
2010-03-09 01:41:36 +00:00
p_mac_lte_info - > rnti ) ;
2009-10-26 15:39:00 +00:00
2009-12-02 17:46:27 +00:00
/* Update SR status */
if ( global_mac_lte_track_sr ) {
2011-05-11 11:10:30 +00:00
TrackSRInfo ( SR_Failure , pinfo , mac_lte_tree , tvb , p_mac_lte_info , 0 , ti ) ;
2009-12-02 17:46:27 +00:00
}
2009-10-26 15:39:00 +00:00
break ;
}
/* Our work here is done */
2013-12-11 11:03:29 +00:00
return - 1 ;
2009-10-26 15:39:00 +00:00
}
2013-08-30 04:08:57 +00:00
/* Show remaining meta information */
2011-11-21 16:18:33 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_sysframe_number ,
tvb , 0 , 0 , p_mac_lte_info - > sysframeNumber ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2012-12-16 00:02:50 +00:00
if ( p_mac_lte_info - > sysframeNumber > 1023 ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_context_sysframe_number ,
2012-12-16 00:02:50 +00:00
" Sysframe number (%u) out of range - valid range is 0-1023 " ,
2012-12-17 14:39:59 +00:00
p_mac_lte_info - > sysframeNumber ) ;
2012-12-16 00:02:50 +00:00
}
2009-10-26 15:39:00 +00:00
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_subframe_number ,
2008-12-23 21:00:04 +00:00
tvb , 0 , 0 , p_mac_lte_info - > subframeNumber ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-07-05 10:50:27 +00:00
if ( p_mac_lte_info - > subframeNumber > 9 ) {
2011-12-22 18:05:48 +00:00
/* N.B. if we set it to valid value, it won't trigger when we rescan
2011-01-14 11:21:28 +00:00
( at least with DCT2000 files where the context struct isn ' t re - read ) . */
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_context_sysframe_number ,
2012-12-16 00:02:50 +00:00
" Subframe number (%u) out of range - valid range is 0-9 " ,
2011-01-14 11:21:28 +00:00
p_mac_lte_info - > subframeNumber ) ;
2010-07-05 10:50:27 +00:00
}
2008-12-23 21:00:04 +00:00
2010-07-05 16:45:36 +00:00
if ( p_mac_lte_info - > subframeNumberOfGrantPresent ) {
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_grant_subframe_number ,
tvb , 0 , 0 , p_mac_lte_info - > subframeNumberOfGrant ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
2009-03-11 11:17:16 +00:00
if ( p_mac_lte_info - > rntiType ! = NO_RNTI ) {
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_rnti ,
2009-03-11 11:17:16 +00:00
tvb , 0 , 0 , p_mac_lte_info - > rnti ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2012-08-19 01:56:39 +00:00
proto_item_append_text ( context_ti , " (RNTI=%u) " , p_mac_lte_info - > rnti ) ;
2009-03-11 11:17:16 +00:00
}
2008-12-23 21:00:04 +00:00
2012-08-19 01:56:39 +00:00
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_rnti_type ,
2008-12-23 21:00:04 +00:00
tvb , 0 , 0 , p_mac_lte_info - > rntiType ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-11-12 16:59:22 +00:00
/* Check that RNTI value is consistent with given RNTI type */
switch ( p_mac_lte_info - > rntiType ) {
2011-12-22 18:05:48 +00:00
case M_RNTI :
if ( p_mac_lte_info - > rnti ! = 0xFFFD ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_context_rnti_type ,
2011-12-22 18:05:48 +00:00
" M-RNTI indicated, but value is %u (0x%x) (must be 0x%x) " ,
p_mac_lte_info - > rnti , p_mac_lte_info - > rnti , 0xFFFD ) ;
2013-12-11 11:03:29 +00:00
return 0 ;
2011-12-22 18:05:48 +00:00
}
break ;
2010-11-12 16:59:22 +00:00
case P_RNTI :
if ( p_mac_lte_info - > rnti ! = 0xFFFE ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_context_rnti_type ,
2010-11-12 16:59:22 +00:00
" P-RNTI indicated, but value is %u (0x%x) (must be 0x%x) " ,
p_mac_lte_info - > rnti , p_mac_lte_info - > rnti , 0xFFFE ) ;
2013-12-11 11:03:29 +00:00
return 0 ;
2010-11-12 16:59:22 +00:00
}
break ;
case SI_RNTI :
if ( p_mac_lte_info - > rnti ! = 0xFFFF ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_context_rnti_type ,
2010-11-12 16:59:22 +00:00
" SI-RNTI indicated, but value is %u (0x%x) (must be 0x%x) " ,
p_mac_lte_info - > rnti , p_mac_lte_info - > rnti , 0xFFFE ) ;
2013-12-11 11:03:29 +00:00
return 0 ;
2010-11-12 16:59:22 +00:00
}
break ;
case RA_RNTI :
2010-11-13 15:32:29 +00:00
if ( ( p_mac_lte_info - > rnti < 0x0001 ) | | ( p_mac_lte_info - > rnti > 0x003C ) ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_context_rnti_type ,
2010-11-13 15:32:29 +00:00
" RA_RNTI indicated, but given value %u (0x%x)is out of range " ,
p_mac_lte_info - > rnti , p_mac_lte_info - > rnti ) ;
2013-12-11 11:03:29 +00:00
return 0 ;
2010-11-13 15:32:29 +00:00
}
break ;
2010-11-12 16:59:22 +00:00
case C_RNTI :
2010-11-13 15:32:29 +00:00
case SPS_RNTI :
2010-11-12 16:59:22 +00:00
if ( ( p_mac_lte_info - > rnti < 0x0001 ) | | ( p_mac_lte_info - > rnti > 0xFFF3 ) ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_context_rnti_type ,
2010-11-12 16:59:22 +00:00
" %s indicated, but given value %u (0x%x)is out of range " ,
val_to_str_const ( p_mac_lte_info - > rntiType , rnti_type_vals , " Unknown " ) ,
p_mac_lte_info - > rnti , p_mac_lte_info - > rnti ) ;
2013-12-11 11:03:29 +00:00
return 0 ;
2010-11-12 16:59:22 +00:00
}
2010-11-13 15:32:29 +00:00
break ;
2010-11-12 16:59:22 +00:00
default :
break ;
}
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_predefined_frame ,
2009-03-16 15:39:52 +00:00
tvb , 0 , 0 , p_mac_lte_info - > isPredefinedData ) ;
2009-05-06 22:01:33 +00:00
if ( p_mac_lte_info - > isPredefinedData ) {
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
else {
PROTO_ITEM_SET_HIDDEN ( ti ) ;
}
2008-12-23 21:00:04 +00:00
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_length ,
2008-12-23 21:00:04 +00:00
tvb , 0 , 0 , p_mac_lte_info - > length ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2009-08-26 09:13:14 +00:00
/* Infer uplink grant size */
if ( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) {
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_ul_grant_size ,
2009-08-26 09:13:14 +00:00
tvb , 0 , 0 , p_mac_lte_info - > length ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
}
2010-03-09 01:41:36 +00:00
/* Retx count goes in top-level tree to make it more visible */
2009-03-16 15:39:52 +00:00
if ( p_mac_lte_info - > reTxCount ) {
2011-11-25 11:19:03 +00:00
proto_item * retx_reason_ti ;
2009-11-25 16:00:58 +00:00
retx_ti = proto_tree_add_uint ( mac_lte_tree , hf_mac_lte_context_retx_count ,
2009-03-16 15:39:52 +00:00
tvb , 0 , 0 , p_mac_lte_info - > reTxCount ) ;
2009-11-25 16:00:58 +00:00
PROTO_ITEM_SET_GENERATED ( retx_ti ) ;
2009-03-16 15:39:52 +00:00
if ( p_mac_lte_info - > reTxCount > = global_mac_lte_retx_counter_trigger ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , retx_ti , & ei_mac_lte_ul_mac_frame_retx ,
2009-11-25 23:18:28 +00:00
" UE %u: UL MAC frame ReTX no. %u " ,
p_mac_lte_info - > ueid , p_mac_lte_info - > reTxCount ) ;
2009-03-16 15:39:52 +00:00
}
2011-11-25 11:19:03 +00:00
retx_reason_ti = proto_tree_add_uint ( mac_lte_tree , hf_mac_lte_context_retx_reason ,
tvb , 0 , 0 , p_mac_lte_info - > isPHICHNACK ) ;
PROTO_ITEM_SET_GENERATED ( retx_reason_ti ) ;
2009-03-16 15:39:52 +00:00
}
2009-03-24 17:28:30 +00:00
if ( p_mac_lte_info - > crcStatusValid ) {
2010-10-18 17:02:19 +00:00
/* Set status */
2010-03-09 01:41:36 +00:00
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_crc_status ,
2013-12-22 21:16:31 +00:00
tvb , 0 , 0 , p_mac_lte_info - > crcStatus ) ;
2009-03-24 17:28:30 +00:00
PROTO_ITEM_SET_GENERATED ( ti ) ;
2010-10-18 17:02:19 +00:00
/* Report non-success */
2013-12-22 21:16:31 +00:00
if ( p_mac_lte_info - > crcStatus ! = crc_success ) {
2013-09-09 00:44:09 +00:00
expert_add_info_format ( pinfo , ti , & ei_mac_lte_context_crc_status ,
2010-10-07 14:44:00 +00:00
" %s Frame has CRC error problem (%s) " ,
( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) ? " UL " : " DL " ,
2013-12-22 21:16:31 +00:00
val_to_str_const ( p_mac_lte_info - > crcStatus ,
2010-10-07 14:44:00 +00:00
crc_status_vals ,
" Unknown " ) ) ;
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
2010-10-07 14:44:00 +00:00
" %s: <CRC %s> UEId=%u %s=%u " ,
2010-03-09 01:41:36 +00:00
( p_mac_lte_info - > direction = = DIRECTION_UPLINK ) ? " UL " : " DL " ,
2013-12-22 21:16:31 +00:00
val_to_str_const ( p_mac_lte_info - > crcStatus ,
2010-10-07 14:44:00 +00:00
crc_status_vals ,
" Unknown " ) ,
2010-03-09 01:41:36 +00:00
p_mac_lte_info - > ueid ,
2010-03-14 17:56:37 +00:00
val_to_str_const ( p_mac_lte_info - > rntiType , rnti_type_vals ,
" Unknown RNTI type " ) ,
2010-03-09 01:41:36 +00:00
p_mac_lte_info - > rnti ) ;
2009-03-23 22:16:25 +00:00
}
}
2013-04-15 20:56:49 +00:00
/* Carrier Id */
ti = proto_tree_add_uint ( context_tree , hf_mac_lte_context_carrier_id ,
tvb , 0 , 0 , p_mac_lte_info - > carrierId ) ;
PROTO_ITEM_SET_GENERATED ( ti ) ;
2013-08-30 04:08:57 +00:00
2010-03-14 17:56:37 +00:00
/* May also have extra Physical layer attributes set for this frame */
show_extra_phy_parameters ( pinfo , tvb , mac_lte_tree , p_mac_lte_info ) ;
2009-02-12 12:08:05 +00:00
/* Set context-info parts of tap struct */
2010-07-13 16:25:34 +00:00
tap_info - > rnti = p_mac_lte_info - > rnti ;
tap_info - > ueid = p_mac_lte_info - > ueid ;
tap_info - > rntiType = p_mac_lte_info - > rntiType ;
tap_info - > isPredefinedData = p_mac_lte_info - > isPredefinedData ;
tap_info - > isPHYRetx = ( p_mac_lte_info - > reTxCount > = 1 ) ;
tap_info - > crcStatusValid = p_mac_lte_info - > crcStatusValid ;
2013-12-22 21:16:31 +00:00
tap_info - > crcStatus = p_mac_lte_info - > crcStatus ;
2010-07-13 16:25:34 +00:00
tap_info - > direction = p_mac_lte_info - > direction ;
2009-02-12 12:08:05 +00:00
2010-09-03 16:45:05 +00:00
tap_info - > time = pinfo - > fd - > abs_ts ;
2009-02-12 12:08:05 +00:00
/* Also set total number of bytes (won't be used for UL/DL-SCH) */
2010-07-13 16:25:34 +00:00
tap_info - > single_number_of_bytes = tvb_length_remaining ( tvb , offset ) ;
2009-02-12 12:08:05 +00:00
2008-12-23 21:00:04 +00:00
/* If we know its predefined data, don't try to decode any further */
2009-03-16 15:39:52 +00:00
if ( p_mac_lte_info - > isPredefinedData ) {
2011-10-04 22:44:31 +00:00
proto_tree_add_item ( mac_lte_tree , hf_mac_lte_predefined_pdu , tvb , offset , - 1 , ENC_NA ) ;
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo ,
2011-08-05 14:40:47 +00:00
" Predefined data (%u bytes%s) " ,
p_mac_lte_info - > length ,
( p_mac_lte_info - > length > tvb_length_remaining ( tvb , offset ) ?
" - truncated " :
" " ) ) ;
2009-02-12 12:08:05 +00:00
/* Queue tap info */
2011-11-08 18:39:11 +00:00
if ( ! pinfo - > flags . in_error_pkt ) {
2010-07-13 16:25:34 +00:00
tap_queue_packet ( mac_lte_tap , pinfo , tap_info ) ;
2009-02-12 12:08:05 +00:00
}
2013-12-11 11:03:29 +00:00
return - 1 ;
2008-12-23 21:00:04 +00:00
}
2009-07-14 13:08:23 +00:00
/* IF CRC status failed, just do decode as raw bytes */
if ( ! global_mac_lte_dissect_crc_failures & &
2010-10-07 14:44:00 +00:00
( p_mac_lte_info - > crcStatusValid & &
2013-12-22 21:16:31 +00:00
( p_mac_lte_info - > crcStatus ! = crc_success ) ) ) {
2009-07-14 13:08:23 +00:00
2011-10-04 22:44:31 +00:00
proto_tree_add_item ( mac_lte_tree , hf_mac_lte_raw_pdu , tvb , offset , - 1 , ENC_NA ) ;
2010-03-09 01:41:36 +00:00
write_pdu_label_and_info ( pdu_ti , NULL , pinfo , " Raw data (%u bytes) " , tvb_length_remaining ( tvb , offset ) ) ;
2009-07-14 13:08:23 +00:00
2010-07-05 10:35:17 +00:00
/* Queue tap info.
TODO : unfortunately DL retx detection won ' t get done if we return here . . . */
2011-11-08 18:39:11 +00:00
if ( ! pinfo - > flags . in_error_pkt ) {
2010-07-13 16:25:34 +00:00
tap_queue_packet ( mac_lte_tap , pinfo , tap_info ) ;
2009-07-14 13:08:23 +00:00
}
2013-12-11 11:03:29 +00:00
return - 1 ;
2009-07-14 13:08:23 +00:00
}
2010-02-08 15:01:08 +00:00
/* Reset this counter */
s_number_of_rlc_pdus_shown = 0 ;
2009-07-14 13:08:23 +00:00
2008-12-23 21:00:04 +00:00
/* Dissect the MAC PDU itself. Format depends upon RNTI type. */
switch ( p_mac_lte_info - > rntiType ) {
case P_RNTI :
/* PCH PDU */
2013-08-08 14:45:45 +00:00
dissect_pch ( tvb , pinfo , mac_lte_tree , pdu_ti , offset , p_mac_lte_info - > direction , tap_info ) ;
2008-12-23 21:00:04 +00:00
break ;
case RA_RNTI :
/* RAR PDU */
2010-07-13 16:25:34 +00:00
dissect_rar ( tvb , pinfo , mac_lte_tree , pdu_ti , offset , p_mac_lte_info , tap_info ) ;
2008-12-23 21:00:04 +00:00
break ;
case C_RNTI :
2009-09-02 16:39:39 +00:00
case SPS_RNTI :
2008-12-23 21:00:04 +00:00
/* Can be UL-SCH or DL-SCH */
2009-10-22 17:22:27 +00:00
dissect_ulsch_or_dlsch ( tvb , pinfo , mac_lte_tree , pdu_ti , offset ,
2010-07-13 16:25:34 +00:00
p_mac_lte_info - > direction , p_mac_lte_info , tap_info ,
2013-12-11 11:03:29 +00:00
retx_ti , context_tree , pdu_instance ) ;
2008-12-23 21:00:04 +00:00
break ;
case SI_RNTI :
/* BCH over DL-SCH */
2010-03-09 01:41:36 +00:00
dissect_bch ( tvb , pinfo , mac_lte_tree , pdu_ti , offset , p_mac_lte_info ) ;
2008-12-23 21:00:04 +00:00
break ;
2011-12-22 18:05:48 +00:00
case M_RNTI :
/* MCH PDU */
dissect_mch ( tvb , pinfo , mac_lte_tree , pdu_ti , offset , p_mac_lte_info ) ;
break ;
2008-12-23 21:00:04 +00:00
case NO_RNTI :
/* Must be BCH over BCH... */
2010-03-09 01:41:36 +00:00
dissect_bch ( tvb , pinfo , mac_lte_tree , pdu_ti , offset , p_mac_lte_info ) ;
2008-12-23 21:00:04 +00:00
break ;
default :
break ;
}
2009-02-12 12:08:05 +00:00
/* Queue tap info */
2010-07-13 16:25:34 +00:00
tap_queue_packet ( mac_lte_tap , pinfo , tap_info ) ;
2013-12-11 11:03:29 +00:00
return - 1 ;
2008-12-23 21:00:04 +00:00
}
2009-08-01 09:52:12 +00:00
2009-09-18 16:27:02 +00:00
2012-01-14 20:14:43 +00:00
/* Initializes the hash tables each time a new
2009-08-01 09:52:12 +00:00
* file is loaded or re - loaded in wireshark */
2012-03-16 02:00:29 +00:00
static void mac_lte_init_protocol ( void )
2009-08-01 09:52:12 +00:00
{
/* Destroy any existing tables. */
if ( mac_lte_msg3_hash ) {
g_hash_table_destroy ( mac_lte_msg3_hash ) ;
}
if ( mac_lte_cr_result_hash ) {
g_hash_table_destroy ( mac_lte_cr_result_hash ) ;
}
2009-10-13 13:36:58 +00:00
if ( mac_lte_dl_harq_hash ) {
g_hash_table_destroy ( mac_lte_dl_harq_hash ) ;
}
if ( mac_lte_dl_harq_result_hash ) {
g_hash_table_destroy ( mac_lte_dl_harq_result_hash ) ;
}
2009-11-25 16:00:58 +00:00
if ( mac_lte_ul_harq_hash ) {
g_hash_table_destroy ( mac_lte_ul_harq_hash ) ;
}
if ( mac_lte_ul_harq_result_hash ) {
g_hash_table_destroy ( mac_lte_ul_harq_result_hash ) ;
}
2009-12-02 17:46:27 +00:00
if ( mac_lte_ue_sr_state ) {
g_hash_table_destroy ( mac_lte_ue_sr_state ) ;
}
if ( mac_lte_sr_request_hash ) {
g_hash_table_destroy ( mac_lte_sr_request_hash ) ;
}
2011-04-15 23:32:44 +00:00
if ( mac_lte_tti_info_result_hash ) {
g_hash_table_destroy ( mac_lte_tti_info_result_hash ) ;
}
2012-10-12 03:00:38 +00:00
if ( mac_lte_ue_channels_hash ) {
g_hash_table_destroy ( mac_lte_ue_channels_hash ) ;
}
2013-09-27 16:18:09 +00:00
if ( mac_lte_drx_ue_state ) {
g_hash_table_destroy ( mac_lte_drx_ue_state ) ;
2013-08-30 04:08:57 +00:00
}
2013-09-27 16:18:09 +00:00
if ( mac_lte_drx_frame_result ) {
g_hash_table_destroy ( mac_lte_drx_frame_result ) ;
2013-08-30 04:08:57 +00:00
}
2011-04-15 23:32:44 +00:00
2011-04-20 10:23:41 +00:00
/* Reset structs */
memset ( & UL_tti_info , 0 , sizeof ( UL_tti_info ) ) ;
UL_tti_info . subframe = 0xff ; /* Invalid value */
memset ( & DL_tti_info , 0 , sizeof ( DL_tti_info ) ) ;
DL_tti_info . subframe = 0xff ; /* Invalid value */
2009-10-13 13:36:58 +00:00
2009-08-01 09:52:12 +00:00
/* Now create them over */
2009-10-13 13:36:58 +00:00
mac_lte_msg3_hash = g_hash_table_new ( mac_lte_rnti_hash_func , mac_lte_rnti_hash_equal ) ;
mac_lte_cr_result_hash = g_hash_table_new ( mac_lte_framenum_hash_func , mac_lte_framenum_hash_equal ) ;
mac_lte_dl_harq_hash = g_hash_table_new ( mac_lte_rnti_hash_func , mac_lte_rnti_hash_equal ) ;
mac_lte_dl_harq_result_hash = g_hash_table_new ( mac_lte_framenum_hash_func , mac_lte_framenum_hash_equal ) ;
2009-11-25 16:00:58 +00:00
mac_lte_ul_harq_hash = g_hash_table_new ( mac_lte_rnti_hash_func , mac_lte_rnti_hash_equal ) ;
mac_lte_ul_harq_result_hash = g_hash_table_new ( mac_lte_framenum_hash_func , mac_lte_framenum_hash_equal ) ;
2009-12-02 17:46:27 +00:00
mac_lte_ue_sr_state = g_hash_table_new ( mac_lte_rnti_hash_func , mac_lte_rnti_hash_equal ) ;
mac_lte_sr_request_hash = g_hash_table_new ( mac_lte_framenum_hash_func , mac_lte_framenum_hash_equal ) ;
2011-04-15 23:32:44 +00:00
mac_lte_tti_info_result_hash = g_hash_table_new ( mac_lte_framenum_hash_func , mac_lte_framenum_hash_equal ) ;
2012-10-12 03:00:38 +00:00
mac_lte_ue_channels_hash = g_hash_table_new ( mac_lte_rnti_hash_func , mac_lte_rnti_hash_equal ) ;
2013-08-30 04:08:57 +00:00
2013-09-27 16:18:09 +00:00
mac_lte_drx_ue_state = g_hash_table_new ( mac_lte_rnti_hash_func , mac_lte_rnti_hash_equal ) ;
2013-12-11 11:03:29 +00:00
mac_lte_drx_frame_result = g_hash_table_new ( mac_lte_framenum_instance_hash_func , mac_lte_framenum_instance_hash_equal ) ;
2009-08-01 09:52:12 +00:00
}
2013-10-02 16:51:10 +00:00
/* Callback used as part of configuring a channel mapping using UAT */
2010-10-29 21:11:33 +00:00
static void * lcid_drb_mapping_copy_cb ( void * dest , const void * orig , size_t len _U_ )
2009-09-18 16:27:02 +00:00
{
2013-03-08 06:06:56 +00:00
const lcid_drb_mapping_t * o = ( const lcid_drb_mapping_t * ) orig ;
lcid_drb_mapping_t * d = ( lcid_drb_mapping_t * ) dest ;
2009-09-18 16:27:02 +00:00
/* Copy all items over */
2012-10-06 15:52:14 +00:00
d - > lcid = o - > lcid ;
2009-09-18 16:27:02 +00:00
d - > drbid = o - > drbid ;
d - > channel_type = o - > channel_type ;
return d ;
}
2013-10-02 16:51:10 +00:00
/*************************************************************************/
/* These functions get called from outside of this module, i.e. from RRC */
2012-10-12 03:00:38 +00:00
/* Set LCID -> RLC channel mappings from signalling protocol (i.e. RRC or similar). */
2013-06-18 21:02:00 +00:00
void set_mac_lte_channel_mapping ( drb_mapping_t * drb_mapping )
2012-10-06 15:52:14 +00:00
{
2012-10-12 03:00:38 +00:00
ue_dynamic_drb_mappings_t * ue_mappings ;
2013-06-18 21:02:00 +00:00
guint8 lcid = 0 ;
2012-10-12 03:00:38 +00:00
2013-06-18 21:02:00 +00:00
/* Check lcid range */
if ( drb_mapping - > lcid_present ) {
lcid = drb_mapping - > lcid ;
2012-10-06 15:52:14 +00:00
2013-06-18 21:02:00 +00:00
/* Ignore if LCID is out of range */
if ( ( lcid < 3 ) | | ( lcid > 10 ) ) {
return ;
}
2012-10-06 15:52:14 +00:00
}
2012-10-12 03:00:38 +00:00
/* Look for existing UE entry */
2013-06-18 21:02:00 +00:00
ue_mappings = ( ue_dynamic_drb_mappings_t * ) g_hash_table_lookup ( mac_lte_ue_channels_hash ,
GUINT_TO_POINTER ( ( guint ) drb_mapping - > ueid ) ) ;
2012-10-12 03:00:38 +00:00
if ( ! ue_mappings ) {
2013-06-18 21:02:00 +00:00
/* If not found, create & add to table */
2013-08-30 14:49:55 +00:00
ue_mappings = wmem_new0 ( wmem_file_scope ( ) , ue_dynamic_drb_mappings_t ) ;
2013-06-18 21:02:00 +00:00
g_hash_table_insert ( mac_lte_ue_channels_hash ,
GUINT_TO_POINTER ( ( guint ) drb_mapping - > ueid ) ,
ue_mappings ) ;
}
/* If lcid wasn't supplied, need to try to look up from drbid */
if ( ( lcid = = 0 ) & & ( drb_mapping - > drbid < 32 ) ) {
lcid = ue_mappings - > drb_to_lcid_mappings [ drb_mapping - > drbid ] ;
}
if ( lcid = = 0 ) {
/* Still no lcid - give up */
return ;
2012-10-12 03:00:38 +00:00
}
2012-10-06 15:52:14 +00:00
/* Set array entry */
2012-10-12 03:00:38 +00:00
ue_mappings - > mapping [ lcid ] . valid = TRUE ;
2013-06-18 21:02:00 +00:00
ue_mappings - > mapping [ lcid ] . drbid = drb_mapping - > drbid ;
ue_mappings - > drb_to_lcid_mappings [ drb_mapping - > drbid ] = lcid ;
if ( drb_mapping - > ul_priority_present ) {
ue_mappings - > mapping [ lcid ] . ul_priority = drb_mapping - > ul_priority ;
}
2012-10-06 15:52:14 +00:00
2013-06-18 21:02:00 +00:00
/* Fill in available RLC info */
if ( drb_mapping - > rlcMode_present ) {
switch ( drb_mapping - > rlcMode ) {
case RLC_AM_MODE :
ue_mappings - > mapping [ lcid ] . channel_type = rlcAM ;
break ;
case RLC_UM_MODE :
if ( drb_mapping - > um_sn_length_present ) {
if ( drb_mapping - > um_sn_length = = 5 ) {
ue_mappings - > mapping [ lcid ] . channel_type = rlcUM5 ;
}
else {
ue_mappings - > mapping [ lcid ] . channel_type = rlcUM10 ;
}
break ;
}
2012-10-06 15:52:14 +00:00
2013-06-18 21:02:00 +00:00
default :
break ;
}
2012-10-06 15:52:14 +00:00
}
}
/* Return the configured UL priority for the channel */
2012-10-12 03:00:38 +00:00
static guint8 get_mac_lte_channel_priority ( guint16 ueid , guint8 lcid ,
2012-10-06 15:52:14 +00:00
guint8 direction )
{
2012-10-12 03:00:38 +00:00
ue_dynamic_drb_mappings_t * ue_mappings ;
2012-10-06 15:52:14 +00:00
/* Priority only affects UL */
if ( direction = = DIRECTION_DOWNLINK ) {
return 0 ;
}
2012-10-12 03:00:38 +00:00
/* Look up the mappings for this UE */
2013-03-08 06:06:56 +00:00
ue_mappings = ( ue_dynamic_drb_mappings_t * ) g_hash_table_lookup ( mac_lte_ue_channels_hash , GUINT_TO_POINTER ( ( guint ) ueid ) ) ;
2012-10-12 03:00:38 +00:00
if ( ! ue_mappings ) {
return 0 ;
}
2012-10-06 15:52:14 +00:00
/* Won't report value if channel not configured */
2012-10-12 03:00:38 +00:00
if ( ! ue_mappings - > mapping [ lcid ] . valid ) {
2012-10-06 15:52:14 +00:00
return 0 ;
}
else {
2012-10-12 03:00:38 +00:00
return ue_mappings - > mapping [ lcid ] . ul_priority ;
2012-10-06 15:52:14 +00:00
}
}
2013-09-23 17:34:18 +00:00
/* Configure the DRX state for this UE (from RRC) */
2013-08-30 04:08:57 +00:00
void set_mac_lte_drx_config ( guint16 ueid , drx_config_t * drx_config , packet_info * pinfo )
{
if ( global_mac_lte_show_drx & & ! pinfo - > fd - > flags . visited ) {
2013-09-27 16:18:09 +00:00
drx_state_t * ue_state ;
2013-09-23 17:34:18 +00:00
guint32 previousFrameNum = 0 ;
2013-08-30 04:08:57 +00:00
2013-09-05 13:11:54 +00:00
/* Find or create config/timing struct for this UE */
2013-09-27 16:18:09 +00:00
ue_state = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_ue_state , GUINT_TO_POINTER ( ( guint ) ueid ) ) ;
if ( ue_state = = NULL ) {
ue_state = ( drx_state_t * ) wmem_new ( wmem_file_scope ( ) , drx_state_t ) ;
g_hash_table_insert ( mac_lte_drx_ue_state , GUINT_TO_POINTER ( ( guint ) ueid ) , ue_state ) ;
2013-09-23 17:34:18 +00:00
}
else {
2013-10-16 20:35:08 +00:00
previousFrameNum = ue_state - > config . frameNum ;
2013-08-30 04:08:57 +00:00
}
2013-09-27 16:18:09 +00:00
/* Clearing state when new config comes in... */
2013-10-22 16:52:45 +00:00
init_drx_ue_state ( ue_state , TRUE ) ;
2013-09-27 16:18:09 +00:00
2013-08-30 04:08:57 +00:00
/* Copy in new config */
2013-09-27 16:18:09 +00:00
ue_state - > config = * drx_config ;
2013-09-23 17:34:18 +00:00
/* Remember frame when current settings set */
2013-09-27 16:18:09 +00:00
ue_state - > config . frameNum = pinfo - > fd - > num ;
2013-09-23 17:34:18 +00:00
/* Also remember any previous config frame number */
2013-09-27 16:18:09 +00:00
ue_state - > config . previousFrameNum = previousFrameNum ;
2013-08-30 04:08:57 +00:00
}
}
/* Release DRX config for this UE */
2013-09-27 16:18:09 +00:00
void set_mac_lte_drx_config_release ( guint16 ueid , packet_info * pinfo )
2013-08-30 04:08:57 +00:00
{
2013-09-27 16:18:09 +00:00
if ( global_mac_lte_show_drx & & ! pinfo - > fd - > flags . visited ) {
/* Find or create config struct for table entry */
drx_state_t * ue_state = ( drx_state_t * ) g_hash_table_lookup ( mac_lte_drx_ue_state , GUINT_TO_POINTER ( ( guint ) ueid ) ) ;
if ( ue_state ! = NULL ) {
g_hash_table_remove ( mac_lte_drx_ue_state , GUINT_TO_POINTER ( ( guint ) ueid ) ) ;
/* TODO: free entry? */
}
2013-08-30 04:08:57 +00:00
}
}
2013-09-27 16:18:09 +00:00
2012-10-06 15:52:14 +00:00
/* Function to be called from outside this module (e.g. in a plugin) to get per-packet data */
mac_lte_info * get_mac_lte_proto_data ( packet_info * pinfo )
{
2013-11-23 02:20:13 +00:00
return ( mac_lte_info * ) p_get_proto_data ( wmem_file_scope ( ) , pinfo , proto_mac_lte , 0 ) ;
2012-10-06 15:52:14 +00:00
}
/* Function to be called from outside this module (e.g. in a plugin) to set per-packet data */
void set_mac_lte_proto_data ( packet_info * pinfo , mac_lte_info * p_mac_lte_info )
{
2013-11-23 02:20:13 +00:00
p_add_proto_data ( wmem_file_scope ( ) , pinfo , proto_mac_lte , 0 , p_mac_lte_info ) ;
2012-10-06 15:52:14 +00:00
}
2009-09-18 16:27:02 +00:00
2008-12-23 21:00:04 +00:00
void proto_register_mac_lte ( void )
{
static hf_register_info hf [ ] =
{
/**********************************/
/* Items for decoding context */
2010-03-09 01:41:36 +00:00
{ & hf_mac_lte_context ,
{ " Context " ,
" mac-lte.context " , FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_context_radio_type ,
{ " Radio Type " ,
" mac-lte.radio-type " , FT_UINT8 , BASE_DEC , VALS ( radio_type_vals ) , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_context_direction ,
{ " Direction " ,
" mac-lte.direction " , FT_UINT8 , BASE_DEC , VALS ( direction_vals ) , 0x0 ,
" Direction of message " , HFILL
}
} ,
{ & hf_mac_lte_context_rnti ,
{ " RNTI " ,
" mac-lte.rnti " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
" RNTI associated with message " , HFILL
}
} ,
{ & hf_mac_lte_context_rnti_type ,
{ " RNTI Type " ,
" mac-lte.rnti-type " , FT_UINT8 , BASE_DEC , VALS ( rnti_type_vals ) , 0x0 ,
" Type of RNTI associated with message " , HFILL
}
} ,
{ & hf_mac_lte_context_ueid ,
{ " UEId " ,
" mac-lte.ueid " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
" User Equipment Identifier associated with message " , HFILL
}
} ,
2011-11-21 16:18:33 +00:00
{ & hf_mac_lte_context_sysframe_number ,
{ " System Frame Number " ,
" mac-lte.sfn " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
" System Frame Number associated with message " , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_context_subframe_number ,
{ " Subframe " ,
" mac-lte.subframe " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
2010-01-25 16:45:46 +00:00
" Subframe number associated with message " , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2010-04-22 13:54:30 +00:00
{ & hf_mac_lte_context_grant_subframe_number ,
{ " Grant Subframe " ,
" mac-lte.grant-subframe " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
2012-03-08 04:49:59 +00:00
" Subframe when grant for this PDU was received " , HFILL
2010-04-22 13:54:30 +00:00
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_context_predefined_frame ,
{ " Predefined frame " ,
" mac-lte.is-predefined-frame " , FT_UINT8 , BASE_DEC , VALS ( predefined_frame_vals ) , 0x0 ,
" Predefined test frame (or real MAC PDU) " , HFILL
}
} ,
{ & hf_mac_lte_context_length ,
{ " Length of frame " ,
" mac-lte.length " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
" Original length of frame (including SDUs and padding) " , HFILL
}
} ,
2009-08-26 09:13:14 +00:00
{ & hf_mac_lte_context_ul_grant_size ,
{ " Uplink grant size " ,
" mac-lte.ul-grant-size " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
" Uplink grant size (in bytes) " , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_context_bch_transport_channel ,
{ " Transport channel " ,
" mac-lte.bch-transport-channel " , FT_UINT8 , BASE_DEC , VALS ( bch_transport_channel_vals ) , 0x0 ,
" Transport channel BCH data was carried on " , HFILL
}
} ,
2009-03-16 15:39:52 +00:00
{ & hf_mac_lte_context_retx_count ,
{ " ReTX count " ,
2009-03-23 22:16:25 +00:00
" mac-lte.retx-count " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
2009-03-16 15:39:52 +00:00
" Number of times this PDU has been retransmitted " , HFILL
2011-11-25 11:19:03 +00:00
}
} ,
{ & hf_mac_lte_context_retx_reason ,
{ " ReTX reason " ,
" mac-lte.retx-reason " , FT_UINT8 , BASE_DEC , VALS ( ul_retx_grant_vals ) , 0x0 ,
" Type of UL ReTx grant " , HFILL
2009-03-16 15:39:52 +00:00
}
} ,
2009-03-23 22:16:25 +00:00
{ & hf_mac_lte_context_crc_status ,
{ " CRC Status " ,
" mac-lte.crc-status " , FT_UINT8 , BASE_DEC , VALS ( crc_status_vals ) , 0x0 ,
" CRC Status as reported by PHY " , HFILL
}
} ,
2013-04-15 20:56:49 +00:00
{ & hf_mac_lte_context_carrier_id ,
{ " Carrier Id " ,
" mac-lte.carrier-id " , FT_UINT8 , BASE_DEC , VALS ( carrier_id_vals ) , 0x0 ,
NULL , HFILL
}
} ,
2009-10-26 15:39:00 +00:00
{ & hf_mac_lte_context_rapid ,
{ " RAPID " ,
" mac-lte.preamble-sent.rapid " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
" RAPID sent in RACH preamble " , HFILL
}
} ,
{ & hf_mac_lte_context_rach_attempt_number ,
{ " RACH Attempt Number " ,
2009-10-26 16:39:46 +00:00
" mac-lte.preamble-sent.attempt " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
2010-09-23 21:46:31 +00:00
NULL , HFILL
2009-10-26 15:39:00 +00:00
}
} ,
2008-12-23 21:00:04 +00:00
2011-04-15 23:32:44 +00:00
{ & hf_mac_lte_ues_ul_per_tti ,
{ " UL UE in TTI " ,
" mac-lte.ul-tti-count " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
" In this TTI, this is the nth UL grant " , HFILL
}
} ,
{ & hf_mac_lte_ues_dl_per_tti ,
{ " DL UE in TTI " ,
" mac-lte.dl-tti-count " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
" In this TTI, this is the nth DL PDU " , HFILL
}
} ,
2010-03-14 17:56:37 +00:00
/* Extra PHY context */
{ & hf_mac_lte_context_phy_ul ,
{ " UL PHY attributes " ,
" mac-lte.ul-phy " , FT_STRING , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_ul_modulation_type ,
{ " Modulation type " ,
" mac-lte.ul-phy.modulation-type " , FT_UINT8 , BASE_DEC , VALS ( modulation_type_vals ) , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_ul_tbs_index ,
{ " TBs Index " ,
" mac-lte.ul-phy.tbs-index " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_ul_resource_block_length ,
{ " Resource Block Length " ,
" mac-lte.ul-phy.resource-block-length " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_ul_resource_block_start ,
{ " Resource Block Start " ,
" mac-lte.ul-phy.resource-block-start " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
2010-12-05 23:34:11 +00:00
{ & hf_mac_lte_context_phy_ul_harq_id ,
{ " HARQ Id " ,
" mac-lte.ul-phy.harq-id " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_ul_ndi ,
{ " NDI " ,
" mac-lte.ul-phy.ndi " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
" UL New Data Indicator " , HFILL
}
} ,
2010-03-14 17:56:37 +00:00
{ & hf_mac_lte_context_phy_dl ,
{ " DL PHY attributes " ,
" mac-lte.dl-phy " , FT_STRING , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_dl_dci_format ,
{ " DCI format " ,
" mac-lte.dl-phy.dci-format " , FT_UINT8 , BASE_DEC , VALS ( dci_format_vals ) , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_dl_resource_allocation_type ,
{ " Resource Allocation Type " ,
" mac-lte.dl-phy.resource-allocation-type " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_dl_aggregation_level ,
{ " Aggregation Level " ,
" mac-lte.dl-phy.aggregation-level " , FT_UINT8 , BASE_DEC , VALS ( aggregation_level_vals ) , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_dl_mcs_index ,
{ " MCS Index " ,
" mac-lte.dl-phy.mcs-index " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_dl_redundancy_version_index ,
{ " RV Index " ,
" mac-lte.dl-phy.rv-index " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
2011-01-27 16:09:24 +00:00
{ & hf_mac_lte_context_phy_dl_retx ,
{ " DL Retx " ,
2012-03-16 02:00:29 +00:00
" mac-lte.dl-phy.dl-retx " , FT_BOOLEAN , BASE_NONE , NULL , 0x0 ,
2011-01-27 16:09:24 +00:00
NULL , HFILL
}
} ,
2010-03-14 17:56:37 +00:00
{ & hf_mac_lte_context_phy_dl_resource_block_length ,
{ " RB Length " ,
" mac-lte.dl-phy.rb-length " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
2010-11-02 15:20:38 +00:00
{ & hf_mac_lte_context_phy_dl_harq_id ,
{ " HARQ Id " ,
" mac-lte.dl-phy.harq-id " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_context_phy_dl_ndi ,
{ " NDI " ,
" mac-lte.dl-phy.ndi " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
" New Data Indicator " , HFILL
}
} ,
2010-12-05 23:34:11 +00:00
{ & hf_mac_lte_context_phy_dl_tb ,
{ " TB " ,
" mac-lte.dl-phy.tb " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
" Transport Block (antenna #) " , HFILL
}
} ,
2010-03-14 17:56:37 +00:00
2009-10-26 15:39:00 +00:00
/* Out-of-band events */
{ & hf_mac_lte_oob_send_preamble ,
2011-07-28 16:52:02 +00:00
{ " PRACH " ,
2010-03-22 19:20:37 +00:00
" mac-lte.preamble-sent " , FT_STRING , BASE_NONE , NULL , 0x0 ,
2009-10-26 15:39:00 +00:00
NULL , HFILL
}
} ,
2012-03-25 23:46:01 +00:00
{ & hf_mac_lte_number_of_srs ,
{ " Number of SRs " ,
" mac-lte.sr-req.count " , FT_UINT32 , BASE_DEC , 0 , 0x0 ,
" Number of UEs doing SR in this frame " , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
/*******************************************/
/* MAC shared channel header fields */
2010-03-03 11:57:21 +00:00
{ & hf_mac_lte_ulsch ,
{ " UL-SCH " ,
" mac-lte.ulsch " , FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_ulsch_header ,
{ " UL-SCH Header " ,
" mac-lte.ulsch.header " , FT_STRING , BASE_NONE , NULL , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_dlsch_header ,
{ " DL-SCH Header " ,
" mac-lte.dlsch.header " , FT_STRING , BASE_NONE , NULL , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2010-03-03 11:57:21 +00:00
{ & hf_mac_lte_dlsch ,
{ " DL-SCH " ,
" mac-lte.dlsch " , FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_sch_subheader ,
{ " SCH sub-header " ,
" mac-lte.sch.subheader " , FT_STRING , BASE_NONE , NULL , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2011-12-22 18:05:48 +00:00
{ & hf_mac_lte_mch ,
{ " MCH " ,
" mac-lte.mch " , FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_mch_header ,
{ " MCH Header " ,
" mac-lte.mch.header " , FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_mch_subheader ,
{ " MCH sub-header " ,
" mac-lte.mch.subheader " , FT_STRING , BASE_NONE , NULL , 0x0 ,
NULL , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_sch_reserved ,
{ " SCH reserved bits " ,
" mac-lte.sch.reserved " , FT_UINT8 , BASE_HEX , NULL , 0xc0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_sch_extended ,
{ " Extension " ,
" mac-lte.sch.extended " , FT_UINT8 , BASE_HEX , 0 , 0x20 ,
" Extension - i.e. further headers after this one " , HFILL
}
} ,
{ & hf_mac_lte_dlsch_lcid ,
{ " LCID " ,
" mac-lte.dlsch.lcid " , FT_UINT8 , BASE_HEX , VALS ( dlsch_lcid_vals ) , 0x1f ,
" DL-SCH Logical Channel Identifier " , HFILL
}
} ,
{ & hf_mac_lte_ulsch_lcid ,
{ " LCID " ,
" mac-lte.ulsch.lcid " , FT_UINT8 , BASE_HEX , VALS ( ulsch_lcid_vals ) , 0x1f ,
" UL-SCH Logical Channel Identifier " , HFILL
}
} ,
{ & hf_mac_lte_sch_format ,
{ " Format " ,
" mac-lte.sch.format " , FT_UINT8 , BASE_HEX , VALS ( format_vals ) , 0x80 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_sch_length ,
{ " Length " ,
" mac-lte.sch.length " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
" Length of MAC SDU or MAC control element " , HFILL
}
} ,
2011-12-22 18:05:48 +00:00
{ & hf_mac_lte_mch_reserved ,
{ " MCH reserved bits " ,
" mac-lte.mch.reserved " , FT_UINT8 , BASE_HEX , NULL , 0xc0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_mch_extended ,
{ " Extension " ,
" mac-lte.mch.extended " , FT_UINT8 , BASE_HEX , 0 , 0x20 ,
" Extension - i.e. further headers after this one " , HFILL
}
} ,
{ & hf_mac_lte_mch_lcid ,
{ " LCID " ,
" mac-lte.mch.lcid " , FT_UINT8 , BASE_HEX , VALS ( mch_lcid_vals ) , 0x1f ,
" MCH Logical Channel Identifier " , HFILL
}
} ,
{ & hf_mac_lte_mch_format ,
{ " Format " ,
" mac-lte.mch.format " , FT_UINT8 , BASE_HEX , VALS ( format_vals ) , 0x80 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_mch_length ,
{ " Length " ,
" mac-lte.mch.length " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
" Length of MAC SDU or MAC control element " , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_sch_header_only ,
{ " MAC PDU Header only " ,
" mac-lte.sch.header-only " , FT_UINT8 , BASE_DEC , VALS ( header_only_vals ) , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2011-12-22 18:05:48 +00:00
{ & hf_mac_lte_mch_header_only ,
{ " MAC PDU Header only " ,
" mac-lte.mch.header-only " , FT_UINT8 , BASE_DEC , VALS ( header_only_vals ) , 0x0 ,
NULL , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
/********************************/
/* Data */
{ & hf_mac_lte_sch_sdu ,
{ " SDU " ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
" mac-lte.sch.sdu " , FT_BYTES , BASE_NONE , 0 , 0x0 ,
2008-12-23 21:00:04 +00:00
" Shared channel SDU " , HFILL
}
} ,
2011-12-22 18:05:48 +00:00
{ & hf_mac_lte_mch_sdu ,
{ " SDU " ,
" mac-lte.mch.sdu " , FT_BYTES , BASE_NONE , 0 , 0x0 ,
" Multicast channel SDU " , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_bch_pdu ,
{ " BCH PDU " ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
" mac-lte.bch.pdu " , FT_BYTES , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_pch_pdu ,
{ " PCH PDU " ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
" mac-lte.pch.pdu " , FT_BYTES , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_predefined_pdu ,
{ " Predefined data " ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
" mac-lte.predefined-data " , FT_BYTES , BASE_NONE , 0 , 0x0 ,
2008-12-23 21:00:04 +00:00
" Predefined test data " , HFILL
}
} ,
2009-07-14 13:08:23 +00:00
{ & hf_mac_lte_raw_pdu ,
{ " Raw data " ,
" mac-lte.raw-data " , FT_BYTES , BASE_NONE , 0 , 0x0 ,
2010-10-07 14:44:00 +00:00
" Raw bytes of PDU (e.g. if CRC error) " , HFILL
2009-07-14 13:08:23 +00:00
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_padding_data ,
{ " Padding data " ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
" mac-lte.padding-data " , FT_BYTES , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2009-05-01 14:23:47 +00:00
{ & hf_mac_lte_padding_length ,
{ " Padding length " ,
2009-06-11 13:55:49 +00:00
" mac-lte.padding-length " , FT_INT32 , BASE_DEC , 0 , 0x0 ,
2009-06-04 15:08:56 +00:00
" Length of padding data not included at end of frame " , HFILL
2009-05-01 14:23:47 +00:00
}
} ,
2008-12-23 21:00:04 +00:00
/*********************************/
/* RAR fields */
2009-04-20 16:46:46 +00:00
{ & hf_mac_lte_rar ,
{ " RAR " ,
" mac-lte.rar " , FT_NONE , BASE_NONE , NULL , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2009-04-20 16:46:46 +00:00
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_rar_headers ,
{ " RAR Headers " ,
" mac-lte.rar.headers " , FT_STRING , BASE_NONE , NULL , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_rar_header ,
{ " RAR Header " ,
" mac-lte.rar.header " , FT_STRING , BASE_NONE , NULL , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_rar_extension ,
{ " Extension " ,
" mac-lte.rar.e " , FT_UINT8 , BASE_HEX , 0 , 0x80 ,
" Extension - i.e. further RAR headers after this one " , HFILL
}
} ,
{ & hf_mac_lte_rar_t ,
{ " Type " ,
" mac-lte.rar.t " , FT_UINT8 , BASE_HEX , VALS ( rar_type_vals ) , 0x40 ,
" Type field indicating whether the payload is RAPID or BI " , HFILL
}
} ,
{ & hf_mac_lte_rar_bi ,
{ " BI " ,
" mac-lte.rar.bi " , FT_UINT8 , BASE_HEX , VALS ( rar_bi_vals ) , 0x0f ,
" Backoff Indicator (ms) " , HFILL
}
} ,
{ & hf_mac_lte_rar_rapid ,
{ " RAPID " ,
2009-04-30 13:18:56 +00:00
" mac-lte.rar.rapid " , FT_UINT8 , BASE_HEX_DEC , 0 , 0x3f ,
2008-12-23 21:00:04 +00:00
" Random Access Preamble IDentifier " , HFILL
}
} ,
2013-02-16 00:05:37 +00:00
{ & hf_mac_lte_rar_no_of_rapids ,
{ " Number of RAPIDs " ,
" mac-lte.rar.no-of-rapids " , FT_UINT8 , BASE_DEC , 0 , 0x0 ,
" Number of RAPIDs in RAR PDU " , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_rar_reserved ,
{ " Reserved " ,
" mac-lte.rar.reserved " , FT_UINT8 , BASE_HEX , 0 , 0x30 ,
" Reserved bits in RAR header - should be 0 " , HFILL
}
} ,
{ & hf_mac_lte_rar_body ,
{ " RAR Body " ,
" mac-lte.rar.body " , FT_STRING , BASE_NONE , NULL , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_rar_reserved2 ,
{ " Reserved " ,
" mac-lte.rar.reserved2 " , FT_UINT8 , BASE_HEX , 0 , 0x80 ,
" Reserved bit in RAR body - should be 0 " , HFILL
}
} ,
{ & hf_mac_lte_rar_ta ,
{ " Timing Advance " ,
" mac-lte.rar.ta " , FT_UINT16 , BASE_DEC , 0 , 0x7ff0 ,
" Required adjustment to uplink transmission timing " , HFILL
}
} ,
{ & hf_mac_lte_rar_ul_grant ,
{ " UL Grant " ,
" mac-lte.rar.ul-grant " , FT_UINT24 , BASE_DEC , 0 , 0x0fffff ,
2009-04-27 11:12:01 +00:00
" Size of UL Grant " , HFILL
}
} ,
{ & hf_mac_lte_rar_ul_grant_hopping ,
{ " Hopping Flag " ,
" mac-lte.rar.ul-grant.hopping " , FT_UINT8 , BASE_DEC , 0 , 0x08 ,
2010-01-25 16:45:46 +00:00
NULL , HFILL
2009-04-27 11:12:01 +00:00
}
} ,
{ & hf_mac_lte_rar_ul_grant_fsrba ,
{ " Fixed sized resource block assignment " ,
2009-06-04 15:08:56 +00:00
" mac-lte.rar.ul-grant.fsrba " , FT_UINT16 , BASE_DEC , 0 , 0x07fe ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2009-04-27 11:12:01 +00:00
}
} ,
{ & hf_mac_lte_rar_ul_grant_tmcs ,
{ " Truncated Modulation and coding scheme " ,
2009-06-04 15:08:56 +00:00
" mac-lte.rar.ul-grant.tmcs " , FT_UINT16 , BASE_DEC , 0 , 0x01e0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2009-04-27 11:12:01 +00:00
}
} ,
{ & hf_mac_lte_rar_ul_grant_tcsp ,
{ " TPC command for scheduled PUSCH " ,
2009-06-04 15:08:56 +00:00
" mac-lte.rar.ul-grant.tcsp " , FT_UINT8 , BASE_DEC , 0 , 0x01c ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2009-04-27 11:12:01 +00:00
}
} ,
{ & hf_mac_lte_rar_ul_grant_ul_delay ,
{ " UL Delay " ,
2009-06-04 15:08:56 +00:00
" mac-lte.rar.ul-grant.ul-delay " , FT_UINT8 , BASE_DEC , 0 , 0x02 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2009-04-27 11:12:01 +00:00
}
} ,
{ & hf_mac_lte_rar_ul_grant_cqi_request ,
{ " CQI Request " ,
2009-06-04 15:08:56 +00:00
" mac-lte.rar.ul-grant.cqi-request " , FT_UINT8 , BASE_DEC , 0 , 0x01 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
{ & hf_mac_lte_rar_temporary_crnti ,
{ " Temporary C-RNTI " ,
" mac-lte.rar.temporary-crnti " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
/**********************/
/* Control PDU fields */
2009-06-11 13:55:49 +00:00
{ & hf_mac_lte_control_bsr ,
{ " BSR " ,
" mac-lte.control.bsr " , FT_STRING , BASE_NONE , 0 , 0x0 ,
" Buffer Status Report " , HFILL
}
} ,
{ & hf_mac_lte_control_bsr_lcg_id ,
2008-12-23 21:00:04 +00:00
{ " Logical Channel Group ID " ,
2009-06-11 13:55:49 +00:00
" mac-lte.control.bsr.lcg-id " , FT_UINT8 , BASE_DEC , 0 , 0xc0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2009-10-25 23:03:11 +00:00
{ & hf_mac_lte_control_short_bsr_buffer_size ,
2008-12-23 21:00:04 +00:00
{ " Buffer Size " ,
2012-04-18 16:55:06 +00:00
" mac-lte.control.bsr.buffer-size " , FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & buffer_size_vals_ext , 0x3f ,
2008-12-23 21:00:04 +00:00
" Buffer Size available in all channels in group " , HFILL
}
} ,
2009-10-25 23:03:11 +00:00
{ & hf_mac_lte_control_long_bsr_buffer_size_0 ,
2009-10-22 11:45:40 +00:00
{ " Buffer Size 0 " ,
2012-04-18 16:55:06 +00:00
" mac-lte.control.bsr.buffer-size-0 " , FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & buffer_size_vals_ext , 0xfc ,
2009-10-22 11:45:40 +00:00
" Buffer Size available in logical channel group 0 " , HFILL
}
} ,
2009-10-25 23:03:11 +00:00
{ & hf_mac_lte_control_long_bsr_buffer_size_1 ,
2008-12-23 21:00:04 +00:00
{ " Buffer Size 1 " ,
2012-04-18 16:55:06 +00:00
" mac-lte.control.bsr.buffer-size-1 " , FT_UINT16 , BASE_DEC | BASE_EXT_STRING , & buffer_size_vals_ext , 0x03f0 ,
2009-10-22 11:45:40 +00:00
" Buffer Size available in logical channel group 1 " , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2009-10-25 23:03:11 +00:00
{ & hf_mac_lte_control_long_bsr_buffer_size_2 ,
2008-12-23 21:00:04 +00:00
{ " Buffer Size 2 " ,
2012-04-18 16:55:06 +00:00
" mac-lte.control.bsr.buffer-size-2 " , FT_UINT16 , BASE_DEC | BASE_EXT_STRING , & buffer_size_vals_ext , 0x0fc0 ,
2009-10-22 11:45:40 +00:00
" Buffer Size available in logical channel group 2 " , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2009-10-25 23:03:11 +00:00
{ & hf_mac_lte_control_long_bsr_buffer_size_3 ,
2008-12-23 21:00:04 +00:00
{ " Buffer Size 3 " ,
2012-04-18 16:55:06 +00:00
" mac-lte.control.bsr.buffer-size-3 " , FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & buffer_size_vals_ext , 0x3f ,
2009-10-22 11:45:40 +00:00
" Buffer Size available in logical channel group 3 " , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2012-04-25 20:02:12 +00:00
{ & hf_mac_lte_control_short_ext_bsr_buffer_size ,
{ " Buffer Size " ,
" mac-lte.control.bsr.buffer-size " , FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & ext_buffer_size_vals_ext , 0x3f ,
" Buffer Size available in all channels in group " , HFILL
}
} ,
{ & hf_mac_lte_control_long_ext_bsr_buffer_size_0 ,
{ " Buffer Size 0 " ,
" mac-lte.control.bsr.buffer-size-0 " , FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & ext_buffer_size_vals_ext , 0xfc ,
" Buffer Size available in logical channel group 0 " , HFILL
}
} ,
{ & hf_mac_lte_control_long_ext_bsr_buffer_size_1 ,
{ " Buffer Size 1 " ,
" mac-lte.control.bsr.buffer-size-1 " , FT_UINT16 , BASE_DEC | BASE_EXT_STRING , & ext_buffer_size_vals_ext , 0x03f0 ,
" Buffer Size available in logical channel group 1 " , HFILL
}
} ,
{ & hf_mac_lte_control_long_ext_bsr_buffer_size_2 ,
{ " Buffer Size 2 " ,
" mac-lte.control.bsr.buffer-size-2 " , FT_UINT16 , BASE_DEC | BASE_EXT_STRING , & ext_buffer_size_vals_ext , 0x0fc0 ,
" Buffer Size available in logical channel group 2 " , HFILL
}
} ,
{ & hf_mac_lte_control_long_ext_bsr_buffer_size_3 ,
{ " Buffer Size 3 " ,
" mac-lte.control.bsr.buffer-size-3 " , FT_UINT8 , BASE_DEC | BASE_EXT_STRING , & ext_buffer_size_vals_ext , 0x3f ,
" Buffer Size available in logical channel group 3 " , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_control_crnti ,
{ " C-RNTI " ,
" mac-lte.control.crnti " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
" C-RNTI for the UE " , HFILL
}
} ,
{ & hf_mac_lte_control_timing_advance ,
{ " Timing Advance " ,
2012-09-21 20:11:11 +00:00
" mac-lte.control.timing-advance " , FT_STRING , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2012-09-21 20:11:11 +00:00
{ & hf_mac_lte_control_timing_advance_group_id ,
{ " Timing Advance Group Identity " ,
" mac-lte.control.timing-advance.group-id " , FT_UINT8 , BASE_DEC , 0 , 0xc0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_control_timing_advance_command ,
{ " Timing Advance Command " ,
" mac-lte.control.timing-advance.command " , FT_UINT8 , BASE_DEC , 0 , 0x3f ,
" Timing Advance (0-63 - see 36.213, 4.2.3) " , HFILL
2009-07-22 13:21:15 +00:00
}
} ,
2009-08-01 09:52:12 +00:00
{ & hf_mac_lte_control_ue_contention_resolution ,
{ " UE Contention Resolution " ,
" mac-lte.control.ue-contention-resolution " , FT_STRING , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_control_ue_contention_resolution_identity ,
2009-06-04 15:08:56 +00:00
{ " UE Contention Resolution Identity " ,
2009-08-01 09:52:12 +00:00
" mac-lte.control.ue-contention-resolution.identity " , FT_BYTES , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ue_contention_resolution_msg3 ,
{ " Msg3 " ,
" mac-lte.control.ue-contention-resolution.msg3 " , FT_FRAMENUM , BASE_NONE , 0 , 0x0 ,
From Kovarththanan Rajaratnam via bug 3548:
(1) Trailing/leading spaces are removed from 'name's/'blurb's
(2) Duplicate 'blurb's are replaced with NULL
(3) Empty ("") 'blurb's are replaced with NULL
(4) BASE_NONE, NULL, 0x0 are used for 'display', 'strings' and 'bitmask' fields
for FT_NONE, FT_BYTES, FT_IPv4, FT_IPv6, FT_ABSOLUTE_TIME, FT_RELATIVE_TIME,
FT_PROTOCOL, FT_STRING and FT_STRINGZ field types
(5) Only allow non-zero value for 'display' if 'bitmask' is non-zero
svn path=/trunk/; revision=28770
2009-06-18 21:30:42 +00:00
NULL , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2009-08-01 09:52:12 +00:00
{ & hf_mac_lte_control_ue_contention_resolution_msg3_matched ,
{ " UE Contention Resolution Matches Msg3 " ,
" mac-lte.control.ue-contention-resolution.matches-msg3 " , FT_BOOLEAN , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
2010-02-23 22:28:42 +00:00
{ & hf_mac_lte_control_ue_contention_resolution_time_since_msg3 ,
{ " Time since Msg3 " ,
" mac-lte.control.ue-contention-resolution.time-since-msg3 " , FT_UINT32 , BASE_DEC , 0 , 0x0 ,
" Time in ms since corresponding Msg3 " , HFILL
}
} ,
2009-08-01 09:52:12 +00:00
2009-08-05 08:02:12 +00:00
{ & hf_mac_lte_control_power_headroom ,
{ " Power Headroom " ,
" mac-lte.control.power-headroom " , FT_STRING , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
{ & hf_mac_lte_control_power_headroom_reserved ,
{ " Reserved " ,
" mac-lte.control.power-headroom.reserved " , FT_UINT8 , BASE_DEC , 0 , 0xc0 ,
" Reserved bits, should be 0 " , HFILL
}
} ,
2009-08-05 08:02:12 +00:00
{ & hf_mac_lte_control_power_headroom_level ,
{ " Power Headroom Level " ,
2012-04-18 16:55:06 +00:00
" mac-lte.control.power-headroom.level " , FT_UINT8 , BASE_DEC | BASE_EXT_STRING ,
2012-04-25 20:02:12 +00:00
& power_headroom_vals_ext , 0x3f , " Power Headroom Level in dB " , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom ,
{ " Extended Power Headroom " ,
" mac-lte.control.ext-power-headroom " , FT_STRING , BASE_NONE ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_c7 ,
{ " SCell Index 7 Power Headroom " ,
" mac-lte.control.ext-power-headroom.c7 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_ph_vals ) , 0x80 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_c6 ,
{ " SCell Index 6 Power Headroom " ,
" mac-lte.control.ext-power-headroom.c6 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_ph_vals ) , 0x40 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_c5 ,
{ " SCell Index 5 Power Headroom " ,
" mac-lte.control.ext-power-headroom.c5 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_ph_vals ) , 0x20 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_c4 ,
{ " SCell Index 4 Power Headroom " ,
" mac-lte.control.ext-power-headroom.c4 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_ph_vals ) , 0x10 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_c3 ,
{ " SCell Index 3 Power Headroom " ,
" mac-lte.control.ext-power-headroom.c3 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_ph_vals ) , 0x08 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_c2 ,
{ " SCell Index 2 Power Headroom " ,
" mac-lte.control.ext-power-headroom.c2 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_ph_vals ) , 0x04 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_c1 ,
{ " SCell Index 1 Power Headroom " ,
" mac-lte.control.ext-power-headroom.c1 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_ph_vals ) , 0x02 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_reserved ,
{ " Reserved " ,
" mac-lte.control.ext-power-headroom.reserved " , FT_UINT8 , BASE_DEC ,
0 , 0x01 , " Reserved bit, should be 0 " , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_power_backoff ,
{ " Power Backoff " ,
" mac-lte.control.ext-power-headroom.power-backoff " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_power_backoff_vals ) , 0x80 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_value ,
{ " Power Headroom Value " ,
" mac-lte.control.ext-power-headroom.power-headroom-value " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_ph_value_vals ) , 0x40 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_level ,
{ " Power Headroom Level " ,
" mac-lte.control.ext-power-headroom.level " , FT_UINT8 , BASE_DEC | BASE_EXT_STRING ,
& power_headroom_vals_ext , 0x3f , " Power Headroom Level in dB " , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_reserved2 ,
{ " Reserved " ,
" mac-lte.control.ext-power-headroom.reserved2 " , FT_UINT8 , BASE_DEC ,
0 , 0xc0 , " Reserved bits, should be 0 " , HFILL
}
} ,
{ & hf_mac_lte_control_ext_power_headroom_pcmaxc ,
{ " Configured UE Transmit Power " ,
" mac-lte.control.ext-power-headroom.pcmaxc " , FT_UINT8 , BASE_DEC | BASE_EXT_STRING ,
& pcmaxc_vals_ext , 0x3f , " Pcmax,c in dBm " , HFILL
}
} ,
{ & hf_mac_lte_control_activation_deactivation ,
{ " Activation/Deactivation " ,
" mac-lte.control.activation-deactivation " , FT_STRING , BASE_NONE ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_activation_deactivation_c7 ,
{ " SCell Index 7 Status " ,
" mac-lte.control.activation-deactivation.c7 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_status_vals ) , 0x80 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_activation_deactivation_c6 ,
{ " SCell Index 6 Status " ,
" mac-lte.control.activation-deactivation.c6 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_status_vals ) , 0x40 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_activation_deactivation_c5 ,
{ " SCell Index 5 Status " ,
" mac-lte.control.activation-deactivation.c5 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_status_vals ) , 0x20 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_activation_deactivation_c4 ,
{ " SCell Index 4 Status " ,
" mac-lte.control.activation-deactivation.c4 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_status_vals ) , 0x10 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_activation_deactivation_c3 ,
{ " SCell Index 3 Status " ,
" mac-lte.control.activation-deactivation.c3 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_status_vals ) , 0x08 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_activation_deactivation_c2 ,
{ " SCell Index 2 Status " ,
" mac-lte.control.activation-deactivation.c2 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_status_vals ) , 0x04 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_activation_deactivation_c1 ,
{ " SCell Index 1 Status " ,
" mac-lte.control.activation-deactivation.c1 " , FT_BOOLEAN , 8 ,
TFS ( & mac_lte_scell_status_vals ) , 0x02 , NULL , HFILL
}
} ,
{ & hf_mac_lte_control_activation_deactivation_reserved ,
{ " Reserved " ,
" mac-lte.control.activation-deactivation.reserved " , FT_UINT8 , BASE_DEC ,
0 , 0x01 , " Reserved bit, should be 0 " , HFILL
2008-12-23 21:00:04 +00:00
}
} ,
2009-10-13 13:36:58 +00:00
2011-12-22 18:05:48 +00:00
{ & hf_mac_lte_control_mch_scheduling_info ,
{ " MCH Scheduling Information " ,
" mac-lte.control.mch_scheduling_info " , FT_STRING , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_control_mch_scheduling_info_lcid ,
{ " LCID " ,
" mac-lte.control.mch_scheduling_info.lcid " , FT_UINT8 , BASE_HEX , VALS ( mch_lcid_vals ) , 0xf8 ,
" Logical Channel ID of the MTCH " , HFILL
}
} ,
{ & hf_mac_lte_control_mch_scheduling_info_stop_mtch ,
{ " Stop MTCH " ,
" mac-lte.control.mch_scheduling_info.stop_mtch " , FT_UINT16 , BASE_DEC , 0 , 0x07ff ,
" Ordinal number of the subframe where the corresponding MTCH stops " , HFILL
}
} ,
2009-12-04 11:13:20 +00:00
/* Generated fields */
2011-07-28 16:52:02 +00:00
{ & hf_mac_lte_dl_harq_resend_original_frame ,
2009-10-13 13:36:58 +00:00
{ " Frame with previous tx " ,
2010-07-05 16:45:36 +00:00
" mac-lte.dlsch.retx.original-frame " , FT_FRAMENUM , BASE_NONE , 0 , 0x0 ,
2009-10-13 13:36:58 +00:00
NULL , HFILL
}
} ,
2011-07-28 16:52:02 +00:00
{ & hf_mac_lte_dl_harq_resend_time_since_previous_frame ,
2011-04-11 21:33:33 +00:00
{ " Time since previous tx (ms) " ,
" mac-lte.dlsch.retx.time-since-previous " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
2011-07-28 16:52:02 +00:00
{ & hf_mac_lte_dl_harq_resend_next_frame ,
{ " Frame with next tx " ,
" mac-lte.dlsch.retx.next-frame " , FT_FRAMENUM , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_dl_harq_resend_time_until_next_frame ,
{ " Time until next tx (ms) " ,
" mac-lte.dlsch.retx.time-until-next " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
2009-10-13 13:36:58 +00:00
2009-11-25 16:00:58 +00:00
{ & hf_mac_lte_ul_harq_resend_original_frame ,
{ " Frame with previous tx " ,
2010-07-05 10:35:17 +00:00
" mac-lte.ulsch.retx.original-frame " , FT_FRAMENUM , BASE_NONE , 0 , 0x0 ,
2009-11-25 16:00:58 +00:00
NULL , HFILL
}
} ,
2011-04-11 21:33:33 +00:00
{ & hf_mac_lte_ul_harq_resend_time_since_previous_frame ,
{ " Time since previous tx (ms) " ,
" mac-lte.ulsch.retx.time-since-previous " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
2011-07-18 11:57:38 +00:00
{ & hf_mac_lte_ul_harq_resend_next_frame ,
{ " Frame with next tx " ,
" mac-lte.ulsch.retx.next-frame " , FT_FRAMENUM , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_ul_harq_resend_time_until_next_frame ,
{ " Time until next tx (ms) " ,
" mac-lte.ulsch.retx.time-until-next " , FT_UINT16 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
2009-12-02 17:46:27 +00:00
{ & hf_mac_lte_grant_answering_sr ,
2009-12-04 11:13:20 +00:00
{ " First Grant Following SR from " ,
2009-12-02 17:46:27 +00:00
" mac-lte.ulsch.grant-answering-sr " , FT_FRAMENUM , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_failure_answering_sr ,
2009-12-04 11:13:20 +00:00
{ " SR which failed " ,
2009-12-02 17:46:27 +00:00
" mac-lte.ulsch.failure-answering-sr " , FT_FRAMENUM , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
2009-12-04 11:13:20 +00:00
{ & hf_mac_lte_sr_leading_to_failure ,
{ " This SR fails " ,
" mac-lte.ulsch.failure-answering-sr-frame " , FT_FRAMENUM , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_sr_leading_to_grant ,
{ " This SR results in a grant here " ,
" mac-lte.ulsch.grant-answering-sr-frame " , FT_FRAMENUM , BASE_NONE , 0 , 0x0 ,
NULL , HFILL
}
} ,
2009-12-14 16:04:14 +00:00
{ & hf_mac_lte_sr_time_since_request ,
{ " Time since SR (ms) " ,
" mac-lte.ulsch.time-since-sr " , FT_UINT32 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
{ & hf_mac_lte_sr_time_until_answer ,
{ " Time until answer (ms) " ,
" mac-lte.ulsch.time-until-sr-answer " , FT_UINT32 , BASE_DEC , 0 , 0x0 ,
NULL , HFILL
}
} ,
2009-12-02 17:46:27 +00:00
2013-08-30 04:08:57 +00:00
{ & hf_mac_lte_drx_config ,
{ " DRX Configuration " ,
" mac-lte.drx-config " , FT_STRING , BASE_NONE ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_config_frame_num ,
{ " Config Frame " ,
" mac-lte.drx-config.config-frame " , FT_FRAMENUM , BASE_NONE ,
0 , 0x0 , NULL , HFILL
}
} ,
2013-09-23 17:34:18 +00:00
{ & hf_mac_lte_drx_config_previous_frame_num ,
{ " Previous Config Frame " ,
" mac-lte.drx-config.previous-config-frame " , FT_FRAMENUM , BASE_NONE ,
0 , 0x0 , NULL , HFILL
}
} ,
2013-08-30 04:08:57 +00:00
{ & hf_mac_lte_drx_config_long_cycle ,
{ " Long cycle " ,
" mac-lte.drx-config.long-cycle " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_config_cycle_offset ,
{ " Cycle offset " ,
" mac-lte.drx-config.cycle-offset " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_config_onduration_timer ,
{ " OnDuration Timer " ,
" mac-lte.drx-config.onduration-timer " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_config_inactivity_timer ,
{ " Inactivity Timer " ,
" mac-lte.drx-config.inactivity-timer " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_config_retransmission_timer ,
{ " Retransmission Timer " ,
" mac-lte.drx-config.retransmission-timer " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_config_short_cycle ,
{ " Short cycle " ,
" mac-lte.drx-config.short-cycle " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_config_short_cycle_timer ,
{ " Short cycle Timer " ,
" mac-lte.drx-config.short-cycle-timer " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_state ,
{ " DRX State " ,
" mac-lte.drx-state " , FT_STRING , BASE_NONE ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_state_long_cycle_offset ,
{ " Long cycle offset " ,
" mac-lte.drx-state.long-cycle-offset " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
2014-01-28 03:06:03 +00:00
#if 0
2013-08-30 04:08:57 +00:00
{ & hf_mac_lte_drx_state_long_cycle_on ,
{ " Long cycle current on " ,
" mac-lte.drx-state.long-cycle-on " , FT_BOOLEAN , BASE_NONE ,
0 , 0x0 , NULL , HFILL
}
2013-10-04 16:05:18 +00:00
} ,
2014-01-28 03:06:03 +00:00
# endif
2013-10-04 16:05:18 +00:00
{ & hf_mac_lte_drx_state_short_cycle_offset ,
{ " Short cycle offset " ,
" mac-lte.drx-state.short-cycle-offset " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
2014-01-28 03:06:03 +00:00
#if 0
2013-10-04 16:05:18 +00:00
{ & hf_mac_lte_drx_state_short_cycle_on ,
{ " Short cycle current on " ,
" mac-lte.drx-state.short-cycle-on " , FT_BOOLEAN , BASE_NONE ,
0 , 0x0 , NULL , HFILL
}
2013-08-30 04:08:57 +00:00
} ,
2014-01-28 03:06:03 +00:00
# endif
2013-10-21 21:20:39 +00:00
{ & hf_mac_lte_drx_state_inactivity_remaining ,
{ " Inactivity remaining " ,
" mac-lte.drx-state.inactivity-remaining " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_state_onduration_remaining ,
{ " Onduration remaining " ,
" mac-lte.drx-state.onduration-remaining " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
2013-10-22 15:56:14 +00:00
{ & hf_mac_lte_drx_state_retransmission_remaining ,
{ " Retransmission remaining " ,
" mac-lte.drx-state.retransmission-remaining " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
{ & hf_mac_lte_drx_state_rtt_remaining ,
{ " RTT remaining " ,
" mac-lte.drx-state.rtt-remaining " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
2013-10-22 16:52:45 +00:00
{ & hf_mac_lte_drx_state_short_cycle_remaining ,
{ " Short-cycle timer remaining " ,
" mac-lte.drx-state.short-cycle-remaining " , FT_UINT16 , BASE_DEC ,
0 , 0x0 , NULL , HFILL
}
} ,
2008-12-23 21:00:04 +00:00
} ;
static gint * ett [ ] =
{
& ett_mac_lte ,
& ett_mac_lte_context ,
2010-03-14 17:56:37 +00:00
& ett_mac_lte_phy_context ,
2008-12-23 21:00:04 +00:00
& ett_mac_lte_rar_headers ,
& ett_mac_lte_rar_header ,
& ett_mac_lte_rar_body ,
2009-04-27 11:12:01 +00:00
& ett_mac_lte_rar_ul_grant ,
2008-12-23 21:00:04 +00:00
& ett_mac_lte_ulsch_header ,
& ett_mac_lte_dlsch_header ,
2011-12-22 18:05:48 +00:00
& ett_mac_lte_mch_header ,
2008-12-23 21:00:04 +00:00
& ett_mac_lte_sch_subheader ,
2011-12-22 18:05:48 +00:00
& ett_mac_lte_mch_subheader ,
2008-12-23 21:00:04 +00:00
& ett_mac_lte_bch ,
2009-06-11 13:55:49 +00:00
& ett_mac_lte_bsr ,
2009-08-01 09:52:12 +00:00
& ett_mac_lte_pch ,
2012-04-25 20:02:12 +00:00
& ett_mac_lte_activation_deactivation ,
2009-08-05 08:02:12 +00:00
& ett_mac_lte_contention_resolution ,
2012-09-21 20:11:11 +00:00
& ett_mac_lte_timing_advance ,
2010-03-22 19:20:37 +00:00
& ett_mac_lte_power_headroom ,
2012-04-25 20:02:12 +00:00
& ett_mac_lte_extended_power_headroom ,
& ett_mac_lte_extended_power_headroom_cell ,
2011-12-22 18:05:48 +00:00
& ett_mac_lte_mch_scheduling_info ,
2013-08-30 04:08:57 +00:00
& ett_mac_lte_oob ,
& ett_mac_lte_drx_config ,
& ett_mac_lte_drx_state
2008-12-23 21:00:04 +00:00
} ;
2013-09-05 01:05:16 +00:00
static ei_register_info ei [ ] = {
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_reserved_not_zero , { " mac-lte.reserved-not-zero " , PI_MALFORMED , PI_ERROR , " Reserved bit not zero " , EXPFILL } } ,
{ & ei_mac_lte_rar_timing_advance_not_zero_note , { " mac-lte.rar.ta.not-zero " , PI_SEQUENCE , PI_NOTE , " RAR Timing advance not zero " , EXPFILL } } ,
{ & ei_mac_lte_rar_timing_advance_not_zero_warn , { " mac-lte.rar.ta.not-zero " , PI_SEQUENCE , PI_WARN , " RAR Timing advance not zero " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_rar_bi_present , { " mac-lte.rar.bi.present " , PI_MALFORMED , PI_ERROR , " MAC RAR PDU has > 1 Backoff Indicator subheader present " , EXPFILL } } ,
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_rar_bi_not_first_subheader , { " mac-lte.rar.bi.not-first-subheader " , PI_MALFORMED , PI_WARN , " Backoff Indicator must appear as first subheader " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_bch_pdu , { " mac-lte.bch.pdu.uplink " , PI_MALFORMED , PI_ERROR , " BCH data should not be received in Uplink! " , EXPFILL } } ,
2013-09-05 02:52:08 +00:00
{ & ei_mac_lte_pch_pdu , { " mac-lte.pch.pdu.uplink " , PI_MALFORMED , PI_ERROR , " PCH data should not be received in Uplink! " , EXPFILL } } ,
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_orig_tx_ul_frame_not_found , { " mac-lte.orig-tx-ul-frame-not-found " , PI_SEQUENCE , PI_ERROR , " Original Tx of UL frame not found " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_ul_harq_resend_next_frame , { " mac-lte.ulsch.retx.next-frame.expert " , PI_SEQUENCE , PI_WARN , " UL MAC PDU needed to be retransmitted " , EXPFILL } } ,
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_sr_results_not_grant_or_failure_indication , { " mac-lte.sr_results-not-grant-or-failure-indication " , PI_SEQUENCE , PI_ERROR , " SR results in neither a grant nor a failure indication " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_sr_invalid_event , { " mac-lte.ulsch.sr-invalid-event " , PI_SEQUENCE , PI_ERROR , " Invalid SR event for UE " , EXPFILL } } ,
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_dlsch_lcid , { " mac-lte.dlsch.lcid.DRX-received " , PI_SEQUENCE , PI_NOTE , " DRX command received for UE " , EXPFILL } } ,
{ & ei_mac_lte_control_subheader_after_data_subheader , { " mac-lte.control-subheader-after-data-subheader " , PI_MALFORMED , PI_ERROR , " ?L-SCH Control subheaders should not appear after data subheaders " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_control_bsr_multiple , { " mac-lte.control.bsr.multiple " , PI_MALFORMED , PI_ERROR , " There shouldn't be > 1 BSR in a frame " , EXPFILL } } ,
{ & ei_mac_lte_padding_data_multiple , { " mac-lte.padding-data.multiple " , PI_MALFORMED , PI_WARN , " Should not see more than 2 padding subheaders in one frame " , EXPFILL } } ,
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_padding_data_before_control_subheader , { " mac-lte.padding-data.before-control-subheader " , PI_MALFORMED , PI_ERROR , " Padding should come before other control subheaders! " , EXPFILL } } ,
{ & ei_mac_lte_padding_data_start_and_end , { " mac-lte.padding-data.start-and-end " , PI_MALFORMED , PI_ERROR , " Padding subheaders at start and end! " , EXPFILL } } ,
{ & ei_mac_lte_lcid_unexpected , { " mac-lte.lcid-unexpected " , PI_MALFORMED , PI_ERROR , " ?L-SCH: Unexpected LCID received " , EXPFILL } } ,
{ & ei_mac_lte_too_many_subheaders , { " mac-lte.too-many-subheaders " , PI_MALFORMED , PI_ERROR , " Reached too many subheaders - frame obviously malformed " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_control_ue_contention_resolution_msg3_matched , { " mac-lte.control.ue-contention-resolution.matches-msg3.not " , PI_SEQUENCE , PI_WARN , " CR body in Msg4 doesn't match Msg3 CCCH in frame X " , EXPFILL } } ,
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_control_timing_advance_command_no_correction , { " mac-lte.control.timing-advance.command.no-correction " , PI_SEQUENCE , PI_NOTE , " Timing Advance control element received (no correction needed) " , EXPFILL } } ,
{ & ei_mac_lte_control_timing_advance_command_correction_needed , { " mac-lte.control.timing-advance.correction-needed " , PI_SEQUENCE , PI_WARN , " Timing Advance control element received with correction needed " , EXPFILL } } ,
{ & ei_mac_lte_control_element_size_invalid , { " mac-lte.control-element.size-invalid " , PI_MALFORMED , PI_ERROR , " Control Element has an unexpected size " , EXPFILL } } ,
{ & ei_mac_lte_bsr_warn_threshold_exceeded , { " mac-lte.bsr-warn-threshold-exceeded " , PI_SEQUENCE , PI_WARN , " BSR for LCG X exceeds threshold " , EXPFILL } } ,
{ & ei_mac_lte_sch_header_only , { " mac-lte.sch.header-only " , PI_SEQUENCE , PI_NOTE , " MAC PDU SDUs have been omitted " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_context_length , { " mac-lte.length.invalid " , PI_MALFORMED , PI_ERROR , " MAC PDU is longer than reported length " , EXPFILL } } ,
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_rach_preamble_sent_warn , { " mac-lte.rach-preamble-sent " , PI_SEQUENCE , PI_WARN , " RACH Preamble sent " , EXPFILL } } ,
{ & ei_mac_lte_rach_preamble_sent_note , { " mac-lte.rach-preamble-sent " , PI_SEQUENCE , PI_NOTE , " RACH Preamble sent " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_oob_send_sr , { " mac-lte.sr-req " , PI_SEQUENCE , PI_NOTE , " Scheduling Request sent " , EXPFILL } } ,
{ & ei_mac_lte_oob_sr_failure , { " mac-lte.sr-failure " , PI_SEQUENCE , PI_ERROR , " Scheduling Request failed " , EXPFILL } } ,
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_context_sysframe_number , { " mac-lte.sfn.out-of-range " , PI_MALFORMED , PI_ERROR , " Sysframe number out of range " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_context_rnti_type , { " mac-lte.rnti-type.invalid " , PI_MALFORMED , PI_ERROR , " RNTI indicated, but value is not correct " , EXPFILL } } ,
2013-11-22 17:18:11 +00:00
{ & ei_mac_lte_ul_mac_frame_retx , { " mac-lte.ul-mac-frame-retx " , PI_SEQUENCE , PI_WARN , " UL MAC frame ReTX " , EXPFILL } } ,
2013-09-05 01:05:16 +00:00
{ & ei_mac_lte_context_crc_status , { " mac-lte.crc-status.error " , PI_MALFORMED , PI_ERROR , " Frame has CRC error problem " , EXPFILL } } ,
} ;
2012-11-29 20:15:37 +00:00
static const enum_val_t show_info_col_vals [ ] = {
2010-03-14 17:56:37 +00:00
{ " show-phy " , " PHY Info " , ShowPHYLayer } ,
{ " show-mac " , " MAC Info " , ShowMACLayer } ,
{ " show-rlc " , " RLC Info " , ShowRLCLayer } ,
{ NULL , NULL , - 1 }
} ;
2012-11-29 20:15:37 +00:00
static const enum_val_t lcid_drb_source_vals [ ] = {
2011-04-17 11:22:03 +00:00
{ " from-static-stable " , " From static table " , FromStaticTable } ,
{ " from-configuration-protocol " , " From configuration protocol " , FromConfigurationProtocol } ,
{ NULL , NULL , - 1 }
} ;
2009-01-08 14:09:38 +00:00
module_t * mac_lte_module ;
2013-09-05 01:05:16 +00:00
expert_module_t * expert_mac_lte ;
2009-01-08 14:09:38 +00:00
2009-09-18 16:27:02 +00:00
static uat_field_t lcid_drb_mapping_flds [ ] = {
UAT_FLD_VS ( lcid_drb_mappings , lcid , " lcid " , drb_lcid_vals , " The MAC LCID " ) ,
UAT_FLD_DEC ( lcid_drb_mappings , drbid , " drb id (1-32) " , " Identifier of logical data channel " ) ,
UAT_FLD_VS ( lcid_drb_mappings , channel_type , " RLC Channel Type " , rlc_channel_type_vals , " The MAC LCID " ) ,
UAT_END_FIELDS
} ;
2008-12-23 21:00:04 +00:00
/* Register protocol. */
proto_mac_lte = proto_register_protocol ( " MAC-LTE " , " MAC-LTE " , " mac-lte " ) ;
proto_register_field_array ( proto_mac_lte , hf , array_length ( hf ) ) ;
proto_register_subtree_array ( ett , array_length ( ett ) ) ;
2013-09-05 01:05:16 +00:00
expert_mac_lte = expert_register_protocol ( proto_mac_lte ) ;
expert_register_field_array ( expert_mac_lte , ei , array_length ( ei ) ) ;
2008-12-23 21:00:04 +00:00
/* Allow other dissectors to find this one by name. */
2013-12-11 11:03:29 +00:00
new_register_dissector ( " mac-lte " , dissect_mac_lte , proto_mac_lte ) ;
2009-01-08 14:09:38 +00:00
2009-02-12 12:08:05 +00:00
/* Register the tap name */
mac_lte_tap = register_tap ( " mac-lte " ) ;
2009-01-08 14:09:38 +00:00
/* Preferences */
mac_lte_module = prefs_register_protocol ( proto_mac_lte , NULL ) ;
2009-11-29 22:45:06 +00:00
/* Obsolete preferences */
2009-04-20 16:46:46 +00:00
prefs_register_obsolete_preference ( mac_lte_module , " single_rar " ) ;
2009-11-29 22:45:06 +00:00
prefs_register_obsolete_preference ( mac_lte_module , " check_reserved_bits " ) ;
prefs_register_obsolete_preference ( mac_lte_module , " decode_rar_ul_grant " ) ;
2010-03-14 17:56:37 +00:00
prefs_register_obsolete_preference ( mac_lte_module , " show_rlc_info_column " ) ;
2010-07-05 10:35:17 +00:00
prefs_register_obsolete_preference ( mac_lte_module , " attempt_to_detect_dl_harq_resend " ) ;
2011-04-17 21:43:20 +00:00
prefs_register_obsolete_preference ( mac_lte_module , " attempt_to_track_ul_harq_resend " ) ;
2010-09-21 03:14:49 +00:00
2009-03-16 15:39:52 +00:00
prefs_register_uint_preference ( mac_lte_module , " retx_count_warn " ,
" Number of Re-Transmits before expert warning triggered " ,
2009-03-18 15:35:45 +00:00
" Number of Re-Transmits before expert warning triggered " ,
2009-03-16 15:39:52 +00:00
10 , & global_mac_lte_retx_counter_trigger ) ;
2009-04-20 16:46:46 +00:00
prefs_register_bool_preference ( mac_lte_module , " attempt_rrc_decode " ,
" Attempt to decode BCH, PCH and CCCH data using LTE RRC dissector " ,
" Attempt to decode BCH, PCH and CCCH data using LTE RRC dissector " ,
& global_mac_lte_attempt_rrc_decode ) ;
2009-04-27 11:12:01 +00:00
2009-07-14 13:08:23 +00:00
prefs_register_bool_preference ( mac_lte_module , " attempt_to_dissect_crc_failures " ,
" Dissect frames that have failed CRC check " ,
" Attempt to dissect frames that have failed CRC check " ,
& global_mac_lte_dissect_crc_failures ) ;
2009-05-28 02:24:27 +00:00
prefs_register_bool_preference ( mac_lte_module , " heuristic_mac_lte_over_udp " ,
" Try Heuristic LTE-MAC over UDP framing " ,
" When enabled, use heuristic dissector to find MAC-LTE frames sent with "
" UDP framing " ,
& global_mac_lte_heur ) ;
2009-08-01 09:52:12 +00:00
2009-09-10 22:53:57 +00:00
prefs_register_bool_preference ( mac_lte_module , " attempt_to_dissect_srb_sdus " ,
" Attempt to dissect LCID 1&2 as srb1&2 " ,
" Will call LTE RLC dissector with standard settings as per RRC spec " ,
& global_mac_lte_attempt_srb_decode ) ;
2012-10-01 19:51:07 +00:00
prefs_register_bool_preference ( mac_lte_module , " attempt_to_dissect_mcch " ,
" Attempt to dissect MCH LCID 0 as MCCH " ,
" Will call LTE RLC dissector for MCH LCID 0 " ,
& global_mac_lte_attempt_mcch_decode ) ;
2012-12-11 23:20:22 +00:00
prefs_register_bool_preference ( mac_lte_module , " call_rlc_for_mtch " ,
" Call RLC dissector MTCH LCIDs " ,
" Call RLC dissector MTCH LCIDs " ,
& global_mac_lte_call_rlc_for_mtch ) ;
2011-04-17 11:22:03 +00:00
prefs_register_enum_preference ( mac_lte_module , " lcid_to_drb_mapping_source " ,
" Source of LCID -> drb channel settings " ,
" Set whether LCID -> drb Table is taken from static table (below) or from "
" info learned from control protocol (e.g. RRC) " ,
& global_mac_lte_lcid_drb_source , lcid_drb_source_vals , FALSE ) ;
lcid_drb_mappings_uat = uat_new ( " Static LCID -> drb Table " ,
sizeof ( lcid_drb_mapping_t ) ,
" drb_logchans " ,
TRUE ,
2014-01-30 17:43:52 +00:00
& lcid_drb_mappings ,
2011-04-17 11:22:03 +00:00
& num_lcid_drb_mappings ,
UATs could be put into "categories". The categories were defined only
implicitly by the #define name and string they were defined to; not all
UATs neatly fit into any of the categories, so some of them were put
into categories that weren't obviously correct for them, and one - the
display filter macro UAT - wasn't put into any category at all (which
caused crashes when editing them, as the GUI code that handled UAT
changes from a dialog assumed the category field was non-null).
The category was, in practice, used only to decide, in the
aforementioned GUI code, whether the packet summary pane needed to be
updated or not. It also offered no option of "don't update the packet
summary pane *and* don't redissect anything", which is what would be
appropriate for the display filter macro UAT.
Replace the category with a set of fields indicating what the UAT
affects; we currently offer "dissection", which applies to most UATs
(any UAT in libwireshark presumably affects dissection at a minimum) and
"the set of named fields that exist". Changing any UAT that affects
dissection requires a redissection; changing any UAT that affects the
set of named fields that exist requires a redissection *and* rebuilding
the packet summary pane.
Perhaps we also need "filtering", so that if you change a display filter
macro, we re-filter, in case the display is currently filtered with a
display filter that uses a macro that changed.
svn path=/trunk/; revision=43603
2012-07-08 01:00:46 +00:00
UAT_AFFECTS_DISSECTION , /* affects dissection of packets, but not set of named fields */
2011-04-17 11:22:03 +00:00
" " , /* TODO: is this ref to help manual? */
lcid_drb_mapping_copy_cb ,
NULL ,
NULL ,
NULL ,
lcid_drb_mapping_flds ) ;
2009-09-18 16:27:02 +00:00
prefs_register_uat_preference ( mac_lte_module ,
" drb_table " ,
" LCID -> DRB Mappings Table " ,
" A table that maps from configurable lcids -> RLC logical channels " ,
lcid_drb_mappings_uat ) ;
2009-11-18 13:47:08 +00:00
prefs_register_uint_preference ( mac_lte_module , " bsr_warn_threshold " ,
" BSR size when warning should be issued (0 - 63) " ,
" If any BSR report is >= this number, an expert warning will be added " ,
10 , & global_mac_lte_bsr_warn_threshold ) ;
2009-12-02 17:46:27 +00:00
prefs_register_bool_preference ( mac_lte_module , " track_sr " ,
" Track status of SRs within UEs " ,
" Track status of SRs, providing links between requests, failure indications and grants " ,
& global_mac_lte_track_sr ) ;
2010-03-14 17:56:37 +00:00
prefs_register_enum_preference ( mac_lte_module , " layer_to_show " ,
" Which layer info to show in Info column " ,
" Can show PHY, MAC or RLC layer info in Info column " ,
& global_mac_lte_layer_to_show , show_info_col_vals , FALSE ) ;
2010-02-08 15:01:08 +00:00
2013-06-18 23:36:35 +00:00
prefs_register_bool_preference ( mac_lte_module , " decode_cr_body " ,
" Decode CR body as UL CCCH " ,
" Attempt to decode 6 bytes of Contention Resolution body as an UL CCCH PDU " ,
& global_mac_lte_decode_cr_body ) ;
2013-08-30 04:08:57 +00:00
prefs_register_bool_preference ( mac_lte_module , " show_drx " ,
2013-09-27 16:18:09 +00:00
" Show DRX Information (Incomplete/experimental!) " ,
2013-08-30 04:08:57 +00:00
" Apply DRX config and show DRX state within each UE " ,
& global_mac_lte_show_drx ) ;
2009-08-01 09:52:12 +00:00
register_init_routine ( & mac_lte_init_protocol ) ;
2008-12-23 21:00:04 +00:00
}
2012-03-16 02:00:29 +00:00
void proto_reg_handoff_mac_lte ( void )
2009-05-28 02:24:27 +00:00
{
2012-10-06 15:52:14 +00:00
/* Add as a heuristic UDP dissector */
heur_dissector_add ( " udp " , dissect_mac_lte_heur , proto_mac_lte ) ;
2012-10-06 14:59:51 +00:00
2012-10-06 15:52:14 +00:00
/* Look up RLC dissector handle once and for all */
rlc_lte_handle = find_dissector ( " rlc-lte " ) ;
2009-05-28 02:24:27 +00:00
}
2008-12-23 21:00:04 +00:00
2013-10-16 20:35:08 +00:00
/*
* 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 :
*/