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);
*******************************************************************************/
#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
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
{
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
**********************************************************************/
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;
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
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 */
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 */
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 */
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 */
/* 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);
/* 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);
extern uint16_t l1BuildAndSendBSR(uint8_t ueIdx, BsrType bsrType,\
LcgBufferSize lcgBsIdx[MAX_NUM_LOGICAL_CHANNEL_GROUPS]);
pthread_t thread = 0;
+int socket_fd =0;
/*******************************************************************
*
/* 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);
* ****************************************************************/
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 */
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
**********************************************************************/