nr_mac_gNB.h 15.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

WEI-TAI CHEN's avatar
WEI-TAI CHEN committed
22
/*! \file mac.h
23
* \brief MAC data structures, constant, and function prototype
WEI-TAI CHEN's avatar
WEI-TAI CHEN committed
24 25
* \author Navid Nikaein and Raymond Knopp, WIE-TAI CHEN
* \date 2011, 2018
26
* \version 0.5
WEI-TAI CHEN's avatar
WEI-TAI CHEN committed
27 28
* \company Eurecom, NTUST
* \email navid.nikaein@eurecom.fr, kroempa@gmail.com
29 30 31 32 33 34 35 36 37

*/
/** @defgroup _oai2  openair2 Reference Implementation
 * @ingroup _ref_implementation_
 * @{
 */

/*@}*/

38 39
#ifndef __LAYER2_NR_MAC_GNB_H__
#define __LAYER2_NR_MAC_GNB_H__
40 41 42 43 44

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

45 46 47 48 49 50
/* Commmon */
#include "targets/ARCH/COMMON/common_lib.h"
#include "COMMON/platform_constants.h"
#include "common/ran_context.h"

/* RRC */
51
#include "NR_BCCH-BCH-Message.h"
52
#include "NR_CellGroupConfig.h"
53
#include "NR_ServingCellConfigCommon.h"
54
#include "NR_MeasConfig.h"
55

56 57 58 59 60
/* PHY */
#include "PHY/defs_gNB.h"
#include "PHY/TOOLS/time_meas.h"

/* Interface */
61
#include "nfapi_nr_interface_scf.h"
62
#include "NR_PHY_INTERFACE/NR_IF_Module.h"
63

64
/* MAC */
Guy De Souza's avatar
Guy De Souza committed
65 66
#include "LAYER2/MAC/mac.h"
#include "LAYER2/MAC/mac_proto.h"
67
#include "LAYER2/NR_MAC_COMMON/nr_mac_extern.h"
68 69
#include "LAYER2/NR_MAC_COMMON/nr_mac_common.h"
#include "NR_TAG.h"
70

Laurent's avatar
Laurent committed
71
#include <openair3/UICC/usim_interface.h>
laurent's avatar
laurent committed
72 73


74
/* Defs */
75 76 77
#define MAX_NUM_BWP 2
#define MAX_NUM_CORESET 2
#define MAX_NUM_CCE 90
78 79
/*!\brief Maximum number of random access process */
#define NR_NB_RA_PROC_MAX 4
80
#define MAX_NUM_OF_SSB 64
81

cig's avatar
cig committed
82 83 84 85 86 87
typedef enum {
  RA_IDLE = 0,
  Msg2 = 1,
  WAIT_Msg3 = 2,
  Msg4 = 3,
  WAIT_Msg4_ACK = 4
Raymond Knopp's avatar
Raymond Knopp committed
88
} RA_gNB_state_t;
cig's avatar
cig committed
89

90 91 92 93 94
typedef struct NR_preamble_ue {
  uint8_t num_preambles;
  uint8_t *preamble_list;
} NR_preamble_ue_t;

95 96
/*! \brief gNB template for the Random access information */
typedef struct {
97
  /// Flag to indicate this process is active
Raymond Knopp's avatar
Raymond Knopp committed
98
  RA_gNB_state_t state;
99 100 101 102 103 104 105 106 107 108 109 110 111 112
  /// BWP id of RA process
  int bwp_id;
  /// CORESET0 configured flag
  int coreset0_configured;
  /// Slot where preamble was received
  uint8_t preamble_slot;
  /// Subframe where Msg2 is to be sent
  uint8_t Msg2_slot;
  /// Frame where Msg2 is to be sent
  frame_t Msg2_frame;
  /// Subframe where Msg3 is to be sent
  sub_frame_t Msg3_slot;
  /// Frame where Msg3 is to be sent
  frame_t Msg3_frame;
113 114
  /// Msg3 time domain allocation index
  uint8_t Msg3_tda_id;
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
  /// Subframe where Msg4 is to be sent
  sub_frame_t Msg4_slot;
  /// Frame where Msg4 is to be sent
  frame_t Msg4_frame;
  /// harq_pid used for Msg4 transmission
  uint8_t harq_pid;
  /// UE RNTI allocated during RAR
  rnti_t rnti;
  /// RA RNTI allocated from received PRACH
  uint16_t RA_rnti;
  /// Received preamble_index
  uint8_t preamble_index;
  /// Received UE Contention Resolution Identifier
  uint8_t cont_res_id[6];
  /// Timing offset indicated by PHY
  int16_t timing_offset;
  /// Timeout for RRC connection
  int16_t RRC_timer;
  /// Msg3 first RB
  uint8_t msg3_first_rb;
  /// Msg3 number of RB
  uint8_t msg3_nb_rb;
  /// Msg3 TPC command
  uint8_t msg3_TPC;
  /// Msg3 ULdelay command
  uint8_t msg3_ULdelay;
  /// Msg3 cqireq command
  uint8_t msg3_cqireq;
  /// Round of Msg3 HARQ
  uint8_t msg3_round;
  /// TBS used for Msg4
  int msg4_TBsize;
  /// MCS used for Msg4
  int msg4_mcs;
  /// RA search space
  NR_SearchSpace_t *ra_ss;
151 152
  // Beam index
  uint8_t beam_id;
153 154 155 156 157 158
  /// secondaryCellGroup for UE in NSA that is to come
  NR_CellGroupConfig_t *secondaryCellGroup;
  /// Preambles for contention-free access
  NR_preamble_ue_t preambles;
  /// NSA: the UEs C-RNTI to use
  rnti_t crnti;
Francesco Mani's avatar
Francesco Mani committed
159 160
  /// CFRA flag
  bool cfra;
161
} NR_RA_t;
162

163
/*! \brief gNB common channels */
164
typedef struct {
Raymond Knopp's avatar
Raymond Knopp committed
165 166 167 168
  int physCellId;
  int p_gNB;
  int Ncp;
  int nr_band;
169
  lte_frame_type_t frame_type;
170
  uint64_t dl_CarrierFreq;
Raymond Knopp's avatar
Raymond Knopp committed
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
  NR_BCCH_BCH_Message_t *mib;
  NR_ServingCellConfigCommon_t *ServingCellConfigCommon;
  NR_ARFCN_ValueEUTRA_t ul_CarrierFreq;
  long ul_Bandwidth;
  /// Outgoing MIB PDU for PHY
  MIB_PDU MIB_pdu;
  /// Outgoing BCCH pdu for PHY
  BCCH_PDU BCCH_pdu;
  /// Outgoing BCCH DCI allocation
  uint32_t BCCH_alloc_pdu;
  /// Outgoing CCCH pdu for PHY
  CCCH_PDU CCCH_pdu;
  /// Outgoing PCCH DCI allocation
  uint32_t PCCH_alloc_pdu;
  /// Outgoing PCCH pdu for PHY
  PCCH_PDU PCCH_pdu;
  /// Outgoing RAR pdu for PHY
  RAR_PDU RAR_pdu;
  /// Template for RA computations
190
  NR_RA_t ra[NR_NB_RA_PROC_MAX];
Raymond Knopp's avatar
Raymond Knopp committed
191
  /// VRB map for common channels
192
  uint16_t vrb_map[275];
Robert Schmidt's avatar
Robert Schmidt committed
193 194 195
  /// VRB map for common channels and PUSCH, dynamically allocated because
  /// length depends on number of slots and RBs
  uint16_t *vrb_map_UL;
Raymond Knopp's avatar
Raymond Knopp committed
196 197
  /// number of subframe allocation pattern available for MBSFN sync area
  uint8_t num_sf_allocation_pattern;
198 199 200 201 202 203 204 205 206 207
  ///Number of active SSBs
  uint8_t num_active_ssb;
  //Total available prach occasions per configuration period
  uint32_t total_prach_occasions_per_config_period;
  //Total available prach occasions
  uint32_t total_prach_occasions;
  //Max Association period
  uint8_t max_association_period;
  //SSB index
  uint8_t ssb_index[MAX_NUM_OF_SSB];
208 209
} NR_COMMON_channels_t;

210 211 212

// SP ZP CSI-RS Resource Set Activation/Deactivation MAC CE
typedef struct sp_zp_csirs {
213 214 215 216 217
  bool is_scheduled;     //ZP CSI-RS ACT/Deact MAC CE is scheduled
  bool act_deact;        //Activation/Deactivation indication
  uint8_t serv_cell_id;  //Identity of Serving cell for which MAC CE applies
  uint8_t bwpid;         //Downlink BWP id
  uint8_t rsc_id;        //SP ZP CSI-RS resource set
218 219 220 221 222
} sp_zp_csirs_t;

//SP CSI-RS / CSI-IM Resource Set Activation/Deactivation MAC CE
#define MAX_CSI_RESOURCE_SET 64
typedef struct csi_rs_im {
223 224 225 226 227 228 229 230 231
  bool is_scheduled;
  bool act_deact;
  uint8_t serv_cellid;
  uint8_t bwp_id;
  bool im;
  uint8_t csi_im_rsc_id;
  uint8_t nzp_csi_rsc_id;
  uint8_t nb_tci_resource_set_id;
  uint8_t tci_state_id [ MAX_CSI_RESOURCE_SET ];
232 233 234
} csi_rs_im_t;

typedef struct pdcchStateInd {
235 236 237 238
  bool is_scheduled;
  uint8_t servingCellId;
  uint8_t coresetId;
  uint8_t tciStateId;
239 240 241
} pdcchStateInd_t;

typedef struct SPCSIReportingpucch {
242 243 244 245
  bool is_scheduled;
  uint8_t servingCellId;
  uint8_t bwpId;
  bool s0tos3_actDeact[4];
246 247 248 249
} SPCSIReportingpucch_t;

#define MAX_APERIODIC_TRIGGER_STATES 128 //38.331                               
typedef struct aperiodicCSI_triggerStateSelection {
250 251 252 253 254
  bool is_scheduled;
  uint8_t servingCellId;
  uint8_t bwpId;
  uint8_t highestTriggerStateSelected;
  bool triggerStateSelection[MAX_APERIODIC_TRIGGER_STATES];
255 256 257 258
} aperiodicCSI_triggerStateSelection_t;

#define MAX_TCI_STATES 128 //38.331                                             
typedef struct pdschTciStatesActDeact {
259 260 261 262 263
  bool is_scheduled;
  uint8_t servingCellId;
  uint8_t bwpId;
  uint8_t highestTciStateActivated;
  bool tciStateActDeact[MAX_TCI_STATES];
264 265 266
} pdschTciStatesActDeact_t;

typedef struct UE_info {
267 268 269 270 271 272
  sp_zp_csirs_t sp_zp_csi_rs;
  csi_rs_im_t csi_im;
  pdcchStateInd_t pdcch_state_ind;
  SPCSIReportingpucch_t SP_CSI_reporting_pucch;
  aperiodicCSI_triggerStateSelection_t aperi_CSI_trigger;
  pdschTciStatesActDeact_t pdsch_TCI_States_ActDeact;
273 274 275
} NR_UE_mac_ce_ctrl_t;


276 277 278
typedef struct NR_sched_pucch {
  int frame;
  int ul_slot;
279 280 281
  bool sr_flag;
  int csi_bits;
  bool simultaneous_harqcsi;
282
  uint8_t dai_c;
Francesco Mani's avatar
Francesco Mani committed
283 284
  uint8_t timing_indicator;
  uint8_t resource_indicator;
285 286
} NR_sched_pucch;

287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
/* this struct is a helper: as long as the TDA and DCI format remain the same
 * over the same uBWP and search space, there is no need to recalculate all
 * S/L, MCS table, or DMRS-related parameters over and over again. Hence, we
 * store them in this struct for easy reference. */
typedef struct NR_sched_pusch_save {
  int dci_format;
  int time_domain_allocation;
  uint8_t num_dmrs_cdm_grps_no_data;

  int startSymbolIndex;
  int nrOfSymbols;

  NR_PUSCH_Config_t *pusch_Config;
  uint8_t transform_precoding;
  uint8_t mcs_table;

  long mapping_type;
  NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig;
  uint16_t dmrs_config_type;
  uint16_t ul_dmrs_symb_pos;
  uint8_t num_dmrs_symb;
  uint8_t N_PRB_DMRS;
} NR_sched_pusch_save_t;

311 312 313
typedef struct NR_sched_pusch {
  int frame;
  int slot;
314 315 316 317 318

  /// RB allocation within active uBWP
  uint16_t rbSize;
  uint16_t rbStart;

319 320 321
  // time-domain allocation for scheduled RBs
  int time_domain_allocation;

322 323
  /// MCS
  uint8_t mcs;
324 325 326 327 328

  /// TBS-related info
  uint16_t R;
  uint8_t Qm;
  uint32_t tb_size;
329
} NR_sched_pusch_t;
330

331
typedef struct NR_UE_harq {
332
  uint8_t is_waiting;
333 334
  uint8_t ndi;
  uint8_t round;
335
  uint16_t feedback_slot;
336 337
} NR_UE_harq_t;

Robert Schmidt's avatar
Robert Schmidt committed
338 339 340 341 342 343 344 345
typedef struct NR_UE_old_sched {
  uint16_t rbSize;
  int time_domain_allocation;
  uint8_t mcsTableIdx;
  uint8_t mcs;
  uint8_t numDmrsCdmGrpsNoData;
} NR_UE_ret_info_t;

346 347 348 349 350 351 352 353 354 355 356 357 358
typedef enum {
  INACTIVE = 0,
  ACTIVE_NOT_SCHED,
  ACTIVE_SCHED
} NR_UL_harq_states_t;

typedef struct NR_UE_ul_harq {
  uint8_t ndi;
  uint8_t round;
  uint16_t last_tx_slot;
  NR_UL_harq_states_t state;
} NR_UE_ul_harq_t;

359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377

typedef struct {
  uint8_t nb_ssbri_cri;
  uint8_t cri_ssbri_bitlen;
  uint8_t rsrp_bitlen;
  uint8_t diff_rsrp_bitlen;
}CRI_SSBRI_RSRP_bitlen_t;


#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
typedef struct nr_csi_report {
  NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
  NR_CSI_ResourceConfig__csi_RS_ResourceSetList_PR CSI_Resource_type;
  uint8_t nb_of_nzp_csi_report;
  uint8_t nb_of_csi_ssb_report;
  CRI_SSBRI_RSRP_bitlen_t CSI_report_bitlen[MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG];
} nr_csi_report_t;


378
/*! \brief scheduling control information set through an API */
379
typedef struct {
380 381 382 383 384
  /// total amount of data awaiting for this UE
  uint32_t num_total_bytes;
  /// per-LC status data
  mac_rlc_status_resp_t rlc_status[MAX_NUM_LCID];

385 386
  /// the currently active BWP in DL
  NR_BWP_Downlink_t *active_bwp;
387 388 389
  /// the currently active BWP in UL
  NR_BWP_Uplink_t *active_ubwp;

390
  NR_sched_pucch **sched_pucch;
391 392
  /// selected PUCCH index, if scheduled
  int pucch_sched_idx;
393
  int pucch_occ_idx;
394
  NR_sched_pusch_save_t pusch_save;
395
  NR_sched_pusch_t sched_pusch;
396 397 398

  /// CCE index and aggregation, should be coherent with cce_list
  NR_SearchSpace_t *search_space;
399 400 401
  NR_ControlResourceSet_t *coreset;
  int cce_index;
  uint8_t aggregation_level;
402

403 404 405 406
  /// RB allocation within active BWP
  uint16_t rbSize;
  uint16_t rbStart;

407 408 409
  // time-domain allocation for scheduled RBs
  int time_domain_allocation;

410 411 412 413 414
  /// MCS-related infos
  uint8_t mcsTableIdx;
  uint8_t mcs;
  uint8_t numDmrsCdmGrpsNoData;

Robert Schmidt's avatar
Robert Schmidt committed
415 416 417
  /// Retransmission-related information
  NR_UE_ret_info_t retInfo[NR_MAX_NB_HARQ_PROCESSES];

418
  uint16_t ta_frame;
419
  int16_t ta_update;
420
  bool ta_apply;
421 422
  uint8_t tpc0;
  uint8_t tpc1;
423
  uint16_t ul_rssi;
424
  NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
425
  NR_UE_ul_harq_t ul_harq_processes[NR_MAX_NB_HARQ_PROCESSES];
426 427
  int dummy;
  NR_UE_mac_ce_ctrl_t UE_mac_ce_ctrl;// MAC CE related information
428 429
} NR_UE_sched_ctrl_t;

430
typedef struct {
Laurent's avatar
Laurent committed
431 432
  boolean_t fiveG_connected;
  uicc_t *uicc;
laurent's avatar
laurent committed
433
} NRUEcontext_t;
434

Laurent's avatar
Laurent committed
435
typedef struct {
436 437 438 439 440 441 442 443 444 445 446
  int lc_bytes_tx[64];
  int lc_bytes_rx[64];
  int dlsch_rounds[8];
  int dlsch_errors;
  int dlsch_total_bytes;
  int ulsch_rounds[8];
  int ulsch_errors;
  int ulsch_total_bytes_scheduled;
  int ulsch_total_bytes_rx;
} NR_mac_stats_t;

Robert Schmidt's avatar
Robert Schmidt committed
447

448

Robert Schmidt's avatar
Robert Schmidt committed
449 450 451 452 453 454 455
/*! \brief UNR_E_list_t is a "list" of users within UE_info_t. Especial useful in
 * the scheduler and to keep "classes" of users. */
typedef struct {
  int head;
  int next[MAX_MOBILES_PER_GNB];
} NR_UE_list_t;

456

457
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
458
#define MAX_CSI_REPORTCONFIG 48
459 460 461
typedef struct {
  DLSCH_PDU DLSCH_pdu[4][MAX_MOBILES_PER_GNB];
  /// scheduling control info
462
  nr_csi_report_t csi_report_template[MAX_MOBILES_PER_GNB][MAX_CSI_REPORTCONFIG];
463
  NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB];
464
  NR_mac_stats_t mac_stats[MAX_MOBILES_PER_GNB];
Robert Schmidt's avatar
Robert Schmidt committed
465
  NR_UE_list_t list;
466
  int num_UEs;
467

468
  bool active[MAX_MOBILES_PER_GNB];
469 470
  rnti_t rnti[MAX_MOBILES_PER_GNB];
  NR_CellGroupConfig_t *secondaryCellGroup[MAX_MOBILES_PER_GNB];
471 472 473 474
  /// CCE indexing
  int Y[MAX_MOBILES_PER_GNB][3][160];
  int m[MAX_MOBILES_PER_GNB];
  int num_pdcch_cand[MAX_MOBILES_PER_GNB][MAX_NUM_CORESET];
475 476
  // UE selected beam index
  uint8_t UE_beam_index[MAX_MOBILES_PER_GNB];
477
} NR_UE_info_t;
478

479 480 481 482
typedef void (*nr_pp_impl_dl)(module_id_t mod_id,
                              frame_t frame,
                              sub_frame_t slot,
                              int num_slots_per_tdd);
483 484 485 486 487
typedef void (*nr_pp_impl_ul)(module_id_t mod_id,
                              frame_t frame,
                              sub_frame_t slot,
                              int num_slots_per_tdd,
                              uint64_t ulsch_in_slot_bitmap);
488

489
/*! \brief top level eNB MAC structure */
490 491 492 493 494 495 496
typedef struct gNB_MAC_INST_s {
  /// Ethernet parameters for northbound midhaul interface
  eth_params_t                    eth_params_n;
  /// Ethernet parameters for fronthaul interface
  eth_params_t                    eth_params_s;
  /// Module
  module_id_t                     Mod_id;
497 498
  /// timing advance group
  NR_TAG_t                        *tag;
499 500
  /// Pointer to IF module instance for PHY
  NR_IF_Module_t                  *if_inst;
501 502
  /// Pusch target SNR
  int                             pusch_target_snrx10;
503 504
  /// Pucch target SNR
  int                             pucch_target_snrx10;
505
  /// Common cell resources
506 507 508 509
  NR_COMMON_channels_t common_channels[NFAPI_CC_MAX];
  /// current PDU index (BCH,DLSCH)
  uint16_t pdu_index[NFAPI_CC_MAX];

510
  /// NFAPI Config Request Structure
511
  nfapi_nr_config_request_scf_t     config[NFAPI_CC_MAX];
512
  /// NFAPI DL Config Request Structure
cig's avatar
cig committed
513
  nfapi_nr_dl_tti_request_t         DL_req[NFAPI_CC_MAX];
514 515
  /// NFAPI UL TTI Request Structure, simple pointer into structure
  /// UL_tti_req_ahead for current frame/slot
516
  nfapi_nr_ul_tti_request_t        *UL_tti_req[NFAPI_CC_MAX];
517 518 519
  /// NFAPI UL TTI Request Structure for future TTIs, dynamically allocated
  /// because length depends on number of slots
  nfapi_nr_ul_tti_request_t        *UL_tti_req_ahead[NFAPI_CC_MAX];
520
  /// NFAPI HI/DCI0 Config Request Structure
521
  nfapi_nr_ul_dci_request_t         UL_dci_req[NFAPI_CC_MAX];
522
  /// NFAPI DL PDU structure
cig's avatar
cig committed
523
  nfapi_nr_tx_data_request_t        TX_req[NFAPI_CC_MAX];
524

525
  NR_UE_info_t UE_info;
526

527 528 529
  /// UL handle
  uint32_t ul_handle;

530
  // MAC function execution peformance profiler
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550
  /// processing time of eNB scheduler
  time_stats_t eNB_scheduler;
  /// processing time of eNB scheduler for SI
  time_stats_t schedule_si;
  /// processing time of eNB scheduler for Random access
  time_stats_t schedule_ra;
  /// processing time of eNB ULSCH scheduler
  time_stats_t schedule_ulsch;
  /// processing time of eNB DCI generation
  time_stats_t fill_DLSCH_dci;
  /// processing time of eNB MAC preprocessor
  time_stats_t schedule_dlsch_preprocessor;
  /// processing time of eNB DLSCH scheduler
  time_stats_t schedule_dlsch;  // include rlc_data_req + MAC header + preprocessor
  /// processing time of eNB MCH scheduler
  time_stats_t schedule_mch;
  /// processing time of eNB ULSCH reception
  time_stats_t rx_ulsch_sdu;  // include rlc_data_ind
  /// processing time of eNB PCH scheduler
  time_stats_t schedule_pch;
551 552
  /// CCE lists
  int cce_list[MAX_NUM_BWP][MAX_NUM_CORESET][MAX_NUM_CCE];
553 554 555

  /// DL preprocessor for differentiated scheduling
  nr_pp_impl_dl pre_processor_dl;
556 557
  /// UL preprocessor for differentiated scheduling
  nr_pp_impl_ul pre_processor_ul;
558 559
} gNB_MAC_INST;

560
#endif /*__LAYER2_NR_MAC_GNB_H__ */