Front Haul Interface Library update to third seed code contribution
[o-du/phy.git] / fhi_lib / test / test_xran / init_sys_functional.cc
1 /******************************************************************************
2 *
3 *   Copyright (c) 2019 Intel.
4 *
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
8 *
9 *       http://www.apache.org/licenses/LICENSE-2.0
10 *
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 *******************************************************************************/
18
19
20 #include "common.hpp"
21 #include "xran_fh_o_du.h"
22 #include "xran_cp_api.h"
23 #include "xran_lib_wrap.hpp"
24 #include "xran_common.h"
25 #include "ethdi.h"
26
27 #include <stdint.h>
28 #include <iostream>
29 #include <vector>
30 #include <string>
31
32
33
34 using namespace std;
35 const std::string module_name = "init_sys_functional";
36
37 extern enum xran_if_state xran_if_current_state;
38
39 void physide_sym_call_back(void * param)
40 {
41     rte_pause();
42     return;
43 }
44
45 int physide_dl_tti_call_back(void * param)
46 {
47     rte_pause();
48     return 0;
49 }
50
51 int physide_ul_half_slot_call_back(void * param)
52 {
53     rte_pause();
54     return 0;
55 }
56
57 int physide_ul_full_slot_call_back(void * param)
58 {
59     rte_pause();
60     return 0;
61 }
62
63 void xran_fh_rx_callback(void *pCallbackTag, xran_status_t status)
64 {
65     rte_pause();
66     return;
67 }
68
69 void xran_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status)
70 {
71
72     rte_pause();
73 }
74
75 class Init_Sys_Check : public KernelTests
76 {
77 protected:
78
79     void SetUp() override
80     {
81         xranlib->Init();
82         xranlib->Open(nullptr, nullptr, (void *)xran_fh_rx_callback, (void *)xran_fh_rx_prach_callback);
83     }
84
85     /* It's called after an execution of the each test case.*/
86     void TearDown() override
87     {
88         xranlib->Close();
89         xranlib->Cleanup();
90     }
91
92 public:
93
94     BbuIoBufCtrlStruct sFrontHaulTxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
95     BbuIoBufCtrlStruct sFrontHaulTxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
96     BbuIoBufCtrlStruct sFrontHaulRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
97     BbuIoBufCtrlStruct sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
98     BbuIoBufCtrlStruct sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
99
100     /* buffers lists */
101     struct xran_flat_buffer sFrontHaulTxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
102     struct xran_flat_buffer sFrontHaulTxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
103     struct xran_flat_buffer sFrontHaulRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
104     struct xran_flat_buffer sFrontHaulRxPrbMapBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
105     struct xran_flat_buffer sFHPrachRxBuffers[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_NUM_OF_SYMBOL_PER_SLOT];
106
107     void*    nInstanceHandle[XRAN_PORTS_NUM][XRAN_MAX_SECTOR_NR]; // instance per sector
108     uint32_t nBufPoolIndex[XRAN_MAX_SECTOR_NR][xranLibWraper::MAX_SW_XRAN_INTERFACE_NUM];
109     uint16_t nInstanceNum;
110 };
111
112 TEST_P(Init_Sys_Check, Test_Open_Close)
113 {
114     struct xran_device_ctx * p_xran_dev_ctx = xran_dev_get_ctx();
115     /* check stat of lib */
116     ASSERT_EQ(1, p_xran_dev_ctx->enableCP);
117     ASSERT_EQ(1, p_xran_dev_ctx->xran2phy_mem_ready);
118 }
119
120 TEST_P(Init_Sys_Check, Test_xran_mm_init)
121 {
122     int16_t ret = 0;
123     ret = xran_mm_init (xranlib->get_xranhandle(), (uint64_t) SW_FPGA_FH_TOTAL_BUFFER_LEN, SW_FPGA_SEGMENT_BUFFER_LEN);
124     ASSERT_EQ(0, ret);
125 }
126
127 /* this case cannot be tested since memory cannot be initialized twice */
128 /* memory initialization is moved to the wrapper class */
129 #if 0
130 TEST_P(Init_Sys_Check, Test_xran_bm_init_alloc_free)
131 {
132     int16_t ret = 0;
133     void *ptr;
134     void *mb;
135     uint32_t nSW_ToFpga_FTH_TxBufferLen   = 13168; /* 273*12*4 + 64*/
136     int16_t k = 0;
137
138
139     struct xran_buffer_list *pFthTxBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];
140     struct xran_buffer_list *pFthTxPrbMapBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];
141     struct xran_buffer_list *pFthRxBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];
142     struct xran_buffer_list *pFthRxPrbMapBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];
143     struct xran_buffer_list *pFthRxRachBuffer[XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR][XRAN_N_FE_BUF_LEN];
144
145     Init_Sys_Check::nInstanceNum = xranlib->get_num_cc();
146
147     for (k = 0; k < XRAN_PORTS_NUM; k++) {
148         ret = xran_sector_get_instances (xranlib->get_xranhandle(), Init_Sys_Check::nInstanceNum, &(Init_Sys_Check::nInstanceHandle[k][0]));
149         ASSERT_EQ(0, ret);
150         ASSERT_EQ(1, Init_Sys_Check::nInstanceNum);
151     }
152
153
154     ret = xran_bm_init(Init_Sys_Check::nInstanceHandle[0][0],
155                     &Init_Sys_Check::nBufPoolIndex[0][0],
156                     XRAN_N_FE_BUF_LEN*XRAN_MAX_ANTENNA_NR*XRAN_NUM_OF_SYMBOL_PER_SLOT, nSW_ToFpga_FTH_TxBufferLen);
157     ASSERT_EQ(0, ret);
158
159     ret = xran_bm_allocate_buffer(Init_Sys_Check::nInstanceHandle[0][0], Init_Sys_Check::nBufPoolIndex[0][0],&ptr, &mb);
160     ASSERT_EQ(0, ret);
161     ASSERT_NE(ptr, nullptr);
162     ASSERT_NE(mb, nullptr);
163
164     ret = xran_bm_free_buffer(Init_Sys_Check::nInstanceHandle[0][0], ptr, mb);
165     ASSERT_EQ(0, ret);
166
167
168
169     for(int i=0; i< xranlib->get_num_cc(); i++)
170     {
171         for(int j=0; j<XRAN_N_FE_BUF_LEN; j++)
172         {
173             for(int z = 0; z < XRAN_MAX_ANTENNA_NR; z++){
174                 pFthTxBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulTxBbuIoBufCtrl[j][i][z].sBufferList);
175                 pFthTxPrbMapBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulTxPrbMapBbuIoBufCtrl[j][i][z].sBufferList);
176                 pFthRxBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulRxBbuIoBufCtrl[j][i][z].sBufferList);
177                 pFthRxPrbMapBuffer[i][z][j]     = &(Init_Sys_Check::sFrontHaulRxPrbMapBbuIoBufCtrl[j][i][z].sBufferList);
178                 pFthRxRachBuffer[i][z][j] = &(Init_Sys_Check::sFHPrachRxBbuIoBufCtrl[j][i][z].sBufferList);
179             }
180         }
181     }
182
183     if(NULL != Init_Sys_Check::nInstanceHandle[0])
184     {
185         for (int i = 0; i < xranlib->get_num_cc(); i++)
186         {
187             ret = xran_5g_fronthault_config (Init_Sys_Check::nInstanceHandle[0][i],
188                 pFthTxBuffer[i],
189                 pFthTxPrbMapBuffer[i],
190                 pFthRxBuffer[i],
191                 pFthRxPrbMapBuffer[i],
192                 xran_fh_rx_callback,  &pFthRxBuffer[i][0]);
193
194             ASSERT_EQ(0, ret);
195         }
196
197         // add prach callback here
198         for (int i = 0; i < xranlib->get_num_cc(); i++)
199         {
200             ret = xran_5g_prach_req(Init_Sys_Check::nInstanceHandle[0][i], pFthRxRachBuffer[i],
201                 xran_fh_rx_prach_callback,&pFthRxRachBuffer[i][0]);
202             ASSERT_EQ(0, ret);
203         }
204     }
205
206
207 }
208 #endif
209
210 TEST_P(Init_Sys_Check, Test_xran_get_common_counters)
211 {
212     int16_t ret = 0;
213     struct xran_common_counters x_counters;
214
215     ret = xran_get_common_counters(xranlib->get_xranhandle(), &x_counters);
216
217     ASSERT_EQ(0, ret);
218     ASSERT_EQ(0, x_counters.Rx_on_time);
219     ASSERT_EQ(0, x_counters.Rx_early);
220     ASSERT_EQ(0, x_counters.Rx_late);
221     ASSERT_EQ(0, x_counters.Rx_corrupt);
222     ASSERT_EQ(0, x_counters.Rx_pkt_dupl);
223     ASSERT_EQ(0, x_counters.Total_msgs_rcvd);
224 }
225
226 TEST_P(Init_Sys_Check, Test_xran_get_slot_idx)
227 {
228 #define NUM_OF_SUBFRAME_PER_FRAME 10
229     int32_t nNrOfSlotInSf = 1;
230     int32_t nSfIdx = -1;
231     uint32_t nFrameIdx;
232     uint32_t nSubframeIdx;
233     uint32_t nSlotIdx;
234     uint64_t nSecond;
235
236     uint32_t nXranTime  = xran_get_slot_idx(&nFrameIdx, &nSubframeIdx, &nSlotIdx, &nSecond);
237     nSfIdx = nFrameIdx*NUM_OF_SUBFRAME_PER_FRAME*nNrOfSlotInSf
238         + nSubframeIdx*nNrOfSlotInSf
239         + nSlotIdx;
240
241     ASSERT_EQ(0, nSfIdx);
242 }
243
244 TEST_P(Init_Sys_Check, Test_xran_reg_physide_cb)
245 {
246     struct xran_device_ctx * p_xran_dev_ctx = xran_dev_get_ctx();
247     int16_t ret = 0;
248     ret = xran_reg_physide_cb(xranlib->get_xranhandle(), physide_dl_tti_call_back, NULL, 10, XRAN_CB_TTI);
249     ASSERT_EQ(0,ret);
250     ASSERT_EQ(physide_dl_tti_call_back, p_xran_dev_ctx->ttiCb[XRAN_CB_TTI]);
251     ASSERT_EQ(NULL, p_xran_dev_ctx->TtiCbParam[XRAN_CB_TTI]);
252     ASSERT_EQ(10, p_xran_dev_ctx->SkipTti[XRAN_CB_TTI]);
253
254     ret = xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_half_slot_call_back, NULL, 10, XRAN_CB_HALF_SLOT_RX);
255     ASSERT_EQ(0,ret);
256     ASSERT_EQ(physide_ul_half_slot_call_back, p_xran_dev_ctx->ttiCb[XRAN_CB_HALF_SLOT_RX]);
257     ASSERT_EQ(NULL, p_xran_dev_ctx->TtiCbParam[XRAN_CB_HALF_SLOT_RX]);
258     ASSERT_EQ(10, p_xran_dev_ctx->SkipTti[XRAN_CB_HALF_SLOT_RX]);
259
260     ret = xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_full_slot_call_back, NULL, 10, XRAN_CB_FULL_SLOT_RX);
261     ASSERT_EQ(0,ret);
262     ASSERT_EQ(physide_ul_full_slot_call_back, p_xran_dev_ctx->ttiCb[XRAN_CB_FULL_SLOT_RX]);
263     ASSERT_EQ(NULL, p_xran_dev_ctx->TtiCbParam[XRAN_CB_FULL_SLOT_RX]);
264     ASSERT_EQ(10, p_xran_dev_ctx->SkipTti[XRAN_CB_FULL_SLOT_RX]);
265
266 }
267
268 TEST_P(Init_Sys_Check, Test_xran_reg_sym_cb){
269     int16_t ret = 0;
270     ret = xran_reg_sym_cb(xranlib->get_xranhandle(),  physide_sym_call_back, NULL, 11, 0);
271     ASSERT_EQ(-1,ret);
272 }
273
274 TEST_P(Init_Sys_Check, Test_xran_mm_destroy){
275     int16_t ret = 0;
276     ret = xran_mm_destroy(xranlib->get_xranhandle());
277     ASSERT_EQ(-1,ret);
278 }
279
280 TEST_P(Init_Sys_Check, Test_xran_start_stop){
281     int16_t ret = 0;
282     ASSERT_EQ(XRAN_STOPPED, xran_if_current_state);
283     ret = xranlib->Start();
284     ASSERT_EQ(0,ret);
285     ASSERT_EQ(XRAN_RUNNING, xran_if_current_state);
286     ret = xranlib->Stop();
287     ASSERT_EQ(0,ret);
288     ASSERT_EQ(XRAN_STOPPED, xran_if_current_state);
289 }
290
291 INSTANTIATE_TEST_CASE_P(UnitTest, Init_Sys_Check,
292                         testing::ValuesIn(get_sequence(Init_Sys_Check::get_number_of_cases("init_sys_functional"))));
293
294
295