UL data path changes at Phy stub, RLC UL UM and DU APP [Issue-ID: ODUHIGH-262]
[o-du/l2.git] / src / 5gnrrlc / rlc_msg_hdl.c
index 0e296ce..28a4f62 100644 (file)
@@ -49,7 +49,7 @@
  *
  * @details
  *
- *    Function : fillRlcUlUeCfgRsp
+ *    Function : fillRlcUeCfgRsp
  *
  *    Functionality: 
  *     Fills RLC UL UE Cfg Rsp from RlcCRsp
  *  @params[in]  Pointer to RlcCfgCfm
  *               Pointer to RlcUeCfgRsp
  *
- *  @return void
+ *  @return ROK/RFAILED
  * 
  *****************************************************************/
 
-void fillRlcUlUeCfgRsp(RlcUeCfgRsp *rlcCfgRsp, RlcCfgCfmInfo *rlcCRsp)
+uint8_t fillRlcUeCfgRsp(RlcUeCfgRsp *rlcCfgRsp, RlcCfgCfmInfo *rlcCRsp)
 {
    uint8_t idx;
+   uint8_t ret = ROK;
  
    rlcCfgRsp->cellId = rlcCRsp->cellId;
    rlcCfgRsp->ueIdx  = rlcCRsp->ueId;
@@ -73,13 +74,17 @@ void fillRlcUlUeCfgRsp(RlcUeCfgRsp *rlcCfgRsp, RlcCfgCfmInfo *rlcCRsp)
       {
          rlcCfgRsp->result = RLC_DU_APP_RSP_OK;
         rlcCfgRsp->reason = rlcCRsp->entCfgCfm[idx].status.reason;
+        ret = ROK;
       }
       else
       {
          rlcCfgRsp->result = RLC_DU_APP_RSP_NOK;
         rlcCfgRsp->reason = rlcCRsp->entCfgCfm[idx].status.reason;
+        ret = RFAILED;
+        break;
       }
    }
+   return ret;
 }
 
 /*******************************************************************
@@ -104,19 +109,19 @@ void fillEntModeAndDir(uint8_t *entMode, uint8_t *direction, RlcMode rlcMode)
    switch(rlcMode)
    {
       case RLC_AM:
-         *entMode   = CM_LTE_MODE_AM;
+         *entMode   = RLC_MODE_AM;
          *direction = RLC_CFG_DIR_BOTH;
          break;
       case RLC_UM_BI_DIRECTIONAL:
-         *entMode = CM_LTE_MODE_UM;
+         *entMode = RLC_MODE_UM;
          *direction = RLC_CFG_DIR_BOTH;
          break;
       case RLC_UM_UNI_DIRECTIONAL_UL:
-         *entMode = CM_LTE_MODE_UM;
+         *entMode = RLC_MODE_UM;
          *direction = RLC_CFG_DIR_UL;
          break;
       case RLC_UM_UNI_DIRECTIONAL_DL:
-         *entMode = CM_LTE_MODE_UM;
+         *entMode = RLC_MODE_UM;
          *direction = RLC_CFG_DIR_DL;
          break;
       default : 
@@ -124,13 +129,111 @@ void fillEntModeAndDir(uint8_t *entMode, uint8_t *direction, RlcMode rlcMode)
     break;
    }
 }
+
+/*******************************************************************
+ *
+ * @brief fills LC Cfgs to be Added in RLC
+ *
+ * @details
+ *
+ *    Function : fillLcCfg
+ *
+ *    Functionality:
+ *      fills LC Cfgs to be Added in RLC
+ *
+ * @params[in] 
+ *             RlcEntCfgInfo pointer
+ *             RlcBearerCfg pointer
+ *             Config Type 
+ * @return void
+ *
+ * ****************************************************************/
+void fillLcCfg(RlcEntCfgInfo *rlcUeCfg, RlcBearerCfg *duRlcUeCfg, uint8_t cfgType)
+{
+   uint8_t lChRbIdx = 0;
+
+   rlcUeCfg->rbId                  = duRlcUeCfg->rbId;
+   rlcUeCfg->rbType                = duRlcUeCfg->rbType;   // SRB or DRB
+   rlcUeCfg->lCh[lChRbIdx].lChId   = duRlcUeCfg->lcId;   
+   rlcUeCfg->lCh[lChRbIdx].type    = duRlcUeCfg->lcType;
+   fillEntModeAndDir(&rlcUeCfg->entMode, &rlcUeCfg->dir, duRlcUeCfg->rlcMode);
+   rlcUeCfg->cfgType               = cfgType;
+   switch(rlcUeCfg->entMode)
+   {
+
+      case RLC_MODE_AM:
+         {
+            /* DL AM INFO */
+            rlcUeCfg->m.amInfo.dl.snLen       = duRlcUeCfg->u.amCfg->dlAmCfg.snLenDl; 
+            rlcUeCfg->m.amInfo.dl.pollRetxTmr = duRlcUeCfg->u.amCfg->dlAmCfg.pollRetxTmr;
+            rlcUeCfg->m.amInfo.dl.pollPdu     = duRlcUeCfg->u.amCfg->dlAmCfg.pollPdu; 
+            rlcUeCfg->m.amInfo.dl.pollByte    = duRlcUeCfg->u.amCfg->dlAmCfg.pollByte; 
+            rlcUeCfg->m.amInfo.dl.maxRetx     = duRlcUeCfg->u.amCfg->dlAmCfg.maxRetxTh;
+
+            /* UL AM INFO */
+            lChRbIdx++;   //lChRbIdx = 1, indicates UL AM
+            rlcUeCfg->lCh[lChRbIdx].lChId    = duRlcUeCfg->lcId;   
+            rlcUeCfg->lCh[lChRbIdx].type     = duRlcUeCfg->lcType;
+            rlcUeCfg->m.amInfo.ul.snLen      = duRlcUeCfg->u.amCfg->ulAmCfg.snLenUl; 
+            rlcUeCfg->m.amInfo.ul.staProhTmr = duRlcUeCfg->u.amCfg->ulAmCfg.statProhTmr;
+            rlcUeCfg->m.amInfo.ul.reOrdTmr   = duRlcUeCfg->u.amCfg->ulAmCfg.reAssemTmr * RLC_REASSEMBLY_TMR_BASE;
+            break;
+         }
+      case RLC_MODE_UM:
+         {
+            /* UL UM CONFIG */
+            rlcUeCfg->m.umInfo.ul.snLen      = duRlcUeCfg->u.umBiDirCfg->ulUmCfg.snLenUlUm; 
+            rlcUeCfg->m.umInfo.ul.reAsmblTmr = duRlcUeCfg->u.umBiDirCfg->ulUmCfg.reAssemTmr * RLC_REASSEMBLY_TMR_BASE;
+
+            /* DL UM CONFIG */
+            rlcUeCfg->m.umInfo.dl.snLen = duRlcUeCfg->u.umBiDirCfg->dlUmCfg.snLenDlUm; 
+            break;
+         }
+      default:
+         break;
+   }/* End of switch(entMode) */
+}
+
+/*******************************************************************
+ *
+ * @brief fills LC Cfgs to be Added in RLC
+ *
+ * @details
+ *
+ *    Function : fillRlcCfg
+ *
+ *    Functionality:
+ *      fills LC Cfgs to be Add/Mod/Del in RLC
+ *
+ * @params[in] 
+ *             RlcEntCfgInfo pointer
+ *             RlcBearerCfg pointer
+ * @return void
+ *
+ ******************************************************************/
+
+void fillRlcCfg(RlcCfgInfo *rlcUeCfg, RlcUeCfg *ueCfg)
+{
+   uint8_t lcIdx;
+   
+   rlcUeCfg->ueId    = ueCfg->ueIdx;
+   rlcUeCfg->cellId  = ueCfg->cellId;
+   rlcUeCfg->numEnt  = ueCfg->numLcs;
+   rlcUeCfg->transId = getTransId();
+
+   for(lcIdx = 0; lcIdx < rlcUeCfg->numEnt; lcIdx++)
+   {
+      fillLcCfg(&rlcUeCfg->entCfg[lcIdx], &ueCfg->rlcLcCfg[lcIdx], ueCfg->rlcLcCfg[lcIdx].configType);
+   }
+}
+
 /*******************************************************************
  *
  * @brief Handles Ue Create Request from DU APP
  *
  * @details
  *
- *    Function : RlcUlProcUeCreateReq
+ *    Function : RlcProcUeCreateReq
  *
  *    Functionality:
  *      Handles Ue create Request from DU APP
@@ -141,80 +244,32 @@ void fillEntModeAndDir(uint8_t *entMode, uint8_t *direction, RlcMode rlcMode)
  *         RFAILED - failure
  *
  * ****************************************************************/
-uint8_t RlcUlProcUeCreateReq(Pst *pst, RlcUeCfg *ueCfg)
+uint8_t RlcProcUeCreateReq(Pst *pst, RlcUeCfg *ueCfg)
 {
-   uint8_t idx;
    uint8_t ret = ROK;
-   uint8_t lChRbIdx;
    RlcCfgInfo *rlcUeCfg = NULLP;
 
    RlcCb *rlcUeCb = NULLP;
    rlcUeCb = RLC_GET_RLCCB(pst->dstInst);
    RLC_ALLOC(rlcUeCb, rlcUeCfg, sizeof(RlcCfgInfo));
-   if(rlcUeCfg)
+   if(rlcUeCfg == NULLP)
+   {
+      DU_LOG("\nRLC: Failed to allocate memory at RlcProcUeCreateReq()");
+      ret = RFAILED;
+   }
+   else
    {
       memset(rlcUeCfg, 0, sizeof(RlcCfgInfo));
-
-      rlcUeCfg->ueId    = ueCfg->ueIdx;
-      rlcUeCfg->cellId  = ueCfg->cellId;
-      rlcUeCfg->numEnt  = ueCfg->numLcs;
-      rlcUeCfg->transId = getTransId();
-      for(idx = 0; idx < ueCfg->numLcs; idx++)
-      {
-         lChRbIdx = 0;
-         rlcUeCfg->entCfg[idx].rbId           = ueCfg->rlcBearerCfg[idx].rbId;
-         rlcUeCfg->entCfg[idx].rbType         = ueCfg->rlcBearerCfg[idx].rbType;   // SRB or DRB
-         rlcUeCfg->entCfg[idx].lCh[lChRbIdx].lChId   = ueCfg->rlcBearerCfg[idx].lcId;   
-         rlcUeCfg->entCfg[idx].lCh[lChRbIdx].type    = ueCfg->rlcBearerCfg[idx].lcType;
-         fillEntModeAndDir(&rlcUeCfg->entCfg[idx].entMode, &rlcUeCfg->entCfg[idx].dir,\
-            ueCfg->rlcBearerCfg[idx].rlcMode);
-         rlcUeCfg->entCfg[idx].cfgType        = CKW_CFG_ADD;
-         switch(rlcUeCfg->entCfg[idx].entMode)
-         {
-
-            case CM_LTE_MODE_AM:
-            {
-               /* DL AM INFO */
-               rlcUeCfg->entCfg[idx].m.amInfo.dl.snLen = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.snLenDl; 
-               rlcUeCfg->entCfg[idx].m.amInfo.dl.pollRetxTmr = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.pollRetxTmr;
-               rlcUeCfg->entCfg[idx].m.amInfo.dl.pollPdu = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.pollPdu; 
-               rlcUeCfg->entCfg[idx].m.amInfo.dl.pollByte = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.pollByte; 
-               rlcUeCfg->entCfg[idx].m.amInfo.dl.maxRetx = ueCfg->rlcBearerCfg[idx].u.amCfg.dlAmCfg.maxRetxTh;
-
-               /* UL AM INFO */
-              lChRbIdx++;   //lChRbIdx = 1, indicates UL AM
-               rlcUeCfg->entCfg[idx].lCh[lChRbIdx].lChId   = ueCfg->rlcBearerCfg[idx].lcId;   
-               rlcUeCfg->entCfg[idx].lCh[lChRbIdx].type    = ueCfg->rlcBearerCfg[idx].lcType;
-               rlcUeCfg->entCfg[idx].m.amInfo.ul.snLen = ueCfg->rlcBearerCfg[idx].u.amCfg.ulAmCfg.snLenUl; 
-               rlcUeCfg->entCfg[idx].m.amInfo.ul.staProhTmr = ueCfg->rlcBearerCfg[idx].u.amCfg.ulAmCfg.statProhTmr;
-               rlcUeCfg->entCfg[idx].m.amInfo.ul.reOrdTmr = ueCfg->rlcBearerCfg[idx].u.amCfg.ulAmCfg.reAssemTmr;
-               break;
-            }
-            case CM_LTE_MODE_UM:
-            {
-               /* UL UM CONFIG */
-               rlcUeCfg->entCfg[idx].m.umInfo.ul.snLen = ueCfg->rlcBearerCfg[idx].u.umBiDirCfg.ulUmCfg.snLenUlUm; 
-               rlcUeCfg->entCfg[idx].m.umInfo.ul.reOrdTmr = ueCfg->rlcBearerCfg[idx].u.umBiDirCfg.ulUmCfg.reAssemTmr;
-
-               /* DL UM CONFIG */
-               rlcUeCfg->entCfg[idx].m.umInfo.dl.snLen = ueCfg->rlcBearerCfg[idx].u.umBiDirCfg.dlUmCfg.snLenDlUm; 
-               break;
-            }
-            default:
-               break;
-         }/* End of switch(entMode) */
-      }
+      fillRlcCfg(rlcUeCfg, ueCfg); 
       ret = RlcProcCfgReq(pst, rlcUeCfg);
-      }
-      else
-      {
-         DU_LOG("\nRLC: Failed to allocate memory ");
-         ret = RFAILED;
-      }
-      RLC_FREE_SHRABL_BUF(pst->region, pst->pool, ueCfg, sizeof(RlcUeCfg));
-      return ret;
+      if(ret != ROK)
+         DU_LOG("\nRLC: Failed to configure Add/Mod/Del entities at RlcProcUeCreateReq()");
+
+   }
+   RLC_FREE_SHRABL_BUF(pst->region, pst->pool, ueCfg, sizeof(RlcUeCfg));
+   return ret;
 }
+
 /*******************************************************************
 *
 * @brief filling the structure of rrc delivery msg info
@@ -305,7 +360,10 @@ uint8_t RlcProcDlRrcMsgTransfer(Pst *pst, RlcDlRrcMsgInfo *dlRrcMsgInfo)
    }
    oduCpyFixBufToMsg(dlRrcMsgInfo->rrcMsg, mBuf, dlRrcMsgInfo->msgLen);
 
-   rlcProcDlData(pst, datReqInfo, mBuf);
+   if(rlcProcDlData(pst, datReqInfo, mBuf) != ROK)
+   {
+      return RFAILED;
+   }
 
    /* RRC Delivery report is only send when RRC Delivery status report is true in DL RRC Message */
    if(dlRrcMsgInfo->deliveryStaRpt)
@@ -341,13 +399,13 @@ uint8_t RlcProcDlRrcMsgTransfer(Pst *pst, RlcDlRrcMsgInfo *dlRrcMsgInfo)
 uint8_t RlcProcUlData(Pst *pst, RlcData *ulData)
 {
    uint8_t         ret = ROK;
-   uint8_t              idx, pduIdx;
-   uint8_t              lcId;                    /* Logical Channel */
-   uint8_t              numDLch = 0;             /* Number of dedicated logical channel */
+   uint8_t         idx, pduIdx;
+   uint8_t         lcId;                    /* Logical Channel */
+   uint8_t         numDLch = 0;             /* Number of dedicated logical channel */
    bool            dLchPduPres;             /* PDU received on dedicated logical channel */
-   RguLchDatInd    dLchData[MAX_NUM_LC];  /* PDU info on dedicated logical channel */
-   RguDDatIndInfo  *dLchUlDat;               /* UL data on dedicated logical channel */
-   RguCDatIndInfo  *cLchUlDat;               /* UL data on common logical channel */
+   RguLchDatInd    dLchData[MAX_NUM_LC];    /* PDU info on dedicated logical channel */
+   RguDDatIndInfo  *dLchUlDat;              /* UL data on dedicated logical channel */
+   RguCDatIndInfo  *cLchUlDat;              /* UL data on common logical channel */
 
    /* Initializing dedicated logical channel Database */
    DU_LOG("\nRLC: Received UL Data request from MAC");
@@ -437,7 +495,7 @@ uint8_t RlcProcUlData(Pst *pst, RlcData *ulData)
       if(dLchPduPres)
       {
         dLchUlDat->cellId = ulData->cellId;
-        dLchUlDat->rnti   = ulData->rnti;
+        GET_UE_IDX(ulData->rnti, dLchUlDat->rnti);
 
         for(idx = 0; idx < MAX_NUM_LC; idx++)
         {
@@ -565,6 +623,52 @@ uint8_t RlcProcSchedResultRpt(Pst *pst, RlcSchedResultRpt *schRep)
    return ret;
 }
 
+
+/*******************************************************************
+ *
+ * @brief Handles Ue Reconfig Request from DU APP
+ *
+ * @details
+ *
+ *    Function : RlcProcUeReconfigReq
+ *
+ *    Functionality:
+ *      Handles Ue Reconfig Request from DU APP
+ *
+ * @params[in] Post structure pointer
+ *             RlcUeCfg pointer 
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+uint8_t RlcProcUeReconfigReq(Pst *pst, RlcUeCfg *ueCfg)
+{
+   uint8_t ret = ROK;
+   RlcCfgInfo *rlcUeCfg = NULLP; //Seed code Rlc cfg struct
+   RlcCb *rlcUeCb = NULLP;
+    
+   DU_LOG("\nRLC: UE reconfig request received. CellID[%d] UEIDX[%d]",ueCfg->cellId, ueCfg->ueIdx);
+
+   rlcUeCb = RLC_GET_RLCCB(pst->dstInst);
+   RLC_ALLOC(rlcUeCb, rlcUeCfg, sizeof(RlcCfgInfo));
+   if(rlcUeCfg == NULLP)
+   {
+      DU_LOG("\nRLC: Failed to allocate memory at RlcProcUeReconfigReq()");
+      ret = RFAILED;
+   }
+   else
+   {
+      memset(rlcUeCfg, 0, sizeof(RlcCfgInfo));
+      fillRlcCfg(rlcUeCfg, ueCfg);
+      ret = RlcProcCfgReq(pst, rlcUeCfg);
+      if(ret != ROK)
+         DU_LOG("\nRLC: Failed to configure Add/Mod/Del entities at RlcProcUeReconfigReq()");
+   }
+   
+   RLC_FREE_SHRABL_BUF(pst->region, pst->pool, ueCfg, sizeof(RlcUeCfg));
+   return ret;
+}
+
 /**********************************************************************
          End of file
 **********************************************************************/