X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=Cu%2FCuUp%2FPdcp%2FPdcpUp%2FSrc%2FpdcpuCore.c;fp=Cu%2FCuUp%2FPdcp%2FPdcpUp%2FSrc%2FpdcpuCore.c;h=ecb665675e9004a1c9316c7c93a3372ddac560b9;hb=1f71b9a76eacf92b39c1ce6f782f8404a34f60a9;hp=0000000000000000000000000000000000000000;hpb=254694245736881ecfff4eb0d1503bf3f49a21be;p=scp%2Focu%2F5gnr.git diff --git a/Cu/CuUp/Pdcp/PdcpUp/Src/pdcpuCore.c b/Cu/CuUp/Pdcp/PdcpUp/Src/pdcpuCore.c new file mode 100644 index 0000000..ecb6656 --- /dev/null +++ b/Cu/CuUp/Pdcp/PdcpUp/Src/pdcpuCore.c @@ -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; +} +