Update to odulow per maintenance bronze
[o-du/phy.git] / fhi_lib / test / test_xran / chain_tests.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_lib_wrap.hpp"
22 #include "xran_common.h"
23 #include "xran_fh_o_du.h"
24 #include "ethdi.h"
25 #include "ethernet.h"
26 #include "xran_transport.h"
27 #include "xran_cp_api.h"
28
29 #include <stdint.h>
30
31
32
33 const std::string module_name = "C-Plane";
34
35 const uint8_t m_bitmask[] = { 0x00, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
36
37
38 extern "C"
39 {
40
41 /* external functions in xRAN library */
42 void tx_cp_dl_cb(struct rte_timer *tim, void *arg);
43 void tx_cp_ul_cb(struct rte_timer *tim, void *arg);
44 int xran_process_tx_sym(void *arg);
45 int process_mbuf(struct rte_mbuf *pkt);
46
47
48 /* wrapper functions for performace tests */
49 void xran_ut_tx_cp_dl()
50 {
51     xranlib->update_tti();
52     tx_cp_dl_cb(nullptr, xranlib->get_timer_ctx());
53 }
54
55 void xran_ut_tx_cp_ul()
56 {
57     xranlib->update_tti();
58     tx_cp_ul_cb(nullptr, xranlib->get_timer_ctx());
59 }
60
61 void xran_ut_tx_up_dl()
62 {
63     xranlib->update_symbol_index();
64     xran_process_tx_sym(xranlib->get_timer_ctx());
65 }
66
67 void xran_ut_tx_cpup_dl()
68 {
69     xranlib->update_symbol_index();
70
71     if(xranlib->get_symbol_index() == 3)
72         tx_cp_dl_cb(nullptr, xranlib->get_timer_ctx());
73
74     xran_process_tx_sym(xranlib->get_timer_ctx());
75 }
76
77 #if 0   /* TBD */
78 void xran_ut_rx_up_ul()
79 {
80     process_mbf(mbuf);
81 }
82 #endif
83
84
85 /* call back functions */
86 int send_mbuf_up(struct rte_mbuf *mbuf, uint16_t type, uint16_t vf_id)
87 {
88     rte_pktmbuf_free(mbuf);
89     return (1);
90 }
91
92 int send_mbuf_cp_perf(struct rte_mbuf *mbuf, uint16_t type, uint16_t vf_id)
93 {
94     rte_pktmbuf_free(mbuf);
95     return (1);
96 }
97
98 #if 0   /* TBD */
99 int send_mbuf_cp(struct rte_mbuf *mbuf, uint16_t type)
100 {
101 #if 0
102     xran_parse_cp_pkt(m_pTestBuffer, &m_result, &m_pktInfo);
103
104     /* Verify the result */
105     verify_sections();
106 #else
107     printf("cp\n");
108 #endif
109     return (1);
110 }
111 #endif
112
113 void utcp_fh_rx_callback(void *pCallbackTag, xran_status_t status)
114 {
115     return;
116 }
117
118 void utcp_fh_srs_callback(void *pCallbackTag, xran_status_t status)
119 {
120     return;
121 }
122
123 void utcp_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status)
124 {
125     rte_pause();
126 }
127
128 } /* extern "C" */
129
130
131 class TestChain: public KernelTests
132 {
133 protected:
134     struct xran_fh_config   m_xranConf;
135     struct xran_fh_init     m_xranInit;
136
137     bool m_bSub6;
138
139
140     void SetUp() override
141     {
142         int temp;
143         std::string tmpstr;
144
145
146         init_test("TestChain");
147
148         xranlib->get_cfg_fh(&m_xranConf);
149
150         tmpstr = get_input_parameter<std::string>("category");
151         if(tmpstr == "A")
152             m_xranConf.ru_conf.xranCat = XRAN_CATEGORY_A;
153         else if(tmpstr == "B")
154             m_xranConf.ru_conf.xranCat = XRAN_CATEGORY_B;
155         else {
156             std::cout << "*** Invalid RU Category [" << tmpstr << "] !!!" << std::endl;
157             std::cout << "Set it to Category A... " << std::endl;
158             m_xranConf.ru_conf.xranCat = XRAN_CATEGORY_A;
159             }
160
161         m_xranConf.frame_conf.nNumerology = get_input_parameter<int>("mu");
162         if(m_xranConf.frame_conf.nNumerology > 3) {
163             std::cout << "*** Invalid Numerology [" << m_xranConf.frame_conf.nNumerology << "] !!!" << std::endl;
164             m_xranConf.frame_conf.nNumerology   = 0;
165             std::cout << "Set it to " << m_xranConf.frame_conf.nNumerology << "..." << std::endl;
166             }
167
168         tmpstr = get_input_parameter<std::string>("duplex");
169         if(tmpstr == "FDD")
170             m_xranConf.frame_conf.nFrameDuplexType  = 0;
171         else if(tmpstr == "TDD") {
172             m_xranConf.frame_conf.nFrameDuplexType  = 1;
173
174             tmpstr = get_input_parameter<std::string>("slot_config");
175             temp = xranlib->get_slot_config(tmpstr, &m_xranConf.frame_conf);
176             }
177         else {
178             std::cout << "*** Invalid Duplex type [" << tmpstr << "] !!!" << std::endl;
179             std::cout << "Set it to FDD... " << std::endl;
180             m_xranConf.frame_conf.nFrameDuplexType  = 0;
181             }
182
183         m_xranConf.nCC = get_input_parameter<int>("num_cc");
184         if(m_xranConf.nCC > XRAN_MAX_SECTOR_NR) {
185             std::cout << "*** Exceeds maximum number of carriers supported [" << m_xranConf.nCC << "] !!!" << std::endl;
186             m_xranConf.nCC = XRAN_MAX_SECTOR_NR;
187             std::cout << "Set it to " << m_xranConf.nCC << "..." << std::endl;
188             }
189         m_xranConf.neAxc = get_input_parameter<int>("num_eaxc");
190         if(m_xranConf.neAxc > XRAN_MAX_ANTENNA_NR) {
191             std::cout << "*** Exceeds maximum number of antenna supported [" << m_xranConf.neAxc << "] !!!" << std::endl;
192             m_xranConf.neAxc = XRAN_MAX_ANTENNA_NR;
193             std::cout << "Set it to " << m_xranConf.neAxc << "..." << std::endl;
194             }
195
196         m_bSub6     = get_input_parameter<bool>("sub6");
197         temp = get_input_parameter<int>("chbw_dl");
198         m_xranConf.nDLRBs = xranlib->get_num_rbs(m_xranConf.frame_conf.nNumerology, temp, m_bSub6);
199         temp = get_input_parameter<int>("chbw_ul");
200         m_xranConf.nULRBs = xranlib->get_num_rbs(m_xranConf.frame_conf.nNumerology, temp, m_bSub6);
201
202         m_xranConf.nAntElmTRx = get_input_parameter<int>("antelm_trx");
203         m_xranConf.nDLFftSize = get_input_parameter<int>("fftsize_dl");
204         m_xranConf.nULFftSize = get_input_parameter<int>("fftsize_ul");
205
206
207         m_xranConf.ru_conf.iqWidth  = get_input_parameter<int>("iq_width");
208         m_xranConf.ru_conf.compMeth = get_input_parameter<int>("comp_meth");
209
210 #if 0
211         temp = get_input_parameter<int>("fft_size");
212         m_xranConf.ru_conf.fftSize  = 0;
213         while (temp >>= 1)
214             ++m_xranConf.ru_conf.fftSize;
215 #endif
216
217     }
218
219     void TearDown() override
220     {
221     }
222 };
223
224
225
226
227 /***************************************************************************
228  * Performance Test cases
229  ***************************************************************************/
230 /* C-Plane DL chain (tx_cp_dl_cb) only */
231 TEST_P(TestChain, CPlaneDLPerf)
232 {
233     xranlib->Init(&m_xranConf);
234     xranlib->Open(send_mbuf_cp_perf, send_mbuf_up,
235             (void *)utcp_fh_rx_callback, (void *)utcp_fh_rx_prach_callback, (void *)utcp_fh_srs_callback);
236
237     performance("C", module_name, xran_ut_tx_cp_dl);
238
239     xranlib->Close();
240     xranlib->Cleanup();
241 }
242
243 /* C-Plane UL chain (tx_cp_ul_cb) only */
244 TEST_P(TestChain, CPlaneULPerf)
245 {
246     xranlib->Init(&m_xranConf);
247     xranlib->Open(send_mbuf_cp_perf, send_mbuf_up,
248             (void *)utcp_fh_rx_callback, (void *)utcp_fh_rx_prach_callback, (void *)utcp_fh_srs_callback);
249
250     performance("C", module_name, xran_ut_tx_cp_ul);
251
252     xranlib->Close();
253     xranlib->Cleanup();
254 }
255
256 /* U-Plane UL chain (process_tx_sym with disable CP) */
257 TEST_P(TestChain, UPlaneDLPerf)
258 {
259     bool flag_cpen;
260
261     xranlib->Init(&m_xranConf);
262
263     /* save current CP enable flag */
264     flag_cpen = xranlib->is_cpenable()?true:false;
265
266     /* need to disable CP to make U-Plane work without CP */
267     xranlib->apply_cpenable(false);
268     xranlib->Open(send_mbuf_cp_perf, send_mbuf_up,
269             (void *)utcp_fh_rx_callback, (void *)utcp_fh_rx_prach_callback, (void *)utcp_fh_srs_callback);
270
271     performance("C", module_name, xran_ut_tx_up_dl);
272
273     xranlib->Close();
274     xranlib->Cleanup();
275
276     /* restore previous CP enable flag */
277     xranlib->apply_cpenable(flag_cpen);
278 }
279
280 /* C-Plane and U-Plane DL chain, U-Plane will be generated by C-Plane config */
281 TEST_P(TestChain, APlaneDLPerf)
282 {
283     bool flag_cpen;
284
285     xranlib->Init(&m_xranConf);
286
287     /* save current CP enable flag */
288     flag_cpen = xranlib->is_cpenable()?true:false;
289
290     /* Enable CP by force to make UP work by CP's section information */
291     xranlib->apply_cpenable(true);
292     xranlib->Open(send_mbuf_cp_perf, send_mbuf_up,
293             (void *)utcp_fh_rx_callback, (void *)utcp_fh_rx_prach_callback, (void *)utcp_fh_srs_callback);
294
295     performance("C", module_name, xran_ut_tx_cpup_dl);
296
297     xranlib->Close();
298     xranlib->Cleanup();
299
300     /* restore previous CP enable flag */
301     xranlib->apply_cpenable(flag_cpen);
302 }
303
304 #if 0       /* TBD */
305 TEST_P(TestChain, UPlaneULPerf)
306 {
307 }
308 #endif
309
310
311 INSTANTIATE_TEST_CASE_P(UnitTest, TestChain,
312         testing::ValuesIn(get_sequence(TestChain::get_number_of_cases("TestChain"))));
313