diff options
Diffstat (limited to 'epan/dissectors/packet-mac-nr.c')
-rw-r--r-- | epan/dissectors/packet-mac-nr.c | 2069 |
1 files changed, 1351 insertions, 718 deletions
diff --git a/epan/dissectors/packet-mac-nr.c b/epan/dissectors/packet-mac-nr.c index 781d413a52..914cfeef69 100644 --- a/epan/dissectors/packet-mac-nr.c +++ b/epan/dissectors/packet-mac-nr.c @@ -11,15 +11,15 @@ #include "config.h" -#include <stdio.h> #include <epan/packet.h> #include <epan/exceptions.h> #include <epan/expert.h> #include <epan/proto_data.h> -#include <epan/tfs.h> +#include <epan/tap.h> #include <epan/uat.h> #include "packet-mac-nr.h" +#include "packet-mac-3gpp-common.h" #include "packet-rlc-nr.h" void proto_register_mac_nr(void); @@ -30,301 +30,312 @@ void proto_reg_handoff_mac_nr(void); */ /* Initialize the protocol and registered fields. */ -int proto_mac_nr = -1; +int proto_mac_nr; + +static int mac_nr_tap = -1; static dissector_handle_t rlc_nr_handle; /* Decoding context */ -static int hf_mac_nr_context = -1; -static int hf_mac_nr_context_radio_type = -1; -static int hf_mac_nr_context_direction = -1; -static int hf_mac_nr_context_rnti = -1; -static int hf_mac_nr_context_rnti_type = -1; -static int hf_mac_nr_context_ueid = -1; -static int hf_mac_nr_context_sysframe_number = -1; -static int hf_mac_nr_context_slot_number = -1; -static int hf_mac_nr_context_harqid = -1; -static int hf_mac_nr_context_bcch_transport_channel = -1; -static int hf_mac_nr_context_phr_type2_othercell = -1; - - -static int hf_mac_nr_subheader = -1; -static int hf_mac_nr_subheader_reserved = -1; -static int hf_mac_nr_subheader_f = -1; -static int hf_mac_nr_subheader_length_1_byte = -1; -static int hf_mac_nr_subheader_length_2_bytes = -1; -static int hf_mac_nr_ulsch_lcid = -1; -static int hf_mac_nr_dlsch_lcid = -1; -static int hf_mac_nr_dlsch_sdu = -1; -static int hf_mac_nr_ulsch_sdu = -1; -static int hf_mac_nr_bcch_pdu = -1; -static int hf_mac_nr_pcch_pdu = -1; - -static int hf_mac_nr_control_crnti = -1; -static int hf_mac_nr_control_ue_contention_resolution_identity = -1; -static int hf_mac_nr_control_timing_advance_tagid = -1; -static int hf_mac_nr_control_timing_advance_command = -1; -static int hf_mac_nr_control_se_phr_reserved = -1; -static int hf_mac_nr_control_se_phr_ph = -1; -static int hf_mac_nr_control_se_phr_pcmax_f_c = -1; -static int hf_mac_nr_control_recommended_bit_rate_query_lcid = -1; -static int hf_mac_nr_control_recommended_bit_rate_query_dir = -1; -static int hf_mac_nr_control_recommended_bit_rate_query_bit_rate = -1; -static int hf_mac_nr_control_recommended_bit_rate_query_reserved = -1; -static int hf_mac_nr_control_me_phr_c7_flag = -1; -static int hf_mac_nr_control_me_phr_c6_flag = -1; -static int hf_mac_nr_control_me_phr_c5_flag = -1; -static int hf_mac_nr_control_me_phr_c4_flag = -1; -static int hf_mac_nr_control_me_phr_c3_flag = -1; -static int hf_mac_nr_control_me_phr_c2_flag = -1; -static int hf_mac_nr_control_me_phr_c1_flag = -1; -static int hf_mac_nr_control_me_phr_c15_flag = -1; -static int hf_mac_nr_control_me_phr_c14_flag = -1; -static int hf_mac_nr_control_me_phr_c13_flag = -1; -static int hf_mac_nr_control_me_phr_c12_flag = -1; -static int hf_mac_nr_control_me_phr_c11_flag = -1; -static int hf_mac_nr_control_me_phr_c10_flag = -1; -static int hf_mac_nr_control_me_phr_c9_flag = -1; -static int hf_mac_nr_control_me_phr_c8_flag = -1; -static int hf_mac_nr_control_me_phr_c23_flag = -1; -static int hf_mac_nr_control_me_phr_c22_flag = -1; -static int hf_mac_nr_control_me_phr_c21_flag = -1; -static int hf_mac_nr_control_me_phr_c20_flag = -1; -static int hf_mac_nr_control_me_phr_c19_flag = -1; -static int hf_mac_nr_control_me_phr_c18_flag = -1; -static int hf_mac_nr_control_me_phr_c17_flag = -1; -static int hf_mac_nr_control_me_phr_c16_flag = -1; -static int hf_mac_nr_control_me_phr_c31_flag = -1; -static int hf_mac_nr_control_me_phr_c30_flag = -1; -static int hf_mac_nr_control_me_phr_c29_flag = -1; -static int hf_mac_nr_control_me_phr_c28_flag = -1; -static int hf_mac_nr_control_me_phr_c27_flag = -1; -static int hf_mac_nr_control_me_phr_c26_flag = -1; -static int hf_mac_nr_control_me_phr_c25_flag = -1; -static int hf_mac_nr_control_me_phr_c24_flag = -1; -static int hf_mac_nr_control_me_phr_entry = -1; -static int hf_mac_nr_control_me_phr_p = -1; -static int hf_mac_nr_control_me_phr_v = -1; -static int hf_mac_nr_control_me_phr_reserved_2 = -1; -static int hf_mac_nr_control_me_phr_ph_type2_spcell = -1; -static int hf_mac_nr_control_me_phr_ph_type1_pcell = -1; -static int hf_mac_nr_control_me_phr_ph_c31 = -1; -static int hf_mac_nr_control_me_phr_ph_c30 = -1; -static int hf_mac_nr_control_me_phr_ph_c29 = -1; -static int hf_mac_nr_control_me_phr_ph_c28 = -1; -static int hf_mac_nr_control_me_phr_ph_c27 = -1; -static int hf_mac_nr_control_me_phr_ph_c26 = -1; -static int hf_mac_nr_control_me_phr_ph_c25 = -1; -static int hf_mac_nr_control_me_phr_ph_c24 = -1; -static int hf_mac_nr_control_me_phr_ph_c23 = -1; -static int hf_mac_nr_control_me_phr_ph_c22 = -1; -static int hf_mac_nr_control_me_phr_ph_c21 = -1; -static int hf_mac_nr_control_me_phr_ph_c20 = -1; -static int hf_mac_nr_control_me_phr_ph_c19 = -1; -static int hf_mac_nr_control_me_phr_ph_c18 = -1; -static int hf_mac_nr_control_me_phr_ph_c17 = -1; -static int hf_mac_nr_control_me_phr_ph_c16 = -1; -static int hf_mac_nr_control_me_phr_ph_c15 = -1; -static int hf_mac_nr_control_me_phr_ph_c14 = -1; -static int hf_mac_nr_control_me_phr_ph_c13 = -1; -static int hf_mac_nr_control_me_phr_ph_c12 = -1; -static int hf_mac_nr_control_me_phr_ph_c11 = -1; -static int hf_mac_nr_control_me_phr_ph_c10 = -1; -static int hf_mac_nr_control_me_phr_ph_c9 = -1; -static int hf_mac_nr_control_me_phr_ph_c8 = -1; -static int hf_mac_nr_control_me_phr_ph_c7 = -1; -static int hf_mac_nr_control_me_phr_ph_c6 = -1; -static int hf_mac_nr_control_me_phr_ph_c5 = -1; -static int hf_mac_nr_control_me_phr_ph_c4 = -1; -static int hf_mac_nr_control_me_phr_ph_c3 = -1; -static int hf_mac_nr_control_me_phr_ph_c2 = -1; -static int hf_mac_nr_control_me_phr_ph_c1 = -1; -static int hf_mac_nr_control_me_phr_reserved = -1; -static int hf_mac_nr_control_me_phr_pcmax_f_c_type2_spcell = -1; -static int hf_mac_nr_control_me_phr_pcmax_f_c_type1_pcell = -1; +static int hf_mac_nr_context; +static int hf_mac_nr_context_radio_type; +static int hf_mac_nr_context_direction; +static int hf_mac_nr_context_rnti; +static int hf_mac_nr_context_rnti_type; +static int hf_mac_nr_context_ueid; +static int hf_mac_nr_context_sysframe_number; +static int hf_mac_nr_context_slot_number; +static int hf_mac_nr_context_harqid; +static int hf_mac_nr_context_bcch_transport_channel; +static int hf_mac_nr_context_phr_type2_othercell; + + +static int hf_mac_nr_subheader; +static int hf_mac_nr_subheader_reserved; +static int hf_mac_nr_subheader_f; +static int hf_mac_nr_subheader_length_1_byte; +static int hf_mac_nr_subheader_length_2_bytes; +static int hf_mac_nr_lcid; +static int hf_mac_nr_ulsch_lcid; +static int hf_mac_nr_dlsch_lcid; +static int hf_mac_nr_dlsch_elcid_2oct; +static int hf_mac_nr_ulsch_elcid_2oct; +static int hf_mac_nr_dlsch_elcid_1oct; +static int hf_mac_nr_ulsch_elcid_1oct; +static int hf_mac_nr_dlsch_sdu; +static int hf_mac_nr_ulsch_sdu; +static int hf_mac_nr_bcch_pdu; +static int hf_mac_nr_pcch_pdu; + +static int hf_mac_nr_control_crnti; +static int hf_mac_nr_control_ue_contention_resolution_identity; +static int hf_mac_nr_control_timing_advance_tagid; +static int hf_mac_nr_control_timing_advance_command; +static int hf_mac_nr_control_se_phr_reserved; +static int hf_mac_nr_control_se_phr_ph; +static int hf_mac_nr_control_se_phr_pcmax_f_c; +static int hf_mac_nr_control_recommended_bit_rate_query_lcid; +static int hf_mac_nr_control_recommended_bit_rate_query_dir; +static int hf_mac_nr_control_recommended_bit_rate_query_bit_rate; +static int hf_mac_nr_control_recommended_bit_rate_query_reserved; +static int hf_mac_nr_control_me_phr_c7_flag; +static int hf_mac_nr_control_me_phr_c6_flag; +static int hf_mac_nr_control_me_phr_c5_flag; +static int hf_mac_nr_control_me_phr_c4_flag; +static int hf_mac_nr_control_me_phr_c3_flag; +static int hf_mac_nr_control_me_phr_c2_flag; +static int hf_mac_nr_control_me_phr_c1_flag; +static int hf_mac_nr_control_me_phr_c15_flag; +static int hf_mac_nr_control_me_phr_c14_flag; +static int hf_mac_nr_control_me_phr_c13_flag; +static int hf_mac_nr_control_me_phr_c12_flag; +static int hf_mac_nr_control_me_phr_c11_flag; +static int hf_mac_nr_control_me_phr_c10_flag; +static int hf_mac_nr_control_me_phr_c9_flag; +static int hf_mac_nr_control_me_phr_c8_flag; +static int hf_mac_nr_control_me_phr_c23_flag; +static int hf_mac_nr_control_me_phr_c22_flag; +static int hf_mac_nr_control_me_phr_c21_flag; +static int hf_mac_nr_control_me_phr_c20_flag; +static int hf_mac_nr_control_me_phr_c19_flag; +static int hf_mac_nr_control_me_phr_c18_flag; +static int hf_mac_nr_control_me_phr_c17_flag; +static int hf_mac_nr_control_me_phr_c16_flag; +static int hf_mac_nr_control_me_phr_c31_flag; +static int hf_mac_nr_control_me_phr_c30_flag; +static int hf_mac_nr_control_me_phr_c29_flag; +static int hf_mac_nr_control_me_phr_c28_flag; +static int hf_mac_nr_control_me_phr_c27_flag; +static int hf_mac_nr_control_me_phr_c26_flag; +static int hf_mac_nr_control_me_phr_c25_flag; +static int hf_mac_nr_control_me_phr_c24_flag; +static int hf_mac_nr_control_me_phr_entry; +static int hf_mac_nr_control_me_phr_p; +static int hf_mac_nr_control_me_phr_v; +static int hf_mac_nr_control_me_phr_reserved_2; +static int hf_mac_nr_control_me_phr_ph_type2_spcell; +static int hf_mac_nr_control_me_phr_ph_type1_pcell; +static int hf_mac_nr_control_me_phr_ph_c31; +static int hf_mac_nr_control_me_phr_ph_c30; +static int hf_mac_nr_control_me_phr_ph_c29; +static int hf_mac_nr_control_me_phr_ph_c28; +static int hf_mac_nr_control_me_phr_ph_c27; +static int hf_mac_nr_control_me_phr_ph_c26; +static int hf_mac_nr_control_me_phr_ph_c25; +static int hf_mac_nr_control_me_phr_ph_c24; +static int hf_mac_nr_control_me_phr_ph_c23; +static int hf_mac_nr_control_me_phr_ph_c22; +static int hf_mac_nr_control_me_phr_ph_c21; +static int hf_mac_nr_control_me_phr_ph_c20; +static int hf_mac_nr_control_me_phr_ph_c19; +static int hf_mac_nr_control_me_phr_ph_c18; +static int hf_mac_nr_control_me_phr_ph_c17; +static int hf_mac_nr_control_me_phr_ph_c16; +static int hf_mac_nr_control_me_phr_ph_c15; +static int hf_mac_nr_control_me_phr_ph_c14; +static int hf_mac_nr_control_me_phr_ph_c13; +static int hf_mac_nr_control_me_phr_ph_c12; +static int hf_mac_nr_control_me_phr_ph_c11; +static int hf_mac_nr_control_me_phr_ph_c10; +static int hf_mac_nr_control_me_phr_ph_c9; +static int hf_mac_nr_control_me_phr_ph_c8; +static int hf_mac_nr_control_me_phr_ph_c7; +static int hf_mac_nr_control_me_phr_ph_c6; +static int hf_mac_nr_control_me_phr_ph_c5; +static int hf_mac_nr_control_me_phr_ph_c4; +static int hf_mac_nr_control_me_phr_ph_c3; +static int hf_mac_nr_control_me_phr_ph_c2; +static int hf_mac_nr_control_me_phr_ph_c1; +static int hf_mac_nr_control_me_phr_reserved; +static int hf_mac_nr_control_me_phr_pcmax_f_c_type2_spcell; +static int hf_mac_nr_control_me_phr_pcmax_f_c_type1_pcell; /* TODO: is it worth having separate fields for each SCellIndex for this field too? */ -static int hf_mac_nr_control_me_phr_pcmax_f_c_typeX = -1; -static int hf_mac_nr_control_recommended_bit_rate_lcid = -1; -static int hf_mac_nr_control_recommended_bit_rate_dir = -1; -static int hf_mac_nr_control_recommended_bit_rate_bit_rate = -1; -static int hf_mac_nr_control_recommended_bit_rate_reserved = -1; -static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_ad = -1; -static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_serving_cell_id = -1; -static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_bwp_id = -1; -static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_reserved_2 = -1; -static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_sp_zp_rs_resource_set_id = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_reserved = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_serving_cell_id = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_bwp_id = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_pucch_resource_id = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s8 = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s7 = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s6 = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s5 = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s4 = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s3 = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s2 = -1; -static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s1 = -1; -static int hf_mac_nr_control_sp_srs_act_deact_ad = -1; -static int hf_mac_nr_control_sp_srs_act_deact_srs_resource_set_cell_id = -1; -static int hf_mac_nr_control_sp_srs_act_deact_srs_resource_set_bwp_id = -1; -static int hf_mac_nr_control_sp_srs_act_deact_reserved = -1; -static int hf_mac_nr_control_sp_srs_act_deact_c = -1; -static int hf_mac_nr_control_sp_srs_act_deact_sul = -1; -static int hf_mac_nr_control_sp_srs_act_deact_sp_srs_resource_set_id = -1; -static int hf_mac_nr_control_sp_srs_act_deact_f = -1; -static int hf_mac_nr_control_sp_srs_act_deact_resource_id = -1; -static int hf_mac_nr_control_sp_srs_act_deact_resource_id_ssb = -1; -static int hf_mac_nr_control_sp_srs_act_deact_resource_serving_cell_id = -1; -static int hf_mac_nr_control_sp_srs_act_deact_resource_bwp_id = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_reserved = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_serving_cell_id = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_bwp_id = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s7 = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s6 = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s5 = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s4 = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s3 = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s2 = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s1 = -1; -static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s0 = -1; -static int hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_serving_cell_id = -1; -static int hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_coreset_id = -1; -static int hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_tci_state_id = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_reserved = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_serving_cell_id = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_bwp_id = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t7 = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t6 = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t5 = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t4 = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t3 = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t2 = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t1 = -1; -static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t0 = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_reserved = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_serving_cell_id = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_bwp_id = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t7 = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t6 = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t5 = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t4 = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t3 = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t2 = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t1 = -1; -static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t0 = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_ad = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_serving_cell_id = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_bwp_id = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_im = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_sp_csi_rs_res_set_id = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved2 = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_sp_csi_im_res_set_id = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved3 = -1; -static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_tci_state_id = -1; -static int hf_mac_nr_control_dupl_act_deact_drb7 = -1; -static int hf_mac_nr_control_dupl_act_deact_drb6 = -1; -static int hf_mac_nr_control_dupl_act_deact_drb5 = -1; -static int hf_mac_nr_control_dupl_act_deact_drb4 = -1; -static int hf_mac_nr_control_dupl_act_deact_drb3 = -1; -static int hf_mac_nr_control_dupl_act_deact_drb2 = -1; -static int hf_mac_nr_control_dupl_act_deact_drb1 = -1; -static int hf_mac_nr_control_dupl_act_deact_reserved = -1; -static int hf_mac_nr_control_scell_act_deact_cell7 = -1; -static int hf_mac_nr_control_scell_act_deact_cell6 = -1; -static int hf_mac_nr_control_scell_act_deact_cell5 = -1; -static int hf_mac_nr_control_scell_act_deact_cell4 = -1; -static int hf_mac_nr_control_scell_act_deact_cell3 = -1; -static int hf_mac_nr_control_scell_act_deact_cell2 = -1; -static int hf_mac_nr_control_scell_act_deact_cell1 = -1; -static int hf_mac_nr_control_scell_act_deact_reserved = -1; -static int hf_mac_nr_control_scell_act_deact_cell15 = -1; -static int hf_mac_nr_control_scell_act_deact_cell14 = -1; -static int hf_mac_nr_control_scell_act_deact_cell13 = -1; -static int hf_mac_nr_control_scell_act_deact_cell12 = -1; -static int hf_mac_nr_control_scell_act_deact_cell11 = -1; -static int hf_mac_nr_control_scell_act_deact_cell10 = -1; -static int hf_mac_nr_control_scell_act_deact_cell9 = -1; -static int hf_mac_nr_control_scell_act_deact_cell8 = -1; -static int hf_mac_nr_control_scell_act_deact_cell23 = -1; -static int hf_mac_nr_control_scell_act_deact_cell22 = -1; -static int hf_mac_nr_control_scell_act_deact_cell21 = -1; -static int hf_mac_nr_control_scell_act_deact_cell20 = -1; -static int hf_mac_nr_control_scell_act_deact_cell19 = -1; -static int hf_mac_nr_control_scell_act_deact_cell18 = -1; -static int hf_mac_nr_control_scell_act_deact_cell17 = -1; -static int hf_mac_nr_control_scell_act_deact_cell16 = -1; -static int hf_mac_nr_control_scell_act_deact_cell31 = -1; -static int hf_mac_nr_control_scell_act_deact_cell30 = -1; -static int hf_mac_nr_control_scell_act_deact_cell29 = -1; -static int hf_mac_nr_control_scell_act_deact_cell28 = -1; -static int hf_mac_nr_control_scell_act_deact_cell27 = -1; -static int hf_mac_nr_control_scell_act_deact_cell26 = -1; -static int hf_mac_nr_control_scell_act_deact_cell25 = -1; -static int hf_mac_nr_control_scell_act_deact_cell24 = -1; -static int hf_mac_nr_control_bsr_short_lcg = -1; -static int hf_mac_nr_control_bsr_short_bs_lcg0 = -1; -static int hf_mac_nr_control_bsr_short_bs_lcg1 = -1; -static int hf_mac_nr_control_bsr_short_bs_lcg2 = -1; -static int hf_mac_nr_control_bsr_short_bs_lcg3 = -1; -static int hf_mac_nr_control_bsr_short_bs_lcg4 = -1; -static int hf_mac_nr_control_bsr_short_bs_lcg5 = -1; -static int hf_mac_nr_control_bsr_short_bs_lcg6 = -1; -static int hf_mac_nr_control_bsr_short_bs_lcg7 = -1; -static int hf_mac_nr_control_bsr_long_lcg7 = -1; -static int hf_mac_nr_control_bsr_long_lcg6 = -1; -static int hf_mac_nr_control_bsr_long_lcg5 = -1; -static int hf_mac_nr_control_bsr_long_lcg4 = -1; -static int hf_mac_nr_control_bsr_long_lcg3 = -1; -static int hf_mac_nr_control_bsr_long_lcg2 = -1; -static int hf_mac_nr_control_bsr_long_lcg1 = -1; -static int hf_mac_nr_control_bsr_long_lcg0 = -1; -static int hf_mac_nr_control_bsr_trunc_long_bs = -1; -static int hf_mac_nr_control_bsr_long_bs_lcg0 = -1; -static int hf_mac_nr_control_bsr_long_bs_lcg1 = -1; -static int hf_mac_nr_control_bsr_long_bs_lcg2 = -1; -static int hf_mac_nr_control_bsr_long_bs_lcg3 = -1; -static int hf_mac_nr_control_bsr_long_bs_lcg4 = -1; -static int hf_mac_nr_control_bsr_long_bs_lcg5 = -1; -static int hf_mac_nr_control_bsr_long_bs_lcg6 = -1; -static int hf_mac_nr_control_bsr_long_bs_lcg7 = -1; - -static int hf_mac_nr_rar = -1; -static int hf_mac_nr_rar_subheader = -1; -static int hf_mac_nr_rar_e = -1; -static int hf_mac_nr_rar_t = -1; -static int hf_mac_nr_rar_reserved = -1; -static int hf_mac_nr_rar_reserved1 = -1; - -static int hf_mac_nr_rar_bi = -1; -static int hf_mac_nr_rar_rapid = -1; -static int hf_mac_nr_rar_ta = -1; -static int hf_mac_nr_rar_grant = -1; -static int hf_mac_nr_rar_grant_hopping = -1; -static int hf_mac_nr_rar_grant_fra = -1; -static int hf_mac_nr_rar_grant_tsa = -1; -static int hf_mac_nr_rar_grant_mcs = -1; -static int hf_mac_nr_rar_grant_tcsp = -1; -static int hf_mac_nr_rar_grant_csi = -1; - -static int hf_mac_nr_rar_temp_crnti = -1; - -static int hf_mac_nr_padding = -1; - +static int hf_mac_nr_control_me_phr_pcmax_f_c_typeX; +static int hf_mac_nr_control_recommended_bit_rate_lcid; +static int hf_mac_nr_control_recommended_bit_rate_dir; +static int hf_mac_nr_control_recommended_bit_rate_bit_rate; +static int hf_mac_nr_control_recommended_bit_rate_reserved; +static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_ad; +static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_serving_cell_id; +static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_bwp_id; +static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_reserved_2; +static int hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_sp_zp_rs_resource_set_id; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_reserved; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_serving_cell_id; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_bwp_id; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_pucch_resource_id; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s8; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s7; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s6; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s5; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s4; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s3; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s2; +static int hf_mac_nr_control_pucch_spatial_rel_act_deact_s1; +static int hf_mac_nr_control_sp_srs_act_deact_ad; +static int hf_mac_nr_control_sp_srs_act_deact_srs_resource_set_cell_id; +static int hf_mac_nr_control_sp_srs_act_deact_srs_resource_set_bwp_id; +static int hf_mac_nr_control_sp_srs_act_deact_reserved; +static int hf_mac_nr_control_sp_srs_act_deact_c; +static int hf_mac_nr_control_sp_srs_act_deact_sul; +static int hf_mac_nr_control_sp_srs_act_deact_sp_srs_resource_set_id; +static int hf_mac_nr_control_sp_srs_act_deact_f; +static int hf_mac_nr_control_sp_srs_act_deact_resource_id; +static int hf_mac_nr_control_sp_srs_act_deact_resource_id_ssb; +static int hf_mac_nr_control_sp_srs_act_deact_resource_serving_cell_id; +static int hf_mac_nr_control_sp_srs_act_deact_resource_bwp_id; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_reserved; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_serving_cell_id; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_bwp_id; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s7; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s6; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s5; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s4; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s3; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s2; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s1; +static int hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s0; +static int hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_serving_cell_id; +static int hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_coreset_id; +static int hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_tci_state_id; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_reserved; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_serving_cell_id; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_bwp_id; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t7; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t6; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t5; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t4; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t3; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t2; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t1; +static int hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t0; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_reserved; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_serving_cell_id; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_bwp_id; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t7; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t6; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t5; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t4; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t3; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t2; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t1; +static int hf_mac_nr_control_aper_csi_trigger_state_subselect_t0; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_ad; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_serving_cell_id; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_bwp_id; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_im; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_sp_csi_rs_res_set_id; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved2; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_sp_csi_im_res_set_id; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved3; +static int hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_tci_state_id; +static int hf_mac_nr_control_dupl_act_deact_drb7; +static int hf_mac_nr_control_dupl_act_deact_drb6; +static int hf_mac_nr_control_dupl_act_deact_drb5; +static int hf_mac_nr_control_dupl_act_deact_drb4; +static int hf_mac_nr_control_dupl_act_deact_drb3; +static int hf_mac_nr_control_dupl_act_deact_drb2; +static int hf_mac_nr_control_dupl_act_deact_drb1; +static int hf_mac_nr_control_dupl_act_deact_reserved; +static int hf_mac_nr_control_scell_act_deact_cell7; +static int hf_mac_nr_control_scell_act_deact_cell6; +static int hf_mac_nr_control_scell_act_deact_cell5; +static int hf_mac_nr_control_scell_act_deact_cell4; +static int hf_mac_nr_control_scell_act_deact_cell3; +static int hf_mac_nr_control_scell_act_deact_cell2; +static int hf_mac_nr_control_scell_act_deact_cell1; +static int hf_mac_nr_control_scell_act_deact_reserved; +static int hf_mac_nr_control_scell_act_deact_cell15; +static int hf_mac_nr_control_scell_act_deact_cell14; +static int hf_mac_nr_control_scell_act_deact_cell13; +static int hf_mac_nr_control_scell_act_deact_cell12; +static int hf_mac_nr_control_scell_act_deact_cell11; +static int hf_mac_nr_control_scell_act_deact_cell10; +static int hf_mac_nr_control_scell_act_deact_cell9; +static int hf_mac_nr_control_scell_act_deact_cell8; +static int hf_mac_nr_control_scell_act_deact_cell23; +static int hf_mac_nr_control_scell_act_deact_cell22; +static int hf_mac_nr_control_scell_act_deact_cell21; +static int hf_mac_nr_control_scell_act_deact_cell20; +static int hf_mac_nr_control_scell_act_deact_cell19; +static int hf_mac_nr_control_scell_act_deact_cell18; +static int hf_mac_nr_control_scell_act_deact_cell17; +static int hf_mac_nr_control_scell_act_deact_cell16; +static int hf_mac_nr_control_scell_act_deact_cell31; +static int hf_mac_nr_control_scell_act_deact_cell30; +static int hf_mac_nr_control_scell_act_deact_cell29; +static int hf_mac_nr_control_scell_act_deact_cell28; +static int hf_mac_nr_control_scell_act_deact_cell27; +static int hf_mac_nr_control_scell_act_deact_cell26; +static int hf_mac_nr_control_scell_act_deact_cell25; +static int hf_mac_nr_control_scell_act_deact_cell24; +static int hf_mac_nr_control_bsr_short_lcg; +static int hf_mac_nr_control_bsr_short_bs_lcg0; +static int hf_mac_nr_control_bsr_short_bs_lcg1; +static int hf_mac_nr_control_bsr_short_bs_lcg2; +static int hf_mac_nr_control_bsr_short_bs_lcg3; +static int hf_mac_nr_control_bsr_short_bs_lcg4; +static int hf_mac_nr_control_bsr_short_bs_lcg5; +static int hf_mac_nr_control_bsr_short_bs_lcg6; +static int hf_mac_nr_control_bsr_short_bs_lcg7; +static int hf_mac_nr_control_bsr_long_lcg7; +static int hf_mac_nr_control_bsr_long_lcg6; +static int hf_mac_nr_control_bsr_long_lcg5; +static int hf_mac_nr_control_bsr_long_lcg4; +static int hf_mac_nr_control_bsr_long_lcg3; +static int hf_mac_nr_control_bsr_long_lcg2; +static int hf_mac_nr_control_bsr_long_lcg1; +static int hf_mac_nr_control_bsr_long_lcg0; +static int hf_mac_nr_control_bsr_trunc_long_bs; +static int hf_mac_nr_control_bsr_long_bs_lcg0; +static int hf_mac_nr_control_bsr_long_bs_lcg1; +static int hf_mac_nr_control_bsr_long_bs_lcg2; +static int hf_mac_nr_control_bsr_long_bs_lcg3; +static int hf_mac_nr_control_bsr_long_bs_lcg4; +static int hf_mac_nr_control_bsr_long_bs_lcg5; +static int hf_mac_nr_control_bsr_long_bs_lcg6; +static int hf_mac_nr_control_bsr_long_bs_lcg7; +static int hf_mac_nr_control_timing_advance_report_reserved; +static int hf_mac_nr_control_timing_advance_report_ta; + +static int hf_mac_nr_rar; +static int hf_mac_nr_rar_subheader; +static int hf_mac_nr_rar_e; +static int hf_mac_nr_rar_t; +static int hf_mac_nr_rar_reserved; +static int hf_mac_nr_rar_reserved1; + +static int hf_mac_nr_rar_bi; +static int hf_mac_nr_rar_rapid; +static int hf_mac_nr_rar_ta; +static int hf_mac_nr_rar_grant; +static int hf_mac_nr_rar_grant_hopping; +static int hf_mac_nr_rar_grant_fra; +static int hf_mac_nr_rar_grant_tsa; +static int hf_mac_nr_rar_grant_mcs; +static int hf_mac_nr_rar_grant_tcsp; +static int hf_mac_nr_rar_grant_csi; + +static int hf_mac_nr_rar_temp_crnti; + +static int hf_mac_nr_padding; + +static int hf_mac_nr_differential_koffset; +static int hf_mac_nr_differential_koffset_reserved; /* Subtrees. */ -static int ett_mac_nr = -1; -static int ett_mac_nr_context = -1; -static int ett_mac_nr_subheader = -1; -static int ett_mac_nr_rar_subheader = -1; -static int ett_mac_nr_rar_grant = -1; -static int ett_mac_nr_me_phr_entry = -1; +static int ett_mac_nr; +static int ett_mac_nr_context; +static int ett_mac_nr_subheader; +static int ett_mac_nr_rar_subheader; +static int ett_mac_nr_rar_grant; +static int ett_mac_nr_me_phr_entry; -static expert_field ei_mac_nr_no_per_frame_data = EI_INIT; -static expert_field ei_mac_nr_sdu_length_different_from_dissected = EI_INIT; -static expert_field ei_mac_nr_unknown_udp_framing_tag = EI_INIT; -static expert_field ei_mac_nr_dl_sch_control_subheader_after_data_subheader = EI_INIT; -static expert_field ei_mac_nr_ul_sch_control_subheader_before_data_subheader = EI_INIT; +static expert_field ei_mac_nr_no_per_frame_data; +static expert_field ei_mac_nr_sdu_length_different_from_dissected; +static expert_field ei_mac_nr_unknown_udp_framing_tag; +static expert_field ei_mac_nr_dl_sch_control_subheader_after_data_subheader; +static expert_field ei_mac_nr_ul_sch_control_subheader_before_data_subheader; static dissector_handle_t nr_rrc_bcch_bch_handle; @@ -498,24 +509,26 @@ static const value_string bcch_transport_channel_vals[] = { 0, NULL } }; -#define CCCH_LCID 0x00 -#define RECOMMENDED_BIT_RATE_LCID 0x2f -#define SP_ZP_CSI_RS_RESOURCE_SET_ACT_DEACT_LCID 0x30 -#define PUCCH_SPATIAL_REL_ACT_DEACT_LCID 0x31 -#define SP_SRS_ACT_DEACT_LCID 0x32 -#define SP_CSI_REPORT_ON_PUCCH_ACT_DEACT_LCID 0x33 -#define TCI_STATE_IND_FOR_UE_SPEC_PDCCH_LCID 0x34 -#define TCI_STATES_ACT_DEACT_FOR_UE_SPEC_PDSCH_LCID 0x35 -#define APER_CSI_TRIGGER_STATE_SUBSELECT_LCID 0x36 -#define SP_CSI_RS_CSI_IM_RES_SET_ACT_DEACT_LCID 0x37 -#define DUPLICATION_ACTIVATION_DEACTIVATION_LCID 0x38 -#define SCELL_ACTIVATION_DEACTIVATION_4_LCID 0x39 -#define SCELL_ACTIVATION_DEACTIVATION_1_LCID 0x3a -#define LONG_DRX_COMMAND_LCID 0x3b -#define DRX_COMMAND_LCID 0x3c -#define TIMING_ADVANCE_COMMAND_LCID 0x3d -#define UE_CONTENTION_RESOLUTION_IDENTITY_LCID 0x3e -#define PADDING_LCID 0x3f +#define CCCH_LCID 0 +#define TWO_OCTET_ELCID_FIELD 33 +#define ONE_OCTET_ELCID_FIELD 34 +#define RECOMMENDED_BIT_RATE_LCID 47 +#define SP_ZP_CSI_RS_RESOURCE_SET_ACT_DEACT_LCID 48 +#define PUCCH_SPATIAL_REL_ACT_DEACT_LCID 49 +#define SP_SRS_ACT_DEACT_LCID 50 +#define SP_CSI_REPORT_ON_PUCCH_ACT_DEACT_LCID 51 +#define TCI_STATE_IND_FOR_UE_SPEC_PDCCH_LCID 52 +#define TCI_STATES_ACT_DEACT_FOR_UE_SPEC_PDSCH_LCID 53 +#define APER_CSI_TRIGGER_STATE_SUBSELECT_LCID 54 +#define SP_CSI_RS_CSI_IM_RES_SET_ACT_DEACT_LCID 55 +#define DUPLICATION_ACTIVATION_DEACTIVATION_LCID 56 +#define SCELL_ACTIVATION_DEACTIVATION_4_LCID 57 +#define SCELL_ACTIVATION_DEACTIVATION_1_LCID 58 +#define LONG_DRX_COMMAND_LCID 59 +#define DRX_COMMAND_LCID 60 +#define TIMING_ADVANCE_COMMAND_LCID 61 +#define UE_CONTENTION_RESOLUTION_IDENTITY_LCID 62 +#define PADDING_LCID 63 static const value_string dlsch_lcid_vals[] = { @@ -552,6 +565,20 @@ static const value_string dlsch_lcid_vals[] = { 30, "30"}, { 31, "31"}, { 32, "32"}, + { 33, "Extended logical channel ID field(two octet eLCID field)"}, + { 34, "Extended logical channel ID field(one octet eLCID field)"}, + { 35, "Reserved"}, + { 36, "Reserved"}, + { 37, "Reserved"}, + { 38, "Reserved"}, + { 39, "Reserved"}, + { 40, "Reserved"}, + { 41, "Reserved"}, + { 42, "Reserved"}, + { 43, "Reserved"}, + { 44, "Reserved"}, + { 45, "Reserved"}, + { 46, "Reserved"}, { RECOMMENDED_BIT_RATE_LCID, "Recommended Bit Rate"}, { SP_ZP_CSI_RS_RESOURCE_SET_ACT_DEACT_LCID, "SP ZP CSI-RS Resource Set Activation/Deactivation"}, { PUCCH_SPATIAL_REL_ACT_DEACT_LCID, "PUCCH spatial relation Activation/Deactivation"}, @@ -573,18 +600,95 @@ static const value_string dlsch_lcid_vals[] = }; static value_string_ext dlsch_lcid_vals_ext = VALUE_STRING_EXT_INIT(dlsch_lcid_vals); -#define CCCH_48_BITS_LCID 0x34 -#define RECOMMENDED_BIT_RATE_QUERY_LCID 0x35 -#define MULTIPLE_ENTRY_PHR_4_LCID 0x36 -#define CONFIGURED_GRANT_CONFIGURATION_LCID 0x37 -#define MULTIPLE_ENTRY_PHR_1_LCID 0x38 -#define SINGLE_ENTRY_PHR_LCID 0x39 -#define C_RNTI_LCID 0x3a -#define SHORT_TRUNCATED_BSR_LCID 0x3b -#define LONG_TRUNCATED_BSR_LCID 0x3c -#define SHORT_BSR_LCID 0x3d -#define LONG_BSR_LCID 0x3e -#define PADDING_LCID 0x3f +/* TODO: not all LCIDs handled yet */ +#define TRUNCATED_ENHANCED_BFR_LCID 43 +#define TIMING_ADVANCE_REPORT_LCID 44 +#define TRUNCATED_SIDELINK_BSR_LCID 45 +#define SIDELINK_BSR_LCID 46 +#define RESERVED_47_LCID 47 +#define LBT_FAILURE_4_OCTETS_LCID 48 +#define LBT_FAILURE_1_OCTET_LCID 49 +#define BFR_LCID 50 +#define TRUNCATED_BFR_LCID 51 +#define CCCH_48_BITS_LCID 52 +#define RECOMMENDED_BIT_RATE_QUERY_LCID 53 +#define MULTIPLE_ENTRY_PHR_4_LCID 54 +#define CONFIGURED_GRANT_CONFIGURATION_LCID 55 +#define MULTIPLE_ENTRY_PHR_1_LCID 56 +#define SINGLE_ENTRY_PHR_LCID 57 +#define C_RNTI_LCID 58 +#define SHORT_TRUNCATED_BSR_LCID 59 +#define LONG_TRUNCATED_BSR_LCID 60 +#define SHORT_BSR_LCID 61 +#define LONG_BSR_LCID 62 + +/* Table 6.2.1-1b Values of one-octet eLCID for DL-SCH */ + +#define SERVING_CELL_SET_BASED_SRS_TCI_STATE_INDICATIONS_ELCD 227 +#define SP_AP_SRS_TCI_STATE_INDICATION_ELCD 228 +#define BFD_RS_INDICATION_ELCD 229 +#define DIFFERENTIAL_KOFFSET_ELCD 230 +#define ENHANCED_SCELL_ACTIVATION_DEACTIVATION_MAC_CE_WITH_ONE_OCTET_CI_FIELD_ELCD 231 +#define ENHANCED_SCELL_ACTIVATION_DEACTIVATION_MAC_CE_WITH_FOUR_OCTET_CI_FIELD_ELCD 232 +#define UNIFIED_TCI_STATES_ACTIVATION_DEACTIVATION_ELCD 233 +#define PUCCH_POWER_CONTROL_SET_UPDATE_FOR_MULTIPLE_TRP_PUCCH_REPETITION__ELCD 234 +#define PUCCH_SPATIAL_RELATION_ACTIVATION_DEACTIVATION_FOR_MULTIPLE_TRP_PUCCH_REPETITION_ELCD 235 +#define ENHANCED_TCI_STATES_INDICATION_FOR_UE_SPECIFIC_PDCCH_ELCD 236 +#define POSITIONING_MEASUREMENT_GAP_ACTIVATION_DEACTIVATION_COMMAND_ELCD 237 +#define PPW_ACTIVATION_DEACTIVATION_COMMAND_ELCD 238 +#define DL_TX_POWER_ADJUSTMENT_ELCD 239 +#define TIMING_CASE_INDICATION_ELCD 240 +#define CHILD_IAB_DU_RESTRICTED_BEAM_INDICATION_ELCD 241 +#define CASE_7_TIMING_ADVANCE_OFFSET_ELCD 242 +#define PROVIDED_GUARD_SYMBOLS_FOR_CASE_6_TIMING_ELCD 243 +#define PROVIDED_GUARD_SYMBOLS_FOR_CASE_7_TIMING_ELCD 244 +#define SERVING_CELL_SET_BASED_SRS_SPATIAL_RELATION_INDICATION_ELCD 245 +#define PUSCH_PATHLOSS_REFERENCE_RS_UPDATE_ELCD 246 +#define SRS_PATHLOSS_REFERENCE_RS_UPDATE_ELCD 247 +#define ENHANCED_SP_AP_SRS_SPATIAL_RELATION_INDICATION_ELCD 248 +#define ENHANCED_PUCCH_SPATIAL_RELATION_ACTIVATION_DEACTIVATION_ELCD 249 +#define ENHANCED_TCI_STATES_ACTIVATION_DEACTIVATION_FOR_UE_SPECIFIC_PDSCH_ELCD 250 +#define DUPLICATION_RLC_ACTIVATION_DEACTIVATION_ELCD 251 +#define ABSOLUTE_TIMING_ADVANCE_COMMAND_ELCD 252 +#define SP_POSITIONING_SRS_ACTIVATION_DEACTIVATION_ELCD 253 +#define PROVIDED_GUARD_SYMBOLS_ELCD 254 +#define TIMING_DELTA_ELCD 255 + +static const value_string dlsch_elcid_vals[] = +{ +//0 to 226 64 to 290 Reserved + { 227, "Serving Cell Set based SRS TCI State Indication"}, + { 228, "SP/AP SRS TCI State Indication"}, + { 229, "BFD-RS Indication"}, + { 230, "Differential Koffset"}, + { 231, "Enhanced SCell Activation/Deactivation with one octet Ci field"}, + { 232, "Enhanced SCell Activation/Deactivation with four octet Ci field"}, + { 233, "Unified TCI States Activation/Deactivation"}, + { 234, "PUCCH Power Control Set Update for multiple TRP PUCCH repetition"}, + { 235, "PUCCH spatial relation Activation/Deactivation for multiple TRP PUCCH repetition"}, + { 236, "Enhanced TCI States Indication for UE-specific PDCCH"}, + { 237, "Positioning Measurement Gap Activation/Deactivation Command"}, + { 238, "PPW Activation/Deactivation Command"}, + { 239, "DL Tx Power Adjustment"}, + { 240, "Timing Case Indication"}, + { 241, "Child IAB-DU Restricted Beam Indication"}, + { 242, "Case-7 Timing advance offset"}, + { 243, "Provided Guard Symbols for Case-6 timing"}, + { 244, "Provided Guard Symbols for Case-7 timing"}, + { 245, "Serving Cell Set based SRS Spatial Relation Indication"}, + { 246, "PUSCH Pathloss Reference RS Update"}, + { 247, "SRS Pathloss Reference RS Update"}, + { 248, "Enhanced SP/AP SRS Spatial Relation Indication"}, + { 249, "Enhanced PUCCH Spatial Relation Activation/Deactivation"}, + { 250, "Enhanced TCI States Activation/Deactivation for UE-specific PDSCH"}, + { 251, "Duplication RLC Activation/Deactivation"}, + { 252, "Absolute Timing Advance Command"}, + { 253, "SP Positioning SRS Activation/Deactivation"}, + { 254, "Provided Guard Symbols"}, + { 255, "Timing Delta"}, + { 0, NULL } +}; +static value_string_ext dlsch_elcid_vals_ext = VALUE_STRING_EXT_INIT(dlsch_elcid_vals); static const value_string ulsch_lcid_vals[] = { @@ -621,22 +725,105 @@ static const value_string ulsch_lcid_vals[] = { 30, "30"}, { 31, "31"}, { 32, "32"}, - { CCCH_48_BITS_LCID, "CCCH (48 bits)"}, - { RECOMMENDED_BIT_RATE_QUERY_LCID, "Recommended Bit Rate Query"}, - { MULTIPLE_ENTRY_PHR_4_LCID, "Multiple Entry PHR (4 octet C)"}, - { CONFIGURED_GRANT_CONFIGURATION_LCID, "Configured Grant Confirmation"}, - { MULTIPLE_ENTRY_PHR_1_LCID, "Multiple Entry PHR (1 octet C)"}, - { SINGLE_ENTRY_PHR_LCID, "Single Entry PHR"}, - { C_RNTI_LCID, "C-RNTI"}, - { SHORT_TRUNCATED_BSR_LCID, "Short Truncated BSR"}, - { LONG_TRUNCATED_BSR_LCID, "Long Truncated BSR"}, - { SHORT_BSR_LCID, "Short BSR"}, - { LONG_BSR_LCID, "Long BSR"}, - { PADDING_LCID, "Padding"}, + { 33, "Extended logical channel ID field(two-octet eLCID field)"}, + { 34, "Extended logical channel ID field(one-octet eLCID field)"}, + { 35, "CCCH of size 48 bits(referred to as 'CCCH' in TS 38.331[5]) for a RedCap UE"}, + { 36, "CCCH of size 64 bits(referred to as 'CCCH1' in TS 38.331[5]) for a RedCap UE"}, + { 37, "Reserved"}, + { 38, "Reserved"}, + { 39, "Reserved"}, + { 40, "Reserved"}, + { 41, "Reserved"}, + { 42, "Reserved"}, + { TRUNCATED_ENHANCED_BFR_LCID, "Truncated Enhanced BFR"}, // 43 + { TIMING_ADVANCE_REPORT_LCID, "Timing Advance Report"}, // 44 + { TRUNCATED_SIDELINK_BSR_LCID, "Truncated Sidelink BSR"}, // 45 + { SIDELINK_BSR_LCID, "Sidelink BSR"}, // 46 + { RESERVED_47_LCID, "Reserved"}, // 47 + { LBT_FAILURE_4_OCTETS_LCID, "LBT Failure 4 octets"}, // 48 + { LBT_FAILURE_1_OCTET_LCID, "LBT Failure 1 octet"}, // 49 + { BFR_LCID, "BFR"}, // 50 + { TRUNCATED_BFR_LCID, "Truncated BFR"}, // 51 + { CCCH_48_BITS_LCID, "CCCH (48 bits)"}, // 52 + { RECOMMENDED_BIT_RATE_QUERY_LCID, "Recommended Bit Rate Query"}, // 53 + { MULTIPLE_ENTRY_PHR_4_LCID, "Multiple Entry PHR (4 octet C)"}, // 54 + { CONFIGURED_GRANT_CONFIGURATION_LCID, "Configured Grant Confirmation"}, // 55 + { MULTIPLE_ENTRY_PHR_1_LCID, "Multiple Entry PHR (1 octet C)"}, // 56 + { SINGLE_ENTRY_PHR_LCID, "Single Entry PHR"}, // 57 + { C_RNTI_LCID, "C-RNTI"}, // 58 + { SHORT_TRUNCATED_BSR_LCID, "Short Truncated BSR"}, // 59 + { LONG_TRUNCATED_BSR_LCID, "Long Truncated BSR"}, // 60 + { SHORT_BSR_LCID, "Short BSR"}, // 61 + { LONG_BSR_LCID, "Long BSR"}, // 62 + { PADDING_LCID, "Padding"}, // 63 { 0, NULL } }; static value_string_ext ulsch_lcid_vals_ext = VALUE_STRING_EXT_INIT(ulsch_lcid_vals); +#define ENHANCED_MULTIPLE_ENTRY_PHR_FOR_MULTIPLE_TRP_FOUR_OCTETS_CI 229 +#define ENHANCED_MULTIPLE_ENTRY_PHR_FOR_MULTIPLE_TRP_ONE_OCTETS_CI 230 +#define ENHANCED_SINGLE_ENTRY_PHR_FOR_MULTIPLE_TRP 231 +#define ENHANCED_MULTIPLE_ENTRY_PHR_FOUR_OCTETS_CI 232 +#define ENHANCED_MULTIPLE_ENTRY_PHR_ONE_OCTETS_CI 233 +#define ENHANCED_SINGLE_ENTRY_PHR 234 +#define ENHANCED_BFR_ONE_OCTET_CI 235 +#define ENHANCED_BFR_FOUR_OCTET_CI 236 +#define TRUNCATED_ENHANCED_BFR_FOUR_OCTET_CI 237 +#define POSITIONING_MEASUREMENT_GAP_ACTIVATION_DEACTIVATION_REQUEST 238 +#define IAB_MT_RECOMMENDED_BEAM_INDICATION 239 +#define DESIRED_IAB_MT_PSD_RANGE 240 +#define DESIRED_DL_TX_POWER_ADJUSTMENT 241 +#define CASE_6_TIMING_REQUEST 242 +#define DESIRED_GUARD_SYMBOLS_FOR_CASE_6_TIMING 243 +#define DESIRED_GUARD_SYMBOLS_FOR_CASE_7_TIMING 244 +#define EXTENDED_SHORT_TRUNCATED_BSR 245 +#define EXTENDED_LONG_TRUNCATED_BSR 246 +#define EXTENDED_SHORT_BSR 247 +#define EXTENDED_LONG_BSR 248 +#define EXTENDED_PRE_EMPTIVE_BSR 249 +#define BFR_FOUR_OCTETS_CI 250 +#define TRUNCATED_BFR_FOUR_OCTETS_CI 251 +#define MULTIPLE_ENTRY_CONFIGURED_GRANT_CONFIRMATION 252 +#define SIDELINK_CONFIGURED_GRANT_CONFIRMATION 253 +#define DESIRED_GUARD_SYMBOLS 254 +#define PRE_EMPTIVE_BSR 255 + +static const value_string ulsch_elcid_vals[] = +{ +//Table 6.2.1-2b Values of one-octet eLCID for UL-SCH +//Codepoint Index LCID values +//0 to 228 64 to 292 Reserved + { 229, "Enhanced Multiple Entry PHR for multiple TRP(four octets Ci)"}, + { 230, "Enhanced Multiple Entry PHR for multiple TRP(one octets Ci)"}, + { 231, "Enhanced Single Entry PHR for multiple TRP"}, + { 232, "Enhanced Multiple Entry PHR(four octets Ci)"}, + { 233, "Enhanced Multiple Entry PHR(one octets Ci)"}, + { 234, "Enhanced Single Entry PHR"}, + { 235, "Enhanced BFR(one octet Ci)"}, + { 236, "Enhanced BFR(four octet Ci)"}, + { 237, "Truncated Enhanced BFR(four octet Ci)"}, + { 238, "Positioning Measurement Gap Activation/Deactivation Request"}, + { 239, "IAB-MT Recommended Beam Indication"}, + { 240, "Desired IAB-MT PSD range"}, + { 241, "Desired DL Tx Power Adjustment"}, + { 242, "Case-6 Timing Request"}, + { 243, "Desired Guard Symbols for Case 6 timing"}, + { 244, "Desired Guard Symbols for Case 7 timing"}, + { 245, "Extended Short Truncated BSR"}, + { 246, "Extended Long Truncated BSR"}, + { 247, "Extended Short BSR"}, + { 248, "Extended Long BSR"}, + { 249, "Extended Pre-emptive BSR"}, + { 250, "BFR(four octets Ci)"}, + { 251, "Truncated BFR(four octets Ci)"}, + { 252, "Multiple Entry Configured Grant Confirmation"}, + { 253, "Sidelink Configured Grant Confirmation"}, + { 254, "Desired Guard Symbols"}, + { 255, "Pre-emptive BSR"}, + { 0, NULL } +}; +static value_string_ext ulsch_elcid_vals_ext = VALUE_STRING_EXT_INIT(ulsch_elcid_vals); + static const true_false_string rar_ext_vals = { "Another MAC subPDU follows", @@ -1099,6 +1286,8 @@ static int dissect_mac_nr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, v - 1 or 2 other labels (optional) */ static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2, + packet_info *pinfo, const char *format, ...) G_GNUC_PRINTF(4,5); +static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2, packet_info *pinfo, const char *format, ...) { #define MAX_INFO_BUFFER 256 @@ -1110,7 +1299,7 @@ static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2, } va_start(ap, format); - g_vsnprintf(info_buffer, MAX_INFO_BUFFER, format, ap); + vsnprintf(info_buffer, MAX_INFO_BUFFER, format, ap); va_end(ap); /* Add to indicated places */ @@ -1125,7 +1314,7 @@ static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2, } } -/* Version of function above, where no g_vsnprintf() call needed */ +/* Version of function above, where no vsnprintf() call needed */ static void write_pdu_label_and_info_literal(proto_item *ti1, proto_item *ti2, packet_info *pinfo, const char *info_buffer) { @@ -1158,7 +1347,9 @@ call_with_catch_all(dissector_handle_t handle, tvbuff_t* tvb, packet_info *pinfo /* Dissect BCCH PDU */ static void dissect_bcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *pdu_ti, - int offset, mac_nr_info *p_mac_nr_info) + int offset, + mac_nr_info *p_mac_nr_info, + mac_3gpp_tap_info *tap_info _U_) { proto_item *ti; @@ -1201,7 +1392,9 @@ static void dissect_bcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* Dissect PCCH PDU */ static void dissect_pcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - proto_item *pdu_ti, int offset, mac_nr_info *p_mac_nr_info _U_) + proto_item *pdu_ti, int offset, + mac_nr_info *p_mac_nr_info _U_, + mac_3gpp_tap_info *tap_info _U_) { proto_item *ti; @@ -1216,6 +1409,8 @@ static void dissect_pcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, ti = proto_tree_add_item(tree, hf_mac_nr_pcch_pdu, tvb, offset, -1, ENC_NA); + // TODO: add to tap_info->number_of_paging_ids. See LTE. + if (global_mac_nr_attempt_rrc_decode) { /* Attempt to decode payload using NR RRC dissector */ @@ -1231,7 +1426,7 @@ static void dissect_pcch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *pdu_ti _U_, guint32 offset, - mac_nr_info *p_mac_nr_info _U_) + mac_nr_info *p_mac_nr_info, mac_3gpp_tap_info *tap_info) { write_pdu_label_and_info(pdu_ti, NULL, pinfo, "RAR (RA-RNTI=%u) ", @@ -1247,7 +1442,7 @@ static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, /* Subheader */ proto_item *subheader_ti = proto_tree_add_item(tree, hf_mac_nr_rar_subheader, - tvb, offset, 0, ENC_ASCII|ENC_NA); + tvb, offset, 0, ENC_ASCII); proto_tree *rar_subheader_tree = proto_item_add_subtree(subheader_ti, ett_mac_nr_rar_subheader); /* Note extension & T bits */ @@ -1295,7 +1490,6 @@ static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, &hf_mac_nr_rar_grant_csi, NULL }; - proto_tree_add_bitmask(rar_subheader_tree, tvb, offset, hf_mac_nr_rar_grant, ett_mac_nr_rar_grant, rar_grant_fields, ENC_BIG_ENDIAN); offset += 4; @@ -1308,10 +1502,7 @@ static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, "(RAPID=%u TA=%u Temp C-RNTI=%u) ", rapid, ta, c_rnti); } - else { - write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, - "(RAPID=%u) ", rapid); - } + tap_info->number_of_rars++; } /* Set subheader (+subpdu..) length */ proto_item_set_end(subheader_ti, tvb, offset); @@ -1322,6 +1513,10 @@ static void dissect_rar(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, if (tvb_reported_length_remaining(tvb, offset)) { proto_tree_add_item(tree, hf_mac_nr_padding, tvb, offset, -1, ENC_NA); } + + /* Update padding bytes in stats */ + tap_info->padding_bytes += (p_mac_nr_info->length - offset); + } static gboolean is_fixed_sized_lcid(guint8 lcid, guint8 direction) @@ -1329,7 +1524,10 @@ static gboolean is_fixed_sized_lcid(guint8 lcid, guint8 direction) if (direction == DIRECTION_UPLINK) { switch (lcid) { case CCCH_LCID: + case 35: /* RedCap CCCH (48 bits) */ + case 36: /* RedCap CCCH1 (64 bits) */ case CCCH_48_BITS_LCID: + case TIMING_ADVANCE_REPORT_LCID: case RECOMMENDED_BIT_RATE_QUERY_LCID: case CONFIGURED_GRANT_CONFIGURATION_LCID: case SINGLE_ENTRY_PHR_LCID: @@ -1344,6 +1542,8 @@ static gboolean is_fixed_sized_lcid(guint8 lcid, guint8 direction) } else { switch (lcid) { + case TWO_OCTET_ELCID_FIELD: + case ONE_OCTET_ELCID_FIELD: case RECOMMENDED_BIT_RATE_LCID: case SP_ZP_CSI_RS_RESOURCE_SET_ACT_DEACT_LCID: case PUCCH_SPATIAL_REL_ACT_DEACT_LCID: @@ -1364,6 +1564,97 @@ static gboolean is_fixed_sized_lcid(guint8 lcid, guint8 direction) } } +static gboolean is_fixed_sized_elcid(guint8 elcid, guint8 direction) +{ + if (direction == DIRECTION_UPLINK) { + switch (elcid) { + case ENHANCED_SINGLE_ENTRY_PHR_FOR_MULTIPLE_TRP: + /* Enhanced Single Entry PHR for multiple TRP */ + case POSITIONING_MEASUREMENT_GAP_ACTIVATION_DEACTIVATION_REQUEST: + /* Positioning Measurement Gap Activation/Deactivation Request */ + case CASE_6_TIMING_REQUEST: + /* Case-6 Timing Request */ + case DESIRED_GUARD_SYMBOLS_FOR_CASE_6_TIMING: + /* Desired Guard Symbols for Case 6 timing */ + case DESIRED_GUARD_SYMBOLS_FOR_CASE_7_TIMING: + /* Desired Guard Symbols for Case 7 timing*/ + case EXTENDED_SHORT_TRUNCATED_BSR: + /* Extended Short Truncated BSR */ + case EXTENDED_SHORT_BSR: + /* Extended Short BSR */ + case MULTIPLE_ENTRY_CONFIGURED_GRANT_CONFIRMATION: + /* Multiple Entry Configured Grant Confirmation 4 octets*/ + case SIDELINK_CONFIGURED_GRANT_CONFIRMATION: + /* Sidelink Configured Grant Confirmation 1 oct*/ + case DESIRED_GUARD_SYMBOLS: + /* Desired Guard Symbols 3 oct*/ + return TRUE; + default: + /* Enhanced Multiple Entry PHR for multiple TRP (one octets Ci) */ + /* 234 Enhanced Single Entry PHR*/ + /* 235 Enhanced BFR (one octet Ci) */ + /* 236 Enhanced BFR (four octet Ci) */ + /* 237 Truncated Enhanced BFR(four octet Ci) */ + /* 239 IAB-MT Recommended Beam Indication */ + /* 240 Desired IAB-MT PSD range */ + /* 241 Desired DL Tx Power Adjustment */ + /* 246 Extended Long Truncated BSR */ + /* 248 Extended Long BSR */ + /* 249 Extended Pre-emptive BSR */ + /* 250 BFR (four octets Ci) */ + /* 251 Truncated BFR (four octets Ci)*/ + /* 255 Pre-emptive BSR */ + return FALSE; + } + } + else { + switch (elcid) { + case DIFFERENTIAL_KOFFSET_ELCD: + /* Differential Koffset, 6bits(1 oct)*/ + case ENHANCED_TCI_STATES_INDICATION_FOR_UE_SPECIFIC_PDCCH_ELCD: + /* Enhanced TCI States Indication for UE-specific PDCCH 3 oct*/ + case POSITIONING_MEASUREMENT_GAP_ACTIVATION_DEACTIVATION_COMMAND_ELCD: + /* Positioning Measurement Gap Activation/Deactivation Command 1 oct*/ + case CASE_7_TIMING_ADVANCE_OFFSET_ELCD: + /* Case-7 Timing advance offset 2 oct*/ + case PROVIDED_GUARD_SYMBOLS_FOR_CASE_6_TIMING_ELCD: + /* Provided Guard Symbols for Case-6 timing 3 oct*/ + case PROVIDED_GUARD_SYMBOLS_FOR_CASE_7_TIMING_ELCD: + /* Provided Guard Symbols for Case-7 timing 3 oct*/ + case SRS_PATHLOSS_REFERENCE_RS_UPDATE_ELCD: + /* SRS Pathloss Reference RS Update 3 oct*/ + case DUPLICATION_RLC_ACTIVATION_DEACTIVATION_ELCD: + /* Duplication RLC Activation/Deactivation 1 oct*/ + case ABSOLUTE_TIMING_ADVANCE_COMMAND_ELCD: + /* Absolute Timing Advance Command 2 oct*/ + case PROVIDED_GUARD_SYMBOLS_ELCD: + /* Provided Guard Symbols 4 oct*/ + case TIMING_DELTA_ELCD: + /* Timing Delta 2 oct*/ + return TRUE; + default: + /* 227 Serving Cell Set based SRS TCI State Indication */ + /* 228 SP/AP SRS TCI State Indication */ + /* 229 BFD-RS Indication */ + /* 231 Enhanced SCell Activation/Deactivation with one octet Ci field */ + /* 232 Enhanced SCell Activation/Deactivation with four octet Ci field */ + /* 233 Unified TCI States Activation/Deactivation */ + /* 234 PUCCH Power Control Set Update for multiple TRP PUCCH repetition*/ + /* 235 PUCCH spatial relation Activation/Deactivation for multiple TRP PUCCH repetition */ + /* 238 PPW Activation/Deactivation Command */ + /* 239 DL Tx Power Adjustment */ + /* 240 Timing Case Indication*/ + /* 241 Child IAB-DU Restricted Beam Indication*/ + /* 245 Serving Cell Set based SRS Spatial Relation Indication */ + /* 246 PUSCH Pathloss Reference RS Update */ + /* 248 Enhanced SP/AP SRS Spatial Relation Indication */ + /* 249 Enhanced PUCCH Spatial Relation Activation/Deactivation */ + /* 250 Enhanced TCI States Activation/Deactivation for UE-specific PDSCH */ + /* 253 SP Positioning SRS Activation/Deactivation */ + return FALSE; + } + } +} static true_false_string subheader_f_vals = { "16 bits", "8 bits" @@ -1378,7 +1669,7 @@ static proto_item* dissect_me_phr_ph(tvbuff_t *tvb, packet_info *pinfo _U_, prot /* Subtree for this entry */ proto_item *entry_ti = proto_tree_add_item(tree, hf_mac_nr_control_me_phr_entry, - tvb, *offset, 0, ENC_ASCII|ENC_NA); + tvb, *offset, 0, ENC_ASCII); proto_tree *entry_tree = proto_item_add_subtree(entry_ti, ett_mac_nr_me_phr_entry); /* P */ @@ -1498,7 +1789,7 @@ static void call_rlc_dissector(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr tvbuff_t *rb_tvb = tvb_new_subset_length(tvb, offset, data_length); struct rlc_nr_info *p_rlc_nr_info; - /* Resuse or create RLC info */ + /* Reuse or create RLC info */ p_rlc_nr_info = (rlc_nr_info *)p_get_proto_data(wmem_file_scope(), pinfo, proto_rlc_nr, 0); if (p_rlc_nr_info == NULL) { p_rlc_nr_info = wmem_new0(wmem_file_scope(), struct rlc_nr_info); @@ -1548,13 +1839,13 @@ mac_nr_phr_fmt(gchar *s, guint32 v) gint32 val = (gint32)v; if (val == 0) { - g_snprintf(s, ITEM_LABEL_LENGTH, "PH < -32 dB (0)"); + snprintf(s, ITEM_LABEL_LENGTH, "PH < -32 dB (0)"); } else if (val == 63) { - g_snprintf(s, ITEM_LABEL_LENGTH, "PH >= 38 dB (63)"); + snprintf(s, ITEM_LABEL_LENGTH, "PH >= 38 dB (63)"); } else if (val <= 54) { - g_snprintf(s, ITEM_LABEL_LENGTH, "%d dB <= PH < %d dB (%d)", val - 33, val - 32, val); + snprintf(s, ITEM_LABEL_LENGTH, "%d dB <= PH < %d dB (%d)", val - 33, val - 32, val); } else { - g_snprintf(s, ITEM_LABEL_LENGTH, "%d dB <= PH < %d dB (%d)", 22 + 2 * (val - 55), 24 + 2 * (val - 55), val); + snprintf(s, ITEM_LABEL_LENGTH, "%d dB <= PH < %d dB (%d)", 22 + 2 * (val - 55), 24 + 2 * (val - 55), val); } } @@ -1565,11 +1856,11 @@ mac_nr_pcmax_f_c_fmt(gchar *s, guint32 v) gint32 val = (gint32)v; if (val == 0) { - g_snprintf(s, ITEM_LABEL_LENGTH, "Pcmax,f,c < -29 dBm (0)"); + snprintf(s, ITEM_LABEL_LENGTH, "Pcmax,f,c < -29 dBm (0)"); } else if (val == 63) { - g_snprintf(s, ITEM_LABEL_LENGTH, "Pcmax,f,c >= 33 dBm (63)"); + snprintf(s, ITEM_LABEL_LENGTH, "Pcmax,f,c >= 33 dBm (63)"); } else { - g_snprintf(s, ITEM_LABEL_LENGTH, "%d dBm <= Pcmax,f,c < %d dBm (%d)", val - 30, val - 29, val); + snprintf(s, ITEM_LABEL_LENGTH, "%d dBm <= Pcmax,f,c < %d dBm (%d)", val - 30, val - 29, val); } } @@ -1578,7 +1869,8 @@ mac_nr_pcmax_f_c_fmt(gchar *s, guint32 v) static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *pdu_ti, guint32 offset, mac_nr_info *p_mac_nr_info, - proto_tree *context_tree _U_) + proto_tree *context_tree _U_, + mac_3gpp_tap_info *tap_info) { gboolean ces_seen = FALSE; gboolean data_seen = FALSE; @@ -1587,13 +1879,15 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree "%s ", (p_mac_nr_info->direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH"); + tap_info->raw_length = p_mac_nr_info->length; + /************************************************************************/ /* Dissect each sub-pdu. */ do { /* Subheader */ proto_item *subheader_ti = proto_tree_add_item(tree, hf_mac_nr_subheader, - tvb, offset, 0, ENC_ASCII|ENC_NA); + tvb, offset, 0, ENC_ASCII); proto_tree *subheader_tree = proto_item_add_subtree(subheader_ti, ett_mac_nr_subheader); @@ -1603,7 +1897,22 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree /* 1st bit is always reserved */ /* 2nd bit depends upon LCID */ guint8 lcid = tvb_get_guint8(tvb, offset) & 0x3f; - fixed_len = is_fixed_sized_lcid(lcid, p_mac_nr_info->direction); + gint32 elcid= -1; + switch (lcid) { + case TWO_OCTET_ELCID_FIELD: + elcid = tvb_get_guint16(tvb, offset+1, ENC_BIG_ENDIAN); + fixed_len = TRUE; + break; + case ONE_OCTET_ELCID_FIELD: + elcid = tvb_get_guint8(tvb, offset+1); + fixed_len = is_fixed_sized_elcid(elcid, p_mac_nr_info->direction); + default: + break; + } + if (elcid == -1) { + /* No elcid present */ + fixed_len = is_fixed_sized_lcid(lcid, p_mac_nr_info->direction); + } if (fixed_len) { proto_tree_add_bits_item(subheader_tree, hf_mac_nr_subheader_reserved, tvb, offset<<3, 2, ENC_BIG_ENDIAN); } @@ -1613,13 +1922,38 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree proto_tree_add_item_ret_boolean(subheader_tree, hf_mac_nr_subheader_f, tvb, offset, 1, ENC_BIG_ENDIAN, &F); } - /* LCID */ + /* LCID (UL or DL) */ proto_tree_add_uint(subheader_tree, (p_mac_nr_info->direction == DIRECTION_UPLINK) ? hf_mac_nr_ulsch_lcid : hf_mac_nr_dlsch_lcid, tvb, offset, 1, lcid); + /* Also add as a hidden, direction-less field */ + proto_item *bi_di_lcid = proto_tree_add_uint(subheader_tree, hf_mac_nr_lcid, tvb, offset, 1, lcid); + proto_item_set_hidden(bi_di_lcid); offset++; + switch (lcid) { + case TWO_OCTET_ELCID_FIELD: + elcid = tvb_get_guint16(tvb, offset, ENC_BIG_ENDIAN); + proto_tree_add_uint(subheader_tree, + (p_mac_nr_info->direction == DIRECTION_UPLINK) ? + hf_mac_nr_ulsch_elcid_2oct : hf_mac_nr_dlsch_elcid_2oct, + tvb, offset, 2, elcid); + offset += 2; + break; + case ONE_OCTET_ELCID_FIELD: + elcid = tvb_get_guint8(tvb, offset); + proto_tree_add_uint(subheader_tree, + (p_mac_nr_info->direction == DIRECTION_UPLINK) ? + hf_mac_nr_ulsch_elcid_1oct : hf_mac_nr_dlsch_elcid_1oct, + tvb, offset, 1, elcid); + offset += 1; + break; + + default: + break; + } + if (!fixed_len) { if (F) { /* Long length */ @@ -1633,7 +1967,8 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree } } - if (lcid <= 32 || (p_mac_nr_info->direction == DIRECTION_UPLINK && lcid == CCCH_48_BITS_LCID)) { + if (lcid <= 32 || (p_mac_nr_info->direction == DIRECTION_UPLINK && + (lcid == 35 || lcid == 36 || lcid == CCCH_48_BITS_LCID))) { proto_item *sch_pdu_ti; /* Note whether this sub-pdu gets dissected by RLC/RRC */ @@ -1641,9 +1976,9 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree /* Add SDU, for now just as hex data */ if (p_mac_nr_info->direction == DIRECTION_UPLINK) { - if (lcid == CCCH_LCID) { + if ((lcid == CCCH_LCID) || (lcid == 36)) { SDU_length = 8; - } else if (lcid == CCCH_48_BITS_LCID) { + } else if ((lcid == CCCH_48_BITS_LCID) || (lcid == 35)) { SDU_length = 6; } sch_pdu_ti = proto_tree_add_item(subheader_tree, hf_mac_nr_ulsch_sdu, @@ -1661,6 +1996,9 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree guint8 seqnum_length; gint drb_id; + tap_info->sdus_for_lcid[lcid]++; + tap_info->bytes_for_lcid[lcid] += SDU_length; + // TODO: priority not set. guint8 priority = 0; lookup_rlc_bearer_from_lcid(p_mac_nr_info->ueid, @@ -1700,6 +2038,10 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree break; } } else if (lcid >= 1 && lcid <= 3) { + + tap_info->sdus_for_lcid[lcid]++; + tap_info->bytes_for_lcid[lcid] += SDU_length; + if (global_mac_nr_attempt_srb_decode) { /* SRB, call RLC dissector */ /* These are defaults (38.331, 9.2.1) - only priority may be overridden, but not passing in yet. */ @@ -1711,10 +2053,12 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree } } else if (global_mac_nr_attempt_rrc_decode) { dissector_handle_t protocol_handle; - tvbuff_t *rrc_tvb = tvb_new_subset_remaining(tvb, offset); + tvbuff_t *rrc_tvb = tvb_new_subset_length(tvb, offset, SDU_length); if (p_mac_nr_info->direction == DIRECTION_UPLINK) { - protocol_handle = (lcid == CCCH_LCID) ? nr_rrc_ul_ccch1_handle : nr_rrc_ul_ccch_handle; + protocol_handle = ((lcid == CCCH_LCID) || (lcid == 36)) ? + nr_rrc_ul_ccch1_handle : + nr_rrc_ul_ccch_handle; } else { protocol_handle = nr_rrc_dl_ccch_handle; } @@ -1740,7 +2084,7 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree data_seen = TRUE; } else { - /* Control Elements */ + /* UL Control Elements */ /* Add some space to info column between entries */ if (data_seen || ces_seen) { @@ -1756,305 +2100,426 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree gboolean dir; switch (lcid) { - case RECOMMENDED_BIT_RATE_QUERY_LCID: - proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_recommended_bit_rate_query_lcid, - tvb, offset, 1, ENC_BIG_ENDIAN, &br_lcid); - proto_tree_add_item_ret_boolean(subheader_tree, hf_mac_nr_control_recommended_bit_rate_query_dir, - tvb, offset, 1, ENC_BIG_ENDIAN, &dir); - proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_recommended_bit_rate_query_bit_rate, - tvb, offset, 2, ENC_BIG_ENDIAN, &bit_rate); - proto_tree_add_item(subheader_tree, hf_mac_nr_control_recommended_bit_rate_query_reserved, - tvb, offset+1, 1, ENC_BIG_ENDIAN); - write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, - "(Recommended BR Query LCID=%u Dir=%s BR=%s) ", br_lcid, dir ? "UL" : "DL", - val_to_str_ext_const(bit_rate, &bit_rate_vals_ext, "Unknown")); - offset += 2; + case TWO_OCTET_ELCID_FIELD: + write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, "(Identity of the logical channel %u) ", elcid); + break; + case ONE_OCTET_ELCID_FIELD: + switch (elcid) { + case ENHANCED_MULTIPLE_ENTRY_PHR_FOR_MULTIPLE_TRP_FOUR_OCTETS_CI: + /* It has a variable size, */ + offset += SDU_length; break; - case CONFIGURED_GRANT_CONFIGURATION_LCID: - /* Fixed size of zero bits */ - write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, - "(Configured Grant Config) "); + case ENHANCED_MULTIPLE_ENTRY_PHR_FOR_MULTIPLE_TRP_ONE_OCTETS_CI: + /* It has a variable size, */ + offset += SDU_length; break; - case MULTIPLE_ENTRY_PHR_1_LCID: - case MULTIPLE_ENTRY_PHR_4_LCID: - { - static int * const me_phr_byte1_flags[] = { - &hf_mac_nr_control_me_phr_c7_flag, - &hf_mac_nr_control_me_phr_c6_flag, - &hf_mac_nr_control_me_phr_c5_flag, - &hf_mac_nr_control_me_phr_c4_flag, - &hf_mac_nr_control_me_phr_c3_flag, - &hf_mac_nr_control_me_phr_c2_flag, - &hf_mac_nr_control_me_phr_c1_flag, - &hf_mac_nr_control_me_phr_reserved, - NULL - }; - static int * const me_phr_byte2_flags[] = { - &hf_mac_nr_control_me_phr_c15_flag, - &hf_mac_nr_control_me_phr_c14_flag, - &hf_mac_nr_control_me_phr_c13_flag, - &hf_mac_nr_control_me_phr_c12_flag, - &hf_mac_nr_control_me_phr_c11_flag, - &hf_mac_nr_control_me_phr_c10_flag, - &hf_mac_nr_control_me_phr_c9_flag, - &hf_mac_nr_control_me_phr_c8_flag, - NULL - }; - static int * const me_phr_byte3_flags[] = { - &hf_mac_nr_control_me_phr_c23_flag, - &hf_mac_nr_control_me_phr_c22_flag, - &hf_mac_nr_control_me_phr_c21_flag, - &hf_mac_nr_control_me_phr_c20_flag, - &hf_mac_nr_control_me_phr_c19_flag, - &hf_mac_nr_control_me_phr_c18_flag, - &hf_mac_nr_control_me_phr_c17_flag, - &hf_mac_nr_control_me_phr_c16_flag, - NULL - }; - static int * const me_phr_byte4_flags[] = { - &hf_mac_nr_control_me_phr_c31_flag, - &hf_mac_nr_control_me_phr_c30_flag, - &hf_mac_nr_control_me_phr_c29_flag, - &hf_mac_nr_control_me_phr_c28_flag, - &hf_mac_nr_control_me_phr_c27_flag, - &hf_mac_nr_control_me_phr_c26_flag, - &hf_mac_nr_control_me_phr_c25_flag, - &hf_mac_nr_control_me_phr_c24_flag, - NULL - }; - guint32 start_offset = offset; - guint8 scell_bitmap1; - guint32 scell_bitmap2_3_4 = 0; - proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, me_phr_byte1_flags, ENC_NA); - scell_bitmap1 = tvb_get_guint8(tvb, offset); - offset++; - if (lcid == MULTIPLE_ENTRY_PHR_4_LCID) { - proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, me_phr_byte2_flags, ENC_NA); - proto_tree_add_bitmask_list(subheader_tree, tvb, offset+1, 1, me_phr_byte3_flags, ENC_NA); - proto_tree_add_bitmask_list(subheader_tree, tvb, offset+2, 1, me_phr_byte4_flags, ENC_NA); - scell_bitmap2_3_4 = tvb_get_letoh24(tvb, offset); /* read them in little endian on purpose */ - offset += 3; - } - - static int * const ph_fields1[] = { - &hf_mac_nr_control_me_phr_ph_c1, - &hf_mac_nr_control_me_phr_ph_c2, - &hf_mac_nr_control_me_phr_ph_c3, - &hf_mac_nr_control_me_phr_ph_c4, - &hf_mac_nr_control_me_phr_ph_c5, - &hf_mac_nr_control_me_phr_ph_c6, - &hf_mac_nr_control_me_phr_ph_c7, - }; - static int * const ph_fields2_3_4[] = { - &hf_mac_nr_control_me_phr_ph_c8, - &hf_mac_nr_control_me_phr_ph_c9, - &hf_mac_nr_control_me_phr_ph_c10, - &hf_mac_nr_control_me_phr_ph_c11, - &hf_mac_nr_control_me_phr_ph_c12, - &hf_mac_nr_control_me_phr_ph_c13, - &hf_mac_nr_control_me_phr_ph_c14, - &hf_mac_nr_control_me_phr_ph_c15, - &hf_mac_nr_control_me_phr_ph_c16, - &hf_mac_nr_control_me_phr_ph_c17, - &hf_mac_nr_control_me_phr_ph_c18, - &hf_mac_nr_control_me_phr_ph_c19, - &hf_mac_nr_control_me_phr_ph_c20, - &hf_mac_nr_control_me_phr_ph_c21, - &hf_mac_nr_control_me_phr_ph_c22, - &hf_mac_nr_control_me_phr_ph_c23, - &hf_mac_nr_control_me_phr_ph_c24, - &hf_mac_nr_control_me_phr_ph_c25, - &hf_mac_nr_control_me_phr_ph_c26, - &hf_mac_nr_control_me_phr_ph_c27, - &hf_mac_nr_control_me_phr_ph_c28, - &hf_mac_nr_control_me_phr_ph_c29, - &hf_mac_nr_control_me_phr_ph_c30, - &hf_mac_nr_control_me_phr_ph_c31, - }; - - /* PCell entries */ - guint32 PH; - proto_item *entry_ti; - if (p_mac_nr_info->phr_type2_othercell) { - /* The PH and PCMAX,f,c fields can be either for a LTE or NR cell */ - entry_ti = dissect_me_phr_ph(tvb, pinfo, subheader_ti, hf_mac_nr_control_me_phr_ph_type2_spcell, - hf_mac_nr_control_me_phr_pcmax_f_c_type2_spcell, &PH, &offset); - proto_item_append_text(entry_ti, " (Type2, SpCell PH=%u)", PH); - } - entry_ti = dissect_me_phr_ph(tvb, pinfo, subheader_ti, hf_mac_nr_control_me_phr_ph_type1_pcell, - hf_mac_nr_control_me_phr_pcmax_f_c_type1_pcell, &PH, &offset); - proto_item_append_text(entry_ti, " (Type1, PCell PH=%u)", PH); + case ENHANCED_SINGLE_ENTRY_PHR_FOR_MULTIPLE_TRP: + /* It has a fixed size and consists of three octets */ + offset += 3; + break; + case ENHANCED_MULTIPLE_ENTRY_PHR_FOUR_OCTETS_CI: + /* has a variable size */ + offset += SDU_length; + break; + case ENHANCED_MULTIPLE_ENTRY_PHR_ONE_OCTETS_CI: + offset += SDU_length; + break; + case ENHANCED_SINGLE_ENTRY_PHR: + /* has a variable size */ + offset += SDU_length; + break; + case ENHANCED_BFR_ONE_OCTET_CI: + /* have a variable size */ + offset += SDU_length; + break; + case ENHANCED_BFR_FOUR_OCTET_CI: + /* have a variable size*/ + offset += SDU_length; + break; + case TRUNCATED_ENHANCED_BFR_FOUR_OCTET_CI: + /* have a variable size*/ + offset += SDU_length; + break; + case POSITIONING_MEASUREMENT_GAP_ACTIVATION_DEACTIVATION_REQUEST: + /* It has a fixed size of zero bits */ + break; + case IAB_MT_RECOMMENDED_BEAM_INDICATION: + /* It has a variable size */ + offset += SDU_length; + break; + case DESIRED_IAB_MT_PSD_RANGE: + break; + case DESIRED_DL_TX_POWER_ADJUSTMENT: + break; + case CASE_6_TIMING_REQUEST: + break; + case DESIRED_GUARD_SYMBOLS_FOR_CASE_6_TIMING: + break; + case DESIRED_GUARD_SYMBOLS_FOR_CASE_7_TIMING: + break; + case EXTENDED_SHORT_TRUNCATED_BSR: + break; + case EXTENDED_LONG_TRUNCATED_BSR: + break; + case EXTENDED_SHORT_BSR: + break; + case EXTENDED_LONG_BSR: + break; + case EXTENDED_PRE_EMPTIVE_BSR: + break; + case BFR_FOUR_OCTETS_CI: + break; + case TRUNCATED_BFR_FOUR_OCTETS_CI: + break; + case MULTIPLE_ENTRY_CONFIGURED_GRANT_CONFIRMATION: + break; + case SIDELINK_CONFIGURED_GRANT_CONFIRMATION: + break; + case DESIRED_GUARD_SYMBOLS: + break; + case PRE_EMPTIVE_BSR: + break; + default: + break; + } + break; + case TRUNCATED_ENHANCED_BFR_LCID: + /* variable size */ + offset += SDU_length; + break; + case TIMING_ADVANCE_REPORT_LCID: + { + /* Reserved (2 bits) */ + proto_tree_add_item(subheader_tree, hf_mac_nr_control_timing_advance_report_reserved, + tvb, offset, 1, ENC_BIG_ENDIAN); + /* Timing Advance */ + guint32 ta; + proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_timing_advance_report_ta, + tvb, offset, 2, ENC_BIG_ENDIAN, &ta); + write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, "(Timing Advance Report TA=%u) ", ta); + offset += 2; + break; + } + case TRUNCATED_SIDELINK_BSR_LCID: + /* No description? */ + break; + case SIDELINK_BSR_LCID: + /* No description? */ + break; + case LBT_FAILURE_4_OCTETS_LCID: + offset += 4; + break; + case LBT_FAILURE_1_OCTET_LCID: + offset += 1; + break; + case BFR_LCID: + /* variable size */ + offset += SDU_length; + break; + case TRUNCATED_BFR_LCID: + offset += SDU_length; + break; + /* CCCH_48_BITS_LCID Handled above*/ + case RECOMMENDED_BIT_RATE_QUERY_LCID: + proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_recommended_bit_rate_query_lcid, + tvb, offset, 1, ENC_BIG_ENDIAN, &br_lcid); + proto_tree_add_item_ret_boolean(subheader_tree, hf_mac_nr_control_recommended_bit_rate_query_dir, + tvb, offset, 1, ENC_BIG_ENDIAN, &dir); + proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_recommended_bit_rate_query_bit_rate, + tvb, offset, 2, ENC_BIG_ENDIAN, &bit_rate); + proto_tree_add_item(subheader_tree, hf_mac_nr_control_recommended_bit_rate_query_reserved, + tvb, offset + 1, 1, ENC_BIG_ENDIAN); + write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, + "(Recommended BR Query LCID=%u Dir=%s BR=%s) ", br_lcid, dir ? "UL" : "DL", + val_to_str_ext_const(bit_rate, &bit_rate_vals_ext, "Unknown")); + offset += 2; + break; + case CONFIGURED_GRANT_CONFIGURATION_LCID: + /* Fixed size of zero bits */ + write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, + "(Configured Grant Config) "); + break; + case MULTIPLE_ENTRY_PHR_1_LCID: + case MULTIPLE_ENTRY_PHR_4_LCID: + { + static int* const me_phr_byte1_flags[] = { + &hf_mac_nr_control_me_phr_c7_flag, + &hf_mac_nr_control_me_phr_c6_flag, + &hf_mac_nr_control_me_phr_c5_flag, + &hf_mac_nr_control_me_phr_c4_flag, + &hf_mac_nr_control_me_phr_c3_flag, + &hf_mac_nr_control_me_phr_c2_flag, + &hf_mac_nr_control_me_phr_c1_flag, + &hf_mac_nr_control_me_phr_reserved, + NULL + }; + static int* const me_phr_byte2_flags[] = { + &hf_mac_nr_control_me_phr_c15_flag, + &hf_mac_nr_control_me_phr_c14_flag, + &hf_mac_nr_control_me_phr_c13_flag, + &hf_mac_nr_control_me_phr_c12_flag, + &hf_mac_nr_control_me_phr_c11_flag, + &hf_mac_nr_control_me_phr_c10_flag, + &hf_mac_nr_control_me_phr_c9_flag, + &hf_mac_nr_control_me_phr_c8_flag, + NULL + }; + static int* const me_phr_byte3_flags[] = { + &hf_mac_nr_control_me_phr_c23_flag, + &hf_mac_nr_control_me_phr_c22_flag, + &hf_mac_nr_control_me_phr_c21_flag, + &hf_mac_nr_control_me_phr_c20_flag, + &hf_mac_nr_control_me_phr_c19_flag, + &hf_mac_nr_control_me_phr_c18_flag, + &hf_mac_nr_control_me_phr_c17_flag, + &hf_mac_nr_control_me_phr_c16_flag, + NULL + }; + static int* const me_phr_byte4_flags[] = { + &hf_mac_nr_control_me_phr_c31_flag, + &hf_mac_nr_control_me_phr_c30_flag, + &hf_mac_nr_control_me_phr_c29_flag, + &hf_mac_nr_control_me_phr_c28_flag, + &hf_mac_nr_control_me_phr_c27_flag, + &hf_mac_nr_control_me_phr_c26_flag, + &hf_mac_nr_control_me_phr_c25_flag, + &hf_mac_nr_control_me_phr_c24_flag, + NULL + }; + guint32 start_offset = offset; + guint8 scell_bitmap1; + guint32 scell_bitmap2_3_4 = 0; + proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, me_phr_byte1_flags, ENC_NA); + scell_bitmap1 = tvb_get_guint8(tvb, offset); + offset++; + if (lcid == MULTIPLE_ENTRY_PHR_4_LCID) { + proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, me_phr_byte2_flags, ENC_NA); + proto_tree_add_bitmask_list(subheader_tree, tvb, offset + 1, 1, me_phr_byte3_flags, ENC_NA); + proto_tree_add_bitmask_list(subheader_tree, tvb, offset + 2, 1, me_phr_byte4_flags, ENC_NA); + scell_bitmap2_3_4 = tvb_get_letoh24(tvb, offset); /* read them in little endian on purpose */ + offset += 3; + } - /* SCell entries */ + static int* const ph_fields1[] = { + &hf_mac_nr_control_me_phr_ph_c1, + &hf_mac_nr_control_me_phr_ph_c2, + &hf_mac_nr_control_me_phr_ph_c3, + &hf_mac_nr_control_me_phr_ph_c4, + &hf_mac_nr_control_me_phr_ph_c5, + &hf_mac_nr_control_me_phr_ph_c6, + &hf_mac_nr_control_me_phr_ph_c7, + }; + static int* const ph_fields2_3_4[] = { + &hf_mac_nr_control_me_phr_ph_c8, + &hf_mac_nr_control_me_phr_ph_c9, + &hf_mac_nr_control_me_phr_ph_c10, + &hf_mac_nr_control_me_phr_ph_c11, + &hf_mac_nr_control_me_phr_ph_c12, + &hf_mac_nr_control_me_phr_ph_c13, + &hf_mac_nr_control_me_phr_ph_c14, + &hf_mac_nr_control_me_phr_ph_c15, + &hf_mac_nr_control_me_phr_ph_c16, + &hf_mac_nr_control_me_phr_ph_c17, + &hf_mac_nr_control_me_phr_ph_c18, + &hf_mac_nr_control_me_phr_ph_c19, + &hf_mac_nr_control_me_phr_ph_c20, + &hf_mac_nr_control_me_phr_ph_c21, + &hf_mac_nr_control_me_phr_ph_c22, + &hf_mac_nr_control_me_phr_ph_c23, + &hf_mac_nr_control_me_phr_ph_c24, + &hf_mac_nr_control_me_phr_ph_c25, + &hf_mac_nr_control_me_phr_ph_c26, + &hf_mac_nr_control_me_phr_ph_c27, + &hf_mac_nr_control_me_phr_ph_c28, + &hf_mac_nr_control_me_phr_ph_c29, + &hf_mac_nr_control_me_phr_ph_c30, + &hf_mac_nr_control_me_phr_ph_c31, + }; + + /* PCell entries */ + guint32 PH; + proto_item* entry_ti; + if (p_mac_nr_info->phr_type2_othercell) { /* The PH and PCMAX,f,c fields can be either for a LTE or NR cell */ - for (int n=1; n <= 7; n++) { - if (scell_bitmap1 & (1 << n)) { - entry_ti = dissect_me_phr_ph(tvb, pinfo, subheader_ti, *ph_fields1[n-1], - hf_mac_nr_control_me_phr_pcmax_f_c_typeX, &PH, &offset); - proto_item_append_text(entry_ti, " (SCellIndex %d PH=%u)", n, PH); - } + entry_ti = dissect_me_phr_ph(tvb, pinfo, subheader_ti, hf_mac_nr_control_me_phr_ph_type2_spcell, + hf_mac_nr_control_me_phr_pcmax_f_c_type2_spcell, &PH, &offset); + proto_item_append_text(entry_ti, " (Type2, SpCell PH=%u)", PH); + } + entry_ti = dissect_me_phr_ph(tvb, pinfo, subheader_ti, hf_mac_nr_control_me_phr_ph_type1_pcell, + hf_mac_nr_control_me_phr_pcmax_f_c_type1_pcell, &PH, &offset); + proto_item_append_text(entry_ti, " (Type1, PCell PH=%u)", PH); + + + /* SCell entries */ + /* The PH and PCMAX,f,c fields can be either for a LTE or NR cell */ + for (int n = 1; n <= 7; n++) { + if (scell_bitmap1 & (1 << n)) { + entry_ti = dissect_me_phr_ph(tvb, pinfo, subheader_ti, *ph_fields1[n - 1], + hf_mac_nr_control_me_phr_pcmax_f_c_typeX, &PH, &offset); + proto_item_append_text(entry_ti, " (SCellIndex %d PH=%u)", n, PH); } - if (lcid == MULTIPLE_ENTRY_PHR_4_LCID) { - for (int n=0; n <= 23; n++) { - if (scell_bitmap2_3_4 & (1 << n)) { - entry_ti = dissect_me_phr_ph(tvb, pinfo, subheader_ti, *ph_fields2_3_4[n], - hf_mac_nr_control_me_phr_pcmax_f_c_typeX, &PH, &offset); - proto_item_append_text(entry_ti, " (SCellIndex %d PH=%u)", n+8, PH); - } + } + if (lcid == MULTIPLE_ENTRY_PHR_4_LCID) { + for (int n = 0; n <= 23; n++) { + if (scell_bitmap2_3_4 & (1 << n)) { + entry_ti = dissect_me_phr_ph(tvb, pinfo, subheader_ti, *ph_fields2_3_4[n], + hf_mac_nr_control_me_phr_pcmax_f_c_typeX, &PH, &offset); + proto_item_append_text(entry_ti, " (SCellIndex %d PH=%u)", n + 8, PH); } } - - write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, - "(Multi-entry PHR) "); - - /* Make sure dissected length matches signalled length */ - if (offset != start_offset + SDU_length) { - proto_tree_add_expert_format(subheader_tree, pinfo, &ei_mac_nr_sdu_length_different_from_dissected, - tvb, start_offset, offset-start_offset, - "A Multiple-Entry PHR subheader has a length field of %u bytes, but " - "dissected %u bytes", SDU_length, offset-start_offset); - /* Assume length was correct, so at least can dissect further subheaders */ - offset = start_offset + SDU_length; - } - break; } - case SINGLE_ENTRY_PHR_LCID: - /* R R PH (6 bits) */ - proto_tree_add_item(subheader_tree, hf_mac_nr_control_se_phr_reserved, - tvb, offset, 1, ENC_NA); - proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_se_phr_ph, - tvb, offset, 1, ENC_BIG_ENDIAN, &phr_ph); - offset++; - - /* R R PCMAX_f_c (6 bits) */ - proto_tree_add_item(subheader_tree, hf_mac_nr_control_se_phr_reserved, - tvb, offset, 1, ENC_NA); - proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_se_phr_pcmax_f_c, - tvb, offset, 1, ENC_NA, &phr_pcmax_f_c); - offset++; - write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, - "(PHR PH=%u PCMAX_f_c=%u) ", phr_ph, phr_pcmax_f_c); - break; - case C_RNTI_LCID: - proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_crnti, - tvb, offset, 2, ENC_BIG_ENDIAN, &c_rnti); - write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, - "(C-RNTI=%u) ", c_rnti); - offset += 2; - break; - case SHORT_TRUNCATED_BSR_LCID: - case SHORT_BSR_LCID: - { - static int * const hf_mac_nr_control_bsr_short_bs_lcg[] = { - &hf_mac_nr_control_bsr_short_bs_lcg0, - &hf_mac_nr_control_bsr_short_bs_lcg1, - &hf_mac_nr_control_bsr_short_bs_lcg2, - &hf_mac_nr_control_bsr_short_bs_lcg3, - &hf_mac_nr_control_bsr_short_bs_lcg4, - &hf_mac_nr_control_bsr_short_bs_lcg5, - &hf_mac_nr_control_bsr_short_bs_lcg6, - &hf_mac_nr_control_bsr_short_bs_lcg7 - }; - proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_bsr_short_lcg, - tvb, offset, 1, ENC_BIG_ENDIAN, &lcg_id); - proto_tree_add_item_ret_uint(subheader_tree, *hf_mac_nr_control_bsr_short_bs_lcg[lcg_id], - tvb, offset, 1, ENC_BIG_ENDIAN, &bs); - write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, - "(Short %sBSR LCG ID=%u BS=%u) ", - lcid == SHORT_BSR_LCID ? "" : "Truncated ", lcg_id, bs); - offset++; - } - break; - case LONG_TRUNCATED_BSR_LCID: - { - static int * const long_bsr_flags[] = { - &hf_mac_nr_control_bsr_long_lcg7, - &hf_mac_nr_control_bsr_long_lcg6, - &hf_mac_nr_control_bsr_long_lcg5, - &hf_mac_nr_control_bsr_long_lcg4, - &hf_mac_nr_control_bsr_long_lcg3, - &hf_mac_nr_control_bsr_long_lcg2, - &hf_mac_nr_control_bsr_long_lcg1, - &hf_mac_nr_control_bsr_long_lcg0, - NULL - }; - - proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, long_bsr_flags, ENC_NA); - guint CE_start = offset; - offset++; - - while ((offset-CE_start) < SDU_length) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_trunc_long_bs, tvb, offset++, 1, ENC_NA); - - /* TODO: show in string here how many BSs were seen */ - write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, - "(Long Truncated BSR) "); + write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, + "(Multi-entry PHR) "); + + /* Make sure dissected length matches signalled length */ + if (offset != start_offset + SDU_length) { + proto_tree_add_expert_format(subheader_tree, pinfo, &ei_mac_nr_sdu_length_different_from_dissected, + tvb, start_offset, offset - start_offset, + "A Multiple-Entry PHR subheader has a length field of %u bytes, but " + "dissected %u bytes", SDU_length, offset - start_offset); + /* Assume length was correct, so at least can dissect further subheaders */ + offset = start_offset + SDU_length; + } + break; + } + case SINGLE_ENTRY_PHR_LCID: + /* R R PH (6 bits) */ + proto_tree_add_item(subheader_tree, hf_mac_nr_control_se_phr_reserved, + tvb, offset, 1, ENC_NA); + proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_se_phr_ph, + tvb, offset, 1, ENC_BIG_ENDIAN, &phr_ph); + offset++; - if (SDU_length > 7) { - proto_tree_add_expert_format(subheader_tree, pinfo, &ei_mac_nr_sdu_length_different_from_dissected, - tvb, CE_start, SDU_length, - "A Long Truncated BSR subheader should have a length field up to 7 bytes, but " - "is set to %u bytes", SDU_length); - } - } - break; - case LONG_BSR_LCID: - { - static int * const long_bsr_flags[] = { - &hf_mac_nr_control_bsr_long_lcg7, - &hf_mac_nr_control_bsr_long_lcg6, - &hf_mac_nr_control_bsr_long_lcg5, - &hf_mac_nr_control_bsr_long_lcg4, - &hf_mac_nr_control_bsr_long_lcg3, - &hf_mac_nr_control_bsr_long_lcg2, - &hf_mac_nr_control_bsr_long_lcg1, - &hf_mac_nr_control_bsr_long_lcg0, - NULL - }; + /* R R PCMAX_f_c (6 bits) */ + proto_tree_add_item(subheader_tree, hf_mac_nr_control_se_phr_reserved, + tvb, offset, 1, ENC_NA); + proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_se_phr_pcmax_f_c, + tvb, offset, 1, ENC_NA, &phr_pcmax_f_c); + offset++; + write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, + "(PHR PH=%u PCMAX_f_c=%u) ", phr_ph, phr_pcmax_f_c); + break; + case C_RNTI_LCID: + proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_crnti, + tvb, offset, 2, ENC_BIG_ENDIAN, &c_rnti); + write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, + "(C-RNTI=%u) ", c_rnti); + offset += 2; + break; + case SHORT_TRUNCATED_BSR_LCID: + case SHORT_BSR_LCID: + { + static int* const hf_mac_nr_control_bsr_short_bs_lcg[] = { + &hf_mac_nr_control_bsr_short_bs_lcg0, + &hf_mac_nr_control_bsr_short_bs_lcg1, + &hf_mac_nr_control_bsr_short_bs_lcg2, + &hf_mac_nr_control_bsr_short_bs_lcg3, + &hf_mac_nr_control_bsr_short_bs_lcg4, + &hf_mac_nr_control_bsr_short_bs_lcg5, + &hf_mac_nr_control_bsr_short_bs_lcg6, + &hf_mac_nr_control_bsr_short_bs_lcg7 + }; + + proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_bsr_short_lcg, + tvb, offset, 1, ENC_BIG_ENDIAN, &lcg_id); + proto_tree_add_item_ret_uint(subheader_tree, *hf_mac_nr_control_bsr_short_bs_lcg[lcg_id], + tvb, offset, 1, ENC_BIG_ENDIAN, &bs); + write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, + "(Short %sBSR LCG ID=%u BS=%u) ", + lcid == SHORT_BSR_LCID ? "" : "Truncated ", lcg_id, bs); + offset++; + } + break; + case LONG_TRUNCATED_BSR_LCID: + { + static int* const long_bsr_flags[] = { + &hf_mac_nr_control_bsr_long_lcg7, + &hf_mac_nr_control_bsr_long_lcg6, + &hf_mac_nr_control_bsr_long_lcg5, + &hf_mac_nr_control_bsr_long_lcg4, + &hf_mac_nr_control_bsr_long_lcg3, + &hf_mac_nr_control_bsr_long_lcg2, + &hf_mac_nr_control_bsr_long_lcg1, + &hf_mac_nr_control_bsr_long_lcg0, + NULL + }; + + proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, long_bsr_flags, ENC_NA); + guint CE_start = offset; + offset++; - guint8 flags = tvb_get_guint8(tvb, offset); - proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, long_bsr_flags, ENC_NA); - guint CE_start = offset; - offset++; + while ((offset - CE_start) < SDU_length) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_trunc_long_bs, tvb, offset++, 1, ENC_NA); - /* Show BSR values. */ - if (flags & 0x01) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg0, tvb, offset++, 1, ENC_NA); - if (flags & 0x02) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg1, tvb, offset++, 1, ENC_NA); - if (flags & 0x04) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg2, tvb, offset++, 1, ENC_NA); - if (flags & 0x08) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg3, tvb, offset++, 1, ENC_NA); - if (flags & 0x10) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg4, tvb, offset++, 1, ENC_NA); - if (flags & 0x20) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg5, tvb, offset++, 1, ENC_NA); - if (flags & 0x40) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg6, tvb, offset++, 1, ENC_NA); - if (flags & 0x80) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg7, tvb, offset++, 1, ENC_NA); - - /* TODO: show in string here how many BSs were seen */ - write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, - "(Long BSR) "); + /* TODO: show in string here how many BSs were seen */ + write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, + "(Long Truncated BSR) "); + if (SDU_length > 7) { + proto_tree_add_expert_format(subheader_tree, pinfo, &ei_mac_nr_sdu_length_different_from_dissected, + tvb, CE_start, SDU_length, + "A Long Truncated BSR subheader should have a length field up to 7 bytes, but " + "is set to %u bytes", SDU_length); + } + } + break; + case LONG_BSR_LCID: + { + static int* const long_bsr_flags[] = { + &hf_mac_nr_control_bsr_long_lcg7, + &hf_mac_nr_control_bsr_long_lcg6, + &hf_mac_nr_control_bsr_long_lcg5, + &hf_mac_nr_control_bsr_long_lcg4, + &hf_mac_nr_control_bsr_long_lcg3, + &hf_mac_nr_control_bsr_long_lcg2, + &hf_mac_nr_control_bsr_long_lcg1, + &hf_mac_nr_control_bsr_long_lcg0, + NULL + }; + + guint8 flags = tvb_get_guint8(tvb, offset); + proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, long_bsr_flags, ENC_NA); + guint CE_start = offset; + offset++; - /* Make sure dissected length matches signalled length */ - if ((offset - CE_start) != SDU_length) { - proto_tree_add_expert_format(subheader_tree, pinfo, &ei_mac_nr_sdu_length_different_from_dissected, - tvb, CE_start, offset-CE_start, - "A Long BSR subheader has a length field of %u bytes, but " - "dissected %u bytes", SDU_length, offset-CE_start); - /* Assume length was correct, so at least can dissect further subheaders */ - offset = CE_start + SDU_length; - } - } - break; - case PADDING_LCID: - { - /* The rest of the PDU is padding */ - int pad_len = tvb_reported_length_remaining(tvb, offset); - if (pad_len > 0) - proto_tree_add_item(subheader_tree, hf_mac_nr_padding, tvb, offset, -1, ENC_NA); - write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, "(Padding %u bytes) ", pad_len); - /* Move to the end of the frame */ - offset = tvb_reported_length(tvb); - } - break; + /* Show BSR values. */ + if (flags & 0x01) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg0, tvb, offset++, 1, ENC_NA); + if (flags & 0x02) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg1, tvb, offset++, 1, ENC_NA); + if (flags & 0x04) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg2, tvb, offset++, 1, ENC_NA); + if (flags & 0x08) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg3, tvb, offset++, 1, ENC_NA); + if (flags & 0x10) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg4, tvb, offset++, 1, ENC_NA); + if (flags & 0x20) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg5, tvb, offset++, 1, ENC_NA); + if (flags & 0x40) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg6, tvb, offset++, 1, ENC_NA); + if (flags & 0x80) proto_tree_add_item(subheader_tree, hf_mac_nr_control_bsr_long_bs_lcg7, tvb, offset++, 1, ENC_NA); + + /* TODO: show in string here how many BSs were seen */ + write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, + "(Long BSR) "); + + + /* Make sure dissected length matches signalled length */ + if ((offset - CE_start) != SDU_length) { + proto_tree_add_expert_format(subheader_tree, pinfo, &ei_mac_nr_sdu_length_different_from_dissected, + tvb, CE_start, offset - CE_start, + "A Long BSR subheader has a length field of %u bytes, but " + "dissected %u bytes", SDU_length, offset - CE_start); + /* Assume length was correct, so at least can dissect further subheaders */ + offset = CE_start + SDU_length; + } + } + break; + case PADDING_LCID: + { + /* The rest of the PDU is padding */ + int pad_len = tvb_reported_length_remaining(tvb, offset); + if (pad_len > 0) + proto_tree_add_item(subheader_tree, hf_mac_nr_padding, tvb, offset, -1, ENC_NA); + write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, "(Padding %u bytes) ", pad_len); + /* Move to the end of the frame */ + offset = tvb_reported_length(tvb); + } + break; } } else { @@ -2068,8 +2533,85 @@ static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree "DL-SCH: should not have Control Elements after Data SDUs"); } } - switch (lcid) { + case TWO_OCTET_ELCID_FIELD: + /* Error */ + break; + case ONE_OCTET_ELCID_FIELD: + switch (elcid) { + case SERVING_CELL_SET_BASED_SRS_TCI_STATE_INDICATIONS_ELCD: + break; + case SP_AP_SRS_TCI_STATE_INDICATION_ELCD: + break; + case BFD_RS_INDICATION_ELCD: + break; + case DIFFERENTIAL_KOFFSET_ELCD: + { + guint32 koffset; + proto_tree_add_item(subheader_tree, hf_mac_nr_differential_koffset_reserved, + tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_differential_koffset, + tvb, offset, 1, ENC_BIG_ENDIAN, &koffset); + offset += 1; + write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, + "(Differential Koffset %u) ", koffset); + } + break; + case ENHANCED_SCELL_ACTIVATION_DEACTIVATION_MAC_CE_WITH_ONE_OCTET_CI_FIELD_ELCD: + break; + case ENHANCED_SCELL_ACTIVATION_DEACTIVATION_MAC_CE_WITH_FOUR_OCTET_CI_FIELD_ELCD: + break; + case UNIFIED_TCI_STATES_ACTIVATION_DEACTIVATION_ELCD: + break; + case PUCCH_POWER_CONTROL_SET_UPDATE_FOR_MULTIPLE_TRP_PUCCH_REPETITION__ELCD: + break; + case PUCCH_SPATIAL_RELATION_ACTIVATION_DEACTIVATION_FOR_MULTIPLE_TRP_PUCCH_REPETITION_ELCD: + break; + case ENHANCED_TCI_STATES_INDICATION_FOR_UE_SPECIFIC_PDCCH_ELCD: + break; + case POSITIONING_MEASUREMENT_GAP_ACTIVATION_DEACTIVATION_COMMAND_ELCD: + break; + case PPW_ACTIVATION_DEACTIVATION_COMMAND_ELCD: + break; + case DL_TX_POWER_ADJUSTMENT_ELCD: + break; + case TIMING_CASE_INDICATION_ELCD: + break; + case CHILD_IAB_DU_RESTRICTED_BEAM_INDICATION_ELCD: + break; + case CASE_7_TIMING_ADVANCE_OFFSET_ELCD: + break; + case PROVIDED_GUARD_SYMBOLS_FOR_CASE_6_TIMING_ELCD: + break; + case PROVIDED_GUARD_SYMBOLS_FOR_CASE_7_TIMING_ELCD: + break; + case SERVING_CELL_SET_BASED_SRS_SPATIAL_RELATION_INDICATION_ELCD: + break; + case PUSCH_PATHLOSS_REFERENCE_RS_UPDATE_ELCD: + break; + case SRS_PATHLOSS_REFERENCE_RS_UPDATE_ELCD: + break; + case ENHANCED_SP_AP_SRS_SPATIAL_RELATION_INDICATION_ELCD: + break; + case ENHANCED_PUCCH_SPATIAL_RELATION_ACTIVATION_DEACTIVATION_ELCD: + break; + case ENHANCED_TCI_STATES_ACTIVATION_DEACTIVATION_FOR_UE_SPECIFIC_PDSCH_ELCD: + break; + case DUPLICATION_RLC_ACTIVATION_DEACTIVATION_ELCD: + /* 251 */ + break; + case ABSOLUTE_TIMING_ADVANCE_COMMAND_ELCD: + break; + case SP_POSITIONING_SRS_ACTIVATION_DEACTIVATION_ELCD: + break; + case PROVIDED_GUARD_SYMBOLS_ELCD: + break; + case TIMING_DELTA_ELCD: + break; + default: + break; + } + break; case RECOMMENDED_BIT_RATE_LCID: proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_recommended_bit_rate_lcid, tvb, offset, 1, ENC_BIG_ENDIAN, &br_lcid); @@ -2500,6 +3042,10 @@ static int dissect_mac_nr(tvbuff_t *tvb, packet_info *pinfo, gint offset = 0; struct mac_nr_info *p_mac_nr_info; + /* Allocate and zero tap struct */ + mac_3gpp_tap_info *tap_info = wmem_new0(wmem_file_scope(), mac_3gpp_tap_info); + tap_info->rat = MAC_RAT_NR; + /* Set protocol name */ col_set_str(pinfo->cinfo, COL_PROTOCOL, "MAC-NR"); @@ -2585,18 +3131,29 @@ static int dissect_mac_nr(tvbuff_t *tvb, packet_info *pinfo, } } + /* Set context-info parts of tap struct */ + tap_info->rnti = p_mac_nr_info->rnti; + tap_info->ueid = p_mac_nr_info->ueid; + tap_info->rntiType = p_mac_nr_info->rntiType; + tap_info->isPredefinedData = FALSE; + tap_info->isPHYRetx = FALSE; /* don't really know */ + tap_info->crcStatusValid = FALSE; /* don't really know */ + tap_info->direction = p_mac_nr_info->direction; + + tap_info->mac_time = pinfo->abs_ts; + tap_info->single_number_of_bytes = tvb_reported_length_remaining(tvb, offset); /* Dissect the MAC PDU itself. Format depends upon RNTI type. */ switch (p_mac_nr_info->rntiType) { case P_RNTI: /* PCCH PDU */ - dissect_pcch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info); + dissect_pcch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info, tap_info); break; case RA_RNTI: /* RAR PDU */ - dissect_rar(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info); + dissect_rar(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info, tap_info); break; case C_RNTI: @@ -2604,24 +3161,28 @@ static int dissect_mac_nr(tvbuff_t *tvb, packet_info *pinfo, /* Can be UL-SCH or DL-SCH */ dissect_ulsch_or_dlsch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info, - context_tree); + context_tree, + tap_info); break; case SI_RNTI: /* BCCH over DL-SCH */ - dissect_bcch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info); + dissect_bcch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, + p_mac_nr_info, tap_info); break; case NO_RNTI: /* Must be BCCH over BCH... */ - dissect_bcch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info); + dissect_bcch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, + p_mac_nr_info, tap_info); break; - default: break; } + tap_queue_packet(mac_nr_tap, pinfo, tap_info); + return -1; } @@ -2632,7 +3193,6 @@ static gboolean dissect_mac_nr_heur(tvbuff_t *tvb, packet_info *pinfo, gint offset = 0; mac_nr_info *p_mac_nr_info; tvbuff_t *mac_tvb; - guint8 tag; /* Needs to be at least as long as: - the signature string @@ -2654,66 +3214,11 @@ static gboolean dissect_mac_nr_heur(tvbuff_t *tvb, packet_info *pinfo, if (p_mac_nr_info == NULL) { /* Allocate new info struct for this frame */ p_mac_nr_info = wmem_new0(wmem_file_scope(), mac_nr_info); - - /* Read fixed fields */ - p_mac_nr_info->radioType = tvb_get_guint8(tvb, offset++); - p_mac_nr_info->direction = tvb_get_guint8(tvb, offset++); - p_mac_nr_info->rntiType = tvb_get_guint8(tvb, offset++); - - /* Read optional fields */ - do { - /* Process next tag */ - tag = tvb_get_guint8(tvb, offset++); - switch (tag) { - case MAC_NR_RNTI_TAG: - p_mac_nr_info->rnti = tvb_get_ntohs(tvb, offset); - offset += 2; - break; - case MAC_NR_UEID_TAG: - p_mac_nr_info->ueid = tvb_get_ntohs(tvb, offset); - offset += 2; - break; - case MAC_NR_HARQID: - p_mac_nr_info->harqid = tvb_get_guint8(tvb, offset); - offset++; - break; - case MAC_NR_FRAME_SUBFRAME_TAG: - /* deprecated */ - offset += 2; - break; - case MAC_NR_PHR_TYPE2_OTHERCELL_TAG: - p_mac_nr_info->phr_type2_othercell = tvb_get_guint8(tvb, offset); - offset++; - break; - case MAC_NR_FRAME_SLOT_TAG: - p_mac_nr_info->sfnSlotInfoPresent = TRUE; - p_mac_nr_info->sysframeNumber = tvb_get_ntohs(tvb, offset); - p_mac_nr_info->slotNumber = tvb_get_ntohs(tvb, offset+2); - offset += 4; - break; - case MAC_NR_PAYLOAD_TAG: - /* Have reached data, so set payload length and get out of loop */ - /* TODO: this is not correct if there is padding which isn't in frame */ - p_mac_nr_info->length = tvb_reported_length_remaining(tvb, offset); - continue; - default: - /* It must be a recognised tag */ - { - proto_item *ti; - proto_tree *subtree; - - col_set_str(pinfo->cinfo, COL_PROTOCOL, "MAC-NR"); - col_clear(pinfo->cinfo, COL_INFO); - ti = proto_tree_add_item(tree, proto_mac_nr, tvb, offset, tvb_reported_length(tvb), ENC_NA); - subtree = proto_item_add_subtree(ti, ett_mac_nr); - proto_tree_add_expert(subtree, pinfo, &ei_mac_nr_unknown_udp_framing_tag, - tvb, offset-1, 1); - } - wmem_free(wmem_file_scope(), p_mac_nr_info); - return TRUE; - } - } while (tag != MAC_NR_PAYLOAD_TAG); - + /* Dissect the fields to populate p_mac_nr */ + if(!dissect_mac_nr_context_fields(p_mac_nr_info, tvb, pinfo, tree, &offset)){ + return TRUE; + } + /* Store info in packet */ p_add_proto_data(wmem_file_scope(), pinfo, proto_mac_nr, 0, p_mac_nr_info); } else { @@ -2730,6 +3235,78 @@ static gboolean dissect_mac_nr_heur(tvbuff_t *tvb, packet_info *pinfo, return TRUE; } +/* Dissect context fields in the format described in packet-mac-nr.h. + Return TRUE if the necessary information was successfully found */ +gboolean dissect_mac_nr_context_fields(struct mac_nr_info *p_mac_nr_info, tvbuff_t *tvb, + packet_info *pinfo, proto_tree *tree, gint *p_offset) +{ + gint offset = *p_offset; + guint8 tag = 0; + + /* Read fixed fields */ + p_mac_nr_info->radioType = tvb_get_guint8(tvb, offset++); + p_mac_nr_info->direction = tvb_get_guint8(tvb, offset++); + p_mac_nr_info->rntiType = tvb_get_guint8(tvb, offset++); + + /* Read optional fields */ + do { + /* Process next tag */ + tag = tvb_get_guint8(tvb, offset++); + switch (tag) { + case MAC_NR_RNTI_TAG: + p_mac_nr_info->rnti = tvb_get_ntohs(tvb, offset); + offset += 2; + break; + case MAC_NR_UEID_TAG: + p_mac_nr_info->ueid = tvb_get_ntohs(tvb, offset); + offset += 2; + break; + case MAC_NR_HARQID: + p_mac_nr_info->harqid = tvb_get_guint8(tvb, offset); + offset++; + break; + case MAC_NR_FRAME_SUBFRAME_TAG: + /* deprecated */ + offset += 2; + break; + case MAC_NR_PHR_TYPE2_OTHERCELL_TAG: + p_mac_nr_info->phr_type2_othercell = tvb_get_guint8(tvb, offset); + offset++; + break; + case MAC_NR_FRAME_SLOT_TAG: + p_mac_nr_info->sfnSlotInfoPresent = TRUE; + p_mac_nr_info->sysframeNumber = tvb_get_ntohs(tvb, offset); + p_mac_nr_info->slotNumber = tvb_get_ntohs(tvb, offset+2); + offset += 4; + break; + case MAC_NR_PAYLOAD_TAG: + /* Have reached data, so set payload length and get out of loop */ + /* TODO: this is not correct if there is padding which isn't in frame */ + p_mac_nr_info->length = tvb_reported_length_remaining(tvb, offset); + continue; + default: + /* It must be a recognised tag */ + { + proto_item *ti; + proto_tree *subtree; + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "MAC-NR"); + col_clear(pinfo->cinfo, COL_INFO); + ti = proto_tree_add_item(tree, proto_mac_nr, tvb, offset, tvb_reported_length(tvb), ENC_NA); + subtree = proto_item_add_subtree(ti, ett_mac_nr); + proto_tree_add_expert(subtree, pinfo, &ei_mac_nr_unknown_udp_framing_tag, + tvb, offset-1, 1); + } + wmem_free(wmem_file_scope(), p_mac_nr_info); + return TRUE; + } + } while (tag != MAC_NR_PAYLOAD_TAG); + + /* Pass out where offset is now */ + *p_offset = offset; + + return TRUE; +} /* Callback used as part of configuring a channel mapping using UAT */ static void* lcid_drb_mapping_copy_cb(void* dest, const void* orig, size_t len _U_) @@ -2969,18 +3546,49 @@ void proto_register_mac_nr(void) NULL, HFILL } }, + /* Will be hidden, but useful for bi-directional filtering */ + { &hf_mac_nr_lcid, + { "LCID", + "mac-nr.lcid", FT_UINT8, BASE_HEX, NULL, 0x3f, + "Logical Channel Identifier", HFILL + } + }, { &hf_mac_nr_ulsch_lcid, { "LCID", - "mac-nr.ulsch.lcid", FT_UINT8, BASE_HEX|BASE_EXT_STRING, &ulsch_lcid_vals_ext, 0x3f, + "mac-nr.ulsch.lcid", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &ulsch_lcid_vals_ext, 0x3f, "UL-SCH Logical Channel Identifier", HFILL } }, { &hf_mac_nr_dlsch_lcid, { "LCID", - "mac-nr.dlsch.lcid", FT_UINT8, BASE_HEX|BASE_EXT_STRING, &dlsch_lcid_vals_ext, 0x3f, + "mac-nr.dlsch.lcid", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &dlsch_lcid_vals_ext, 0x3f, "DL-SCH Logical Channel Identifier", HFILL } }, + { &hf_mac_nr_dlsch_elcid_2oct, + { "eLCID2oct", + "mac-nr.dlsch.elcid-2oct", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL + } + }, + { &hf_mac_nr_ulsch_elcid_2oct, + { "eLCID2oct", + "mac-nr.dlsch.elcid-2oct", FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL + } + }, + { &hf_mac_nr_dlsch_elcid_1oct, + { "eLCID", + "mac-nr.dlsch.elcid-1oct", FT_UINT8,BASE_DEC|BASE_EXT_STRING,&dlsch_elcid_vals_ext, 0x0, + NULL, HFILL + } + }, + { &hf_mac_nr_ulsch_elcid_1oct, + { "eLCID", + "mac-nr.dlsch.elcid-1oct", FT_UINT8,BASE_DEC|BASE_EXT_STRING,&ulsch_elcid_vals_ext, 0x0, + NULL, HFILL + } + }, { &hf_mac_nr_ulsch_sdu, { "UL-SCH SDU", "mac-nr.ulsch.sdu", FT_BYTES, BASE_NONE, NULL, 0x0, @@ -4496,8 +5104,30 @@ void proto_register_mac_nr(void) NULL, HFILL } }, - - }; + { &hf_mac_nr_control_timing_advance_report_reserved, + { "Reserved", + "mac-nr.control.ta-command.reserved", FT_UINT8, BASE_HEX, NULL, 0xc0, + NULL, HFILL + } + }, + { &hf_mac_nr_control_timing_advance_report_ta, + { "Timing Advance", + "mac-nr.control.ta-command.ta", FT_UINT16, BASE_DEC, NULL, 0x3f, + NULL, HFILL + } + }, + { &hf_mac_nr_differential_koffset, + { "Differential Koffset", + "mac-nr.differential_koffset", FT_UINT8, BASE_DEC, NULL, 0x3f, + NULL, HFILL + } + }, + { &hf_mac_nr_differential_koffset_reserved, + { "Reserved", + "mac-nr.differential_koffset.reserved", FT_UINT8, BASE_DEC, NULL, 0xc0, + NULL, HFILL + } + }, }; static gint *ett[] = { @@ -4544,6 +5174,9 @@ void proto_register_mac_nr(void) /* Allow other dissectors to find this one by name. */ register_dissector("mac-nr", dissect_mac_nr, proto_mac_nr); + /* Register the tap name. */ + mac_nr_tap = register_tap("mac-3gpp"); + /* Preferences */ mac_nr_module = prefs_register_protocol(proto_mac_nr, NULL); |