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)
1515 uint8_t ret, idx2, bufLen;
1518 if(rrcMsgType == RRC_SETUP)
1520 ret = fillDlCcchRrcMsg(rrcContainer);
1522 DU_LOG("\n F1AP: Failed to fill DL-CCCH Msg at RRC SETUP");
1524 else if(rrcMsgType == REGISTRATION_ACCEPT)
1526 /*Hardcoded RRC Container from reference logs*/
1527 char buf[14] ={0x00, 0x03, 0x2a, 0x80, 0xaf, 0xc0, 0x08, 0x40, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00};
1529 rrcContainer->size = bufLen;
1530 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1531 if(rrcContainer->buf != NULLP)
1533 memset(rrcContainer->buf, 0, encBufSize);
1534 for(idx2 = 0; idx2 < encBufSize; idx2++)
1536 rrcContainer->buf[idx2] = buf[idx2];
1540 else if(rrcMsgType == RRC_RECONFIG)
1542 /*Hardcoded RRC Container from reference logs*/
1544 0x00, 0x04, 0x00, 0xaa, 0x80, 0x40, 0x9a, 0x05, 0x20, 0x00, 0x05, 0xeb, 0xc0, 0x51, 0x50, 0x00,
1545 0x03, 0x00, 0x03, 0xf7, 0x56, 0xec, 0x7f, 0x08, 0x42, 0x10, 0x80, 0x00, 0x10, 0x21, 0x47, 0x84,
1546 0xd1, 0x00, 0x00, 0x00, 0x02, 0x81, 0x5d, 0x10, 0x0a, 0xc2, 0x44, 0x40, 0x2b, 0xb2, 0x07, 0x41,
1547 0x87, 0xa8, 0x02, 0xc7, 0x00, 0x88, 0x05, 0x76, 0x40, 0xe8, 0x30, 0xf5, 0x40, 0x4c, 0x00, 0x10,
1548 0x02, 0x00, 0xa5, 0x83, 0xe0, 0x60, 0x02, 0x10, 0x72, 0x01, 0x0c, 0xa0, 0xa0, 0xd8, 0x00, 0x00,
1549 0x00, 0x01, 0x0f, 0x02, 0x3c, 0x01, 0x80, 0x10, 0x82, 0xb0, 0x40, 0x00, 0x00, 0x02, 0x1e, 0x04,
1550 0x78, 0x07, 0x00, 0x21, 0x05, 0x61, 0x00, 0x00, 0x00, 0x04, 0x3c, 0x08, 0xf0, 0x16, 0x00, 0x42,
1551 0x0a, 0xc3, 0x00, 0x00, 0x00, 0x08, 0x78, 0x11, 0xe0, 0x3c, 0x00, 0x84, 0x14, 0x00, 0x07, 0xe5,
1552 0xc0, 0xa0, 0xd8, 0x42, 0x20, 0x02, 0x80, 0xa0, 0x02, 0x24, 0x47, 0xa0, 0x20, 0x27, 0xa1, 0x22,
1553 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x41, 0x20, 0xc0, 0x80, 0x00, 0x20, 0x80,
1554 0x00, 0x25, 0x20, 0xa0, 0x38, 0x00, 0x00, 0x00, 0x44, 0xa2, 0x82, 0x69, 0xee, 0x0c, 0xad, 0xca,
1555 0x4c, 0x2c, 0x8d, 0x2e, 0x6f, 0x2e, 0x69, 0x2d, 0xce, 0x8c, 0xae, 0x4d, 0xcc, 0xae, 0x80, 0x00,
1556 0x00, 0x00, 0x00, 0x00};
1558 rrcContainer->size = bufLen;
1559 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1560 if(rrcContainer->buf != NULLP)
1562 memset(rrcContainer->buf, 0, encBufSize);
1563 for(idx2 = 0; idx2 < encBufSize; idx2++)
1565 rrcContainer->buf[idx2] = buf[idx2];
1573 /*******************************************************************
1575 * @brief Builds and sends the DLRRCMessageTransfer
1579 * Function : BuildAndSendDLRRCMessageTransfer
1581 * Functionality: Constructs the DL RRC Message Transfer and sends
1582 * it to the CU through SCTP.
1586 * @return ROK - success
1589 * ****************************************************************/
1590 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t srbId, uint8_t rrcMsgType)
1592 uint8_t elementCnt = 0;
1595 F1AP_PDU_t *f1apMsg = NULLP;
1596 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1597 asn_enc_rval_t encRetVal; /* Encoder return value */
1599 DU_LOG("\n F1AP : Building DL RRC Message Transfer Message\n");
1601 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1602 if(f1apMsg == NULLP)
1604 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1608 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1609 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1610 sizeof(InitiatingMessage_t));
1611 if(f1apMsg->choice.initiatingMessage == NULLP)
1613 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1614 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1618 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1619 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1620 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1621 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1624 dlRRCMsg->protocolIEs.list.count = elementCnt;
1625 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1627 /* Initialize the F1Setup members */
1628 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1629 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1631 DU_LOG(" F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1632 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1633 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1637 for(idx=0; idx<elementCnt; idx++)
1639 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1640 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1642 for(ieId=0; ieId<idx; ieId++)
1644 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1645 sizeof(DLRRCMessageTransferIEs_t));
1647 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1648 dlRRCMsg->protocolIEs.list.size);
1649 CU_FREE(f1apMsg->choice.initiatingMessage,\
1650 sizeof(InitiatingMessage_t));
1651 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1656 /* GNB CU UE F1AP ID */
1658 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1659 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1660 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1661 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1662 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1664 /* GNB DU UE F1AP ID */
1666 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1667 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1668 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1669 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1670 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1671 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1675 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1676 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1677 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1678 DLRRCMessageTransferIEs__value_PR_SRBID;
1679 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = srbId;
1683 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1684 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1685 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1686 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1687 BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1689 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1691 /* Encode the F1SetupRequest type as APER */
1692 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1694 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1696 /* Encode results */
1697 if(encRetVal.encoded == ENCODE_FAIL)
1699 DU_LOG( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1700 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1705 DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1706 for(int i=0; i< encBufSize; i++)
1708 printf("%x",encBuf[i]);
1713 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1715 DU_LOG("\n F1AP : Sending DL RRC Message Transfer Failed");
1720 }/* End of BuildAndSendDLRRCMessageTransfer */
1722 /*******************************************************************
1724 * @brief Function to set the Dl RRC Msg Type
1728 * Function : setDlRRCMsgType
1730 * Functionality: Constructs the UE Setup Response and sends
1731 * it to the DU through SCTP.
1735 * @return ROK - success
1738 * ****************************************************************/
1740 uint8_t setDlRRCMsgType()
1742 uint8_t rrcMsgType = 0;
1743 switch(f1apMsgDb.dlRrcMsgCount)
1746 rrcMsgType = RRC_SETUP;
1748 case REGISTRATION_ACCEPT:
1749 rrcMsgType = REGISTRATION_ACCEPT;
1751 case UE_CONTEXT_SETUP_REQ:
1752 rrcMsgType = UE_CONTEXT_SETUP_REQ;
1755 rrcMsgType = RRC_RECONFIG;
1763 /*******************************************************************
1765 * @brief Function to build Initial UL RRC Message
1769 * Function : procInitULRRCMsg
1771 * Functionality: Function to build Initial UL RRC Message
1775 * @return ROK - success
1778 * ****************************************************************/
1780 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1782 uint8_t idx, rrcMsgType;
1784 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1785 DU_LOG("\n filling the required values in DB in procInitULRRCMsg");
1787 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1789 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1791 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1793 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1795 case ProtocolIE_ID_id_NRCGI:
1797 case ProtocolIE_ID_id_C_RNTI:
1799 case ProtocolIE_ID_id_RRCContainer:
1801 case ProtocolIE_ID_id_DUtoCURRCContainer:
1803 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1804 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1805 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1807 DU_LOG("\n Received Du to Cu RRC Container ");
1808 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1809 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1810 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1811 f1apMsgDb.duToCuContainer.size);
1812 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1814 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1815 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1816 .duToCuContainer.size);
1821 DU_LOG("\n Failed to receive Du to Cu RRC Container ");
1827 DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1833 f1apMsgDb.dlRrcMsgCount++;
1834 rrcMsgType = setDlRRCMsgType();
1835 ret = BuildAndSendDLRRCMessageTransfer(SRB0, rrcMsgType);
1840 /*******************************************************************
1842 * @brief Builds Nrcgi
1846 * Function : BuildNrcgi
1848 * Functionality: Building the PLMN ID and NR Cell id
1850 * @params[in] NRCGI_t *nrcgi
1851 * @return ROK - success
1854 * ****************************************************************/
1855 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1858 uint8_t unused_bits = 4;
1859 uint8_t byteSize = 5;
1861 /* Allocate Buffer Memory */
1862 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1863 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1864 if(nrcgi->pLMN_Identity.buf == NULLP)
1868 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1874 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1875 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1876 if(nrcgi->nRCellIdentity.buf == NULLP)
1881 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1887 memset(nrcgi->nRCellIdentity.buf, 0, nrcgi->nRCellIdentity.size);
1888 nrcgi->nRCellIdentity.buf[0] |= val;
1889 nrcgi->nRCellIdentity.bits_unused = unused_bits;
1893 /*******************************************************************
1895 * @brief Builds Special cell list for UE Setup Request
1899 * Function : BuildSplCellList
1901 * Functionality: Constructs the Special Cell list for UESetReq
1903 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1905 * @return ROK - success
1908 * ****************************************************************/
1909 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1915 spCellLst->list.count = cellCnt;
1916 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1917 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1918 if(spCellLst->list.array == NULLP)
1922 for(idx=0; idx<cellCnt; idx++)
1924 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1925 if(spCellLst->list.array[idx] == NULLP)
1931 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1932 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1933 spCellLst->list.array[idx]->value.present =\
1934 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1935 /* Special Cell ID -NRCGI */
1936 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1941 /*Special Cell Index*/
1942 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1944 }/* End of BuildSplCellList*/
1946 /*******************************************************************
1948 * @brief Builds SRBS to be setup
1952 * Function : BuildSRBSetup
1954 * Functionality: Constructs the SRB's for UESetReq
1956 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1958 * @return ROK - success
1961 * ****************************************************************/
1962 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1967 srbSet->list.count = srbCnt;
1968 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1969 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1970 if(srbSet->list.array == NULLP)
1974 for(idx=0; idx<srbCnt; idx++)
1976 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1977 if(srbSet->list.array[idx] == NULLP)
1983 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
1984 srbSet->list.array[idx]->criticality = Criticality_ignore;
1985 srbSet->list.array[idx]->value.present = \
1986 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
1987 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
1989 }/* End of BuildSRBSetup*/
1991 /*******************************************************************
1993 * @brief Builds QOS Info for DRB Setum Item
1997 * Function : BuildQOSInfo
1999 * Functionality: Constructs the QOS Info for DRB Setup Item
2001 * @params[in] QoSInformation_t *qosinfo
2003 * @return ROK - success
2006 * ****************************************************************/
2007 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2009 /* NonDynamic5QIDescriptor */
2010 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
2011 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2012 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
2017 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
2019 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2020 sizeof(AveragingWindow_t));
2021 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
2026 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
2027 /*MaxDataBurstVolume*/
2028 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2029 sizeof(MaxDataBurstVolume_t));
2030 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2035 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2037 /*nRGRAN Allocation Retention Priority*/
2038 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_highest;
2039 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2040 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2042 /* TO DO: GBR_QoSFlowInformation */
2044 }/*End of BuildQOSInfo*/
2046 /*******************************************************************
2048 * @brief Builds SNSSAI
2052 * Function : BuildSNSSAI
2054 * Functionality: Constructs the SNSSAI For DRB list
2056 * @params[in] SNSSAI_t *snssai
2058 * @return ROK - success
2061 * ****************************************************************/
2062 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2066 snssai->sST.size = sizeof(uint8_t);
2067 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2068 if(snssai->sST.buf == NULLP)
2072 snssai->sST.buf[0] = 3;
2074 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2075 if(snssai->sD == NULLP)
2079 snssai->sD->size = 3*sizeof(uint8_t);
2080 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2081 if(snssai->sD->buf == NULLP)
2085 snssai->sD->buf[0] = 3;
2086 snssai->sD->buf[1] = 6;
2087 snssai->sD->buf[2] = 9;
2089 }/*End of BuildSNSSAI*/
2091 /*******************************************************************
2093 * @brief Builds the flow map.
2097 * Function : BuildFlowsMap
2099 * Functionality: Constructs the flowmap For DRB list
2101 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2103 * @return ROK - success
2106 * ****************************************************************/
2107 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2113 flowMap->list.count = flowCnt;
2114 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2115 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2116 if(flowMap->list.array == NULLP)
2120 for(idx=0; idx<flowCnt; idx++)
2122 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2123 if(flowMap->list.array[idx] == NULLP)
2129 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2130 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2136 }/*End of BuildFlowsMap*/
2138 /*******************************************************************
2140 * @brief Builds the Uplink Tunnel Info
2144 * Function : BuildULTnlInfo
2146 * Functionality: Constructs the UL TnlInfo For DRB list
2148 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2150 * @return ROK - success
2153 * ****************************************************************/
2154 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2159 ulInfo->list.count = ulCnt;
2160 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2161 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2162 if(ulInfo->list.array == NULLP)
2166 for(idx=0; idx<ulCnt; idx++)
2168 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2169 if(ulInfo->list.array[idx] == NULLP)
2175 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2176 UPTransportLayerInformation_PR_gTPTunnel;
2178 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2179 sizeof(GTPTunnel_t));
2180 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2184 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2185 transportLayerAddress.size = 4*sizeof(uint8_t);
2186 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2187 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2188 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2189 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2190 transportLayerAddress.buf == NULLP)
2194 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2195 transportLayerAddress.buf[0] = 4;
2196 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2197 transportLayerAddress.buf[1] = 4;
2198 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2199 transportLayerAddress.buf[2] = 4;
2200 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2201 transportLayerAddress.buf[3] = 5;
2202 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2203 transportLayerAddress.bits_unused = 0;
2205 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2206 = 4 * sizeof(uint8_t);
2207 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2208 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2209 gTPTunnel->gTP_TEID.size);
2210 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2215 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2216 gTP_TEID.buf[0] = 11;
2217 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2218 gTP_TEID.buf[1] = 0;
2219 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2220 gTP_TEID.buf[2] = 0;
2221 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2222 gTP_TEID.buf[3] = 1;
2225 }/*End of BuildULTnlInfo*/
2227 /*******************************************************************
2229 * @brief Builds DRBS to be setup
2233 * Function : BuildDRBSetup
2235 * Functionality: Constructs the DRB's for UESetReq
2237 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2239 * @return ROK - success
2242 * ****************************************************************/
2243 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2245 uint8_t BuildQOSInforet;
2246 uint8_t BuildSNSSAIret;
2247 uint8_t BuildFlowsMapret;
2248 uint8_t BuildULTnlInforet;
2251 DRBs_ToBeSetup_Item_t *drbSetItem;
2253 drbSet->list.count = drbCnt;
2254 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2255 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2256 if(drbSet->list.array == NULLP)
2260 for(idx=0; idx<drbCnt; idx++)
2262 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2263 if(drbSet->list.array[idx] == NULLP)
2269 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2270 drbSet->list.array[idx]->criticality = Criticality_ignore;
2271 drbSet->list.array[idx]->value.present = \
2272 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2273 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2275 drbSetItem->dRBID = 1;
2277 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2278 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2279 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2283 drbSetItem->qoSInformation.choice.choice_extension->id = \
2284 ProtocolIE_ID_id_DRB_Information;
2285 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2287 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2288 QoSInformation_ExtIEs__value_PR_DRB_Information;
2289 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2290 choice_extension->value.choice.DRB_Information.dRB_QoS);
2291 if(BuildQOSInforet != ROK)
2296 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2297 choice_extension->value.choice.DRB_Information.sNSSAI);
2298 if(BuildSNSSAIret != ROK)
2302 /*Flows mapped to DRB List*/
2303 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2304 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2305 if(BuildFlowsMapret != ROK)
2309 /*ULUPTNLInformation To Be Setup List*/
2310 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2311 if(BuildULTnlInforet != ROK)
2316 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2318 /*UL Configuration*/
2319 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2320 if(drbSetItem->uLConfiguration == NULLP)
2324 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2326 }/* End of BuildDRBSetup*/
2328 /*******************************************************************
2330 * @brief Deallocating memory of function BuildAndSendUESetReq
2334 * Function : FreeNrcgi
2336 * Functionality: Deallocating memory for function BuildNrcgi
2338 * @params[in] NRCGI_t *nrcgi
2342 *******************************************************************/
2343 void FreeNrcgi(NRCGI_t *nrcgi)
2345 if(nrcgi->pLMN_Identity.buf != NULLP)
2347 if(nrcgi->nRCellIdentity.buf != NULLP)
2349 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2351 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2354 /*******************************************************************
2356 * @brief Deallocating memory of function BuildAndSendUESetReq
2360 * Function : FreeSplCellList
2362 * Functionality: Deallocating memory for function BuildSplCellList
2364 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2369 * *****************************************************************/
2370 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2373 if(spCellLst->list.array != NULLP)
2375 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2377 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2379 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2381 if(spCellLst->list.array[cellidx]!=NULLP)
2383 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2386 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2389 /*******************************************************************
2391 * @brief Deallocating memory of function BuildAndSendUESetReq
2395 * Function : FreeSRBSetup
2397 * Functionality: Deallocating memory for function BuildSRBSetup
2399 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2404 * ******************************************************************/
2405 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2408 if(srbSet->list.array != NULLP)
2410 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2412 if(srbSet->list.array[srbidx]!=NULLP)
2414 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2417 CU_FREE(srbSet->list.array,srbSet->list.size);
2420 /*******************************************************************
2422 * @brief Deallocating memory of function BuildAndSendUESetReq
2426 * Function : FreeQOSInfo
2428 * Functionality: Deallocating memory for function BuildQOSInfo
2430 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2434 * ****************************************************************/
2435 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2437 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2439 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2441 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2443 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2444 sizeof(MaxDataBurstVolume_t));
2446 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2447 sizeof(AveragingWindow_t));
2449 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2450 sizeof(NonDynamic5QIDescriptor_t));
2453 /*******************************************************************
2455 * @brief Deallocating memory of function BuildAndSendUESetReq
2459 * Function : FreeULTnlInfo
2461 * Functionality: Deallocating memory for function BuildULTnlInfo
2463 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2468 * ****************************************************************/
2469 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2472 if(ulInfo->list.array != NULLP)
2474 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2476 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2478 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2480 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2481 transportLayerAddress.buf != NULLP)
2483 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2486 CU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2487 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2488 gTPTunnel->gTP_TEID.size);
2490 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2491 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2492 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2494 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2495 sizeof(GTPTunnel_t));
2498 if(ulInfo->list.array[ulidx]!=NULLP)
2500 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2503 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2506 /*******************************************************************
2508 * @brief Deallocating memory for BuildAndSendUESetReq
2512 * Function : FreeDRBSetup
2514 * Functionality: Deallocating memory for BuildDRBSetup
2516 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2520 * ****************************************************************/
2521 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2523 DRBs_ToBeSetup_Item_t *drbSetItem;
2526 if(drbSet->list.array == NULLP)
2528 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2530 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2532 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2533 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2535 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2536 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2538 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2539 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2541 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2542 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2544 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2546 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2548 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2550 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2551 flows_Mapped_To_DRB_List.list.array != NULLP)
2553 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2554 flows_Mapped_To_DRB_List.list.count; flowidx++)
2556 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2557 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2559 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2560 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2561 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2563 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2564 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2565 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2567 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2568 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2569 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2571 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2572 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2574 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2575 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2576 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2577 sizeof(MaxDataBurstVolume_t));
2579 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2580 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2581 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2583 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2584 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2585 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2588 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2589 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2591 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2592 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2595 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2596 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2597 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2599 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2600 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2602 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2603 sizeof(OCTET_STRING_t));
2605 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2606 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2608 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2609 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2611 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2612 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2614 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2615 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2617 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2620 if(drbSet->list.array[drbidx]!=NULLP)
2622 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2625 CU_FREE(drbSet->list.array,drbSet->list.size);
2630 /*******************************************************************
2632 * @brief Free the UE Setup Request
2636 * Function : FreeUeContextSetupReq
2638 * Functionality: Deallocate the memory of BuildUESetReq
2640 * @params[in] F1AP_PDU_t *f1apMsg
2645 * ****************************************************************/
2646 void FreeUeContextSetupReq(F1AP_PDU_t *f1apMsg)
2649 UEContextSetupRequest_t *ueSetReq = NULLP;
2651 if(f1apMsg != NULLP)
2653 if(f1apMsg->choice.initiatingMessage != NULLP)
2655 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2656 if(ueSetReq->protocolIEs.list.array != NULLP)
2658 for(idx = 0; idx < ueSetReq->protocolIEs.list.count; idx++)
2660 if(ueSetReq->protocolIEs.list.array[idx])
2662 switch(ueSetReq->protocolIEs.list.array[idx]->id)
2664 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2666 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2668 case ProtocolIE_ID_id_SpCell_ID:
2669 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2671 case ProtocolIE_ID_id_ServCellIndex:
2673 case ProtocolIE_ID_id_SpCellULConfigured:
2675 case ProtocolIE_ID_id_CUtoDURRCInformation:
2676 FreeCuToDuInfo(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation);
2678 case ProtocolIE_ID_id_SCell_ToBeSetup_List:
2679 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2681 case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
2682 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2684 case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
2685 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2687 case ProtocolIE_ID_id_RRCContainer:
2688 if(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf != NULLP)
2690 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2691 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2695 printf("\nF1AP: Invalid event type %ld", ueSetReq->protocolIEs.list.array[idx]->id);
2700 for(ieId=0; ieId<idx; ieId++)
2702 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2704 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2707 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2709 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2711 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2715 /**Filling cell group info **/
2716 /*******************************************************************
2718 * @brief Build Control resource set to add/modify list
2722 * Function : BuildControlRSetToAddModList
2724 * Functionality: Build Control resource set to add/modify list
2727 * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2729 * @return ROK - success
2732 * ****************************************************************/
2733 uint8_t BuildControlRSetToAddModList
2735 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
2740 uint8_t numBytes, bitsUnused;
2741 struct ControlResourceSet *controlRSet;
2742 uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
2743 uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
2746 controlRSetList->list.count = elementCnt;
2747 controlRSetList->list.size = \
2748 elementCnt * sizeof(struct ControlResourceSet *);
2750 controlRSetList->list.array = NULLP;
2751 CU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
2752 if(!controlRSetList->list.array)
2754 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2758 for(idx = 0; idx < elementCnt; idx++)
2760 controlRSetList->list.array[idx] = NULLP;
2761 CU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
2762 if(!controlRSetList->list.array[idx])
2764 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2770 controlRSet = controlRSetList->list.array[idx];
2771 controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
2773 /* Values harcoded according to our design:
2776 * Bit string stored ff0000000000
2780 controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
2781 controlRSet->frequencyDomainResources.buf = NULLP;
2782 CU_ALLOC(controlRSet->frequencyDomainResources.buf, \
2783 controlRSet->frequencyDomainResources.size);
2784 if(!controlRSet->frequencyDomainResources.buf)
2786 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2790 memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
2791 coreset0EndPrb = CORESET0_END_PRB;
2792 coreset1StartPrb = coreset0EndPrb + 6;
2793 coreset1NumPrb = CORESET1_NUM_PRB;
2794 /* calculate the PRBs */
2795 freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
2796 memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
2797 controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
2799 controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
2800 controlRSet->cce_REG_MappingType.present = \
2801 ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
2803 controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
2804 controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
2805 controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
2806 controlRSet->tci_PresentInDCI = NULLP;
2808 uint8_t tciStateIdx;
2810 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
2811 sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
2812 if(!controlRset->tci_StatesPDCCH_ToAddList)
2814 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2819 controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
2820 controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
2821 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
2822 controlRset->tci_StatesPDCCH_ToAddList->list.size)
2823 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
2825 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2829 for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
2831 CU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
2832 if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
2834 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2841 *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
2843 CU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
2844 if(!controlRset->tci_PresentInDCI)
2846 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2850 *(controlRset->tci_PresentInDCI);
2853 controlRSet->pdcch_DMRS_ScramblingID = NULLP;
2854 CU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
2855 if(!controlRSet->pdcch_DMRS_ScramblingID)
2857 DU_LOG("\nF1AP : Memory allocation failed in BuildControlRSetToAddModList");
2860 *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
2863 } /* End BuildControlRSetToAddModList */
2865 /*******************************************************************
2867 * @brief Build search space to add/modify list
2871 * Function : BuildSearchSpcToAddModList
2873 * Functionality: Build search space to add/modify list
2876 * @return ROK - success
2879 * ****************************************************************/
2880 uint8_t BuildSearchSpcToAddModList
2882 struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
2890 struct SearchSpace *searchSpc;
2893 searchSpcList->list.count = elementCnt;
2894 searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
2896 searchSpcList->list.array = NULLP;
2897 CU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
2898 if(!searchSpcList->list.array)
2900 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2904 for(idx = 0; idx < elementCnt; idx++)
2906 searchSpcList->list.array[idx] = NULLP;
2907 CU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
2908 if(!searchSpcList->list.array[idx])
2910 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2916 searchSpc = searchSpcList->list.array[idx];
2918 searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
2920 searchSpc->controlResourceSetId = NULLP;
2921 CU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
2922 if(!searchSpc->controlResourceSetId)
2924 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2927 *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
2929 searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
2930 CU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
2931 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
2932 if(!searchSpc->monitoringSlotPeriodicityAndOffset)
2934 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2937 searchSpc->monitoringSlotPeriodicityAndOffset->present = \
2938 SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
2940 searchSpc->duration = NULLP;
2941 searchSpc->monitoringSymbolsWithinSlot = NULLP;
2942 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
2943 if(!searchSpc->monitoringSymbolsWithinSlot)
2945 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2949 /* Values taken from reference logs :
2952 * Bit string stores 8000
2957 searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
2958 searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
2959 CU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
2960 searchSpc->monitoringSymbolsWithinSlot->size);
2961 if(!searchSpc->monitoringSymbolsWithinSlot->buf)
2963 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2968 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
2969 PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
2970 searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
2971 searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
2973 searchSpc->nrofCandidates = NULLP;
2974 CU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
2975 if(!searchSpc->nrofCandidates)
2977 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
2981 searchSpc->nrofCandidates->aggregationLevel1 = \
2982 PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
2983 searchSpc->nrofCandidates->aggregationLevel2 = \
2984 PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
2985 searchSpc->nrofCandidates->aggregationLevel4 = \
2986 PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
2987 searchSpc->nrofCandidates->aggregationLevel8 = \
2988 PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
2989 searchSpc->nrofCandidates->aggregationLevel16 = \
2990 PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
2992 searchSpc->searchSpaceType = NULLP;
2993 CU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
2994 if(!searchSpc->searchSpaceType)
2996 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3000 searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
3002 searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
3003 CU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
3004 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
3005 if(!searchSpc->searchSpaceType->choice.ue_Specific)
3007 DU_LOG("\nF1AP : Memory allocation failed in BuildSearchSpcToAddModList");
3010 searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
3011 PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
3014 }/* End BuildSearchSpcToAddModList */
3016 /*******************************************************************
3018 * @brief Builds BWP DL dedicated PDCCH config
3022 * Function : BuildBWPDlDedPdcchCfg
3024 * Functionality: Builds BWP DL dedicated PDCCH config
3026 * @params[in] struct PDCCH_Config *pdcchCfg
3028 * @return ROK - success
3031 * ****************************************************************/
3032 uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
3034 pdcchCfg->controlResourceSetToAddModList = NULLP;
3035 CU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
3036 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
3037 if(!pdcchCfg->controlResourceSetToAddModList)
3039 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3043 if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
3048 pdcchCfg->controlResourceSetToReleaseList = NULLP;
3050 pdcchCfg->searchSpacesToAddModList = NULLP;
3051 CU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
3052 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
3053 if(!pdcchCfg->searchSpacesToAddModList)
3055 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
3059 if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
3064 pdcchCfg->searchSpacesToReleaseList = NULLP;
3065 pdcchCfg->downlinkPreemption = NULLP;
3066 pdcchCfg->tpc_PUSCH = NULLP;
3067 pdcchCfg->tpc_PUCCH = NULLP;
3068 pdcchCfg->tpc_SRS = NULLP;
3073 /*******************************************************************
3075 * @brief Builds DMRS DL PDSCH Mapping type A
3079 * Function : BuildDMRSDLPdschMapTypeA
3081 * Functionality: Builds DMRS DL PDSCH Mapping type A
3084 * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3085 * @return ROK - success
3088 * ****************************************************************/
3089 uint8_t BuildDMRSDLPdschMapTypeA
3091 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
3094 dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
3095 dmrsDlCfg->choice.setup = NULLP;
3096 CU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
3097 if(!dmrsDlCfg->choice.setup)
3099 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3103 dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
3104 dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3105 CU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3106 if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
3108 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
3111 *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3113 dmrsDlCfg->choice.setup->maxLength = NULLP;
3114 dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
3115 dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
3116 dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
3121 /*******************************************************************
3123 * @brief Builds TCI states to add/modify list
3127 * Function : BuildTCIStatesToAddModList
3129 * Functionality:Builds TCI states to add/modify list
3132 * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
3134 * @return ROK - success
3137 * ****************************************************************/
3138 uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
3143 /*******************************************************************
3145 * @brief Builds PDSCH time domain allocation list
3149 * Function : BuildPdschTimeDomAllocList
3151 * Functionality: Builds PDSCH time domain allocation list
3154 * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3156 * @return ROK - success
3159 * ****************************************************************/
3160 uint8_t BuildPdschTimeDomAllocList
3162 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
3167 struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
3169 timeDomAllocList->present = \
3170 PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
3172 timeDomAllocList->choice.setup = NULLP;
3173 CU_ALLOC(timeDomAllocList->choice.setup, \
3174 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
3175 if(!timeDomAllocList->choice.setup)
3177 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3182 timeDomAllocList->choice.setup->list.count = elementCnt;
3183 timeDomAllocList->choice.setup->list.size = \
3184 elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
3186 timeDomAllocList->choice.setup->list.array = NULLP;
3187 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3188 timeDomAllocList->choice.setup->list.size);
3189 if(!timeDomAllocList->choice.setup->list.array)
3191 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3195 for(idx = 0; idx < elementCnt; idx++)
3197 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3198 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
3199 sizeof(struct PDSCH_TimeDomainResourceAllocation));
3200 if(!timeDomAllocList->choice.setup->list.array[idx])
3202 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
3208 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3210 timeDomAlloc->k0 = NULLP;
3211 timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
3212 timeDomAlloc->startSymbolAndLength = 53;
3217 /*******************************************************************
3219 * @brief Builds PDSCH PRB Bundling type
3223 * Function : BuildPdschPrbBundlingType
3225 * Functionality: Builds PDSCH PRB Bundling type
3228 * struct PDSCH_Config__prb_BundlingType *prbBndlType
3230 * @return ROK - success
3233 * ****************************************************************/
3234 uint8_t BuildPdschPrbBundlingType
3236 struct PDSCH_Config__prb_BundlingType *prbBndlType
3239 prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
3241 prbBndlType->choice.staticBundling = NULLP;
3242 CU_ALLOC(prbBndlType->choice.staticBundling, \
3243 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
3244 if(!prbBndlType->choice.staticBundling)
3246 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschPrbBundlingType");
3249 prbBndlType->choice.staticBundling->bundleSize = NULLP;
3254 /*******************************************************************
3256 * @brief Builds BWP DL dedicated PDSCH config
3260 * Function : BuildBWPDlDedPdschCfg
3262 * Functionality: Builds BWP DL dedicated PDSCH config
3264 * @params[in] struct PDSCH_Config *pdschCfg
3266 * @return ROK - success
3269 * ****************************************************************/
3270 uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
3272 pdschCfg->dataScramblingIdentityPDSCH = NULLP;
3274 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
3275 CU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
3276 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
3277 if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
3279 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3283 if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
3288 pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
3289 pdschCfg->tci_StatesToAddModList = NULLP;
3290 pdschCfg->tci_StatesToReleaseList = NULLP;
3291 pdschCfg->vrb_ToPRB_Interleaver = NULLP;
3293 CU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
3294 if(!pdschCfg->tci_StatesToAddModList)
3296 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3299 if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
3305 pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
3307 pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
3308 CU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
3309 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
3310 if(!pdschCfg->pdsch_TimeDomainAllocationList)
3312 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3315 if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
3319 pdschCfg->pdsch_AggregationFactor = NULLP;
3320 pdschCfg->rateMatchPatternToAddModList = NULLP;
3321 pdschCfg->rateMatchPatternToReleaseList = NULLP;
3322 pdschCfg->rateMatchPatternGroup1 = NULLP;
3323 pdschCfg->rateMatchPatternGroup2 = NULLP;
3324 pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
3325 pdschCfg->mcs_Table = NULLP;
3327 pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
3328 CU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
3329 if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
3331 DU_LOG("\nF1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
3334 *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
3336 if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
3341 pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
3342 pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
3343 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3344 pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3345 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
3346 pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
3347 pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
3352 /*******************************************************************
3354 * @brief Builds intitial DL BWP
3357 * Function : BuildInitialDlBWP
3359 * Functionality: Builds intitial DL BWP in spCellCfgDed
3361 * @params[in] BWP_DownlinkDedicated_t *dlBwp
3363 * @return ROK - success
3366 * ****************************************************************/
3367 uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
3369 dlBwp->pdcch_Config = NULLP;
3370 CU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
3371 if(!dlBwp->pdcch_Config)
3373 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3376 dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
3378 dlBwp->pdcch_Config->choice.setup = NULLP;
3379 CU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
3380 if(!dlBwp->pdcch_Config->choice.setup)
3382 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3385 if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
3390 dlBwp->pdsch_Config = NULLP;
3391 CU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
3392 if(!dlBwp->pdsch_Config)
3394 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3397 dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
3399 dlBwp->pdsch_Config->choice.setup = NULLP;
3400 CU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
3401 if(!dlBwp->pdsch_Config->choice.setup)
3403 DU_LOG("\nF1AP : Memory Allocation failure in BuildInitialDlBWP");
3407 if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
3412 dlBwp->sps_Config = NULLP;
3413 dlBwp->radioLinkMonitoringConfig = NULLP;
3417 /*******************************************************************
3419 * @brief Builds DMRS UL Pusch Mapping type A
3423 * Function : BuildDMRSULPuschMapTypeA
3425 * Functionality: Builds DMRS UL Pusch Mapping type A
3428 * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3429 * @return ROK - success
3432 * ****************************************************************/
3433 uint8_t BuildDMRSULPuschMapTypeA
3435 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
3438 dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
3439 dmrsUlCfg->choice.setup= NULLP;
3440 CU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
3441 if(!dmrsUlCfg->choice.setup)
3443 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3447 dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
3448 dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
3449 CU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
3450 if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
3452 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3455 *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
3457 dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
3458 dmrsUlCfg->choice.setup->maxLength = NULLP;
3459 dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
3460 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
3461 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
3462 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
3464 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3468 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
3469 CU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
3471 if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
3473 DU_LOG("\nF1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
3476 *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
3478 dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
3479 dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
3483 /*******************************************************************
3485 * @brief Build PUSCH time domain allocation list
3489 * Function : BuildPuschTimeDomAllocList
3491 * Functionality: Build PUSCH time domain allocation list
3494 * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3496 * @return ROK - success
3499 * ****************************************************************/
3500 uint8_t BuildPuschTimeDomAllocList
3502 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
3507 PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
3509 timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
3510 timeDomAllocList->choice.setup = NULLP;
3511 CU_ALLOC(timeDomAllocList->choice.setup, \
3512 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
3513 if(!timeDomAllocList->choice.setup)
3515 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3520 timeDomAllocList->choice.setup->list.count = elementCnt;
3521 timeDomAllocList->choice.setup->list.size = \
3522 elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
3523 timeDomAllocList->choice.setup->list.array = NULLP;
3524 CU_ALLOC(timeDomAllocList->choice.setup->list.array, \
3525 timeDomAllocList->choice.setup->list.size);
3526 if(!timeDomAllocList->choice.setup->list.array)
3528 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3532 for(idx = 0; idx < elementCnt; idx++)
3534 timeDomAllocList->choice.setup->list.array[idx] = NULLP;
3535 CU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
3536 sizeof(PUSCH_TimeDomainResourceAllocation_t));
3537 if(!timeDomAllocList->choice.setup->list.array[idx])
3539 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3545 timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
3546 CU_ALLOC(timeDomAlloc->k2, sizeof(long));
3547 if(!timeDomAlloc->k2)
3549 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
3552 *(timeDomAlloc->k2) = PUSCH_K2;
3553 timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
3554 timeDomAlloc->startSymbolAndLength = 27;
3558 /*******************************************************************
3560 * @brief Builds BWP UL dedicated PUSCH Config
3564 * Function : BuildBWPUlDedPuschCfg
3567 * Builds BWP UL dedicated PUSCH Config
3569 * @params[in] : PUSCH_Config_t *puschCfg
3571 * @return ROK - success
3574 * ****************************************************************/
3575 uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
3577 puschCfg->dataScramblingIdentityPUSCH = NULLP;
3578 CU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
3579 if(!puschCfg->dataScramblingIdentityPUSCH)
3581 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3584 *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
3586 puschCfg->txConfig = NULLP;
3587 puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
3588 CU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
3589 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
3590 if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
3592 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3596 if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
3601 puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
3602 puschCfg->pusch_PowerControl = NULLP;
3603 puschCfg->frequencyHopping = NULLP;
3604 puschCfg->frequencyHoppingOffsetLists = NULLP;
3605 puschCfg->resourceAllocation = RES_ALLOC_TYPE;
3607 puschCfg->pusch_TimeDomainAllocationList = NULLP;
3608 CU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
3609 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
3610 if(!puschCfg->pusch_TimeDomainAllocationList)
3612 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3616 if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
3621 puschCfg->pusch_AggregationFactor = NULLP;
3622 puschCfg->mcs_Table = NULLP;
3623 puschCfg->mcs_TableTransformPrecoder = NULLP;
3624 puschCfg->transformPrecoder = NULLP;
3625 CU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
3626 if(!puschCfg->transformPrecoder)
3628 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedPuschCfg");
3631 *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
3633 puschCfg->codebookSubset = NULLP;
3634 puschCfg->maxRank = NULLP;
3635 puschCfg->rbg_Size = NULLP;
3636 puschCfg->uci_OnPUSCH = NULLP;
3637 puschCfg->tp_pi2BPSK = NULLP;
3642 /*******************************************************************
3644 * @brief Fills SRS resource to add/modify list
3648 * Function : BuildSrsRsrcAddModList
3650 * Functionality: Fills SRS resource to add/modify list
3653 * @return ROK - success
3656 * ****************************************************************/
3657 uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
3663 resourceList->list.count = elementCnt;
3664 resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
3665 resourceList->list.array = NULLP;
3666 CU_ALLOC(resourceList->list.array, resourceList->list.size);
3667 if(!resourceList->list.array)
3669 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3673 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
3675 CU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
3676 if(!resourceList->list.array[rsrcIdx])
3678 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3684 resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
3685 resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
3686 resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
3688 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
3689 CU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
3690 sizeof(struct SRS_Resource__transmissionComb__n2));
3691 if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
3693 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3696 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
3697 = SRS_COMB_OFFSET_N2;
3698 resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
3699 = SRS_CYCLIC_SHIFT_N2;
3701 resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
3703 resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
3704 SRS_Resource__resourceMapping__nrofSymbols_n1;
3705 resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
3706 SRS_Resource__resourceMapping__repetitionFactor_n1;
3708 resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
3709 resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
3710 resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
3711 resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
3712 resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
3713 resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
3714 SRS_Resource__groupOrSequenceHopping_neither;
3716 /* Setting resource type to aperiodic for intergration purposes */
3717 resourceList->list.array[rsrcIdx]->resourceType.present = \
3718 SRS_Resource__resourceType_PR_aperiodic;
3719 resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
3720 CU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
3721 sizeof(struct SRS_Resource__resourceType__aperiodic));
3722 if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
3724 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcAddModList");
3727 resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
3732 /*******************************************************************
3734 * @brief Build SRS resource set Add/mod list
3738 * Function : BuildSrsRsrcSetAddModList
3740 * Functionality: Build SRS resource set Add/mod list
3743 * @return ROK - success
3746 * ****************************************************************/
3747 uint8_t BuildSrsRsrcSetAddModList
3749 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
3755 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
3758 rsrcSetList->list.count = elementCnt;
3759 rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
3760 rsrcSetList->list.array = NULLP;
3761 CU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
3762 if(!rsrcSetList->list.array)
3764 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3768 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
3770 CU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
3771 if(!rsrcSetList->list.array[rSetIdx])
3773 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3779 rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
3781 /* Fill Resource Id list in resource set */
3782 rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
3783 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
3784 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
3785 if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
3787 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3792 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
3793 rsrcIdList->list.count = elementCnt;
3794 rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
3795 rsrcIdList->list.array = NULLP;
3796 CU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
3797 if(!rsrcIdList->list.array)
3799 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3803 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
3805 CU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
3806 if(!rsrcIdList->list.array[rsrcIdx])
3808 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3814 *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
3816 /* Fill resource type */
3817 rsrcSetList->list.array[rSetIdx]->resourceType.present = \
3818 SRS_ResourceSet__resourceType_PR_aperiodic;
3820 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
3821 CU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
3822 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
3823 if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
3825 DU_LOG("\nF1AP: Memory allocation failed in BuildSrsRsrcSetAddModList");
3828 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
3829 = APERIODIC_SRS_RESRC_TRIGGER;
3831 /* TODO : Fill values for below IEs as expected by Viavi */
3832 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
3833 rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
3836 rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
3837 rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
3838 rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
3839 rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
3840 rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
3845 /*******************************************************************
3847 * @brief Builds BWP UL dedicated SRS Config
3851 * Function : BuildBWPUlDedSrsCfg
3853 * Functionality: Builds BWP UL dedicated SRS Config
3855 * @params[in] SRS Config
3856 * @return ROK - success
3859 * ****************************************************************/
3860 uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
3862 srsCfg->srs_ResourceSetToReleaseList = NULLP;
3863 srsCfg->srs_ResourceSetToAddModList = NULLP;
3864 CU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
3865 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
3866 if(!srsCfg->srs_ResourceSetToAddModList)
3868 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3871 if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
3876 srsCfg->srs_ResourceToReleaseList = NULLP;
3878 /* Resource to Add/Modify list */
3879 srsCfg->srs_ResourceToAddModList = NULLP;
3880 CU_ALLOC(srsCfg->srs_ResourceToAddModList, \
3881 sizeof(struct SRS_Config__srs_ResourceToAddModList));
3882 if(!srsCfg->srs_ResourceToAddModList)
3884 DU_LOG("\nF1AP: Memory allocation failed in BuildBWPUlDedSrsCfg");
3888 if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
3893 srsCfg->tpc_Accumulation = NULLP;
3898 /*******************************************************************
3900 * @brief Builds inital UL BWP
3904 * Function : BuildInitialUlBWP
3906 * Functionality: Builds initial UL BWP
3908 * @params[in] BWP_UplinkDedicated_t *ulBwp
3909 * @return ROK - success
3912 * ****************************************************************/
3913 uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
3915 ulBwp->pucch_Config = NULLP;
3917 /* Fill BWP UL dedicated PUSCH config */
3918 ulBwp->pusch_Config = NULLP;
3919 CU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
3920 if(!ulBwp->pusch_Config)
3922 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3926 ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
3927 ulBwp->pusch_Config->choice.setup = NULLP;
3928 CU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
3929 if(!ulBwp->pusch_Config->choice.setup)
3931 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3935 if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
3940 ulBwp->configuredGrantConfig = NULLP;
3942 /* Fill BPW UL dedicated SRS config */
3943 ulBwp->srs_Config = NULLP;
3944 CU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
3945 if(!ulBwp->srs_Config)
3947 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3951 ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
3952 ulBwp->srs_Config->choice.setup = NULLP;
3953 CU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
3954 if(!ulBwp->srs_Config->choice.setup)
3956 DU_LOG("\nF1AP : Memory allocation failed in BuildInitialUlBWP");
3960 if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
3965 ulBwp->beamFailureRecoveryConfig = NULLP;
3970 /*******************************************************************
3972 * @brief Builds Pusch Serving cell Config
3976 * Function : BuildPuschSrvCellCfg
3978 * Functionality: Builds Pusch Serving cell Config
3980 * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
3982 * @return ROK - success
3985 * ****************************************************************/
3986 uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
3988 puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
3989 puschCfg->choice.setup = NULLP;
3990 CU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
3991 if(!puschCfg->choice.setup)
3993 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
3997 puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
3998 puschCfg->choice.setup->rateMatching = NULLP;
3999 puschCfg->choice.setup->xOverhead = NULLP;
4000 puschCfg->choice.setup->ext1 = NULLP;
4001 CU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
4002 if(!puschCfg->choice.setup->ext1)
4004 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4008 puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
4009 CU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
4010 if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
4012 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4015 *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
4017 puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
4018 CU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
4019 if(!puschCfg->choice.setup->ext1->processingType2Enabled)
4021 DU_LOG("\nF1AP : Memory allocation failed in BuildPuschSrvCellCfg");
4024 *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
4028 /*******************************************************************
4030 * @brief Builds UL config
4033 * Function : BuildUlCfg
4035 * Functionality: Builds UL config in spCellCfgDed
4037 * @params[in] UplinkConfig_t *ulCfg
4039 * @return ROK - success
4042 * ****************************************************************/
4043 uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
4045 ulCfg->initialUplinkBWP = NULLP;
4046 CU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4047 if(!ulCfg->initialUplinkBWP)
4049 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4053 if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
4058 ulCfg->uplinkBWP_ToReleaseList = NULLP;
4059 ulCfg->uplinkBWP_ToAddModList = NULLP;
4060 ulCfg->firstActiveUplinkBWP_Id = NULLP;
4061 CU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4062 if(!ulCfg->firstActiveUplinkBWP_Id)
4064 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4067 *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
4069 ulCfg->pusch_ServingCellConfig = NULLP;
4070 CU_ALLOC(ulCfg->pusch_ServingCellConfig, \
4071 sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4072 if(!ulCfg->pusch_ServingCellConfig)
4074 DU_LOG("\nF1AP : Memory Allocation failed in BuildUlCfg");
4078 if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
4083 ulCfg->carrierSwitching = NULLP;
4084 ulCfg->ext1 = NULLP;
4088 /*******************************************************************
4090 * @brief Builds PDSCH serving cell config
4093 * Function : BuildPdschSrvCellCfg
4095 * Functionality: Builds PDSCH serving cell config in spCellCfgDed
4097 * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
4099 * @return ROK - success
4102 * ****************************************************************/
4103 uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
4105 pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
4106 pdschCfg->choice.setup = NULLP;
4107 CU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
4108 if(!pdschCfg->choice.setup)
4110 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4114 pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
4115 pdschCfg->choice.setup->xOverhead = NULLP;
4116 pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
4117 CU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
4118 if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
4120 DU_LOG("\nF1AP : Memory allocation failed in BuildPdschSrvCellCfg");
4123 *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
4124 pdschCfg->choice.setup->pucch_Cell = NULLP;
4125 pdschCfg->choice.setup->ext1 = NULLP;
4130 /*******************************************************************
4132 * @brief Builds CSI Meas config
4135 * Function : BuildCsiMeasCfg
4137 * Functionality: Builds CSI Meas config in spCellCfgDed
4139 * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
4141 * @return ROK - success
4144 * ****************************************************************/
4145 uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
4151 /*******************************************************************
4153 * @brief Builds Spcell config dedicated
4156 * Function : BuildSpCellCfgDed
4158 * Functionality: Builds sp cell config dedicated in spCellCfg
4160 * @params[in] ServingCellConfig_t srvCellCfg
4162 * @return ROK - success
4165 * ****************************************************************/
4166 uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
4168 srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
4170 srvCellCfg->initialDownlinkBWP = NULLP;
4171 CU_ALLOC(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
4172 if(!srvCellCfg->initialDownlinkBWP)
4174 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4178 if(BuildInitialDlBWP(srvCellCfg->initialDownlinkBWP) != ROK)
4180 DU_LOG("\nF1AP : BuildInitialDlBWP failed");
4183 srvCellCfg->downlinkBWP_ToReleaseList = NULLP;
4184 srvCellCfg->downlinkBWP_ToAddModList = NULLP;
4186 srvCellCfg->firstActiveDownlinkBWP_Id = NULLP;
4187 CU_ALLOC(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
4188 if(!srvCellCfg->firstActiveDownlinkBWP_Id)
4190 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4193 *(srvCellCfg->firstActiveDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4195 srvCellCfg->bwp_InactivityTimer = NULLP;
4197 srvCellCfg->defaultDownlinkBWP_Id = NULLP;
4198 CU_ALLOC(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
4199 if(!srvCellCfg->defaultDownlinkBWP_Id)
4201 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4204 *(srvCellCfg->defaultDownlinkBWP_Id) = ACTIVE_DL_BWP_ID;
4206 srvCellCfg->uplinkConfig = NULLP;
4207 CU_ALLOC(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
4208 if(!srvCellCfg->uplinkConfig)
4210 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4214 if(BuildUlCfg(srvCellCfg->uplinkConfig) != ROK)
4216 DU_LOG("\nF1AP : BuildUlCfg failed");
4219 srvCellCfg->supplementaryUplink = NULLP;
4220 srvCellCfg->pdcch_ServingCellConfig = NULLP;
4222 srvCellCfg->pdsch_ServingCellConfig = NULLP;
4223 CU_ALLOC(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct ServingCellConfig__pdsch_ServingCellConfig));
4224 if(!srvCellCfg->pdsch_ServingCellConfig)
4226 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4230 if(BuildPdschSrvCellCfg(srvCellCfg->pdsch_ServingCellConfig) != ROK)
4232 DU_LOG("\nF1AP : BuildPdschSrvCellCfg failed");
4236 srvCellCfg->csi_MeasConfig = NULLP;
4238 CU_ALLOC(srvCellCfg->csi_MeasConfig, sizeof(struct ServingCellConfig__csi_MeasConfig))
4239 if(!srvCellCfg->csi_MeasConfig)
4241 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfgDed");
4245 if(BuildCsiMeasCfg(srvCellCfg->csi_MeasConfig) != ROK)
4247 DU_LOG("\nF1AP : BuildCsiMeasCfg failed");
4251 srvCellCfg->sCellDeactivationTimer = NULLP;
4252 srvCellCfg->crossCarrierSchedulingConfig = NULLP;
4253 srvCellCfg->tag_Id = TAG_ID;
4254 srvCellCfg->dummy = NULLP;
4255 srvCellCfg->pathlossReferenceLinking = NULLP;
4256 srvCellCfg->servingCellMO = NULLP;
4257 srvCellCfg->ext1 = NULLP;
4261 /*******************************************************************
4263 * @brief Builds Spcell config
4267 * Function : BuildSpCellCfg
4269 * Functionality: Builds sp cell config in DuToCuRrcContainer
4271 * @params[in] SpCellConfig_t spCellCfg
4273 * @return ROK - success
4276 * ****************************************************************/
4277 uint8_t BuildSpCellCfg(SpCellConfig_t *spCellCfg)
4280 spCellCfg->servCellIndex = NULLP;
4281 CU_ALLOC(spCellCfg->servCellIndex, sizeof(long));
4282 if(!spCellCfg->servCellIndex)
4284 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4287 *(spCellCfg->servCellIndex) = SERV_CELL_IDX;
4289 spCellCfg->reconfigurationWithSync = NULLP;
4290 spCellCfg->rlf_TimersAndConstants = NULLP;
4291 spCellCfg->rlmInSyncOutOfSyncThreshold = NULLP;
4292 CU_ALLOC(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
4293 if(!spCellCfg->rlmInSyncOutOfSyncThreshold)
4295 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4298 *(spCellCfg->rlmInSyncOutOfSyncThreshold) = RLM_SYNC_OUT_SYNC_THRESHOLD;
4300 spCellCfg->spCellConfigDedicated = NULLP;
4301 CU_ALLOC(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
4302 if(!spCellCfg->spCellConfigDedicated)
4304 DU_LOG("\nF1AP : Memory allocation failure in BuildSpCellCfg");
4307 if(BuildSpCellCfgDed(spCellCfg->spCellConfigDedicated) != ROK)
4309 DU_LOG("\nF1AP : BuildSpCellCfgDed failed");
4314 /*******************************************************************
4316 * @brief Builds Phy cell group config
4320 * Function : BuildPhyCellGrpCfg
4322 * Functionality: Builds Phy cell group config in DuToCuRrcContainer
4324 * @params[in] PhysicalCellGroupConfig_t *phyCellGrpCfg
4326 * @return ROK - success
4329 * ****************************************************************/
4330 uint8_t BuildPhyCellGrpCfg(PhysicalCellGroupConfig_t *phyCellGrpCfg)
4332 phyCellGrpCfg->harq_ACK_SpatialBundlingPUCCH = NULLP;
4333 phyCellGrpCfg->harq_ACK_SpatialBundlingPUSCH = NULLP;
4335 phyCellGrpCfg->p_NR_FR1 = NULLP;
4336 CU_ALLOC(phyCellGrpCfg->p_NR_FR1, sizeof(long));
4337 if(!phyCellGrpCfg->p_NR_FR1)
4339 DU_LOG("\nF1AP : Memory allocation failure in BuildPhyCellGrpCfg");
4342 *(phyCellGrpCfg->p_NR_FR1) = P_NR_FR1;
4343 phyCellGrpCfg->pdsch_HARQ_ACK_Codebook = PDSCH_HARQ_ACK_CODEBOOK;
4344 phyCellGrpCfg->tpc_SRS_RNTI = NULLP;
4345 phyCellGrpCfg->tpc_PUCCH_RNTI = NULLP;
4346 phyCellGrpCfg->tpc_PUSCH_RNTI = NULLP;
4347 phyCellGrpCfg->sp_CSI_RNTI = NULLP;
4348 phyCellGrpCfg->cs_RNTI = NULLP;
4349 phyCellGrpCfg->ext1 = NULLP;
4350 phyCellGrpCfg->ext2 = NULLP;
4355 /*******************************************************************
4357 * @brief Builds tag config
4361 * Function : BuildTagConfig
4363 * Functionality: Builds tag config in MacCellGroupConfig
4365 * @params[in] TAG_Config *tag_Config
4367 * @return ROK - success
4370 * ****************************************************************/
4371 uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
4373 struct TAG_Config__tag_ToAddModList *tagList;
4374 uint8_t idx, elementCnt;
4376 tagConfig->tag_ToReleaseList = NULLP;
4377 tagConfig->tag_ToAddModList = NULLP;
4378 CU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
4379 if(!tagConfig->tag_ToAddModList)
4381 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4385 elementCnt = 1; //ODU_VALUE_ONE;
4386 tagList = tagConfig->tag_ToAddModList;
4387 tagList->list.count = elementCnt;
4388 tagList->list.size = elementCnt * sizeof(struct TAG *);
4390 tagList->list.array = NULLP;
4391 CU_ALLOC(tagList->list.array, tagList->list.size);
4392 if(!tagList->list.array)
4394 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4398 for(idx=0; idx<tagList->list.count; idx++)
4400 tagList->list.array[idx] = NULLP;
4401 CU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
4402 if(!tagList->list.array[idx])
4404 DU_LOG("\nF1AP : Memory allocation failure in BuildTagConfig");
4410 tagList->list.array[idx]->tag_Id = TAG_ID;
4411 tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
4416 /*******************************************************************
4418 * @brief Builds PHR Config
4422 * Function : BuildPhrConfig
4424 * Functionality: Builds phrConfig in MacCellGroupConfig
4426 * @params[in] PHR Config *
4428 * @return ROK - success
4431 * ****************************************************************/
4432 uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
4435 phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
4436 phrConfig->choice.setup = NULLP;
4437 CU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
4438 if(!phrConfig->choice.setup)
4440 DU_LOG("\nF1AP : Memory allocation failure in BuildPhrConfig");
4444 phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
4445 phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
4446 phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
4447 phrConfig->choice.setup->multiplePHR = false;
4448 phrConfig->choice.setup->dummy = false;
4449 phrConfig->choice.setup->phr_Type2OtherCell = false;
4450 phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
4455 /*******************************************************************
4457 * @brief Builds BSR Config
4461 * Function : BuildBsrConfig
4463 * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
4465 * @params[in] BSR_Config *bsrConfig
4467 * @return ROK - success
4470 * ****************************************************************/
4471 uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
4473 bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
4474 bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
4475 bsrConfig->logicalChannelSR_DelayTimer = NULLP;
4480 /*******************************************************************
4482 * @brief Builds scheduling request config
4486 * Function : BuildSchedulingReqConfig
4488 * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
4490 * @params[in] SchedulingRequestConfig *schedulingRequestConfig
4492 * @return ROK - success
4495 * ****************************************************************/
4496 uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
4498 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
4499 uint8_t idx, elementCnt;
4501 schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
4502 CU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
4503 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
4504 if(!schedulingRequestConfig->schedulingRequestToAddModList)
4506 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4510 elementCnt = 1; //ODU_VALUE_ONE;
4511 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
4512 schReqList->list.count = elementCnt;
4513 schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
4515 schReqList->list.array = NULLP;
4516 CU_ALLOC(schReqList->list.array, schReqList->list.size);
4517 if(!schReqList->list.array)
4519 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4523 for(idx=0;idx<schReqList->list.count; idx++)
4525 schReqList->list.array[idx] = NULLP;
4526 CU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
4527 if(!schReqList->list.array[idx])
4529 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4535 schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
4537 schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
4538 CU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
4539 if(!schReqList->list.array[idx]->sr_ProhibitTimer)
4541 DU_LOG("\nF1AP : Memory allocation failure in BuildSchedulingReqConfig");
4544 *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
4545 schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
4546 schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
4550 /*******************************************************************
4552 * @brief Builds Mac cell group config
4556 * Function : BuildMacCellGrpCfg
4558 * Functionality: Builds Mac cell group config in DuToCuRrcContainer
4560 * @params[in] MAC_CellGroupConfig_t *macCellGrpCfg
4562 * @return ROK - success
4565 * ****************************************************************/
4566 uint8_t BuildMacCellGrpCfg(MAC_CellGroupConfig_t *macCellGrpCfg)
4568 macCellGrpCfg->drx_Config = NULLP;
4569 macCellGrpCfg->schedulingRequestConfig = NULLP;
4570 CU_ALLOC(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
4571 if(!macCellGrpCfg->schedulingRequestConfig)
4573 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4577 if(BuildSchedulingReqConfig(macCellGrpCfg->schedulingRequestConfig) != ROK)
4579 DU_LOG("\nF1AP : BuildSchedulingReqConfig failed");
4583 macCellGrpCfg->bsr_Config = NULLP;
4584 CU_ALLOC(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
4585 if(!macCellGrpCfg->bsr_Config)
4587 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4591 if(BuildBsrConfig(macCellGrpCfg->bsr_Config) != ROK)
4593 DU_LOG("\nF1AP : BuildBsrConfig failed");
4597 macCellGrpCfg->tag_Config = NULLP;
4598 CU_ALLOC(macCellGrpCfg->tag_Config, sizeof(struct TAG_Config));
4599 if(!macCellGrpCfg->tag_Config)
4601 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4605 if(BuildTagConfig(macCellGrpCfg->tag_Config) != ROK)
4607 DU_LOG("\nF1AP : BuildTagConfig failed");
4611 macCellGrpCfg->phr_Config = NULLP;
4612 CU_ALLOC(macCellGrpCfg->phr_Config, sizeof(struct MAC_CellGroupConfig__phr_Config));
4613 if(!macCellGrpCfg->phr_Config)
4615 DU_LOG("\nF1AP : Memory allocation failure in BuildMacCellGrpCfg");
4619 if(BuildPhrConfig(macCellGrpCfg->phr_Config) != ROK)
4621 DU_LOG("\nF1AP : BuildPhrConfig failed");
4625 macCellGrpCfg->skipUplinkTxDynamic = false;
4626 macCellGrpCfg->ext1 = NULLP;
4630 /*******************************************************************
4632 * @brief Frees memeory allocated for SearchSpcToAddModList
4636 * Function : FreeSearchSpcToAddModList
4638 * Functionality: Deallocating memory of SearchSpcToAddModList
4640 * @params[in] struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
4644 4221 * ****************************************************************/
4645 void FreeSearchSpcToAddModList(struct PDCCH_Config__searchSpacesToAddModList *searchSpcList)
4649 struct SearchSpace *searchSpc=NULLP;
4651 if(searchSpcList->list.array)
4653 if(searchSpcList->list.array[idx2])
4655 searchSpc = searchSpcList->list.array[idx2];
4656 if(searchSpc->controlResourceSetId)
4658 if(searchSpc->monitoringSlotPeriodicityAndOffset)
4660 if(searchSpc->monitoringSymbolsWithinSlot)
4662 if(searchSpc->monitoringSymbolsWithinSlot->buf)
4664 if(searchSpc->nrofCandidates)
4666 if(searchSpc->searchSpaceType)
4668 CU_FREE(searchSpc->searchSpaceType->choice.ue_Specific,\
4669 sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
4670 CU_FREE(searchSpc->searchSpaceType, sizeof(struct
4671 SearchSpace__searchSpaceType));
4673 CU_FREE(searchSpc->nrofCandidates,
4674 sizeof(struct SearchSpace__nrofCandidates));
4676 CU_FREE(searchSpc->monitoringSymbolsWithinSlot->buf, \
4677 searchSpc->monitoringSymbolsWithinSlot->size);
4679 CU_FREE(searchSpc->monitoringSymbolsWithinSlot,
4680 sizeof(BIT_STRING_t));
4682 CU_FREE(searchSpc->monitoringSlotPeriodicityAndOffset, \
4683 sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
4685 CU_FREE(searchSpc->controlResourceSetId,
4686 sizeof(ControlResourceSetId_t));
4689 for(idx1 = 0; idx1 < searchSpcList->list.count; idx1++)
4691 CU_FREE(searchSpcList->list.array[idx1],
4692 sizeof(struct SearchSpace));
4694 CU_FREE(searchSpcList->list.array,searchSpcList->list.size);
4697 /*******************************************************************
4699 * @brief Frees memory allocated for PdschTimeDomAllocList
4703 * Function : FreePdschTimeDomAllocList
4705 * Functionality: Deallocating memory of PdschTimeDomAllocList
4707 * @params[in] struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
4711 4221 * ****************************************************************/
4712 void FreePdschTimeDomAllocList( struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList)
4716 if(timeDomAllocList->choice.setup)
4718 if(timeDomAllocList->choice.setup->list.array)
4720 for(idx1 = 0; idx1 <timeDomAllocList->choice.setup->list.count ; idx1++)
4722 CU_FREE(timeDomAllocList->choice.setup->list.array[idx1],
4723 sizeof(struct PDSCH_TimeDomainResourceAllocation));
4725 CU_FREE(timeDomAllocList->choice.setup->list.array, \
4726 timeDomAllocList->choice.setup->list.size);
4728 CU_FREE(timeDomAllocList->choice.setup,\
4729 sizeof(struct PDSCH_TimeDomainResourceAllocationList));
4732 /*******************************************************************
4734 * @brief Frees memory allocated for PuschTimeDomAllocList
4738 * Function : FreePuschTimeDomAllocList
4740 * Functionality: Deallocating memory of PuschTimeDomAllocList
4742 * @params[in] PUSCH_Config_t *puschCfg
4746 ***********************************************************************/
4747 void FreePuschTimeDomAllocList(PUSCH_Config_t *puschCfg)
4751 struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList_t=NULLP;
4753 if(puschCfg->pusch_TimeDomainAllocationList)
4755 timeDomAllocList_t=puschCfg->pusch_TimeDomainAllocationList;
4756 if(timeDomAllocList_t->choice.setup)
4758 if(timeDomAllocList_t->choice.setup->list.array)
4760 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx2]->k2, sizeof(long));
4761 for(idx1 = 0; idx1<timeDomAllocList_t->choice.setup->list.count; idx1++)
4763 CU_FREE(timeDomAllocList_t->choice.setup->list.array[idx1],\
4764 sizeof(PUSCH_TimeDomainResourceAllocation_t));
4766 CU_FREE(timeDomAllocList_t->choice.setup->list.array, \
4767 timeDomAllocList_t->choice.setup->list.size);
4769 CU_FREE(timeDomAllocList_t->choice.setup, \
4770 sizeof(struct PUSCH_TimeDomainResourceAllocationList));
4772 CU_FREE(puschCfg->transformPrecoder, sizeof(long));
4773 CU_FREE(puschCfg->pusch_TimeDomainAllocationList, \
4774 sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
4778 /*******************************************************************
4780 * @brief Frees memory allocated for InitialUlBWP
4784 * Function : FreeInitialUlBWP
4786 * Functionality: Deallocating memory of InitialUlBWP
4788 * @params[in] BWP_UplinkDedicated_t *ulBwp
4792 * ****************************************************************/
4793 void FreeInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
4795 uint8_t rSetIdx, rsrcIdx;
4796 SRS_Config_t *srsCfg = NULLP;
4797 PUSCH_Config_t *puschCfg = NULLP;
4798 struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg = NULLP;
4799 struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList = NULLP;
4800 struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList = NULLP;
4801 struct SRS_Config__srs_ResourceToAddModList *resourceList = NULLP;
4803 if(ulBwp->pusch_Config)
4805 if(ulBwp->pusch_Config->choice.setup)
4807 puschCfg=ulBwp->pusch_Config->choice.setup;
4808 if(puschCfg->dataScramblingIdentityPUSCH)
4810 if(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
4812 FreePuschTimeDomAllocList(puschCfg);
4813 dmrsUlCfg=puschCfg->dmrs_UplinkForPUSCH_MappingTypeA;
4814 if(dmrsUlCfg->choice.setup)
4816 if(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
4818 if(dmrsUlCfg->choice.setup->transformPrecodingDisabled)
4820 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
4822 CU_FREE(dmrsUlCfg->choice.setup->transformPrecodingDisabled,
4823 sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
4825 CU_FREE(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition,
4828 CU_FREE(dmrsUlCfg->choice.setup,sizeof(DMRS_UplinkConfig_t));
4830 CU_FREE(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
4831 sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
4833 CU_FREE(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
4835 CU_FREE(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
4837 CU_FREE(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
4839 /* Free SRS-Config */
4840 if(ulBwp->srs_Config)
4842 if(ulBwp->srs_Config->choice.setup)
4844 srsCfg = ulBwp->srs_Config->choice.setup;
4846 /* Free Resource Set to add/mod list */
4847 if(srsCfg->srs_ResourceSetToAddModList)
4849 rsrcSetList = srsCfg->srs_ResourceSetToAddModList;
4850 if(rsrcSetList->list.array)
4854 /* Free SRS resource Id list in this SRS resource set */
4855 if(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
4857 rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
4859 if(rsrcIdList->list.array)
4861 for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
4863 CU_FREE(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
4865 CU_FREE(rsrcIdList->list.array, rsrcIdList->list.size);
4867 CU_FREE(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
4868 sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
4871 /* Free resource type info for this SRS resource set */
4872 CU_FREE(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
4873 sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
4875 /* Free memory for each resource set */
4876 for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
4878 CU_FREE(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
4880 CU_FREE(rsrcSetList->list.array, rsrcSetList->list.size);
4882 CU_FREE(srsCfg->srs_ResourceSetToAddModList, \
4883 sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
4886 /* Free resource to add/modd list */
4887 if(srsCfg->srs_ResourceToAddModList)
4889 resourceList = srsCfg->srs_ResourceToAddModList;
4890 if(resourceList->list.array)
4893 CU_FREE(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2,\
4894 sizeof(struct SRS_Resource__transmissionComb__n2));
4895 CU_FREE(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,\
4896 sizeof(struct SRS_Resource__resourceType__aperiodic));
4898 for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
4900 CU_FREE(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
4902 CU_FREE(resourceList->list.array, resourceList->list.size);
4904 CU_FREE(srsCfg->srs_ResourceToAddModList, \
4905 sizeof(struct SRS_Config__srs_ResourceToAddModList));
4908 CU_FREE(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
4910 CU_FREE(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
4914 /*******************************************************************
4916 * @brief Frees memory allocated for initialUplinkBWP
4920 * Function : FreeinitialUplinkBWP
4922 * Functionality: Deallocating memory of initialUplinkBWP
4924 * @params[in] UplinkConfig_t *ulCfg
4929 * ****************************************************************/
4930 void FreeinitialUplinkBWP(UplinkConfig_t *ulCfg)
4932 BWP_UplinkDedicated_t *ulBwp=NULLP;
4933 struct UplinkConfig__pusch_ServingCellConfig *puschCfg=NULLP;
4935 if(ulCfg->initialUplinkBWP)
4937 ulBwp=ulCfg->initialUplinkBWP;
4938 if(ulCfg->firstActiveUplinkBWP_Id)
4940 if(ulCfg->pusch_ServingCellConfig)
4942 puschCfg=ulCfg->pusch_ServingCellConfig;
4943 if(puschCfg->choice.setup)
4945 if(puschCfg->choice.setup->ext1)
4947 CU_FREE(puschCfg->choice.setup->ext1->\
4948 processingType2Enabled,sizeof(BOOLEAN_t));
4949 CU_FREE(puschCfg->choice.setup->ext1->\
4950 maxMIMO_Layers,sizeof(long));
4951 CU_FREE(puschCfg->choice.setup->ext1, \
4952 sizeof(struct PUSCH_ServingCellConfig__ext1));
4954 CU_FREE(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
4956 CU_FREE(ulCfg->pusch_ServingCellConfig, sizeof(struct UplinkConfig__pusch_ServingCellConfig));
4958 CU_FREE(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
4960 FreeInitialUlBWP(ulBwp);
4961 CU_FREE(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
4964 /*******************************************************************
4966 * @brief Frees emmory allocated for BWPDlDedPdschCfg
4970 * Function : FreeBWPDlDedPdschCfg
4972 * Functionality: Deallocating memory of BWPDlDedPdschCfg
4974 * @params[in] BWP_DownlinkDedicated_t *dlBwp
4979 * ****************************************************************/
4980 void FreeBWPDlDedPdschCfg(BWP_DownlinkDedicated_t *dlBwp)
4982 struct PDSCH_Config *pdschCfg=NULLP;
4983 struct PDSCH_Config__prb_BundlingType *prbBndlType=NULLP;
4984 struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList=NULLP;
4985 struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg=NULLP;
4987 if(dlBwp->pdsch_Config->choice.setup)
4989 pdschCfg=dlBwp->pdsch_Config->choice.setup;
4990 if(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
4992 if(pdschCfg->pdsch_TimeDomainAllocationList)
4994 timeDomAllocList=pdschCfg->pdsch_TimeDomainAllocationList;
4995 if(pdschCfg->maxNrofCodeWordsScheduledByDCI)
4997 prbBndlType=&pdschCfg->prb_BundlingType;
4998 CU_FREE(prbBndlType->choice.staticBundling,\
4999 sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
5000 CU_FREE(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
5002 FreePdschTimeDomAllocList(timeDomAllocList);
5003 CU_FREE(pdschCfg->pdsch_TimeDomainAllocationList, \
5004 sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
5006 dmrsDlCfg=pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA;
5007 if(dmrsDlCfg->choice.setup)
5009 CU_FREE(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition,
5011 CU_FREE(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
5013 CU_FREE(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
5014 sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
5016 CU_FREE(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
5019 /*******************************************************************
5021 * @brief Frees emmory allocated for BWPDlDedPdcchCfg
5025 * Function : FreeBWPDlDedPdcchCfg
5027 * Functionality: Deallocating memory of BWPDlDedPdcchCfg
5029 * @params[in] BWP_DownlinkDedicated_t *dlBwp
5034 * ****************************************************************/
5035 void FreeBWPDlDedPdcchCfg(BWP_DownlinkDedicated_t *dlBwp)
5039 struct PDCCH_Config *pdcchCfg=NULLP;
5040 struct ControlResourceSet *controlRSet=NULLP;
5041 struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList=NULLP;
5043 if(dlBwp->pdcch_Config->choice.setup)
5045 pdcchCfg=dlBwp->pdcch_Config->choice.setup;
5046 if(pdcchCfg->controlResourceSetToAddModList)
5048 controlRSetList = pdcchCfg->controlResourceSetToAddModList;
5049 if(controlRSetList->list.array)
5051 controlRSet = controlRSetList->list.array[idx2];
5054 if(controlRSet->frequencyDomainResources.buf)
5056 if(controlRSet->pdcch_DMRS_ScramblingID)
5058 if(pdcchCfg->searchSpacesToAddModList)
5060 FreeSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList);
5061 CU_FREE(pdcchCfg->searchSpacesToAddModList, \
5062 sizeof(struct PDCCH_Config__searchSpacesToAddModList));
5064 CU_FREE(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
5066 CU_FREE(controlRSet->frequencyDomainResources.buf, \
5067 controlRSet->frequencyDomainResources.size);
5070 for(idx1 = 0; idx1 <controlRSetList->list.count; idx1++)
5072 CU_FREE(controlRSetList->list.array[idx1], sizeof(struct ControlResourceSet));
5074 CU_FREE(controlRSetList->list.array, controlRSetList->list.size);
5076 CU_FREE(pdcchCfg->controlResourceSetToAddModList, \
5077 sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
5079 CU_FREE(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
5082 /*******************************************************************
5084 * @brief Builds RLC Config
5088 * Function : BuildRlcConfig
5090 * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
5092 * @params[in] RLC_Config *rlcConfig
5094 * @return ROK - success
5097 * ****************************************************************/
5098 uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
5101 rlcConfig->present = RLC_Config_PR_am;
5103 rlcConfig->choice.am = NULLP;
5104 CU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5105 if(!rlcConfig->choice.am)
5107 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5112 rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
5113 CU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5114 if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
5116 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5119 *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5120 rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
5121 rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
5122 rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
5123 rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
5126 rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
5127 CU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5128 if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
5130 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcConfig");
5133 *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
5134 rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
5135 rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
5140 /*******************************************************************
5142 * @brief Builds MAC LC Config
5146 * Function : BuildMacLCConfig
5148 * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
5150 * @params[in] struct LogicalChannelConfig macLcConfig
5152 * @return ROK - success
5155 * ****************************************************************/
5156 uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
5159 macLcConfig->ul_SpecificParameters = NULLP;
5160 CU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5161 if(!macLcConfig->ul_SpecificParameters)
5163 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5167 macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
5168 macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
5169 macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
5170 macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
5171 macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
5172 macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
5173 macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
5175 macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
5176 CU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5177 if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
5179 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5182 *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
5184 macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
5185 CU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5186 if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
5188 DU_LOG("\nF1AP : Memory allocation failure in BuildMacLCConfig");
5191 *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
5193 macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
5194 macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
5195 macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
5199 /*******************************************************************
5201 * @brief Builds RLC Bearer to Add/Mod list
5205 * Function :BuildRlcBearerToAddModList
5207 * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
5209 * @params[in] rlc_BearerToAddModList
5211 * @return ROK - success
5214 * ****************************************************************/
5215 uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
5217 uint8_t idx, elementCnt;
5220 rlcBearerList->list.count = elementCnt;
5221 rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
5223 rlcBearerList->list.array = NULLP;
5224 CU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
5225 if(!rlcBearerList->list.array)
5227 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5231 for(idx=0; idx<rlcBearerList->list.count; idx++)
5233 rlcBearerList->list.array[idx] = NULLP;
5234 CU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5235 if(!rlcBearerList->list.array[idx])
5237 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5243 rlcBearerList->list.array[idx]->logicalChannelIdentity = RLC_LCID;
5245 CU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5246 if(!rlcBearerList->list.array[idx]->servedRadioBearer)
5248 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5252 rlcBearerList->list.array[idx]->servedRadioBearer->present = RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
5253 rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = SRB_ID_1;
5255 rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
5256 rlcBearerList->list.array[idx]->rlc_Config = NULLP;
5257 CU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
5258 if(!rlcBearerList->list.array[idx]->rlc_Config)
5260 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5264 if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
5266 DU_LOG("\nF1AP : BuildRlcConfig failed");
5270 rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
5271 CU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5272 if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
5274 DU_LOG("\nF1AP : Memory allocation failure in BuildRlcBearerToAddModList");
5278 if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
5280 DU_LOG("\nF1AP : BuildMacLCConfig failed");
5287 /*******************************************************************
5289 * @brief Free memory allocated for CellGroupConfig
5293 * Function : FreeMemCellGrpCfg
5295 * Functionality: Deallocating memory of CellGroupConfig
5297 * @params[in] pointer to CellGroupConfigRrc_t
5299 * @return ROK - success
5302 ******************************************************************/
5303 uint8_t FreeMemCellGrpCfg(CellGroupConfigRrc_t *cellGrpCfg)
5306 SpCellConfig_t *spCellCfg=NULLP;
5307 ServingCellConfig_t *srvCellCfg=NULLP;
5308 BWP_DownlinkDedicated_t *dlBwp=NULLP;
5309 MAC_CellGroupConfig_t *macCellGrpCfg=NULLP;
5310 PhysicalCellGroupConfig_t *phyCellGrpCfg=NULLP;
5311 struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList=NULLP;
5312 struct RLC_Config *rlcConfig=NULLP;
5313 struct LogicalChannelConfig *macLcConfig=NULLP;
5314 struct SchedulingRequestConfig *schedulingRequestConfig=NULLP;
5315 struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList=NULLP;
5316 struct TAG_Config *tagConfig=NULLP;
5317 struct TAG_Config__tag_ToAddModList *tagList=NULLP;
5318 struct MAC_CellGroupConfig__phr_Config *phrConfig=NULLP;
5319 struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg=NULLP;
5321 rlcBearerList = cellGrpCfg->rlc_BearerToAddModList;
5324 if(rlcBearerList->list.array)
5326 for(idx=0; idx<rlcBearerList->list.count; idx++)
5328 if(rlcBearerList->list.array[idx])
5330 rlcConfig = rlcBearerList->list.array[idx]->rlc_Config;
5331 macLcConfig = rlcBearerList->list.array[idx]->mac_LogicalChannelConfig;
5334 if(rlcConfig->choice.am)
5336 CU_FREE(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5337 CU_FREE(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
5338 CU_FREE(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
5340 CU_FREE(rlcConfig, sizeof(struct RLC_Config));
5342 CU_FREE(rlcBearerList->list.array[idx]->servedRadioBearer, sizeof(struct RLC_BearerConfig__servedRadioBearer));
5345 if(macLcConfig->ul_SpecificParameters)
5347 CU_FREE(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
5348 CU_FREE(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
5349 CU_FREE(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
5351 CU_FREE(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, sizeof(struct LogicalChannelConfig));
5353 CU_FREE(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
5356 CU_FREE(rlcBearerList->list.array, rlcBearerList->list.size);
5358 CU_FREE(cellGrpCfg->rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5361 macCellGrpCfg = cellGrpCfg->mac_CellGroupConfig;
5364 schedulingRequestConfig = macCellGrpCfg->schedulingRequestConfig;
5365 if(schedulingRequestConfig)
5367 schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
5370 if(schReqList->list.array)
5372 for(idx=0;idx<schReqList->list.count; idx++)
5374 if(schReqList->list.array[idx])
5376 CU_FREE(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
5377 CU_FREE(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
5380 CU_FREE(schReqList->list.array, schReqList->list.size);
5382 CU_FREE(schedulingRequestConfig->schedulingRequestToAddModList,\
5383 sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList)); }
5384 CU_FREE(macCellGrpCfg->schedulingRequestConfig, sizeof(struct SchedulingRequestConfig));
5386 if(macCellGrpCfg->bsr_Config)
5388 CU_FREE(macCellGrpCfg->bsr_Config, sizeof(struct BSR_Config));
5390 tagConfig = macCellGrpCfg->tag_Config;
5393 tagList = tagConfig->tag_ToAddModList;
5396 if(tagList->list.array)
5398 for(idx=0; idx<tagList->list.count; idx++)
5400 CU_FREE(tagList->list.array[idx], sizeof(struct TAG));
5402 CU_FREE(tagList->list.array, tagList->list.size);
5404 CU_FREE(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
5406 CU_FREE(tagConfig, sizeof(struct TAG_Config));
5409 phrConfig = macCellGrpCfg->phr_Config;
5412 CU_FREE(phrConfig->choice.setup, sizeof(struct PHR_Config));
5413 CU_FREE(phrConfig, sizeof(struct MAC_CellGroupConfig__phr_Config));
5416 CU_FREE(macCellGrpCfg, sizeof(MAC_CellGroupConfig_t));
5419 phyCellGrpCfg = cellGrpCfg->physicalCellGroupConfig;
5422 CU_FREE(phyCellGrpCfg->p_NR_FR1, sizeof(long));
5423 CU_FREE(phyCellGrpCfg, sizeof(PhysicalCellGroupConfig_t));
5426 spCellCfg = cellGrpCfg->spCellConfig;
5429 if(spCellCfg->servCellIndex)
5431 if(spCellCfg->rlmInSyncOutOfSyncThreshold)
5433 if(spCellCfg->spCellConfigDedicated)
5435 srvCellCfg = spCellCfg->spCellConfigDedicated;
5436 if(srvCellCfg->initialDownlinkBWP)
5438 dlBwp = srvCellCfg->initialDownlinkBWP;
5439 if(srvCellCfg->firstActiveDownlinkBWP_Id)
5441 if(srvCellCfg->defaultDownlinkBWP_Id)
5443 if(srvCellCfg->uplinkConfig)
5445 if(srvCellCfg->pdsch_ServingCellConfig)
5447 pdschCfg= srvCellCfg->pdsch_ServingCellConfig;
5448 if(pdschCfg->choice.setup)
5450 CU_FREE(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH,sizeof(long));
5451 CU_FREE(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
5453 CU_FREE(srvCellCfg->pdsch_ServingCellConfig, sizeof(struct
5454 ServingCellConfig__pdsch_ServingCellConfig));
5456 FreeinitialUplinkBWP(srvCellCfg->uplinkConfig);
5457 CU_FREE(srvCellCfg->uplinkConfig, sizeof(UplinkConfig_t));
5459 CU_FREE(srvCellCfg->defaultDownlinkBWP_Id, sizeof(long));
5461 CU_FREE(srvCellCfg->firstActiveDownlinkBWP_Id, sizeof(long));
5463 if(dlBwp->pdcch_Config)
5465 if(dlBwp->pdsch_Config)
5467 FreeBWPDlDedPdschCfg(dlBwp);
5468 CU_FREE(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
5470 FreeBWPDlDedPdcchCfg(dlBwp);
5471 CU_FREE(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
5473 CU_FREE(srvCellCfg->initialDownlinkBWP, sizeof(BWP_DownlinkDedicated_t));
5475 CU_FREE(spCellCfg->spCellConfigDedicated, sizeof(ServingCellConfig_t));
5477 CU_FREE(spCellCfg->rlmInSyncOutOfSyncThreshold, sizeof(long));
5479 CU_FREE(spCellCfg->servCellIndex, sizeof(long));
5481 CU_FREE(spCellCfg,sizeof(SpCellConfig_t));
5486 /*******************************************************************
5488 * @brief Fills CellGroupConfig
5492 * Function : fillCellGrpCfg
5494 * Functionality: Fills CellGroupConfig
5496 * @params[in] pointer to CellGroupConfigRrc_t
5498 * @return ROK - success
5501 ******************************************************************/
5503 uint8_t fillCellGrpCfg(CellGroupConfig_t *cellGrp)
5505 uint8_t ret = RFAILED;
5506 CellGroupConfigRrc_t cellGrpCfg;
5507 asn_enc_rval_t encRetVal;
5511 cellGrpCfg.cellGroupId = CELL_GRP_ID;
5513 cellGrpCfg.rlc_BearerToAddModList = NULLP;
5514 CU_ALLOC(cellGrpCfg.rlc_BearerToAddModList, sizeof(struct CellGroupConfigRrc__rlc_BearerToAddModList));
5515 if(!cellGrpCfg.rlc_BearerToAddModList)
5517 DU_LOG("\nF1AP : Memory allocation failure in CellGrpConfig");
5520 if(BuildRlcBearerToAddModList(cellGrpCfg.rlc_BearerToAddModList) != ROK)
5522 DU_LOG("\nF1AP : fillCellGrpCfg failed");
5526 cellGrpCfg.rlc_BearerToReleaseList = NULLP;
5527 cellGrpCfg.mac_CellGroupConfig = NULLP;
5528 CU_ALLOC(cellGrpCfg.mac_CellGroupConfig, sizeof(MAC_CellGroupConfig_t));
5529 if(!cellGrpCfg.mac_CellGroupConfig)
5531 DU_LOG("\nF1AP : Memory allocation failure in fillCellGrpCfg");
5534 if(BuildMacCellGrpCfg(cellGrpCfg.mac_CellGroupConfig) != ROK)
5536 DU_LOG("\nF1AP : BuildMacCellGrpCfg failed");
5541 cellGrpCfg.physicalCellGroupConfig = NULLP;
5542 CU_ALLOC(cellGrpCfg.physicalCellGroupConfig, sizeof(PhysicalCellGroupConfig_t));
5543 if(!cellGrpCfg.physicalCellGroupConfig)
5545 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5548 if(BuildPhyCellGrpCfg(cellGrpCfg.physicalCellGroupConfig) != ROK)
5550 DU_LOG("\nF1AP : BuildPhyCellGrpCfg failed");
5554 cellGrpCfg.spCellConfig = NULLP;
5555 CU_ALLOC(cellGrpCfg.spCellConfig, sizeof(SpCellConfig_t));
5556 if(!cellGrpCfg.spCellConfig)
5558 DU_LOG("\nF1AP : Memory allocation failure in BuildDuToCuRrcContainer");
5561 if(BuildSpCellCfg(cellGrpCfg.spCellConfig) != ROK)
5563 DU_LOG("\nF1AP : BuildSpCellCfg failed");
5567 cellGrpCfg.sCellToAddModList = NULLP;
5568 cellGrpCfg.sCellToReleaseList = NULLP;
5569 cellGrpCfg.ext1 = NULLP;
5571 /* encode cellGrpCfg into duToCuRrcContainer */
5572 xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, &cellGrpCfg);
5573 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
5575 encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, &cellGrpCfg, PrepFinalEncBuf, encBuf);
5576 /* Encode results */
5577 if(encRetVal.encoded == ENCODE_FAIL)
5579 DU_LOG( "\n F1AP : Could not encode DuToCuRrcContainer (at %s)\n",\
5580 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5585 DU_LOG("\n F1AP : Created APER encoded buffer for DuToCuRrcContainer\n");
5586 for(int i=0; i< encBufSize; i++)
5588 printf("%x",encBuf[i]);
5592 cellGrp->size = encBufSize;
5593 CU_ALLOC(cellGrp->buf, cellGrp->size);
5596 DU_LOG("\nF1AP : Memory allocation failed in BuildDuToCuRrcContainer");
5599 memcpy(cellGrp->buf, encBuf, cellGrp->size);
5603 FreeMemCellGrpCfg(&cellGrpCfg);
5607 /*******************************************************************
5609 * @brief Fills CuToDuContainer
5613 * Function : fillCuToDuContainer
5615 * Functionality: Fills CuToDuContainer
5617 * @params[in] pointer to CUtoDURRCInformation_t
5619 * @return ROK - success
5622 ******************************************************************/
5624 uint8_t fillCuToDuContainer(CUtoDURRCInformation_t *rrcMsg)
5626 uint8_t elementCnt = 0;
5628 uint8_t idx, idx2, rrcBufLen;
5631 CU_ALLOC(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
5632 if(rrcMsg->iE_Extensions)
5634 rrcMsg->iE_Extensions->list.count = elementCnt;
5635 rrcMsg->iE_Extensions->list.size = elementCnt * sizeof(CUtoDURRCInformation_ExtIEs_t);
5637 /* Initialize the CUtoDURRCInformation_ExtIEs */
5638 CU_ALLOC(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
5640 if(rrcMsg->iE_Extensions->list.array == NULLP)
5642 DU_LOG(" F1AP : Memory allocation for CUtoDURRCInformation_ExtIEs failed");
5646 for(idx=0; idx<elementCnt; idx++)
5648 CU_ALLOC(rrcMsg->iE_Extensions->list.array[idx], sizeof(CUtoDURRCInformation_ExtIEs_t));
5649 if(rrcMsg->iE_Extensions->list.array[idx] == NULLP)
5655 /* Filling CellGroupConfig_t IE */
5656 rrcMsg->iE_Extensions->list.array[idx]->id = ProtocolIE_ID_id_CellGroupConfig;
5657 rrcMsg->iE_Extensions->list.array[idx]->criticality = Criticality_ignore;
5658 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.present =\
5659 CUtoDURRCInformation_ExtIEs__extensionValue_PR_CellGroupConfig;
5660 ret = fillCellGrpCfg(&rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig);
5665 /*******************************************************************
5667 * @brief Free CuToDuContainer
5671 * Function : FreeCuToDuInfo
5673 * Functionality: Free CuToDuContainer
5675 * @params[in] pointer to CUtoDURRCInformation_t
5677 * @return ROK - success
5680 ******************************************************************/
5682 void FreeCuToDuInfo(CUtoDURRCInformation_t *rrcMsg)
5686 if(rrcMsg->iE_Extensions)
5688 if(rrcMsg->iE_Extensions->list.array)
5690 for(idx= 0; idx < rrcMsg->iE_Extensions->list.count; idx++)
5692 if(rrcMsg->iE_Extensions->list.array[idx])
5694 switch(rrcMsg->iE_Extensions->list.array[idx]->id)
5696 case ProtocolIE_ID_id_CellGroupConfig:
5697 if(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf != NULLP)
5699 CU_FREE(rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.buf,\
5700 rrcMsg->iE_Extensions->list.array[idx]->extensionValue.choice.CellGroupConfig.size);
5705 DU_LOG("\nF1AP:Invalid Event type %ld at FreeCuToDuInfo()", \
5706 rrcMsg->iE_Extensions->list.array[idx]->id);
5712 for(idx2 = 0; idx2 < idx; idx2++)
5714 CU_FREE(rrcMsg->iE_Extensions->list.array[idx2], sizeof(CUtoDURRCInformation_ExtIEs_t));
5716 CU_FREE(rrcMsg->iE_Extensions->list.array, rrcMsg->iE_Extensions->list.size);
5720 CU_FREE(rrcMsg->iE_Extensions, sizeof(ProtocolExtensionContainer_4624P16_t));
5723 /*******************************************************************
5725 * @brief Builds and sends the UE Setup Request
5729 * Function : BuildAndSendUeContextSetupReq
5731 * Functionality: Constructs the UE Setup Request and sends
5732 * it to the CU through SCTP.
5736 * @return ROK - success
5739 * ****************************************************************/
5740 uint8_t BuildAndSendUeContextSetupReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
5741 uint16_t rrcContLen, uint8_t *rrcContainer)
5744 uint8_t SplCellListret;
5745 uint8_t SrbSetupret;
5747 uint8_t idx, bufLen;
5749 F1AP_PDU_t *f1apMsg = NULLP;
5750 UEContextSetupRequest_t *ueSetReq = NULLP;
5751 asn_enc_rval_t encRetVal; /* Encoder return value */
5752 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
5753 uint8_t ret= RFAILED;
5757 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
5759 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
5760 if(f1apMsg == NULLP)
5762 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5766 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
5767 CU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
5768 if(f1apMsg->choice.initiatingMessage == NULLP)
5770 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
5774 f1apMsg->choice.initiatingMessage->procedureCode = \
5775 ProcedureCode_id_UEContextSetup;
5776 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
5777 f1apMsg->choice.initiatingMessage->value.present = \
5778 InitiatingMessage__value_PR_UEContextSetupRequest;
5780 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
5783 ueSetReq->protocolIEs.list.count = elementCnt;
5784 ueSetReq->protocolIEs.list.size = \
5785 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
5787 /* Initialize the UESetup members */
5788 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
5790 if(ueSetReq->protocolIEs.list.array == NULLP)
5792 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
5796 for(idx1=0; idx1<elementCnt; idx1++)
5798 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
5799 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
5807 /*GNB CU UE F1AP ID*/
5808 ueSetReq->protocolIEs.list.array[idx]->id = \
5809 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
5810 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5811 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5812 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
5813 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
5815 /*GNB DU UE F1AP ID*/
5817 ueSetReq->protocolIEs.list.array[idx]->id = \
5818 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
5819 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5820 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5821 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
5822 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
5826 ueSetReq->protocolIEs.list.array[idx]->id = \
5827 ProtocolIE_ID_id_SpCell_ID;
5828 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5829 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5830 UEContextSetupRequestIEs__value_PR_NRCGI;
5831 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
5837 /*Served Cell Index*/
5839 ueSetReq->protocolIEs.list.array[idx]->id = \
5840 ProtocolIE_ID_id_ServCellIndex;
5841 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5842 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5843 UEContextSetupRequestIEs__value_PR_ServCellIndex;
5844 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
5847 /*CellULConfigured*/
5849 ueSetReq->protocolIEs.list.array[idx]->id = \
5850 ProtocolIE_ID_id_SpCellULConfigured;
5851 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5852 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5853 UEContextSetupRequestIEs__value_PR_CellULConfigured;
5854 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
5855 CellULConfigured_none;
5857 /*CUtoDURRCContainer*/
5859 ueSetReq->protocolIEs.list.array[idx]->id = \
5860 ProtocolIE_ID_id_CUtoDURRCInformation;
5861 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5862 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5863 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
5864 if(fillCuToDuContainer(&ueSetReq->protocolIEs.list.array[idx]->value.choice.CUtoDURRCInformation))
5869 /*Special Cells to be SetupList*/
5871 ueSetReq->protocolIEs.list.array[idx]->id = \
5872 ProtocolIE_ID_id_SCell_ToBeSetup_List;
5873 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5874 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5875 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
5876 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
5877 if(SplCellListret != ROK)
5881 /*SRBs To Be Setup List*/
5883 ueSetReq->protocolIEs.list.array[idx]->id = \
5884 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
5885 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5886 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5887 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
5888 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
5889 if(SrbSetupret != ROK)
5893 /*DRBs to Be Setup List*/
5895 ueSetReq->protocolIEs.list.array[idx]->id = \
5896 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
5897 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5898 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5899 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
5900 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
5905 /* RRC Container for security mode */
5907 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
5908 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
5909 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5910 UEContextSetupRequestIEs__value_PR_RRCContainer;
5911 char buf[9]={0x00, 0x02, 0x22, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00};
5913 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = bufLen;
5914 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
5915 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
5916 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
5918 DU_LOG(" F1AP : Memory allocation for BuildAndSendUeContextSetupReq failed");
5921 memset(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, 0, encBufSize);
5922 for(idx1 = 0; idx1 < encBufSize; idx1++)
5924 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf[idx1] = buf[idx1];
5927 /* RRC delivery status request */
5929 ueSetReq->protocolIEs.list.array[idx]->id = \
5930 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
5931 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
5932 ueSetReq->protocolIEs.list.array[idx]->value.present = \
5933 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
5934 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
5935 RRCDeliveryStatusRequest_true;
5937 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
5939 /* Encode the F1SetupRequest type as APER */
5940 memset(encBuf, 0, ENC_BUF_MAX_LEN);
5942 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
5944 /* Encode results */
5945 if(encRetVal.encoded == ENCODE_FAIL)
5947 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
5948 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
5953 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
5954 for(int i=0; i< encBufSize; i++)
5956 printf("%x",encBuf[i]);
5961 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
5963 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
5969 FreeUeContextSetupReq(f1apMsg);
5972 }/* End of BuildAndSendUeContextSetupReq*/
5974 /****************************************************************
5975 * @brief Function to process Ul Rrc Msg received from DU
5979 * Function : procUlRrcMsg
5982 * - Function to process Ul Rrc Msg received from DU
5985 * @return ROK - success
5988 * ****************************************************************/
5990 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
5992 uint8_t idx, ret, srbId, rrcMsgType;
5993 uint8_t cuUeF1apId, duUeF1apId;
5994 uint8_t *rrcContainer = NULLP;
5995 uint16_t rrcContLen;
5996 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
5999 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
6001 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
6003 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
6005 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
6007 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
6010 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
6012 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
6015 case ProtocolIE_ID_id_SRBID:
6016 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
6018 case ProtocolIE_ID_id_RRCContainer:
6020 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
6021 CU_ALLOC(rrcContainer, rrcContLen)
6024 DU_LOG("\nCU_STUB: Failed to allocated memory in procUlRrcMsg");
6027 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
6033 DU_LOG("\n Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
6039 f1apMsgDb.dlRrcMsgCount++;
6040 rrcMsgType = setDlRRCMsgType();
6041 if(rrcMsgType == REGISTRATION_ACCEPT)
6043 DU_LOG("\nSending DL RRC MSG for RRC Registration Complete");
6044 ret = BuildAndSendDLRRCMessageTransfer(srbId, rrcMsgType);
6046 if(rrcMsgType == UE_CONTEXT_SETUP_REQ)
6048 DU_LOG("\nSending Ue Context Setup Req");
6049 ret = BuildAndSendUeContextSetupReq(cuUeF1apId, duUeF1apId,\
6050 rrcContLen, rrcContainer);
6056 /****************************************************************
6057 * @brief Build And Send F1ResetAck
6061 * Function : FreeF1ResetAck
6064 * - Build And Send F1ResetRSP
6067 * @return ROK - success
6070 * ****************************************************************/
6071 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
6074 ResetAcknowledge_t *f1ResetAck;
6078 if(f1apMsg->choice.successfulOutcome)
6080 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6082 if(f1ResetAck->protocolIEs.list.array)
6084 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
6086 if(f1ResetAck->protocolIEs.list.array[idx])
6088 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6091 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6093 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6095 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
6099 /****************************************************************
6100 * @brief Build And Send F1ResetAck
6104 * Function : BuildAndSendF1ResetAck
6107 * - Build And Send F1ResetRSP
6110 * @return ROK - success
6113 * ****************************************************************/
6115 uint8_t BuildAndSendF1ResetAck()
6118 uint8_t elementCnt = 0;
6119 uint8_t ret = RFAILED;
6120 F1AP_PDU_t *f1apMsg = NULL;
6121 ResetAcknowledge_t *f1ResetAck = NULLP;
6122 asn_enc_rval_t encRetVal;
6123 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
6126 /* Allocate the memory for F1ResetRequest_t */
6127 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
6128 if(f1apMsg == NULLP)
6130 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6134 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
6136 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
6137 if(f1apMsg->choice.successfulOutcome == NULLP)
6139 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
6143 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
6144 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
6145 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
6146 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
6150 f1ResetAck->protocolIEs.list.count = elementCnt;
6151 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
6153 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
6154 if(f1ResetAck->protocolIEs.list.array == NULLP)
6156 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
6160 for(idx=0; idx<elementCnt; idx++)
6162 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
6163 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
6170 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
6171 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
6172 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
6173 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
6175 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6177 /* Encode the F1SetupRequest type as UPER */
6178 memset(encBuf, 0, ENC_BUF_MAX_LEN);
6180 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
6182 /* Check encode results */
6183 if(encRetVal.encoded == ENCODE_FAIL)
6185 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
6186 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
6191 DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck \n");
6192 for(int i=0; i< encBufSize; i++)
6194 printf("%x",encBuf[i]);
6198 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
6200 DU_LOG("\nF1AP : Sending F1 Reset Response failed");
6208 FreeF1ResetAck(f1apMsg);
6212 /*******************************************************************
6214 * @brief Handles received F1AP message and sends back response
6218 * Function : F1APMsgHdlr
6221 * - Decodes received F1AP control message
6222 * - Prepares response message, encodes and sends to SCTP
6225 * @return ROK - success
6228 * ****************************************************************/
6229 void F1APMsgHdlr(Buffer *mBuf)
6235 F1AP_PDU_t *f1apMsg = NULLP;
6236 asn_dec_rval_t rval; /* Decoder return value */
6237 F1AP_PDU_t f1apasnmsg ;
6239 DU_LOG("\nF1AP : Received F1AP message buffer");
6240 ODU_PRINT_MSG(mBuf, 0,0);
6242 /* Copy mBuf into char array to decode it */
6243 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
6244 CU_ALLOC(recvBuf, (Size)recvBufLen);
6246 if(recvBuf == NULLP)
6248 DU_LOG("\nF1AP : Memory allocation failed");
6251 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
6253 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
6257 printf("\nF1AP : Received flat buffer to be decoded : ");
6258 for(i=0; i< recvBufLen; i++)
6260 printf("%x",recvBuf[i]);
6263 /* Decoding flat buffer into F1AP messsage */
6264 f1apMsg = &f1apasnmsg;
6265 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
6267 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
6268 CU_FREE(recvBuf, (Size)recvBufLen);
6270 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
6272 DU_LOG("\nF1AP : ASN decode failed");
6276 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
6278 switch(f1apMsg->present)
6280 case F1AP_PDU_PR_initiatingMessage:
6282 switch(f1apMsg->choice.initiatingMessage->value.present)
6284 case InitiatingMessage__value_PR_Reset:
6286 DU_LOG("\nF1AP : F1 reset request received ");
6287 BuildAndSendF1ResetAck();
6291 case InitiatingMessage__value_PR_F1SetupRequest:
6293 DU_LOG("\nF1AP : F1 setup request received");
6294 BuildAndSendF1SetupRsp();
6298 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
6300 DU_LOG("\nF1AP : GNB-DU config update received");
6301 BuildAndSendDUUpdateAck();
6302 DU_LOG("\nF1AP : Sending F1 reset request");
6303 BuildAndSendF1ResetReq();
6306 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
6308 DU_LOG("\nF1AP : Received InitialULRRCMessageTransfer");
6309 procInitULRRCMsg(f1apMsg);
6312 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
6314 DU_LOG("\nF1AP : Received ULRRCMessageTransfer");
6315 procUlRrcMsg(f1apMsg);
6319 case InitiatingMessage__value_PR_RRCDeliveryReport:
6321 DU_LOG("\nF1AP : Received RRC delivery report");
6326 DU_LOG("\nF1AP : Invalid type of intiating message [%d]",f1apMsg->choice.initiatingMessage->value.present);
6329 }/* End of switch(initiatingMessage) */
6333 case F1AP_PDU_PR_successfulOutcome:
6335 switch(f1apMsg->choice.successfulOutcome->value.present)
6337 case SuccessfulOutcome__value_PR_ResetAcknowledge:
6339 DU_LOG("\nF1Reset Acknowledgement is received successfully ");
6342 case SuccessfulOutcome__value_PR_UEContextSetupResponse:
6346 DU_LOG("\nF1AP : UE ContextSetupResponse received");
6347 f1apMsgDb.dlRrcMsgCount++;
6348 rrcMsgType = setDlRRCMsgType();
6349 if(rrcMsgType == RRC_RECONFIG)
6351 DU_LOG("\nImplementing DL RRC MSG for RRC Reconfig Complete");
6352 BuildAndSendDLRRCMessageTransfer(SRB1, rrcMsgType);
6358 DU_LOG("\nF1AP : Invalid type of successful outcome message [%d]",\
6359 f1apMsg->choice.successfulOutcome->value.present);
6362 }/* End of switch(successfulOutcome) */
6367 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
6370 }/* End of switch(f1apMsg->present) */
6372 } /* End of F1APMsgHdlr */
6374 /**********************************************************************
6376 **********************************************************************/