Added new parameter in FAPI Config request
[o-du/l2.git] / src / du_app / du_ue_mgr.c
index 2bf2900..40cbdac 100644 (file)
 U32 sduId = 0;
 #endif
 
+DuMacDlCcchInd packMacDlCcchIndOpts[] =
+{
+   packMacDlCcchInd,   /* Loose coupling */
+   MacHdlDlCcchInd,    /* TIght coupling */
+   packMacDlCcchInd    /* Light weight-loose coupling */
+};
+
 /******************************************************************
  *
  * @brief Send UE configuration to RLC
@@ -179,6 +186,219 @@ PUBLIC S16 duHdlRlcUlData(Pst *pst, KwuDatIndInfo* datInd, Buffer *mBuf)
    return ROK;
 }
 
+/******************************************************************
+*
+* @brief Builds and Sends DL CCCH Ind to MAC
+*
+* @details
+*
+*    Function : duBuildAndSendDlCcchInd 
+*
+*    Functionality: Builds and sends DL CCCH Ind Msg to MAC
+*
+* @params[in] dlCcchMsg - uint8_t*
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+uint8_t duBuildAndSendDlCcchInd(uint8_t *dlCcchMsg, uint16_t crnti, uint16_t cellId, DlCcchMsgType msgType)
+{
+   Pst pst;
+       uint8_t ret                  = ROK;
+   DlCcchIndInfo *dlCcchIndInfo = NULLP;
+
+   DU_LOG("\nDU APP : Building and Sending DL CCCH Ind to MAC");
+
+       DU_ALLOC_SHRABL_BUF(dlCcchIndInfo, sizeof(DlCcchIndInfo));
+
+   if(!dlCcchIndInfo)
+   {
+               DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind");
+               return RFAILED;
+       }
+
+       dlCcchIndInfo->cellId = cellId;
+       dlCcchIndInfo->crnti = crnti;
+       dlCcchIndInfo->msgType = msgType;
+       DU_ALLOC_SHRABL_BUF(dlCcchIndInfo->dlCcchMsg, strlen((const char*)dlCcchMsg));
+       if(!dlCcchIndInfo->dlCcchMsg)
+   {
+               DU_LOG("\nDU APP : Memory alloc failed while building DL CCCH Ind");
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, sizeof(DlCcchIndInfo));
+               return RFAILED;
+       }
+       memcpy(dlCcchIndInfo->dlCcchMsg, dlCcchMsg, strlen((const char*)dlCcchMsg));
+       DU_FREE(dlCcchMsg, strlen((const char*)dlCcchMsg));
+
+       /* Fill Pst */
+       pst.selector  = DU_MAC_LWLC;
+       pst.srcEnt    = ENTDUAPP;
+       pst.dstEnt    = ENTRG;
+       pst.dstInst   = 0;
+       pst.srcInst   = 0;
+       pst.dstProcId = DU_PROC;
+       pst.srcProcId = DU_PROC;
+       pst.region    = DU_APP_MEM_REGION;
+       pst.pool      = DU_POOL;
+       pst.event     = EVENT_MAC_DL_CCCH_IND;
+
+   ret = (*packMacDlCcchIndOpts[pst.selector])(&pst, dlCcchIndInfo);
+       if(ret != ROK)
+       {
+      DU_LOG("\nDU_APP : Failure in sending DL CCCH to MAC");
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo->dlCcchMsg, strlen((const char*)dlCcchMsg));
+               DU_FREE_SHRABL_BUF(DU_APP_MEM_REGION, DU_POOL, dlCcchIndInfo, sizeof(DlCcchIndInfo));
+      ret = RFAILED; 
+       }
+
+       return ret;
+
+}
+
+/******************************************************************
+*
+* @brief Processes DL RRC Message Transfer  sent by CU
+*
+* @details
+*
+*    Function : procDlRrcMsgTrans 
+*
+*    Functionality: Processes DL RRC Message Transfer sent by CU
+*
+* @params[in] F1AP_PDU_t ASN decoded F1AP message
+* @return ROK     - success
+*         RFAILED - failure
+*
+* ****************************************************************/
+uint8_t procDlRrcMsgTrans(F1AP_PDU_t *f1apMsg)
+{
+       DLRRCMessageTransfer_t *dlRrcMsg = NULLP;
+       uint8_t                *dlCcchMsg = NULLP;
+       uint8_t                srbId, idx, ret;
+       uint16_t               crnti, cellId;
+       uint32_t               gnbCuUeF1apId, gnbDuUeF1apId;
+
+
+       DU_LOG("\nDU_APP : DL RRC message transfer Recevied");
+       dlRrcMsg = &f1apMsg->choice.initiatingMessage->value.choice.DLRRCMessageTransfer;
+
+       ret = ROK;
+
+       for(idx=0; idx<dlRrcMsg->protocolIEs.list.count; idx++)
+       {
+               switch(dlRrcMsg->protocolIEs.list.array[idx]->id)
+               {
+                       case ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID:
+                               {
+                                       gnbCuUeF1apId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_CU_UE_F1AP_ID;
+                                       UNUSED(gnbCuUeF1apId); //This is currently not used
+                                       break;
+                               }
+                       case ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID:
+                               {
+                                       gnbDuUeF1apId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.GNB_DU_UE_F1AP_ID;
+                                       break;
+                               }
+                       case ProtocolIE_ID_id_SRBID:
+                               {
+                                       srbId = dlRrcMsg->protocolIEs.list.array[idx]->value.choice.SRBID;
+                                       break;
+                               }
+                       case ProtocolIE_ID_id_RRCContainer:
+                               {
+                                  DU_ALLOC(dlCcchMsg, dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
+                                       memcpy(dlCcchMsg,
+                                                       dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.buf,
+                                                       dlRrcMsg->protocolIEs.list.array[idx]->value.choice.RRCContainer.size);
+                                       break;
+                               }
+
+                       default:
+                               DU_LOG("\nDU_APP : Invalid IE received in DL RRC Msg Transfer:%ld",
+                                               dlRrcMsg->protocolIEs.list.array[idx]->id);
+               }
+       }
+   
+   for(idx=0; idx<duCb.numUe; idx++)
+       {
+      if(gnbDuUeF1apId == duCb.ueCcchCtxt[idx].gnbDuUeF1apId)
+               {
+                  crnti  = duCb.ueCcchCtxt[idx].crnti;
+                       cellId = duCb.ueCcchCtxt[idx].cellId;
+               }
+       }
+       if(srbId == 0) //RRC connection setup
+       {
+               ret = duBuildAndSendDlCcchInd(dlCcchMsg, crnti, cellId, RRC_SETUP);
+       }
+       return ret;
+}
+
+/******************************************************************
+ *
+ * @brief Generates GNB DU Ue F1AP ID
+ *
+ * @details
+ *
+ *    Function : genGnbDuUeF1apId
+ *
+ *    Functionality: Generates GNB DU Ue F1AP ID
+ *
+ * @params[in] void
+ * @return gnbDuF1apId
+ *
+ * ****************************************************************/
+uint32_t genGnbDuUeF1apId()
+{
+       static uint32_t gnbDuUeF1apId = 0;
+
+       return ++gnbDuUeF1apId;
+}
+/******************************************************************
+ *
+ * @brief Processes UL CCCH Ind recvd from MAC
+ *
+ * @details
+ *
+ *    Function : duProcUlCcchInd
+ *
+ *    Functionality: Processes UL CCCH Ind recvd from MAC
+ *
+ * @params[in] UlCcchIndInfo *ulCcchIndInfo
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t duProcUlCcchInd(UlCcchIndInfo *ulCcchIndInfo)
+{
+
+   uint8_t ret = ROK;
+       uint32_t gnbDuUeF1apId = 0;
+
+       gnbDuUeF1apId = genGnbDuUeF1apId();
+
+       /* Store Ue mapping */
+       duCb.ueCcchCtxt[duCb.numUe].gnbDuUeF1apId = gnbDuUeF1apId;
+       duCb.ueCcchCtxt[duCb.numUe].crnti         = ulCcchIndInfo->crnti;
+       duCb.ueCcchCtxt[duCb.numUe].cellId        = ulCcchIndInfo->cellId;
+
+       duCb.numUe++;
+
+   ret = (BuildAndSendInitialRrcMsgTransfer(gnbDuUeF1apId, ulCcchIndInfo->crnti,
+                               ulCcchIndInfo->ulCcchMsg));
+       if(ret != ROK)
+       {
+      DU_LOG("\nDU_APP : BuildAndSendInitialRrcMsgTransfer failed");
+       }
+
+   DU_FREE_SHRABL_BUF(MAC_MEM_REGION, RG_POOL, ulCcchIndInfo->ulCcchMsg, strlen((const char*)ulCcchIndInfo->ulCcchMsg));
+   DU_FREE_SHRABL_BUF(MAC_MEM_REGION, RG_POOL, ulCcchIndInfo, sizeof(UlCcchIndInfo));
+
+       return ret;
+
+}
+
+
 /**********************************************************************
          End of file
 ***********************************************************************/