Initial commit for Bronze release
[o-du/l2.git] / src / du_app / du_cell_mgr.c
1 /*******************************************************************************
2 ################################################################################
3 #   Copyright (c) [2017-2019] [Radisys]                                        #
4 #                                                                              #
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                                    #
8 #                                                                              #
9 #       http://www.apache.org/licenses/LICENSE-2.0                             #
10 #                                                                              #
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 *******************************************************************************/
18
19 /* This file contains message handling functionality for DU APP */
20 #include "du_cell_mgr.h"
21 #include "du_cfg_hdl.h"
22
23 extern DuCfgParams duCfgParam;
24
25 extern S16 cmPkRgrCfgReq(Pst* pst, RgrCfgTransId transId, \
26       RgrCfgReqInfo *cfgReqInfo);
27
28 /*******************************************************************
29  *
30  * @brief Processes cells to be activated
31  *
32  * @details
33  *
34  *    Function : procCellsToBeActivated
35  *
36  *    Functionality:
37  *      - Processes cells to be activated list received in F1SetupRsp
38  *
39  * @params[in] void
40  * @return ROK     - success
41  *         RFAILED - failure
42  *
43  * ****************************************************************/
44 S16 procCellsToBeActivated(Cells_to_be_Activated_List_t cellsToActivate)
45 {
46    U16 idx;
47    S16 ret;
48
49    for(idx=0; idx<cellsToActivate.list.count; idx++)
50    {
51       U16 nci;
52       U16 pci;
53       DuCellCb *cellCb = NULLP;
54
55       Cells_to_be_Activated_List_Item_t cell = cellsToActivate.list.array[idx]->\
56           value.choice.Cells_to_be_Activated_List_Item;
57
58       bitStringToInt(&cell.nRCGI.nRCellIdentity, &nci);
59       if(cell.nRPCI)
60       {
61          pci = *cell.nRPCI;
62       }
63       if(ROK != (cmHashListFind(&(duCb.cellLst), (U8*) &nci, sizeof(nci),
64                   0, (PTR*)cellCb)))
65       {
66          return RFAILED;
67       }
68       if(!cellCb)
69       {
70                         DU_LOG("\nDU_APP : HashList Find failed for nci [%d]", nci);
71          return RFAILED;
72       }
73       cellCb->cellStatus = ACTIVATION_IN_PROGRESS; 
74       cellCb->cellInfo.nrPci = pci;
75
76       /* Now remove this cell from configured list and move to active list */
77       ret = cmHashListDelete(&(duCb.actvCellLst), (PTR)(cellCb)); 
78       if(ret != ROK)
79       {
80          DU_LOG("\nDU_APP : HashListInsert into ActvCellLst failed for [%d]", nci);
81       }
82       ret = cmHashListInsert(&(duCb.actvCellLst), (PTR)(cellCb), 
83             (U8 *)&(nci), (U16) sizeof(nci));
84
85       if(ret != ROK)
86       {
87          DU_LOG("\nDU_APP : HashListInsert into ActvCellLst failed for [%d]", nci);
88          break;
89       }
90       else
91       {
92          DU_LOG("\nDU_APP : HashListInsert into ActvCellLst successful for [%d]", nci);
93       }
94    }
95
96    /* Start sending scheduler config */
97    if(ret == ROK)
98    {
99       //TODO: uncomment later duSendSchGnbCfg(); 
100    }
101
102    return ROK;
103 }
104
105 /******************************************************************
106 *
107 * @brief Processes F1 Setup Response sent by CU
108 *
109 * @details
110 *
111 *    Function : procF1SetupRsp
112 *
113 *    Functionality: Processes F1 Setup Response sent by CU
114 *
115 * @params[in] F1AP_PDU_t ASN decoded F1AP message
116 * @return ROK     - success
117 *         RFAILED - failure
118 *
119 * ****************************************************************/
120 S16 procF1SetupRsp(F1AP_PDU_t *f1apMsg)
121 {
122    S16 ret = ROK;
123
124    F1SetupResponse_t *f1SetRspMsg;
125    F1SetupRsp    f1SetRspDb;
126    GNB_CU_Name_t *cuName;
127    RRC_Version_t *rrc_Ver;
128    U16 idx;
129
130    DU_LOG("\nDU_APP : F1 Setup Response received"); 
131         printf("\nDU_APP : F1 Setup Response received");
132    duCb.f1Status = TRUE; //Set F1 status as true
133    f1SetRspMsg = &f1apMsg->choice.successfulOutcome->value.choice.F1SetupResponse;
134
135    for(idx=0; idx<f1SetRspMsg->protocolIEs.list.count; idx++)
136    {
137 //      F1SetupResponseIEs_t f1RspIe = f1SetRspMsg->protocolIEs.list.array[idx];
138       switch(f1SetRspMsg->protocolIEs.list.array[idx]->id)
139       {
140          case ProtocolIE_ID_id_Cells_to_be_Activated_List:
141          {
142             procCellsToBeActivated(f1SetRspMsg->protocolIEs.list.array[idx]->\
143                   value.choice.Cells_to_be_Activated_List);
144             break;
145          }
146          //TODO: where to store and how to use below variables?can they be skipped
147          case ProtocolIE_ID_id_TransactionID:
148          {
149             f1SetRspDb.transId = f1SetRspMsg->protocolIEs.list.array[idx]->\
150                                  value.choice.TransactionID;
151             break;
152          }
153          case ProtocolIE_ID_id_gNB_CU_Name:
154          {
155             cuName = &f1SetRspMsg->protocolIEs.list.array[idx]->\
156                      value.choice.GNB_CU_Name;
157             strcpy(f1SetRspDb.cuName, (const char*)cuName->buf);
158             break;
159          }
160          case ProtocolIE_ID_id_GNB_CU_RRC_Version:
161          {
162             rrc_Ver = &f1SetRspMsg->protocolIEs.list.array[idx]->\
163                       value.choice.RRC_Version;
164             strcpy(f1SetRspDb.rrcVersion.rrcVer,
165                   (const char*)rrc_Ver->latest_RRC_Version.buf);
166             break;
167          }
168          default:
169             DU_LOG("\nDU_APP : Invalid IE received in F1SetupRsp:%ld",
170                   f1SetRspMsg->protocolIEs.list.array[idx]->id);
171       }
172    }
173  
174    /* TODO :Check the deallocation */
175 #if 0
176    SPutSBuf(DU_APP_MEM_REGION, DU_POOL,(Data *)&(f1SetupRsp->protocolIEs.list.array),\
177          (Size)elementCnt * sizeof(F1SetupResponseIEs_t *));
178    SPutSBuf(DU_APP_MEM_REGION, DU_POOL,(Data *)&(f1apMsg->choice.successfulOutcome),\
179          (Size)sizeof(SuccessfulOutcome_t));
180    SPutSBuf(DU_APP_MEM_REGION, DU_POOL,(Data *)&f1apMsg,(Size)sizeof(F1AP_PDU_t));
181 #endif
182  
183    /* Build and send GNB-DU config update */
184    ret = BuildAndSendDUConfigUpdate();
185    return ret;
186 }
187
188 /******************************************************************
189 *
190 * @brief Send gNB cfg to scheduler via MAC
191 *
192 * @details
193 *
194 *    Function : duSendSchGnbCfg
195 *
196 *    Functionality: Send gNB cfg to scheduler via MAC
197 *
198 * @return ROK     - success
199 *         RFAILED - failure
200 *
201 * ****************************************************************/
202 S16 duSendSchGnbCfg()
203 {
204
205    RgrCfgReqInfo  *cfgReq = NULLP;
206    MacSchedGnbCfg *cfg = NULLP;
207    U32 transId = 1;
208
209    DU_ALLOC(cfgReq, sizeof(RgrCfgReqInfo));
210    if( cfgReq == NULLP)
211    {
212       DU_LOG("\nDU_APP : Mem allocation failed in duSendSchGnbCfg");
213       return RFAILED;
214    }
215
216    cfgReq->action = SCH_CONFIG;
217    cfgReq->u.cfgInfo.cfgType = MAC_GNB_CFG;
218    cfg = &(cfgReq->u.cfgInfo.u.schedGnbCfg);
219    cfg->numTxAntPorts = duCfgParam.schedCfg.numTxAntPorts;
220    cfg->ulSchdType = duCfgParam.schedCfg.ulSchdType;
221    cfg->dlSchdType = duCfgParam.schedCfg.dlSchdType;
222    cfg->numCells = duCfgParam.schedCfg.numCells;
223    cfg->maxUlUePerTti = duCfgParam.schedCfg.maxUlUePerTti;
224    cfg->maxDlUePerTti = duCfgParam.schedCfg.maxDlUePerTti;
225
226    if(ROK != duSendSchGnbCfgToMac(cfgReq, transId))
227    {
228       return RFAILED;
229    }
230
231    return ROK;
232 }
233
234 /******************************************************************
235 *
236 * @brief Send gNB cfg to scheduler via MAC
237 *
238 * @details
239 *
240 *    Function : duSendSchGnbCfgToMac 
241 *
242 *    Functionality: Send gNB cfg to scheduler via MAC
243 *
244 * @return ROK     - success
245 *         RFAILED - failure
246 *
247 * ****************************************************************/
248 S16 duSendSchGnbCfgToMac(RgrCfgReqInfo *cfgReq, U32 trans_id)
249 {
250    RgrCfgTransId transId;
251    Pst pst;
252
253    DU_SET_ZERO(&pst, sizeof(Pst));
254    DU_SET_ZERO(&transId, sizeof(RgrCfgTransId));
255
256    transId.trans[0] = MAC_GNB_CFG;
257    transId.trans[1] = cfgReq->action;
258    transId.trans[7] = trans_id & 0x000000ff; trans_id >>= 8;
259    transId.trans[6] = trans_id & 0x000000ff; trans_id >>= 8;
260    transId.trans[5] = trans_id & 0x000000ff; trans_id >>= 8;
261    transId.trans[4] = trans_id & 0x000000ff; trans_id >>= 8;
262
263    pst.selector  = DU_SELECTOR_LC;
264    pst.srcEnt    = ENTDUAPP;
265    pst.dstEnt    = ENTRG;
266    pst.dstInst   = (Inst)0;
267    pst.dstProcId = DU_PROC;
268    pst.srcProcId = DU_PROC;
269    pst.region    = duCb.init.region;
270    pst.event     = (Event) EVTMACSCHCFGREQ;
271
272    cmPkRgrCfgReq(&pst, transId, cfgReq);
273
274    return ROK;
275 }
276
277 /**********************************************************************
278   End of file
279  **********************************************************************/