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