O-CU-UP
[scp/ocu/5gnr.git] / Cu / CuUp / Sdap / sdap / Src / sdapCore.c
diff --git a/Cu/CuUp/Sdap/sdap/Src/sdapCore.c b/Cu/CuUp/Sdap/sdap/Src/sdapCore.c
new file mode 100644 (file)
index 0000000..b01a751
--- /dev/null
@@ -0,0 +1,288 @@
+/******************************************************************************
+###############################################################################
+#   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
+