[Task-ID: ODUHIGH-459] EGTP DL issue during UE deletion
[o-du/l2.git] / src / cu_stub / cu_stub.c
index 31515a4..2be3a45 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 */
 
@@ -266,17 +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;
-
-   /* 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).
-    * If you wants to pump data for 3 UE change the following macro values
-    * 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; 
+   EgtpTeIdCb *teidCb = NULLP;
 
    while(true) 
    {
@@ -285,11 +286,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);
@@ -311,24 +312,45 @@ void *cuConsoleHandler(void *args)
             cnt++;
          }
 #else
+
+         /* 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).
+          * If you wants to pump data for 3 UE change the following macro values
+          * 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 = 2; 
+
          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)
+                  teidCb = NULLP;
+                  cmHashListFind(&(egtpCb.dstCb[duId-1].teIdLst), (uint8_t *)&(teId), sizeof(uint32_t), 0, (PTR *)&teidCb);
+                  if(teidCb)
+                  {
+                     cnt =0;
+                     DU_LOG("\nDEBUG  -->  EGTP: Sending DL User Data(duId %d, teId:%d)\n", duId, teId);
+                     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++;
+                     }
+                  }
+                  else
                   {
-                     DU_LOG("\nERROR --> EGTP: Issue with teid=%d\n",teId);
-                     break;
+                     DU_LOG("\nDEBUG  -->  EGTP: TunnelId Not Found for (duId %d, teId:%d)\n", duId, teId);
                   }
-                  /* TODO : sleep(1) will be removed later once we will be able to
-                   * support the continuous data pack transfer */
-                  sleep(1);
-                  cnt++;
                }
             }
             totalNumOfTestFlow--;
@@ -351,6 +373,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;
+      }
    }
 }
 /**********************************************************************