summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-mac-nr.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-mac-nr.c
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-mac-nr.c')
-rw-r--r--epan/dissectors/packet-mac-nr.c4628
1 files changed, 4628 insertions, 0 deletions
diff --git a/epan/dissectors/packet-mac-nr.c b/epan/dissectors/packet-mac-nr.c
new file mode 100644
index 00000000..577fb922
--- /dev/null
+++ b/epan/dissectors/packet-mac-nr.c
@@ -0,0 +1,4628 @@
+/* Routines for 5G/NR MAC disassembly
+ *
+ * Based on packet-mac-lte.c
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include <epan/exceptions.h>
+#include <epan/expert.h>
+#include <epan/proto_data.h>
+#include <epan/uat.h>
+
+#include "packet-mac-nr.h"
+#include "packet-rlc-nr.h"
+
+void proto_register_mac_nr(void);
+void proto_reg_handoff_mac_nr(void);
+
+/* Described in:
+ * 3GPP TS 38.321 NR; Medium Access Control (MAC) protocol specification v15.6.0
+ */
+
+/* Initialize the protocol and registered fields. */
+int proto_mac_nr = -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_lcid = -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;
+/* 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;
+
+/* 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 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 dissector_handle_t nr_rrc_bcch_bch_handle;
+static dissector_handle_t nr_rrc_bcch_dl_sch_handle;
+static dissector_handle_t nr_rrc_pcch_handle;
+static dissector_handle_t nr_rrc_dl_ccch_handle;
+static dissector_handle_t nr_rrc_ul_ccch_handle;
+static dissector_handle_t nr_rrc_ul_ccch1_handle;
+
+
+/**************************************************************************/
+/* Preferences state */
+/**************************************************************************/
+
+/* By default try to decode transparent data (BCCH, PCCH and CCCH) data using NR RRC dissector */
+static gboolean global_mac_nr_attempt_rrc_decode = TRUE;
+
+/* Whether should attempt to decode lcid 1-3 SDUs as srb1-3 (i.e. AM RLC) */
+static gboolean global_mac_nr_attempt_srb_decode = TRUE;
+
+/* Which layer info to show in the info column */
+enum layer_to_show {
+ ShowPHYLayer, ShowMACLayer, ShowRLCLayer
+};
+
+/* Which layer's details to show in Info column */
+static gint global_mac_nr_layer_to_show = (gint)ShowRLCLayer;
+
+
+/***********************************************************************/
+/* How to dissect lcid 3-32 (presume drb logical channels) */
+
+/* Where to take LCID -> DRB mappings from */
+enum lcid_drb_source {
+ FromStaticTable, FromConfigurationProtocol
+};
+static gint global_mac_nr_lcid_drb_source = (gint)FromStaticTable;
+
+
+static const value_string drb_lcid_vals[] = {
+ { 4, "LCID 4"},
+ { 5, "LCID 5"},
+ { 6, "LCID 6"},
+ { 7, "LCID 7"},
+ { 8, "LCID 8"},
+ { 9, "LCID 9"},
+ { 10, "LCID 10"},
+ { 11, "LCID 11"},
+ { 12, "LCID 12"},
+ { 13, "LCID 13"},
+ { 14, "LCID 14"},
+ { 15, "LCID 15"},
+ { 16, "LCID 16"},
+ { 17, "LCID 17"},
+ { 18, "LCID 18"},
+ { 19, "LCID 19"},
+ { 20, "LCID 20"},
+ { 21, "LCID 21"},
+ { 22, "LCID 22"},
+ { 23, "LCID 23"},
+ { 24, "LCID 24"},
+ { 25, "LCID 25"},
+ { 26, "LCID 26"},
+ { 27, "LCID 27"},
+ { 28, "LCID 28"},
+ { 29, "LCID 29"},
+ { 30, "LCID 30"},
+ { 31, "LCID 31"},
+ { 32, "LCID 32"},
+ { 0, NULL }
+};
+
+/* N.B. for now, only doing static config, and assume channel has same SN length in both directions */
+typedef enum rlc_bearer_type_t {
+ rlcRaw,
+ rlcTM,
+ rlcUM6,
+ rlcUM12,
+ rlcAM12,
+ rlcAM18
+} rlc_bearer_type_t;
+
+static const value_string rlc_bearer_type_vals[] = {
+ { rlcTM , "TM"},
+ { rlcUM6 , "UM, SN Len=6"},
+ { rlcUM12 , "UM, SN Len=12"},
+ { rlcAM12 , "AM, SN Len=12"},
+ { rlcAM18 , "AM, SN Len=18"},
+ { 0, NULL }
+};
+
+
+/* Mapping type */
+typedef struct lcid_drb_mapping_t {
+ guint32 lcid;
+ guint32 drbid;
+ rlc_bearer_type_t bearer_type_ul;
+ rlc_bearer_type_t bearer_type_dl;
+} lcid_drb_mapping_t;
+
+/* Mapping entity */
+static lcid_drb_mapping_t *lcid_drb_mappings = NULL;
+static guint num_lcid_drb_mappings = 0;
+
+UAT_VS_DEF(lcid_drb_mappings, lcid, lcid_drb_mapping_t, guint8, 3, "LCID 3")
+UAT_DEC_CB_DEF(lcid_drb_mappings, drbid, lcid_drb_mapping_t)
+UAT_VS_DEF(lcid_drb_mappings, bearer_type_ul, lcid_drb_mapping_t, rlc_bearer_type_t, rlcAM12, "AM")
+UAT_VS_DEF(lcid_drb_mappings, bearer_type_dl, lcid_drb_mapping_t, rlc_bearer_type_t, rlcAM12, "AM")
+
+/* UAT object */
+static uat_t* lcid_drb_mappings_uat;
+
+/* Dynamic mappings (set by configuration protocol)
+ LCID is the index into the array of these */
+typedef struct dynamic_lcid_drb_mapping_t {
+ gboolean valid;
+ gint drbid;
+ rlc_bearer_type_t bearer_type_ul;
+ rlc_bearer_type_t bearer_type_dl;
+ guint8 ul_priority; // N.B. not yet in rlc_nr_info
+} dynamic_lcid_drb_mapping_t;
+
+typedef struct ue_dynamic_drb_mappings_t {
+ dynamic_lcid_drb_mapping_t mapping[33]; /* Index is LCID (2-32) */
+ guint8 drb_to_lcid_mappings[33]; /* Also map drbid (1-32) -> lcid */
+} ue_dynamic_drb_mappings_t;
+
+static GHashTable *mac_nr_ue_bearers_hash = NULL;
+
+
+
+
+/* When showing RLC info, count PDUs so can append info column properly */
+static guint8 s_number_of_rlc_pdus_shown = 0;
+
+
+extern int proto_rlc_nr;
+
+
+/* Constants and value strings */
+
+static const value_string radio_type_vals[] =
+{
+ { FDD_RADIO, "FDD"},
+ { TDD_RADIO, "TDD"},
+ { 0, NULL }
+};
+
+static const value_string direction_vals[] =
+{
+ { DIRECTION_UPLINK, "Uplink"},
+ { DIRECTION_DOWNLINK, "Downlink"},
+ { 0, NULL }
+};
+
+static const value_string rnti_type_vals[] =
+{
+ { NO_RNTI, "NO-RNTI"},
+ { P_RNTI, "P-RNTI"},
+ { RA_RNTI, "RA-RNTI"},
+ { C_RNTI, "C-RNTI"},
+ { SI_RNTI, "SI-RNTI"},
+ { CS_RNTI, "CS-RNTI"},
+ { 0, NULL }
+};
+
+static const value_string bcch_transport_channel_vals[] =
+{
+ { SI_RNTI, "DL-SCH"},
+ { NO_RNTI, "BCH"},
+ { 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
+
+static const value_string dlsch_lcid_vals[] =
+{
+ { CCCH_LCID, "CCCH"},
+ { 1, "1"},
+ { 2, "2"},
+ { 3, "3"},
+ { 4, "4"},
+ { 5, "5"},
+ { 6, "6"},
+ { 7, "7"},
+ { 8, "8"},
+ { 9, "9"},
+ { 10, "10"},
+ { 11, "11"},
+ { 12, "12"},
+ { 13, "13"},
+ { 14, "14"},
+ { 15, "15"},
+ { 16, "16"},
+ { 17, "17"},
+ { 18, "18"},
+ { 19, "19"},
+ { 20, "20"},
+ { 21, "21"},
+ { 22, "22"},
+ { 23, "23"},
+ { 24, "24"},
+ { 25, "25"},
+ { 26, "26"},
+ { 27, "27"},
+ { 28, "28"},
+ { 29, "29"},
+ { 30, "30"},
+ { 31, "31"},
+ { 32, "32"},
+ { 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"},
+ { SP_SRS_ACT_DEACT_LCID, "SP SRS Activation/Deactivation"},
+ { SP_CSI_REPORT_ON_PUCCH_ACT_DEACT_LCID, "SP CSI reporting on PUCCH Activation/Deactivation"},
+ { TCI_STATE_IND_FOR_UE_SPEC_PDCCH_LCID, "TCI State Indication for UE-specific PDCCH"},
+ { TCI_STATES_ACT_DEACT_FOR_UE_SPEC_PDSCH_LCID, "TCI States Activation/Deactivation for UE-specific PDSCH"},
+ { APER_CSI_TRIGGER_STATE_SUBSELECT_LCID, "Aperiodic CSI Trigger State Subselection"},
+ { SP_CSI_RS_CSI_IM_RES_SET_ACT_DEACT_LCID, "SP CSI-RS / CSI-IM Resource Set Activation/Deactivation"},
+ { DUPLICATION_ACTIVATION_DEACTIVATION_LCID, "Duplication Activation/Deactivation"},
+ { SCELL_ACTIVATION_DEACTIVATION_4_LCID, "SCell Activation/Deactivation (4 octet)"},
+ { SCELL_ACTIVATION_DEACTIVATION_1_LCID, "SCell Activation/Deactivation (1 octet)"},
+ { LONG_DRX_COMMAND_LCID, "Long DRX Command"},
+ { DRX_COMMAND_LCID, "DRX Command"},
+ { TIMING_ADVANCE_COMMAND_LCID, "Timing Advance Command"},
+ { UE_CONTENTION_RESOLUTION_IDENTITY_LCID, "UE Contention Resolution Identity"},
+ { PADDING_LCID, "Padding"},
+ { 0, NULL }
+};
+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
+
+static const value_string ulsch_lcid_vals[] =
+{
+ { CCCH_LCID, "CCCH (64 bits)"},
+ { 1, "1"},
+ { 2, "2"},
+ { 3, "3"},
+ { 4, "4"},
+ { 5, "5"},
+ { 6, "6"},
+ { 7, "7"},
+ { 8, "8"},
+ { 9, "9"},
+ { 10, "10"},
+ { 11, "11"},
+ { 12, "12"},
+ { 13, "13"},
+ { 14, "14"},
+ { 15, "15"},
+ { 16, "16"},
+ { 17, "17"},
+ { 18, "18"},
+ { 19, "19"},
+ { 20, "20"},
+ { 21, "21"},
+ { 22, "22"},
+ { 23, "23"},
+ { 24, "24"},
+ { 25, "25"},
+ { 26, "26"},
+ { 27, "27"},
+ { 28, "28"},
+ { 29, "29"},
+ { 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"},
+ { 0, NULL }
+};
+static value_string_ext ulsch_lcid_vals_ext = VALUE_STRING_EXT_INIT(ulsch_lcid_vals);
+
+static const true_false_string rar_ext_vals =
+{
+ "Another MAC subPDU follows",
+ "Last MAC subPDU"
+};
+
+static const true_false_string rar_type_vals =
+{
+ "RAPID present",
+ "Backoff Indicator present"
+};
+
+static const value_string rar_bi_vals[] =
+{
+ { 0, "5ms"},
+ { 1, "10ms"},
+ { 2, "20ms"},
+ { 3, "30ms"},
+ { 4, "40ms"},
+ { 5, "60ms"},
+ { 6, "80ms"},
+ { 7, "120ms"},
+ { 8, "160ms"},
+ { 9, "240ms"},
+ { 10, "320ms"},
+ { 11, "480ms"},
+ { 12, "960ms"},
+ { 13, "1920ms"},
+ { 14, "Reserved"},
+ { 15, "Reserved"},
+ { 0, NULL }
+};
+
+static const value_string buffer_size_5bits_vals[] =
+{
+ { 0, "BS = 0"},
+ { 1, "0 < BS <= 10"},
+ { 2, "10 < BS <= 14"},
+ { 3, "14 < BS <= 20"},
+ { 4, "20 < BS <= 28"},
+ { 5, "28 < BS <= 38"},
+ { 6, "38 < BS <= 53"},
+ { 7, "53 < BS <= 74"},
+ { 8, "74 < BS <= 102"},
+ { 9, "102 < BS <= 142"},
+ { 10, "142 < BS <= 198"},
+ { 11, "198 < BS <= 276"},
+ { 12, "276 < BS <= 384"},
+ { 13, "384 < BS <= 535"},
+ { 14, "535 < BS <= 745"},
+ { 15, "745 < BS <= 1038"},
+ { 16, "1038 < BS <= 1446"},
+ { 17, "1446 < BS <= 2014"},
+ { 18, "2014 < BS <= 2806"},
+ { 19, "2806 < BS <= 3909"},
+ { 20, "3909 < BS <= 5446"},
+ { 21, "5446 < BS <= 7587"},
+ { 22, "7587 < BS <= 10570"},
+ { 23, "10570 < BS <= 14726"},
+ { 24, "14726 < BS <= 20516"},
+ { 25, "20516 < BS <= 28581"},
+ { 26, "28581 < BS <= 39818"},
+ { 27, "39818 < BS <= 55474"},
+ { 28, "55474 < BS <= 77284"},
+ { 29, "77284 < BS <= 107669"},
+ { 30, "107669 < BS <= 150000"},
+ { 31, "BS > 150000"},
+ { 0, NULL }
+};
+static value_string_ext buffer_size_5bits_vals_ext = VALUE_STRING_EXT_INIT(buffer_size_5bits_vals);
+
+
+static const value_string buffer_size_8bits_vals[] =
+{
+ { 0, "BS = 0"},
+ { 1, "0 < BS <= 10"},
+ { 2, "10 < BS <= 11"},
+ { 3, "11 < BS <= 12"},
+ { 4, "12 < BS <= 13"},
+ { 5, "13 < BS <= 14"},
+ { 6, "14 < BS <= 15"},
+ { 7, "15 < BS <= 16"},
+ { 8, "16 < BS <= 17"},
+ { 9, "17 < BS <= 18"},
+ { 10, "18 < BS <= 19"},
+ { 11, "19 < BS <= 20"},
+ { 12, "20 < BS <= 22"},
+ { 13, "22 < BS <= 23"},
+ { 14, "23 < BS <= 25"},
+ { 15, "25 < BS <= 26"},
+ { 16, "26 < BS <= 28"},
+ { 17, "28 < BS <= 30"},
+ { 18, "30 < BS <= 32"},
+ { 19, "32 < BS <= 34"},
+ { 20, "34 < BS <= 36"},
+ { 21, "36 < BS <= 38"},
+ { 22, "38 < BS <= 40"},
+ { 23, "40 < BS <= 43"},
+ { 24, "43 < BS <= 46"},
+ { 25, "46 < BS <= 49"},
+ { 26, "49 < BS <= 52"},
+ { 27, "52 < BS <= 55"},
+ { 28, "52 < BS <= 59"},
+ { 29, "59 < BS <= 62"},
+ { 30, "62 < BS <= 66"},
+ { 31, "66 < BS <= 71"},
+ { 32, "71 < BS <= 75"},
+ { 33, "75 < BS <= 80"},
+ { 34, "80 < BS <= 85"},
+ { 35, "85 < BS <= 91"},
+ { 36, "91 < BS <= 97"},
+ { 37, "97 < BS <= 103"},
+ { 38, "103 < BS <= 110"},
+ { 39, "110 < BS <= 117"},
+ { 40, "117 < BS <= 124"},
+ { 41, "124 < BS <= 132"},
+ { 42, "132 < BS <= 141"},
+ { 43, "141 < BS <= 150"},
+ { 44, "150 < BS <= 160"},
+ { 45, "160 < BS <= 170"},
+ { 46, "170 < BS <= 181"},
+ { 47, "181 < BS <= 193"},
+ { 48, "193 < BS <= 205"},
+ { 49, "205 < BS <= 218"},
+ { 50, "218 < BS <= 233"},
+ { 51, "233 < BS <= 248"},
+ { 52, "248 < BS <= 264"},
+ { 53, "264 < BS <= 281"},
+ { 54, "281 < BS <= 299"},
+ { 55, "299 < BS <= 318"},
+ { 56, "318 < BS <= 339"},
+ { 57, "339 < BS <= 361"},
+ { 58, "361 < BS <= 384"},
+ { 59, "384 < BS <= 409"},
+ { 60, "409 < BS <= 436"},
+ { 61, "436 < BS <= 464"},
+ { 62, "464 < BS <= 494"},
+ { 63, "494 < BS <= 526"},
+ { 64, "526 < BS <= 560"},
+ { 65, "560 < BS <= 597"},
+ { 66, "597 < BS <= 635"},
+ { 67, "635 < BS <= 677"},
+ { 68, "677 < BS <= 720"},
+ { 69, "720 < BS <= 767"},
+ { 70, "767 < BS <= 817"},
+ { 71, "817 < BS <= 870"},
+ { 72, "870 < BS <= 926"},
+ { 73, "926 < BS <= 987"},
+ { 74, "987 < BS <= 1051"},
+ { 75, "1051 < BS <= 1119"},
+ { 76, "1119 < BS <= 1191"},
+ { 77, "1191 < BS <= 1269"},
+ { 78, "1269 < BS <= 1351"},
+ { 79, "1351 < BS <= 1439"},
+ { 80, "1439 < BS <= 1532"},
+ { 81, "1532 < BS <= 1631"},
+ { 82, "1631 < BS <= 1737"},
+ { 83, "1737 < BS <= 1850"},
+ { 84, "1850 < BS <= 1970"},
+ { 85, "1970 < BS <= 2098"},
+ { 86, "2098 < BS <= 2234"},
+ { 87, "2234 < BS <= 2379"},
+ { 88, "2379 < BS <= 2533"},
+ { 89, "2533 < BS <= 2698"},
+ { 90, "2698 < BS <= 2873"},
+ { 91, "2873 < BS <= 3059"},
+ { 92, "3059 < BS <= 3258"},
+ { 93, "3258 < BS <= 3469"},
+ { 94, "3469 < BS <= 3694"},
+ { 95, "3694 < BS <= 3934"},
+ { 96, "3934 < BS <= 4189"},
+ { 97, "4189 < BS <= 4461"},
+ { 98, "4461 < BS <= 4751"},
+ { 99, "4751 < BS <= 5059"},
+ { 100, "5059 < BS <= 5387"},
+ { 101, "5387 < BS <= 5737"},
+ { 102, "5737 < BS <= 6109"},
+ { 103, "6109 < BS <= 6506"},
+ { 104, "6506 < BS <= 6928"},
+ { 105, "6928 < BS <= 7378"},
+ { 106, "7378 < BS <= 7857"},
+ { 107, "7857 < BS <= 8367"},
+ { 108, "8367 < BS <= 8910"},
+ { 109, "8910 < BS <= 9488"},
+ { 110, "9488 < BS <= 10104"},
+ { 111, "10104 < BS <= 10760"},
+ { 112, "10760 < BS <= 11458"},
+ { 113, "11458 < BS <= 12202"},
+ { 114, "12202 < BS <= 12994"},
+ { 115, "12994 < BS <= 13838"},
+ { 116, "13838 < BS <= 14736"},
+ { 117, "14736 < BS <= 15692"},
+ { 118, "15692 < BS <= 16711"},
+ { 119, "16711 < BS <= 17795"},
+ { 120, "17795 < BS <= 18951"},
+ { 121, "18951 < BS <= 20181"},
+ { 122, "20181 < BS <= 21491"},
+ { 123, "21491 < BS <= 22885"},
+ { 124, "22885 < BS <= 24371"},
+ { 125, "24371 < BS <= 25953"},
+ { 126, "25953 < BS <= 27638"},
+ { 127, "27638 < BS <= 29431"},
+ { 128, "29431 < BS <= 31342"},
+ { 129, "31342 < BS <= 33376"},
+ { 130, "33376 < BS <= 35543"},
+ { 131, "35543 < BS <= 37850"},
+ { 132, "37850 < BS <= 40307"},
+ { 133, "40307 < BS <= 42923"},
+ { 134, "42923 < BS <= 45709"},
+ { 135, "45709 < BS <= 48676"},
+ { 136, "48676 < BS <= 51836"},
+ { 137, "51836 < BS <= 55200"},
+ { 138, "55200 < BS <= 58784"},
+ { 139, "58784 < BS <= 62599"},
+ { 140, "62599 < BS <= 66663"},
+ { 141, "66663 < BS <= 70990"},
+ { 142, "70990 < BS <= 75598"},
+ { 143, "75598 < BS <= 80505"},
+ { 144, "80505 < BS <= 85730"},
+ { 145, "85730 < BS <= 91295"},
+ { 146, "91295 < BS <= 97221"},
+ { 147, "97221 < BS <= 103532"},
+ { 148, "103532 < BS <= 110252"},
+ { 149, "110252 < BS <= 117409"},
+ { 150, "117409 < BS <= 125030"},
+ { 151, "125030 < BS <= 133146"},
+ { 152, "133146 < BS <= 141789"},
+ { 153, "141789 < BS <= 150992"},
+ { 154, "150992 < BS <= 160793"},
+ { 155, "160793 < BS <= 171231"},
+ { 156, "171231 < BS <= 182345"},
+ { 157, "182345 < BS <= 194182"},
+ { 158, "194182 < BS <= 206786"},
+ { 159, "206786 < BS <= 220209"},
+ { 160, "220209 < BS <= 234503"},
+ { 161, "234503 < BS <= 249725"},
+ { 162, "249725 < BS <= 265935"},
+ { 163, "265935 < BS <= 283197"},
+ { 164, "283197 < BS <= 301579"},
+ { 165, "301579 < BS <= 321155"},
+ { 166, "321155 < BS <= 342002"},
+ { 167, "342002 < BS <= 364202"},
+ { 168, "364202 < BS <= 387842"},
+ { 169, "387842 < BS <= 413018"},
+ { 170, "413018 < BS <= 439827"},
+ { 171, "439827 < BS <= 468377"},
+ { 172, "468377 < BS <= 498780"},
+ { 173, "498780 < BS <= 531156"},
+ { 174, "531156 < BS <= 565634"},
+ { 175, "565634 < BS <= 602350"},
+ { 176, "602350 < BS <= 641449"},
+ { 177, "641449 < BS <= 683087"},
+ { 178, "683087 < BS <= 727427"},
+ { 179, "727427 < BS <= 774645"},
+ { 180, "774645 < BS <= 824928"},
+ { 181, "824928 < BS <= 878475"},
+ { 182, "878475 < BS <= 935498"},
+ { 183, "935498 < BS <= 996222"},
+ { 184, "996222 < BS <= 1060888"},
+ { 185, "1060888 < BS <= 1129752"},
+ { 186, "1129752 < BS <= 1203085"},
+ { 187, "1203085 < BS <= 1281179"},
+ { 188, "1281179 < BS <= 1364342"},
+ { 189, "1364342 < BS <= 1452903"},
+ { 190, "1452903 < BS <= 1547213"},
+ { 191, "1547213 < BS <= 1647644"},
+ { 192, "1647644 < BS <= 1754595"},
+ { 193, "1754595 < BS <= 1868488"},
+ { 194, "1868488 < BS <= 1989774"},
+ { 195, "1989774 < BS <= 2118933"},
+ { 196, "2118933 < BS <= 2256475"},
+ { 197, "2256475 < BS <= 2402946"},
+ { 198, "2402946 < BS <= 2558924"},
+ { 199, "2558924 < BS <= 2725027"},
+ { 200, "2725027 < BS <= 2901912"},
+ { 201, "2901912 < BS <= 3090279"},
+ { 202, "3090279 < BS <= 3290873"},
+ { 203, "3290873 < BS <= 3504487"},
+ { 204, "3504487 < BS <= 3731968"},
+ { 205, "3731968 < BS <= 3974215"},
+ { 206, "3974215 < BS <= 4232186"},
+ { 207, "4232186 < BS <= 4506902"},
+ { 208, "4506902 < BS <= 4799451"},
+ { 209, "4799451 < BS <= 5110989"},
+ { 210, "5110989 < BS <= 5442750"},
+ { 211, "5442750 < BS <= 5796046"},
+ { 212, "5796046 < BS <= 6172275"},
+ { 213, "6172275 < BS <= 6572925"},
+ { 214, "6572925 < BS <= 6999582"},
+ { 215, "6999582 < BS <= 7453933"},
+ { 216, "7453933 < BS <= 7937777"},
+ { 217, "7937777 < BS <= 8453028"},
+ { 218, "8453028 < BS <= 9001725"},
+ { 219, "9001725 < BS <= 9586039"},
+ { 220, "9586039 < BS <= 10208280"},
+ { 221, "10208280 < BS <= 10870913"},
+ { 222, "10870913 < BS <= 11576557"},
+ { 223, "11576557 < BS <= 12328006"},
+ { 224, "12328006 < BS <= 13128233"},
+ { 225, "13128233 < BS <= 13980403"},
+ { 226, "13980403 < BS <= 14887889"},
+ { 227, "14887889 < BS <= 15854280"},
+ { 228, "15854280 < BS <= 16883401"},
+ { 229, "16883401 < BS <= 17979324"},
+ { 230, "17979324 < BS <= 19146385"},
+ { 231, "19146385 < BS <= 20389201"},
+ { 232, "20389201 < BS <= 21712690"},
+ { 233, "21712690 < BS <= 23122088"},
+ { 234, "23122088 < BS <= 24622972"},
+ { 235, "24622972 < BS <= 26221280"},
+ { 236, "26221280 < BS <= 27923336"},
+ { 237, "27923336 < BS <= 29735875"},
+ { 238, "29735875 < BS <= 31666069"},
+ { 239, "31666069 < BS <= 33721553"},
+ { 240, "33721553 < BS <= 35910462"},
+ { 241, "35910462 < BS <= 38241455"},
+ { 242, "38241455 < BS <= 40723756"},
+ { 243, "40723756 < BS <= 43367187"},
+ { 244, "43367187 < BS <= 46182206"},
+ { 245, "46182206 < BS <= 49179951"},
+ { 246, "49179951 < BS <= 52372284"},
+ { 247, "52372284 < BS <= 55771835"},
+ { 248, "55771835 < BS <= 59392055"},
+ { 249, "59392055 < BS <= 63247269"},
+ { 250, "63247269 < BS <= 67352729"},
+ { 251, "67352729 < BS <= 71724679"},
+ { 252, "71724679 < BS <= 76380419"},
+ { 253, "76380419 < BS <= 81338368"},
+ { 254, "BS > 81338368"},
+ { 255, "Reserved"},
+ { 0, NULL }
+};
+static value_string_ext buffer_size_8bits_vals_ext = VALUE_STRING_EXT_INIT(buffer_size_8bits_vals);
+
+static const value_string tpc_command_vals[] =
+{
+ { 0, "-6dB"},
+ { 1, "-4dB"},
+ { 2, "-2dB"},
+ { 3, "0dB"},
+ { 4, "2dB"},
+ { 5, "4dB"},
+ { 6, "6dB"},
+ { 7, "8dB"},
+ { 0, NULL }
+};
+
+
+
+static const true_false_string power_backoff_affects_power_management_vals =
+{
+ "Power backoff is applied to power management",
+ "Power backoff not applied to power management"
+};
+
+static const true_false_string phr_source_vals =
+{
+ "PH based on reference format",
+ "PH based on real transmission",
+};
+
+static const true_false_string activation_deactivation_vals =
+{
+ "Activation",
+ "Deactivation"
+};
+
+static const true_false_string c_vals =
+{
+ "Octets containing Resource Serving Cell ID field(s) and Resource BWP ID field(s) are present",
+ "Octets containing Resource Serving Cell ID field(s) and Resource BWP ID field(s) are not present"
+};
+
+static const true_false_string sul_vals =
+{
+ "Applies to the SUL carrier configuration",
+ "Applies to the NUL carrier configuration"
+};
+
+static const true_false_string sp_srs_act_deact_f_vals =
+{
+ "NZP CSI-RS resource index is used",
+ "SSB index or SRS resource index is used"
+};
+
+static const true_false_string aper_csi_trigger_state_t_vals =
+{
+ "Mapped to the codepoint of the DCI CSI request field",
+ "Not mapped to the codepoint of the DCI CSI request field"
+};
+
+static const value_string bit_rate_vals[] =
+{
+ { 0, "no bit rate recommendation"},
+ { 1, "0 kbit/s"},
+ { 2, "9 kbit/s"},
+ { 3, "11 kbit/s"},
+ { 4, "13 kbit/s"},
+ { 5, "17 kbit/s"},
+ { 6, "21 kbit/s"},
+ { 7, "25 kbit/s"},
+ { 8, "29 kbit/s"},
+ { 9, "32 kbit/s"},
+ { 10, "36 kbit/s"},
+ { 11, "40 kbit/s"},
+ { 12, "48 kbit/s"},
+ { 13, "56 kbit/s"},
+ { 14, "72 kbit/s"},
+ { 15, "88 kbit/s"},
+ { 16, "104 kbit/s"},
+ { 17, "120 kbit/s"},
+ { 18, "140 kbit/s"},
+ { 19, "160 kbit/s"},
+ { 20, "180 kbit/s"},
+ { 21, "200 kbit/s"},
+ { 22, "220 kbit/s"},
+ { 23, "240 kbit/s"},
+ { 24, "260 kbit/s"},
+ { 25, "280 kbit/s"},
+ { 26, "300 kbit/s"},
+ { 27, "350 kbit/s"},
+ { 28, "400 kbit/s"},
+ { 29, "450 kbit/s"},
+ { 30, "500 kbit/s"},
+ { 31, "600 kbit/s"},
+ { 32, "700 kbit/s"},
+ { 33, "800 kbit/s"},
+ { 34, "900 kbit/s"},
+ { 35, "1000 kbit/s"},
+ { 36, "1100 kbit/s"},
+ { 37, "1200 kbit/s"},
+ { 38, "1300 kbit/s"},
+ { 39, "1400 kbit/s"},
+ { 40, "1500 kbit/s"},
+ { 41, "1750 kbit/s"},
+ { 42, "2000 kbit/s"},
+ { 43, "2250 kbit/s"},
+ { 44, "2500 kbit/s"},
+ { 45, "2750 kbit/s"},
+ { 46, "3000 kbit/s"},
+ { 47, "3500 kbit/s"},
+ { 48, "4000 kbit/s"},
+ { 49, "4500 kbit/s"},
+ { 50, "5000 kbit/s"},
+ { 51, "5500 kbit/s"},
+ { 52, "6000 kbit/s"},
+ { 53, "6500 kbit/s"},
+ { 54, "7000 kbit/s"},
+ { 55, "7500 kbit/s"},
+ { 56, "8000 kbit/s"},
+ { 0, NULL }
+};
+static value_string_ext bit_rate_vals_ext = VALUE_STRING_EXT_INIT(bit_rate_vals);
+
+/* Forward declarations */
+static int dissect_mac_nr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void*);
+
+/* Write the given formatted text to:
+ - the info column (if pinfo != NULL)
+ - 1 or 2 other labels (optional)
+*/
+static void write_pdu_label_and_info(proto_item *ti1, proto_item *ti2,
+ 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
+ static char info_buffer[MAX_INFO_BUFFER];
+ va_list ap;
+
+ if ((ti1 == NULL) && (ti2 == NULL) && (pinfo == NULL)) {
+ return;
+ }
+
+ va_start(ap, format);
+ vsnprintf(info_buffer, MAX_INFO_BUFFER, format, ap);
+ va_end(ap);
+
+ /* Add to indicated places */
+ if (pinfo != NULL) {
+ col_append_str(pinfo->cinfo, COL_INFO, info_buffer);
+ }
+ if (ti1 != NULL) {
+ proto_item_append_text(ti1, "%s", info_buffer);
+ }
+ if (ti2 != NULL) {
+ proto_item_append_text(ti2, "%s", info_buffer);
+ }
+}
+
+/* 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)
+{
+ /* Add to indicated places */
+ if (pinfo != NULL) {
+ col_append_str(pinfo->cinfo, COL_INFO, info_buffer);
+ }
+ if (ti1 != NULL) {
+ proto_item_append_text(ti1, "%s", info_buffer);
+ }
+ if (ti2 != NULL) {
+ proto_item_append_text(ti2, "%s", info_buffer);
+ }
+}
+
+static void
+call_with_catch_all(dissector_handle_t handle, tvbuff_t* tvb, packet_info *pinfo, proto_tree *tree)
+{
+ /* Call it (catch exceptions so that stats will be updated) */
+ if (handle) {
+ TRY {
+ call_dissector_only(handle, tvb, pinfo, tree, NULL);
+ }
+ CATCH_ALL {
+ }
+ ENDTRY
+ }
+}
+
+/* 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)
+{
+ proto_item *ti;
+
+ write_pdu_label_and_info(pdu_ti, NULL, pinfo,
+ "BCCH PDU (%u bytes, on %s transport) ",
+ tvb_reported_length_remaining(tvb, offset),
+ val_to_str_const(p_mac_nr_info->rntiType,
+ bcch_transport_channel_vals,
+ "Unknown"));
+
+ /* Show which transport layer it came in on (inferred from RNTI type) */
+ ti = proto_tree_add_uint(tree, hf_mac_nr_context_bcch_transport_channel,
+ tvb, offset, 0, p_mac_nr_info->rntiType);
+ proto_item_set_generated(ti);
+
+ /****************************************/
+ /* Whole frame is BCCH data */
+
+ /* Raw data */
+ ti = proto_tree_add_item(tree, hf_mac_nr_bcch_pdu,
+ tvb, offset, -1, ENC_NA);
+
+ if (global_mac_nr_attempt_rrc_decode) {
+ /* Attempt to decode payload using NR RRC dissector */
+ dissector_handle_t protocol_handle;
+ tvbuff_t *rrc_tvb = tvb_new_subset_remaining(tvb, offset);
+
+ if (p_mac_nr_info->rntiType == NO_RNTI) {
+ protocol_handle = nr_rrc_bcch_bch_handle;
+ } else {
+ protocol_handle = nr_rrc_bcch_dl_sch_handle;
+ }
+
+ /* Hide raw view of bytes */
+ proto_item_set_hidden(ti);
+
+ call_with_catch_all(protocol_handle, rrc_tvb, pinfo, 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 *ti;
+
+ write_pdu_label_and_info(pdu_ti, NULL, pinfo,
+ "PCCH PDU (%u bytes) ",
+ tvb_reported_length_remaining(tvb, offset));
+
+ /****************************************/
+ /* Whole frame is PCCH data */
+
+ /* Always show as raw data */
+ ti = proto_tree_add_item(tree, hf_mac_nr_pcch_pdu,
+ tvb, offset, -1, ENC_NA);
+
+ if (global_mac_nr_attempt_rrc_decode) {
+
+ /* Attempt to decode payload using NR RRC dissector */
+ tvbuff_t *rrc_tvb = tvb_new_subset_remaining(tvb, offset);
+
+ /* Hide raw view of bytes */
+ proto_item_set_hidden(ti);
+
+ call_with_catch_all(nr_rrc_pcch_handle, rrc_tvb, pinfo, 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_)
+{
+ write_pdu_label_and_info(pdu_ti, NULL, pinfo,
+ "RAR (RA-RNTI=%u) ",
+ p_mac_nr_info->rnti);
+
+ /* Create hidden 'virtual root' so can filter on mac-nr.rar */
+ proto_item *ti = proto_tree_add_item(tree, hf_mac_nr_rar, tvb, offset, -1, ENC_NA);
+ proto_item_set_hidden(ti);
+
+ gboolean E, T;
+
+ do {
+ /* Subheader */
+ proto_item *subheader_ti = proto_tree_add_item(tree,
+ hf_mac_nr_rar_subheader,
+ 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 */
+ proto_tree_add_item_ret_boolean(rar_subheader_tree, hf_mac_nr_rar_e, tvb, offset, 1, ENC_BIG_ENDIAN, &E);
+ proto_tree_add_item_ret_boolean(rar_subheader_tree, hf_mac_nr_rar_t, tvb, offset, 1, ENC_BIG_ENDIAN, &T);
+
+ if (!T) {
+ /* BI */
+
+ /* 2 reserved bits */
+ proto_tree_add_item(rar_subheader_tree, hf_mac_nr_rar_reserved, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+ /* BI (4 bits) */
+ guint32 BI;
+ proto_tree_add_item_ret_uint(rar_subheader_tree, hf_mac_nr_rar_bi, tvb, offset, 1, ENC_BIG_ENDIAN, &BI);
+ offset++;
+
+ write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo,
+ "(BI=%u) ", BI);
+ }
+ else {
+ /* RAPID */
+ guint32 rapid;
+ proto_tree_add_item_ret_uint(rar_subheader_tree, hf_mac_nr_rar_rapid, tvb, offset, 1, ENC_BIG_ENDIAN, &rapid);
+ offset++;
+
+ if (TRUE) {
+ /* SubPDU. Not for SI request - TODO: define RAPID range for SI request in mac_nr_info */
+
+ /* 1 reserved bit */
+ proto_tree_add_item(rar_subheader_tree, hf_mac_nr_rar_reserved1, tvb, offset, 1, ENC_BIG_ENDIAN);
+
+ /* TA (12 bits) */
+ guint32 ta;
+ proto_tree_add_item_ret_uint(rar_subheader_tree, hf_mac_nr_rar_ta, tvb, offset, 2, ENC_BIG_ENDIAN, &ta);
+ offset++;
+
+ /* Break down the 27-bits of the grant field, according to 38.213, section 8.2 */
+ static int * const rar_grant_fields[] = {
+ &hf_mac_nr_rar_grant_hopping,
+ &hf_mac_nr_rar_grant_fra,
+ &hf_mac_nr_rar_grant_tsa,
+ &hf_mac_nr_rar_grant_mcs,
+ &hf_mac_nr_rar_grant_tcsp,
+ &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;
+
+ /* C-RNTI (2 bytes) */
+ guint32 c_rnti;
+ proto_tree_add_item_ret_uint(rar_subheader_tree, hf_mac_nr_rar_temp_crnti, tvb, offset, 2, ENC_BIG_ENDIAN, &c_rnti);
+ offset += 2;
+
+ 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);
+ //}
+ }
+ /* Set subheader (+subpdu..) length */
+ proto_item_set_end(subheader_ti, tvb, offset);
+
+ } while (E);
+
+ /* Any remaining length is padding */
+ if (tvb_reported_length_remaining(tvb, offset)) {
+ proto_tree_add_item(tree, hf_mac_nr_padding, tvb, offset, -1, ENC_NA);
+ }
+}
+
+static gboolean is_fixed_sized_lcid(guint8 lcid, guint8 direction)
+{
+ if (direction == DIRECTION_UPLINK) {
+ switch (lcid) {
+ case CCCH_LCID:
+ case CCCH_48_BITS_LCID:
+ case RECOMMENDED_BIT_RATE_QUERY_LCID:
+ case CONFIGURED_GRANT_CONFIGURATION_LCID:
+ case SINGLE_ENTRY_PHR_LCID:
+ case C_RNTI_LCID:
+ case SHORT_TRUNCATED_BSR_LCID:
+ case SHORT_BSR_LCID:
+ case PADDING_LCID:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+ }
+ else {
+ switch (lcid) {
+ case RECOMMENDED_BIT_RATE_LCID:
+ case SP_ZP_CSI_RS_RESOURCE_SET_ACT_DEACT_LCID:
+ case PUCCH_SPATIAL_REL_ACT_DEACT_LCID:
+ case SP_CSI_REPORT_ON_PUCCH_ACT_DEACT_LCID:
+ case TCI_STATE_IND_FOR_UE_SPEC_PDCCH_LCID:
+ case DUPLICATION_ACTIVATION_DEACTIVATION_LCID:
+ case SCELL_ACTIVATION_DEACTIVATION_4_LCID:
+ case SCELL_ACTIVATION_DEACTIVATION_1_LCID:
+ case LONG_DRX_COMMAND_LCID:
+ case DRX_COMMAND_LCID:
+ case TIMING_ADVANCE_COMMAND_LCID:
+ case UE_CONTENTION_RESOLUTION_IDENTITY_LCID:
+ case PADDING_LCID:
+ return TRUE;
+ default:
+ return FALSE;
+ }
+ }
+}
+
+static true_false_string subheader_f_vals = {
+ "16 bits",
+ "8 bits"
+};
+
+
+/* Returns new subtree that was added for this item */
+static proto_item* dissect_me_phr_ph(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ int ph_item, int pcmax_f_c_item,
+ guint32 *PH, guint32 *offset)
+{
+ /* 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);
+ proto_tree *entry_tree = proto_item_add_subtree(entry_ti, ett_mac_nr_me_phr_entry);
+
+ /* P */
+ proto_tree_add_item(entry_tree, hf_mac_nr_control_me_phr_p, tvb, *offset, 1, ENC_BIG_ENDIAN);
+ /* V */
+ gboolean V;
+ proto_tree_add_item_ret_boolean(entry_tree, hf_mac_nr_control_me_phr_v, tvb, *offset, 1, ENC_BIG_ENDIAN, &V);
+ /* PH. TODO: infer whether value relates to Type1 (PUSCH), Type2 (PUCCH) or Type3 (SRS).
+ And decide whether:
+ - there needs to be a separate field for each SCellIndex and type OR
+ - a generated field added with the inferred type OR
+ - just do proto_item_append_text() indicating what the type was
+ */
+ proto_tree_add_item_ret_uint(entry_tree, ph_item, tvb, *offset, 1, ENC_BIG_ENDIAN, PH);
+ (*offset)++;
+
+ if (!V) {
+ /* Reserved (2 bits) */
+ proto_tree_add_item(entry_tree, hf_mac_nr_control_me_phr_reserved_2, tvb, *offset, 1, ENC_BIG_ENDIAN);
+ /* pcmax_f_c (6 bits) */
+ proto_tree_add_item(entry_tree, pcmax_f_c_item, tvb, *offset, 1, ENC_BIG_ENDIAN);
+ (*offset)++;
+ }
+
+ proto_item_set_end(entry_ti, tvb, *offset);
+ return entry_ti;
+}
+
+
+static guint8 get_rlc_seqnum_length(rlc_bearer_type_t rlc_bearer_type)
+{
+ switch (rlc_bearer_type) {
+ case rlcUM6:
+ return 6;
+ case rlcUM12:
+ return 12;
+ case rlcAM12:
+ return 12;
+ case rlcAM18:
+ return 18;
+
+ default:
+ /* Not expected */
+ return 0;
+ }
+}
+
+
+
+/* Lookup bearer details for lcid */
+static gboolean lookup_rlc_bearer_from_lcid(guint16 ueid,
+ guint8 lcid,
+ guint8 direction,
+ rlc_bearer_type_t *rlc_bearer_type, /* out */
+ guint8 *seqnum_length, /* out */
+ gint *drb_id) /* out */
+{
+ /* Zero params (in case no match is found) */
+ *rlc_bearer_type = rlcRaw;
+ *seqnum_length = 0;
+ *drb_id = 0;
+
+ if (global_mac_nr_lcid_drb_source == (int)FromStaticTable) {
+
+ /* Look up in static (UAT) table */
+ guint m;
+ for (m=0; m < num_lcid_drb_mappings; m++) {
+ if (lcid == lcid_drb_mappings[m].lcid) {
+
+ /* Found, set out parameters */
+ if (direction == DIRECTION_UPLINK) {
+ *rlc_bearer_type = lcid_drb_mappings[m].bearer_type_ul;
+ }
+ else {
+ *rlc_bearer_type = lcid_drb_mappings[m].bearer_type_dl;
+ }
+ *seqnum_length = get_rlc_seqnum_length(*rlc_bearer_type);
+ *drb_id = lcid_drb_mappings[m].drbid;
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+ else {
+ /* Look up the dynamic mappings for this UE */
+ ue_dynamic_drb_mappings_t *ue_mappings = (ue_dynamic_drb_mappings_t *)g_hash_table_lookup(mac_nr_ue_bearers_hash, GUINT_TO_POINTER((guint)ueid));
+ if (!ue_mappings) {
+ return FALSE;
+ }
+
+ /* Look up setting gleaned from configuration protocol */
+ if (!ue_mappings->mapping[lcid].valid) {
+ return FALSE;
+ }
+
+ /* Found, set out params */
+ *rlc_bearer_type = (direction == DIRECTION_UPLINK) ?
+ ue_mappings->mapping[lcid].bearer_type_ul :
+ ue_mappings->mapping[lcid].bearer_type_dl;
+ *seqnum_length = get_rlc_seqnum_length(*rlc_bearer_type);
+ *drb_id = ue_mappings->mapping[lcid].drbid;
+
+ return TRUE;
+ }
+}
+
+
+/* Helper function to call RLC dissector for SDUs (where channel params are known) */
+static void call_rlc_dissector(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+ proto_item *pdu_ti,
+ int offset, guint16 data_length,
+ guint8 mode, guint8 direction, guint16 ueid,
+ guint8 bearerType, guint8 bearerId,
+ guint8 sequenceNumberLength,
+ guint8 priority _U_)
+{
+ 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 */
+ 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);
+ }
+
+ /* Fill in details for channel */
+ p_rlc_nr_info->rlcMode = mode;
+ p_rlc_nr_info->direction = direction;
+ /* p_rlc_nr_info->priority = priority; */
+ p_rlc_nr_info->ueid = ueid;
+ p_rlc_nr_info->bearerType = bearerType;
+ p_rlc_nr_info->bearerId = bearerId;
+ p_rlc_nr_info->pduLength = data_length;
+ p_rlc_nr_info->sequenceNumberLength = sequenceNumberLength;
+
+ /* Store info in packet */
+ p_add_proto_data(wmem_file_scope(), pinfo, proto_rlc_nr, 0, p_rlc_nr_info);
+
+ if (global_mac_nr_layer_to_show != ShowRLCLayer) {
+ /* Don't want these columns replaced */
+ col_set_writable(pinfo->cinfo, -1, FALSE);
+ }
+ else {
+ /* Clear info column before first RLC PDU */
+ if (s_number_of_rlc_pdus_shown == 0) {
+ col_clear(pinfo->cinfo, COL_INFO);
+ }
+ else {
+ /* Add a separator and protect column contents here */
+ write_pdu_label_and_info_literal(pdu_ti, NULL, pinfo, " || ");
+ col_set_fence(pinfo->cinfo, COL_INFO);
+ }
+ }
+ s_number_of_rlc_pdus_shown++;
+
+ /* Call it (catch exceptions so that stats will be updated) */
+ call_with_catch_all(rlc_nr_handle, rb_tvb, pinfo, tree);
+
+ /* Let columns be written to again */
+ col_set_writable(pinfo->cinfo, -1, TRUE);
+}
+
+/* see 3GPP 38.133 Table 10.1.17.1-1 */
+static void
+mac_nr_phr_fmt(gchar *s, guint32 v)
+{
+ gint32 val = (gint32)v;
+
+ if (val == 0) {
+ snprintf(s, ITEM_LABEL_LENGTH, "PH < -32 dB (0)");
+ } else if (val == 63) {
+ snprintf(s, ITEM_LABEL_LENGTH, "PH >= 38 dB (63)");
+ } else if (val <= 54) {
+ snprintf(s, ITEM_LABEL_LENGTH, "%d dB <= PH < %d dB (%d)", val - 33, val - 32, val);
+ } else {
+ snprintf(s, ITEM_LABEL_LENGTH, "%d dB <= PH < %d dB (%d)", 22 + 2 * (val - 55), 24 + 2 * (val - 55), val);
+ }
+}
+
+/* see 3GPP 38.133 Table 10.1.18.1-1 */
+static void
+mac_nr_pcmax_f_c_fmt(gchar *s, guint32 v)
+{
+ gint32 val = (gint32)v;
+
+ if (val == 0) {
+ snprintf(s, ITEM_LABEL_LENGTH, "Pcmax,f,c < -29 dBm (0)");
+ } else if (val == 63) {
+ snprintf(s, ITEM_LABEL_LENGTH, "Pcmax,f,c >= 33 dBm (63)");
+ } else {
+ snprintf(s, ITEM_LABEL_LENGTH, "%d dBm <= Pcmax,f,c < %d dBm (%d)", val - 30, val - 29, val);
+ }
+}
+
+/* UL-SCH and DL-SCH formats have much in common, so handle them in a common
+ function */
+static void dissect_ulsch_or_dlsch(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
+ proto_item *pdu_ti, guint32 offset,
+ mac_nr_info *p_mac_nr_info,
+ proto_tree *context_tree _U_)
+{
+ gboolean ces_seen = FALSE;
+ gboolean data_seen = FALSE;
+
+ write_pdu_label_and_info(pdu_ti, NULL, pinfo,
+ "%s ",
+ (p_mac_nr_info->direction == DIRECTION_UPLINK) ? "UL-SCH" : "DL-SCH");
+
+ /************************************************************************/
+ /* Dissect each sub-pdu. */
+ do {
+ /* Subheader */
+ proto_item *subheader_ti = proto_tree_add_item(tree,
+ hf_mac_nr_subheader,
+ tvb, offset, 0, ENC_ASCII);
+ proto_tree *subheader_tree = proto_item_add_subtree(subheader_ti, ett_mac_nr_subheader);
+
+
+ gboolean F, fixed_len;
+ guint32 SDU_length=0;
+
+ /* 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);
+ if (fixed_len) {
+ proto_tree_add_bits_item(subheader_tree, hf_mac_nr_subheader_reserved, tvb, offset<<3, 2, ENC_BIG_ENDIAN);
+ }
+ else {
+ proto_tree_add_bits_item(subheader_tree, hf_mac_nr_subheader_reserved, tvb, offset<<3, 1, ENC_BIG_ENDIAN);
+ /* Data, so check F bit and length */
+ proto_tree_add_item_ret_boolean(subheader_tree, hf_mac_nr_subheader_f, tvb, offset, 1, ENC_BIG_ENDIAN, &F);
+ }
+
+ /* 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++;
+
+ if (!fixed_len) {
+ if (F) {
+ /* Long length */
+ proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_subheader_length_2_bytes, tvb, offset, 2, ENC_BIG_ENDIAN, &SDU_length);
+ offset += 2;
+ }
+ else {
+ /* Short length */
+ proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_subheader_length_1_byte, tvb, offset, 1, ENC_BIG_ENDIAN, &SDU_length);
+ offset++;
+ }
+ }
+
+ if (lcid <= 32 || (p_mac_nr_info->direction == DIRECTION_UPLINK && lcid == CCCH_48_BITS_LCID)) {
+ proto_item *sch_pdu_ti;
+
+ /* Note whether this sub-pdu gets dissected by RLC/RRC */
+ gboolean dissected_by_upper_layer = FALSE;
+
+ /* Add SDU, for now just as hex data */
+ if (p_mac_nr_info->direction == DIRECTION_UPLINK) {
+ if (lcid == CCCH_LCID) {
+ SDU_length = 8;
+ } else if (lcid == CCCH_48_BITS_LCID) {
+ SDU_length = 6;
+ }
+ sch_pdu_ti = proto_tree_add_item(subheader_tree, hf_mac_nr_ulsch_sdu,
+ tvb, offset, SDU_length, ENC_NA);
+ }
+ else {
+ sch_pdu_ti = proto_tree_add_item(subheader_tree, hf_mac_nr_dlsch_sdu,
+ tvb, offset, SDU_length, ENC_NA);
+ }
+
+ /* Call RLC if configured to do so for this SDU */
+ if ((lcid >= 4) && (lcid <= 32)) {
+ /* Look for mapping for this LCID to drb channel set by UAT table */
+ rlc_bearer_type_t rlc_bearer_type;
+ guint8 seqnum_length;
+ gint drb_id;
+
+ // TODO: priority not set.
+ guint8 priority = 0;
+ lookup_rlc_bearer_from_lcid(p_mac_nr_info->ueid,
+ lcid,
+ p_mac_nr_info->direction,
+ &rlc_bearer_type,
+ &seqnum_length,
+ &drb_id);
+
+ /* Dissect according to channel type */
+ switch (rlc_bearer_type) {
+ case rlcUM6:
+ case rlcUM12:
+ call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, SDU_length,
+ RLC_UM_MODE, p_mac_nr_info->direction, p_mac_nr_info->ueid,
+ BEARER_TYPE_DRB, drb_id, seqnum_length,
+ priority);
+ dissected_by_upper_layer = TRUE;
+ break;
+ case rlcAM12:
+ case rlcAM18:
+ call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, SDU_length,
+ RLC_AM_MODE, p_mac_nr_info->direction, p_mac_nr_info->ueid,
+ BEARER_TYPE_DRB, drb_id, seqnum_length,
+ priority);
+ dissected_by_upper_layer = TRUE;
+ break;
+ case rlcTM:
+ call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, SDU_length,
+ RLC_TM_MODE, p_mac_nr_info->direction, p_mac_nr_info->ueid,
+ BEARER_TYPE_DRB, drb_id, 0,
+ priority);
+ dissected_by_upper_layer = TRUE;
+ break;
+ case rlcRaw:
+ /* Nothing to do! */
+ break;
+ }
+ } else if (lcid >= 1 && lcid <= 3) {
+ 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. */
+ call_rlc_dissector(tvb, pinfo, tree, pdu_ti, offset, SDU_length,
+ RLC_AM_MODE, p_mac_nr_info->direction, p_mac_nr_info->ueid,
+ BEARER_TYPE_SRB, lcid, 12,
+ (lcid == 2) ? 3 : 1);
+ dissected_by_upper_layer = TRUE;
+ }
+ } else if (global_mac_nr_attempt_rrc_decode) {
+ dissector_handle_t protocol_handle;
+ tvbuff_t *rrc_tvb = tvb_new_subset_remaining(tvb, offset);
+
+ if (p_mac_nr_info->direction == DIRECTION_UPLINK) {
+ protocol_handle = (lcid == CCCH_LCID) ? nr_rrc_ul_ccch1_handle : nr_rrc_ul_ccch_handle;
+ } else {
+ protocol_handle = nr_rrc_dl_ccch_handle;
+ }
+ /* Hide raw view of bytes */
+ proto_item_set_hidden(sch_pdu_ti);
+ call_with_catch_all(protocol_handle, rrc_tvb, pinfo, tree);
+ dissected_by_upper_layer = TRUE;
+ }
+
+ /* Only write summary to Info column if didn't send to upper_layer dissector */
+ write_pdu_label_and_info(pdu_ti, subheader_ti, dissected_by_upper_layer ? NULL : pinfo,
+ "(LCID:%u %u bytes) ", lcid, SDU_length);
+
+ offset += SDU_length;
+
+
+ if (p_mac_nr_info->direction == DIRECTION_UPLINK) {
+ if (ces_seen) {
+ expert_add_info_format(pinfo, subheader_ti, &ei_mac_nr_ul_sch_control_subheader_before_data_subheader,
+ "UL-SCH: should not have Data SDUs after Control Elements");
+ }
+ }
+ data_seen = TRUE;
+ }
+ else {
+ /* Control Elements */
+
+ /* Add some space to info column between entries */
+ if (data_seen || ces_seen) {
+ col_append_str(pinfo->cinfo, COL_INFO, " ");
+ }
+
+ if (lcid != PADDING_LCID) {
+ ces_seen = TRUE;
+ }
+
+ if (p_mac_nr_info->direction == DIRECTION_UPLINK) {
+ guint32 phr_ph, phr_pcmax_f_c, c_rnti, lcg_id, bs, br_lcid, bit_rate;
+ 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;
+ 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;
+ }
+
+ 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);
+
+
+ /* 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);
+ }
+ }
+ }
+
+ 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) ");
+
+ 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++;
+
+ /* 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 {
+ /* Downlink control elements */
+ guint32 ta_tag_id, ta_ta, br_lcid, bit_rate;
+ gboolean dir;
+
+ if (lcid != PADDING_LCID) {
+ if (data_seen) {
+ expert_add_info_format(pinfo, subheader_ti, &ei_mac_nr_dl_sch_control_subheader_after_data_subheader,
+ "DL-SCH: should not have Control Elements after Data SDUs");
+ }
+ }
+
+ switch (lcid) {
+ 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);
+ proto_tree_add_item_ret_boolean(subheader_tree, hf_mac_nr_control_recommended_bit_rate_dir,
+ tvb, offset, 1, ENC_BIG_ENDIAN, &dir);
+ proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_recommended_bit_rate_bit_rate,
+ tvb, offset, 2, ENC_BIG_ENDIAN, &bit_rate);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_recommended_bit_rate_reserved,
+ tvb, offset+1, 1, ENC_BIG_ENDIAN);
+ offset += 2;
+ write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo,
+ "(Recommended BR LCID=%u Dir=%s BR=%s) ", br_lcid, dir ? "UL" : "DL",
+ val_to_str_ext_const(bit_rate, &bit_rate_vals_ext, "Unknown"));
+ break;
+ case SP_ZP_CSI_RS_RESOURCE_SET_ACT_DEACT_LCID:
+ proto_tree_add_item(subheader_tree, hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_ad,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_serving_cell_id,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_bwp_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_item(subheader_tree, hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_reserved_2,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_sp_zp_rs_resource_set_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo,
+ "(SP ZP CSI-RS Res Set Act/Deact) ");
+ break;
+ case PUCCH_SPATIAL_REL_ACT_DEACT_LCID:
+ {
+ static int * const pucch_spatial_rel_act_deact_flags[] = {
+ &hf_mac_nr_control_pucch_spatial_rel_act_deact_s8,
+ &hf_mac_nr_control_pucch_spatial_rel_act_deact_s7,
+ &hf_mac_nr_control_pucch_spatial_rel_act_deact_s6,
+ &hf_mac_nr_control_pucch_spatial_rel_act_deact_s5,
+ &hf_mac_nr_control_pucch_spatial_rel_act_deact_s4,
+ &hf_mac_nr_control_pucch_spatial_rel_act_deact_s3,
+ &hf_mac_nr_control_pucch_spatial_rel_act_deact_s2,
+ &hf_mac_nr_control_pucch_spatial_rel_act_deact_s1,
+ NULL
+ };
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_pucch_spatial_rel_act_deact_reserved,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_pucch_spatial_rel_act_deact_serving_cell_id,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_pucch_spatial_rel_act_deact_bwp_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_pucch_spatial_rel_act_deact_reserved,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_pucch_spatial_rel_act_deact_pucch_resource_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, pucch_spatial_rel_act_deact_flags, ENC_NA);
+ offset++;
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo,
+ "(PUCCH Spatial Rel Act/Deact) ");
+ }
+ break;
+ case SP_SRS_ACT_DEACT_LCID:
+ {
+ gboolean ad, c;
+ guint32 start_offset = offset;
+ guint resources = 0;
+
+ /* Header */
+ proto_tree_add_item_ret_boolean(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_ad,
+ tvb, offset, 1, ENC_NA, &ad);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_srs_resource_set_cell_id,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_srs_resource_set_bwp_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+
+ proto_tree_add_bits_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_reserved,
+ tvb, offset<<3, 2, ENC_NA);
+ proto_tree_add_item_ret_boolean(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_c,
+ tvb, offset, 1, ENC_NA, &c);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_sul,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_sp_srs_resource_set_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+
+ if (ad) {
+ /* Activating - show info for resources */
+ guint length = c ? (SDU_length-2) / 2 + 2: SDU_length;
+ while (offset - start_offset < length) {
+ gboolean f;
+ proto_tree_add_item_ret_boolean(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_f,
+ tvb, offset, 1, ENC_NA, &f);
+ guint32 resource_id = tvb_get_guint8(tvb, offset) & 0x7f;
+ proto_item *resource_id_ti;
+ if (!f && (resource_id & 0x40)) {
+ /* SSB case - first bit just indicates type */
+ resource_id_ti = proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_resource_id_ssb,
+ tvb, offset, 1, ENC_NA);
+ proto_item_append_text(resource_id_ti, " (SSB)");
+ }
+ else {
+ resource_id_ti = proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_resource_id,
+ tvb, offset, 1, ENC_NA);
+ if (f) {
+ proto_item_append_text(resource_id_ti, " (NZP-CSI-RS)");
+ }
+ else {
+ proto_item_append_text(resource_id_ti, " (SRS)");
+ }
+ }
+ offset++;
+ resources++;
+ }
+
+ }
+ if (c) {
+ /* Deactivating (no resources) */
+ while (offset - start_offset < SDU_length) {
+ proto_tree_add_bits_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_reserved,
+ tvb, offset<<3, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_resource_serving_cell_id,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_srs_act_deact_resource_bwp_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ }
+ }
+
+ /* Add summary to Info column */
+ if (ad) {
+ write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, "(SP SRS Act/Deact Activate %d resources)", resources);
+ }
+ else {
+ write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo, "(SP SRS Act/Deact Deactivate)");
+ }
+ }
+ break;
+ case SP_CSI_REPORT_ON_PUCCH_ACT_DEACT_LCID:
+ {
+ static int * const sp_csi_report_on_pucch_act_deact_flags[] = {
+ &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s7,
+ &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s6,
+ &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s5,
+ &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s4,
+ &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s3,
+ &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s2,
+ &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s1,
+ &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s0,
+ NULL
+ };
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_reserved,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_serving_cell_id,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_bwp_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, sp_csi_report_on_pucch_act_deact_flags, ENC_NA);
+ offset++;
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo,
+ "(SP CSI Report on PUCCH Act/Deact) ");
+ }
+ break;
+ case TCI_STATE_IND_FOR_UE_SPEC_PDCCH_LCID:
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_serving_cell_id,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_coreset_id,
+ tvb, offset, 2, ENC_NA);
+ offset++;
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_tci_state_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo,
+ "(TCI State Ind PDCCH) ");
+ break;
+ case TCI_STATES_ACT_DEACT_FOR_UE_SPEC_PDSCH_LCID:
+ {
+ guint32 start_offset = offset;
+ static int * const tci_states_act_deact_for_ue_spec_pdsc_flags[] = {
+ &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t7,
+ &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t6,
+ &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t5,
+ &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t4,
+ &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t3,
+ &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t2,
+ &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t1,
+ &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t0,
+ NULL
+ };
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_reserved,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_serving_cell_id,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_bwp_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ while (offset - start_offset < SDU_length) {
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, tci_states_act_deact_for_ue_spec_pdsc_flags, ENC_NA);
+ offset++;
+ }
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo,
+ "(TCI States Act Deact PDSCH) ");
+ }
+ break;
+ case APER_CSI_TRIGGER_STATE_SUBSELECT_LCID:
+ {
+ guint32 start_offset = offset;
+ static int * const aper_csi_trigger_state_subselect_flags[] = {
+ &hf_mac_nr_control_aper_csi_trigger_state_subselect_t7,
+ &hf_mac_nr_control_aper_csi_trigger_state_subselect_t6,
+ &hf_mac_nr_control_aper_csi_trigger_state_subselect_t5,
+ &hf_mac_nr_control_aper_csi_trigger_state_subselect_t4,
+ &hf_mac_nr_control_aper_csi_trigger_state_subselect_t3,
+ &hf_mac_nr_control_aper_csi_trigger_state_subselect_t2,
+ &hf_mac_nr_control_aper_csi_trigger_state_subselect_t1,
+ &hf_mac_nr_control_aper_csi_trigger_state_subselect_t0,
+ NULL
+ };
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_aper_csi_trigger_state_subselect_reserved,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_aper_csi_trigger_state_subselect_serving_cell_id,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_aper_csi_trigger_state_subselect_bwp_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ while (offset - start_offset < SDU_length) {
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, aper_csi_trigger_state_subselect_flags, ENC_NA);
+ offset++;
+ }
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo,
+ "(Aperiodic CSI Trigger State Subselection) ");
+ }
+ break;
+ case SP_CSI_RS_CSI_IM_RES_SET_ACT_DEACT_LCID:
+ {
+ gboolean ad;
+ guint32 start_offset = offset;
+ static int * const sp_csi_rs_csi_im_res_set_act_deact_flags[] = {
+ &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved3,
+ &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_tci_state_id,
+ NULL
+ };
+ proto_tree_add_item_ret_boolean(subheader_tree, hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_ad,
+ tvb, offset, 1, ENC_NA, &ad);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_serving_cell_id,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_bwp_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_im,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_sp_csi_rs_res_set_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved2,
+ tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_sp_csi_im_res_set_id,
+ tvb, offset, 1, ENC_NA);
+ offset++;
+ if (ad) {
+ while (offset - start_offset < SDU_length) {
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, sp_csi_rs_csi_im_res_set_act_deact_flags, ENC_NA);
+ offset++;
+ }
+ }
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo,
+ "(SP CSI-RS/CSI-IM Res Set Act/Deact) ");
+ }
+ break;
+ case DUPLICATION_ACTIVATION_DEACTIVATION_LCID:
+ {
+ static int * const dupl_act_deact_flags[] = {
+ &hf_mac_nr_control_dupl_act_deact_drb7,
+ &hf_mac_nr_control_dupl_act_deact_drb6,
+ &hf_mac_nr_control_dupl_act_deact_drb5,
+ &hf_mac_nr_control_dupl_act_deact_drb4,
+ &hf_mac_nr_control_dupl_act_deact_drb3,
+ &hf_mac_nr_control_dupl_act_deact_drb2,
+ &hf_mac_nr_control_dupl_act_deact_drb1,
+ &hf_mac_nr_control_dupl_act_deact_reserved,
+ NULL
+ };
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, dupl_act_deact_flags, ENC_NA);
+ offset++;
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo,
+ "(Dupl Act/Deact) ");
+ }
+ break;
+ case SCELL_ACTIVATION_DEACTIVATION_4_LCID:
+ {
+ static int * const scell_act_deact_1_flags[] = {
+ &hf_mac_nr_control_scell_act_deact_cell7,
+ &hf_mac_nr_control_scell_act_deact_cell6,
+ &hf_mac_nr_control_scell_act_deact_cell5,
+ &hf_mac_nr_control_scell_act_deact_cell4,
+ &hf_mac_nr_control_scell_act_deact_cell3,
+ &hf_mac_nr_control_scell_act_deact_cell2,
+ &hf_mac_nr_control_scell_act_deact_cell1,
+ &hf_mac_nr_control_scell_act_deact_reserved,
+ NULL
+ };
+ static int * const scell_act_deact_2_flags[] = {
+ &hf_mac_nr_control_scell_act_deact_cell15,
+ &hf_mac_nr_control_scell_act_deact_cell14,
+ &hf_mac_nr_control_scell_act_deact_cell13,
+ &hf_mac_nr_control_scell_act_deact_cell12,
+ &hf_mac_nr_control_scell_act_deact_cell11,
+ &hf_mac_nr_control_scell_act_deact_cell10,
+ &hf_mac_nr_control_scell_act_deact_cell9,
+ &hf_mac_nr_control_scell_act_deact_cell8,
+ NULL
+ };
+ static int * const scell_act_deact_3_flags[] = {
+ &hf_mac_nr_control_scell_act_deact_cell23,
+ &hf_mac_nr_control_scell_act_deact_cell22,
+ &hf_mac_nr_control_scell_act_deact_cell21,
+ &hf_mac_nr_control_scell_act_deact_cell20,
+ &hf_mac_nr_control_scell_act_deact_cell19,
+ &hf_mac_nr_control_scell_act_deact_cell18,
+ &hf_mac_nr_control_scell_act_deact_cell17,
+ &hf_mac_nr_control_scell_act_deact_cell16,
+ NULL
+ };
+ static int * const scell_act_deact_4_flags[] = {
+ &hf_mac_nr_control_scell_act_deact_cell31,
+ &hf_mac_nr_control_scell_act_deact_cell30,
+ &hf_mac_nr_control_scell_act_deact_cell29,
+ &hf_mac_nr_control_scell_act_deact_cell28,
+ &hf_mac_nr_control_scell_act_deact_cell27,
+ &hf_mac_nr_control_scell_act_deact_cell26,
+ &hf_mac_nr_control_scell_act_deact_cell25,
+ &hf_mac_nr_control_scell_act_deact_cell24,
+ NULL
+ };
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, scell_act_deact_1_flags, ENC_NA);
+ offset++;
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, scell_act_deact_2_flags, ENC_NA);
+ offset++;
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, scell_act_deact_3_flags, ENC_NA);
+ offset++;
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, scell_act_deact_4_flags, ENC_NA);
+ offset++;
+
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo,
+ "(SCell Act/Deact 4) ");
+ }
+ break;
+ case SCELL_ACTIVATION_DEACTIVATION_1_LCID:
+ {
+ static int * const scell_act_deact_1_flags[] = {
+ &hf_mac_nr_control_scell_act_deact_cell7,
+ &hf_mac_nr_control_scell_act_deact_cell6,
+ &hf_mac_nr_control_scell_act_deact_cell5,
+ &hf_mac_nr_control_scell_act_deact_cell4,
+ &hf_mac_nr_control_scell_act_deact_cell3,
+ &hf_mac_nr_control_scell_act_deact_cell2,
+ &hf_mac_nr_control_scell_act_deact_cell1,
+ &hf_mac_nr_control_scell_act_deact_reserved,
+ NULL
+ };
+ proto_tree_add_bitmask_list(subheader_tree, tvb, offset, 1, scell_act_deact_1_flags, ENC_NA);
+ offset++;
+
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, "(SCell Act/Deact 1) ");
+ }
+ break;
+ case LONG_DRX_COMMAND_LCID:
+ /* Fixed size of zero bits */
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, "(Long DRX) ");
+ break;
+ case DRX_COMMAND_LCID:
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, "(DRX) ");
+ break;
+ case TIMING_ADVANCE_COMMAND_LCID:
+ /* TAG ID (2 bits) */
+ proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_timing_advance_tagid,
+ tvb, offset, 1, ENC_BIG_ENDIAN, &ta_tag_id);
+
+ /* Timing Advance Command (6 bits) */
+ proto_tree_add_item_ret_uint(subheader_tree, hf_mac_nr_control_timing_advance_command,
+ tvb, offset, 1, ENC_BIG_ENDIAN, &ta_ta);
+ offset++;
+
+ write_pdu_label_and_info(pdu_ti, subheader_ti, pinfo,
+ "(TAG=%u TA=%u) ", ta_tag_id, ta_ta);
+ break;
+ case UE_CONTENTION_RESOLUTION_IDENTITY_LCID:
+ proto_tree_add_item(subheader_tree, hf_mac_nr_control_ue_contention_resolution_identity,
+ tvb, offset, 6, ENC_NA);
+ offset += 6;
+ write_pdu_label_and_info_literal(pdu_ti, subheader_ti, pinfo, "(Contention Resolution) ");
+ 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;
+ }
+ }
+ }
+
+ /* Set subheader extent here */
+ proto_item_set_end(subheader_ti, tvb, offset);
+
+ } while (tvb_reported_length_remaining(tvb, offset));
+
+}
+
+
+/*****************************/
+/* Main dissection function. */
+static int dissect_mac_nr(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ proto_tree *mac_nr_tree;
+ proto_item *pdu_ti;
+ proto_tree *context_tree;
+ proto_item *context_ti, *ti;
+ gint offset = 0;
+ struct mac_nr_info *p_mac_nr_info;
+
+ /* Set protocol name */
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "MAC-NR");
+
+ /* Create protocol tree */
+ pdu_ti = proto_tree_add_item(tree, proto_mac_nr, tvb, offset, tvb_reported_length(tvb), ENC_NA);
+ proto_item_append_text(pdu_ti, " ");
+ mac_nr_tree = proto_item_add_subtree(pdu_ti, ett_mac_nr);
+
+ /* Look for packet info! */
+ p_mac_nr_info = (mac_nr_info *)p_get_proto_data(wmem_file_scope(), pinfo, proto_mac_nr, 0);
+
+ /* Can't dissect anything without it... */
+ if (p_mac_nr_info == NULL) {
+ proto_tree_add_expert(mac_nr_tree, pinfo, &ei_mac_nr_no_per_frame_data, tvb, offset, -1);
+ return 0;
+ }
+
+ /* Clear info column */
+ col_clear(pinfo->cinfo, COL_INFO);
+
+ /* Restart this count */
+ s_number_of_rlc_pdus_shown = 0;
+
+
+ /*****************************************/
+ /* Show context information */
+
+ /* Create context root */
+ context_ti = proto_tree_add_string_format(mac_nr_tree, hf_mac_nr_context,
+ tvb, offset, 0, "", "Context");
+ context_tree = proto_item_add_subtree(context_ti, ett_mac_nr_context);
+ proto_item_set_generated(context_ti);
+
+ /* Radio type */
+ ti = proto_tree_add_uint(context_tree, hf_mac_nr_context_radio_type,
+ tvb, 0, 0, p_mac_nr_info->radioType);
+ proto_item_set_generated(ti);
+
+ /* Direction */
+ ti = proto_tree_add_uint(context_tree, hf_mac_nr_context_direction,
+ tvb, 0, 0, p_mac_nr_info->direction);
+ proto_item_set_generated(ti);
+
+ /* RNTI type and value */
+ if (p_mac_nr_info->rntiType != NO_RNTI) {
+ ti = proto_tree_add_uint(context_tree, hf_mac_nr_context_rnti,
+ tvb, 0, 0, p_mac_nr_info->rnti);
+ proto_item_set_generated(ti);
+ proto_item_append_text(context_ti, " (RNTI=%u)", p_mac_nr_info->rnti);
+ }
+
+ ti = proto_tree_add_uint(context_tree, hf_mac_nr_context_rnti_type,
+ tvb, 0, 0, p_mac_nr_info->rntiType);
+ proto_item_set_generated(ti);
+
+ /* UEId */
+ if (p_mac_nr_info->ueid != 0) {
+ ti = proto_tree_add_uint(context_tree, hf_mac_nr_context_ueid,
+ tvb, 0, 0, p_mac_nr_info->ueid);
+ proto_item_set_generated(ti);
+ }
+
+ if (p_mac_nr_info->sfnSlotInfoPresent) {
+ ti = proto_tree_add_uint(context_tree, hf_mac_nr_context_sysframe_number,
+ tvb, 0, 0, p_mac_nr_info->sysframeNumber);
+ proto_item_set_generated(ti);
+ ti = proto_tree_add_uint(context_tree, hf_mac_nr_context_slot_number,
+ tvb, 0, 0, p_mac_nr_info->slotNumber);
+ proto_item_set_generated(ti);
+ }
+
+ if (p_mac_nr_info->rntiType == C_RNTI || p_mac_nr_info->rntiType == CS_RNTI) {
+ /* Harqid */
+ ti = proto_tree_add_uint(context_tree, hf_mac_nr_context_harqid,
+ tvb, 0, 0, p_mac_nr_info->harqid);
+ proto_item_set_generated(ti);
+
+ if (p_mac_nr_info->direction == DIRECTION_UPLINK) {
+ /* Type 2 other */
+ ti = proto_tree_add_boolean(context_tree, hf_mac_nr_context_phr_type2_othercell,
+ tvb, 0, 0, p_mac_nr_info->phr_type2_othercell);
+ proto_item_set_generated(ti);
+ }
+ }
+
+
+ /* 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);
+ break;
+
+ case RA_RNTI:
+ /* RAR PDU */
+ dissect_rar(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info);
+ break;
+
+ case C_RNTI:
+ case CS_RNTI:
+ /* 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);
+ break;
+
+ case SI_RNTI:
+ /* BCCH over DL-SCH */
+ dissect_bcch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info);
+ break;
+
+ case NO_RNTI:
+ /* Must be BCCH over BCH... */
+ dissect_bcch(tvb, pinfo, mac_nr_tree, pdu_ti, offset, p_mac_nr_info);
+ break;
+
+
+ default:
+ break;
+ }
+
+ return -1;
+}
+
+/* Heuristic dissector looks for supported framing protocol (see header file for details) */
+static gboolean dissect_mac_nr_heur(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void *data _U_)
+{
+ 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
+ - fixed header bytes
+ - tag for data
+ - at least one byte of MAC PDU payload */
+ if (tvb_captured_length_remaining(tvb, offset) < (gint)(strlen(MAC_NR_START_STRING)+3+2)) {
+ return FALSE;
+ }
+
+ /* OK, compare with signature string */
+ if (tvb_strneql(tvb, offset, MAC_NR_START_STRING, strlen(MAC_NR_START_STRING)) != 0) {
+ return FALSE;
+ }
+ offset += (gint)strlen(MAC_NR_START_STRING);
+
+ /* If redissecting, use previous info struct (if available) */
+ p_mac_nr_info = (mac_nr_info *)p_get_proto_data(wmem_file_scope(), pinfo, proto_mac_nr, 0);
+ 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);
+
+ p_add_proto_data(wmem_file_scope(), pinfo, proto_mac_nr, 0, p_mac_nr_info);
+ }
+ else {
+ offset = tvb_reported_length(tvb) - p_mac_nr_info->length;
+ }
+
+ /**************************************/
+ /* OK, now dissect as MAC NR */
+
+ /* Create tvb that starts at actual MAC PDU */
+ mac_tvb = tvb_new_subset_remaining(tvb, offset);
+ dissect_mac_nr(mac_tvb, pinfo, tree, NULL);
+
+ 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_)
+{
+ const lcid_drb_mapping_t *o = (const lcid_drb_mapping_t *)orig;
+ lcid_drb_mapping_t *d = (lcid_drb_mapping_t *)dest;
+
+ /* Copy all items over */
+ d->lcid = o->lcid;
+ d->drbid = o->drbid;
+ d->bearer_type_ul = o->bearer_type_ul;
+ d->bearer_type_dl = o->bearer_type_dl;
+
+ return d;
+}
+
+static void set_bearer_type(dynamic_lcid_drb_mapping_t *mapping, guint8 rlcMode, guint8 rlcSnLength, guint8 direction)
+{
+ /* Point to field for appropriate direction */
+ rlc_bearer_type_t *type_var = (direction == DIRECTION_UPLINK) ?
+ &mapping->bearer_type_ul :
+ &mapping->bearer_type_dl;
+
+ switch (rlcMode) {
+ case RLC_AM_MODE:
+ switch (rlcSnLength) {
+ case 12:
+ *type_var = rlcAM12;
+ break;
+ case 18:
+ *type_var = rlcAM18;
+ break;
+
+ default:
+ break;
+ }
+ break;
+ case RLC_UM_MODE:
+ switch (rlcSnLength) {
+ case 6:
+ *type_var = rlcUM6;
+ break;
+ case 12:
+ *type_var = rlcUM12;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+/* Set LCID -> RLC channel mappings from signalling protocol (i.e. RRC or similar). */
+void set_mac_nr_bearer_mapping(nr_drb_mac_rlc_mapping_t *drb_mapping)
+{
+ ue_dynamic_drb_mappings_t *ue_mappings;
+ guint8 lcid = 0;
+
+ /* Check lcid range */
+ if (drb_mapping->lcid_present) {
+ lcid = drb_mapping->lcid;
+
+ /* Ignore if LCID is out of range */
+ if ((lcid < 4) || (lcid > 32)) {
+ return;
+ }
+ }
+
+ /* Look for existing UE entry */
+ ue_mappings = (ue_dynamic_drb_mappings_t *)g_hash_table_lookup(mac_nr_ue_bearers_hash,
+ GUINT_TO_POINTER((guint)drb_mapping->ueid));
+ if (!ue_mappings) {
+ /* If not found, create & add to table */
+ ue_mappings = wmem_new0(wmem_file_scope(), ue_dynamic_drb_mappings_t);
+ g_hash_table_insert(mac_nr_ue_bearers_hash,
+ GUINT_TO_POINTER((guint)drb_mapping->ueid),
+ ue_mappings);
+ }
+
+ /* If lcid wasn't supplied, need to try to look up from drbid */
+ if ((lcid == 0) && (drb_mapping->drbid <= 32)) {
+ lcid = ue_mappings->drb_to_lcid_mappings[drb_mapping->drbid];
+ }
+ if (lcid == 0) {
+ /* Still no lcid - give up */
+ return;
+ }
+
+ /* Set array entry */
+ ue_mappings->mapping[lcid].valid = TRUE;
+ ue_mappings->mapping[lcid].drbid = drb_mapping->drbid;
+ ue_mappings->drb_to_lcid_mappings[drb_mapping->drbid] = lcid;
+
+ /* Fill in available RLC info */
+ if (drb_mapping->rlcMode_present) {
+ if (drb_mapping->rlcUlSnLength_present) {
+ set_bearer_type(&ue_mappings->mapping[lcid], drb_mapping->rlcMode, drb_mapping->rlcUlSnLength, DIRECTION_UPLINK);
+ }
+ if (drb_mapping->rlcDlSnLength_present) {
+ set_bearer_type(&ue_mappings->mapping[lcid], drb_mapping->rlcMode, drb_mapping->rlcDlSnLength, DIRECTION_DOWNLINK);
+ }
+ }
+}
+
+
+/* Function to be called from outside this module (e.g. in a plugin) to get per-packet data */
+mac_nr_info *get_mac_nr_proto_data(packet_info *pinfo)
+{
+ return (mac_nr_info *)p_get_proto_data(wmem_file_scope(), pinfo, proto_mac_nr, 0);
+}
+
+/* Function to be called from outside this module (e.g. in a plugin) to set per-packet data */
+void set_mac_nr_proto_data(packet_info *pinfo, mac_nr_info *p_mac_nr_info)
+{
+ p_add_proto_data(wmem_file_scope(), pinfo, proto_mac_nr, 0, p_mac_nr_info);
+}
+
+/* Initializes the hash tables each time a new
+ * file is loaded or re-loaded in wireshark */
+static void mac_nr_init_protocol(void)
+{
+ mac_nr_ue_bearers_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
+}
+
+static void mac_nr_cleanup_protocol(void)
+{
+ g_hash_table_destroy(mac_nr_ue_bearers_hash);
+}
+
+
+
+void proto_register_mac_nr(void)
+{
+ static hf_register_info hf[] =
+ {
+ /**********************************/
+ /* Items for decoding context */
+ { &hf_mac_nr_context,
+ { "Context",
+ "mac-nr.context", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_context_radio_type,
+ { "Radio Type",
+ "mac-nr.radio-type", FT_UINT8, BASE_DEC, VALS(radio_type_vals), 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_context_direction,
+ { "Direction",
+ "mac-nr.direction", FT_UINT8, BASE_DEC, VALS(direction_vals), 0x0,
+ "Direction of message", HFILL
+ }
+ },
+ { &hf_mac_nr_context_rnti,
+ { "RNTI",
+ "mac-nr.rnti", FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
+ "RNTI associated with message", HFILL
+ }
+ },
+ { &hf_mac_nr_context_rnti_type,
+ { "RNTI Type",
+ "mac-nr.rnti-type", FT_UINT8, BASE_DEC, VALS(rnti_type_vals), 0x0,
+ "Type of RNTI associated with message", HFILL
+ }
+ },
+ { &hf_mac_nr_context_ueid,
+ { "UEId",
+ "mac-nr.ueid", FT_UINT16, BASE_DEC, NULL, 0x0,
+ "User Equipment Identifier associated with message", HFILL
+ }
+ },
+ { &hf_mac_nr_context_sysframe_number,
+ { "System Frame Number",
+ "mac-nr.sfn", FT_UINT16, BASE_DEC, NULL, 0x0,
+ "System Frame Number associated with message", HFILL
+ }
+ },
+ { &hf_mac_nr_context_slot_number,
+ { "Slot",
+ "mac-nr.slot", FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Slot number associated with message", HFILL
+ }
+ },
+ { &hf_mac_nr_context_harqid,
+ { "HarqId",
+ "mac-nr.harqid", FT_UINT8, BASE_DEC, NULL, 0x0,
+ "HARQ Identifier", HFILL
+ }
+ },
+ { &hf_mac_nr_context_bcch_transport_channel,
+ { "Transport channel",
+ "mac-nr.bcch-transport-channel", FT_UINT8, BASE_DEC, VALS(bcch_transport_channel_vals), 0x0,
+ "Transport channel BCCH data was carried on", HFILL
+ }
+ },
+ { &hf_mac_nr_context_phr_type2_othercell,
+ { "PHR Type2 other cell PHR",
+ "mac-nr.type2-other-cell", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_subheader,
+ { "Subheader",
+ "mac-nr.subheader", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_subheader_reserved,
+ { "Reserved",
+ "mac-nr.subheader.reserved", FT_UINT8, BASE_HEX, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_subheader_f,
+ { "Format",
+ "mac-nr.subheader.f", FT_BOOLEAN, 8, TFS(&subheader_f_vals), 0x40,
+ "Format of subheader length field", HFILL
+ }
+ },
+ { &hf_mac_nr_subheader_length_1_byte,
+ { "SDU Length",
+ "mac-nr.subheader.sdu-length", FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_subheader_length_2_bytes,
+ { "SDU Length",
+ "mac-nr.subheader.sdu-length", FT_UINT16, BASE_DEC, NULL, 0x0,
+ 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,
+ "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,
+ "DL-SCH Logical Channel Identifier", HFILL
+ }
+ },
+ { &hf_mac_nr_ulsch_sdu,
+ { "UL-SCH SDU",
+ "mac-nr.ulsch.sdu", FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_dlsch_sdu,
+ { "DL-SCH SDU",
+ "mac-nr.dlsch.sdu", FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_bcch_pdu,
+ { "BCCH PDU",
+ "mac-nr.bcch.pdu", FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_pcch_pdu,
+ { "PCCH PDU",
+ "mac-nr.pcch.pdu", FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+
+
+ /*********************************/
+ /* RAR fields */
+ { &hf_mac_nr_rar,
+ { "RAR",
+ "mac-nr.rar", FT_NONE, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_e,
+ { "Extension",
+ "mac-nr.rar.e", FT_BOOLEAN, 8, TFS(&rar_ext_vals), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_t,
+ { "Type",
+ "mac-nr.rar.t", FT_BOOLEAN, 8, TFS(&rar_type_vals), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_reserved,
+ { "Reserved",
+ "mac-nr.rar.reserved", FT_UINT8, BASE_DEC, NULL, 0x30,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_reserved1,
+ { "Reserved",
+ "mac-nr.rar.reserved", FT_UINT8, BASE_DEC, NULL, 0x80,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_rar_subheader,
+ { "Subheader",
+ "mac-nr.rar.subheader", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_bi,
+ { "Backoff Indicator",
+ "mac-nr.rar.bi", FT_UINT8, BASE_DEC, VALS(rar_bi_vals), 0x0f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_rapid,
+ { "RAPID",
+ "mac-nr.rar.rapid", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_ta,
+ { "Timing Advance",
+ "mac-nr.rar.ta", FT_UINT16, BASE_DEC, NULL, 0x7ff8,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_rar_grant,
+ { "Grant",
+ "mac-nr.rar.grant", FT_UINT32, BASE_HEX, NULL, 0x07ffffff,
+ "UL Grant details", HFILL
+ }
+ },
+ { &hf_mac_nr_rar_grant_hopping,
+ { "Frequency hopping flag",
+ "mac-nr.rar.grant.hopping", FT_BOOLEAN, 32, TFS(&tfs_set_notset), 0x04000000,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_grant_fra,
+ { "Msg3 PUSCH frequency resource allocation",
+ "mac-nr.rar.grant.fra", FT_UINT32, BASE_DEC, NULL, 0x03fff000,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_grant_tsa,
+ { "Msg3 PUSCH time resource allocation",
+ "mac-nr.rar.grant.tsa", FT_UINT32, BASE_DEC, NULL, 0x00000f00,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_grant_mcs,
+ { "MCS",
+ "mac-nr.rar.grant.mcs", FT_UINT32, BASE_DEC, NULL, 0x000000f0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_grant_tcsp,
+ { "TPC command for Msg3 PUSCH",
+ "mac-nr.rar.grant.tcsp", FT_UINT32, BASE_DEC, VALS(tpc_command_vals), 0x0000000e,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_rar_grant_csi,
+ { "CSI request",
+ "mac-nr.rar.grant.csi", FT_BOOLEAN, 32, TFS(&tfs_set_notset), 0x00000001,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_rar_temp_crnti,
+ { "Temporary C-RNTI",
+ "mac-nr.rar.temp_crnti", FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_padding,
+ { "Padding",
+ "mac-nr.padding", FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_control_crnti,
+ { "C-RNTI",
+ "mac-nr.control.crnti", FT_UINT16, BASE_HEX_DEC, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_ue_contention_resolution_identity,
+ { "UE Contention Resolution Identity",
+ "mac-nr.control.ue-contention-resolution.identity", FT_BYTES, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_timing_advance_tagid,
+ { "TAG ID",
+ "mac-nr.control.timing-advance.tag-id", FT_UINT8, BASE_DEC, NULL, 0xc0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_timing_advance_command,
+ { "Timing Advance Command",
+ "mac-nr.control.timing-advance.command", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_se_phr_reserved,
+ { "Reserved",
+ "mac-nr.control.se-phr.reserved", FT_UINT8, BASE_HEX, NULL, 0xc0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_se_phr_ph,
+ { "Power Headroom",
+ "mac-nr.control.se-phr.ph", FT_UINT8, BASE_CUSTOM, CF_FUNC(mac_nr_phr_fmt), 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_se_phr_pcmax_f_c,
+ { "Pcmax,c,f",
+ "mac-nr.control.se-phr.pcmax_f_c", FT_UINT8, BASE_CUSTOM, CF_FUNC(mac_nr_pcmax_f_c_fmt), 0x3f,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_control_recommended_bit_rate_query_lcid,
+ { "LCID",
+ "mac-nr.control.recommended-bit-rate-query.lcid", FT_UINT8, BASE_DEC, NULL, 0xfc,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_recommended_bit_rate_query_dir,
+ { "Direction",
+ "mac-nr.control.recommended-bit-rate-query.dir", FT_BOOLEAN, 8, TFS(&tfs_uplink_downlink), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_recommended_bit_rate_query_bit_rate,
+ { "Bit Rate",
+ "mac-nr.control.recommended-bit-rate-query.bit-rate", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &bit_rate_vals_ext, 0x01f8,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_recommended_bit_rate_query_reserved,
+ { "Reserved",
+ "mac-nr.control.recommended-bit-rate-query.reserved", FT_UINT8, BASE_DEC, NULL, 0x07,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_control_me_phr_c7_flag,
+ { "C7",
+ "mac-nr.control.me-phr.c7", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x80,
+ "SCellIndex 7 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c6_flag,
+ { "C6",
+ "mac-nr.control.me-phr.c6", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x40,
+ "SCellIndex 6 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c5_flag,
+ { "C5",
+ "mac-nr.control.me-phr.c5", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
+ "SCellIndex 5 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c4_flag,
+ { "C4",
+ "mac-nr.control.me-phr.c4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10,
+ "SCellIndex 4 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c3_flag,
+ { "C3",
+ "mac-nr.control.me-phr.c3", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
+ "SCellIndex 3 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c2_flag,
+ { "C2",
+ "mac-nr.control.me-phr.c2", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
+ "SCellIndex 2 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c1_flag,
+ { "C1",
+ "mac-nr.control.me-phr.c1", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
+ "SCellIndex 1 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c15_flag,
+ { "C15",
+ "mac-nr.control.me-phr.c15", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x80,
+ "SCellIndex 15 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c14_flag,
+ { "C14",
+ "mac-nr.control.me-phr.c14", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x40,
+ "SCellIndex 14 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c13_flag,
+ { "C13",
+ "mac-nr.control.me-phr.c13", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
+ "SCellIndex 13 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c12_flag,
+ { "C12",
+ "mac-nr.control.me-phr.c12", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10,
+ "SCellIndex 12 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c11_flag,
+ { "C11",
+ "mac-nr.control.me-phr.c11", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
+ "SCellIndex 11 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c10_flag,
+ { "C10",
+ "mac-nr.control.me-phr.c10", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
+ "SCellIndex 10 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c9_flag,
+ { "C9",
+ "mac-nr.control.me-phr.c9", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
+ "SCellIndex 9 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c8_flag,
+ { "C8",
+ "mac-nr.control.me-phr.c8", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
+ "SCellIndex 8 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c23_flag,
+ { "C23",
+ "mac-nr.control.me-phr.c23", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x80,
+ "SCellIndex 23 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c22_flag,
+ { "C22",
+ "mac-nr.control.me-phr.c22", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x40,
+ "SCellIndex 22 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c21_flag,
+ { "C21",
+ "mac-nr.control.me-phr.c21", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
+ "SCellIndex 21 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c20_flag,
+ { "C20",
+ "mac-nr.control.me-phr.c20", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10,
+ "SCellIndex 20 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c19_flag,
+ { "C19",
+ "mac-nr.control.me-phr.c19", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
+ "SCellIndex 19 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c18_flag,
+ { "C18",
+ "mac-nr.control.me-phr.c18", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
+ "SCellIndex 18 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c17_flag,
+ { "C17",
+ "mac-nr.control.me-phr.c17", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
+ "SCellIndex 17 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c16_flag,
+ { "C16",
+ "mac-nr.control.me-phr.c16", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
+ "SCellIndex 16 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c31_flag,
+ { "C31",
+ "mac-nr.control.me-phr.c31", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x80,
+ "SCellIndex 31 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c30_flag,
+ { "C30",
+ "mac-nr.control.me-phr.c30", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x40,
+ "SCellIndex 30 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c29_flag,
+ { "C29",
+ "mac-nr.control.me-phr.c29", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
+ "SCellIndex 29 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c28_flag,
+ { "C28",
+ "mac-nr.control.me-phr.c28", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10,
+ "SCellIndex 28 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c27_flag,
+ { "C27",
+ "mac-nr.control.me-phr.c27", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
+ "SCellIndex 27 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c26_flag,
+ { "C26",
+ "mac-nr.control.me-phr.c26", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
+ "SCellIndex 26 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c25_flag,
+ { "C25",
+ "mac-nr.control.me-phr.c25", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
+ "SCellIndex 25 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_c24_flag,
+ { "C24",
+ "mac-nr.control.me-phr.c24", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
+ "SCellIndex 24 PHR report flag", HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_entry,
+ { "Entry",
+ "mac-nr.control.me.phr.entry", FT_STRING, BASE_NONE, NULL, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_reserved,
+ { "Reserved",
+ "mac-nr.control.me-phr.reserved", FT_BOOLEAN, 8, NULL, 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_p,
+ { "P",
+ "mac-nr.control.me-phr.p", FT_BOOLEAN, 8, TFS(&power_backoff_affects_power_management_vals), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_v,
+ { "V",
+ "mac-nr.control.me-phr.v", FT_BOOLEAN, 8, TFS(&phr_source_vals), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_type2_spcell,
+ { "Power Headroom, (Type2, SpCell)",
+ "mac-nr.control.me-phr.ph", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_type1_pcell,
+ { "Power Headroom (Type1, PCell)",
+ "mac-nr.control.me-phr.ph.type1-pcell", FT_UINT8, BASE_CUSTOM, CF_FUNC(mac_nr_phr_fmt), 0x3f,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_control_me_phr_ph_c31,
+ { "PH for SCellIndex 31",
+ "mac-nr.control.me-phr.ph.c31", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c30,
+ { "PH for SCellIndex 30",
+ "mac-nr.control.me-phr.ph.c30", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c29,
+ { "PH for SCellIndex 29",
+ "mac-nr.control.me-phr.ph.c29", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c28,
+ { "PH for SCellIndex 28",
+ "mac-nr.control.me-phr.ph.c28", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c27,
+ { "PH for SCellIndex 27",
+ "mac-nr.control.me-phr.ph.c27", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c26,
+ { "PH for SCellIndex 26",
+ "mac-nr.control.me-phr.ph.c26", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c25,
+ { "PH for SCellIndex 25",
+ "mac-nr.control.me-phr.ph.c25", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c24,
+ { "PH for SCellIndex 24",
+ "mac-nr.control.me-phr.ph.c24", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c23,
+ { "PH for SCellIndex 23",
+ "mac-nr.control.me-phr.ph.c23", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c22,
+ { "PH for SCellIndex 22",
+ "mac-nr.control.me-phr.ph.c22", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c21,
+ { "PH for SCellIndex 21",
+ "mac-nr.control.me-phr.ph.c21", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c20,
+ { "PH for SCellIndex 20",
+ "mac-nr.control.me-phr.ph.c20", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c19,
+ { "PH for SCellIndex 19",
+ "mac-nr.control.me-phr.ph.c19", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c18,
+ { "PH for SCellIndex 18",
+ "mac-nr.control.me-phr.ph.c18", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c17,
+ { "PH for SCellIndex 17",
+ "mac-nr.control.me-phr.ph.c17", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c16,
+ { "PH for SCellIndex 16",
+ "mac-nr.control.me-phr.ph.c16", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c15,
+ { "PH for SCellIndex 15",
+ "mac-nr.control.me-phr.ph.c15", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c14,
+ { "PH for SCellIndex 14",
+ "mac-nr.control.me-phr.ph.c14", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c13,
+ { "PH for SCellIndex 13",
+ "mac-nr.control.me-phr.ph.c13", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c12,
+ { "PH for SCellIndex 12",
+ "mac-nr.control.me-phr.ph.c12", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c11,
+ { "PH for SCellIndex 11",
+ "mac-nr.control.me-phr.ph.c11", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c10,
+ { "PH for SCellIndex 10",
+ "mac-nr.control.me-phr.ph.c10", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c9,
+ { "PH for SCellIndex 9",
+ "mac-nr.control.me-phr.ph.c9", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c8,
+ { "PH for SCellIndex 8",
+ "mac-nr.control.me-phr.ph.c8", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c7,
+ { "PH for SCellIndex 7",
+ "mac-nr.control.me-phr.ph.c7", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c6,
+ { "PH for SCellIndex 6",
+ "mac-nr.control.me-phr.ph.c6", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c5,
+ { "PH for SCellIndex 5",
+ "mac-nr.control.me-phr.ph.c5", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c4,
+ { "PH for SCellIndex 4",
+ "mac-nr.control.me-phr.ph.c4", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c3,
+ { "PH for SCellIndex 3",
+ "mac-nr.control.me-phr.ph.c3", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c2,
+ { "PH for SCellIndex 2",
+ "mac-nr.control.me-phr.ph.c2", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_ph_c1,
+ { "PH for SCellIndex 1",
+ "mac-nr.control.me-phr.ph.c1", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_reserved_2,
+ { "Reserved",
+ "mac-nr.control.me-phr.reserved", FT_BOOLEAN, 8, NULL, 0xc0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_pcmax_f_c_type2_spcell,
+ { "Pcmax,f,c",
+ "mac-nr.control.me-phr.type2-spcell", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_pcmax_f_c_type1_pcell,
+ { "Pcmax,f,c",
+ "mac-nr.control.me-phr.type1-pcell", FT_UINT8, BASE_CUSTOM, CF_FUNC(mac_nr_pcmax_f_c_fmt), 0x3f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_me_phr_pcmax_f_c_typeX,
+ { "Pcmax,f,c",
+ "mac-nr.control.me-phr.typeX", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_control_recommended_bit_rate_lcid,
+ { "LCID",
+ "mac-nr.control.recommended-bit-rate.lcid", FT_UINT8, BASE_DEC, NULL, 0xfc,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_recommended_bit_rate_dir,
+ { "Direction",
+ "mac-nr.control.recommended-bit-rate.dir", FT_BOOLEAN, 8, TFS(&tfs_uplink_downlink), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_recommended_bit_rate_bit_rate,
+ { "Bit Rate",
+ "mac-nr.control.recommended-bit-rate.bit-rate", FT_UINT16, BASE_DEC|BASE_EXT_STRING, &bit_rate_vals_ext, 0x01f8,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_recommended_bit_rate_reserved,
+ { "Reserved",
+ "mac-nr.control.recommended-bit-rate.reserved", FT_UINT8, BASE_DEC, NULL, 0x07,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_ad,
+ { "Reserved",
+ "mac-nr.control.sp-zp-csi-rs-resource-set-act-deact.ad", FT_BOOLEAN, 8, TFS(&activation_deactivation_vals), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_serving_cell_id,
+ { "Serving Cell ID",
+ "mac-nr.control.sp-zp-csi-rs-resource-set-act-deact.serving-cell-id", FT_UINT8, BASE_DEC, NULL, 0x7c,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_bwp_id,
+ { "BWP ID",
+ "mac-nr.control.sp-zp-csi-rs-resource-set-act-deact.bwp-id", FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_reserved_2,
+ { "Reserved",
+ "mac-nr.control.sp-zp-csi-rs-resource-set-act-deact.reserved", FT_UINT8, BASE_HEX, NULL, 0xf0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_control_sp_zp_csi_rs_resource_set_act_deact_sp_zp_rs_resource_set_id,
+ { "SP ZP CSI-RS resource set ID",
+ "mac-nr.control.sp-zp-csi-rs-resource-set-act-deact.sp-zp-rs-resource-set-id", FT_UINT8, BASE_DEC, NULL, 0x0f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_reserved,
+ { "Reserved",
+ "mac-nr.control.pucch-spatial-rel-act-deact.reserved", FT_UINT8, BASE_HEX, NULL, 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_serving_cell_id,
+ { "Serving Cell ID",
+ "mac-nr.control.pucch-spatial-rel-act-deact.serving-cell-id", FT_UINT8, BASE_DEC, NULL, 0x7c,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_bwp_id,
+ { "BWP ID",
+ "mac-nr.control.pucch-spatial-rel-act-deact.bwp-id", FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_pucch_resource_id,
+ { "PUCCH Resource ID",
+ "mac-nr.control.pucch-spatial-rel-act-deact.pucch-resource-id", FT_UINT8, BASE_DEC, NULL, 0x7f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_s8,
+ { "PUCCH Spatial Relation Info 8",
+ "mac-nr.control.pucch-spatial-rel-act-deact.s8", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_s7,
+ { "PUCCH Spatial Relation Info 7",
+ "mac-nr.control.pucch-spatial-rel-act-deact.s7", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_s6,
+ { "PUCCH Spatial Relation Info 6",
+ "mac-nr.control.pucch-spatial-rel-act-deact.s6", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_s5,
+ { "PUCCH Spatial Relation Info 5",
+ "mac-nr.control.pucch-spatial-rel-act-deact.s5", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_s4,
+ { "PUCCH Spatial Relation Info 4",
+ "mac-nr.control.pucch-spatial-rel-act-deact.s4", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_s3,
+ { "PUCCH Spatial Relation Info 3",
+ "mac-nr.control.pucch-spatial-rel-act-deact.s3", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x04,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_s2,
+ { "PUCCH Spatial Relation Info 2",
+ "mac-nr.control.pucch-spatial-rel-act-deact.s2", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_pucch_spatial_rel_act_deact_s1,
+ { "PUCCH Spatial Relation Info 1",
+ "mac-nr.control.pucch-spatial-rel-act-deact.s1", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_ad,
+ { "A/D",
+ "mac-nr.control.sp-srs-act-deact.ad", FT_BOOLEAN, 8, TFS(&activation_deactivation_vals), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_srs_resource_set_cell_id,
+ { "SRS Resource Set's Cell ID",
+ "mac-nr.control.sp-srs-act-deact.srs-resource-set-cell-id", FT_UINT8, BASE_DEC, NULL, 0x7c,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_srs_resource_set_bwp_id,
+ { "SRS Resource Set's BWP ID",
+ "mac-nr.control.sp-srs-act-deact.srs-resource-set-bwp-id", FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_reserved,
+ { "Reserved",
+ "mac-nr.control.sp-srs-act-deact.reserved", FT_UINT8, BASE_HEX, NULL, 0x00,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_c,
+ { "C",
+ "mac-nr.control.sp-srs-act-deact.c", FT_BOOLEAN, 8, TFS(&c_vals), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_sul,
+ { "SUL",
+ "mac-nr.control.sp-srs-act-deact.sul", FT_BOOLEAN, 8, TFS(&sul_vals), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_sp_srs_resource_set_id,
+ { "SP SRS Resource Set ID",
+ "mac-nr.control.sp-srs-act-deact.sp-srs-resource-set-id", FT_UINT8, BASE_DEC, NULL, 0x0f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_f,
+ { "F",
+ "mac-nr.control.sp-srs-act-deact.f", FT_BOOLEAN, 8, TFS(&sp_srs_act_deact_f_vals), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_resource_id,
+ { "Resource ID",
+ "mac-nr.control.sp-srs-act-deact.resource-id", FT_UINT8, BASE_DEC, NULL, 0x7f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_resource_id_ssb,
+ { "Resource ID",
+ "mac-nr.control.sp-srs-act-deact.resource-id", FT_UINT8, BASE_DEC, NULL, 0x3f,
+ NULL, HFILL
+ }
+ },
+
+ { &hf_mac_nr_control_sp_srs_act_deact_resource_serving_cell_id,
+ { "Resource Serving Cell ID",
+ "mac-nr.control.sp-srs-act-deact.resource-serving-cell-id", FT_UINT8, BASE_DEC, NULL, 0x7c,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_srs_act_deact_resource_bwp_id,
+ { "Resource BWP ID",
+ "mac-nr.control.sp-srs-act-deact.resource-bwp-id", FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_reserved,
+ { "Reserved",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.reserved", FT_UINT8, BASE_HEX, NULL, 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_serving_cell_id,
+ { "Serving Cell ID",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.serving-cell-id", FT_UINT8, BASE_DEC, NULL, 0x7c,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_bwp_id,
+ { "BWP ID",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.bwp-id", FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s7,
+ { "Semi-Persistent CSI report configuration 7",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.s7", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s6,
+ { "Semi-Persistent CSI report configuration 6",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.s6", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s5,
+ { "Semi-Persistent CSI report configuration 5",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.s5", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s4,
+ { "Semi-Persistent CSI report configuration 4",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.s4", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s3,
+ { "Semi-Persistent CSI report configuration 3",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.s3", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s2,
+ { "Semi-Persistent CSI report configuration 2",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.s2", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x04,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s1,
+ { "Semi-Persistent CSI report configuration 1",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.s1", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_report_on_pucch_act_deact_s0,
+ { "Semi-Persistent CSI report configuration 0",
+ "mac-nr.control.sp-csi-report-on-pucch-act-deact.s0", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_serving_cell_id,
+ { "Serving Cell ID",
+ "mac-nr.control.tci-state-ind-for-ue-spec-pdcch.serving-cell-id", FT_UINT8, BASE_DEC, NULL, 0xf8,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_coreset_id,
+ { "CORESET ID",
+ "mac-nr.control.tci-state-ind-for-ue-spec-pdcch.coreset-id", FT_UINT16, BASE_DEC, NULL, 0x0780,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_state_ind_for_ue_spec_pdcch_tci_state_id,
+ { "TCI State ID",
+ "mac-nr.control.tci-state-ind-for-ue-spec-pdcch.tci-state-id", FT_UINT8, BASE_DEC, NULL, 0x7f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_reserved,
+ { "Reserved",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.reserved", FT_UINT8, BASE_HEX, NULL, 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_serving_cell_id,
+ { "Serving Cell ID",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.serving-cell-id", FT_UINT8, BASE_DEC, NULL, 0x7c,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_bwp_id,
+ { "BWP ID",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.bwp-id", FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t7,
+ { "TCI state N+7",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.t7", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t6,
+ { "TCI state N+6",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.t6", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t5,
+ { "TCI state N+5",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.t5", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t4,
+ { "TCI state N+4",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.t4", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t3,
+ { "TCI state N+3",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.t3", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t2,
+ { "TCI state N+2",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.t2", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x04,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t1,
+ { "TCI state N+1",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.t1", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_tci_states_act_deact_for_ue_spec_pdsch_t0,
+ { "TCI state N",
+ "mac-nr.control.tci-states-act-deact-for-ue-spec-pdsch.t0", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_reserved,
+ { "Reserved",
+ "mac-nr.control.aper-csi-trigger-state-subselect.reserved", FT_UINT8, BASE_HEX, NULL, 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_serving_cell_id,
+ { "Serving Cell ID",
+ "mac-nr.control.aper-csi-trigger-state-subselect.serving-cell-id", FT_UINT8, BASE_DEC, NULL, 0x7c,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_bwp_id,
+ { "BWP ID",
+ "mac-nr.control.aper-csi-trigger-state-subselect.bwp-id", FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_t7,
+ { "Aperiodic trigger state N+7",
+ "mac-nr.control.aper-csi-trigger-state-subselect.t7", FT_BOOLEAN, 8, TFS(&aper_csi_trigger_state_t_vals), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_t6,
+ { "Aperiodic trigger state N+6",
+ "mac-nr.control.aper-csi-trigger-state-subselect.t6", FT_BOOLEAN, 8, TFS(&aper_csi_trigger_state_t_vals), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_t5,
+ { "Aperiodic trigger state N+5",
+ "mac-nr.control.aper-csi-trigger-state-subselect.t5", FT_BOOLEAN, 8, TFS(&aper_csi_trigger_state_t_vals), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_t4,
+ { "Aperiodic trigger state N+4",
+ "mac-nr.control.aper-csi-trigger-state-subselect.t4", FT_BOOLEAN, 8, TFS(&aper_csi_trigger_state_t_vals), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_t3,
+ { "Aperiodic trigger state N+3",
+ "mac-nr.control.aper-csi-trigger-state-subselect.t3", FT_BOOLEAN, 8, TFS(&aper_csi_trigger_state_t_vals), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_t2,
+ { "Aperiodic trigger state N+2",
+ "mac-nr.control.aper-csi-trigger-state-subselect.t2", FT_BOOLEAN, 8, TFS(&aper_csi_trigger_state_t_vals), 0x04,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_t1,
+ { "Aperiodic trigger state N+1",
+ "mac-nr.control.aper-csi-trigger-state-subselect.t1", FT_BOOLEAN, 8, TFS(&aper_csi_trigger_state_t_vals), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_aper_csi_trigger_state_subselect_t0,
+ { "Aperiodic trigger state N",
+ "mac-nr.control.aper-csi-trigger-state-subselect.t0", FT_BOOLEAN, 8, TFS(&aper_csi_trigger_state_t_vals), 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_ad,
+ { "A/D",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.ad", FT_BOOLEAN, 8, TFS(&activation_deactivation_vals), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_serving_cell_id,
+ { "Serving Cell ID",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.serving-cell-id", FT_UINT8, BASE_DEC, NULL, 0x7c,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_bwp_id,
+ { "BWP ID",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.bwp-id", FT_UINT8, BASE_DEC, NULL, 0x03,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved,
+ { "Reserved",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.reserved", FT_UINT8, BASE_HEX, NULL, 0xe0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_im,
+ { "IM",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.im", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_sp_csi_rs_res_set_id,
+ { "SP CSI-RS resource set ID",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.sp-csi-rs-res-set-id", FT_UINT8, BASE_DEC, NULL, 0x0f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved2,
+ { "Reserved",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.reserved", FT_UINT8, BASE_HEX, NULL, 0xf0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_sp_csi_im_res_set_id,
+ { "SP CSI-IM resource set ID",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.sp-csi-im-res-set-id", FT_UINT8, BASE_DEC, NULL, 0x0f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_reserved3,
+ { "Reserved",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.reserved", FT_UINT8, BASE_HEX, NULL, 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_sp_csi_rs_csi_im_res_set_act_deact_tci_state_id,
+ { "TCI State ID",
+ "mac-nr.control.sp-csi-rs-cs-im-res-set-act-deact.tci-state-id", FT_UINT8, BASE_DEC, NULL, 0x7f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_dupl_act_deact_drb7,
+ { "DRB 7",
+ "mac-nr.control.dupl-act-deact.drb7", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_dupl_act_deact_drb6,
+ { "DRB 6",
+ "mac-nr.control.dupl-act-deact.drb6", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_dupl_act_deact_drb5,
+ { "DRB 5",
+ "mac-nr.control.dupl-act-deact.drb5", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_dupl_act_deact_drb4,
+ { "DRB 4",
+ "mac-nr.control.dupl-act-deact.drb4", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_dupl_act_deact_drb3,
+ { "DRB 3",
+ "mac-nr.control.dupl-act-deact.drb3", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_dupl_act_deact_drb2,
+ { "DRB 2",
+ "mac-nr.control.dupl-act-deact.drb2", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x04,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_dupl_act_deact_drb1,
+ { "DRB 1",
+ "mac-nr.control.dupl-act-deact.drb1", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_dupl_act_deact_reserved,
+ { "Reserved",
+ "mac-nr.control.dupl-act-deact.reserved", FT_UINT8, BASE_HEX, NULL, 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell7,
+ { "Cell 7",
+ "mac-nr.control.scell-act-deact.cell7", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell6,
+ { "Cell 6",
+ "mac-nr.control.scell-act-deact.cell6", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell5,
+ { "Cell 5",
+ "mac-nr.control.scell-act-deact.cell5", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell4,
+ { "Cell 4",
+ "mac-nr.control.scell-act-deact.cell4", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell3,
+ { "Cell 3",
+ "mac-nr.control.scell-act-deact.cell3", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell2,
+ { "Cell 2",
+ "mac-nr.control.scell-act-deact.cell2", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x04,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell1,
+ { "Cell 1",
+ "mac-nr.control.scell-act-deact.cell1", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_reserved,
+ { "Reserved",
+ "mac-nr.control.scell-act-deact.reserved", FT_UINT8, BASE_HEX, NULL, 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell15,
+ { "Cell 15",
+ "mac-nr.control.scell-act-deact.cell15", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell14,
+ { "Cell 14",
+ "mac-nr.control.scell-act-deact.cell14", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell13,
+ { "Cell 13",
+ "mac-nr.control.scell-act-deact.cell13", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell12,
+ { "Cell 12",
+ "mac-nr.control.scell-act-deact.cell12", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell11,
+ { "Cell 11",
+ "mac-nr.control.scell-act-deact.cell11", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell10,
+ { "Cell 10",
+ "mac-nr.control.scell-act-deact.cell10", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x04,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell9,
+ { "Cell 9",
+ "mac-nr.control.scell-act-deact.cell9", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell8,
+ { "Cell 8",
+ "mac-nr.control.scell-act-deact.cell8", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell23,
+ { "Cell 23",
+ "mac-nr.control.scell-act-deact.cell23", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell22,
+ { "Cell 22",
+ "mac-nr.control.scell-act-deact.cell22", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell21,
+ { "Cell 21",
+ "mac-nr.control.scell-act-deact.cell21", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell20,
+ { "Cell 20",
+ "mac-nr.control.scell-act-deact.cell20", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell19,
+ { "Cell 19",
+ "mac-nr.control.scell-act-deact.cell19", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell18,
+ { "Cell 18",
+ "mac-nr.control.scell-act-deact.cell18", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x04,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell17,
+ { "Cell 17",
+ "mac-nr.control.scell-act-deact.cell17", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell16,
+ { "Cell 16",
+ "mac-nr.control.scell-act-deact.cell16", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell31,
+ { "Cell 31",
+ "mac-nr.control.scell-act-deact.cell31", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x80,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell30,
+ { "Cell 30",
+ "mac-nr.control.scell-act-deact.cell30", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x40,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell29,
+ { "Cell 29",
+ "mac-nr.control.scell-act-deact.cell29", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x20,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell28,
+ { "Cell 28",
+ "mac-nr.control.scell-act-deact.cell28", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x10,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell27,
+ { "Cell 27",
+ "mac-nr.control.scell-act-deact.cell27", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x08,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell26,
+ { "Cell 26",
+ "mac-nr.control.scell-act-deact.cell26", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x04,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell25,
+ { "Cell 25",
+ "mac-nr.control.scell-act-deact.cell25", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x02,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_scell_act_deact_cell24,
+ { "Cell 24",
+ "mac-nr.control.scell-act-deact.cell24", FT_BOOLEAN, 8, TFS(&tfs_activated_deactivated), 0x01,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_short_lcg,
+ { "LCG",
+ "mac-nr.control.bsr.short.lcg", FT_UINT8, BASE_DEC, NULL, 0xe0,
+ "Logical Channel Group", HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_short_bs_lcg0,
+ { "Buffer Size for LCG0",
+ "mac-nr.control.bsr.bs-lcg0", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_5bits_vals_ext, 0x1f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_short_bs_lcg1,
+ { "Buffer Size for LCG1",
+ "mac-nr.control.bsr.bs-lcg1", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_5bits_vals_ext, 0x1f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_short_bs_lcg2,
+ { "Buffer Size for LCG2",
+ "mac-nr.control.bsr.bs-lcg2", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_5bits_vals_ext, 0x1f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_short_bs_lcg3,
+ { "Buffer Size for LCG3",
+ "mac-nr.control.bsr.bs-lcg3", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_5bits_vals_ext, 0x1f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_short_bs_lcg4,
+ { "Buffer Size for LCG4",
+ "mac-nr.control.bsr.bs-lcg4", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_5bits_vals_ext, 0x1f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_short_bs_lcg5,
+ { "Buffer Size for LCG5",
+ "mac-nr.control.bsr.bs-lcg5", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_5bits_vals_ext, 0x1f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_short_bs_lcg6,
+ { "Buffer Size for LCG6",
+ "mac-nr.control.bsr.bs-lcg6", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_5bits_vals_ext, 0x1f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_short_bs_lcg7,
+ { "Buffer Size for LCG7",
+ "mac-nr.control.bsr.bs-lcg7", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_5bits_vals_ext, 0x1f,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_lcg7,
+ { "LCG7",
+ "mac-nr.control.bsr.long.lcg7", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x80,
+ "Logical Channel Group 7", HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_lcg6,
+ { "LCG6",
+ "mac-nr.control.bsr.long.lcg6", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x40,
+ "Logical Channel Group 6", HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_lcg5,
+ { "LCG5",
+ "mac-nr.control.bsr.long.lcg5", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x20,
+ "Logical Channel Group 5", HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_lcg4,
+ { "LCG4",
+ "mac-nr.control.bsr.long.lcg4", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x10,
+ "Logical Channel Group 4", HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_lcg3,
+ { "LCG3",
+ "mac-nr.control.bsr.long.lcg3", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x08,
+ "Logical Channel Group 3", HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_lcg2,
+ { "LCG2",
+ "mac-nr.control.bsr.long.lcg2", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x04,
+ "Logical Channel Group 2", HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_lcg1,
+ { "LCG1",
+ "mac-nr.control.bsr.long.lcg1", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
+ "Logical Channel Group 1", HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_lcg0,
+ { "LCG0",
+ "mac-nr.control.bsr.long.lcg0", FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
+ "Logical Channel Group 0", HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_trunc_long_bs,
+ { "Buffer Size",
+ "mac-nr.control.bsr.trunc-bs", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_8bits_vals_ext, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_bs_lcg7,
+ { "Buffer Size for LCG7",
+ "mac-nr.control.bsr.bs-lcg7", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_8bits_vals_ext, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_bs_lcg6,
+ { "Buffer Size for LCG6",
+ "mac-nr.control.bsr.bs-lcg6", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_8bits_vals_ext, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_bs_lcg5,
+ { "Buffer Size for LCG5",
+ "mac-nr.control.bsr.bs-lcg5", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_8bits_vals_ext, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_bs_lcg4,
+ { "Buffer Size for LCG4",
+ "mac-nr.control.bsr.bs-lcg4", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_8bits_vals_ext, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_bs_lcg3,
+ { "Buffer Size for LCG3",
+ "mac-nr.control.bsr.bs-lcg3", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_8bits_vals_ext, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_bs_lcg2,
+ { "Buffer Size for LCG2",
+ "mac-nr.control.bsr.bs-lcg2", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_8bits_vals_ext, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_bs_lcg1,
+ { "Buffer Size for LCG1",
+ "mac-nr.control.bsr.bs-lcg1", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_8bits_vals_ext, 0x0,
+ NULL, HFILL
+ }
+ },
+ { &hf_mac_nr_control_bsr_long_bs_lcg0,
+ { "Buffer Size for LCG0",
+ "mac-nr.control.bsr.bs-lcg0", FT_UINT8, BASE_DEC|BASE_EXT_STRING, &buffer_size_8bits_vals_ext, 0x0,
+ NULL, HFILL
+ }
+ },
+
+ };
+
+ static gint *ett[] =
+ {
+ &ett_mac_nr,
+ &ett_mac_nr_context,
+ &ett_mac_nr_subheader,
+ &ett_mac_nr_rar_subheader,
+ &ett_mac_nr_rar_grant,
+ &ett_mac_nr_me_phr_entry
+ };
+
+ static ei_register_info ei[] = {
+ { &ei_mac_nr_no_per_frame_data, { "mac-nr.no_per_frame_data", PI_UNDECODED, PI_WARN, "Can't dissect NR MAC frame because no per-frame info was attached!", EXPFILL }},
+ { &ei_mac_nr_sdu_length_different_from_dissected, { "mac-nr.sdu-length-different-from-dissected", PI_UNDECODED, PI_WARN, "Something is wrong with sdu length or dissection is wrong", EXPFILL }},
+ { &ei_mac_nr_unknown_udp_framing_tag, { "mac-nr.unknown-udp-framing-tag", PI_UNDECODED, PI_WARN, "Unknown UDP framing tag, aborting dissection", EXPFILL }},
+ { &ei_mac_nr_dl_sch_control_subheader_after_data_subheader, { "mac-nr.ulsch.ce-after-data", PI_SEQUENCE, PI_WARN, "For DL-SCH PDUs, CEs should come before data", EXPFILL }},
+ { &ei_mac_nr_ul_sch_control_subheader_before_data_subheader, { "mac-nr.dlsch.ce-before-data", PI_SEQUENCE, PI_WARN, "For UL-SCH PDUs, CEs should come after data", EXPFILL }}
+ };
+
+ module_t *mac_nr_module;
+ expert_module_t* expert_mac_nr;
+
+ static const enum_val_t lcid_drb_source_vals[] = {
+ {"from-static-stable", "From static table", FromStaticTable},
+ {"from-configuration-protocol", "From configuration protocol", FromConfigurationProtocol},
+ {NULL, NULL, -1}
+ };
+
+ static uat_field_t lcid_drb_mapping_flds[] = {
+ UAT_FLD_VS(lcid_drb_mappings, lcid, "LCID (4-32)", drb_lcid_vals, "The MAC LCID"),
+ UAT_FLD_DEC(lcid_drb_mappings, drbid,"DRBID id (1-32)", "Identifier of logical data channel"),
+ UAT_FLD_VS(lcid_drb_mappings, bearer_type_ul, "UL RLC Bearer Type", rlc_bearer_type_vals, "UL Bearer Mode"),
+ UAT_FLD_VS(lcid_drb_mappings, bearer_type_dl, "DL RLC Bearer Type", rlc_bearer_type_vals, "DL Bearer Mode"),
+ UAT_END_FIELDS
+ };
+
+ /* Register protocol. */
+ proto_mac_nr = proto_register_protocol("MAC-NR", "MAC-NR", "mac-nr");
+ proto_register_field_array(proto_mac_nr, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+ expert_mac_nr = expert_register_protocol(proto_mac_nr);
+ expert_register_field_array(expert_mac_nr, ei, array_length(ei));
+
+ /* Allow other dissectors to find this one by name. */
+ register_dissector("mac-nr", dissect_mac_nr, proto_mac_nr);
+
+ /* Preferences */
+ mac_nr_module = prefs_register_protocol(proto_mac_nr, NULL);
+
+ prefs_register_bool_preference(mac_nr_module, "attempt_rrc_decode",
+ "Attempt to decode BCCH, PCCH and CCCH data using NR RRC dissector",
+ "Attempt to decode BCCH, PCCH and CCCH data using NR RRC dissector",
+ &global_mac_nr_attempt_rrc_decode);
+
+ prefs_register_bool_preference(mac_nr_module, "attempt_to_dissect_srb_sdus",
+ "Attempt to dissect LCID 1-3 as srb1-3",
+ "Will call NR RLC dissector with standard settings as per RRC spec",
+ &global_mac_nr_attempt_srb_decode);
+
+ prefs_register_enum_preference(mac_nr_module, "lcid_to_drb_mapping_source",
+ "Source of LCID -> drb channel settings",
+ "Set whether LCID -> drb Table is taken from static table (below) or from "
+ "info learned from control protocol (i.e. RRC)",
+ &global_mac_nr_lcid_drb_source, lcid_drb_source_vals, FALSE);
+
+ lcid_drb_mappings_uat = uat_new("Static LCID -> drb Table",
+ sizeof(lcid_drb_mapping_t),
+ "drb_bearerconfig",
+ TRUE,
+ &lcid_drb_mappings,
+ &num_lcid_drb_mappings,
+ UAT_AFFECTS_DISSECTION, /* affects dissection of packets, but not set of named fields */
+ "", /* TODO: is this ref to help manual? */
+ lcid_drb_mapping_copy_cb,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ lcid_drb_mapping_flds);
+
+ prefs_register_uat_preference(mac_nr_module,
+ "drb_table",
+ "LCID -> DRB Mappings Table",
+ "A table that maps from configurable lcids -> RLC bearer configs",
+ lcid_drb_mappings_uat);
+
+ register_init_routine(&mac_nr_init_protocol);
+ register_cleanup_routine(&mac_nr_cleanup_protocol);
+}
+
+void proto_reg_handoff_mac_nr(void)
+{
+ /* Add as a heuristic UDP dissector */
+ heur_dissector_add("udp", dissect_mac_nr_heur, "MAC-NR over UDP", "mac_nr_udp", proto_mac_nr, HEURISTIC_DISABLE);
+
+ rlc_nr_handle = find_dissector_add_dependency("rlc-nr", proto_mac_nr);
+ nr_rrc_bcch_bch_handle = find_dissector_add_dependency("nr-rrc.bcch.bch", proto_mac_nr);
+ nr_rrc_bcch_dl_sch_handle = find_dissector_add_dependency("nr-rrc.bcch.dl.sch", proto_mac_nr);
+ nr_rrc_pcch_handle = find_dissector_add_dependency("nr-rrc.pcch", proto_mac_nr);
+ nr_rrc_dl_ccch_handle = find_dissector_add_dependency("nr-rrc.dl.ccch", proto_mac_nr);
+ nr_rrc_ul_ccch_handle = find_dissector_add_dependency("nr-rrc.ul.ccch", proto_mac_nr);
+ nr_rrc_ul_ccch1_handle = find_dissector_add_dependency("nr-rrc.ul.ccch1", proto_mac_nr);
+}
+
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */