b01a7510dd38e10a5be18cb60c42225e7b539ef6
[scp/ocu/5gnr.git] / Cu / CuUp / Sdap / sdap / Src / sdapCore.c
1 /******************************************************************************
2 ###############################################################################
3 #   Copyright (c) [2017-2020] [ICT/CAS]                                        #
4 #   Licensed under the ORAN Software License v1.0 (License)             #
5 ###############################################################################
6 ******************************************************************************/
7 #include "sdapCore.h"
8
9 SdapGlobalDtat_t        s_SdapGlobalData[UPC_MAX_UE_NUM] = {{0}};
10
11 void sdapResortDrbId(SdapInstance_t *pSdapInstance, int idx)
12 {
13         int i = 0;
14         int j = 0;
15
16         for(i = 0; i < pSdapInstance->drbNum; i++)
17         {
18                 if(i == idx)
19                 {
20                         continue;
21                 }
22
23                 pSdapInstance->drbId[j] = pSdapInstance->drbId[i];
24                 j++;
25         }
26 }
27
28 void sdapResortSessionId(SdapGlobalDtat_t       *pGlobalData, int idx)
29 {
30         int i = 0;
31         int j = 0;
32         
33         for(i = 0; i < pGlobalData->sessNum; i++)
34         {
35                 if(i == idx)
36                 {
37                         continue;
38                 }
39
40                 pGlobalData->sessId[j] = pGlobalData->sessId[i];
41                 j++;
42         }
43 }
44
45 SdapGlobalDtat_t* sdapGetUeGlobalData(UINT64    upE1apId, UINT8 *flag)
46 {
47         int i = 0;
48
49         for(i = 0; i < UPC_MAX_UE_NUM; i++)
50         {
51                 if(upE1apId == s_SdapGlobalData[i].upE1apId)
52                 {
53                         *flag = 1;
54                         return &s_SdapGlobalData[i];
55                 }
56         }
57
58         for(i = 0; i < UPC_MAX_UE_NUM; i++)
59         {
60                 if(0 == s_SdapGlobalData[i].upE1apId)
61                 {
62                         *flag = 0;
63                         return &s_SdapGlobalData[i];
64                 }
65         }
66
67         return NULL;
68 }
69 #if CONCEPT('Create Instance')
70 INT32 sdapCreateQosInfo(SdapDrbCfg_t *pDrbCfg, upcTempDrbInfo_t *pTempDrb, SdapDrbCfgRet_t *pDrbCfgRet)
71 {
72         int i = 0;
73         INT64   qosFlowId = 0;
74         upcTempQosInfo_t *pTempQos;
75
76         for(i = 0; i < pTempDrb->qosSetupNum; i++)
77         {
78                 pTempQos = &pTempDrb->pQosSetupList[i];
79
80                 if((NULL == pTempQos) || (TRUE != pTempQos->qosSetupAllowed))
81                 {
82                         continue;
83                 }
84                 
85                 qosFlowId = pTempQos->qosFlowId;
86                 pDrbCfg->qfi[pDrbCfg->qfiNum] = qosFlowId;              
87                 pDrbCfg->qosFlowInfo[qosFlowId].qosFlowLevelQosPar = pTempQos->qosPara;
88                 if(pTempQos->qosMapFlag)
89                 {
90                         pDrbCfg->qosFlowInfo[qosFlowId].qosFlowMapInd = pTempQos->qosFlowMapInd;
91                 }
92                 pDrbCfg->qfiNum++;
93
94                 pDrbCfgRet->Qfi[pDrbCfgRet->QosNum] = qosFlowId;
95                 pDrbCfgRet->QosNum++;
96         }
97
98         if(0 == pDrbCfg->qfiNum)
99         {
100                 return VOS_ERROR;
101         }
102         
103         return VOS_OK;
104 }
105
106 INT32 sdapCreateDrbInfo(SdapInstance_t *pInstance, upcTempSessInfo_t *pSessTempInfo, sdapSessCfgRet_t *pCfgRet)
107 {
108         int i = 0;
109         UINT64  drbId = 0;
110
111         upcTempDrbInfo_t        *pTempDrb = NULL;
112
113         pInstance->sessId = pSessTempInfo->pduSessId;
114         pCfgRet->sessId = pInstance->sessId;
115
116         for(i = 0; i < pSessTempInfo->drbSetupNum; i++)
117         {
118                 pTempDrb = &pSessTempInfo->pTempDrbSetupList[i];
119
120                 if((NULL == pTempDrb) || (TRUE != pTempDrb->drbSetupAllowed))
121                 {
122                         continue;
123                 }
124                 
125                 drbId = pTempDrb->drbId;
126
127                 if(VOS_OK != sdapCreateQosInfo(&pInstance->drbCfg[drbId - 1], pTempDrb, &pCfgRet->actDrbCfg[drbId - 1]))
128                 {
129                         pCfgRet->failDrbId[pCfgRet->failDrbNum] = drbId;
130                         pCfgRet->failDrbNum++;
131                         pCfgRet->cause[drbId - 1] = RNL_UNSPECIFIED;
132                         continue;
133                 }
134                 pCfgRet->actDrbId[pCfgRet->actDrbNum] = drbId;
135                 pCfgRet->actDrbCfg[drbId - 1].drbId = drbId;
136                 pCfgRet->actDrbNum++;
137
138                 VOS_MemCpy(&pInstance->drbCfg[drbId - 1].sdapCfg, &pTempDrb->sdapConfig, sizeof(SdapCfg_t));
139
140                 pInstance->drbCfg[drbId - 1].drbId = drbId;     
141                 pInstance->drbId[pInstance->drbNum] = drbId;
142                 pInstance->drbNum++;
143         }
144
145         if(0 == pCfgRet->actDrbNum)
146         {       
147                 pCfgRet->sessFailCause = RNL_UNSPECIFIED;
148                 return VOS_ERROR;
149         }
150
151         return VOS_OK;
152 }
153
154
155 extern INT32 printfSdapNewInstance(SdapGlobalDtat_t *pGlobalData);
156 extern INT32 sdapInactiveDetectSet(UINT64 ueE1apId);
157
158 INT32 sdapCreateNewInstance
159 (
160         SdapGlobalDtat_t        *pGlobalData, 
161         UINT64  upE1apId, 
162         upcTempSessInfo_t *pSessTempInfo, 
163         sdapSessCfgRet_t *pCfgRet
164 )
165 {
166         int idx = 0;
167         UINT64  sessId = 0;
168         
169         pGlobalData->upE1apId = upE1apId;
170         sessId = pSessTempInfo->pduSessId;
171         idx = pGlobalData->sessNum;
172
173         if(VOS_OK != sdapCreateDrbInfo(&pGlobalData->sdapInstance[sessId], pSessTempInfo, pCfgRet))
174         {
175                 pCfgRet->sessFailCause = RNL_UNSPECIFIED;
176                 return VOS_ERROR;
177         }
178
179         pGlobalData->sessId[idx] = sessId;
180         pGlobalData->sessNum++;
181
182         printfSdapNewInstance(pGlobalData); 
183         
184         return VOS_OK;
185 }
186
187 INT32 sdapCreateInstance(UINT64 upE1apId, upcTempSessInfo_t *pSessTempInfo, sdapSessCfgRet_t *pCfgRet)
188 {
189         INT32   ret = VOS_OK;
190         UINT8   flag = 0;
191         SdapGlobalDtat_t        *pGlobalData = NULL;
192
193         pGlobalData = sdapGetUeGlobalData(upE1apId, &flag);
194
195         if(NULL == pGlobalData)
196         {
197                 pCfgRet->sessFailCause = RNL_UNSPECIFIED;
198                 return VOS_ERROR;
199         }
200
201         /* 1、首次创建,初始化数据
202            2、只针对E1接口BearerContextSetupReq*/
203         if(0 == flag)
204         {
205                 VOS_MemZero(pGlobalData, sizeof(SdapGlobalDtat_t));
206         }
207
208         ret = sdapCreateNewInstance(pGlobalData, upE1apId, pSessTempInfo, pCfgRet);
209
210         return ret;
211 }
212 #endif
213
214 #if CONCEPT('Delete Instance')
215 INT32 sdapDeleteDrbInfo(SdapInstance_t *pSdapInstance, UINT8 drbId)
216 {
217         int i = 0;
218
219         for(i = 0; i < pSdapInstance->drbNum; i++)
220         {
221                 if(drbId == pSdapInstance->drbId[i])
222                 {
223                         sdapResortDrbId(pSdapInstance, i);
224                         pSdapInstance->drbNum--;
225                         VOS_MemZero(&pSdapInstance->drbCfg[drbId - 1], sizeof(SdapDrbCfg_t));
226                         return VOS_OK;
227                 }
228         }
229
230         return VOS_OK;
231 }
232
233 INT32 sdapDeleteDrbInfoOfInstance(UINT64 upE1apId, UINT8 sessId, UINT8 drbId)
234 {
235         int i = 0;
236         UINT8   flag = 0;
237         SdapGlobalDtat_t        *pGlobalData = NULL;
238
239         pGlobalData = sdapGetUeGlobalData(upE1apId, &flag);
240
241         /* 查找失败也认为是成功的 */
242         if(NULL == pGlobalData || 0 == flag)
243         {
244                 return VOS_OK;
245         }
246
247         for(i = 0; i < pGlobalData->sessNum; i++)
248         {
249                 if(sessId == pGlobalData->sessId[i])
250                 {
251                         sdapDeleteDrbInfo(&pGlobalData->sdapInstance[sessId], drbId);
252                 
253                         return VOS_OK;
254                 }
255         }
256
257         return VOS_OK;
258 }
259
260 INT32 sdapDeleteInstance(UINT64 upE1apId, UINT16 sessId)
261 {
262         int i = 0;
263         UINT8   flag = 0;
264         SdapGlobalDtat_t        *pGlobalData = NULL;
265
266         pGlobalData = sdapGetUeGlobalData(upE1apId, &flag);
267
268         /* 查找失败也认为是成功的 */
269         if(NULL == pGlobalData || 0 == flag)
270         {
271                 return VOS_OK;
272         }
273
274         for(i = 0; i < pGlobalData->sessNum; i++)
275         {
276                 if(sessId == pGlobalData->sessId[i])
277                 {
278                         sdapResortSessionId(pGlobalData, i);
279                         pGlobalData->sessNum--;
280                         VOS_MemZero(&pGlobalData->sdapInstance[sessId], sizeof(SdapInstance_t));
281                         return VOS_OK;
282                 }
283         }
284
285         return VOS_OK;
286 }
287 #endif
288