O-RAN E Maintenance Release contribution for ODULOW
[o-du/phy.git] / fhi_lib / test / test_xran / u_plane_functional.cc
1 /******************************************************************************
2 *
3 *   Copyright (c) 2020 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     enum xran_comp_hdr_type staticEn = XRAN_COMP_HDR_TYPE_DYNAMIC;
77     uint8_t iqWidth =  16;
78
79     int32_t prep_bytes;
80     struct xran_ecpri_hdr *ecpri_hdr = NULL;
81     struct radio_app_common_hdr *app_hdr = NULL;
82     struct data_section_hdr *section_hdr = NULL;
83
84     char *pChar = NULL;
85     uint16_t payl_size = 0;
86     struct data_section_hdr res_sect;
87
88     prep_bytes = prepare_symbol_ex(direction,
89                                 section_id,
90                                 test_buffer,
91                                 (uint8_t *)iq_offset,
92                                 compMeth,
93                                 iqWidth,
94                                 iq_buf_byte_order,
95                                 frame_id,
96                                 subframe_id,
97                                 slot_id,
98                                 symbol_no,
99                                 prb_start,
100                                 prb_num,
101                                 CC_ID,
102                                 RU_Port_ID,
103                                 seq_id,
104                                 do_copy,
105                                 staticEn);
106
107     ASSERT_EQ(prep_bytes, 3168);
108
109     pChar = rte_pktmbuf_mtod(test_buffer, char*);
110
111     ecpri_hdr = (struct xran_ecpri_hdr *)(pChar + sizeof(struct rte_ether_hdr));
112     app_hdr = (struct radio_app_common_hdr *)(pChar + sizeof(struct rte_ether_hdr)
113                                               + sizeof (struct xran_ecpri_hdr));
114     section_hdr = (struct data_section_hdr *)(pChar + sizeof(struct rte_ether_hdr) +
115                                             sizeof (struct xran_ecpri_hdr) +
116                                             sizeof(struct radio_app_common_hdr));
117
118     ASSERT_EQ (ecpri_hdr->cmnhdr.bits.ecpri_mesg_type,  ECPRI_IQ_DATA);
119     payl_size =  rte_be_to_cpu_16(ecpri_hdr->cmnhdr.bits.ecpri_payl_size);
120     ASSERT_EQ (payl_size,  3180);
121
122     ASSERT_EQ(app_hdr->data_feature.data_direction, direction);
123     ASSERT_EQ(app_hdr->frame_id, frame_id);
124
125     res_sect.fields.all_bits = rte_be_to_cpu_32(section_hdr->fields.all_bits);
126     ASSERT_EQ(res_sect.fields.num_prbu, prb_num);
127     ASSERT_EQ(res_sect.fields.sect_id, section_id);
128
129     {
130         /* UL direction */
131         void *iq_samp_buf;
132         union ecpri_seq_id seq;
133         int num_bytes = 0;
134
135         uint8_t CC_ID = 0;
136         uint8_t Ant_ID = 0;
137         uint8_t frame_id = 0;
138         uint8_t subframe_id = 0;
139         uint8_t slot_id = 0;
140         uint8_t symb_id = 0;
141
142         uint8_t compMeth = 0;
143         uint8_t iqWidth = 0;
144
145
146         uint16_t num_prbu;
147         uint16_t start_prbu;
148         uint16_t sym_inc;
149         uint16_t rb;
150         uint16_t sect_id;
151
152         int32_t prep_bytes;
153
154         char *pChar = NULL;
155
156
157         num_bytes = xran_extract_iq_samples(test_buffer,
158                                 &iq_samp_buf,
159                                 &CC_ID,
160                                 &Ant_ID,
161                                 &frame_id,
162                                 &subframe_id,
163                                 &slot_id,
164                                 &symb_id,
165                                 &seq,
166                                 &num_prbu,
167                                 &start_prbu,
168                                 &sym_inc,
169                                 &rb,
170                                 &sect_id,
171                                 0,
172                                 XRAN_COMP_HDR_TYPE_DYNAMIC,
173                                 &compMeth,
174                                 &iqWidth);
175
176         ASSERT_EQ(num_bytes, 3182);
177         ASSERT_EQ(prb_num, 66);
178         ASSERT_EQ(CC_ID, 0);
179     }
180 }
181
182 INSTANTIATE_TEST_CASE_P(UnitTest, U_planeCheck,
183                         testing::ValuesIn(get_sequence(U_planeCheck::get_number_of_cases("u_plane_functional"))));
184
185