1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [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 *******************************************************************************/
19 /* This file contains F1AP message handler functions */
20 #include "common_def.h"
21 #include "OCTET_STRING.h"
22 #include "BIT_STRING.h"
23 #include "odu_common_codec.h"
24 #include "cu_stub_sctp.h"
25 #include "cu_f1ap_msg_hdl.h"
26 /*header files needed for Ue Context Setup */
27 #include<ProtocolIE-Field.h>
28 #include "ProtocolExtensionField.h"
30 #include "ProtocolExtensionContainer.h"
31 #include "CellGroupConfigRrc.h"
32 #include "MAC-CellGroupConfig.h"
33 #include "SchedulingRequestConfig.h"
34 #include "SchedulingRequestToAddMod.h"
35 #include "BSR-Config.h"
36 #include "TAG-Config.h"
38 #include "PHR-Config.h"
39 #include "RLC-Config.h"
40 #include "UL-AM-RLC.h"
41 #include "DL-AM-RLC.h"
42 #include "LogicalChannelConfig.h"
43 #include "RLC-BearerConfig.h"
44 #include "PhysicalCellGroupConfig.h"
45 #include "SpCellConfig.h"
46 #include "ServingCellConfig.h"
47 #include "ControlResourceSet.h"
48 #include "SearchSpace.h"
49 #include "PDCCH-Config.h"
50 #include "PDSCH-TimeDomainResourceAllocation.h"
51 #include "PDSCH-TimeDomainResourceAllocationList.h"
52 #include "DMRS-DownlinkConfig.h"
53 #include "PDSCH-Config.h"
54 #include "BWP-DownlinkDedicated.h"
55 #include "PUSCH-TimeDomainResourceAllocation.h"
56 #include "PUSCH-TimeDomainResourceAllocationList.h"
57 #include "DMRS-UplinkConfig.h"
58 #include "PUSCH-Config.h"
59 #include "SRS-ResourceId.h"
60 #include "SRS-Resource.h"
61 #include "SRS-ResourceSet.h"
62 #include "SRS-Config.h"
63 #include "BWP-UplinkDedicated.h"
64 #include "PUSCH-ServingCellConfig.h"
65 #include "UplinkConfig.h"
66 #include "PDSCH-ServingCellConfig.h"
68 /* MACRO for CUtoDURRCInformation */
70 #define FREQ_DOM_RSRC_SIZE 6
71 #define CORESET0_END_PRB 48
72 #define CORESET1_NUM_PRB 24
73 #define PDCCH_CTRL_RSRC_SET_ONE_ID 1
74 #define PDCCH_CTRL_RSRC_SET_ONE_DURATION 2 /* Duration for control resource set id i */
75 #define PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY 1 /* Precoded granularity */
76 #define PDCCH_SRCH_SPC_TWO_ID 2
78 #define SCRAMBLING_ID NR_PCI
79 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
80 #define PDCCH_SYMBOL_WITHIN_SLOT 128 /* Symbol within Slot Value */
81 #define PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE 7 /* Num of candidate at aggregation level 1 */
82 #define PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE 7 /* Num of candidate at aggregation level 2 */
83 #define PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE 4 /* Num of candidate at aggregation level 4 */
84 #define PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE 2 /* Num of candidate at aggregation level 8 */
85 #define PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE 1 /* Num of candidate at aggregation level 16 */
86 #define PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT 0 /* format 0-0 and 1-0 */
87 #define PDCCH_SERACH_SPACE_DCI_FORMAT 0
89 /* MACRO Ddefine for PDSCH Configuration */
91 #define PDSCH_RES_ALLOC_TYPE 1 /* Resource allocation type */
92 #define PDSCH_MAX_CODEWORD_SCH_BY_DCI 0 /* Max num of codewords scheduled by DCI */
93 #define PDSCH_RBG_SIZE 0 /* 0: config1 */
94 #define PDSCH_NUM_HARQ_PROC 5
95 #define PDSCH_MAPPING_TYPE_A 0
96 #define PDSCH_MAPPING_TYPE_B 1
98 /* MACRO Define for PUSCH Configuration */
101 #define PUSCH_MSG3_DELTA_PREAMBLE 0
102 #define PUSCH_P0_NOMINAL_WITH_GRANT -70
103 #define PUSCH_TRANSFORM_PRECODER 1 /* 1: Disabled */
104 #define PUSCH_MAX_MIMO_LAYERS 1
105 #define PUSCH_PROCESS_TYPE2_ENABLED false
106 #define PUSCH_MAPPING_TYPE_A 0
107 #define PUSCH_MAPPING_TYPE_B 1
109 /* MACRO defines for SRC config */
110 #define SRS_RSRC_ID 1
111 #define SRS_RSET_ID 1
112 #define SRS_COMB_OFFSET_N2 0
113 #define SRS_CYCLIC_SHIFT_N2 0
114 #define SRS_FREQ_DOM_POS 0
115 #define SRS_FREQ_DOM_SHIFT 0
120 #define APERIODIC_SRS_RESRC_TRIGGER 1
122 /* Macro definitions for DUtoCuRrcContainer */
123 #define CELL_GRP_ID 1
125 #define SR_PROHIBIT_TMR 5
126 #define SR_TRANS_MAX 2
127 #define PERIODIC_BSR_TMR 2
128 #define RETX_BSR_TMR 5
129 #define SR_DELAY_TMR 6
131 #define TIME_ALIGNMENT_TMR 7
132 #define PHR_PERIODIC_TMR 7
133 #define PHR_PROHIBHIT_TMR 0
134 #define PHR_PWR_FACTOR_CHANGE 3
135 #define PHR_MODE_OTHER_CG 0
138 #define SN_FIELD_LEN 0
139 #define T_POLL_RETRANSMIT 8
142 #define MAX_RETX_THRESHOLD 5
143 #define T_REASSEMBLY 8
144 #define T_STATUS_PROHIBHIT 7
145 #define MAC_LC_PRIORITY 1
146 #define PRIORTISIED_BIT_RATE 15
147 #define BUCKET_SIZE_DURATION 5
150 #define PDSCH_HARQ_ACK_CODEBOOK 1
151 #define SERV_CELL_IDX 0
152 #define RLM_SYNC_OUT_SYNC_THRESHOLD 0
153 #define ACTIVE_DL_BWP_ID 0
154 #define ACTIVE_UL_BWP_ID 0
155 #define SCRAMBLING_ID NR_PCI
156 #define DMRS_ADDITIONAL_POS 0 /* DMRS Additional poistion */
157 #define RES_ALLOC_TYPE 1 /* Resource allocation type */
159 /*******************************************************************
161 * @brief Sends F1 msg over SCTP
165 * Function : SendF1APMsg
167 * Functionality: Sends F1 msg over SCTP
169 * @params[in] Region region
171 * @return ROK - success
174 * ****************************************************************/
175 S16 SendF1APMsg(Region region, Pool pool)
177 Buffer *mBuf = NULLP;
179 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
181 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
183 ODU_PRINT_MSG(mBuf, 0,0);
185 if(sctpSend(mBuf) != ROK)
187 DU_LOG("\nF1AP : SCTP Send failed");
188 ODU_PUT_MSG_BUF(mBuf);
194 DU_LOG("\nF1AP : ODU_ADD_POST_MSG_MULT failed");
195 ODU_PUT_MSG_BUF(mBuf);
198 ODU_PUT_MSG_BUF(mBuf);
202 DU_LOG("\nF1AP : Failed to allocate memory");
209 /*******************************************************************
211 * @brief Builds NRCell ID
215 * Function : BuildNrCellId
217 * Functionality: Building the NR Cell ID
219 * @params[in] BIT_STRING_t *nrcell
220 * @return ROK - success
223 * ****************************************************************/
225 S16 BuildNrCellId(BIT_STRING_t *nrcell)
227 memset(nrcell->buf, 0, nrcell->size);
229 nrcell->bits_unused = 4;
230 nrcell->size = 5 * sizeof(uint8_t);
234 /********************************************************************
236 * @brief Builds and sends the F1SetupResponse
240 * Function : BuildAndSendF1SetupRsp
242 * Functionality: Constructs the F1SetupResponse message and sends
243 * it back to the DU through SCTP.
245 * @params[in] void **buf,Buffer to which encoded pattern is written into
246 * @params[in] int *size,size of buffer
248 * @return ROK - success
251 * ****************************************************************/
252 S16 BuildAndSendF1SetupRsp()
255 uint8_t elementCnt,cellCnt;
256 F1AP_PDU_t *f1apMsg = NULL;
257 F1SetupResponse_t *f1SetupRsp;
258 GNB_CU_Name_t *cuName;
259 Cells_to_be_Activated_List_t *cellToActivate;
260 RRC_Version_t *rrcVer;
261 asn_enc_rval_t encRetVal;
262 DU_LOG("\nF1AP : Building F1 Setup Response\n");
264 /* Allocate the memory for F1SetupRequest_t */
265 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
268 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
271 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
273 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
274 if(f1apMsg->choice.successfulOutcome == NULLP)
276 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
277 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
281 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
282 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
283 f1apMsg->choice.successfulOutcome->value.present = \
284 SuccessfulOutcome__value_PR_F1SetupResponse;
285 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
288 f1SetupRsp->protocolIEs.list.count = elementCnt;
289 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
291 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
292 elementCnt * sizeof(F1SetupResponseIEs_t *));
293 if(f1SetupRsp->protocolIEs.list.array == NULLP)
295 DU_LOG("\nF1AP : Memory allocation for F1ResponseIEs failed");
296 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
297 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
301 for(idx=0; idx<elementCnt; idx++)
303 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
304 sizeof(F1SetupResponseIEs_t));
305 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
307 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
308 elementCnt * sizeof(F1SetupResponseIEs_t *));
309 CU_FREE(f1apMsg->choice.successfulOutcome, \
310 sizeof(SuccessfulOutcome_t));
311 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
318 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
319 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
320 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
321 F1SetupResponseIEs__value_PR_TransactionID;
322 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
327 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
328 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
329 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
330 F1SetupResponseIEs__value_PR_GNB_CU_Name;
331 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
332 cuName->size = sizeof(cuCfgParams.cuName);
334 CU_ALLOC(cuName->buf, sizeof(cuName->size));
335 if(cuName->buf == NULLP)
337 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
339 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
340 sizeof(F1SetupResponseIEs_t));
342 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
343 elementCnt * sizeof(F1SetupResponseIEs_t *));
344 CU_FREE(f1apMsg->choice.successfulOutcome,\
345 sizeof(SuccessfulOutcome_t));
346 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
349 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
351 /*Cells to be activated list*/
353 f1SetupRsp->protocolIEs.list.array[idx]->id = \
354 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
355 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
356 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
357 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
358 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
359 Cells_to_be_Activated_List;
361 cellToActivate->list.count = cellCnt;
362 cellToActivate->list.size = \
363 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
364 CU_ALLOC(cellToActivate->list.array,\
365 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
366 if(cellToActivate->list.array == NULLP)
368 CU_FREE(cuName->buf, sizeof(cuName->size));
369 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
371 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
372 sizeof(F1SetupResponseIEs_t));
374 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
375 elementCnt * sizeof(F1SetupResponseIEs_t *));
376 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
377 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
380 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
382 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
383 if(cellToActivate->list.array[ieIdx] == NULLP)
385 CU_FREE(cellToActivate->list.array,\
386 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
387 CU_FREE(cuName->buf, sizeof(cuName->size));
388 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
390 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
391 sizeof(F1SetupResponseIEs_t));
393 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
394 elementCnt * sizeof(F1SetupResponseIEs_t *));
395 CU_FREE(f1apMsg->choice.successfulOutcome, \
396 sizeof(SuccessfulOutcome_t));
397 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
401 cellToActivate->list.array[0]->id = \
402 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
403 cellToActivate->list.array[0]->criticality = Criticality_ignore;
404 cellToActivate->list.array[0]->value.present = \
405 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
406 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
407 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
408 CU_ALLOC(cellToActivate->list.array[0]->\
409 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
411 if(cellToActivate->list.array[0]->value.choice.\
412 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
415 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
417 CU_FREE(cellToActivate->list.array[ieIdx],\
418 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
421 CU_FREE(cellToActivate->list.array,\
422 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
423 CU_FREE(cuName->buf, sizeof(cuName->size));
424 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
426 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
427 sizeof(F1SetupResponseIEs_t));
429 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
430 elementCnt * sizeof(F1SetupResponseIEs_t *));
431 CU_FREE(f1apMsg->choice.successfulOutcome, \
432 sizeof(SuccessfulOutcome_t));
433 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
436 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
437 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
438 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
439 nRCGI.nRCellIdentity.size = 5;
440 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
441 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
443 if(cellToActivate->list.array[0]->value.choice.\
444 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
446 CU_FREE(cellToActivate->list.array[0]->\
447 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
449 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
451 CU_FREE(cellToActivate->list.array[ieIdx],\
452 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
455 CU_FREE(cellToActivate->list.array,\
456 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
457 CU_FREE(cuName->buf, sizeof(cuName->size));
458 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
460 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
461 sizeof(F1SetupResponseIEs_t));
463 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
464 elementCnt * sizeof(F1SetupResponseIEs_t *));
465 CU_FREE(f1apMsg->choice.successfulOutcome, \
466 sizeof(SuccessfulOutcome_t));
467 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
470 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
473 f1SetupRsp->protocolIEs.list.array[idx]->id = \
474 ProtocolIE_ID_id_GNB_CU_RRC_Version;
475 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
476 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
477 F1SetupResponseIEs__value_PR_RRC_Version;
478 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
479 rrcVer->latest_RRC_Version.size = RRC_SIZE;
481 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
482 if(rrcVer->latest_RRC_Version.buf == NULLP)
484 CU_FREE(cuName->buf, sizeof(cuName->size));
485 for(ieIdx=0; ieIdx<elementCnt; idx++)
487 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
488 sizeof(F1SetupResponseIEs_t));
490 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
491 elementCnt * sizeof(F1SetupResponseIEs_t *));
492 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
493 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
497 /* Need to check RRC Version */
498 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
499 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
500 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
501 if(rrcVer->iE_Extensions == NULLP)
503 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
504 CU_FREE(cuName->buf, sizeof(cuName->size));
505 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
507 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
508 sizeof(F1SetupResponseIEs_t));
510 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
511 elementCnt * sizeof(F1SetupResponseIEs_t *));
512 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
513 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
516 rrcVer->iE_Extensions->list.count = 1;
517 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
518 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
519 sizeof(struct RRC_Version_ExtIEs *));
520 if(rrcVer->iE_Extensions->list.array == NULLP)
522 CU_FREE(rrcVer->iE_Extensions,\
523 sizeof(ProtocolExtensionContainer_4624P81_t));
524 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
525 CU_FREE(cuName->buf, sizeof(cuName->size));
526 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
528 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
529 sizeof(F1SetupResponseIEs_t));
531 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
532 elementCnt * sizeof(F1SetupResponseIEs_t *));
533 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
534 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
537 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
538 sizeof(struct RRC_Version_ExtIEs));
539 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
541 CU_FREE(rrcVer->iE_Extensions->list.array,\
542 sizeof(struct RRC_Version_ExtIEs *));
543 CU_FREE(rrcVer->iE_Extensions,\
544 sizeof(ProtocolExtensionContainer_4624P81_t));
545 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
546 CU_FREE(cuName->buf, sizeof(cuName->size));
547 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
549 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
550 sizeof(F1SetupResponseIEs_t));
552 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
553 elementCnt * sizeof(F1SetupResponseIEs_t *));
554 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
555 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
558 rrcVer->iE_Extensions->list.array[0]->id = \
559 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
560 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
561 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
562 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
563 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
564 Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
565 CU_ALLOC(rrcVer->iE_Extensions->list.\
566 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
568 if(rrcVer->iE_Extensions->list.\
569 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
571 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
572 sizeof(struct RRC_Version_ExtIEs));
573 CU_FREE(rrcVer->iE_Extensions->list.array,\
574 sizeof(struct RRC_Version_ExtIEs *));
575 CU_FREE(rrcVer->iE_Extensions,\
576 sizeof(ProtocolExtensionContainer_4624P81_t));
577 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
578 CU_FREE(cuName->buf, sizeof(cuName->size));
579 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
581 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
582 sizeof(F1SetupResponseIEs_t));
584 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
585 elementCnt * sizeof(F1SetupResponseIEs_t *));
586 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
587 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
590 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
591 Latest_RRC_Version_Enhanced.buf[0] = 0;
592 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
593 Latest_RRC_Version_Enhanced.buf[1] = 5;
594 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
595 Latest_RRC_Version_Enhanced.buf[2] = 15;
597 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
599 /* Encode the F1SetupRequest type as UPER */
600 memset(encBuf, 0, ENC_BUF_MAX_LEN);
602 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
605 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(uint8_t));
606 CU_FREE(cuName->buf, sizeof(cuName->size));
607 for(idx=0; idx<elementCnt; idx++)
609 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
611 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
612 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
613 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
615 /* Check encode results */
616 if(encRetVal.encoded == ENCODE_FAIL)
618 DU_LOG("\nF1AP : Could not encode F1SetupResponse structure (at %s)\n",\
619 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
624 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n");
625 for(int i=0; i< encBufSize; i++)
627 printf("%x",encBuf[i]);
632 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
634 DU_LOG("\nF1AP : Sending F1 Setup Response failed");
639 }/* End of BuildAndSendF1SetupRsp */
641 /*******************************************************************
643 * @brief Builds and sends the DUUpdateAcknowledge
647 * Function : BuildAndSendDUUpdateAck
649 * Functionality: Constructs the DU Update Acknowledge message and sends
650 * it to the DU through SCTP.
652 * @params[in] void **buf,Buffer to which encoded pattern is written into
653 * @params[in] int *size,size of buffer
655 * @return ROK - success
658 * ****************************************************************/
660 S16 BuildAndSendDUUpdateAck()
664 F1AP_PDU_t *f1apMsg = NULL;
665 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
666 asn_enc_rval_t enRetVal; /* Encoder return value */
668 DU_LOG("\nF1AP : Building GNB-DU Config Update Ack\n");
670 /* Allocate the memory for F1SetupRequest_t */
671 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
674 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
678 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
680 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
681 if(f1apMsg->choice.successfulOutcome == NULLP)
683 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
684 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
688 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
689 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
690 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
691 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
694 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
695 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
697 /* Initialize the F1Setup members */
698 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
699 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
701 DU_LOG("\nF1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
702 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
703 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
707 for(idx=0; idx<elementCnt; idx++)
709 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
710 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
712 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
713 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
714 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
721 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
722 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
723 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present = GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
724 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
726 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
728 /* Encode the F1SetupRequest type as UPER */
729 memset(encBuf, 0, ENC_BUF_MAX_LEN);
731 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
734 for(idx=0; idx<elementCnt; idx++)
736 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
738 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
739 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
740 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
742 /* Checking encode results */
743 if(enRetVal.encoded == ENCODE_FAIL)
745 DU_LOG("\nF1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
750 DU_LOG("\nF1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
751 for(int i=0; i< encBufSize; i++)
753 printf("%x",encBuf[i]);
758 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
760 DU_LOG("\nF1AP : Sending GNB-DU Config Update Ack failed");
766 }/* End of BuildAndSendDUUpdateAck*/
767 /*******************************************************************
769 * @brief deallocating the memory of F1reset msg
773 * Function : FreeF1ResetReq
776 * - freeing memory of F1reset request msg
782 * ****************************************************************/
783 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
786 Reset_t *f1ResetMsg = NULLP;
790 if(f1apMsg->choice.initiatingMessage)
792 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
793 if(f1ResetMsg->protocolIEs.list.array)
795 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
797 if(f1ResetMsg->protocolIEs.list.array[idx])
799 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
802 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
804 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
806 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
809 /*******************************************************************
811 * @brief build ansld ans send f1reset msg
815 * Function : BuildAndSendF1ResetReq
817 * Functionality: build and send f1reset msg
819 * @return ROK - success
822 * ****************************************************************/
823 uint8_t BuildAndSendF1ResetReq()
825 uint8_t elementCnt=0;
827 uint8_t ret= RFAILED;
828 Reset_t *f1ResetMsg = NULLP;
829 F1AP_PDU_t *f1apMsg = NULLP;
830 asn_enc_rval_t encRetVal;
831 DU_LOG("\nF1AP : Building F1 Reset request \n");
834 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
837 DU_LOG("\nF1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
840 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
841 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
842 if(f1apMsg->choice.initiatingMessage == NULLP)
844 DU_LOG("\nF1AP : Memory allocation for BuildAndSendF1ResetReq failed");
847 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
848 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
849 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
851 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
854 f1ResetMsg->protocolIEs.list.count = elementCnt;
855 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
857 /* Initialize the F1Reset members */
858 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
859 if(f1ResetMsg->protocolIEs.list.array == NULLP)
861 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq");
864 for(idx=0; idx<elementCnt; idx++)
866 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
867 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
869 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
876 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
877 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
878 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
879 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
883 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
884 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
885 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
886 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
887 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
891 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
892 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
893 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
894 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
895 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
897 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
899 /* Encode the F1SetupRequest type as APER */
900 memset(encBuf, 0, ENC_BUF_MAX_LEN);
902 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
906 if(encRetVal.encoded == ENCODE_FAIL)
908 DU_LOG("\nF1AP : Could not encode F1Reset structure (at %s)\n",\
909 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
914 DU_LOG("\nF1AP : Created APER encoded buffer for F1Reset\n");
915 for(idx=0; idx< encBufSize; idx++)
917 printf("%x",encBuf[idx]);
921 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
923 DU_LOG("\nF1AP : Sending F1 Reset request failed");
931 FreeF1ResetReq(f1apMsg);
935 /*******************************************************************
937 * @brief Fills Radio Bearer Config
941 * Function : fillSrbCfg
943 * Functionality: Fills Radio Bearer Config
945 * @params[in] SRB_ToAddModList *
947 * @return ROK - success
950 * ****************************************************************/
951 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
955 if(bearerCfg != NULLP)
958 bearerCfg->list.count = elementCnt;
959 bearerCfg->list.size =\
960 elementCnt * sizeof(SRB_ToAddMod_t *);
961 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
962 if(bearerCfg->list.array != NULLP)
964 for(idx = 0; idx < elementCnt; idx++)
966 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
967 if(bearerCfg->list.array[idx] == NULLP)
969 for(ieId = 0; ieId < idx; ieId++)
971 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
973 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
983 bearerCfg->list.array[idx]->srb_Identity = srbId;
988 /*******************************************************************
990 * @brief Fills Master CellGroup Info
994 * Function : fillMasterCellGroup
996 * Functionality: Fills Master Cell Group IE
998 * @params[in] RRCSetup_IEs_t *
1000 * @return ROK - success
1003 * ****************************************************************/
1005 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
1008 masterCellGroup->buf = NULLP;
1009 if(f1apMsgDb.duToCuContainer.buf)
1011 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
1012 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
1013 if(masterCellGroup->buf != NULLP)
1015 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
1016 masterCellGroup->size);
1030 /*******************************************************************
1032 * @brief Fills RRC setup IE
1036 * Function : fillRRCSetupIE
1038 * Functionality: Fills RRC Setup IE
1040 * @params[in] RRCSetup_IEs_t *
1042 * @return ROK - success
1045 * ****************************************************************/
1047 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
1052 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1053 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
1055 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
1059 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
1063 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1069 /*******************************************************************
1071 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
1075 * Function : fillDlCcchRrcMsg
1077 * Functionality: Fills DL DCCCH Message required for
1078 * DLRRCMessageTransfer
1080 * @params[in] RRCContainer_t *rrcContainer
1082 * @return ROK - success
1085 * ****************************************************************/
1087 uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
1091 DL_CCCH_Message_t dl_CCCH_Msg;
1092 asn_enc_rval_t encRetVal;
1094 if(rrcContainer != NULLP)
1096 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
1098 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
1099 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
1101 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
1102 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
1103 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
1105 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
1106 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
1107 present = RRCSetup__criticalExtensions_PR_rrcSetup;
1108 /* Fill RRC Setup IE */
1109 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1110 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
1111 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1112 criticalExtensions.choice.rrcSetup != NULLP)
1114 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
1115 criticalExtensions.choice.rrcSetup);
1119 /* encode DL-CCCH message into RRC Container */
1120 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
1121 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1123 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
1124 /* Encode results */
1125 if(encRetVal.encoded == ENCODE_FAIL)
1127 DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1128 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1133 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1134 for(int i = 0; i< encBufSize; i++)
1136 printf("%x",encBuf[i]);
1138 rrcContainer->size = encBufSize;
1139 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1140 if(rrcContainer->buf != NULLP)
1142 memset(rrcContainer->buf, 0, encBufSize);
1143 for(idx2 = 0; idx2 < encBufSize; idx2++)
1145 rrcContainer->buf[idx2] = encBuf[idx2];
1157 DU_LOG("\nF1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1163 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1169 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1175 DU_LOG("\nF1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1180 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1182 uint8_t idx, ied, elementCnt;
1185 qosFlow->list.count = elementCnt;
1186 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1187 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1188 if(qosFlow->list.array != NULLP)
1190 for(idx = 0; idx < elementCnt; idx++)
1192 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1193 if(qosFlow->list.array[idx] == NULLP)
1195 for(ied = 0; ied < idx; ied++)
1197 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1199 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1205 *qosFlow->list.array[idx] = 9;
1209 /*******************************************************************
1211 * @brief Fills CN Assoc for Drb to Add/Mod List
1215 * Function : fillCnAssoc
1217 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1219 * @params[in] struct DRB_ToAddMod__cnAssociation *
1221 * @return ROK - success
1224 * ****************************************************************/
1226 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1230 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1231 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1233 cnAssoc->choice.eps_BearerIdentity = 5;
1235 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1237 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1238 if(cnAssoc->choice.sdap_Config)
1240 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1241 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1242 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1243 cnAssoc->choice.sdap_Config->defaultDRB = true;
1244 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1245 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1246 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1247 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1248 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1250 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1254 DU_LOG("\nF1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1255 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1261 DU_LOG("\nF1AP: Mem alloc failed at fillCnAssoc()");
1268 /*******************************************************************
1270 * @brief Fills Radio Bearer Config for Drb
1274 * Function : fillDrbCfg
1276 * Functionality: Fills Radio Bearer Config for Drb
1278 * @params[in] drbId, DRB_ToAddModList *
1280 * @return ROK - success
1283 * ****************************************************************/
1284 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1286 uint8_t idx, ied, ret, elementCnt;
1292 drbCfg->list.count = elementCnt;
1293 drbCfg->list.size =\
1294 elementCnt * sizeof(DRB_ToAddMod_t *);
1295 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1296 if(drbCfg->list.array != NULLP)
1298 for(idx = 0; idx < elementCnt; idx++)
1300 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1301 if(drbCfg->list.array[idx] == NULLP)
1303 for(ied = 0; ied < idx; ied++)
1305 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1307 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1317 /* CN ASSOCIATION */
1318 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1319 if(drbCfg->list.array[idx]->cnAssociation)
1321 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1324 drbCfg->list.array[idx]->drb_Identity = drbId;
1329 /*******************************************************************
1331 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1335 * Function : fillRrcReconfigIE
1337 * Functionality: Fills RRC Reconfig Message required for
1338 * DLRRCMessageTransfer
1340 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1342 * @return ROK - success
1345 * ****************************************************************/
1347 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1350 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1351 if(rrcReconfigMsg->radioBearerConfig)
1353 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1354 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1356 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1361 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1362 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1364 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1367 DU_LOG("\n F1AP: Failed to fill DrbCfg at fillRrcReconfigIE()");
1368 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1369 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1375 DU_LOG("\n F1AP: memory Alloc failed at fillRrcReconfigIE()");
1376 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1382 /*******************************************************************
1384 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1388 * Function : fillDlDcchRrcMsg
1390 * Functionality: Fills DL DCCH Message required for
1391 * DLRRCMessageTransfer
1393 * @params[in] RRCContainer_t *rrcContainer
1395 * @return ROK - success
1398 * ****************************************************************/
1400 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1404 DL_DCCH_Message_t dl_DCCH_Msg;
1405 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1406 asn_enc_rval_t encRetVal;
1408 if(rrcContainer != NULLP)
1410 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1412 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1413 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1415 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1416 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1417 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1419 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1420 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1421 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1422 /* Fill RRC Reconfig IE */
1423 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1424 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1425 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1426 criticalExtensions.choice.rrcReconfiguration != NULLP)
1428 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1429 criticalExtensions.choice.rrcReconfiguration);
1433 /* encode DL-DCCH message into RRC Container */
1434 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1435 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1437 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1438 /* Encode results */
1439 if(encRetVal.encoded == ENCODE_FAIL)
1441 DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1442 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1447 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1448 for(int i = 0; i< encBufSize; i++)
1450 printf("%x",encBuf[i]);
1452 rrcContainer->size = encBufSize;
1453 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1454 if(rrcContainer->buf != NULLP)
1456 memset(rrcContainer->buf, 0, encBufSize);
1457 for(idx2 = 0; idx2 < encBufSize; idx2++)
1459 rrcContainer->buf[idx2] = encBuf[idx2];
1466 DU_LOG("\nF1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1471 DU_LOG("\nF1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1477 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1483 DU_LOG("\nF1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1489 DU_LOG("\nF1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1495 /*******************************************************************
1497 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1501 * Function : BuildDLRRCContainer
1503 * Functionality: Builds RRC Container IE required for
1504 * DLRRCMessageTransfer
1508 * @return ROK - success
1511 * ****************************************************************/
1513 uint8_t BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1517 if(rrcMsgType == RRC_SETUP)
1519 ret = fillDlCcchRrcMsg(rrcContainer);
1521 DU_LOG("\n F1AP: Failed to fill DL-CCCH Msg at BuildDLRRCContainer()");
1523 else if(rrcMsgType == RRC_RECONFIG)
1525 ret = fillDlDcchRrcMsg(rrcContainer);
1527 DU_LOG("\n F1AP: Failed at fill DL-DCCH Msg at BuildDLRRCContainer()");
1532 /*******************************************************************
1534 * @brief Builds and sends the DLRRCMessageTransfer
1538 * Function : BuildAndSendDLRRCMessageTransfer
1540 * Functionality: Constructs the DL RRC Message Transfer and sends
1541 * it to the CU through SCTP.
1545 * @return ROK - success
1548 * ****************************************************************/
1549 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t rrcMsgType)
1551 uint8_t elementCnt = 0;
1554 F1AP_PDU_t *f1apMsg = NULLP;
1555 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1556 asn_enc_rval_t encRetVal; /* Encoder return value */
1558 DU_LOG("\n F1AP : Building DL RRC Message Transfer Message\n");
1560 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1561 if(f1apMsg == NULLP)
1563 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1567 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1568 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1569 sizeof(InitiatingMessage_t));
1570 if(f1apMsg->choice.initiatingMessage == NULLP)
1572 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1573 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1577 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1578 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1579 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1580 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1583 dlRRCMsg->protocolIEs.list.count = elementCnt;
1584 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1586 /* Initialize the F1Setup members */
1587 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1588 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1590 DU_LOG(" F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1591 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1592 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1596 for(idx=0; idx<elementCnt; idx++)
1598 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1599 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1601 for(ieId=0; ieId<idx; ieId++)
1603 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1604 sizeof(DLRRCMessageTransferIEs_t));
1606 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1607 dlRRCMsg->protocolIEs.list.size);
1608 CU_FREE(f1apMsg->choice.initiatingMessage,\
1609 sizeof(InitiatingMessage_t));
1610 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1615 /* GNB CU UE F1AP ID */
1617 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1618 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1619 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1620 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1621 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1623 /* GNB DU UE F1AP ID */
1625 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1626 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1627 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1628 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1629 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1630 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1634 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1635 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1636 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1637 DLRRCMessageTransferIEs__value_PR_SRBID;
1638 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = SRB0;
1642 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1643 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1644 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1645 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1646 BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1648 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1650 /* Encode the F1SetupRequest type as APER */
1651 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1653 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1655 /* Encode results */
1656 if(encRetVal.encoded == ENCODE_FAIL)
1658 DU_LOG( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1659 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1664 DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1665 for(int i=0; i< encBufSize; i++)
1667 printf("%x",encBuf[i]);
1672 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1674 DU_LOG("\n F1AP : Sending DL RRC Message Transfer Failed");
1679 }/* End of BuildAndSendDLRRCMessageTransfer */
1681 /*******************************************************************
1683 * @brief Function to set the Dl RRC Msg Type
1687 * Function : setDlRRCMsgType
1689 * Functionality: Constructs the UE Setup Response and sends
1690 * it to the DU through SCTP.
1694 * @return ROK - success
1697 * ****************************************************************/
1699 uint8_t setDlRRCMsgType()
1701 uint8_t rrcMsgType = 0;
1702 switch(f1apMsgDb.dlRrcMsgCount)
1705 rrcMsgType = RRC_SETUP;
1707 case RRC_SECURITY_MODE_COMMAND:
1708 rrcMsgType = RRC_SECURITY_MODE_COMMAND;
1711 rrcMsgType = RRC_RECONFIG;
1719 /*******************************************************************
1721 * @brief Function to build Initial UL RRC Message
1725 * Function : procInitULRRCMsg
1727 * Functionality: Function to build Initial UL RRC Message
1731 * @return ROK - success
1734 * ****************************************************************/
1736 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1738 uint8_t idx, rrcMsgType;
1740 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1741 DU_LOG("\n filling the required values in DB in procInitULRRCMsg");
1743 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1745 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1747 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1749 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1751 case ProtocolIE_ID_id_NRCGI:
1753 case ProtocolIE_ID_id_C_RNTI:
1755 case ProtocolIE_ID_id_RRCContainer:
1757 case ProtocolIE_ID_id_DUtoCURRCContainer:
1759 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1760 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1761 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1763 DU_LOG("\n Received Du to Cu RRC Container ");
1764 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1765 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1766 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1767 f1apMsgDb.duToCuContainer.size);
1768 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1770 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1771 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1772 .duToCuContainer.size);
1777 DU_LOG("\n Failed to receive Du to Cu RRC Container ");
1783 DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1789 f1apMsgDb.dlRrcMsgCount++;
1790 rrcMsgType = setDlRRCMsgType();
1791 ret = BuildAndSendDLRRCMessageTransfer(rrcMsgType);
1796 /*******************************************************************
1798 * @brief Builds Nrcgi
1802 * Function : BuildNrcgi
1804 * Functionality: Building the PLMN ID and NR Cell id
1806 * @params[in] NRCGI_t *nrcgi
1807 * @return ROK - success
1810 * ****************************************************************/
1811 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1814 uint8_t unused_bits = 4;
1815 uint8_t byteSize = 5;
1817 /* Allocate Buffer Memory */
1818 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1819 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1820 if(nrcgi->pLMN_Identity.buf == NULLP)
1824 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1830 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1831 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1832 if(nrcgi->nRCellIdentity.buf == NULLP)
1837 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1843 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1844 nrcgi->nRCellIdentity.buf[0] |= val;
1845 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1849 /*******************************************************************
1851 * @brief Builds Special cell list for UE Setup Request
1855 * Function : BuildSplCellList
1857 * Functionality: Constructs the Special Cell list for UESetReq
1859 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1861 * @return ROK - success
1864 * ****************************************************************/
1865 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1871 spCellLst->list.count = cellCnt;
1872 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1873 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1874 if(spCellLst->list.array == NULLP)
1878 for(idx=0; idx<cellCnt; idx++)
1880 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1881 if(spCellLst->list.array[idx] == NULLP)
1887 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1888 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1889 spCellLst->list.array[idx]->value.present =\
1890 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1891 /* Special Cell ID -NRCGI */
1892 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1897 /*Special Cell Index*/
1898 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1900 }/* End of BuildSplCellList*/
1902 /*******************************************************************
1904 * @brief Builds SRBS to be setup
1908 * Function : BuildSRBSetup
1910 * Functionality: Constructs the SRB's for UESetReq
1912 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1914 * @return ROK - success
1917 * ****************************************************************/
1918 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1923 srbSet->list.count = srbCnt;
1924 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1925 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1926 if(srbSet->list.array == NULLP)
1930 for(idx=0; idx<srbCnt; idx++)
1932 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1933 if(srbSet->list.array[idx] == NULLP)
1939 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
1940 srbSet->list.array[idx]->criticality = Criticality_ignore;
1941 srbSet->list.array[idx]->value.present = \
1942 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
1943 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
1945 }/* End of BuildSRBSetup*/
1947 /*******************************************************************
1949 * @brief Builds QOS Info for DRB Setum Item
1953 * Function : BuildQOSInfo
1955 * Functionality: Constructs the QOS Info for DRB Setup Item
1957 * @params[in] QoSInformation_t *qosinfo
1959 * @return ROK - success
1962 * ****************************************************************/
1963 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
1965 /* NonDynamic5QIDescriptor */
1966 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
1967 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
1968 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
1973 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
1975 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
1976 sizeof(AveragingWindow_t));
1977 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
1982 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
1983 /*MaxDataBurstVolume*/
1984 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
1985 sizeof(MaxDataBurstVolume_t));
1986 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
1991 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
1993 /*nRGRAN Allocation Retention Priority*/
1994 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_highest;
1995 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
1996 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
1998 /* TO DO: GBR_QoSFlowInformation */
2000 }/*End of BuildQOSInfo*/
2002 /*******************************************************************
2004 * @brief Builds SNSSAI
2008 * Function : BuildSNSSAI
2010 * Functionality: Constructs the SNSSAI For DRB list
2012 * @params[in] SNSSAI_t *snssai
2014 * @return ROK - success
2017 * ****************************************************************/
2018 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2022 snssai->sST.size = sizeof(uint8_t);
2023 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2024 if(snssai->sST.buf == NULLP)
2028 snssai->sST.buf[0] = 3;
2030 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2031 if(snssai->sD == NULLP)
2035 snssai->sD->size = 3*sizeof(uint8_t);
2036 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2037 if(snssai->sD->buf == NULLP)
2041 snssai->sD->buf[0] = 3;
2042 snssai->sD->buf[1] = 6;
2043 snssai->sD->buf[2] = 9;
2045 }/*End of BuildSNSSAI*/
2047 /*******************************************************************
2049 * @brief Builds the flow map.
2053 * Function : BuildFlowsMap
2055 * Functionality: Constructs the flowmap For DRB list
2057 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2059 * @return ROK - success
2062 * ****************************************************************/
2063 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2069 flowMap->list.count = flowCnt;
2070 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2071 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2072 if(flowMap->list.array == NULLP)
2076 for(idx=0; idx<flowCnt; idx++)
2078 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2079 if(flowMap->list.array[idx] == NULLP)
2085 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2086 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2092 }/*End of BuildFlowsMap*/
2094 /*******************************************************************
2096 * @brief Builds the Uplink Tunnel Info
2100 * Function : BuildULTnlInfo
2102 * Functionality: Constructs the UL TnlInfo For DRB list
2104 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2106 * @return ROK - success
2109 * ****************************************************************/
2110 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2115 ulInfo->list.count = ulCnt;
2116 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2117 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2118 if(ulInfo->list.array == NULLP)
2122 for(idx=0; idx<ulCnt; idx++)
2124 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2125 if(ulInfo->list.array[idx] == NULLP)
2131 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2132 UPTransportLayerInformation_PR_gTPTunnel;
2134 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2135 sizeof(GTPTunnel_t));
2136 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2140 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2141 transportLayerAddress.size = 4*sizeof(uint8_t);
2142 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2143 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2144 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2145 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2146 transportLayerAddress.buf == NULLP)
2150 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2151 transportLayerAddress.buf[0] = 4;
2152 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2153 transportLayerAddress.buf[1] = 4;
2154 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2155 transportLayerAddress.buf[2] = 4;
2156 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2157 transportLayerAddress.buf[3] = 5;
2158 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2159 transportLayerAddress.bits_unused = 0;
2161 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2162 = 4 * sizeof(uint8_t);
2163 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2164 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2165 gTPTunnel->gTP_TEID.size);
2166 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2171 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2172 gTP_TEID.buf[0] = 11;
2173 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2174 gTP_TEID.buf[1] = 0;
2175 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2176 gTP_TEID.buf[2] = 0;
2177 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2178 gTP_TEID.buf[3] = 1;
2181 }/*End of BuildULTnlInfo*/
2183 /*******************************************************************
2185 * @brief Builds DRBS to be setup
2189 * Function : BuildDRBSetup
2191 * Functionality: Constructs the DRB's for UESetReq
2193 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2195 * @return ROK - success
2198 * ****************************************************************/
2199 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2201 uint8_t BuildQOSInforet;
2202 uint8_t BuildSNSSAIret;
2203 uint8_t BuildFlowsMapret;
2204 uint8_t BuildULTnlInforet;
2207 DRBs_ToBeSetup_Item_t *drbSetItem;
2209 drbSet->list.count = drbCnt;
2210 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2211 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2212 if(drbSet->list.array == NULLP)
2216 for(idx=0; idx<drbCnt; idx++)
2218 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2219 if(drbSet->list.array[idx] == NULLP)
2225 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2226 drbSet->list.array[idx]->criticality = Criticality_ignore;
2227 drbSet->list.array[idx]->value.present = \
2228 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2229 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2231 drbSetItem->dRBID = 1;
2233 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2234 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2235 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2239 drbSetItem->qoSInformation.choice.choice_extension->id = \
2240 ProtocolIE_ID_id_DRB_Information;
2241 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2243 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2244 QoSInformation_ExtIEs__value_PR_DRB_Information;
2245 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2246 choice_extension->value.choice.DRB_Information.dRB_QoS);
2247 if(BuildQOSInforet != ROK)
2252 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2253 choice_extension->value.choice.DRB_Information.sNSSAI);
2254 if(BuildSNSSAIret != ROK)
2258 /*Flows mapped to DRB List*/
2259 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2260 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2261 if(BuildFlowsMapret != ROK)
2265 /*ULUPTNLInformation To Be Setup List*/
2266 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2267 if(BuildULTnlInforet != ROK)
2272 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2274 /*UL Configuration*/
2275 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2276 if(drbSetItem->uLConfiguration == NULLP)
2280 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2282 }/* End of BuildDRBSetup*/
2284 /*******************************************************************
2286 * @brief Deallocating memory of function BuildAndSendUESetReq
2290 * Function : FreeNrcgi
2292 * Functionality: Deallocating memory for function BuildNrcgi
2294 * @params[in] NRCGI_t *nrcgi
2298 *******************************************************************/
2299 void FreeNrcgi(NRCGI_t *nrcgi)
2301 if(nrcgi->pLMN_Identity.buf != NULLP)
2303 if(nrcgi->nRCellIdentity.buf != NULLP)
2305 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2307 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2310 /*******************************************************************
2312 * @brief Deallocating memory of function BuildAndSendUESetReq
2316 * Function : FreeSplCellList
2318 * Functionality: Deallocating memory for function BuildSplCellList
2320 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2325 * *****************************************************************/
2326 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2329 if(spCellLst->list.array != NULLP)
2331 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2333 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2335 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2337 if(spCellLst->list.array[cellidx]!=NULLP)
2339 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2342 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2345 /*******************************************************************
2347 * @brief Deallocating memory of function BuildAndSendUESetReq
2351 * Function : FreeSRBSetup
2353 * Functionality: Deallocating memory for function BuildSRBSetup
2355 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2360 * ******************************************************************/
2361 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2364 if(srbSet->list.array != NULLP)
2366 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2368 if(srbSet->list.array[srbidx]!=NULLP)
2370 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2373 CU_FREE(srbSet->list.array,srbSet->list.size);
2376 /*******************************************************************
2378 * @brief Deallocating memory of function BuildAndSendUESetReq
2382 * Function : FreeQOSInfo
2384 * Functionality: Deallocating memory for function BuildQOSInfo
2386 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2390 * ****************************************************************/
2391 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2393 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2395 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2397 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2399 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2400 sizeof(MaxDataBurstVolume_t));
2402 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2403 sizeof(AveragingWindow_t));
2405 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2406 sizeof(NonDynamic5QIDescriptor_t));
2409 /*******************************************************************
2411 * @brief Deallocating memory of function BuildAndSendUESetReq
2415 * Function : FreeULTnlInfo
2417 * Functionality: Deallocating memory for function BuildULTnlInfo
2419 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2424 * ****************************************************************/
2425 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2428 if(ulInfo->list.array != NULLP)
2430 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2432 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2434 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2436 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2437 transportLayerAddress.buf != NULLP)
2439 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2442 CU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2443 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2444 gTPTunnel->gTP_TEID.size);
2446 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2447 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2448 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2450 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2451 sizeof(GTPTunnel_t));
2454 if(ulInfo->list.array[ulidx]!=NULLP)
2456 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2459 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2462 /*******************************************************************
2464 * @brief Deallocating memory for BuildAndSendUESetReq
2468 * Function : FreeDRBSetup
2470 * Functionality: Deallocating memory for BuildDRBSetup
2472 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2476 * ****************************************************************/
2477 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2479 DRBs_ToBeSetup_Item_t *drbSetItem;
2482 if(drbSet->list.array == NULLP)
2484 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2486 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2488 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2489 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2491 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2492 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2494 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2495 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2497 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2498 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2500 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2502 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2504 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2506 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2507 flows_Mapped_To_DRB_List.list.array != NULLP)
2509 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2510 flows_Mapped_To_DRB_List.list.count; flowidx++)
2512 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2513 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2515 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2516 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2517 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2519 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2520 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2521 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2523 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2524 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2525 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2527 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2528 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2530 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2531 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2532 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2533 sizeof(MaxDataBurstVolume_t));
2535 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2536 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2537 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2539 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2540 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2541 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2544 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2545 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2547 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2548 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2551 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2552 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2553 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2555 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2556 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2558 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2559 sizeof(OCTET_STRING_t));
2561 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2562 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2564 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2565 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2567 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2568 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2570 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2571 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2573 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2576 if(drbSet->list.array[drbidx]!=NULLP)
2578 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2581 CU_FREE(drbSet->list.array,drbSet->list.size);
2586 /*******************************************************************
2588 * @brief Free the UE Setup Request
2592 * Function : FreeUeContextSetupReq
2594 * Functionality: Deallocate the memory of BuildUESetReq
2596 * @params[in] F1AP_PDU_t *f1apMsg
2601 * ****************************************************************/
2602 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2605 UEContextSetupRequest_t *ueSetReq = NULLP;
2607 if(f1apMsg != NULLP)
2609 if(f1apMsg->choice.initiatingMessage != NULLP)
2611 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2612 if(ueSetReq->protocolIEs.list.array != NULLP)
2614 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2616 if(ueSetReq->protocolIEs.list.array[idx])
2618 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2620 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2622 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2624 case ProtocolIE_ID_id_SpCell_ID:
2625 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2627 case ProtocolIE_ID_id_ServCellIndex:
2629 case ProtocolIE_ID_id_SpCellULConfigured:
2631 case ProtocolIE_ID_id_CUtoDURRCInformation:
2632 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2634 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2635 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2637 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2638 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2640 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2641 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2643 case ProtocolIE_ID_id_RRCContainer:
2644 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2646 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2647 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2651 printf("\nF1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2656 for(ieId=0; ieId<idx; ieId++)
2658 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2660 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2663 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2665 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2667 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2671 /**Filling cell group info **/
2672 /*******************************************************************
2674 * @brief Build Control resource set to add/modify list
2678 * Function : BuildControlRSetToAddModList
2680 * Functionality: Build Control resource set to add/modify list
2683 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2685 * @return ROK - success
2688 * ****************************************************************/
2689 uint8_t BuildControlRSetToAddModList
2691 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2696 uint8_t numBytes, bitsUnused;
2697 struct ControlResourceSet *controlRSet;
2698 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2699 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2702 controlRSetList->list.count = elementCnt;
2703 controlRSetList->list.size = \
2704 elementCnt * sizeof(struct ControlResourceSet *);
2706 controlRSetList->list.array = NULLP;
2707 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2708 if(!controlRSetList->list.array)
2710 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2714 for(idx = 0; idx < elementCnt; idx++)
2716 controlRSetList->list.array[idx] = NULLP;
2717 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2718 if(!controlRSetList->list.array[idx])
2720 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2726 controlRSet = controlRSetList->list.array[idx];
2727 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2729 /* Values harcoded according to our design:
2732 * Bit string stored ff0000000000
2736 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2737 controlRSet->frequencyDomainResources.buf = NULLP;
2738 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2739 controlRSet->frequencyDomainResources.size);
2740 if(!controlRSet->frequencyDomainResources.buf)
2742 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2746 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2747 coreset0EndPrb = CORESET0_END_PRB;
2748 coreset1StartPrb = coreset0EndPrb + 6;
2749 coreset1NumPrb = CORESET1_NUM_PRB;
2750 /* calculate the PRBs */
2751 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2752 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2753 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2755 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2756 controlRSet->cce_REG_MappingType.present = \
2757 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2759 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2760 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2761 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2762 controlRSet->tci_PresentInDCI = NULLP;
2764 uint8_t tciStateIdx;
2766 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2767 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2768 if(!controlRset->tci_StatesPDCCH_ToAddList)
2770 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2775 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2776 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2777 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2778 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2779 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2781 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2785 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2787 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2788 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2790 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2797 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2799 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2800 if(!controlRset->tci_PresentInDCI)
2802 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2806 *(controlRset->tci_PresentInDCI);
2809 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2810 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2811 if(!controlRSet->pdcch_DMRS_ScramblingID)
2813 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2816 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2819 } /* End BuildControlRSetToAddModList */
2821 /*******************************************************************
2823 * @brief Build search space to add/modify list
2827 * Function : BuildSearchSpcToAddModList
2829 * Functionality: Build search space to add/modify list
2832 * @return ROK - success
2835 * ****************************************************************/
2836 uint8_t BuildSearchSpcToAddModList
2838 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2846 struct SearchSpace *searchSpc;
2849 searchSpcList->list.count = elementCnt;
2850 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2852 searchSpcList->list.array = NULLP;
2853 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2854 if(!searchSpcList->list.array)
2856 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2860 for(idx = 0; idx < elementCnt; idx++)
2862 searchSpcList->list.array[idx] = NULLP;
2863 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2864 if(!searchSpcList->list.array[idx])
2866 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2872 searchSpc = searchSpcList->list.array[idx];
2874 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2876 searchSpc->controlResourceSetId = NULLP;
2877 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2878 if(!searchSpc->controlResourceSetId)
2880 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2883 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2885 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2886 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2887 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2888 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2890 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2893 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2894 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2896 searchSpc->duration = NULLP;
2897 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2898 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2899 if(!searchSpc->monitoringSymbolsWithinSlot)
2901 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2905 /* Values taken from reference logs :
2908 * Bit string stores 8000
2913 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2914 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2915 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2916 searchSpc->monitoringSymbolsWithinSlot->size);
2917 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2919 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2924 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2925 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2926 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2927 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2929 searchSpc->nrofCandidates = NULLP;
2930 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2931 if(!searchSpc->nrofCandidates)
2933 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2937 searchSpc->nrofCandidates->aggregationLevel1 = \
2938 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2939 searchSpc->nrofCandidates->aggregationLevel2 = \
2940 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2941 searchSpc->nrofCandidates->aggregationLevel4 = \
2942 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2943 searchSpc->nrofCandidates->aggregationLevel8 = \
2944 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2945 searchSpc->nrofCandidates->aggregationLevel16 = \
2946 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
2948 searchSpc->searchSpaceType = NULLP;
2949 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
2950 if(!searchSpc->searchSpaceType)
2952 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2956 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
2958 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
2959 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
2960 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
2961 if(!searchSpc->searchSpaceType->choice.ue_Specific)
2963 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2966 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
2967 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
2970 }/* End BuildSearchSpcToAddModList */
2972 /*******************************************************************
2974 * @brief Builds BWP DL dedicated PDCCH config
2978 * Function : BuildBWPDlDedPdcchCfg
2980 * Functionality: Builds BWP DL dedicated PDCCH config
2982 * @params[in] struct PDCCH_Config *pdcchCfg
2984 * @return ROK - success
2987 * ****************************************************************/
2988 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
2990 pdcchCfg->controlResourceSetToAddModList = NULLP;
2991 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
2992 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
2993 if(!pdcchCfg->controlResourceSetToAddModList)
2995 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
2999 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3004 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3006 pdcchCfg->searchSpacesToAddModList = NULLP;
3007 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3008 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3009 if(!pdcchCfg->searchSpacesToAddModList)
3011 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3015 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3020 pdcchCfg->searchSpacesToReleaseList = NULLP;
3021 pdcchCfg->downlinkPreemption = NULLP;
3022 pdcchCfg->tpc_PUSCH = NULLP;
3023 pdcchCfg->tpc_PUCCH = NULLP;
3024 pdcchCfg->tpc_SRS = NULLP;
3029 /*******************************************************************
3031 * @brief Builds DMRS DL PDSCH Mapping type A
3035 * Function : BuildDMRSDLPdschMapTypeA
3037 * Functionality: Builds DMRS DL PDSCH Mapping type A
3040 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3041 * @return ROK - success
3044 * ****************************************************************/
3045 uint8_t BuildDMRSDLPdschMapTypeA
3047 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3050 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3051 dmrsDlCfg->choice.setup = NULLP;
3052 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3053 if(!dmrsDlCfg->choice.setup)
3055 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3059 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3060 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3061 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3062 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3064 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3067 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3069 dmrsDlCfg->choice.setup->maxLength = NULLP;
3070 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3071 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3072 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3077 /*******************************************************************
3079 * @brief Builds TCI states to add/modify list
3083 * Function : BuildTCIStatesToAddModList
3085 * Functionality:Builds TCI states to add/modify list
3088 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3090 * @return ROK - success
3093 * ****************************************************************/
3094 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3099 /*******************************************************************
3101 * @brief Builds PDSCH time domain allocation list
3105 * Function : BuildPdschTimeDomAllocList
3107 * Functionality: Builds PDSCH time domain allocation list
3110 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3112 * @return ROK - success
3115 * ****************************************************************/
3116 uint8_t BuildPdschTimeDomAllocList
3118 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3123 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3125 timeDomAllocList->present = \
3126 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3128 timeDomAllocList->choice.setup = NULLP;
3129 CU_ALLOC(timeDomAllocList->choice.setup, \
3130 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3131 if(!timeDomAllocList->choice.setup)
3133 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3138 timeDomAllocList->choice.setup->list.count = elementCnt;
3139 timeDomAllocList->choice.setup->list.size = \
3140 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3142 timeDomAllocList->choice.setup->list.array = NULLP;
3143 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3144 timeDomAllocList->choice.setup->list.size);
3145 if(!timeDomAllocList->choice.setup->list.array)
3147 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3151 for(idx = 0; idx < elementCnt; idx++)
3153 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3154 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3155 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3156 if(!timeDomAllocList->choice.setup->list.array[idx])
3158 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3164 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3166 timeDomAlloc->k0 = NULLP;
3167 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3168 timeDomAlloc->startSymbolAndLength = 53;
3173 /*******************************************************************
3175 * @brief Builds PDSCH PRB Bundling type
3179 * Function : BuildPdschPrbBundlingType
3181 * Functionality: Builds PDSCH PRB Bundling type
3184 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3186 * @return ROK - success
3189 * ****************************************************************/
3190 uint8_t BuildPdschPrbBundlingType
3192 struct PDSCH_Config__prb_BundlingType *prbBndlType
3195 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3197 prbBndlType->choice.staticBundling = NULLP;
3198 CU_ALLOC(prbBndlType->choice.staticBundling, \
3199 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3200 if(!prbBndlType->choice.staticBundling)
3202 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3205 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3210 /*******************************************************************
3212 * @brief Builds BWP DL dedicated PDSCH config
3216 * Function : BuildBWPDlDedPdschCfg
3218 * Functionality: Builds BWP DL dedicated PDSCH config
3220 * @params[in] struct PDSCH_Config *pdschCfg
3222 * @return ROK - success
3225 * ****************************************************************/
3226 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3228 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3230 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3231 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3232 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3233 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3235 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3239 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3244 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3245 pdschCfg->tci_StatesToAddModList = NULLP;
3246 pdschCfg->tci_StatesToReleaseList = NULLP;
3247 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3249 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3250 if(!pdschCfg->tci_StatesToAddModList)
3252 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3255 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3261 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3263 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3264 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3265 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3266 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3268 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3271 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3275 pdschCfg->pdsch_AggregationFactor = NULLP;
3276 pdschCfg->rateMatchPatternToAddModList = NULLP;
3277 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3278 pdschCfg->rateMatchPatternGroup1 = NULLP;
3279 pdschCfg->rateMatchPatternGroup2 = NULLP;
3280 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3281 pdschCfg->mcs_Table = NULLP;
3283 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3284 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3285 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3287 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3290 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3292 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3297 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3298 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3299 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3300 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3301 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3302 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3303 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3308 /*******************************************************************
3310 * @brief Builds intitial DL BWP
3313 * Function : BuildInitialDlBWP
3315 * Functionality: Builds intitial DL BWP in spCellCfgDed
3317 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3319 * @return ROK - success
3322 * ****************************************************************/
3323 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3325 dlBwp->pdcch_Config = NULLP;
3326 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3327 if(!dlBwp->pdcch_Config)
3329 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3332 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3334 dlBwp->pdcch_Config->choice.setup = NULLP;
3335 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3336 if(!dlBwp->pdcch_Config->choice.setup)
3338 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3341 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3346 dlBwp->pdsch_Config = NULLP;
3347 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3348 if(!dlBwp->pdsch_Config)
3350 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3353 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3355 dlBwp->pdsch_Config->choice.setup = NULLP;
3356 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3357 if(!dlBwp->pdsch_Config->choice.setup)
3359 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3363 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3368 dlBwp->sps_Config = NULLP;
3369 dlBwp->radioLinkMonitoringConfig = NULLP;
3373 /*******************************************************************
3375 * @brief Builds DMRS UL Pusch Mapping type A
3379 * Function : BuildDMRSULPuschMapTypeA
3381 * Functionality: Builds DMRS UL Pusch Mapping type A
3384 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3385 * @return ROK - success
3388 * ****************************************************************/
3389 uint8_t BuildDMRSULPuschMapTypeA
3391 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3394 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3395 dmrsUlCfg->choice.setup= NULLP;
3396 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3397 if(!dmrsUlCfg->choice.setup)
3399 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3403 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3404 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3405 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3406 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3408 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3411 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3413 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3414 dmrsUlCfg->choice.setup->maxLength = NULLP;
3415 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3416 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3417 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3418 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3420 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3424 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3425 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3427 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3429 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3432 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3434 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3435 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3439 /*******************************************************************
3441 * @brief Build PUSCH time domain allocation list
3445 * Function : BuildPuschTimeDomAllocList
3447 * Functionality: Build PUSCH time domain allocation list
3450 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3452 * @return ROK - success
3455 * ****************************************************************/
3456 uint8_t BuildPuschTimeDomAllocList
3458 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3463 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3465 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3466 timeDomAllocList->choice.setup = NULLP;
3467 CU_ALLOC(timeDomAllocList->choice.setup, \
3468 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3469 if(!timeDomAllocList->choice.setup)
3471 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3476 timeDomAllocList->choice.setup->list.count = elementCnt;
3477 timeDomAllocList->choice.setup->list.size = \
3478 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3479 timeDomAllocList->choice.setup->list.array = NULLP;
3480 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3481 timeDomAllocList->choice.setup->list.size);
3482 if(!timeDomAllocList->choice.setup->list.array)
3484 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3488 for(idx = 0; idx < elementCnt; idx++)
3490 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3491 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3492 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3493 if(!timeDomAllocList->choice.setup->list.array[idx])
3495 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3501 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3502 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3503 if(!timeDomAlloc->k2)
3505 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3508 *(timeDomAlloc->k2) = PUSCH_K2;
3509 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3510 timeDomAlloc->startSymbolAndLength = 27;
3514 /*******************************************************************
3516 * @brief Builds BWP UL dedicated PUSCH Config
3520 * Function : BuildBWPUlDedPuschCfg
3523 * Builds BWP UL dedicated PUSCH Config
3525 * @params[in] : PUSCH_Config_t *puschCfg
3527 * @return ROK - success
3530 * ****************************************************************/
3531 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3533 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3534 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3535 if(!puschCfg->dataScramblingIdentityPUSCH)
3537 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3540 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3542 puschCfg->txConfig = NULLP;
3543 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3544 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3545 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3546 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3548 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3552 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3557 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3558 puschCfg->pusch_PowerControl = NULLP;
3559 puschCfg->frequencyHopping = NULLP;
3560 puschCfg->frequencyHoppingOffsetLists = NULLP;
3561 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3563 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3564 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3565 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3566 if(!puschCfg->pusch_TimeDomainAllocationList)
3568 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3572 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3577 puschCfg->pusch_AggregationFactor = NULLP;
3578 puschCfg->mcs_Table = NULLP;
3579 puschCfg->mcs_TableTransformPrecoder = NULLP;
3580 puschCfg->transformPrecoder = NULLP;
3581 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3582 if(!puschCfg->transformPrecoder)
3584 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3587 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3589 puschCfg->codebookSubset = NULLP;
3590 puschCfg->maxRank = NULLP;
3591 puschCfg->rbg_Size = NULLP;
3592 puschCfg->uci_OnPUSCH = NULLP;
3593 puschCfg->tp_pi2BPSK = NULLP;
3598 /*******************************************************************
3600 * @brief Fills SRS resource to add/modify list
3604 * Function : BuildSrsRsrcAddModList
3606 * Functionality: Fills SRS resource to add/modify list
3609 * @return ROK - success
3612 * ****************************************************************/
3613 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3619 resourceList->list.count = elementCnt;
3620 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3621 resourceList->list.array = NULLP;
3622 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3623 if(!resourceList->list.array)
3625 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3629 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3631 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3632 if(!resourceList->list.array[rsrcIdx])
3634 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3640 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3641 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3642 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3644 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3645 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3646 sizeof(struct SRS_Resource__transmissionComb__n2));
3647 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3649 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3652 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3653 = SRS_COMB_OFFSET_N2;
3654 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3655 = SRS_CYCLIC_SHIFT_N2;
3657 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3659 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3660 SRS_Resource__resourceMapping__nrofSymbols_n1;
3661 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3662 SRS_Resource__resourceMapping__repetitionFactor_n1;
3664 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3665 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3666 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3667 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3668 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3669 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3670 SRS_Resource__groupOrSequenceHopping_neither;
3672 /* Setting resource type to aperiodic for intergration purposes */
3673 resourceList->list.array[rsrcIdx]->resourceType.present = \
3674 SRS_Resource__resourceType_PR_aperiodic;
3675 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3676 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3677 sizeof(struct SRS_Resource__resourceType__aperiodic));
3678 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3680 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3683 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3688 /*******************************************************************
3690 * @brief Build SRS resource set Add/mod list
3694 * Function : BuildSrsRsrcSetAddModList
3696 * Functionality: Build SRS resource set Add/mod list
3699 * @return ROK - success
3702 * ****************************************************************/
3703 uint8_t BuildSrsRsrcSetAddModList
3705 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3711 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3714 rsrcSetList->list.count = elementCnt;
3715 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3716 rsrcSetList->list.array = NULLP;
3717 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3718 if(!rsrcSetList->list.array)
3720 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3724 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3726 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3727 if(!rsrcSetList->list.array[rSetIdx])
3729 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3735 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3737 /* Fill Resource Id list in resource set */
3738 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3739 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3740 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3741 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3743 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3748 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3749 rsrcIdList->list.count = elementCnt;
3750 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3751 rsrcIdList->list.array = NULLP;
3752 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3753 if(!rsrcIdList->list.array)
3755 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3759 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3761 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3762 if(!rsrcIdList->list.array[rsrcIdx])
3764 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3770 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3772 /* Fill resource type */
3773 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3774 SRS_ResourceSet__resourceType_PR_aperiodic;
3776 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3777 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3778 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3779 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3781 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3784 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3785 = APERIODIC_SRS_RESRC_TRIGGER;
3787 /* TODO : Fill values for below IEs as expected by Viavi */
3788 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3789 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3792 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3793 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3794 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3795 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3796 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3801 /*******************************************************************
3803 * @brief Builds BWP UL dedicated SRS Config
3807 * Function : BuildBWPUlDedSrsCfg
3809 * Functionality: Builds BWP UL dedicated SRS Config
3811 * @params[in] SRS Config
3812 * @return ROK - success
3815 * ****************************************************************/
3816 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3818 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3819 srsCfg->srs_ResourceSetToAddModList = NULLP;
3820 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3821 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3822 if(!srsCfg->srs_ResourceSetToAddModList)
3824 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3827 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3832 srsCfg->srs_ResourceToReleaseList = NULLP;
3834 /* Resource to Add/Modify list */
3835 srsCfg->srs_ResourceToAddModList = NULLP;
3836 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3837 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3838 if(!srsCfg->srs_ResourceToAddModList)
3840 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3844 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3849 srsCfg->tpc_Accumulation = NULLP;
3854 /*******************************************************************
3856 * @brief Builds inital UL BWP
3860 * Function : BuildInitialUlBWP
3862 * Functionality: Builds initial UL BWP
3864 * @params[in] BWP_UplinkDedicated_t *ulBwp
3865 * @return ROK - success
3868 * ****************************************************************/
3869 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3871 ulBwp->pucch_Config = NULLP;
3873 /* Fill BWP UL dedicated PUSCH config */
3874 ulBwp->pusch_Config = NULLP;
3875 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3876 if(!ulBwp->pusch_Config)
3878 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3882 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3883 ulBwp->pusch_Config->choice.setup = NULLP;
3884 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3885 if(!ulBwp->pusch_Config->choice.setup)
3887 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3891 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3896 ulBwp->configuredGrantConfig = NULLP;
3898 /* Fill BPW UL dedicated SRS config */
3899 ulBwp->srs_Config = NULLP;
3900 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3901 if(!ulBwp->srs_Config)
3903 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3907 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3908 ulBwp->srs_Config->choice.setup = NULLP;
3909 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3910 if(!ulBwp->srs_Config->choice.setup)
3912 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3916 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3921 ulBwp->beamFailureRecoveryConfig = NULLP;
3926 /*******************************************************************
3928 * @brief Builds Pusch Serving cell Config
3932 * Function : BuildPuschSrvCellCfg
3934 * Functionality: Builds Pusch Serving cell Config
3936 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3938 * @return ROK - success
3941 * ****************************************************************/
3942 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3944 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3945 puschCfg->choice.setup = NULLP;
3946 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3947 if(!puschCfg->choice.setup)
3949 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3953 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3954 puschCfg->choice.setup->rateMatching = NULLP;
3955 puschCfg->choice.setup->xOverhead = NULLP;
3956 puschCfg->choice.setup->ext1 = NULLP;
3957 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
3958 if(!puschCfg->choice.setup->ext1)
3960 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3964 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
3965 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
3966 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
3968 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3971 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
3973 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
3974 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
3975 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
3977 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3980 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
3984 /*******************************************************************
3986 * @brief Builds UL config
3989 * Function : BuildUlCfg
3991 * Functionality: Builds UL config in spCellCfgDed
3993 * @params[in] UplinkConfig_t *ulCfg
3995 * @return ROK - success
3998 * ****************************************************************/
3999 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4001 ulCfg->initialUplinkBWP = NULLP;
4002 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4003 if(!ulCfg->initialUplinkBWP)
4005 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4009 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4014 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4015 ulCfg->uplinkBWP_ToAddModList = NULLP;
4016 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4017 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4018 if(!ulCfg->firstActiveUplinkBWP_Id)
4020 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4023 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4025 ulCfg->pusch_ServingCellConfig = NULLP;
4026 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4027 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4028 if(!ulCfg->pusch_ServingCellConfig)
4030 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4034 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4039 ulCfg->carrierSwitching = NULLP;
4040 ulCfg->ext1 = NULLP;
4044 /*******************************************************************
4046 * @brief Builds PDSCH serving cell config
4049 * Function : BuildPdschSrvCellCfg
4051 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4053 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4055 * @return ROK - success
4058 * ****************************************************************/
4059 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4061 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4062 pdschCfg->choice.setup = NULLP;
4063 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4064 if(!pdschCfg->choice.setup)
4066 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4070 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4071 pdschCfg->choice.setup->xOverhead = NULLP;
4072 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4073 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4074 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4076 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4079 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4080 pdschCfg->choice.setup->pucch_Cell = NULLP;
4081 pdschCfg->choice.setup->ext1 = NULLP;
4086 /*******************************************************************
4088 * @brief Builds CSI Meas config
4091 * Function : BuildCsiMeasCfg
4093 * Functionality: Builds CSI Meas config in spCellCfgDed
4095 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4097 * @return ROK - success
4100 * ****************************************************************/
4101 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4107 /*******************************************************************
4109 * @brief Builds Spcell config dedicated
4112 * Function : BuildSpCellCfgDed
4114 * Functionality: Builds sp cell config dedicated in spCellCfg
4116 * @params[in] ServingCellConfig_t srvCellCfg
4118 * @return ROK - success
4121 * ****************************************************************/
4122 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4124 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4126 srvCellCfg->initialDownlinkBWP = NULLP;
4127 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4128 if(!srvCellCfg->initialDownlinkBWP)
4130 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4134 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4136 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
4139 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4140 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4142 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4143 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4144 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4146 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4149 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4151 srvCellCfg->bwp_InactivityTimer = NULLP;
4153 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4154 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4155 if(!srvCellCfg->defaultDownlinkBWP_Id)
4157 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4160 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4162 srvCellCfg->uplinkConfig = NULLP;
4163 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4164 if(!srvCellCfg->uplinkConfig)
4166 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4170 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4172 DU_LOG("\nF1AP : BuildUlCfg failed");
4175 srvCellCfg->supplementaryUplink = NULLP;
4176 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4178 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4179 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4180 if(!srvCellCfg->pdsch_ServingCellConfig)
4182 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4186 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4188 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
4192 srvCellCfg->csi_MeasConfig = NULLP;
4194 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4195 if(!srvCellCfg->csi_MeasConfig)
4197 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4201 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4203 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4207 srvCellCfg->sCellDeactivationTimer = NULLP;
4208 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4209 srvCellCfg->tag_Id = TAG_ID;
4210 srvCellCfg->dummy = NULLP;
4211 srvCellCfg->pathlossReferenceLinking = NULLP;
4212 srvCellCfg->servingCellMO = NULLP;
4213 srvCellCfg->ext1 = NULLP;
4217 /*******************************************************************
4219 * @brief Builds Spcell config
4223 * Function : BuildSpCellCfg
4225 * Functionality: Builds sp cell config in DuToCuRrcContainer
4227 * @params[in] SpCellConfig_t spCellCfg
4229 * @return ROK - success
4232 * ****************************************************************/
4233 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4236 spCellCfg->servCellIndex = NULLP;
4237 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4238 if(!spCellCfg->servCellIndex)
4240 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4243 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4245 spCellCfg->reconfigurationWithSync = NULLP;
4246 spCellCfg->rlf_TimersAndConstants = NULLP;
4247 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4248 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4249 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4251 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4254 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4256 spCellCfg->spCellConfigDedicated = NULLP;
4257 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4258 if(!spCellCfg->spCellConfigDedicated)
4260 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4263 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4265 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4270 /*******************************************************************
4272 * @brief Builds Phy cell group config
4276 * Function : BuildPhyCellGrpCfg
4278 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4280 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4282 * @return ROK - success
4285 * ****************************************************************/
4286 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4288 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4289 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4291 phyCellGrpCfg->p_NR_FR1 = NULLP;
4292 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4293 if(!phyCellGrpCfg->p_NR_FR1)
4295 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4298 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4299 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4300 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4301 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4302 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4303 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4304 phyCellGrpCfg->cs_RNTI = NULLP;
4305 phyCellGrpCfg->ext1 = NULLP;
4306 phyCellGrpCfg->ext2 = NULLP;
4311 /*******************************************************************
4313 * @brief Builds tag config
4317 * Function : BuildTagConfig
4319 * Functionality: Builds tag config in MacCellGroupConfig
4321 * @params[in] TAG_Config *tag_Config
4323 * @return ROK - success
4326 * ****************************************************************/
4327 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4329 struct TAG_Config__tag_ToAddModList *tagList;
4330 uint8_t idx, elementCnt;
4332 tagConfig->tag_ToReleaseList = NULLP;
4333 tagConfig->tag_ToAddModList = NULLP;
4334 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4335 if(!tagConfig->tag_ToAddModList)
4337 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4341 elementCnt = 1; //ODU_VALUE_ONE;
4342 tagList = tagConfig->tag_ToAddModList;
4343 tagList->list.count = elementCnt;
4344 tagList->list.size = elementCnt * sizeof(struct TAG *);
4346 tagList->list.array = NULLP;
4347 CU_ALLOC(tagList->list.array, tagList->list.size);
4348 if(!tagList->list.array)
4350 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4354 for(idx=0; idx<tagList->list.count; idx++)
4356 tagList->list.array[idx] = NULLP;
4357 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4358 if(!tagList->list.array[idx])
4360 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4366 tagList->list.array[idx]->tag_Id = TAG_ID;
4367 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4372 /*******************************************************************
4374 * @brief Builds PHR Config
4378 * Function : BuildPhrConfig
4380 * Functionality: Builds phrConfig in MacCellGroupConfig
4382 * @params[in] PHR Config *
4384 * @return ROK - success
4387 * ****************************************************************/
4388 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4391 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4392 phrConfig->choice.setup = NULLP;
4393 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4394 if(!phrConfig->choice.setup)
4396 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
4400 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4401 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4402 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4403 phrConfig->choice.setup->multiplePHR = false;
4404 phrConfig->choice.setup->dummy = false;
4405 phrConfig->choice.setup->phr_Type2OtherCell = false;
4406 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4411 /*******************************************************************
4413 * @brief Builds BSR Config
4417 * Function : BuildBsrConfig
4419 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4421 * @params[in] BSR_Config *bsrConfig
4423 * @return ROK - success
4426 * ****************************************************************/
4427 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4429 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4430 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4431 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4436 /*******************************************************************
4438 * @brief Builds scheduling request config
4442 * Function : BuildSchedulingReqConfig
4444 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4446 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4448 * @return ROK - success
4451 * ****************************************************************/
4452 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4454 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4455 uint8_t idx, elementCnt;
4457 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4458 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4459 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4460 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4462 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4466 elementCnt = 1; //ODU_VALUE_ONE;
4467 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4468 schReqList->list.count = elementCnt;
4469 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4471 schReqList->list.array = NULLP;
4472 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4473 if(!schReqList->list.array)
4475 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4479 for(idx=0;idx<schReqList->list.count; idx++)
4481 schReqList->list.array[idx] = NULLP;
4482 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4483 if(!schReqList->list.array[idx])
4485 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4491 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4493 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4494 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4495 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4497 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4500 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4501 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4502 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4506 /*******************************************************************
4508 * @brief Builds Mac cell group config
4512 * Function : BuildMacCellGrpCfg
4514 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4516 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4518 * @return ROK - success
4521 * ****************************************************************/
4522 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4524 macCellGrpCfg->drx_Config = NULLP;
4525 macCellGrpCfg->schedulingRequestConfig = NULLP;
4526 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4527 if(!macCellGrpCfg->schedulingRequestConfig)
4529 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4533 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4535 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4539 macCellGrpCfg->bsr_Config = NULLP;
4540 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4541 if(!macCellGrpCfg->bsr_Config)
4543 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4547 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4549 DU_LOG("\nF1AP : BuildBsrConfig failed");
4553 macCellGrpCfg->tag_Config = NULLP;
4554 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4555 if(!macCellGrpCfg->tag_Config)
4557 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4561 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4563 DU_LOG("\nF1AP : BuildTagConfig failed");
4567 macCellGrpCfg->phr_Config = NULLP;
4568 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4569 if(!macCellGrpCfg->phr_Config)
4571 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4575 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4577 DU_LOG("\nF1AP : BuildPhrConfig failed");
4581 macCellGrpCfg->skipUplinkTxDynamic = false;
4582 macCellGrpCfg->ext1 = NULLP;
4586 /*******************************************************************
4588 * @brief Frees memeory allocated for SearchSpcToAddModList
4592 * Function : FreeSearchSpcToAddModList
4594 * Functionality: Deallocating memory of SearchSpcToAddModList
4596 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4600 4221 * ****************************************************************/
4601 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4605 struct SearchSpace *searchSpc=NULLP;
4607 if(searchSpcList->list.array)
4609 if(searchSpcList->list.array[idx2])
4611 searchSpc = searchSpcList->list.array[idx2];
4612 if(searchSpc->controlResourceSetId)
4614 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4616 if(searchSpc->monitoringSymbolsWithinSlot)
4618 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4620 if(searchSpc->nrofCandidates)
4622 if(searchSpc->searchSpaceType)
4624 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4625 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4626 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4627 SearchSpace__searchSpaceType));
4629 CU_FREE(searchSpc->nrofCandidates,
4630 sizeof(struct SearchSpace__nrofCandidates));
4632 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4633 searchSpc->monitoringSymbolsWithinSlot->size);
4635 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4636 sizeof(BIT_STRING_t));
4638 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4639 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4641 CU_FREE(searchSpc->controlResourceSetId,
4642 sizeof(ControlResourceSetId_t));
4645 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4647 CU_FREE(searchSpcList->list.array[idx1],
4648 sizeof(struct SearchSpace));
4650 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4653 /*******************************************************************
4655 * @brief Frees memory allocated for PdschTimeDomAllocList
4659 * Function : FreePdschTimeDomAllocList
4661 * Functionality: Deallocating memory of PdschTimeDomAllocList
4663 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4667 4221 * ****************************************************************/
4668 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4672 if(timeDomAllocList->choice.setup)
4674 if(timeDomAllocList->choice.setup->list.array)
4676 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4678 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4679 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4681 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4682 timeDomAllocList->choice.setup->list.size);
4684 CU_FREE(timeDomAllocList->choice.setup,\
4685 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4688 /*******************************************************************
4690 * @brief Frees memory allocated for PuschTimeDomAllocList
4694 * Function : FreePuschTimeDomAllocList
4696 * Functionality: Deallocating memory of PuschTimeDomAllocList
4698 * @params[in] PUSCH_Config_t *puschCfg
4702 ***********************************************************************/
4703 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4707 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4709 if(puschCfg->pusch_TimeDomainAllocationList)
4711 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4712 if(timeDomAllocList_t->choice.setup)
4714 if(timeDomAllocList_t->choice.setup->list.array)
4716 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4717 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4719 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4720 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4722 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4723 timeDomAllocList_t->choice.setup->list.size);
4725 CU_FREE(timeDomAllocList_t->choice.setup, \
4726 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4728 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4729 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4730 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4734 /*******************************************************************
4736 * @brief Frees memory allocated for InitialUlBWP
4740 * Function : FreeInitialUlBWP
4742 * Functionality: Deallocating memory of InitialUlBWP
4744 * @params[in] BWP_UplinkDedicated_t *ulBwp
4748 * ****************************************************************/
4749 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4751 uint8_t rSetIdx, rsrcIdx;
4752 SRS_Config_t *srsCfg = NULLP;
4753 PUSCH_Config_t *puschCfg = NULLP;
4754 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4755 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4756 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4757 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4759 if(ulBwp->pusch_Config)
4761 if(ulBwp->pusch_Config->choice.setup)
4763 puschCfg=ulBwp->pusch_Config->choice.setup;
4764 if(puschCfg->dataScramblingIdentityPUSCH)
4766 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4768 FreePuschTimeDomAllocList(puschCfg);
4769 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4770 if(dmrsUlCfg->choice.setup)
4772 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4774 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4776 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4778 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4779 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4781 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4784 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4786 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4787 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4789 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4791 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4793 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4795 /* Free SRS-Config */
4796 if(ulBwp->srs_Config)
4798 if(ulBwp->srs_Config->choice.setup)
4800 srsCfg = ulBwp->srs_Config->choice.setup;
4802 /* Free Resource Set to add/mod list */
4803 if(srsCfg->srs_ResourceSetToAddModList)
4805 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4806 if(rsrcSetList->list.array)
4810 /* Free SRS resource Id list in this SRS resource set */
4811 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4813 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4815 if(rsrcIdList->list.array)
4817 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4819 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4821 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4823 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4824 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4827 /* Free resource type info for this SRS resource set */
4828 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4829 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4831 /* Free memory for each resource set */
4832 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4834 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4836 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4838 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4839 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4842 /* Free resource to add/modd list */
4843 if(srsCfg->srs_ResourceToAddModList)
4845 resourceList = srsCfg->srs_ResourceToAddModList;
4846 if(resourceList->list.array)
4849 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4850 sizeof(struct SRS_Resource__transmissionComb__n2));
4851 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4852 sizeof(struct SRS_Resource__resourceType__aperiodic));
4854 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4856 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4858 CU_FREE(resourceList->list.array, resourceList->list.size);
4860 CU_FREE(srsCfg->srs_ResourceToAddModList, \
4861 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4864 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4866 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4870 /*******************************************************************
4872 * @brief Frees memory allocated for initialUplinkBWP
4876 * Function : FreeinitialUplinkBWP
4878 * Functionality: Deallocating memory of initialUplinkBWP
4880 * @params[in] UplinkConfig_t *ulCfg
4885 * ****************************************************************/
4886 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4888 BWP_UplinkDedicated_t *ulBwp=NULLP;
4889 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4891 if(ulCfg->initialUplinkBWP)
4893 ulBwp=ulCfg->initialUplinkBWP;
4894 if(ulCfg->firstActiveUplinkBWP_Id)
4896 if(ulCfg->pusch_ServingCellConfig)
4898 puschCfg=ulCfg->pusch_ServingCellConfig;
4899 if(puschCfg->choice.setup)
4901 if(puschCfg->choice.setup->ext1)
4903 CU_FREE(puschCfg->choice.setup->ext1->\
4904 processingType2Enabled,sizeof(BOOLEAN_t));
4905 CU_FREE(puschCfg->choice.setup->ext1->\
4906 maxMIMO_Layers,sizeof(long));
4907 CU_FREE(puschCfg->choice.setup->ext1, \
4908 sizeof(struct PUSCH_ServingCellConfig__ext1));
4910 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4912 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4914 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4916 FreeInitialUlBWP(ulBwp);
4917 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4920 /*******************************************************************
4922 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4926 * Function : FreeBWPDlDedPdschCfg
4928 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4930 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4935 * ****************************************************************/
4936 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4938 struct PDSCH_Config *pdschCfg=NULLP;
4939 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4940 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4941 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
4943 if(dlBwp->pdsch_Config->choice.setup)
4945 pdschCfg=dlBwp->pdsch_Config->choice.setup;
4946 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4948 if(pdschCfg->pdsch_TimeDomainAllocationList)
4950 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
4951 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
4953 prbBndlType=&pdschCfg->prb_BundlingType;
4954 CU_FREE(prbBndlType->choice.staticBundling,\
4955 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
4956 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
4958 FreePdschTimeDomAllocList(timeDomAllocList);
4959 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
4960 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
4962 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
4963 if(dmrsDlCfg->choice.setup)
4965 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
4967 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
4969 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
4970 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
4972 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
4975 /*******************************************************************
4977 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
4981 * Function : FreeBWPDlDedPdcchCfg
4983 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
4985 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4990 * ****************************************************************/
4991 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
4995 struct PDCCH_Config *pdcchCfg=NULLP;
4996 struct ControlResourceSet *controlRSet=NULLP;
4997 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
4999 if(dlBwp->pdcch_Config->choice.setup)
5001 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5002 if(pdcchCfg->controlResourceSetToAddModList)
5004 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5005 if(controlRSetList->list.array)
5007 controlRSet = controlRSetList->list.array[idx2];
5010 if(controlRSet->frequencyDomainResources.buf)
5012 if(controlRSet->pdcch_DMRS_ScramblingID)
5014 if(pdcchCfg->searchSpacesToAddModList)
5016 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5017 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5018 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5020 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5022 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5023 controlRSet->frequencyDomainResources.size);
5026 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5028 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5030 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5032 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5033 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5035 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5038 /*******************************************************************
5040 * @brief Builds RLC Config
5044 * Function : BuildRlcConfig
5046 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5048 * @params[in] RLC_Config *rlcConfig
5050 * @return ROK - success
5053 * ****************************************************************/
5054 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5057 rlcConfig->present = RLC_Config_PR_am;
5059 rlcConfig->choice.am = NULLP;
5060 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5061 if(!rlcConfig->choice.am)
5063 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5068 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5069 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5070 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5072 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5075 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5076 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5077 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5078 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5079 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5082 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5083 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5084 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5086 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5089 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5090 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5091 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5096 /*******************************************************************
5098 * @brief Builds MAC LC Config
5102 * Function : BuildMacLCConfig
5104 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5106 * @params[in] struct LogicalChannelConfig macLcConfig
5108 * @return ROK - success
5111 * ****************************************************************/
5112 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5115 macLcConfig->ul_SpecificParameters = NULLP;
5116 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5117 if(!macLcConfig->ul_SpecificParameters)
5119 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5123 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5124 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5125 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5126 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5127 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5128 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5129 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5131 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5132 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5133 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5135 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5138 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5140 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5141 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5142 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5144 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5147 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5149 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5150 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5151 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5155 /*******************************************************************
5157 * @brief Builds RLC Bearer to Add/Mod list
5161 * Function :BuildRlcBearerToAddModList
5163 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5165 * @params[in] rlc_BearerToAddModList
5167 * @return ROK - success
5170 * ****************************************************************/
5171 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5173 uint8_t idx, elementCnt;
5176 rlcBearerList->list.count = elementCnt;
5177 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5179 rlcBearerList->list.array = NULLP;
5180 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5181 if(!rlcBearerList->list.array)
5183 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5187 for(idx=0; idx<rlcBearerList->list.count; idx++)
5189 rlcBearerList->list.array[idx] = NULLP;
5190 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5191 if(!rlcBearerList->list.array[idx])
5193 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5199 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5201 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5202 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5204 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5208 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5209 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5211 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5212 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5213 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5214 if(!rlcBearerList->list.array[idx]->rlc_Config)
5216 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5220 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5222 DU_LOG("\nF1AP : BuildRlcConfig failed");
5226 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5227 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5228 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5230 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5234 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5236 DU_LOG("\nF1AP : BuildMacLCConfig failed");
5243 /*******************************************************************
5245 * @brief Free memory allocated for CellGroupConfig
5249 * Function : FreeMemCellGrpCfg
5251 * Functionality: Deallocating memory of CellGroupConfig
5253 * @params[in] pointer to CellGroupConfigRrc_t
5255 * @return ROK - success
5258 ******************************************************************/
5259 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5262 SpCellConfig_t *spCellCfg=NULLP;
5263 ServingCellConfig_t *srvCellCfg=NULLP;
5264 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5265 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5266 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5267 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5268 struct RLC_Config *rlcConfig=NULLP;
5269 struct LogicalChannelConfig *macLcConfig=NULLP;
5270 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5271 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5272 struct TAG_Config *tagConfig=NULLP;
5273 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5274 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5275 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5277 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5280 if(rlcBearerList->list.array)
5282 for(idx=0; idx<rlcBearerList->list.count; idx++)
5284 if(rlcBearerList->list.array[idx])
5286 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5287 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5290 if(rlcConfig->choice.am)
5292 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5293 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5294 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5296 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5298 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5301 if(macLcConfig->ul_SpecificParameters)
5303 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5304 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5305 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5307 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5309 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5312 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5314 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5317 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5320 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5321 if(schedulingRequestConfig)
5323 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5326 if(schReqList->list.array)
5328 for(idx=0;idx<schReqList->list.count; idx++)
5330 if(schReqList->list.array[idx])
5332 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5333 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5336 CU_FREE(schReqList->list.array, schReqList->list.size);
5338 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5339 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5340 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5342 if(macCellGrpCfg->bsr_Config)
5344 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5346 tagConfig = macCellGrpCfg->tag_Config;
5349 tagList = tagConfig->tag_ToAddModList;
5352 if(tagList->list.array)
5354 for(idx=0; idx<tagList->list.count; idx++)
5356 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5358 CU_FREE(tagList->list.array, tagList->list.size);
5360 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5362 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5365 phrConfig = macCellGrpCfg->phr_Config;
5368 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5369 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5372 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5375 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5378 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5379 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5382 spCellCfg = cellGrpCfg->spCellConfig;
5385 if(spCellCfg->servCellIndex)
5387 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5389 if(spCellCfg->spCellConfigDedicated)
5391 srvCellCfg = spCellCfg->spCellConfigDedicated;
5392 if(srvCellCfg->initialDownlinkBWP)
5394 dlBwp = srvCellCfg->initialDownlinkBWP;
5395 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5397 if(srvCellCfg->defaultDownlinkBWP_Id)
5399 if(srvCellCfg->uplinkConfig)
5401 if(srvCellCfg->pdsch_ServingCellConfig)
5403 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5404 if(pdschCfg->choice.setup)
5406 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5407 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5409 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5410 ServingCellConfig__pdsch_ServingCellConfig));
5412 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5413 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5415 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5417 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5419 if(dlBwp->pdcch_Config)
5421 if(dlBwp->pdsch_Config)
5423 FreeBWPDlDedPdschCfg(dlBwp);
5424 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5426 FreeBWPDlDedPdcchCfg(dlBwp);
5427 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5429 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5431 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5433 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5435 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5437 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5442 /*******************************************************************
5444 * @brief Fills CellGroupConfig
5448 * Function : fillCellGrpCfg
5450 * Functionality: Fills CellGroupConfig
5452 * @params[in] pointer to CellGroupConfigRrc_t
5454 * @return ROK - success
5457 ******************************************************************/
5459 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5461 uint8_t ret = RFAILED;
5462 CellGroupConfigRrc_t cellGrpCfg;
5463 asn_enc_rval_t encRetVal;
5467 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5469 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5470 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5471 if(!cellGrpCfg.rlc_BearerToAddModList)
5473 DU_LOG("\nF1AP : Memory allocation failure in CellGrpConfig");
5476 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5478 DU_LOG("\nF1AP : fillCellGrpCfg failed");
5482 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5483 cellGrpCfg.mac_CellGroupConfig = NULLP;
5484 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5485 if(!cellGrpCfg.mac_CellGroupConfig)
5487 DU_LOG("\nF1AP : Memory allocation failure in fillCellGrpCfg");
5490 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5492 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
5497 cellGrpCfg.physicalCellGroupConfig = NULLP;
5498 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5499 if(!cellGrpCfg.physicalCellGroupConfig)
5501 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5504 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5506 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
5510 cellGrpCfg.spCellConfig = NULLP;
5511 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5512 if(!cellGrpCfg.spCellConfig)
5514 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5517 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5519 DU_LOG("\nF1AP : BuildSpCellCfg failed");
5523 cellGrpCfg.sCellToAddModList = NULLP;
5524 cellGrpCfg.sCellToReleaseList = NULLP;
5525 cellGrpCfg.ext1 = NULLP;
5527 /* encode cellGrpCfg into duToCuRrcContainer */
5528 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5529 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5531 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5532 /* Encode results */
5533 if(encRetVal.encoded == ENCODE_FAIL)
5535 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5536 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5541 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5542 for(int i=0; i< encBufSize; i++)
5544 printf("%x",encBuf[i]);
5548 cellGrp->size = encBufSize;
5549 CU_ALLOC(cellGrp->buf, cellGrp->size);
5552 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5555 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5559 FreeMemCellGrpCfg(&cellGrpCfg);
5563 /*******************************************************************
5565 * @brief Fills CuToDuContainer
5569 * Function : fillCuToDuContainer
5571 * Functionality: Fills CuToDuContainer
5573 * @params[in] pointer to CUtoDURRCInformation_t
5575 * @return ROK - success
5578 ******************************************************************/
5580 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
5582 uint8_t elementCnt = 0;
5584 uint8_t idx, idx2, rrcBufLen;
5587 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
5588 if(rrcMsg->iE_Extensions)
5590 rrcMsg->iE_Extensions->list.count = elementCnt;
5591 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
5593 /* Initialize the CUtoDURRCInformation_ExtIEs */
5594 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
5596 if(rrcMsg->iE_Extensions->list.array == NULLP)
5598 DU_LOG(" F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
5602 for(idx=0; idx<elementCnt; idx++)
5604 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
5605 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
5611 /* Filling CellGroupConfig_t IE */
5612 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
5613 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
5614 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
5615 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
5616 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
5621 /*******************************************************************
5623 * @brief Free CuToDuContainer
5627 * Function : FreeCuToDuInfo
5629 * Functionality: Free CuToDuContainer
5631 * @params[in] pointer to CUtoDURRCInformation_t
5633 * @return ROK - success
5636 ******************************************************************/
5638 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
5642 if(rrcMsg->iE_Extensions)
5644 if(rrcMsg->iE_Extensions->list.array)
5646 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
5648 if(rrcMsg->iE_Extensions->list.array[idx])
5650 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
5652 case ProtocolIE_ID_id_CellGroupConfig:
5653 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
5655 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
5656 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
5661 DU_LOG("\nF1AP:Invalid Event type %ld at FreeCuToDuInfo()", \
5662 rrcMsg->iE_Extensions->list.array[idx]->id);
5668 for(idx2 = 0; idx2 < idx; idx2++)
5670 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
5672 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
5676 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
5679 /*******************************************************************
5681 * @brief Builds and sends the UE Setup Request
5685 * Function : BuildAndSendUeContextSetupReq
5687 * Functionality: Constructs the UE Setup Request and sends
5688 * it to the CU through SCTP.
5692 * @return ROK - success
5695 * ****************************************************************/
5696 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
5697 uint16_t rrcContLen, uint8_t *rrcContainer)
5700 uint8_t SplCellListret;
5701 uint8_t SrbSetupret;
5705 F1AP_PDU_t *f1apMsg = NULLP;
5706 UEContextSetupRequest_t *ueSetReq = NULLP;
5707 asn_enc_rval_t encRetVal; /* Encoder return value */
5708 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5709 uint8_t ret= RFAILED;
5713 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
5715 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5716 if(f1apMsg == NULLP)
5718 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5722 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5723 CU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5724 if(f1apMsg->choice.initiatingMessage == NULLP)
5726 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5730 f1apMsg->choice.initiatingMessage->procedureCode = \
5731 ProcedureCode_id_UEContextSetup;
5732 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
5733 f1apMsg->choice.initiatingMessage->value.present = \
5734 InitiatingMessage__value_PR_UEContextSetupRequest;
5736 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
5739 ueSetReq->protocolIEs.list.count = elementCnt;
5740 ueSetReq->protocolIEs.list.size = \
5741 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
5743 /* Initialize the UESetup members */
5744 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
5746 if(ueSetReq->protocolIEs.list.array == NULLP)
5748 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
5752 for(idx1=0; idx1<elementCnt; idx1++)
5754 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
5755 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
5763 /*GNB CU UE F1AP ID*/
5764 ueSetReq->protocolIEs.list.array[idx]->id = \
5765 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
5766 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5767 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5768 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
5769 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
5771 /*GNB DU UE F1AP ID*/
5773 ueSetReq->protocolIEs.list.array[idx]->id = \
5774 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5775 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5776 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5777 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
5778 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
5782 ueSetReq->protocolIEs.list.array[idx]->id = \
5783 ProtocolIE_ID_id_SpCell_ID;
5784 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5785 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5786 UEContextSetupRequestIEs__value_PR_NRCGI;
5787 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
5793 /*Served Cell Index*/
5795 ueSetReq->protocolIEs.list.array[idx]->id = \
5796 ProtocolIE_ID_id_ServCellIndex;
5797 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5798 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5799 UEContextSetupRequestIEs__value_PR_ServCellIndex;
5800 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
5803 /*CellULConfigured*/
5805 ueSetReq->protocolIEs.list.array[idx]->id = \
5806 ProtocolIE_ID_id_SpCellULConfigured;
5807 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5808 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5809 UEContextSetupRequestIEs__value_PR_CellULConfigured;
5810 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
5811 CellULConfigured_none;
5813 /*CUtoDURRCContainer*/
5815 ueSetReq->protocolIEs.list.array[idx]->id = \
5816 ProtocolIE_ID_id_CUtoDURRCInformation;
5817 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5818 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5819 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
5820 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
5825 /*Special Cells to be SetupList*/
5827 ueSetReq->protocolIEs.list.array[idx]->id = \
5828 ProtocolIE_ID_id_SCell_ToBeSetup_List;
5829 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5830 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5831 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
5832 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
5833 if(SplCellListret != ROK)
5837 /*SRBs To Be Setup List*/
5839 ueSetReq->protocolIEs.list.array[idx]->id = \
5840 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
5841 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5842 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5843 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
5844 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
5845 if(SrbSetupret != ROK)
5849 /*DRBs to Be Setup List*/
5851 ueSetReq->protocolIEs.list.array[idx]->id = \
5852 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
5853 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5854 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5855 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
5856 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
5864 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
5865 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5866 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5867 UEContextSetupRequestIEs__value_PR_RRCContainer;
5868 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = rrcContLen;
5869 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
5870 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
5871 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
5873 DU_LOG(" F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
5876 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
5877 rrcContainer, ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
5879 /* RRC delivery status request */
5881 ueSetReq->protocolIEs.list.array[idx]->id = \
5882 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
5883 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5884 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5885 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
5886 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
5887 RRCDeliveryStatusRequest_true;
5889 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5891 /* Encode the F1SetupRequest type as APER */
5892 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5894 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
5896 /* Encode results */
5897 if(encRetVal.encoded == ENCODE_FAIL)
5899 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
5900 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5905 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
5906 for(int i=0; i< encBufSize; i++)
5908 printf("%x",encBuf[i]);
5913 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
5915 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
5921 FreeUeContextSetupReq(f1apMsg);
5924 }/* End of BuildAndSendUeContextSetupReq*/
5926 /****************************************************************
5927 * @brief Function to process Ul Rrc Msg received from DU
5931 * Function : procUlRrcMsg
5934 * - Function to process Ul Rrc Msg received from DU
5937 * @return ROK - success
5940 * ****************************************************************/
5942 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
5944 uint8_t idx, ret, srbId, rrcMsgType;
5945 uint8_t cuUeF1apId, duUeF1apId;
5946 uint8_t *rrcContainer = NULLP;
5947 uint16_t rrcContLen;
5948 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
5951 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
5953 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
5955 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
5957 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
5959 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
5962 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
5964 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
5967 case ProtocolIE_ID_id_SRBID:
5968 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
5970 case ProtocolIE_ID_id_RRCContainer:
5972 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
5973 CU_ALLOC(rrcContainer, rrcContLen)
5976 DU_LOG("\nCU_STUB: Failed to allocated memory in procUlRrcMsg");
5979 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
5985 DU_LOG("\n Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
5991 f1apMsgDb.dlRrcMsgCount++;
5992 rrcMsgType = setDlRRCMsgType();
5993 if(rrcMsgType == RRC_SECURITY_MODE_COMMAND)
5995 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId, rrcContLen, rrcContainer);
5997 if(rrcMsgType == RRC_RECONFIG)
5999 ret = BuildAndSendDLRRCMessageTransfer(rrcMsgType);
6005 /****************************************************************
6006 * @brief Build And Send F1ResetAck
6010 * Function : FreeF1ResetAck
6013 * - Build And Send F1ResetRSP
6016 * @return ROK - success
6019 * ****************************************************************/
6020 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6023 ResetAcknowledge_t *f1ResetAck;
6027 if(f1apMsg->choice.successfulOutcome)
6029 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6031 if(f1ResetAck->protocolIEs.list.array)
6033 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6035 if(f1ResetAck->protocolIEs.list.array[idx])
6037 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6040 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6042 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6044 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6048 /****************************************************************
6049 * @brief Build And Send F1ResetAck
6053 * Function : BuildAndSendF1ResetAck
6056 * - Build And Send F1ResetRSP
6059 * @return ROK - success
6062 * ****************************************************************/
6064 uint8_t BuildAndSendF1ResetAck()
6067 uint8_t elementCnt = 0;
6068 uint8_t ret = RFAILED;
6069 F1AP_PDU_t *f1apMsg = NULL;
6070 ResetAcknowledge_t *f1ResetAck = NULLP;
6071 asn_enc_rval_t encRetVal;
6072 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
6075 /* Allocate the memory for F1ResetRequest_t */
6076 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6077 if(f1apMsg == NULLP)
6079 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6083 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6085 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6086 if(f1apMsg->choice.successfulOutcome == NULLP)
6088 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6092 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6093 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6094 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6095 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6099 f1ResetAck->protocolIEs.list.count = elementCnt;
6100 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6102 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6103 if(f1ResetAck->protocolIEs.list.array == NULLP)
6105 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
6109 for(idx=0; idx<elementCnt; idx++)
6111 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6112 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6119 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6120 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6121 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6122 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6124 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6126 /* Encode the F1SetupRequest type as UPER */
6127 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6129 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6131 /* Check encode results */
6132 if(encRetVal.encoded == ENCODE_FAIL)
6134 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
6135 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6140 DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck \n");
6141 for(int i=0; i< encBufSize; i++)
6143 printf("%x",encBuf[i]);
6147 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6149 DU_LOG("\nF1AP : Sending F1 Reset Response failed");
6157 FreeF1ResetAck(f1apMsg);
6161 /*******************************************************************
6163 * @brief Handles received F1AP message and sends back response
6167 * Function : F1APMsgHdlr
6170 * - Decodes received F1AP control message
6171 * - Prepares response message, encodes and sends to SCTP
6174 * @return ROK - success
6177 * ****************************************************************/
6178 void F1APMsgHdlr(Buffer *mBuf)
6184 F1AP_PDU_t *f1apMsg = NULLP;
6185 asn_dec_rval_t rval; /* Decoder return value */
6186 F1AP_PDU_t f1apasnmsg ;
6188 DU_LOG("\nF1AP : Received F1AP message buffer");
6189 ODU_PRINT_MSG(mBuf, 0,0);
6191 /* Copy mBuf into char array to decode it */
6192 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
6193 CU_ALLOC(recvBuf, (Size)recvBufLen);
6195 if(recvBuf == NULLP)
6197 DU_LOG("\nF1AP : Memory allocation failed");
6200 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
6202 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
6206 printf("\nF1AP : Received flat buffer to be decoded : ");
6207 for(i=0; i< recvBufLen; i++)
6209 printf("%x",recvBuf[i]);
6212 /* Decoding flat buffer into F1AP messsage */
6213 f1apMsg = &f1apasnmsg;
6214 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
6216 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
6217 CU_FREE(recvBuf, (Size)recvBufLen);
6219 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6221 DU_LOG("\nF1AP : ASN decode failed");
6225 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6227 switch(f1apMsg->present)
6229 case F1AP_PDU_PR_initiatingMessage:
6231 switch(f1apMsg->choice.initiatingMessage->value.present)
6233 case InitiatingMessage__value_PR_Reset:
6235 DU_LOG("\nF1AP : F1 reset request received ");
6236 BuildAndSendF1ResetAck();
6240 case InitiatingMessage__value_PR_F1SetupRequest:
6242 DU_LOG("\nF1AP : F1 setup request received");
6243 BuildAndSendF1SetupRsp();
6247 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
6249 DU_LOG("\nF1AP : GNB-DU config update received");
6250 BuildAndSendDUUpdateAck();
6251 DU_LOG("\nF1AP : Sending F1 reset request");
6252 BuildAndSendF1ResetReq();
6255 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
6257 DU_LOG("\nF1AP : Received InitialULRRCMessageTransfer");
6258 procInitULRRCMsg(f1apMsg);
6261 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
6263 DU_LOG("\nF1AP : Received ULRRCMessageTransfer");
6264 procUlRrcMsg(f1apMsg);
6268 case InitiatingMessage__value_PR_RRCDeliveryReport:
6270 DU_LOG("\nF1AP : Received RRC delivery report");
6275 DU_LOG("\nF1AP : Invalid type of intiating message [%d]",f1apMsg->choice.initiatingMessage->value.present);
6278 }/* End of switch(initiatingMessage) */
6282 case F1AP_PDU_PR_successfulOutcome:
6284 switch(f1apMsg->choice.successfulOutcome->value.present)
6286 case SuccessfulOutcome__value_PR_ResetAcknowledge:
6288 DU_LOG("\nF1Reset Acknowledgement is received successfully ");
6291 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
6293 DU_LOG("\nF1AP : UE ContextSetupResponse received");
6298 DU_LOG("\nF1AP : Invalid type of successful outcome message [%d]",\
6299 f1apMsg->choice.successfulOutcome->value.present);
6302 }/* End of switch(successfulOutcome) */
6307 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
6310 }/* End of switch(f1apMsg->present) */
6312 } /* End of F1APMsgHdlr */
6314 /**********************************************************************
6316 **********************************************************************/