--- /dev/null
+/******************************************************************************
+###############################################################################
+# Copyright (c) [2017-2020] [ICT/CAS] #
+# Licensed under the ORAN Software License v1.0 (License) #
+###############################################################################
+******************************************************************************/
+#include "sdapCore.h"
+
+SdapGlobalDtat_t s_SdapGlobalData[UPC_MAX_UE_NUM] = {{0}};
+
+void sdapResortDrbId(SdapInstance_t *pSdapInstance, int idx)
+{
+ int i = 0;
+ int j = 0;
+
+ for(i = 0; i < pSdapInstance->drbNum; i++)
+ {
+ if(i == idx)
+ {
+ continue;
+ }
+
+ pSdapInstance->drbId[j] = pSdapInstance->drbId[i];
+ j++;
+ }
+}
+
+void sdapResortSessionId(SdapGlobalDtat_t *pGlobalData, int idx)
+{
+ int i = 0;
+ int j = 0;
+
+ for(i = 0; i < pGlobalData->sessNum; i++)
+ {
+ if(i == idx)
+ {
+ continue;
+ }
+
+ pGlobalData->sessId[j] = pGlobalData->sessId[i];
+ j++;
+ }
+}
+
+SdapGlobalDtat_t* sdapGetUeGlobalData(UINT64 upE1apId, UINT8 *flag)
+{
+ int i = 0;
+
+ for(i = 0; i < UPC_MAX_UE_NUM; i++)
+ {
+ if(upE1apId == s_SdapGlobalData[i].upE1apId)
+ {
+ *flag = 1;
+ return &s_SdapGlobalData[i];
+ }
+ }
+
+ for(i = 0; i < UPC_MAX_UE_NUM; i++)
+ {
+ if(0 == s_SdapGlobalData[i].upE1apId)
+ {
+ *flag = 0;
+ return &s_SdapGlobalData[i];
+ }
+ }
+
+ return NULL;
+}
+#if CONCEPT('Create Instance')
+INT32 sdapCreateQosInfo(SdapDrbCfg_t *pDrbCfg, upcTempDrbInfo_t *pTempDrb, SdapDrbCfgRet_t *pDrbCfgRet)
+{
+ int i = 0;
+ INT64 qosFlowId = 0;
+ upcTempQosInfo_t *pTempQos;
+
+ for(i = 0; i < pTempDrb->qosSetupNum; i++)
+ {
+ pTempQos = &pTempDrb->pQosSetupList[i];
+
+ if((NULL == pTempQos) || (TRUE != pTempQos->qosSetupAllowed))
+ {
+ continue;
+ }
+
+ qosFlowId = pTempQos->qosFlowId;
+ pDrbCfg->qfi[pDrbCfg->qfiNum] = qosFlowId;
+ pDrbCfg->qosFlowInfo[qosFlowId].qosFlowLevelQosPar = pTempQos->qosPara;
+ if(pTempQos->qosMapFlag)
+ {
+ pDrbCfg->qosFlowInfo[qosFlowId].qosFlowMapInd = pTempQos->qosFlowMapInd;
+ }
+ pDrbCfg->qfiNum++;
+
+ pDrbCfgRet->Qfi[pDrbCfgRet->QosNum] = qosFlowId;
+ pDrbCfgRet->QosNum++;
+ }
+
+ if(0 == pDrbCfg->qfiNum)
+ {
+ return VOS_ERROR;
+ }
+
+ return VOS_OK;
+}
+
+INT32 sdapCreateDrbInfo(SdapInstance_t *pInstance, upcTempSessInfo_t *pSessTempInfo, sdapSessCfgRet_t *pCfgRet)
+{
+ int i = 0;
+ UINT64 drbId = 0;
+
+ upcTempDrbInfo_t *pTempDrb = NULL;
+
+ pInstance->sessId = pSessTempInfo->pduSessId;
+ pCfgRet->sessId = pInstance->sessId;
+
+ for(i = 0; i < pSessTempInfo->drbSetupNum; i++)
+ {
+ pTempDrb = &pSessTempInfo->pTempDrbSetupList[i];
+
+ if((NULL == pTempDrb) || (TRUE != pTempDrb->drbSetupAllowed))
+ {
+ continue;
+ }
+
+ drbId = pTempDrb->drbId;
+
+ if(VOS_OK != sdapCreateQosInfo(&pInstance->drbCfg[drbId - 1], pTempDrb, &pCfgRet->actDrbCfg[drbId - 1]))
+ {
+ pCfgRet->failDrbId[pCfgRet->failDrbNum] = drbId;
+ pCfgRet->failDrbNum++;
+ pCfgRet->cause[drbId - 1] = RNL_UNSPECIFIED;
+ continue;
+ }
+ pCfgRet->actDrbId[pCfgRet->actDrbNum] = drbId;
+ pCfgRet->actDrbCfg[drbId - 1].drbId = drbId;
+ pCfgRet->actDrbNum++;
+
+ VOS_MemCpy(&pInstance->drbCfg[drbId - 1].sdapCfg, &pTempDrb->sdapConfig, sizeof(SdapCfg_t));
+
+ pInstance->drbCfg[drbId - 1].drbId = drbId;
+ pInstance->drbId[pInstance->drbNum] = drbId;
+ pInstance->drbNum++;
+ }
+
+ if(0 == pCfgRet->actDrbNum)
+ {
+ pCfgRet->sessFailCause = RNL_UNSPECIFIED;
+ return VOS_ERROR;
+ }
+
+ return VOS_OK;
+}
+
+
+extern INT32 printfSdapNewInstance(SdapGlobalDtat_t *pGlobalData);
+extern INT32 sdapInactiveDetectSet(UINT64 ueE1apId);
+
+INT32 sdapCreateNewInstance
+(
+ SdapGlobalDtat_t *pGlobalData,
+ UINT64 upE1apId,
+ upcTempSessInfo_t *pSessTempInfo,
+ sdapSessCfgRet_t *pCfgRet
+)
+{
+ int idx = 0;
+ UINT64 sessId = 0;
+
+ pGlobalData->upE1apId = upE1apId;
+ sessId = pSessTempInfo->pduSessId;
+ idx = pGlobalData->sessNum;
+
+ if(VOS_OK != sdapCreateDrbInfo(&pGlobalData->sdapInstance[sessId], pSessTempInfo, pCfgRet))
+ {
+ pCfgRet->sessFailCause = RNL_UNSPECIFIED;
+ return VOS_ERROR;
+ }
+
+ pGlobalData->sessId[idx] = sessId;
+ pGlobalData->sessNum++;
+
+ printfSdapNewInstance(pGlobalData);
+
+ return VOS_OK;
+}
+
+INT32 sdapCreateInstance(UINT64 upE1apId, upcTempSessInfo_t *pSessTempInfo, sdapSessCfgRet_t *pCfgRet)
+{
+ INT32 ret = VOS_OK;
+ UINT8 flag = 0;
+ SdapGlobalDtat_t *pGlobalData = NULL;
+
+ pGlobalData = sdapGetUeGlobalData(upE1apId, &flag);
+
+ if(NULL == pGlobalData)
+ {
+ pCfgRet->sessFailCause = RNL_UNSPECIFIED;
+ return VOS_ERROR;
+ }
+
+ /* 1、首次创建,初始化数据
+ 2、只针对E1接口BearerContextSetupReq*/
+ if(0 == flag)
+ {
+ VOS_MemZero(pGlobalData, sizeof(SdapGlobalDtat_t));
+ }
+
+ ret = sdapCreateNewInstance(pGlobalData, upE1apId, pSessTempInfo, pCfgRet);
+
+ return ret;
+}
+#endif
+
+#if CONCEPT('Delete Instance')
+INT32 sdapDeleteDrbInfo(SdapInstance_t *pSdapInstance, UINT8 drbId)
+{
+ int i = 0;
+
+ for(i = 0; i < pSdapInstance->drbNum; i++)
+ {
+ if(drbId == pSdapInstance->drbId[i])
+ {
+ sdapResortDrbId(pSdapInstance, i);
+ pSdapInstance->drbNum--;
+ VOS_MemZero(&pSdapInstance->drbCfg[drbId - 1], sizeof(SdapDrbCfg_t));
+ return VOS_OK;
+ }
+ }
+
+ return VOS_OK;
+}
+
+INT32 sdapDeleteDrbInfoOfInstance(UINT64 upE1apId, UINT8 sessId, UINT8 drbId)
+{
+ int i = 0;
+ UINT8 flag = 0;
+ SdapGlobalDtat_t *pGlobalData = NULL;
+
+ pGlobalData = sdapGetUeGlobalData(upE1apId, &flag);
+
+ /* 查找失败也认为是成功的 */
+ if(NULL == pGlobalData || 0 == flag)
+ {
+ return VOS_OK;
+ }
+
+ for(i = 0; i < pGlobalData->sessNum; i++)
+ {
+ if(sessId == pGlobalData->sessId[i])
+ {
+ sdapDeleteDrbInfo(&pGlobalData->sdapInstance[sessId], drbId);
+
+ return VOS_OK;
+ }
+ }
+
+ return VOS_OK;
+}
+
+INT32 sdapDeleteInstance(UINT64 upE1apId, UINT16 sessId)
+{
+ int i = 0;
+ UINT8 flag = 0;
+ SdapGlobalDtat_t *pGlobalData = NULL;
+
+ pGlobalData = sdapGetUeGlobalData(upE1apId, &flag);
+
+ /* 查找失败也认为是成功的 */
+ if(NULL == pGlobalData || 0 == flag)
+ {
+ return VOS_OK;
+ }
+
+ for(i = 0; i < pGlobalData->sessNum; i++)
+ {
+ if(sessId == pGlobalData->sessId[i])
+ {
+ sdapResortSessionId(pGlobalData, i);
+ pGlobalData->sessNum--;
+ VOS_MemZero(&pGlobalData->sdapInstance[sessId], sizeof(SdapInstance_t));
+ return VOS_OK;
+ }
+ }
+
+ return VOS_OK;
+}
+#endif
+