Update to odulow per maintenance bronze
[o-du/phy.git] / fhi_lib / test / test_xran / u_plane_functional.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 #include "common.hpp"
20 #include "xran_common.h"
21 #include "xran_up_api.h"
22 #include "xran_fh_o_du.h"
23 #include "ethernet.h"
24
25 #include <stdint.h>
26
27 const std::string module_name = "u-plane";
28
29 class U_planeCheck : public KernelTests
30 {
31 protected:
32     struct rte_mbuf *test_buffer;
33     char * iq_offset;
34     struct rte_mempool *test_eth_mbuf_pool;
35
36     void SetUp() override
37     {
38         init_test("u_plane_functional");
39         test_buffer = (struct rte_mbuf*)rte_pktmbuf_alloc(_eth_mbuf_pool);
40
41         if(test_buffer == NULL) {
42             std::cout << __func__ << ":" << __LINE__ << " Failed to allocatte a packet buffer!" << std::endl;
43             return;
44         }
45         iq_offset = rte_pktmbuf_mtod(test_buffer, char * );
46         iq_offset = iq_offset + sizeof(struct rte_ether_hdr) +
47                                     sizeof (struct xran_ecpri_hdr) +
48                                     sizeof (struct radio_app_common_hdr) +
49                                     sizeof(struct data_section_hdr);
50     }
51
52     /* It's called after an execution of the each test case.*/
53     void TearDown() override
54     {
55         rte_pktmbuf_free(test_buffer);
56     }
57 };
58
59 /* simple test of DL and UL functionality */
60 TEST_P(U_planeCheck, Test_DLUL)
61 {
62     enum xran_pkt_dir direction =  XRAN_DIR_DL;
63     uint16_t section_id = 7;
64     enum xran_input_byte_order iq_buf_byte_order = XRAN_CPU_LE_BYTE_ORDER;
65     uint8_t frame_id = 99;
66     uint8_t subframe_id  = 9;
67     uint8_t slot_id = 10;
68     uint8_t symbol_no = 7;
69     int prb_start = 0;
70     int prb_num = 66;
71     uint8_t CC_ID = 0;
72     uint8_t RU_Port_ID = 0;
73     uint8_t seq_id =0;
74     uint32_t do_copy = 0;
75     uint8_t compMeth = 0;
76     uint8_t iqWidth =  16;
77
78     int32_t prep_bytes;
79     struct xran_ecpri_hdr *ecpri_hdr = NULL;
80     struct radio_app_common_hdr *app_hdr = NULL;
81     struct data_section_hdr *section_hdr = NULL;
82
83     char *pChar = NULL;
84     uint16_t payl_size = 0;
85     struct data_section_hdr res_sect;
86
87     prep_bytes = prepare_symbol_ex(direction,
88                                 section_id,
89                                 test_buffer,
90                                 (struct rb_map *)iq_offset,
91                                 compMeth,
92                                 iqWidth,
93                                 iq_buf_byte_order,
94                                 frame_id,
95                                 subframe_id,
96                                 slot_id,
97                                 symbol_no,
98                                 prb_start,
99                                 prb_num,
100                                 CC_ID,
101                                 RU_Port_ID,
102                                 seq_id,
103                                 do_copy);
104
105     ASSERT_EQ(prep_bytes, 3168);
106
107     pChar = rte_pktmbuf_mtod(test_buffer, char*);
108
109     ecpri_hdr = (struct xran_ecpri_hdr *)(pChar + sizeof(struct rte_ether_hdr));
110     app_hdr = (struct radio_app_common_hdr *)(pChar + sizeof(struct rte_ether_hdr)
111                                               + sizeof (struct xran_ecpri_hdr));
112     section_hdr = (struct data_section_hdr *)(pChar + sizeof(struct rte_ether_hdr) +
113                                             sizeof (struct xran_ecpri_hdr) +
114                                             sizeof(struct radio_app_common_hdr));
115
116     ASSERT_EQ (ecpri_hdr->cmnhdr.ecpri_mesg_type,  ECPRI_IQ_DATA);
117     payl_size =  rte_be_to_cpu_16(ecpri_hdr->cmnhdr.ecpri_payl_size);
118     ASSERT_EQ (payl_size,  3180);
119
120     ASSERT_EQ(app_hdr->data_direction, direction);
121     ASSERT_EQ(app_hdr->frame_id, frame_id);
122
123     res_sect.fields.all_bits = rte_be_to_cpu_32(section_hdr->fields.all_bits);
124     ASSERT_EQ(res_sect.fields.num_prbu, prb_num);
125     ASSERT_EQ(res_sect.fields.sect_id, section_id);
126
127     {
128         /* UL direction */
129         void *iq_samp_buf;
130         struct ecpri_seq_id seq;
131         int num_bytes = 0;
132
133         uint8_t CC_ID = 0;
134         uint8_t Ant_ID = 0;
135         uint8_t frame_id = 0;
136         uint8_t subframe_id = 0;
137         uint8_t slot_id = 0;
138         uint8_t symb_id = 0;
139
140         uint8_t compMeth = 0;
141         uint8_t iqWidth = 0;
142
143
144         uint16_t num_prbu;
145         uint16_t start_prbu;
146         uint16_t sym_inc;
147         uint16_t rb;
148         uint16_t sect_id;
149
150         int32_t prep_bytes;
151
152         char *pChar = NULL;
153
154
155         num_bytes = xran_extract_iq_samples(test_buffer,
156                                 &iq_samp_buf,
157                                 &CC_ID,
158                                 &Ant_ID,
159                                 &frame_id,
160                                 &subframe_id,
161                                 &slot_id,
162                                 &symb_id,
163                                 &seq,
164                                 &num_prbu,
165                                 &start_prbu,
166                                 &sym_inc,
167                                 &rb,
168                                 &sect_id,
169                                 0,
170                                 &compMeth,
171                                 &iqWidth);
172
173         ASSERT_EQ(num_bytes, 3182);
174         ASSERT_EQ(prb_num, 66);
175         ASSERT_EQ(CC_ID, 0);
176     }
177 }
178
179 INSTANTIATE_TEST_CASE_P(UnitTest, U_planeCheck,
180                         testing::ValuesIn(get_sequence(U_planeCheck::get_number_of_cases("u_plane_functional"))));
181
182