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"
27 /*******************************************************************
29 * @brief Sends F1 msg over SCTP
33 * Function : SendF1APMsg
35 * Functionality: Sends F1 msg over SCTP
37 * @params[in] Region region
39 * @return ROK - success
42 * ****************************************************************/
43 S16 SendF1APMsg(Region region, Pool pool)
47 if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
49 if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
51 ODU_PRINT_MSG(mBuf, 0,0);
53 if(sctpSend(mBuf) != ROK)
55 DU_LOG("\nF1AP : SCTP Send failed");
56 ODU_PUT_MSG_BUF(mBuf);
62 DU_LOG("\nF1AP : ODU_ADD_POST_MSG_MULT failed");
63 ODU_PUT_MSG_BUF(mBuf);
66 ODU_PUT_MSG_BUF(mBuf);
70 DU_LOG("\nF1AP : Failed to allocate memory");
77 /*******************************************************************
79 * @brief Builds NRCell ID
83 * Function : BuildNrCellId
85 * Functionality: Building the NR Cell ID
87 * @params[in] BIT_STRING_t *nrcell
88 * @return ROK - success
91 * ****************************************************************/
93 S16 BuildNrCellId(BIT_STRING_t *nrcell)
96 for (tmp = 0 ; tmp < nrcell->size-1; tmp++)
101 nrcell->bits_unused = 4;
102 nrcell->size = 5 * sizeof(uint8_t);
106 /********************************************************************
108 * @brief Builds and sends the F1SetupResponse
112 * Function : BuildAndSendF1SetupRsp
114 * Functionality: Constructs the F1SetupResponse message and sends
115 * it back to the DU through SCTP.
117 * @params[in] void **buf,Buffer to which encoded pattern is written into
118 * @params[in] int *size,size of buffer
120 * @return ROK - success
123 * ****************************************************************/
124 S16 BuildAndSendF1SetupRsp()
127 U8 elementCnt,cellCnt;
128 F1AP_PDU_t *f1apMsg = NULL;
129 F1SetupResponse_t *f1SetupRsp;
130 GNB_CU_Name_t *cuName;
131 Cells_to_be_Activated_List_t *cellToActivate;
132 RRC_Version_t *rrcVer;
133 asn_enc_rval_t encRetVal;
134 DU_LOG("\nF1AP : Building F1 Setup Response\n");
136 /* Allocate the memory for F1SetupRequest_t */
137 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
140 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
143 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
145 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
146 if(f1apMsg->choice.successfulOutcome == NULLP)
148 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
149 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
153 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_F1Setup;
154 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
155 f1apMsg->choice.successfulOutcome->value.present = \
156 SuccessfulOutcome__value_PR_F1SetupResponse;
157 f1SetupRsp = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
160 f1SetupRsp->protocolIEs.list.count = elementCnt;
161 f1SetupRsp->protocolIEs.list.size = elementCnt*sizeof(F1SetupResponseIEs_t *);
163 CU_ALLOC(f1SetupRsp->protocolIEs.list.array, \
164 elementCnt * sizeof(F1SetupResponseIEs_t *));
165 if(f1SetupRsp->protocolIEs.list.array == NULLP)
167 DU_LOG("\nF1AP : Memory allocation for F1ResponseIEs failed");
168 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
169 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
173 for(idx=0; idx<elementCnt; idx++)
175 CU_ALLOC(f1SetupRsp->protocolIEs.list.array[idx], \
176 sizeof(F1SetupResponseIEs_t));
177 if(f1SetupRsp->protocolIEs.list.array[idx] == NULLP)
179 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
180 elementCnt * sizeof(F1SetupResponseIEs_t *));
181 CU_FREE(f1apMsg->choice.successfulOutcome, \
182 sizeof(SuccessfulOutcome_t));
183 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
190 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
191 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
192 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
193 F1SetupResponseIEs__value_PR_TransactionID;
194 f1SetupRsp->protocolIEs.list.array[idx]->value.choice.TransactionID =\
199 f1SetupRsp->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_Name;
200 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
201 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
202 F1SetupResponseIEs__value_PR_GNB_CU_Name;
203 cuName = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_Name;
204 cuName->size = sizeof(cuCfgParams.cuName);
206 CU_ALLOC(cuName->buf, sizeof(cuName->size));
207 if(cuName->buf == NULLP)
209 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
211 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
212 sizeof(F1SetupResponseIEs_t));
214 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
215 elementCnt * sizeof(F1SetupResponseIEs_t *));
216 CU_FREE(f1apMsg->choice.successfulOutcome,\
217 sizeof(SuccessfulOutcome_t));
218 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
221 strcpy((char*)cuName->buf, (char*)cuCfgParams.cuName);
223 /*Cells to be activated list*/
225 f1SetupRsp->protocolIEs.list.array[idx]->id = \
226 ProtocolIE_ID_id_Cells_to_be_Activated_List ;
227 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
228 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
229 F1SetupResponseIEs__value_PR_Cells_to_be_Activated_List;
230 cellToActivate = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.\
231 Cells_to_be_Activated_List;
233 cellToActivate->list.count = cellCnt;
234 cellToActivate->list.size = \
235 cellCnt*sizeof(struct Cells_to_be_Activated_List_ItemIEs *);
236 CU_ALLOC(cellToActivate->list.array,\
237 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
238 if(cellToActivate->list.array == NULLP)
240 CU_FREE(cuName->buf, sizeof(cuName->size));
241 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
243 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx],\
244 sizeof(F1SetupResponseIEs_t));
246 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
247 elementCnt * sizeof(F1SetupResponseIEs_t *));
248 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
249 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
252 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
254 CU_ALLOC(cellToActivate->list.array[ieIdx],sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
255 if(cellToActivate->list.array[ieIdx] == NULLP)
257 CU_FREE(cellToActivate->list.array,\
258 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
259 CU_FREE(cuName->buf, sizeof(cuName->size));
260 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
262 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
263 sizeof(F1SetupResponseIEs_t));
265 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
266 elementCnt * sizeof(F1SetupResponseIEs_t *));
267 CU_FREE(f1apMsg->choice.successfulOutcome, \
268 sizeof(SuccessfulOutcome_t));
269 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
273 cellToActivate->list.array[0]->id = \
274 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
275 cellToActivate->list.array[0]->criticality = Criticality_ignore;
276 cellToActivate->list.array[0]->value.present = \
277 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
278 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
279 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
280 CU_ALLOC(cellToActivate->list.array[0]->\
281 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
283 if(cellToActivate->list.array[0]->value.choice.\
284 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
287 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
289 CU_FREE(cellToActivate->list.array[ieIdx],\
290 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
293 CU_FREE(cellToActivate->list.array,\
294 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
295 CU_FREE(cuName->buf, sizeof(cuName->size));
296 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
298 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
299 sizeof(F1SetupResponseIEs_t));
301 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
302 elementCnt * sizeof(F1SetupResponseIEs_t *));
303 CU_FREE(f1apMsg->choice.successfulOutcome, \
304 sizeof(SuccessfulOutcome_t));
305 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
308 buildPlmnId(cuCfgParams.plmn , cellToActivate->list.array[0]->value.choice.\
309 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf);
310 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
311 nRCGI.nRCellIdentity.size = 5;
312 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
313 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
315 if(cellToActivate->list.array[0]->value.choice.\
316 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
318 CU_FREE(cellToActivate->list.array[0]->\
319 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
321 for(ieIdx=0; ieIdx<cellCnt; ieIdx++)
323 CU_FREE(cellToActivate->list.array[ieIdx],\
324 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
327 CU_FREE(cellToActivate->list.array,\
328 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
329 CU_FREE(cuName->buf, sizeof(cuName->size));
330 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
332 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
333 sizeof(F1SetupResponseIEs_t));
335 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
336 elementCnt * sizeof(F1SetupResponseIEs_t *));
337 CU_FREE(f1apMsg->choice.successfulOutcome, \
338 sizeof(SuccessfulOutcome_t));
339 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
342 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
345 f1SetupRsp->protocolIEs.list.array[idx]->id = \
346 ProtocolIE_ID_id_GNB_CU_RRC_Version;
347 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
348 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
349 F1SetupResponseIEs__value_PR_RRC_Version;
350 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
351 rrcVer->latest_RRC_Version.size = RRC_SIZE;
353 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(U8));
354 if(rrcVer->latest_RRC_Version.buf == NULLP)
356 CU_FREE(cuName->buf, sizeof(cuName->size));
357 for(ieIdx=0; ieIdx<elementCnt; idx++)
359 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
360 sizeof(F1SetupResponseIEs_t));
362 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
363 elementCnt * sizeof(F1SetupResponseIEs_t *));
364 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
365 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
369 /* Need to check RRC Version */
370 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
371 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
372 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
373 if(rrcVer->iE_Extensions == NULLP)
375 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
376 CU_FREE(cuName->buf, sizeof(cuName->size));
377 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
379 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
380 sizeof(F1SetupResponseIEs_t));
382 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
383 elementCnt * sizeof(F1SetupResponseIEs_t *));
384 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
385 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
388 rrcVer->iE_Extensions->list.count = 1;
389 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
390 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
391 sizeof(struct RRC_Version_ExtIEs *));
392 if(rrcVer->iE_Extensions->list.array == NULLP)
394 CU_FREE(rrcVer->iE_Extensions,\
395 sizeof(ProtocolExtensionContainer_4624P81_t));
396 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
397 CU_FREE(cuName->buf, sizeof(cuName->size));
398 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
400 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
401 sizeof(F1SetupResponseIEs_t));
403 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
404 elementCnt * sizeof(F1SetupResponseIEs_t *));
405 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
406 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
409 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
410 sizeof(struct RRC_Version_ExtIEs));
411 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
413 CU_FREE(rrcVer->iE_Extensions->list.array,\
414 sizeof(struct RRC_Version_ExtIEs *));
415 CU_FREE(rrcVer->iE_Extensions,\
416 sizeof(ProtocolExtensionContainer_4624P81_t));
417 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
418 CU_FREE(cuName->buf, sizeof(cuName->size));
419 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
421 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
422 sizeof(F1SetupResponseIEs_t));
424 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
425 elementCnt * sizeof(F1SetupResponseIEs_t *));
426 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
427 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
430 rrcVer->iE_Extensions->list.array[0]->id = \
431 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
432 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
433 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
434 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
435 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
436 Latest_RRC_Version_Enhanced.size = 3*sizeof(U8);
437 CU_ALLOC(rrcVer->iE_Extensions->list.\
438 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
440 if(rrcVer->iE_Extensions->list.\
441 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
443 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
444 sizeof(struct RRC_Version_ExtIEs));
445 CU_FREE(rrcVer->iE_Extensions->list.array,\
446 sizeof(struct RRC_Version_ExtIEs *));
447 CU_FREE(rrcVer->iE_Extensions,\
448 sizeof(ProtocolExtensionContainer_4624P81_t));
449 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
450 CU_FREE(cuName->buf, sizeof(cuName->size));
451 for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
453 CU_FREE(f1SetupRsp->protocolIEs.list.array[ieIdx], \
454 sizeof(F1SetupResponseIEs_t));
456 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
457 elementCnt * sizeof(F1SetupResponseIEs_t *));
458 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
459 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
462 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
463 Latest_RRC_Version_Enhanced.buf[0] = 0;
464 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
465 Latest_RRC_Version_Enhanced.buf[1] = 5;
466 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
467 Latest_RRC_Version_Enhanced.buf[2] = 15;
469 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
471 /* Encode the F1SetupRequest type as UPER */
472 memset(encBuf, 0, ENC_BUF_MAX_LEN);
474 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
477 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
478 CU_FREE(cuName->buf, sizeof(cuName->size));
479 for(idx=0; idx<elementCnt; idx++)
481 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
483 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
484 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
485 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
487 /* Check encode results */
488 if(encRetVal.encoded == ENCODE_FAIL)
490 DU_LOG("\nF1AP : Could not encode F1SetupResponse structure (at %s)\n",\
491 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
496 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n");
497 for(int i=0; i< encBufSize; i++)
499 printf("%x",encBuf[i]);
504 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
506 DU_LOG("\nF1AP : Sending F1 Setup Response failed");
511 }/* End of BuildAndSendF1SetupRsp */
513 /*******************************************************************
515 * @brief Builds and sends the DUUpdateAcknowledge
519 * Function : BuildAndSendDUUpdateAck
521 * Functionality: Constructs the DU Update Acknowledge message and sends
522 * it to the DU through SCTP.
524 * @params[in] void **buf,Buffer to which encoded pattern is written into
525 * @params[in] int *size,size of buffer
527 * @return ROK - success
530 * ****************************************************************/
532 S16 BuildAndSendDUUpdateAck()
536 F1AP_PDU_t *f1apMsg = NULL;
537 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
538 asn_enc_rval_t enRetVal; /* Encoder return value */
540 DU_LOG("\nF1AP : Building GNB-DU Config Update Ack\n");
542 /* Allocate the memory for F1SetupRequest_t */
543 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
546 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
550 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
552 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
553 if(f1apMsg->choice.successfulOutcome == NULLP)
555 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
556 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
560 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
561 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
562 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
563 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
566 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
567 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
569 /* Initialize the F1Setup members */
570 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
571 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
573 DU_LOG("\nF1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
574 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
575 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
579 for(idx=0; idx<elementCnt; idx++)
581 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
582 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
584 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
585 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
586 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
593 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
594 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
595 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present = GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
596 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
598 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
600 /* Encode the F1SetupRequest type as UPER */
601 memset(encBuf, 0, ENC_BUF_MAX_LEN);
603 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
606 for(idx=0; idx<elementCnt; idx++)
608 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
610 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
611 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
612 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
614 /* Checking encode results */
615 if(enRetVal.encoded == ENCODE_FAIL)
617 DU_LOG("\nF1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
622 DU_LOG("\nF1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
623 for(int i=0; i< encBufSize; i++)
625 printf("%x",encBuf[i]);
630 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
632 DU_LOG("\nF1AP : Sending GNB-DU Config Update Ack failed");
638 }/* End of BuildAndSendDUUpdateAck*/
639 /*******************************************************************
641 * @brief deallocating the memory of F1reset msg
645 * Function : FreeF1ResetReq
648 * - freeing memory of F1reset request msg
654 * ****************************************************************/
655 void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
658 Reset_t *f1ResetMsg = NULLP;
662 if(f1apMsg->choice.initiatingMessage)
664 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
665 if(f1ResetMsg->protocolIEs.list.array)
667 for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
669 if(f1ResetMsg->protocolIEs.list.array[idx])
671 CU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
674 CU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
676 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
678 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
681 /*******************************************************************
683 * @brief build ansld ans send f1reset msg
687 * Function : BuildAndSendF1ResetReq
689 * Functionality: build and send f1reset msg
691 * @return ROK - success
694 * ****************************************************************/
695 uint8_t BuildAndSendF1ResetReq()
697 uint8_t elementCnt=0;
699 uint8_t ret= RFAILED;
700 Reset_t *f1ResetMsg = NULLP;
701 F1AP_PDU_t *f1apMsg = NULLP;
702 asn_enc_rval_t encRetVal;
703 DU_LOG("\nF1AP : Building F1 Reset request \n");
706 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
709 DU_LOG("\nF1AP : Memory allocation for the BuildAndSendF1ResetReq's F1AP-PDU failed");
712 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
713 CU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
714 if(f1apMsg->choice.initiatingMessage == NULLP)
716 DU_LOG("\nF1AP : Memory allocation for BuildAndSendF1ResetReq failed");
719 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
720 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
721 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
723 f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
726 f1ResetMsg->protocolIEs.list.count = elementCnt;
727 f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
729 /* Initialize the F1Reset members */
730 CU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
731 if(f1ResetMsg->protocolIEs.list.array == NULLP)
733 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq");
736 for(idx=0; idx<elementCnt; idx++)
738 CU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
739 if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
741 DU_LOG("\nF1AP : Memory allocation failed for BuildAndSendF1ResetReq msg array");
748 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
749 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
750 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
751 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
755 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
756 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
757 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
758 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
759 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
763 f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
764 f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
765 f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
766 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
767 f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
769 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
771 /* Encode the F1SetupRequest type as APER */
772 memset(encBuf, 0, ENC_BUF_MAX_LEN);
774 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
778 if(encRetVal.encoded == ENCODE_FAIL)
780 DU_LOG("\nF1AP : Could not encode F1Reset structure (at %s)\n",\
781 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
786 DU_LOG("\nF1AP : Created APER encoded buffer for F1Reset\n");
787 for(idx=0; idx< encBufSize; idx++)
789 printf("%x",encBuf[idx]);
793 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
795 DU_LOG("\nF1AP : Sending F1 Reset request failed");
803 FreeF1ResetReq(f1apMsg);
807 /*******************************************************************
809 * @brief Fills Radio Bearer Config
813 * Function : fillSrbCfg
815 * Functionality: Fills Radio Bearer Config
817 * @params[in] SRB_ToAddModList *
819 * @return ROK - success
822 * ****************************************************************/
823 uint8_t fillSrbCfg(uint8_t srbId, SRB_ToAddModList_t *bearerCfg)
827 if(bearerCfg != NULLP)
830 bearerCfg->list.count = elementCnt;
831 bearerCfg->list.size =\
832 elementCnt * sizeof(SRB_ToAddMod_t *);
833 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
834 if(bearerCfg->list.array != NULLP)
836 for(idx = 0; idx < elementCnt; idx++)
838 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
839 if(bearerCfg->list.array[idx] == NULLP)
841 for(ieId = 0; ieId < idx; ieId++)
843 CU_FREE(bearerCfg->list.array[ieId], sizeof(SRB_ToAddMod_t));
845 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
855 bearerCfg->list.array[idx]->srb_Identity = srbId;
860 /*******************************************************************
862 * @brief Fills Master CellGroup Info
866 * Function : fillMasterCellGroup
868 * Functionality: Fills Master Cell Group IE
870 * @params[in] RRCSetup_IEs_t *
872 * @return ROK - success
875 * ****************************************************************/
877 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
880 masterCellGroup->buf = NULLP;
881 if(f1apMsgDb.duToCuContainer.buf)
883 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
884 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
885 if(masterCellGroup->buf != NULLP)
887 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
888 masterCellGroup->size);
902 /*******************************************************************
904 * @brief Fills RRC setup IE
908 * Function : fillRRCSetupIE
910 * Functionality: Fills RRC Setup IE
912 * @params[in] RRCSetup_IEs_t *
914 * @return ROK - success
917 * ****************************************************************/
919 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
924 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
925 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
927 ret = fillSrbCfg(SRB1, rrcSetupIE->radioBearerConfig.srb_ToAddModList);
931 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
935 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
941 /*******************************************************************
943 * @brief Fills DL DCCCH Message required for DLRRCMessageTransfer
947 * Function : fillDlCcchRrcMsg
949 * Functionality: Fills DL DCCCH Message required for
950 * DLRRCMessageTransfer
952 * @params[in] RRCContainer_t *rrcContainer
954 * @return ROK - success
957 * ****************************************************************/
959 uint8_t fillDlCcchRrcMsg(RRCContainer_t *rrcContainer)
963 DL_CCCH_Message_t dl_CCCH_Msg;
964 asn_enc_rval_t encRetVal;
966 if(rrcContainer != NULLP)
968 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
970 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
971 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
973 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
974 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
975 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
977 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
978 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
979 present = RRCSetup__criticalExtensions_PR_rrcSetup;
980 /* Fill RRC Setup IE */
981 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
982 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
983 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
984 criticalExtensions.choice.rrcSetup != NULLP)
986 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
987 criticalExtensions.choice.rrcSetup);
991 /* encode DL-CCCH message into RRC Container */
992 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
993 memset(encBuf, 0, ENC_BUF_MAX_LEN);
995 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
997 if(encRetVal.encoded == ENCODE_FAIL)
999 DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-CCCH Msg(at %s)\n",\
1000 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1005 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-CCCH Msg\n");
1006 for(int i = 0; i< encBufSize; i++)
1008 printf("%x",encBuf[i]);
1010 rrcContainer->size = encBufSize;
1011 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1012 if(rrcContainer->buf != NULLP)
1014 memset(rrcContainer->buf, 0, encBufSize);
1015 for(idx2 = 0; idx2 < encBufSize; idx2++)
1017 rrcContainer->buf[idx2] = encBuf[idx2];
1029 DU_LOG("\nF1AP: Memory Alloc failed for RRC Setup Msg at fillDlCcchRrcMsg()");
1035 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlCcchRrcMsg()");
1041 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice at fillDlCcchRrcMsg()");
1047 DU_LOG("\nF1AP: RRC Container is NULLP at fillDlCcchRrcMsg()");
1052 uint8_t fillQosFlowsToAdd(struct SDAP_Config__mappedQoS_FlowsToAdd *qosFlow)
1054 uint8_t idx, ied, elementCnt;
1057 qosFlow->list.count = elementCnt;
1058 qosFlow->list.size = elementCnt * sizeof(QFI_t *);
1059 CU_ALLOC(qosFlow->list.array, qosFlow->list.size);
1060 if(qosFlow->list.array != NULLP)
1062 for(idx = 0; idx < elementCnt; idx++)
1064 CU_ALLOC(qosFlow->list.array[idx], sizeof(QFI_t));
1065 if(qosFlow->list.array[idx] == NULLP)
1067 for(ied = 0; ied < idx; ied++)
1069 CU_FREE(qosFlow->list.array[idx], sizeof(QFI_t));
1071 CU_FREE(qosFlow->list.array, qosFlow->list.size);
1077 *qosFlow->list.array[idx] = 9;
1081 /*******************************************************************
1083 * @brief Fills CN Assoc for Drb to Add/Mod List
1087 * Function : fillCnAssoc
1089 * Functionality: Fills CN Assoc for Drb to Add/Mod List
1091 * @params[in] struct DRB_ToAddMod__cnAssociation *
1093 * @return ROK - success
1096 * ****************************************************************/
1098 uint8_t fillCnAssoc(struct DRB_ToAddMod__cnAssociation *cnAssoc)
1102 cnAssoc->present = DRB_ToAddMod__cnAssociation_PR_sdap_Config;
1103 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_eps_BearerIdentity)
1105 cnAssoc->choice.eps_BearerIdentity = 5;
1107 if(cnAssoc->present == DRB_ToAddMod__cnAssociation_PR_sdap_Config)
1109 CU_ALLOC(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1110 if(cnAssoc->choice.sdap_Config)
1112 cnAssoc->choice.sdap_Config->pdu_Session = 5;
1113 cnAssoc->choice.sdap_Config->sdap_HeaderDL = 0;
1114 cnAssoc->choice.sdap_Config->sdap_HeaderUL = 0;
1115 cnAssoc->choice.sdap_Config->defaultDRB = true;
1116 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd = NULLP;
1117 cnAssoc->choice.sdap_Config->mappedQoS_FlowsToRelease = NULLP;
1118 CU_ALLOC(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd, \
1119 sizeof(struct SDAP_Config__mappedQoS_FlowsToAdd));
1120 if(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd)
1122 ret = fillQosFlowsToAdd(cnAssoc->choice.sdap_Config->mappedQoS_FlowsToAdd);
1126 DU_LOG("\nF1AP: Memory alloc failed at mappedQoS_FlowsToAdd in fillCnAssoc()");
1127 CU_FREE(cnAssoc->choice.sdap_Config, sizeof(SDAP_Config_t));
1133 DU_LOG("\nF1AP: Mem alloc failed at fillCnAssoc()");
1140 /*******************************************************************
1142 * @brief Fills Radio Bearer Config for Drb
1146 * Function : fillDrbCfg
1148 * Functionality: Fills Radio Bearer Config for Drb
1150 * @params[in] drbId, DRB_ToAddModList *
1152 * @return ROK - success
1155 * ****************************************************************/
1156 uint8_t fillDrbCfg(uint8_t drbId, DRB_ToAddModList_t *drbCfg)
1158 uint8_t idx, ied, ret, elementCnt;
1164 drbCfg->list.count = elementCnt;
1165 drbCfg->list.size =\
1166 elementCnt * sizeof(DRB_ToAddMod_t *);
1167 CU_ALLOC(drbCfg->list.array, drbCfg->list.size);
1168 if(drbCfg->list.array != NULLP)
1170 for(idx = 0; idx < elementCnt; idx++)
1172 CU_ALLOC(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1173 if(drbCfg->list.array[idx] == NULLP)
1175 for(ied = 0; ied < idx; ied++)
1177 CU_FREE(drbCfg->list.array[idx], sizeof(DRB_ToAddMod_t));
1179 CU_FREE(drbCfg->list.array, drbCfg->list.size);
1189 /* CN ASSOCIATION */
1190 CU_ALLOC(drbCfg->list.array[idx]->cnAssociation, sizeof(struct DRB_ToAddMod__cnAssociation));
1191 if(drbCfg->list.array[idx]->cnAssociation)
1193 ret = fillCnAssoc(drbCfg->list.array[idx]->cnAssociation);
1196 drbCfg->list.array[idx]->drb_Identity = drbId;
1201 /*******************************************************************
1203 * @brief Fills RRC Reconfig Message required for DLRRCMessageTransfer
1207 * Function : fillRrcReconfigIE
1209 * Functionality: Fills RRC Reconfig Message required for
1210 * DLRRCMessageTransfer
1212 * @params[in] RRCReconfiguration_IEs_t* rrcReconfig
1214 * @return ROK - success
1217 * ****************************************************************/
1219 uint8_t fillRrcReconfigIE(RRCReconfiguration_IEs_t *rrcReconfigMsg)
1222 CU_ALLOC(rrcReconfigMsg->radioBearerConfig, sizeof(RadioBearerConfig_t));
1223 if(rrcReconfigMsg->radioBearerConfig)
1225 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1226 if(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList != NULLP)
1228 ret = fillSrbCfg(SRB2, rrcReconfigMsg->radioBearerConfig->srb_ToAddModList);
1233 CU_ALLOC(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1234 if(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList != NULLP)
1236 ret = fillDrbCfg(DRB1, rrcReconfigMsg->radioBearerConfig->drb_ToAddModList);
1239 DU_LOG("\n F1AP: Failed to fill DrbCfg at fillRrcReconfigIE()");
1240 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1241 CU_FREE(rrcReconfigMsg->radioBearerConfig->drb_ToAddModList, sizeof(DRB_ToAddModList_t));
1247 DU_LOG("\n F1AP: memory Alloc failed at fillRrcReconfigIE()");
1248 CU_FREE(rrcReconfigMsg->radioBearerConfig->srb_ToAddModList, sizeof(SRB_ToAddModList_t));
1254 /*******************************************************************
1256 * @brief Fills DL DCCH Message required for DLRRCMessageTransfer
1260 * Function : fillDlDcchRrcMsg
1262 * Functionality: Fills DL DCCH Message required for
1263 * DLRRCMessageTransfer
1265 * @params[in] RRCContainer_t *rrcContainer
1267 * @return ROK - success
1270 * ****************************************************************/
1272 uint8_t fillDlDcchRrcMsg(RRCContainer_t *rrcContainer)
1276 DL_DCCH_Message_t dl_DCCH_Msg;
1277 memset(&dl_DCCH_Msg, 0, sizeof(DL_DCCH_Message_t));
1278 asn_enc_rval_t encRetVal;
1280 if(rrcContainer != NULLP)
1282 dl_DCCH_Msg.message.present = DL_DCCH_MessageType_PR_c1;
1284 CU_ALLOC(dl_DCCH_Msg.message.choice.c1 , sizeof(DL_DCCH_MessageType_t));
1285 if(dl_DCCH_Msg.message.choice.c1 != NULLP)
1287 dl_DCCH_Msg.message.choice.c1->present = DL_DCCH_MessageType__c1_PR_rrcReconfiguration;
1288 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration, sizeof(RRCReconfiguration_t));
1289 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration != NULLP)
1291 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->rrc_TransactionIdentifier = 0;
1292 dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->criticalExtensions.\
1293 present = RRCReconfiguration__criticalExtensions_PR_rrcReconfiguration;
1294 /* Fill RRC Reconfig IE */
1295 CU_ALLOC(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1296 criticalExtensions.choice.rrcReconfiguration, sizeof(RRCReconfiguration_IEs_t));
1297 if(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1298 criticalExtensions.choice.rrcReconfiguration != NULLP)
1300 ret = fillRrcReconfigIE(dl_DCCH_Msg.message.choice.c1->choice.rrcReconfiguration->\
1301 criticalExtensions.choice.rrcReconfiguration);
1305 /* encode DL-DCCH message into RRC Container */
1306 xer_fprint(stdout, &asn_DEF_DL_DCCH_MessageType, &dl_DCCH_Msg);
1307 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1309 encRetVal = aper_encode(&asn_DEF_DL_DCCH_MessageType, 0, &dl_DCCH_Msg, PrepFinalEncBuf, encBuf);
1310 /* Encode results */
1311 if(encRetVal.encoded == ENCODE_FAIL)
1313 DU_LOG( "\n F1AP : Could not encode RRCContainer for DL-DCCH Msg (at %s)\n",\
1314 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1319 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer for DL-DCCH Msg\n");
1320 for(int i = 0; i< encBufSize; i++)
1322 printf("%x",encBuf[i]);
1324 rrcContainer->size = encBufSize;
1325 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
1326 if(rrcContainer->buf != NULLP)
1328 memset(rrcContainer->buf, 0, encBufSize);
1329 for(idx2 = 0; idx2 < encBufSize; idx2++)
1331 rrcContainer->buf[idx2] = encBuf[idx2];
1338 DU_LOG("\nF1AP: Failed to fill RrcReconfig IE at fillDlDcchRrcMsg()");
1343 DU_LOG("\nF1AP: Memory Alloc failed for RRC Reconfig at fillDlDcchRrcMsg()");
1349 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg at fillDlDcchRrcMsg()");
1355 DU_LOG("\nF1AP: Memory Alloc failed for DL Dcch Msg choice at fillDlDcchRrcMsg()");
1361 DU_LOG("\nF1AP: RRC Container is NULLP at fillDlDcchRrcMsg()");
1367 /*******************************************************************
1369 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
1373 * Function : BuildDLRRCContainer
1375 * Functionality: Builds RRC Container IE required for
1376 * DLRRCMessageTransfer
1380 * @return ROK - success
1383 * ****************************************************************/
1385 uint8_t BuildDLRRCContainer(uint8_t rrcMsgType, RRCContainer_t *rrcContainer)
1389 if(rrcMsgType == RRC_SETUP)
1391 ret = fillDlCcchRrcMsg(rrcContainer);
1393 DU_LOG("\n F1AP: Failed to fill DL-CCCH Msg at BuildDLRRCContainer()");
1395 else if(rrcMsgType == RRC_RECONFIG)
1397 ret = fillDlDcchRrcMsg(rrcContainer);
1399 DU_LOG("\n F1AP: Failed at fill DL-DCCH Msg at BuildDLRRCContainer()");
1404 /*******************************************************************
1406 * @brief Builds and sends the DLRRCMessageTransfer
1410 * Function : BuildAndSendDLRRCMessageTransfer
1412 * Functionality: Constructs the DL RRC Message Transfer and sends
1413 * it to the CU through SCTP.
1417 * @return ROK - success
1420 * ****************************************************************/
1421 uint8_t BuildAndSendDLRRCMessageTransfer(uint8_t rrcMsgType)
1423 uint8_t elementCnt = 0;
1426 F1AP_PDU_t *f1apMsg = NULLP;
1427 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
1428 asn_enc_rval_t encRetVal; /* Encoder return value */
1430 DU_LOG("\n F1AP : Building DL RRC Message Transfer Message\n");
1432 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1433 if(f1apMsg == NULLP)
1435 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1439 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
1440 CU_ALLOC(f1apMsg->choice.initiatingMessage,
1441 sizeof(InitiatingMessage_t));
1442 if(f1apMsg->choice.initiatingMessage == NULLP)
1444 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1445 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1449 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
1450 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
1451 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
1452 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
1455 dlRRCMsg->protocolIEs.list.count = elementCnt;
1456 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
1458 /* Initialize the F1Setup members */
1459 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
1460 if(dlRRCMsg->protocolIEs.list.array == NULLP)
1462 DU_LOG(" F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
1463 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
1464 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
1468 for(idx=0; idx<elementCnt; idx++)
1470 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
1471 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
1473 for(ieId=0; ieId<idx; ieId++)
1475 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
1476 sizeof(DLRRCMessageTransferIEs_t));
1478 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
1479 dlRRCMsg->protocolIEs.list.size);
1480 CU_FREE(f1apMsg->choice.initiatingMessage,\
1481 sizeof(InitiatingMessage_t));
1482 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1487 /* GNB CU UE F1AP ID */
1489 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1490 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1491 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1492 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
1493 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1495 /* GNB DU UE F1AP ID */
1497 dlRRCMsg->protocolIEs.list.array[idx]->id = \
1498 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1499 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1500 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1501 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
1502 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1506 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
1507 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1508 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1509 DLRRCMessageTransferIEs__value_PR_SRBID;
1510 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = SRB1;
1514 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
1515 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1516 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1517 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1518 BuildDLRRCContainer(rrcMsgType, &dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1520 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1522 /* Encode the F1SetupRequest type as APER */
1523 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1525 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1527 /* Encode results */
1528 if(encRetVal.encoded == ENCODE_FAIL)
1530 DU_LOG( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1531 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1536 DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1537 for(int i=0; i< encBufSize; i++)
1539 printf("%x",encBuf[i]);
1544 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1546 DU_LOG("\n F1AP : Sending DL RRC Message Transfer Failed");
1551 }/* End of BuildAndSendDLRRCMessageTransfer */
1553 /*******************************************************************
1555 * @brief Builds and sends the UE Setup Response
1559 * Function : BuildAndSendUESetRsp
1561 * Functionality: Constructs the UE Setup Response and sends
1562 * it to the DU through SCTP.
1566 * @return ROK - success
1569 * ****************************************************************/
1570 S16 BuildAndSendUESetRsp()
1579 F1AP_PDU_t *f1apMsg = NULL;
1580 UEContextSetupResponse_t *ueSetRsp;
1581 asn_enc_rval_t encRetVal; /* Encoder return value */
1583 DU_LOG("\n F1AP : Building UE Context Setup Response\n");
1585 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1586 if(f1apMsg == NULLP)
1588 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1592 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
1593 CU_ALLOC(f1apMsg->choice.successfulOutcome,
1594 sizeof(SuccessfulOutcome_t));
1595 if(f1apMsg->choice.successfulOutcome == NULLP)
1597 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1598 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1602 f1apMsg->choice.successfulOutcome->procedureCode = \
1603 ProcedureCode_id_UEContextSetup;
1604 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
1605 f1apMsg->choice.successfulOutcome->value.present = \
1606 SuccessfulOutcome__value_PR_UEContextSetupResponse;
1608 &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
1610 ueSetRsp->protocolIEs.list.count = elementCnt;
1611 ueSetRsp->protocolIEs.list.size = \
1612 elementCnt * sizeof(UEContextSetupResponse_t *);
1614 /* Initialize the UESetup members */
1615 CU_ALLOC(ueSetRsp->protocolIEs.list.array, \
1616 ueSetRsp->protocolIEs.list.size);
1617 if(ueSetRsp->protocolIEs.list.array == NULLP)
1619 DU_LOG(" F1AP : Memory allocation for UE Setup Response failed");
1620 CU_FREE(f1apMsg->choice.successfulOutcome,
1621 sizeof(SuccessfulOutcome_t));
1622 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
1626 for(idx=0; idx<elementCnt; idx++)
1628 CU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
1629 sizeof(UEContextSetupResponseIEs_t));
1630 if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
1632 for(ieId=0; ieId<idx; ieId++)
1634 CU_FREE(ueSetRsp->protocolIEs.list.array[ieId],\
1635 sizeof(UEContextSetupResponseIEs_t));
1637 CU_FREE(ueSetRsp->protocolIEs.list.array,\
1638 ueSetRsp->protocolIEs.list.size);
1639 CU_FREE(f1apMsg->choice.successfulOutcome,\
1640 sizeof(SuccessfulOutcome_t));
1641 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1648 /*GNB CU UE F1AP ID*/
1649 ueSetRsp->protocolIEs.list.array[idx]->id = \
1650 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1651 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1652 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
1653 UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
1654 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1656 /*GNB DU UE F1AP ID*/
1658 ueSetRsp->protocolIEs.list.array[idx]->id = \
1659 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1660 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1661 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
1662 UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
1663 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1666 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1668 /* Encode the F1SetupRequest type as APER */
1669 memset(encBuf, 0, ENC_BUF_MAX_LEN);
1671 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1673 /* Encode results */
1674 if(encRetVal.encoded == ENCODE_FAIL)
1676 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
1677 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1682 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
1683 for(int i=0; i< encBufSize; i++)
1685 printf("%x",encBuf[i]);
1690 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1692 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
1697 }/* End of BuildAndSendUESetRsp */
1699 /*******************************************************************
1701 * @brief Function to set the Dl RRC Msg Type
1705 * Function : setDlRRCMsgType
1707 * Functionality: Constructs the UE Setup Response and sends
1708 * it to the DU through SCTP.
1712 * @return ROK - success
1715 * ****************************************************************/
1717 uint8_t setDlRRCMsgType()
1719 uint8_t rrcMsgType = 0;
1720 switch(f1apMsgDb.dlRrcMsgCount)
1723 rrcMsgType = RRC_SETUP;
1725 case RRC_SECURITY_MODE_COMMAND:
1726 rrcMsgType = RRC_SECURITY_MODE_COMMAND;
1729 rrcMsgType = RRC_RECONFIG;
1737 /*******************************************************************
1739 * @brief Function to build Initial UL RRC Message
1743 * Function : procInitULRRCMsg
1745 * Functionality: Function to build Initial UL RRC Message
1749 * @return ROK - success
1752 * ****************************************************************/
1754 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1756 uint8_t idx, rrcMsgType;
1758 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1759 DU_LOG("\n filling the required values in DB in procInitULRRCMsg");
1761 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1763 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1765 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1767 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1769 case ProtocolIE_ID_id_NRCGI:
1771 case ProtocolIE_ID_id_C_RNTI:
1773 case ProtocolIE_ID_id_RRCContainer:
1775 case ProtocolIE_ID_id_DUtoCURRCContainer:
1777 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1778 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1779 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1781 DU_LOG("\n Received Du to Cu RRC Container ");
1782 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1783 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1784 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1785 f1apMsgDb.duToCuContainer.size);
1786 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1788 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1789 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1790 .duToCuContainer.size);
1795 DU_LOG("\n Failed to receive Du to Cu RRC Container ");
1801 DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1807 f1apMsgDb.dlRrcMsgCount++;
1808 rrcMsgType = setDlRRCMsgType();
1809 ret = BuildAndSendDLRRCMessageTransfer(rrcMsgType);
1814 /*******************************************************************
1816 * @brief Builds Nrcgi
1820 * Function : BuildNrcgi
1822 * Functionality: Building the PLMN ID and NR Cell id
1824 * @params[in] NRCGI_t *nrcgi
1825 * @return ROK - success
1828 * ****************************************************************/
1829 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1833 uint8_t byteSize = 5;
1835 /* Allocate Buffer Memory */
1836 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1837 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1838 if(nrcgi->pLMN_Identity.buf == NULLP)
1842 ret = buildPlmnId(cuCfgParams.plmn , nrcgi->pLMN_Identity.buf);
1848 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1849 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1850 if(nrcgi->nRCellIdentity.buf == NULLP)
1854 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1861 /*******************************************************************
1863 * @brief Builds Special cell list for UE Setup Request
1867 * Function : BuildSplCellList
1869 * Functionality: Constructs the Special Cell list for UESetReq
1871 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1873 * @return ROK - success
1876 * ****************************************************************/
1877 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1883 spCellLst->list.count = cellCnt;
1884 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1885 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1886 if(spCellLst->list.array == NULLP)
1890 for(idx=0; idx<cellCnt; idx++)
1892 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1893 if(spCellLst->list.array[idx] == NULLP)
1899 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1900 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1901 spCellLst->list.array[idx]->value.present =\
1902 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1903 /* Special Cell ID -NRCGI */
1904 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1909 /*Special Cell Index*/
1910 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1912 }/* End of BuildSplCellList*/
1914 /*******************************************************************
1916 * @brief Builds SRBS to be setup
1920 * Function : BuildSRBSetup
1922 * Functionality: Constructs the SRB's for UESetReq
1924 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1926 * @return ROK - success
1929 * ****************************************************************/
1930 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1935 srbSet->list.count = srbCnt;
1936 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1937 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1938 if(srbSet->list.array == NULLP)
1942 for(idx=0; idx<srbCnt; idx++)
1944 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1945 if(srbSet->list.array[idx] == NULLP)
1951 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
1952 srbSet->list.array[idx]->criticality = Criticality_ignore;
1953 srbSet->list.array[idx]->value.present = \
1954 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
1955 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
1957 }/* End of BuildSRBSetup*/
1959 /*******************************************************************
1961 * @brief Builds QOS Info for DRB Setum Item
1965 * Function : BuildQOSInfo
1967 * Functionality: Constructs the QOS Info for DRB Setup Item
1969 * @params[in] QoSInformation_t *qosinfo
1971 * @return ROK - success
1974 * ****************************************************************/
1975 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
1977 /* NonDynamic5QIDescriptor */
1978 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
1979 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
1980 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
1985 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
1987 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
1988 sizeof(AveragingWindow_t));
1989 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
1994 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
1995 /*MaxDataBurstVolume*/
1996 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
1997 sizeof(MaxDataBurstVolume_t));
1998 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
2003 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
2005 /*nRGRAN Allocation Retention Priority*/
2006 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_highest;
2007 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
2008 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
2010 /* TO DO: GBR_QoSFlowInformation */
2012 }/*End of BuildQOSInfo*/
2014 /*******************************************************************
2016 * @brief Builds SNSSAI
2020 * Function : BuildSNSSAI
2022 * Functionality: Constructs the SNSSAI For DRB list
2024 * @params[in] SNSSAI_t *snssai
2026 * @return ROK - success
2029 * ****************************************************************/
2030 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
2034 snssai->sST.size = sizeof(uint8_t);
2035 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
2036 if(snssai->sST.buf == NULLP)
2040 snssai->sST.buf[0] = 3;
2042 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
2043 if(snssai->sD == NULLP)
2047 snssai->sD->size = 3*sizeof(uint8_t);
2048 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
2049 if(snssai->sD->buf == NULLP)
2053 snssai->sD->buf[0] = 3;
2054 snssai->sD->buf[1] = 6;
2055 snssai->sD->buf[2] = 9;
2057 }/*End of BuildSNSSAI*/
2059 /*******************************************************************
2061 * @brief Builds the flow map.
2065 * Function : BuildFlowsMap
2067 * Functionality: Constructs the flowmap For DRB list
2069 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
2071 * @return ROK - success
2074 * ****************************************************************/
2075 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
2081 flowMap->list.count = flowCnt;
2082 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
2083 CU_ALLOC(flowMap->list.array,flowMap->list.size);
2084 if(flowMap->list.array == NULLP)
2088 for(idx=0; idx<flowCnt; idx++)
2090 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
2091 if(flowMap->list.array[idx] == NULLP)
2097 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
2098 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
2104 }/*End of BuildFlowsMap*/
2106 /*******************************************************************
2108 * @brief Builds the Uplink Tunnel Info
2112 * Function : BuildULTnlInfo
2114 * Functionality: Constructs the UL TnlInfo For DRB list
2116 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2118 * @return ROK - success
2121 * ****************************************************************/
2122 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2127 ulInfo->list.count = ulCnt;
2128 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
2129 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
2130 if(ulInfo->list.array == NULLP)
2134 for(idx=0; idx<ulCnt; idx++)
2136 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2137 if(ulInfo->list.array[idx] == NULLP)
2143 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
2144 UPTransportLayerInformation_PR_gTPTunnel;
2146 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
2147 sizeof(GTPTunnel_t));
2148 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
2152 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2153 transportLayerAddress.size = 4*sizeof(uint8_t);
2154 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2155 transportLayerAddress.buf,ulInfo->list.array[idx]->\
2156 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2157 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2158 transportLayerAddress.buf == NULLP)
2162 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2163 transportLayerAddress.buf[0] = 4;
2164 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2165 transportLayerAddress.buf[1] = 4;
2166 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2167 transportLayerAddress.buf[2] = 4;
2168 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2169 transportLayerAddress.buf[3] = 5;
2170 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2171 transportLayerAddress.bits_unused = 0;
2173 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
2174 = 4 * sizeof(uint8_t);
2175 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2176 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
2177 gTPTunnel->gTP_TEID.size);
2178 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2183 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2184 gTP_TEID.buf[0] = 11;
2185 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2186 gTP_TEID.buf[1] = 0;
2187 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2188 gTP_TEID.buf[2] = 0;
2189 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
2190 gTP_TEID.buf[3] = 1;
2193 }/*End of BuildULTnlInfo*/
2195 /*******************************************************************
2197 * @brief Builds DRBS to be setup
2201 * Function : BuildDRBSetup
2203 * Functionality: Constructs the DRB's for UESetReq
2205 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2207 * @return ROK - success
2210 * ****************************************************************/
2211 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2213 uint8_t BuildQOSInforet;
2214 uint8_t BuildSNSSAIret;
2215 uint8_t BuildFlowsMapret;
2216 uint8_t BuildULTnlInforet;
2219 DRBs_ToBeSetup_Item_t *drbSetItem;
2221 drbSet->list.count = drbCnt;
2222 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
2223 CU_ALLOC(drbSet->list.array,drbSet->list.size);
2224 if(drbSet->list.array == NULLP)
2228 for(idx=0; idx<drbCnt; idx++)
2230 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2231 if(drbSet->list.array[idx] == NULLP)
2237 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
2238 drbSet->list.array[idx]->criticality = Criticality_ignore;
2239 drbSet->list.array[idx]->value.present = \
2240 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
2241 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
2243 drbSetItem->dRBID = 1;
2245 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
2246 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2247 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
2251 drbSetItem->qoSInformation.choice.choice_extension->id = \
2252 ProtocolIE_ID_id_DRB_Information;
2253 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
2255 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
2256 QoSInformation_ExtIEs__value_PR_DRB_Information;
2257 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
2258 choice_extension->value.choice.DRB_Information.dRB_QoS);
2259 if(BuildQOSInforet != ROK)
2264 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
2265 choice_extension->value.choice.DRB_Information.sNSSAI);
2266 if(BuildSNSSAIret != ROK)
2270 /*Flows mapped to DRB List*/
2271 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
2272 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
2273 if(BuildFlowsMapret != ROK)
2277 /*ULUPTNLInformation To Be Setup List*/
2278 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2279 if(BuildULTnlInforet != ROK)
2284 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
2286 /*UL Configuration*/
2287 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2288 if(drbSetItem->uLConfiguration == NULLP)
2292 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
2294 }/* End of BuildDRBSetup*/
2296 /*******************************************************************
2298 * @brief Deallocating memory of function BuildAndSendUESetReq
2302 * Function : FreeNrcgi
2304 * Functionality: Deallocating memory for function BuildNrcgi
2306 * @params[in] NRCGI_t *nrcgi
2310 *******************************************************************/
2311 void FreeNrcgi(NRCGI_t *nrcgi)
2313 if(nrcgi->pLMN_Identity.buf != NULLP)
2315 if(nrcgi->nRCellIdentity.buf != NULLP)
2317 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
2319 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
2322 /*******************************************************************
2324 * @brief Deallocating memory of function BuildAndSendUESetReq
2328 * Function : FreeSplCellList
2330 * Functionality: Deallocating memory for function BuildSplCellList
2332 * @params[in] SCell_ToBeSetup_List_t *spCellLst
2337 * *****************************************************************/
2338 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
2341 if(spCellLst->list.array != NULLP)
2343 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
2345 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
2347 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
2349 if(spCellLst->list.array[cellidx]!=NULLP)
2351 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
2354 CU_FREE(spCellLst->list.array,spCellLst->list.size);
2357 /*******************************************************************
2359 * @brief Deallocating memory of function BuildAndSendUESetReq
2363 * Function : FreeSRBSetup
2365 * Functionality: Deallocating memory for function BuildSRBSetup
2367 * @params[in] SRBs_ToBeSetup_List_t *srbSet
2372 * ******************************************************************/
2373 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
2376 if(srbSet->list.array != NULLP)
2378 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
2380 if(srbSet->list.array[srbidx]!=NULLP)
2382 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
2385 CU_FREE(srbSet->list.array,srbSet->list.size);
2388 /*******************************************************************
2390 * @brief Deallocating memory of function BuildAndSendUESetReq
2394 * Function : FreeQOSInfo
2396 * Functionality: Deallocating memory for function BuildQOSInfo
2398 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
2402 * ****************************************************************/
2403 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
2405 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
2407 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2409 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2411 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2412 sizeof(MaxDataBurstVolume_t));
2414 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
2415 sizeof(AveragingWindow_t));
2417 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
2418 sizeof(NonDynamic5QIDescriptor_t));
2421 /*******************************************************************
2423 * @brief Deallocating memory of function BuildAndSendUESetReq
2427 * Function : FreeULTnlInfo
2429 * Functionality: Deallocating memory for function BuildULTnlInfo
2431 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
2436 * ****************************************************************/
2437 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
2440 if(ulInfo->list.array != NULLP)
2442 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
2444 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
2446 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
2448 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2449 transportLayerAddress.buf != NULLP)
2451 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
2454 CU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2455 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
2456 gTPTunnel->gTP_TEID.size);
2458 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
2459 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
2460 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
2462 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
2463 sizeof(GTPTunnel_t));
2466 if(ulInfo->list.array[ulidx]!=NULLP)
2468 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
2471 CU_FREE(ulInfo->list.array,ulInfo->list.size);
2474 /*******************************************************************
2476 * @brief Deallocating memory for BuildAndSendUESetReq
2480 * Function : FreeDRBSetup
2482 * Functionality: Deallocating memory for BuildDRBSetup
2484 * @params[in] DRBs_ToBeSetup_List_t *drbSet
2488 * ****************************************************************/
2489 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
2491 DRBs_ToBeSetup_Item_t *drbSetItem;
2494 if(drbSet->list.array == NULLP)
2496 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
2498 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
2500 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
2501 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
2503 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2504 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
2506 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2507 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2509 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2510 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2512 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
2514 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
2516 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
2518 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2519 flows_Mapped_To_DRB_List.list.array != NULLP)
2521 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2522 flows_Mapped_To_DRB_List.list.count; flowidx++)
2524 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2525 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2527 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2528 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2529 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
2531 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2532 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2533 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
2535 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2536 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2537 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
2539 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
2540 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
2542 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2543 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2544 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
2545 sizeof(MaxDataBurstVolume_t));
2547 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2548 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2549 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2551 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2552 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
2553 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
2556 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2557 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
2559 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
2560 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
2563 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
2564 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
2565 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
2567 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
2568 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
2570 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
2571 sizeof(OCTET_STRING_t));
2573 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
2574 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2576 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2577 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2579 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2580 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2582 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2583 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2585 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2588 if(drbSet->list.array[drbidx]!=NULLP)
2590 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2593 CU_FREE(drbSet->list.array,drbSet->list.size);
2598 /*******************************************************************
2600 * @brief Free the UE Setup Request
2604 * Function : FreeUESetReq
2606 * Functionality: Deallocate the memory of BuildUESetReq
2608 * @params[in] F1AP_PDU_t *f1apMsg
2613 * ****************************************************************/
2614 void FreeUESetReq(F1AP_PDU_t *f1apMsg)
2618 UEContextSetupRequest_t *ueSetReq;
2620 if(f1apMsg != NULLP)
2622 if(f1apMsg->choice.initiatingMessage != NULLP)
2624 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2625 if(ueSetReq->protocolIEs.list.array != NULLP)
2627 if(ueSetReq->protocolIEs.list.array[idx])
2629 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2631 if(ueSetReq->protocolIEs.list.array[idx])
2633 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2635 if(ueSetReq->protocolIEs.list.array[idx])
2637 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2639 if(ueSetReq->protocolIEs.list.array[idx])
2641 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2646 for(ieId=0; ieId<ueSetReq->protocolIEs.list.count; ieId++)
2648 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2650 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2653 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2655 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2657 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2661 /*******************************************************************
2663 * @brief Builds and sends the UE Setup Request
2667 * Function : BuildAndSendUESetReq
2669 * Functionality: Constructs the UE Setup Request and sends
2670 * it to the CU through SCTP.
2674 * @return ROK - success
2677 * ****************************************************************/
2678 uint8_t BuildAndSendUESetReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
2679 uint16_t rrcContLen, uint8_t *rrcContainer)
2682 uint8_t SplCellListret;
2683 uint8_t SrbSetupret;
2687 F1AP_PDU_t *f1apMsg = NULLP;
2688 UEContextSetupRequest_t *ueSetReq = NULLP;
2689 asn_enc_rval_t encRetVal; /* Encoder return value */
2690 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2691 uint8_t ret= RFAILED;
2695 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
2697 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2698 if(f1apMsg == NULLP)
2700 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2704 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2705 CU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2706 if(f1apMsg->choice.initiatingMessage == NULLP)
2708 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2712 f1apMsg->choice.initiatingMessage->procedureCode = \
2713 ProcedureCode_id_UEContextSetup;
2714 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
2715 f1apMsg->choice.initiatingMessage->value.present = \
2716 InitiatingMessage__value_PR_UEContextSetupRequest;
2718 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2721 ueSetReq->protocolIEs.list.count = elementCnt;
2722 ueSetReq->protocolIEs.list.size = \
2723 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
2725 /* Initialize the UESetup members */
2726 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2728 if(ueSetReq->protocolIEs.list.array == NULLP)
2730 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
2734 for(idx1=0; idx1<elementCnt; idx1++)
2736 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
2737 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
2745 /*GNB CU UE F1AP ID*/
2746 ueSetReq->protocolIEs.list.array[idx]->id = \
2747 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2748 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2749 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2750 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
2751 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
2753 /*GNB DU UE F1AP ID*/
2755 ueSetReq->protocolIEs.list.array[idx]->id = \
2756 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2757 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2758 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2759 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
2760 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
2764 ueSetReq->protocolIEs.list.array[idx]->id = \
2765 ProtocolIE_ID_id_SpCell_ID;
2766 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2767 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2768 UEContextSetupRequestIEs__value_PR_NRCGI;
2769 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2775 /*Served Cell Index*/
2777 ueSetReq->protocolIEs.list.array[idx]->id = \
2778 ProtocolIE_ID_id_ServCellIndex;
2779 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2780 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2781 UEContextSetupRequestIEs__value_PR_ServCellIndex;
2782 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
2785 /*CellULConfigured*/
2787 ueSetReq->protocolIEs.list.array[idx]->id = \
2788 ProtocolIE_ID_id_SpCellULConfigured;
2789 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2790 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2791 UEContextSetupRequestIEs__value_PR_CellULConfigured;
2792 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
2793 CellULConfigured_none;
2796 /*CUtoDURRCContainer*/
2798 ueSetReq->protocolIEs.list.array[idx]->id = \
2799 ProtocolIE_ID_id_CUtoDURRCInformation;
2800 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2801 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2802 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
2804 /*Special Cells to be SetupList*/
2806 ueSetReq->protocolIEs.list.array[idx]->id = \
2807 ProtocolIE_ID_id_SCell_ToBeSetup_List;
2808 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2809 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2810 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
2811 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2812 if(SplCellListret != ROK)
2816 /*SRBs To Be Setup List*/
2818 ueSetReq->protocolIEs.list.array[idx]->id = \
2819 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
2820 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2821 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2822 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
2823 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2824 if(SrbSetupret != ROK)
2828 /*DRBs to Be Setup List*/
2830 ueSetReq->protocolIEs.list.array[idx]->id = \
2831 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
2832 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2833 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2834 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
2835 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2843 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
2844 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2845 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2846 UEContextSetupRequestIEs__value_PR_RRCContainer;
2847 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = rrcContLen;
2848 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
2849 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2850 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
2852 DU_LOG(" F1AP : Memory allocation for BuildAndSendUESetReq failed");
2855 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2856 rrcContainer, ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2858 /* RRC delivery status request */
2860 ueSetReq->protocolIEs.list.array[idx]->id = \
2861 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
2862 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2863 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2864 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
2865 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
2866 RRCDeliveryStatusRequest_true;
2868 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2870 /* Encode the F1SetupRequest type as APER */
2871 memset(encBuf, 0, ENC_BUF_MAX_LEN);
2873 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2875 /* Encode results */
2876 if(encRetVal.encoded == ENCODE_FAIL)
2878 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
2879 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2884 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
2885 for(int i=0; i< encBufSize; i++)
2887 printf("%x",encBuf[i]);
2892 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
2894 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
2900 FreeUESetReq(f1apMsg);
2903 }/* End of BuildAndSendUESetReq*/
2905 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
2907 uint8_t idx, ret, srbId, rrcMsgType;
2908 uint8_t cuUeF1apId, duUeF1apId;
2909 uint8_t *rrcContainer = NULLP;
2910 uint16_t rrcContLen;
2911 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
2914 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2916 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
2918 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
2920 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2922 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
2925 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2927 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2930 case ProtocolIE_ID_id_SRBID:
2931 srbId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
2933 case ProtocolIE_ID_id_RRCContainer:
2935 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
2936 CU_ALLOC(rrcContainer, rrcContLen)
2939 DU_LOG("\nCU_STUB: Failed to allocated memory in procUlRrcMsg");
2942 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
2948 DU_LOG("\n Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
2954 f1apMsgDb.dlRrcMsgCount++;
2955 rrcMsgType = setDlRRCMsgType();
2956 if(rrcMsgType == RRC_SECURITY_MODE_COMMAND)
2958 ret = BuildAndSendUESetReq(cuUeF1apId, duUeF1apId, rrcContLen, rrcContainer);
2960 if(rrcMsgType == RRC_RECONFIG)
2962 ret = BuildAndSendDLRRCMessageTransfer(rrcMsgType);
2968 /****************************************************************
2969 * @brief Build And Send F1ResetAck
2973 * Function : FreeF1ResetAck
2976 * - Build And Send F1ResetRSP
2979 * @return ROK - success
2982 * ****************************************************************/
2983 void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
2986 ResetAcknowledge_t *f1ResetAck;
2990 if(f1apMsg->choice.successfulOutcome)
2992 f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
2994 if(f1ResetAck->protocolIEs.list.array)
2996 for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
2998 if(f1ResetAck->protocolIEs.list.array[idx])
3000 CU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
3003 CU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
3005 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
3007 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
3011 /****************************************************************
3012 * @brief Build And Send F1ResetAck
3016 * Function : BuildAndSendF1ResetAck
3019 * - Build And Send F1ResetRSP
3022 * @return ROK - success
3025 * ****************************************************************/
3027 uint8_t BuildAndSendF1ResetAck()
3030 uint8_t elementCnt = 0;
3031 uint8_t ret = RFAILED;
3032 F1AP_PDU_t *f1apMsg = NULL;
3033 ResetAcknowledge_t *f1ResetAck = NULLP;
3034 asn_enc_rval_t encRetVal;
3035 DU_LOG("\nF1AP : Building F1 Reset Acknowledgment \n");
3038 /* Allocate the memory for F1ResetRequest_t */
3039 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
3040 if(f1apMsg == NULLP)
3042 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
3046 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
3048 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
3049 if(f1apMsg->choice.successfulOutcome == NULLP)
3051 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
3055 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_Reset;
3056 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
3057 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
3058 f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
3062 f1ResetAck->protocolIEs.list.count = elementCnt;
3063 f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
3065 CU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
3066 if(f1ResetAck->protocolIEs.list.array == NULLP)
3068 DU_LOG("\nF1AP : Memory allocation for F1ResetAckIEs failed");
3072 for(idx=0; idx<elementCnt; idx++)
3074 CU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
3075 if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
3082 f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
3083 f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
3084 f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
3085 f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
3087 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3089 /* Encode the F1SetupRequest type as UPER */
3090 memset(encBuf, 0, ENC_BUF_MAX_LEN);
3092 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
3094 /* Check encode results */
3095 if(encRetVal.encoded == ENCODE_FAIL)
3097 DU_LOG("\nF1AP : Could not encode F1ResetAck structure (at %s)\n",\
3098 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
3103 DU_LOG("\nF1AP : Created APER encoded buffer for F1ResetAck \n");
3104 for(int i=0; i< encBufSize; i++)
3106 printf("%x",encBuf[i]);
3110 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
3112 DU_LOG("\nF1AP : Sending F1 Reset Response failed");
3120 FreeF1ResetAck(f1apMsg);
3124 /*******************************************************************
3126 * @brief Handles received F1AP message and sends back response
3130 * Function : F1APMsgHdlr
3133 * - Decodes received F1AP control message
3134 * - Prepares response message, encodes and sends to SCTP
3137 * @return ROK - success
3140 * ****************************************************************/
3141 void F1APMsgHdlr(Buffer *mBuf)
3147 F1AP_PDU_t *f1apMsg = NULLP;
3148 asn_dec_rval_t rval; /* Decoder return value */
3149 F1AP_PDU_t f1apasnmsg ;
3151 DU_LOG("\nF1AP : Received F1AP message buffer");
3152 ODU_PRINT_MSG(mBuf, 0,0);
3154 /* Copy mBuf into char array to decode it */
3155 ODU_GET_MSG_LEN(mBuf, &recvBufLen);
3156 CU_ALLOC(recvBuf, (Size)recvBufLen);
3158 if(recvBuf == NULLP)
3160 DU_LOG("\nF1AP : Memory allocation failed");
3163 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
3165 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
3169 printf("\nF1AP : Received flat buffer to be decoded : ");
3170 for(i=0; i< recvBufLen; i++)
3172 printf("%x",recvBuf[i]);
3175 /* Decoding flat buffer into F1AP messsage */
3176 f1apMsg = &f1apasnmsg;
3177 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
3179 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
3180 CU_FREE(recvBuf, (Size)recvBufLen);
3182 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
3184 DU_LOG("\nF1AP : ASN decode failed");
3188 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
3190 switch(f1apMsg->present)
3192 case F1AP_PDU_PR_initiatingMessage:
3194 switch(f1apMsg->choice.initiatingMessage->value.present)
3196 case InitiatingMessage__value_PR_Reset:
3198 DU_LOG("\nF1AP : F1 reset request received ");
3199 BuildAndSendF1ResetAck();
3203 case InitiatingMessage__value_PR_F1SetupRequest:
3205 DU_LOG("\nF1AP : F1 setup request received");
3206 BuildAndSendF1SetupRsp();
3210 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
3212 DU_LOG("\nF1AP : GNB-DU config update received");
3213 BuildAndSendDUUpdateAck();
3214 DU_LOG("\nF1AP : Sending F1 reset request");
3215 BuildAndSendF1ResetReq();
3218 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
3220 DU_LOG("\nF1AP : Received InitialULRRCMessageTransfer");
3221 procInitULRRCMsg(f1apMsg);
3224 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
3226 DU_LOG("\nF1AP : Received ULRRCMessageTransfer");
3227 procUlRrcMsg(f1apMsg);
3231 case InitiatingMessage__value_PR_RRCDeliveryReport:
3233 DU_LOG("\nF1AP : Received RRC delivery report");
3238 DU_LOG("\nF1AP : Invalid type of intiating message [%d]",f1apMsg->choice.initiatingMessage->value.present);
3241 }/* End of switch(initiatingMessage) */
3245 case F1AP_PDU_PR_successfulOutcome:
3247 switch(f1apMsg->choice.successfulOutcome->value.present)
3249 case SuccessfulOutcome__value_PR_ResetAcknowledge:
3251 DU_LOG("\nF1Reset Acknowledgement is received successfully ");
3254 }/* End of switch(successfulOutcome) */
3259 DU_LOG("\nF1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
3262 }/* End of switch(f1apMsg->present) */
3264 } /* End of F1APMsgHdlr */
3266 /**********************************************************************
3268 **********************************************************************/