5355b68baf0a955157dde81e36f5207b7aea0255
[o-du/phy.git] / fhi_lib / test / test_xran / prach_performance.cc
1 /******************************************************************************\r
2 *\r
3 *   Copyright (c) 2019 Intel.\r
4 *\r
5 *   Licensed under the Apache License, Version 2.0 (the "License");\r
6 *   you may not use this file except in compliance with the License.\r
7 *   You may obtain a copy of the License at\r
8 *\r
9 *       http://www.apache.org/licenses/LICENSE-2.0\r
10 *\r
11 *   Unless required by applicable law or agreed to in writing, software\r
12 *   distributed under the License is distributed on an "AS IS" BASIS,\r
13 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 *   See the License for the specific language governing permissions and\r
15 *   limitations under the License.\r
16 *\r
17 *******************************************************************************/\r
18 \r
19 \r
20 #include "common.hpp"\r
21 #include "xran_common.h"\r
22 #include "xran_fh_o_du.h"\r
23 #include "ethernet.h"\r
24 #include "xran_transport.h"\r
25 #include "xran_cp_api.h"\r
26 \r
27 #include <stdint.h>\r
28 \r
29 \r
30 const std::string module_name = "Prach_test";\r
31 \r
32 \r
33 class PrachPerf : public KernelTests\r
34 {\r
35 \r
36         private:\r
37     struct xran_section_gen_info *m_pSectResult = NULL;\r
38 \r
39         protected:\r
40                 struct xran_fh_config m_xranConf;\r
41                 struct xran_device_ctx m_xran_dev_ctx;\r
42                 struct xran_prach_config *m_pPRACHConfig;\r
43                 struct xran_prach_cp_config  *m_pPrachCPConfig;\r
44 \r
45     struct xran_section_gen_info *m_pSectGenInfo = NULL;\r
46     int m_maxSections = 8;  /*  not used */\r
47     int lastsymbol;\r
48 \r
49     struct rte_mbuf *m_pTestBuffer;\r
50 \r
51     struct xran_cp_gen_params m_params;\r
52     struct xran_recv_packet_info m_pktInfo;\r
53     struct xran_cp_gen_params m_result;\r
54 \r
55     uint8_t     m_dir;\r
56     std::string m_dirStr;\r
57     uint8_t     m_sectionType;\r
58 \r
59     uint8_t     m_ccId, m_antId;\r
60     uint8_t     m_seqId;\r
61     uint8_t     m_frameId, m_subframeId, m_slotId;\r
62     uint8_t     m_symStart, m_symNum;\r
63     uint16_t    *m_prbStart = NULL, *m_prbNum = NULL;\r
64 \r
65     uint8_t     m_iqWidth, m_compMethod;\r
66     uint16_t    m_beamId;\r
67     uint16_t    m_reMask = 0xfff;\r
68     uint16_t    m_sectionId;\r
69     uint8_t     m_filterIndex;\r
70     //uint16_t    m_timeOffset;\r
71     uint8_t     m_fftSize;\r
72 \r
73                 //define reference values\r
74         uint8_t     m_startSymId;\r
75         uint8_t     m_x;\r
76                 uint8_t         m_filterIdx;\r
77                 uint16_t        m_startPrbc;\r
78                 uint8_t         m_numPrbc;\r
79                 uint8_t         m_numSymbol;\r
80                 uint16_t        m_timeOffset;\r
81                 int32_t         m_freqOffset;\r
82                 uint8_t         m_nrofPrachInSlot;\r
83                 uint8_t         m_occassionsInPrachSlot;\r
84                 uint8_t         m_y[XRAN_PRACH_CANDIDATE_Y];\r
85                 uint8_t     m_isPRACHslot[XRAN_PRACH_CANDIDATE_SLOT];\r
86                 int             m_prach_start_symbol;\r
87                 int                     m_prach_last_symbol;\r
88                 uint8_t     m_SlotNrNum;\r
89 \r
90 \r
91         void SetUp() override\r
92   {\r
93         init_test("prach_performance");\r
94                 memset(&m_xranConf, 0, sizeof(struct xran_fh_config));\r
95                 memset(&m_xran_dev_ctx, 0, sizeof(struct xran_device_ctx));\r
96                 m_pPRACHConfig = &m_xranConf.prach_conf;\r
97                 m_pPrachCPConfig = &m_xran_dev_ctx.PrachCPConfig;\r
98 \r
99                 //initialize input parameters\r
100         m_xranConf.frame_conf.nNumerology = get_input_parameter<uint8_t>("Numerology");\r
101         m_xranConf.frame_conf.nFrameDuplexType = get_input_parameter<uint8_t>("FrameDuplexType");\r
102         m_xranConf.log_level = get_input_parameter<uint32_t>("loglevel");\r
103 \r
104         m_pPRACHConfig->nPrachConfIdx = get_input_parameter<uint8_t>("PrachConfIdx");\r
105         m_pPRACHConfig->nPrachFreqStart = get_input_parameter<uint16_t>("PrachFreqStart");\r
106         m_pPRACHConfig->nPrachFreqOffset = get_input_parameter<int32_t>("PrachFreqOffset");\r
107         m_pPRACHConfig->nPrachSubcSpacing = get_input_parameter<uint8_t>("PrachSubcSpacing");\r
108 \r
109 \r
110         m_frameId = get_input_parameter<uint8_t>("frameId");\r
111         m_subframeId = get_input_parameter<uint8_t>("subframeId");\r
112         m_slotId = get_input_parameter<uint8_t>("slotId");\r
113         m_beamId = get_input_parameter<uint16_t>("beamId");\r
114         m_ccId = get_input_parameter<uint8_t>("ccId");\r
115         m_antId = get_input_parameter<uint8_t>("antId");\r
116 \r
117                 //initialize reference output\r
118         m_startSymId = get_reference_parameter<uint8_t>("startSymId");\r
119         m_x = get_reference_parameter<uint8_t>("x_value");\r
120                 m_filterIdx = get_reference_parameter<uint8_t>("filterIdx");\r
121         m_startPrbc = get_reference_parameter<uint16_t>("startPrbc");\r
122                 m_numPrbc = get_reference_parameter<uint8_t>("numPrbc");\r
123         m_timeOffset = get_reference_parameter<uint16_t>("timeOffset");\r
124                 m_freqOffset = get_reference_parameter<uint32_t>("freqOffset");\r
125         m_nrofPrachInSlot = get_reference_parameter<uint8_t>("nrofPrachInSlot");\r
126 \r
127                 //get the values from a vector\r
128                 std::vector<uint8_t> y_vec = get_reference_parameter<std::vector<uint8_t>>("y_value");\r
129                 for(int i=0; i < XRAN_PRACH_CANDIDATE_Y; i++) {\r
130             m_y[i] = y_vec[i];\r
131         }\r
132 \r
133         m_numSymbol = get_reference_parameter<uint8_t>("numSymbol");\r
134                 m_occassionsInPrachSlot = get_reference_parameter<uint8_t>("occassionsInPrachSlot");\r
135 \r
136                 std::vector<uint8_t> index_vec = get_reference_parameter<std::vector<uint8_t>>("isPRACHslot");\r
137                 m_SlotNrNum = get_reference_parameter<uint8_t>("SlotNrNum");\r
138                 for(int i = 0; i < XRAN_PRACH_CANDIDATE_SLOT; i++){\r
139                         m_isPRACHslot[i]=0;\r
140                 }\r
141                 for(int i=0; i<m_SlotNrNum;i++){\r
142                         m_isPRACHslot[index_vec[i]]=1;\r
143                 }\r
144 \r
145 \r
146                 m_prach_start_symbol = get_reference_parameter<int>("prach_start_symbol");\r
147                 m_prach_last_symbol = get_reference_parameter<int>("prach_last_symbol");\r
148 \r
149         /* allocate and prepare required data storage */\r
150         m_pSectGenInfo = new struct xran_section_gen_info[8];\r
151         ASSERT_NE(m_pSectGenInfo, nullptr);\r
152         m_params.sections = m_pSectGenInfo;\r
153 \r
154         /* allocating an mbuf for packet generatrion */\r
155         m_pTestBuffer = (struct rte_mbuf*)rte_pktmbuf_alloc(_eth_mbuf_pool);\r
156         ASSERT_FALSE(m_pTestBuffer == NULL);\r
157 \r
158     }\r
159 \r
160     void TearDown() override\r
161     {\r
162 \r
163                 if(m_pTestBuffer != NULL)\r
164                         rte_pktmbuf_free(m_pTestBuffer);\r
165                 if(m_pSectGenInfo)\r
166                         delete[] m_pSectGenInfo;\r
167 \r
168                 return;\r
169     }\r
170 };\r
171 \r
172 void performance_cp(void *pHandle,struct xran_cp_gen_params *params, struct xran_section_gen_info *sect_geninfo, struct xran_device_ctx *pxran_lib_ctx,\r
173                 uint8_t frame_id, uint8_t subframe_id, uint8_t slot_id,\r
174                 uint16_t beam_id, uint8_t cc_id, uint8_t prach_port_id, uint8_t seq_id)\r
175 {\r
176         struct rte_mbuf *mbuf;\r
177 \r
178     mbuf = (struct rte_mbuf*)rte_pktmbuf_alloc(_eth_mbuf_pool);\r
179 \r
180     generate_cpmsg_prach(pHandle, params, sect_geninfo, mbuf, pxran_lib_ctx,\r
181         frame_id, subframe_id, slot_id,\r
182         beam_id, cc_id, prach_port_id, seq_id);\r
183 \r
184     seq_id++;\r
185 \r
186     rte_pktmbuf_free(mbuf);\r
187 }\r
188 \r
189 TEST_P(PrachPerf, PacketGen)//TestCaseName   TestName\r
190 {\r
191     int ret;\r
192     void *pHandle = NULL;\r
193 \r
194     /* Preparing input data for prach config */\r
195         ret = xran_init_prach(&m_xranConf, &m_xran_dev_ctx);\r
196     ASSERT_TRUE(ret == XRAN_STATUS_SUCCESS);\r
197 \r
198 \r
199     ret = generate_cpmsg_prach(pHandle, &m_params, m_pSectGenInfo, m_pTestBuffer, &m_xran_dev_ctx,\r
200         m_frameId, m_subframeId, m_slotId,\r
201         m_beamId, m_ccId, m_antId, 0);\r
202     ASSERT_TRUE(ret == XRAN_STATUS_SUCCESS);\r
203 \r
204 \r
205         performance("C", module_name,\r
206             &performance_cp, pHandle, &m_params, m_pSectGenInfo, &m_xran_dev_ctx,\r
207         m_frameId, m_subframeId, m_slotId,\r
208         m_beamId, m_ccId, m_antId, 0);\r
209 }\r
210 \r
211 \r
212 INSTANTIATE_TEST_CASE_P(UnitTest, PrachPerf,\r
213         testing::ValuesIn(get_sequence(PrachPerf::get_number_of_cases("prach_performance"))));\r
214 \r