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