O-CU-UP
[scp/ocu/5gnr.git] / Cu / CuUp / Pdcp / PdcpUp / Src / pdcpuCore.c
diff --git a/Cu/CuUp/Pdcp/PdcpUp/Src/pdcpuCore.c b/Cu/CuUp/Pdcp/PdcpUp/Src/pdcpuCore.c
new file mode 100644 (file)
index 0000000..ecb6656
--- /dev/null
@@ -0,0 +1,297 @@
+/******************************************************************************
+###############################################################################
+#   Copyright (c) [2017-2020] [ICT/CAS]                                        #
+#   Licensed under the ORAN Software License v1.0 (License)             #
+###############################################################################
+******************************************************************************/
+#include "vos_types.h"
+#include "vos_string.h"
+#include "vos_linklist.h"
+#include "vos_sem.h"
+#include "pdcpu.h"
+#include "cuupCommon.h"
+#include "cuModuleInterface.h"
+#include "gnbCommon.h"
+#include "upcContext.h"
+#include "cuupTest.h"
+
+PdcpuUeInfo_t *gPdcpuUeInfo[MAX_UE_NUM];
+extern ULONG gPdcpuModuleId;
+
+/* not used at the moment */
+/*void pdcpuSetLessCountFun(const void* cpv_first, const void* cpv_second, void* pv_output)
+{      
+       assert(cpv_first != NULL && cpv_second != NULL && pv_output != NULL);
+       
+   *(bool_t*)pv_output = (((PdcpuDataBuffNode_t *)cpv_first)->count) < (((PdcpuDataBuffNode_t *)cpv_second)->count) ? true : false;
+}*/
+
+
+/** 释放一个 PdcpuDataBuffNode_t 数据,赋值给plist->del */
+VOID pdcpuFreeDataBuffNode(VOID *p)
+{
+       PdcpuDataBuffNode_t *pNode = NULL;
+       if(NULL == p)
+       {
+               return ;
+       }
+
+       pNode = (PdcpuDataBuffNode_t *)p;
+       if(NULL != pNode->pData)
+       {
+               msgbFree(pNode->pData);
+               pNode->pData = NULL;
+       }
+       VOS_Free(p);
+       p = NULL;
+       
+       return ;
+}
+
+/*******************************************************************************
+ * discard all stored PDCP PDUs in the transmitting buffer 
+ * INPUT:
+ *             pTxPduList: transmitting buffer list
+ * OUTPUT:
+ *             0: success
+ *             -1:failed
+ *******************************************************************************/
+INT32 pdcpuDiscardTransmitBuff(plist pTxPduList)
+{
+       return VOS_OK;
+}
+
+/*******************************************************************************
+ * transmit or retransmit all stored PDCP PDUs in the transmitting buffer 
+ * INPUT:
+ *             pTxPduList: transmitting buffer list
+ * OUTPUT:
+ *             0: success
+ *             -1:failed
+ *******************************************************************************/
+INT32 pdcpuDeliverTransmitBuff(PdcpDrbEntity_t *pPdcpuEntity)
+{
+       return VOS_OK;
+}
+
+/*******************************************************************************
+ * deliver the PDCP SDUs stored in the receiving buffer to upper layers 
+ * in ascending order of associated COUNT values 
+ * INPUT:
+ *             pTxPduList: transmitting buffer list
+ * OUTPUT:
+ *             0: success
+ *             -1:failed
+ *******************************************************************************/
+INT32 pdcpuDeliverRecvBuff(PdcpDrbEntity_t *pPdcpuEntity)
+{
+       return VOS_OK;
+}
+
+
+/*******************************************************************************
+ * To construct and send a PDCP status report 
+ * INPUT:
+ *             pPdcpuEntity: pdcpu entity
+ * OUTPUT:
+ *             0: success
+ *             -1:failed
+ *******************************************************************************/
+INT32 pdcpuConstructStatusReport(PdcpDrbEntity_t *pPdcpuEntity)
+{
+       return VOS_OK;
+}
+
+/*******************************************************************************
+ * To perform PDCP data recovery 
+ * INPUT:
+ *             ueE1apId: UE E1AP ID
+ *             drbId : DRB ID
+ * OUTPUT:
+ *             0: success
+ *             -1:failed
+ *******************************************************************************/
+INT32 pdcpuDataRecovery(PdcpDrbEntity_t *pPdcpuEntity)
+{
+       return VOS_OK;
+}
+
+INT32 pdcpuRecfgRohc(PdcpDrbEntity_t *pPdcpuEntity, upcTempDrbInfo_t *pDrbItem)
+{
+    return VOS_OK;
+}
+
+
+
+INT32 pdcpuSetSn(PdcpSnSize_e *pSn, PdcpSNSize_e snCfg)
+{
+       if(PDCP_SN_SIZE_S12 == snCfg)
+       {
+               *pSn = LEN12BITS;
+               
+       }else if(PDCP_SN_SIZE_S18 == snCfg)
+       {
+               *pSn = LEN18BITS;
+               
+       }else
+       {
+               pdcpuLog(LOG_ERR,"[PDCPU] input sn size is wrong!\n");
+               return VOS_ERROR;
+       }
+       
+       return VOS_OK;
+}
+
+INT32 pdcpuSetRlcMode(PdcpRlcMode_e *pRlcMode, CuRlcMode_e rlcCfg)
+{
+       switch(rlcCfg)
+       {
+               case RLCMODE_TM:
+                       pdcpuLog(LOG_ERR,"[PDCPU] input-TM MODE is wrong!\n");
+                       return VOS_ERROR;
+               
+               case RLCMODE_AM:
+                       *pRlcMode = AM_MODE;
+                       return VOS_OK;
+
+               case RLCMODE_UM_BIDIRECTIONAL:
+               case RLCMODE_UM_UNIDIRECTIONAL_UL:
+               case RLCMODE_UM_UNIDIRECTIONAL_DL:
+                       *pRlcMode = UM_MODE;
+                       return VOS_OK;
+
+               default:
+                       pdcpuLog(LOG_ERR,"[PDCPU] input-rlc mode is wrong\n");
+                       return VOS_ERROR;
+       }
+}
+
+/*******************************************************************************
+ * To get SDAP DATA PDU header length configuration 
+ * INPUT:
+ *             sdapHeadInd : 
+ *             sdapHeadLen : 
+ * OUTPUT:
+ *             none
+ *******************************************************************************/
+INT32 pdcpuGetSdapHeadLen(SdapHeader_e sdapHeadInd, UINT8 *sdapHeadLen)
+{
+       if(SDAP_HEADER_PRESENT == sdapHeadInd)
+       {
+               *sdapHeadLen = 1;       /*Data PDU with SDAP header*/
+               
+       }else if(SDAP_HEADER_ABSENT == sdapHeadInd)
+       {
+               *sdapHeadLen = 0;       /*Data PDU without SDAP header*/
+               
+       }else
+       {       
+               pdcpuLog(LOG_ERR,"[PDCPU] sdap head cfg is wrong\n");
+               return VOS_ERROR;
+       }
+       
+       return VOS_OK;
+}
+
+
+/*******************************************************************************
+ * To create PDCP-U entity 
+ * INPUT:
+ *             ueE1apId: UE E1AP ID
+ *             pDrbItem : DRB to setup item
+ * OUTPUT:
+ *             0: success
+ *             -1:failed
+ *******************************************************************************/
+INT32 pdcpuCreateEntity(UINT64 ueE1apId, UINT16 ueIdx, UINT16 pduSessionId, upcTempDrbInfo_t *pDrbItem)
+{              
+       UINT8 drbId = pDrbItem->drbId;  
+       PdcpuUeInfo_t   *pPdcpUeInfo  = NULL;
+       PdcpDrbEntity_t *pPdcpuEntity = NULL;
+       INT8 ret = 0;
+
+       pdcpuCheckUeIdx(ueIdx);
+       pdcpuCheckDrbId(drbId);
+       
+       /* examine ue info */   
+       if(NULL == gPdcpuUeInfo[ueIdx])
+       {
+               pPdcpUeInfo = VOS_Malloc(sizeof(PdcpuUeInfo_t), gPdcpuModuleId);
+               pdcpuNullCheck(pPdcpUeInfo);
+               VOS_MemZero(pPdcpUeInfo, sizeof(PdcpuUeInfo_t));
+               gPdcpuUeInfo[ueIdx] = pPdcpUeInfo;              
+       }else
+       {
+               pPdcpUeInfo = gPdcpuUeInfo[ueIdx];
+       }
+       
+       /* examine drb info */
+       if(NULL != pPdcpUeInfo->pdcpDrbEntity[drbId])
+       {
+               pPdcpuEntity = pPdcpUeInfo->pdcpDrbEntity[drbId];
+
+       }       
+       pPdcpuEntity = VOS_Malloc(sizeof(PdcpDrbEntity_t), gPdcpuModuleId);     
+       pdcpuNullCheck(pPdcpuEntity);
+       VOS_MemZero(pPdcpuEntity, sizeof(PdcpDrbEntity_t));
+       pPdcpUeInfo->pdcpDrbEntity[drbId] = pPdcpuEntity;
+               
+       PDCPConfiguration_t *pPdcpCfg   = &(pDrbItem->pdcpConfig);
+       pPdcpuEntity->ueE1apId                  = ueE1apId;
+       pPdcpuEntity->ueIdx                             = ueIdx;
+       pPdcpuEntity->pduSessionId              = pduSessionId;
+       pPdcpuEntity->drbId                             = drbId;
+
+       if(0 != ((pPdcpCfg->bitMask)&PDCP_CONFIGURATION_OUT_OF_ORDER_DELIVERY_PRESENT))
+       {
+               pdcpuLog(LOG_INFO,"[PDCPU] 乱序递交已设置\n");
+               pPdcpuEntity->outOfOrderDelivery= TRUE;
+       }
+
+       /* set rlc mode */
+       ret += pdcpuSetRlcMode(&pPdcpuEntity->rlcMode, pPdcpCfg->rlcMode);
+
+       /* set sn size- Cond Setup2(38.331) */
+       ret += pdcpuSetSn(&pPdcpuEntity->pdcpSnSizeUl, pPdcpCfg->pdcpSNSizeUl);
+       ret += pdcpuSetSn(&pPdcpuEntity->pdcpSnSizeDl, pPdcpCfg->pdcpSNSizeDl);
+
+
+       /* set sdap head length */
+       ret += pdcpuGetSdapHeadLen(pDrbItem->sdapConfig.sdapDlHeaderInd, &pPdcpuEntity->sdapDlHeadLen);
+       ret += pdcpuGetSdapHeadLen(pDrbItem->sdapConfig.sdapUlHeaderInd, &pPdcpuEntity->sdapUlHeadLen);
+
+       /* check the above return results */
+       if(0 != ret)
+       {
+               pdcpuLog(LOG_ERR,"[PDCPU] input parameter is wrong\n");
+               VOS_Free(pPdcpuEntity);
+               pPdcpUeInfo->pdcpDrbEntity[drbId] = NULL;
+               return VOS_ERROR;               
+       }
+       
+
+       /* set security enable information */
+       PdcpuSecEnableInfo_t *pEnableInfo = gPdcpuUeInfo[ueIdx]->secEnableInfo[pduSessionId];
+       pdcpuNullCheck(pEnableInfo);    
+       pPdcpuEntity->integrityProtection = pEnableInfo->integrityEnableFlag;
+       pPdcpuEntity->ciperingEnabled = pEnableInfo->cipherEnableFlag;
+
+       /* not support: ulDataSplitThreshold, pdcpDuplication */
+
+       /* set state variable */
+       VOS_MemZero(&(pPdcpuEntity->stateVar), sizeof(PdcpStateVar_t));
+
+
+       /* initial transmitting buffer */
+       pPdcpuEntity->txListLock = VOS_SemMCreate(VOS_SEM_Q_FIFO);
+       pPdcpuEntity->pTxPduList = cl_lib_list_new("pdcpuTxPduList", gPdcpuModuleId);
+
+       /* initial receiving buffer */
+       pPdcpuEntity->rxListLock = VOS_SemMCreate(VOS_SEM_Q_FIFO);
+       pPdcpuEntity->pRxSduList = cl_lib_list_new("pdcpuRxSduList", gPdcpuModuleId);
+
+       printfDrbEntity(pPdcpuEntity);
+
+       return VOS_OK;
+}
+