X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=Cu%2FCuUp%2FSdap%2Fsdap%2FSrc%2FsdapDataProc.c;fp=Cu%2FCuUp%2FSdap%2Fsdap%2FSrc%2FsdapDataProc.c;h=ab4cb52beb9814cb3effbdb570ca856a5ce032c7;hb=1f71b9a76eacf92b39c1ce6f782f8404a34f60a9;hp=0000000000000000000000000000000000000000;hpb=254694245736881ecfff4eb0d1503bf3f49a21be;p=scp%2Focu%2F5gnr.git diff --git a/Cu/CuUp/Sdap/sdap/Src/sdapDataProc.c b/Cu/CuUp/Sdap/sdap/Src/sdapDataProc.c new file mode 100644 index 0000000..ab4cb52 --- /dev/null +++ b/Cu/CuUp/Sdap/sdap/Src/sdapDataProc.c @@ -0,0 +1,284 @@ +/****************************************************************************** +############################################################################### +# Copyright (c) [2017-2020] [ICT/CAS] # +# Licensed under the ORAN Software License v1.0 (License) # +############################################################################### +******************************************************************************/ +#include "sdapCore.h" +#include "msgb.h" +#include "bitsPack.h" +#include "pdcpuDlDataProc.h" +#include "nguUlDataProc.h" +#include "cuupTest.h" + + +INT8 sdapMatchQosFlowId(SdapInstance_t *pSdapInstance, INT64 qosFlowId, UINT64 *pDrbId, UINT8 *pFlag) +{ + int i = 0; + int j = 0; + UINT64 drbId = 0; + SdapDrbCfg_t sdapDrbCfg = {0}; + + for(i = 0; i < pSdapInstance->drbNum; i++) + { + drbId = pSdapInstance->drbId[i]; + + VOS_MemCpy(&sdapDrbCfg, &pSdapInstance->drbCfg[drbId - 1], sizeof(SdapDrbCfg_t)); + + for(j = 0; j < sdapDrbCfg.qfiNum; j++) + { + if(qosFlowId == sdapDrbCfg.qfi[j]) + { + *pDrbId = drbId; + break; + } + } + } + + /* 没有查找到DRB,映射到默认的DRB */ + if(0 == *pDrbId) + { + for(i = 0; i < pSdapInstance->drbNum; i++) + { + drbId = pSdapInstance->drbId[i]; + + /* 一个实例,即一个会话内,有且只有一个默认的DRB */ + if(DEFAULT_DRB_TRUE == pSdapInstance->drbCfg[drbId - 1].sdapCfg.defaultDrbInd) + { + *pDrbId = drbId; + *pFlag = 1; + break; + } + } + } + + return VOS_OK; +} + +INT8 sdapPackPduHead(SdapInstance_t *pSdapInstance, INT64 qosFlowId, UINT64 *pDrbId, MsgbBuff_t *pMsgBuff, UINT8 rqi) +{ + UINT8 *p= NULL; + UINT64 qosNum = 0; + UINT8 updateFlag = 0; + sdapDlHeader_t sdapHeader = {0}; + INT8 pduHeadLen = 0; + + if(VOS_OK != sdapMatchQosFlowId(pSdapInstance, qosFlowId, pDrbId, &updateFlag)) + { + return VOS_ERROR; + } + + if(*pDrbId < 1 || *pDrbId > 32) + { + return VOS_ERROR; + } + + /*表明默认DRB上,增加了一条QOS的映射*/ + if(1 == updateFlag) + { + qosNum = pSdapInstance->drbCfg[*pDrbId -1].qfiNum; + pSdapInstance->drbCfg[*pDrbId -1].qfi[qosNum] = qosFlowId; + pSdapInstance->drbCfg[*pDrbId -1].qfiNum++; + } + + if(SDAP_HEADER_PRESENT == pSdapInstance->drbCfg[*pDrbId - 1].sdapCfg.sdapDlHeaderInd) + { + sdapHeader.QFI = qosFlowId; + if(1 == updateFlag) + { + sdapHeader.RDI = 1; + } + + sdapHeader.RQI = rqi; + + pduHeadLen = sizeof(sdapDlHeader_t); + + p = msgbHeadPush(pMsgBuff, pduHeadLen); + VOS_MemCpy(p, &sdapHeader, pduHeadLen); + + return pduHeadLen; + } + + /* 没有消息头的配置 */ + return 0; +} + +INT32 sdapDlDataProc(UINT64 upE1apId, UINT64 sessId, INT64 qosFlowId, MsgbBuff_t *pMsgBuff, UINT8 rqi) +{ + int i = 0; + UINT8 flag = 0; + UINT16 sduLen = 0; + INT8 pduHeadLen = 0; + UINT64 drbId = 0; + + SdapGlobalDtat_t *pGlobalData = NULL; + SdapInstance_t *pSdapInstance = NULL; + UINT8 *pMsgHead = NULL; + + if(NULL == pMsgBuff) + { + return VOS_ERROR; + } + + /* Get Instance */ + pGlobalData = sdapGetUeGlobalData(upE1apId, &flag); + + if(NULL == pGlobalData || 0 == flag) + { + return VOS_ERROR; + } + + for(i = 0; i < pGlobalData->sessNum; i++) + { + if(sessId == pGlobalData->sessId[i]) + { + pSdapInstance = &pGlobalData->sdapInstance[sessId]; + break; + } + } + + if(NULL == pSdapInstance) + { + return VOS_ERROR; + } + + sduLen = msgbDataUsedLen(pMsgBuff); //length of sdap sdu, not include sdap pdu head + pMsgHead = msgbData(pMsgBuff);//start of sdap sdu, not include sdap pdu head + + if(0 > sduLen || NULL == pMsgHead) + { + return VOS_ERROR; + } + + pduHeadLen = sdapPackPduHead(pSdapInstance, qosFlowId, &drbId, pMsgBuff, rqi); + + if(VOS_ERROR == pduHeadLen) + { + return VOS_ERROR; + } + + /*传递到PDCP-U*/ + pdcpuDlDataProc(upE1apId, drbId, pMsgBuff, 1); + + return VOS_OK; +} + +INT8 sdapUnPackPduHead(MsgbBuff_t *pMsgBuff) +{ + BitOpt_t bit; + UINT32 bitSize = 0; + + UINT8 *pMsgHead = msgbData(pMsgBuff); + UINT16 pduLen = msgbDataUsedLen(pMsgBuff); + + initBits(&bit, pMsgHead, pduLen, 0); + + /* SDAP头固定长度 1 */ + bitSize = SDAP_HEADER_LEN*8; + + if(-1 == unpackBits(&bit, bitSize)) + { + return VOS_ERROR; + } + + return SDAP_HEADER_LEN; +} + +INT32 sdapUlDataProc(UINT64 upE1apId, UINT64 sessId, UINT64 drbId, MsgbBuff_t *pMsgBuff) +{ + int i = 0; + UINT8 flag = 0; + INT8 pduHeadLen = 0; + + sdapUlHeader_t *pHead = NULL; + UINT8 qosFlowId = 0xff; + UINT8 pduType = 0; + + SdapGlobalDtat_t *pGlobalData = NULL; + SdapInstance_t *pSdapInstance = NULL; + SdapDrbCfg_t *pDrbCfgInfo = NULL; + + if(NULL == pMsgBuff) + { + return VOS_ERROR; + } + + /* Get Instance */ + pGlobalData = sdapGetUeGlobalData(upE1apId, &flag); + + if(NULL == pGlobalData || 0 == flag) + { + return VOS_ERROR; + } + + /* get instance */ + for(i = 0; i < pGlobalData->sessNum; i++) + { + if(sessId == pGlobalData->sessId[i]) + { + pSdapInstance = &pGlobalData->sdapInstance[sessId]; + break; + } + } + + if(NULL == pSdapInstance) + { + return VOS_ERROR; + } + + /* get Drb Cfg */ + for(i = 0; i < pSdapInstance->drbNum; i++) + { + if(drbId == pSdapInstance->drbId[i]) + { + pDrbCfgInfo = &pSdapInstance->drbCfg[drbId - 1]; + break; + } + } + + if(NULL == pDrbCfgInfo) + { + return VOS_ERROR; + } + + /* 有消息头的情况,去头 */ + if(SDAP_HEADER_PRESENT == pDrbCfgInfo->sdapCfg.sdapUlHeaderInd) + { + pduHeadLen = sdapUnPackPduHead(pMsgBuff); + + pHead = (sdapUlHeader_t *)msgbData(pMsgBuff); + qosFlowId = pHead->QFI; + pduType = pHead->TYPE; + + if(!pduType) + { + /* receive control pdu */ + return VOS_OK; + } + + /* check qosFlowId */ + for(i = 0; i < pDrbCfgInfo->qfiNum; i++) + { + if(pDrbCfgInfo->qfi[i] == qosFlowId) + { + break; + } + } + + if(i < pDrbCfgInfo->qfiNum) + { + /* qfi found */ + msgbHeadPull(pMsgBuff, pduHeadLen); + }else + { + /* qfi not found */ + return VOS_ERROR; + } + + } + + + /* 调用NG-U的上行数据处理接口 */ + return nguUlDataProc(upE1apId, sessId, qosFlowId, pMsgBuff); +} +