[Issue Id-ODUHIGH-457] Fixes related to slice configuration in Ue Context Setup
[o-du/l2.git] / src / cu_stub / cu_stub.c
index 7a62215..a57bf06 100644 (file)
@@ -133,7 +133,7 @@ uint8_t tst()
 
 void readCuCfg()
 {
-   uint8_t  *numDu;
+   uint8_t  numDu;
    uint32_t ipv4_du, ipv4_cu;
 
    DU_LOG("\nDEBUG  -->  CU_STUB : Reading CU configurations");
@@ -162,25 +162,42 @@ void readCuCfg()
    cuCb.cuCfgParams.sctpParams.numDu = 1;
 #else
    cuCb.cuCfgParams.sctpParams.numDu = 0;
-   numDu = &cuCb.cuCfgParams.sctpParams.numDu;
-   while(*numDu < MAX_DU_SUPPORTED)
+   cuCb.cuCfgParams.egtpParams.numDu = 0;
+   numDu = 0;
+   while(numDu < MAX_DU_SUPPORTED)
    {
       /* DU IP Address and Port*/
       memset(&ipv4_du, 0, sizeof(uint32_t));
-      cmInetAddr((S8*)DU_IP_V4_ADDR[*numDu], &ipv4_du);
-      cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].duIpAddr.ipV4Addr = ipv4_du;
-      cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].duIpAddr.ipV6Pres = false;
-      cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].duPort = DU_SCTP_PORT[*numDu];
+      cmInetAddr((S8*)DU_IP_V4_ADDR[numDu], &ipv4_du);
+      cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].duIpAddr.ipV4Addr = ipv4_du;
+      cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].duIpAddr.ipV6Pres = false;
+      cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].duPort = DU_SCTP_PORT[numDu];
 
       /* CU IP Address and Port*/
       memset(&ipv4_du, 0, sizeof(uint32_t));
       cmInetAddr((S8*)CU_IP_V4_ADDR, &ipv4_cu);
-      cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].cuIpAddr.ipV4Addr = ipv4_cu;
-      cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].cuIpAddr.ipV6Pres = false;
-      cuCb.cuCfgParams.sctpParams.sctpAssoc[*numDu].cuPort = CU_SCTP_PORT_TO_DU[*numDu];
-      (*numDu)++;
+      cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].cuIpAddr.ipV4Addr = ipv4_cu;
+      cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].cuIpAddr.ipV6Pres = false;
+      cuCb.cuCfgParams.sctpParams.sctpAssoc[numDu].cuPort = CU_SCTP_PORT_TO_DU[numDu];
+
+      /* EGTP Parameters */
+      memset(&ipv4_du, 0, sizeof(uint32_t));
+      cmInetAddr((S8*)DU_IP_V4_ADDR[numDu], &ipv4_du);
+      cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].localIp.ipV4Pres = TRUE;
+      cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].localIp.ipV4Addr = ipv4_cu;
+      cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].localPort = CU_EGTP_PORT[numDu];
+      cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].destIp.ipV4Pres = TRUE;
+      cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].destIp.ipV4Addr = ipv4_du;
+      cuCb.cuCfgParams.egtpParams.egtpAssoc[numDu].destPort = DU_EGTP_PORT[numDu];
+      
+      (numDu)++;
    }
 
+   cuCb.cuCfgParams.egtpParams.minTunnelId = MIN_TEID;
+   cuCb.cuCfgParams.egtpParams.currTunnelId = cuCb.cuCfgParams.egtpParams.minTunnelId;
+   cuCb.cuCfgParams.egtpParams.maxTunnelId = MAX_TEID;
+   cuCb.cuCfgParams.egtpParams.numDu = numDu;
+   cuCb.cuCfgParams.sctpParams.numDu = numDu;
 #endif
 
    /*PLMN*/
@@ -196,16 +213,6 @@ void readCuCfg()
    cuCb.cuCfgParams.rrcVersion.extRrcVer = EXT_RRC_VER;
 
 
-   /* EGTP Parameters */
-   cuCb.cuCfgParams.egtpParams.localIp.ipV4Pres = TRUE;
-   cuCb.cuCfgParams.egtpParams.localIp.ipV4Addr = ipv4_cu;
-   cuCb.cuCfgParams.egtpParams.localPort = CU_EGTP_PORT;
-   cuCb.cuCfgParams.egtpParams.destIp.ipV4Pres = TRUE;
-   cuCb.cuCfgParams.egtpParams.destIp.ipV4Addr = ipv4_du;
-   cuCb.cuCfgParams.egtpParams.destPort = DU_EGTP_PORT;
-   cuCb.cuCfgParams.egtpParams.minTunnelId = MIN_TEID;
-   cuCb.cuCfgParams.egtpParams.currTunnelId = cuCb.cuCfgParams.egtpParams.minTunnelId;
-   cuCb.cuCfgParams.egtpParams.maxTunnelId = MAX_TEID;
 
 } /* End of readCuCfg */
 
@@ -237,7 +244,11 @@ void initiateInterDuHandover(uint32_t sourceDuId, uint32_t targetDuId, uint32_t
     if(duDb)
        ueCb = &duDb->ueCb[ueId-1];
     if(ueCb)
+    {
        ueCb->state = UE_HANDOVER_IN_PROGRESS;
+       ueCb->hoInfo.sourceDuId = sourceDuId;
+       ueCb->hoInfo.targetDuId = targetDuId;
+    }
 
     DU_LOG("\nINFO  --> CU_STUB: Inter-DU Handover Started for ueId [%d] from DU ID [%d] to DU ID [%d]", \
           ueId, sourceDuId, targetDuId);
@@ -262,9 +273,11 @@ void initiateInterDuHandover(uint32_t sourceDuId, uint32_t targetDuId, uint32_t
 void *cuConsoleHandler(void *args)
 {
    char ch;
-   uint8_t teId = 0;
+   uint32_t teId = 0;
+   uint32_t duId;
    uint8_t ret = ROK;
    uint8_t cnt = 0;
+   EgtpTeIdCb *teidCb = NULLP;
 
    /* This variable is taken for sending specific number of downlink data packet. 
     * Presently the code is supporting total 4500 data packets trasfer for 3 UEs only with sleep(1).
@@ -272,7 +285,7 @@ void *cuConsoleHandler(void *args)
     * NUM_TUNNEL_TO_PUMP_DATA = 9, NUM_DL_PACKETS = 1.
     * totalDataPacket = totalNumOfTestFlow * NUM_TUNNEL_TO_PUMP_DATA * NUM_DL_PACKETS 
     * totalDataPacket = [500*9*1] */
-   int32_t totalNumOfTestFlow = 500
+   int32_t totalNumOfTestFlow = 2
 
    while(true) 
    {
@@ -281,11 +294,11 @@ void *cuConsoleHandler(void *args)
       if(ch == 'd')
       {
 
-      /* Change #if 0 to #if 1 to take input from user */
+         /* Change #if 0 to #if 1 to take input from user */
 #if 0
          DU_LOG("\n EGTP --> : Enter TEID id(1..10) where DL Data to be sent\n");
          scanf("%d",&teId);
-         
+
          if(teId > MAX_TEID || teId < MIN_TEID)
          {
             DU_LOG("\nERROR  -->  EGTP : TEID(%x) OUT Of Range",teId);
@@ -307,24 +320,32 @@ void *cuConsoleHandler(void *args)
             cnt++;
          }
 #else
+
          while(totalNumOfTestFlow)
          {
-            for(teId = 1; teId <= NUM_TUNNEL_TO_PUMP_DATA; teId++)
+            for(duId = 1; duId<=MAX_DU_SUPPORTED; duId++)
             {
-               DU_LOG("\nDEBUG  -->  EGTP: Sending DL User Data(teId:%d)\n",teId);
-               cnt =0;
-               while(cnt < NUM_DL_PACKETS)
+               for(teId = 1; teId <= NUM_TUNNEL_TO_PUMP_DATA; teId++)
                {
-                  ret =  cuEgtpDatReq(teId);      
-                  if(ret != ROK)
+                  DU_LOG("\nDEBUG  -->  EGTP: Sending DL User Data(duId %d, teId:%d)\n", duId, teId);
+                  cmHashListFind(&(egtpCb.dstCb[duId-1].teIdLst), (uint8_t *)&(teId), sizeof(uint32_t), 0, (PTR *)&teidCb);
+                  if(teidCb)
                   {
-                     DU_LOG("\nERROR --> EGTP: Issue with teid=%d\n",teId);
-                     break;
+                     cnt =0;
+                     while(cnt < NUM_DL_PACKETS)
+                     {
+                        ret =  cuEgtpDatReq(duId, teId);      
+                        if(ret != ROK)
+                        {
+                           DU_LOG("\nERROR --> EGTP: Issue with teid=%d\n",teId);
+                           break;
+                        }
+                        /* TODO : sleep(1) will be removed later once we will be able to
+                         * support the continuous data pack transfer */
+                        sleep(1);
+                        cnt++;
+                     }
                   }
-                  /* TODO : sleep(1) will be removed later once we will be able to
-                   * support the continuous data pack transfer */
-                  sleep(1);
-                  cnt++;
                }
             }
             totalNumOfTestFlow--;
@@ -347,6 +368,23 @@ void *cuConsoleHandler(void *args)
 
          initiateInterDuHandover(sourceDuId, targetDuId, ueId);
       }
+      /* Start Idle mode paging when 'p' is received from console input */
+      else if(ch == 'p')
+      {
+         uint64_t sTmsi = 0;
+         uint8_t duId = 0;
+
+         DU_LOG("\nEnter DU ID on which this UE to be pagged");
+         scanf("%d", &duId);
+         DU_LOG("\nEnter 5g-S-TMSI");
+         scanf("%lu", &sTmsi);
+
+         if(BuildAndSendPagingMsg(sTmsi, duId) != ROK)
+         {
+            DU_LOG("\nERROR --> EGTP: Failed to build and send paging message for 5gsTmsi[%lu]\n", sTmsi);   
+         }
+         continue;
+      }
    }
 }
 /**********************************************************************