[Epic-ID: ODUHIGH-463][Task-ID: ODUHIGH-497] Inter-CU-HO: GNB-DU Config Query 90/10490/1
authorlal.harshita <Harshita.Lal@radisys.com>
Tue, 21 Feb 2023 11:49:17 +0000 (17:19 +0530)
committerlal.harshita <Harshita.Lal@radisys.com>
Tue, 21 Feb 2023 11:49:37 +0000 (17:19 +0530)
Signed-off-by: lal.harshita <Harshita.Lal@radisys.com>
Change-Id: I041fdb675733aed26c81ced29634f030ff090d1c

src/cu_stub/cu_f1ap_msg_hdl.c
src/cu_stub/cu_stub.c
src/cu_stub/cu_stub.h

index 42aa147..14f7a28 100644 (file)
@@ -9316,7 +9316,7 @@ uint8_t BuildAndSendUeContextSetupReq(uint32_t duId, CuUeCb *ueCb)
       if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
       {
          /* Spec 38.473 Sec 9.2.2.1 : For handover case, this IE shall be considered as target cell. */
-         SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, targetDuDb);
+         SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetId, targetDuDb);
          /* Since we are supporting only one cell per DU, accessing 0th index to
           * get target cell info */
          spCellId = targetDuDb->cellCb[0].nrCellId;
@@ -9654,7 +9654,7 @@ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
                    ueCb->gnbDuUeF1apId = duUeF1apId;
                    ueCb->gnbCuUeF1apId = cuUeF1apId;
                    ueCb->state = UE_HANDOVER_IN_PROGRESS;
-                   ueCb->hoInfo.targetDuId = duId; 
+                   ueCb->hoInfo.targetId = duId; 
                    (duDb->numUe)++;
 
                    ueCb->cellCb->ueCb[ueCb->cellCb->numUe] = ueCb;
@@ -9720,7 +9720,7 @@ uint8_t procUeContextSetupResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
 
                   /* Store source DU info in the new UE context created in
                    * tareget DU */
-                  ueCb->hoInfo.sourceDuId = srcDuDb->duId;
+                  ueCb->hoInfo.sourceId = srcDuDb->duId;
 
                   /* Copy the received container to UeCb */
                   memcpy(&ueCbInSrcDu->f1apMsgDb.duToCuContainer, duToCuRrcContainer, sizeof(OCTET_STRING_t));
@@ -9816,7 +9816,7 @@ uint8_t procUlRrcMsg(uint32_t duId, F1AP_PDU_t *f1apMsg)
                if(duDb->ueCb[duUeF1apId-1].state == UE_HANDOVER_IN_PROGRESS)
                {
                   uint8_t ueIdx = 0;
-                  uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceDuId;
+                  uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.sourceId;
                   DuDb *srcDuDb = NULLP;
 
                   /* In target DU DB, mark UE as active and delete HO info */
@@ -11958,13 +11958,13 @@ uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
 
    /* If UE is in handover and UE context is not yet created at target DU, then send
     * UE context setup request to target DU */
-   if(ueCb->state == UE_HANDOVER_IN_PROGRESS)
+   if(ueCb->state == UE_HANDOVER_IN_PROGRESS && ueCb->hoInfo.HOType == Inter_DU_HO)
    {
       uint8_t ueIdx = 0;
       DuDb *tgtDuDb = NULLP;
       CuUeCb *ueCbInTgtDu = NULLP;
 
-      SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetDuId, tgtDuDb);
+      SEARCH_DU_DB(duIdx, ueCb->hoInfo.targetId, tgtDuDb);
       if(tgtDuDb)
       {
          /* Since DU UE F1AP ID assigned by target DU to this UE in handover is
@@ -11983,7 +11983,7 @@ uint8_t procUeContextModificationResponse(uint32_t duId, F1AP_PDU_t *f1apMsg)
           * request */
          if(ueCbInTgtDu == NULLP)
          {
-            if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetDuId, ueCb)) != ROK)
+            if((BuildAndSendUeContextSetupReq(ueCb->hoInfo.targetId, ueCb)) != ROK)
             {
                DU_LOG("\nERROR  ->  F1AP : Failed at BuildAndSendUeContextSetupReq");
                return RFAILED;
index 0e78325..b817edf 100644 (file)
@@ -270,25 +270,31 @@ void readCuCfg()
  *         RFAILED - failure
  *
  * ****************************************************************/
-void initiateInterDuHandover(uint32_t sourceDuId, uint32_t targetDuId, uint32_t ueId)
+void initiateInterDuHandover(uint32_t sourceDuId, uint32_t targetDuId, uint32_t duUeF1apId)
 {
-    uint8_t duIdx = 0;
-    DuDb *duDb = NULLP;
-    CuUeCb *ueCb = NULLP;
-   
-    SEARCH_DU_DB(duIdx, sourceDuId, duDb); 
-    if(duDb)
-       ueCb = &duDb->ueCb[ueId-1];
-    if(ueCb)
-    {
-       ueCb->state = UE_HANDOVER_IN_PROGRESS;
-       ueCb->hoInfo.sourceDuId = sourceDuId;
-       ueCb->hoInfo.targetDuId = targetDuId;
-    }
+   uint8_t duIdx = 0;
+   DuDb *duDb = NULLP;
+   CuUeCb *ueCb = NULLP;
 
-    DU_LOG("\nINFO  --> CU_STUB: Inter-DU Handover Started for ueId [%d] from DU ID [%d] to DU ID [%d]", \
-          ueId, sourceDuId, targetDuId);
-    BuildAndSendUeContextModificationReq(sourceDuId, ueCb, QUERY_CONFIG);
+   DU_LOG("\nINFO  --> CU_STUB: Inter-DU Handover Started for ueId [%d] from DU ID [%d] to DU ID [%d]", \
+         duUeF1apId, sourceDuId, targetDuId);
+
+   SEARCH_DU_DB(duIdx, sourceDuId, duDb); 
+   if(duDb)
+      ueCb = &duDb->ueCb[duUeF1apId-1];
+   if(ueCb)
+   {
+      ueCb->state = UE_HANDOVER_IN_PROGRESS;
+      ueCb->hoInfo.HOType = Inter_DU_HO;
+      ueCb->hoInfo.sourceId = sourceDuId;
+      ueCb->hoInfo.targetId = targetDuId;
+
+      BuildAndSendUeContextModificationReq(sourceDuId, ueCb, QUERY_CONFIG);
+   }
+   else
+   {
+      DU_LOG("\nINFO  --> CU_STUB: DU UE F1AP ID [%d] not found", duUeF1apId);
+   }
 }
 
 
@@ -310,11 +316,41 @@ void initiateInterDuHandover(uint32_t sourceDuId, uint32_t targetDuId, uint32_t
  *         RFAILED - failure
  *
  * ****************************************************************/
-void initiateInterCuHandover(uint32_t sourceCuId, uint32_t targetCuId, uint32_t ueId)
+void initiateInterCuHandover(uint32_t sourceCuId, uint32_t targetCuId, uint32_t cuUeF1apId)
 {
+    uint8_t  duIdx, ueIdx;
+    CuUeCb   *ueCb = NULLP;
+
     DU_LOG("\nINFO  --> CU_STUB: Inter-CU Handover Started for ueId [%d] from CU ID [%d] to CU ID [%d]", \
-          ueId, sourceCuId, targetCuId);
-    //TODO : First message of HO procedure to be triggered here. Changes to be done in next commit.
+          cuUeF1apId, sourceCuId, targetCuId);
+
+    for(duIdx = 0; duIdx < cuCb.numDu; duIdx++)
+    {
+       for(ueIdx = 0; ueIdx < (MAX_NUM_CELL * MAX_NUM_UE); ueIdx++)
+       {
+          ueCb = &cuCb.duInfo[duIdx].ueCb[ueIdx];
+          if(cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
+          {
+             ueCb = &cuCb.duInfo[duIdx].ueCb[ueIdx];
+             break; 
+          }
+       }
+       if(ueCb)
+          break;
+    }
+
+    if(ueCb)
+    {   
+       ueCb->state = UE_HANDOVER_IN_PROGRESS;
+       ueCb->hoInfo.HOType = Xn_Based_Inter_CU_HO;
+       ueCb->hoInfo.sourceId = sourceCuId;
+       ueCb->hoInfo.targetId = targetCuId;
+       BuildAndSendUeContextModificationReq(cuCb.duInfo[duIdx].duId, ueCb, QUERY_CONFIG);
+    }   
+    else
+    {
+       DU_LOG("\nINFO  --> CU_STUB: CU UE F1AP ID [%d] not found", cuUeF1apId);
+    }
 }
 
 /*******************************************************************
index a0239a4..180116f 100644 (file)
@@ -145,8 +145,9 @@ typedef struct cuCfgParams
 
 typedef struct handoverInfo
 {
-   uint32_t sourceDuId;
-   uint32_t targetDuId;
+   HandoverType HOType;
+   uint32_t sourceId;   /* If Inter_DU HO, this is Source DU ID. In case of Inter CU HO, this is Source CU ID */
+   uint32_t targetId;   /* If Inter_DU HO, this is Taregt DU ID. In case of Inter CU HO, this is Target CU ID */
 }HandoverInfo;
 
 typedef struct dlAmCfg