1 /******************************************************************************
\r
3 * Copyright (c) 2019 Intel.
\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
9 * http://www.apache.org/licenses/LICENSE-2.0
\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
17 *******************************************************************************/
\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
30 const std::string module_name = "Prach_test";
\r
33 class PrachCheck : public KernelTests
\r
36 struct xran_section_gen_info *m_pSectResult = NULL;
\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
45 struct xran_section_gen_info *m_pSectGenInfo = NULL;
\r
46 int m_maxSections = 8; /* not used */
\r
49 struct rte_mbuf *m_pTestBuffer;
\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
56 std::string m_dirStr;
\r
57 uint8_t m_sectionType;
\r
59 uint8_t m_ccId, m_antId;
\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
65 uint8_t m_iqWidth, m_compMethod;
\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
73 //define reference values
\r
74 uint8_t m_startSymId;
\r
76 uint8_t m_filterIdx;
\r
77 uint16_t m_startPrbc;
\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
92 void SetUp() override
\r
94 init_test("prach_functional");
\r
95 memset(&m_xran_dev_ctx, 0, sizeof(struct xran_device_ctx));
\r
97 m_xranConf = &m_xran_dev_ctx.fh_cfg;
\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
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
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
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
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
139 m_numSymbol = get_reference_parameter<uint8_t>("numSymbol");
\r
140 m_occassionsInPrachSlot = get_reference_parameter<uint8_t>("occassionsInPrachSlot");
\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
147 for(int i=0; i<m_SlotNrNum;i++){
\r
148 m_isPRACHslot[index_vec[i]]=1;
\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
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
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
166 void TearDown() override
\r
168 if(m_pTestBuffer != NULL)
\r
169 rte_pktmbuf_free(m_pTestBuffer);
\r
171 delete[] m_pSectGenInfo;
\r
177 TEST_P(PrachCheck, PacketGen)//TestCaseName TestName
\r
181 void *pHandle = NULL;
\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
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
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
208 ret = xran_open(pHandle, m_xranConf);
\r
209 ASSERT_TRUE(ret == XRAN_STATUS_SUCCESS);
\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
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
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
252 INSTANTIATE_TEST_CASE_P(UnitTest, PrachCheck,
\r
253 testing::ValuesIn(get_sequence(PrachCheck::get_number_of_cases("prach_functional"))));
\r