[Epic-ID: ODUHIGH-463][Task-ID: ODUHIGH-508] UE context release at Source GNB after... 62/11062/1
authorlal.harshita <Harshita.Lal@radisys.com>
Tue, 9 May 2023 13:45:10 +0000 (19:15 +0530)
committerlal.harshita <Harshita.Lal@radisys.com>
Tue, 9 May 2023 13:45:34 +0000 (19:15 +0530)
Change-Id: Ifb6eb6444edc7f9b0385ea0f11a8baae4e74a297
Signed-off-by: lal.harshita <Harshita.Lal@radisys.com>
src/cu_stub/cu_f1ap_msg_hdl.c
src/cu_stub/cu_stub.h
src/cu_stub/cu_xnap_msg_hdl.c

index 5da2175..573c3f0 100644 (file)
@@ -9846,29 +9846,36 @@ 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.srcNodeId;
-                  DuDb *srcDuDb = NULLP;
-
-                  /* In target DU DB, mark UE as active and delete HO info */
-                  duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
-                  memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
-
-                  /* Release UE context in source DU because the UE is now
-                   * attached to target DU */
-                  SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
-                  for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
+                  if(duDb->ueCb[duUeF1apId-1].hoInfo.HOType == Inter_DU_HO)
                   {
-                     if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
+                     uint8_t ueIdx = 0;
+                     uint8_t srcDuId = duDb->ueCb[duUeF1apId-1].hoInfo.srcNodeId;
+                     DuDb *srcDuDb = NULLP;
+
+                     /* Release UE context in source DU because the UE is now
+                      * attached to target DU */
+                     SEARCH_DU_DB(duIdx, srcDuId, srcDuDb);
+                     for(ueIdx = 0; ueIdx < srcDuDb->numUe; ueIdx++)
                      {
-                        ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId); 
-                        if(ret != ROK)
+                        if(srcDuDb->ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apId)
                         {
-                           DU_LOG("\nINFO  -->  F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
+                           ret = BuildAndSendUeContextReleaseCommand(srcDuId, srcDuDb->ueCb[ueIdx].gnbCuUeF1apId, srcDuDb->ueCb[ueIdx].gnbDuUeF1apId); 
+                           if(ret != ROK)
+                           {
+                              DU_LOG("\nINFO  -->  F1AP: Failed to build and send UE context release command to source DU Id [%d]", srcDuId);
+                           }
+                           break;
                         }
-                        break;
                      }
                   }
+                  else 
+                  {
+                     BuildAndSendUeContextRelease(&duDb->ueCb[duUeF1apId-1]);
+                  }
+
+                  /* In target DU DB, mark UE as active and delete HO info */
+                  duDb->ueCb[duUeF1apId-1].state = UE_ACTIVE;
+                  memset(&duDb->ueCb[duUeF1apId-1].hoInfo, 0, sizeof(HandoverInfo));
                   return ret;
                }
                break;
index b809981..5b764af 100644 (file)
@@ -117,7 +117,8 @@ typedef enum
    XN_SETUP_REQ,
    XN_SETUP_RSP,
    HO_REQ,
-   HO_REQ_ACK
+   HO_REQ_ACK,
+   UE_CTXT_REL
 }XnEventType;
 
 typedef enum
index c3e01aa..8033c99 100644 (file)
@@ -401,6 +401,89 @@ void XNAPProcHandoverReqAck(uint32_t destId, Buffer *mBuf)
    }
 }
 
+/*******************************************************************
+ *
+ * @brief Build And send dummy UE Context Release to Peer CU
+ *
+ * @details
+ *
+ *    Function : BuildAndSendUeContextRelease
+ *
+ *    Functionality:
+ *       Build And send dummy UE Context Release to Peer CU
+ *
+ * @params[in] Pointer to UE Cb
+ * @return void
+ *
+ ******************************************************************/
+void BuildAndSendUeContextRelease(CuUeCb *ueCb)
+{
+   Buffer *mBuf = NULLP;
+
+   if(ODU_GET_MSG_BUF(1, 1, &mBuf) == ROK)
+   {
+      CMCHKPK(oduUnpackUInt8, ueCb->hoInfo.cuUeF1apIdSrc, mBuf);
+      CMCHKPK(oduUnpackUInt8, UE_CTXT_REL, mBuf);
+      if(sctpSend(XN_INTERFACE, ueCb->hoInfo.srcNodeId, mBuf) != ROK)
+      {
+         DU_LOG("\nERROR  -->  CU_STUB: Failed to send UE context release to peer CU");
+      }
+   }
+
+   return;
+}
+
+/*******************************************************************
+ * @brief Process received UE Context Release
+ *
+ * @details
+ *
+ *    Function : XNAPProcUeContextRel
+ *
+ *    Functionality:
+ *       1. Unpack CU UE F1AP ID (by SCU) and fetch UE CB and
+ *          the corresponding DU DB (SDU)
+ *       2. Send UE Context release command to SDU 
+ *
+ * @params[in] Destination Id
+ *             Pointer to message buffer
+ * @return void
+ *
+ ******************************************************************/
+void XNAPProcUeContextRel(uint32_t destId, Buffer *mBuf)
+{
+   uint8_t   duIdx, duId, ueIdx;
+   uint8_t   cuUeF1apIdSrc;
+   DuDb      *duDb;
+   CuUeCb    *ueCb;
+
+   DU_LOG("\nINFO  -->  CU STUB : Received UE Context Release");
+
+   /* Fetch UE CB and DU DB in Source CU for UE under Inter-CU Handover */
+   CMCHKUNPK(oduPackUInt8, &(cuUeF1apIdSrc), mBuf);
+   for(duIdx = 0; duIdx < cuCb.numDu; duIdx++)
+   {
+      for(ueIdx = 0; ueIdx < MAX_NUM_CELL * MAX_NUM_UE; ueIdx++)
+      {
+         if(cuCb.duInfo[duIdx].ueCb[ueIdx].gnbCuUeF1apId == cuUeF1apIdSrc)
+         {
+            duDb = &cuCb.duInfo[duIdx];
+            ueCb = &duDb->ueCb[ueIdx];
+            break;
+         }
+      }
+      if(duDb && ueCb)
+         break;
+   }
+   if(!duDb || !ueCb)
+   {
+      DU_LOG("\nERROR  -->  CU STUB : UE CB not found for CU UE F1AP ID [%d]", cuUeF1apIdSrc);
+      return;
+   }
+
+   BuildAndSendUeContextReleaseCommand(duDb->duId, ueCb->gnbCuUeF1apId, ueCb->gnbDuUeF1apId);
+}
+
 /*******************************************************************
  *
  * @brief Handle incoming messages at Xn interface
@@ -449,6 +532,11 @@ void XNAPMsgHdlr(uint32_t *destId, Buffer *mBuf)
             XNAPProcHandoverReqAck(*destId, mBuf);
             break;
          }
+      case UE_CTXT_REL:
+         {
+            XNAPProcUeContextRel(*destId, mBuf);
+            break;
+         }
       default:
          DU_LOG("\nERROR  --> CU_STUB : Invalid event [%d] received at XN interface", event);
          break;