[Epic-ID: ODUHIGH-405][Task-ID: ODUHIGH-437] Establishing communication between Sourc... 98/8098/11
authorbarveankit <anbarve@radisys.com>
Fri, 22 Apr 2022 10:14:42 +0000 (15:44 +0530)
committerlal.harshita <Harshita.Lal@radisys.com>
Thu, 28 Apr 2022 07:29:30 +0000 (12:59 +0530)
Signed-off-by: barveankit <anbarve@radisys.com>
Change-Id: I6d54ac2db2a03afc4c4d20f8d4383de9b167d197
Signed-off-by: barveankit <anbarve@radisys.com>
Signed-off-by: lal.harshita <Harshita.Lal@radisys.com>
src/5gnrsch/sch_slot_ind.c
src/phy_stub/phy_stub.h
src/phy_stub/phy_stub_msg_hdl.c
src/phy_stub/phy_stub_thread_hdl.c

index b0a5bbd..920562d 100644 (file)
@@ -358,8 +358,10 @@ bool schFillBoGrantDlSchedInfo(SchCellCb *cell, SlotTimingInfo currTime, uint8_t
       memset(dciSlotAlloc, 0, sizeof(DlMsgAlloc));
       dciSlotAlloc->crnti = crnti;
    }
-   dciSlotAlloc = cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId -1];
-
+   else
+   {
+      dciSlotAlloc = cell->schDlSlotInfo[pdcchTime.slot]->dlMsgAlloc[ueId -1];
+   }
    /* Dl ded Msg info is copied, this was earlier filled in macSchDlRlcBoInfo */
    fillDlMsgInfo(&dciSlotAlloc->dlMsgSchedInfo[dciSlotAlloc->numSchedInfo].dlMsgInfo, dciSlotAlloc->crnti);
 
index f40c568..669eb3e 100644 (file)
 *******************************************************************************/
 #include <unistd.h>
 
+/* Changes the IP information 
+* At DU1, SOURCE_DU_IPV4_ADDR = 192.168.130.81 and DESTINATION_DU_IPV4_ADDR = 192.168.130.83 
+* At DU2, SOURCE_DU_IPV4_ADDR = 192.168.130.83 and DESTINATION_DU_IPV4_ADDR = 192.168.130.81 */
+#define SOURCE_DU_IPV4_ADDR      "192.168.130.81"
+#define DESTINATION_DU_IPV4_ADDR "192.168.130.83"
+#define PORT_NUMBER 8080
+#define NUM_THREADS 1
+
 #ifdef NR_TDD
 #define MAX_SLOT_VALUE   19
 #else
@@ -69,7 +77,21 @@ typedef struct ueDb
    UeCb      ueCb[MAX_NUM_UE];
 }UeDb;
 
-UeDb ueDb;
+typedef struct ipCfg
+{
+   uint32_t sourceDu;
+   uint32_t destinationDu;
+   uint16_t portNumber;
+}IpCfg;
+
+typedef struct phyDb
+{
+   bool   isServer;
+   IpCfg  ipCfgInfo;  
+   UeDb    ueDb;
+}PhyDb;
+
+PhyDb phyDb;
 
 typedef enum
 {
@@ -95,7 +117,8 @@ uint8_t l1SendUlUserData(uint8_t drbId, uint8_t ueIdx);
 uint8_t l1SendStatusPdu();
 uint16_t l1BuildAndSendSlotIndication();
 uint16_t l1BuildAndSendStopInd();
-
+int inet_pton(int af, const char *sourc, void *dst);
+void *establishConnectionWithPeerL1(void *args);
 /**********************************************************************
          End of file
 **********************************************************************/
index 94b7392..324ca8e 100644 (file)
@@ -245,7 +245,11 @@ void l1HdlParamReq(uint32_t msgLen, void *msg)
 
 void l1HdlConfigReq(uint32_t msgLen, void *msg)
 {
-   memset(&ueDb, 0, sizeof(UeDb));
+   memset(&phyDb.ueDb, 0, sizeof(UeDb));
+   cmInetAddr((char *)SOURCE_DU_IPV4_ADDR, &phyDb.ipCfgInfo.sourceDu);
+   cmInetAddr((char *)DESTINATION_DU_IPV4_ADDR, &phyDb.ipCfgInfo.destinationDu);
+   phyDb.ipCfgInfo.portNumber = PORT_NUMBER;
+   phyDb.isServer = true;
 
 #ifdef INTEL_FAPI
    p_fapi_api_queue_elem_t configReqElem = (p_fapi_api_queue_elem_t)msg;
@@ -350,37 +354,37 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
    MsgType type = 0;
 
    GET_UE_ID(puschPdu.rnti, ueId);
-   if(!ueDb.ueCb[ueId-1].msg3Sent)
+   if(!phyDb.ueDb.ueCb[ueId-1].msg3Sent)
    {
-      ueDb.ueCb[ueId-1].ueId = ueId;
-      ueDb.ueCb[ueId-1].crnti = puschPdu.rnti;
-      ueDb.ueCb[ueId-1].msg3Sent = true;
+      phyDb.ueDb.ueCb[ueId-1].ueId = ueId;
+      phyDb.ueDb.ueCb[ueId-1].crnti = puschPdu.rnti;
+      phyDb.ueDb.ueCb[ueId-1].msg3Sent = true;
       type = MSG_TYPE_MSG3;
       sleep(2);
    }
-   else if(!ueDb.ueCb[ueId-1].msg5ShortBsrSent)
+   else if(!phyDb.ueDb.ueCb[ueId-1].msg5ShortBsrSent)
    {
-      ueDb.ueCb[ueId-1].msg5ShortBsrSent = true;
+      phyDb.ueDb.ueCb[ueId-1].msg5ShortBsrSent = true;
       type = MSG_TYPE_SHORT_BSR;
    }
-   else if(!ueDb.ueCb[ueId-1].msg5Sent)
+   else if(!phyDb.ueDb.ueCb[ueId-1].msg5Sent)
    {
-      ueDb.ueCb[ueId-1].msg5Sent = true;
+      phyDb.ueDb.ueCb[ueId-1].msg5Sent = true;
       type = MSG_TYPE_MSG5;
    }
-   else if(!ueDb.ueCb[ueId-1].msgRegistrationComp)
+   else if(!phyDb.ueDb.ueCb[ueId-1].msgRegistrationComp)
    {
-      ueDb.ueCb[ueId-1].msgRegistrationComp = true;
+      phyDb.ueDb.ueCb[ueId-1].msgRegistrationComp = true;
       type = MSG_TYPE_REGISTRATION_COMPLETE; 
    }
-   else if(!ueDb.ueCb[ueId-1].msgSecurityModeComp)
+   else if(!phyDb.ueDb.ueCb[ueId-1].msgSecurityModeComp)
    {
-      ueDb.ueCb[ueId-1].msgSecurityModeComp = true;
+      phyDb.ueDb.ueCb[ueId-1].msgSecurityModeComp = true;
       type = MSG_TYPE_SECURITY_MODE_COMPLETE;
    }
-   else if(!ueDb.ueCb[ueId-1].msgRrcReconfiguration)
+   else if(!phyDb.ueDb.ueCb[ueId-1].msgRrcReconfiguration)
    {
-      ueDb.ueCb[ueId-1].msgRrcReconfiguration = true;
+      phyDb.ueDb.ueCb[ueId-1].msgRrcReconfiguration = true;
       type = MSG_TYPE_RRC_RECONFIG_COMPLETE;
    }
    else
@@ -473,7 +477,7 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
          DU_LOG("\nDEBUG  -->  PHY_STUB: Forming MSG5 PDU");
          uint8_t  msg5PduLen = 33; /* Length of MSG5 */
          msg5PduLen += 2; /* RLC subheader */
-         uint8_t msg5[] = {1, msg5PduLen, 128, ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, ueDb.ueCb[ueId-1].pdcpSn++, 16, 0, \
+         uint8_t msg5[] = {1, msg5PduLen, 128, phyDb.ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, phyDb.ueDb.ueCb[ueId-1].pdcpSn++, 16, 0, \
             5, 223, 128, 16, 94, 64, 3, 64, 68, 252, 97, 0, 0, 0, 0, 4, 0, 0, 4, 68, 11, 128, 184, 56, 0, 0, 0, 0, 0};
 
          msg5PduLen += 2;  /* 2 bytes of MAC header */
@@ -497,7 +501,7 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
          DU_LOG("\nDEBUG  -->  PHY_STUB: Forming SECURITY MODE COMPLETE PDU");
          uint8_t  pduLen = 12; /* Length of PDU */
          pduLen += 2; /* RLC subheader */
-         uint8_t msg[] = {1, pduLen, 128, ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, ueDb.ueCb[ueId-1].pdcpSn++, 0x2a, 0x40, \
+         uint8_t msg[] = {1, pduLen, 128, phyDb.ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, phyDb.ueDb.ueCb[ueId-1].pdcpSn++, 0x2a, 0x40, \
             0, 0, 0, 0, 0, 0, 0, 0};
 
          pduLen += 2;  /* 2 bytes of MAC header */
@@ -521,7 +525,7 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
          DU_LOG("\nDEBUG  -->  PHY_STUB: Forming RRC REGISTRATION COMPLETE PDU");
          uint8_t  pduLen = 12; /* Length of PDU */
          pduLen += 2; /* RLC subheader */
-         uint8_t msg[] = {1, pduLen, 128, ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, ueDb.ueCb[ueId-1].pdcpSn++, 0x3a, 0x81, \
+         uint8_t msg[] = {1, pduLen, 128, phyDb.ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, phyDb.ueDb.ueCb[ueId-1].pdcpSn++, 0x3a, 0x81, \
             0xbf, 0, 0x21, 0x80, 0, 0, 0, 0};
 
          pduLen += 2;  /* 2 bytes of MAC header */
@@ -545,7 +549,7 @@ uint16_t l1BuildAndSendRxDataInd(uint16_t slot, uint16_t sfn, fapi_ul_pusch_pdu_
          DU_LOG("\nDEBUG  -->  PHY_STUB: Forming RRC RECONFIGURATION COMPLETE PDU");
          uint8_t  pduLen = 13; /* PDU length */
          pduLen += 2; /* RLC sub header */
-         uint8_t msg[] = {1, pduLen, 128, ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, ueDb.ueCb[ueId-1].pdcpSn++, 8, 64, 0, 0,\
+         uint8_t msg[] = {1, pduLen, 128, phyDb.ueDb.ueCb[ueId-1].rlcSnForSrb1++, 0, phyDb.ueDb.ueCb[ueId-1].pdcpSn++, 8, 64, 0, 0,\
             0, 0, 0, 0, 0, 0, 0};
 
          pduLen += 2;  /* 2bytes of MAC header */
@@ -1066,27 +1070,27 @@ S16 l1HdlUlTtiReq(uint16_t msgLen, void *msg)
    /* TODO: [SFN:SLOT] at which RACH Indication is sent should be calculated
     * based on PRACH cfg index */
    /* Send RACH Ind to L2 for first UE */
-   if(ueDb.ueCb[UE_IDX_0].rachIndSent == false && ulTtiReq->sfn == 16 && ulTtiReq->slot == 6)
+   if(phyDb.ueDb.ueCb[UE_IDX_0].rachIndSent == false && ulTtiReq->sfn == 16 && ulTtiReq->slot == 6)
    {
-      ueDb.ueCb[UE_IDX_0].rachIndSent = true;
+      phyDb.ueDb.ueCb[UE_IDX_0].rachIndSent = true;
       l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn);
-      ueDb.numActvUe++;
+      phyDb.ueDb.numActvUe++;
    }
 #if 0
    /* Send RACH Ind to L2 for second UE */
-   if(ueDb.ueCb[UE_IDX_1].rachIndSent == false && ulTtiReq->sfn == 304 && ulTtiReq->slot == 0)
+   if(phyDb.ueDb.ueCb[UE_IDX_1].rachIndSent == false && ulTtiReq->sfn == 304 && ulTtiReq->slot == 0)
    {
-      ueDb.ueCb[UE_IDX_1].rachIndSent = true;
+      phyDb.ueDb.ueCb[UE_IDX_1].rachIndSent = true;
       l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn);
-      ueDb.numActvUe++;
+      phyDb.ueDb.numActvUe++;
    }
 
    /* Send RACH Ind to L2 for third UE */
-   if(ueDb.ueCb[UE_IDX_2].rachIndSent == false && ulTtiReq->sfn == 526 && ulTtiReq->slot == 0)
+   if(phyDb.ueDb.ueCb[UE_IDX_2].rachIndSent == false && ulTtiReq->sfn == 526 && ulTtiReq->slot == 0)
    {
-      ueDb.ueCb[UE_IDX_2].rachIndSent = true;
+      phyDb.ueDb.ueCb[UE_IDX_2].rachIndSent = true;
       l1BuildAndSendRachInd(ulTtiReq->slot, ulTtiReq->sfn);
-      ueDb.numActvUe++;
+      phyDb.ueDb.numActvUe++;
    }
 #endif
    MAC_FREE(msg, msgLen);
@@ -1172,7 +1176,7 @@ S16 l1HdlStopReq(uint32_t msgLen, void *msg)
       /* Initialize all global variables */
       sfnValue = 0;
       slotValue = 0;
-      memset(&ueDb, 0, sizeof(UeDb));
+      memset(&phyDb.ueDb, 0, sizeof(UeDb));
 
       DU_LOG("\nINFO   -->  PHY_STUB: Slot Indication is stopped successfully");
       MAC_FREE(msg, msgLen);
index a622c76..7699009 100644 (file)
@@ -30,6 +30,7 @@
 extern uint16_t l1BuildAndSendBSR(uint8_t ueIdx, BsrType bsrType,\
              LcgBufferSize lcgBsIdx[MAX_NUM_LOGICAL_CHANNEL_GROUPS]);
 pthread_t thread = 0;
+int socket_fd =0;
 
 /*******************************************************************
  *
@@ -83,7 +84,7 @@ void GenerateTicks()
    /* Initialize all global variables */
    sfnValue = 0;
    slotValue = 0;
-   memset(&ueDb, 0, sizeof(UeDb));
+   memset(&phyDb.ueDb, 0, sizeof(UeDb));
 
    /* Send Stop indication to MAC */
    sleep(1);
@@ -226,8 +227,8 @@ void *l1ConsoleHandler(void *args)
  * ****************************************************************/
 void l1StartConsoleHandler()
 {
-   uint8_t retVal;
-   pthread_t conThrdId;
+   uint8_t retVal, threadIdx;
+   pthread_t conThrdId[NUM_THREADS];
    pthread_attr_t attr;
 
    /* Start thread to receive console input */
@@ -235,15 +236,229 @@ void l1StartConsoleHandler()
    pthread_attr_setstacksize(&attr, (size_t)NULLD);
    pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
-   retVal = pthread_create(&conThrdId, &attr, l1ConsoleHandler, NULLP);
-   if(retVal != 0)
+   for(threadIdx =0 ; threadIdx <NUM_THREADS; threadIdx++)
    {
-      DU_LOG("\nERROR  -->  PHY STUB : Thread creation failed. Cause %d", retVal);
+      if(threadIdx == 0)
+      {
+         retVal = pthread_create(&conThrdId[threadIdx], &attr, l1ConsoleHandler, NULLP);
+      }
+      else
+      {
+         retVal = pthread_create(&conThrdId[threadIdx], &attr, establishConnectionWithPeerL1, NULLP);
+      }
+      
+      if(retVal != 0)
+      {
+         DU_LOG("\nERROR  -->  PHY STUB : Thread creation failed. Cause %d", retVal);
+      }
    }
    pthread_attr_destroy(&attr);
+}
+
+/*******************************************************************
+ *
+ * @brief function reads the recevied information send by peer PHY 
+ *
+ * @details
+ *
+ *    Function : receiveMsgFromPeerL1
+ *
+ *    Functionality: This function reads the recevied information 
+ *    and prints at console
+ *
+ * @params[in] 
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+void receiveMsgFromPeerL1()
+{
+   while(true)
+   {
+      char buffer[1024] = {0};
+      
+      if(read(socket_fd, buffer, 1024)>0)
+      {
+         DU_LOG("\n");
+         DU_LOG("%s\n",buffer);
+         if (strncmp("HANDOVER_IN_PROGRESS", buffer, 19) == 0) 
+         {
+            DU_LOG("\nINFO  --> PHY_STUB : Communication completed in between the source and destination PHY\n");
+            //TODO: Trigger for other handover process in target PHY
+         }
+      }
+   }
+}
+
+/*******************************************************************
+ *
+ * @brief function build the message which need to send to target PHY 
+ *
+ * @details
+ *
+ *    Function : sendMsg
+ *
+ *    Functionality: function build the message which need to send 
+ *
+ * @params[in] 
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+void sendMsg()
+{
+   char *msgToDestinationPhy = "HANDOVER_IN_PROGRESS";
+
+   send(socket_fd, msgToDestinationPhy , strlen(msgToDestinationPhy) , 0 );
+}
+
+/*******************************************************************
+ *
+ * @brief This function handles the server functionalities like 
+ * binding socket, listen and accept
+ *
+ * @details
+ *
+ *    Function : startL1AsServer
+ *
+ *    Functionality: This function handles the server functionalities like
+ *     binding socket, listen and accept
+ *
+ * @params[in] struct sockaddr_in serverPhy, struct sockaddr_in
+ * clientPhy
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+int8_t startL1AsServer(struct sockaddr_in serverPhy, struct sockaddr_in clientPhy)
+{
+   int addrlen= sizeof(struct sockaddr_in);
+
+   if (bind(socket_fd, (struct sockaddr *)&serverPhy, sizeof(struct sockaddr_in))<0)
+   {
+      DU_LOG("\nERROR  --> PHY_STUB : bind failed");
+      return RFAILED;
+   }
+   if (listen(socket_fd, 3) < 0)
+   {
+      DU_LOG("\nERROR  --> PHY_STUB : listen failed");
+      return RFAILED;
+   }
+   while(true)
+   {
+      if ((socket_fd = accept(socket_fd, (struct sockaddr *)&clientPhy,
+                  (socklen_t*)&addrlen))<0)
+      {
+         DU_LOG("\nINFO  --> PHY_STUB : Server is waiting");
+      }
+      else
+      {
+         DU_LOG("\nINFO  --> PHY_STUB : Server Connected");
+         break;
+      }
+   }
+   return ROK;
+}
+
+/*******************************************************************
+ *
+ * @brief this function includes all the functionalities of client side
+ * like binding the client side socket and connecting to the server
+ *
+ * @details
+ *
+ *    Function : startL1AsClient
+ *
+ *    Functionality: this function includes all the functionalities of client
+ *    side like binding the client side socket and connecting to the server
+ *
+ * @params[in] 
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+int8_t startL1AsClient(struct sockaddr_in serverPhy, struct sockaddr_in  destinationPhy)
+{
+   if (bind(socket_fd, (struct sockaddr *)&serverPhy, sizeof(struct sockaddr_in ))<0)
+   {
+      DU_LOG("\nERROR  --> PHY_STUB : bind failed");
+      return RFAILED;
+   }
+
+   while(true)
+   {
+      if (connect(socket_fd, (struct sockaddr *)&destinationPhy, sizeof(struct sockaddr_in)) < 0)
+      {
+         DU_LOG("\nERROR  --> PHY_STUB : Connection Failed");
+      }
+      else
+      {
+         DU_LOG("\nINFO  --> PHY_STUB : Client connected to sever");
+         break;
+      }
+   }
+   return ROK;
 
 }
 
+/*******************************************************************
+ *
+ * @brief this function creates the socket for commincation between source and 
+ * target phy
+ *
+ * @details
+ *
+ *    Function : establishConnectionWithPeerL1
+ *
+ *    Functionality: creates the socket for commincation between source and
+ *    target PHY, allocated the ip addresses and sends the request for connection
+ *    establisshement and sends the information to each other
+ *
+ * @params[in] 
+ * @return ROK     - success
+ *         RFAILED - failure
+ *
+ * ****************************************************************/
+void *establishConnectionWithPeerL1(void *args)
+{
+   void *ret = NULLP;
+   struct sockaddr_in sourcePhy, destinationPhy;
+
+   if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
+   {
+      DU_LOG("\nERROR  --> PHY_STUB : socket failed");
+      return ret; 
+   }
+   
+   sourcePhy.sin_family = AF_INET;
+   sourcePhy.sin_port = htons(phyDb.ipCfgInfo.portNumber);
+   sourcePhy.sin_addr.s_addr = phyDb.ipCfgInfo.sourceDu;
+   
+   destinationPhy.sin_family = AF_INET;
+   destinationPhy.sin_port = htons(phyDb.ipCfgInfo.portNumber);
+   destinationPhy.sin_addr.s_addr = phyDb.ipCfgInfo.destinationDu;
+   
+   if(phyDb.isServer)
+   {
+      if(startL1AsServer(sourcePhy, destinationPhy) != ROK)
+      {
+         DU_LOG("\nERROR  --> PHY_STUB : Failed to start server");
+         return ret;
+      }
+   }
+   else
+   {
+      if(startL1AsClient(sourcePhy, destinationPhy) != ROK)
+      {
+         DU_LOG("\nERROR  --> PHY_STUB : Failed to start client");
+         return ret;
+      }
+   }
+
+   DU_LOG("\nINFO  --> PHY_STUB : Connection established");
+   receiveMsgFromPeerL1();
+   return ROK;
+}
 /**********************************************************************
          End of file
 **********************************************************************/