1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2020] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
18 /* Utility definitions to be used in du app */
19 #include "common_def.h"
23 #include "du_app_mac_inf.h"
24 #include "du_app_rlc_inf.h"
29 /* Spec Ref-38.214-Table 5.1.2.1-1 */
30 uint8_t slivCfgIdxTable[MAX_SLIV_CONFIG_IDX][3] = {
32 { 0, 1, 0 },/* index0 */
33 { 0, 2, 14 },/* index1 */
34 { 0, 3, 28 },/* index2 */
35 { 0, 4, 42 },/* index3 */
36 { 0, 5, 56 },/* index4 */
37 { 0, 6, 70 },/* index5 */
38 { 0, 7, 84 },/* index6 */
39 { 0, 8, 98 },/* index7 */
40 { 0, 9, 97 },/* index8 */
41 { 0, 10, 83 },/* index9 */
42 { 0, 11, 69 },/* index10 */
43 { 0, 12, 55 },/* index11 */
44 { 0, 13, 41 },/* index12 */
45 { 0, 14, 27 },/* index13 */
46 { 1, 1, 1 },/* index14 */
47 { 1, 2, 15 },/* index15 */
48 { 1, 3, 29 },/* index16 */
49 { 1, 4, 43 },/* index17 */
50 { 1, 5, 57 },/* index18 */
51 { 1, 6, 71 },/* index19 */
52 { 1, 7, 85 },/* index20 */
53 { 1, 8, 99 },/* index21 */
54 { 1, 9, 96 },/* index22 */
55 { 1, 10, 82 },/* index23 */
56 { 1, 11, 68 },/* index24 */
57 { 1, 12, 54 },/* index25 */
58 { 1, 13, 40 },/* index26 */
59 { 2, 1, 2 },/* index27 */
60 { 2, 2, 16 },/* index28 */
61 { 2, 3, 30 },/* index29 */
62 { 2, 4, 44 },/* index30 */
63 { 2, 5, 58 },/* index31 */
64 { 2, 6, 72 },/* index32 */
65 { 2, 7, 86 },/* index33 */
66 { 2, 8, 100},/* index34 */
67 { 2, 9, 95 },/* index35 */
68 { 2, 10, 81 },/* index36 */
69 { 2, 11, 67 },/* index37 */
70 { 2, 12, 53 },/* index38 */
71 { 3, 1, 3 },/* index39 */
72 { 3, 2, 17 },/* index40 */
73 { 3, 3, 31 },/* index41 */
74 { 3, 4, 45 },/* index42 */
75 { 3, 5, 59 },/* index43 */
76 { 3, 6, 73 },/* index44 */
77 { 3, 7, 87 },/* index45 */
78 { 3, 8, 101},/* index46 */
79 { 3, 9, 94 },/* index47 */
80 { 3, 10, 80 },/* index48 */
81 { 3, 11, 66 },/* index49 */
82 { 4, 1, 4 },/* index50 */
83 { 4, 2, 18 },/* index51 */
84 { 4, 3, 32 },/* index52 */
85 { 4, 4, 46 },/* index53 */
86 { 4, 5, 60 },/* index54 */
87 { 4, 6, 74 },/* index55 */
88 { 4, 7, 88 },/* index56 */
89 { 4, 8, 102},/* index57 */
90 { 4, 9, 93 },/* index58 */
91 { 4, 10, 79 },/* index59 */
92 { 5, 1, 5 },/* index60 */
93 { 5, 2, 19 },/* index61 */
94 { 5, 3, 33 },/* index62 */
95 { 5, 4, 47 },/* index63 */
96 { 5, 5, 61 },/* index64 */
97 { 5, 6, 75 },/* index65 */
98 { 5, 7, 89 },/* index66 */
99 { 5, 8, 103},/* index67 */
100 { 5, 9, 92 },/* index68 */
101 { 6, 1, 6 },/* index69 */
102 { 6, 2, 20 },/* index70 */
103 { 6, 3, 34 },/* index71 */
104 { 6, 4, 48 },/* index72 */
105 { 6, 5, 62 },/* index73 */
106 { 6, 6, 76 },/* index74 */
107 { 6, 7, 90 },/* index75 */
108 { 6, 8, 104},/* index76 */
109 { 7, 1, 7 },/* index77 */
110 { 7, 2, 21 },/* index78 */
111 { 7, 3, 35 },/* index79 */
112 { 7, 4, 49 },/* index80 */
113 { 7, 5, 63 },/* index81 */
114 { 7, 6, 77 },/* index82 */
115 { 7, 7, 91 },/* index83 */
116 { 8, 1, 8 },/* index84 */
117 { 8, 2, 22 },/* index85 */
118 { 8, 3, 36 },/* index86 */
119 { 8, 4, 50 },/* index87 */
120 { 8, 5, 64 },/* index88 */
121 { 8, 6, 78 },/* index89 */
122 { 9, 1, 9 },/* index90 */
123 { 9, 2, 23 },/* index91 */
124 { 9, 3, 37 },/* index92 */
125 { 9, 4, 51 },/* index93 */
126 { 9, 5, 65 },/* index94 */
127 { 10, 1, 10 },/* index95 */
128 { 10, 2, 24 },/* index96 */
129 { 10, 3, 38 },/* index97 */
130 { 10, 4, 52 },/* index98 */
131 { 11, 1, 11 },/* index99 */
132 { 11, 2, 25 },/* index100*/
133 { 11, 3, 39 },/* index101*/
134 { 12, 1, 12 },/* index102*/
135 { 12, 2, 26 },/* index103*/
136 { 13, 1, 13 } /* index104*/
139 /*******************************************************************
141 * @brief Function to fill the start Symbol and Symbol Len from the
142 * sliv Config Idx Table
146 * Function : fillStartSymbolAndLen
148 * Functionality: Function to fill the start Symbol and Symbol Len
149 * from the sliv Config Idx Table
151 * @params[in] startSymbolIdx pointer,
156 * ****************************************************************/
157 void fillStartSymbolAndLen(uint8_t numRsrcAlloc, PdschConfig *pdschCfg, PuschCfg *puschCfg)
159 uint8_t slivIdx, timeDomIdx;
161 for(timeDomIdx = 0; timeDomIdx < numRsrcAlloc; timeDomIdx++)
163 for(slivIdx = 0; slivIdx < MAX_SLIV_CONFIG_IDX; slivIdx++)
165 if(pdschCfg)/* PDSCH Config */
167 if(pdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbolAndLength ==\
168 slivCfgIdxTable[slivIdx][2])
170 pdschCfg->timeDomRsrcAllociList[timeDomIdx].startSymbol = slivCfgIdxTable[slivIdx][0];
171 pdschCfg->timeDomRsrcAllociList[timeDomIdx].symbolLength = slivCfgIdxTable[slivIdx][1];
175 if(puschCfg)/* PUSCH Config */
177 if(puschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbolAndLength ==\
178 slivCfgIdxTable[slivIdx][2])
180 puschCfg->timeDomRsrcAllocList[timeDomIdx].startSymbol = slivCfgIdxTable[slivIdx][0];
181 puschCfg->timeDomRsrcAllocList[timeDomIdx].symbolLength = slivCfgIdxTable[slivIdx][1];
190 /*******************************************************************
191 * @brief Function to add a node to a linked list
195 * Function: duAddNodeToLList
197 * This function adds a new node to the linked list
199 * @param[in] Pointer to the list
200 * Pointer to node to be added
201 * Pointer to current node
204 *******************************************************************/
205 uint8_t duAddNodeToLList(CmLListCp *llist, void *blockToAdd, CmLList *currNode)
207 CmLList *newNode = NULLP;
209 DU_ALLOC(newNode, sizeof(CmLList));
212 newNode->node = (PTR)blockToAdd;
214 if(currNode == NULLP)
215 cmLListAdd2Tail(llist, newNode);
218 llist->crnt = currNode;
219 cmLListInsAfterCrnt(llist, newNode);
226 /*******************************************************************
227 * @brief Function to delete a node from linked list
231 * Function: duDelNodeFromLList
233 * This function deletes a node from the linked list
235 * @param[in] Pointer to the list
236 * Pointer to node to be deleted
237 * @return Pointer to the deleted node
238 *******************************************************************/
240 uint8_t duDelNodeFromLList(CmLListCp *llist, CmLList *node)
242 node = cmLListDelFrm(llist, node);
243 DU_FREE(node, sizeof(CmLList));
248 /*******************************************************************
249 * @brief Handle the PageUe List
253 * Function : handlePageUeLL
255 * Functionality: Handling the (SEARCH,CREATE,DELETE) PageUeList
257 * @params[in] DuPagingMsg *pagingParam, CmLListCp *pageUeLL, ActionTypeLL
260 * @return DuPagUeRecord
262 * ****************************************************************/
263 DuPagUeRecord* handlePageUeLL(uint16_t pagUeId, uint64_t sTmsi, CmLListCp *pageUeLL, ActionTypeLL action)
265 CmLList *node = NULLP;
266 DuPagUeRecord *ueRecord = NULLP;
269 if((pageUeLL == NULLP) ||
270 ((pageUeLL->first == NULLP) && (action != CREATE)))
272 DU_LOG("\nERROR --> DU APP: UE Page Record LL is empty");
275 node = pageUeLL->first;
279 ueRecord = (DuPagUeRecord *)node->node;
282 DU_LOG("\n INFO --> DU APP ueId:%d, sTmsi:%lu",\
283 ueRecord->pagUeId, ueRecord->sTmsi);
285 else if(ueRecord && (ueRecord->pagUeId == pagUeId &&
286 ueRecord->sTmsi == sTmsi))
310 /*Need to add a new node for this LC*/
312 /*List is empty; Initialize the LL ControlPointer*/
313 if(pageUeLL->count == 0)
315 cmLListInit(pageUeLL);
319 /*Allocate the List*/
320 DU_ALLOC(ueRecord, sizeof(DuPagUeRecord));
323 ueRecord->pagUeId = pagUeId;
324 ueRecord->sTmsi = sTmsi;
328 DU_LOG("\nERROR --> DU APP : Allocation of UE Record failed,ueId:%d",pagUeId);
332 if(duAddNodeToLList(pageUeLL, ueRecord, NULLP) == RFAILED)
334 DU_LOG("\nERROR --> DU APP : failed to Add Ue Record Node,ueId:%d",pagUeId);
335 DU_FREE(ueRecord, sizeof(DuPagUeRecord));
342 if(!found || ueRecord == NULLP)
344 DU_LOG("\nERROR --> DU APP: UeId:%d not found; thus Deletion unsuccessful",pagUeId);
348 if(duDelNodeFromLList(pageUeLL, node) == ROK)
349 DU_FREE(ueRecord, sizeof(DuPagUeRecord));
351 DU_LOG("\nDEBUG --> DU APP: UeId:%d Deleted successfully",pagUeId);
362 DU_LOG("\nERROR --> DU APP: Incorrect ActionType:%d on UeRecord",action);
368 /*******************************************************************
369 * @brief Handle the PageInfo List
373 * Function : handlePageInfoLL
375 * Functionality: Handling the (SEARCH,CREATE,DELETE) PageInfoList
377 * @params[in] uint8_t i_s, CmLListCp *pagInfoLL, ActionTypeLL action
379 * @return DuPagUeList
381 * ****************************************************************/
382 DuPagUeList* handlePageInfoLL(uint16_t pf, uint8_t i_s, CmLListCp *pagInfoLL, ActionTypeLL action)
384 CmLList *node = NULLP, *next = NULLP;
385 DuPagUeList *pagInfo = NULLP;
388 if((pagInfoLL == NULLP) ||
389 ((pagInfoLL->first == NULLP) && (action != CREATE)))
391 DU_LOG("\nERROR --> DU APP: PagInfo LL is empty");
394 node = pagInfoLL->first;
399 pagInfo = (DuPagUeList *)node->node;
402 DU_LOG("\n INFO --> DU APP: Paging Index (i_s):%d",pagInfo->i_s);
403 handlePageUeLL(NULLD, NULLD, &(pagInfo->pagUeList), PRINT);
405 else if(action == TRAVERSE_ALL)
409 else if(pagInfo->i_s == i_s)
433 /*Need to add a new node for this LC*/
435 /*List is empty; Initialize the LL ControlPointer*/
436 if(pagInfoLL->count == 0)
438 cmLListInit(pagInfoLL);
442 /*Allocate the List*/
443 DU_ALLOC(pagInfo, sizeof(DuPagUeList));
450 DU_LOG("\nERROR --> DU APP : Allocation of List failed,i_s:%d",i_s);
454 if(duAddNodeToLList(pagInfoLL, pagInfo, NULLP) == RFAILED)
456 DU_LOG("\nERROR --> DU APP : failed to Add Node,i_s:%d",i_s);
457 DU_FREE(pagInfo, sizeof(DuPagUeList));
464 if(!found || pagInfo == NULLP)
466 DU_LOG("\nERROR --> DU APP: i_s:%d not found; thus Deletion unsuccessful",i_s);
470 if(duDelNodeFromLList(pagInfoLL, node) == ROK)
471 DU_FREE(pagInfo, sizeof(DuPagUeList));
473 DU_LOG("\nDEBUG --> DU APP: i_s:%d Deleted successfully",i_s);
484 DU_LOG("\nERROR --> DU APP: Incorrect ActionType:%d on PageInfo List",action);
490 /*******************************************************************
491 * @brief Find the PageInfo List from HashMap
495 * Function : findPagingInfoFromMap
497 * Functionality: Search for the PageInfoList for a PF from HashMap
499 * @params[in] uint16_t pf, CmHashListCp *pagingInfoMap
501 * @return DuPagInfoList
503 * ****************************************************************/
504 DuPagInfoList* findPagingInfoFromMap(uint16_t pf, CmHashListCp *pagingInfoMap)
506 DuPagInfoList *pagInfoLL = NULLP;
508 cmHashListFind(pagingInfoMap, (uint8_t *)&(pf), sizeof(uint16_t), 0, (PTR *)&pagInfoLL);
513 /*Below function for printing will be used in future so disabling it for now*/
515 /*******************************************************************
516 * @brief Print the Page Info List and UE Records
520 * Function : printPageList
522 * Functionality: Print the Page Info List and UE Records
524 * @params[in] CmHashListCp *pagingInfoMap
528 * ****************************************************************/
529 void printPageList(CmHashListCp *pagingInfoMap)
532 DuPagInfoList *pagInfoLLFromPF = NULLP, *prevPageInfoLL = NULLP;
536 ret = cmHashListGetNext(pagingInfoMap, (PTR)prevPageInfoLL, (PTR *)&pagInfoLLFromPF);
539 DU_LOG("\nDEBUG --> DUAPP: Page List for PF:%d",pagInfoLLFromPF->pf);
540 handlePageInfoLL(NULLD, NULLD, &(pagInfoLLFromPF->pagInfoList), PRINT);
541 prevPageInfoLL = pagInfoLLFromPF;
548 /**********************************************************************
550 **********************************************************************/