Fix NFAPI integration
This commit fixes issues introduced by the previous commit.
Summary of work:
- cleanup:
- fix LOG_XX to be less verbose
- fix cmake_targets/CMakeLists.txt
- fix oaienv
- remove dead code
- bug fixes:
- in openair1/SCHED/fapi_l1.c we had:
eNB->pdcch_vars[subframe&1].num_dci = number_dci;
should be:
eNB->pdcch_vars[subframe&1].num_dci = 0;
This bug let the PHY send more DCIs than what should have been
sent because num_dci is incremented later on in the code.
This fix may be a problem for fapi mode, to be checked.
- add new T VCD traces
- revert openair1/PHY/TOOLS/file_output.c to 'develop' version
- remove thread_id in logRecord/logRecord_mt
- revert (and adapt) configuration files
- be careful when doing frame++, we need to % 1024
- revert target_rx_power in openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
- NFAPI:
- the open-nFAPI code has been included in the repository. See nfapi/README.
Maybe we should "git clone" the Cisco repository instead. We have to be
careful of availability though.
What has been tested:
- monolithic eNB FDD 5/10MHz with one UE, iperf UDP/TCP uplink/downlink
Anything else may fail to work, especially the FAPI mode, which has not
been tested at all.
This commit is contained in:
@@ -0,0 +1,269 @@
|
||||
/*
|
||||
* Copyright 2017 Cisco Systems, Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include "CUnit.h"
|
||||
#include "Basic.h"
|
||||
#include "Automated.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
int start_vnf_proc(int port)
|
||||
{
|
||||
char port_str[10];
|
||||
sprintf(port_str, "%d", port);
|
||||
|
||||
const char *argv[] = {"vnfsim", port_str, "../xml/vnf_A.xml", NULL};
|
||||
int pid = fork();
|
||||
|
||||
if(pid == 0)
|
||||
{
|
||||
int result = execv("../vnf_sim/vnfsim", (char* const*)argv); //, env_args);
|
||||
if(result == -1)
|
||||
{
|
||||
printf("Failed to exec vnf process %d\n", errno);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return pid;
|
||||
}
|
||||
}
|
||||
|
||||
int start_pnf_proc(const char* addr, int port, const char* file)
|
||||
{
|
||||
char port_str[10];
|
||||
sprintf(port_str, "%d", port);
|
||||
|
||||
char filename[256];
|
||||
sprintf(filename, "../xml/%s", file);
|
||||
|
||||
const char * argv[] = {"pnfsim", addr, port_str, filename, NULL};
|
||||
int pid = fork();
|
||||
|
||||
if(pid == 0)
|
||||
{
|
||||
int result = execv("../pnf_sim/pnfsim", (char* const*)argv); //, env_args);
|
||||
if(result == -1)
|
||||
{
|
||||
printf("Failed to exec pnf process %d\n", errno);
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
return pid;
|
||||
}
|
||||
}
|
||||
|
||||
int kill_proc(int pid)
|
||||
{
|
||||
kill(pid, SIGKILL);
|
||||
|
||||
int status;
|
||||
int waitpid_result = waitpid(pid, &status, 0);
|
||||
|
||||
return waitpid_result;
|
||||
}
|
||||
|
||||
|
||||
void test_1()
|
||||
{
|
||||
|
||||
int pnf_port = 5655;
|
||||
const char* pnf_addr = "localhost";
|
||||
|
||||
printf("**** starting vnf *****\n");
|
||||
int vnf_pid = start_vnf_proc(pnf_port);
|
||||
|
||||
printf("**** starting pnf *****\n");
|
||||
int pnf1_pid = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_1_A.xml");
|
||||
|
||||
|
||||
sleep(10);
|
||||
|
||||
printf ("*** Terminating ****\n");
|
||||
kill_proc(vnf_pid);
|
||||
kill_proc(pnf1_pid);
|
||||
}
|
||||
void test_1a()
|
||||
{
|
||||
|
||||
int pnf_port = 5655;
|
||||
const char* pnf_addr = "localhost";
|
||||
|
||||
printf("**** starting vnf *****\n");
|
||||
int vnf_pid = start_vnf_proc(pnf_port);
|
||||
|
||||
printf("**** starting pnf *****\n");
|
||||
int pnf1_pid = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_2_A.xml");
|
||||
|
||||
|
||||
sleep(10);
|
||||
|
||||
printf ("*** Terminating ****\n");
|
||||
kill_proc(vnf_pid);
|
||||
kill_proc(pnf1_pid);
|
||||
}
|
||||
|
||||
|
||||
void test_2()
|
||||
{
|
||||
int pnf_port = 5655;
|
||||
const char* pnf_addr = "127.0.0.1";
|
||||
|
||||
int vnf_pid = start_vnf_proc(pnf_port);
|
||||
sleep(2);
|
||||
|
||||
int pnf1_pid = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_1_A.xml");
|
||||
int pnf2_pid = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_1_A.xml");
|
||||
|
||||
sleep(2);
|
||||
|
||||
kill_proc(pnf2_pid);
|
||||
kill_proc(pnf1_pid);
|
||||
kill_proc(vnf_pid);
|
||||
}
|
||||
|
||||
void test_32()
|
||||
{
|
||||
int pnf_count = 32;
|
||||
int pnf_pid[pnf_count];
|
||||
|
||||
int pnf_port = 5655;
|
||||
const char* pnf_addr = "127.0.0.1";
|
||||
|
||||
int vnf_pid = start_vnf_proc(pnf_port);
|
||||
sleep(2);
|
||||
|
||||
for(int i = 0; i < pnf_count; ++i)
|
||||
{
|
||||
pnf_pid[i] = start_pnf_proc(pnf_addr, pnf_port, "pnf_phy_1_A.xml");
|
||||
}
|
||||
|
||||
sleep(5);
|
||||
|
||||
printf ("*** Terminating pnfs\n");
|
||||
|
||||
for(int i = 0; i < pnf_count; ++i)
|
||||
{
|
||||
kill_proc(pnf_pid[i]);
|
||||
}
|
||||
printf ("*** Terminating vnf\n");
|
||||
kill_proc(vnf_pid);
|
||||
}
|
||||
|
||||
|
||||
int init_suite()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int clean_suite()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main ( void )
|
||||
{
|
||||
CU_pSuite pSuite = NULL;
|
||||
|
||||
/* initialize the CUnit test registry */
|
||||
if ( CUE_SUCCESS != CU_initialize_registry() )
|
||||
return CU_get_error();
|
||||
|
||||
/* add a suite to the registry */
|
||||
pSuite = CU_add_suite( "integration_test_suite", init_suite, clean_suite );
|
||||
if ( NULL == pSuite )
|
||||
{
|
||||
CU_cleanup_registry();
|
||||
return CU_get_error();
|
||||
}
|
||||
|
||||
//(NULL == CU_add_test(pSuite, "vnf_test_start_connect_2", vnf_test_start_connect_2))
|
||||
/* add the tests to the suite */
|
||||
if ( (NULL == CU_add_test(pSuite, "test_1a", test_1a))
|
||||
// (NULL == CU_add_test(pSuite, "test_2", test_2)) ||
|
||||
// (NULL == CU_add_test(pSuite, "test_32", test_32))
|
||||
)
|
||||
{
|
||||
CU_cleanup_registry();
|
||||
return CU_get_error();
|
||||
}
|
||||
|
||||
// Run all tests using the basic interface
|
||||
CU_basic_set_mode(CU_BRM_VERBOSE);
|
||||
CU_set_output_filename("vnf_unit_test_results.xml");
|
||||
CU_basic_run_tests();
|
||||
|
||||
CU_pSuite s = CU_get_registry()->pSuite;
|
||||
int count = 0;
|
||||
while(s)
|
||||
{
|
||||
CU_pTest t = s->pTest;
|
||||
while(t)
|
||||
{
|
||||
count++;
|
||||
t = t->pNext;
|
||||
}
|
||||
s = s->pNext;
|
||||
}
|
||||
|
||||
printf("%d..%d\n", 1, count);
|
||||
|
||||
|
||||
|
||||
s = CU_get_registry()->pSuite;
|
||||
count = 1;
|
||||
while(s)
|
||||
{
|
||||
CU_pTest t = s->pTest;
|
||||
while(t)
|
||||
{
|
||||
int pass = 1;
|
||||
CU_FailureRecord* failures = CU_get_failure_list();
|
||||
while(failures)
|
||||
{
|
||||
if(strcmp(failures->pSuite->pName, s->pName) == 0 &&
|
||||
strcmp(failures->pTest->pName, t->pName) == 0)
|
||||
{
|
||||
pass = 0;
|
||||
failures = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
failures = failures->pNext;
|
||||
}
|
||||
}
|
||||
|
||||
if(pass)
|
||||
printf("ok %d - %s:%s\n", count, s->pName, t->pName);
|
||||
else
|
||||
printf("not ok %d - %s:%s\n", count, s->pName, t->pName);
|
||||
|
||||
count++;
|
||||
t = t->pNext;
|
||||
}
|
||||
s = s->pNext;
|
||||
}
|
||||
|
||||
CU_cleanup_registry();
|
||||
return CU_get_error();
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user