#include "legtp.h"
#include "lkw.x"
#include "lrg.x"
+#include "F1AP-PDU.h"
#include "du_app_mac_inf.h"
#include "du_cfg.h"
#include "du_app_rlc_inf.h"
#include "SchedulingRequestResourceConfig.h"
#include<ProtocolIE-Field.h>
#include "ProtocolExtensionField.h"
-#include "F1AP-PDU.h"
#include "odu_common_codec.h"
#include "du_mgr.h"
#include "du_cell_mgr.h"
#include "du_f1ap_msg_hdl.h"
+#include "DRBs-Setup-Item.h"
+#include "DLUPTNLInformation-ToBeSetup-List.h"
+#include "DLUPTNLInformation-ToBeSetup-Item.h"
+#include "UPTransportLayerInformation.h"
+#include "GTPTunnel.h"
+
+#ifdef O1_ENABLE
+#include "ConfigInterface.h"
+extern StartupConfig g_cfg;
+#endif
DuCfgParams duCfgParam;
-/*******************************************************************
+/************************************************************************
*
- * @brief Builds Uplink Info for NR
+ * @brief Converts enum values into actual value of Poll retransmit timer
*
* @details
*
- * Function : BuildULNRInfo
+ * Function : getPollPdu
*
- * Functionality: Building NR Uplink Info
+ * Functionality: Converts enum values into actual value of poll
+ * retransmit timer
*
- * @params[in] NRFreqInfo_t *ulnrfreq
- * @return ROK - success
- * RFAILED - failure
+ * @params[in] Enum value of pollPdu
+ * @return Actual value of pollPdu
*
- * ****************************************************************/
-uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
+ * **********************************************************************/
+
+uint16_t getPollRetxTmr(uint8_t pollRetxTmrCfg)
{
- uint8_t idx=0;
- ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
- fdd.ulNrFreqInfo.nrArfcn;
- ulnrfreq->freqBandListNr.list.count = 1;
- ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
- DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
- if(ulnrfreq->freqBandListNr.list.array == NULLP)
- {
- return RFAILED;
- }
- for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
+ uint16_t pollRetxTmr;
+
+ /* All values of poll retx timer are at interval of 5ms.
+ * This is valid upto 250ms
+ * Hence converting the enum value to actual value by multiplying it to 5
+ */
+ if(pollRetxTmrCfg <= T_PollRetransmit_ms250)
+ pollRetxTmr = (pollRetxTmrCfg + 1) * 5;
+ else
{
- DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
- if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
+ switch(pollRetxTmrCfg)
{
- return RFAILED;
+ case T_PollRetransmit_ms300:
+ pollRetxTmr = 300;
+ break;
+ case T_PollRetransmit_ms350:
+ pollRetxTmr = 350;
+ break;
+ case T_PollRetransmit_ms400:
+ pollRetxTmr = 400;
+ break;
+ case T_PollRetransmit_ms450:
+ pollRetxTmr = 450;
+ break;
+ case T_PollRetransmit_ms500:
+ pollRetxTmr = 500;
+ break;
+ case T_PollRetransmit_ms800:
+ pollRetxTmr = 800;
+ break;
+ default:
+ DU_LOG("\nERROR --> F1AP: Invalid value of Poll Retransmit timer");
+ pollRetxTmr = 0;
}
}
- ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
- duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
- freqBand[0].nrFreqBand;
- ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
- return ROK;
+ return pollRetxTmr;
}
+
/*******************************************************************
*
- * @brief Builds Downlink NR Info
+ * @brief Converts enum values into actual value of PollPdu
*
* @details
*
- * Function : BuildDLNRInfo
+ * Function : getPollPdu
*
- * Functionality: Building Downlink NR Info
- *
- * @params[in] NRFreqInfo_t *dlnrfreq
- * @return ROK - success
- * RFAILED - failure
+ * Functionality: Converts enum values into actual value of PollPdu
+ *
+ * @params[in] Enum value of pollPdu
+ * @return Actual value of pollPdu
*
* ****************************************************************/
-uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
+int32_t getPollPdu(uint8_t pollPduCfg)
{
- uint8_t idx=0;
- dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
- fdd.dlNrFreqInfo.nrArfcn;
- dlnrfreq->freqBandListNr.list.count = 1;
- dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
- DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
- if(dlnrfreq->freqBandListNr.list.array == NULLP)
+ int32_t pollPdu;
+ switch(pollPduCfg)
{
- return RFAILED;
+ case PollPDU_p4:
+ pollPdu = 4;
+ break;
+ case PollPDU_p8:
+ pollPdu = 8;
+ break;
+ case PollPDU_p16:
+ pollPdu = 16;
+ break;
+ case PollPDU_p32:
+ pollPdu = 32;
+ break;
+ case PollPDU_p64:
+ pollPdu = 64;
+ break;
+ case PollPDU_p128:
+ pollPdu = 128;
+ break;
+ case PollPDU_p256:
+ pollPdu = 256;
+ break;
+ case PollPDU_p512:
+ pollPdu = 512;
+ break;
+ case PollPDU_p1024:
+ pollPdu = 1024;
+ break;
+ case PollPDU_p2048:
+ pollPdu = 2048;
+ break;
+ case PollPDU_p4096:
+ pollPdu = 4096;
+ break;
+ case PollPDU_p6144:
+ pollPdu = 6144;
+ break;
+ case PollPDU_p8192:
+ pollPdu = 8192;
+ break;
+ case PollPDU_p12288:
+ pollPdu = 12288;
+ break;
+ case PollPDU_p16384:
+ pollPdu = 16384;
+ break;
+ case PollPDU_p20480:
+ pollPdu = 20480;
+ break;
+ case PollPDU_p24576:
+ pollPdu = 24576;
+ break;
+ case PollPDU_p28672:
+ pollPdu = 28672;
+ break;
+ case PollPDU_p32768:
+ pollPdu = 32768;
+ break;
+ case PollPDU_p40960:
+ pollPdu = 40960;
+ break;
+ case PollPDU_p49152:
+ pollPdu = 49152;
+ break;
+ case PollPDU_p57344:
+ pollPdu = 57344;
+ break;
+ case PollPDU_p65536:
+ pollPdu = 65536;
+ break;
+ case PollPDU_infinity:
+ pollPdu = -1;
+ break;
+ default:
+ DU_LOG("\nERROR --> F1AP: Invalid value of poll pdu");
+ pollPdu = 0;
+ break;
}
- for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
- {
- DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
- if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
- {
- return RFAILED;
- }
- }
- dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
- duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
- freqBand[0].nrFreqBand;
- dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
-
- return ROK;
+ return pollPdu;
}
/*******************************************************************
*
- * @brief Builds NRCell ID
+ * @brief Converts enum values into actual value of poll bytes
*
* @details
*
- * Function : BuildNrCellId
+ * Function : getPollByte
*
- * Functionality: Building the NR Cell ID
+ * Functionality: Converts enum values into actual value of pollBytes
*
- * @params[in] BIT_STRING_t *nrcell
- * @return ROK - success
- * RFAILED - failure
+ * @params[in] Enum value
+ * @return Actual value
*
* ****************************************************************/
-
-S16 BuildNrCellId(BIT_STRING_t *nrcell)
+int32_t getPollByte(uint16_t pollBytesCfg)
{
- memset(nrcell->buf, 0, nrcell->size);
- nrcell->buf[4] = 16;
- nrcell->bits_unused = 4;
- return ROK;
+ int32_t pollBytes;
+ switch(pollBytesCfg)
+ {
+ case PollByte_kB1:
+ pollBytes = 1000;
+ break;
+ case PollByte_kB2:
+ pollBytes = 2000;
+ break;
+ case PollByte_kB5:
+ pollBytes = 5000;
+ break;
+ case PollByte_kB8:
+ pollBytes = 8000;
+ break;
+ case PollByte_kB10:
+ pollBytes = 10000;
+ break;
+ case PollByte_kB15:
+ pollBytes = 15000;
+ break;
+ case PollByte_kB25:
+ pollBytes = 25000;
+ break;
+ case PollByte_kB50:
+ pollBytes = 50000;
+ break;
+ case PollByte_kB75:
+ pollBytes = 75000;
+ break;
+ case PollByte_kB100:
+ pollBytes = 100000;
+ break;
+ case PollByte_kB125:
+ pollBytes = 125000;
+ break;
+ case PollByte_kB250:
+ pollBytes = 250000;
+ break;
+ case PollByte_kB375:
+ pollBytes = 375000;
+ break;
+ case PollByte_kB500:
+ pollBytes = 500000;
+ break;
+ case PollByte_kB750:
+ pollBytes = 750000;
+ break;
+ case PollByte_kB1000:
+ pollBytes = 1000000;
+ break;
+ case PollByte_kB1250:
+ pollBytes = 1250000;
+ break;
+ case PollByte_kB1500:
+ pollBytes = 1500000;
+ break;
+ case PollByte_kB2000:
+ pollBytes = 2000000;
+ break;
+ case PollByte_kB3000:
+ pollBytes = 3000000;
+ break;
+ case PollByte_kB4000:
+ pollBytes = 4000000;
+ break;
+ case PollByte_kB4500:
+ pollBytes = 4500000;
+ break;
+ case PollByte_kB5000:
+ pollBytes = 5000000;
+ break;
+ case PollByte_kB5500:
+ pollBytes = 5500000;
+ break;
+ case PollByte_kB6000:
+ pollBytes = 6000000;
+ break;
+ case PollByte_kB6500:
+ pollBytes = 6500000;
+ break;
+ case PollByte_kB7000:
+ pollBytes = 7000000;
+ break;
+ case PollByte_kB7500:
+ pollBytes = 7500000;
+ break;
+ case PollByte_mB8:
+ pollBytes = 8000000;
+ break;
+ case PollByte_mB9:
+ pollBytes = 9000000;
+ break;
+ case PollByte_mB10:
+ pollBytes = 10000000;
+ break;
+ case PollByte_mB11:
+ pollBytes = 11000000;
+ break;
+ case PollByte_mB12:
+ pollBytes = 12000000;
+ break;
+ case PollByte_mB13:
+ pollBytes = 13000000;
+ break;
+ case PollByte_mB14:
+ pollBytes = 14000000;
+ break;
+ case PollByte_mB15:
+ pollBytes = 15000000;
+ break;
+ case PollByte_mB16:
+ pollBytes = 16000000;
+ break;
+ case PollByte_mB17:
+ pollBytes = 17000000;
+ break;
+ case PollByte_mB18:
+ pollBytes = 18000000;
+ break;
+ case PollByte_mB20:
+ pollBytes = 20000000;
+ break;
+ case PollByte_mB25:
+ pollBytes = 25000000;
+ break;
+ case PollByte_mB30:
+ pollBytes = 30000000;
+ break;
+ case PollByte_mB40:
+ pollBytes = 40000000;
+ break;
+ case PollByte_infinity:
+ pollBytes = -1;
+ break;
+ default:
+ DU_LOG("\nERROR --> F1AP: Invalid value of poll bytes");
+ pollBytes = 0;
+ }
+ return pollBytes;
}
/*******************************************************************
*
- * @brief Builds Nrcgi
+ * @brief Converts enum values into actual value of maxRetx
*
* @details
*
- * Function : BuildNrcgi
+ * Function : getMaxRetx
*
- * Functionality: Building the PLMN ID and NR Cell id
+ * Functionality: Converts enum values into actual value of maxRetx
*
- * @params[in] NRCGI_t *nrcgi
- * @return ROK - success
- * RFAILED - failure
+ * @params[in] Enum value
+ * @return Actual value
*
* ****************************************************************/
-uint8_t BuildNrcgi(NRCGI_t *nrcgi)
+uint8_t getMaxRetx(uint8_t maxRetxCfg)
{
- uint8_t ret;
- uint8_t byteSize = 5;
- /* Allocate Buffer Memory */
- nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
- DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
- if(nrcgi->pLMN_Identity.buf == NULLP)
- {
- return RFAILED;
- }
- ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
- nrcgi->pLMN_Identity.buf); // Building PLMN function
- if(ret != ROK)
- {
- return RFAILED;
- }
- /*nrCellIdentity*/
- nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
- DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
- if(nrcgi->nRCellIdentity.buf == NULLP)
+ uint8_t maxRetx;
+ switch(maxRetxCfg)
{
- return RFAILED;
+ case UL_AM_RLC__maxRetxThreshold_t1:
+ maxRetx = 1;
+ break;
+ case UL_AM_RLC__maxRetxThreshold_t2:
+ maxRetx = 2;
+ break;
+ case UL_AM_RLC__maxRetxThreshold_t3:
+ maxRetx = 3;
+ break;
+ case UL_AM_RLC__maxRetxThreshold_t4:
+ maxRetx = 4;
+ break;
+ case UL_AM_RLC__maxRetxThreshold_t6:
+ maxRetx = 6;
+ break;
+ case UL_AM_RLC__maxRetxThreshold_t8:
+ maxRetx = 8;
+ break;
+ case UL_AM_RLC__maxRetxThreshold_t16:
+ maxRetx = 16;
+ break;
+ case UL_AM_RLC__maxRetxThreshold_t32:
+ maxRetx = 32;
+ break;
+ default:
+ DU_LOG("\nERROR --> F1AP: Invalid configuration for Max retransmission threshold");
+ maxRetx = 0;
}
- BuildNrCellId(&nrcgi->nRCellIdentity);
-
- return ROK;
+ return maxRetx;
}
+
/*******************************************************************
- *
- * @brief Builds FiveGStac
+ * @brief Converts enum values into actual value of reassembly timer
*
* @details
*
- * Function : BuildFiveGSTac
+ * Function : getReAsmblTmr
*
- * Functionality: Building the FiveGSTac
+ * Functionality: Converts enum values into actual value of reassembly
+ * timer
*
- * @params[in] OCTET_STRING_t *fivegsTac
- * @return ROK - success
- * RFAILED - failure
+ * @params[in] Enum value of reassembly timer
+ * @return Actual value of reassembly timer
*
- * ****************************************************************/
-uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
+ * **********************************************************************/
+
+int8_t getReAsmblTmr(uint8_t reAsmblTmrCfg)
{
- DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
- if(servcell->fiveGS_TAC == NULLP)
+ int8_t reAsmblTmr = 0;
+
+ if(reAsmblTmrCfg == T_Reassembly_ms0)
{
- return RFAILED;
+ reAsmblTmr = 0;
}
- servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
- DU_ALLOC(servcell->fiveGS_TAC->buf,\
- sizeof(servcell->fiveGS_TAC->size));
- if(servcell->fiveGS_TAC->buf == NULLP)
+ else if(reAsmblTmrCfg >= T_Reassembly_ms5 || reAsmblTmrCfg <= T_Reassembly_ms100)
{
- return RFAILED;
+ /* All values of re assembly timer are at interval of 5ms.
+ * This is valid upto 100ms
+ * Hence converting the enum value to actual value by multiplying it to 5
+ */
+ reAsmblTmr = reAsmblTmrCfg * 5;
}
- servcell->fiveGS_TAC->buf[0] = 0;
- servcell->fiveGS_TAC->buf[1] = 0;
- servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
- return ROK;
+ else if(reAsmblTmrCfg >= T_Reassembly_ms110 || reAsmblTmrCfg <= T_Reassembly_ms200)
+ {
+ /* All values of re assembly timer are at interval of 10ms.
+ * This is valid upto 200ms
+ * since enum value starts from 20 for 100ms, subtracting 10 and
+ * converting the enum value to actual value by multiplying it to 10
+ */
+ reAsmblTmr = ((reAsmblTmrCfg-10) * 10);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> F1AP : Invalid value of Re Assembly timer %d", reAsmblTmrCfg);
+ reAsmblTmr = -1;
+ }
+ return reAsmblTmr;
}
-/*******************************************************************
+
+/************************************************************************
*
- * @brief Builds NR Mode
+ * @brief Converts enum values into actual value of status prohibit timer
*
* @details
*
- * Function : BuildNrMode
+ * Function : getStatProhTmr
*
- * Functionality: Building the NR Mode
+ * Functionality: Converts enum values into actual value of status prohibit
+ * timer
*
- * @params[in] NR_Mode_Info_t *fdd
- * @return ROK - success
- * RFAILED - failure
+ * @params[in] Enum value of status prohibit timer
+ * @return Actual value of status prohibit timer
*
- * ****************************************************************/
-uint8_t BuildNrMode(NR_Mode_Info_t *mode)
+ * **********************************************************************/
+
+int16_t getStatProhTmr(uint8_t statProhTmrCfg)
{
- uint8_t BuildDLNRInforet=0;
- uint8_t BuildULNRInforet=0;
- /* FDD Mode */
- mode->present = NR_Mode_Info_PR_fDD;
- if(mode->present == NR_Mode_Info_PR_fDD)
+ int16_t statProhTmr =0;
+
+ if(statProhTmrCfg == T_StatusProhibit_ms0)
{
- DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
- if(mode->choice.fDD == NULLP)
- {
- return RFAILED;
- }
- BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
- if(BuildULNRInforet != ROK)
+ statProhTmr = 0;
+ }
+ else if(statProhTmrCfg >= T_StatusProhibit_ms5 || statProhTmrCfg <= T_StatusProhibit_ms250)
+ {
+ /* All values of re assembly timer are at interval of 5ms.
+ * This is valid upto 250ms
+ * Hence converting the enum value to actual value by multiplying it to 5
+ */
+ statProhTmr = statProhTmrCfg * 5;
+ }
+ else
+ {
+ switch(statProhTmrCfg)
{
- return RFAILED;
+ case T_StatusProhibit_ms300:
+ statProhTmr = 300;
+ break;
+ case T_StatusProhibit_ms350:
+ statProhTmr = 350;
+ break;
+ case T_StatusProhibit_ms400:
+ statProhTmr = 400;
+ break;
+ case T_StatusProhibit_ms450:
+ statProhTmr = 450;
+ break;
+ case T_StatusProhibit_ms500:
+ statProhTmr = 500;
+ break;
+ case T_StatusProhibit_ms800:
+ statProhTmr = 800;
+ break;
+ case T_StatusProhibit_ms1000:
+ statProhTmr = 1000;
+ break;
+ case T_StatusProhibit_ms1200:
+ statProhTmr = 1200;
+ break;
+ case T_StatusProhibit_ms1600:
+ statProhTmr = 1600;
+ break;
+ case T_StatusProhibit_ms2000:
+ statProhTmr = 2000;
+ break;
+ case T_StatusProhibit_ms2400:
+ statProhTmr = 2400;
+ break;
+ default:
+ DU_LOG("\nInvalid value of Status Prohibit timer %d", statProhTmrCfg);
+ statProhTmr = -1;
+ break;
}
- BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
- if(BuildDLNRInforet != ROK)
+ }
+ return statProhTmr;
+}
+
+/*******************************************************************
+*
+* @brief Adding F1AP pdu to reserved pdu list
+*
+* @details
+*
+* Function : addToReservedF1apPduList
+*
+* Functionality: Adding F1AP pdu to reserved pdu list.
+* These pdu are awaiting aknowledgment from CU
+*
+* @params[in] uint8_t transId, F1AP_PDU_t *f1apMsg
+*
+* @return ROK - success
+* RFAILED - failure
+*
+* ****************************************************************/
+
+void addToReservedF1apPduList(uint8_t transId, F1AP_PDU_t *f1apPdu)
+{
+ CmLList *node = NULLP;
+ ReservedF1apPduInfo *pduInfo = NULLP;
+ DU_ALLOC(pduInfo, sizeof(ReservedF1apPduInfo));
+ if(pduInfo)
+ {
+ DU_ALLOC(node, sizeof(CmLList));
+ if(node)
{
- return RFAILED;
+ pduInfo->transId = transId;
+ pduInfo->f1apMsg = (void*) f1apPdu;
+
+ node->node = (PTR)pduInfo;
+ cmLListAdd2Tail(&duCb.reservedF1apPduList, node);
}
}
- mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
- duCfgParam.srvdCellLst[0].duCellInfo.\
- f1Mode.mode.fdd.ulTxBw.nrScs;
- mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
- duCfgParam.srvdCellLst[0].duCellInfo.\
- f1Mode.mode.fdd.ulTxBw.nrb;
- mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
- duCfgParam.srvdCellLst[0].duCellInfo.\
- f1Mode.mode.fdd.dlTxBw.nrScs;
- mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
- duCfgParam.srvdCellLst[0].duCellInfo.\
- f1Mode.mode.fdd.dlTxBw.nrb;
- return ROK;
}
+
+/*******************************************************************
+*
+* @brief searching for F1AP pdu from ReservedF1apPduList
+*
+* @details
+*
+* Function : searchFromReservedF1apPduList
+*
+* Functionality: searching for F1AP pdu information
+*
+* @params[in] uint8_t transId
+*
+* @return pointer to F1AP_PDU_t
+*
+* ****************************************************************/
+
+CmLList *searchFromReservedF1apPduList(uint8_t transId)
+{
+ CmLList *node;
+ ReservedF1apPduInfo *f1apPdu;
+ if(duCb.reservedF1apPduList.count)
+ {
+ CM_LLIST_FIRST_NODE(&duCb.reservedF1apPduList, node);
+ while(node)
+ {
+ f1apPdu = (ReservedF1apPduInfo*)node->node;
+ if(f1apPdu->transId == transId)
+ {
+ return node;
+ }
+ node = node->next;
+ }
+ }
+ return NULL;
+}
+
+/*******************************************************************
+*
+* @brief deleting F1AP pdu information from ReservedF1apPduList
+*
+* @details
+*
+* Function : deleteFromReservedF1apPduList
+*
+* Functionality: deleting pdu information from ReservedF1apPduList
+*
+* @params[in] CmLList *node
+*
+* @return void
+*
+* ****************************************************************/
+
+void deleteFromReservedF1apPduList(CmLList *node)
+{
+ ReservedF1apPduInfo *f1apPdu;
+
+ if(node != NULL)
+ {
+ f1apPdu = (ReservedF1apPduInfo *)node->node;
+ cmLListDelFrm(&duCb.reservedF1apPduList, node);
+ DU_FREE(f1apPdu, sizeof(ReservedF1apPduInfo));
+ DU_FREE(node, sizeof(CmLList));
+ node = NULL;
+ }
+}
+
/*******************************************************************
*
- * @brief Builds IE Extensions for Served PLMNs
+ * @brief Builds Uplink Info for NR
*
* @details
*
- * Function : BuildExtensions
+ * Function : BuildULNRInfo
*
- * Functionality: Building the IE Extensions
+ * Functionality: Building NR Uplink Info
*
- * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
+ * @params[in] NRFreqInfo_t *ulnrfreq
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
+uint8_t BuildULNRInfo(NRFreqInfo_t *ulnrfreq)
{
- uint8_t idx;
- uint8_t plmnidx;
- uint8_t extensionCnt=1;
- uint8_t sliceId=0;
- uint8_t sdId;
- DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
- if((*ieExtend) == NULLP)
- {
- return RFAILED;
- }
- (*ieExtend)->list.count = extensionCnt;
- (*ieExtend)->list.size = \
- extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
- DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
- if((*ieExtend)->list.array == NULLP)
+ uint8_t idx=0;
+ ulnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
+ fdd.ulNrFreqInfo.nrArfcn;
+ ulnrfreq->freqBandListNr.list.count = 1;
+ ulnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
+ DU_ALLOC(ulnrfreq->freqBandListNr.list.array,ulnrfreq->freqBandListNr.list.size);
+ if(ulnrfreq->freqBandListNr.list.array == NULLP)
{
return RFAILED;
}
- for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
+ for(idx=0;idx<ulnrfreq->freqBandListNr.list.count;idx++)
{
- DU_ALLOC((*ieExtend)->list.array[plmnidx],\
- sizeof(ServedPLMNs_ItemExtIEs_t));
- if((*ieExtend)->list.array[plmnidx] == NULLP)
+ DU_ALLOC(ulnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
+ if(ulnrfreq->freqBandListNr.list.array[idx] == NULLP)
{
return RFAILED;
}
}
- idx = 0;
- (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
- (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
- (*ieExtend)->list.array[idx]->extensionValue.present = \
- ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
- (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.count = 1;
- (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.size = sizeof(SliceSupportItem_t *);
- DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array,sizeof(SliceSupportItem_t *));
- if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array == NULLP)
- {
- return RFAILED;
- }
- DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId],sizeof(SliceSupportItem_t));
- if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId] == NULLP)
- {
- return RFAILED;
- }
- (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
- DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
- .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
- extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sST.size);
- if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
- .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
- {
- return RFAILED;
- }
- (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
- DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
- if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sD == NULLP)
- {
- return RFAILED;
- }
- (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
- DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
- SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
- if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sD->buf == NULLP)
- {
- return RFAILED;
- }
- sdId = 0;
- (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
- sdId++;
- (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
- sdId++;
- (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
+ ulnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
+ duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
+ freqBand[0].nrFreqBand;
+ ulnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
return ROK;
}
/*******************************************************************
*
- * @brief Builds Served PLMN
+ * @brief Builds Downlink NR Info
*
* @details
*
- * Function : BuildServedPlmn
- *
- * Functionality: Building the Served PLMN
+ * Function : BuildDLNRInfo
*
- * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
+ * Functionality: Building Downlink NR Info
+ *
+ * @params[in] NRFreqInfo_t *dlnrfreq
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
-{
- uint8_t plmnidx;
- uint8_t servPlmnCnt=1;
- uint8_t buildPlmnIdret=0;
- uint8_t BuildExtensionsret=0;
- srvplmn->list.count = servPlmnCnt;
- srvplmn->list.size = \
- servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
- DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
- if(srvplmn->list.array == NULLP)
+uint8_t BuildDLNRInfo(NRFreqInfo_t *dlnrfreq)
+{
+ uint8_t idx=0;
+ dlnrfreq->nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.\
+ fdd.dlNrFreqInfo.nrArfcn;
+ dlnrfreq->freqBandListNr.list.count = 1;
+ dlnrfreq->freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
+ DU_ALLOC(dlnrfreq->freqBandListNr.list.array,dlnrfreq->freqBandListNr.list.size);
+ if(dlnrfreq->freqBandListNr.list.array == NULLP)
{
- return RFAILED;
+ return RFAILED;
}
- for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
- {
- DU_ALLOC(srvplmn->list.array[plmnidx],\
- sizeof(ServedPLMNs_Item_t));
- if(srvplmn->list.array[plmnidx] == NULLP)
+ for(idx=0;idx< dlnrfreq->freqBandListNr.list.count;idx++)
+ {
+ DU_ALLOC(dlnrfreq->freqBandListNr.list.array[idx],sizeof(FreqBandNrItem_t));
+ if(dlnrfreq->freqBandListNr.list.array[idx] == NULLP)
{
return RFAILED;
- }
- }
- srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
- DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
- buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
- srvplmn->list.array[0]->pLMN_Identity.buf);
- if(buildPlmnIdret!= ROK)
- {
- return RFAILED;
- }
- BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
- if(BuildExtensionsret!= ROK)
- {
- return RFAILED;
- }
+ }
+ }
+ dlnrfreq->freqBandListNr.list.array[0]->freqBandIndicatorNr = \
+ duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
+ freqBand[0].nrFreqBand;
+ dlnrfreq->freqBandListNr.list.array[0]->supportedSULBandList.list.count = SUL_BAND_COUNT;
+
return ROK;
}
+
/*******************************************************************
*
- * @brief Builds Served Cell List
+ * @brief Builds NRCell ID
*
* @details
*
- * Function : BuildServedCellList
+ * Function : BuildNrCellId
*
- * Functionality: Building Served Cell List
+ * Functionality: Building the NR Cell ID
*
- * @params[in] PLMNID plmn
+ * @params[in] BIT_STRING_t *nrcell
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
+S16 BuildNrCellId(BIT_STRING_t *nrcell)
{
- uint8_t BuildNrcgiret=0;
- uint8_t BuildFiveGSTacret=0;
- uint8_t BuildServedPlmnret=0;
- uint8_t BuildNrModeret=0;
- uint8_t idx;
- uint8_t plmnidx;
- uint8_t plmnCnt=1;
- GNB_DU_Served_Cells_Item_t *srvCellItem;
- duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
- duServedCell->list.count = plmnCnt;
-
- DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
- if(duServedCell->list.array == NULLP)
- {
- return RFAILED;
- }
- for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
- {
- DU_ALLOC(duServedCell->list.array[plmnidx],\
- sizeof(GNB_DU_Served_Cells_ItemIEs_t));
- if(duServedCell->list.array[plmnidx] == NULLP)
- {
- return RFAILED;
- }
- }
- idx = 0;
- duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
- duServedCell->list.array[idx]->criticality = Criticality_reject;
- duServedCell->list.array[idx]->value.present = \
- GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
- srvCellItem = \
- &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
- /*nRCGI*/
- BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
- if(BuildNrcgiret != ROK)
- {
- return RFAILED;
- }
- /*nRPCI*/
- srvCellItem->served_Cell_Information.nRPCI = \
- duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
-
- /*fiveGS_TAC*/
- BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
- if(BuildFiveGSTacret != ROK)
- {
- return RFAILED;
- }
- /*Served PLMNs*/
- BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
- if(BuildServedPlmnret !=ROK)
- {
- return RFAILED;
- }
- /*nR Mode Info with FDD*/
- BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
- if(BuildNrModeret != ROK)
- {
- return RFAILED;
- }
- /*Measurement timing Config*/
- srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
- size = sizeof(uint8_t);
- DU_ALLOC(srvCellItem->served_Cell_Information.\
- measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
- if(srvCellItem->served_Cell_Information.\
- measurementTimingConfiguration.buf == NULLP)
- {
- return RFAILED;
- }
- srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
- duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
-
- /* GNB DU System Information */
- DU_ALLOC(srvCellItem->gNB_DU_System_Information,
- sizeof(GNB_DU_System_Information_t));
- if(!srvCellItem->gNB_DU_System_Information)
- {
- return RFAILED;
- }
- /* MIB */
- srvCellItem->gNB_DU_System_Information->mIB_message.size =\
- strlen(( char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
- DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
- srvCellItem->gNB_DU_System_Information->mIB_message.size);
- if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
- {
- return RFAILED;
- }
- strcpy((char *)srvCellItem->gNB_DU_System_Information->mIB_message.buf,
- (char *)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg);
-
- /* SIB1 */
- srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
- duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
+ memset(nrcell->buf, 0, nrcell->size);
+ nrcell->buf[4] = 16;
+ nrcell->bits_unused = 4;
+ return ROK;
+}
- DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
- srvCellItem->gNB_DU_System_Information->sIB1_message.size);
- if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
- {
- return RFAILED;
- }
- for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
- {
- srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
- duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
- }
- return ROK;
-}
/*******************************************************************
*
- * @brief Builds RRC Version
+ * @brief Builds Nrcgi
*
* @details
*
- * Function : BuildRrcVer
+ * Function : BuildNrcgi
*
- * Functionality: Building RRC Version
+ * Functionality: Building the PLMN ID and NR Cell id
*
- * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
+ * @params[in] NRCGI_t *nrcgi
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
+uint8_t BuildNrcgi(NRCGI_t *nrcgi)
{
- uint8_t rrcExt;
- uint8_t rrcLatest;
- rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
- DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
- if(rrcVer->latest_RRC_Version.buf == NULLP)
- {
- return RFAILED;
- }
- rrcVer->latest_RRC_Version.buf[0] = 0;
- rrcVer->latest_RRC_Version.bits_unused = 5;
- DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
- if(rrcVer->iE_Extensions == NULLP)
- {
- return RFAILED;
- }
- rrcVer->iE_Extensions->list.count = 1;
- rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
- DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
- if(rrcVer->iE_Extensions->list.array == NULLP)
+ uint8_t ret;
+ uint8_t byteSize = 5;
+ /* Allocate Buffer Memory */
+ nrcgi->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
+ DU_ALLOC(nrcgi->pLMN_Identity.buf, nrcgi->pLMN_Identity.size);
+ if(nrcgi->pLMN_Identity.buf == NULLP)
{
return RFAILED;
}
- rrcExt = 0;
- DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
- sizeof(RRC_Version_ExtIEs_t));
- if(rrcVer->iE_Extensions->list.array[0] == NULLP)
+ ret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
+ nrcgi->pLMN_Identity.buf); // Building PLMN function
+ if(ret != ROK)
{
return RFAILED;
}
- rrcVer->iE_Extensions->list.array[rrcExt]->id = \
- ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
- rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
- rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
- RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
- rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
- .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
- DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
- .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
- array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
- if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
- .Latest_RRC_Version_Enhanced.buf == NULLP)
+ /*nrCellIdentity*/
+ nrcgi->nRCellIdentity.size = byteSize * sizeof(uint8_t);
+ DU_ALLOC(nrcgi->nRCellIdentity.buf, nrcgi->nRCellIdentity.size);
+ if(nrcgi->nRCellIdentity.buf == NULLP)
{
return RFAILED;
}
- rrcLatest = 0;
- rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
- Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
- rrcLatest++;
- rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
- Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
- rrcLatest++;
- rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
- Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
+ BuildNrCellId(&nrcgi->nRCellIdentity);
+
return ROK;
}
/*******************************************************************
*
- * @brief Sends F1 msg over SCTP
+ * @brief Builds FiveGStac
*
* @details
*
- * Function : SendF1APMsg
+ * Function : BuildFiveGSTac
*
- * Functionality: Sends F1 msg over SCTP
+ * Functionality: Building the FiveGSTac
*
- * @params[in] Region region
- * Pool pool
+ * @params[in] OCTET_STRING_t *fivegsTac
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t SendF1APMsg(Region region, Pool pool)
+uint8_t BuildFiveGSTac(Served_Cell_Information_t *servcell)
{
- Buffer *mBuf = NULLP;
-
- if(ODU_GET_MSG_BUF(region, pool, &mBuf) == ROK)
+ DU_ALLOC(servcell->fiveGS_TAC,sizeof(FiveGS_TAC_t));
+ if(servcell->fiveGS_TAC == NULLP)
{
- if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
- {
- ODU_PRINT_MSG(mBuf, 0,0);
-
- if(sctpSend(mBuf, F1_INTERFACE) != ROK)
- {
- DU_LOG("\nERROR --> F1AP : SCTP Send failed");
- ODU_PUT_MSG_BUF(mBuf);
- return RFAILED;
- }
- }
- else
- {
- DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
- ODU_PUT_MSG_BUF(mBuf);
- return RFAILED;
- }
- ODU_PUT_MSG_BUF(mBuf);
+ return RFAILED;
}
- else
+ servcell->fiveGS_TAC->size = 3 * sizeof(uint8_t);
+ DU_ALLOC(servcell->fiveGS_TAC->buf,\
+ sizeof(servcell->fiveGS_TAC->size));
+ if(servcell->fiveGS_TAC->buf == NULLP)
{
- DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
return RFAILED;
}
- return ROK;
-} /* SendF1APMsg */
-
+ servcell->fiveGS_TAC->buf[0] = 0;
+ servcell->fiveGS_TAC->buf[1] = 0;
+ servcell->fiveGS_TAC->buf[2] = duCfgParam.srvdCellLst[0].duCellInfo.tac;
+ return ROK;
+}
/*******************************************************************
*
- * @brief deallocating the memory of function BuildAndSendF1SetupReq()
+ * @brief Builds NR Mode
*
* @details
*
- * Function : FreeRrcVer
+ * Function : BuildNrMode
*
- * Functionality: deallocating the memory of function BuildRrcVer
+ * Functionality: Building the NR Mode
*
- * @params[in] RRC_Version_t *rrcVer
- *
- * @return void
+ * @params[in] NR_Mode_Info_t *fdd
+ * @return ROK - success
+ * RFAILED - failure
*
- *****************************************************************/
-void FreeRrcVer(RRC_Version_t *rrcVer)
+ * ****************************************************************/
+uint8_t BuildNrMode(NR_Mode_Info_t *mode)
{
- if(rrcVer->latest_RRC_Version.buf != NULLP)
+ uint8_t BuildDLNRInforet=0;
+ uint8_t BuildULNRInforet=0;
+ /* FDD Mode */
+ mode->present = NR_Mode_Info_PR_fDD;
+ if(mode->present == NR_Mode_Info_PR_fDD)
{
- if(rrcVer->iE_Extensions != NULLP)
+ DU_ALLOC(mode->choice.fDD,sizeof(FDD_Info_t));
+ if(mode->choice.fDD == NULLP)
{
- if(rrcVer->iE_Extensions->list.array != NULLP)
- {
- if(rrcVer->iE_Extensions->list.array[0] != NULLP)
- {
- if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
- != NULLP)
- {
- DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
- .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
- array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
- }
- DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
- }
- DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
- }
- DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
+ return RFAILED;
+ }
+ BuildULNRInforet = BuildULNRInfo(&mode->choice.fDD->uL_NRFreqInfo);
+ if(BuildULNRInforet != ROK)
+ {
+ return RFAILED;
+ }
+ BuildDLNRInforet = BuildDLNRInfo(&mode->choice.fDD->dL_NRFreqInfo);
+ if(BuildDLNRInforet != ROK)
+ {
+ return RFAILED;
}
- DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
}
+ mode->choice.fDD->uL_Transmission_Bandwidth.nRSCS = \
+ duCfgParam.srvdCellLst[0].duCellInfo.\
+ f1Mode.mode.fdd.ulTxBw.nrScs;
+ mode->choice.fDD->uL_Transmission_Bandwidth.nRNRB = \
+ duCfgParam.srvdCellLst[0].duCellInfo.\
+ f1Mode.mode.fdd.ulTxBw.nrb;
+ mode->choice.fDD->dL_Transmission_Bandwidth.nRSCS = \
+ duCfgParam.srvdCellLst[0].duCellInfo.\
+ f1Mode.mode.fdd.dlTxBw.nrScs;
+ mode->choice.fDD->dL_Transmission_Bandwidth.nRNRB = \
+ duCfgParam.srvdCellLst[0].duCellInfo.\
+ f1Mode.mode.fdd.dlTxBw.nrb;
+ return ROK;
}
/*******************************************************************
*
- * @brief deallocating the memory of function BuildAndSendF1SetupReq()
+ * @brief Builds IE Extensions for Served PLMNs
*
* @details
*
- * Function : FreeServedCellList
- *
- * Functionality: deallocating the memory of function BuildServedCellList
-
+ * Function : BuildExtensions
*
- * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
+ * Functionality: Building the IE Extensions
*
- * @return void
+ * @params[in] struct ProtocolExtensionContainer_4624P3 *buildextend
+ * @return ROK - success
+ * RFAILED - failure
*
* ****************************************************************/
-void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
+uint8_t BuildExtensions(ProtocolExtensionContainer_4624P3_t **ieExtend)
{
- uint8_t plmnCnt=1;
- uint8_t servId=0;
+ uint8_t idx;
+ uint8_t plmnidx;
+ uint8_t extensionCnt=1;
uint8_t sliceId=0;
- uint8_t ieId=0;
- uint8_t extensionCnt=1;
- uint8_t plmnidx=0;
- GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
- if(duServedCell->list.array!=NULLP)
+ uint8_t sdId;
+ DU_ALLOC(*ieExtend,sizeof(ProtocolExtensionContainer_4624P3_t));
+ if((*ieExtend) == NULLP)
{
- if(duServedCell->list.array[0]!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
- {
- if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
- extensionValue.choice.SliceSupportList.list.array!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
- extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
- extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
- extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
- list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
- freqBandListNr.list.array!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
- freqBandListNr.list.array[0]!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
- freqBandListNr.list.array)
- {
- if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
- freqBandListNr.list.array[0]!=NULLP)
- {
- if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
- {
- if(!srvCellItem->gNB_DU_System_Information)
- {
- if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
- {
- if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
- {
- DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
- srvCellItem->gNB_DU_System_Information->sIB1_message.size);
- DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
- srvCellItem->gNB_DU_System_Information->sIB1_message.size);
- }
- DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
- srvCellItem->gNB_DU_System_Information->mIB_message.size);
- DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
- strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
- }
- DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
- srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
- }
- DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
- freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
- freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
- }
- DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
- list.array[0],sizeof(FreqBandNrItem_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
- list.array,sizeof(FreqBandNrItem_t*));
- }
- DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
- iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
- sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
- list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
- iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
- list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
- iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
- sNSSAI.sST.buf,sizeof(uint8_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
- extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
- extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
- array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
- array[servId]->iE_Extensions->list.array,\
- extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
- array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
- array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
- servedPLMNs.list.array[servId]->pLMN_Identity.size
- * sizeof(uint8_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
- sizeof(ServedPLMNs_Item_t *));
- }
- DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
- sizeof(ServedPLMNs_Item_t *));
- }
- DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
- sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
- }
- DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
- srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
- sizeof(uint8_t));
- }
- DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
- srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
- sizeof(uint8_t));
- }
- DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
- }
- DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
+ return RFAILED;
}
-}
-/*******************************************************************
- *
- * @brief deallocating the memory of function BuildAndSendF1SetupReq()
- *
- * @details
- *
- * Function : FreeF1SetupReq
- *
- * Functionality: deallocating the memory of function BuildAndSendF1SetupReq
- *
- * @params[in] F1AP_PDU_t *f1apMsg
- *
- * @return void
- *
- * ****************************************************************/
-void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
-{
- uint8_t ieIdx, ieIdx2;
- F1SetupRequest_t *f1SetupReq=NULLP;
-
- if(f1apMsg != NULLP)
+ (*ieExtend)->list.count = extensionCnt;
+ (*ieExtend)->list.size = \
+ extensionCnt * sizeof(ServedPLMNs_ItemExtIEs_t *);
+ DU_ALLOC((*ieExtend)->list.array,(*ieExtend)->list.size);
+ if((*ieExtend)->list.array == NULLP)
{
- if(f1apMsg->choice.initiatingMessage != NULLP)
+ return RFAILED;
+ }
+ for(plmnidx=0;plmnidx<extensionCnt;plmnidx++)
+ {
+ DU_ALLOC((*ieExtend)->list.array[plmnidx],\
+ sizeof(ServedPLMNs_ItemExtIEs_t));
+ if((*ieExtend)->list.array[plmnidx] == NULLP)
{
- f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
- if(f1SetupReq->protocolIEs.list.array != NULLP)
- {
- for(ieIdx = 0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
- {
- if(f1SetupReq->protocolIEs.list.array[ieIdx] != NULLP)
- {
- switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
- {
- case ProtocolIE_ID_id_TransactionID:
- break;
- case ProtocolIE_ID_id_gNB_DU_ID:
- DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
- break;
- case ProtocolIE_ID_id_gNB_DU_Name:
- DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf,\
- strlen((char *)duCfgParam.duName));
- break;
- case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
- FreeServedCellList(&f1SetupReq->protocolIEs.list.\
- array[ieIdx]->value.choice.GNB_DU_Served_Cells_List);
- break;
- case ProtocolIE_ID_id_GNB_DU_RRC_Version:
- FreeRrcVer(&f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version);
- break;
- default:
- DU_LOG("\nERROR --> Invalid Event Type %ld", f1SetupReq->protocolIEs.list.array[ieIdx]->id);
- break;
- }
- }
- break;
- }
- for(ieIdx2=0; ieIdx2< ieIdx; ieIdx2++)
- {
- DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx2],sizeof(F1SetupRequestIEs_t));
- }
- DU_FREE(f1SetupReq->protocolIEs.list.array,\
- f1SetupReq->protocolIEs.list.size);
- }
- DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
+ return RFAILED;
}
- DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
}
+ idx = 0;
+ (*ieExtend)->list.array[idx]->id = ProtocolIE_ID_id_TAISliceSupportList;
+ (*ieExtend)->list.array[idx]->criticality = Criticality_ignore;
+ (*ieExtend)->list.array[idx]->extensionValue.present = \
+ ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
+ (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.count = 1;
+ (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.size = sizeof(SliceSupportItem_t *);
+ DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array,sizeof(SliceSupportItem_t *));
+ if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array == NULLP)
+ {
+ return RFAILED;
+ }
+ DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId],sizeof(SliceSupportItem_t));
+ if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId] == NULLP)
+ {
+ return RFAILED;
+ }
+ (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sST.size = sizeof(uint8_t);
+ DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
+ .list.array[sliceId]->sNSSAI.sST.buf,(*ieExtend)->list.array[idx]->\
+ extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sST.size);
+ if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList\
+ .list.array[sliceId]->sNSSAI.sST.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sST.buf[0] = 3;
+ DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
+ if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sD == NULLP)
+ {
+ return RFAILED;
+ }
+ (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sD->size = 3*sizeof(uint8_t);
+ DU_ALLOC((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sD->buf,(*ieExtend)->list.array[idx]->extensionValue.choice.\
+ SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
+ if((*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sD->buf == NULLP)
+ {
+ return RFAILED;
+ }
+ sdId = 0;
+ (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sD->buf[sdId] = 3;
+ sdId++;
+ (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sD->buf[sdId] = 6;
+ sdId++;
+ (*ieExtend)->list.array[idx]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sD->buf[sdId] = 9;
+ return ROK;
}
/*******************************************************************
*
- * @brief Builds and Send the F1SetupRequest
+ * @brief Builds Served PLMN
*
* @details
*
- * Function : BuildAndSendF1SetupReq
+ * Function : BuildServedPlmn
*
- * Functionality:Fills the F1SetupRequest
+ * Functionality: Building the Served PLMN
*
+ * @params[in] GNB_DU_Served_Cells_Item_t *srvCellItem
* @return ROK - success
* RFAILED - failure
*
- ******************************************************************/
-uint8_t BuildAndSendF1SetupReq()
-{
- uint8_t ret, ieIdx, elementCnt;
- F1AP_PDU_t *f1apMsg = NULLP;
- F1SetupRequest_t *f1SetupReq=NULLP;
- GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
- RRC_Version_t *rrcVer=NULLP;
- asn_enc_rval_t encRetVal; /* Encoder return value */
- ret= RFAILED;
-
- DU_LOG("\nINFO --> F1AP : Building F1 Setup Request\n");
- do
+ * ****************************************************************/
+uint8_t BuildServedPlmn(ServedPLMNs_List_t *srvplmn)
+{
+ uint8_t plmnidx;
+ uint8_t servPlmnCnt=1;
+ uint8_t buildPlmnIdret=0;
+ uint8_t BuildExtensionsret=0;
+ srvplmn->list.count = servPlmnCnt;
+ srvplmn->list.size = \
+ servPlmnCnt*sizeof(ServedPLMNs_Item_t *);
+ DU_ALLOC(srvplmn->list.array,srvplmn->list.size);
+ if(srvplmn->list.array == NULLP)
{
- DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
- if(f1apMsg == NULLP)
- {
- break;
- }
- f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
- DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
- if(f1apMsg->choice.initiatingMessage == NULLP)
+ return RFAILED;
+ }
+ for(plmnidx=0; plmnidx<servPlmnCnt; plmnidx++)
+ {
+ DU_ALLOC(srvplmn->list.array[plmnidx],\
+ sizeof(ServedPLMNs_Item_t));
+ if(srvplmn->list.array[plmnidx] == NULLP)
{
- break;
- }
- f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
- f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
- f1apMsg->choice.initiatingMessage->value.present = \
- InitiatingMessage__value_PR_F1SetupRequest;
-
- f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
-
- elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
+ return RFAILED;
+ }
+ }
+ srvplmn->list.array[0]->pLMN_Identity.size = PLMN_SIZE * sizeof(uint8_t);
+ DU_ALLOC(srvplmn->list.array[0]->pLMN_Identity.buf, srvplmn->list.array[0]->pLMN_Identity.size);
+ buildPlmnIdret = buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
+ srvplmn->list.array[0]->pLMN_Identity.buf);
+ if(buildPlmnIdret!= ROK)
+ {
+ return RFAILED;
+ }
+ BuildExtensionsret = BuildExtensions(&srvplmn->list.array[0]->iE_Extensions);
+ if(BuildExtensionsret!= ROK)
+ {
+ return RFAILED;
+ }
+ return ROK;
+}
+/*******************************************************************
+ *
+ * @brief Builds Served Cell List
+ *
+ * @details
+ *
+ * Function : BuildServedCellList
+ *
+ * Functionality: Building Served Cell List
+ *
+ * @params[in] PLMNID plmn
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
- f1SetupReq->protocolIEs.list.count = elementCnt;
- f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
+uint8_t BuildServedCellList(GNB_DU_Served_Cells_List_t *duServedCell)
+{
+ uint8_t BuildNrcgiret=0;
+ uint8_t BuildFiveGSTacret=0;
+ uint8_t BuildServedPlmnret=0;
+ uint8_t BuildNrModeret=0;
+ uint8_t idx;
+ uint8_t plmnidx;
+ uint8_t plmnCnt=1;
+ GNB_DU_Served_Cells_Item_t *srvCellItem;
+ duServedCell->list.size = plmnCnt * sizeof(GNB_DU_Served_Cells_ItemIEs_t *);
+ duServedCell->list.count = plmnCnt;
- /* Initialize the F1Setup members */
- DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
- if(f1SetupReq->protocolIEs.list.array == NULLP)
- {
- break;
- }
- for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
+ DU_ALLOC(duServedCell->list.array, duServedCell->list.size);
+ if(duServedCell->list.array == NULLP)
+ {
+ return RFAILED;
+ }
+ for(plmnidx=0; plmnidx<plmnCnt; plmnidx++)
+ {
+ DU_ALLOC(duServedCell->list.array[plmnidx],\
+ sizeof(GNB_DU_Served_Cells_ItemIEs_t));
+ if(duServedCell->list.array[plmnidx] == NULLP)
{
- DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx],\
- sizeof(F1SetupRequestIEs_t));
- if(f1SetupReq->protocolIEs.list.array[ieIdx] == NULLP)
- {
- break;
- }
+ return RFAILED;
}
+ }
+ idx = 0;
+ duServedCell->list.array[idx]->id = ProtocolIE_ID_id_GNB_DU_Served_Cells_Item;
+ duServedCell->list.array[idx]->criticality = Criticality_reject;
+ duServedCell->list.array[idx]->value.present = \
+ GNB_DU_Served_Cells_ItemIEs__value_PR_GNB_DU_Served_Cells_Item;
+ srvCellItem = \
+ &duServedCell->list.array[idx]->value.choice.GNB_DU_Served_Cells_Item;
+ /*nRCGI*/
+ BuildNrcgiret = BuildNrcgi(&srvCellItem->served_Cell_Information.nRCGI);
+ if(BuildNrcgiret != ROK)
+ {
+ return RFAILED;
+ }
+ /*nRPCI*/
+ srvCellItem->served_Cell_Information.nRPCI = \
+ duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
- ieIdx = 0;
- /*TransactionID*/
- f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransactionID;
- f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.present =\
- F1SetupRequestIEs__value_PR_TransactionID;
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = \
- TRANS_ID;
-
- /*DU ID*/
- ieIdx++;
- f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
- f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
- F1SetupRequestIEs__value_PR_GNB_DU_ID;
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size =\
- sizeof(uint8_t);
-
- DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
- if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == \
- NULLP)
- {
- break;
- }
-
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] =\
- duCfgParam.duId;
-
- /*DU Name*/
- if(duCfgParam.duName != NULL)
- {
- ieIdx++;
- f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_Name;
- f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size =\
- strlen((char *)duCfgParam.duName);
- DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.\
- GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
- if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.\
- buf == NULLP)
- {
- break;
- }
- strcpy((char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.\
- choice.GNB_DU_Name.buf,
- (char*)&duCfgParam.duName);
-
- }
-
- /*Served Cell list */
- ieIdx++;
- f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
- ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
- f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
- F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
- duServedCell = &f1SetupReq->protocolIEs.list.\
- array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
- if(BuildServedCellList(duServedCell))
- {
- break;
- }
- /*RRC Version*/
- ieIdx++;
- f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
- ProtocolIE_ID_id_GNB_DU_RRC_Version ;
- f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
- f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
- F1SetupRequestIEs__value_PR_RRC_Version;
- rrcVer = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
- if(BuildRrcVer(rrcVer))
- {
- break;
- }
- xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
-
- /* Encode the F1SetupRequest type as APER */
- memset(encBuf, 0, ENC_BUF_MAX_LEN);
- encBufSize = 0;
- encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
- encBuf);
-
- /* Encode results */
- if(encRetVal.encoded == ENCODE_FAIL)
- {
- DU_LOG("\nERROR --> F1AP : Could not encode F1SetupRequest structure (at %s)\n",\
- encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
- break;
- }
- else
- {
- DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupRequest\n");
- for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
- {
- printf("%x",encBuf[ieIdx]);
- }
- }
-
- /* Sending msg */
- if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
- {
- DU_LOG("\nERROR --> F1AP : Sending F1 Setup request failed");
- break;
- }
-
- ret=ROK;
- break;
- }while(true);
+ /*fiveGS_TAC*/
+ BuildFiveGSTacret = BuildFiveGSTac(&srvCellItem->served_Cell_Information);
+ if(BuildFiveGSTacret != ROK)
+ {
+ return RFAILED;
+ }
+ /*Served PLMNs*/
+ BuildServedPlmnret = BuildServedPlmn(&srvCellItem->served_Cell_Information.servedPLMNs);
+ if(BuildServedPlmnret !=ROK)
+ {
+ return RFAILED;
+ }
+ /*nR Mode Info with FDD*/
+ BuildNrModeret = BuildNrMode(&srvCellItem->served_Cell_Information.nR_Mode_Info);
+ if(BuildNrModeret != ROK)
+ {
+ return RFAILED;
+ }
+ /*Measurement timing Config*/
+ srvCellItem->served_Cell_Information.measurementTimingConfiguration.\
+ size = sizeof(uint8_t);
+ DU_ALLOC(srvCellItem->served_Cell_Information.\
+ measurementTimingConfiguration.buf,srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
+ if(srvCellItem->served_Cell_Information.\
+ measurementTimingConfiguration.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf[0] = \
+ duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
- FreeF1SetupReq(f1apMsg);
+ /* GNB DU System Information */
+ DU_ALLOC(srvCellItem->gNB_DU_System_Information,
+ sizeof(GNB_DU_System_Information_t));
+ if(!srvCellItem->gNB_DU_System_Information)
+ {
+ return RFAILED;
+ }
+ /* MIB */
+ srvCellItem->gNB_DU_System_Information->mIB_message.size = duCfgParam.srvdCellLst[0].duSysInfo.mibLen;
+ DU_ALLOC(srvCellItem->gNB_DU_System_Information->mIB_message.buf,
+ srvCellItem->gNB_DU_System_Information->mIB_message.size);
+ if(!srvCellItem->gNB_DU_System_Information->mIB_message.buf)
+ {
+ return RFAILED;
+ }
+ memcpy(srvCellItem->gNB_DU_System_Information->mIB_message.buf, duCfgParam.srvdCellLst[0].duSysInfo.mibMsg, \
+ srvCellItem->gNB_DU_System_Information->mIB_message.size);
- return ret;
-}/* End of BuildAndSendF1SetupReq */
+ /* SIB1 */
+ srvCellItem->gNB_DU_System_Information->sIB1_message.size =\
+ duCfgParam.srvdCellLst[0].duSysInfo.sib1Len;
+ DU_ALLOC(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,
+ srvCellItem->gNB_DU_System_Information->sIB1_message.size);
+ if(!srvCellItem->gNB_DU_System_Information->sIB1_message.buf)
+ {
+ return RFAILED;
+ }
+ for(int x=0; x<srvCellItem->gNB_DU_System_Information->sIB1_message.size; x++)
+ {
+ srvCellItem->gNB_DU_System_Information->sIB1_message.buf[x]=\
+ duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg[x];
+ }
+ return ROK;
+}
/*******************************************************************
*
- * @brief Deallocating memory of BuildAndSendDUConfigUpdate
+ * @brief Builds RRC Version
*
* @details
*
- * Function : FreeDUConfigUpdate
+ * Function : BuildRrcVer
*
- * Functionality: Deallocating memory of variables allocated in
- * BuildAndSendDUConfigUpdate function
+ * Functionality: Building RRC Version
*
- * @params[in] F1AP_PDU_t *f1apDuCfg
+ * @params[in] int idx,int elementCnt,RRC_Version_t *rrcver
+ * @return ROK - success
+ * RFAILED - failure
*
- * @return ROK - void
+ * ****************************************************************/
+uint8_t BuildRrcVer(RRC_Version_t *rrcVer)
+{
+ uint8_t rrcExt;
+ uint8_t rrcLatest;
+ rrcVer->latest_RRC_Version.size = sizeof(uint8_t);
+ DU_ALLOC(rrcVer->latest_RRC_Version.buf,sizeof(uint8_t));
+ if(rrcVer->latest_RRC_Version.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ rrcVer->latest_RRC_Version.buf[0] = 0;
+ rrcVer->latest_RRC_Version.bits_unused = 5;
+ DU_ALLOC(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
+ if(rrcVer->iE_Extensions == NULLP)
+ {
+ return RFAILED;
+ }
+ rrcVer->iE_Extensions->list.count = 1;
+ rrcVer->iE_Extensions->list.size = sizeof(RRC_Version_ExtIEs_t *);
+ DU_ALLOC(rrcVer->iE_Extensions->list.array,rrcVer->iE_Extensions->list.size);
+ if(rrcVer->iE_Extensions->list.array == NULLP)
+ {
+ return RFAILED;
+ }
+ rrcExt = 0;
+ DU_ALLOC(rrcVer->iE_Extensions->list.array[0],\
+ sizeof(RRC_Version_ExtIEs_t));
+ if(rrcVer->iE_Extensions->list.array[0] == NULLP)
+ {
+ return RFAILED;
+ }
+ rrcVer->iE_Extensions->list.array[rrcExt]->id = \
+ ProtocolIE_ID_id_latest_RRC_Version_Enhanced;
+ rrcVer->iE_Extensions->list.array[rrcExt]->criticality = Criticality_reject;
+ rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.present =\
+ RRC_Version_ExtIEs__extensionValue_PR_Latest_RRC_Version_Enhanced;
+ rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
+ .Latest_RRC_Version_Enhanced.size = 3*sizeof(uint8_t);
+ DU_ALLOC(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
+ .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
+ array[rrcExt]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
+ if(rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice\
+ .Latest_RRC_Version_Enhanced.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ rrcLatest = 0;
+ rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
+ Latest_RRC_Version_Enhanced.buf[rrcLatest] = 15;
+ rrcLatest++;
+ rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
+ Latest_RRC_Version_Enhanced.buf[rrcLatest] = 5;
+ rrcLatest++;
+ rrcVer->iE_Extensions->list.array[rrcExt]->extensionValue.choice.\
+ Latest_RRC_Version_Enhanced.buf[rrcLatest] = 0;
+ return ROK;
+}
+/*******************************************************************
+ *
+ * @brief Sends F1 msg over SCTP
+ *
+ * @details
+ *
+ * Function : sendF1APMsg
+ *
+ * Functionality: Sends F1 msg over SCTP
+ *
+ * @params[in] Region region
+ * Pool pool
+ * @return ROK - success
+ * RFAILED - failure
*
* ****************************************************************/
-void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
+uint8_t sendF1APMsg()
{
- uint8_t i;
- uint8_t idx;
- GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
- Served_Cells_To_Modify_List_t *cellsToModify;
- Served_Cells_To_Modify_Item_t *modifyItem;
- idx=0;
- i=1;
- if(f1apDuCfg != NULLP)
+ Buffer *mBuf = NULLP;
+
+ if(ODU_GET_MSG_BUF(DU_APP_MEM_REGION, DU_POOL, &mBuf) == ROK)
{
- if(f1apDuCfg->choice.initiatingMessage != NULLP)
+ if(ODU_ADD_POST_MSG_MULT((Data *)encBuf, encBufSize, mBuf) == ROK)
{
- duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
- value.choice.GNBDUConfigurationUpdate;
- if(duCfgUpdate->protocolIEs.list.array != NULLP)
- {
- if(duCfgUpdate->protocolIEs.list.array[i] != NULLP)
- {
- cellsToModify = &duCfgUpdate->protocolIEs.list.array[i]->\
- value.choice.Served_Cells_To_Modify_List;
- if(cellsToModify->list.array != NULLP)
+ ODU_PRINT_MSG(mBuf, 0,0);
+
+ if(sctpSend(mBuf, F1_INTERFACE) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : SCTP Send failed");
+ ODU_PUT_MSG_BUF(mBuf);
+ return RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> F1AP : ODU_ADD_POST_MSG_MULT failed");
+ ODU_PUT_MSG_BUF(mBuf);
+ return RFAILED;
+ }
+ ODU_PUT_MSG_BUF(mBuf);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> F1AP : Failed to allocate memory");
+ return RFAILED;
+ }
+ return ROK;
+} /* sendF1APMsg */
+
+/*******************************************************************
+ *
+ * @brief deallocating the memory of function BuildAndSendF1SetupReq()
+ *
+ * @details
+ *
+ * Function : FreeRrcVer
+ *
+ * Functionality: deallocating the memory of function BuildRrcVer
+ *
+ * @params[in] RRC_Version_t *rrcVer
+ *
+ * @return void
+ *
+ *****************************************************************/
+void FreeRrcVer(RRC_Version_t *rrcVer)
+{
+ if(rrcVer->latest_RRC_Version.buf != NULLP)
+ {
+ if(rrcVer->iE_Extensions != NULLP)
+ {
+ if(rrcVer->iE_Extensions->list.array != NULLP)
+ {
+ if(rrcVer->iE_Extensions->list.array[0] != NULLP)
+ {
+ if(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf
+ != NULLP)
+ {
+ DU_FREE(rrcVer->iE_Extensions->list.array[0]->extensionValue.choice\
+ .Latest_RRC_Version_Enhanced.buf,rrcVer->iE_Extensions->list.\
+ array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.size);
+ }
+ DU_FREE(rrcVer->iE_Extensions->list.array[0],sizeof(RRC_Version_ExtIEs_t));
+ }
+ DU_FREE(rrcVer->iE_Extensions->list.array,sizeof(RRC_Version_ExtIEs_t*));
+ }
+ DU_FREE(rrcVer->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P81_t));
+ }
+ DU_FREE(rrcVer->latest_RRC_Version.buf,rrcVer->latest_RRC_Version.size);
+ }
+}
+/*******************************************************************
+ *
+ * @brief deallocating the memory of function BuildAndSendF1SetupReq()
+ *
+ * @details
+ *
+ * Function : FreeServedCellList
+ *
+ * Functionality: deallocating the memory of function BuildServedCellList
+
+ *
+ * @params[in] GNB_DU_Served_Cells_List_t *duServedCell
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void FreeServedCellList( GNB_DU_Served_Cells_List_t *duServedCell)
+{
+ uint8_t plmnCnt=1;
+ uint8_t servId=0;
+ uint8_t sliceId=0;
+ uint8_t ieId=0;
+ uint8_t extensionCnt=1;
+ uint8_t plmnidx=0;
+ GNB_DU_Served_Cells_Item_t *srvCellItem= &duServedCell->list.array[0]->value.choice.GNB_DU_Served_Cells_Item;
+ if(duServedCell->list.array!=NULLP)
+ {
+ if(duServedCell->list.array[0]!=NULLP)
+ {
+ if(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf!=NULLP)
+ {
+ if(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf !=NULLP)
+ {
+ if(srvCellItem->served_Cell_Information.fiveGS_TAC!=NULLP)
{
- if(cellsToModify->list.array[idx] != NULLP)
+ if(srvCellItem->served_Cell_Information.fiveGS_TAC->buf!=NULLP)
{
- modifyItem=&cellsToModify->list.array[idx]->value.choice.\
- Served_Cells_To_Modify_Item;
- if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array!=NULLP)
{
- if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[0]!=NULLP)
{
- if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->pLMN_Identity.buf!=NULLP)
{
- if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
- != NULLP)
- {
- if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
- != NULLP)
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions!=NULLP)
+ {
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array!=NULLP)
{
- if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[idx])
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]!=NULLP)
{
- if(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->pLMN_Identity.buf != NULLP)
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
+ extensionValue.choice.SliceSupportList.list.array!=NULLP)
{
- if(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->iE_Extensions!= NULLP)
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
+ extensionValue.choice.SliceSupportList.list.array[sliceId]!= NULLP)
{
- if(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->iE_Extensions->list.array != NULLP)
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
+ extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sST.buf!=NULLP)
{
- if(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->iE_Extensions->list.array[idx])
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
+ extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD!=NULLP)
{
- if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array !=NULLP)
+ if(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->\
+ list.array[0]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->buf!=NULLP)
{
- if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[idx]!=NULLP)
- {
- if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[idx]->sNSSAI.sST.buf!=NULLP)
+ if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD!=NULLP)
+ {
+ if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
+ freqBandListNr.list.array!=NULLP)
{
- if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[idx]->sNSSAI.sD != NULLP)
- {
- if(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[idx]->sNSSAI.sD->buf!=NULLP)
+ if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.\
+ freqBandListNr.list.array[0]!=NULLP)
+ {
+ if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
+ freqBandListNr.list.array)
{
- if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
- !=NULLP)
+ if(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
+ freqBandListNr.list.array[0]!=NULLP)
{
- if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
- fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
+ if(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf!=NULLP)
{
- if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
- fDD->uL_NRFreqInfo.freqBandListNr.list.array[idx]!=NULLP)
+ if(!srvCellItem->gNB_DU_System_Information)
{
- if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
- fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
+ if(srvCellItem->gNB_DU_System_Information->mIB_message.buf!=NULLP)
{
- if(modifyItem->served_Cell_Information.nR_Mode_Info.\
- choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
- array[idx]!= NULLP)
- {
- if(modifyItem->served_Cell_Information.\
- measurementTimingConfiguration.buf !=NULLP)
- {
- idx=2;
- if(duCfgUpdate->protocolIEs.list.array[idx]->value.\
- choice.GNB_DU_ID.buf!=NULLP)
- {
- DU_FREE(duCfgUpdate->protocolIEs.list.\
- array[idx]->value.choice.GNB_DU_ID.buf,\
- duCfgUpdate->protocolIEs.list.array[idx]->\
- value.choice.GNB_DU_ID.size);
- }
- idx=0;
- DU_FREE(modifyItem->served_Cell_Information.\
- measurementTimingConfiguration.\
- buf,modifyItem->served_Cell_Information.\
- measurementTimingConfiguration.size);
- }
- DU_FREE(modifyItem->served_Cell_Information.\
- nR_Mode_Info.choice.fDD->dL_NRFreqInfo.freqBandListNr.\
- list.array[idx],sizeof(FreqBandNrItem_t));
+ if(srvCellItem->gNB_DU_System_Information->sIB1_message.buf!=NULLP)
+ {
+ DU_FREE(srvCellItem->gNB_DU_System_Information->sIB1_message.buf,\
+ srvCellItem->gNB_DU_System_Information->sIB1_message.size);
+ DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.sib1Msg,\
+ srvCellItem->gNB_DU_System_Information->sIB1_message.size);
}
- DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
- .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
- modifyItem->served_Cell_Information.nR_Mode_Info.\
- choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
+ DU_FREE(srvCellItem->gNB_DU_System_Information->mIB_message.buf,\
+ srvCellItem->gNB_DU_System_Information->mIB_message.size);
+ DU_FREE(duCfgParam.srvdCellLst[0].duSysInfo.mibMsg,\
+ strlen((char*)duCfgParam.srvdCellLst[0].duSysInfo.mibMsg));
}
- DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
- choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
- array[idx],sizeof(FreqBandNrItem_t));
+ DU_FREE(srvCellItem->gNB_DU_System_Information,sizeof(GNB_DU_System_Information_t));
}
- DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
- choice.\
- fDD->uL_NRFreqInfo.freqBandListNr.list.\
- array,modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
- fDD->uL_NRFreqInfo.freqBandListNr.list.size);
+ DU_FREE(srvCellItem->served_Cell_Information.measurementTimingConfiguration.buf,\
+ srvCellItem->served_Cell_Information.measurementTimingConfiguration.size);
}
- DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
- fDD,sizeof(FDD_Info_t));
+ DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
+ freqBandListNr.list.array[0],sizeof(FreqBandNrItem_t));
}
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
- SliceSupportList.\
- list.array[idx]->sNSSAI.sD->buf,modifyItem->served_Cell_Information.\
- servedPLMNs.list.array[idx]->iE_Extensions->list.array[idx]->\
- extensionValue.choice.SliceSupportList.list.array[idx]->\
- sNSSAI.sD->size);
-
+ DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
+ freqBandListNr.list.array,sizeof(FreqBandNrItem_t *));
}
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[idx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
+ DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
+ list.array[0],sizeof(FreqBandNrItem_t));
}
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[idx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\
- servedPLMNs.\
- list.array[idx]->iE_Extensions->list.array[idx]->extensionValue.choice.\
- SliceSupportList.list.array[idx]->sNSSAI.sST.size);
+ DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD->uL_NRFreqInfo.freqBandListNr.\
+ list.array,sizeof(FreqBandNrItem_t*));
}
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array[idx],sizeof(SliceSupportItem_t));
+ DU_FREE(srvCellItem->served_Cell_Information.nR_Mode_Info.choice.fDD,sizeof(FDD_Info_t));
}
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.\
- list.array,\
- modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->\
- iE_Extensions->list.array[idx]->extensionValue.choice.SliceSupportList.list.size);
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
+ iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
+ sNSSAI.sD->buf,srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->
+ list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->sNSSAI.sD->size);
}
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
+ iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.\
+ list.array[sliceId]->sNSSAI.sD,sizeof(OCTET_STRING_t));
}
- for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->iE_Extensions->list.count;i++)
- {
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->iE_Extensions->list.array[i],\
- sizeof(ServedPLMNs_ItemExtIEs_t ));
- }
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.servedPLMNs.
- list.array[idx]->iE_Extensions->list.size);
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->\
+ iE_Extensions->list.array[ieId]->extensionValue.choice.SliceSupportList.list.array[sliceId]->\
+ sNSSAI.sST.buf,sizeof(uint8_t));
}
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
+ extensionValue.choice.SliceSupportList.list.array[sliceId],sizeof(SliceSupportItem_t));
}
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
- array[idx]->pLMN_Identity.buf,
- modifyItem->served_Cell_Information.servedPLMNs.list.array[idx]->pLMN_Identity.size);
- }
- }
- for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
- {
- if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i]
- != NULLP)
- {
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
- sizeof(ServedPLMNs_Item_t));
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[servId]->iE_Extensions->list.array[0]->\
+ extensionValue.choice.SliceSupportList.list.array,sizeof(SliceSupportItem_t*));
}
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
+ array[servId]->iE_Extensions->list.array[plmnidx],sizeof(ServedPLMNs_ItemExtIEs_t));
}
- DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
- modifyItem->served_Cell_Information.servedPLMNs.list.size);
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
+ array[servId]->iE_Extensions->list.array,\
+ extensionCnt*sizeof(ServedPLMNs_ItemExtIEs_t*));
}
- DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
- modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
+ array[servId]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
}
- DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
- modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.\
+ array[servId]->pLMN_Identity.buf,srvCellItem->served_Cell_Information.\
+ servedPLMNs.list.array[servId]->pLMN_Identity.size
+ * sizeof(uint8_t));
}
- DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
- modifyItem->oldNRCGI.nRCellIdentity.size);
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array[plmnidx],\
+ sizeof(ServedPLMNs_Item_t *));
}
- DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
- modifyItem->oldNRCGI.pLMN_Identity.size);
+ DU_FREE(srvCellItem->served_Cell_Information.servedPLMNs.list.array,\
+ sizeof(ServedPLMNs_Item_t *));
}
+ DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC->buf,\
+ sizeof(srvCellItem->served_Cell_Information.fiveGS_TAC->size));
}
- for(i=0; i<cellsToModify->list.count ;i++)
- {
- if(cellsToModify->list.array[i] != NULLP)
- {
- DU_FREE(cellsToModify->list.array[i],\
- sizeof(Served_Cells_To_Modify_ItemIEs_t));
- }
- }
- DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
- }
- }
- for(i=0;i<duCfgUpdate->protocolIEs.list.count;i++)
- {
- if(duCfgUpdate->protocolIEs.list.array[i] !=NULLP)
- {
- DU_FREE(duCfgUpdate->protocolIEs.list.array[i],\
- sizeof(GNBDUConfigurationUpdateIEs_t));
+ DU_FREE(srvCellItem->served_Cell_Information.fiveGS_TAC,sizeof(FiveGS_TAC_t));
}
+ DU_FREE(srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
+ srvCellItem->served_Cell_Information.nRCGI.nRCellIdentity.size *
+ sizeof(uint8_t));
}
- DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
+ DU_FREE(srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
+ srvCellItem->served_Cell_Information.nRCGI.pLMN_Identity.size *
+ sizeof(uint8_t));
}
- DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
+ DU_FREE(duServedCell->list.array[plmnidx],sizeof(GNB_DU_Served_Cells_ItemIEs_t));
}
- DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
+ DU_FREE(duServedCell->list.array,plmnCnt*sizeof(GNB_DU_Served_Cells_ItemIEs_t*));
}
}
-
/*******************************************************************
*
- * @brief Fills Served Plmns required in ServCellInfo IE
+ * @brief deallocating the memory of function BuildAndSendF1SetupReq()
*
* @details
*
- * Function : fillServedPlmns
+ * Function : FreeF1SetupReq
*
- * Functionality: Fills Served Plmns required in ServCellInfo IE
+ * Functionality: deallocating the memory of function BuildAndSendF1SetupReq
*
- * @params[in] Pointer to ServedPLMNs_List_t *
+ * @params[in] F1AP_PDU_t *f1apMsg
*
- * @return ROK - success
- * RFAILED - failure
+ * @return void
*
- *****************************************************************/
-
-uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn)
+ * ****************************************************************/
+void FreeF1SetupReq(F1AP_PDU_t *f1apMsg)
{
- uint8_t ieIdx, ieListCnt;
-
- servedPlmn->list.array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
- DU_ALLOC(servedPlmn->list.array[0]->pLMN_Identity.buf, servedPlmn->list.\
- array[0]->pLMN_Identity.size);
- if(servedPlmn->list.array[0]->pLMN_Identity.buf == NULLP)
- {
- return RFAILED;
- }
- buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
- servedPlmn->list.array[0]->pLMN_Identity.buf);
- DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
- if(servedPlmn->list.array[0]->iE_Extensions == NULLP)
- {
- return RFAILED;
- }
+ uint8_t ieIdx, ieIdx2;
+ F1SetupRequest_t *f1SetupReq=NULLP;
- ieListCnt=1;
- servedPlmn->list.array[0]->iE_Extensions->list.count = ieListCnt;
- servedPlmn->list.array[0]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
- DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array,servedPlmn->list.array[0]->\
- iE_Extensions->list.size);
- if(servedPlmn->list.array[0]->iE_Extensions->list.array == NULLP)
- {
- return RFAILED;
- }
- for(ieIdx=0;ieIdx<ieListCnt;ieIdx++)
+ if(f1apMsg != NULLP)
{
- DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx],\
- sizeof(ServedPLMNs_ItemExtIEs_t));
- if(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx] == NULLP)
+ if(f1apMsg->choice.initiatingMessage != NULLP)
{
- return RFAILED;
+ f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
+ if(f1SetupReq->protocolIEs.list.array != NULLP)
+ {
+ for(ieIdx = 0; ieIdx < f1SetupReq->protocolIEs.list.count; ieIdx++)
+ {
+ if(f1SetupReq->protocolIEs.list.array[ieIdx] != NULLP)
+ {
+ switch(f1SetupReq->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_TransactionID:
+ break;
+ case ProtocolIE_ID_id_gNB_DU_ID:
+ DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
+ break;
+ case ProtocolIE_ID_id_gNB_DU_Name:
+ DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.buf,\
+ strlen((char *)duCfgParam.duName));
+ break;
+ case ProtocolIE_ID_id_gNB_DU_Served_Cells_List:
+ FreeServedCellList(&f1SetupReq->protocolIEs.list.\
+ array[ieIdx]->value.choice.GNB_DU_Served_Cells_List);
+ break;
+ case ProtocolIE_ID_id_GNB_DU_RRC_Version:
+ FreeRrcVer(&f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version);
+ break;
+ default:
+ DU_LOG("\nERROR --> Invalid Event Type %ld", f1SetupReq->protocolIEs.list.array[ieIdx]->id);
+ break;
+ }
+ }
+ break;
+ }
+ for(ieIdx2=0; ieIdx2< ieIdx; ieIdx2++)
+ {
+ DU_FREE(f1SetupReq->protocolIEs.list.array[ieIdx2],sizeof(F1SetupRequestIEs_t));
+ }
+ DU_FREE(f1SetupReq->protocolIEs.list.array,\
+ f1SetupReq->protocolIEs.list.size);
+ }
+ DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
}
+ DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
}
- //plmnIeExt = servedPlmn->list.array[0]->iE_Extensions;
- servedPlmn->list.array[0]->iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
- servedPlmn->list.array[0]->iE_Extensions->list.array[0]->criticality = Criticality_ignore;
- servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.present = \
- ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
- servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.count = 1;
- servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.size = sizeof(SliceSupportItem_t *);
- DU_ALLOC(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array,servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
- if(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array == NULLP)
- {
- return RFAILED;
- }
-
- DU_ALLOC(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0],sizeof( SliceSupportItem_t));
- if(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0] == NULLP)
- {
- return RFAILED;
- }
- servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
- DU_ALLOC(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sST.buf,servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
- if(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sST.buf == NULLP)
- {
- return RFAILED;
- }
- servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sST.buf[0] = 3;
- DU_ALLOC(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
- if(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sD == NULLP)
- {
- return RFAILED;
- }
- servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
- DU_ALLOC(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sD->buf,servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sD->size);
- if(servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sD->buf == NULLP)
- {
- return RFAILED;
- }
- servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sD->buf[0] = 3;
- servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sD->buf[1] = 6;
- servedPlmn->list.array[0]->\
- iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
- list.array[0]->sNSSAI.sD->buf[2] = 9;
- return ROK;
}
-
/*******************************************************************
*
- * @brief Fills Nr Fdd Info required in ServCellInfo IE
+ * @brief Builds and Send the F1SetupRequest
*
* @details
*
- * Function : fillNrFddInfo
- *
- * Functionality: Fills Nr Fdd Info required in ServCellInfo IE
+ * Function : BuildAndSendF1SetupReq
*
- * @params[in] Pointer to NR_Mode_Info_t *
+ * Functionality:Fills the F1SetupRequest
*
* @return ROK - success
* RFAILED - failure
*
- *****************************************************************/
-
-uint8_t fillNrFddInfo(NR_Mode_Info_t *nrFdd)
+ ******************************************************************/
+uint8_t BuildAndSendF1SetupReq()
{
- nrFdd->choice.fDD->uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
- f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
- nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.count = 1;
- nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
- DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
- array, nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size);
- if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
- {
- return RFAILED;
- }
- DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0], \
- sizeof(FreqBandNrItem_t));
- if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
- {
- return RFAILED;
- }
- nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
- duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
- freqBand[0].nrFreqBand;
- nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
- nrFdd->choice.fDD->dL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
- dlNrFreqInfo.nrArfcn;
- nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.count = 1;
- nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
- DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,nrFdd->\
- choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
- if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
- {
- return RFAILED;
- }
- DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0],\
- sizeof(FreqBandNrItem_t));
- if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
+ uint8_t ret, ieIdx, elementCnt;
+ F1AP_PDU_t *f1apMsg = NULLP;
+ F1SetupRequest_t *f1SetupReq=NULLP;
+ GNB_DU_Served_Cells_List_t *duServedCell=NULLP;
+ RRC_Version_t *rrcVer=NULLP;
+ asn_enc_rval_t encRetVal; /* Encoder return value */
+ ret= RFAILED;
+
+ DU_LOG("\nINFO --> F1AP : Building F1 Setup Request\n");
+ do
{
- return RFAILED;
- }
- nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
- duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
- freqBand[0].nrFreqBand;
- nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
-
- /*Transmission Bandwidth*/
- nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
- f1Mode.mode.fdd.ulTxBw.nrScs;
- nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
- f1Mode.mode.fdd.ulTxBw.nrb;
- nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
- f1Mode.mode.fdd.dlTxBw.nrScs;
- nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
- f1Mode.mode.fdd.dlTxBw.nrb;
+ DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
+ if(f1apMsg == NULLP)
+ {
+ break;
+ }
+ f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
+ DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
+ if(f1apMsg->choice.initiatingMessage == NULLP)
+ {
+ break;
+ }
+ f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_F1Setup;
+ f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
+ f1apMsg->choice.initiatingMessage->value.present = \
+ InitiatingMessage__value_PR_F1SetupRequest;
- return ROK;
-}
+ f1SetupReq = &f1apMsg->choice.initiatingMessage->value.choice.F1SetupRequest;
-/*******************************************************************
- *
- * @brief Fills ServCellInfo IE
- *
- * @details
- *
- * Function : fillServedCellInfo
- *
- * Functionality: Fills ServCellInfo
- *
- * @params[in] Pointer to Served_Cell_Information_t *
- *
- * @return ROK - success
- * RFAILED - failure
- *
- *****************************************************************/
+ elementCnt = (duCfgParam.duName != NULL) ? 5 : 4;
-uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo)
-{
- uint8_t tmp, ieIdx, ieListCnt;
+ f1SetupReq->protocolIEs.list.count = elementCnt;
+ f1SetupReq->protocolIEs.list.size = elementCnt * sizeof(F1SetupRequestIEs_t );
- /*nRCGI*/
- srvCellInfo->nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
- DU_ALLOC(srvCellInfo->nRCGI.pLMN_Identity.buf,\
- srvCellInfo->nRCGI.pLMN_Identity.size);
- if(srvCellInfo->nRCGI.pLMN_Identity.buf == NULLP)
- {
- return RFAILED;
- }
- buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
- srvCellInfo->nRCGI.pLMN_Identity.buf);
- srvCellInfo->nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
- DU_ALLOC(srvCellInfo->nRCGI.nRCellIdentity.buf,\
- srvCellInfo->nRCGI.nRCellIdentity.size);
- if(srvCellInfo->nRCGI.nRCellIdentity.buf == NULLP)
- {
- return RFAILED;
- }
- for (tmp = 0 ; tmp < srvCellInfo->\
- nRCGI.nRCellIdentity.size-1 ; tmp++)
- {
- srvCellInfo->nRCGI.nRCellIdentity.buf[tmp] = 0;
- }
- srvCellInfo->nRCGI.nRCellIdentity.buf[4] = 16;
- srvCellInfo->nRCGI.nRCellIdentity.bits_unused =4;
+ /* Initialize the F1Setup members */
+ DU_ALLOC(f1SetupReq->protocolIEs.list.array,f1SetupReq->protocolIEs.list.size);
+ if(f1SetupReq->protocolIEs.list.array == NULLP)
+ {
+ break;
+ }
+ for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
+ {
+ DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx],\
+ sizeof(F1SetupRequestIEs_t));
+ if(f1SetupReq->protocolIEs.list.array[ieIdx] == NULLP)
+ {
+ break;
+ }
+ }
- /*nRPCI*/
- srvCellInfo->nRPCI = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
+ ieIdx = 0;
+ /*TransactionID*/
+ f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_TransactionID;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.present =\
+ F1SetupRequestIEs__value_PR_TransactionID;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = \
+ TRANS_ID;
- /*servedPLMNs*/
- ieListCnt = 1;
- srvCellInfo->servedPLMNs.list.count = ieListCnt;
- srvCellInfo->servedPLMNs.list.size = ieListCnt*sizeof(ServedPLMNs_Item_t *);
- DU_ALLOC(srvCellInfo->servedPLMNs.list.array,\
- srvCellInfo->servedPLMNs.list.size);
- if(srvCellInfo->servedPLMNs.list.array == NULLP)
- {
- return RFAILED;
- }
- for(ieIdx=0; ieIdx < ieListCnt; ieIdx++)
- {
- DU_ALLOC(srvCellInfo->servedPLMNs.list.array[ieIdx],\
- sizeof(ServedPLMNs_Item_t));
- if(srvCellInfo->servedPLMNs.list.array[ieIdx]== NULLP)
+ /*DU ID*/
+ ieIdx++;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
+ F1SetupRequestIEs__value_PR_GNB_DU_ID;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size =\
+ sizeof(uint8_t);
+
+ DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
+ if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == \
+ NULLP)
{
- return RFAILED;
+ break;
}
- }
- if(fillServedPlmns(&srvCellInfo->servedPLMNs))
- {
- return RFAILED;
- }
- /*nR Mode Info with FDD*/
- srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_fDD;
- DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.fDD,\
- sizeof(FDD_Info_t));
- if(srvCellInfo->nR_Mode_Info.choice.fDD == NULLP)
- {
- return RFAILED;
- }
- if(fillNrFddInfo(&srvCellInfo->nR_Mode_Info))
- return RFAILED;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] =\
+ duCfgParam.duId;
- /*Measurement timing Config*/
- srvCellInfo->measurementTimingConfiguration.size = sizeof(uint8_t);
- DU_ALLOC(srvCellInfo->measurementTimingConfiguration.\
- buf,srvCellInfo->measurementTimingConfiguration.size);
- if(srvCellInfo->measurementTimingConfiguration.buf == NULLP)
- {
- return RFAILED;
- }
- srvCellInfo->measurementTimingConfiguration.\
- buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
+ /*DU Name*/
+ if(duCfgParam.duName != NULL)
+ {
+ ieIdx++;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_Name;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = F1SetupRequestIEs__value_PR_GNB_DU_Name;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.size =\
+ strlen((char *)duCfgParam.duName);
+ DU_ALLOC(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.\
+ GNB_DU_Name.buf, strlen((char *)duCfgParam.duName));
+ if(f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_Name.\
+ buf == NULLP)
+ {
+ break;
+ }
+ strcpy((char*)f1SetupReq->protocolIEs.list.array[ieIdx]->value.\
+ choice.GNB_DU_Name.buf,
+ (char*)&duCfgParam.duName);
- return ROK;
-}
+ }
+
+ /*Served Cell list */
+ ieIdx++;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
+ ProtocolIE_ID_id_gNB_DU_Served_Cells_List;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
+ F1SetupRequestIEs__value_PR_GNB_DU_Served_Cells_List;
+ duServedCell = &f1SetupReq->protocolIEs.list.\
+ array[ieIdx]->value.choice.GNB_DU_Served_Cells_List;
+ if(BuildServedCellList(duServedCell))
+ {
+ break;
+ }
+ /*RRC Version*/
+ ieIdx++;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->id = \
+ ProtocolIE_ID_id_GNB_DU_RRC_Version ;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ f1SetupReq->protocolIEs.list.array[ieIdx]->value.present = \
+ F1SetupRequestIEs__value_PR_RRC_Version;
+ rrcVer = &f1SetupReq->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
+ if(BuildRrcVer(rrcVer))
+ {
+ break;
+ }
+ xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
+
+ /* Encode the F1SetupRequest type as APER */
+ memset(encBuf, 0, ENC_BUF_MAX_LEN);
+ encBufSize = 0;
+ encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
+ encBuf);
+
+ /* Encode results */
+ if(encRetVal.encoded == ENCODE_FAIL)
+ {
+ DU_LOG("\nERROR --> F1AP : Could not encode F1SetupRequest structure (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ break;
+ }
+ else
+ {
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1SetupRequest\n");
+ for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
+ {
+ printf("%x",encBuf[ieIdx]);
+ }
+ }
+
+ /* Sending msg */
+ if(sendF1APMsg() != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Sending F1 Setup request failed");
+ break;
+ }
+
+ ret=ROK;
+ break;
+ }while(true);
+
+ FreeF1SetupReq(f1apMsg);
+
+ return ret;
+}/* End of BuildAndSendF1SetupReq */
/*******************************************************************
*
- * @brief Fills ServCellToModItem IE
+ * @brief Deallocating memory allocated for Served_Cells_To_Modify_Item_t
*
* @details
*
- * Function : fillServCellToModItem
+ * Function : freeCellsToModifyItem
*
- * Functionality: Fills ServCellToModItem IE
+ * Functionality: Deallocating memory of variables allocated in
+ * BuildAndSendDUConfigUpdate function
*
- * @params[in] Pointer to Served_Cells_To_Modify_Item_t *
+ * @params[in] Served_Cells_To_Modify_Item_t *modifyItem
*
- * @return ROK - success
- * RFAILED - failure
+ * @return ROK - void
*
- *****************************************************************/
+ * ****************************************************************/
-uint8_t fillServCellToModItem(Served_Cells_To_Modify_Item_t *modifyItem)
+void freeCellsToModifyItem(Served_Cells_To_Modify_Item_t *modifyItem)
{
- uint8_t ieIdx;
-
- /*pLMN_Identity*/
- modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
- DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
- if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
- {
- return RFAILED;
- }
- buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
- modifyItem->oldNRCGI.pLMN_Identity.buf);
-
- /*nRCellIdentity*/
- modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
- DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
- modifyItem->oldNRCGI.nRCellIdentity.size);
- if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
- {
- return RFAILED;
- }
- for(ieIdx = 0; ieIdx < modifyItem->oldNRCGI.nRCellIdentity.size-1; ieIdx++)
+ uint8_t arrIdx=0,i=0;
+ if(modifyItem->oldNRCGI.pLMN_Identity.buf != NULLP)
{
- modifyItem->oldNRCGI.nRCellIdentity.buf[ieIdx] = 0;
+ if(modifyItem->oldNRCGI.nRCellIdentity.buf != NULLP)
+ {
+ if(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf != NULLP)
+ {
+ if(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf
+ != NULLP)
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.array\
+ != NULLP)
+ {
+ if(!modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx])
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->pLMN_Identity.buf != NULLP)
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->iE_Extensions!= NULLP)
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->iE_Extensions->list.array != NULLP)
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->iE_Extensions->list.array[arrIdx])
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
+ list.array !=NULLP)
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
+ list.array[arrIdx]!=NULLP)
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
+ list.array[arrIdx]->sNSSAI.sST.buf!=NULLP)
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.choice.\
+ SliceSupportList.\
+ list.array[arrIdx]->sNSSAI.sD != NULLP)
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.\
+ choice.SliceSupportList.\
+ list.array[arrIdx]->sNSSAI.sD->buf!=NULLP)
+ {
+ if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.fDD
+ !=NULLP)
+ {
+ if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
+ fDD->uL_NRFreqInfo.freqBandListNr.list.array!=NULLP)
+ {
+ if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
+ fDD->uL_NRFreqInfo.freqBandListNr.list.array[arrIdx]!=NULLP)
+ {
+ if(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
+ fDD->dL_NRFreqInfo.freqBandListNr.list.array !=NULLP)
+ {
+ if(modifyItem->served_Cell_Information.nR_Mode_Info.\
+ choice.fDD->dL_NRFreqInfo.freqBandListNr.list.\
+ array[arrIdx]!= NULLP)
+ {
+ if(modifyItem->served_Cell_Information.\
+ measurementTimingConfiguration.buf !=NULLP)
+ {
+ DU_FREE(modifyItem->served_Cell_Information.\
+ measurementTimingConfiguration.\
+ buf,modifyItem->served_Cell_Information.\
+ measurementTimingConfiguration.size);
+ }
+ DU_FREE(modifyItem->served_Cell_Information.\
+ nR_Mode_Info.choice.fDD->dL_NRFreqInfo.\
+ freqBandListNr.\
+ list.array[arrIdx],sizeof(FreqBandNrItem_t));
+ }
+ DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info\
+ .choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,\
+ modifyItem->served_Cell_Information.nR_Mode_Info.\
+ choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
+ }
+ DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
+ choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
+ array[arrIdx],sizeof(FreqBandNrItem_t));
+ }
+ DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.\
+ choice.\
+ fDD->uL_NRFreqInfo.freqBandListNr.list.\
+ array,modifyItem->served_Cell_Information.nR_Mode_Info.\
+ choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size);
+ }
+ DU_FREE(modifyItem->served_Cell_Information.nR_Mode_Info.choice.\
+ fDD,sizeof(FDD_Info_t));
+ }
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->iE_Extensions->list.array[arrIdx]->extensionValue.\
+ choice.SliceSupportList.\
+ list.array[arrIdx]->sNSSAI.sD->buf,modifyItem->\
+ served_Cell_Information.\
+ servedPLMNs.list.array[arrIdx]->iE_Extensions->list.\
+ array[arrIdx]->\
+ extensionValue.choice.SliceSupportList.list.array[arrIdx]->\
+ sNSSAI.sD->size);
+
+ }
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.choice.\
+ SliceSupportList.\
+ list.array[arrIdx]->sNSSAI.sD,sizeof(OCTET_STRING_t));
+ }
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.choice.\
+ SliceSupportList.\
+ list.array[arrIdx]->sNSSAI.sST.buf,modifyItem->served_Cell_Information.\
+ servedPLMNs.\
+ list.array[arrIdx]->iE_Extensions->list.array[arrIdx]->\
+ extensionValue.choice.\
+ SliceSupportList.list.array[arrIdx]->sNSSAI.sST.size);
+ }
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
+ list.array[arrIdx],sizeof(SliceSupportItem_t));
+ }
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.choice.SliceSupportList.\
+ list.array,\
+ modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->\
+ iE_Extensions->list.array[arrIdx]->extensionValue.choice.\
+ SliceSupportList.list.size);
+ }
+ }
+ for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->iE_Extensions->list.count;i++)
+ {
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->iE_Extensions->list.array[i],\
+ sizeof(ServedPLMNs_ItemExtIEs_t ));
+ }
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->iE_Extensions->list.array,modifyItem->served_Cell_Information.\
+ servedPLMNs.list.array[arrIdx]->iE_Extensions->list.size);
+ }
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
+ }
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.\
+ array[arrIdx]->pLMN_Identity.buf,
+ modifyItem->served_Cell_Information.servedPLMNs.list.array[arrIdx]->pLMN_Identity.size);
+ }
+ }
+ for(i=0;i<modifyItem->served_Cell_Information.servedPLMNs.list.count;i++)
+ {
+ if(modifyItem->served_Cell_Information.servedPLMNs.list.array[i]
+ != NULLP)
+ {
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array[i],\
+ sizeof(ServedPLMNs_Item_t));
+ }
+ }
+ DU_FREE(modifyItem->served_Cell_Information.servedPLMNs.list.array,\
+ modifyItem->served_Cell_Information.servedPLMNs.list.size);
+ }
+ DU_FREE(modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.buf,\
+ modifyItem->served_Cell_Information.nRCGI.nRCellIdentity.size);
+ }
+ DU_FREE(modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.buf,\
+ modifyItem->served_Cell_Information.nRCGI.pLMN_Identity.size);
+ }
+ DU_FREE(modifyItem->oldNRCGI.nRCellIdentity.buf,\
+ modifyItem->oldNRCGI.nRCellIdentity.size);
+ }
+ DU_FREE(modifyItem->oldNRCGI.pLMN_Identity.buf,\
+ modifyItem->oldNRCGI.pLMN_Identity.size);
}
- modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
- modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
-
- if(fillServedCellInfo(&modifyItem->served_Cell_Information))
- return RFAILED;
- else
- return ROK;
}
-
/*******************************************************************
*
- * @brief Builds ServCellToModList
+ * @brief Deallocating memory of BuildAndSendDUConfigUpdate
*
* @details
*
- * Function : buildServCellToModList
+ * Function : FreeDUConfigUpdate
*
- * Functionality: Builds the serv cell to Mod List
+ * Functionality: Deallocating memory of variables allocated in
+ * BuildAndSendDUConfigUpdate function
*
- * @params[in] Pointer to Served_Cells_To_Modify_List_t *
+ * @params[in] F1AP_PDU_t *f1apDuCfg
*
- * @return ROK - success
- * RFAILED - failure
+ * @return ROK - void
*
- *****************************************************************/
-
-uint8_t buildServCellToModList(Served_Cells_To_Modify_List_t *cellsToModify)
+ * ****************************************************************/
+void FreeDUConfigUpdate(F1AP_PDU_t *f1apDuCfg)
{
- uint8_t ieListCnt, ieIdx;
- Served_Cells_To_Modify_Item_t *modifyItem = NULLP;
+ uint8_t ieIdx=0, cellModifyIdx=0, cellDeleteIdx=0;
+ GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
+ Served_Cells_To_Modify_List_t *cellsToModify=NULLP;
+ Served_Cells_To_Delete_List_t *cellsToDelete=NULLP;
+ Served_Cells_To_Delete_Item_t *deleteItem = NULLP;
+ Served_Cells_To_Delete_ItemIEs_t *deleteItemIe = NULLP;
- ieListCnt = 1;
- cellsToModify->list.count = ieListCnt;
- cellsToModify->list.size = ieListCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
- DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
- if(cellsToModify->list.array == NULLP)
- {
- return RFAILED;
- }
- for(ieIdx=0; ieIdx< ieListCnt; ieIdx++)
+ if(f1apDuCfg != NULLP)
{
- DU_ALLOC(cellsToModify->list.array[ieIdx],sizeof(Served_Cells_To_Modify_ItemIEs_t));
- if(cellsToModify->list.array[ieIdx] == NULLP)
+ if(f1apDuCfg->choice.initiatingMessage != NULLP)
{
- return RFAILED;
+ duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->\
+ value.choice.GNBDUConfigurationUpdate;
+ if(duCfgUpdate->protocolIEs.list.array != NULLP)
+ {
+ for(ieIdx=0; ieIdx<duCfgUpdate->protocolIEs.list.count; ieIdx++)
+ {
+ if(duCfgUpdate->protocolIEs.list.array[ieIdx] != NULLP)
+ {
+ switch(duCfgUpdate->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_Served_Cells_To_Modify_List:
+ {
+ cellsToModify = &duCfgUpdate->protocolIEs.list.array[ieIdx]->\
+ value.choice.Served_Cells_To_Modify_List;
+ if(cellsToModify->list.array != NULLP)
+ {
+ for(cellModifyIdx=0; cellModifyIdx<cellsToModify->list.count ;cellModifyIdx++)
+ {
+ if(cellsToModify->list.array[cellModifyIdx] != NULLP)
+ {
+ freeCellsToModifyItem(&cellsToModify->list.array[cellModifyIdx]->value.choice.\
+ Served_Cells_To_Modify_Item);
+ DU_FREE(cellsToModify->list.array[cellModifyIdx],\
+ sizeof(Served_Cells_To_Modify_ItemIEs_t));
+ }
+ }
+ DU_FREE(cellsToModify->list.array,cellsToModify->list.size);
+ }
+ break;
+ }
+ case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
+ {
+ cellsToDelete = &duCfgUpdate->protocolIEs.list.array[ieIdx]->\
+ value.choice.Served_Cells_To_Delete_List;
+ if(cellsToDelete->list.array != NULLP)
+ {
+ for(cellDeleteIdx=0; cellDeleteIdx<cellsToDelete->list.count ;cellDeleteIdx++)
+ {
+ if(cellsToDelete->list.array[cellDeleteIdx] != NULLP)
+ {
+ deleteItemIe = ((Served_Cells_To_Delete_ItemIEs_t*)\
+ cellsToDelete->list.array[cellDeleteIdx]);
+ deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
+ DU_FREE(deleteItem->oldNRCGI.pLMN_Identity.buf,\
+ deleteItem->oldNRCGI.pLMN_Identity.size);
+ DU_FREE(deleteItem->oldNRCGI.nRCellIdentity.buf,\
+ deleteItem->oldNRCGI.nRCellIdentity.size);
+ DU_FREE(cellsToDelete->list.array[cellDeleteIdx],\
+ sizeof(Served_Cells_To_Delete_ItemIEs_t));
+ }
+ }
+ DU_FREE(cellsToDelete->list.array,cellsToDelete->list.size);
+ }
+
+ break;
+ }
+ case GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID:
+ {
+ DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
+ break;
+ }
+ }
+ DU_FREE(duCfgUpdate->protocolIEs.list.array[ieIdx],\
+ sizeof(GNBDUConfigurationUpdateIEs_t));
+ }
+ }
+ DU_FREE(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
+ }
+ DU_FREE(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
}
+ DU_FREE(f1apDuCfg, (Size)sizeof(F1AP_PDU_t));
}
- cellsToModify->list.array[0]->id = ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
- cellsToModify->list.array[0]->criticality = Criticality_reject;
- cellsToModify->list.array[0]->value.present =\
- Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
- modifyItem=&cellsToModify->list.array[0]->value.choice.Served_Cells_To_Modify_Item;
-
- if(fillServCellToModItem(modifyItem))
- return RFAILED;
- else
- return ROK;
}
/*******************************************************************
*
- * @brief Builds and sends the DUConfigUpdate
+ * @brief Fills Served Plmns required in ServCellInfo IE
*
* @details
*
- * Function : BuildAndSendDUConfigUpdate
+ * Function : fillServedPlmns
*
- * Functionality: Constructs the DU Update message and sends
- * it to the CU through SCTP.
+ * Functionality: Fills Served Plmns required in ServCellInfo IE
*
- * @params[in] void **buf,Buffer to which encoded pattern is written into
- * @params[in] int *size,size of buffer
+ * @params[in] Pointer to ServedPLMNs_List_t *
*
* @return ROK - success
* RFAILED - failure
*
- * ****************************************************************/
-uint8_t BuildAndSendDUConfigUpdate()
+ *****************************************************************/
+
+uint8_t fillServedPlmns(ServedPLMNs_List_t *servedPlmn)
{
- uint8_t ret, ieIdx, elementCnt;
- F1AP_PDU_t *f1apDuCfg = NULLP;
- GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
- asn_enc_rval_t encRetVal; /* Encoder return value */
- memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
- ret= RFAILED;
+ uint8_t ieIdx, ieListCnt;
- while(true)
+ servedPlmn->list.array[0]->pLMN_Identity.size = 3*sizeof(uint8_t);
+ DU_ALLOC(servedPlmn->list.array[0]->pLMN_Identity.buf, servedPlmn->list.\
+ array[0]->pLMN_Identity.size);
+ if(servedPlmn->list.array[0]->pLMN_Identity.buf == NULLP)
{
- DU_LOG("\nINFO --> F1AP : Building DU config update\n");
- /* Allocate the memory for F1DuCfg */
- DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
- if(f1apDuCfg == NULLP)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- break;
- }
-
- f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
- DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
- if(f1apDuCfg->choice.initiatingMessage == NULLP)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- break;
- }
-
- f1apDuCfg->choice.initiatingMessage->procedureCode = \
- ProcedureCode_id_gNBDUConfigurationUpdate;
- f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
- f1apDuCfg->choice.initiatingMessage->value.present = \
- InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
- duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
- choice.GNBDUConfigurationUpdate;
- elementCnt = 3;
- duCfgUpdate->protocolIEs.list.count = elementCnt;
- duCfgUpdate->protocolIEs.list.size = \
- elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
-
- /* Initialize the F1Setup members */
- DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
- if(duCfgUpdate->protocolIEs.list.array == NULLP)
- {
- DU_LOG("ERROR --> F1AP : Memory allocation for F1RequestIEs failed");
- break;
- }
- for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
- {
- DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx],sizeof(GNBDUConfigurationUpdateIEs_t));
- if(duCfgUpdate->protocolIEs.list.array[ieIdx] == NULLP)
- {
- break;
- }
- }
-
- /*TransactionID*/
- ieIdx = 0;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->id=ProtocolIE_ID_id_TransactionID;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
- GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = TRANS_ID;
-
- /*Served Cell to Modify */
- ieIdx++;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
- ProtocolIE_ID_id_Served_Cells_To_Modify_List;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
- GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
- if(buildServCellToModList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
- Served_Cells_To_Modify_List))
- break;
-
- // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
- /*GNB DU ID */
- ieIdx++;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
- GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
- duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size = sizeof(uint8_t);
- DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
- duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
- if(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == NULLP)
- {
- break;
- }
- duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] = duCfgParam.duId;
-
- xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
-
- /* Encode the DU Config Update type as APER */
- memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
- encBufSize = 0;
- encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
+ return RFAILED;
+ }
+ buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.plmn[0],\
+ servedPlmn->list.array[0]->pLMN_Identity.buf);
+ DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions,sizeof(ProtocolExtensionContainer_4624P3_t));
+ if(servedPlmn->list.array[0]->iE_Extensions == NULLP)
+ {
+ return RFAILED;
+ }
- /* Checking encode results */
- if(encRetVal.encoded == ENCODE_FAIL)
- {
- DU_LOG("ERROR --> F1AP : Could not encode DUConfigUpdate structure (at %s)\n",\
- encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
- break;
- }
- else
- {
- DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DUConfigUpdate\n");
- for(ieIdx =0; ieIdx < encBufSize; ieIdx++)
- {
- printf("%x",encBuf[ieIdx]);
- }
- }
- /* Sending msg */
- if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
+ ieListCnt=1;
+ servedPlmn->list.array[0]->iE_Extensions->list.count = ieListCnt;
+ servedPlmn->list.array[0]->iE_Extensions->list.size = ieListCnt *sizeof(ServedPLMNs_ItemExtIEs_t *);
+ DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array,servedPlmn->list.array[0]->\
+ iE_Extensions->list.size);
+ if(servedPlmn->list.array[0]->iE_Extensions->list.array == NULLP)
+ {
+ return RFAILED;
+ }
+ for(ieIdx=0;ieIdx<ieListCnt;ieIdx++)
+ {
+ DU_ALLOC(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx],\
+ sizeof(ServedPLMNs_ItemExtIEs_t));
+ if(servedPlmn->list.array[0]->iE_Extensions->list.array[ieIdx] == NULLP)
{
- DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update failed");
- break;
+ return RFAILED;
}
-
- ret = ROK;
- break;
}
- FreeDUConfigUpdate(f1apDuCfg);
+ //plmnIeExt = servedPlmn->list.array[0]->iE_Extensions;
+ servedPlmn->list.array[0]->iE_Extensions->list.array[0]->id =ProtocolIE_ID_id_TAISliceSupportList;
+ servedPlmn->list.array[0]->iE_Extensions->list.array[0]->criticality = Criticality_ignore;
+ servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.present = \
+ ServedPLMNs_ItemExtIEs__extensionValue_PR_SliceSupportList;
+ servedPlmn->list.array[0]->iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.count = 1;
+ servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.size = sizeof(SliceSupportItem_t *);
+ DU_ALLOC(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array,servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.size);
+ if(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array == NULLP)
+ {
+ return RFAILED;
+ }
- return ret;
+ DU_ALLOC(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0],sizeof( SliceSupportItem_t));
+ if(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0] == NULLP)
+ {
+ return RFAILED;
+ }
+ servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sST.size = sizeof(uint8_t);
+ DU_ALLOC(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sST.buf,servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.list.array[0]->sNSSAI.sST.size);
+ if(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sST.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sST.buf[0] = 3;
+ DU_ALLOC(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sD,sizeof(OCTET_STRING_t));
+ if(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sD == NULLP)
+ {
+ return RFAILED;
+ }
+ servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sD->size = 3*sizeof(uint8_t);
+ DU_ALLOC(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sD->buf,servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sD->size);
+ if(servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sD->buf == NULLP)
+ {
+ return RFAILED;
+ }
+ servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sD->buf[0] = 3;
+ servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sD->buf[1] = 6;
+ servedPlmn->list.array[0]->\
+ iE_Extensions->list.array[0]->extensionValue.choice.SliceSupportList.\
+ list.array[0]->sNSSAI.sD->buf[2] = 9;
+ return ROK;
}
-
/*******************************************************************
*
- * @brief free the ULRRCMessageTransfer
+ * @brief Fills Nr Fdd Info required in ServCellInfo IE
*
* @details
*
- * Function : FreeULRRCMessageTransfer
+ * Function : fillNrFddInfo
*
- * Functionality: Deallocating the memory of variable allocated in
- * FreeULRRCMessageTransfer
+ * Functionality: Fills Nr Fdd Info required in ServCellInfo IE
*
- * @params[in]
+ * @params[in] Pointer to NR_Mode_Info_t *
*
- * @return ROK - void
+ * @return ROK - success
+ * RFAILED - failure
*
- ******************************************************************/
-void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
-{
- uint8_t idx1;
- ULRRCMessageTransfer_t *ulRRCMsg;
+ *****************************************************************/
- if(f1apMsg != NULLP)
- {
- if(f1apMsg->choice.initiatingMessage != NULLP)
- {
- ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
- if(ulRRCMsg->protocolIEs.list.array != NULLP)
- {
- for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
- {
- if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
- {
- if(ulRRCMsg->protocolIEs.list.array[idx1]->value.present ==
- ULRRCMessageTransferIEs__value_PR_RRCContainer)
- {
- DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
- ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
- }
- DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
- }
- }
- DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
- }
- DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
- }
- DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
+uint8_t fillNrFddInfo(NR_Mode_Info_t *nrFdd)
+{
+ nrFdd->choice.fDD->uL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.\
+ f1Mode.mode.fdd.ulNrFreqInfo.nrArfcn;
+ nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.count = 1;
+ nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t*);
+ DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.\
+ array, nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.size);
+ if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array == NULLP)
+ {
+ return RFAILED;
+ }
+ DU_ALLOC(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0], \
+ sizeof(FreqBandNrItem_t));
+ if(nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
+ {
+ return RFAILED;
+ }
+ nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
+ duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.ulNrFreqInfo.\
+ freqBand[0].nrFreqBand;
+ nrFdd->choice.fDD->uL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
+ nrFdd->choice.fDD->dL_NRFreqInfo.nRARFCN = duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.\
+ dlNrFreqInfo.nrArfcn;
+ nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.count = 1;
+ nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size = sizeof(FreqBandNrItem_t *);
+ DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array,nrFdd->\
+ choice.fDD->dL_NRFreqInfo.freqBandListNr.list.size);
+ if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array == NULLP)
+ {
+ return RFAILED;
+ }
+ DU_ALLOC(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0],\
+ sizeof(FreqBandNrItem_t));
+ if(nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0] == NULLP)
+ {
+ return RFAILED;
}
+ nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->freqBandIndicatorNr = \
+ duCfgParam.srvdCellLst[0].duCellInfo.f1Mode.mode.fdd.dlNrFreqInfo.\
+ freqBand[0].nrFreqBand;
+ nrFdd->choice.fDD->dL_NRFreqInfo.freqBandListNr.list.array[0]->supportedSULBandList.list.count=0;
+
+ /*Transmission Bandwidth*/
+ nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
+ f1Mode.mode.fdd.ulTxBw.nrScs;
+ nrFdd->choice.fDD->uL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
+ f1Mode.mode.fdd.ulTxBw.nrb;
+ nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRSCS = duCfgParam.srvdCellLst[0].duCellInfo.\
+ f1Mode.mode.fdd.dlTxBw.nrScs;
+ nrFdd->choice.fDD->dL_Transmission_Bandwidth.nRNRB = duCfgParam.srvdCellLst[0].duCellInfo.\
+ f1Mode.mode.fdd.dlTxBw.nrb;
+
+ return ROK;
}
+
/*******************************************************************
*
- * @brief Builds and sends the ULRRCMessageTransfer
+ * @brief Fills ServCellInfo IE
*
* @details
*
- * Function : BuildAndSendULRRCMessageTransfer
+ * Function : fillServedCellInfo
*
- * Functionality: Constructs the UL RRC Message Transfer and sends
- * it to the CU through SCTP.
+ * Functionality: Fills ServCellInfo
*
- * @params[in]
+ * @params[in] Pointer to Served_Cell_Information_t *
*
* @return ROK - success
* RFAILED - failure
*
- * ****************************************************************/
-uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \
- uint16_t msgLen, uint8_t *rrcMsg)
+ *****************************************************************/
+
+uint8_t fillServedCellInfo(Served_Cell_Information_t *srvCellInfo)
{
- uint8_t elementCnt =0;
- uint8_t idx1 =0;
- uint8_t idx =0;
- F1AP_PDU_t *f1apMsg = NULLP;
- ULRRCMessageTransfer_t *ulRRCMsg = NULLP;
- asn_enc_rval_t encRetVal; /* Encoder return value */
- uint8_t ret =RFAILED;
-
- memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
+ uint8_t tmp, ieIdx, ieListCnt;
- while(true)
+ /*nRCGI*/
+ srvCellInfo->nRCGI.pLMN_Identity.size =3*sizeof(uint8_t);
+ DU_ALLOC(srvCellInfo->nRCGI.pLMN_Identity.buf,\
+ srvCellInfo->nRCGI.pLMN_Identity.size);
+ if(srvCellInfo->nRCGI.pLMN_Identity.buf == NULLP)
{
- DU_LOG("\n INFO --> F1AP : Building UL RRC Message Transfer Message\n");
+ return RFAILED;
+ }
+ buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
+ srvCellInfo->nRCGI.pLMN_Identity.buf);
+ srvCellInfo->nRCGI.nRCellIdentity.size =5*sizeof(uint8_t);
+ DU_ALLOC(srvCellInfo->nRCGI.nRCellIdentity.buf,\
+ srvCellInfo->nRCGI.nRCellIdentity.size);
+ if(srvCellInfo->nRCGI.nRCellIdentity.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ for (tmp = 0 ; tmp < srvCellInfo->\
+ nRCGI.nRCellIdentity.size-1 ; tmp++)
+ {
+ srvCellInfo->nRCGI.nRCellIdentity.buf[tmp] = 0;
+ }
+ srvCellInfo->nRCGI.nRCellIdentity.buf[4] = 16;
+ srvCellInfo->nRCGI.nRCellIdentity.bits_unused =4;
- DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
- if(f1apMsg == NULLP)
- {
- DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- break;
- }
- f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
- DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
- if(f1apMsg->choice.initiatingMessage == NULLP)
- {
- DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- break;
- }
- f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_ULRRCMessageTransfer;
- f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
- f1apMsg->choice.initiatingMessage->value.present = \
- InitiatingMessage__value_PR_ULRRCMessageTransfer;
- ulRRCMsg =
- &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
- elementCnt = 4;
- ulRRCMsg->protocolIEs.list.count = elementCnt;
- ulRRCMsg->protocolIEs.list.size = \
- elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
+ /*nRPCI*/
+ srvCellInfo->nRPCI = duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrPci;
- /* Initialize the F1Setup members */
- DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
- if(ulRRCMsg->protocolIEs.list.array == NULLP)
- {
- DU_LOG(" ERROR --> F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
- break;
- }
- for(idx=0; idx<elementCnt; idx++)
+ /*servedPLMNs*/
+ ieListCnt = 1;
+ srvCellInfo->servedPLMNs.list.count = ieListCnt;
+ srvCellInfo->servedPLMNs.list.size = ieListCnt*sizeof(ServedPLMNs_Item_t *);
+ DU_ALLOC(srvCellInfo->servedPLMNs.list.array,\
+ srvCellInfo->servedPLMNs.list.size);
+ if(srvCellInfo->servedPLMNs.list.array == NULLP)
+ {
+ return RFAILED;
+ }
+ for(ieIdx=0; ieIdx < ieListCnt; ieIdx++)
+ {
+ DU_ALLOC(srvCellInfo->servedPLMNs.list.array[ieIdx],\
+ sizeof(ServedPLMNs_Item_t));
+ if(srvCellInfo->servedPLMNs.list.array[ieIdx]== NULLP)
{
- DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
- if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
- {
- break;
- }
+ return RFAILED;
}
+ }
+ if(fillServedPlmns(&srvCellInfo->servedPLMNs))
+ {
+ return RFAILED;
+ }
- idx1 = 0;
+ /*nR Mode Info with FDD*/
+ srvCellInfo->nR_Mode_Info.present = NR_Mode_Info_PR_fDD;
+ DU_ALLOC(srvCellInfo->nR_Mode_Info.choice.fDD,\
+ sizeof(FDD_Info_t));
+ if(srvCellInfo->nR_Mode_Info.choice.fDD == NULLP)
+ {
+ return RFAILED;
+ }
+ if(fillNrFddInfo(&srvCellInfo->nR_Mode_Info))
+ return RFAILED;
- /*GNB CU UE F1AP ID*/
- ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
- ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
- ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
- ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
- ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb.gnbCuUeF1apId;
+ /*Measurement timing Config*/
+ srvCellInfo->measurementTimingConfiguration.size = sizeof(uint8_t);
+ DU_ALLOC(srvCellInfo->measurementTimingConfiguration.\
+ buf,srvCellInfo->measurementTimingConfiguration.size);
+ if(srvCellInfo->measurementTimingConfiguration.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ srvCellInfo->measurementTimingConfiguration.\
+ buf[0] = duCfgParam.srvdCellLst[0].duCellInfo.measTimeCfg;
- /*GNB DU UE F1AP ID*/
- idx1++;
- ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
- ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
- ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
- ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
- ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb.gnbDuUeF1apId;
+ return ROK;
+}
- /*SRBID*/
- idx1++;
- ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
- ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
- ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
- ULRRCMessageTransferIEs__value_PR_SRBID;
- ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = lcId;
+/*******************************************************************
+ *
+ * @brief Fills ServCellToModItem IE
+ *
+ * @details
+ *
+ * Function : fillServCellToModItem
+ *
+ * Functionality: Fills ServCellToModItem IE
+ *
+ * @params[in] Pointer to Served_Cells_To_Modify_Item_t *
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ *****************************************************************/
- /*RRCContainer*/
- idx1++;
- ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCContainer;
- ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
- ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
- ULRRCMessageTransferIEs__value_PR_RRCContainer;
- ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size = msgLen;
- DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
- ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
- if(!ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
- {
- DU_LOG(" ERROR --> F1AP : Memory allocation for BuildAndSendULRRCMessageTransfer failed");
- break;
- }
- memset(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, 0, msgLen);
- memcpy(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, \
- rrcMsg, ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
-
- xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
+uint8_t fillServCellToModItem(Served_Cells_To_Modify_Item_t *modifyItem)
+{
+ uint8_t ieIdx;
- /* Encode the F1SetupRequest type as APER */
- memset(encBuf, 0, ENC_BUF_MAX_LEN);
- encBufSize = 0;
- encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
- encBuf);
- /* Encode results */
- if(encRetVal.encoded == ENCODE_FAIL)
- {
- DU_LOG( "\nERROR --> F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
- encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
- break;
- }
- else
- {
- DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
- for(int i=0; i< encBufSize; i++)
- {
- printf("%x",encBuf[i]);
- }
- }
+ /*pLMN_Identity*/
+ modifyItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
+ DU_ALLOC(modifyItem->oldNRCGI.pLMN_Identity.buf,modifyItem->oldNRCGI.pLMN_Identity.size);
+ if(modifyItem->oldNRCGI.pLMN_Identity.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
+ modifyItem->oldNRCGI.pLMN_Identity.buf);
- /* Sending msg */
- if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
- {
- DU_LOG("\nERROR --> F1AP : Sending UL RRC Message Transfer Failed");
- break;
- }
- ret = ROK;
- break;
+ /*nRCellIdentity*/
+ modifyItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
+ DU_ALLOC(modifyItem->oldNRCGI.nRCellIdentity.buf,\
+ modifyItem->oldNRCGI.nRCellIdentity.size);
+ if(modifyItem->oldNRCGI.nRCellIdentity.buf == NULLP)
+ {
+ return RFAILED;
}
- FreeULRRCMessageTransfer(f1apMsg);
+ for(ieIdx = 0; ieIdx < modifyItem->oldNRCGI.nRCellIdentity.size-1; ieIdx++)
+ {
+ modifyItem->oldNRCGI.nRCellIdentity.buf[ieIdx] = 0;
+ }
+ modifyItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
+ modifyItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
- return ret;
-}/* End of BuildAndSendULRRCMessageTransfer*/
+ if(fillServedCellInfo(&modifyItem->served_Cell_Information))
+ return RFAILED;
+ else
+ return ROK;
+}
/*******************************************************************
*
- * @brief Builds tag config
+ * @brief Builds ServCellToModList
*
* @details
*
- * Function : BuildTagConfig
+ * Function : buildServCellToModList
*
- * Functionality: Builds tag config in MacCellGroupConfig
+ * Functionality: Builds the serv cell to Mod List
*
- * @params[in] TAG_Config *tag_Config
+ * @params[in] Pointer to Served_Cells_To_Modify_List_t *
*
* @return ROK - success
* RFAILED - failure
*
- * ****************************************************************/
-uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
-{
- struct TAG_Config__tag_ToAddModList *tagList;
- uint8_t idx, elementCnt;
-
- tagConfig->tag_ToReleaseList = NULLP;
- tagConfig->tag_ToAddModList = NULLP;
- DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
- if(!tagConfig->tag_ToAddModList)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
- return RFAILED;
- }
+ *****************************************************************/
- elementCnt = 1; //ODU_VALUE_ONE;
- tagList = tagConfig->tag_ToAddModList;
- tagList->list.count = elementCnt;
- tagList->list.size = elementCnt * sizeof(struct TAG *);
+uint8_t buildServCellToModList(Served_Cells_To_Modify_List_t *cellsToModify)
+{
+ uint8_t ieListCnt, ieIdx;
+ Served_Cells_To_Modify_Item_t *modifyItem = NULLP;
- tagList->list.array = NULLP;
- DU_ALLOC(tagList->list.array, tagList->list.size);
- if(!tagList->list.array)
+ ieListCnt = 1;
+ cellsToModify->list.count = ieListCnt;
+ cellsToModify->list.size = ieListCnt*sizeof(Served_Cells_To_Modify_ItemIEs_t *);
+ DU_ALLOC(cellsToModify->list.array,cellsToModify->list.size);
+ if(cellsToModify->list.array == NULLP)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
return RFAILED;
}
-
- for(idx=0; idx<tagList->list.count; idx++)
+ for(ieIdx=0; ieIdx< ieListCnt; ieIdx++)
{
- tagList->list.array[idx] = NULLP;
- DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
- if(!tagList->list.array[idx])
+ DU_ALLOC(cellsToModify->list.array[ieIdx],sizeof(Served_Cells_To_Modify_ItemIEs_t));
+ if(cellsToModify->list.array[ieIdx] == NULLP)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
return RFAILED;
}
}
+ cellsToModify->list.array[0]->id = ProtocolIE_ID_id_Served_Cells_To_Modify_Item;
+ cellsToModify->list.array[0]->criticality = Criticality_reject;
+ cellsToModify->list.array[0]->value.present =\
+ Served_Cells_To_Modify_ItemIEs__value_PR_Served_Cells_To_Modify_Item;
+ modifyItem=&cellsToModify->list.array[0]->value.choice.Served_Cells_To_Modify_Item;
- idx = 0;
- tagList->list.array[idx]->tag_Id = TAG_ID;
- tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
-
- return ROK;
+ if(fillServCellToModItem(modifyItem))
+ return RFAILED;
+ else
+ return ROK;
}
-
/*******************************************************************
*
- * @brief Builds PHR Config
+ * @brief filling the DeleteItemList
*
* @details
*
- * Function : BuildPhrConfig
+ * Function : fillCellToDeleteItem
*
- * Functionality: Builds phrConfig in MacCellGroupConfig
+ * Functionality: Filling the DeleteItemIe
*
- * @params[in] PHR Config *
+ * @params[in] Pointer to Served_Cells_To_Delete_ItemIEs_t
*
* @return ROK - success
* RFAILED - failure
*
- * ****************************************************************/
-uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
+ *****************************************************************/
+uint8_t fillCellToDeleteItem(struct Served_Cells_To_Delete_ItemIEs *deleteItemIe)
{
+ uint8_t arrIdx;
+ Served_Cells_To_Delete_Item_t *deleteItem=NULLP;
+
+ deleteItemIe->id = ProtocolIE_ID_id_Served_Cells_To_Delete_Item;
+ deleteItemIe->criticality = Criticality_reject;
+ deleteItemIe->value.present =\
+ Served_Cells_To_Delete_ItemIEs__value_PR_Served_Cells_To_Delete_Item;
+ deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
- phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
- phrConfig->choice.setup = NULLP;
- DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
- if(!phrConfig->choice.setup)
+ /*pLMN_Identity*/
+ deleteItem->oldNRCGI.pLMN_Identity.size = 3*sizeof(uint8_t);
+ DU_ALLOC(deleteItem->oldNRCGI.pLMN_Identity.buf,deleteItem->oldNRCGI.pLMN_Identity.size);
+ if(deleteItem->oldNRCGI.pLMN_Identity.buf == NULLP)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
+ DU_LOG("ERROR --> F1AP: fillCellToDeleteItem(): Failed to allocate the memory");
return RFAILED;
}
+ buildPlmnId(duCfgParam.srvdCellLst[0].duCellInfo.cellInfo.nrCgi.plmn,\
+ deleteItem->oldNRCGI.pLMN_Identity.buf);
- phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
- phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
- phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
- phrConfig->choice.setup->multiplePHR = false;
- phrConfig->choice.setup->dummy = false;
- phrConfig->choice.setup->phr_Type2OtherCell = false;
- phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
-
+ /*nRCellIdentity*/
+ deleteItem->oldNRCGI.nRCellIdentity.size = 5*sizeof(uint8_t);
+ DU_ALLOC(deleteItem->oldNRCGI.nRCellIdentity.buf,\
+ deleteItem->oldNRCGI.nRCellIdentity.size);
+ if(deleteItem->oldNRCGI.nRCellIdentity.buf == NULLP)
+ {
+ DU_LOG("ERROR --> F1AP: fillCellToDeleteItem(): Failed to allocate the memory");
+ return RFAILED;
+ }
+ for(arrIdx = 0; arrIdx < deleteItem->oldNRCGI.nRCellIdentity.size-1; arrIdx++)
+ {
+ deleteItem->oldNRCGI.nRCellIdentity.buf[arrIdx] = 0;
+ }
+ deleteItem->oldNRCGI.nRCellIdentity.buf[4] = 16;
+ deleteItem->oldNRCGI.nRCellIdentity.bits_unused = 4;
return ROK;
-}
-
+}
/*******************************************************************
*
- * @brief Builds BSR Config
+ * @brief Builds ServCellToDeleteList
*
* @details
*
- * Function : BuildBsrConfig
+ * Function : buildServCellToDeleteList
*
- * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
+ * Functionality: Builds the serv cell to delete List
*
- * @params[in] BSR_Config *bsrConfig
+ * @params[in] Pointer to Served_Cells_To_Delete_List_t *
*
* @return ROK - success
* RFAILED - failure
*
- * ****************************************************************/
-uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
+ *****************************************************************/
+
+uint8_t buildServCellToDeleteList(Served_Cells_To_Delete_List_t *cellsToDelete)
{
- bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
- bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
- bsrConfig->logicalChannelSR_DelayTimer = NULLP;
-
+ uint8_t ieListCnt, arrIdx;
+
+ ieListCnt = 1;
+ cellsToDelete->list.count = ieListCnt;
+ cellsToDelete->list.size = ieListCnt*sizeof(Served_Cells_To_Delete_ItemIEs_t *);
+
+ DU_ALLOC(cellsToDelete->list.array,cellsToDelete->list.size);
+ if(cellsToDelete->list.array == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : buildServCellToDeleteList(): Memory allocation failed");
+ return RFAILED;
+ }
+
+ for(arrIdx=0; arrIdx< ieListCnt; arrIdx++)
+ {
+ DU_ALLOC(cellsToDelete->list.array[arrIdx],sizeof(Served_Cells_To_Delete_ItemIEs_t));
+ if(cellsToDelete->list.array[arrIdx] == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : buildServCellToDeleteList(): Memory allocation failed");
+ return RFAILED;
+ }
+ }
+
+ arrIdx=0;
+ if(fillCellToDeleteItem((Served_Cells_To_Delete_ItemIEs_t*)cellsToDelete->list.array[arrIdx]) !=ROK)
+ {
+ DU_LOG("\nERROR --> F1AP: buildServCellToDeleteList(): failed to fill Served_Cells_To_Delete_ItemIEs");
+ return RFAILED;
+ }
return ROK;
}
/*******************************************************************
*
- * @brief Builds scheduling request config
+ * @brief Builds and sends the DUConfigUpdate
*
* @details
*
- * Function : BuildSchedulingReqConfig
+ * Function : BuildAndSendDUConfigUpdate
*
- * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
+ * Functionality: Constructs the DU Update message and sends
+ * it to the CU through SCTP.
*
- * @params[in] SchedulingRequestConfig *schedulingRequestConfig
+ * @params[in] void **buf,Buffer to which encoded pattern is written into
+ * @params[in] int *size,size of buffer
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
+uint8_t BuildAndSendDUConfigUpdate(ServCellAction servCellAction)
{
- struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
- uint8_t idx, elementCnt;
-
- schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
- DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
- sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
- if(!schedulingRequestConfig->schedulingRequestToAddModList)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
- return RFAILED;
- }
-
- elementCnt = 1; //ODU_VALUE_ONE;
- schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
- schReqList->list.count = elementCnt;
- schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
+ uint8_t ret =0, ieIdx=0, elementCnt=0;
+ bool memAlloctionFailure = false;
+ F1AP_PDU_t *f1apDuCfg = NULLP;
+ GNBDUConfigurationUpdate_t *duCfgUpdate = NULLP;
+ asn_enc_rval_t encRetVal; /* Encoder return value */
+
+ memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
+ ret= RFAILED;
- schReqList->list.array = NULLP;
- DU_ALLOC(schReqList->list.array, schReqList->list.size);
- if(!schReqList->list.array)
+ while(true)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
- return RFAILED;
- }
+ DU_LOG("\nINFO --> F1AP : Building DU config update\n");
+ /* Allocate the memory for F1DuCfg */
+ DU_ALLOC(f1apDuCfg, sizeof(F1AP_PDU_t));
+ if(f1apDuCfg == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation for F1AP-PDU failed");
+ break;
+ }
- for(idx=0;idx<schReqList->list.count; idx++)
- {
- schReqList->list.array[idx] = NULLP;
- DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
- if(!schReqList->list.array[idx])
+ f1apDuCfg->present = F1AP_PDU_PR_initiatingMessage;
+ DU_ALLOC(f1apDuCfg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
+ if(f1apDuCfg->choice.initiatingMessage == NULLP)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
- return RFAILED;
+ DU_LOG("\nERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation for F1AP-PDU failed");
+ break;
}
- }
- idx = 0;
- schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
-
- schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
- DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
- if(!schReqList->list.array[idx]->sr_ProhibitTimer)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
- return RFAILED;
- }
- *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
- schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
- schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
-
- return ROK;
-}
+ f1apDuCfg->choice.initiatingMessage->procedureCode = \
+ ProcedureCode_id_gNBDUConfigurationUpdate;
+ f1apDuCfg->choice.initiatingMessage->criticality = Criticality_reject;
+ f1apDuCfg->choice.initiatingMessage->value.present = \
+ InitiatingMessage__value_PR_GNBDUConfigurationUpdate;
+ duCfgUpdate = &f1apDuCfg->choice.initiatingMessage->value.\
+ choice.GNBDUConfigurationUpdate;
+ elementCnt = 3;
+ duCfgUpdate->protocolIEs.list.count = elementCnt;
+ duCfgUpdate->protocolIEs.list.size = \
+ elementCnt * sizeof(GNBDUConfigurationUpdateIEs_t*);
-/*******************************************************************
- *
- * @brief Builds RLC Config
- *
- * @details
- *
- * Function : BuildRlcConfig
- *
- * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
- *
- * @params[in] RLC_Config *rlcConfig
- *
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
-{
+ /* Initialize the F1Setup members */
+ DU_ALLOC(duCfgUpdate->protocolIEs.list.array,duCfgUpdate->protocolIEs.list.size);
+ if(duCfgUpdate->protocolIEs.list.array == NULLP)
+ {
+ DU_LOG("ERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation failed");
+ break;
+ }
+ for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
+ {
+ DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx],sizeof(GNBDUConfigurationUpdateIEs_t));
+ if(duCfgUpdate->protocolIEs.list.array[ieIdx] == NULLP)
+ {
+ DU_LOG("ERROR --> F1AP : BuildAndSendDUConfigUpdate(): Memory allocation failed");
+ memAlloctionFailure = true;
+ break;
+ }
+ }
+
+ if(memAlloctionFailure == true)
+ {
+ break;
+ }
+ /*TransactionID*/
+ ieIdx = 0;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->id=ProtocolIE_ID_id_TransactionID;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
+ GNBDUConfigurationUpdateIEs__value_PR_TransactionID;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.TransactionID = TRANS_ID;
+
+ ieIdx++;
+ if(servCellAction == SERV_CELL_TO_MODIFY)
+ {
+ /*Served Cell to Modify */
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
+ ProtocolIE_ID_id_Served_Cells_To_Modify_List;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
+ GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Modify_List;
+ if(buildServCellToModList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
+ Served_Cells_To_Modify_List))
+ {
+ DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): failed to build ServCellToModList");
+ break;
+ }
+ }
+ else
+ {
+ /*Served Cell to Delete */
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->id = \
+ ProtocolIE_ID_id_Served_Cells_To_Delete_List;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality =Criticality_reject;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
+ GNBDUConfigurationUpdateIEs__value_PR_Served_Cells_To_Delete_List;
+ if(buildServCellToDeleteList(&duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
+ Served_Cells_To_Delete_List)!=ROK)
+ {
+ DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): failed to build ServCellToDeleteList");
+ break;
+ }
+
+ }
+ // NOTE :GNB DU SYS INFO:MIB AND SIB1 INFORMATION TO BE BUILT AND FILLED HERE
+ /*GNB DU ID */
+ ieIdx++;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_ID;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->value.present = \
+ GNBDUConfigurationUpdateIEs__value_PR_GNB_DU_ID;
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size = sizeof(uint8_t);
+ DU_ALLOC(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf,\
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.size);
+ if(duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf == NULLP)
+ {
+ DU_LOG("ERROR --> DU APP : BuildAndSendDUConfigUpdate(): Memory allocation failed for GNB_DU_ID");
+ break;
+ }
+ duCfgUpdate->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_ID.buf[0] = duCfgParam.duId;
- rlcConfig->present = RLC_Config_PR_am;
+ xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apDuCfg);
- rlcConfig->choice.am = NULLP;
- DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
- if(!rlcConfig->choice.am)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
- return RFAILED;
- }
+ /* Encode the DU Config Update type as APER */
+ memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
+ encBufSize = 0;
+ encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apDuCfg, PrepFinalEncBuf, encBuf);
- /* UL */
- rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
- DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
- if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
- return RFAILED;
- }
- *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
- rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
- rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
- rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
- rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
+ /* Checking encode results */
+ if(encRetVal.encoded == ENCODE_FAIL)
+ {
+ DU_LOG("ERROR --> F1AP : Could not encode DUConfigUpdate structure (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ break;
+ }
+ else
+ {
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for DUConfigUpdate\n");
+ for(ieIdx =0; ieIdx < encBufSize; ieIdx++)
+ {
+ printf("%x",encBuf[ieIdx]);
+ }
+ }
+ /* Sending msg */
+ if(sendF1APMsg() != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Sending GNB-DU Config Update failed");
+ break;
+ }
- /* DL */
- rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
- DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
- if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
- return RFAILED;
+ ret = ROK;
+ break;
}
- *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
- rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
- rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
-
- return ROK;
+
+ addToReservedF1apPduList(TRANS_ID,f1apDuCfg);
+ return ret;
}
+
/*******************************************************************
*
- * @brief Builds MAC LC Config
+ * @brief free the ULRRCMessageTransfer
*
* @details
*
- * Function : BuildMacLCConfig
+ * Function : FreeULRRCMessageTransfer
*
- * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
+ * Functionality: Deallocating the memory of variable allocated in
+ * FreeULRRCMessageTransfer
*
- * @params[in] struct LogicalChannelConfig macLcConfig
+ * @params[in]
*
- * @return ROK - success
- * RFAILED - failure
+ * @return ROK - void
*
- * ****************************************************************/
-uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
+ ******************************************************************/
+void FreeULRRCMessageTransfer( F1AP_PDU_t *f1apMsg)
{
+ uint8_t idx1;
+ ULRRCMessageTransfer_t *ulRRCMsg;
- macLcConfig->ul_SpecificParameters = NULLP;
- DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
- if(!macLcConfig->ul_SpecificParameters)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
- return RFAILED;
- }
-
- macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
- macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
- macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
- macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
- macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
- macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
- macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
-
- macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
- DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
- if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
- return RFAILED;
- }
- *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
-
- macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
- DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
- if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
- return RFAILED;
+ if(f1apMsg != NULLP)
+ {
+ if(f1apMsg->choice.initiatingMessage != NULLP)
+ {
+ ulRRCMsg = &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
+ if(ulRRCMsg->protocolIEs.list.array != NULLP)
+ {
+ for(idx1=0;idx1<ulRRCMsg->protocolIEs.list.count;idx1++)
+ {
+ if(ulRRCMsg->protocolIEs.list.array[idx1] != NULLP)
+ {
+ if(ulRRCMsg->protocolIEs.list.array[idx1]->value.present ==
+ ULRRCMessageTransferIEs__value_PR_RRCContainer)
+ {
+ DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
+ }
+ DU_FREE(ulRRCMsg->protocolIEs.list.array[idx1],sizeof(ULRRCMessageTransferIEs_t));
+ }
+ }
+ DU_FREE(ulRRCMsg->protocolIEs.list.array,ulRRCMsg->protocolIEs.list.size );
+ }
+ DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
+ }
+ DU_FREE(f1apMsg,sizeof(F1AP_PDU_t));
}
- *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
-
- macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
- macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
- macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
-
- return ROK;
}
-
/*******************************************************************
*
- * @brief Builds RLC Bearer to Add/Mod list
+ * @brief Builds and sends the ULRRCMessageTransfer
*
* @details
*
- * Function :BuildRlcBearerToAddModList
+ * Function : BuildAndSendULRRCMessageTransfer
*
- * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
+ * Functionality: Constructs the UL RRC Message Transfer and sends
+ * it to the CU through SCTP.
*
- * @params[in] rlc_BearerToAddModList
+ * @params[in]
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
+uint8_t BuildAndSendULRRCMessageTransfer(DuUeCb ueCb, uint8_t lcId, \
+ uint16_t msgLen, uint8_t *rrcMsg)
{
- uint8_t idx, elementCnt;
+ uint8_t elementCnt =0;
+ uint8_t idx1 =0;
+ uint8_t idx =0;
+ F1AP_PDU_t *f1apMsg = NULLP;
+ ULRRCMessageTransfer_t *ulRRCMsg = NULLP;
+ asn_enc_rval_t encRetVal; /* Encoder return value */
+ uint8_t ret =RFAILED;
+
+ memset(&encRetVal, 0, sizeof(asn_enc_rval_t));
- elementCnt = 1;
- rlcBearerList->list.count = elementCnt;
- rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
+ while(true)
+ {
+ DU_LOG("\n INFO --> F1AP : Building UL RRC Message Transfer Message\n");
- rlcBearerList->list.array = NULLP;
- DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
- if(!rlcBearerList->list.array)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
- return RFAILED;
- }
+ DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
+ if(f1apMsg == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
+ break;
+ }
+ f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
+ DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
+ if(f1apMsg->choice.initiatingMessage == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
+ break;
+ }
+ f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_ULRRCMessageTransfer;
+ f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
+ f1apMsg->choice.initiatingMessage->value.present = \
+ InitiatingMessage__value_PR_ULRRCMessageTransfer;
+ ulRRCMsg =
+ &f1apMsg->choice.initiatingMessage->value.choice.ULRRCMessageTransfer;
+ elementCnt = 4;
+ ulRRCMsg->protocolIEs.list.count = elementCnt;
+ ulRRCMsg->protocolIEs.list.size = \
+ elementCnt * sizeof(ULRRCMessageTransferIEs_t *);
- for(idx=0; idx<rlcBearerList->list.count; idx++)
- {
- rlcBearerList->list.array[idx] = NULLP;
- DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
- if(!rlcBearerList->list.array[idx])
+ /* Initialize the F1Setup members */
+ DU_ALLOC(ulRRCMsg->protocolIEs.list.array, ulRRCMsg->protocolIEs.list.size);
+ if(ulRRCMsg->protocolIEs.list.array == NULLP)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
- return RFAILED;
+ DU_LOG(" ERROR --> F1AP : Memory allocation for UL RRC MessageTransferIEs failed");
+ break;
+ }
+ for(idx=0; idx<elementCnt; idx++)
+ {
+ DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx],sizeof(ULRRCMessageTransferIEs_t));
+ if(ulRRCMsg->protocolIEs.list.array[idx] == NULLP)
+ {
+ break;
+ }
}
- }
- idx = 0;
- rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID;
+ idx1 = 0;
- DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, \
- sizeof(struct RLC_BearerConfig__servedRadioBearer));
- if(!rlcBearerList->list.array[idx]->servedRadioBearer)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
- return RFAILED;
- }
+ /*GNB CU UE F1AP ID*/
+ ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
+ ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
+ ULRRCMessageTransferIEs__value_PR_GNB_CU_UE_F1AP_ID;
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = ueCb.gnbCuUeF1apId;
- rlcBearerList->list.array[idx]->servedRadioBearer->present = \
- RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
- rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = \
- SRB1_LCID;
+ /*GNB DU UE F1AP ID*/
+ idx1++;
+ ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
+ ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
+ ULRRCMessageTransferIEs__value_PR_GNB_DU_UE_F1AP_ID;
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = ueCb.gnbDuUeF1apId;
- rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
- rlcBearerList->list.array[idx]->rlc_Config = NULLP;
- DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
- if(!rlcBearerList->list.array[idx]->rlc_Config)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
- return RFAILED;
- }
+ /*SRBID*/
+ idx1++;
+ ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
+ ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
+ ULRRCMessageTransferIEs__value_PR_SRBID;
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.SRBID = lcId;
- if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
- {
- DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
- return RFAILED;
- }
+ /*RRCContainer*/
+ idx1++;
+ ulRRCMsg->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCContainer;
+ ulRRCMsg->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.present = \
+ ULRRCMessageTransferIEs__value_PR_RRCContainer;
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size = msgLen;
+ DU_ALLOC(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf,
+ ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size)
+ if(!ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for BuildAndSendULRRCMessageTransfer failed");
+ break;
+ }
+ memset(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, 0, msgLen);
+ memcpy(ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.buf, \
+ rrcMsg, ulRRCMsg->protocolIEs.list.array[idx1]->value.choice.RRCContainer.size);
- rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
- DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, \
- sizeof(struct LogicalChannelConfig));
- if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
- return RFAILED;
- }
+ xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
- if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
- {
- DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
- return RFAILED;
+ /* Encode the F1SetupRequest type as APER */
+ memset(encBuf, 0, ENC_BUF_MAX_LEN);
+ encBufSize = 0;
+ encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
+ encBuf);
+ /* Encode results */
+ if(encRetVal.encoded == ENCODE_FAIL)
+ {
+ DU_LOG( "\nERROR --> F1AP : Could not encode ULRRCMessageTransfer structure (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ break;
+ }
+ else
+ {
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for ULRRCMessageTransfer\n");
+ for(int i=0; i< encBufSize; i++)
+ {
+ printf("%x",encBuf[i]);
+ }
+ }
+
+ /* Sending msg */
+ if(sendF1APMsg() != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Sending UL RRC Message Transfer Failed");
+ break;
+ }
+ ret = ROK;
+ break;
}
+ FreeULRRCMessageTransfer(f1apMsg);
- return ROK;
-}
+ return ret;
+}/* End of BuildAndSendULRRCMessageTransfer*/
/*******************************************************************
*
- * @brief Build Control resource set to add/modify list
+ * @brief Builds tag config
*
* @details
*
- * Function : BuildControlRSetToAddModList
+ * Function : BuildTagConfig
*
- * Functionality: Build Control resource set to add/modify list
+ * Functionality: Builds tag config in MacCellGroupConfig
*
- * @params[in]
- * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
+ * @params[in] TAG_Config *tag_Config
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
- uint8_t BuildControlRSetToAddModList
-(
- struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
- )
+uint8_t BuildTagConfig(struct TAG_Config *tagConfig)
{
- uint8_t idx;
- uint8_t elementCnt;
- uint8_t numBytes, bitsUnused;
- struct ControlResourceSet *controlRSet;
- uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
- uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
+ struct TAG_Config__tag_ToAddModList *tagList;
+ uint8_t idx, elementCnt;
+ tagConfig->tag_ToReleaseList = NULLP;
+ tagConfig->tag_ToAddModList = NULLP;
+ DU_ALLOC(tagConfig->tag_ToAddModList, sizeof(struct TAG_Config__tag_ToAddModList));
+ if(!tagConfig->tag_ToAddModList)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
+ return RFAILED;
+ }
- elementCnt = 1;
- controlRSetList->list.count = elementCnt;
- controlRSetList->list.size = \
- elementCnt * sizeof(struct ControlResourceSet *);
+ elementCnt = 1; //ODU_VALUE_ONE;
+ tagList = tagConfig->tag_ToAddModList;
+ tagList->list.count = elementCnt;
+ tagList->list.size = elementCnt * sizeof(struct TAG *);
- controlRSetList->list.array = NULLP;
- DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
- if(!controlRSetList->list.array)
+ tagList->list.array = NULLP;
+ DU_ALLOC(tagList->list.array, tagList->list.size);
+ if(!tagList->list.array)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
return RFAILED;
}
- for(idx = 0; idx < elementCnt; idx++)
+ for(idx=0; idx<tagList->list.count; idx++)
{
- controlRSetList->list.array[idx] = NULLP;
- DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
- if(!controlRSetList->list.array[idx])
+ tagList->list.array[idx] = NULLP;
+ DU_ALLOC(tagList->list.array[idx], sizeof(struct TAG));
+ if(!tagList->list.array[idx])
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildTagConfig");
return RFAILED;
}
}
- idx=0;
- controlRSet = controlRSetList->list.array[idx];
+ idx = 0;
+ tagList->list.array[idx]->tag_Id = TAG_ID;
+ tagList->list.array[idx]->timeAlignmentTimer = TIME_ALIGNMENT_TMR;
- controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
+ return ROK;
+}
- /* size 6 bytes
- * 3 LSBs unsued
- * Bit string stored ff0000000000
- */
- numBytes = 6;
- bitsUnused = 3;
- controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
+/*******************************************************************
+ *
+ * @brief Builds PHR Config
+ *
+ * @details
+ *
+ * Function : BuildPhrConfig
+ *
+ * Functionality: Builds phrConfig in MacCellGroupConfig
+ *
+ * @params[in] PHR Config *
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildPhrConfig(struct MAC_CellGroupConfig__phr_Config *phrConfig)
+{
- controlRSet->frequencyDomainResources.buf = NULLP;
- DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
- controlRSet->frequencyDomainResources.size);
- if(!controlRSet->frequencyDomainResources.buf)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ phrConfig->present = MAC_CellGroupConfig__phr_Config_PR_setup;
+ phrConfig->choice.setup = NULLP;
+ DU_ALLOC(phrConfig->choice.setup, sizeof(struct PHR_Config));
+ if(!phrConfig->choice.setup)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildPhrConfig");
return RFAILED;
}
- memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
- coreset0EndPrb = CORESET0_END_PRB;
- coreset1StartPrb = coreset0EndPrb + 6;
- coreset1NumPrb = CORESET1_NUM_PRB;
- /* calculate the PRBs */
- freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
- memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
- controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
+ phrConfig->choice.setup->phr_PeriodicTimer = PHR_PERIODIC_TMR;
+ phrConfig->choice.setup->phr_ProhibitTimer = PHR_PROHIBHIT_TMR;
+ phrConfig->choice.setup->phr_Tx_PowerFactorChange = PHR_PWR_FACTOR_CHANGE;
+ phrConfig->choice.setup->multiplePHR = false;
+ phrConfig->choice.setup->dummy = false;
+ phrConfig->choice.setup->phr_Type2OtherCell = false;
+ phrConfig->choice.setup->phr_ModeOtherCG = PHR_MODE_OTHER_CG;
- controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
- controlRSet->cce_REG_MappingType.present = \
- ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
+ return ROK;
+}
- controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
- controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
- controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
- controlRSet->tci_PresentInDCI = NULLP;
-#if 0
- uint8_t tciStateIdx;
+/*******************************************************************
+ *
+ * @brief Builds BSR Config
+ *
+ * @details
+ *
+ * Function : BuildBsrConfig
+ *
+ * Functionality: Builds BuildBsrConfig in MacCellGroupConfig
+ *
+ * @params[in] BSR_Config *bsrConfig
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildBsrConfig(struct BSR_Config *bsrConfig)
+{
+ bsrConfig->periodicBSR_Timer = PERIODIC_BSR_TMR;
+ bsrConfig->retxBSR_Timer = RETX_BSR_TMR;
+ bsrConfig->logicalChannelSR_DelayTimer = NULLP;
- DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
- sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
- if(!controlRset->tci_StatesPDCCH_ToAddList)
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds scheduling request config
+ *
+ * @details
+ *
+ * Function : BuildSchedulingReqConfig
+ *
+ * Functionality: Builds BuildSchedulingReqConfig in MacCellGroupConfig
+ *
+ * @params[in] SchedulingRequestConfig *schedulingRequestConfig
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildSchedulingReqConfig(struct SchedulingRequestConfig *schedulingRequestConfig)
+{
+ struct SchedulingRequestConfig__schedulingRequestToAddModList *schReqList;
+ uint8_t idx, elementCnt;
+
+ schedulingRequestConfig->schedulingRequestToAddModList = NULLP;
+ DU_ALLOC(schedulingRequestConfig->schedulingRequestToAddModList,
+ sizeof(struct SchedulingRequestConfig__schedulingRequestToAddModList));
+ if(!schedulingRequestConfig->schedulingRequestToAddModList)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
return RFAILED;
}
- elementCnt = 1;
- controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
- controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
- DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
- controlRset->tci_StatesPDCCH_ToAddList->list.size)
- if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
- return RFAILED;
- }
+ elementCnt = 1; //ODU_VALUE_ONE;
+ schReqList = schedulingRequestConfig->schedulingRequestToAddModList;
+ schReqList->list.count = elementCnt;
+ schReqList->list.size = elementCnt * sizeof(struct SchedulingRequestToAddMod *);
- for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
+ schReqList->list.array = NULLP;
+ DU_ALLOC(schReqList->list.array, schReqList->list.size);
+ if(!schReqList->list.array)
{
- DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
- if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
+ return RFAILED;
+ }
+
+ for(idx=0;idx<schReqList->list.count; idx++)
+ {
+ schReqList->list.array[idx] = NULLP;
+ DU_ALLOC(schReqList->list.array[idx], sizeof(struct SchedulingRequestToAddMod));
+ if(!schReqList->list.array[idx])
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
return RFAILED;
}
}
- tciStateIdx = 0;
- /* TODO */
- *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
-
- DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
- if(!controlRset->tci_PresentInDCI)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
- return RFAILED;
- }
- /* TODO */
- *(controlRset->tci_PresentInDCI);
-#endif
+ idx = 0;
+ schReqList->list.array[idx]->schedulingRequestId = SCH_REQ_ID;
- controlRSet->pdcch_DMRS_ScramblingID = NULLP;
- DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
- if(!controlRSet->pdcch_DMRS_ScramblingID)
+ schReqList->list.array[idx]->sr_ProhibitTimer = NULLP;
+ DU_ALLOC(schReqList->list.array[idx]->sr_ProhibitTimer, sizeof(long));
+ if(!schReqList->list.array[idx]->sr_ProhibitTimer)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSchedulingReqConfig");
return RFAILED;
}
- *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
+ *(schReqList->list.array[idx]->sr_ProhibitTimer) = SR_PROHIBIT_TMR;
+ schReqList->list.array[idx]->sr_TransMax = SR_TRANS_MAX;
+ schedulingRequestConfig->schedulingRequestToReleaseList = NULLP;
return ROK;
-} /* End BuildControlRSetToAddModList */
+}
/*******************************************************************
*
- * @brief Build search space to add/modify list
+ * @brief Builds RLC Config
*
* @details
*
- * Function : BuildSearchSpcToAddModList
+ * Function : BuildRlcConfig
*
- * Functionality: Build search space to add/modify list
+ * Functionality: Builds RLC Config in BuildRlcBearerToAddModList
+ *
+ * @params[in] RLC_Config *rlcConfig
*
- * @params[in]
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
- uint8_t BuildSearchSpcToAddModList
-(
- struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
- )
+uint8_t BuildRlcConfig(struct RLC_Config *rlcConfig)
{
- uint8_t idx;
- uint8_t numBytes;
- uint8_t byteIdx;
- uint8_t bitsUnused;
- uint8_t elementCnt;
- struct SearchSpace *searchSpc;
- elementCnt = 1;
- searchSpcList->list.count = elementCnt;
- searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
+ rlcConfig->present = RLC_Config_PR_am;
- searchSpcList->list.array = NULLP;
- DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
- if(!searchSpcList->list.array)
+ rlcConfig->choice.am = NULLP;
+ DU_ALLOC(rlcConfig->choice.am, sizeof(struct RLC_Config__am));
+ if(!rlcConfig->choice.am)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
return RFAILED;
}
- for(idx = 0; idx < elementCnt; idx++)
- {
- searchSpcList->list.array[idx] = NULLP;
- DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
- if(!searchSpcList->list.array[idx])
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
- return RFAILED;
- }
- }
-
- idx = 0;
- searchSpc = searchSpcList->list.array[idx];
-
- searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
-
- searchSpc->controlResourceSetId = NULLP;
- DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
- if(!searchSpc->controlResourceSetId)
+ /* UL */
+ rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength = NULLP;
+ DU_ALLOC(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
+ if(!rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
return RFAILED;
}
- *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
+ *(rlcConfig->choice.am->ul_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
+ rlcConfig->choice.am->ul_AM_RLC.t_PollRetransmit = T_POLL_RETRANSMIT;
+ rlcConfig->choice.am->ul_AM_RLC.pollPDU = POLL_PDU;
+ rlcConfig->choice.am->ul_AM_RLC.pollByte = POLL_BYTE;
+ rlcConfig->choice.am->ul_AM_RLC.maxRetxThreshold = MAX_RETX_THRESHOLD;
- searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
- DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
- sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
- if(!searchSpc->monitoringSlotPeriodicityAndOffset)
+ /* DL */
+ rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength = NULLP;
+ DU_ALLOC(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength, sizeof(SN_FieldLengthAM_t));
+ if(!rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcConfig");
return RFAILED;
}
- searchSpc->monitoringSlotPeriodicityAndOffset->present = \
- SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
+ *(rlcConfig->choice.am->dl_AM_RLC.sn_FieldLength) = SN_FIELD_LEN;
+ rlcConfig->choice.am->dl_AM_RLC.t_Reassembly = T_REASSEMBLY;
+ rlcConfig->choice.am->dl_AM_RLC.t_StatusProhibit = T_STATUS_PROHIBHIT;
- searchSpc->duration = NULLP;
- searchSpc->monitoringSymbolsWithinSlot = NULLP;
- DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
- if(!searchSpc->monitoringSymbolsWithinSlot)
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds MAC LC Config
+ *
+ * @details
+ *
+ * Function : BuildMacLCConfig
+ *
+ * Functionality: Builds MAC LC Config in BuildRlcBearerToAddModList
+ *
+ * @params[in] struct LogicalChannelConfig macLcConfig
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildMacLCConfig(struct LogicalChannelConfig *macLcConfig)
+{
+
+ macLcConfig->ul_SpecificParameters = NULLP;
+ DU_ALLOC(macLcConfig->ul_SpecificParameters, sizeof(struct LogicalChannelConfig__ul_SpecificParameters));
+ if(!macLcConfig->ul_SpecificParameters)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
return RFAILED;
}
- /* Values taken from reference logs :
- * size 2 bytes
- * 2 LSBs unsued
- * Bit string stores 8000
- */
- numBytes = 2;
- bitsUnused = 2;
-
- searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
- searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
- DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
- searchSpc->monitoringSymbolsWithinSlot->size);
- if(!searchSpc->monitoringSymbolsWithinSlot->buf)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
- return RFAILED;
- }
-
- byteIdx = 0;
- searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
- PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
- searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
- searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
+ macLcConfig->ul_SpecificParameters->priority = MAC_LC_PRIORITY;
+ macLcConfig->ul_SpecificParameters->prioritisedBitRate = PRIORTISIED_BIT_RATE;
+ macLcConfig->ul_SpecificParameters->bucketSizeDuration = BUCKET_SIZE_DURATION;
+ macLcConfig->ul_SpecificParameters->allowedServingCells = NULLP;
+ macLcConfig->ul_SpecificParameters->allowedSCS_List = NULLP;
+ macLcConfig->ul_SpecificParameters->maxPUSCH_Duration = NULLP;
+ macLcConfig->ul_SpecificParameters->configuredGrantType1Allowed = NULLP;
- searchSpc->nrofCandidates = NULLP;
- DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
- if(!searchSpc->nrofCandidates)
+ macLcConfig->ul_SpecificParameters->logicalChannelGroup = NULLP;
+ DU_ALLOC(macLcConfig->ul_SpecificParameters->logicalChannelGroup, sizeof(long));
+ if(!macLcConfig->ul_SpecificParameters->logicalChannelGroup)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
return RFAILED;
}
+ *(macLcConfig->ul_SpecificParameters->logicalChannelGroup) = LC_GRP;
- searchSpc->nrofCandidates->aggregationLevel1 = \
- PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
- searchSpc->nrofCandidates->aggregationLevel2 = \
- PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
- searchSpc->nrofCandidates->aggregationLevel4 = \
- PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
- searchSpc->nrofCandidates->aggregationLevel8 = \
- PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
- searchSpc->nrofCandidates->aggregationLevel16 = \
- PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
-
- searchSpc->searchSpaceType = NULLP;
- DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
- if(!searchSpc->searchSpaceType)
+ macLcConfig->ul_SpecificParameters->schedulingRequestID = NULLP;
+ DU_ALLOC(macLcConfig->ul_SpecificParameters->schedulingRequestID, sizeof(SchedulingRequestId_t));
+ if(!macLcConfig->ul_SpecificParameters->schedulingRequestID)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildMacLCConfig");
return RFAILED;
}
+ *(macLcConfig->ul_SpecificParameters->schedulingRequestID) = SCH_REQ_ID;
- searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
-
- searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
- DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
- sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
- if(!searchSpc->searchSpaceType->choice.ue_Specific)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
- return RFAILED;
- }
- searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
- PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
+ macLcConfig->ul_SpecificParameters->logicalChannelSR_Mask = false;
+ macLcConfig->ul_SpecificParameters->logicalChannelSR_DelayTimerApplied = false;
+ macLcConfig->ul_SpecificParameters->bitRateQueryProhibitTimer = NULLP;
return ROK;
-}/* End BuildSearchSpcToAddModList */
+}
/*******************************************************************
*
- * @brief Builds BWP DL dedicated PDCCH config
+ * @brief Builds RLC Bearer to Add/Mod list
*
* @details
*
- * Function : BuildBWPDlDedPdcchCfg
+ * Function :BuildRlcBearerToAddModList
*
- * Functionality: Builds BWP DL dedicated PDCCH config
+ * Functionality: Builds RLC Bearer to Add/Mod list in DuToCuRrcContainer
*
- * @params[in] struct PDCCH_Config *pdcchCfg
+ * @params[in] rlc_BearerToAddModList
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
+uint8_t BuildRlcBearerToAddModList(struct CellGroupConfigRrc__rlc_BearerToAddModList *rlcBearerList)
{
- pdcchCfg->controlResourceSetToAddModList = NULLP;
- DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
- sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
- if(!pdcchCfg->controlResourceSetToAddModList)
+ uint8_t idx, elementCnt;
+
+ elementCnt = 1;
+ rlcBearerList->list.count = elementCnt;
+ rlcBearerList->list.size = elementCnt * sizeof(struct RLC_BearerConfig *);
+
+ rlcBearerList->list.array = NULLP;
+ DU_ALLOC(rlcBearerList->list.array, rlcBearerList->list.size);
+ if(!rlcBearerList->list.array)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
return RFAILED;
}
- if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
+ for(idx=0; idx<rlcBearerList->list.count; idx++)
{
- return RFAILED;
+ rlcBearerList->list.array[idx] = NULLP;
+ DU_ALLOC(rlcBearerList->list.array[idx], sizeof(struct RLC_BearerConfig));
+ if(!rlcBearerList->list.array[idx])
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
+ return RFAILED;
+ }
}
- pdcchCfg->controlResourceSetToReleaseList = NULLP;
+ idx = 0;
+ rlcBearerList->list.array[idx]->logicalChannelIdentity = SRB1_LCID;
- pdcchCfg->searchSpacesToAddModList = NULLP;
- DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
- sizeof(struct PDCCH_Config__searchSpacesToAddModList));
- if(!pdcchCfg->searchSpacesToAddModList)
+ DU_ALLOC(rlcBearerList->list.array[idx]->servedRadioBearer, \
+ sizeof(struct RLC_BearerConfig__servedRadioBearer));
+ if(!rlcBearerList->list.array[idx]->servedRadioBearer)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
return RFAILED;
}
- if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
+ rlcBearerList->list.array[idx]->servedRadioBearer->present = \
+ RLC_BearerConfig__servedRadioBearer_PR_srb_Identity;
+ rlcBearerList->list.array[idx]->servedRadioBearer->choice.srb_Identity = \
+ SRB1_LCID;
+
+ rlcBearerList->list.array[idx]->reestablishRLC = NULLP;
+ rlcBearerList->list.array[idx]->rlc_Config = NULLP;
+ DU_ALLOC(rlcBearerList->list.array[idx]->rlc_Config, sizeof(struct RLC_Config));
+ if(!rlcBearerList->list.array[idx]->rlc_Config)
{
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
return RFAILED;
}
- pdcchCfg->searchSpacesToReleaseList = NULLP;
- pdcchCfg->downlinkPreemption = NULLP;
- pdcchCfg->tpc_PUSCH = NULLP;
- pdcchCfg->tpc_PUCCH = NULLP;
- pdcchCfg->tpc_SRS = NULLP;
-
- return ROK;
-}
-
-/*******************************************************************
- *
- * @brief Builds DMRS DL PDSCH Mapping type A
- *
- * @details
- *
- * Function : BuildDMRSDLPdschMapTypeA
- *
- * Functionality: Builds DMRS DL PDSCH Mapping type A
- *
- * @params[in]
- * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
- uint8_t BuildDMRSDLPdschMapTypeA
-(
- struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
- )
-{
- dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
- dmrsDlCfg->choice.setup = NULLP;
- DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
- if(!dmrsDlCfg->choice.setup)
+ if(BuildRlcConfig(rlcBearerList->list.array[idx]->rlc_Config) != ROK)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
+ DU_LOG("\nERROR --> F1AP : BuildRlcConfig failed");
return RFAILED;
}
- dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
- dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
- DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
- if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
+ rlcBearerList->list.array[idx]->mac_LogicalChannelConfig = NULLP;
+ DU_ALLOC(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig, \
+ sizeof(struct LogicalChannelConfig));
+ if(!rlcBearerList->list.array[idx]->mac_LogicalChannelConfig)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildRlcBearerToAddModList");
return RFAILED;
}
- *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
-
- dmrsDlCfg->choice.setup->maxLength = NULLP;
- dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
- dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
- dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
- return ROK;
-}
+ if(BuildMacLCConfig(rlcBearerList->list.array[idx]->mac_LogicalChannelConfig) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildMacLCConfig failed");
+ return RFAILED;
+ }
-/*******************************************************************
- *
- * @brief Builds TCI states to add/modify list
- *
- * @details
- *
- * Function : BuildTCIStatesToAddModList
- *
- * Functionality:Builds TCI states to add/modify list
- *
- * @params[in]
- * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
- *
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
-{
return ROK;
}
/*******************************************************************
*
- * @brief Builds PDSCH time domain allocation list
+ * @brief Build Control resource set to add/modify list
*
* @details
*
- * Function : BuildPdschTimeDomAllocList
+ * Function : BuildControlRSetToAddModList
*
- * Functionality: Builds PDSCH time domain allocation list
+ * Functionality: Build Control resource set to add/modify list
*
* @params[in]
- * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
+ * struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
- uint8_t BuildPdschTimeDomAllocList
+ uint8_t BuildControlRSetToAddModList
(
- struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
+ struct PDCCH_Config__controlResourceSetToAddModList *controlRSetList
)
{
uint8_t idx;
uint8_t elementCnt;
- struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
-
- timeDomAllocList->present = \
- PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
+ uint8_t numBytes, bitsUnused;
+ struct ControlResourceSet *controlRSet;
+ uint8_t freqDomainResource[FREQ_DOM_RSRC_SIZE] = {0};
+ uint8_t coreset0EndPrb, coreset1StartPrb, coreset1NumPrb;
- timeDomAllocList->choice.setup = NULLP;
- DU_ALLOC(timeDomAllocList->choice.setup, \
- sizeof(struct PDSCH_TimeDomainResourceAllocationList));
- if(!timeDomAllocList->choice.setup)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
- return RFAILED;
- }
elementCnt = 1;
- timeDomAllocList->choice.setup->list.count = elementCnt;
- timeDomAllocList->choice.setup->list.size = \
- elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
+ controlRSetList->list.count = elementCnt;
+ controlRSetList->list.size = \
+ elementCnt * sizeof(struct ControlResourceSet *);
- timeDomAllocList->choice.setup->list.array = NULLP;
- DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
- timeDomAllocList->choice.setup->list.size);
- if(!timeDomAllocList->choice.setup->list.array)
+ controlRSetList->list.array = NULLP;
+ DU_ALLOC(controlRSetList->list.array, controlRSetList->list.size);
+ if(!controlRSetList->list.array)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
return RFAILED;
}
for(idx = 0; idx < elementCnt; idx++)
{
- timeDomAllocList->choice.setup->list.array[idx] = NULLP;
- DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
- sizeof(struct PDSCH_TimeDomainResourceAllocation));
- if(!timeDomAllocList->choice.setup->list.array[idx])
+ controlRSetList->list.array[idx] = NULLP;
+ DU_ALLOC(controlRSetList->list.array[idx], sizeof(struct ControlResourceSet));
+ if(!controlRSetList->list.array[idx])
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
return RFAILED;
}
}
- idx = 0;
- timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
+ idx=0;
+ controlRSet = controlRSetList->list.array[idx];
- timeDomAlloc->k0 = NULLP;
- timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
- timeDomAlloc->startSymbolAndLength = \
- calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
+ controlRSet->controlResourceSetId = PDCCH_CTRL_RSRC_SET_ONE_ID;
- return ROK;
-}
+ /* size 6 bytes
+ * 3 LSBs unsued
+ * Bit string stored ff0000000000
+ */
+ numBytes = 6;
+ bitsUnused = 3;
+ controlRSet->frequencyDomainResources.size = numBytes * sizeof(uint8_t);
-/*******************************************************************
- *
- * @brief Builds PDSCH PRB Bundling type
- *
- * @details
- *
- * Function : BuildPdschPrbBundlingType
- *
- * Functionality: Builds PDSCH PRB Bundling type
- *
- * @params[in]
- * struct PDSCH_Config__prb_BundlingType *prbBndlType
- *
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
- uint8_t BuildPdschPrbBundlingType
-(
- struct PDSCH_Config__prb_BundlingType *prbBndlType
- )
-{
- prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
+ controlRSet->frequencyDomainResources.buf = NULLP;
+ DU_ALLOC(controlRSet->frequencyDomainResources.buf, \
+ controlRSet->frequencyDomainResources.size);
+ if(!controlRSet->frequencyDomainResources.buf)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ return RFAILED;
+ }
- prbBndlType->choice.staticBundling = NULLP;
- DU_ALLOC(prbBndlType->choice.staticBundling, \
- sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
- if(!prbBndlType->choice.staticBundling)
+ memset(controlRSet->frequencyDomainResources.buf, 0, FREQ_DOM_RSRC_SIZE);
+ coreset0EndPrb = CORESET0_END_PRB;
+ coreset1StartPrb = coreset0EndPrb + 6;
+ coreset1NumPrb = CORESET1_NUM_PRB;
+ /* calculate the PRBs */
+ freqDomRscAllocType0(((coreset1StartPrb)/6), (coreset1NumPrb/6), freqDomainResource);
+ memcpy(controlRSet->frequencyDomainResources.buf, freqDomainResource, FREQ_DOM_RSRC_SIZE);
+ controlRSet->frequencyDomainResources.bits_unused = bitsUnused;
+
+ controlRSet->duration = PDCCH_CTRL_RSRC_SET_ONE_DURATION;
+ controlRSet->cce_REG_MappingType.present = \
+ ControlResourceSet__cce_REG_MappingType_PR_nonInterleaved;
+
+ controlRSet->precoderGranularity = PDCCH_CTRL_RSRC_SET_ONE_PRECOD_GRANULARITY;
+ controlRSet->tci_StatesPDCCH_ToAddList = NULLP;
+ controlRSet->tci_StatesPDCCH_ToReleaseList = NULLP;
+ controlRSet->tci_PresentInDCI = NULLP;
+#if 0
+ uint8_t tciStateIdx;
+
+ DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList, \
+ sizeof(struct ControlResourceSet__tci_StatesPDCCH_ToAddList));
+ if(!controlRset->tci_StatesPDCCH_ToAddList)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
return RFAILED;
}
- prbBndlType->choice.staticBundling->bundleSize = NULLP;
+
+ elementCnt = 1;
+ controlRset->tci_StatesPDCCH_ToAddList->list.count = elementCnt;
+ controlRset->tci_StatesPDCCH_ToAddList->list.size = elementCnt * sizeof(TCI_StateId_t *);
+ DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array, \
+ controlRset->tci_StatesPDCCH_ToAddList->list.size)
+ if(!controlRset->tci_StatesPDCCH_ToAddList->list.array)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ return RFAILED;
+ }
+
+ for(tciStateIdx = 0; tciStateIdx <elementCntl; tciStateIdx++)
+ {
+ DU_ALLOC(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx], sizeof(TCI_StateId_t));
+ if(!controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx])
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ return RFAILED;
+ }
+ }
+
+ tciStateIdx = 0;
+ /* TODO */
+ *(controlRset->tci_StatesPDCCH_ToAddList->list.array[tciStateIdx]);
+
+ DU_ALLOC(controlRset->tci_PresentInDCI, sizeof(long));
+ if(!controlRset->tci_PresentInDCI)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ return RFAILED;
+ }
+ /* TODO */
+ *(controlRset->tci_PresentInDCI);
+#endif
+
+ controlRSet->pdcch_DMRS_ScramblingID = NULLP;
+ DU_ALLOC(controlRSet->pdcch_DMRS_ScramblingID, sizeof(long));
+ if(!controlRSet->pdcch_DMRS_ScramblingID)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildControlRSetToAddModList");
+ return RFAILED;
+ }
+ *(controlRSet->pdcch_DMRS_ScramblingID) = SCRAMBLING_ID;
return ROK;
-}
+} /* End BuildControlRSetToAddModList */
/*******************************************************************
*
- * @brief Builds BWP DL dedicated PDSCH config
+ * @brief Build search space to add/modify list
*
* @details
*
- * Function : BuildBWPDlDedPdschCfg
- *
- * Functionality: Builds BWP DL dedicated PDSCH config
+ * Function : BuildSearchSpcToAddModList
*
- * @params[in] struct PDSCH_Config *pdschCfg
+ * Functionality: Build search space to add/modify list
*
+ * @params[in]
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
+ uint8_t BuildSearchSpcToAddModList
+(
+ struct PDCCH_Config__searchSpacesToAddModList *searchSpcList
+ )
{
- pdschCfg->dataScramblingIdentityPDSCH = NULLP;
+ uint8_t idx;
+ uint8_t numBytes;
+ uint8_t byteIdx;
+ uint8_t bitsUnused;
+ uint8_t elementCnt;
+ struct SearchSpace *searchSpc;
- pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
- DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
- sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
- if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
- return RFAILED;
- }
+ elementCnt = 1;
+ searchSpcList->list.count = elementCnt;
+ searchSpcList->list.size = elementCnt * sizeof(struct SearchSpace *);
- if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
+ searchSpcList->list.array = NULLP;
+ DU_ALLOC(searchSpcList->list.array, searchSpcList->list.size);
+ if(!searchSpcList->list.array)
{
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
return RFAILED;
}
- pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
- pdschCfg->tci_StatesToAddModList = NULLP;
- pdschCfg->tci_StatesToReleaseList = NULLP;
- pdschCfg->vrb_ToPRB_Interleaver = NULLP;
-#if 0
- DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
- if(!pdschCfg->tci_StatesToAddModList)
+ for(idx = 0; idx < elementCnt; idx++)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
- return RFAILED;
+ searchSpcList->list.array[idx] = NULLP;
+ DU_ALLOC(searchSpcList->list.array[idx], sizeof(struct SearchSpace));
+ if(!searchSpcList->list.array[idx])
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
+ return RFAILED;
+ }
}
- if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
+
+ idx = 0;
+ searchSpc = searchSpcList->list.array[idx];
+
+ searchSpc->searchSpaceId = PDCCH_SRCH_SPC_TWO_ID;
+
+ searchSpc->controlResourceSetId = NULLP;
+ DU_ALLOC(searchSpc->controlResourceSetId, sizeof(ControlResourceSetId_t));
+ if(!searchSpc->controlResourceSetId)
{
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
return RFAILED;
}
-#endif
-
- pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
+ *(searchSpc->controlResourceSetId) = PDCCH_CTRL_RSRC_SET_ONE_ID;
- pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
- DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
- sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
- if(!pdschCfg->pdsch_TimeDomainAllocationList)
+ searchSpc->monitoringSlotPeriodicityAndOffset = NULLP;
+ DU_ALLOC(searchSpc->monitoringSlotPeriodicityAndOffset, \
+ sizeof(struct SearchSpace__monitoringSlotPeriodicityAndOffset));
+ if(!searchSpc->monitoringSlotPeriodicityAndOffset)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
return RFAILED;
}
+ searchSpc->monitoringSlotPeriodicityAndOffset->present = \
+ SearchSpace__monitoringSlotPeriodicityAndOffset_PR_sl1;
- if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
+ searchSpc->duration = NULLP;
+ searchSpc->monitoringSymbolsWithinSlot = NULLP;
+ DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot, sizeof(BIT_STRING_t));
+ if(!searchSpc->monitoringSymbolsWithinSlot)
{
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
return RFAILED;
}
- pdschCfg->pdsch_AggregationFactor = NULLP;
- pdschCfg->rateMatchPatternToAddModList = NULLP;
- pdschCfg->rateMatchPatternToReleaseList = NULLP;
- pdschCfg->rateMatchPatternGroup1 = NULLP;
- pdschCfg->rateMatchPatternGroup2 = NULLP;
- pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
- pdschCfg->mcs_Table = NULLP;
+ /* Values taken from reference logs :
+ * size 2 bytes
+ * 2 LSBs unsued
+ * Bit string stores 8000
+ */
+ numBytes = 2;
+ bitsUnused = 2;
- pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
- DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
- if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
+ searchSpc->monitoringSymbolsWithinSlot->size = numBytes * sizeof(uint8_t);
+ searchSpc->monitoringSymbolsWithinSlot->buf = NULLP;
+ DU_ALLOC(searchSpc->monitoringSymbolsWithinSlot->buf, \
+ searchSpc->monitoringSymbolsWithinSlot->size);
+ if(!searchSpc->monitoringSymbolsWithinSlot->buf)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
return RFAILED;
}
- *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
- if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
+ byteIdx = 0;
+ searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = \
+ PDCCH_SYMBOL_WITHIN_SLOT /* setting MSB to 128 i.e. 0x80 */;
+ searchSpc->monitoringSymbolsWithinSlot->buf[byteIdx++] = 0;
+ searchSpc->monitoringSymbolsWithinSlot->bits_unused = bitsUnused;
+
+ searchSpc->nrofCandidates = NULLP;
+ DU_ALLOC(searchSpc->nrofCandidates, sizeof(struct SearchSpace__nrofCandidates));
+ if(!searchSpc->nrofCandidates)
{
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
return RFAILED;
}
- pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
- pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
- pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
- pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
- pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
- pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
- pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
+ searchSpc->nrofCandidates->aggregationLevel1 = \
+ PDCCH_SRCH_SPC_TWO_AGG_LVL1_CANDIDATE;
+ searchSpc->nrofCandidates->aggregationLevel2 = \
+ PDCCH_SRCH_SPC_TWO_AGG_LVL2_CANDIDATE;
+ searchSpc->nrofCandidates->aggregationLevel4 = \
+ PDCCH_SRCH_SPC_TWO_AGG_LVL4_CANDIDATE;
+ searchSpc->nrofCandidates->aggregationLevel8 = \
+ PDCCH_SRCH_SPC_TWO_AGG_LVL8_CANDIDATE;
+ searchSpc->nrofCandidates->aggregationLevel16 = \
+ PDCCH_SRCH_SPC_TWO_AGG_LVL16_CANDIDATE;
+
+ searchSpc->searchSpaceType = NULLP;
+ DU_ALLOC(searchSpc->searchSpaceType, sizeof(struct SearchSpace__searchSpaceType));
+ if(!searchSpc->searchSpaceType)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
+ return RFAILED;
+ }
+
+ searchSpc->searchSpaceType->present = SearchSpace__searchSpaceType_PR_ue_Specific;
+
+ searchSpc->searchSpaceType->choice.ue_Specific = NULLP;
+ DU_ALLOC(searchSpc->searchSpaceType->choice.ue_Specific, \
+ sizeof(struct SearchSpace__searchSpaceType__ue_Specific));
+ if(!searchSpc->searchSpaceType->choice.ue_Specific)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSearchSpcToAddModList");
+ return RFAILED;
+ }
+ searchSpc->searchSpaceType->choice.ue_Specific->dci_Formats = \
+ PDCCH_SRCH_SPC_TWO_UE_SPEC_DCI_FORMAT;
return ROK;
-}
+}/* End BuildSearchSpcToAddModList */
/*******************************************************************
*
- * @brief Builds intitial DL BWP
+ * @brief Builds BWP DL dedicated PDCCH config
+ *
* @details
*
- * Function : BuildInitialDlBWP
+ * Function : BuildBWPDlDedPdcchCfg
*
- * Functionality: Builds intitial DL BWP in spCellCfgDed
+ * Functionality: Builds BWP DL dedicated PDCCH config
*
- * @params[in] BWP_DownlinkDedicated_t *dlBwp
+ * @params[in] struct PDCCH_Config *pdcchCfg
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
+uint8_t BuildBWPDlDedPdcchCfg(struct PDCCH_Config *pdcchCfg)
{
- dlBwp->pdcch_Config = NULLP;
- DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
- if(!dlBwp->pdcch_Config)
+ pdcchCfg->controlResourceSetToAddModList = NULLP;
+ DU_ALLOC(pdcchCfg->controlResourceSetToAddModList, \
+ sizeof(struct PDCCH_Config__controlResourceSetToAddModList));
+ if(!pdcchCfg->controlResourceSetToAddModList)
{
- DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
return RFAILED;
}
- dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
- dlBwp->pdcch_Config->choice.setup = NULLP;
- DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
- if(!dlBwp->pdcch_Config->choice.setup)
- {
- DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
- return RFAILED;
- }
- if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
+ if(BuildControlRSetToAddModList(pdcchCfg->controlResourceSetToAddModList) != ROK)
{
return RFAILED;
}
- dlBwp->pdsch_Config = NULLP;
- DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
- if(!dlBwp->pdsch_Config)
- {
- DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
- return RFAILED;
- }
- dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
+ pdcchCfg->controlResourceSetToReleaseList = NULLP;
- dlBwp->pdsch_Config->choice.setup = NULLP;
- DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
- if(!dlBwp->pdsch_Config->choice.setup)
+ pdcchCfg->searchSpacesToAddModList = NULLP;
+ DU_ALLOC(pdcchCfg->searchSpacesToAddModList, \
+ sizeof(struct PDCCH_Config__searchSpacesToAddModList));
+ if(!pdcchCfg->searchSpacesToAddModList)
{
- DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdcchCfg");
return RFAILED;
}
- if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
+ if(BuildSearchSpcToAddModList(pdcchCfg->searchSpacesToAddModList) != ROK)
{
return RFAILED;
}
- dlBwp->sps_Config = NULLP;
- dlBwp->radioLinkMonitoringConfig = NULLP;
+ pdcchCfg->searchSpacesToReleaseList = NULLP;
+ pdcchCfg->downlinkPreemption = NULLP;
+ pdcchCfg->tpc_PUSCH = NULLP;
+ pdcchCfg->tpc_PUCCH = NULLP;
+ pdcchCfg->tpc_SRS = NULLP;
+
return ROK;
}
/*******************************************************************
*
- * @brief Builds DMRS UL Pusch Mapping type A
+ * @brief Builds DMRS DL PDSCH Mapping type A
*
* @details
*
- * Function : BuildDMRSULPuschMapTypeA
+ * Function : BuildDMRSDLPdschMapTypeA
*
- * Functionality: Builds DMRS UL Pusch Mapping type A
+ * Functionality: Builds DMRS DL PDSCH Mapping type A
*
- * @params[in]
- * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
+ * @params[in]
+ * struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
- uint8_t BuildDMRSULPuschMapTypeA
+ uint8_t BuildDMRSDLPdschMapTypeA
(
- struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
+ struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA *dmrsDlCfg
)
{
- dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
- dmrsUlCfg->choice.setup= NULLP;
- DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
- if(!dmrsUlCfg->choice.setup)
+ dmrsDlCfg->present = PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA_PR_setup;
+ dmrsDlCfg->choice.setup = NULLP;
+ DU_ALLOC(dmrsDlCfg->choice.setup, sizeof(struct DMRS_DownlinkConfig));
+ if(!dmrsDlCfg->choice.setup)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
return RFAILED;
}
- dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
- dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
- DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
- if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
+ dmrsDlCfg->choice.setup->dmrs_Type = NULLP;
+ dmrsDlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
+ DU_ALLOC(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
+ if(!dmrsDlCfg->choice.setup->dmrs_AdditionalPosition)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSDLPdschMapTypeA");
return RFAILED;
}
- *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
+ *(dmrsDlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
- dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
- dmrsUlCfg->choice.setup->maxLength = NULLP;
- dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
- DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
- sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
- if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
- return RFAILED;
- }
+ dmrsDlCfg->choice.setup->maxLength = NULLP;
+ dmrsDlCfg->choice.setup->scramblingID0 = NULLP;
+ dmrsDlCfg->choice.setup->scramblingID1 = NULLP;
+ dmrsDlCfg->choice.setup->phaseTrackingRS = NULLP;
- dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
- DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
- sizeof(long));
- if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
- return RFAILED;
- }
- *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
+ return ROK;
+}
- dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
- dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
+/*******************************************************************
+ *
+ * @brief Builds TCI states to add/modify list
+ *
+ * @details
+ *
+ * Function : BuildTCIStatesToAddModList
+ *
+ * Functionality:Builds TCI states to add/modify list
+ *
+ * @params[in]
+ * struct PDSCH_Config__tci_StatesToAddModList *tciStatesList
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildTCIStatesToAddModList(struct PDSCH_Config__tci_StatesToAddModList *tciStatesList)
+{
return ROK;
}
/*******************************************************************
*
- * @brief Build PUSCH time domain allocation list
+ * @brief Builds PDSCH time domain allocation list
*
* @details
*
- * Function : BuildPuschTimeDomAllocList
+ * Function : BuildPdschTimeDomAllocList
*
- * Functionality: Build PUSCH time domain allocation list
+ * Functionality: Builds PDSCH time domain allocation list
*
* @params[in]
- * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
+ * struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
- uint8_t BuildPuschTimeDomAllocList
+ uint8_t BuildPdschTimeDomAllocList
(
- struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
+ struct PDSCH_Config__pdsch_TimeDomainAllocationList *timeDomAllocList
)
{
uint8_t idx;
uint8_t elementCnt;
- PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
+ struct PDSCH_TimeDomainResourceAllocation *timeDomAlloc;
+
+ timeDomAllocList->present = \
+ PDSCH_Config__pdsch_TimeDomainAllocationList_PR_setup;
- timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
timeDomAllocList->choice.setup = NULLP;
DU_ALLOC(timeDomAllocList->choice.setup, \
- sizeof(struct PUSCH_TimeDomainResourceAllocationList));
+ sizeof(struct PDSCH_TimeDomainResourceAllocationList));
if(!timeDomAllocList->choice.setup)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
return RFAILED;
}
elementCnt = 1;
timeDomAllocList->choice.setup->list.count = elementCnt;
timeDomAllocList->choice.setup->list.size = \
- elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
+ elementCnt * sizeof(struct PDSCH_TimeDomainResourceAllocation *);
+
timeDomAllocList->choice.setup->list.array = NULLP;
DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
timeDomAllocList->choice.setup->list.size);
if(!timeDomAllocList->choice.setup->list.array)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
return RFAILED;
}
for(idx = 0; idx < elementCnt; idx++)
{
timeDomAllocList->choice.setup->list.array[idx] = NULLP;
- DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
- sizeof(PUSCH_TimeDomainResourceAllocation_t));
+ DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx], \
+ sizeof(struct PDSCH_TimeDomainResourceAllocation));
if(!timeDomAllocList->choice.setup->list.array[idx])
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschTimeDomAllocList");
return RFAILED;
}
}
idx = 0;
timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
- DU_ALLOC(timeDomAlloc->k2, sizeof(long));
- if(!timeDomAlloc->k2)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
- return RFAILED;
- }
- *(timeDomAlloc->k2) = PUSCH_K2;
- timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
- timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
+
+ timeDomAlloc->k0 = NULLP;
+ timeDomAlloc->mappingType = PDSCH_MAPPING_TYPE_A;
+ timeDomAlloc->startSymbolAndLength = \
+ calcSliv(PDSCH_START_SYMBOL, PDSCH_LENGTH_SYMBOL);
+
return ROK;
}
/*******************************************************************
*
- * @brief Builds BWP UL dedicated PUSCH Config
+ * @brief Builds PDSCH PRB Bundling type
*
* @details
*
- * Function : BuildBWPUlDedPuschCfg
+ * Function : BuildPdschPrbBundlingType
*
- * Functionality:
- * Builds BWP UL dedicated PUSCH Config
+ * Functionality: Builds PDSCH PRB Bundling type
+ *
+ * @params[in]
+ * struct PDSCH_Config__prb_BundlingType *prbBndlType
*
- * @params[in] : PUSCH_Config_t *puschCfg
- *
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
+ uint8_t BuildPdschPrbBundlingType
+(
+ struct PDSCH_Config__prb_BundlingType *prbBndlType
+ )
{
- puschCfg->dataScramblingIdentityPUSCH = NULLP;
- DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
- if(!puschCfg->dataScramblingIdentityPUSCH)
+ prbBndlType->present = PDSCH_Config__prb_BundlingType_PR_staticBundling;
+
+ prbBndlType->choice.staticBundling = NULLP;
+ DU_ALLOC(prbBndlType->choice.staticBundling, \
+ sizeof(struct PDSCH_Config__prb_BundlingType__staticBundling));
+ if(!prbBndlType->choice.staticBundling)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschPrbBundlingType");
return RFAILED;
}
- *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
+ prbBndlType->choice.staticBundling->bundleSize = NULLP;
- puschCfg->txConfig = NULLP;
- puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
- DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
- sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
- if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds BWP DL dedicated PDSCH config
+ *
+ * @details
+ *
+ * Function : BuildBWPDlDedPdschCfg
+ *
+ * Functionality: Builds BWP DL dedicated PDSCH config
+ *
+ * @params[in] struct PDSCH_Config *pdschCfg
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildBWPDlDedPdschCfg(struct PDSCH_Config *pdschCfg)
+{
+ pdschCfg->dataScramblingIdentityPDSCH = NULLP;
+
+ pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA = NULLP;
+ DU_ALLOC(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA, \
+ sizeof(struct PDSCH_Config__dmrs_DownlinkForPDSCH_MappingTypeA));
+ if(!pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
return RFAILED;
}
- if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
+ if(BuildDMRSDLPdschMapTypeA(pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeA) != ROK)
{
return RFAILED;
}
- puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
- puschCfg->pusch_PowerControl = NULLP;
- puschCfg->frequencyHopping = NULLP;
- puschCfg->frequencyHoppingOffsetLists = NULLP;
- puschCfg->resourceAllocation = RES_ALLOC_TYPE;
+ pdschCfg->dmrs_DownlinkForPDSCH_MappingTypeB = NULLP;
+ pdschCfg->tci_StatesToAddModList = NULLP;
+ pdschCfg->tci_StatesToReleaseList = NULLP;
+ pdschCfg->vrb_ToPRB_Interleaver = NULLP;
+#if 0
+ DU_ALLOC(pdschCfg->tci_StatesToAddModList, sizeof(struct PDSCH_Config__tci_StatesToAddModList));
+ if(!pdschCfg->tci_StatesToAddModList)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
+ return RFAILED;
+ }
+ if(BuildTCIStatesToAddModList(pdschCfg->tci_StatesToAddModList) != ROK)
+ {
+ return RFAILED;
+ }
+#endif
- puschCfg->pusch_TimeDomainAllocationList = NULLP;
- DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
- sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
- if(!puschCfg->pusch_TimeDomainAllocationList)
+ pdschCfg->resourceAllocation = RES_ALLOC_TYPE;
+
+ pdschCfg->pdsch_TimeDomainAllocationList = NULLP;
+ DU_ALLOC(pdschCfg->pdsch_TimeDomainAllocationList, \
+ sizeof(struct PDSCH_Config__pdsch_TimeDomainAllocationList));
+ if(!pdschCfg->pdsch_TimeDomainAllocationList)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
return RFAILED;
}
- if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
+ if(BuildPdschTimeDomAllocList(pdschCfg->pdsch_TimeDomainAllocationList) != ROK)
{
return RFAILED;
}
- puschCfg->pusch_AggregationFactor = NULLP;
- puschCfg->mcs_Table = NULLP;
- puschCfg->mcs_TableTransformPrecoder = NULLP;
- puschCfg->transformPrecoder = NULLP;
- DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
- if(!puschCfg->transformPrecoder)
+ pdschCfg->pdsch_AggregationFactor = NULLP;
+ pdschCfg->rateMatchPatternToAddModList = NULLP;
+ pdschCfg->rateMatchPatternToReleaseList = NULLP;
+ pdschCfg->rateMatchPatternGroup1 = NULLP;
+ pdschCfg->rateMatchPatternGroup2 = NULLP;
+ pdschCfg->rbg_Size = PDSCH_RBG_SIZE;
+ pdschCfg->mcs_Table = NULLP;
+
+ pdschCfg->maxNrofCodeWordsScheduledByDCI = NULLP;
+ DU_ALLOC(pdschCfg->maxNrofCodeWordsScheduledByDCI, sizeof(long));
+ if(!pdschCfg->maxNrofCodeWordsScheduledByDCI)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPDlDedPdschCfg");
return RFAILED;
}
- *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
+ *(pdschCfg->maxNrofCodeWordsScheduledByDCI) = PDSCH_MAX_CODEWORD_SCH_BY_DCI;
- puschCfg->codebookSubset = NULLP;
- puschCfg->maxRank = NULLP;
- puschCfg->rbg_Size = NULLP;
- puschCfg->uci_OnPUSCH = NULLP;
- puschCfg->tp_pi2BPSK = NULLP;
+ if(BuildPdschPrbBundlingType(&pdschCfg->prb_BundlingType) != ROK)
+ {
+ return RFAILED;
+ }
+
+ pdschCfg->zp_CSI_RS_ResourceToAddModList = NULLP;
+ pdschCfg->zp_CSI_RS_ResourceToReleaseList = NULLP;
+ pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
+ pdschCfg->aperiodic_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
+ pdschCfg->sp_ZP_CSI_RS_ResourceSetsToAddModList = NULLP;
+ pdschCfg->sp_ZP_CSI_RS_ResourceSetsToReleaseList = NULLP;
+ pdschCfg->p_ZP_CSI_RS_ResourceSet = NULLP;
return ROK;
}
/*******************************************************************
*
- * @brief Fills SRS resource to add/modify list
- *
+ * @brief Builds intitial DL BWP
* @details
*
- * Function : BuildSrsRsrcAddModList
+ * Function : BuildInitialDlBWP
*
- * Functionality: Fills SRS resource to add/modify list
+ * Functionality: Builds intitial DL BWP in spCellCfgDed
+ *
+ * @params[in] BWP_DownlinkDedicated_t *dlBwp
*
- * @params[in]
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
+uint8_t BuildInitialDlBWP(BWP_DownlinkDedicated_t *dlBwp)
{
- uint8_t elementCnt;
- uint8_t rsrcIdx;
-
- elementCnt = 1;
- resourceList->list.count = elementCnt;
- resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
- resourceList->list.array = NULLP;
- DU_ALLOC(resourceList->list.array, resourceList->list.size);
- if(!resourceList->list.array)
+ dlBwp->pdcch_Config = NULLP;
+ DU_ALLOC(dlBwp->pdcch_Config, sizeof(struct BWP_DownlinkDedicated__pdcch_Config));
+ if(!dlBwp->pdcch_Config)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
return RFAILED;
}
+ dlBwp->pdcch_Config->present = BWP_DownlinkDedicated__pdcch_Config_PR_setup;
- for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
+ dlBwp->pdcch_Config->choice.setup = NULLP;
+ DU_ALLOC(dlBwp->pdcch_Config->choice.setup, sizeof(struct PDCCH_Config));
+ if(!dlBwp->pdcch_Config->choice.setup)
{
- DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
- if(!resourceList->list.array[rsrcIdx])
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
- return RFAILED;
- }
+ DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
+ return RFAILED;
}
-
- rsrcIdx = 0;
- resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
- resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
- resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
-
- resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
- DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
- sizeof(struct SRS_Resource__transmissionComb__n2));
- if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
+ if(BuildBWPDlDedPdcchCfg(dlBwp->pdcch_Config->choice.setup) != ROK)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
return RFAILED;
}
- resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
- = SRS_COMB_OFFSET_N2;
- resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
- = SRS_CYCLIC_SHIFT_N2;
- resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
- PUSCH_START_SYMBOL;
- resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
- SRS_Resource__resourceMapping__nrofSymbols_n1;
- resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
- SRS_Resource__resourceMapping__repetitionFactor_n1;
+ dlBwp->pdsch_Config = NULLP;
+ DU_ALLOC(dlBwp->pdsch_Config, sizeof(struct BWP_DownlinkDedicated__pdsch_Config));
+ if(!dlBwp->pdsch_Config)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
+ return RFAILED;
+ }
+ dlBwp->pdsch_Config->present = BWP_DownlinkDedicated__pdsch_Config_PR_setup;
- resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
- resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
- resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
- resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
- resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
- resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
- SRS_Resource__groupOrSequenceHopping_neither;
+ dlBwp->pdsch_Config->choice.setup = NULLP;
+ DU_ALLOC(dlBwp->pdsch_Config->choice.setup, sizeof(struct PDSCH_Config));
+ if(!dlBwp->pdsch_Config->choice.setup)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory Allocation failure in BuildInitialDlBWP");
+ return RFAILED;
+ }
- /* Setting resource type to aperiodic for intergration purposes */
- resourceList->list.array[rsrcIdx]->resourceType.present = \
- SRS_Resource__resourceType_PR_aperiodic;
- resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
- DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
- sizeof(struct SRS_Resource__resourceType__aperiodic));
- if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
+ if(BuildBWPDlDedPdschCfg(dlBwp->pdsch_Config->choice.setup) != ROK)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
return RFAILED;
}
- resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
+ dlBwp->sps_Config = NULLP;
+ dlBwp->radioLinkMonitoringConfig = NULLP;
return ROK;
}
/*******************************************************************
*
- * @brief Build SRS resource set Add/mod list
+ * @brief Builds DMRS UL Pusch Mapping type A
*
* @details
*
- * Function : BuildSrsRsrcSetAddModList
+ * Function : BuildDMRSULPuschMapTypeA
*
- * Functionality: Build SRS resource set Add/mod list
+ * Functionality: Builds DMRS UL Pusch Mapping type A
*
* @params[in]
+ * struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
- uint8_t BuildSrsRsrcSetAddModList
+ uint8_t BuildDMRSULPuschMapTypeA
(
- struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
+ struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA *dmrsUlCfg
)
{
- uint8_t elementCnt;
- uint8_t rSetIdx;
- uint8_t rsrcIdx;
- struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
-
- elementCnt = 1;
- rsrcSetList->list.count = elementCnt;
- rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
- rsrcSetList->list.array = NULLP;
- DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
- if(!rsrcSetList->list.array)
+ dmrsUlCfg->present = PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA_PR_setup;
+ dmrsUlCfg->choice.setup= NULLP;
+ DU_ALLOC(dmrsUlCfg->choice.setup, sizeof(DMRS_UplinkConfig_t));
+ if(!dmrsUlCfg->choice.setup)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
return RFAILED;
}
- for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
+ dmrsUlCfg->choice.setup->dmrs_Type = NULLP;
+ dmrsUlCfg->choice.setup->dmrs_AdditionalPosition = NULLP;
+ DU_ALLOC(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition, sizeof(long));
+ if(!dmrsUlCfg->choice.setup->dmrs_AdditionalPosition)
{
- DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
- if(!rsrcSetList->list.array[rSetIdx])
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
- return RFAILED;
- }
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
+ return RFAILED;
}
+ *(dmrsUlCfg->choice.setup->dmrs_AdditionalPosition) = DMRS_ADDITIONAL_POS;
- rSetIdx = 0;
- rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
-
- /* Fill Resource Id list in resource set */
- rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
- DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
- sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
- if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
- return RFAILED;
- }
-
- elementCnt = 1;
- rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
- rsrcIdList->list.count = elementCnt;
- rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
- rsrcIdList->list.array = NULLP;
- DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
- if(!rsrcIdList->list.array)
+ dmrsUlCfg->choice.setup->phaseTrackingRS = NULLP;
+ dmrsUlCfg->choice.setup->maxLength = NULLP;
+ dmrsUlCfg->choice.setup->transformPrecodingDisabled = NULLP;
+ DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled, \
+ sizeof(struct DMRS_UplinkConfig__transformPrecodingDisabled));
+ if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
return RFAILED;
}
- for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
- {
- DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
- if(!rsrcIdList->list.array[rsrcIdx])
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
- return RFAILED;
- }
- }
-
- rsrcIdx = 0;
- *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
-
- /* Fill resource type */
- rsrcSetList->list.array[rSetIdx]->resourceType.present = \
- SRS_ResourceSet__resourceType_PR_aperiodic;
-
- rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
- DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
- sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
- if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
+ dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0 = NULLP;
+ DU_ALLOC(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0,\
+ sizeof(long));
+ if(!dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDMRSULPuschMapTypeA");
return RFAILED;
}
- rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
- = APERIODIC_SRS_RESRC_TRIGGER;
-
- /* TODO : Fill values for below IEs as expected by Viavi */
- rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
- rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
-
-
- rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
- rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
- rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
- rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
- rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
+ *(dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID0) = SCRAMBLING_ID;
+ dmrsUlCfg->choice.setup->transformPrecodingDisabled->scramblingID1 = NULLP;
+ dmrsUlCfg->choice.setup->transformPrecodingEnabled = NULLP;
return ROK;
}
/*******************************************************************
*
- * @brief Builds BWP UL dedicated SRS Config
+ * @brief Build PUSCH time domain allocation list
*
* @details
*
- * Function : BuildBWPUlDedSrsCfg
+ * Function : BuildPuschTimeDomAllocList
*
- * Functionality: Builds BWP UL dedicated SRS Config
+ * Functionality: Build PUSCH time domain allocation list
+ *
+ * @params[in]
+ * struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
*
- * @params[in] SRS Config
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
+ uint8_t BuildPuschTimeDomAllocList
+(
+ struct PUSCH_Config__pusch_TimeDomainAllocationList *timeDomAllocList
+ )
{
- srsCfg->srs_ResourceSetToReleaseList = NULLP;
- srsCfg->srs_ResourceSetToAddModList = NULLP;
- DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
- sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
- if(!srsCfg->srs_ResourceSetToAddModList)
+ uint8_t idx;
+ uint8_t elementCnt;
+ PUSCH_TimeDomainResourceAllocation_t *timeDomAlloc;
+
+ timeDomAllocList->present = PUSCH_Config__pusch_TimeDomainAllocationList_PR_setup;
+ timeDomAllocList->choice.setup = NULLP;
+ DU_ALLOC(timeDomAllocList->choice.setup, \
+ sizeof(struct PUSCH_TimeDomainResourceAllocationList));
+ if(!timeDomAllocList->choice.setup)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
return RFAILED;
}
- if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
+
+ elementCnt = 1;
+ timeDomAllocList->choice.setup->list.count = elementCnt;
+ timeDomAllocList->choice.setup->list.size = \
+ elementCnt * sizeof(PUSCH_TimeDomainResourceAllocation_t *);
+ timeDomAllocList->choice.setup->list.array = NULLP;
+ DU_ALLOC(timeDomAllocList->choice.setup->list.array, \
+ timeDomAllocList->choice.setup->list.size);
+ if(!timeDomAllocList->choice.setup->list.array)
{
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
return RFAILED;
}
- srsCfg->srs_ResourceToReleaseList = NULLP;
-
- /* Resource to Add/Modify list */
- srsCfg->srs_ResourceToAddModList = NULLP;
- DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
- sizeof(struct SRS_Config__srs_ResourceToAddModList));
- if(!srsCfg->srs_ResourceToAddModList)
+ for(idx = 0; idx < elementCnt; idx++)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
- return RFAILED;
+ timeDomAllocList->choice.setup->list.array[idx] = NULLP;
+ DU_ALLOC(timeDomAllocList->choice.setup->list.array[idx],\
+ sizeof(PUSCH_TimeDomainResourceAllocation_t));
+ if(!timeDomAllocList->choice.setup->list.array[idx])
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
+ return RFAILED;
+ }
}
- if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
+ idx = 0;
+ timeDomAlloc = timeDomAllocList->choice.setup->list.array[idx];
+ DU_ALLOC(timeDomAlloc->k2, sizeof(long));
+ if(!timeDomAlloc->k2)
{
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschTimeDomAllocList");
return RFAILED;
}
-
- srsCfg->tpc_Accumulation = NULLP;
-
+ *(timeDomAlloc->k2) = PUSCH_K2;
+ timeDomAlloc->mappingType = PUSCH_MAPPING_TYPE_A;
+ timeDomAlloc->startSymbolAndLength = calcSliv(PUSCH_START_SYMBOL, PUSCH_LENGTH_SYMBOL);
return ROK;
}
-
-
/*******************************************************************
*
- * @brief Builds Pusch Serving cell Config
+ * @brief Builds BWP UL dedicated PUSCH Config
*
* @details
*
- * Function : BuildPuschSrvCellCfg
- *
- * Functionality: Builds Pusch Serving cell Config
+ * Function : BuildBWPUlDedPuschCfg
*
- * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
+ * Functionality:
+ * Builds BWP UL dedicated PUSCH Config
*
+ * @params[in] : PUSCH_Config_t *puschCfg
+ *
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
+uint8_t BuildBWPUlDedPuschCfg(PUSCH_Config_t *puschCfg)
{
- puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
- puschCfg->choice.setup = NULLP;
- DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
- if(!puschCfg->choice.setup)
+ puschCfg->dataScramblingIdentityPUSCH = NULLP;
+ DU_ALLOC(puschCfg->dataScramblingIdentityPUSCH, sizeof(long));
+ if(!puschCfg->dataScramblingIdentityPUSCH)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
return RFAILED;
}
+ *(puschCfg->dataScramblingIdentityPUSCH) = SCRAMBLING_ID;
- puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
- puschCfg->choice.setup->rateMatching = NULLP;
- puschCfg->choice.setup->xOverhead = NULLP;
- puschCfg->choice.setup->ext1 = NULLP;
- DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
- if(!puschCfg->choice.setup->ext1)
+ puschCfg->txConfig = NULLP;
+ puschCfg->dmrs_UplinkForPUSCH_MappingTypeA = NULLP;
+ DU_ALLOC(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA, \
+ sizeof(struct PUSCH_Config__dmrs_UplinkForPUSCH_MappingTypeA));
+ if(!puschCfg->dmrs_UplinkForPUSCH_MappingTypeA)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
return RFAILED;
}
- puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
- DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
- if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
+ if(BuildDMRSULPuschMapTypeA(puschCfg->dmrs_UplinkForPUSCH_MappingTypeA) != ROK)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
return RFAILED;
}
- *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
- puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
- DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
- if(!puschCfg->choice.setup->ext1->processingType2Enabled)
+ puschCfg->dmrs_UplinkForPUSCH_MappingTypeB = NULLP;
+ puschCfg->pusch_PowerControl = NULLP;
+ puschCfg->frequencyHopping = NULLP;
+ puschCfg->frequencyHoppingOffsetLists = NULLP;
+ puschCfg->resourceAllocation = RES_ALLOC_TYPE;
+
+ puschCfg->pusch_TimeDomainAllocationList = NULLP;
+ DU_ALLOC(puschCfg->pusch_TimeDomainAllocationList, \
+ sizeof(struct PUSCH_Config__pusch_TimeDomainAllocationList));
+ if(!puschCfg->pusch_TimeDomainAllocationList)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
return RFAILED;
}
- *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
+
+ if(BuildPuschTimeDomAllocList(puschCfg->pusch_TimeDomainAllocationList) != ROK)
+ {
+ return RFAILED;
+ }
+
+ puschCfg->pusch_AggregationFactor = NULLP;
+ puschCfg->mcs_Table = NULLP;
+ puschCfg->mcs_TableTransformPrecoder = NULLP;
+ puschCfg->transformPrecoder = NULLP;
+ DU_ALLOC(puschCfg->transformPrecoder, sizeof(long));
+ if(!puschCfg->transformPrecoder)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedPuschCfg");
+ return RFAILED;
+ }
+ *(puschCfg->transformPrecoder) = PUSCH_TRANSFORM_PRECODER;
+
+ puschCfg->codebookSubset = NULLP;
+ puschCfg->maxRank = NULLP;
+ puschCfg->rbg_Size = NULLP;
+ puschCfg->uci_OnPUSCH = NULLP;
+ puschCfg->tp_pi2BPSK = NULLP;
+
return ROK;
}
/*******************************************************************
*
- * @brief Builds inital UL BWP
+ * @brief Fills SRS resource to add/modify list
*
* @details
*
- * Function : BuildInitialUlBWP
+ * Function : BuildSrsRsrcAddModList
*
- * Functionality: Builds initial UL BWP
+ * Functionality: Fills SRS resource to add/modify list
*
- * @params[in] BWP_UplinkDedicated_t *ulBwp
+ * @params[in]
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
+uint8_t BuildSrsRsrcAddModList(struct SRS_Config__srs_ResourceToAddModList *resourceList)
{
- ulBwp->pucch_Config = NULLP;
-
- /* Fill BWP UL dedicated PUSCH config */
- ulBwp->pusch_Config = NULLP;
- DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
- if(!ulBwp->pusch_Config)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
- return RFAILED;
- }
+ uint8_t elementCnt;
+ uint8_t rsrcIdx;
- ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
- ulBwp->pusch_Config->choice.setup = NULLP;
- DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
- if(!ulBwp->pusch_Config->choice.setup)
+ elementCnt = 1;
+ resourceList->list.count = elementCnt;
+ resourceList->list.size = elementCnt * sizeof(SRS_Resource_t *);
+ resourceList->list.array = NULLP;
+ DU_ALLOC(resourceList->list.array, resourceList->list.size);
+ if(!resourceList->list.array)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
return RFAILED;
}
- if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
+ for(rsrcIdx = 0; rsrcIdx < resourceList->list.count; rsrcIdx++)
{
- return RFAILED;
+ DU_ALLOC(resourceList->list.array[rsrcIdx], sizeof(SRS_Resource_t));
+ if(!resourceList->list.array[rsrcIdx])
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
+ return RFAILED;
+ }
}
- ulBwp->configuredGrantConfig = NULLP;
+ rsrcIdx = 0;
+ resourceList->list.array[rsrcIdx]->srs_ResourceId = SRS_RSRC_ID;
+ resourceList->list.array[rsrcIdx]->nrofSRS_Ports = SRS_Resource__nrofSRS_Ports_port1;
+ resourceList->list.array[rsrcIdx]->transmissionComb.present = SRS_Resource__transmissionComb_PR_n2;
- /* Fill BPW UL dedicated SRS config */
- ulBwp->srs_Config = NULLP;
- DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
- if(!ulBwp->srs_Config)
+ resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2 = NULLP;
+ DU_ALLOC(resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2, \
+ sizeof(struct SRS_Resource__transmissionComb__n2));
+ if(!resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
return RFAILED;
}
+ resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->combOffset_n2\
+ = SRS_COMB_OFFSET_N2;
+ resourceList->list.array[rsrcIdx]->transmissionComb.choice.n2->cyclicShift_n2\
+ = SRS_CYCLIC_SHIFT_N2;
- ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
- ulBwp->srs_Config->choice.setup = NULLP;
- DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
- if(!ulBwp->srs_Config->choice.setup)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
- return RFAILED;
- }
+ resourceList->list.array[rsrcIdx]->resourceMapping.startPosition = \
+ PUSCH_START_SYMBOL;
+ resourceList->list.array[rsrcIdx]->resourceMapping.nrofSymbols = \
+ SRS_Resource__resourceMapping__nrofSymbols_n1;
+ resourceList->list.array[rsrcIdx]->resourceMapping.repetitionFactor = \
+ SRS_Resource__resourceMapping__repetitionFactor_n1;
- if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
+ resourceList->list.array[rsrcIdx]->freqDomainPosition = SRS_FREQ_DOM_POS;
+ resourceList->list.array[rsrcIdx]->freqDomainShift = SRS_FREQ_DOM_SHIFT;
+ resourceList->list.array[rsrcIdx]->freqHopping.c_SRS = C_SRS;
+ resourceList->list.array[rsrcIdx]->freqHopping.b_SRS = B_SRS;
+ resourceList->list.array[rsrcIdx]->freqHopping.b_hop = B_HOP;
+ resourceList->list.array[rsrcIdx]->groupOrSequenceHopping = \
+ SRS_Resource__groupOrSequenceHopping_neither;
+
+ /* Setting resource type to aperiodic for intergration purposes */
+ resourceList->list.array[rsrcIdx]->resourceType.present = \
+ SRS_Resource__resourceType_PR_aperiodic;
+ resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic = NULLP;
+ DU_ALLOC(resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic,
+ sizeof(struct SRS_Resource__resourceType__aperiodic));
+ if(!resourceList->list.array[rsrcIdx]->resourceType.choice.aperiodic)
{
- return RFAILED;
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcAddModList");
+ return RFAILED;
}
-
- ulBwp->beamFailureRecoveryConfig = NULLP;
+ resourceList->list.array[rsrcIdx]->sequenceId = SRS_SEQ_ID;
return ROK;
}
/*******************************************************************
*
- * @brief Builds UL config
- * @details
+ * @brief Build SRS resource set Add/mod list
*
- * Function : BuildUlCfg
+ * @details
*
- * Functionality: Builds UL config in spCellCfgDed
+ * Function : BuildSrsRsrcSetAddModList
*
- * @params[in] UplinkConfig_t *ulCfg
+ * Functionality: Build SRS resource set Add/mod list
*
+ * @params[in]
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
+ uint8_t BuildSrsRsrcSetAddModList
+(
+ struct SRS_Config__srs_ResourceSetToAddModList *rsrcSetList
+ )
{
- ulCfg->initialUplinkBWP = NULLP;
- DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
- if(!ulCfg->initialUplinkBWP)
+ uint8_t elementCnt;
+ uint8_t rSetIdx;
+ uint8_t rsrcIdx;
+ struct SRS_ResourceSet__srs_ResourceIdList *rsrcIdList;
+
+ elementCnt = 1;
+ rsrcSetList->list.count = elementCnt;
+ rsrcSetList->list.size = elementCnt * sizeof(SRS_ResourceSet_t *);
+ rsrcSetList->list.array = NULLP;
+ DU_ALLOC(rsrcSetList->list.array, rsrcSetList->list.size);
+ if(!rsrcSetList->list.array)
{
- DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
return RFAILED;
}
- if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
+ for(rSetIdx = 0; rSetIdx < rsrcSetList->list.count; rSetIdx++)
{
- return RFAILED;
+ DU_ALLOC(rsrcSetList->list.array[rSetIdx], sizeof(SRS_ResourceSet_t));
+ if(!rsrcSetList->list.array[rSetIdx])
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
+ return RFAILED;
+ }
}
- ulCfg->uplinkBWP_ToReleaseList = NULLP;
- ulCfg->uplinkBWP_ToAddModList = NULLP;
- ulCfg->firstActiveUplinkBWP_Id = NULLP;
- DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
- if(!ulCfg->firstActiveUplinkBWP_Id)
+ rSetIdx = 0;
+ rsrcSetList->list.array[rSetIdx]->srs_ResourceSetId = SRS_RSET_ID;
+
+ /* Fill Resource Id list in resource set */
+ rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList = NULLP;
+ DU_ALLOC(rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList,\
+ sizeof(struct SRS_ResourceSet__srs_ResourceIdList));
+ if(!rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList)
{
- DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
return RFAILED;
}
- *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
- ulCfg->pusch_ServingCellConfig = NULLP;
- DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
- sizeof(struct UplinkConfig__pusch_ServingCellConfig));
- if(!ulCfg->pusch_ServingCellConfig)
+ elementCnt = 1;
+ rsrcIdList = rsrcSetList->list.array[rSetIdx]->srs_ResourceIdList;
+ rsrcIdList->list.count = elementCnt;
+ rsrcIdList->list.size = elementCnt * sizeof(SRS_ResourceId_t *);
+ rsrcIdList->list.array = NULLP;
+ DU_ALLOC(rsrcIdList->list.array, rsrcIdList->list.size);
+ if(!rsrcIdList->list.array)
{
- DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
return RFAILED;
}
- if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
+ for(rsrcIdx = 0; rsrcIdx < rsrcIdList->list.count; rsrcIdx++)
+ {
+ DU_ALLOC(rsrcIdList->list.array[rsrcIdx], sizeof(SRS_ResourceId_t));
+ if(!rsrcIdList->list.array[rsrcIdx])
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
+ return RFAILED;
+ }
+ }
+
+ rsrcIdx = 0;
+ *rsrcIdList->list.array[rsrcIdx] = SRS_RSRC_ID;
+
+ /* Fill resource type */
+ rsrcSetList->list.array[rSetIdx]->resourceType.present = \
+ SRS_ResourceSet__resourceType_PR_aperiodic;
+
+ rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic = NULLP;
+ DU_ALLOC(rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic, \
+ sizeof(struct SRS_ResourceSet__resourceType__aperiodic));
+ if(!rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic)
{
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildSrsRsrcSetAddModList");
return RFAILED;
}
+ rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->aperiodicSRS_ResourceTrigger \
+ = APERIODIC_SRS_RESRC_TRIGGER;
+
+ /* TODO : Fill values for below IEs as expected by Viavi */
+ rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->csi_RS = NULLP;
+ rsrcSetList->list.array[rSetIdx]->resourceType.choice.aperiodic->slotOffset = NULLP;
+
+
+ rsrcSetList->list.array[rSetIdx]->usage = SRS_ResourceSet__usage_codebook;
+ rsrcSetList->list.array[rSetIdx]->alpha = NULLP;
+ rsrcSetList->list.array[rSetIdx]->p0 = NULLP;
+ rsrcSetList->list.array[rSetIdx]->pathlossReferenceRS = NULLP;
+ rsrcSetList->list.array[rSetIdx]->srs_PowerControlAdjustmentStates = NULLP;
- ulCfg->carrierSwitching = NULLP;
- ulCfg->ext1 = NULLP;
return ROK;
}
/*******************************************************************
*
- * @brief Builds PDSCH serving cell config
- * @details
+ * @brief Builds BWP UL dedicated SRS Config
*
- * Function : BuildPdschSrvCellCfg
+ * @details
*
- * Functionality: Builds PDSCH serving cell config in spCellCfgDed
+ * Function : BuildBWPUlDedSrsCfg
*
- * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
+ * Functionality: Builds BWP UL dedicated SRS Config
*
+ * @params[in] SRS Config
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
+uint8_t BuildBWPUlDedSrsCfg(SRS_Config_t *srsCfg)
{
- pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
- pdschCfg->choice.setup = NULLP;
- DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
- if(!pdschCfg->choice.setup)
+ srsCfg->srs_ResourceSetToReleaseList = NULLP;
+ srsCfg->srs_ResourceSetToAddModList = NULLP;
+ DU_ALLOC(srsCfg->srs_ResourceSetToAddModList, \
+ sizeof(struct SRS_Config__srs_ResourceSetToAddModList));
+ if(!srsCfg->srs_ResourceSetToAddModList)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
+ return RFAILED;
+ }
+ if(BuildSrsRsrcSetAddModList(srsCfg->srs_ResourceSetToAddModList) != ROK)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
return RFAILED;
}
- pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
- pdschCfg->choice.setup->xOverhead = NULLP;
- pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
- DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
- if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
+ srsCfg->srs_ResourceToReleaseList = NULLP;
+
+ /* Resource to Add/Modify list */
+ srsCfg->srs_ResourceToAddModList = NULLP;
+ DU_ALLOC(srsCfg->srs_ResourceToAddModList, \
+ sizeof(struct SRS_Config__srs_ResourceToAddModList));
+ if(!srsCfg->srs_ResourceToAddModList)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildBWPUlDedSrsCfg");
return RFAILED;
}
- *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
- pdschCfg->choice.setup->pucch_Cell = NULLP;
- pdschCfg->choice.setup->ext1 = NULLP;
- return ROK;
-}
+ if(BuildSrsRsrcAddModList(srsCfg->srs_ResourceToAddModList) != ROK)
+ {
+ return RFAILED;
+ }
-/*******************************************************************
- *
- * @brief Builds CSI Meas config
- * @details
- *
- * Function : BuildCsiMeasCfg
- *
- * Functionality: Builds CSI Meas config in spCellCfgDed
- *
- * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
- *
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
-{
+ srsCfg->tpc_Accumulation = NULLP;
return ROK;
}
+
+
/*******************************************************************
*
- * @brief Builds Spcell config dedicated
+ * @brief Builds Pusch Serving cell Config
+ *
* @details
*
- * Function : BuildSpCellCfgDed
+ * Function : BuildPuschSrvCellCfg
*
- * Functionality: Builds sp cell config dedicated in spCellCfg
+ * Functionality: Builds Pusch Serving cell Config
*
- * @params[in] ServingCellConfig_t srvCellCfg
+ * @params[in] struct UplinkConfig__pusch_ServingCellConfig *puschCfg
*
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
+uint8_t BuildPuschSrvCellCfg(struct UplinkConfig__pusch_ServingCellConfig *puschCfg)
{
- srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
- DU_ALLOC(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
- if(!srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
+ puschCfg->present = UplinkConfig__pusch_ServingCellConfig_PR_setup;
+ puschCfg->choice.setup = NULLP;
+ DU_ALLOC(puschCfg->choice.setup, sizeof(struct PUSCH_ServingCellConfig));
+ if(!puschCfg->choice.setup)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
+ return RFAILED;
+ }
+
+ puschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
+ puschCfg->choice.setup->rateMatching = NULLP;
+ puschCfg->choice.setup->xOverhead = NULLP;
+ puschCfg->choice.setup->ext1 = NULLP;
+ DU_ALLOC(puschCfg->choice.setup->ext1, sizeof(struct PUSCH_ServingCellConfig__ext1));
+ if(!puschCfg->choice.setup->ext1)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
+ return RFAILED;
+ }
+
+ puschCfg->choice.setup->ext1->maxMIMO_Layers = NULLP;
+ DU_ALLOC(puschCfg->choice.setup->ext1->maxMIMO_Layers, sizeof(long));
+ if(!puschCfg->choice.setup->ext1->maxMIMO_Layers)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
+ return RFAILED;
+ }
+ *(puschCfg->choice.setup->ext1->maxMIMO_Layers) = PUSCH_MAX_MIMO_LAYERS;
+
+ puschCfg->choice.setup->ext1->processingType2Enabled= NULLP;
+ DU_ALLOC(puschCfg->choice.setup->ext1->processingType2Enabled,sizeof(BOOLEAN_t));
+ if(!puschCfg->choice.setup->ext1->processingType2Enabled)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPuschSrvCellCfg");
+ return RFAILED;
+ }
+ *(puschCfg->choice.setup->ext1->processingType2Enabled) = PUSCH_PROCESS_TYPE2_ENABLED;
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds inital UL BWP
+ *
+ * @details
+ *
+ * Function : BuildInitialUlBWP
+ *
+ * Functionality: Builds initial UL BWP
+ *
+ * @params[in] BWP_UplinkDedicated_t *ulBwp
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildInitialUlBWP(BWP_UplinkDedicated_t *ulBwp)
+{
+ ulBwp->pucch_Config = NULLP;
+
+ /* Fill BWP UL dedicated PUSCH config */
+ ulBwp->pusch_Config = NULLP;
+ DU_ALLOC(ulBwp->pusch_Config, sizeof(struct BWP_UplinkDedicated__pusch_Config));
+ if(!ulBwp->pusch_Config)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
+ return RFAILED;
+ }
+
+ ulBwp->pusch_Config->present = BWP_UplinkDedicated__pusch_Config_PR_setup;
+ ulBwp->pusch_Config->choice.setup = NULLP;
+ DU_ALLOC(ulBwp->pusch_Config->choice.setup, sizeof(PUSCH_Config_t));
+ if(!ulBwp->pusch_Config->choice.setup)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
+ return RFAILED;
+ }
+
+ if(BuildBWPUlDedPuschCfg(ulBwp->pusch_Config->choice.setup) != ROK)
+ {
+ return RFAILED;
+ }
+
+ ulBwp->configuredGrantConfig = NULLP;
+
+ /* Fill BPW UL dedicated SRS config */
+ ulBwp->srs_Config = NULLP;
+ DU_ALLOC(ulBwp->srs_Config, sizeof(struct BWP_UplinkDedicated__srs_Config));
+ if(!ulBwp->srs_Config)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
+ return RFAILED;
+ }
+
+ ulBwp->srs_Config->present = BWP_UplinkDedicated__srs_Config_PR_setup;
+ ulBwp->srs_Config->choice.setup = NULLP;
+ DU_ALLOC(ulBwp->srs_Config->choice.setup, sizeof(SRS_Config_t));
+ if(!ulBwp->srs_Config->choice.setup)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildInitialUlBWP");
+ return RFAILED;
+ }
+
+ if(BuildBWPUlDedSrsCfg(ulBwp->srs_Config->choice.setup) != ROK)
+ {
+ return RFAILED;
+ }
+
+ ulBwp->beamFailureRecoveryConfig = NULLP;
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds UL config
+ * @details
+ *
+ * Function : BuildUlCfg
+ *
+ * Functionality: Builds UL config in spCellCfgDed
+ *
+ * @params[in] UplinkConfig_t *ulCfg
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildUlCfg(UplinkConfig_t *ulCfg)
+{
+ ulCfg->initialUplinkBWP = NULLP;
+ DU_ALLOC(ulCfg->initialUplinkBWP, sizeof(BWP_UplinkDedicated_t));
+ if(!ulCfg->initialUplinkBWP)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
+ return RFAILED;
+ }
+
+ if(BuildInitialUlBWP(ulCfg->initialUplinkBWP) != ROK)
+ {
+ return RFAILED;
+ }
+
+ ulCfg->uplinkBWP_ToReleaseList = NULLP;
+ ulCfg->uplinkBWP_ToAddModList = NULLP;
+ ulCfg->firstActiveUplinkBWP_Id = NULLP;
+ DU_ALLOC(ulCfg->firstActiveUplinkBWP_Id, sizeof(BWP_Id_t));
+ if(!ulCfg->firstActiveUplinkBWP_Id)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
+ return RFAILED;
+ }
+ *(ulCfg->firstActiveUplinkBWP_Id) = ACTIVE_UL_BWP_ID;
+
+ ulCfg->pusch_ServingCellConfig = NULLP;
+ DU_ALLOC(ulCfg->pusch_ServingCellConfig, \
+ sizeof(struct UplinkConfig__pusch_ServingCellConfig));
+ if(!ulCfg->pusch_ServingCellConfig)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory Allocation failed in BuildUlCfg");
+ return RFAILED;
+ }
+
+ if(BuildPuschSrvCellCfg(ulCfg->pusch_ServingCellConfig) != ROK)
+ {
+ return RFAILED;
+ }
+
+ ulCfg->carrierSwitching = NULLP;
+ ulCfg->ext1 = NULLP;
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds PDSCH serving cell config
+ * @details
+ *
+ * Function : BuildPdschSrvCellCfg
+ *
+ * Functionality: Builds PDSCH serving cell config in spCellCfgDed
+ *
+ * @params[in] struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildPdschSrvCellCfg(struct ServingCellConfig__pdsch_ServingCellConfig *pdschCfg)
+{
+ pdschCfg->present = ServingCellConfig__pdsch_ServingCellConfig_PR_setup;
+ pdschCfg->choice.setup = NULLP;
+ DU_ALLOC(pdschCfg->choice.setup, sizeof( struct PDSCH_ServingCellConfig));
+ if(!pdschCfg->choice.setup)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
+ return RFAILED;
+ }
+
+ pdschCfg->choice.setup->codeBlockGroupTransmission = NULLP;
+ pdschCfg->choice.setup->xOverhead = NULLP;
+ pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH = NULLP;
+ DU_ALLOC(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH, sizeof(long));
+ if(!pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildPdschSrvCellCfg");
+ return RFAILED;
+ }
+ *(pdschCfg->choice.setup->nrofHARQ_ProcessesForPDSCH)= PDSCH_NUM_HARQ_PROC;
+ pdschCfg->choice.setup->pucch_Cell = NULLP;
+ pdschCfg->choice.setup->ext1 = NULLP;
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds CSI Meas config
+ * @details
+ *
+ * Function : BuildCsiMeasCfg
+ *
+ * Functionality: Builds CSI Meas config in spCellCfgDed
+ *
+ * @params[in] struct ServingCellConfig__csi_MeasConfig *csiMeasCfg
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildCsiMeasCfg(struct ServingCellConfig__csi_MeasConfig *csiMeasCfg)
+{
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds Spcell config dedicated
+ * @details
+ *
+ * Function : BuildSpCellCfgDed
+ *
+ * Functionality: Builds sp cell config dedicated in spCellCfg
+ *
+ * @params[in] ServingCellConfig_t srvCellCfg
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildSpCellCfgDed(ServingCellConfig_t *srvCellCfg)
+{
+ srvCellCfg->tdd_UL_DL_ConfigurationDedicated = NULLP;
+ DU_ALLOC(srvCellCfg->tdd_UL_DL_ConfigurationDedicated, sizeof(TDD_UL_DL_ConfigDedicated_t));
+ if(!srvCellCfg->tdd_UL_DL_ConfigurationDedicated)
{
DU_LOG("\nERROR --> F1AP : Memory allocation failure in BuildSpCellCfgDed");
return RFAILED;
}
}
/* Sending msg */
- if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
+ if(sendF1APMsg() != ROK)
{
DU_LOG("\nERROR --> F1AP : Sending Initial UL RRC Message Transfer Failed");
ret = RFAILED;
{
freeMacLcCfg(&ueCfg->macLcCfg[lcIdx]);
}
+ for(lcIdx = 0; lcIdx < ueCfg->numDrb; lcIdx++)
+ {
+ DU_FREE(ueCfg->upTnlInfo[lcIdx].tnlCfg1, sizeof(GtpTnlCfg));
+ memset(&ueCfg->upTnlInfo[lcIdx], 0, sizeof(UpTnlCfg));
+ }
}
/*******************************************************************
if(rlcAmCfg->dl_AM_RLC.sn_FieldLength)
{
amCfgToSet->ulAmCfg.snLenUl = *(rlcAmCfg->dl_AM_RLC.sn_FieldLength);
- amCfgToSet->ulAmCfg.reAssemTmr = rlcAmCfg->dl_AM_RLC.t_Reassembly;
+ /*TODO: Check the timer value when sent by real CU */
+ amCfgToSet->ulAmCfg.reAssemTmr = rlcAmCfg->dl_AM_RLC.t_Reassembly;
amCfgToSet->ulAmCfg.statProhTmr = rlcAmCfg->dl_AM_RLC.t_StatusProhibit;
}
case RLC_AM :
{
if(lcCfg->choice.am)
- {
+ {
DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.amCfg, sizeof(AmBearerCfg));
- if(rlcDbCfg->u.amCfg)
- extractRlcAmCfg(rlcDbCfg->u.amCfg, lcCfg->choice.am);
- }
+ if(rlcDbCfg->u.amCfg)
+ extractRlcAmCfg(rlcDbCfg->u.amCfg, lcCfg->choice.am);
+ }
break;
}
case RLC_UM_BI_DIRECTIONAL :
{
if(lcCfg->choice.um_Bi_Directional)
- {
+ {
DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umBiDirCfg, sizeof(UmBiDirBearerCfg));
- if(rlcDbCfg->u.umBiDirCfg)
+ if(rlcDbCfg->u.umBiDirCfg)
extractRlcUmBiCfg(rlcDbCfg->u.umBiDirCfg, lcCfg->choice.um_Bi_Directional);
- }
+ }
break;
}
case RLC_UM_UNI_DIRECTIONAL_UL :
if(lcCfg->choice.um_Uni_Directional_DL)
{
DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirUlCfg, sizeof(UmUniDirUlBearerCfg));
- if(rlcDbCfg->u.umUniDirUlCfg)
+ if(rlcDbCfg->u.umUniDirUlCfg)
extractRlcUmUlCfg(rlcDbCfg->u.umUniDirUlCfg, lcCfg->choice.um_Uni_Directional_DL);
- }
+ }
break;
}
case RLC_UM_UNI_DIRECTIONAL_DL :
if(lcCfg->choice.um_Uni_Directional_UL)
{
DU_ALLOC_SHRABL_BUF(rlcDbCfg->u.umUniDirDlCfg, sizeof(UmUniDirDlBearerCfg));
- if(rlcDbCfg->u.umUniDirDlCfg)
+ if(rlcDbCfg->u.umUniDirDlCfg)
extractRlcUmDlCfg(rlcDbCfg->u.umUniDirDlCfg, lcCfg->choice.um_Uni_Directional_UL);
- }
+ }
break;
}
default:
qosToAdd->ulPduSessAggMaxBitRate = 0;
}
-uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem, LcCfg *macLcToAdd)
+/*******************************************************************
+ *
+ * @brief Function to extract GTP Tunnel Info from CU
+ *
+ * @details
+ *
+ * Function : extractUpTnlInfo
+ *
+ * Functionality: Function to extract GTP Tunnel Info from CU
+ *
+ * @params[in] F1AP message
+ * @return ROK/RFAILED
+ *
+ * ****************************************************************/
+
+uint8_t extractUpTnlInfo(uint8_t drbId, uint8_t configType,\
+ ULUPTNLInformation_ToBeSetup_List_t *tnlInfo, UpTnlCfg *upTnlInfo)
{
- DRB_Information_t *drbInfo = NULLP;
+ uint8_t tnlIdx;
+ uint32_t ipv4_du = 0;
+ GTPTunnel_t *gtpTunnel = NULLP;
+
+ upTnlInfo->drbId = drbId;
+ upTnlInfo->configType = configType;
+#ifdef O1_ENABLE
+ cmInetAddr((S8*)g_cfg.DU_IPV4_Addr, &ipv4_du);
+#else
+ cmInetAddr((char *)DU_IP_V4_ADDR, &ipv4_du);
+#endif
- if(drbItem->qoSInformation.present == QoSInformation_PR_choice_extension)
+ for(tnlIdx=0; tnlIdx < tnlInfo->list.count; tnlIdx++)
{
- if(drbItem->qoSInformation.choice.choice_extension->value.present ==
- QoSInformation_ExtIEs__value_PR_DRB_Information)
+ if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.present == UPTransportLayerInformation_PR_gTPTunnel)
{
- drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
-
- if(!macLcToAdd->drbQos)
+ if(tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel)
{
- DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo));
- if(macLcToAdd->drbQos == NULLP)
+ gtpTunnel = tnlInfo->list.array[tnlIdx]->uLUPTNLInformation.choice.gTPTunnel;
+ DU_ALLOC(upTnlInfo->tnlCfg1, sizeof(GtpTnlCfg));
+ if(upTnlInfo->tnlCfg1 == NULLP)
{
- DU_LOG("\nERROR --> DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()");
- return RFAILED;
+ DU_LOG("\nERROR --> F1AP : extractUpTnlInfo: Failed to allocate mmeory for tunnel cfg 1");
+ return RFAILED;
}
-
- }
- if(drbInfo->dRB_QoS.qoS_Characteristics.present == QoS_Characteristics_PR_non_Dynamic_5QI)
- {
- extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS);
- macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel;
- }
- if(!macLcToAdd->snssai)
- {
- DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai));
- if(macLcToAdd->snssai == NULLP)
+ bitStringToInt(>pTunnel->transportLayerAddress, &upTnlInfo->tnlCfg1->ulTnlAddress);
+ upTnlInfo->tnlCfg1->dlTnlAddress = ipv4_du;
+ if(gtpTunnel->gTP_TEID.size > 0)
{
- DU_LOG("\nERROR --> DUAPP : Memory failed at allocating SNSSAI at extractDrbCfg()");
- return RFAILED;
+ teIdStringToInt(gtpTunnel->gTP_TEID.buf, &upTnlInfo->tnlCfg1->teId);
}
}
- memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \
- drbInfo->sNSSAI.sST.size);
- if(drbInfo->sNSSAI.sD)
- {
- memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \
- drbInfo->sNSSAI.sD->size);
- }
- }/*End of DRB Info*/
+ break;
+ }
}
return ROK;
}
+/*******************************************************************
+*
+* @brief Function to extract Drb Qos Cfg Info from CU
+*
+* @details
+*
+* Function : extractDrbQosCfg
+*
+* Functionality: Function to extract Drb Qos Cfg Info from CU
+*
+* @params[in] DRB_Information_t *drbInfo, LcCfg *macLcToAdd
+* @return ROK/RFAILED
+*
+* ****************************************************************/
-uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg)
+uint8_t extractDrbQosCfg(DRB_Information_t *drbInfo, LcCfg *macLcToAdd )
{
- uint8_t ret = ROK;
+ if(!macLcToAdd->drbQos)
+ {
+ DU_ALLOC_SHRABL_BUF(macLcToAdd->drbQos, sizeof(DrbQosInfo));
+ if(macLcToAdd->drbQos == NULLP)
+ {
+ DU_LOG("\nERROR --> DUAPP:Memory failed at allocating DrbQos at extractDrbCfg()");
+ return RFAILED;
+ }
- if(drbCfg)
+ }
+ if(drbInfo->dRB_QoS.qoS_Characteristics.present == QoS_Characteristics_PR_non_Dynamic_5QI)
{
- ret = extractDrbCfg(drbCfg, lcCfg);
- if(ret == RFAILED)
+ extractQosInfo(macLcToAdd->drbQos, &drbInfo->dRB_QoS);
+ macLcToAdd->dlLcCfg.lcp = macLcToAdd->drbQos->ngRanRetPri.priorityLevel;
+ }
+ if(!macLcToAdd->snssai)
+ {
+ DU_ALLOC_SHRABL_BUF(macLcToAdd->snssai, sizeof(Snssai));
+ if(macLcToAdd->snssai == NULLP)
+ {
+ DU_LOG("\nERROR --> DUAPP : Memory failed at allocating SNSSAI at extractDrbCfg()");
+ return RFAILED;
+ }
+ }
+ memcpy(&macLcToAdd->snssai->sst, drbInfo->sNSSAI.sST.buf, \
+ drbInfo->sNSSAI.sST.size);
+ if(drbInfo->sNSSAI.sD)
+ {
+ memcpy(macLcToAdd->snssai->sd, drbInfo->sNSSAI.sD->buf, \
+ drbInfo->sNSSAI.sD->size);
+ }
+ return ROK;
+}
+/*******************************************************************
+ *
+ * @brief Function to extract DRB info received from CU
+ *
+ * @details
+ *
+ * Function : extractDrbCfg
+ *
+ * Functionality: Function to extract DRB info received from CU
+ *
+ * @params[in] F1AP message
+ * @return void
+ *
+ * ****************************************************************/
+uint8_t extractDrbCfg(DRBs_ToBeSetup_Item_t *drbItem,DRBs_ToBeSetupMod_Item_t *drbSetupModItem,\
+LcCfg *macLcToAdd, UpTnlCfg *upTnlInfo)
+{
+ DRB_Information_t *drbInfo = NULLP;
+
+ if(drbItem != NULLP)
+ {
+ if(extractUpTnlInfo(drbItem->dRBID, CONFIG_ADD, &drbItem->uLUPTNLInformation_ToBeSetup_List, upTnlInfo) != ROK)
+ {
+ DU_LOG("\nERROR --> DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
+ return RFAILED;
+ }
+ if(drbItem->qoSInformation.present == QoSInformation_PR_choice_extension)
+ {
+ if(drbItem->qoSInformation.choice.choice_extension->value.present == QoSInformation_ExtIEs__value_PR_DRB_Information)
+ {
+ drbInfo = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
+ if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
+ {
+ DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
+ return RFAILED;
+ }
+ }
+ }
+ }
+ else if(drbSetupModItem != NULLP)
+ {
+ if(extractUpTnlInfo(drbSetupModItem->dRBID, CONFIG_ADD, &drbSetupModItem->uLUPTNLInformation_ToBeSetup_List,\
+ upTnlInfo) != ROK)
+ {
+ DU_LOG("\nERROR --> DUAPP : Failed to extract tunnel Cfg at extractDrbCfg()");
+ return RFAILED;
+ }
+ if(drbSetupModItem->qoSInformation.present == QoSInformation_PR_choice_extension)
+ {
+ if(drbSetupModItem->qoSInformation.choice.choice_extension->value.present ==\
+ QoSInformation_ExtIEs__value_PR_DRB_Information)
+ {
+ drbInfo = &drbSetupModItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information;
+ if(extractDrbQosCfg(drbInfo , macLcToAdd) != ROK)
+ {
+ DU_LOG("\nERROR --> DUAPP : Failed to extract qos Cfg at extractDrbCfg()");
+ return RFAILED;
+ }
+
+ }
+ }
+ }
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Function to extract RB info received from CU
+ *
+ * @details
+ *
+ * Function : extractMacRbCfg
+ *
+ * Functionality: Function to extract RB info received from CU
+ *
+ * @params[in] F1AP message
+ * @return ROK/RFAILED
+ *
+ * ****************************************************************/
+
+uint8_t extractMacRbCfg(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbCfg,\
+DRBs_ToBeSetupMod_Item_t *drbSetupModCfg, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
+{
+ if(drbCfg != NULLP)
+ {
+ if(extractDrbCfg(drbCfg, NULL, lcCfg, upTnlInfo) != ROK)
+ {
+ DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()");
+ return RFAILED;
+ }
+ }
+ else if(drbSetupModCfg != NULLP)
+ {
+ if(extractDrbCfg(NULL, drbSetupModCfg, lcCfg, upTnlInfo) != ROK)
{
DU_LOG("ERROR --> F1AP : Failed to build Drb Qos at extractMacRbCfg()");
- return ret;
+ return RFAILED;
}
}
else
}
else
lcCfg->ulLcCfgPres = false;
- return ret;
+ return ROK;
}
+/*******************************************************************
+ *
+ * @brief Function processing LC config info received from CU
+ *
+ * @details
+ *
+ * Function : procMacLcCfg
+ *
+ * Functionality: Function processing LC config info received from CU
+ *
+ * @params[in] F1AP message
+ * @return ROK/RFAILED
+ *
+ * ****************************************************************/
+
uint8_t procMacLcCfg(uint8_t lcId, uint8_t rbType, uint8_t configType,\
- DRBs_ToBeSetup_Item_t *drbItem, LogicalChannelConfig_t *ulLcCfg, LcCfg *lcCfg)
+DRBs_ToBeSetup_Item_t *drbItem, DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LogicalChannelConfig_t *ulLcCfg,\
+LcCfg *lcCfg, UpTnlCfg *upTnlInfo)
{
uint8_t ret = ROK;
lcCfg->configType = configType;
if(rbType == RB_TYPE_SRB)
{
- ret = extractMacRbCfg(lcId, NULL, ulLcCfg, lcCfg);
+ ret = extractMacRbCfg(lcId, NULL,NULL, ulLcCfg, lcCfg, NULL);
}
else if(rbType == RB_TYPE_DRB)
{
- ret = extractMacRbCfg(lcId, drbItem, ulLcCfg, lcCfg);
+ if(drbItem != NULL)
+ ret = extractMacRbCfg(lcId, drbItem, NULL, ulLcCfg, lcCfg, upTnlInfo);
+ else if(drbSetupModItem != NULL)
+ ret = extractMacRbCfg(lcId, NULL, drbSetupModItem, ulLcCfg, lcCfg, upTnlInfo);
}
return ret;
}
*
* ****************************************************************/
-uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, \
- DuUeCfg *ueCfgDb)
+uint8_t extractRlcCfgToAddMod(struct CellGroupConfigRrc__rlc_BearerToAddModList *lcCfg, DuUeCfg *ueCfgDb)
{
- uint8_t ret, idx, rbId, lcId, rlcMode, rbType;
+ uint8_t idx, rbId, lcId, rlcMode, rbType;
RLC_Config_t *f1RlcCfg = NULLP;
LogicalChannelConfig_t *macUlLcCfg = NULLP;
memset(&ueCfgDb->macLcCfg[idx], 0, sizeof(LcCfg));
memset(&ueCfgDb->rlcLcCfg[idx], 0, sizeof(RlcBearerCfg));
procRlcLcCfg(rbId, lcId, rbType, rlcMode, CONFIG_UNKNOWN, f1RlcCfg, &(ueCfgDb->rlcLcCfg[idx]));
- ret = procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx]);
- if(ret == RFAILED)
+ if(procMacLcCfg(lcId, rbType, CONFIG_UNKNOWN, NULL, NULL, macUlLcCfg, &ueCfgDb->macLcCfg[idx], NULL) != ROK)
{
DU_LOG("\nERROR --> DU APP : Failed while filling MAC LC config at extractRlcCfgToAddMod()");
- return ret;
+ return RFAILED;
}
(ueCfgDb->numRlcLcs)++;
(ueCfgDb->numMacLcs)++;
}
//TODO: To send the failure cause in UeContextSetupRsp
- return ret;
+ return ROK;
}
/*******************************************************************
/* Fill MacCell Group Reconfig */
if(cellGrp->mac_CellGroupConfig)
{
+ macUeCfg->macCellGrpCfgPres = true;
macCellGroup = ((MAC_CellGroupConfig_t *)(cellGrp->mac_CellGroupConfig));
if(macCellGroup->schedulingRequestConfig)
- {
+ {
extractSchReqReConfig(macCellGroup->schedulingRequestConfig, &macUeCfg->macCellGrpCfg.schReqCfg);
- }
+ }
if(macCellGroup->tag_Config)
- {
+ {
extractTagReconfig(macCellGroup->tag_Config, &macUeCfg->macCellGrpCfg.tagCfg);
- }
- if(macCellGroup->bsr_Config)
- {
+ }
+ if(macCellGroup->bsr_Config)
+ {
macUeCfg->macCellGrpCfg.bsrTmrCfg.periodicTimer = macCellGroup->bsr_Config->periodicBSR_Timer;
macUeCfg->macCellGrpCfg.bsrTmrCfg.retxTimer = macCellGroup->bsr_Config->retxBSR_Timer;
- if(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer)
- {
+ if(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer)
+ {
macUeCfg->macCellGrpCfg.bsrTmrCfg.srDelayTimer =\
- *(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer);
- }
- }
- if(macCellGroup->phr_Config)
- {
- if(macCellGroup->phr_Config->present == MAC_CellGroupConfig__phr_Config_PR_setup)
- {
+ *(macCellGroup->bsr_Config->logicalChannelSR_DelayTimer);
+ }
+ }
+ if(macCellGroup->phr_Config)
+ {
+ if(macCellGroup->phr_Config->present == MAC_CellGroupConfig__phr_Config_PR_setup)
+ {
macUeCfg->macCellGrpCfg.phrCfgSetupPres = true;
if(macCellGroup->phr_Config->choice.setup)
- {
- macUeCfg->macCellGrpCfg.phrCfg.periodicTimer = \
- macCellGroup->phr_Config->choice.setup->phr_PeriodicTimer;
- macUeCfg->macCellGrpCfg.phrCfg.prohibitTimer = \
- macCellGroup->phr_Config->choice.setup->phr_ProhibitTimer;
- macUeCfg->macCellGrpCfg.phrCfg.txPowerFactor = \
- macCellGroup->phr_Config->choice.setup->phr_Tx_PowerFactorChange;
- macUeCfg->macCellGrpCfg.phrCfg.multiplePHR = \
- macCellGroup->phr_Config->choice.setup->multiplePHR;
- macUeCfg->macCellGrpCfg.phrCfg.dummy = \
- macCellGroup->phr_Config->choice.setup->dummy;
- macUeCfg->macCellGrpCfg.phrCfg.phrType2OtherCell = \
- macCellGroup->phr_Config->choice.setup->phr_Type2OtherCell;
- macUeCfg->macCellGrpCfg.phrCfg.phrOtherCG = \
- macCellGroup->phr_Config->choice.setup->phr_ModeOtherCG;
- }
- }
- }
+ {
+ macUeCfg->macCellGrpCfg.phrCfg.periodicTimer = \
+ macCellGroup->phr_Config->choice.setup->phr_PeriodicTimer;
+ macUeCfg->macCellGrpCfg.phrCfg.prohibitTimer = \
+ macCellGroup->phr_Config->choice.setup->phr_ProhibitTimer;
+ macUeCfg->macCellGrpCfg.phrCfg.txPowerFactor = \
+ macCellGroup->phr_Config->choice.setup->phr_Tx_PowerFactorChange;
+ macUeCfg->macCellGrpCfg.phrCfg.multiplePHR = \
+ macCellGroup->phr_Config->choice.setup->multiplePHR;
+ macUeCfg->macCellGrpCfg.phrCfg.dummy = \
+ macCellGroup->phr_Config->choice.setup->dummy;
+ macUeCfg->macCellGrpCfg.phrCfg.phrType2OtherCell = \
+ macCellGroup->phr_Config->choice.setup->phr_Type2OtherCell;
+ macUeCfg->macCellGrpCfg.phrCfg.phrOtherCG = \
+ macCellGroup->phr_Config->choice.setup->phr_ModeOtherCG;
+ }
+ }
+ }
}
/* Fill Physical Cell Group Reconfig */
if(cellGrp->physicalCellGroupConfig)
{
+ macUeCfg->phyCellGrpCfgPres = true;
phyCellGrpCfg = ((PhysicalCellGroupConfig_t *)(cellGrp->physicalCellGroupConfig));
if(phyCellGrpCfg->p_NR_FR1)
- {
- if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
+ {
+ if(*(phyCellGrpCfg->p_NR_FR1) != macUeCfg->phyCellGrpCfg.pNrFr1)
macUeCfg->phyCellGrpCfg.pNrFr1 = *(phyCellGrpCfg->p_NR_FR1);
- }
+ }
macUeCfg->phyCellGrpCfg.pdschHarqAckCodebook = phyCellGrpCfg->pdsch_HARQ_ACK_Codebook;
}
/* Fill SpCell Reconfig */
if(cellGrp->spCellConfig)
{
+ macUeCfg->spCellCfgPres = true;
spcellCfg = ((SpCellConfig_t *)(cellGrp->spCellConfig));
if(spcellCfg->servCellIndex)
- {
+ {
macUeCfg->spCellCfg.servCellIdx = *(spcellCfg->servCellIndex);
- }
+ }
/* Fill Serving cell Reconfig info */
- if(cellGrp->spCellConfig->spCellConfigDedicated)
- {
- servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
+ if(cellGrp->spCellConfig->spCellConfigDedicated)
+ {
+ servCellCfg = ((ServingCellConfig_t *)(cellGrp->spCellConfig->spCellConfigDedicated));
ret = extractSpCellDedicatedCfg(servCellCfg, &macUeCfg->spCellCfg.servCellCfg);
- if(ret == RFAILED)
- {
- DU_LOG("\nERROR --> F1AP : Failed at extractSpCellDedicatedCfg()");
- }
- }
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed at extractSpCellDedicatedCfg()");
+ }
+ }
}
}
return ret;
DRBs_ToBeSetup_Item_t *drbSetItem = NULLP;
uint8_t flowIdx =0;
uint8_t drbIdx =0;
-
+
if(drbSet->list.array != NULLP)
{
for(drbIdx=0; drbIdx<drbSet->list.count; drbIdx++)
{
- if(drbIdx==0&&drbSet->list.array[drbIdx] != NULLP)
- {
- drbSetItem =&drbSet->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
- if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
- {
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
- qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
- {
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
- qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
- {
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
- qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
- {
-
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
- {
-
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
- {
-
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->\
- buf!=NULLP)
- {
-
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
- flows_Mapped_To_DRB_List.list.array != NULLP)
- {
-
- for(flowIdx=0;flowIdx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.count; flowIdx++)
- {
-
- if(flowIdx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
- {
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
- qoSFlowLevelQoSParameters.\
- qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
- {
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
- qoSFlowLevelQoSParameters.\
- qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
- {
-
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
- qoSFlowLevelQoSParameters.\
- qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
- {
- freeAperDecodeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
- free(drbSetItem->uLConfiguration);
-
-
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
- qoSFlowLevelQoSParameters.\
- qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
- }
-
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
- qoSFlowLevelQoSParameters.\
- qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
- }
-
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
-
- DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
- qoSFlowLevelQoSParameters.\
- qoS_Characteristics.choice.non_Dynamic_5QI);
- }
- }
- if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
- {
-
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]);
- }
- }
-
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.flows_Mapped_To_DRB_List.list.array);
- }
-
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
- DRB_Information.sNSSAI.sD->buf);
- }
-
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD);
- }
-
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf);
-
- }
-
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+ if(drbIdx==0&&drbSet->list.array[drbIdx] != NULLP)
+ {
+ drbSetItem =&drbSet->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
+ if(drbSetItem->qoSInformation.choice.choice_extension != NULLP)
+ {
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+ qoS_Characteristics.choice.non_Dynamic_5QI !=NULLP)
+ {
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+ qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
+ {
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+ qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
+ {
- qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
- }
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf!=NULLP)
+ {
+
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD!=NULLP)
+ {
+
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD->\
+ buf!=NULLP)
+ {
+
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.\
+ flows_Mapped_To_DRB_List.list.array != NULLP)
+ {
+
+ for(flowIdx=0;flowIdx<drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.count; flowIdx++)
+ {
+
+ if(flowIdx==0&&drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
+ {
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
+ qoSFlowLevelQoSParameters.\
+ qoS_Characteristics.choice.non_Dynamic_5QI!=NULLP)
+ {
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
+ qoSFlowLevelQoSParameters.\
+ qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
+ {
+
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
+ qoSFlowLevelQoSParameters.\
+ qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
+ {
+
+
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
+ qoSFlowLevelQoSParameters.\
+ qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
+ }
+
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
+ qoSFlowLevelQoSParameters.\
+ qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
+ }
+
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+
+ DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]->\
+ qoSFlowLevelQoSParameters.\
+ qoS_Characteristics.choice.non_Dynamic_5QI);
+ }
+ }
+ if(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]!=NULLP)
+ {
+
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.array[flowIdx]);
+ }
+ }
+
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List.list.array);
+ }
+
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.sNSSAI.sD->buf);
+ }
+
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sD);
+ }
+
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI.sST.buf);
+
+ }
+
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+
+ qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
+ }
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
- qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
- }
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+ qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
+ }
- free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
- qoS_Characteristics.choice.non_Dynamic_5QI);
- }
- free(drbSetItem->qoSInformation.choice.choice_extension);
- }
- }
- if(drbSet->list.array[drbIdx]!=NULLP)
- {
- free(drbSet->list.array[drbIdx]);
- }
+ free(drbSetItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.dRB_QoS.\
+ qoS_Characteristics.choice.non_Dynamic_5QI);
+ }
+ free(drbSetItem->qoSInformation.choice.choice_extension);
+ }
+ freeAperDecodeULTnlInfo(&drbSetItem->uLUPTNLInformation_ToBeSetup_List);
+ if(drbSetItem->uLConfiguration)
+ {
+ free(drbSetItem->uLConfiguration);
+ }
+ }
+ if(drbSet->list.array[drbIdx]!=NULLP)
+ {
+ free(drbSet->list.array[drbIdx]);
+ }
}
free(drbSet->list.array);
}
* ****************************************************************/
void duFillModulationDetails(MacUeCfg *ueCfg, MacUeCfg *oldUeCfg, void *ueCap)
{
- UE_NR_Capability_t *ueNrCap;
+ UE_NR_Capability_t *ueNrCap=NULLP;
- if(ueCap)
+ if(!ueCap)
+ {
+ memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
+ memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
+ }
+ else
+ {
ueNrCap = (UE_NR_Capability_t *)ueCap;
- /* Filling DL modulation info */
- if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \
- ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \
- ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)
- {
- switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL))
+ /* Filling DL modulation info */
+ if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsDownlinkPerCC && \
+ ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0] && \
+ ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL)
{
- case ModulationOrder_qpsk:
- {
- ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
- break;
- }
- case ModulationOrder_qam16:
- {
- ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16;
- break;
- }
- case ModulationOrder_qam64:
- {
- ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64;
- ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX;
- ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64;
- break;
- }
- case ModulationOrder_qam256:
- {
- ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256;
- break;
- }
- default:
- {
- DU_LOG("\nERROR --> DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration");
- memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
- break;
- }
+ switch(*(ueNrCap->featureSets->featureSetsDownlinkPerCC->list.array[0]->supportedModulationOrderDL))
+ {
+ case ModulationOrder_qpsk:
+ {
+ ueCfg->dlModInfo.modOrder = MOD_ORDER_QPSK;
+ break;
+ }
+ case ModulationOrder_qam16:
+ {
+ ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM16;
+ break;
+ }
+ case ModulationOrder_qam64:
+ {
+ ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM64;
+ ueCfg->dlModInfo.mcsIndex = PDSCH_MCS_INDEX;
+ ueCfg->dlModInfo.mcsTable = MCS_TABLE_QAM64;
+ break;
+ }
+ case ModulationOrder_qam256:
+ {
+ ueCfg->dlModInfo.modOrder = MOD_ORDER_QAM256;
+ break;
+ }
+ default:
+ {
+ DU_LOG("\nERROR --> DU APP: Incorrect downlink modulation order received. Reatining old modulation configuration");
+ memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
+ break;
+ }
+ }
+ }
+ else
+ {
+ memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
}
- }
- else
- {
- memcpy(&ueCfg->dlModInfo, &oldUeCfg->dlModInfo, sizeof(ModulationInfo));
- }
- /* Filling UL modulation info */
- if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \
- ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \
- ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)
- {
- switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL))
+ /* Filling UL modulation info */
+ if(ueNrCap->featureSets && ueNrCap->featureSets->featureSetsUplinkPerCC && \
+ ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0] && \
+ ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL)
{
- case ModulationOrder_qpsk:
- {
- ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
- break;
- }
- case ModulationOrder_qam16:
- {
- ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16;
- ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX;
- ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64;
- break;
- }
- case ModulationOrder_qam64:
- {
- ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64;
- break;
- }
- case ModulationOrder_qam256:
- {
- ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256;
- break;
- }
- default:
- {
- DU_LOG("\nERROR --> DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration");
- memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
- break;
- }
+ switch(*(ueNrCap->featureSets->featureSetsUplinkPerCC->list.array[0]->supportedModulationOrderUL))
+ {
+ case ModulationOrder_qpsk:
+ {
+ ueCfg->ulModInfo.modOrder = MOD_ORDER_QPSK;
+ break;
+ }
+ case ModulationOrder_qam16:
+ {
+ ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM16;
+ ueCfg->ulModInfo.mcsIndex = PUSCH_MCS_INDEX;
+ ueCfg->ulModInfo.mcsTable = MCS_TABLE_QAM64;
+ break;
+ }
+ case ModulationOrder_qam64:
+ {
+ ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM64;
+ break;
+ }
+ case ModulationOrder_qam256:
+ {
+ ueCfg->ulModInfo.modOrder = MOD_ORDER_QAM256;
+ break;
+ }
+ default:
+ {
+ DU_LOG("\nERROR --> DU APP: Incorrect uplink modulation order received. Reatining old modulation configuration");
+ memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
+ break;
+ }
+ }
+ }
+ else
+ {
+ memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
}
- }
- else
- {
- memcpy(&ueCfg->ulModInfo, &oldUeCfg->ulModInfo, sizeof(ModulationInfo));
}
}
* ****************************************************************/
CellGroupConfigRrc_t *extractCellGrpInfo(ProtocolExtensionContainer_4624P16_t *protocolIeExtn,\
- DuUeCfg *ueCfgDb)
+ DuUeCfg *ueCfgDb)
{
uint8_t idx2 =0;
uint16_t id =0;
procRlcLcCfg(srbItem->sRBID, srbItem->sRBID, RB_TYPE_SRB, RLC_AM, CONFIG_ADD, NULL, rlcLcToAdd);
/* Filling MAC INFO */
- ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL, NULL, macLcToAdd);
+ ret = procMacLcCfg(srbItem->sRBID, RB_TYPE_SRB, CONFIG_ADD, NULL,NULL, NULL, macLcToAdd, NULL);
if(ret == RFAILED)
{
DU_LOG("\nERROR --> F1AP : Failed at MAC LC Cfg in procSrbListToSetup()");
*
* ****************************************************************/
-uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd)
+uint8_t procDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_Item_t *drbItem,\
+DRBs_ToBeSetupMod_Item_t *drbSetupModItem, LcCfg *macLcToAdd, RlcBearerCfg *rlcLcToAdd, UpTnlCfg *upTnlInfo)
{
- uint8_t ret = ROK;
- /* Filling RLC INFO */
- procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
+ if(drbItem != NULLP)
+ {
+ /* Filling RLC INFO */
+ procRlcLcCfg(drbItem->dRBID, lcId, RB_TYPE_DRB, drbItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
- /* Filling MAC INFO */
- ret = procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, macLcToAdd);
- if(ret == RFAILED)
- {
- DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in extractDrbListToSetup()");
- return ret;
+ /* Filling MAC INFO */
+ if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, drbItem, NULL, NULL, macLcToAdd, upTnlInfo) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()");
+ return RFAILED;
+ }
}
+ else if(drbSetupModItem != NULLP)
+ {
+ procRlcLcCfg(drbSetupModItem->dRBID, lcId, RB_TYPE_DRB, drbSetupModItem->rLCMode, CONFIG_ADD, NULL, rlcLcToAdd);
- return ret;
+ if(procMacLcCfg(lcId, RB_TYPE_DRB, CONFIG_ADD, NULL, drbSetupModItem, NULL, macLcToAdd, upTnlInfo) != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed at RLC LC Cfg in procDrbListToSetup()");
+ return RFAILED;
+ }
+ }
+ return ROK;
}
/*******************************************************************
*
* ****************************************************************/
-uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg, DuUeCfg *ueCfgDb)
+uint8_t extractDrbListToSetup(uint8_t lcId, DRBs_ToBeSetup_List_t *drbCfg,DRBs_ToBeSetupMod_List_t *drbSetupModCfg,\
+uint8_t drbCount, DuUeCfg *ueCfgDb)
{
uint8_t ret, drbIdx;
DRBs_ToBeSetup_Item_t *drbItem = NULLP;
+ DRBs_ToBeSetupMod_ItemIEs_t *drbSetupModItem = NULLP;
ret = ROK;
- if(drbCfg)
+ if(drbCount > 0)
{
- for(drbIdx = 0; drbIdx < drbCfg->list.count; drbIdx++)
+ for(drbIdx = 0; drbIdx < drbCount; drbIdx++)
{
- drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
- if(ueCfgDb->numMacLcs > MAX_NUM_LC)
- {
- DU_LOG("\nERROR --> F1AP: MAX LC Reached in MAC ");
- ret = RFAILED;
- break;
- }
- if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
- {
- DU_LOG("\nERROR --> F1AP: MAX LC Reached in RLC");
- ret = RFAILED;
- break;
- }
- memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
- memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
- ret = procDrbListToSetup(lcId, drbItem, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
- &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs]);
- ueCfgDb->numRlcLcs++;
- ueCfgDb->numMacLcs++;
- if(ret == RFAILED)
- {
- DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetup()");
- break;
- }
+ if(ueCfgDb->numMacLcs > MAX_NUM_LC)
+ {
+ DU_LOG("\nERROR --> F1AP : MAX LC Reached in MAC at extractDrbListToSetup()");
+ ret = RFAILED;
+ break;
+ }
+ if(ueCfgDb->numRlcLcs > MAX_NUM_LC)
+ {
+ DU_LOG("\nERROR --> F1AP : MAX LC Reached in RLC at extractDrbListToSetup()");
+ ret = RFAILED;
+ break;
+ }
+ memset(&ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], 0, sizeof(LcCfg));
+ memset(&ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], 0, sizeof(RlcBearerCfg));
+
+ if(drbCfg != NULL)
+ {
+ drbItem = &drbCfg->list.array[drbIdx]->value.choice.DRBs_ToBeSetup_Item;
+ ret = procDrbListToSetup(lcId, drbItem, NULL, &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs],\
+ &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs], &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetup()");
+ break;
+ }
+ }
+ else if(drbSetupModCfg != NULL)
+ {
+ drbSetupModItem = (DRBs_ToBeSetupMod_ItemIEs_t *) drbSetupModCfg->list.array[drbIdx];
+ ret = procDrbListToSetup(lcId, NULL, &(drbSetupModItem->value.choice.DRBs_ToBeSetupMod_Item) ,\
+ &ueCfgDb->macLcCfg[ueCfgDb->numMacLcs], &ueCfgDb->rlcLcCfg[ueCfgDb->numRlcLcs],\
+ &ueCfgDb->upTnlInfo[ueCfgDb->numDrb]);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetup()");
+ break;
+ }
+ }
+ ueCfgDb->numRlcLcs++;
+ ueCfgDb->numMacLcs++;
+ ueCfgDb->numDrb++;
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed at extractDrbListToSetup()");
+ break;
+ }
}
}
else
DU_ALLOC_SHRABL_BUF(dlRrcMsg->rrcMsgPdu, dlRrcMsg->rrcMsgSize);
if(!dlRrcMsg->rrcMsgPdu)
{
- DU_LOG("\nERROR --> DU APP : Memory allocation failed for RRC Msg in procUeCtxtSetupReq");
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for RRC Msg in extractDlRrcMsg()");
ret = RFAILED;
}
else
* ****************************************************************/
uint8_t procF1UeContextSetupReq(F1AP_PDU_t *f1apMsg)
{
- uint8_t ret, ieIdx, ueIdx, lcId, cellIdx;
+ uint8_t ret=0, ieIdx=0, ueIdx=0, lcId=0, cellIdx=0;
bool ueCbFound = false;
- uint32_t gnbCuUeF1apId, gnbDuUeF1apId, bitRateSize;
- DuUeCb *duUeCb = NULLP;
- UEContextSetupRequest_t *ueSetReq = NULLP;
-
+ uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0, bitRateSize=0;
+ DuUeCb *duUeCb = NULL;
+ UEContextSetupRequest_t *ueSetReq = NULL;
+ DRBs_ToBeSetup_List_t *drbCfg = NULL;
+
ret = ROK;
-
+
ueSetReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextSetupRequest;
for(ieIdx=0; (ieIdx < ueSetReq->protocolIEs.list.count && ret == ROK); ieIdx++)
{
switch(ueSetReq->protocolIEs.list.array[ieIdx]->id)
{
- case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
- {
- gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
- break;
- }
- case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
- {
- gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
- break;
- }
- case ProtocolIE_ID_id_ServCellIndex:
- {
- cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ {
+ gnbCuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ {
+ gnbDuUeF1apId = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_ServCellIndex:
+ {
+ cellIdx = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.ServCellIndex;
for(ueIdx = 0; ueIdx < MAX_NUM_UE; ueIdx++)
- {
- if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
- (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
- {
- ueCbFound = true;
+ {
+ if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
+ (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
+ {
+ ueCbFound = true;
duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
if(duUeCb->f1UeDb)
{
memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
- duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
- duUeCb->f1UeDb->cellIdx = cellIdx;
- }
- else
- {
+ duUeCb->f1UeDb->actionType = UE_CTXT_SETUP;
+ duUeCb->f1UeDb->cellIdx = cellIdx;
+ }
+ else
+ {
DU_LOG("\nERROR --> F1AP: Memory Alloc Failed at procF1UeContextSetupReq()");
ret = RFAILED;
- }
- }
- else
- ueCbFound = false;
-
- }
- if(!ueCbFound)
- {
+ }
+ }
+ else
+ ueCbFound = false;
+
+ }
+ if(!ueCbFound)
+ {
DU_LOG("\nERROR --> F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
ret = RFAILED;
- }
- break;
- }
+ }
+ break;
+ }
case ProtocolIE_ID_id_SpCellULConfigured:
- /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL,
- UL, SUL or UL+SUL for the indicated cell for the UE */
- break;
+ /* Indicates whether the gNB-CU requests the gNB-DU to configure the uplink as no UL,
+ UL, SUL or UL+SUL for the indicated cell for the UE */
+ break;
case ProtocolIE_ID_id_CUtoDURRCInformation:
- {
+ {
if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.uE_CapabilityRAT_ContainerList)
{
duUeCb->f1UeDb->duUeCfg.ueNrCapability = \
- extractUeCapability(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.\
- uE_CapabilityRAT_ContainerList, duUeCb);
+ extractUeCapability(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.\
+ uE_CapabilityRAT_ContainerList, duUeCb);
}
- if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions)
- {
+ if(ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.CUtoDURRCInformation.iE_Extensions)
+ {
duUeCb->f1UeDb->duUeCfg.cellGrpCfg = extractCellGrpInfo(ueSetReq->protocolIEs.list.array[ieIdx]->\
- value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg);
- if(!duUeCb->f1UeDb->duUeCfg.cellGrpCfg)
- {
- DU_LOG("\nERROR --> F1AP: Failed to extract cell Grp Info");
- //TODO: Update the failure cause in ue context Setup Response
- ret = RFAILED;
- }
- }
+ value.choice.CUtoDURRCInformation.iE_Extensions, &duUeCb->f1UeDb->duUeCfg);
+ if(!duUeCb->f1UeDb->duUeCfg.cellGrpCfg)
+ {
+ DU_LOG("\nERROR --> F1AP: Failed to extract cell Grp Info");
+ //TODO: Update the failure cause in ue context Setup Response
+ ret = RFAILED;
+ }
+ }
break;
}
case ProtocolIE_ID_id_SCell_ToBeSetup_List:
- {
- DU_LOG("\nINFO --> DU_APP: Received SCell_ToBeSetup_List but Not processing the list");
- break;
- }
+ {
+ DU_LOG("\nINFO --> DU_APP: Received SCell_ToBeSetup_List but Not processing the list");
+ break;
+ }
case ProtocolIE_ID_id_SRBs_ToBeSetup_List:
- {
- if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
- &duUeCb->f1UeDb->duUeCfg))
- {
- DU_LOG("\nERROR --> DU APP : Failed at extractSrbListToSetup()");
- //TODO: Update the failure cause in ue context Setup Response
- ret = RFAILED;
- }
- break;
- }
+ {
+ if(extractSrbListToSetup(&ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.SRBs_ToBeSetup_List,\
+ &duUeCb->f1UeDb->duUeCfg))
+ {
+ DU_LOG("\nERROR --> DU APP : Failed at extractSrbListToSetup()");
+ //TODO: Update the failure cause in ue context Setup Response
+ ret = RFAILED;
+ }
+ break;
+ }
case ProtocolIE_ID_id_DRBs_ToBeSetup_List:
- {
- lcId = getDrbLcId(&duUeCb->drbBitMap);
- if(lcId != RFAILED)
- {
- if(extractDrbListToSetup(lcId, &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List,\
- &duUeCb->f1UeDb->duUeCfg))
- {
- DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetup()");
- //TODO: Update the failure cause in ue context Setup Response
- ret = RFAILED;
- }
- }
- else
- ret = RFAILED;
+ {
+ lcId = getDrbLcId(&duUeCb->drbBitMap);
+ if(lcId != RFAILED)
+ {
+ drbCfg = &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.DRBs_ToBeSetup_List;
+ if(extractDrbListToSetup(lcId, drbCfg, NULL, drbCfg->list.count, &duUeCb->f1UeDb->duUeCfg))
+ {
+ DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetup()");
+ //TODO: Update the failure cause in ue context Setup Response
+ ret = RFAILED;
+ }
+ }
+ else
+ ret = RFAILED;
break;
- }
- case ProtocolIE_ID_id_RRCContainer:
- {
- /* Filling Dl RRC Msg Info */
- DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
- if(!duUeCb->f1UeDb->dlRrcMsg)
- {
- DU_LOG("\nERROR --> DU APP : Memory allocation failed for DL RRC Msg in procUeCtxtSetupReq()");
- ret = RFAILED;
- }
- else
- {
- memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
- ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
- &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer);
- }
- break;
- }
- case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
- {
- if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
- {
- duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
- }
- else
- {
- DU_LOG("\nERROR --> Ignoring delivery report, since rrcContainer is not present");
- }
- break;
- }
- case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
- {
+ }
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ /* Filling Dl RRC Msg Info */
+ DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
+ if(!duUeCb->f1UeDb->dlRrcMsg)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for DL RRC Msg in procUeCtxtSetupReq()");
+ ret = RFAILED;
+ }
+ else
+ {
+ duUeCb->f1UeDb->dlRrcMsgPres = true;
+ memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
+ ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
+ &ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer);
+ }
+ break;
+ }
+ case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
+ {
+ if(duUeCb->f1UeDb->dlRrcMsg->rrcMsgPdu)
+ {
+ duUeCb->f1UeDb->dlRrcMsg->deliveryStatRpt = true;
+ }
+ else
+ {
+ DU_LOG("\nERROR --> Ignoring delivery report, since rrcContainer is not present");
+ }
+ break;
+ }
+ case ProtocolIE_ID_id_GNB_DU_UE_AMBR_UL:
+ {
/* MaximumBitRate Uplink */
- bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
- if(bitRateSize > 0)
- {
+ bitRateSize = ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.size;
+ if(bitRateSize > 0)
+ {
DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->duUeCfg.ambrCfg, bitRateSize);
- if(!duUeCb->f1UeDb->duUeCfg.ambrCfg)
- {
- DU_LOG("\nERROR --> DU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
- ret = RFAILED;
- }
- else
- {
- memset(duUeCb->f1UeDb->duUeCfg.ambrCfg, 0, sizeof(AmbrCfg));
+ if(!duUeCb->f1UeDb->duUeCfg.ambrCfg)
+ {
+ DU_LOG("\nERROR --> DU APP : Memory allocation failed for bitRate in procUeCtxtSetupReq");
+ ret = RFAILED;
+ }
+ else
+ {
+ memset(duUeCb->f1UeDb->duUeCfg.ambrCfg, 0, sizeof(AmbrCfg));
memcpy(&duUeCb->f1UeDb->duUeCfg.ambrCfg->ulBr,
- ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf, bitRateSize);
- duUeCb->f1UeDb->duUeCfg.ambrCfg->dlBr = 0;
- }
- }
- else
- ret = RFAILED;
- break;
- }
- default:
+ ueSetReq->protocolIEs.list.array[ieIdx]->value.choice.BitRate.buf, bitRateSize);
+ }
+ }
+ else
+ ret = RFAILED;
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ if(ret == RFAILED)
+ {
+ /*TODO : Negative case*/
+ // BuildAndSendUeContextSetupRsp(cellId,ueIdx);
+ DU_LOG("\nERROR --> F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()");
+ }
+ else
+ ret = duProcUeContextSetupRequest(duUeCb);
+
+ freeAperDecodeF1UeContextSetupReq(ueSetReq);
+ return ret;
+
+}
+/*******************************************************************
+ * @brief Free the memory allocated for Dl Tunnel Info
+ *
+ * @details
+ *
+ * Function : freeDlTnlInfo
+ *
+ * Functionality:
+ * Free the memory allocated for Dl Tunnel Info
+ *
+ * @params[in] DLUPTNLInformation_ToBeSetup_List_t *
+ * @return void
+ *
+ * ****************************************************************/
+
+void freeDlTnlInfo(DLUPTNLInformation_ToBeSetup_List_t *tnlInfo)
+{
+ uint8_t arrIdx = 0;
+
+ for(arrIdx=0; arrIdx < tnlInfo->list.count; arrIdx++)
+ {
+ DU_FREE(tnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
+ }
+}
+
+/*******************************************************************
+ * @brief Free the memory allocated for DRB setup List
+ *
+ * @details
+ *
+ * Function : freeDrbSetupList
+ *
+ * Functionality:
+ * Free the memory allocated for DRB setup list
+ *
+ * @params[in] DRBs_Setup_List_t *
+ * @return void
+ *
+ * ****************************************************************/
+void freeDrbSetupList(DRBs_Setup_List_t *drbSetupList)
+{
+ uint8_t arrIdx = 0;
+ DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
+
+ for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
+ {
+ drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
+ freeDlTnlInfo(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List);
+ }
+}
+
+/*******************************************************************
+ * @brief Free the memory allocated for UE Setup response
+ *
+ * @details
+ *
+ * Function : FreeUeContextSetupRsp
+ *
+ * Functionality:
+ * Free the memory allocated for UE Setup response
+ *
+ * @params[in] F1AP PDU for UE setup response
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
+{
+ uint8_t idx;
+ UEContextSetupResponse_t *ueSetRsp = NULLP;
+
+ if(f1apMsg)
+ {
+ if(f1apMsg->choice.successfulOutcome)
+ {
+ ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
+ UEContextSetupResponse;
+ if(ueSetRsp->protocolIEs.list.array)
+ {
+ for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
{
- break;
+ if(ueSetRsp->protocolIEs.list.array[idx])
+ {
+ switch(ueSetRsp->protocolIEs.list.array[idx]->id)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_DUtoCURRCInformation:
+ {
+ CellGroupConfig_t *cellGrpCfg = NULLP;
+ cellGrpCfg = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
+ DUtoCURRCInformation.cellGroupConfig;
+ if(cellGrpCfg->buf != NULLP)
+ {
+ DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
+ cellGrpCfg = NULLP;
+ }
+ break;
+ }
+ case ProtocolIE_ID_id_DRBs_Setup_List:
+ {
+ freeDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List);
+ break;
+ }
+ default:
+ DU_LOG("\nERROR --> DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\
+ ueSetRsp->protocolIEs.list.array[idx]->id);
+ break;
+ }
+ DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
+ sizeof(UEContextSetupResponseIEs_t));
+ }
}
+ DU_FREE(ueSetRsp->protocolIEs.list.array, \
+ ueSetRsp->protocolIEs.list.size);
+ }
+ DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
}
+ DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
}
- if(ret == RFAILED)
+}
+
+/*******************************************************************
+ *
+ * @brief Builds Ue context Setup Rsp DU To CU Info
+ *
+ * @details
+ *
+ * Function : EncodeUeCntxtDuToCuInfo
+ *
+ * Functionality: Builds Ue context Setup Rsp DU To CU Info
+ *
+ * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t *
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ ******************************************************************/
+
+uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
+{
+ asn_enc_rval_t encRetVal;
+
+ xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
+ memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
+ encBufSize = 0;
+ encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
+ /* Encode results */
+ if(encRetVal.encoded == ENCODE_FAIL)
+ {
+ DU_LOG( "\nERROR --> F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ return RFAILED;
+ }
+ else
+ {
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
+ for(int i=0; i< encBufSize; i++)
+ {
+ printf("%x",encBuf[i]);
+ }
+ }
+ duToCuCellGrp->size = encBufSize;
+ DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
+ if(!duToCuCellGrp->buf)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in UeCntxtDuToCuInfo");
+ }
+ memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills Dl Gtp tunnel Info
+ *
+ * @details
+ *
+ * Function : fillGtpTunnelforDl
+ *
+ * Functionality: Fills Dl Gtp tunnel Info
+ *
+ * @params[in]
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t fillGtpTunnelforDl(GTPTunnel_t *gtpDl, GtpTnlCfg *gtpUeCfg)
+{
+ uint8_t bufSize = 0;
+
+ gtpDl->transportLayerAddress.size = 4*sizeof(uint8_t);
+ DU_ALLOC(gtpDl->transportLayerAddress.buf, gtpDl->transportLayerAddress.size);
+ if(gtpDl->transportLayerAddress.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ memcpy(gtpDl->transportLayerAddress.buf, >pUeCfg->dlTnlAddress, gtpDl->transportLayerAddress.size);
+
+ /*GTP TEID*/
+ gtpDl->gTP_TEID.size = 4 * sizeof(uint8_t);
+ DU_ALLOC(gtpDl->gTP_TEID.buf, gtpDl->gTP_TEID.size);
+ if(gtpDl->gTP_TEID.buf == NULLP)
+ {
+ return RFAILED;
+ }
+ bufSize = 3; /*forming an Octect String*/
+ fillTeIdString(bufSize, gtpUeCfg->teId, gtpDl->gTP_TEID.buf);
+
+ return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills DL Tunnel Setup List
+ *
+ * @details
+ *
+ * Function : fillDlTnlSetupList
+ *
+ * Functionality: Fills the DL Tunnel Setup List
+ *
+ * @params[in]
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t fillDlTnlSetupList(DLUPTNLInformation_ToBeSetup_List_t *dlTnlInfo, UpTnlCfg *tnlCfg)
+{
+ uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
+
+ eleCount = 1;
+ dlTnlInfo->list.count = eleCount;
+ dlTnlInfo->list.size = (eleCount * sizeof(DLUPTNLInformation_ToBeSetup_Item_t *));
+
+ /* Initialize the DL Tnl Setup List Members */
+ DU_ALLOC(dlTnlInfo->list.array, dlTnlInfo->list.size);
+ if(dlTnlInfo->list.array == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for DL Tnl Setup List in fillDlTnlSetupList()");
+ ret = RFAILED;
+ }
+ for(arrIdx=0; arrIdx < eleCount; arrIdx++)
+ {
+ DU_ALLOC(dlTnlInfo->list.array[arrIdx], sizeof(DLUPTNLInformation_ToBeSetup_Item_t));
+ if(dlTnlInfo->list.array[arrIdx] == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for arrIdx [%d] failed in fillDlTnlSetupList()", arrIdx);
+ return RFAILED;
+ }
+ dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.present = UPTransportLayerInformation_PR_gTPTunnel;
+ DU_ALLOC(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel, sizeof(GTPTunnel_t));
+ if(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for DL tunnel info in fillDlTnlSetupList()");
+ return RFAILED;
+ }
+ ret = fillGtpTunnelforDl(dlTnlInfo->list.array[arrIdx]->dLUPTNLInformation.choice.gTPTunnel,\
+ tnlCfg->tnlCfg1);
+ if(ret != ROK)
+ break;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Fills the Drb Setup List for Ue Context Setup Response
+ *
+ * @details
+ *
+ * Function : fillDrbSetupList
+ *
+ * Functionality: Fills the Drb Setup List for Ue Context Setup Response
+ *
+ * @params[in]
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t fillDrbSetupList(DRBs_Setup_List_t *drbSetupList, DuUeCfg *ueCfg)
+{
+ uint8_t ret = ROK, arrIdx = 0, eleCount = 0;
+ DRBs_Setup_ItemIEs_t *drbItemIe = NULLP;
+
+ eleCount = ueCfg->numDrb;
+ drbSetupList->list.count = eleCount;
+ drbSetupList->list.size = \
+ (eleCount * sizeof(DRBs_Setup_Item_t *));
+
+ /* Initialize the Drb Setup List Members */
+ DU_ALLOC(drbSetupList->list.array, drbSetupList->list.size);
+ if(drbSetupList->list.array == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for DRB Setup List in fillDrbSetupList()");
+ ret = RFAILED;
+ }
+
+ for(arrIdx=0; arrIdx < eleCount; arrIdx++)
+ {
+ DU_ALLOC(drbSetupList->list.array[arrIdx], sizeof(DRBs_Setup_Item_t));
+ if(drbSetupList->list.array[arrIdx] == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for arrIdx [%d] failed in fillDrbSetupList()", arrIdx);
+ return RFAILED;
+ }
+ drbItemIe = ((DRBs_Setup_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
+ drbItemIe->id = ProtocolIE_ID_id_DRBs_Setup_Item;
+ drbItemIe->criticality = Criticality_reject;
+ drbItemIe->value.present = DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item;
+ drbItemIe->value.choice.DRBs_Setup_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
+ ret = fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_Setup_Item.dLUPTNLInformation_ToBeSetup_List,\
+ &ueCfg->upTnlInfo[arrIdx]);
+ if(ret != ROK)
+ break;
+ }
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Builds and sends the UE Setup Response
+ *
+ * @details
+ *
+ * Function : BuildAndSendUeContextSetupRsp
+ *
+ * Functionality: Constructs the UE Setup Response and sends
+ * it to the DU through SCTP.
+ *
+ * @params[in] uint8_t cellId,uint8_t ueIdx
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t BuildAndSendUeContextSetupRsp(uint8_t cellId,uint8_t ueIdx)
+{
+ uint8_t idx, ret, cellIdx, elementCnt;
+ uint32_t gnbCuUeF1apId; /* gNB-CU UE F1AP Id */
+ uint32_t gnbDuUeF1apId; /* gNB-DU UE F1AP Id */
+ asn_enc_rval_t encRetVal; /* Encoder return value */
+ F1AP_PDU_t *f1apMsg = NULLP;
+ UEContextSetupResponse_t *ueSetRsp = NULLP;
+ CellGroupConfigRrc_t *cellGrpCfg = NULLP;
+ DuUeCb *ueCb = NULLP;
+
+ DU_LOG("\n INFO --> F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx);
+
+ while(true)
+ {
+ DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
+ if(f1apMsg == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
+ ret = RFAILED;
+ break;
+ }
+
+ f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
+ DU_ALLOC(f1apMsg->choice.successfulOutcome,
+ sizeof(SuccessfulOutcome_t));
+ if(f1apMsg->choice.successfulOutcome == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
+ ret = RFAILED;
+ break;
+ }
+
+ f1apMsg->choice.successfulOutcome->procedureCode = \
+ ProcedureCode_id_UEContextSetup;
+ f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
+ f1apMsg->choice.successfulOutcome->value.present = \
+ SuccessfulOutcome__value_PR_UEContextSetupResponse;
+
+ ueSetRsp =
+ &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
+ elementCnt = 4;
+ ueSetRsp->protocolIEs.list.count = elementCnt;
+ ueSetRsp->protocolIEs.list.size = \
+ elementCnt * sizeof(UEContextSetupResponse_t *);
+
+ /* Initialize the UESetup members */
+ DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
+ ueSetRsp->protocolIEs.list.size);
+ if(ueSetRsp->protocolIEs.list.array == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed");
+ ret = RFAILED;
+ break;
+ }
+
+ for(idx=0; idx<elementCnt; idx++)
+ {
+ DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
+ sizeof(UEContextSetupResponseIEs_t));
+ if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
+ {
+ DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed");
+ ret = RFAILED;
+ break;
+ }
+ }
+ /* Fetching Ue Cb Info*/
+ GET_CELL_IDX(cellId, cellIdx);
+ gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
+ gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
+ ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
+
+ idx = 0;
+ /*GNB CU UE F1AP ID*/
+ ueSetRsp->protocolIEs.list.array[idx]->id = \
+ ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
+ ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
+ ueSetRsp->protocolIEs.list.array[idx]->value.present = \
+ UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
+ ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
+
+ /*GNB DU UE F1AP ID*/
+ idx++;
+ ueSetRsp->protocolIEs.list.array[idx]->id = \
+ ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
+ ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
+ ueSetRsp->protocolIEs.list.array[idx]->value.present = \
+ UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
+ ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
+
+
+ /*DUtoCURRC Information */
+ idx++;
+ ueSetRsp->protocolIEs.list.array[idx]->id = \
+ ProtocolIE_ID_id_DUtoCURRCInformation;
+ ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
+ ueSetRsp->protocolIEs.list.array[idx]->value.present =\
+ UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
+ if(ueCb->f1UeDb)
+ {
+ if(ueCb->f1UeDb->duUeCfg.cellGrpCfg)
+ {
+ cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->duUeCfg.cellGrpCfg;
+ ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\
+ choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed to EncodeUeCntxtDuToCuInfo in BuildAndSendUeContextSetupRsp()");
+ freeF1UeDb(ueCb->f1UeDb);
+ ueCb->f1UeDb = NULLP;
+ break;
+ }
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> F1AP : Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()");
+ ret = RFAILED;
+ break;
+ }
+
+ /* Drb Setup List */
+ idx++;
+ ueSetRsp->protocolIEs.list.array[idx]->id = \
+ ProtocolIE_ID_id_DRBs_Setup_List;
+ ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
+ ueSetRsp->protocolIEs.list.array[idx]->value.present =\
+ UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
+ ret = fillDrbSetupList(&ueSetRsp->protocolIEs.list.array[idx]->value.choice.DRBs_Setup_List,\
+ &ueCb->f1UeDb->duUeCfg);
+ if(ret == RFAILED)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed to fillDrbSetupList in BuildAndSendUeContextSetupRsp()");
+ freeF1UeDb(ueCb->f1UeDb);
+ ueCb->f1UeDb = NULLP;
+ break;
+ }
+
+ /* Free UeContext Db created during Ue context Req */
+ freeF1UeDb(ueCb->f1UeDb);
+ ueCb->f1UeDb = NULLP;
+
+ /* TODO: To send Drb list */
+ xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
+
+ /* Encode the UE context setup response type as APER */
+ memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
+ encBufSize = 0;
+ encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
+ encBuf);
+ /* Encode results */
+ if(encRetVal.encoded == ENCODE_FAIL)
+ {
+ DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Response structure (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ ret = RFAILED;
+ break;
+ }
+ else
+ {
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UE Context Setup Response\n");
+ for(int i=0; i< encBufSize; i++)
+ {
+ printf("%x",encBuf[i]);
+ }
+ }
+
+ /* Sending msg */
+ if(sendF1APMsg() != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Response failed");
+ ret = RFAILED;
+ break;
+ }
+ break;
+ }
+ FreeUeContextSetupRsp(f1apMsg);
+ return ret;
+}/* End of BuildAndSendUeContextSetupRsp */
+/*******************************************************************
+*
+* @brief Build And Send Ue Context Rsp
+*
+* @details
+*
+* Function : BuildAndSendUeCtxtRsp
+*
+* Functionality : Build And Send Ue Context Rsp
+
+* @params[in]
+* @return sucess = ROK
+* failure = RFAILED
+*
+* ****************************************************************/
+uint8_t BuildAndSendUeCtxtRsp(uint8_t cellId, uint8_t ueIdx)
+{
+ uint8_t cellIdx = 0, actionType = 0;
+
+ GET_CELL_IDX(cellId, cellIdx);
+ actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType;
+
+ switch(actionType)
{
- /*TODO : Negative case*/
- // BuildAndSendUeContextSetupRsp(ueIdx, cellId);
- DU_LOG("\nERROR --> F1AP: Failed to process UE CNTXT SETUP REQ at procF1UeContextSetupReq()");
- }
- else
- ret = duProcUeContextSetupRequest(duUeCb);
-
- freeAperDecodeF1UeContextSetupReq(ueSetReq);
- return ret;
+ case UE_CTXT_SETUP:
+ {
+ BuildAndSendUeContextSetupRsp(cellId,ueIdx);
+ break;
+ }
+ case UE_CTXT_MOD:
+ {
+ BuildAndSendUeContextModRsp(cellId, ueIdx);
+ break;
+ }
+ default:
+ DU_LOG("ERROR --> F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
+ break;
+ }
+ return ROK;
}
/*******************************************************************
- * @brief Free the memory allocated for UE Setup response
+ *
+ * @brief deallocating the memory of F1reset msg
*
* @details
*
- * Function : FreeUeContextSetupRsp
+ * Function : FreeF1ResetReq
*
- * Functionality:
- * Free the memory allocated for UE Setup response
+ * Functionality :
+ * - freeing memory of F1reset request msg
+ *
+ * @params[in]
+ * @return void
*
- * @params[in] F1AP PDU for UE setup response
- * @return ROK - success
- * RFAILED - failure
*
* ****************************************************************/
-void FreeUeContextSetupRsp(F1AP_PDU_t *f1apMsg)
+void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
{
- uint8_t idx;
- UEContextSetupResponse_t *ueSetRsp = NULLP;
+ uint8_t idx =0 ;
+ Reset_t *f1ResetMsg;
if(f1apMsg)
{
- if(f1apMsg->choice.successfulOutcome)
+ if(f1apMsg->choice.initiatingMessage)
{
- ueSetRsp = &f1apMsg->choice.successfulOutcome->value.choice.\
- UEContextSetupResponse;
- if(ueSetRsp->protocolIEs.list.array)
+ f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
+
+ if(f1ResetMsg->protocolIEs.list.array)
{
- for(idx = 0; idx < ueSetRsp->protocolIEs.list.count; idx++)
+ for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
{
- if(ueSetRsp->protocolIEs.list.array[idx])
+ if(f1ResetMsg->protocolIEs.list.array[idx])
{
- switch(ueSetRsp->protocolIEs.list.array[idx]->id)
- {
- case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
- break;
- case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
- break;
- case ProtocolIE_ID_id_DUtoCURRCInformation:
- {
- CellGroupConfig_t *cellGrpCfg = NULLP;
- cellGrpCfg = &ueSetRsp->protocolIEs.list.array[idx]->value.choice.\
- DUtoCURRCInformation.cellGroupConfig;
- if(cellGrpCfg->buf != NULLP)
- {
- DU_FREE(cellGrpCfg->buf, cellGrpCfg->size);
- cellGrpCfg = NULLP;
- }
- break;
- }
- default:
- DU_LOG("\nERROR --> DUAPP: Invalid Id %ld at FreeUeContextSetupRsp()",\
- ueSetRsp->protocolIEs.list.array[idx]->id);
- break;
- }
- DU_FREE(ueSetRsp->protocolIEs.list.array[idx],\
- sizeof(UEContextSetupResponseIEs_t));
+ DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
}
}
- DU_FREE(ueSetRsp->protocolIEs.list.array, \
- ueSetRsp->protocolIEs.list.size);
+ DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
}
- DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
+ DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
}
DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
}
}
-
/*******************************************************************
*
- * @brief Builds Ue context Setup Rsp DU To CU Info
+ * @brief Build and Send F1reset request
*
* @details
*
- * Function : EncodeUeCntxtDuToCuInfo
- *
- * Functionality: Builds Ue context Setup Rsp DU To CU Info
+ * Function : BuildAndSendF1ResetReq
*
- * @params[in] CellGroupConfig_t *, CellGroupConfigRrc_t *
+ * Functionality:
+ * - Build and Send F1reset request msg
*
+ * @params[in]
* @return ROK - success
* RFAILED - failure
*
- ******************************************************************/
+ * ****************************************************************/
+uint8_t BuildAndSendF1ResetReq()
+{
+ uint8_t elementCnt=0;
+ uint8_t idx=0;
+ uint8_t ret= RFAILED;
+ Reset_t *f1ResetMsg = NULLP;
+ F1AP_PDU_t *f1apMsg = NULLP;
+ asn_enc_rval_t encRetVal;
+ DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
+ do
+ {
+ DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
+ if(f1apMsg == NULLP)
+ {
+ break;
+ }
+ f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
+ DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
+ if(f1apMsg->choice.initiatingMessage == NULLP)
+ {
+ break;
+ }
+ f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
+ f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
+ f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
-uint8_t EncodeUeCntxtDuToCuInfo(CellGroupConfig_t *duToCuCellGrp, CellGroupConfigRrc_t *duCellGrpCfg)
+ f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
+
+ elementCnt = 3;
+ f1ResetMsg->protocolIEs.list.count = elementCnt;
+ f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
+
+ /* Initialize the F1Setup members */
+ DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
+ if(f1ResetMsg->protocolIEs.list.array == NULLP)
+ {
+ break;
+ }
+ for(idx=0; idx<elementCnt; idx++)
+ {
+ DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
+ if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
+ {
+ break;
+ }
+ }
+
+ /*TransactionID*/
+ idx=0;
+ f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
+ f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
+ f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
+ f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
+
+ /*Cause*/
+ idx++;
+ f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
+ f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
+ f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
+ f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
+ f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
+
+ /*Reset Type*/
+ idx++;
+ f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
+ f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
+ f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
+ f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
+ f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
+
+ xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
+
+ /* Encode the F1SetupRequest type as APER */
+ memset(encBuf, 0, ENC_BUF_MAX_LEN);
+ encBufSize = 0;
+ encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
+ encBuf);
+
+ /* Encode results */
+ if(encRetVal.encoded == ENCODE_FAIL)
+ {
+ DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ break;
+ }
+ else
+ {
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
+ for(idx=0; idx< encBufSize; idx++)
+ {
+ printf("%x",encBuf[idx]);
+ }
+ }
+
+ if(sendF1APMsg() != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
+ break;
+ }
+
+ ret = ROK;
+ break;
+ }while(true);
+
+ FreeF1ResetReq(f1apMsg);
+ return ret;
+}
+/*******************************************************************
+ *
+ * @brief Build And Send F1ResetAck
+ *
+ * @details
+ *
+ * Function : BuildAndSendF1ResetAck
+ *
+ * Functionality:
+ * - Build And Send F1ResetRSP
+ *
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
{
- asn_enc_rval_t encRetVal;
+ uint8_t idx;
+ ResetAcknowledge_t *f1ResetAck;
- xer_fprint(stdout, &asn_DEF_CellGroupConfigRrc, duCellGrpCfg);
- memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
- encBufSize = 0;
- encRetVal = aper_encode(&asn_DEF_CellGroupConfigRrc, 0, duCellGrpCfg, PrepFinalEncBuf, encBuf);
- /* Encode results */
- if(encRetVal.encoded == ENCODE_FAIL)
- {
- DU_LOG( "\nERROR --> F1AP : Could not encode UeCntxtDuToCuInfo (at %s)\n",\
- encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
- return RFAILED;
- }
- else
+ if(f1apMsg)
{
- DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UeCntxtDuToCuInfo\n");
- for(int i=0; i< encBufSize; i++)
+ if(f1apMsg->choice.successfulOutcome)
{
- printf("%x",encBuf[i]);
+ f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
+
+ if(f1ResetAck->protocolIEs.list.array)
+ {
+ for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
+ {
+ if(f1ResetAck->protocolIEs.list.array[idx])
+ {
+ DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
+ }
+ }
+ DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
+ }
+ DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
}
+ DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
}
- duToCuCellGrp->size = encBufSize;
- DU_ALLOC(duToCuCellGrp->buf, duToCuCellGrp->size);
- if(!duToCuCellGrp->buf)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation failed in UeCntxtDuToCuInfo");
- }
- memcpy(duToCuCellGrp->buf, encBuf, duToCuCellGrp->size);
- return ROK;
}
/*******************************************************************
*
- * @brief Builds and sends the UE Setup Response
+ * @brief Build And Send F1ResetAck
*
* @details
*
- * Function : BuildAndSendUeContextSetupRsp
- *
- * Functionality: Constructs the UE Setup Response and sends
- * it to the DU through SCTP.
+ * Function : BuildAndSendF1ResetAck
*
- * @params[in]
+ * Functionality:
+ * - Build And Send F1ResetRSP
*
+ * @params[in]
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildAndSendUeContextSetupRsp(uint8_t ueIdx, uint8_t cellId)
+uint8_t BuildAndSendF1ResetAck()
{
- uint8_t idx, ret, cellIdx, elementCnt;
- uint32_t gnbCuUeF1apId; /* gNB-CU UE F1AP Id */
- uint32_t gnbDuUeF1apId; /* gNB-DU UE F1AP Id */
- asn_enc_rval_t encRetVal; /* Encoder return value */
- F1AP_PDU_t *f1apMsg = NULLP;
- UEContextSetupResponse_t *ueSetRsp = NULLP;
- CellGroupConfigRrc_t *cellGrpCfg = NULLP;
- DuUeCb *ueCb = NULLP;
-
- DU_LOG("\n INFO --> F1AP : Building UE Context Setup Response for cellId %d, ueIdx %d\n", cellId, ueIdx);
+ uint8_t idx = 0;
+ uint8_t elementCnt = 0;
+ uint8_t ret = RFAILED;
+ F1AP_PDU_t *f1apMsg = NULL;
+ ResetAcknowledge_t *f1ResetAck = NULLP;
+ asn_enc_rval_t encRetVal;
+ DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
- while(true)
- {
+ do{
+ /* Allocate the memory for F1ResetRequest_t */
DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
if(f1apMsg == NULLP)
{
- DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- ret = RFAILED;
+ DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
break;
}
- f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
- DU_ALLOC(f1apMsg->choice.successfulOutcome,
- sizeof(SuccessfulOutcome_t));
+ f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
+
+ DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
if(f1apMsg->choice.successfulOutcome == NULLP)
{
- DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- ret = RFAILED;
+ DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
break;
}
+ f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
+ f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
+ f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
- f1apMsg->choice.successfulOutcome->procedureCode = \
- ProcedureCode_id_UEContextSetup;
- f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
- f1apMsg->choice.successfulOutcome->value.present = \
- SuccessfulOutcome__value_PR_UEContextSetupResponse;
+ elementCnt = 1;
- ueSetRsp =
- &f1apMsg->choice.successfulOutcome->value.choice.UEContextSetupResponse;
- elementCnt = 3;
- ueSetRsp->protocolIEs.list.count = elementCnt;
- ueSetRsp->protocolIEs.list.size = \
- elementCnt * sizeof(UEContextSetupResponse_t *);
+ f1ResetAck->protocolIEs.list.count = elementCnt;
+ f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
- /* Initialize the UESetup members */
- DU_ALLOC(ueSetRsp->protocolIEs.list.array, \
- ueSetRsp->protocolIEs.list.size);
- if(ueSetRsp->protocolIEs.list.array == NULLP)
+ DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
+ if(f1ResetAck->protocolIEs.list.array == NULLP)
{
- DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed");
- ret = RFAILED;
+ DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
break;
}
for(idx=0; idx<elementCnt; idx++)
{
- DU_ALLOC(ueSetRsp->protocolIEs.list.array[idx],\
- sizeof(UEContextSetupResponseIEs_t));
- if(ueSetRsp->protocolIEs.list.array[idx] == NULLP)
+ DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
+ if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
{
- DU_LOG(" ERROR --> F1AP : Memory allocation for UE Setup Response failed");
- ret = RFAILED;
break;
}
}
- /* Fetching Ue Cb Info*/
- GET_CELL_IDX(cellId, cellIdx);
- gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
- gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
- ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
-
+ /*TransactionID*/
idx = 0;
- /*GNB CU UE F1AP ID*/
- ueSetRsp->protocolIEs.list.array[idx]->id = \
- ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
- ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
- ueSetRsp->protocolIEs.list.array[idx]->value.present = \
- UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
- ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
-
- /*GNB DU UE F1AP ID*/
- idx++;
- ueSetRsp->protocolIEs.list.array[idx]->id = \
- ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
- ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
- ueSetRsp->protocolIEs.list.array[idx]->value.present = \
- UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
- ueSetRsp->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
-
-
- /*DUtoCURRC Information */
- idx++;
- ueSetRsp->protocolIEs.list.array[idx]->id = \
- ProtocolIE_ID_id_DUtoCURRCInformation;
- ueSetRsp->protocolIEs.list.array[idx]->criticality = Criticality_reject;
- ueSetRsp->protocolIEs.list.array[idx]->value.present =\
- UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
- if(ueCb->f1UeDb)
- {
- if(ueCb->f1UeDb->duUeCfg.cellGrpCfg)
- {
- cellGrpCfg = (CellGroupConfigRrc_t*)ueCb->f1UeDb->duUeCfg.cellGrpCfg;
- ret = EncodeUeCntxtDuToCuInfo(&ueSetRsp->protocolIEs.list.array[idx]->value.\
- choice.DUtoCURRCInformation.cellGroupConfig, cellGrpCfg);
- /* Free UeContext Db created during Ue context Req */
- freeF1UeDb(ueCb->f1UeDb);
- ueCb->f1UeDb = NULLP;
- }
- }
- else
- {
- DU_LOG("\nERROR --> F1AP: Failed to form DUtoCU RRCInfo at BuildAndSendUeContextSetupRsp()");
- ret = RFAILED;
- }
- if(ret == RFAILED)
- break;
+ f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
+ f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
+ f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
+ f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
- /* Encode the UE context setup response type as APER */
- memset((uint8_t *)encBuf, 0, ENC_BUF_MAX_LEN);
+ /* Encode the F1SetupRequest type as UPER */
+ memset(encBuf, 0, ENC_BUF_MAX_LEN);
encBufSize = 0;
- encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
- encBuf);
- /* Encode results */
+ encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
+
+ /* Check encode results */
if(encRetVal.encoded == ENCODE_FAIL)
{
- DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
+ DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
- ret = RFAILED;
break;
}
else
{
- DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UE Context Setup Request\n");
+ DU_LOG("\nDUBUG --> F1AP : Created APER encoded buffer for F1ResetAck\n");
for(int i=0; i< encBufSize; i++)
{
printf("%x",encBuf[i]);
}
}
-
- /* Sending msg */
- if(SendF1APMsg(DU_APP_MEM_REGION,DU_POOL) != ROK)
+ /* Sending msg */
+ if(sendF1APMsg() != ROK)
{
- DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Request Failed");
- ret = RFAILED;
+ DU_LOG("\nERROR --> F1AP : Sending F1 Reset Acknowledgement failed");
break;
}
+
+ ret = ROK;
break;
- }
- FreeUeContextSetupRsp(f1apMsg);
+ }while(true);
+
+ FreeF1ResetAck(f1apMsg);
return ret;
-}/* End of BuildAndSendUeContextSetupRsp */
-/*******************************************************************
+}
+/******************************************************************
*
-* @brief Build And Send Ue Context Rsp
+* @brief free F1 reset msg allocated by aper_decoder
*
* @details
*
-* Function : BuildAndSendUeCtxtRsp
+* Function : freeAperDecodeF1ResetMsg
*
-* Functionality : Build And Send Ue Context Rsp
-
-* @params[in]
-* @return sucess = ROK
-* failure = RFAILED
+* Functionality: free F1 reset msg allocated by aper_decoder
+*
+* @params[in] Reset_t *f1ResetMsg
+* @return void
*
* ****************************************************************/
-uint8_t BuildAndSendUeCtxtRsp(uint8_t ueIdx, uint8_t cellId)
+
+void freeAperDecodeF1ResetMsg(Reset_t *f1ResetMsg)
{
- uint8_t cellIdx = 0, actionType = 0;
+ uint8_t ieIdx =0;
+ if(f1ResetMsg->protocolIEs.list.array)
+ {
+ for(ieIdx=0 ;ieIdx < f1ResetMsg->protocolIEs.list.count ; ieIdx++)
+ {
+ if(f1ResetMsg->protocolIEs.list.array[ieIdx])
+ {
+ free(f1ResetMsg->protocolIEs.list.array[ieIdx]);
+ }
+ }
+ free(f1ResetMsg->protocolIEs.list.array);
+ }
+}
- GET_CELL_IDX(cellId, cellIdx);
- actionType = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].f1UeDb->actionType;
+/******************************************************************
+ *
+ * @brief Processes DL RRC Message Transfer sent by CU
+ *
+ * @details
+ *
+ * Function : procF1ResetReq
+ *
+ * Functionality: Processes DL RRC Message Transfer sent by CU
+ *
+ * @params[in] F1AP_PDU_t ASN decoded F1AP message
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
+{
+ /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
+ uint8_t ieIdx = 0;
+ uint8_t ret = ROK;
+ Reset_t *f1ResetMsg = NULLP;
- switch(actionType)
+ DU_LOG("\nINFO --> Processing F1 reset request");
+ f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
+
+ for(ieIdx=0; ieIdx<f1ResetMsg->protocolIEs.list.count; ieIdx++)
{
- case UE_CTXT_SETUP:
- BuildAndSendUeContextSetupRsp(ueIdx, cellId);
- break;
- case UE_CTXT_MOD:
- //TODO: Build Ue context Modification Rsp
- break;
- default:
- DU_LOG("ERROR --> F1AP: Invalid Action Type %d at BuildAndSendUeCtxtRsp()", actionType);
- break;
+ switch(f1ResetMsg->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_TransactionID:
+ break;
+
+ case ProtocolIE_ID_id_Cause:
+ break;
+
+ case ProtocolIE_ID_id_ResetType:
+ {
+ break;
+ }
+ default:
+ break;
+ }
}
- return ROK;
+ ret = BuildAndSendF1ResetAck();
+ DU_LOG("\nINFO --> UE release is not supported for now");
+
+ freeAperDecodeF1ResetMsg(f1ResetMsg);
+
+ return ret;
}
/*******************************************************************
*
- * @brief deallocating the memory of F1reset msg
+ * @brief free the RRC delivery report
*
* @details
*
- * Function : FreeF1ResetReq
+ * Function : freeRrcDeliveryReport
*
- * Functionality :
- * - freeing memory of F1reset request msg
+ * Functionality: free the RRC delivery report
*
* @params[in]
- * @return void
- *
+ * @return ROK - success
+ * RFAILED - failure
*
* ****************************************************************/
-void FreeF1ResetReq(F1AP_PDU_t *f1apMsg)
+void freeRrcDeliveryReport(F1AP_PDU_t *f1apMsg )
{
- uint8_t idx =0 ;
- Reset_t *f1ResetMsg;
+ uint8_t idx=0;
+ RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
if(f1apMsg)
{
if(f1apMsg->choice.initiatingMessage)
{
- f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
-
- if(f1ResetMsg->protocolIEs.list.array)
+ rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
+ if(rrcDeliveryReport->protocolIEs.list.array)
{
- for(idx=0 ;idx < f1ResetMsg->protocolIEs.list.count ; idx++)
+ for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
+ idx++)
{
- if(f1ResetMsg->protocolIEs.list.array[idx])
+ if(rrcDeliveryReport->protocolIEs.list.array[idx])
{
- DU_FREE(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
- }
+ DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
+ sizeof(RRCDeliveryReportIEs_t));
+ }
}
- DU_FREE(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
+ DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
+ rrcDeliveryReport->protocolIEs.list.size);
}
- DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
+ DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
}
- DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
+ DU_FREE(f1apMsg,
+ sizeof(F1AP_PDU_t));
}
}
+
/*******************************************************************
- *
- * @brief Build and Send F1reset request
- *
- * @details
- *
- * Function : BuildAndSendF1ResetReq
- *
- * Functionality:
- * - Build and Send F1reset request msg
- *
- * @params[in]
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-uint8_t BuildAndSendF1ResetReq()
+*
+* @brief Builds and sends the RRC delivery report
+*
+* @details
+*
+* Function : BuildAndSendRrcDeliveryReport
+*
+* Functionality: Builds and sends the RRC delivery report
+*
+* @params[in]
+*
+* @return ROK - success
+* RFAILED - failure
+*
+* ****************************************************************/
+uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \
+ uint32_t gnbDuUeF1apId, RrcDeliveryReport *rrcDelivery)
{
- uint8_t elementCnt=0;
- uint8_t idx=0;
- uint8_t ret= RFAILED;
- Reset_t *f1ResetMsg = NULLP;
- F1AP_PDU_t *f1apMsg = NULLP;
- asn_enc_rval_t encRetVal;
- DU_LOG("\nINFO --> F1AP : Building F1 Reset request \n");
- do
- {
+ uint8_t ret = RFAILED;
+ uint8_t idx = 0;
+ uint8_t idx1 = 0;
+ uint8_t elementCnt = 0;
+ F1AP_PDU_t *f1apMsg = NULLP;
+ asn_enc_rval_t encRetVal;
+ RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
+
+ do{
+
+ DU_LOG("\nINFO --> F1AP : Building RRC delivery Message Transfer Message\n");
DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
if(f1apMsg == NULLP)
{
+ DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
break;
}
f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
- DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
+ DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
if(f1apMsg->choice.initiatingMessage == NULLP)
{
+ DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
break;
}
- f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_Reset;
- f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
- f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_Reset;
-
- f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
+ f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
+ f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
+ f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
- elementCnt = 3;
- f1ResetMsg->protocolIEs.list.count = elementCnt;
- f1ResetMsg->protocolIEs.list.size = elementCnt * sizeof(ResetIEs_t *);
+ rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
+ elementCnt = 4;
+ rrcDeliveryReport->protocolIEs.list.count = elementCnt;
+ rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
/* Initialize the F1Setup members */
- DU_ALLOC(f1ResetMsg->protocolIEs.list.array,f1ResetMsg->protocolIEs.list.size);
- if(f1ResetMsg->protocolIEs.list.array == NULLP)
+ DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
+ if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
{
+ DU_LOG(" ERROR --> F1AP : Memory allocation for RRC Delivery failed");
break;
}
- for(idx=0; idx<elementCnt; idx++)
+ for(idx =0 ;idx <elementCnt; idx++)
{
- DU_ALLOC(f1ResetMsg->protocolIEs.list.array[idx],sizeof(ResetIEs_t));
- if(f1ResetMsg->protocolIEs.list.array[idx] == NULLP)
+ DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
+ if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
{
break;
}
}
- /*TransactionID*/
- idx=0;
- f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
- f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
- f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_TransactionID;
- f1ResetMsg->protocolIEs.list.array[idx]->value.choice.TransactionID = 1;
+ idx1 = 0;
- /*Cause*/
- idx++;
- f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_Cause;
- f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_ignore;
- f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_Cause;
- f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.present = Cause_PR_radioNetwork;
- f1ResetMsg->protocolIEs.list.array[idx]->value.choice.Cause.choice.radioNetwork = CauseRadioNetwork_action_desirable_for_radio_reasons;
+ /*GNB CU UE F1AP ID*/
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
- /*Reset Type*/
- idx++;
- f1ResetMsg->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_ResetType;
- f1ResetMsg->protocolIEs.list.array[idx]->criticality = Criticality_reject;
- f1ResetMsg->protocolIEs.list.array[idx]->value.present = ResetIEs__value_PR_ResetType;
- f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.present = ResetType_PR_f1_Interface;
- f1ResetMsg->protocolIEs.list.array[idx]->value.choice.ResetType.choice.f1_Interface = ResetAll_reset_all;
+ /*GNB DU UE F1AP ID*/
+ idx1++;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
+
+ /*RRC delivery status*/
+ idx1++;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =\
+ rrcDelivery->rrcDeliveryStatus.deliveryStatus;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =\
+ rrcDelivery->rrcDeliveryStatus.triggeringMessage;
+
+ /* SRB ID */
+ idx1++;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
+ rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID = rrcDelivery->srbId;
xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
- /* Encode the F1SetupRequest type as APER */
+ /* Encode the RRC DELIVERY REPORT type as APER */
memset(encBuf, 0, ENC_BUF_MAX_LEN);
encBufSize = 0;
encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
/* Encode results */
if(encRetVal.encoded == ENCODE_FAIL)
{
- DU_LOG("\nERROR --> F1AP : Could not encode F1Reset structure (at %s)\n",\
+ DU_LOG("\nERROR --> F1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
break;
}
else
{
- DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for F1Reset\n");
- for(idx=0; idx< encBufSize; idx++)
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Delivery Msg \n");
+ for(idx=0; idx< encBufSize; idx++)
+ {
+ printf("%x",encBuf[idx]);
+ }
+ }
+
+ /* Sending msg */
+ if(sendF1APMsg() != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Sending RRC delivery msg request failed");
+ break;
+ }
+ ret = ROK;
+ break;
+
+ }while(true);
+
+ freeRrcDeliveryReport(f1apMsg);
+ return ret;
+}
+
+/*******************************************************************
+ *
+ * @brief Processes cells to be activated
+ *
+ * @details
+ *
+ * Function : extractCellsToBeActivated
+ *
+ * Functionality:
+ * - Processes cells to be activated list received in F1SetupRsp
+ *
+ * @params[in] void
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
+{
+ uint8_t ret = ROK;
+ uint16_t idx, nci, pci = 0;
+ Cells_to_be_Activated_List_Item_t cell;
+
+ for(idx=0; idx<cellsToActivate.list.count; idx++)
+ {
+ nci = 0;
+ cell = cellsToActivate.list.array[idx]->value.choice.Cells_to_be_Activated_List_Item;
+ bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
+
+ if(cell.nRPCI)
+ {
+ pci = *cell.nRPCI;
+ }
+ ret = duProcCellsToBeActivated(cell.nRCGI.pLMN_Identity.buf, nci, pci);
+ }
+ return ret;
+}
+/******************************************************************
+*
+* @brief Processes F1 Setup Response allocated by aper_decoder
+*
+* @details
+*
+* Function : freeF1SetupRsp
+*
+* Functionality: free F1 Setup Response allocated by aper_decoder
+*
+* @params[in] F1SetupResponse_t *f1SetRspMsg
+* @return void
+*
+* ****************************************************************/
+
+void freeAperDecodeF1SetupRsp(F1SetupResponse_t *f1SetRspMsg)
+{
+ uint8_t ieIdx =0;
+ uint8_t arrIdx =0;
+ Cells_to_be_Activated_List_t *cellToActivate =NULLP;
+ RRC_Version_t *rrcVer =NULLP;
+
+ if(f1SetRspMsg->protocolIEs.list.array)
+ {
+ for(ieIdx=0; ieIdx<f1SetRspMsg->protocolIEs.list.count; ieIdx++)
+ {
+ if(f1SetRspMsg->protocolIEs.list.array[ieIdx])
{
- printf("%x",encBuf[idx]);
- }
- }
+ switch(f1SetRspMsg->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_Cells_to_be_Activated_List:
+ {
+ cellToActivate =
+ &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.Cells_to_be_Activated_List;
+ if(cellToActivate->list.array)
+ {
+ for(arrIdx=0; arrIdx<cellToActivate->list.count ; arrIdx++)
+ {
+ if(cellToActivate->list.array[arrIdx])
+ {
- if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
- {
- DU_LOG("\nERROR --> F1AP : Sending F1 Reset request failed");
- break;
- }
+ if(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.\
+ pLMN_Identity.buf)
+ {
+ if(cellToActivate->list.array[0]->value.choice.\
+ Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf)
+ {
+ free(cellToActivate->list.array[0]->value.choice.\
+ Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf);
+ }
- ret = ROK;
- break;
- }while(true);
+ free(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
+ nRCGI.pLMN_Identity.buf);
+ }
+ free(cellToActivate->list.array[arrIdx]);
+ }
+ }
+ free(cellToActivate->list.array);
+ }
+ break;
+ }
+ case ProtocolIE_ID_id_TransactionID:
+ {
+ break;
+ }
+ case ProtocolIE_ID_id_gNB_CU_Name:
+ {
+ free(f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_Name.buf);
+ break;
+ }
+ case ProtocolIE_ID_id_GNB_CU_RRC_Version:
+ {
+ rrcVer = &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
+ if(rrcVer->latest_RRC_Version.buf)
+ {
+ if(rrcVer->iE_Extensions)
+ {
+ if(rrcVer->iE_Extensions->list.array)
+ {
+ if(rrcVer->iE_Extensions->list.array[0])
+ {
+ if(rrcVer->iE_Extensions->list.\
+ array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf)
+ {
+ free(rrcVer->iE_Extensions->list.\
+ array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf);
+ }
+ free(rrcVer->iE_Extensions->list.array[0]);
+ }
+ free(rrcVer->iE_Extensions->list.array);
+ }
+ free(rrcVer->iE_Extensions);
+ }
+ free(rrcVer->latest_RRC_Version.buf);
+ }
+ break;
- FreeF1ResetReq(f1apMsg);
- return ret;
+ }
+ default:
+ {
+ DU_LOG("\nERROR --> DU_APP : Invalid IE received in F1SetupRsp:%ld",
+ f1SetRspMsg->protocolIEs.list.array[ieIdx]->id);
+ }
+ }
+ free(f1SetRspMsg->protocolIEs.list.array[ieIdx]);
+ }
+ }
+ free(f1SetRspMsg->protocolIEs.list.array);
+ }
}
-/*******************************************************************
+/******************************************************************
*
- * @brief Build And Send F1ResetAck
+ * @brief Processes F1 Setup Response sent by CU
*
* @details
*
- * Function : BuildAndSendF1ResetAck
+ * Function : procF1SetupRsp
*
- * Functionality:
- * - Build And Send F1ResetRSP
+ * Functionality: Processes F1 Setup Response sent by CU
*
+ * @params[in] F1AP_PDU_t ASN decoded F1AP message
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-void FreeF1ResetAck(F1AP_PDU_t *f1apMsg)
+uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg)
{
- uint8_t idx;
- ResetAcknowledge_t *f1ResetAck;
+ uint8_t ret = ROK;
+ uint16_t idx =0;
+ F1SetupResponse_t *f1SetRspMsg = NULLP;
+ GNB_CU_Name_t *cuName = NULLP;
+ F1SetupRsp f1SetRspDb;
+ RRC_Version_t *rrcVer =NULLP;
+
+ memset(&f1SetRspDb, 0, sizeof(F1SetupRsp));
- if(f1apMsg)
+ DU_LOG("\nINFO --> F1AP : F1 Setup Response received");
+ f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
+
+ for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
{
- if(f1apMsg->choice.successfulOutcome)
+ switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
{
- f1ResetAck= &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
-
- if(f1ResetAck->protocolIEs.list.array)
- {
- for(idx=0; idx<f1ResetAck->protocolIEs.list.count ; idx++)
+ case ProtocolIE_ID_id_Cells_to_be_Activated_List:
{
- if(f1ResetAck->protocolIEs.list.array[idx])
- {
- DU_FREE(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
- }
+ extractCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
+ value.choice.Cells_to_be_Activated_List);
+ break;
}
- DU_FREE(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
- }
- DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
+ case ProtocolIE_ID_id_TransactionID:
+ {
+ f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
+ value.choice.TransactionID;
+ break;
+ }
+ case ProtocolIE_ID_id_gNB_CU_Name:
+ {
+ cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
+ value.choice.GNB_CU_Name;
+ strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
+ break;
+ }
+ case ProtocolIE_ID_id_GNB_CU_RRC_Version:
+ {
+ rrcVer = &f1SetRspMsg->protocolIEs.list.array[idx]->value.choice.RRC_Version;
+ strcpy(f1SetRspDb.rrcVersion.rrcVer,
+ (const char*)rrcVer->latest_RRC_Version.buf);
+ break;
+ }
+ default:
+ DU_LOG("\nERROR --> DU_APP : Invalid IE received in F1SetupRsp:%ld",
+ f1SetRspMsg->protocolIEs.list.array[idx]->id);
}
- DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
+ duProcF1SetupRsp();
}
+
+ freeAperDecodeF1SetupRsp(f1SetRspMsg);
+ return ret;
}
-
/*******************************************************************
- *
- * @brief Build And Send F1ResetAck
- *
- * @details
- *
- * Function : BuildAndSendF1ResetAck
- *
- * Functionality:
- * - Build And Send F1ResetRSP
- *
- * @params[in]
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-uint8_t BuildAndSendF1ResetAck()
+*
+* @brief free GNB DU config update ack
+*
+* @details
+*
+* Function : freeAperDecodeGnbDuAck
+*
+* Functionality: Processes GNB DU config update ack And
+* added free part for the memory allocated by aper_decoder
+*
+* @params[in] F1AP_PDU_t ASN decoded F1AP message
+* @return ROK - success
+* RFAILED - failure
+*
+* ****************************************************************/
+
+void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck)
{
- uint8_t idx = 0;
- uint8_t elementCnt = 0;
- uint8_t ret = RFAILED;
- F1AP_PDU_t *f1apMsg = NULL;
- ResetAcknowledge_t *f1ResetAck = NULLP;
- asn_enc_rval_t encRetVal;
- DU_LOG("\nINFO --> F1AP : Building F1 Reset Acknowledgment \n");
+ uint8_t ieIdx = 0;
- do{
- /* Allocate the memory for F1ResetRequest_t */
- DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
- if(f1apMsg == NULLP)
+ if(gnbDuAck->protocolIEs.list.array)
+ {
+ for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
{
- DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- break;
+ if(gnbDuAck->protocolIEs.list.array[ieIdx])
+ {
+ free(gnbDuAck->protocolIEs.list.array[ieIdx]);
+ }
}
+ free(gnbDuAck->protocolIEs.list.array);
+ }
+}
- f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
+/*******************************************************************
+*
+* @brief Building result of gnb-du config update ack output
+*
+* @details
+*
+* Function : duProcGnbDuCfgUpdAckMsg
+*
+* Functionality:
+* Building output of gnb-du config update ack
+*
+* @params[in] transId
+* @return void
+*
+* ****************************************************************/
- DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
- if(f1apMsg->choice.successfulOutcome == NULLP)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- break;
- }
- f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
- f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_ResetAcknowledge;
- f1ResetAck = &f1apMsg->choice.successfulOutcome->value.choice.ResetAcknowledge;
+uint8_t duProcGnbDuCfgUpdAckMsg(uint8_t transId)
+{
+ uint8_t ueId =0 , ueIdx =0, ieIdx=0,arrIdx=0;
+ uint8_t cellId =0, cellIdx =0, crnti=0;
+ CmLList *f1apPduNode;
+ ReservedF1apPduInfo *f1apPduInfo;
+ F1AP_PDU_t *f1apMsgPdu = NULLP;
+ GNBDUConfigurationUpdate_t *gnbDuConfigUpdate = NULLP;
+ BIT_STRING_t *cellIdentity;
+ struct Served_Cells_To_Delete_ItemIEs *deleteItemIe;
+ Served_Cells_To_Delete_List_t *cellsToDelete;
+ Served_Cells_To_Delete_Item_t *deleteItem=NULLP;
- elementCnt = 1;
+ DU_LOG("\nINFO --> DU APP: GNB-DU config update Ack received ");
+ f1apPduNode = searchFromReservedF1apPduList(transId);
+ f1apPduInfo = (ReservedF1apPduInfo *)f1apPduNode->node;
+ f1apMsgPdu = (F1AP_PDU_t *)f1apPduInfo->f1apMsg;
+
+ if(f1apMsgPdu)
+ {
+ if(f1apMsgPdu->choice.initiatingMessage)
+ {
+ gnbDuConfigUpdate = &f1apMsgPdu->choice.initiatingMessage->value.choice.GNBDUConfigurationUpdate;
+ for(ieIdx=0; ieIdx < gnbDuConfigUpdate->protocolIEs.list.count; ieIdx++)
+ {
+ switch(gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_Served_Cells_To_Delete_List:
+ {
+ cellsToDelete = &gnbDuConfigUpdate->protocolIEs.list.array[ieIdx]->value.choice.\
+ Served_Cells_To_Delete_List;
+ if(cellsToDelete->list.array)
+ {
+ if(cellsToDelete->list.array[arrIdx])
+ {
+ deleteItemIe = (Served_Cells_To_Delete_ItemIEs_t*)cellsToDelete->list.array[arrIdx];
+ deleteItem=&deleteItemIe->value.choice.Served_Cells_To_Delete_Item;
+ if(deleteItem->oldNRCGI.nRCellIdentity.buf)
+ {
+ cellIdentity = &deleteItem->oldNRCGI.nRCellIdentity;
+ bitStringToInt(cellIdentity, &cellId);
+ }
+ }
+ }
- f1ResetAck->protocolIEs.list.count = elementCnt;
- f1ResetAck->protocolIEs.list.size = elementCnt*sizeof(ResetAcknowledgeIEs_t *);
+ GET_CELL_IDX(cellId, cellIdx);
+ if(duCb.actvCellLst[cellIdx] != NULLP)
+ {
+ for(ueIdx = 0; ueIdx < duCb.numUe; ueIdx++)
+ {
+ crnti = duCb.actvCellLst[cellIdx]->ueCb[ueIdx].crnti;
+ GET_UE_IDX(crnti,ueId);
+ BuildAndSendUeContextReleaseReq(cellId, ueId);
+ }
+ }
+ else
+ {
+ DU_LOG("ERROR --> DU_APP : duProcGnbDuCfgUpdAckMsg(): CellId [%d] not found", cellId);
+ return RFAILED;
+ }
- DU_ALLOC(f1ResetAck->protocolIEs.list.array, f1ResetAck->protocolIEs.list.size );
- if(f1ResetAck->protocolIEs.list.array == NULLP)
- {
- DU_LOG("\nERROR --> F1AP : Memory allocation for F1ResetAckIEs failed");
- break;
- }
+ break;
+ }
- for(idx=0; idx<elementCnt; idx++)
- {
- DU_ALLOC(f1ResetAck->protocolIEs.list.array[idx], sizeof(ResetAcknowledgeIEs_t));
- if(f1ResetAck->protocolIEs.list.array[idx] == NULLP)
- {
- break;
- }
+ default:
+ break;
+ }
+ }
}
- /*TransactionID*/
- idx = 0;
- f1ResetAck->protocolIEs.list.array[idx]->id = ProtocolIE_ID_id_TransactionID;
- f1ResetAck->protocolIEs.list.array[idx]->criticality = Criticality_reject;
- f1ResetAck->protocolIEs.list.array[idx]->value.present = ResetAcknowledgeIEs__value_PR_TransactionID;
- f1ResetAck->protocolIEs.list.array[idx]->value.choice.TransactionID = TRANS_ID;
+ }
+
+ FreeDUConfigUpdate(f1apMsgPdu);
+ deleteFromReservedF1apPduList(f1apPduNode);
+ return ROK;
+}
- xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
+/*******************************************************************
+*
+* @brief Processes GNB DU config update ack
+*
+* @details
+*
+* Function : procF1GNBDUCfgUpdAck
+*
+* Functionality: added free part for the memory allocated by aper_decoder
+*
+* @params[in] F1AP_PDU_t *f1apMsg
+* @return void
+*
+* ****************************************************************/
+uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
+{
+ uint8_t ieIdx=0,transId=0;
+ GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP;
- /* Encode the F1SetupRequest type as UPER */
- memset(encBuf, 0, ENC_BUF_MAX_LEN);
- encBufSize = 0;
- encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
+ DU_LOG("\nINFO --> F1AP : GNB-DU config update acknowledgment");
+ gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
- /* Check encode results */
- if(encRetVal.encoded == ENCODE_FAIL)
- {
- DU_LOG("\nERROR --> F1AP : Could not encode F1ResetAck structure (at %s)\n",\
- encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
- break;
- }
- else
- {
- DU_LOG("\nDUBUG --> F1AP : Created APER encoded buffer for F1ResetAck\n");
- for(int i=0; i< encBufSize; i++)
- {
- printf("%x",encBuf[i]);
- }
- }
- /* Sending msg */
- if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
+ for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
+ {
+ switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id)
{
- DU_LOG("\nERROR --> F1AP : Sending F1 Reset Acknowledgement failed");
- break;
+ case ProtocolIE_ID_id_TransactionID:
+ {
+ transId = gnbDuAck->protocolIEs.list.array[ieIdx]->value.choice.TransactionID;
+ break;
+ }
+ case ProtocolIE_ID_id_Cells_to_be_Activated_List:
+ {
+ break;
+ }
+ default :
+ {
+ DU_LOG("\nERROR --> F1AP: procF1GNBDUCfgUpdAck(): Invalid IE Received: %ld", \
+ gnbDuAck->protocolIEs.list.array[ieIdx]->id);
+ break;
+ }
}
+ }
+
+ duProcGnbDuCfgUpdAckMsg(transId);
+
+#if 0
+ /* presently we are not supporting F1 Reset from DU to CU , we are only
+ * supporting F1 Reset from CU to DU */
- ret = ROK;
- break;
- }while(true);
+ if(BuildAndSendF1ResetReq() != ROK)
+ {
+ return RFAILED;
+ }
+#endif
- FreeF1ResetAck(f1apMsg);
- return ret;
+ freeAperDecodeGnbDuAck(gnbDuAck);
+ return ROK;
}
/******************************************************************
*
-* @brief free F1 reset msg allocated by aper_decoder
+* @brief free DL RRC Message Transfer allocated by aper_decoder
*
* @details
*
-* Function : freeAperDecodeF1ResetMsg
+* Function : freeAperDecodef1DlRrcMsg
*
-* Functionality: free F1 reset msg allocated by aper_decoder
+* Functionality: free DL RRC Message Transfer allocated by aper_decoder
*
-* @params[in] Reset_t *f1ResetMsg
-* @return void
+* @params[in] DLRRCMessageTransfer_t *f1DlRrcMsg
+* @return ROK - success
+* RFAILED - failure
*
* ****************************************************************/
-void freeAperDecodeF1ResetMsg(Reset_t *f1ResetMsg)
+void freeAperDecodef1DlRrcMsg(DLRRCMessageTransfer_t *f1DlRrcMsg)
{
uint8_t ieIdx =0;
- if(f1ResetMsg->protocolIEs.list.array)
+ RRCContainer_t *rrcContainer = NULLP;
+
+ if(f1DlRrcMsg->protocolIEs.list.array)
{
- for(ieIdx=0 ;ieIdx < f1ResetMsg->protocolIEs.list.count ; ieIdx++)
+ for(ieIdx=0; ieIdx<f1DlRrcMsg->protocolIEs.list.count; ieIdx++)
{
- if(f1ResetMsg->protocolIEs.list.array[ieIdx])
+ if(f1DlRrcMsg->protocolIEs.list.array[ieIdx])
{
- free(f1ResetMsg->protocolIEs.list.array[ieIdx]);
+ switch(f1DlRrcMsg->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_SRBID:
+ break;
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ rrcContainer =&f1DlRrcMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
+ free(rrcContainer->buf);
+ }
+ case ProtocolIE_ID_id_ExecuteDuplication:
+ break;
+ case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
+ break;
+ break;
+ }
+ free(f1DlRrcMsg->protocolIEs.list.array[ieIdx]);
}
}
- free(f1ResetMsg->protocolIEs.list.array);
+ free(f1DlRrcMsg->protocolIEs.list.array);
}
}
-
/******************************************************************
*
* @brief Processes DL RRC Message Transfer sent by CU
*
* @details
*
- * Function : procF1ResetReq
+ * Function : procF1DlRrcMsgTrans
*
* Functionality: Processes DL RRC Message Transfer sent by CU
*
* RFAILED - failure
*
* ****************************************************************/
-uint8_t procF1ResetReq(F1AP_PDU_t *f1apMsg)
+uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
{
- /* we are currently not supporting Ue release. right now we are supporting only init case of fireset */
- uint8_t ieIdx = 0;
- uint8_t ret = ROK;
- Reset_t *f1ResetMsg = NULLP;
+ uint8_t idx, ret;
+ DLRRCMessageTransfer_t *f1DlRrcMsg = NULLP;
+ F1DlRrcMsg dlMsg;
+ memset(&dlMsg, 0, sizeof(F1DlRrcMsg));
- DU_LOG("\nINFO --> Processing F1 reset request");
- f1ResetMsg = &f1apMsg->choice.initiatingMessage->value.choice.Reset;
+ DU_LOG("\nINFO --> DU_APP : DL RRC message transfer Recevied");
+ f1DlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
- for(ieIdx=0; ieIdx<f1ResetMsg->protocolIEs.list.count; ieIdx++)
+ ret = ROK;
+
+ for(idx=0; idx<f1DlRrcMsg->protocolIEs.list.count; idx++)
+ {
+ switch(f1DlRrcMsg->protocolIEs.list.array[idx]->id)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ {
+ dlMsg.gnbCuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ {
+ dlMsg.gnbDuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_SRBID:
+ {
+ dlMsg.srbId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
+ break;
+ }
+ case ProtocolIE_ID_id_ExecuteDuplication:
+ dlMsg.execDup = true;
+ break;
+
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
+ {
+ dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
+ DU_ALLOC(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize);
+ if(dlMsg.rrcMsgPdu)
+ {
+ memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
+ dlMsg.rrcMsgSize);
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()");
+ return RFAILED;
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU_APP : RRC Container Size is invalid:%ld",\
+ f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
+ return RFAILED;
+ }
+ break;
+ }
+ case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
+ {
+ dlMsg.deliveryStatRpt = true;
+ break;
+ }
+ default:
+ DU_LOG("\nERROR --> DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
+ f1DlRrcMsg->protocolIEs.list.array[idx]->id);
+ }
+ }
+
+ ret = duProcDlRrcMsg(&dlMsg);
+
+ freeAperDecodef1DlRrcMsg(f1DlRrcMsg);
+ return ret;
+}
+/*******************************************************************
+ *
+* @brief Builds the DRB to be Setup Mod list
+*
+* @details
+*
+* Function :
+*
+* Functionality: Constructs the DRB to be Setup Mod list
+*
+* @params[in] DRBs_SetupMod_List_t *drbSet
+*
+* @return ROK - success
+* RFAILED - failure
+*
+* ****************************************************************/
+
+uint8_t BuildDrbSetupModList(DRBs_SetupMod_List_t *drbSet , DuUeCfg *ueCfg)
+{
+ uint8_t arrIdx =0;
+ uint8_t drbCnt =0;
+ struct DRBs_SetupMod_ItemIEs *drbItemIe;
+
+ drbCnt = 1;
+ drbSet->list.count = drbCnt;
+ drbSet->list.size = drbCnt * sizeof(DRBs_SetupMod_ItemIEs_t *);
+ DU_ALLOC(drbSet->list.array, drbSet->list.size);
+ if(drbSet->list.array == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
+ return RFAILED;
+ }
+ for(arrIdx=0; arrIdx<drbCnt; arrIdx++)
{
- switch(f1ResetMsg->protocolIEs.list.array[ieIdx]->id)
+ DU_ALLOC(drbSet->list.array[arrIdx], sizeof(DRBs_SetupMod_ItemIEs_t));
+ if(drbSet->list.array[arrIdx] == NULLP)
{
- case ProtocolIE_ID_id_TransactionID:
- break;
-
- case ProtocolIE_ID_id_Cause:
- break;
-
- case ProtocolIE_ID_id_ResetType:
- {
- break;
- }
+ DU_LOG("\nERROR --> F1AP : Memory allocation failed in BuildDrbToBeSetupModList");
+ return RFAILED;
+ }
- default:
- break;
+ drbItemIe = (struct DRBs_SetupMod_ItemIEs *)drbSet->list.array[arrIdx];
+ drbItemIe->id = ProtocolIE_ID_id_DRBs_SetupMod_Item;
+ drbItemIe->criticality = Criticality_reject;
+ drbItemIe->value.present = DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item;
+ drbItemIe->value.choice.DRBs_SetupMod_Item.dRBID = ueCfg->upTnlInfo[arrIdx].drbId;
+ if(fillDlTnlSetupList(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List,\
+ &ueCfg->upTnlInfo[arrIdx])!= ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Failed to fill DlTnl SetupList in BuildDrbToBeSetupModList");
+ return RFAILED;
}
+
}
- ret = BuildAndSendF1ResetAck();
- DU_LOG("\nINFO --> UE release is not supported for now");
-
- freeAperDecodeF1ResetMsg(f1ResetMsg);
- return ret;
+ return ROK;
}
-
/*******************************************************************
- *
- * @brief free the RRC delivery report
- *
- * @details
- *
- * Function : freeRrcDeliveryReport
- *
- * Functionality: free the RRC delivery report
- *
- * @params[in]
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-void freeRrcDeliveryReport(F1AP_PDU_t *f1apMsg )
+* @brief Free the memory allocated for DRB setup List
+*
+* @details
+*
+* Function : FreeDrbSetupModList
+*
+* Functionality:
+* Free the memory allocated for DRB setup list
+*
+* @params[in] DRBs_Setup_List_t *
+* @return void
+*
+* ****************************************************************/
+void FreeDrbSetupModList(DRBs_SetupMod_List_t *drbSetupList)
{
- uint8_t idx=0;
- RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
+ uint8_t arrIdx = 0;
+ DRBs_SetupMod_ItemIEs_t *drbItemIe = NULLP;
+
+ for(arrIdx = 0; arrIdx < drbSetupList->list.count; arrIdx++)
+ {
+ drbItemIe = ((DRBs_SetupMod_ItemIEs_t *)drbSetupList->list.array[arrIdx]);
+ freeDlTnlInfo(&drbItemIe->value.choice.DRBs_SetupMod_Item.dLUPTNLInformation_ToBeSetup_List);
+ }
+}
+/*******************************************************************
+* @brief Free the memory allocated for UE Context Mod Response
+*
+* @details
+*
+* Function : FreeUeContextModResp
+*
+* Functionality:
+* Free the memory allocated for UE Context Mod Response
+*
+* @params[in] F1AP_PDU_t *f1apMsg
+* @return void
+*
+* ****************************************************************/
+void FreeUeContextModResp(F1AP_PDU_t *f1apMsg)
+{
+ uint8_t ieIdx;
+ UEContextModificationResponse_t *ueContextModifyRes = NULLP;
if(f1apMsg)
{
- if(f1apMsg->choice.initiatingMessage)
+ if(f1apMsg->choice.successfulOutcome)
{
- rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
- if(rrcDeliveryReport->protocolIEs.list.array)
- {
- for(idx =0 ;idx <rrcDeliveryReport->protocolIEs.list.count ;
- idx++)
- {
- if(rrcDeliveryReport->protocolIEs.list.array[idx])
- {
- DU_FREE(rrcDeliveryReport->protocolIEs.list.array[idx],
- sizeof(RRCDeliveryReportIEs_t));
- }
- }
- DU_FREE(rrcDeliveryReport->protocolIEs.list.array,
- rrcDeliveryReport->protocolIEs.list.size);
- }
- DU_FREE(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
+ ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
+ if(ueContextModifyRes->protocolIEs.list.array)
+ {
+ for(ieIdx=0 ; ieIdx<ueContextModifyRes->protocolIEs.list.count; ieIdx++)
+ {
+ if(ueContextModifyRes->protocolIEs.list.array[ieIdx])
+ {
+ switch(ueContextModifyRes->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_DRBs_SetupMod_List:
+ {
+ FreeDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
+ value.choice.DRBs_SetupMod_List));
+ break;
+ }
+ }
+ DU_FREE(ueContextModifyRes->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationResponse_t));
+ }
+
+ }
+ DU_FREE(ueContextModifyRes->protocolIEs.list.array, ueContextModifyRes->protocolIEs.list.size);
+ }
+ DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
}
- DU_FREE(f1apMsg,
- sizeof(F1AP_PDU_t));
+ DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
}
}
-/*******************************************************************
+/*****************************************************************i
*
-* @brief Builds and sends the RRC delivery report
+* @brief Creating the ue context modifcation response and sending
*
* @details
*
-* Function : BuildAndSendRrcDeliveryReport
-*
-* Functionality: Builds and sends the RRC delivery report
+* Function : BuildAndSendUeContextModRsp
*
-* @params[in]
+* Functionality:
+* - Creating the ue context modifcation response
*
+* @params[in] uint8_t cellId,uint8_t ueIdx
* @return ROK - success
* RFAILED - failure
*
* ****************************************************************/
-uint8_t BuildAndSendRrcDeliveryReport(uint32_t gnbCuUeF1apId, \
- uint32_t gnbDuUeF1apId, RrcDeliveryReport *rrcDelivery)
+uint8_t BuildAndSendUeContextModRsp(uint8_t cellId,uint8_t ueIdx)
{
- uint8_t ret = RFAILED;
- uint8_t idx = 0;
- uint8_t idx1 = 0;
- uint8_t elementCnt = 0;
- F1AP_PDU_t *f1apMsg = NULLP;
- asn_enc_rval_t encRetVal;
- RRCDeliveryReport_t *rrcDeliveryReport= NULLP;
+ uint8_t ieIdx = 0;
+ uint8_t cellIdx =0;
+ uint8_t elementCnt = 0;
+ uint8_t ret = RFAILED;
+ uint32_t gnbCuUeF1apId; /* gNB-CU UE F1AP Id */
+ uint32_t gnbDuUeF1apId; /* gNB-DU UE F1AP Id */
+ F1AP_PDU_t *f1apMsg = NULLP;
+ asn_enc_rval_t encRetVal;
+ UEContextModificationResponse_t *ueContextModifyRes = NULLP;
+ DuUeCb *ueCb = NULLP;
- do{
+ DU_LOG("\nINFO --> F1AP : Building Ue context modification response\n");
- DU_LOG("\nINFO --> F1AP : Building RRC delivery Message Transfer Message\n");
+ while(1)
+ {
DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
if(f1apMsg == NULLP)
{
- DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- break;
+ DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
+ break;
}
- f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
- DU_ALLOC(f1apMsg->choice.initiatingMessage,sizeof(InitiatingMessage_t));
- if(f1apMsg->choice.initiatingMessage == NULLP)
+
+ f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
+
+ DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
+ if(f1apMsg->choice.successfulOutcome == NULLP)
{
- DU_LOG(" ERROR --> F1AP : Memory allocation for F1AP-PDU failed");
- break;
+ DU_LOG("\nERROR --> F1AP : Memory allocation for F1AP-PDU failed Ue context modification");
+ break;
}
- f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_RRCDeliveryReport;
- f1apMsg->choice.initiatingMessage->criticality = Criticality_ignore;
- f1apMsg->choice.initiatingMessage->value.present = InitiatingMessage__value_PR_RRCDeliveryReport;
+ f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_UEContextModification;
+ f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
+ f1apMsg->choice.successfulOutcome->value.present = SuccessfulOutcome__value_PR_UEContextModificationResponse;
- rrcDeliveryReport = &f1apMsg->choice.initiatingMessage->value.choice.RRCDeliveryReport;
- elementCnt = 4;
- rrcDeliveryReport->protocolIEs.list.count = elementCnt;
- rrcDeliveryReport->protocolIEs.list.size = elementCnt * sizeof(RRCDeliveryReportIEs_t *);
+ ueContextModifyRes =&f1apMsg->choice.successfulOutcome->value.choice.UEContextModificationResponse;
- /* Initialize the F1Setup members */
- DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array, rrcDeliveryReport->protocolIEs.list.size);
- if(rrcDeliveryReport->protocolIEs.list.array == NULLP)
+ elementCnt = 3;
+ ueContextModifyRes->protocolIEs.list.count = elementCnt;
+ ueContextModifyRes->protocolIEs.list.size = elementCnt*sizeof(UEContextModificationResponse_t*);
+
+ /* Initialize the UE context modification members */
+ DU_ALLOC(ueContextModifyRes->protocolIEs.list.array, ueContextModifyRes->protocolIEs.list.size);
+ if(ueContextModifyRes->protocolIEs.list.array == NULLP)
{
- DU_LOG(" ERROR --> F1AP : Memory allocation for RRC Delivery failed");
- break;
+ DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
+ break;
}
- for(idx =0 ;idx <elementCnt; idx++)
+
+ for(ieIdx=0 ; ieIdx<elementCnt; ieIdx++)
{
- DU_ALLOC(rrcDeliveryReport->protocolIEs.list.array[idx], sizeof(RRCDeliveryReportIEs_t));
- if(rrcDeliveryReport->protocolIEs.list.array[idx] == NULLP)
- {
- break;
- }
+ DU_ALLOC(ueContextModifyRes->protocolIEs.list.array[ieIdx], sizeof(UEContextModificationResponse_t));
+ if(ueContextModifyRes->protocolIEs.list.array[ieIdx] == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : Memory allocation for UE context modifcation Request failed");
+ break;
+ }
}
- idx1 = 0;
-
- /*GNB CU UE F1AP ID*/
- rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_CU_UE_F1AP_ID;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
-
- /*GNB DU UE F1AP ID*/
- idx1++;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_reject;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_GNB_DU_UE_F1AP_ID;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
+ /* Fetching Ue Cb Info*/
+ GET_CELL_IDX(cellId, cellIdx);
+ gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
+ gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
+ ueCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1];
- /*RRC delivery status*/
- idx1++;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_RRCDeliveryStatus;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_RRCDeliveryStatus;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.delivery_status =\
- rrcDelivery->rrcDeliveryStatus.deliveryStatus;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.RRCDeliveryStatus.triggering_message =\
- rrcDelivery->rrcDeliveryStatus.triggeringMessage;
+ ieIdx=0;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
+ UEContextModificationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID = gnbCuUeF1apId;
- /* SRB ID */
- idx1++;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->id = ProtocolIE_ID_id_SRBID;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->criticality = Criticality_ignore;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->value.present = RRCDeliveryReportIEs__value_PR_SRBID;
- rrcDeliveryReport->protocolIEs.list.array[idx1]->value.choice.SRBID = rrcDelivery->srbId;
+ ieIdx++;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present=\
+ UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID = gnbDuUeF1apId;
+ ieIdx++;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_DRBs_SetupMod_List;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->criticality = Criticality_reject;
+ ueContextModifyRes->protocolIEs.list.array[ieIdx]->value.present =\
+ UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
+ if(ueCb->f1UeDb)
+ {
+ ret = BuildDrbSetupModList(&(ueContextModifyRes->protocolIEs.list.array[ieIdx]->\
+ value.choice.DRBs_SetupMod_List) , &ueCb->f1UeDb->duUeCfg);
+ if(ret != ROK)
+ {
+ DU_LOG( "\nERROR --> F1AP : Failed to build drb setupmod List ");
+ break;
+ }
+ freeF1UeDb(ueCb->f1UeDb);
+ ueCb->f1UeDb = NULLP;
+ }
xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
- /* Encode the RRC DELIVERY REPORT type as APER */
+ /* Encode the F1SetupRequest type as APER */
memset(encBuf, 0, ENC_BUF_MAX_LEN);
encBufSize = 0;
- encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,\
- encBuf);
+ encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf,encBuf);
/* Encode results */
if(encRetVal.encoded == ENCODE_FAIL)
{
- DU_LOG("\nERROR --> F1AP : Could not encode RRC Delivery Msg structure (at %s)\n",\
- encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
- break;
+ DU_LOG( "\nERROR --> F1AP : Could not encode UE Context Setup Request structure (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ ret = RFAILED;
+ break;
}
else
{
- DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for RRC Delivery Msg \n");
- for(idx=0; idx< encBufSize; idx++)
- {
- printf("%x",encBuf[idx]);
- }
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UE Context Modification Response\n");
+ for(int i=0; i< encBufSize; i++)
+ {
+ printf("%x",encBuf[i]);
+ }
}
- /* Sending msg */
- if(SendF1APMsg(DU_APP_MEM_REGION, DU_POOL) != ROK)
+ /* Sending msg */
+ if(sendF1APMsg() != ROK)
{
- DU_LOG("\nERROR --> F1AP : Sending RRC delivery msg request failed");
- break;
+ DU_LOG("\nERROR --> F1AP : Sending UE Context Setup Res Failed");
+ ret = RFAILED;
+ break;
}
- ret = ROK;
break;
+ }
+ FreeUeContextModResp(f1apMsg);
+ return ret;
+}
+/*******************************************************************
+ *
+ * @brief Deallocating the memory allocated by the aper decoder
+ * for QOSInfo
+ *
+ * @details
+ *
+ * Function : freeAperDecodeQosInfo
+ *
+ * Functionality: Deallocating the memory allocated for QOSInfo
+ *
+ * @params[in] QoSFlowLevelQoSParameters_t *drbQos
+ *
+ * @return void
+ *
+ * ****************************************************************/
- }while(true);
+void freeAperDecodeQosInfo(QoSFlowLevelQoSParameters_t *drbQos)
+{
+ if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI != NULLP)
+ {
+ if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow!=NULLP)
+ {
+ if(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume!=NULLP)
+ {
+ free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->maxDataBurstVolume);
+ }
+ free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI->averagingWindow);
+ }
+ free(drbQos->qoS_Characteristics.choice.non_Dynamic_5QI);
+ }
+}
+/*******************************************************************
+ *
+ * @brief Deallocating the memory allocated by the aper decoder
+ * for UlTnlInfoforDrb
+ *
+ * @details
+ *
+ * Function : freeAperDecodeUlTnlInfoforDrbSetupMod
+ *
+ * Functionality: Deallocating memory allocated for UlTnlInfoforDrb
+ *
+ * @params[in] ULUPTNLInformation_ToBeSetup_List_t *ulInfo
+ *
+ * @return void
+ *
+ * ****************************************************************/
+void freeAperDecodeUlTnlInfoforDrbSetupMod(ULUPTNLInformation_ToBeSetup_List_t *ulInfo)
+{
+ uint8_t arrIdx =0;
- freeRrcDeliveryReport(f1apMsg);
- return ret;
+ if(ulInfo->list.array)
+ {
+ for(arrIdx=0; arrIdx<ulInfo->list.count ; arrIdx++)
+ {
+ if(ulInfo->list.array[arrIdx])
+ {
+ if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel )
+ {
+ if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->transportLayerAddress.buf)
+ {
+ if(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->gTP_TEID.buf)
+ {
+ free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
+ gTP_TEID.buf);
+ }
+ free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel->\
+ transportLayerAddress.buf);
+ }
+ free(ulInfo->list.array[arrIdx]->uLUPTNLInformation.choice.gTPTunnel);
+ }
+ free(ulInfo->list.array[arrIdx]);
+ }
+ }
+ free(ulInfo->list.array);
+ }
}
-
/*******************************************************************
*
- * @brief Processes cells to be activated
+ * @brief Deallocating the memory allocated by the aper decoder
+ * for DrbSetupModItem
*
* @details
*
- * Function : extractCellsToBeActivated
+ * Function : freeAperDecodeDrbSetupModItem
*
- * Functionality:
- * - Processes cells to be activated list received in F1SetupRsp
+ * Functionality: Deallocating memory allocated for DrbSetupModItem
*
- * @params[in] void
- * @return ROK - success
- * RFAILED - failure
+ * @params[in] DRBs_ToBeSetupMod_Item_t *drbItem
+ *
+ * @return void
*
* ****************************************************************/
-uint8_t extractCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
+void freeAperDecodeDrbSetupModItem(DRBs_ToBeSetupMod_Item_t *drbItem)
{
- uint8_t ret = ROK;
- uint16_t idx, nci, pci = 0;
- Cells_to_be_Activated_List_Item_t cell;
+ uint8_t arrIdx =0;
+ SNSSAI_t *snssai =NULLP;
+ Flows_Mapped_To_DRB_List_t *flowMap = NULLP;
- for(idx=0; idx<cellsToActivate.list.count; idx++)
+ drbItem->qoSInformation.present = QoSInformation_PR_choice_extension;
+ switch(drbItem->qoSInformation.present)
{
- nci = 0;
- cell = cellsToActivate.list.array[idx]->value.choice.Cells_to_be_Activated_List_Item;
- bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
+ case QoSInformation_PR_NOTHING:
+ break;
+ case QoSInformation_PR_eUTRANQoS:
+ {
+ if(drbItem->qoSInformation.choice.eUTRANQoS)
+ {
+ free(drbItem->qoSInformation.choice.eUTRANQoS);
+ }
+ break;
+ }
+ case QoSInformation_PR_choice_extension:
+ {
+ if(drbItem->qoSInformation.choice.choice_extension)
+ {
+ freeAperDecodeQosInfo(&drbItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.dRB_QoS);
+ snssai = &drbItem->qoSInformation.choice.choice_extension->value.choice.DRB_Information.sNSSAI;
+ if(snssai->sST.buf)
+ {
+ free(snssai->sST.buf);
+ }
+ if(snssai->sD)
+ {
+ if(snssai->sD->buf)
+ {
+ free(snssai->sD->buf);
+ }
+ free(snssai->sD);
+ }
+
+ flowMap = &drbItem->qoSInformation.choice.choice_extension->value.choice.\
+ DRB_Information.flows_Mapped_To_DRB_List;
+ if(flowMap->list.array)
+ {
+ for(arrIdx=0; arrIdx<flowMap->list.count; arrIdx++)
+ {
+ if(flowMap->list.array[arrIdx] )
+ {
+ freeAperDecodeQosInfo(&flowMap->list.array[arrIdx]->qoSFlowLevelQoSParameters);
+ free(flowMap->list.array[arrIdx]);
+ }
+ }
+ free(flowMap->list.array);
+ }
+
+ free(drbItem->qoSInformation.choice.choice_extension);
+ }
+ break;
+ }
- if(cell.nRPCI)
- {
- pci = *cell.nRPCI;
- }
- ret = duProcCellsToBeActivated(cell.nRCGI.pLMN_Identity.buf, nci, pci);
}
- return ret;
+ freeAperDecodeUlTnlInfoforDrbSetupMod(&drbItem->uLUPTNLInformation_ToBeSetup_List);
+ if(drbItem->uLConfiguration)
+ {
+ free(drbItem->uLConfiguration);
+ }
}
-/******************************************************************
-*
-* @brief Processes F1 Setup Response allocated by aper_decoder
-*
-* @details
-*
-* Function : freeF1SetupRsp
-*
-* Functionality: free F1 Setup Response allocated by aper_decoder
-*
-* @params[in] F1SetupResponse_t *f1SetRspMsg
-* @return void
-*
-* ****************************************************************/
-void freeAperDecodeF1SetupRsp(F1SetupResponse_t *f1SetRspMsg)
+/*******************************************************************
+ *
+ * @brief Deallocating the memory allocated by the aper decoder
+ * for DrbToBeSetupModList
+ *
+ * @details
+ *
+ * Function : freeAperDecodeDrbToBeSetupModList
+ *
+ * Functionality: Deallocating memory allocated for DrbToBeSetupModList
+ *
+ * @params[in] DRBs_ToBeSetupMod_List_t *drbSet
+ *
+ * @return void
+ *
+ * ****************************************************************/
+
+void freeAperDecodeDrbToBeSetupModList(DRBs_ToBeSetupMod_List_t *drbSet)
{
- uint8_t ieIdx =0;
uint8_t arrIdx =0;
- Cells_to_be_Activated_List_t *cellToActivate =NULLP;
- RRC_Version_t *rrcVer =NULLP;
+ struct DRBs_ToBeSetupMod_ItemIEs *drbItemIe;
- if(f1SetRspMsg->protocolIEs.list.array)
+ if(drbSet->list.array)
{
- for(ieIdx=0; ieIdx<f1SetRspMsg->protocolIEs.list.count; ieIdx++)
+ for(arrIdx=0; arrIdx<drbSet->list.count ; arrIdx++)
{
- if(f1SetRspMsg->protocolIEs.list.array[ieIdx])
- {
- switch(f1SetRspMsg->protocolIEs.list.array[ieIdx]->id)
- {
- case ProtocolIE_ID_id_Cells_to_be_Activated_List:
- {
- cellToActivate =
- &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.Cells_to_be_Activated_List;
- if(cellToActivate->list.array)
- {
- for(arrIdx=0; arrIdx<cellToActivate->list.count ; arrIdx++)
- {
- if(cellToActivate->list.array[arrIdx])
- {
-
- if(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.nRCGI.\
- pLMN_Identity.buf)
- {
- if(cellToActivate->list.array[0]->value.choice.\
- Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf)
- {
- free(cellToActivate->list.array[0]->value.choice.\
- Cells_to_be_Activated_List_Item.nRCGI.nRCellIdentity.buf);
- }
-
- free(cellToActivate->list.array[0]->value.choice.Cells_to_be_Activated_List_Item.\
- nRCGI.pLMN_Identity.buf);
- }
- free(cellToActivate->list.array[arrIdx]);
- }
- }
- free(cellToActivate->list.array);
- }
- break;
- }
- case ProtocolIE_ID_id_TransactionID:
- {
- break;
- }
- case ProtocolIE_ID_id_gNB_CU_Name:
- {
- free(f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_Name.buf);
- break;
- }
- case ProtocolIE_ID_id_GNB_CU_RRC_Version:
- {
- rrcVer = &f1SetRspMsg->protocolIEs.list.array[ieIdx]->value.choice.RRC_Version;
- if(rrcVer->latest_RRC_Version.buf)
- {
- if(rrcVer->iE_Extensions)
- {
- if(rrcVer->iE_Extensions->list.array)
- {
- if(rrcVer->iE_Extensions->list.array[0])
- {
- if(rrcVer->iE_Extensions->list.\
- array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf)
- {
- free(rrcVer->iE_Extensions->list.\
- array[0]->extensionValue.choice.Latest_RRC_Version_Enhanced.buf);
- }
- free(rrcVer->iE_Extensions->list.array[0]);
- }
- free(rrcVer->iE_Extensions->list.array);
- }
- free(rrcVer->iE_Extensions);
- }
- free(rrcVer->latest_RRC_Version.buf);
- }
- break;
-
- }
- default:
- {
- DU_LOG("\nERROR --> DU_APP : Invalid IE received in F1SetupRsp:%ld",
- f1SetRspMsg->protocolIEs.list.array[ieIdx]->id);
- }
- }
- free(f1SetRspMsg->protocolIEs.list.array[ieIdx]);
- }
+ if(drbSet->list.array[arrIdx] != NULLP)
+ {
+ if(arrIdx == 0)
+ {
+ drbItemIe = (DRBs_ToBeSetupMod_ItemIEs_t *)drbSet->list.array[arrIdx];
+ freeAperDecodeDrbSetupModItem(&(drbItemIe->value.choice.DRBs_ToBeSetupMod_Item));
+ }
+ free(drbSet->list.array[arrIdx]);
+ }
}
- free(f1SetRspMsg->protocolIEs.list.array);
+ free(drbSet->list.array);
}
+
}
-/******************************************************************
+/*******************************************************************
*
- * @brief Processes F1 Setup Response sent by CU
+ * @brief Deallocating the memory allocated by the aper decoder
+ * for UeContextModificationReqMsg
*
* @details
*
- * Function : procF1SetupRsp
+ * Function : freeAperDecodeUeContextModificationReqMsg
*
- * Functionality: Processes F1 Setup Response sent by CU
+ * Functionality: Deallocating memory allocated for
+ * UeContextModificationReqMsg
*
- * @params[in] F1AP_PDU_t ASN decoded F1AP message
- * @return ROK - success
- * RFAILED - failure
+ * @params[in] UEContextModificationRequest_t *UeContextModifyReq
+ *
+ * @return void
*
* ****************************************************************/
-uint8_t procF1SetupRsp(F1AP_PDU_t *f1apMsg)
+void freeAperDecodeUeContextModificationReqMsg(UEContextModificationRequest_t *UeContextModifyReq )
{
- uint8_t ret = ROK;
- uint16_t idx =0;
- F1SetupResponse_t *f1SetRspMsg = NULLP;
- GNB_CU_Name_t *cuName = NULLP;
- F1SetupRsp f1SetRspDb;
- RRC_Version_t *rrcVer =NULLP;
-
- memset(&f1SetRspDb, 0, sizeof(F1SetupRsp));
-
- DU_LOG("\nINFO --> F1AP : F1 Setup Response received");
- f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
+ uint8_t arrIdx, ieId;
- for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
+ if(UeContextModifyReq->protocolIEs.list.array)
{
- switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
+ for( arrIdx = 0 ; arrIdx<UeContextModifyReq->protocolIEs.list.count ; arrIdx++)
{
- case ProtocolIE_ID_id_Cells_to_be_Activated_List:
- {
- extractCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
- value.choice.Cells_to_be_Activated_List);
- break;
- }
- case ProtocolIE_ID_id_TransactionID:
- {
- f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
- value.choice.TransactionID;
- break;
- }
- case ProtocolIE_ID_id_gNB_CU_Name:
- {
- cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
- value.choice.GNB_CU_Name;
- strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
- break;
- }
- case ProtocolIE_ID_id_GNB_CU_RRC_Version:
- {
- rrcVer = &f1SetRspMsg->protocolIEs.list.array[idx]->value.choice.RRC_Version;
- strcpy(f1SetRspDb.rrcVersion.rrcVer,
- (const char*)rrcVer->latest_RRC_Version.buf);
- break;
- }
- default:
- DU_LOG("\nERROR --> DU_APP : Invalid IE received in F1SetupRsp:%ld",
- f1SetRspMsg->protocolIEs.list.array[idx]->id);
+ if(UeContextModifyReq->protocolIEs.list.array[arrIdx])
+ {
+ ieId = UeContextModifyReq->protocolIEs.list.array[arrIdx]->id;
+ switch(ieId)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
+ {
+ freeAperDecodeDrbToBeSetupModList(&UeContextModifyReq->protocolIEs.list.array[arrIdx]->\
+ value.choice.DRBs_ToBeSetupMod_List);
+ break;
+ }
+ }
+ free(UeContextModifyReq->protocolIEs.list.array[arrIdx]);
+ }
+ }
+ free(UeContextModifyReq->protocolIEs.list.array);
+ }
+}
+/*******************************************************************
+ *
+ * @brief processing the F1 UeContextModificationReq
+ *
+ * @details
+ *
+ * Function : procF1UeContextModificationReq
+ *
+ * Functionality: processing the F1 UeContextModificationReq
+ *
+ * @params[in] F1AP_PDU_t *f1apMsg
+ *
+ * @return
+ * ****************************************************************/
+uint8_t procF1UeContextModificationReq(F1AP_PDU_t *f1apMsg)
+{
+ UEContextModificationRequest_t *ueContextModifyReq = NULLP;
+ uint8_t ret = ROK, ieIdx = 0, lcId =0,cellIdx=0, ueIdx=0;
+ DuUeCb *duUeCb = NULLP;
+ DRBs_ToBeSetupMod_List_t *drbSetupModCfg;
+ uint32_t gnbCuUeF1apId, gnbDuUeF1apId;
+
+ ueContextModifyReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextModificationRequest;
+ for(ieIdx=0; (ieIdx < ueContextModifyReq->protocolIEs.list.count && ret == ROK); ieIdx++)
+ {
+ switch(ueContextModifyReq->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ {
+ gnbCuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ {
+ gnbDuUeF1apId = ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID;
+ break;
+ }
+ case ProtocolIE_ID_id_DRBs_ToBeSetupMod_List:
+ {
+ for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++)
+ {
+ for(ueIdx = 0; ueIdx < duCb.numUe; ueIdx++)
+ {
+ if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
+ (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
+ {
+
+ duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
+ lcId = getDrbLcId(&duUeCb->drbBitMap);
+ if(lcId != RFAILED)
+ {
+ DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
+ if(duUeCb->f1UeDb)
+ {
+ duUeCb->f1UeDb->actionType = UE_CTXT_MOD;
+ drbSetupModCfg = &ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.\
+ choice.DRBs_ToBeSetupMod_List;
+ if(extractDrbListToSetup(lcId, NULL, drbSetupModCfg ,drbSetupModCfg->list.count, \
+ &duUeCb->f1UeDb->duUeCfg))
+ {
+ DU_LOG("\nERROR --> DU APP : Failed at extractDrbListToSetup()");
+ ret = RFAILED;
+ }
+ }
+ }
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : wrong values of gnbCuUeF1apId and gnbDuUeF1apId ");
+ ret = RFAILED;
+ }
+ }
+ }
+ break;
+ }
}
- duProcF1SetupRsp();
}
-
- freeAperDecodeF1SetupRsp(f1SetRspMsg);
- return ret;
+ if(ret != RFAILED)
+ {
+ ret = duProcUeContextModReq(duUeCb);
+ }
+ freeAperDecodeUeContextModificationReqMsg(ueContextModifyReq);
+ return ret;
}
-/*******************************************************************
+/*****************************************************************i
*
-* @brief free GNB DU config update ack
+* @brief Free memory allocated for UE Context Release Request
*
* @details
*
-* Function : freeAperDecodeGnbDuAck
+* Function : FreeUeContextReleaseReq
*
-* Functionality: Processes GNB DU config update ack And
-* added free part for the memory allocated by aper_decoder
+* Functionality:
+* - Free memory allocated for UE Context Release Request
*
-* @params[in] F1AP_PDU_t ASN decoded F1AP message
-* @return ROK - success
-* RFAILED - failure
+* @params[in] F1AP_PDU_t *f1apMsg
+* @return void
*
-* ****************************************************************/
-
-void freeAperDecodeGnbDuAck(GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck)
+* *************************************************************/
+void FreeUeContextReleaseReq(F1AP_PDU_t *f1apMsg)
{
- uint8_t ieIdx = 0;
-
- if(gnbDuAck->protocolIEs.list.array)
+ uint8_t ieIdx;
+ UEContextReleaseRequest_t *ueReleaseReq = NULLP;
+
+ if(f1apMsg)
{
- for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
+ if(f1apMsg->choice.initiatingMessage)
{
- if(gnbDuAck->protocolIEs.list.array[ieIdx])
- {
- free(gnbDuAck->protocolIEs.list.array[ieIdx]);
- }
+ ueReleaseReq =&f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
+ if(ueReleaseReq->protocolIEs.list.array)
+ {
+ for(ieIdx=0 ; ieIdx<ueReleaseReq->protocolIEs.list.count; ieIdx++)
+ {
+ DU_FREE(ueReleaseReq->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseRequest_t));
+ }
+ DU_FREE(ueReleaseReq->protocolIEs.list.array, ueReleaseReq->protocolIEs.list.size);
+ }
+ DU_FREE(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
}
- free(gnbDuAck->protocolIEs.list.array);
+ DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
}
+
}
-/*******************************************************************
+/*****************************************************************i
*
-* @brief Processes GNB DU config update ack
+* @brief Build and Send UE Context Release Request
*
* @details
*
-* Function : procF1GNBDUCfgUpdAck
+* Function : BuildAndSendUeContextReleaseReq
*
-* Functionality: added free part for the memory allocated by aper_decoder
+* Functionality:
+* - Build and Send UE Context Release Request
*
-* @params[in] F1AP_PDU_t *f1apMsg
-* @return void
+* @params[in]
+* @return ROK - success
+* RFAILED - failure
*
-* ****************************************************************/
-uint8_t procF1GNBDUCfgUpdAck(F1AP_PDU_t *f1apMsg)
+* *************************************************************/
+uint8_t BuildAndSendUeContextReleaseReq(uint16_t cellId, uint8_t ueIdx)
+{
+ bool memAllocFail = false;
+ uint8_t ieIdx =0;
+ uint8_t ret = RFAILED;
+ uint16_t cellIdx =0;
+ uint16_t crnti = 0;
+ uint8_t elementCnt = 0;
+ uint32_t gnbCuUeF1apId =0; /* gNB-CU UE F1AP Id */
+ uint32_t gnbDuUeF1apId =0; /* gNB-DU UE F1AP Id */
+ asn_enc_rval_t encRetVal;
+ F1AP_PDU_t *f1apMsg = NULLP;
+ UEContextReleaseRequest_t *ueReleaseReq = NULLP;
+
+ DU_LOG("\nINFO --> Building the UE Context Release Request");
+ do
+ {
+ DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
+ if(f1apMsg == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for f1apMsg");
+ break;
+ }
+
+ f1apMsg->present = F1AP_PDU_PR_initiatingMessage;
+ DU_ALLOC(f1apMsg->choice.initiatingMessage, sizeof(InitiatingMessage_t));
+ if(f1apMsg->choice.initiatingMessage == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for\
+ initiatingMessage");
+ break;
+ }
+ f1apMsg->choice.initiatingMessage->procedureCode = ProcedureCode_id_UEContextReleaseRequest;
+ f1apMsg->choice.initiatingMessage->criticality = Criticality_reject;
+ f1apMsg->choice.initiatingMessage->value.present = \
+ InitiatingMessage__value_PR_UEContextReleaseRequest;
+
+ ueReleaseReq = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseRequest;
+
+ elementCnt = 2;
+
+ ueReleaseReq->protocolIEs.list.count = elementCnt;
+ ueReleaseReq->protocolIEs.list.size = elementCnt * sizeof(UEContextReleaseRequest_t *);
+
+ /* Initialize the F1Setup members */
+ DU_ALLOC(ueReleaseReq->protocolIEs.list.array,ueReleaseReq->protocolIEs.list.size);
+ if(ueReleaseReq->protocolIEs.list.array == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for IE array");
+ break;
+ }
+ for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
+ {
+ DU_ALLOC(ueReleaseReq->protocolIEs.list.array[ieIdx],\
+ sizeof(UEContextReleaseRequest_t));
+ if(ueReleaseReq->protocolIEs.list.array[ieIdx] == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): Memory allocation failed for IE elements");
+ memAllocFail = true;
+ break;
+ }
+ }
+ if(memAllocFail == true)
+ break;
+
+ /* Fetching Ue Cb Info*/
+ GET_CELL_IDX(cellId, cellIdx);
+ if(duCb.actvCellLst[cellIdx] == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): CellId[%d] does not exist", cellId);
+ break;
+ }
+ else
+ {
+ GET_CRNTI(crnti, ueIdx);
+ if(duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].crnti != crnti)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseReq(): crnti[%d] does not exist", crnti);
+ break;
+ }
+ gnbDuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbDuUeF1apId;
+ gnbCuUeF1apId = duCb.actvCellLst[cellIdx]->ueCb[ueIdx-1].gnbCuUeF1apId;
+ }
+
+ ieIdx=0;
+ ueReleaseReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
+ ueReleaseReq->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
+ ueReleaseReq->protocolIEs.list.array[ieIdx]->value.present = \
+ UEContextReleaseRequestIEs__value_PR_GNB_CU_UE_F1AP_ID;
+ ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =gnbCuUeF1apId;
+
+ ieIdx++;
+ ueReleaseReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
+ ueReleaseReq->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
+ ueReleaseReq->protocolIEs.list.array[ieIdx]->value.present =\
+ UEContextReleaseRequestIEs__value_PR_GNB_DU_UE_F1AP_ID;
+ ueReleaseReq->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =gnbDuUeF1apId;
+
+ xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
+
+ /* Encode the F1SetupRequest type as APER */
+ memset(encBuf, 0, ENC_BUF_MAX_LEN);
+ encBufSize = 0;
+ encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
+ /* Encode results */
+ if(encRetVal.encoded == ENCODE_FAIL)
+ {
+ DU_LOG("\nERROR --> F1AP : Could not encode UEContextReleaseRequest structure (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ break;
+ }
+ else
+ {
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UEContextReleaseRequest\n");
+ for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
+ {
+ printf("%x",encBuf[ieIdx]);
+ }
+ }
+
+ /* Sending msg */
+ if(sendF1APMsg() != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Sending UE Context Release Request failed");
+ break;
+ }
+ ret = ROK;
+ break;
+ }while(true);
+
+ FreeUeContextReleaseReq(f1apMsg);
+ return ret;
+}
+/*****************************************************************i
+ *
+ * @brief Free memory allocated for UE Context Release Complete
+ *
+ * @details
+ *
+ * Function : FreeUeContextReleaseComplete
+ *
+ * Functionality:
+ * - Free memory allocated for UE Context Release Complete
+ *
+ * @params[in] F1AP_PDU_t *f1apMsg
+ * @return void
+ *
+ * *************************************************************/
+void FreeUeContextReleaseComplete(F1AP_PDU_t *f1apMsg)
{
uint8_t ieIdx;
- GNBDUConfigurationUpdateAcknowledge_t *gnbDuAck = NULLP;
-
- DU_LOG("\nINFO --> F1AP : GNB-DU config update acknowledgment");
- gnbDuAck = &f1apMsg->choice.successfulOutcome->value.choice.GNBDUConfigurationUpdateAcknowledge;
-
- for(ieIdx=0; ieIdx < gnbDuAck->protocolIEs.list.count; ieIdx++)
+ UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
+
+ if(f1apMsg)
{
- switch(gnbDuAck->protocolIEs.list.array[ieIdx]->id)
+ if(f1apMsg->choice.successfulOutcome)
{
- case ProtocolIE_ID_id_TransactionID:
- break;
- case ProtocolIE_ID_id_Cells_to_be_Activated_List:
- break;
- default :
- DU_LOG("\nERROR --> F1AP: Invalid IE Received: %ld, at procF1GNBDUCfgUpdAck()", \
- gnbDuAck->protocolIEs.list.array[ieIdx]->id);
- break;
+ ueReleaseComplete =&f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
+ if(ueReleaseComplete->protocolIEs.list.array)
+ {
+ for(ieIdx=0 ; ieIdx<ueReleaseComplete->protocolIEs.list.count; ieIdx++)
+ {
+ DU_FREE(ueReleaseComplete->protocolIEs.list.array[ieIdx], sizeof(UEContextReleaseComplete_t));
+ }
+ DU_FREE(ueReleaseComplete->protocolIEs.list.array, ueReleaseComplete->protocolIEs.list.size);
+ }
+ DU_FREE(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
+ }
+ DU_FREE(f1apMsg, sizeof(F1AP_PDU_t));
+ }
+
+}
+/*****************************************************************i
+ *
+ * @brief Build and Send UE Context Release Complete
+ *
+ * @details
+ *
+ * Function : BuildAndSendUeContextReleaseComplete
+ *
+ * Functionality:
+ * - Build and Send UE Context Release Complete
+ *
+ * @params[in] cellId, gnbCuUeF1apId, gnbDuUeF1apId
+ * @return ROK - success
+ * RFAILED - failure
+ *
+ * *************************************************************/
+uint8_t BuildAndSendUeContextReleaseComplete(uint16_t cellId, uint32_t gnbCuUeF1apId, uint32_t gnbDuUeF1apId)
+{
+ bool memAllocFail = false;
+ uint8_t ieIdx =0, ret = RFAILED, elementCnt = 0;
+ asn_enc_rval_t encRetVal;
+ F1AP_PDU_t *f1apMsg = NULLP;
+ UEContextReleaseComplete_t *ueReleaseComplete = NULLP;
+
+ DU_LOG("\nINFO --> Building the UE Context Release Complete");
+ do
+ {
+ DU_ALLOC(f1apMsg, sizeof(F1AP_PDU_t));
+ if(f1apMsg == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for f1apMsg");
+ break;
+ }
+
+ f1apMsg->present = F1AP_PDU_PR_successfulOutcome;
+ DU_ALLOC(f1apMsg->choice.successfulOutcome, sizeof(SuccessfulOutcome_t));
+ if(f1apMsg->choice.successfulOutcome == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for\
+ successfulOutcome");
+ break;
+ }
+ f1apMsg->choice.successfulOutcome->procedureCode = ProcedureCode_id_UEContextRelease;
+ f1apMsg->choice.successfulOutcome->criticality = Criticality_reject;
+ f1apMsg->choice.successfulOutcome->value.present = \
+ SuccessfulOutcome__value_PR_UEContextReleaseComplete;
+
+ ueReleaseComplete = &f1apMsg->choice.successfulOutcome->value.choice.UEContextReleaseComplete;
+
+ elementCnt = 2;
+ ueReleaseComplete->protocolIEs.list.count = elementCnt;
+ ueReleaseComplete->protocolIEs.list.size = elementCnt * sizeof(UEContextReleaseComplete_t *);
+
+ /* Initialize the UE Release Complete members */
+ DU_ALLOC(ueReleaseComplete->protocolIEs.list.array,ueReleaseComplete->protocolIEs.list.size);
+ if(ueReleaseComplete->protocolIEs.list.array == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE array");
+ break;
+ }
+ for(ieIdx=0; ieIdx<elementCnt; ieIdx++)
+ {
+ DU_ALLOC(ueReleaseComplete->protocolIEs.list.array[ieIdx],\
+ sizeof(UEContextReleaseComplete_t));
+ if(ueReleaseComplete->protocolIEs.list.array[ieIdx] == NULLP)
+ {
+ DU_LOG("\nERROR --> F1AP : BuildAndSendUeContextReleaseComplete(): Memory allocation failed for IE\
+ elements");
+ memAllocFail = true;
+ break;
+ }
+ }
+ if(memAllocFail == true)
+ break;
+
+
+ ieIdx=0;
+ ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
+ ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
+ ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present = \
+ UEContextReleaseCompleteIEs__value_PR_GNB_CU_UE_F1AP_ID;
+ ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_CU_UE_F1AP_ID =gnbCuUeF1apId;
+
+ ieIdx++;
+ ueReleaseComplete->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
+ ueReleaseComplete->protocolIEs.list.array[ieIdx]->criticality= Criticality_reject;
+ ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.present =\
+ UEContextReleaseCompleteIEs__value_PR_GNB_DU_UE_F1AP_ID;
+ ueReleaseComplete->protocolIEs.list.array[ieIdx]->value.choice.GNB_DU_UE_F1AP_ID =gnbDuUeF1apId;
+
+ xer_fprint(stdout, &asn_DEF_F1AP_PDU, f1apMsg);
+
+ /* Encode the F1SetupComplete type as APER */
+ memset(encBuf, 0, ENC_BUF_MAX_LEN);
+ encBufSize = 0;
+ encRetVal = aper_encode(&asn_DEF_F1AP_PDU, 0, f1apMsg, PrepFinalEncBuf, encBuf);
+ /* Encode results */
+ if(encRetVal.encoded == ENCODE_FAIL)
+ {
+ DU_LOG("\nERROR --> F1AP : Could not encode UEContextReleaseComplete structure (at %s)\n",\
+ encRetVal.failed_type ? encRetVal.failed_type->name : "unknown");
+ break;
+ }
+ else
+ {
+ DU_LOG("\nDEBUG --> F1AP : Created APER encoded buffer for UEContextReleaseComplete\n");
+ for(ieIdx=0; ieIdx< encBufSize; ieIdx++)
+ {
+ printf("%x",encBuf[ieIdx]);
+ }
+ }
+
+ /* Sending msg */
+ if(sendF1APMsg() != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP : Sending UE Context Release Complete failed");
+ break;
}
- }
- duProcGnbDuCfgUpdAckMsg();
-#if 0
- if(BuildAndSendF1ResetReq() != ROK)
+ ret = ROK;
+ break;
+ }while(true);
+
+ if(ret == ROK)
{
- return RFAILED;
+ duCb.actvCellLst[cellId-1]->cellStatus = DELETION_IN_PROGRESS;
+ ret = duSendCellDeletReq(cellId);
+ if(ret != ROK)
+ {
+ DU_LOG("\nERROR --> F1AP: BuildAndSendUeContextReleaseComplete(): Failed to process cell\
+ Delete req for CellId");
+ }
}
-#endif
+ FreeUeContextReleaseComplete(f1apMsg);
+ return ret;
- freeAperDecodeGnbDuAck(gnbDuAck);
- return ROK;
}
-/******************************************************************
+
+/*******************************************************************
*
-* @brief free DL RRC Message Transfer allocated by aper_decoder
+* @brief added free part for the memory allocated by aper_decoder
*
* @details
*
-* Function : freeAperDecodef1DlRrcMsg
+* Function : freeAperDecodeUeContextReleaseCommand
*
-* Functionality: free DL RRC Message Transfer allocated by aper_decoder
+* Functionality: added free part for the memory allocated by aper_decoder
*
-* @params[in] DLRRCMessageTransfer_t *f1DlRrcMsg
-* @return ROK - success
-* RFAILED - failure
+* @params[in] F1AP_PDU_t *f1apMsg
+* @return void
*
* ****************************************************************/
-
-void freeAperDecodef1DlRrcMsg(DLRRCMessageTransfer_t *f1DlRrcMsg)
+void freeAperDecodeUeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
{
- uint8_t ieIdx =0;
- RRCContainer_t *rrcContainer = NULLP;
+ uint8_t ieIdx=0;
+ UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
- if(f1DlRrcMsg->protocolIEs.list.array)
+ ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
+
+ if(ueContextReleaseCommand->protocolIEs.list.array)
{
- for(ieIdx=0; ieIdx<f1DlRrcMsg->protocolIEs.list.count; ieIdx++)
+ for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++)
{
- if(f1DlRrcMsg->protocolIEs.list.array[ieIdx])
- {
- switch(f1DlRrcMsg->protocolIEs.list.array[ieIdx]->id)
- {
- case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
- break;
- case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
- break;
- case ProtocolIE_ID_id_SRBID:
- break;
- case ProtocolIE_ID_id_RRCContainer:
- {
- rrcContainer =&f1DlRrcMsg->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer;
- free(rrcContainer->buf);
- }
- case ProtocolIE_ID_id_ExecuteDuplication:
- break;
- case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
- break;
- break;
- }
- free(f1DlRrcMsg->protocolIEs.list.array[ieIdx]);
- }
+ if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx])
+ {
+ switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ break;
+ case ProtocolIE_ID_id_Cause:
+ break;
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf)
+ {
+ free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->value.choice.RRCContainer.buf);
+ }
+ break;
+ }
+ default :
+ DU_LOG("\nERROR --> F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\
+ ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id);
+ break;
+ }
+ }
+ free(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]);
}
- free(f1DlRrcMsg->protocolIEs.list.array);
+ free(ueContextReleaseCommand->protocolIEs.list.array);
}
}
-/******************************************************************
- *
- * @brief Processes DL RRC Message Transfer sent by CU
- *
- * @details
- *
- * Function : procF1DlRrcMsgTrans
- *
- * Functionality: Processes DL RRC Message Transfer sent by CU
- *
- * @params[in] F1AP_PDU_t ASN decoded F1AP message
- * @return ROK - success
- * RFAILED - failure
- *
- * ****************************************************************/
-uint8_t procF1DlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
+/*******************************************************************
+*
+* @brief processing of UE Context Release Command
+*
+* @details
+*
+* Function : procF1UeContextReleaseCommand
+*
+* Functionality: processing of UE Context Release Command
+*
+* @params[in] F1AP_PDU_t *f1apMsg
+* @return void
+*
+* ****************************************************************/
+uint8_t procF1UeContextReleaseCommand(F1AP_PDU_t *f1apMsg)
{
- uint8_t idx, ret;
- DLRRCMessageTransfer_t *f1DlRrcMsg = NULLP;
- F1DlRrcMsg dlMsg;
- memset(&dlMsg, 0, sizeof(F1DlRrcMsg));
-
- DU_LOG("\nINFO --> DU_APP : DL RRC message transfer Recevied");
- f1DlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
+ uint8_t ieIdx=0, ret=ROK, ueIdx=0;
+ uint16_t cellIdx =0;
+ bool ueIdxFound;
+ uint32_t gnbCuUeF1apId=0, gnbDuUeF1apId=0;
+ DuUeCb *duUeCb = NULLP;
+ UEContextReleaseCommand_t *ueContextReleaseCommand = NULLP;
- ret = ROK;
+ ueContextReleaseCommand = &f1apMsg->choice.initiatingMessage->value.choice.UEContextReleaseCommand;
- for(idx=0; idx<f1DlRrcMsg->protocolIEs.list.count; idx++)
+ if(ueContextReleaseCommand->protocolIEs.list.array)
{
- switch(f1DlRrcMsg->protocolIEs.list.array[idx]->id)
+ for(ieIdx=0; ieIdx < ueContextReleaseCommand->protocolIEs.list.count; ieIdx++)
{
- case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
- {
- dlMsg.gnbCuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
- break;
- }
- case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
- {
- dlMsg.gnbDuUeF1apId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
- break;
- }
- case ProtocolIE_ID_id_SRBID:
- {
- dlMsg.srbId = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
- break;
- }
- case ProtocolIE_ID_id_ExecuteDuplication:
- dlMsg.execDup = true;
- break;
+ if(ueContextReleaseCommand->protocolIEs.list.array[ieIdx])
+ {
+ switch(ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id)
+ {
+ case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+ {
+ gnbCuUeF1apId= ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
+ value.choice.GNB_CU_UE_F1AP_ID;
+ break;
+ }
- case ProtocolIE_ID_id_RRCContainer:
- {
- if(f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size > 0)
- {
- dlMsg.rrcMsgSize = f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size;
- DU_ALLOC(dlMsg.rrcMsgPdu, dlMsg.rrcMsgSize);
- if(dlMsg.rrcMsgPdu)
- {
- memcpy(dlMsg.rrcMsgPdu, f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,\
- dlMsg.rrcMsgSize);
- }
- else
- {
- DU_LOG("\nERROR --> DU APP : Memory alloc Failed at RRC Container at procF1DlRrcMsgTrans()");
- return RFAILED;
- }
- }
- else
- {
- DU_LOG("\nERROR --> DU_APP : RRC Container Size is invalid:%ld",\
- f1DlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
- return RFAILED;
- }
- break;
- }
- case ProtocolIE_ID_id_RRCDeliveryStatusRequest:
- {
- dlMsg.deliveryStatRpt = true;
- break;
- }
- default:
- DU_LOG("\nERROR --> DU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
- f1DlRrcMsg->protocolIEs.list.array[idx]->id);
- }
- }
+ case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+ {
+ gnbDuUeF1apId = ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
+ value.choice.GNB_DU_UE_F1AP_ID;
+ break;
+ }
- ret = duProcDlRrcMsg(&dlMsg);
+ case ProtocolIE_ID_id_Cause:
+ {
+ break;
+ }
- freeAperDecodef1DlRrcMsg(f1DlRrcMsg);
+ case ProtocolIE_ID_id_RRCContainer:
+ {
+ for(cellIdx = 0; cellIdx < duCb.numActvCells; cellIdx++)
+ {
+ for(ueIdx = 0; ueIdx < duCb.numUe; ueIdx++)
+ {
+ if((duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbDuUeF1apId == gnbDuUeF1apId)&&\
+ (duCb.actvCellLst[cellIdx]->ueCb[ueIdx].gnbCuUeF1apId == gnbCuUeF1apId))
+ {
+ duUeCb = &duCb.actvCellLst[cellIdx]->ueCb[ueIdx];
+ DU_ALLOC(duUeCb->f1UeDb, sizeof(F1UeContextSetupDb));
+ if(duUeCb->f1UeDb)
+ {
+ memset(duUeCb->f1UeDb, 0, sizeof(F1UeContextSetupDb));
+ duUeCb->f1UeDb->actionType = UE_CTXT_RELEASE;
+ duUeCb->f1UeDb->cellIdx = cellIdx;
+ /* Filling Dl RRC Msg Info */
+ DU_ALLOC_SHRABL_BUF(duUeCb->f1UeDb->dlRrcMsg, sizeof(F1DlRrcMsg));
+ if(!duUeCb->f1UeDb->dlRrcMsg)
+ {
+ DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \
+ Memory allocation failed ");
+ ret = RFAILED;
+ }
+ else
+ {
+ duUeCb->f1UeDb->dlRrcMsgPres = true;
+ memset(duUeCb->f1UeDb->dlRrcMsg, 0, sizeof(F1DlRrcMsg));
+ ret = extractDlRrcMsg(gnbDuUeF1apId, gnbCuUeF1apId, duUeCb->f1UeDb->dlRrcMsg,\
+ &ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->\
+ value.choice.RRCContainer);
+ }
+
+ }
+ else
+ {
+ DU_LOG("\nERROR --> DU APP : procF1UeContextReleaseCommand(): \
+ Memory allocation failed ");
+ ret = RFAILED;
+
+ }
+
+ ueIdxFound = true;
+ break;
+ }
+ }
+ if(ueIdxFound == true)
+ {
+ break;
+ }
+ }
+ if(!ueIdxFound)
+ {
+ DU_LOG("\nERROR --> F1AP: DuUeCb is not found at procF1UeContextSetupReq()");
+ ret = RFAILED;
+ }
+
+
+ break;
+ }
+ default :
+ DU_LOG("\nERROR --> F1AP: freeAperDecodeUeContextReleaseCommand():Invalid IE Received: %ld"\
+ ,ueContextReleaseCommand->protocolIEs.list.array[ieIdx]->id);
+ break;
+ }
+ }
+ }
+ }
+ if(ret != RFAILED)
+ {
+ duProcUeContextReleaseCommand(duUeCb);
+ }
+ freeAperDecodeUeContextReleaseCommand(f1apMsg);
return ret;
}
-
-/*****************************************************************i
+/**************************************************************
*
* @brief Handles received F1AP message and sends back response
*
switch(f1apMsg->present)
{
case F1AP_PDU_PR_successfulOutcome:
- {
- switch(f1apMsg->choice.successfulOutcome->value.present)
- {
- case SuccessfulOutcome__value_PR_ResetAcknowledge:
- {
- DU_LOG("\nINFO --> F1AP : F1ResetAcknowledge is received successfully ");
- break;
- }
- case SuccessfulOutcome__value_PR_F1SetupResponse:
- {
+ {
+ switch(f1apMsg->choice.successfulOutcome->value.present)
+ {
+ case SuccessfulOutcome__value_PR_ResetAcknowledge:
+ {
+ DU_LOG("\nINFO --> F1AP : F1ResetAcknowledge is received successfully ");
+ break;
+ }
+ case SuccessfulOutcome__value_PR_F1SetupResponse:
+ {
#ifndef ODU_TEST_STUB
- procF1SetupRsp(f1apMsg);
+ procF1SetupRsp(f1apMsg);
#endif
- break;
- }
+ break;
+ }
- case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
- {
- procF1GNBDUCfgUpdAck(f1apMsg);
- break;
- }
+ case SuccessfulOutcome__value_PR_GNBDUConfigurationUpdateAcknowledge:
+ {
+ procF1GNBDUCfgUpdAck(f1apMsg);
+ break;
+ }
- default:
- {
- DU_LOG("\nERROR --> F1AP : Invalid type of SuccessfulOutcome__value_PR_ResetAcknowledge [%d]",\
- f1apMsg->choice.successfulOutcome->value.present);
- return;
- }
- }/* End of switch(successfulOutcome) */
- free(f1apMsg->choice.successfulOutcome);
- break;
- }
+ default:
+ {
+ DU_LOG("\nERROR --> F1AP : Invalid type of SuccessfulOutcome__value_PR_ResetAcknowledge [%d]",\
+ f1apMsg->choice.successfulOutcome->value.present);
+ return;
+ }
+ }/* End of switch(successfulOutcome) */
+ free(f1apMsg->choice.successfulOutcome);
+ break;
+ }
case F1AP_PDU_PR_initiatingMessage:
- {
- switch(f1apMsg->choice.initiatingMessage->value.present)
- {
- case InitiatingMessage__value_PR_Reset:
- {
- procF1ResetReq(f1apMsg);
- break;
- }
- case InitiatingMessage__value_PR_DLRRCMessageTransfer:
- {
- procF1DlRrcMsgTrans(f1apMsg);
- break;
- }
- case InitiatingMessage__value_PR_UEContextSetupRequest:
- {
- procF1UeContextSetupReq(f1apMsg);
- break;
- }
- default:
- {
- DU_LOG("\nERROR --> F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",
- f1apMsg->choice.initiatingMessage->value.present);
- return;
- }
- }/* End of switch(initiatingMessage) */
- free(f1apMsg->choice.initiatingMessage);
- break;
- }
+ {
+ switch(f1apMsg->choice.initiatingMessage->value.present)
+ {
+ case InitiatingMessage__value_PR_Reset:
+ {
+ procF1ResetReq(f1apMsg);
+ break;
+ }
+ case InitiatingMessage__value_PR_DLRRCMessageTransfer:
+ {
+ procF1DlRrcMsgTrans(f1apMsg);
+ break;
+ }
+ case InitiatingMessage__value_PR_UEContextSetupRequest:
+ {
+ procF1UeContextSetupReq(f1apMsg);
+ break;
+ }
+ case InitiatingMessage__value_PR_UEContextModificationRequest:
+ {
+ procF1UeContextModificationReq(f1apMsg);
+ break;
+ }
+ case InitiatingMessage__value_PR_UEContextReleaseCommand:
+ {
+ procF1UeContextReleaseCommand(f1apMsg);
+ break;
+ }
+ default:
+ {
+ DU_LOG("\nERROR --> F1AP : Invalid type of F1AP_PDU_PR_initiatingMessage [%d]",
+ f1apMsg->choice.initiatingMessage->value.present);
+ return;
+ }
+ }/* End of switch(initiatingMessage) */
+ free(f1apMsg->choice.initiatingMessage);
+ break;
+ }
default:
- {
- DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
- return;
- }
- free(f1apMsg);
+ {
+ DU_LOG("\nERROR --> F1AP : Invalid type of f1apMsg->present [%d]",f1apMsg->present);
+ return;
+ }
+ free(f1apMsg);
}/* End of switch(f1apMsg->present) */