provide follow features implementation:
[o-du/phy.git] / fhi_lib / test / test_xran / u_plane_functional.cc
diff --git a/fhi_lib/test/test_xran/u_plane_functional.cc b/fhi_lib/test/test_xran/u_plane_functional.cc
new file mode 100644 (file)
index 0000000..e9057f1
--- /dev/null
@@ -0,0 +1,183 @@
+/******************************************************************************\r
+*\r
+*   Copyright (c) 2019 Intel.\r
+*\r
+*   Licensed under the Apache License, Version 2.0 (the "License");\r
+*   you may not use this file except in compliance with the License.\r
+*   You may obtain a copy of the License at\r
+*\r
+*       http://www.apache.org/licenses/LICENSE-2.0\r
+*\r
+*   Unless required by applicable law or agreed to in writing, software\r
+*   distributed under the License is distributed on an "AS IS" BASIS,\r
+*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+*   See the License for the specific language governing permissions and\r
+*   limitations under the License.\r
+*\r
+*******************************************************************************/\r
+\r
+\r
+#include "common.hpp"\r
+#include "xran_common.h"\r
+#include "xran_up_api.h"\r
+#include "xran_fh_o_du.h"\r
+#include "ethernet.h"\r
+\r
+#include <stdint.h>\r
+\r
+const std::string module_name = "u-plane";\r
+\r
+class U_planeCheck : public KernelTests\r
+{\r
+protected:\r
+    struct rte_mbuf *test_buffer;\r
+    char * iq_offset;\r
+    struct rte_mempool *test_eth_mbuf_pool;\r
+\r
+    void SetUp() override\r
+    {\r
+        init_test("u_plane_functional");\r
+        test_buffer = (struct rte_mbuf*)rte_pktmbuf_alloc(_eth_mbuf_pool);\r
+\r
+        if(test_buffer == NULL) {\r
+            std::cout << __func__ << ":" << __LINE__ << " Failed to allocatte a packet buffer!" << std::endl;\r
+            return;\r
+        }\r
+        iq_offset = rte_pktmbuf_mtod(test_buffer, char * );\r
+        iq_offset = iq_offset + sizeof(struct ether_hdr) +\r
+                                    sizeof (struct xran_ecpri_hdr) +\r
+                                    sizeof (struct radio_app_common_hdr) +\r
+                                    sizeof(struct data_section_hdr);\r
+    }\r
+\r
+    /* It's called after an execution of the each test case.*/\r
+    void TearDown() override\r
+    {\r
+        rte_pktmbuf_free(test_buffer);\r
+    }\r
+};\r
+\r
+/* simple test of DL and UL functionality */\r
+TEST_P(U_planeCheck, Test_DLUL)\r
+{\r
+    enum xran_pkt_dir direction =  XRAN_DIR_DL;\r
+    uint16_t section_id = 7;\r
+    enum xran_input_byte_order iq_buf_byte_order = XRAN_CPU_LE_BYTE_ORDER;\r
+    uint8_t frame_id = 99;\r
+    uint8_t subframe_id  = 9;\r
+    uint8_t slot_id = 10;\r
+    uint8_t symbol_no = 7;\r
+    int prb_start = 0;\r
+    int prb_num = 66;\r
+    uint8_t CC_ID = 0;\r
+    uint8_t RU_Port_ID = 0;\r
+    uint8_t seq_id =0;\r
+    uint32_t do_copy = 0;\r
+    uint8_t compMeth = 0;\r
+    uint8_t iqWidth =  16;\r
+\r
+    int32_t prep_bytes;\r
+    struct xran_ecpri_hdr *ecpri_hdr = NULL;\r
+    struct radio_app_common_hdr *app_hdr = NULL;\r
+    struct data_section_hdr *section_hdr = NULL;\r
+\r
+    char *pChar = NULL;\r
+    uint16_t payl_size = 0;\r
+    struct data_section_hdr res_sect;\r
+\r
+    prep_bytes = prepare_symbol_ex(direction,\r
+                                section_id,\r
+                                test_buffer,\r
+                                (struct rb_map *)iq_offset,\r
+                                compMeth,\r
+                                iqWidth,\r
+                                iq_buf_byte_order,\r
+                                frame_id,\r
+                                subframe_id,\r
+                                slot_id,\r
+                                symbol_no,\r
+                                prb_start,\r
+                                prb_num,\r
+                                CC_ID,\r
+                                RU_Port_ID,\r
+                                seq_id,\r
+                                do_copy);\r
+\r
+    ASSERT_EQ(prep_bytes, 3168);\r
+\r
+    pChar = rte_pktmbuf_mtod(test_buffer, char*);\r
+\r
+    ecpri_hdr = (struct xran_ecpri_hdr *)(pChar + sizeof(struct ether_hdr));\r
+    app_hdr = (struct radio_app_common_hdr *)(pChar + sizeof(struct ether_hdr)\r
+                                              + sizeof (struct xran_ecpri_hdr));\r
+    section_hdr = (struct data_section_hdr *)(pChar + sizeof(struct ether_hdr) +\r
+                                            sizeof (struct xran_ecpri_hdr) +\r
+                                            sizeof(struct radio_app_common_hdr));\r
+\r
+    ASSERT_EQ (ecpri_hdr->cmnhdr.ecpri_mesg_type,  ECPRI_IQ_DATA);\r
+    payl_size =  rte_be_to_cpu_16(ecpri_hdr->cmnhdr.ecpri_payl_size);\r
+    ASSERT_EQ (payl_size,  3180);\r
+\r
+    ASSERT_EQ(app_hdr->data_direction, direction);\r
+    ASSERT_EQ(app_hdr->frame_id, frame_id);\r
+\r
+    res_sect.fields.all_bits = rte_be_to_cpu_32(section_hdr->fields.all_bits);\r
+    ASSERT_EQ(res_sect.fields.num_prbu, prb_num);\r
+    ASSERT_EQ(res_sect.fields.sect_id, section_id);\r
+\r
+    {\r
+        /* UL direction */\r
+        void *iq_samp_buf;\r
+        struct ecpri_seq_id seq;\r
+        int num_bytes = 0;\r
+\r
+        uint8_t CC_ID = 0;\r
+        uint8_t Ant_ID = 0;\r
+        uint8_t frame_id = 0;\r
+        uint8_t subframe_id = 0;\r
+        uint8_t slot_id = 0;\r
+        uint8_t symb_id = 0;\r
+\r
+        uint8_t compMeth = 0;\r
+        uint8_t iqWidth = 0;\r
+\r
+\r
+        uint16_t num_prbu;\r
+        uint16_t start_prbu;\r
+        uint16_t sym_inc;\r
+        uint16_t rb;\r
+        uint16_t sect_id;\r
+\r
+        int32_t prep_bytes;\r
+\r
+        char *pChar = NULL;\r
+\r
+\r
+        num_bytes = xran_extract_iq_samples(test_buffer,\r
+                                &iq_samp_buf,\r
+                                &CC_ID,\r
+                                &Ant_ID,\r
+                                &frame_id,\r
+                                &subframe_id,\r
+                                &slot_id,\r
+                                &symb_id,\r
+                                &seq,\r
+                                &num_prbu,\r
+                                &start_prbu,\r
+                                &sym_inc,\r
+                                &rb,\r
+                                &sect_id,\r
+                                0,\r
+                                &compMeth,\r
+                                &iqWidth);\r
+\r
+        ASSERT_EQ(num_bytes, 3182);\r
+        ASSERT_EQ(prb_num, 66);\r
+        ASSERT_EQ(CC_ID, 0);\r
+    }\r
+}\r
+\r
+INSTANTIATE_TEST_CASE_P(UnitTest, U_planeCheck,\r
+                        testing::ValuesIn(get_sequence(U_planeCheck::get_number_of_cases("u_plane_functional"))));\r
+\r
+\r