nr_mac_gNB.h 20.4 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
#define MAX_HARQ_ROUNDS 4
79 80
/*!\brief Maximum number of random access process */
#define NR_NB_RA_PROC_MAX 4
81
#define MAX_NUM_OF_SSB 64
82

83 84 85 86 87 88 89 90 91
/*! \brief NR_list_t is a "list" (of users, HARQ processes, slices, ...).
 * Especially useful in the scheduler and to keep "classes" of users. */
typedef struct {
  int head;
  int *next;
  int tail;
  int len;
} NR_list_t;

cig's avatar
cig committed
92 93 94 95 96 97
typedef enum {
  RA_IDLE = 0,
  Msg2 = 1,
  WAIT_Msg3 = 2,
  Msg4 = 3,
  WAIT_Msg4_ACK = 4
Raymond Knopp's avatar
Raymond Knopp committed
98
} RA_gNB_state_t;
cig's avatar
cig committed
99

100 101 102 103 104
typedef struct NR_preamble_ue {
  uint8_t num_preambles;
  uint8_t *preamble_list;
} NR_preamble_ue_t;

105 106
/*! \brief gNB template for the Random access information */
typedef struct {
107
  /// Flag to indicate this process is active
Raymond Knopp's avatar
Raymond Knopp committed
108
  RA_gNB_state_t state;
109 110 111 112 113 114 115 116 117 118 119 120 121 122
  /// 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;
123 124
  /// Msg3 time domain allocation index
  uint8_t Msg3_tda_id;
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 151 152 153 154 155 156 157 158 159 160
  /// 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;
161 162
  // Beam index
  uint8_t beam_id;
163 164 165 166 167 168
  /// 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
169 170
  /// CFRA flag
  bool cfra;
171
} NR_RA_t;
172

173
/*! \brief gNB common channels */
174
typedef struct {
Raymond Knopp's avatar
Raymond Knopp committed
175 176 177 178
  int physCellId;
  int p_gNB;
  int Ncp;
  int nr_band;
179
  lte_frame_type_t frame_type;
180
  uint64_t dl_CarrierFreq;
Raymond Knopp's avatar
Raymond Knopp committed
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
  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;
  /// Template for RA computations
198
  NR_RA_t ra[NR_NB_RA_PROC_MAX];
Raymond Knopp's avatar
Raymond Knopp committed
199
  /// VRB map for common channels
200
  uint16_t vrb_map[275];
Robert Schmidt's avatar
Robert Schmidt committed
201 202 203
  /// 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
204 205
  /// number of subframe allocation pattern available for MBSFN sync area
  uint8_t num_sf_allocation_pattern;
206 207 208 209 210 211 212 213 214 215
  ///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];
kn.raju's avatar
kn.raju committed
216 217
  //CB preambles for each SSB
  uint8_t cb_preambles_per_ssb;
218 219
} NR_COMMON_channels_t;

220 221 222

// SP ZP CSI-RS Resource Set Activation/Deactivation MAC CE
typedef struct sp_zp_csirs {
223 224 225 226 227
  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
228 229 230 231 232
} 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 {
233 234 235 236 237 238 239 240 241
  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 ];
242 243 244
} csi_rs_im_t;

typedef struct pdcchStateInd {
245 246 247 248
  bool is_scheduled;
  uint8_t servingCellId;
  uint8_t coresetId;
  uint8_t tciStateId;
249
  bool tci_present_inDCI;
250 251
} pdcchStateInd_t;

252 253 254 255 256 257 258 259
typedef struct pucchSpatialRelation {
  bool is_scheduled;
  uint8_t servingCellId;
  uint8_t bwpId;
  uint8_t pucchResourceId;
  bool s0tos7_actDeact[8];
} pucchSpatialRelation_t;

260
typedef struct SPCSIReportingpucch {
261 262 263 264
  bool is_scheduled;
  uint8_t servingCellId;
  uint8_t bwpId;
  bool s0tos3_actDeact[4];
265 266 267 268
} SPCSIReportingpucch_t;

#define MAX_APERIODIC_TRIGGER_STATES 128 //38.331                               
typedef struct aperiodicCSI_triggerStateSelection {
269 270 271 272 273
  bool is_scheduled;
  uint8_t servingCellId;
  uint8_t bwpId;
  uint8_t highestTriggerStateSelected;
  bool triggerStateSelection[MAX_APERIODIC_TRIGGER_STATES];
274 275 276 277
} aperiodicCSI_triggerStateSelection_t;

#define MAX_TCI_STATES 128 //38.331                                             
typedef struct pdschTciStatesActDeact {
278 279 280 281 282
  bool is_scheduled;
  uint8_t servingCellId;
  uint8_t bwpId;
  uint8_t highestTciStateActivated;
  bool tciStateActDeact[MAX_TCI_STATES];
283
  uint8_t codepoint[8];
284 285 286
} pdschTciStatesActDeact_t;

typedef struct UE_info {
287 288 289
  sp_zp_csirs_t sp_zp_csi_rs;
  csi_rs_im_t csi_im;
  pdcchStateInd_t pdcch_state_ind;
290
  pucchSpatialRelation_t pucch_spatial_relation;
291 292 293
  SPCSIReportingpucch_t SP_CSI_reporting_pucch;
  aperiodicCSI_triggerStateSelection_t aperi_CSI_trigger;
  pdschTciStatesActDeact_t pdsch_TCI_States_ActDeact;
294 295 296
} NR_UE_mac_ce_ctrl_t;


297 298 299
typedef struct NR_sched_pucch {
  int frame;
  int ul_slot;
300 301 302
  bool sr_flag;
  int csi_bits;
  bool simultaneous_harqcsi;
303
  uint8_t dai_c;
Francesco Mani's avatar
Francesco Mani committed
304 305
  uint8_t timing_indicator;
  uint8_t resource_indicator;
306
} NR_sched_pucch_t;
307

308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
/* 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;

332 333 334
typedef struct NR_sched_pusch {
  int frame;
  int slot;
335 336 337 338 339

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

340 341 342
  // time-domain allocation for scheduled RBs
  int time_domain_allocation;

343 344
  /// MCS
  uint8_t mcs;
345 346 347 348 349

  /// TBS-related info
  uint16_t R;
  uint8_t Qm;
  uint32_t tb_size;
350 351 352

  /// UL HARQ PID to use for this UE, or -1 for "any new"
  int8_t ul_harq_pid;
353
} NR_sched_pusch_t;
354

355
typedef struct NR_UE_harq {
356
  bool is_waiting;
357 358
  uint8_t ndi;
  uint8_t round;
359
  uint16_t feedback_slot;
360 361 362 363

  /* Transport block to be sent using this HARQ process */
  uint32_t tb[16384];
  uint32_t tb_size;
364 365
} NR_UE_harq_t;

366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391
//! fixme : need to enhace for the multiple TB CQI report


//
/*! As per spec 38.214 section 5.2.1.4.2
 * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'disabled', the UE shall report in
  a single report nrofReportedRS (higher layer configured) different CRI or SSBRI for each report setting.
 * - if the UE is configured with the higher layer parameter groupBasedBeamReporting set to 'enabled', the UE shall report in a
  single reporting instance two different CRI or SSBRI for each report setting, where CSI-RS and/or SSB
  resources can be received simultaneously by the UE either with a single spatial domain receive filter, or with
  multiple simultaneous spatial domain receive filter
*/
#define MAX_NR_OF_REPORTED_RS 4

typedef enum NR_CSI_Report_Config {
  CSI_Report_PR_cri_ri_li_pmi_cqi_report,
  CSI_Report_PR_ssb_cri_report
} NR_CSI_Report_Config_PR;
struct CRI_RI_LI_PMI_CQI {
  uint8_t cri;
  uint8_t ri;
  uint8_t li;
  uint8_t pmi_x1;
  uint8_t pmi_x2;
  uint8_t cqi;
};
r.karey's avatar
r.karey committed
392

393 394 395 396 397 398
typedef struct CRI_SSB_RSRP {
  uint8_t nr_ssbri_cri;
  uint8_t CRI_SSBRI[MAX_NR_OF_REPORTED_RS];
  uint8_t RSRP;
  uint8_t diff_RSRP[MAX_NR_OF_REPORTED_RS - 1];
} CRI_SSB_RSRP_t;
r.karey's avatar
r.karey committed
399

400 401 402 403 404 405 406 407 408 409
struct CSI_Report {
  NR_CSI_Report_Config_PR present;
  union Config_CSI_Report {
    struct CRI_RI_LI_PMI_CQI cri_ri_li_pmi_cqi_report;
    struct CRI_SSB_RSRP ssb_cri_report;
  } choice;
};

#define MAX_SR_BITLEN 8

r.karey's avatar
r.karey committed
410 411 412 413 414
typedef struct {
  uint8_t nb_ssbri_cri;
  uint8_t cri_ssbri_bitlen;
  uint8_t rsrp_bitlen;
  uint8_t diff_rsrp_bitlen;
415 416 417 418 419 420 421 422 423 424
}L1_RSRP_bitlen_t;

typedef struct{
  uint8_t cri_bitlen;
  uint8_t ri_bitlen;
  uint8_t li_bitlen;
  uint8_t pmi_x1_bitlen;
  uint8_t pmi_x2_bitlen;
  uint8_t cqi_bitlen;
} CSI_Meas_bitlen_t;
r.karey's avatar
r.karey committed
425 426 427 428

typedef struct nr_csi_report {
  NR_CSI_ReportConfig__reportQuantity_PR reportQuantity_type;
  long periodicity;
429
  uint16_t offset;
430 431 432
  long ** SSB_Index_list;
  long ** CSI_Index_list;
//  uint8_t nb_of_nzp_csi_report;
r.karey's avatar
r.karey committed
433
  uint8_t nb_of_csi_ssb_report;
434 435
  L1_RSRP_bitlen_t CSI_report_bitlen;
  CSI_Meas_bitlen_t csi_meas_bitlen;
r.karey's avatar
r.karey committed
436 437
} nr_csi_report_t;

438 439 440 441 442 443
/*! As per the spec 38.212 and table:  6.3.1.1.2-12 in a single UCI sequence we can have multiple CSI_report 
  the number of CSI_report will depend on number of CSI resource sets that are configured in CSI-ResourceConfig RRC IE
  From spec 38.331 from the IE CSI-ResourceConfig for SSB RSRP reporting we can configure only one resource set 
  From spec 38.214 section 5.2.1.2 For periodic and semi-persistent CSI Resource Settings, the number of CSI-RS Resource Sets configured is limited to S=1
 */
#define MAX_CSI_RESOURCE_SET_IN_CSI_RESOURCE_CONFIG 16
Robert Schmidt's avatar
Robert Schmidt committed
444 445 446 447 448 449 450 451
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;

452 453 454 455 456 457 458
typedef enum {
  INACTIVE = 0,
  ACTIVE_NOT_SCHED,
  ACTIVE_SCHED
} NR_UL_harq_states_t;

typedef struct NR_UE_ul_harq {
459
  bool is_waiting;
460 461
  uint8_t ndi;
  uint8_t round;
462 463
  uint16_t feedback_slot;

464 465
  /// sched_pusch keeps information on MCS etc used for the initial transmission
  NR_sched_pusch_t sched_pusch;
466 467
} NR_UE_ul_harq_t;

468
/*! \brief scheduling control information set through an API */
469
#define MAX_CSI_REPORTS 48
470
typedef struct {
471 472 473 474 475
  /// 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];

476 477
  /// the currently active BWP in DL
  NR_BWP_Downlink_t *active_bwp;
478 479 480
  /// the currently active BWP in UL
  NR_BWP_Uplink_t *active_ubwp;

Robert Schmidt's avatar
Robert Schmidt committed
481 482 483
  /// PUCCH scheduling information. Array of three, we assume for the moment:
  /// HARQ in the first field, SR in second, CSI in third (as fixed by RRC
  /// conf., i.e. if actually present).  The order is important for
484
  /// nr_acknack_scheduling()!
Robert Schmidt's avatar
Robert Schmidt committed
485
  NR_sched_pucch_t sched_pucch[3];
486

487
  NR_sched_pusch_save_t pusch_save;
488
  NR_sched_pusch_t sched_pusch;
489 490 491

  /// CCE index and aggregation, should be coherent with cce_list
  NR_SearchSpace_t *search_space;
492 493 494
  NR_ControlResourceSet_t *coreset;
  int cce_index;
  uint8_t aggregation_level;
495

496 497 498 499
  /// RB allocation within active BWP
  uint16_t rbSize;
  uint16_t rbStart;

500 501
  /// uplink bytes that are currently scheduled
  int sched_ul_bytes;
502 503 504
  /// estimation of the UL buffer size
  int estimated_ul_buffer;

505 506 507
  // time-domain allocation for scheduled RBs
  int time_domain_allocation;

508 509 510 511 512
  /// MCS-related infos
  uint8_t mcsTableIdx;
  uint8_t mcs;
  uint8_t numDmrsCdmGrpsNoData;

Robert Schmidt's avatar
Robert Schmidt committed
513 514
  /// Retransmission-related information
  NR_UE_ret_info_t retInfo[NR_MAX_NB_HARQ_PROCESSES];
515 516
  /// DL HARQ PID to use for this UE, or -1 for "any new"
  int8_t dl_harq_pid;
Robert Schmidt's avatar
Robert Schmidt committed
517

518
  uint16_t ta_frame;
519
  int16_t ta_update;
520
  bool ta_apply;
521 522
  uint8_t tpc0;
  uint8_t tpc1;
523
  uint16_t ul_rssi;
524
  uint8_t current_harq_pid;
525
  struct CSI_Report CSI_report[MAX_CSI_REPORTS];
526
  /// information about every HARQ process
527
  NR_UE_harq_t harq_processes[NR_MAX_NB_HARQ_PROCESSES];
528 529 530 531 532 533
  /// HARQ processes that are free
  NR_list_t available_dl_harq;
  /// HARQ processes that await feedback
  NR_list_t feedback_dl_harq;
  /// HARQ processes that await retransmission
  NR_list_t retrans_dl_harq;
534
  /// information about every UL HARQ process
535
  NR_UE_ul_harq_t ul_harq_processes[NR_MAX_NB_HARQ_PROCESSES];
536 537 538 539 540 541
  /// UL HARQ processes that are free
  NR_list_t available_ul_harq;
  /// UL HARQ processes that await feedback
  NR_list_t feedback_ul_harq;
  /// UL HARQ processes that await retransmission
  NR_list_t retrans_ul_harq;
542 543
  int dummy;
  NR_UE_mac_ce_ctrl_t UE_mac_ce_ctrl;// MAC CE related information
544 545
} NR_UE_sched_ctrl_t;

546
typedef struct {
Laurent's avatar
Laurent committed
547 548
  boolean_t fiveG_connected;
  uicc_t *uicc;
laurent's avatar
laurent committed
549
} NRUEcontext_t;
550

Laurent's avatar
Laurent committed
551
typedef struct {
552 553 554 555 556
  int lc_bytes_tx[64];
  int lc_bytes_rx[64];
  int dlsch_rounds[8];
  int dlsch_errors;
  int dlsch_total_bytes;
557
  int dlsch_current_bytes;
558 559 560 561
  int ulsch_rounds[8];
  int ulsch_errors;
  int ulsch_total_bytes_scheduled;
  int ulsch_total_bytes_rx;
562
  int ulsch_current_bytes;
563 564
  int cumul_rsrp;
  uint8_t num_rsrp_meas;
565 566
} NR_mac_stats_t;

Robert Schmidt's avatar
Robert Schmidt committed
567

568
/*! \brief UE list used by gNB to order UEs/CC for scheduling*/
569
#define MAX_CSI_REPORTCONFIG 48
570 571
typedef struct {
  /// scheduling control info
572
  nr_csi_report_t csi_report_template[MAX_MOBILES_PER_GNB][MAX_CSI_REPORTCONFIG];
573
  NR_UE_sched_ctrl_t UE_sched_ctrl[MAX_MOBILES_PER_GNB];
574
  NR_mac_stats_t mac_stats[MAX_MOBILES_PER_GNB];
575
  NR_list_t list;
576
  int num_UEs;
577

578
  bool active[MAX_MOBILES_PER_GNB];
579 580
  rnti_t rnti[MAX_MOBILES_PER_GNB];
  NR_CellGroupConfig_t *secondaryCellGroup[MAX_MOBILES_PER_GNB];
581 582 583 584
  /// 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];
585 586
  // UE selected beam index
  uint8_t UE_beam_index[MAX_MOBILES_PER_GNB];
587
} NR_UE_info_t;
588

589 590
typedef void (*nr_pp_impl_dl)(module_id_t mod_id,
                              frame_t frame,
591
                              sub_frame_t slot);
592
typedef bool (*nr_pp_impl_ul)(module_id_t mod_id,
593 594 595 596
                              frame_t frame,
                              sub_frame_t slot,
                              int num_slots_per_tdd,
                              uint64_t ulsch_in_slot_bitmap);
597

598
/*! \brief top level eNB MAC structure */
599 600 601 602 603 604 605
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;
606 607
  /// timing advance group
  NR_TAG_t                        *tag;
608 609
  /// Pointer to IF module instance for PHY
  NR_IF_Module_t                  *if_inst;
610 611
  /// Pusch target SNR
  int                             pusch_target_snrx10;
612 613
  /// Pucch target SNR
  int                             pucch_target_snrx10;
614 615
  /// Subcarrier Offset
  int                             ssb_SubcarrierOffset;
616
  /// Common cell resources
617 618 619 620
  NR_COMMON_channels_t common_channels[NFAPI_CC_MAX];
  /// current PDU index (BCH,DLSCH)
  uint16_t pdu_index[NFAPI_CC_MAX];

621
  /// NFAPI Config Request Structure
622
  nfapi_nr_config_request_scf_t     config[NFAPI_CC_MAX];
623
  /// NFAPI DL Config Request Structure
cig's avatar
cig committed
624
  nfapi_nr_dl_tti_request_t         DL_req[NFAPI_CC_MAX];
625 626 627 628
  /// a PDCCH PDU groups DCIs per BWP and CORESET. The following structure
  /// keeps pointers to PDCCH PDUs within DL_req so that we can easily track
  /// PDCCH PDUs per CC/BWP/CORESET
  nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_idx[NFAPI_CC_MAX][MAX_NUM_BWP][MAX_NUM_CORESET];
629 630
  /// NFAPI UL TTI Request Structure, simple pointer into structure
  /// UL_tti_req_ahead for current frame/slot
631
  nfapi_nr_ul_tti_request_t        *UL_tti_req[NFAPI_CC_MAX];
632 633 634
  /// 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];
635
  /// NFAPI HI/DCI0 Config Request Structure
636
  nfapi_nr_ul_dci_request_t         UL_dci_req[NFAPI_CC_MAX];
637
  /// NFAPI DL PDU structure
cig's avatar
cig committed
638
  nfapi_nr_tx_data_request_t        TX_req[NFAPI_CC_MAX];
639

640
  NR_UE_info_t UE_info;
641

642 643
  /// UL handle
  uint32_t ul_handle;
yaojie's avatar
yaojie committed
644
  //UE_info_t UE_info;
645

646
  // MAC function execution peformance profiler
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
  /// 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;
667 668
  /// CCE lists
  int cce_list[MAX_NUM_BWP][MAX_NUM_CORESET][MAX_NUM_CCE];
669 670 671 672
  /// PUCCH: keep track of the resources has already been used by saving the
  /// highest index not yet been used in a given slot. Dynamically allocated
  /// so we can have it for every slot as a function of the numerology
  int *pucch_index_used[MAX_NUM_BWP];
673 674 675

  /// DL preprocessor for differentiated scheduling
  nr_pp_impl_dl pre_processor_dl;
676 677
  /// UL preprocessor for differentiated scheduling
  nr_pp_impl_ul pre_processor_ul;
678 679 680

  NR_UE_sched_ctrl_t *sched_ctrlCommon;
  NR_CellGroupConfig_t *secondaryCellGroupCommon;
681
  NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config[64];
682

683 684
} gNB_MAC_INST;

685
#endif /*__LAYER2_NR_MAC_GNB_H__ */