1 /*******************************************************************************
2 ################################################################################
3 # Copyright (c) [2017-2019] [Radisys] #
5 # Licensed under the Apache License, Version 2.0 (the "License"); #
6 # you may not use this file except in compliance with the License. #
7 # You may obtain a copy of the License at #
9 # http://www.apache.org/licenses/LICENSE-2.0 #
11 # Unless required by applicable law or agreed to in writing, software #
12 # distributed under the License is distributed on an "AS IS" BASIS, #
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
14 # See the License for the specific language governing permissions and #
15 # limitations under the License. #
16 ################################################################################
17 *******************************************************************************/
19 /* This file handles slot indication */
21 #include "common_def.h"
22 #include "phy_stub_utils.h"
25 #include "fapi_vendor_extension.h"
29 uint8_t l1SendUlUserData();
30 uint8_t l1SendStatusPdu();
31 uint16_t l1BuildAndSendSlotIndication();
32 uint16_t l1BuildAndSendStopInd();
35 /*******************************************************************
37 * @brief Generates slot indications
41 * Function : GenerateTicks
43 * Functionality: Generates slot indications
46 * @return ROK - success
49 * ****************************************************************/
53 float milisec = 0.5; /* 0.5ms */
55 float milisec = 1; /* 1ms */
57 struct timespec req = {0};
60 slotIndicationStarted = true;
63 /* Currently the code takes longer that one slot indication to execute.
64 * Hence, multiplying slot time interval by 2 in order to give enough time
65 * for L2 to complete one slot processing.
66 * The ratio must be removed once code optimization is complete */
67 req.tv_nsec = milisec * 1000000L * ratio;
69 DU_LOG("\nPHY_STUB : GenerateTicks : Starting to generate slot indications");
71 while(slotIndicationStarted)
73 clock_nanosleep(CLOCK_REALTIME, 0, &req, NULL);
74 /* Send Slot indication indication to lower mac */
75 if(l1BuildAndSendSlotIndication() != ROK)
77 DU_LOG("\nERROR --> PHY_STUB : GenerateTicks(): Failed to build and send Slot Indication");
82 DU_LOG("\nINFO --> PHY_STUB : Slot indication stopped");
84 /* Initialize all global variables */
87 memset(&ueDb, 0, sizeof(UeDb));
89 /* Send Stop indication to MAC */
91 l1BuildAndSendStopInd();
94 /*******************************************************************
96 * @brief Create/cancel thread for generating slot indication
100 * Function : l1HdlSlotIndicaion
102 * Functionality: Create/cancel thread for generating slot indication
105 * @return ROK - success
108 * ****************************************************************/
109 void l1HdlSlotIndicaion(bool stopSlotInd)
112 Buffer *mBuf = NULLP;
116 DU_LOG("\nPHY_STUB: Sending start slot indication event to self");
117 memset(&pst, 0, sizeof(Pst));
118 FILL_PST_PHY_TO_PHY(pst, EVT_PHY_START_SLOT_IND);
119 ODU_GET_MSG_BUF(pst.region, pst.pool, &mBuf);
120 ODU_POST_TASK(&pst, mBuf);
124 slotIndicationStarted = false;
128 /*******************************************************************
130 * @brief Handles Console input
134 * Function : l1ConsoleHandler
136 * Functionality: Handles Console input
139 * @return ROK - success
142 * ****************************************************************/
143 void *l1ConsoleHandler(void *args)
150 /* Send UL user data to DU when user enters 'd' on console */
151 if((ch = getchar()) == 'd')
153 /* Start Pumping data from PHY stub to DU */
154 for(drbIdx = 0; drbIdx < NUM_DRB_TO_PUMP_DATA; drbIdx++) //Number of DRB times the loop will run
156 DU_LOG("\nDEBUG --> PHY STUB: Sending UL User Data[DrbId:%d]",drbIdx);
157 l1SendUlUserData(drbIdx);
160 else if((ch = getchar()) == 'c')
162 /* Send Control PDU from PHY stub to DU */
163 DU_LOG("\nDEBUG --> PHY STUB: Sending Status PDU");
171 /*******************************************************************
173 * @brief Creates thread for handling console input
177 * Function : l1StartConsoleHandler
179 * Functionality: Creates thread for handling console input
182 * @return ROK - success
185 * ****************************************************************/
186 void l1StartConsoleHandler()
192 /* Start thread to receive console input */
193 pthread_attr_init(&attr);
194 pthread_attr_setstacksize(&attr, (size_t)NULLD);
195 pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
196 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
197 retVal = pthread_create(&conThrdId, &attr, l1ConsoleHandler, NULLP);
200 DU_LOG("\nERROR --> PHY STUB : Thread creation failed. Cause %d", retVal);
202 pthread_attr_destroy(&attr);
206 /**********************************************************************
208 **********************************************************************/