1 /******************************************************************************
3 * Copyright (c) 2019 Intel.
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.
17 *******************************************************************************/
21 #include "xran_lib_wrap.hpp"
22 #include "xran_common.h"
23 #include "xran_fh_o_du.h"
26 #include "xran_transport.h"
27 #include "xran_cp_api.h"
33 const std::string module_name = "C-Plane";
35 const uint8_t m_bitmask[] = { 0x00, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
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);
48 /* wrapper functions for performace tests */
49 void xran_ut_tx_cp_dl()
51 xranlib->update_tti();
52 tx_cp_dl_cb(nullptr, xranlib->get_timer_ctx());
55 void xran_ut_tx_cp_ul()
57 xranlib->update_tti();
58 tx_cp_ul_cb(nullptr, xranlib->get_timer_ctx());
61 void xran_ut_tx_up_dl()
63 xranlib->update_symbol_index();
64 xran_process_tx_sym(xranlib->get_timer_ctx());
67 void xran_ut_tx_cpup_dl()
69 xranlib->update_symbol_index();
71 if(xranlib->get_symbol_index() == 3)
72 tx_cp_dl_cb(nullptr, xranlib->get_timer_ctx());
74 xran_process_tx_sym(xranlib->get_timer_ctx());
78 void xran_ut_rx_up_ul()
85 /* call back functions */
86 int send_mbuf_up(struct rte_mbuf *mbuf, uint16_t type, uint16_t vf_id)
88 rte_pktmbuf_free(mbuf);
92 int send_mbuf_cp_perf(struct rte_mbuf *mbuf, uint16_t type, uint16_t vf_id)
94 rte_pktmbuf_free(mbuf);
99 int send_mbuf_cp(struct rte_mbuf *mbuf, uint16_t type)
102 xran_parse_cp_pkt(m_pTestBuffer, &m_result, &m_pktInfo);
104 /* Verify the result */
113 void utcp_fh_rx_callback(void *pCallbackTag, xran_status_t status)
118 void utcp_fh_srs_callback(void *pCallbackTag, xran_status_t status)
123 void utcp_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status)
131 class TestChain: public KernelTests
134 struct xran_fh_config m_xranConf;
135 struct xran_fh_init m_xranInit;
140 void SetUp() override
146 init_test("TestChain");
148 xranlib->get_cfg_fh(&m_xranConf);
150 tmpstr = get_input_parameter<std::string>("category");
152 m_xranConf.ru_conf.xranCat = XRAN_CATEGORY_A;
153 else if(tmpstr == "B")
154 m_xranConf.ru_conf.xranCat = XRAN_CATEGORY_B;
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;
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;
168 tmpstr = get_input_parameter<std::string>("duplex");
170 m_xranConf.frame_conf.nFrameDuplexType = 0;
171 else if(tmpstr == "TDD") {
172 m_xranConf.frame_conf.nFrameDuplexType = 1;
174 tmpstr = get_input_parameter<std::string>("slot_config");
175 temp = xranlib->get_slot_config(tmpstr, &m_xranConf.frame_conf);
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;
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;
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;
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);
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");
207 m_xranConf.ru_conf.iqWidth = get_input_parameter<int>("iq_width");
208 m_xranConf.ru_conf.compMeth = get_input_parameter<int>("comp_meth");
211 temp = get_input_parameter<int>("fft_size");
212 m_xranConf.ru_conf.fftSize = 0;
214 ++m_xranConf.ru_conf.fftSize;
219 void TearDown() override
227 /***************************************************************************
228 * Performance Test cases
229 ***************************************************************************/
230 /* C-Plane DL chain (tx_cp_dl_cb) only */
231 TEST_P(TestChain, CPlaneDLPerf)
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);
237 performance("C", module_name, xran_ut_tx_cp_dl);
243 /* C-Plane UL chain (tx_cp_ul_cb) only */
244 TEST_P(TestChain, CPlaneULPerf)
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);
250 performance("C", module_name, xran_ut_tx_cp_ul);
256 /* U-Plane UL chain (process_tx_sym with disable CP) */
257 TEST_P(TestChain, UPlaneDLPerf)
261 xranlib->Init(&m_xranConf);
263 /* save current CP enable flag */
264 flag_cpen = xranlib->is_cpenable()?true:false;
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);
271 performance("C", module_name, xran_ut_tx_up_dl);
276 /* restore previous CP enable flag */
277 xranlib->apply_cpenable(flag_cpen);
280 /* C-Plane and U-Plane DL chain, U-Plane will be generated by C-Plane config */
281 TEST_P(TestChain, APlaneDLPerf)
285 xranlib->Init(&m_xranConf);
287 /* save current CP enable flag */
288 flag_cpen = xranlib->is_cpenable()?true:false;
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);
295 performance("C", module_name, xran_ut_tx_cpup_dl);
300 /* restore previous CP enable flag */
301 xranlib->apply_cpenable(flag_cpen);
305 TEST_P(TestChain, UPlaneULPerf)
311 INSTANTIATE_TEST_CASE_P(UnitTest, TestChain,
312 testing::ValuesIn(get_sequence(TestChain::get_number_of_cases("TestChain"))));