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(idy=0; idy<elementCnt; idy++)
211 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy],\
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(idy=0; idy<elementCnt; idy++)
243 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy],\
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(idy=0; idy<cellCnt; idy++)
254 CU_ALLOC(cellToActivate->list.array[idy],\
255 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
256 if(cellToActivate->list.array[idy] == NULLP)
258 CU_FREE(cellToActivate->list.array,\
259 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
260 CU_FREE(cuName->buf, sizeof(cuName->size));
261 for(idy=0; idy<elementCnt; idy++)
263 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy], \
264 sizeof(F1SetupResponseIEs_t));
266 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
267 elementCnt * sizeof(F1SetupResponseIEs_t *));
268 CU_FREE(f1apMsg->choice.successfulOutcome, \
269 sizeof(SuccessfulOutcome_t));
270 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
274 cellToActivate->list.array[0]->id = \
275 ProtocolIE_ID_id_Cells_to_be_Activated_List_Item;
276 cellToActivate->list.array[0]->criticality = Criticality_ignore;
277 cellToActivate->list.array[0]->value.present = \
278 Cells_to_be_Activated_List_ItemIEs__value_PR_Cells_to_be_Activated_List_Item;
279 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
280 nRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
281 CU_ALLOC(cellToActivate->list.array[0]->\
282 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
284 if(cellToActivate->list.array[0]->value.choice.\
285 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf == NULLP)
288 for(idy=0; idy<cellCnt; idy++)
290 CU_FREE(cellToActivate->list.array[idy],\
291 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
294 CU_FREE(cellToActivate->list.array,\
295 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
296 CU_FREE(cuName->buf, sizeof(cuName->size));
297 for(idy=0; idy<elementCnt; idy++)
299 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy], \
300 sizeof(F1SetupResponseIEs_t));
302 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
303 elementCnt * sizeof(F1SetupResponseIEs_t *));
304 CU_FREE(f1apMsg->choice.successfulOutcome, \
305 sizeof(SuccessfulOutcome_t));
306 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
309 buildPlmnId(cuCfgParams.plmn , &cellToActivate->list.array[0]->value.choice.\
310 Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity);
311 cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
312 nRCGI.nRCellIdentity.size = 5;
313 CU_ALLOC(cellToActivate->list.array[0]->value.choice.\
314 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf,\
316 if(cellToActivate->list.array[0]->value.choice.\
317 Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf == NULLP)
319 CU_FREE(cellToActivate->list.array[0]->\
320 value.choice.Cells_to_be_Activated_List_Item.nRCGI.pLMN_Identity.buf,\
322 for(idy=0; idy<cellCnt; idy++)
324 CU_FREE(cellToActivate->list.array[idy],\
325 sizeof(struct Cells_to_be_Activated_List_ItemIEs ));
328 CU_FREE(cellToActivate->list.array,\
329 sizeof(struct Cells_to_be_Activated_List_ItemIEs *));
330 CU_FREE(cuName->buf, sizeof(cuName->size));
331 for(idy=0; idy<elementCnt; idy++)
333 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy], \
334 sizeof(F1SetupResponseIEs_t));
336 CU_FREE(f1SetupRsp->protocolIEs.list.array, \
337 elementCnt * sizeof(F1SetupResponseIEs_t *));
338 CU_FREE(f1apMsg->choice.successfulOutcome, \
339 sizeof(SuccessfulOutcome_t));
340 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
343 BuildNrCellId(&(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity));
346 f1SetupRsp->protocolIEs.list.array[idx]->id = \
347 ProtocolIE_ID_id_GNB_CU_RRC_Version;
348 f1SetupRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
349 f1SetupRsp->protocolIEs.list.array[idx]->value.present = \
350 F1SetupResponseIEs__value_PR_RRC_Version;
351 rrcVer = &f1SetupRsp->protocolIEs.list.array[idx]->value.choice.RRC_Version;
352 rrcVer->latest_RRC_Version.size = RRC_SIZE;
354 CU_ALLOC(rrcVer->latest_RRC_Version.buf, sizeof(U8));
355 if(rrcVer->latest_RRC_Version.buf == NULLP)
357 CU_FREE(cuName->buf, sizeof(cuName->size));
358 for(idy=0; idy<elementCnt; idx++)
360 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy], \
361 sizeof(F1SetupResponseIEs_t));
363 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
364 elementCnt * sizeof(F1SetupResponseIEs_t *));
365 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
366 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
370 /* Need to check RRC Version */
371 rrcVer->latest_RRC_Version.buf[0] = cuCfgParams.rrcVersion.rrcVer;
372 rrcVer->latest_RRC_Version.bits_unused = 5; //TODO: pick from cuCfgParam. If not present, add it
373 CU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
374 if(rrcVer->iE_Extensions == NULLP)
376 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
377 CU_FREE(cuName->buf, sizeof(cuName->size));
378 for(idy=0; idy<elementCnt; idy++)
380 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy], \
381 sizeof(F1SetupResponseIEs_t));
383 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
384 elementCnt * sizeof(F1SetupResponseIEs_t *));
385 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
386 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
389 rrcVer->iE_Extensions->list.count = 1;
390 rrcVer->iE_Extensions->list.size = sizeof(struct RRC_Version_ExtIEs *);
391 CU_ALLOC(rrcVer->iE_Extensions->list.array,\
392 sizeof(struct RRC_Version_ExtIEs *));
393 if(rrcVer->iE_Extensions->list.array == NULLP)
395 CU_FREE(rrcVer->iE_Extensions,\
396 sizeof(ProtocolExtensionContainer_4624P81_t));
397 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
398 CU_FREE(cuName->buf, sizeof(cuName->size));
399 for(idy=0; idy<elementCnt; idy++)
401 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy], \
402 sizeof(F1SetupResponseIEs_t));
404 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
405 elementCnt * sizeof(F1SetupResponseIEs_t *));
406 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
407 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
410 CU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
411 sizeof(struct RRC_Version_ExtIEs));
412 if(rrcVer->iE_Extensions->list.array[0] == NULLP)
414 CU_FREE(rrcVer->iE_Extensions->list.array,\
415 sizeof(struct RRC_Version_ExtIEs *));
416 CU_FREE(rrcVer->iE_Extensions,\
417 sizeof(ProtocolExtensionContainer_4624P81_t));
418 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
419 CU_FREE(cuName->buf, sizeof(cuName->size));
420 for(idy=0; idy<elementCnt; idy++)
422 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy], \
423 sizeof(F1SetupResponseIEs_t));
425 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
426 elementCnt * sizeof(F1SetupResponseIEs_t *));
427 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
428 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
431 rrcVer->iE_Extensions->list.array[0]->id = \
432 ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
433 rrcVer->iE_Extensions->list.array[0]->criticality = Criticality_reject;
434 rrcVer->iE_Extensions->list.array[0]->extensionValue.present = \
435 RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
436 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
437 Latest_RRC_Version_Enhanced.size = 3*sizeof(U8);
438 CU_ALLOC(rrcVer->iE_Extensions->list.\
439 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf,\
441 if(rrcVer->iE_Extensions->list.\
442 array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf == NULLP)
444 CU_FREE(rrcVer->iE_Extensions->list.array[0],\
445 sizeof(struct RRC_Version_ExtIEs));
446 CU_FREE(rrcVer->iE_Extensions->list.array,\
447 sizeof(struct RRC_Version_ExtIEs *));
448 CU_FREE(rrcVer->iE_Extensions,\
449 sizeof(ProtocolExtensionContainer_4624P81_t));
450 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
451 CU_FREE(cuName->buf, sizeof(cuName->size));
452 for(idy=0; idy<elementCnt; idy++)
454 CU_FREE(f1SetupRsp->protocolIEs.list.array[idy], \
455 sizeof(F1SetupResponseIEs_t));
457 CU_FREE(f1SetupRsp->protocolIEs.list.array,\
458 elementCnt * sizeof(F1SetupResponseIEs_t *));
459 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
460 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
463 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
464 Latest_RRC_Version_Enhanced.buf[0] = 0;
465 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
466 Latest_RRC_Version_Enhanced.buf[1] = 5;
467 rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.\
468 Latest_RRC_Version_Enhanced.buf[2] = 15;
470 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
472 /* Encode the F1SetupRequest type as UPER */
473 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
475 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
478 CU_FREE(rrcVer->latest_RRC_Version.buf, sizeof(U8));
479 CU_FREE(cuName->buf, sizeof(cuName->size));
480 for(idx=0; idx<elementCnt; idx++)
482 CU_FREE(f1SetupRsp->protocolIEs.list.array[idx], sizeof(F1SetupResponseIEs_t));
484 CU_FREE(f1SetupRsp->protocolIEs.list.array, elementCnt * sizeof(F1SetupResponseIEs_t *));
485 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
486 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
488 /* Check encode results */
489 if(encRetVal.encoded == ENCODE_FAIL)
491 DU_LOG("\nF1AP : Could not encode F1SetupResponse structure (at %s)\n",\
492 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
497 DU_LOG("\nF1AP : Created APER encoded buffer for F1SetupResponse\n");
498 for(int i=0; i< encBufSize; i++)
500 printf("%x",encBuf[i]);
505 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
507 DU_LOG("\nF1AP : Sending F1 Setup Response failed");
512 }/* End of BuildAndSendF1SetupRsp */
514 /*******************************************************************
516 * @brief Builds and sends the DUUpdateAcknowledge
520 * Function : BuildAndSendDUUpdateAck
522 * Functionality: Constructs the DU Update Acknowledge message and sends
523 * it to the DU through SCTP.
525 * @params[in] void **buf,Buffer to which encoded pattern is written into
526 * @params[in] int *size,size of buffer
528 * @return ROK - success
531 * ****************************************************************/
533 S16 BuildAndSendDUUpdateAck()
537 F1AP_PDU_t *f1apMsg = NULL;
538 GNBDUConfigurationUpdateAcknowledge_t *gNBDuCfgAck;
539 asn_enc_rval_t enRetVal; /* Encoder return value */
541 DU_LOG("\nF1AP : Building GNB-DU Config Update Ack\n");
543 /* Allocate the memory for F1SetupRequest_t */
544 CU_ALLOC(f1apMsg, (Size)sizeof(F1AP_PDU_t));
547 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
551 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
553 CU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
554 if(f1apMsg->choice.successfulOutcome == NULLP)
556 DU_LOG("\nF1AP : Memory allocation for F1AP-PDU failed");
557 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
561 f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_gNBDUConfigurationUpdate;
562 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
563 f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge;
564 gNBDuCfgAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
567 gNBDuCfgAck->protocolIEs.list.count = elementCnt;
568 gNBDuCfgAck->protocolIEs.list.size = elementCnt*sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t);
570 /* Initialize the F1Setup members */
571 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
572 if(gNBDuCfgAck->protocolIEs.list.array == NULLP)
574 DU_LOG("\nF1AP : Memory allocation for DuUpdateAcknowledgeIEs failed");
575 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
576 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
580 for(idx=0; idx<elementCnt; idx++)
582 CU_ALLOC(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
583 if(gNBDuCfgAck->protocolIEs.list.array[idx] == NULLP)
585 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
586 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
587 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
594 gNBDuCfgAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID ;
595 gNBDuCfgAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
596 gNBDuCfgAck->protocolIEs.list.array[idx]->value.present = GNBDUConfigurationUpdateAcknowledgeIEs__value_PR_TransactionID;
597 gNBDuCfgAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
599 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
601 /* Encode the F1SetupRequest type as UPER */
602 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
604 enRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
607 for(idx=0; idx<elementCnt; idx++)
609 CU_FREE(gNBDuCfgAck->protocolIEs.list.array[idx], sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t));
611 CU_FREE(gNBDuCfgAck->protocolIEs.list.array, elementCnt * sizeof(GNBDUConfigurationUpdateAcknowledgeIEs_t *));
612 CU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
613 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
615 /* Checking encode results */
616 if(enRetVal.encoded == ENCODE_FAIL)
618 DU_LOG("\nF1AP : Could not encode DUConfigUpdateAcknowledge structure (at %s)",enRetVal.failed_type ? enRetVal.failed_type->name : "unknown");
623 DU_LOG("\nF1AP : Created APER encoded buffer for DuConfigUpdateAcknowledge\n");
624 for(int i=0; i< encBufSize; i++)
626 printf("%x",encBuf[i]);
631 if(SendF1APMsg(CU_APP_MEM_REG, CU_POOL) != ROK)
633 DU_LOG("\nF1AP : Sending GNB-DU Config Update Ack failed");
639 }/* End of BuildAndSendDUUpdateAck*/
641 /*******************************************************************
643 * @brief Fills Radio Bearer Config
647 * Function : fillRadioBearerConfig
649 * Functionality: Fills Radio Bearer Config
651 * @params[in] SRB_ToAddModList *
653 * @return ROK - success
656 * ****************************************************************/
657 uint8_t fillRadioBearerConfig(SRB_ToAddModList_t *bearerCfg)
662 if(bearerCfg != NULLP)
665 bearerCfg->list.count = elementCnt;
666 bearerCfg->list.size =\
667 elementCnt * sizeof(SRB_ToAddMod_t *);
668 CU_ALLOC(bearerCfg->list.array, bearerCfg->list.size);
669 if(bearerCfg->list.array != NULLP)
671 for(idx = 0; idx < elementCnt; idx++)
673 CU_ALLOC(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
674 if(bearerCfg->list.array[idx] == NULLP)
676 for(ied = 0; ied < idx; ied++)
678 CU_FREE(bearerCfg->list.array[idx], sizeof(SRB_ToAddMod_t));
680 CU_FREE(bearerCfg->list.array, bearerCfg->list.size);
690 bearerCfg->list.array[idx]->srb_Identity = SRB1;
695 /*******************************************************************
697 * @brief Fills Master CellGroup Info
701 * Function : fillMasterCellGroup
703 * Functionality: Fills Master Cell Group IE
705 * @params[in] RRCSetup_IEs_t *
707 * @return ROK - success
710 * ****************************************************************/
712 uint8_t fillMasterCellGroup(OCTET_STRING_t *masterCellGroup)
715 masterCellGroup->buf = NULLP;
716 if(f1apMsgDb.duToCuContainer.buf)
718 masterCellGroup->size = f1apMsgDb.duToCuContainer.size;
719 CU_ALLOC(masterCellGroup->buf, masterCellGroup->size);
720 if(masterCellGroup->buf != NULLP)
722 memcpy(masterCellGroup->buf, f1apMsgDb.duToCuContainer.buf,\
723 masterCellGroup->size);
737 /*******************************************************************
739 * @brief Fills RRC setup IE
743 * Function : fillRRCSetupIE
745 * Functionality: Fills RRC Setup IE
747 * @params[in] RRCSetup_IEs_t *
749 * @return ROK - success
752 * ****************************************************************/
754 uint8_t fillRRCSetupIE(RRCSetup_IEs_t *rrcSetupIE)
759 CU_ALLOC(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
760 if(rrcSetupIE->radioBearerConfig.srb_ToAddModList != NULLP)
762 ret = fillRadioBearerConfig(rrcSetupIE->radioBearerConfig.srb_ToAddModList);
766 ret = fillMasterCellGroup(&rrcSetupIE->masterCellGroup);
770 CU_FREE(rrcSetupIE->radioBearerConfig.srb_ToAddModList, sizeof(SRB_ToAddModList_t));
776 /*******************************************************************
778 * @brief Builds RRC Container IE required for DLRRCMessageTransfer
782 * Function : BuildDLRRCContainer
784 * Functionality: Builds RRC Container IE required for
785 * DLRRCMessageTransfer
789 * @return ROK - success
792 * ****************************************************************/
794 uint8_t BuildDLRRCContainer(RRCContainer_t *rrcContainer)
798 DL_CCCH_Message_t dl_CCCH_Msg;
799 asn_enc_rval_t encRetVal;
801 if(rrcContainer != NULLP)
803 dl_CCCH_Msg.message.present = DL_CCCH_MessageType_PR_c1;
805 CU_ALLOC(dl_CCCH_Msg.message.choice.c1 , sizeof(DL_CCCH_MessageType_t));
806 if(dl_CCCH_Msg.message.choice.c1 != NULLP)
808 dl_CCCH_Msg.message.choice.c1->present = DL_CCCH_MessageType__c1_PR_rrcSetup;
809 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup, sizeof(RRCSetup_t));
810 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup != NULLP)
812 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->rrc_TransactionIdentifier = 0;
813 dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->criticalExtensions.\
814 present = RRCSetup__criticalExtensions_PR_rrcSetup;
815 /* Fill RRC Setup IE */
816 CU_ALLOC(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
817 criticalExtensions.choice.rrcSetup, sizeof(RRCSetup_IEs_t));
818 if(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
819 criticalExtensions.choice.rrcSetup != NULLP)
821 ret = fillRRCSetupIE(dl_CCCH_Msg.message.choice.c1->choice.rrcSetup->\
822 criticalExtensions.choice.rrcSetup);
826 /* encode DL-CCCH message into RRC Container */
827 xer_fprint(stdout, &asn_DEF_DL_CCCH_MessageType, &dl_CCCH_Msg);
828 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
830 encRetVal = aper_encode(&asn_DEF_DL_CCCH_MessageType, 0, &dl_CCCH_Msg, PrepFinalEncBuf, encBuf);
832 if(encRetVal.encoded == ENCODE_FAIL)
834 DU_LOG( "\n F1AP : Could not encode RRCContainer (at %s)\n",\
835 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
840 DU_LOG("\n F1AP : Created APER encoded buffer for RRCContainer\n");
841 for(int i = 0; i< encBufSize; i++)
843 printf("%x",encBuf[i]);
845 rrcContainer->size = encBufSize;
846 CU_ALLOC(rrcContainer->buf, rrcContainer->size);
847 if(rrcContainer->buf != NULLP)
849 memset(rrcContainer->buf, 0, encBufSize);
850 for(idx2 = 0; idx2 < encBufSize; idx2++)
852 rrcContainer->buf[idx2] = encBuf[idx2];
864 DU_LOG("\nF1AP: Memory Alloc failed for RRC Setup Msg");
870 DU_LOG("\nF1AP: Memory Alloc failed for RRC Msg");
876 DU_LOG("\nF1AP: Memory Alloc failed for DL Ccch Msg choice");
882 DU_LOG("\nF1AP: Memory Alloc failed for DlCcch Msg");
888 /*******************************************************************
890 * @brief Builds and sends the DLRRCMessageTransfer
894 * Function : BuildAndSendDLRRCMessageTransfer
896 * Functionality: Constructs the DL RRC Message Transfer and sends
897 * it to the CU through SCTP.
901 * @return ROK - success
904 * ****************************************************************/
905 S16 BuildAndSendDLRRCMessageTransfer()
907 uint8_t elementCnt = 0;
910 F1AP_PDU_t *f1apMsg = NULLP;
911 DLRRCMessageTransfer_t *dlRRCMsg = NULLP;
912 asn_enc_rval_t encRetVal; /* Encoder return value */
914 DU_LOG("\n F1AP : Building DL RRC Message Transfer Message\n");
916 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
919 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
923 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
924 CU_ALLOC(f1apMsg->choice.initiatingMessage,
925 sizeof(InitiatingMessage_t));
926 if(f1apMsg->choice.initiatingMessage == NULLP)
928 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
929 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
933 f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_DLRRCMessageTransfer;
934 f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
935 f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_DLRRCMessageTransfer;
936 dlRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
939 dlRRCMsg->protocolIEs.list.count = elementCnt;
940 dlRRCMsg->protocolIEs.list.size = elementCnt * sizeof(DLRRCMessageTransferIEs_t *);
942 /* Initialize the F1Setup members */
943 CU_ALLOC(dlRRCMsg->protocolIEs.list.array, dlRRCMsg->protocolIEs.list.size);
944 if(dlRRCMsg->protocolIEs.list.array == NULLP)
946 DU_LOG(" F1AP : Memory allocation for DL RRC MessageTransferIEs failed");
947 CU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
948 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
952 for(idx=0; idx<elementCnt; idx++)
954 CU_ALLOC(dlRRCMsg->protocolIEs.list.array[idx], sizeof(DLRRCMessageTransferIEs_t));
955 if(dlRRCMsg->protocolIEs.list.array[idx] == NULLP)
957 for(ieId=0; ieId<idx; ieId++)
959 CU_FREE(dlRRCMsg->protocolIEs.list.array[ieId],\
960 sizeof(DLRRCMessageTransferIEs_t));
962 CU_FREE(dlRRCMsg->protocolIEs.list.array,\
963 dlRRCMsg->protocolIEs.list.size);
964 CU_FREE(f1apMsg->choice.initiatingMessage,\
965 sizeof(InitiatingMessage_t));
966 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
971 /* GNB CU UE F1AP ID */
973 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
974 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
975 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
976 DLRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
977 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
979 /* GNB DU UE F1AP ID */
981 dlRRCMsg->protocolIEs.list.array[idx]->id = \
982 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
983 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
984 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
985 DLRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
986 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
990 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_SRBID;
991 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
992 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
993 DLRRCMessageTransferIEs__value_PR_SRBID;
994 dlRRCMsg->protocolIEs.list.array[idx]->value.choice.SRBID = SRB1;
998 dlRRCMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
999 dlRRCMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1000 dlRRCMsg->protocolIEs.list.array[idx]->value.present = \
1001 DLRRCMessageTransferIEs__value_PR_RRCContainer;
1002 BuildDLRRCContainer(&dlRRCMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer);
1004 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1006 /* Encode the F1SetupRequest type as APER */
1007 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1009 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1011 /* Encode results */
1012 if(encRetVal.encoded == ENCODE_FAIL)
1014 DU_LOG( "\n F1AP : Could not encode DL RRC Message Transfer structure (at %s)\n",\
1015 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1020 DU_LOG("\n F1AP : Created APER encoded buffer for DL RRC Message transfer\n");
1021 for(int i=0; i< encBufSize; i++)
1023 printf("%x",encBuf[i]);
1028 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1030 DU_LOG("\n F1AP : Sending DL RRC Message Transfer Failed");
1035 }/* End of BuildAndSendDLRRCMessageTransfer */
1037 /*******************************************************************
1039 * @brief Builds and sends the UE Setup Response
1043 * Function : BuildAndSendUESetRsp
1045 * Functionality: Constructs the UE Setup Response and sends
1046 * it to the DU through SCTP.
1050 * @return ROK - success
1053 * ****************************************************************/
1054 S16 BuildAndSendUESetRsp()
1063 F1AP_PDU_t *f1apMsg = NULL;
1064 UEContextSetupResponse_t *ueSetRsp;
1065 asn_enc_rval_t encRetVal; /* Encoder return value */
1067 DU_LOG("\n F1AP : Building UE Context Setup Response\n");
1069 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
1070 if(f1apMsg == NULLP)
1072 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1076 f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
1077 CU_ALLOC(f1apMsg->choice.successfulOutcome,
1078 sizeof(SuccessfulOutcome_t));
1079 if(f1apMsg->choice.successfulOutcome == NULLP)
1081 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
1082 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1086 f1apMsg->choice.successfulOutcome->procedureCode = \
1087 ProcedureCode_id_UEContextSetup;
1088 f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
1089 f1apMsg->choice.successfulOutcome->value.present = \
1090 SuccessfulOutcome__value_PR_UEContextSetupResponse;
1092 &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
1094 ueSetRsp->protocolIEs.list.count = elementCnt;
1095 ueSetRsp->protocolIEs.list.size = \
1096 elementCnt * sizeof(UEContextSetupResponse_t *);
1098 /* Initialize the UESetup members */
1099 CU_ALLOC(ueSetRsp->protocolIEs.list.array, \
1100 ueSetRsp->protocolIEs.list.size);
1101 if(ueSetRsp->protocolIEs.list.array == NULLP)
1103 DU_LOG(" F1AP : Memory allocation for UE Setup Response failed");
1104 CU_FREE(f1apMsg->choice.successfulOutcome,
1105 sizeof(SuccessfulOutcome_t));
1106 CU_FREE(f1apMsg,(Size)sizeof(F1AP_PDU_t));
1110 for(idx=0; idx<elementCnt; idx++)
1112 CU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
1113 sizeof(UEContextSetupResponseIEs_t));
1114 if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
1116 for(ieId=0; ieId<idx; ieId++)
1118 CU_FREE(ueSetRsp->protocolIEs.list.array[ieId],\
1119 sizeof(UEContextSetupResponseIEs_t));
1121 CU_FREE(ueSetRsp->protocolIEs.list.array,\
1122 ueSetRsp->protocolIEs.list.size);
1123 CU_FREE(f1apMsg->choice.successfulOutcome,\
1124 sizeof(SuccessfulOutcome_t));
1125 CU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
1132 /*GNB CU UE F1AP ID*/
1133 ueSetRsp->protocolIEs.list.array[idx]->id = \
1134 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
1135 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1136 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
1137 UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
1138 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = CU_ID;
1140 /*GNB DU UE F1AP ID*/
1142 ueSetRsp->protocolIEs.list.array[idx]->id = \
1143 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
1144 ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
1145 ueSetRsp->protocolIEs.list.array[idx]->value.present = \
1146 UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
1147 ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = DU_ID;
1150 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
1152 /* Encode the F1SetupRequest type as APER */
1153 cmMemset((U8 *)encBuf, 0, ENC_BUF_MAX_LEN);
1155 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
1157 /* Encode results */
1158 if(encRetVal.encoded == ENCODE_FAIL)
1160 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
1161 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
1166 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
1167 for(int i=0; i< encBufSize; i++)
1169 printf("%x",encBuf[i]);
1174 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
1176 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
1181 }/* End of BuildAndSendUESetRsp */
1183 uint8_t procInitULRRCMsg(F1AP_PDU_t *f1apMsg)
1187 InitialULRRCMessageTransfer_t *initULRRCMsg = NULLP;
1188 DU_LOG("\n filling the required values in DB in procInitULRRCMsg");
1190 initULRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.InitialULRRCMessageTransfer;
1192 for(idx=0; idx < initULRRCMsg->protocolIEs.list.count; idx++)
1194 switch(initULRRCMsg->protocolIEs.list.array[idx]->id)
1196 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
1198 case ProtocolIE_ID_id_NRCGI:
1200 case ProtocolIE_ID_id_C_RNTI:
1202 case ProtocolIE_ID_id_RRCContainer:
1204 case ProtocolIE_ID_id_DUtoCURRCContainer:
1206 if((initULRRCMsg->protocolIEs.list.array[idx]->value.choice\
1207 .DUtoCURRCContainer.size > 0) && (initULRRCMsg->protocolIEs\
1208 .list.array[idx]->value.choice.DUtoCURRCContainer.buf != NULLP))
1210 DU_LOG("\n Received Du to Cu RRC Container ");
1211 f1apMsgDb.duToCuContainer.size = initULRRCMsg->protocolIEs\
1212 .list.array[idx]->value.choice.DUtoCURRCContainer.size;
1213 CU_ALLOC(f1apMsgDb.duToCuContainer.buf, \
1214 f1apMsgDb.duToCuContainer.size);
1215 if(f1apMsgDb.duToCuContainer.buf != NULLP)
1217 memcpy(f1apMsgDb.duToCuContainer.buf, initULRRCMsg->protocolIEs\
1218 .list.array[idx]->value.choice.DUtoCURRCContainer.buf, f1apMsgDb\
1219 .duToCuContainer.size);
1224 DU_LOG("\n Failed to receive Du to Cu RRC Container ");
1230 DU_LOG("\n Invalid Event %ld", initULRRCMsg->protocolIEs.list.array[idx]->id);
1235 ret = BuildAndSendDLRRCMessageTransfer();
1239 /*******************************************************************
1241 * @brief Builds Nrcgi
1245 * Function : BuildNrcgi
1247 * Functionality: Building the PLMN ID and NR Cell id
1249 * @params[in] NRCGI_t *nrcgi
1250 * @return ROK - success
1253 * ****************************************************************/
1254 uint8_t BuildNrcgi(NRCGI_t *nrcgi)
1258 uint8_t byteSize = 5;
1260 /* Allocate Buffer Memory */
1261 nrcgi->pLMN_Identity.size = 3 * sizeof(uint8_t);
1262 CU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1263 if(nrcgi->pLMN_Identity.buf == NULLP)
1267 ret = buildPlmnId(cuCfgParams.plmn , &nrcgi->pLMN_Identity);
1273 nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
1274 CU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1275 if(nrcgi->nRCellIdentity.buf == NULLP)
1279 ret = fillBitString(&nrcgi->nRCellIdentity, unused, byteSize, val);
1286 /*******************************************************************
1288 * @brief Builds Special cell list for UE Setup Request
1292 * Function : BuildSplCellList
1294 * Functionality: Constructs the Special Cell list for UESetReq
1296 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1298 * @return ROK - success
1301 * ****************************************************************/
1302 uint8_t BuildSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1308 spCellLst->list.count = cellCnt;
1309 spCellLst->list.size = cellCnt * sizeof(SCell_ToBeSetup_ItemIEs_t *);
1310 CU_ALLOC(spCellLst->list.array,spCellLst->list.size);
1311 if(spCellLst->list.array == NULLP)
1315 for(idx=0; idx<cellCnt; idx++)
1317 CU_ALLOC(spCellLst->list.array[idx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1318 if(spCellLst->list.array[idx] == NULLP)
1324 spCellLst->list.array[idx]->id = ProtocolIE_ID_id_SCell_ToBeSetup_Item;
1325 spCellLst->list.array[idx]->criticality = Criticality_ignore;
1326 spCellLst->list.array[idx]->value.present =\
1327 SCell_ToBeSetup_ItemIEs__value_PR_SCell_ToBeSetup_Item;
1328 /* Special Cell ID -NRCGI */
1329 ret = BuildNrcgi(&spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1334 /*Special Cell Index*/
1335 spCellLst->list.array[idx]->value.choice.SCell_ToBeSetup_Item.sCellIndex = 1;
1337 }/* End of BuildSplCellList*/
1339 /*******************************************************************
1341 * @brief Builds SRBS to be setup
1345 * Function : BuildSRBSetup
1347 * Functionality: Constructs the SRB's for UESetReq
1349 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1351 * @return ROK - success
1354 * ****************************************************************/
1355 uint8_t BuildSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1360 srbSet->list.count = srbCnt;
1361 srbSet->list.size = srbCnt*sizeof(SRBs_ToBeSetup_ItemIEs_t *);
1362 CU_ALLOC(srbSet->list.array,srbSet->list.size);
1363 if(srbSet->list.array == NULLP)
1367 for(idx=0; idx<srbCnt; idx++)
1369 CU_ALLOC(srbSet->list.array[idx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1370 if(srbSet->list.array[idx] == NULLP)
1376 srbSet->list.array[idx]->id = ProtocolIE_ID_id_SRBs_ToBeSetup_Item;
1377 srbSet->list.array[idx]->criticality = Criticality_ignore;
1378 srbSet->list.array[idx]->value.present = \
1379 SRBs_ToBeSetup_ItemIEs__value_PR_SRBs_ToBeSetup_Item;
1380 srbSet->list.array[idx]->value.choice.SRBs_ToBeSetup_Item.sRBID = 2;
1382 }/* End of BuildSRBSetup*/
1384 /*******************************************************************
1386 * @brief Builds QOS Info for DRB Setum Item
1390 * Function : BuildQOSInfo
1392 * Functionality: Constructs the QOS Info for DRB Setup Item
1394 * @params[in] QoSInformation_t *qosinfo
1396 * @return ROK - success
1399 * ****************************************************************/
1400 uint8_t BuildQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
1402 /* NonDynamic5QIDescriptor */
1403 drbQos->qoS_Characteristics.present = QoS_Characteristics_PR_non_Dynamic_5QI;
1404 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
1405 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI == NULLP)
1410 drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->fiveQI = 0;
1412 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
1413 sizeof(AveragingWindow_t));
1414 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow == \
1419 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow) = 0;
1420 /*MaxDataBurstVolume*/
1421 CU_ALLOC(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
1422 sizeof(MaxDataBurstVolume_t));
1423 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume == \
1428 *(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume) = 0;
1430 /*nRGRAN Allocation Retention Priority*/
1431 drbQos->nGRANallocationRetentionPriority.priorityLevel = PriorityLevel_highest;
1432 drbQos->nGRANallocationRetentionPriority.pre_emptionCapability = Pre_emptionCapability_may_trigger_pre_emption;
1433 drbQos->nGRANallocationRetentionPriority.pre_emptionVulnerability = Pre_emptionVulnerability_not_pre_emptable;
1435 /* TO DO: GBR_QoSFlowInformation */
1437 }/*End of BuildQOSInfo*/
1439 /*******************************************************************
1441 * @brief Builds SNSSAI
1445 * Function : BuildSNSSAI
1447 * Functionality: Constructs the SNSSAI For DRB list
1449 * @params[in] SNSSAI_t *snssai
1451 * @return ROK - success
1454 * ****************************************************************/
1455 uint8_t BuildSNSSAI(SNSSAI_t *snssai)
1459 snssai->sST.size = sizeof(uint8_t);
1460 CU_ALLOC(snssai->sST.buf,snssai->sST.size);
1461 if(snssai->sST.buf == NULLP)
1465 snssai->sST.buf[0] = 3;
1467 CU_ALLOC(snssai->sD,sizeof(OCTET_STRING_t));
1468 if(snssai->sD == NULLP)
1472 snssai->sD->size = 3*sizeof(uint8_t);
1473 CU_ALLOC(snssai->sD->buf,snssai->sD->size);
1474 if(snssai->sD->buf == NULLP)
1478 snssai->sD->buf[0] = 3;
1479 snssai->sD->buf[1] = 6;
1480 snssai->sD->buf[2] = 9;
1482 }/*End of BuildSNSSAI*/
1484 /*******************************************************************
1486 * @brief Builds the flow map.
1490 * Function : BuildFlowsMap
1492 * Functionality: Constructs the flowmap For DRB list
1494 * @params[in] Flows_Mapped_To_DRB_List_t *flowMap
1496 * @return ROK - success
1499 * ****************************************************************/
1500 uint8_t BuildFlowsMap(Flows_Mapped_To_DRB_List_t *flowMap)
1506 flowMap->list.count = flowCnt;
1507 flowMap->list.size = flowCnt * sizeof(Flows_Mapped_To_DRB_Item_t *);
1508 CU_ALLOC(flowMap->list.array,flowMap->list.size);
1509 if(flowMap->list.array == NULLP)
1513 for(idx=0; idx<flowCnt; idx++)
1515 CU_ALLOC(flowMap->list.array[idx],sizeof(Flows_Mapped_To_DRB_Item_t));
1516 if(flowMap->list.array[idx] == NULLP)
1522 flowMap->list.array[idx]->qoSFlowIdentifier = 0;
1523 ret = BuildQOSInfo(&flowMap->list.array[idx]->qoSFlowLevelQoSParameters);
1529 }/*End of BuildFlowsMap*/
1531 /*******************************************************************
1533 * @brief Builds the Uplink Tunnel Info
1537 * Function : BuildULTnlInfo
1539 * Functionality: Constructs the UL TnlInfo For DRB list
1541 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
1543 * @return ROK - success
1546 * ****************************************************************/
1547 uint8_t BuildULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
1552 ulInfo->list.count = ulCnt;
1553 ulInfo->list.size = ulCnt * sizeof(ULUPTNLInformation_ToBeSetup_Item_t *);
1554 CU_ALLOC(ulInfo->list.array,ulInfo->list.size);
1555 if(ulInfo->list.array == NULLP)
1559 for(idx=0; idx<ulCnt; idx++)
1561 CU_ALLOC(ulInfo->list.array[idx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
1562 if(ulInfo->list.array[idx] == NULLP)
1568 ulInfo->list.array[idx]->uLUPTNLInformation.present = \
1569 UPTransportLayerInformation_PR_gTPTunnel;
1571 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel,\
1572 sizeof(GTPTunnel_t));
1573 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel == NULLP)
1577 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1578 transportLayerAddress.size = 4*sizeof(uint8_t);
1579 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1580 transportLayerAddress.buf,ulInfo->list.array[idx]->\
1581 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
1582 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1583 transportLayerAddress.buf == NULLP)
1587 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1588 transportLayerAddress.buf[0] = 4;
1589 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1590 transportLayerAddress.buf[1] = 4;
1591 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1592 transportLayerAddress.buf[2] = 4;
1593 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1594 transportLayerAddress.buf[3] = 5;
1595 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1596 transportLayerAddress.bits_unused = 0;
1598 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.size\
1599 = 4 * sizeof(uint8_t);
1600 CU_ALLOC(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1601 gTP_TEID.buf,ulInfo->list.array[idx]->uLUPTNLInformation.choice.\
1602 gTPTunnel->gTP_TEID.size);
1603 if(ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
1608 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1609 gTP_TEID.buf[0] = 11;
1610 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1611 gTP_TEID.buf[1] = 0;
1612 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1613 gTP_TEID.buf[2] = 0;
1614 ulInfo->list.array[idx]->uLUPTNLInformation.choice.gTPTunnel->\
1615 gTP_TEID.buf[3] = 1;
1618 }/*End of BuildULTnlInfo*/
1620 /*******************************************************************
1622 * @brief Builds DRBS to be setup
1626 * Function : BuildDRBSetup
1628 * Functionality: Constructs the DRB's for UESetReq
1630 * @params[in] DRBs_ToBeSetup_List_t *drbSet
1632 * @return ROK - success
1635 * ****************************************************************/
1636 uint8_t BuildDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
1638 uint8_t BuildQOSInforet;
1639 uint8_t BuildSNSSAIret;
1640 uint8_t BuildFlowsMapret;
1641 uint8_t BuildULTnlInforet;
1644 DRBs_ToBeSetup_Item_t *drbSetItem;
1646 drbSet->list.count = drbCnt;
1647 drbSet->list.size = drbCnt*sizeof(DRBs_ToBeSetup_ItemIEs_t *);
1648 CU_ALLOC(drbSet->list.array,drbSet->list.size);
1649 if(drbSet->list.array == NULLP)
1653 for(idx=0; idx<drbCnt; idx++)
1655 CU_ALLOC(drbSet->list.array[idx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
1656 if(drbSet->list.array[idx] == NULLP)
1662 drbSet->list.array[idx]->id = ProtocolIE_ID_id_DRBs_ToBeSetup_Item;
1663 drbSet->list.array[idx]->criticality = Criticality_ignore;
1664 drbSet->list.array[idx]->value.present = \
1665 DRBs_ToBeSetup_ItemIEs__value_PR_DRBs_ToBeSetup_Item;
1666 drbSetItem = &drbSet->list.array[idx]->value.choice.DRBs_ToBeSetup_Item;
1668 drbSetItem->dRBID = 1;
1670 drbSetItem->qoSInformation.present = QoSInformation_PR_choice_extension;
1671 CU_ALLOC(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
1672 if(drbSetItem->qoSInformation.choice.choice_extension == NULLP)
1676 drbSetItem->qoSInformation.choice.choice_extension->id = \
1677 ProtocolIE_ID_id_DRB_Information;
1678 drbSetItem->qoSInformation.choice.choice_extension->criticality = \
1680 drbSetItem->qoSInformation.choice.choice_extension->value.present = \
1681 QoSInformation_ExtIEs__value_PR_DRB_Information;
1682 BuildQOSInforet = BuildQOSInfo(&drbSetItem->qoSInformation.choice.\
1683 choice_extension->value.choice.DRB_Information.dRB_QoS);
1684 if(BuildQOSInforet != ROK)
1689 BuildSNSSAIret = BuildSNSSAI(&drbSetItem->qoSInformation.choice.\
1690 choice_extension->value.choice.DRB_Information.sNSSAI);
1691 if(BuildSNSSAIret != ROK)
1695 /*Flows mapped to DRB List*/
1696 BuildFlowsMapret = BuildFlowsMap(&drbSetItem->qoSInformation.choice.\
1697 choice_extension->value.choice.DRB_Information.flows_Mapped_To_DRB_List);
1698 if(BuildFlowsMapret != ROK)
1702 /*ULUPTNLInformation To Be Setup List*/
1703 BuildULTnlInforet = BuildULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
1704 if(BuildULTnlInforet != ROK)
1709 drbSetItem->rLCMode = RLCMode_rlc_um_bidirectional;
1711 /*UL Configuration*/
1712 CU_ALLOC(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
1713 if(drbSetItem->uLConfiguration == NULLP)
1717 drbSetItem->uLConfiguration->uLUEConfiguration = ULUEConfiguration_no_data;
1719 }/* End of BuildDRBSetup*/
1721 /*******************************************************************
1723 * @brief Deallocating memory of function BuildAndSendUESetReq
1727 * Function : FreeNrcgi
1729 * Functionality: Deallocating memory for function BuildNrcgi
1731 * @params[in] NRCGI_t *nrcgi
1735 *******************************************************************/
1736 void FreeNrcgi(NRCGI_t *nrcgi)
1738 if(nrcgi->pLMN_Identity.buf != NULLP)
1740 if(nrcgi->nRCellIdentity.buf != NULLP)
1742 CU_FREE(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
1744 CU_FREE(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
1747 /*******************************************************************
1749 * @brief Deallocating memory of function BuildAndSendUESetReq
1753 * Function : FreeSplCellList
1755 * Functionality: Deallocating memory for function BuildSplCellList
1757 * @params[in] SCell_ToBeSetup_List_t *spCellLst
1762 * *****************************************************************/
1763 void FreeSplCellList(SCell_ToBeSetup_List_t *spCellLst)
1766 if(spCellLst->list.array != NULLP)
1768 for(cellidx=0; cellidx<spCellLst->list.count; cellidx++)
1770 if(cellidx==0&&spCellLst->list.array[cellidx]!=NULLP)
1772 FreeNrcgi(&spCellLst->list.array[cellidx]->value.choice.SCell_ToBeSetup_Item.sCell_ID);
1774 if(spCellLst->list.array[cellidx]!=NULLP)
1776 CU_FREE(spCellLst->list.array[cellidx],sizeof(SCell_ToBeSetup_ItemIEs_t));
1779 CU_FREE(spCellLst->list.array,spCellLst->list.size);
1782 /*******************************************************************
1784 * @brief Deallocating memory of function BuildAndSendUESetReq
1788 * Function : FreeSRBSetup
1790 * Functionality: Deallocating memory for function BuildSRBSetup
1792 * @params[in] SRBs_ToBeSetup_List_t *srbSet
1797 * ******************************************************************/
1798 void FreeSRBSetup(SRBs_ToBeSetup_List_t *srbSet)
1801 if(srbSet->list.array != NULLP)
1803 for(srbidx=0; srbidx<srbSet->list.count; srbidx++)
1805 if(srbSet->list.array[srbidx]!=NULLP)
1807 CU_FREE(srbSet->list.array[srbidx],sizeof(SRBs_ToBeSetup_ItemIEs_t));
1810 CU_FREE(srbSet->list.array,srbSet->list.size);
1813 /*******************************************************************
1815 * @brief Deallocating memory of function BuildAndSendUESetReq
1819 * Function : FreeQOSInfo
1821 * Functionality: Deallocating memory for function BuildQOSInfo
1823 * @params[in] QoSFlowLevelQoSParameters_t *drbQos
1827 * ****************************************************************/
1828 void FreeQOSInfo(QoSFlowLevelQoSParameters_t *drbQos)
1830 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
1832 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
1834 if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
1836 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
1837 sizeof(MaxDataBurstVolume_t));
1839 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,\
1840 sizeof(AveragingWindow_t));
1842 CU_FREE(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI,\
1843 sizeof(NonDynamic5QIDescriptor_t));
1846 /*******************************************************************
1848 * @brief Deallocating memory of function BuildAndSendUESetReq
1852 * Function : FreeULTnlInfo
1854 * Functionality: Deallocating memory for function BuildULTnlInfo
1856 * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
1861 * ****************************************************************/
1862 void FreeULTnlInfo(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
1865 if(ulInfo->list.array != NULLP)
1867 for(ulidx=0; ulidx<ulInfo->list.count; ulidx++)
1869 if(ulidx==0&&ulInfo->list.array[ulidx]!=NULLP)
1871 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel!=NULLP)
1873 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
1874 transportLayerAddress.buf != NULLP)
1876 if(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf\
1879 CU_ALLOC(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
1880 gTP_TEID.buf,ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.\
1881 gTPTunnel->gTP_TEID.size);
1883 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel->\
1884 transportLayerAddress.buf,ulInfo->list.array[ulidx]->\
1885 uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.size);
1887 CU_FREE(ulInfo->list.array[ulidx]->uLUPTNLInformation.choice.gTPTunnel,\
1888 sizeof(GTPTunnel_t));
1891 if(ulInfo->list.array[ulidx]!=NULLP)
1893 CU_FREE(ulInfo->list.array[ulidx],sizeof(ULUPTNLInformation_ToBeSetup_Item_t));
1896 CU_FREE(ulInfo->list.array,ulInfo->list.size);
1899 /*******************************************************************
1901 * @brief Deallocating memory for BuildAndSendUESetReq
1905 * Function : FreeDRBSetup
1907 * Functionality: Deallocating memory for BuildDRBSetup
1909 * @params[in] DRBs_ToBeSetup_List_t *drbSet
1913 * ****************************************************************/
1914 void FreeDRBSetup(DRBs_ToBeSetup_List_t *drbSet)
1916 DRBs_ToBeSetup_Item_t *drbSetItem;
1919 if(drbSet->list.array == NULLP)
1921 for(drbidx=0; drbidx<drbSet->list.count; drbidx++)
1923 if(drbidx==0&&drbSet->list.array[drbidx] != NULLP)
1925 drbSetItem =&drbSet->list.array[drbidx]->value.choice.DRBs_ToBeSetup_Item;
1926 if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
1928 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
1929 qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
1931 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
1932 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
1934 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
1935 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
1937 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
1939 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
1941 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf!=NULLP)
1943 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
1944 flows_Mapped_To_DRB_List.list.array != NULLP)
1946 for(flowidx=0;flowidx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
1947 flows_Mapped_To_DRB_List.list.count; flowidx++)
1949 if(flowidx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
1950 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
1952 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
1953 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
1954 qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
1956 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
1957 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
1958 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
1960 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
1961 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
1962 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
1964 FreeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
1965 CU_FREE(drbSetItem->uLConfiguration,sizeof(ULConfiguration_t));
1967 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
1968 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
1969 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,\
1970 sizeof(MaxDataBurstVolume_t));
1972 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
1973 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
1974 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
1976 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
1977 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]->qoSFlowLevelQoSParameters.\
1978 qoS_Characteristics.choice.non_Dynamic_5QI,sizeof(NonDynamic5QIDescriptor_t));
1981 if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
1982 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx]!=NULLP)
1984 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
1985 DRB_Information.flows_Mapped_To_DRB_List.list.array[flowidx],sizeof(Flows_Mapped_To_DRB_Item_t));
1988 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
1989 flows_Mapped_To_DRB_List.list.array,drbSetItem->qoSInformation.choice.choice_extension->value.\
1990 choice.DRB_Information.flows_Mapped_To_DRB_List.list.size);
1992 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->buf,\
1993 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->size);
1995 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD,\
1996 sizeof(OCTET_STRING_t));
1998 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf,\
1999 drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.size);
2001 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2002 qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume,sizeof(MaxDataBurstVolume_t));
2004 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2005 qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow,sizeof(AveragingWindow_t));
2007 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
2008 qoS_Characteristics.choice.non_Dynamic_5QI, sizeof(NonDynamic5QIDescriptor_t));
2010 CU_FREE(drbSetItem->qoSInformation.choice.choice_extension,sizeof(QoSInformation_ExtIEs_t));
2013 if(drbSet->list.array[drbidx]!=NULLP)
2015 CU_FREE(drbSet->list.array[drbidx],sizeof(DRBs_ToBeSetup_ItemIEs_t));
2018 CU_FREE(drbSet->list.array,drbSet->list.size);
2023 /*******************************************************************
2025 * @brief Free the UE Setup Request
2029 * Function : FreeUESetReq
2031 * Functionality: Deallocate the memory of BuildUESetReq
2033 * @params[in] F1AP_PDU_t *f1apMsg
2038 * ****************************************************************/
2039 void FreeUESetReq(F1AP_PDU_t *f1apMsg)
2043 UEContextSetupRequest_t *ueSetReq;
2045 if(f1apMsg != NULLP)
2047 if(f1apMsg->choice.initiatingMessage != NULLP)
2049 ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2050 if(ueSetReq->protocolIEs.list.array != NULLP)
2052 if(ueSetReq->protocolIEs.list.array[idx])
2054 FreeNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2056 if(ueSetReq->protocolIEs.list.array[idx])
2058 FreeSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2060 if(ueSetReq->protocolIEs.list.array[idx])
2062 FreeSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2064 if(ueSetReq->protocolIEs.list.array[idx])
2066 FreeDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2071 for(ieId=0; ieId<ueSetReq->protocolIEs.list.count; ieId++)
2073 if(ueSetReq->protocolIEs.list.array[ieId] != NULLP)
2075 CU_FREE(ueSetReq->protocolIEs.list.array[ieId],sizeof(UEContextSetupRequestIEs_t));
2078 CU_FREE(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2080 CU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2082 CU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
2086 /*******************************************************************
2088 * @brief Builds and sends the UE Setup Request
2092 * Function : BuildAndSendUESetReq
2094 * Functionality: Constructs the UE Setup Request and sends
2095 * it to the CU through SCTP.
2099 * @return ROK - success
2102 * ****************************************************************/
2103 uint8_t BuildAndSendUESetReq(uint8_t cuUeF1apId, uint8_t duUeF1apId, \
2104 uint16_t rrcContLen, uint8_t *rrcContainer)
2107 uint8_t SplCellListret;
2108 uint8_t SrbSetupret;
2112 F1AP_PDU_t *f1apMsg = NULLP;
2113 UEContextSetupRequest_t *ueSetReq = NULLP;
2114 asn_enc_rval_t encRetVal; /* Encoder return value */
2115 memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
2116 uint8_t ret= RFAILED;
2120 DU_LOG("\n F1AP : Building UE Context Setup Request\n");
2122 CU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
2123 if(f1apMsg == NULLP)
2125 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2129 f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
2130 CU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
2131 if(f1apMsg->choice.initiatingMessage == NULLP)
2133 DU_LOG(" F1AP : Memory allocation for F1AP-PDU failed");
2137 f1apMsg->choice.initiatingMessage->procedureCode = \
2138 ProcedureCode_id_UEContextSetup;
2139 f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
2140 f1apMsg->choice.initiatingMessage->value.present = \
2141 InitiatingMessage__value_PR_UEContextSetupRequest;
2143 &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
2146 ueSetReq->protocolIEs.list.count = elementCnt;
2147 ueSetReq->protocolIEs.list.size = \
2148 elementCnt * sizeof(UEContextSetupRequestIEs_t *);
2150 /* Initialize the UESetup members */
2151 CU_ALLOC(ueSetReq->protocolIEs.list.array,ueSetReq->protocolIEs.list.size);
2153 if(ueSetReq->protocolIEs.list.array == NULLP)
2155 DU_LOG(" F1AP : Memory allocation for UE Context SetupRequest failed");
2159 for(idx1=0; idx1<elementCnt; idx1++)
2161 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx1],sizeof(UEContextSetupRequestIEs_t));
2162 if(ueSetReq->protocolIEs.list.array[idx1] == NULLP)
2170 /*GNB CU UE F1AP ID*/
2171 ueSetReq->protocolIEs.list.array[idx]->id = \
2172 ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
2173 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2174 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2175 UEContextSetupRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
2176 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = cuUeF1apId;
2178 /*GNB DU UE F1AP ID*/
2180 ueSetReq->protocolIEs.list.array[idx]->id = \
2181 ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
2182 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2183 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2184 UEContextSetupRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
2185 ueSetReq->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = duUeF1apId;
2189 ueSetReq->protocolIEs.list.array[idx]->id = \
2190 ProtocolIE_ID_id_SpCell_ID;
2191 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2192 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2193 UEContextSetupRequestIEs__value_PR_NRCGI;
2194 Nrcgiret = BuildNrcgi(&ueSetReq->protocolIEs.list.array[idx]->value.choice.NRCGI);
2200 /*Served Cell Index*/
2202 ueSetReq->protocolIEs.list.array[idx]->id = \
2203 ProtocolIE_ID_id_ServCellIndex;
2204 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2205 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2206 UEContextSetupRequestIEs__value_PR_ServCellIndex;
2207 ueSetReq->protocolIEs.list.array[idx]->value.choice.ServCellIndex = \
2210 /*CellULConfigured*/
2212 ueSetReq->protocolIEs.list.array[idx]->id = \
2213 ProtocolIE_ID_id_SpCellULConfigured;
2214 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2215 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2216 UEContextSetupRequestIEs__value_PR_CellULConfigured;
2217 ueSetReq->protocolIEs.list.array[idx]->value.choice.CellULConfigured = \
2218 CellULConfigured_none;
2221 /*CUtoDURRCContainer*/
2223 ueSetReq->protocolIEs.list.array[idx]->id = \
2224 ProtocolIE_ID_id_CUtoDURRCInformation;
2225 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2226 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2227 UEContextSetupRequestIEs__value_PR_CUtoDURRCInformation;
2229 /*Special Cells to be SetupList*/
2231 ueSetReq->protocolIEs.list.array[idx]->id = \
2232 ProtocolIE_ID_id_SCell_ToBeSetup_List;
2233 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2234 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2235 UEContextSetupRequestIEs__value_PR_SCell_ToBeSetup_List;
2236 SplCellListret = BuildSplCellList(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SCell_ToBeSetup_List);
2237 if(SplCellListret != ROK)
2241 /*SRBs To Be Setup List*/
2243 ueSetReq->protocolIEs.list.array[idx]->id = \
2244 ProtocolIE_ID_id_SRBs_ToBeSetup_List;
2245 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2246 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2247 UEContextSetupRequestIEs__value_PR_SRBs_ToBeSetup_List;
2248 SrbSetupret = BuildSRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.SRBs_ToBeSetup_List);
2249 if(SrbSetupret != ROK)
2253 /*DRBs to Be Setup List*/
2255 ueSetReq->protocolIEs.list.array[idx]->id = \
2256 ProtocolIE_ID_id_DRBs_ToBeSetup_List;
2257 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2258 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2259 UEContextSetupRequestIEs__value_PR_DRBs_ToBeSetup_List;
2260 ret1 = BuildDRBSetup(&ueSetReq->protocolIEs.list.array[idx]->value.choice.DRBs_ToBeSetup_List);
2268 ueSetReq->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_RRCContainer;
2269 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_reject;
2270 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2271 UEContextSetupRequestIEs__value_PR_RRCContainer;
2272 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size = rrcContLen;
2273 CU_ALLOC(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
2274 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2275 if(!ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf)
2277 DU_LOG(" F1AP : Memory allocation for BuildAndSendUESetReq failed");
2280 memcpy(ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf, \
2281 rrcContainer, ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
2283 /* RRC delivery status request */
2285 ueSetReq->protocolIEs.list.array[idx]->id = \
2286 ProtocolIE_ID_id_RRCDeliveryStatusRequest;
2287 ueSetReq->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
2288 ueSetReq->protocolIEs.list.array[idx]->value.present = \
2289 UEContextSetupRequestIEs__value_PR_RRCDeliveryStatusRequest;
2290 ueSetReq->protocolIEs.list.array[idx]->value.choice.RRCDeliveryStatusRequest = \
2291 RRCDeliveryStatusRequest_true;
2293 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2295 /* Encode the F1SetupRequest type as APER */
2296 cmMemset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
2298 encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
2300 /* Encode results */
2301 if(encRetVal.encoded == ENCODE_FAIL)
2303 DU_LOG( "\n F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
2304 encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
2309 DU_LOG("\n F1AP : Created APER encoded buffer for UE Context Setup Request\n");
2310 for(int i=0; i< encBufSize; i++)
2312 printf("%x",encBuf[i]);
2317 if(SendF1APMsg(CU_APP_MEM_REG,CU_POOL) != ROK)
2319 DU_LOG("\n F1AP : Sending UE Context Setup Request Failed");
2325 FreeUESetReq(f1apMsg);
2328 }/* End of BuildAndSendUESetReq*/
2330 uint8_t procUlRrcMsg(F1AP_PDU_t *f1apMsg)
2334 uint8_t cuUeF1apId, duUeF1apId;
2335 uint8_t *rrcContainer;
2336 uint16_t rrcContLen;
2337 ULRRCMessageTransfer_t *ulRrcMsg = NULLP;
2339 ulRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
2341 for(idx=0; idx < ulRrcMsg->protocolIEs.list.count; idx++)
2343 switch(ulRrcMsg->protocolIEs.list.array[idx]->id)
2345 case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
2347 cuUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
2350 case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
2352 duUeF1apId = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
2355 case ProtocolIE_ID_id_SRBID:
2357 case ProtocolIE_ID_id_RRCContainer:
2359 rrcContLen = ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
2360 CU_ALLOC(rrcContainer, rrcContLen)
2363 DU_LOG("\nCU_STUB: Failed to allocated memory in procUlRrcMsg");
2366 memcpy(rrcContainer, ulRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
2372 DU_LOG("\n Invalid Event %ld", ulRrcMsg->protocolIEs.list.array[idx]->id);
2377 ret = BuildAndSendUESetReq(cuUeF1apId, duUeF1apId, rrcContLen, rrcContainer);
2380 /*******************************************************************
2382 * @brief Handles received F1AP message and sends back response
2386 * Function : F1APMsgHdlr
2389 * - Decodes received F1AP control message
2390 * - Prepares response message, encodes and sends to SCTP
2393 * @return ROK - success
2396 * ****************************************************************/
2397 void F1APMsgHdlr(Buffer *mBuf)
2403 F1AP_PDU_t *f1apMsg = NULLP;
2404 asn_dec_rval_t rval; /* Decoder return value */
2405 F1AP_PDU_t f1apasnmsg ;
2407 DU_LOG("\nF1AP : Received F1AP message buffer");
2408 ODU_PRINT_MSG(mBuf, 0,0);
2410 /* Copy mBuf into char array to decode it */
2411 ODU_FIND_MSG_LEN(mBuf, &recvBufLen);
2412 CU_ALLOC(recvBuf, (Size)recvBufLen);
2414 if(recvBuf == NULLP)
2416 DU_LOG("\nF1AP : Memory allocation failed");
2419 if(ODU_COPY_MSG_TO_FIX_BUF(mBuf, 0, recvBufLen, (Data *)recvBuf, ©Cnt) != ROK)
2421 DU_LOG("\nF1AP : Failed while copying %d", copyCnt);
2425 printf("\nF1AP : Received flat buffer to be decoded : ");
2426 for(i=0; i< recvBufLen; i++)
2428 printf("%x",recvBuf[i]);
2431 /* Decoding flat buffer into F1AP messsage */
2432 f1apMsg = &f1apasnmsg;
2433 memset(f1apMsg, 0, sizeof(F1AP_PDU_t));
2435 rval = aper_decode(0, &asn_DEF_F1AP_PDU, (void **)&f1apMsg, recvBuf, recvBufLen, 0, 0);
2436 CU_FREE(recvBuf, (Size)recvBufLen);
2438 if(rval.code == RC_FAIL || rval.code == RC_WMORE)
2440 DU_LOG("\nF1AP : ASN decode failed");
2444 xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
2446 switch(f1apMsg->present)
2448 case F1AP_PDU_PR_initiatingMessage:
2450 switch(f1apMsg->choice.initiatingMessage->value.present)
2452 case InitiatingMessage__value_PR_F1SetupRequest:
2454 DU_LOG("\nF1AP : F1 setup request received");
2455 BuildAndSendF1SetupRsp();
2459 case InitiatingMessage__value_PR_GNBDUConfigurationUpdate:
2461 DU_LOG("\nF1AP : GNB-DU config update received");
2462 BuildAndSendDUUpdateAck();
2465 case InitiatingMessage__value_PR_InitialULRRCMessageTransfer:
2467 DU_LOG("\nF1AP : Received InitialULRRCMessageTransfer");
2468 procInitULRRCMsg(f1apMsg);
2471 case InitiatingMessage__value_PR_ULRRCMessageTransfer:
2473 DU_LOG("\nF1AP : Received ULRRCMessageTransfer");
2474 procUlRrcMsg(f1apMsg);
2478 DU_LOG("\nF1AP : Invalid type of intiating message [%d]",f1apMsg->choice.initiatingMessage->value.present);
2481 }/* End of switch(initiatingMessage) */
2485 }/* End of switch(f1apMsg->present) */
2487 } /* End of F1APMsgHdlr */
2489 /**********************************************************************
2491 **********************************************************************/