/* This file contains message handling functionality for DU cell management */
#ifndef __DU_MGR_H__
#define __DU_MGR_H__
-
-#include "stdio.h"
-#include "ctype.h"
-#include "envopt.h" /* Environment options */
-#include "envdep.h" /* Environment dependent */
-#include "envind.h" /* Environment independent */
-#include "gen.h" /* General */
-#include "ssi.h" /* System services */
-#include "cm5.h" /* Common timer defines */
-#include "cm_tkns.h" /* Common tokens defines */
-#include "cm_mblk.h" /* Common memory allocation library defines */
-#include "cm_llist.h" /* Common link list defines */
-#include "cm_hash.h" /* Common hashlist defines */
-#include "cm_lte.h"
-#include "cm_inet.h"
-#include "lkw.h"
-#include "lrg.h"
-#include "legtp.h"
-#include "mac_interface.h"
-
-#include "gen.x" /* General */
-#include "ssi.x" /* System services */
-
-#include "cm5.x" /* Common timer library */
-#include "cm_tkns.x" /* Common tokens */
-#include "cm_mblk.x" /* Common memory allocation */
-#include "cm_llist.x" /* Common link list */
-#include "cm_hash.x" /* Common hashlist */
-#include "cm_lte.x"
-#include "cm_inet.x"
-#include "cm_lib.x"
-#include "lkw.x"
-#include "lrg.x"
-
#define DU_PROC 0
-/* Memory related configs */
-#define DU_APP_MEM_REGION 0
-#define RLC_UL_MEM_REGION 1
-#define RLC_DL_MEM_REGION 4
-#define RG_MEM_REGION 4
-
-#define DU_POOL 1
-#define RLC_POOL 1
-#define RG_POOL 1
-
-/* Events */
-#define EVTCFG 0
-#define EVTSCTPSTRT 1
-#define EVTSCTPDATA 2
-#define EVTSCTPNTFY 3
-#define EVTSRVOPENREQ 4
-#define EVTSRVOPENCFM 5
-#define EVTTNLMGMTREQ 6
-#define EVTTNLMGMTCFM 7
-#define EVTTTIIND 8
-
-/* Selector */
-#define DU_SELECTOR_LC 0
-#define DU_SELECTOR_TC 1
-#define DU_SELECTOR_LWLC 2
/* SAP IDs */
#define DU_MAC_SUID 0
#define DU_ZERO_VAL 0
/* Macros */
-#define DEFAULT_CELLS 1
-#define NR_RANAC 150
-
#define ADD 0
#define DEL 1
#define MAC_CONFIGURED (MAC_GEN_CFG | MAC_SAP_CFG)
#define DU_SET_ZERO(_buf, _size) \
- cmMemset((U8 *)(_buf), 0, _size);
-
-/* allocate and zero out a static buffer */
-#define DU_ALLOC(_datPtr, _size) \
-{ \
- S16 _ret; \
- _ret = SGetSBuf(DU_APP_MEM_REGION, DU_POOL, \
- (Data **)&_datPtr, _size); \
- if(_ret == ROK) \
- cmMemset((U8*)_datPtr, 0, _size); \
- else \
- _datPtr = NULLP; \
-}
-
-/* free a static buffer */
-#define DU_FREE(_datPtr, _size) \
- if(_datPtr) \
- SPutSBuf(DU_APP_MEM_REGION, DU_POOL, \
- (Data *)_datPtr, _size);
+ memset((_buf), 0, _size);
+
+/*Refer Spec 38.331 Annexure A: maxNrofPageRec : 32 [Maximum number of page records]*/
+#define MAX_PAGING_UE_RECORDS 32
+
+typedef enum
+{
+ SLICE_INFO_NOT_AVAILABLE,
+ SLICE_CONFIGURED,
+ SLICE_RECONFIGURED
+}SliceCfgState;
typedef enum
{
- OOS,
+ CELL_OUT_OF_SERVICE,
ACTIVATION_IN_PROGRESS,
ACTIVATED,
DELETION_IN_PROGRESS
}CellStatus;
-#if 0
+typedef enum
+{
+ UE_INACTIVE,
+ UE_ACTIVE,
+ UE_HANDIN_IN_PROGRESS,
+ UE_DELETION_IN_PROGRESS,
+ UE_RESET_IN_PROGRESS
+}UeState;
+
+typedef enum
+{
+ UE_CTXT_UNKNOWN,
+ UE_CTXT_SETUP,
+ UE_CTXT_MOD,
+ UE_CTXT_RRC_RECFG_COMPLETE,
+ UE_CTXT_CFG_QUERY,
+ UE_CTXT_RELEASE
+}UeCtxtActionType;
+
+/** F1AP Msg IE **/
+typedef struct f1setupRsp
+{
+ uint32_t transId; /* Uniquely identify transaction */
+ char cuName[CU_DU_NAME_LEN_MAX]; /* CU Name */
+ F1RrcVersion rrcVersion; /* RRC version */
+}F1SetupRsp;
+
+typedef struct f1DlRrcMsg
+{
+ uint32_t gnbDuUeF1apId;
+ uint32_t gnbCuUeF1apId;
+ uint8_t srbId;
+ bool execDup;
+ bool deliveryStatRpt;
+ uint16_t rrcMsgSize;
+ uint8_t *rrcMsgPdu;
+}F1DlRrcMsg;
+
+typedef struct gtpTnlCfg
+{
+ uint32_t ulTnlAddress; /* remote Address */
+ uint32_t dlTnlAddress; /* local Address */
+ uint32_t teId;
+}GtpTnlCfg;
+
+typedef struct upTnlCfg
+{
+ ConfigType configType;
+ uint8_t cellId;
+ uint8_t ueId;
+ uint8_t drbId;
+ GtpTnlCfg *tnlCfg1; /* Tunnel 1 */
+ GtpTnlCfg *tnlCfg2; /* Tunnel 2 */
+}UpTnlCfg;
+
+#ifdef NR_DRX
+/* This structures is taken from the DRX Cycle section of
+ * specification 33.473. */
+typedef struct drxCycle
+{
+ uint16_t drxLongCycleLength;
+ bool shortDrxCyclePres;
+ ShortDrx shortDrxCycle;
+}DrxCycle;
+#endif
+
+typedef struct duLcCfg
+{
+ ConfigType configType;
+ LcCfg lcConfig;
+}DuLcCfg;
+
+typedef struct duMacUeCfg
+{
+ uint16_t cellId;
+ uint8_t ueId;
+ uint16_t crnti;
+ bool macCellGrpCfgPres;
+ MacCellGrpCfg macCellGrpCfg;
+ bool phyCellGrpCfgPres;
+ PhyCellGrpCfg phyCellGrpCfg;
+ bool spCellCfgPres;
+ SpCellRecfg spCellCfg;
+ AmbrCfg *ambrCfg;
+ ModulationInfo dlModInfo; /* DL modulation info */ //TBD
+ ModulationInfo ulModInfo; /* UL modulation info */ //TBD
+ uint8_t numLcs;
+ DuLcCfg lcCfgList[MAX_NUM_LC];
+ UeCfgState macUeCfgState; /* InActive / Completed */ //TBD
+ DataTransmissionAction transmissionAction; //TBD
+#ifdef NR_DRX
+ bool drxConfigIndicatorRelease;
+#endif
+}DuMacUeCfg;
+
+typedef struct duRlcBearerCfg
+{
+ ConfigType configType;
+ RlcBearerCfg rlcBearerCfg;
+}DuRlcBearerCfg;
+
+typedef struct duRlcUeCfg
+{
+ uint16_t cellId;
+ uint8_t ueId;
+ uint8_t numLcs;
+ DuRlcBearerCfg rlcLcCfg[MAX_NUM_LC];
+ UeCfgState rlcUeCfgState; /* InActive / Completed */
+}DuRlcUeCfg;
+
+
+typedef struct duUeCfg
+{
+ void *cellGrpCfg;
+ void *ueNrCapability;
+ uint8_t numRlcLcs; /* Rlc Ue Cfg */
+ DuRlcBearerCfg rlcLcCfg[MAX_NUM_LC];
+ uint8_t numMacLcs; /* Mac Ue Cfg */
+ DuLcCfg macLcCfg[MAX_NUM_LC];
+ AmbrCfg *ambrCfg;
+ uint8_t numDrb;
+ UpTnlCfg upTnlInfo[MAX_NUM_DRB]; /* User plane TNL Info*/
+ uint8_t numDrbSetupMod; /*No. of DRB Added during Modification*/
+ uint8_t numDrbModified; /*No. of DRB Modified during Modification*/
+ DuMacUeCfg copyOfmacUeCfg;
+ DataTransmissionAction dataTransmissionAction;
+#ifdef NR_DRX
+ bool drxCyclePres;
+ DrxCycle drxCycle;
+ bool drxConfigIndicatorRelease;
+#endif
+}DuUeCfg;
+
+typedef struct f1UeContextSetup
+{
+ UeCtxtActionType actionType;
+ uint8_t cellIdx;
+ DuUeCfg duUeCfg;
+ bool dlRrcMsgPres;
+ F1DlRrcMsg *dlRrcMsg;
+}F1UeContextSetupDb;
+
+typedef struct cellCfgParams
+{
+ NrEcgi nrEcgi; /* ECGI */
+ uint16_t nrPci; /* PCI */
+ uint16_t fiveGsTac; /* 5gSTac */
+ Plmn plmn[MAX_PLMN]; /* List of serving PLMN IDs */
+ uint32_t maxUe; /* max UE per slot */
+}CellCfgParams;
+
+typedef struct duUeCb
+{
+ F1UeContextSetupDb *f1UeDb;
+ uint16_t crnti;
+ uint32_t gnbDuUeF1apId; /* GNB DU UE F1AP ID */
+ uint32_t gnbCuUeF1apId; /* GNB CU UE F1AP ID */
+ uint32_t drbBitMap; /* Drb Bit Map */
+ UeState ueState; /* UE Active/ Ue Inactive state */
+ MacCfraResource cfraResource; /* CF-RA resource assigned by MAC/SCH */
+ DuMacUeCfg duMacUeCfg; /* Mac Ue Cfg */
+ DuRlcUeCfg duRlcUeCfg; /* Rlc Ue Cfg */
+}DuUeCb;
+
+typedef struct slotInfo
+{
+ uint16_t sfn;
+ uint16_t slot;
+}SlotInfo;
+
+typedef struct pagingMsg
+{
+ /*Note: Paging UEID is extracted from 5gSTMSI as per Spec 38.304, Sec 7.1.
+ *This is not same as DU-UE_F1AP_ID or CU_UE_F1AP_ID*/
+ uint16_t pagUeId; /* UE Identifier from CU*/
+
+ /*TODO: When RAN Inititated Paging will be supported then I-RNTI will be
+ * added as a choice for UE Identity along with S-TMSI*/
+ uint64_t sTmsi; /* UE Paging Identity: S-TMSI */
+ bool pagingDrxPres; /* flag to indicate paging drx present or not */
+ uint16_t pagingDrx; /* UE specific paging drx */
+ uint8_t pagPriority; /* Paging priority */
+ uint16_t pagingFrame; /* paging frame */
+ uint16_t pagingFrameOffset; /* paging offset */
+ uint8_t i_s; /* Index points to PO from the sub-frame pattern */
+ uint16_t T; /* T is DRX cycle of the UE */
+}DuPagingMsg;
+
+typedef struct duPagUeRecord
+{
+ uint16_t pagUeId; /*UEID calculated from 5gsTMSI as per Spec 38.304*/
+ uint64_t sTmsi; /* UE Paging Identity: S-TMSI */
+}DuPagUeRecord;
+
+typedef struct duPagInfo
+{
+ uint8_t i_s; /*Index of PO*/
+ CmLListCp pagUeList; /*List of UEs to be paged in this Paging Frame/Paging Occ*/
+}DuPagUeList;
+
+typedef struct duPagInfoMap
+{
+ uint16_t pf; /* Paging Frame*/
+ CmLListCp pagInfoList; /* Master List of Paging Identified by PF and i_s*/
+}DuPagInfoList;
+
typedef struct duCellCb
{
- U32 cellId; /* Internal cell Id */
- CellCfgParams cellInfo; /* Cell info */
- CellStatus cellStatus; /*Cell status */
+ uint16_t cellId; /* Internal cell Id */
+ CellCfgParams cellInfo; /* Cell info */
+ /* pointer to store the address of macCellCfg params used to send du-app to MAC */
+ MacCellCfg *duMacCellCfg;
+ CellStatus cellStatus; /* Cell status */
+ uint32_t numActvUes; /* Total Active UEs */
+ DuUeCb ueCb[MAX_NUM_UE]; /* Stores UE context */
+ SlotInfo currSlotInfo;
+ DuPagingMsg tmpPagingInfoOfUe; /* UE paging information */
+ CmHashListCp pagingInfoMap; /*Paging Map between PF and PagingInfoList*/
}DuCellCb;
-#endif
typedef struct duLSapCb
{
State sapState;
Mem mem;
CmTimer timer;
- U8 bndRetryCnt;
- U8 maxBndRetry;
- TmrCfg bndTmr;
+ uint8_t bndRetryCnt;
+ uint8_t maxBndRetry;
+ TmrCfg bndTmr;
}DuLSapCb;
+typedef struct ueCcchCtxt
+{
+ uint32_t gnbDuUeF1apId; /* GNB DU UE F1AP ID */
+ uint16_t crnti; /* CRNTI */
+ uint16_t cellId; /* Cell Id */
+}UeCcchCtxt;
+
+/* This structure is added to store the information about the F1AP pdu and
+ * transId so that It can be used in future */
+typedef struct reservedF1apPduInfo
+{
+ uint8_t transId; /* trans Id */
+ void *f1apMsg; /* msg structure */
+}ReservedF1apPduInfo;
+
+typedef struct duTimer
+{
+ CmTqCp tmrTqCp; /*!< Timer Task Queue Cntrl Point */
+ CmTqType tmrTq[DU_TQ_SIZE]; /*!< Timer Task Queue */
+ uint8_t tmrRes; /*!< Timer resolution */
+}DuTimers;
+
/* DU APP DB */
typedef struct duCb
{
- Mem mem; /* Memory configs */
- TskInit init; /* DU Init */
- //DuLSapCb **macSap; /* MAC SAP */
- Bool f1Status; /* Status of F1 connection */
- CmHashListCp cellLst; /* List of cells at DU APP of type DuCellCb */
- CmHashListCp actvCellLst; /* List of cells activated/to be activated of type DuCellCb */
- /* pointer to store the address of macCellCfg params used to send du-app to MAC */
- MacCellCfg *ptrMacCellCfg; /* pointer to store params while sending DU-APP to MAC */
+ Mem mem; /* Memory configs */
+ TskInit init; /* DU Init */
+ bool f1Status; /* Status of F1 connection */
+ bool e2Status; /* Status of E2 connection */
+ E2apDb e2apDb; /* E2AP database */
+ uint8_t numCfgCells; /* number of configured cells */
+ DuCellCb* cfgCellLst[MAX_NUM_CELL]; /* List of cells at DU APP of type DuCellCb */
+ uint8_t numActvCells; /* Number of active cells */
+ DuCellCb* actvCellLst[MAX_NUM_CELL]; /* List of cells activated/to be activated of type DuCellCb */
+ uint32_t gnbDuUeF1apIdGenerator; /* Generating Du Ue F1ap Id */
+ uint32_t numUe; /* current number of UEs */
+ UeCcchCtxt ueCcchCtxt[MAX_NUM_UE]; /* mapping of gnbDuUeF1apId to CRNTI required for CCCH processing*/
+ uint8_t numTeId; /* current number of TEIDs configured in the system*/
+ UpTnlCfg* upTnlCfg[MAX_TEID]; /* tunnel info for every Drb */
+ CmLListCp reservedF1apPduList; /*storing F1AP pdu infomation and transId */
+ SliceCfgState sliceState; /* Slice status */
+ DuTimers duTimersInfo; /* Du timers queue */
}DuCb;
Route dstRoute;
Selector dstSel;
Mem mem;
- U8 maxBndRetry;
+ uint8_t maxBndRetry;
TmrCfg bndTmr;
TmrCfg connTmr;
}DuLSapCfg;
//DuCfgParams duCfgParam;
/* DU Cell Functions */
-S16 duActvInit(Ent entity, Inst inst, Region region, Reason reason);
-S16 duActvTsk(Pst *pst, Buffer *mBuf);
-S16 duSendRlcUlCfg();
-S16 duSendRlcDlCfg();
-S16 duBuildRlcCfg(Inst inst);
-S16 duBuildRlcLsapCfg(Ent ent, Inst inst, U8 lsapInst);
-S16 duBuildRlcUsapCfg(U8 elemId, Ent ent, Inst inst);
-S16 duHdlRlcCfgComplete(Pst *pst, KwMngmt *cfm);
-S16 duHdlRlcCntrlCfgComplete(Pst *pst, KwMngmt *cfm);
-S16 duProcRlcUlCfgComplete(Pst *pst, KwMngmt *cfm);
-S16 duProcRlcDlCfgComplete(Pst *pst, KwMngmt *cfm);
-S16 duSendMacCfg();
-S16 duBuildMacGenCfg();
-S16 duBuildMacUsapCfg(SpId sapId);
-S16 duHdlMacCfgComplete(Pst *pst, RgMngmt *cfm);
-S16 duBindUnbindRlcToMacSap(U8 inst, U8 action);
-S16 duProcCfgComplete();
-S16 duSendSchCfg();
-S16 duSctpStartReq();
-S16 duSctpNtfyHdl(Buffer *mBuf, CmInetSctpNotification *ntfy);
-
-S16 duBuildEgtpCfgReq();
-S16 duHdlEgtpCfgComplete(CmStatus cfm);
-S16 duSendEgtpSrvOpenReq();
-S16 duHdlEgtpSrvOpenComplete(CmStatus cfm);
-S16 duSendEgtpTnlMgmtReq(U8 action, U32 lclTeid, U32 remTeid);
-S16 duHdlEgtpTnlMgmtCfm(EgtpTnlEvt tnlEvtCfm);
-S16 duSendEgtpDatInd();
-S16 duHdlSchCfgComplete(Pst *pst, RgMngmt *cfm);
+uint8_t duActvInit(Ent entity, Inst inst, Region region, Reason reason);
+uint8_t duActvTsk(Pst *pst, Buffer *mBuf);
+uint8_t duSendRlcUlCfg();
+uint8_t duSendRlcDlCfg();
+uint8_t duBuildRlcCfg(Inst inst);
+uint8_t duBuildRlcLsapCfg(Ent ent, Inst inst, uint8_t lsapInst);
+uint8_t duBuildRlcUsapCfg(uint8_t elemId, Ent ent, Inst inst);
+uint8_t DuHdlRlcCfgComplete(Pst *pst, RlcMngmt *cfm);
+uint8_t duHdlRlcCntrlCfgComplete(Pst *pst, RlcMngmt *cfm);
+uint8_t duProcRlcUlCfgComplete(Pst *pst, RlcMngmt *cfm);
+uint8_t duProcRlcDlCfgComplete(Pst *pst, RlcMngmt *cfm);
+uint8_t duSendMacCfg();
+uint8_t duBuildMacGenCfg();
+uint8_t duBuildMacUsapCfg(SpId sapId);
+uint8_t duHdlMacCfgComplete(Pst *pst, RgMngmt *cfm);
+uint8_t duBindUnbindRlcToMacSap(uint8_t inst, uint8_t action);
+uint8_t duProcCfgComplete();
+uint8_t duSendSchCfg();
+uint8_t duSctpStartReq();
+uint8_t duSctpNtfyHdl(Buffer *mBuf, CmInetSctpNotification *ntfy);
+
+uint8_t duBuildEgtpCfgReq();
+uint8_t duHdlEgtpCfgComplete(CmStatus cfm);
+uint8_t duSendEgtpSrvOpenReq();
+uint8_t duHdlEgtpSrvOpenComplete(CmStatus cfm);
+uint8_t duSendEgtpTnlMgmtReq(uint8_t action, uint32_t teIdMod, GtpTnlCfg *tnlInfo);
+uint8_t duSendEgtpDatInd(Buffer *mBuf);
+uint8_t duHdlSchCfgComplete(Pst *pst, RgMngmt *cfm);
+uint8_t duBuildAndSendMacCellStart();
+uint8_t duBuildAndSendMacCellStop(uint16_t cellId);
#endif
/**********************************************************************
- End of file
-**********************************************************************/
+ End of file
+ **********************************************************************/