501ea8c0552d9ea1c8d03ad1e2013dab67ba3a07
[o-du/phy.git] / fhi_lib / test / test_xran / prach_functional.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 PrachCheck : public KernelTests\r
34 {\r
35 private:\r
36     struct xran_section_gen_info *m_pSectResult = NULL;\r
37 \r
38 protected:\r
39     struct xran_fh_config *m_xranConf;\r
40     struct xran_device_ctx m_xran_dev_ctx;\r
41     struct xran_prach_config *m_pPRACHConfig;\r
42     struct xran_ru_config *m_pRUConfig;\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     uint16_t    m_m_params_timeOffset;\r
90     uint16_t    m_id;\r
91 \r
92     void SetUp() override\r
93     {\r
94         init_test("prach_functional");\r
95         memset(&m_xran_dev_ctx, 0, sizeof(struct xran_device_ctx));\r
96         //modify\r
97         m_xranConf = &m_xran_dev_ctx.fh_cfg;\r
98 \r
99         m_pPRACHConfig = &m_xranConf->prach_conf;\r
100         m_pRUConfig = &m_xranConf->ru_conf;\r
101         m_pPrachCPConfig = &m_xran_dev_ctx.PrachCPConfig;\r
102         //initialize input parameters\r
103         m_xranConf->frame_conf.nNumerology = get_input_parameter<uint8_t>("Numerology");\r
104         m_xranConf->frame_conf.nFrameDuplexType = get_input_parameter<uint8_t>("FrameDuplexType");\r
105         m_xranConf->log_level = get_input_parameter<uint32_t>("loglevel");\r
106         m_pPRACHConfig->nPrachConfIdx = get_input_parameter<uint8_t>("PrachConfIdx");\r
107         m_pPRACHConfig->nPrachFreqStart = get_input_parameter<uint16_t>("PrachFreqStart");\r
108         m_pPRACHConfig->nPrachFreqOffset = get_input_parameter<int32_t>("PrachFreqOffset");\r
109         m_pPRACHConfig->nPrachSubcSpacing = get_input_parameter<uint8_t>("PrachSubcSpacing");\r
110 \r
111         m_pRUConfig->iqWidth = get_input_parameter<uint8_t>("iqWidth");\r
112         m_pRUConfig->compMeth = get_input_parameter<uint8_t>("compMeth");\r
113         m_pRUConfig->fftSize = get_input_parameter<uint8_t>("fftSize");\r
114 \r
115         m_frameId = get_input_parameter<uint8_t>("frameId");\r
116         m_subframeId = get_input_parameter<uint8_t>("subframeId");\r
117         m_slotId = get_input_parameter<uint8_t>("slotId");\r
118         m_beamId = get_input_parameter<uint16_t>("beamId");\r
119         m_ccId = get_input_parameter<uint8_t>("ccId");\r
120         m_antId = get_input_parameter<uint8_t>("antId");\r
121 \r
122         //initialize reference output\r
123         m_startSymId = get_reference_parameter<uint8_t>("startSymId");\r
124         m_x = get_reference_parameter<uint8_t>("x_value");\r
125 \r
126         m_filterIdx = get_reference_parameter<uint8_t>("filterIdx");\r
127         m_startPrbc = get_reference_parameter<uint16_t>("startPrbc");\r
128         m_numPrbc = get_reference_parameter<uint8_t>("numPrbc");\r
129         m_timeOffset = get_reference_parameter<uint16_t>("timeOffset");\r
130         m_freqOffset = get_reference_parameter<uint32_t>("freqOffset");\r
131         m_nrofPrachInSlot = get_reference_parameter<uint8_t>("nrofPrachInSlot");\r
132         m_m_params_timeOffset = get_reference_parameter<uint16_t>("m_params_timeOffset");\r
133         m_id = get_reference_parameter<uint16_t>("id");\r
134         std::vector<uint8_t> y_vec = get_reference_parameter<std::vector<uint8_t>>("y_value");\r
135         for(int i=0; i < XRAN_PRACH_CANDIDATE_Y; i++) {\r
136             m_y[i] = y_vec[i];\r
137             }\r
138 \r
139         m_numSymbol = get_reference_parameter<uint8_t>("numSymbol");\r
140         m_occassionsInPrachSlot = get_reference_parameter<uint8_t>("occassionsInPrachSlot");\r
141 \r
142         std::vector<uint8_t> index_vec = get_reference_parameter<std::vector<uint8_t>>("isPRACHslot");\r
143         m_SlotNrNum = get_reference_parameter<uint8_t>("SlotNrNum");\r
144         for(int i = 0; i < XRAN_PRACH_CANDIDATE_SLOT; i++){\r
145             m_isPRACHslot[i]=0;\r
146             }\r
147         for(int i=0; i<m_SlotNrNum;i++){\r
148             m_isPRACHslot[index_vec[i]]=1;\r
149             }\r
150 \r
151 \r
152         m_prach_start_symbol = get_reference_parameter<int>("prach_start_symbol");\r
153         m_prach_last_symbol = get_reference_parameter<int>("prach_last_symbol");\r
154 \r
155         /* allocate and prepare required data storage */\r
156         m_pSectGenInfo = new struct xran_section_gen_info[8];\r
157         ASSERT_NE(m_pSectGenInfo, nullptr);\r
158         m_params.sections = m_pSectGenInfo;\r
159 \r
160         /* allocating an mbuf for packet generatrion */\r
161         m_pTestBuffer = (struct rte_mbuf*)rte_pktmbuf_alloc(_eth_mbuf_pool);\r
162         ASSERT_FALSE(m_pTestBuffer == NULL);\r
163 \r
164     }\r
165 \r
166     void TearDown() override\r
167     {\r
168         if(m_pTestBuffer != NULL)\r
169             rte_pktmbuf_free(m_pTestBuffer);\r
170         if(m_pSectGenInfo)\r
171             delete[] m_pSectGenInfo;\r
172         return;\r
173     }\r
174 };\r
175 \r
176 \r
177 TEST_P(PrachCheck, PacketGen)//TestCaseName   TestName\r
178 {\r
179     int ret;\r
180     int32_t i;\r
181     void *pHandle = NULL;\r
182 \r
183     /* Preparing input data for prach config */\r
184     ret = xran_init_prach(m_xranConf, &m_xran_dev_ctx);\r
185     ASSERT_TRUE(ret == XRAN_STATUS_SUCCESS);\r
186 \r
187     /* Verify the result */\r
188     EXPECT_EQ(m_pPrachCPConfig->filterIdx, m_filterIdx);\r
189     EXPECT_EQ(m_pPrachCPConfig->startSymId, m_startSymId);\r
190     EXPECT_EQ(m_pPrachCPConfig->startPrbc, m_startPrbc);\r
191     EXPECT_EQ(m_pPrachCPConfig->numPrbc, m_numPrbc);\r
192     EXPECT_EQ(m_pPrachCPConfig->timeOffset, m_timeOffset);\r
193     EXPECT_EQ(m_pPrachCPConfig->freqOffset, m_freqOffset);\r
194     EXPECT_EQ(m_pPrachCPConfig->x, m_x);\r
195     EXPECT_EQ(m_pPrachCPConfig->nrofPrachInSlot, m_nrofPrachInSlot);\r
196     EXPECT_EQ(m_pPrachCPConfig->y[0], m_y[0]);\r
197     EXPECT_EQ(m_pPrachCPConfig->y[1], m_y[1]);\r
198     EXPECT_EQ(m_pPrachCPConfig->numSymbol, m_numSymbol);\r
199     EXPECT_EQ(m_pPrachCPConfig->occassionsInPrachSlot, m_occassionsInPrachSlot);\r
200     for (i = 0; i < XRAN_PRACH_CANDIDATE_SLOT; i++){\r
201         EXPECT_EQ(m_pPrachCPConfig->isPRACHslot[i], m_isPRACHslot[i]);\r
202     }\r
203     for (i = 0; i < XRAN_MAX_SECTOR_NR; i++){\r
204         EXPECT_EQ(m_xran_dev_ctx.prach_start_symbol[i], m_prach_start_symbol);\r
205         EXPECT_EQ(m_xran_dev_ctx.prach_last_symbol[i], m_prach_last_symbol);\r
206     }\r
207 \r
208     ret = xran_open(pHandle, m_xranConf);\r
209     ASSERT_TRUE(ret == XRAN_STATUS_SUCCESS);\r
210 \r
211     ret = generate_cpmsg_prach(pHandle, &m_params, m_pSectGenInfo, m_pTestBuffer, &m_xran_dev_ctx,\r
212         m_frameId, m_subframeId, m_slotId,\r
213         m_beamId, m_ccId, m_antId, 0);\r
214     ASSERT_TRUE(ret == XRAN_STATUS_SUCCESS);\r
215     /* Verify the result */\r
216     EXPECT_EQ(m_params.sectionType, XRAN_CP_SECTIONTYPE_3);\r
217     EXPECT_EQ(m_params.dir, XRAN_DIR_UL);\r
218     EXPECT_EQ(m_params.hdr.filterIdx, m_filterIdx);\r
219     EXPECT_EQ(m_params.hdr.frameId, m_frameId);\r
220     EXPECT_EQ(m_params.hdr.subframeId, m_subframeId);\r
221     EXPECT_EQ(m_params.hdr.slotId, m_slotId);\r
222     EXPECT_EQ(m_params.hdr.startSymId, m_startSymId);\r
223     EXPECT_EQ(m_params.hdr.iqWidth, (m_pRUConfig->iqWidth==16)?0:m_pRUConfig->iqWidth);\r
224     EXPECT_EQ(m_params.hdr.compMeth,m_pRUConfig->compMeth );\r
225     EXPECT_EQ(m_params.hdr.timeOffset, m_m_params_timeOffset);\r
226     EXPECT_EQ(m_params.hdr.fftSize,m_pRUConfig->fftSize);\r
227     EXPECT_EQ(m_params.hdr.scs, m_pPRACHConfig->nPrachSubcSpacing);\r
228     EXPECT_EQ(m_params.hdr.cpLength, 0);\r
229     EXPECT_EQ(m_params.numSections, 1);\r
230 \r
231     EXPECT_EQ(m_params.sections[0].info.type, XRAN_CP_SECTIONTYPE_3);\r
232     EXPECT_EQ(m_params.sections[0].info.startSymId, m_startSymId);\r
233     EXPECT_EQ(m_params.sections[0].info.iqWidth, (m_pRUConfig->iqWidth==16)?0:m_pRUConfig->iqWidth);\r
234     EXPECT_EQ(m_params.sections[0].info.compMeth, m_pRUConfig->compMeth);\r
235 \r
236     EXPECT_EQ(m_params.sections[0].info.id, m_id);\r
237     EXPECT_EQ(m_params.sections[0].info.rb, XRAN_RBIND_EVERY);\r
238     EXPECT_EQ(m_params.sections[0].info.symInc, XRAN_SYMBOLNUMBER_NOTINC);\r
239     EXPECT_EQ(m_params.sections[0].info.startPrbc, m_startPrbc);\r
240     EXPECT_EQ(m_params.sections[0].info.numPrbc, m_numPrbc);\r
241     EXPECT_EQ(m_params.sections[0].info.numSymbol, m_numSymbol*m_occassionsInPrachSlot);\r
242     EXPECT_EQ(m_params.sections[0].info.reMask, 0xfff);\r
243     EXPECT_EQ(m_params.sections[0].info.beamId, m_beamId);\r
244     EXPECT_EQ(m_params.sections[0].info.freqOffset, m_freqOffset);\r
245     EXPECT_EQ(m_xran_dev_ctx.prach_last_symbol[m_ccId], m_prach_last_symbol);\r
246     EXPECT_EQ(m_params.sections[0].info.ef, 0);\r
247     EXPECT_EQ(m_params.sections[0].exDataSize, 0);\r
248 \r
249 }\r
250 \r
251 \r
252 INSTANTIATE_TEST_CASE_P(UnitTest, PrachCheck,\r
253         testing::ValuesIn(get_sequence(PrachCheck::get_number_of_cases("prach_functional"))));\r
254 \r