From: barveankit Date: Fri, 22 Apr 2022 10:14:42 +0000 (+0530) Subject: [Epic-ID: ODUHIGH-405][Task-ID: ODUHIGH-437] Establishing communication between Sourc... X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=d6a9e599366473a5cff5782859e4fd0dc94c62e6;hp=bd2905b5f651349abafb7934a952414d7c24e291;p=o-du%2Fl2.git [Epic-ID: ODUHIGH-405][Task-ID: ODUHIGH-437] Establishing communication between Source and Target PHY Signed-off-by: barveankit Change-Id: I6d54ac2db2a03afc4c4d20f8d4383de9b167d197 Signed-off-by: barveankit Signed-off-by: lal.harshita --- diff --git a/src/5gnrsch/sch_slot_ind.c b/src/5gnrsch/sch_slot_ind.c index b0a5bbd73..920562d63 100644 --- a/src/5gnrsch/sch_slot_ind.c +++ b/src/5gnrsch/sch_slot_ind.c @@ -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); diff --git a/src/phy_stub/phy_stub.h b/src/phy_stub/phy_stub.h index f40c56839..669eb3eac 100644 --- a/src/phy_stub/phy_stub.h +++ b/src/phy_stub/phy_stub.h @@ -17,6 +17,14 @@ *******************************************************************************/ #include +/* 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 **********************************************************************/ diff --git a/src/phy_stub/phy_stub_msg_hdl.c b/src/phy_stub/phy_stub_msg_hdl.c index 94b73920f..324ca8e1e 100644 --- a/src/phy_stub/phy_stub_msg_hdl.c +++ b/src/phy_stub/phy_stub_msg_hdl.c @@ -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); diff --git a/src/phy_stub/phy_stub_thread_hdl.c b/src/phy_stub/phy_stub_thread_hdl.c index a622c76d6..7699009c6 100644 --- a/src/phy_stub/phy_stub_thread_hdl.c +++ b/src/phy_stub/phy_stub_thread_hdl.c @@ -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 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 **********************************************************************/