1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file contains message handling functionality for DU APP */
20 #include "du_cell_mgr.h"
23 extern DuCfgParams duCfgParam;
25 extern S16 cmPkRgrCfgReq(Pst* pst, RgrCfgTransId transId, \
26 RgrCfgReqInfo *cfgReqInfo);
28 extern S16 duBuildAndSendMacCellCfg();
30 /*******************************************************************
32 * @brief Processes cells to be activated
36 * Function : procCellsToBeActivated
39 * - Processes cells to be activated list received in F1SetupRsp
42 * @return ROK - success
45 * ****************************************************************/
46 S16 procCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
51 for(idx=0; idx<cellsToActivate.list.count; idx++)
55 DuCellCb *cellCb = NULLP;
57 Cells_to_be_Activated_List_Item_t cell = cellsToActivate.list.array[idx]->\
58 value.choice.Cells_to_be_Activated_List_Item;
60 bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
65 if(ROK != (cmHashListFind(&(duCb.cellLst), (U8*) &nci, sizeof(nci),
72 DU_LOG("\nDU_APP : HashList Find failed for nci [%d]", nci);
75 cellCb->cellStatus = ACTIVATION_IN_PROGRESS;
76 cellCb->cellInfo.nrPci = pci;
78 /* Now remove this cell from configured list and move to active list */
79 ret = cmHashListDelete(&(duCb.actvCellLst), (PTR)(cellCb));
82 DU_LOG("\nDU_APP : HashListInsert into ActvCellLst failed for [%d]", nci);
84 ret = cmHashListInsert(&(duCb.actvCellLst), (PTR)(cellCb),
85 (U8 *)&(nci), (U16) sizeof(nci));
89 DU_LOG("\nDU_APP : HashListInsert into ActvCellLst failed for [%d]", nci);
94 DU_LOG("\nDU_APP : HashListInsert into ActvCellLst successful for [%d]", nci);
98 /* Start sending scheduler config */
101 //TODO: uncomment later duSendSchGnbCfg();
107 /******************************************************************
109 * @brief Processes F1 Setup Response sent by CU
113 * Function : procF1SetupRsp
115 * Functionality: Processes F1 Setup Response sent by CU
117 * @params[in] F1AP_PDU_t ASN decoded F1AP message
118 * @return ROK - success
121 * ****************************************************************/
122 S16 procF1SetupRsp(F1AP_PDU_t *f1apMsg)
126 F1SetupResponse_t *f1SetRspMsg;
127 F1SetupRsp f1SetRspDb;
128 GNB_CU_Name_t *cuName;
129 RRC_Version_t *rrc_Ver;
132 DU_LOG("\nDU_APP : F1 Setup Response received");
133 printf("\nDU_APP : F1 Setup Response received");
134 duCb.f1Status = TRUE; //Set F1 status as true
135 f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
137 for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
139 // F1SetupResponseIEs_t f1RspIe = f1SetRspMsg->protocolIEs.list.array[idx];
140 switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
142 case ProtocolIE_ID_id_Cells_to_be_Activated_List:
144 procCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
145 value.choice.Cells_to_be_Activated_List);
148 //TODO: where to store and how to use below variables?can they be skipped
149 case ProtocolIE_ID_id_TransactionID:
151 f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
152 value.choice.TransactionID;
155 case ProtocolIE_ID_id_gNB_CU_Name:
157 cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
158 value.choice.GNB_CU_Name;
159 strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
162 case ProtocolIE_ID_id_GNB_CU_RRC_Version:
164 rrc_Ver = &f1SetRspMsg->protocolIEs.list.array[idx]->\
165 value.choice.RRC_Version;
166 strcpy(f1SetRspDb.rrcVersion.rrcVer,
167 (const char*)rrc_Ver->latest_RRC_Version.buf);
171 DU_LOG("\nDU_APP : Invalid IE received in F1SetupRsp:%ld",
172 f1SetRspMsg->protocolIEs.list.array[idx]->id);
176 /* TODO :Check the deallocation */
178 SPutSBuf(DU_APP_MEM_REGION, DU_POOL,(Data *)&(f1SetupRsp->protocolIEs.list.array),\
179 (Size)elementCnt * sizeof(F1SetupResponseIEs_t *));
180 SPutSBuf(DU_APP_MEM_REGION, DU_POOL,(Data *)&(f1apMsg->choice.successfulOutcome),\
181 (Size)sizeof(SuccessfulOutcome_t));
182 SPutSBuf(DU_APP_MEM_REGION, DU_POOL,(Data *)&f1apMsg,(Size)sizeof(F1AP_PDU_t));
185 /* Build and send Mac Cell Cfg Paramaters */
186 //ret = duBuildAndSendMacCellCfg();
187 ret = BuildAndSendDUConfigUpdate();
192 /******************************************************************
194 * @brief Send gNB cfg to scheduler via MAC
198 * Function : duSendSchGnbCfg
200 * Functionality: Send gNB cfg to scheduler via MAC
202 * @return ROK - success
205 * ****************************************************************/
206 S16 duSendSchGnbCfg()
209 RgrCfgReqInfo *cfgReq = NULLP;
210 MacSchedGnbCfg *cfg = NULLP;
213 DU_ALLOC(cfgReq, sizeof(RgrCfgReqInfo));
216 DU_LOG("\nDU_APP : Mem allocation failed in duSendSchGnbCfg");
220 cfgReq->action = SCH_CONFIG;
221 cfgReq->u.cfgInfo.cfgType = MAC_GNB_CFG;
222 cfg = &(cfgReq->u.cfgInfo.u.schedGnbCfg);
223 cfg->numTxAntPorts = duCfgParam.schedCfg.numTxAntPorts;
224 cfg->ulSchdType = duCfgParam.schedCfg.ulSchdType;
225 cfg->dlSchdType = duCfgParam.schedCfg.dlSchdType;
226 cfg->numCells = duCfgParam.schedCfg.numCells;
227 cfg->maxUlUePerTti = duCfgParam.schedCfg.maxUlUePerTti;
228 cfg->maxDlUePerTti = duCfgParam.schedCfg.maxDlUePerTti;
230 if(ROK != duSendSchGnbCfgToMac(cfgReq, transId))
238 /******************************************************************
240 * @brief Send gNB cfg to scheduler via MAC
244 * Function : duSendSchGnbCfgToMac
246 * Functionality: Send gNB cfg to scheduler via MAC
248 * @return ROK - success
251 * ****************************************************************/
252 S16 duSendSchGnbCfgToMac(RgrCfgReqInfo *cfgReq, U32 trans_id)
254 RgrCfgTransId transId;
257 DU_SET_ZERO(&pst, sizeof(Pst));
258 DU_SET_ZERO(&transId, sizeof(RgrCfgTransId));
260 transId.trans[0] = MAC_GNB_CFG;
261 transId.trans[1] = cfgReq->action;
262 transId.trans[7] = trans_id & 0x000000ff; trans_id >>= 8;
263 transId.trans[6] = trans_id & 0x000000ff; trans_id >>= 8;
264 transId.trans[5] = trans_id & 0x000000ff; trans_id >>= 8;
265 transId.trans[4] = trans_id & 0x000000ff; trans_id >>= 8;
267 pst.selector = DU_SELECTOR_LC;
268 pst.srcEnt = ENTDUAPP;
270 pst.dstInst = (Inst)0;
271 pst.dstProcId = DU_PROC;
272 pst.srcProcId = DU_PROC;
273 pst.region = duCb.init.region;
274 pst.event = (Event) EVTMACSCHCFGREQ;
276 cmPkRgrCfgReq(&pst, transId, cfgReq);
281 /**********************************************************************
283 **********************************************************************/