X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2F5gnrsch%2Fsch.h;h=5a7a396956a23ff0c7fbb50924a3d2a563d2f6c0;hb=6dc8a4c17da24847b3a3aee91b37151f77a8a5bc;hp=5c46b6e51546da159f6dd21ec67a0cda0557b0f4;hpb=49dc0e36836dc940ec40dea3a475ff067177819a;p=o-du%2Fl2.git diff --git a/src/5gnrsch/sch.h b/src/5gnrsch/sch.h index 5c46b6e51..5a7a39695 100644 --- a/src/5gnrsch/sch.h +++ b/src/5gnrsch/sch.h @@ -17,8 +17,6 @@ *******************************************************************************/ /* macros */ -#define SCH_INST_START 1 -#define SCH_MAX_INST 1 #define SCH_MU0_NUM_SLOTS 10 #define SCH_MU1_NUM_SLOTS 20 #define SCH_MU2_NUM_SLOTS 30 @@ -47,7 +45,6 @@ #define NUM_DMRS_SYMBOLS 1 #define DMRS_ADDITIONAL_POS 0 #define SCH_DEFAULT_K1 1 -#define SCH_TQ_SIZE 10 #define SSB_IDX_SUPPORTED 1 #define CRC_FAILED 0 @@ -59,9 +56,42 @@ #define PRB_BITMAP_IDX_LEN 64 #define PRB_BITMAP_MAX_IDX ((MAX_NUM_RB + PRB_BITMAP_IDX_LEN-1) / PRB_BITMAP_IDX_LEN) +#define SCH_MAX_NUM_UL_HQ_PROC 16 +#define SCH_MAX_NUM_DL_HQ_PROC 16 +#define SCH_MAX_NUM_MSG3_TX 2 +#define SCH_MAX_NUM_DL_HQ_TX 3 +#define SCH_MAX_NUM_UL_HQ_TX 3 +#define SCH_MAX_NUM_MSG4_TX 2 +#define HQ_ACK 0 +#define HQ_NACK 1 +#define HQ_DTX 2 +#define ROOT_SEQ_LEN_1 139 +#define ROOT_SEQ_LEN_2 839 + +#ifdef NR_DRX +/* As per 38.331 the largest offset which can be used in of size 10240. + * But using this much size of array can cause memory related issue so thats why + * taking this size which are a multiple of the larger size */ +#define MAX_DRX_SIZE 512 +#endif + +#define NUM_SCH_TYPE 2 /*Supported number of Scheduler Algorithm types*/ + +#define SCH_TQ_SIZE 10 + +typedef struct schDlHqProcCb SchDlHqProcCb; +typedef struct schUlHqEnt SchUlHqEnt; +typedef struct schRaReq SchRaReq; +typedef struct schDlHqEnt SchDlHqEnt; typedef struct schCellCb SchCellCb; typedef struct schUeCb SchUeCb; +typedef enum +{ + SCH_FCFS, + SCH_SLICE_BASED +}SchType; + typedef enum { SCH_NUMEROLOGY_0, @@ -74,9 +104,18 @@ typedef enum typedef enum { SCH_UE_STATE_INACTIVE, - SCH_UE_STATE_ACTIVE + SCH_UE_STATE_ACTIVE, + SCH_UE_HANDIN_IN_PROGRESS }SchUeState; +typedef enum +{ + SCH_RA_STATE_MSG2_HANDLE, + SCH_RA_STATE_MSG3_PENDING, + SCH_RA_STATE_MSG4_PENDING, + SCH_RA_STATE_MSG4_DONE +}SchRaState; + typedef enum { SCH_LC_STATE_INACTIVE, @@ -90,12 +129,148 @@ typedef enum WINDOW_EXPIRED }RaRspWindowStatus; -typedef enum +typedef enum +{ + HQ_TB_ACKED=0, + HQ_TB_NACKED, + HQ_TB_WAITING +}SchHqTbState; + +#ifdef NR_TDD +typedef enum +{ + DL_SLOT, + UL_SLOT, + FLEXI_SLOT +}SlotConfig; + +typedef enum { - SEARCH, - CREATE, - DELETE -}ActionTypeLcLL; + DL_SYMBOL, + UL_SYMBOL, + FLEXI_SYMBOL +}SchSymbolConfig; +#endif + +/*Following structures to keep record and estimations of PRB allocated for each + * LC taking into consideration the RRM policies*/ +typedef struct lcInfo +{ + uint8_t lcId; /*LCID for which BO are getting recorded*/ + uint32_t reqBO; /*Size of the BO requested/to be allocated for this LC*/ + uint32_t allocBO; /*TBS/BO Size which is actually allocated*/ + uint8_t allocPRB; /*PRB count which is allocated based on RRM policy/FreePRB*/ +}LcInfo; + +typedef struct schUlHqTbCb +{ + uint32_t tbSzReq; + uint32_t tbSzAllc; + uint8_t ndi; + uint8_t rv; + uint8_t rvIdx; + uint8_t qamOrder; + SchMcsTable mcsTable; + uint8_t iMcs; + uint8_t iMcsInDci; + uint8_t numLyrs; + uint8_t txCntr; + SchHqTbState state; + uint8_t cntrRetxAllocFail; + uint8_t statsBitmap; +}SchUlHqTbCb; + +typedef struct schDlHqTbCb +{ + uint8_t tbIdx; + Bool isEnabled; + uint32_t tbSzReq; + uint8_t txCntr; + uint8_t ndi; + uint8_t rv; + uint8_t rvIdx; + uint8_t iMcs; + uint8_t iMcsInDci; + uint8_t numLyrs; + SchHqTbState state; + uint8_t isAckNackDtx; + uint8_t cntrRetxAllocFail; + //InfUeTbInfo tbCompInfo; + uint8_t statsBitmap; +}SchDlHqTbCb; + +#ifdef NR_DRX +typedef struct schDrxHarqCb +{ + uint32_t rttExpIndex; + CmLList *rttExpNode; + uint32_t retxStrtIndex; + CmLList *retxStrtNode; + uint32_t retxExpIndex; + CmLList *retxExpNode; +}SchDrxHarqCb; +#endif + +typedef struct schUlHqProcCb +{ + uint8_t procId; /*!< HARQ Process ID */ + SchUlHqEnt *hqEnt; + uint8_t maxHqTxPerHqP; + SchUlHqTbCb tbInfo; + CmLList ulHqEntLnk; + CmLList ulSlotLnk; + uint8_t strtSymbl; + uint8_t numSymbl; + void *schSpcUlHqProcCb; /*!< Scheduler specific HARQ Proc CB */ + CmLList ulHqProcLink; + uint8_t puschResType; /*!< Resource allocation type */ + uint16_t puschStartPrb; + uint16_t puschNumPrb; + uint8_t dmrsMappingType; + uint8_t nrOfDmrsSymbols; + uint8_t dmrsAddPos; + SlotTimingInfo puschTime; +#ifdef NR_DRX + SchDrxHarqCb ulDrxHarqCb; +#endif +}SchUlHqProcCb; + +struct schDlHqProcCb +{ + uint8_t procId; /*!< HARQ Process ID */ + SchDlHqEnt *hqEnt; + uint8_t maxHqTxPerHqP; + CmLList dlHqEntLnk; + CmLList ulSlotLnk; + SchDlHqTbCb tbInfo[2]; + uint8_t k1; + void *schSpcDlHqProcCb; /*!< Scheduler specific HARQ Proc CB */ + CmLList dlHqProcLink; + SlotTimingInfo pucchTime; +#ifdef NR_DRX + SchDrxHarqCb dlDrxHarqCb; +#endif +}; +struct schUlHqEnt +{ + SchCellCb *cell; /*!< Contains the pointer to cell*/ + SchUeCb *ue; /*!< Contains the pointer to ue*/ + CmLListCp free; /*!< List of free HARQ processes */ + CmLListCp inUse; /*!< List of in-use HARQ processes */ + uint8_t maxHqTx; /*!< Maximum number of harq re-transmissions */ + uint8_t numHqPrcs; /*!< Number of HARQ Processes */ + SchUlHqProcCb procs[SCH_MAX_NUM_UL_HQ_PROC]; /*!< Uplink harq process info */ +}; +struct schDlHqEnt +{ + SchCellCb *cell; /*!< Contains the pointer to cell */ + SchUeCb *ue; /*!< Contains the pointer to UE */ + CmLListCp free; /*!< List of free HARQ processes */ + CmLListCp inUse; /*!< List of in-use HARQ processes */ + uint8_t maxHqTx; /*!< Maximum number of harq transmissions */ + uint8_t numHqPrcs; /*!< Number of HARQ Processes */ + SchDlHqProcCb procs[SCH_MAX_NUM_DL_HQ_PROC];/*!< Downlink harq processes */ +}; /** * @brief @@ -103,7 +278,6 @@ typedef enum */ typedef struct schGenCb { - uint8_t tmrRes; /*!< Timer resolution */ uint8_t startCellId; /*!< Starting Cell Id */ #ifdef LTE_ADV bool forceCntrlSrbBoOnPCel; /*!< value 1 means force scheduling @@ -128,6 +302,7 @@ typedef struct schPrbAlloc { CmLListCp freePrbBlockList; /*!< List of continuous blocks for available PRB */ uint64_t prbBitMap[ MAX_SYMB_PER_SLOT][PRB_BITMAP_MAX_IDX]; /*!< BitMap to store the allocated PRBs */ + uint16_t numPrbAlloc; }SchPrbAlloc; /** @@ -145,14 +320,20 @@ typedef struct schDlSlotInfo uint8_t pdschUe; /*!< UE for which PDSCH is scheduled in this slot */ RarAlloc *rarAlloc[MAX_NUM_UE]; /*!< RAR allocation per UE*/ DciInfo *ulGrant; - DlMsgAlloc *dlMsgAlloc[MAX_NUM_UE]; /*!< Dl msg allocation per UE*/ + DlMsgSchInfo *dlMsgAlloc[MAX_NUM_UE]; /*!< Dl msg allocation per UE*/ }SchDlSlotInfo; typedef struct schRaCb { + uint8_t ueId; bool msg4recvd; uint16_t tcrnti; uint16_t dlMsgPduLen; + SchUlHqProcCb msg3HqProc; + SchUlHqProcCb *retxMsg3HqProc; + SchRaState raState; + SchCellCb *cell; + SchRaReq *raReq; }SchRaCb; /** @@ -190,6 +371,7 @@ typedef struct schLcCtxt uint16_t pduSessionId; /*Pdu Session Id*/ Snssai *snssai; /*S-NSSAI assoc with LCID*/ bool isDedicated; /*Flag containing Dedicated S-NSSAI or not*/ + uint16_t rsvdDedicatedPRB; }SchDlLcCtxt; typedef struct schDlCb @@ -200,7 +382,7 @@ typedef struct schDlCb typedef struct schUlLcCtxt { SchLcState lcState; - uint8_t lcId; + uint8_t lcId; uint8_t priority; uint8_t lcGroup; uint8_t schReqId; @@ -209,6 +391,7 @@ typedef struct schUlLcCtxt uint16_t pduSessionId; /*Pdu Session Id*/ Snssai *snssai; /*S-NSSAI assoc with LCID*/ bool isDedicated; /*Flag containing Dedicated S-NSSAI or not*/ + uint16_t rsvdDedicatedPRB; }SchUlLcCtxt; typedef struct schUlCb @@ -219,48 +402,66 @@ typedef struct schUlCb typedef struct schUeCfgCb { uint16_t cellId; + uint8_t ueId; uint16_t crnti; bool macCellGrpCfgPres; SchMacCellGrpCfg macCellGrpCfg; bool phyCellGrpCfgPres; SchPhyCellGrpCfg phyCellGrpCfg; bool spCellCfgPres; - SchSpCellCfg spCellCfg; + SchSpCellRecfg spCellCfg; SchAmbrCfg *ambrCfg; SchModulationInfo dlModInfo; SchModulationInfo ulModInfo; + SchDataTransmission dataTransmissionAction; }SchUeCfgCb; -/*Following structures to keep record and estimations of PRB allocated for each - * LC taking into consideration the RRM policies*/ -typedef struct lcInfo +typedef struct schHqDlMap { - uint8_t lcId; /*LCID for which BO are getting recorded*/ - uint32_t reqBO; /*Size of the BO requested/to be allocated for this LC*/ - uint32_t allocBO; /*TBS/BO Size which is actually allocated*/ - uint8_t allocPRB; /*PRB count which is allocated based on RRM policy/FreePRB*/ -}LcInfo; + CmLListCp hqList; +}SchHqDlMap; -typedef struct dedicatedLCInfo +typedef struct schHqUlMap { - CmLListCp dedLcList; /*Linklist of LC assoc with RRMPolicyMemberList*/ - uint16_t rsvdDedicatedPRB; /*Number of PRB reserved for this Dedicated S-NSSAI*/ -}DedicatedLCInfo; + CmLListCp hqList; +}SchHqUlMap; -typedef struct schLcPrbEstimate +#ifdef NR_DRX +typedef struct schDrxUeCb { - /* TODO: For Multiple RRMPolicies, Make DedicatedLcInfo as array/Double Pointer - * and have separate DedLCInfo for each RRMPolcyMemberList*/ - /* Dedicated LC List will be allocated, if any available*/ - DedicatedLCInfo *dedLcInfo; /*Contain LCInfo per RRMPolicy*/ - - CmLListCp defLcList; /*Linklist of LC assoc with Default S-NSSAI(s)*/ - - /* SharedPRB number can be used by any LC. - * Need to calculate in every Slot based on PRB availability*/ - uint16_t sharedNumPrb; -}SchLcPrbEstimate; - + bool drxDlUeActiveStatus; /* Final Dl Ue status which is marked as true if drxDlUeActiveMask or drxDlUeActiveMaskForHarq is present */ + bool drxUlUeActiveStatus; /* Final Ul Ue status which is marked as true if drxUlUeActiveMask or drxUlUeActiveMaskForHarq is present */ + uint32_t drxDlUeActiveMask; /* variable is used to store the status about downlink active status of Ue for On-duration, inactive timer*/ + uint32_t drxUlUeActiveMask; /* variable is used to store the status about uplink active status for on-duration inactive timer*/ + uint32_t drxDlUeActiveMaskForHarq; /* variable is used to store the status about downlink active status for harq*/ + uint32_t drxUlUeActiveMaskForHarq; /* variable is used to store the status about uplink active status for harq */ + uint32_t onDurationLen; /* length of on duration which is received from ue cfg/recfg in form of ms and subms, informs about after how many slots on duration gets expire */ + uint32_t inActvTimerLen; /* length of inActvTimer value received from ue cfg/recfg in form of ms, informs about after how many slots in active gets expire */ + uint8_t harqRttDlTimerLen; /* length of harqRttDlTimer received from ue cfg/recfg in form of symbols, inform about after how many slots on the harq drx-HARQ-RTT-TimerDL expire */ + uint8_t harqRttUlTimerLen; /* length of harqRttUlTimer received from ue cfg/recfg in form of symbols,informs about after how many slots on harq drx-HARQ-RTT-TimerUL expire*/ + uint32_t retransDlTimerLen; /* length of retransDlTimer received from ue cfg/recfg in form of slot, informs about after how many slots on harq RetransmissionTimer dl timer expire*/ + uint32_t retransUlTimerLen; /* length of retransUlTimer received from ue cfg/recfg in form of slot, informs about after how many slots on harq RetransmissionTimer ul timer expire*/ + uint32_t longCycleLen; /* length of long Cycle value received from ue cfg/recfg in form of ms*/ + bool longCycleToBeUsed; /* long cycle should be used once the short cycle gets expires */ + uint32_t drxStartOffset; /* length of drxStartOffset value received from ue cfg/recfg in form of ms, which helps in getting on duration start point*/ + bool shortCyclePresent; /* set this value if shortCycle is Present */ + uint32_t shortCycleLen; /* length of short Cycle value received from ue cfg/recfg in form of ms*/ + uint32_t shortCycleTmrLen; /* value shortCycleTmr is the multiple of shortCycle which is received from ue cfg/recfg in form of integer*/ + uint32_t drxSlotOffset; /* drxSlotOffset value received from ue cfg/recfg which is used to delay before starting the drx-onDuration*/ + uint32_t onDurationStartIndex; /* Index at which UE is stored in onDuration starts list */ + uint32_t onDurationExpiryIndex; /* Index at which UE is stored in onDuration expires in the list */ + uint32_t inActvExpiryIndex; /* Index at which UE is stored in inActvTimer expires in the list */ + uint32_t shortCycleExpiryIndex; /* Index at which UE is stored in shortCycle expires in the list */ + int32_t shortCycleDistance; /* Distance after how many slot short cycle tmr gets expire */ + int32_t onDurationStartDistance;/* Distance after how many slot on Duration Start tmr gets expire */ + int32_t onDurationExpiryDistance;/* Distance after how many slot on Duration tmr gets expire */ + int32_t inActiveTmrExpiryDistance;/* Distance after how many slot inActive tmr gets expire */ + CmLList *onDurationStartNodeInfo; /* Node present in on duration start list*/ + CmLList *onDurationExpiryNodeInfo;/* Node present in on duration exp list*/ + CmLList *inActvTimerExpiryNodeInfo; /* Node present in in active exp list*/ + CmLList *shortCycleTmrExpiryNodeInfo; /* Node present in short cycle exp list*/ +}SchDrxUeCb; +#endif /** * @brief * UE control block @@ -272,13 +473,27 @@ typedef struct schUeCb SchUeCfgCb ueCfg; SchUeState state; SchCellCb *cellCb; + SchCfraResource cfraResource; bool srRcvd; bool bsrRcvd; BsrInfo bsrInfo[MAX_NUM_LOGICAL_CHANNEL_GROUPS]; SchUlCb ulInfo; SchDlCb dlInfo; - SchLcPrbEstimate dlLcPrbEst; /*DL PRB Alloc Estimate among different LC*/ - SchLcPrbEstimate ulLcPrbEst; /*UL PRB Alloc Estimate among different LC*/ + SchUlHqEnt ulHqEnt; + SchDlHqEnt dlHqEnt; + SchDlHqProcCb *msg4HqProc; + SchDlHqProcCb *retxMsg4HqProc; + SchHqDlMap **hqDlmap; + SchHqUlMap **hqUlmap; + void *schSpcUeCb; +#ifdef NR_DRX + bool ueDrxInfoPres; + SchDrxUeCb drxUeCb; +#endif + bool k0K1TblPrsnt; + SchK0K1TimingInfoTbl k0K1InfoTbl; + bool k2TblPrsnt; + SchK2TimingInfoTbl k2InfoTbl; }SchUeCb; /** @@ -289,20 +504,20 @@ typedef struct schRaReq { uint32_t raRnti; RachIndInfo *rachInd; + bool isCFRA; + SchUeCb *ueCb; /* Filled only if isCFRA = true */ SlotTimingInfo winStartTime; SlotTimingInfo winEndTime; }SchRaReq; typedef struct schPageInfo { - uint8_t pf; /*Value of Paging Frame received from DUAPP*/ - uint8_t i_s; /*Value of Paging Occ Index received from DUAPP*/ - SlotTimingInfo TxTime; /*Start Paging window*/ - uint8_t crntSsbIdx; /*Counts the slot till totalSSB is receached*/ - uint8_t mcs; - uint8_t nPRB; - uint16_t msgLen; - uint8_t *pagePdu; + uint16_t pf; /*Value of Paging Frame received from DUAPP*/ + uint8_t i_s; /*Value of Paging Occ Index received from DUAPP*/ + SlotTimingInfo pageTxTime; /*Start Paging window*/ + uint8_t mcs; /*MCS index*/ + uint16_t msgLen; /*Pdu length */ + uint8_t *pagePdu; /*RRC Page PDU bit string*/ }SchPageInfo; typedef struct schPagingOcc @@ -313,11 +528,119 @@ typedef struct schPagingOcc typedef struct schPageCb { - CmLListCp pageReqInfoRecord[MAX_SFN]; /*List of Page Records received which are stored per sfn*/ - SchPagingOcc pagMonOcc[MAX_PO_PER_PF]; /*Paging Occasion Slot/FrameOffset are stored*/ - SchPageInfo currPageInfo; /*Page Req which is being currently processed */ + CmLListCp pageIndInfoRecord[MAX_SFN]; /*List of Page Records received which are stored per sfn*/ + SchPagingOcc pagMonOcc[MAX_PO_PER_PF]; /*Paging Occasion Slot/FrameOffset are stored*/ }SchPageCb; +#ifdef NR_DRX +typedef struct schDrxCb +{ + CmLListCp onDurationStartList; /*!< Tracks the start of onDuration Timer. */ + CmLListCp onDurationExpiryList; /*!< Tracks the Expiry of onDuration Timer. */ + CmLListCp inActvTmrExpiryList; /*!< Tracks the Expiry of drx-InactivityTimer. */ + CmLListCp shortCycleExpiryList; /*!< Tracks the Expiry of DRX Short Cycle. */ + CmLListCp dlHarqRttExpiryList; /*!< Tracks the Expiry of DL HARQ RTT timer. */ + CmLListCp dlRetransExpiryList; /*!< Tracks the Expiry of DL Re-Transmission timer. */ + CmLListCp ulHarqRttExpiryList; /*!< Tracks the Expiry of UL HARQ RTT timer. */ + CmLListCp ulRetransExpiryList; /*!< Tracks the Expiry of UL Re-Transmission timer. */ + CmLListCp dlRetransTmrStartList; /*!< It has list of DL harq procs for */ + CmLListCp ulRetransTmrStartList; /*!< It has list of UL harq procs for */ +}SchDrxCb; +#endif + +typedef struct schAllApis +{ + uint8_t (* SchCellCfgReq)(SchCellCb *cellCb); + void (* SchCellDeleteReq)(SchCellCb *cellCb); + uint8_t (* SchAddUeConfigReq)(SchUeCb *ueCb); + void (* SchModUeConfigReq)(SchUeCb *ueCb); + void (* SchUeDeleteReq)(SchUeCb *ueCb); + void (* SchDlHarqInd)(); + void (* SchPagingInd)(); + void (* SchRachRsrcReq)(); + void (* SchRachRsrcRel)(); + void (* SchCrcInd)(SchCellCb *cellCb, uint16_t ueId); + void (* SchRachInd)(SchCellCb *cellCb, uint16_t ueId); + void (* SchDlRlcBoInfo)(SchCellCb *cellCb, uint16_t ueId); + void (* SchSrUciInd)(SchCellCb *cellCb, uint16_t ueId); + void (* SchBsr)(SchCellCb *cellCb, uint16_t ueId); + void (* SchHandleLcList)(void *ptr, CmLList *node, ActionTypeLL action); + void (* SchAddToDlHqRetxList)(SchDlHqProcCb *hqP); + void (* SchAddToUlHqRetxList)(SchUlHqProcCb *hqP); + void (* SchRemoveFrmDlHqRetxList)(SchUeCb *ueCb, CmLList *node); + void (* SchRemoveFrmUlHqRetxList)(SchUeCb *ueCb, CmLList *node); + uint8_t (* SchAddUeToSchedule)(SchCellCb *cellCb, uint16_t ueId); + void (* SchRemoveUeFrmScheduleLst)(SchCellCb *cell, CmLList *node); + uint8_t (* SchInitDlHqProcCb)(SchDlHqProcCb *hqP); + uint8_t (* SchInitUlHqProcCb)(SchUlHqProcCb *hqP); + void (* SchFreeDlHqProcCb)(SchDlHqProcCb *hqP); + void (* SchFreeUlHqProcCb)(SchUlHqProcCb *hqP); + void (* SchDeleteDlHqProcCb)(SchDlHqProcCb *hqP); + void (* SchDeleteUlHqProcCb)(SchUlHqProcCb *hqP); + void (* SchScheduleSlot)(SchCellCb *cell, SlotTimingInfo *slotInd, Inst schInst); + uint32_t (* SchScheduleDlLc)(SlotTimingInfo pdcchTime, SlotTimingInfo pdschTime, uint8_t pdschNumSymbols, \ + uint16_t *startPrb, bool isRetx, SchDlHqProcCb **hqP); + uint8_t (* SchScheduleUlLc)(SlotTimingInfo dciTime, SlotTimingInfo puschTime, uint8_t startStmb, \ + uint8_t symbLen, bool isRetx, SchUlHqProcCb **hqP); +}SchAllApis; + +typedef struct schHqCfgParam +{ + uint8_t maxDlDataHqTx; + uint8_t maxMsg4HqTx; + uint8_t maxUlDataHqTx; +}SchHqCfg; + +typedef struct +{ + /* parameters derived in scheduler */ + uint8_t n0; + BwpCfg bwp; + PdcchCfg sib1PdcchCfg; + PdschCfg sib1PdschCfg; +}SchSib1Cfg; + +typedef struct dlTotalPrbUsage +{ + uint16_t numPrbUsedForTx; + uint16_t totalPrbAvailForTx; +}TotalPrbUsage; + +typedef struct +{ + TotalPrbUsage *dlTotalPrbUsage; + TotalPrbUsage *ulTotalPrbUsage; +}SchKpiSupported; + +typedef struct +{ + CmLListCp dlTotPrbUseList; + CmLListCp ulTotPrbUseList; +}SchKpiActive; + +typedef struct schStatsGrp +{ + Inst schInst; + uint64_t subscriptionId; + uint8_t groupId; + uint16_t periodicity; /* In milliseconds */ + CmTimer periodTimer; + SchKpiSupported kpiStats; +}SchStatsGrp; + +typedef struct schStatsInfo +{ + uint8_t numStatsGroup; + SchStatsGrp statsGrpList[MAX_NUM_STATS_GRP]; +}SchStatsInfo; + +typedef struct schStatistics +{ + uint16_t numOfStatsCfgd; + SchStatsInfo statsInfoList[MAX_NUM_STATS_CFG]; + SchKpiActive activeKpiList; +}SchStatistics; + /** * @brief * Cell Control block per cell. @@ -327,35 +650,48 @@ typedef struct schCellCb uint16_t cellId; /*!< Cell ID */ Inst instIdx; /*!< Index of the scheduler instance */ Inst macInst; /*!< Index of the MAC instance */ - uint8_t numSlots; /*!< Number of slots in current frame */ + uint16_t numSlots; /*!< Number of slots in current frame */ SlotTimingInfo slotInfo; /*!< SFN, Slot info being processed*/ SchDlSlotInfo **schDlSlotInfo; /*!< SCH resource allocations in DL */ SchUlSlotInfo **schUlSlotInfo; /*!< SCH resource allocations in UL */ SchCellCfg cellCfg; /*!< Cell ocnfiguration */ + uint8_t numerology; bool firstSsbTransmitted; bool firstSib1Transmitted; - uint8_t ssbStartSymbArr[SCH_MAX_SSB_BEAM]; /*!