[Epic-ID: ODUHIGH-463][Task-ID: ODUHIGH-509]Fix for memory leak and F1AP message...
[o-du/l2.git] / src / cu_stub / cu_f1ap_msg_hdl.c
index 5da2175..39b0c1f 100644 (file)
@@ -9024,14 +9024,17 @@ uint8_t fillCuToDuContainer(CuUeCb *ueCb, CUtoDURRCInformation_t *rrcMsg)
    uint8_t ret = ROK;
    uint8_t idx;
 
-   /* UE Capabulity RAT Container List */
-   CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
-   if(!rrcMsg->uE_CapabilityRAT_ContainerList)
+   if((ueCb->state != UE_HANDOVER_IN_PROGRESS) || ((ueCb->state == UE_HANDOVER_IN_PROGRESS) && (ueCb->hoInfo.HOType == Inter_DU_HO)))
    {
-      DU_LOG("\nERROR  -->  F1AP : Memory allocation for UE capability RAT container list failed");
-      return RFAILED;
+      /* UE Capabulity RAT Container List */
+      CU_ALLOC(rrcMsg->uE_CapabilityRAT_ContainerList, sizeof(UE_CapabilityRAT_ContainerList_t));
+      if(!rrcMsg->uE_CapabilityRAT_ContainerList)
+      {
+         DU_LOG("\nERROR  -->  F1AP : Memory allocation for UE capability RAT container list failed");
+         return RFAILED;
+      }
+      ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
    }
-   ret = fillUeCapRatContListBuf(rrcMsg->uE_CapabilityRAT_ContainerList);
 
 #if 0
 
@@ -9846,29 +9849,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;
@@ -11157,7 +11167,12 @@ uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxt
       else if(action == RRC_RECONFIG_COMPLETE_IND)
          elementCnt = 3;
       else if((action == STOP_DATA_TX) || (action == RESTART_DATA_TX)) 
-         elementCnt = 5;
+      {
+         if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
+            elementCnt = 5;
+         else
+            elementCnt = 4;
+      }
       
 #ifdef NR_DRX
       if(DRX_TO_BE_RELEASE && ueCb->drxCfgPresent)
@@ -11302,11 +11317,14 @@ uint8_t BuildAndSendUeContextModificationReq(uint32_t duId, void *cuUeCb, UeCtxt
          }
 
          /* RRC delivery status request */
-         ieIdx++;
-         ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
-         ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
-         ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
-         ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
+         if(ueCb->state != UE_HANDOVER_IN_PROGRESS)
+         {
+            ieIdx++;
+            ueContextModifyReq->protocolIEs.list.array[ieIdx]->id = ProtocolIE_ID_id_RRCDeliveryStatusRequest;
+            ueContextModifyReq->protocolIEs.list.array[ieIdx]->criticality = Criticality_ignore;
+            ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.present = UEContextModificationRequestIEs__value_PR_RRCDeliveryStatusRequest;
+            ueContextModifyReq->protocolIEs.list.array[ieIdx]->value.choice.RRCDeliveryStatusRequest = RRCDeliveryStatusRequest_true;
+         }
       }
 
 #ifdef NR_DRX