[Epic-ID: ODUHIGH-510][Task-ID: ODUHIGH-512] Implementation of E2 setup failure
[o-du/l2.git] / src / du_app / du_cell_mgr.c
index c689685..b0eb865 100644 (file)
@@ -18,6 +18,7 @@
 
 /* This file contains message handling functionality for DU cell management */
 #include "common_def.h"
+#include "du_tmr.h"
 #include "lrg.h"
 #include "legtp.h"
 #include "lrg.x"
@@ -26,6 +27,7 @@
 #include "rgr.x"
 #include "du_app_mac_inf.h"
 #include "du_app_rlc_inf.h"
+#include "du_e2ap_mgr.h"
 #include "du_cfg.h"
 #include "du_mgr.h"
 #include "du_utils.h"
@@ -53,6 +55,19 @@ DuMacCellDeleteReq packMacCellDeleteReqOpts[] =
    packDuMacCellDeleteReq        /* Light weight-loose coupling */
 };
 
+DuMacDlPcchInd packMacDlPcchIndOpts[] =
+{
+   packDuMacDlPcchInd,       /* Loose coupling */
+   MacProcDlPcchInd,         /* TIght coupling */
+   packDuMacDlPcchInd        /* Light weight-loose coupling */
+};
+
+DuMacDlBroadcastReq packMacDlBroadcastReqOpts[] =
+{
+   packDuMacDlBroadcastReq,       /* Loose coupling */
+   MacProcDlBroadcastReq,         /* TIght coupling */
+   packDuMacDlBroadcastReq        /* Light weight-loose coupling */
+};
 /*******************************************************************
  *
  * @brief Processes cells to be activated
@@ -185,7 +200,7 @@ uint8_t duGetCellCb(uint16_t cellId, DuCellCb **cellCb)
 * 
 *  @params[in] DuCellCb *cellCb
 *
-*  @return void 
+*  @return ROK/RFAILURE (uint8_t return)
 * 
 * 
 ******************************************************************************/
@@ -205,25 +220,71 @@ uint8_t checkPagingRecord(DuCellCb *cellCb)
       /*No Page is present for pf thus exiting*/
       return ROK;
    }
-
+  
    do
    {
       pagInfo = handlePageInfoLL(pf, NULLD, &(pagInfoLLFromPF->pagInfoList), TRAVERSE_ALL);
       if(pagInfo != NULLP)
       {
-         if(buildAndSendPagingReqToMac(pf, pagInfo->i_s, &(pagInfo->pagUeList)) != ROK)
+         if(BuildAndSendDlPcchIndToMac(cellCb->cellId, pf, pagInfo->i_s, &(pagInfo->pagUeList)) != ROK)
          {
             DU_LOG("\nERROR  -->  DU APP: Issue in Building Page RRC PDU i_s:%d",pagInfo->i_s);
             return RFAILED; 
          }
          handlePageInfoLL(pf, pagInfo->i_s, &(pagInfoLLFromPF->pagInfoList), DELETE);
       }
+      if(pagInfoLLFromPF->pagInfoList.first == NULLP)
+      {
+         break;
+      }
    }while(pagInfo != NULLP);
    
    cmHashListDelete(&(cellCb->pagingInfoMap), (PTR)pagInfoLLFromPF);
+   DU_FREE(pagInfoLLFromPF, sizeof(DuPagInfoList));
    return ROK;
 }
 
+/******************************************************************
+ *
+ * @brief Send pcch indication to MAC
+ *
+ * @details
+ *
+ *    Function : sendDlPcchIndToMac
+ *
+ *    Functionality: Send pcch indication to MAC
+ *
+ * @Params[in] DlPcchInd *pcchInd
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t sendDlPcchIndToMac(DlPcchInd *pcchInd)
+{
+   uint8_t ret = ROK;
+   Pst pst;
+
+   if(pcchInd)
+   {
+      /* Fill Pst */
+      FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_DL_PCCH_IND);
+      
+      ret = (*packMacDlPcchIndOpts[pst.selector])(&pst, pcchInd);
+      if(ret == RFAILED)
+      {
+         DU_LOG("\nERROR  -->  DU APP : sendDlPcchIndToMac(): Failed to DL PCCH indication to MAC");
+      }
+   }
+   else
+   {
+      DU_LOG("\nERROR  -->  DU APP: sendDlPcchIndToMac(): Received pcchInd is NULLP");
+      ret = RFAILED;
+   }
+   return ret;
+}
+
+
 /*****************************************************************
 * @brief Handles slot indication from MAC
 *
@@ -307,14 +368,15 @@ uint8_t duHandleCellUpInd(Pst *pst, OduCellId *cellId)
       cellCb->cellStatus = ACTIVATED;
       gCellStatus = CELL_UP;
 
-      if(duCfgParam.tempSliceCfg.rrmPolicy)
-         BuildAndSendSliceConfigReq(duCfgParam.tempSliceCfg.rrmPolicy, duCfgParam.tempSliceCfg.totalRrmPolicy, duCfgParam.tempSliceCfg.totalSliceCount);
+      if(duCfgParam.tempSliceCfg.numOfRrmPolicy)
+         BuildAndSendSliceConfigReq();
 #ifdef O1_ENABLE
       DU_LOG("\nINFO   -->  DU APP : Raise cell UP alarm for cell id=%d", cellId->cellId);
       raiseCellAlrm(CELL_UP_ALARM_ID, cellId->cellId);
       setCellOpState(cellId->cellId, ENABLED, ACTIVE);
 #endif
-
+       duCfgParam.macCellCfg.cellCfg.opState = OP_ENABLED;
+       duCfgParam.macCellCfg.cellCfg.cellState = CELL_ACTIVE;
    }
 
    if((pst->selector == ODU_SELECTOR_LWLC) || (pst->selector == ODU_SELECTOR_TC))
@@ -341,16 +403,27 @@ uint8_t duHandleCellUpInd(Pst *pst, OduCellId *cellId)
 uint8_t DuProcMacCellDeleteRsp(Pst *pst, MacCellDeleteRsp *deleteRsp)
 {
    uint8_t ret = ROK;
-   uint16_t cellIdx=0;
-   
+   uint16_t cellIdx=0, pfIdx=0;
+   DuPagInfoList *pagInfoLLFromPF=NULLP;
+
    if(deleteRsp)
    {
-      if(deleteRsp->result == SUCCESSFUL_RSP)
+      if(deleteRsp->status == SUCCESSFUL)
       {
          GET_CELL_IDX(deleteRsp->cellId, cellIdx);
          DU_LOG("\nINFO   -->  DU APP : MAC CELL Delete Response : SUCCESS [CELL IDX : %d]", deleteRsp->cellId);
          if(duCb.actvCellLst[cellIdx] && (duCb.actvCellLst[cellIdx]->cellId == deleteRsp->cellId))
          {
+            for(pfIdx =0; pfIdx < MAX_SFN; pfIdx++)
+            {
+               pagInfoLLFromPF = findPagingInfoFromMap(pfIdx, &(duCb.actvCellLst[cellIdx]->pagingInfoMap));
+               if(pagInfoLLFromPF)
+               {   
+                  cmHashListDelete(&(duCb.actvCellLst[cellIdx]->pagingInfoMap), (PTR)pagInfoLLFromPF);
+                  DU_FREE(pagInfoLLFromPF, sizeof(DuPagInfoList));
+               }
+            }
+
             memset(duCb.actvCellLst[cellIdx], 0, sizeof(DuCellCb));
             gCellStatus = CELL_DOWN;
 
@@ -409,9 +482,9 @@ uint8_t sendCellDeleteReqToMac(uint16_t cellId)
 {
    Pst pst;
    uint8_t ret=ROK;
-   MacCellDelete *cellDelete = NULLP;
+   MacCellDeleteReq *cellDelete = NULLP;
    
-   DU_ALLOC_SHRABL_BUF(cellDelete, sizeof(MacCellDelete));
+   DU_ALLOC_SHRABL_BUF(cellDelete, sizeof(MacCellDeleteReq));
    if(cellDelete)
    {
       cellDelete->cellId = cellId;
@@ -423,7 +496,7 @@ uint8_t sendCellDeleteReqToMac(uint16_t cellId)
       if(ret == RFAILED)
       {
          DU_LOG("\nERROR  -->  DU APP : sendCellDeleteReqToMac(): Failed to send Cell delete Req to MAC");
-         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cellDelete, sizeof(MacCellDelete));
+         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, cellDelete, sizeof(MacCellDeleteReq));
       }
    }
    else
@@ -514,7 +587,7 @@ void freePcchPdu(PCCH_Message_t *pcchMsg)
          {
             if(pagingMsg->pagingRecordList)
             {
-               if(pagingMsg->pagingRecordList->list.array == NULLP)
+               if(pagingMsg->pagingRecordList->list.array != NULLP)
                {
                   for(recordIdx = 0; recordIdx <  pagingMsg->pagingRecordList->list.count; recordIdx++)
                   {
@@ -538,31 +611,30 @@ void freePcchPdu(PCCH_Message_t *pcchMsg)
 }
 
 /*******************************************************************
- * @brief Builds the Paging RRC PDU and forwards it to MAC
+ * @brief Builds the Pcch RRC PDU and forwards it to MAC
  *
  * @details
  *
- *    Function : buildAndSendPagingReqToMac
+ *    Function : BuildAndSendDlPcchIndToMac
  *
- *    Functionality: Builds the Paging RRC PDU[As per Spec 38.331, Annexure A]
+ *    Functionality: Builds the Pcch RRC PDU[As per Spec 38.331, Annexure A]
  *                   and forwards it to MAC as Buffer along with PF and i_s
  *
- * @params[in] uint16_t pf, uint8_t i_s,CmLListCp *pageUeLL
+ * @params[in] uint16_t cellId, uint16_t pf, uint8_t i_s,CmLListCp *pageUeLL
  *
  * @return ROK     - success
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t buildAndSendPagingReqToMac(uint16_t pf, uint8_t i_s, CmLListCp *pageUeLL)
+uint8_t BuildAndSendDlPcchIndToMac(uint16_t cellId, uint16_t pf, uint8_t i_s, CmLListCp *pageUeLL)
 {
    CmLList        *node = NULLP, *next = NULLP;
    DuPagUeRecord  *ueRecord = NULLP;
    PCCH_Message_t *pcchMsg = NULLP;
-   asn_enc_rval_t  encRetVal;
+   asn_enc_rval_t encRetVal;
    PagingRrc_t    *pagingMsg = NULLP;
-   MacPageReq     *macPageReq = NULLP;
-   uint16_t        bufIdx = 0;
-   uint8_t         recordIdx = 0, ret = RFAILED;
+   DlPcchInd     *macPcchInd = NULLP;
+   uint8_t        recordIdx = 0, ret = RFAILED;
    
    /*As per 38.473 Sec 9.3.1.39,5G-S-TMSI :48 Bits >>  Bytes and 0 UnusedBits */
    uint8_t         totalByteInTmsi = 6, unusedBitsInTmsi = 0;
@@ -579,14 +651,14 @@ uint8_t buildAndSendPagingReqToMac(uint16_t pf, uint8_t i_s, CmLListCp *pageUeLL
       DU_ALLOC(pcchMsg , sizeof(PCCH_Message_t));
       if(pcchMsg == NULLP)
       {
-         DU_LOG("\nERROR  -->  DU APP: buildAndSendPagingToMac(): (pccchMsg) Memory Alloction failed!");
+         DU_LOG("\nERROR  -->  DU APP: BuildAndSendDlPcchIndToMac(): (pccchMsg) Memory Alloction failed!");
          break;
       }
       pcchMsg->message.present = PCCH_MessageType_PR_c1;
       DU_ALLOC(pcchMsg->message.choice.c1 , sizeof(PCCH_MessageType_t));
       if(pcchMsg->message.choice.c1 == NULLP)
       {
-         DU_LOG("\nERROR  -->  DU APP: buildAndSendPagingToMac(); (C1) Memory Alloction failed!");
+         DU_LOG("\nERROR  -->  DU APP: BuildAndSendDlPcchIndToMac(); (C1) Memory Alloction failed!");
          break;
       }
       pcchMsg->message.choice.c1->present = PCCH_MessageType__c1_PR_paging;
@@ -595,13 +667,13 @@ uint8_t buildAndSendPagingReqToMac(uint16_t pf, uint8_t i_s, CmLListCp *pageUeLL
       pagingMsg = pcchMsg->message.choice.c1->choice.paging;
       if(pagingMsg == NULLP)
       {
-         DU_LOG("\nERROR  -->  DU APP: buildAndSendPagingToMac(); (Paging) Memory Alloction failed!");
+         DU_LOG("\nERROR  -->  DU APP: BuildAndSendDlPcchIndToMac(); (Paging) Memory Alloction failed!");
          break;
       }
       DU_ALLOC(pagingMsg->pagingRecordList, sizeof(PagingRecordList_t));
       if(pagingMsg->pagingRecordList == NULLP)
       {
-         DU_LOG("\nERROR  -->  DU APP: buildAndSendPagingToMac(); (Paging Record List) Memory Alloction failed!");
+         DU_LOG("\nERROR  -->  DU APP: BuildAndSendDlPcchIndToMac(); (Paging Record List) Memory Alloction failed!");
          break;
       }
 
@@ -617,7 +689,7 @@ uint8_t buildAndSendPagingReqToMac(uint16_t pf, uint8_t i_s, CmLListCp *pageUeLL
       DU_ALLOC(pagingMsg->pagingRecordList->list.array, pagingMsg->pagingRecordList->list.size);
       if(pagingMsg->pagingRecordList->list.array == NULLP)
       {
-         DU_LOG("\nERROR  -->  DU APP: buildAndSendPagingToMac(); (Array) Memory Alloction failed!");
+         DU_LOG("\nERROR  -->  DU APP: BuildAndSendDlPcchIndToMac(); (Array) Memory Alloction failed!");
          break;
       }
       for(recordIdx = 0; recordIdx < pageUeLL->count; recordIdx++)
@@ -625,7 +697,7 @@ uint8_t buildAndSendPagingReqToMac(uint16_t pf, uint8_t i_s, CmLListCp *pageUeLL
          DU_ALLOC(pagingMsg->pagingRecordList->list.array[recordIdx], sizeof(PagingRecord_t));
          if(pagingMsg->pagingRecordList->list.array[recordIdx] == NULLP)
          {
-            DU_LOG("\nERROR  -->  DU APP: buildAndSendPagingToMac(); (Record) Memory Alloction failed!");
+            DU_LOG("\nERROR  -->  DU APP: BuildAndSendDlPcchIndToMac(); (Record) Memory Alloction failed!");
             break;
          }
       }
@@ -644,7 +716,7 @@ uint8_t buildAndSendPagingReqToMac(uint16_t pf, uint8_t i_s, CmLListCp *pageUeLL
                   pagingMsg->pagingRecordList->list.array[recordIdx]->ue_Identity.choice.ng_5G_S_TMSI.size);
             if(pagingMsg->pagingRecordList->list.array[recordIdx]->ue_Identity.choice.ng_5G_S_TMSI.buf == NULLP)
             {
-               DU_LOG("\nERROR  -->  DU APP: buildAndSendPagingToMac(); (5gsTmsi buffer) Memory Allocation failed!");
+               DU_LOG("\nERROR  -->  DU APP: BuildAndSendDlPcchIndToMac(); (5gsTmsi buffer) Memory Allocation failed!");
                break;
             }
             fillBitString(&pagingMsg->pagingRecordList->list.array[recordIdx]->ue_Identity.choice.ng_5G_S_TMSI,\
@@ -666,7 +738,7 @@ uint8_t buildAndSendPagingReqToMac(uint16_t pf, uint8_t i_s, CmLListCp *pageUeLL
       memset(encBuf, 0, ENC_BUF_MAX_LEN);
       encBufSize = 0;
        /* Encode the PCCH RRC PDU as APER */
-      encRetVal = aper_encode(&asn_DEF_PCCH_Message, 0, pcchMsg, PrepFinalEncBuf,\
+      encRetVal = uper_encode(&asn_DEF_PCCH_Message, 0, pcchMsg, PrepFinalEncBuf,\
             encBuf);
 
       if(encRetVal.encoded == ENCODE_FAIL)
@@ -677,25 +749,33 @@ uint8_t buildAndSendPagingReqToMac(uint16_t pf, uint8_t i_s, CmLListCp *pageUeLL
       }
       else
       {
-         DU_LOG("\nDEBUG  -->  F1AP : Created APER encoded buffer for RRCPDU for PagingMsg \n");
+         DU_LOG("\nDEBUG  -->  F1AP : Created APER encoded buffer for RRC PDU for Pcch indication \n");
          
-         DU_ALLOC_SHRABL_BUF(macPageReq, sizeof(MacPageReq));
-         if(macPageReq == NULLP)
+         DU_ALLOC_SHRABL_BUF(macPcchInd, sizeof(DlPcchInd));
+         if(macPcchInd == NULLP)
          {
-            DU_LOG("\nERROR  -->  DU APP: buildAndSendPagingToMac(); (macPageReq) Memory Alloction failed!");
+            DU_LOG("\nERROR  -->  DU APP: BuildAndSendDlPcchIndToMac(); (macPcchInd) Memory Alloction failed!");
             break;
          }
          
-         macPageReq->pf = pf;
-         macPageReq->i_s = i_s;
-         macPageReq->pduLen = encBufSize;
-         DU_ALLOC_SHRABL_BUF(macPageReq->pagePdu, macPageReq->pduLen);
-         if(macPageReq->pagePdu == NULLP)
+         macPcchInd->cellId = cellId;
+         macPcchInd->pf = pf;
+         macPcchInd->i_s = i_s;
+         macPcchInd->pduLen = encBufSize;
+         DU_ALLOC_SHRABL_BUF(macPcchInd->pcchPdu, macPcchInd->pduLen);
+         if(macPcchInd->pcchPdu == NULLP)
+         {
+            DU_LOG("\nERROR  -->  DU APP: BuildAndSendDlPcchIndToMac(); (PcchPDU) Memory Alloction failed!");
+            break;
+         }
+         memcpy(macPcchInd->pcchPdu, encBuf, macPcchInd->pduLen);
+         ret = sendDlPcchIndToMac(macPcchInd);
+         if(ret != ROK)
          {
-            DU_LOG("\nERROR  -->  DU APP: buildAndSendPagingToMac(); (PagePDU) Memory Alloction failed!");
+            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macPcchInd->pcchPdu, macPcchInd->pduLen);
+            DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, macPcchInd, sizeof(DlPcchInd));
             break;
          }
-         memcpy(macPageReq->pagePdu, encBuf, macPageReq->pduLen);
       }
       ret = ROK;
       break;
@@ -798,7 +878,7 @@ uint8_t insertPagingRecord(DuCellCb* cellCb, DuPagingMsg *rcvdF1apPagingParam, u
 #if 0
    printPageList(&(cellCb->pagingInfoMap));
 #endif
-   
+
    return ROK;
 
 
@@ -939,7 +1019,6 @@ uint8_t calcAndFillPagingInfoInCellCb(DuCellCb* cellCb, DuPagingMsg *rcvdF1apPag
       rcvdF1apPagingParam->pagingFrame =  (sfn % MAX_SFN);
       rcvdF1apPagingParam->i_s = ((uint32_t)(floor(rcvdF1apPagingParam->pagUeId / N)) % ns);
 
-      DU_LOG("\nINFO   --> DU APP : Successfully filled paging parameter in DuCellCb");
       memcpy(&cellCb->tmpPagingInfoOfUe, rcvdF1apPagingParam, sizeof(DuPagingMsg));
    }
    else
@@ -991,6 +1070,56 @@ uint8_t processPagingMsg(uint16_t cellId, DuPagingMsg *rcvdF1apPagingParam)
    return ROK;
 
 }
+
+/*******************************************************************
+ *
+ * @brief DU build and send dl broacast req  and send it to MAC
+ *
+ * @details
+ *
+ *    Function : duBuildAndSendDlBroadcastReq
+ *
+ *    Functionality: DU build and send dl broacast req and send to MAC
+ *                   
+ *
+ * @params[in] cellId, crnti 
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+
+uint8_t duBuildAndSendDlBroadcastReq()
+{
+   Pst pst;
+   uint8_t ret =ROK;
+   MacDlBroadcastReq *dlBroadcast=NULLP;
+
+   DU_LOG("\nDEBUG  -->  DU_APP : Building Dl broadcast request");
+
+   DU_ALLOC_SHRABL_BUF(dlBroadcast, sizeof(MacDlBroadcastReq));
+   if(dlBroadcast)
+   {
+      /*TODO - fill MAC DL Broadcast Request*/
+      
+      FILL_PST_DUAPP_TO_MAC(pst, EVENT_MAC_DL_BROADCAST_REQ);
+
+      DU_LOG("\nDEBUG  -->  DU_APP: Sending Dl broadcast  Request to MAC ");
+      ret = (*packMacDlBroadcastReqOpts[pst.selector])(&pst, dlBroadcast);
+      if(ret == RFAILED)
+      {
+         DU_LOG("\nERROR  -->  DU_APP: sendDlBroadcastReqToMac(): Failed to send Dl broadcast  Req to MAC");
+         DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlBroadcast, sizeof(MacDlBroadcastReq));
+      }
+   }
+   else
+   {
+      DU_LOG("\nERROR  -->   DU_APP: sendDlBroadcastReqToMac(): Failed to allocate memory"); 
+      ret =  RFAILED;
+   }
+
+   return ret;
+}
+
 /**********************************************************************
   End of file
  **********************************************************************/