Commit eacd88ea authored by oba's avatar oba Committed by rajeshwari.p

Standalone DU simulator integrated to demonstrate the xRAN lib working with...

Standalone DU simulator integrated to demonstrate the xRAN lib working with OAI. Same IQ samples of sample app are loaded from file and copied in xRAN buffer. Tested with sample app RU
parent 1dbffbde
...@@ -27,8 +27,73 @@ ...@@ -27,8 +27,73 @@
#include "shared_buffers.h" #include "shared_buffers.h"
#include "low_oran.h" #include "low_oran.h"
#include "xran_lib_wrap.hpp" #include "xran_lib_wrap.hpp"
#include "common.hpp"
#include "xran_compression.h"
// Declare variable useful for the send buffer function
struct xran_device_ctx *p_xran_dev_ctx_2;
// Variable declaration useful for fill IQ samples from file
#define IQ_PLAYBACK_BUFFER_BYTES (XRAN_NUM_OF_SLOT_IN_TDD_LOOP*N_SYM_PER_SLOT*XRAN_MAX_PRBS*N_SC_PER_PRB*4L)
int16_t *p_tx_play_buffer[MAX_ANT_CARRIER_SUPPORTED];
int iq_playback_buffer_size_dl = IQ_PLAYBACK_BUFFER_BYTES;
int32_t tx_play_buffer_size[MAX_ANT_CARRIER_SUPPORTED];
int32_t tx_play_buffer_position[MAX_ANT_CARRIER_SUPPORTED];
// Declare the function useful to load IQs from file
int sys_load_file_to_buff(char *filename, char *bufname, unsigned char *pBuffer, unsigned int size, unsigned int buffers_num)
{
unsigned int file_size = 0;
int num= 0;
if (size)
{
if (filename && bufname)
{
FILE *file;
printf("Loading file %s to %s: ", filename, bufname);
file = fopen(filename, "rb");
if (file == NULL)
{
printf("can't open file %s!!!", filename);
exit(-1);
}
else
{
fseek(file, 0, SEEK_END);
file_size = ftell(file);
fseek(file, 0, SEEK_SET);
if ((file_size > size) || (file_size == 0))
file_size = size;
printf("Reading IQ samples from file: File Size: %d [Buffer Size: %d]\n", file_size, size);
num = fread(pBuffer, buffers_num, size, file);
fflush(file);
fclose(file);
printf("from addr (0x%lx) size (%d) bytes num (%d)", (uint64_t)pBuffer, file_size, num);
}
printf(" \n");
}
else
{
printf(" the file name, buffer name are not set!!!");
}
}
else
{
printf(" the %s is free: size = %d bytes!!!", bufname, size);
}
return num;
}
//------------------------------------------------------------------------
void xran_fh_rx_callback(void *pCallbackTag, xran_status_t status){ void xran_fh_rx_callback(void *pCallbackTag, xran_status_t status){
rte_pause(); rte_pause();
} }
...@@ -39,25 +104,125 @@ void xran_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status){ ...@@ -39,25 +104,125 @@ void xran_fh_rx_prach_callback(void *pCallbackTag, xran_status_t status){
rte_pause(); rte_pause();
} }
int physide_dl_tti_call_back(void * param)
{
rte_pause();
return 0;
}
int physide_ul_half_slot_call_back(void * param)
{
rte_pause();
return 0;
}
int physide_ul_full_slot_call_back(void * param)
{
rte_pause();
return 0;
}
//------------------------------------------------------------------------
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif #endif
int start_oran(){ void* define_oran_pointer(){
//xranLibWraper *xranlib = malloc(sizeof(xranLibWraper));
xranLibWraper *xranlib; xranLibWraper *xranlib;
xranlib = new xranLibWraper; xranlib = new xranLibWraper;
//xranLibWraper *xranlib = (xranLibWraper*) calloc(1,sizeof(xranLibWraper));
return xranlib;
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int setup_oran( void *xranlib_ ){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
if(xranlib->SetUp() < 0) { if(xranlib->SetUp() < 0) {
return (-1); return (-1);
} }
xranlib->Init(); return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran_callback(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Open(nullptr, xranlib->Open(nullptr,
nullptr, nullptr,
(void *)xran_fh_rx_callback, (void *)xran_fh_rx_callback,
(void *)xran_fh_rx_prach_callback, (void *)xran_fh_rx_prach_callback,
(void *)xran_fh_srs_callback); (void *)xran_fh_srs_callback);
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
struct xran_fh_config *pCfg = (struct xran_fh_config*) malloc(sizeof(struct xran_fh_config));
assert(pCfg != NULL);
xranlib->get_cfg_fh(pCfg);
xran_open(xranlib->get_xranhandle(),pCfg);
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int initialize_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Init();
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int start_oran(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xranlib->Start(); xranlib->Start();
return (0); return (0);
...@@ -68,8 +233,259 @@ int start_oran(){ ...@@ -68,8 +233,259 @@ int start_oran(){
#endif #endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int register_physide_callbacks(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_dl_tti_call_back, NULL, 10, XRAN_CB_TTI);
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_half_slot_call_back, NULL, 10, XRAN_CB_HALF_SLOT_RX);
xran_reg_physide_cb(xranlib->get_xranhandle(), physide_ul_full_slot_call_back, NULL, 10, XRAN_CB_FULL_SLOT_RX);
return (0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int load_iq_from_file(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
int numCCPorts_ = xranlib->get_num_cc();
int num_eAxc_ = xranlib->get_num_eaxc();
printf("numCCPorts_ =%d, num_eAxc_=%d, MAX_ANT_CARRIER_SUPPORTED =%d\n",numCCPorts_,num_eAxc_,MAX_ANT_CARRIER_SUPPORTED);
int i;
char *IQ_filename[MAX_ANT_CARRIER_SUPPORTED];
for(i=0; i<MAX_ANT_CARRIER_SUPPORTED; i++){
if( (i==0) || (i==1) || (i==2) || (i==3) ){
IQ_filename[0] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_0.bin";
IQ_filename[1] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_1.bin";
IQ_filename[2] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_2.bin";
IQ_filename[3] = "/home/oba/PISONS/phy/fhi_lib/app/usecase/mu0_5mhz/ant_3.bin";
}else{
IQ_filename[i] = "";
}
}
int32_t number_slots = 40; // According to wrapper.hpp uint32_t m_nSlots = 10; but for the file 5MHz is set to 40
uint32_t numerology = xranlib->get_numerology(); // According to the conf file is mu number
uint32_t bandwidth = 5; // According to the wrapper.hpp since we are reading the 5MHz files
uint32_t sub6 = xranlib->get_sub6();
iq_playback_buffer_size_dl = (number_slots * N_SYM_PER_SLOT * N_SC_PER_PRB * xranlib->get_num_rbs(numerology,bandwidth,sub6)*4L);
for(i = 0; i < MAX_ANT_CARRIER_SUPPORTED && i < (uint32_t)(numCCPorts_ * num_eAxc_); i++) {
if(((uint8_t *)IQ_filename[i])[0]!=0){
p_tx_play_buffer[i] = (int16_t*)malloc(iq_playback_buffer_size_dl);
assert (NULL != (p_tx_play_buffer[i]));
tx_play_buffer_size[i] = (int32_t)iq_playback_buffer_size_dl;
printf("Loading file [%d] %s \n",i,IQ_filename[i]);
tx_play_buffer_size[i] = sys_load_file_to_buff( IQ_filename[i],
"DL IFFT IN IQ Samples in binary format",
(uint8_t*) p_tx_play_buffer[i],
tx_play_buffer_size[i],
1);
tx_play_buffer_position[i] = 0;
} else {
p_tx_play_buffer[i]=(int16_t*)malloc(iq_playback_buffer_size_dl);
tx_play_buffer_size[i]=0;
tx_play_buffer_position[i] = 0;
}
}
return(0);
}
#ifdef __cplusplus
}
#endif
//------------------------------------------------------------------------
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_tx_send_buffer(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
int32_t flowId;
void *ptr = NULL;
char *pos = NULL;
p_xran_dev_ctx_2 = xran_dev_get_ctx();
if (p_xran_dev_ctx_2 != NULL){
printf("p_xran_dev_ctx_2=%d\n",p_xran_dev_ctx_2);
}
int num_eaxc = xranlib->get_num_eaxc();
int num_eaxc_ul = xranlib->get_num_eaxc_ul();
uint32_t xran_max_antenna_nr = RTE_MAX(num_eaxc, num_eaxc_ul);
int ant_el_trx = xranlib->get_num_antelmtrx();
uint32_t xran_max_ant_array_elm_nr = RTE_MAX(ant_el_trx, xran_max_antenna_nr);
int32_t nSectorIndex[XRAN_MAX_SECTOR_NR];
int32_t nSectorNum;
for (nSectorNum = 0; nSectorNum < XRAN_MAX_SECTOR_NR; nSectorNum++)
{
nSectorIndex[nSectorNum] = nSectorNum;
}
nSectorNum = xranlib->get_num_cc();
int maxflowid = num_eaxc * (nSectorNum-1) + (xran_max_antenna_nr-1);
printf("the maximum flowID will be=%d\n",maxflowid);
for(uint16_t cc_id=0; cc_id<nSectorNum; cc_id++){
for(int32_t tti = 0; tti < XRAN_N_FE_BUF_LEN; tti++) {
for(uint8_t ant_id = 0; ant_id < xran_max_antenna_nr; ant_id++){
for(int32_t sym_idx = 0; sym_idx < XRAN_NUM_OF_SYMBOL_PER_SLOT; sym_idx++) {
flowId = num_eaxc * cc_id + ant_id;
uint8_t *pData = p_xran_dev_ctx_2->sFrontHaulTxBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers[sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT].pData;
uint8_t *pPrbMapData = p_xran_dev_ctx_2->sFrontHaulTxPrbMapBbuIoBufCtrl[tti % XRAN_N_FE_BUF_LEN][cc_id][ant_id].sBufferList.pBuffers->pData;
struct xran_prb_map *pPrbMap = (struct xran_prb_map *)pPrbMapData;
ptr = pData;
pos = ((char*)p_tx_play_buffer[flowId]) + tx_play_buffer_position[flowId];
uint8_t *u8dptr;
struct xran_prb_map *pRbMap = pPrbMap;
int32_t sym_id = sym_idx%XRAN_NUM_OF_SYMBOL_PER_SLOT;
if(ptr && pos){
int idxElm = 0;
u8dptr = (uint8_t*)ptr;
int16_t payload_len = 0;
uint8_t *dst = (uint8_t *)u8dptr;
uint8_t *src = (uint8_t *)pos;
struct xran_prb_elm* p_prbMapElm = &pRbMap->prbMap[idxElm];
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
for (idxElm = 0; idxElm < pRbMap->nPrbElm; idxElm++) {
struct xran_section_desc *p_sec_desc = NULL;
p_prbMapElm = &pRbMap->prbMap[idxElm];
p_sec_desc = p_prbMapElm->p_sec_desc[sym_id];
if(p_sec_desc == NULL){
printf ("p_sec_desc == NULL\n");
exit(-1);
}
src = (uint8_t *)(pos + p_prbMapElm->nRBStart*N_SC_PER_PRB*4L);
if(p_prbMapElm->compMethod == XRAN_COMPMETHOD_NONE) {
payload_len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
rte_memcpy(dst, src, payload_len);
} else if (p_prbMapElm->compMethod == XRAN_COMPMETHOD_BLKFLOAT) {
printf("idxElm=%d, compMeth==BLKFLOAT\n",idxElm);
struct xranlib_compress_request bfp_com_req;
struct xranlib_compress_response bfp_com_rsp;
memset(&bfp_com_req, 0, sizeof(struct xranlib_compress_request));
memset(&bfp_com_rsp, 0, sizeof(struct xranlib_compress_response));
bfp_com_req.data_in = (int16_t*)src;
bfp_com_req.numRBs = p_prbMapElm->nRBSize;
bfp_com_req.len = p_prbMapElm->nRBSize*N_SC_PER_PRB*4L;
bfp_com_req.compMethod = p_prbMapElm->compMethod;
bfp_com_req.iqWidth = p_prbMapElm->iqWidth;
bfp_com_rsp.data_out = (int8_t*)dst;
bfp_com_rsp.len = 0;
xranlib_compress_avx512(&bfp_com_req, &bfp_com_rsp);
payload_len = bfp_com_rsp.len;
}else {
printf ("p_prbMapElm->compMethod == %d is not supported\n",
p_prbMapElm->compMethod);
exit(-1);
}
p_sec_desc->iq_buffer_offset = RTE_PTR_DIFF(dst, u8dptr);
p_sec_desc->iq_buffer_len = payload_len;
dst += payload_len;
dst = xran_add_hdr_offset(dst, p_prbMapElm->compMethod);
}
} else {
exit(-1);
printf("ptr ==NULL\n");
}
}
}
}
}
return(0);
}
#ifdef __cplusplus
}
#endif
//-----------------------------------------------------------------------
int64_t count_sec =0;
struct xran_common_counters x_counters;
uint64_t nTotalTime;
uint64_t nUsedTime;
uint32_t nCoreUsed;
float nUsedPercent;
long old_rx_counter = 0;
long old_tx_counter = 0;
#ifdef __cplusplus
extern "C"
{
#endif
int compute_xran_statistics(void *xranlib_){
xranLibWraper *xranlib = ((xranLibWraper *) xranlib_);
if(xran_get_common_counters(xranlib->get_xranhandle(), &x_counters) == XRAN_STATUS_SUCCESS) {
xran_get_time_stats(&nTotalTime, &nUsedTime, &nCoreUsed, 1);
nUsedPercent = ((float)nUsedTime * 100.0) / (float)nTotalTime;
printf("[rx %7ld pps %7ld kbps %7ld][tx %7ld pps %7ld kbps %7ld] [on_time %ld early %ld late %ld corrupt %ld pkt_dupl %ld Total %ld] IO Util: %5.2f %%\n",
x_counters.rx_counter,
x_counters.rx_counter-old_rx_counter,
x_counters.rx_bytes_per_sec*8/1000L,
x_counters.tx_counter,
x_counters.tx_counter-old_tx_counter,
x_counters.tx_bytes_per_sec*8/1000L,
x_counters.Rx_on_time,
x_counters.Rx_early,
x_counters.Rx_late,
x_counters.Rx_corrupt,
x_counters.Rx_pkt_dupl,
x_counters.Total_msgs_rcvd,
nUsedPercent);
if(x_counters.rx_counter > old_rx_counter)
old_rx_counter = x_counters.rx_counter;
if(x_counters.tx_counter > old_tx_counter)
old_tx_counter = x_counters.tx_counter;
} else {
printf("error xran_get_common_counters\n");
return(1);
}
return (0);
}
#ifdef __cplusplus
}
#endif
......
...@@ -27,6 +27,9 @@ ...@@ -27,6 +27,9 @@
#include "low_oran.h" #include "low_oran.h"
#include "oran_isolate.h" #include "oran_isolate.h"
#include "common/utils/LOG/log.h"
#include "common/utils/LOG/vcd_signal_dumper.h"
typedef struct { typedef struct {
eth_state_t e; eth_state_t e;
shared_buffers buffers; shared_buffers buffers;
...@@ -38,13 +41,6 @@ typedef struct { ...@@ -38,13 +41,6 @@ typedef struct {
int trx_oran_start(openair0_device *device) int trx_oran_start(openair0_device *device)
{ {
int oran_start_ret = start_oran();
if(oran_start_ret!=0){
return oran_start_ret;
}
printf("ORAN: %s\n", __FUNCTION__); printf("ORAN: %s\n", __FUNCTION__);
return 0; return 0;
} }
...@@ -114,17 +110,132 @@ int trx_oran_read_raw(openair0_device *device, ...@@ -114,17 +110,132 @@ int trx_oran_read_raw(openair0_device *device,
return 0; return 0;
} }
char *msg_type(int t)
{
static char *s[12] = {
"RAU_tick",
"RRU_capabilities",
"RRU_config",
"RRU_config_ok",
"RRU_start",
"RRU_stop",
"RRU_sync_ok",
"RRU_frame_resynch",
"RRU_MSG_max_num",
"RRU_check_sync",
"RRU_config_update",
"RRU_config_update_ok",
};
if (t < 0 || t > 11) return "UNKNOWN";
return s[t];
}
int trx_oran_ctlsend(openair0_device *device, void *msg, ssize_t msg_len) int trx_oran_ctlsend(openair0_device *device, void *msg, ssize_t msg_len)
{ {
RRU_CONFIG_msg_t *rru_config_msg = msg;
oran_eth_state_t *s = device->priv;
printf("ORAN: %s\n", __FUNCTION__);
printf(" rru_config_msg->type %d [%s]\n", rru_config_msg->type,
msg_type(rru_config_msg->type));
s->last_msg = rru_config_msg->type;
return msg_len;
return 0;
} }
int trx_oran_ctlrecv(openair0_device *device, void *msg, ssize_t msg_len) int trx_oran_ctlrecv(openair0_device *device, void *msg, ssize_t msg_len)
{ {
RRU_CONFIG_msg_t *rru_config_msg = msg;
oran_eth_state_t *s = device->priv;
printf("ORAN: %s\n", __FUNCTION__);
if (s->last_msg == RAU_tick && s->capabilities_sent == 0) {
printf("Oran RAU_tick and capabilities sent\n");
RRU_capabilities_t *cap;
rru_config_msg->type = RRU_capabilities;
rru_config_msg->len = sizeof(RRU_CONFIG_msg_t)-MAX_RRU_CONFIG_SIZE+sizeof(RRU_capabilities_t);
cap = (RRU_capabilities_t*)&rru_config_msg->msg[0];
cap->FH_fmt = OAI_IF4p5_only;
cap->num_bands = 1;
cap->band_list[0] = 7;
cap->nb_rx[0] = device->openair0_cfg->rx_num_channels;
cap->nb_tx[0] = device->openair0_cfg->tx_num_channels;
cap->max_pdschReferenceSignalPower[0] = -27;
cap->max_rxgain[0] = 90;
s->capabilities_sent = 1;
return rru_config_msg->len;
}
if (s->last_msg == RRU_config) {
printf("Oran RRU_config\n");
rru_config_msg->type = RRU_config_ok;
return 0; return 0;
}
if (s->last_msg == RRU_start) {
// Folllow the same steps as in the wrapper
printf("Oran RRU_start\n");
// SetUp
if ( setup_oran(s->oran_priv) !=0 ){
printf("%s:%d:%s: SetUp ORAN failed ... Exit\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}else{
printf("SetUp ORAN. Done\n");
}
// Load the IQ samples from file
load_iq_from_file(s->oran_priv);
printf("Load IQ from file. Done\n");
// Register physide callbacks
register_physide_callbacks(s->oran_priv);
printf("Register physide callbacks. Done\n");
// Open callbacks
open_oran_callback(s->oran_priv);
printf("Open Oran callbacks. Done\n");
// Init ORAN
initialize_oran(s->oran_priv);
printf("Init Oran. Done\n");
// Copy the loaded IQ to the xran buffer fro the tx
xran_fh_tx_send_buffer(s->oran_priv);
printf("ORAN FH send tx buffer filled in with loaded IQs. Done\n");
// Open ORAN
open_oran(s->oran_priv);
printf("xran_open. Done\n");
// Start ORAN
if ( start_oran(s->oran_priv) !=0 ){
printf("%s:%d:%s: Start ORAN failed ... Exit\n",
__FILE__, __LINE__, __FUNCTION__);
exit(1);
}else{
printf("Start ORAN. Done\n");
}
// Once xran library and thread started compute the statistics
while(1){
sleep(1);
compute_xran_statistics(s->oran_priv);
}
}
return(0);
} }
/*This function reads the IQ samples from OAI, symbol by symbol. /*This function reads the IQ samples from OAI, symbol by symbol.
...@@ -134,62 +245,67 @@ void oran_fh_if4p5_south_in(RU_t *ru, ...@@ -134,62 +245,67 @@ void oran_fh_if4p5_south_in(RU_t *ru,
int *frame, int *frame,
int *subframe) int *subframe)
{ {
oran_eth_state_t *s = (oran_eth_state_t *) ru->ifdevice.priv; printf("ORAN: %s for UL. frame=%d, subframe=%d, \n", __FUNCTION__,frame,subframe);
oran_eth_state_t *s = ru->ifdevice.priv;
PHY_VARS_eNB **eNB_list = ru->eNB_list, *eNB; PHY_VARS_eNB **eNB_list = ru->eNB_list, *eNB;
LTE_DL_FRAME_PARMS *fp; LTE_DL_FRAME_PARMS *fp;
int symbol; int symbol;
int32_t *rxdata; int32_t *rxdata;
int antenna = 0; int antenna;
printf("Ann: oran_fh_if4p5_south_in\n");
lock_buffers(&s->buffers, *subframe); lock_ul_buffer(&s->buffers, *subframe);
next: next:
while (!(s->buffers.ul_busy[*subframe] == 0x3fff || while (!((s->buffers.ul_busy[0][*subframe] == 0x3fff &&
s->buffers.ul_busy[1][*subframe] == 0x3fff) ||
s->buffers.prach_busy[*subframe] == 1)) s->buffers.prach_busy[*subframe] == 1))
wait_buffers(&s->buffers, *subframe); wait_ul_buffer(&s->buffers, *subframe);
if (s->buffers.prach_busy[*subframe] == 1) { if (s->buffers.prach_busy[*subframe] == 1) {
int i; int i;
int antenna = 0; int antenna = 0;
uint16_t *in; uint16_t *in;
uint16_t *out; uint16_t *out;
in = (uint16_t *)s->buffers.prach[*subframe]; in = (uint16_t *)s->buffers.prach[*subframe];
out = (uint16_t *)ru->prach_rxsigF[antenna]; out = (uint16_t *)ru->prach_rxsigF[0][antenna];
for (i = 0; i < 849; i++) for (i = 0; i < 840*2; i++)
out[i] = ntohs(in[i]); out[i] = ntohs(in[i]);
s->buffers.prach_busy[*subframe] = 0; s->buffers.prach_busy[*subframe] = 0;
ru->wakeup_prach_eNB(ru->eNB_list[0], ru, *frame, *subframe); ru->wakeup_prach_eNB(ru->eNB_list[0], ru, *frame, *subframe);
goto next; goto next;
} }
eNB = eNB_list[0]; eNB = eNB_list[0];
fp = &eNB->frame_parms; fp = &eNB->frame_parms;
for (antenna = 0; antenna < ru->nb_rx; antenna++) {
for (symbol = 0; symbol < 14; symbol++) { for (symbol = 0; symbol < 14; symbol++) {
int i; int i;
uint16_t *p = (uint16_t *)(&s->buffers.ul[*subframe][symbol*1200*4]); uint16_t *p = (uint16_t *)(&s->buffers.ul[antenna][*subframe][symbol*1200*4]);
for (i = 0; i < 1200*2; i++) { for (i = 0; i < 1200*2; i++) {
p[i] = htons(p[i]); p[i] = htons(p[i]);
} }
rxdata = &ru->common.rxdataF[antenna][symbol * fp->ofdm_symbol_size]; rxdata = &ru->common.rxdataF[antenna][symbol * fp->ofdm_symbol_size];
#if 1 #if 1
memcpy(rxdata + 2048 - 600, memcpy(rxdata + 2048 - 600,
&s->buffers.ul[*subframe][symbol*1200*4], &s->buffers.ul[antenna][*subframe][symbol*1200*4],
600 * 4); 600 * 4);
memcpy(rxdata, memcpy(rxdata,
&s->buffers.ul[*subframe][symbol*1200*4] + 600*4, &s->buffers.ul[antenna][*subframe][symbol*1200*4] + 600*4,
600 * 4); 600 * 4);
#endif #endif
} }
}
s->buffers.ul_busy[*subframe] = 0; s->buffers.ul_busy[0][*subframe] = 0;
signal_buffers(&s->buffers, *subframe); s->buffers.ul_busy[1][*subframe] = 0;
unlock_buffers(&s->buffers, *subframe); signal_ul_buffer(&s->buffers, *subframe);
unlock_ul_buffer(&s->buffers, *subframe);
//printf("BENETEL: %s (f.sf %d.%d)\n", __FUNCTION__, *frame, *subframe);
RU_proc_t *proc = &ru->proc; RU_proc_t *proc = &ru->proc;
extern uint16_t sf_ahead; extern uint16_t sf_ahead;
int f = *frame; int f = *frame;
int sf = *subframe; int sf = *subframe;
//calculate timestamp_rx, timestamp_tx based on frame and subframe
proc->tti_rx = sf; proc->tti_rx = sf;
proc->frame_rx = f; proc->frame_rx = f;
proc->timestamp_rx = ((proc->frame_rx * 10) + proc->tti_rx ) * fp->samples_per_tti ; proc->timestamp_rx = ((proc->frame_rx * 10) + proc->tti_rx ) * fp->samples_per_tti ;
...@@ -198,6 +314,13 @@ next: ...@@ -198,6 +314,13 @@ next:
proc->tti_tx = (sf+sf_ahead)%10; proc->tti_tx = (sf+sf_ahead)%10;
proc->frame_tx = (sf>(9-sf_ahead)) ? (f+1)&1023 : f; proc->frame_tx = (sf>(9-sf_ahead)) ? (f+1)&1023 : f;
} }
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_IF4P5_SOUTH_IN_RU+ru->idx,f);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_IF4P5_SOUTH_IN_RU+ru->idx,sf);
proc->symbol_mask[sf] = 0;
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff);
} }
...@@ -206,54 +329,65 @@ void oran_fh_if4p5_south_out(RU_t *ru, ...@@ -206,54 +329,65 @@ void oran_fh_if4p5_south_out(RU_t *ru,
int subframe, int subframe,
uint64_t timestamp) uint64_t timestamp)
{ {
oran_eth_state_t *s = (oran_eth_state_t *) ru->ifdevice.priv;
printf("ORAN: %s for DL. frame=%d, subframe=%d, \n", __FUNCTION__,frame,subframe);
oran_eth_state_t *s = ru->ifdevice.priv;
PHY_VARS_eNB **eNB_list = ru->eNB_list, *eNB; PHY_VARS_eNB **eNB_list = ru->eNB_list, *eNB;
LTE_DL_FRAME_PARMS *fp; LTE_DL_FRAME_PARMS *fp;
int symbol; int symbol;
int32_t *txdata; int32_t *txdata;
int aa = 0; int aa;
printf("Ann: oran_fh_if4p5_south_out\n");
//printf("BENETEL: %s (f.sf %d.%d ts %ld)\n", __FUNCTION__, frame, subframe, timestamp); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
lock_buffers(&s->buffers, subframe); lock_dl_buffer(&s->buffers, subframe);
if (s->buffers.dl_busy[subframe]) { if (s->buffers.dl_busy[0][subframe] ||
s->buffers.dl_busy[1][subframe]) {
printf("%s: fatal: DL buffer busy for subframe %d\n", __FUNCTION__, subframe); printf("%s: fatal: DL buffer busy for subframe %d\n", __FUNCTION__, subframe);
exit(1); unlock_dl_buffer(&s->buffers, subframe);
return;
} }
eNB = eNB_list[0]; eNB = eNB_list[0];
fp = &eNB->frame_parms; fp = &eNB->frame_parms;
if (ru->num_eNB != 1 || ru->nb_tx != 1 || fp->ofdm_symbol_size != 2048 || if (ru->num_eNB != 1 || fp->ofdm_symbol_size != 2048 ||
fp->Ncp != NORMAL || fp->symbols_per_tti != 14) { fp->Ncp != NORMAL || fp->symbols_per_tti != 14) {
printf("%s:%d:%s: unsupported configuration\n", printf("%s:%d:%s: unsupported configuration\n",
__FILE__, __LINE__, __FUNCTION__); __FILE__, __LINE__, __FUNCTION__);
exit(1); exit(1);
} }
for (aa = 0; aa < ru->nb_tx; aa++) {
for (symbol = 0; symbol < 14; symbol++) { for (symbol = 0; symbol < 14; symbol++) {
txdata = &ru->common.txdataF_BF[aa][symbol * fp->ofdm_symbol_size]; txdata = &ru->common.txdataF_BF[aa][symbol * fp->ofdm_symbol_size];
#if 1 #if 1
memcpy(&s->buffers.dl[subframe][symbol*1200*4], memcpy(&s->buffers.dl[aa][subframe][symbol*1200*4],
txdata + 2048 - 600, txdata + 2048 - 600,
600 * 4); 600 * 4);
memcpy(&s->buffers.dl[subframe][symbol*1200*4] + 600*4, memcpy(&s->buffers.dl[aa][subframe][symbol*1200*4] + 600*4,
txdata + 1, txdata + 1,
600 * 4); 600 * 4);
#endif #endif
int i; int i;
uint16_t *p = (uint16_t *)(&s->buffers.dl[subframe][symbol*1200*4]); uint16_t *p = (uint16_t *)(&s->buffers.dl[aa][subframe][symbol*1200*4]);
for (i = 0; i < 1200*2; i++) { for (i = 0; i < 1200*2; i++) {
p[i] = htons(p[i]); p[i] = htons(p[i]);
} }
} }
}
s->buffers.dl_busy[0][subframe] = 0x3fff;
s->buffers.dl_busy[1][subframe] = 0x3fff;
unlock_dl_buffer(&s->buffers, subframe);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_IF4P5_SOUTH_OUT_RU+ru->idx, ru->proc.frame_tx);
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_IF4P5_SOUTH_OUT_RU+ru->idx, ru->proc.tti_tx);
s->buffers.dl_busy[subframe] = 0x3fff;
unlock_buffers(&s->buffers, subframe);
} }
void *get_internal_parameter(char *name) void *get_internal_parameter(char *name)
{ {
printf("BENETEL: %s\n", __FUNCTION__); printf("ORAN: %s\n", __FUNCTION__);
if (!strcmp(name, "fh_if4p5_south_in")) if (!strcmp(name, "fh_if4p5_south_in"))
return (void *) oran_fh_if4p5_south_in; return (void *) oran_fh_if4p5_south_in;
...@@ -270,6 +404,7 @@ int transport_init(openair0_device *device, ...@@ -270,6 +404,7 @@ int transport_init(openair0_device *device,
eth_params_t * eth_params ) eth_params_t * eth_params )
{ {
oran_eth_state_t *eth; oran_eth_state_t *eth;
printf("Ann: ORANNN\n"); printf("Ann: ORANNN\n");
printf("ORAN: %s\n", __FUNCTION__); printf("ORAN: %s\n", __FUNCTION__);
...@@ -300,6 +435,7 @@ int transport_init(openair0_device *device, ...@@ -300,6 +435,7 @@ int transport_init(openair0_device *device,
eth->e.flags = ETH_RAW_IF4p5_MODE; eth->e.flags = ETH_RAW_IF4p5_MODE;
eth->e.compression = NO_COMPRESS; eth->e.compression = NO_COMPRESS;
eth->e.if_name = eth_params->local_if_name; eth->e.if_name = eth_params->local_if_name;
eth->oran_priv = define_oran_pointer();
device->priv = eth; device->priv = eth;
device->openair0_cfg=&openair0_cfg[0]; device->openair0_cfg=&openair0_cfg[0];
......
...@@ -31,10 +31,104 @@ extern "C" ...@@ -31,10 +31,104 @@ extern "C"
{ {
#endif #endif
int start_oran(); void* define_oran_pointer();
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#ifdef __cplusplus
extern "C"
{
#endif
int setup_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran_callback( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int open_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int initialize_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int start_oran( void *xranlib_ );
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int register_physide_callbacks(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int load_iq_from_file(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int xran_fh_tx_send_buffer(void *xranlib_);
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
extern "C"
{
#endif
int compute_xran_statistics(void *xranlib_);
#ifdef __cplusplus
}
#endif
#endif /* _ORAN_ISOLATE_H_ */ #endif /* _ORAN_ISOLATE_H_ */
...@@ -24,9 +24,10 @@ ...@@ -24,9 +24,10 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#if 0
void init_buffers(shared_buffers *s) void init_buffers(shared_buffers *s)
{ {
int subframe; int subframe;
memset(s, 0, sizeof(*s)); memset(s, 0, sizeof(*s));
...@@ -45,8 +46,9 @@ void init_buffers(shared_buffers *s) ...@@ -45,8 +46,9 @@ void init_buffers(shared_buffers *s)
s->dl_busy[1] = 0x3fff; s->dl_busy[1] = 0x3fff;
s->dl_busy[2] = 0x3fff; s->dl_busy[2] = 0x3fff;
s->dl_busy[3] = 0x3fff; s->dl_busy[3] = 0x3fff;
} }
/*
void lock_buffers(shared_buffers *s, int subframe) void lock_buffers(shared_buffers *s, int subframe)
{ {
if (pthread_mutex_lock(&s->m[subframe]) != 0) { if (pthread_mutex_lock(&s->m[subframe]) != 0) {
...@@ -78,4 +80,96 @@ void signal_buffers(shared_buffers *s, int subframe) ...@@ -78,4 +80,96 @@ void signal_buffers(shared_buffers *s, int subframe)
exit(1); exit(1);
} }
} }
*/ #endif
void init_buffers(shared_buffers *s)
{
int subframe;
memset(s, 0, sizeof(*s));
for (subframe = 0; subframe < 10; subframe++) {
if (pthread_mutex_init(&s->m_dl[subframe], NULL) != 0 ||
pthread_cond_init(&s->c_dl[subframe], NULL) != 0 ||
pthread_mutex_init(&s->m_ul[subframe], NULL) != 0 ||
pthread_cond_init(&s->c_ul[subframe], NULL) != 0) {
printf("%s: error initializing mutex/cond\n", __FUNCTION__);
exit(1);
}
}
/* in FDD the eNB's first transmitted DL subframe is 4 but the device
* * needs to have subframes 1, 2 and 3 ready. Let's pretend there are ready.
* */
s->dl_busy[0][1] = 0x3fff;
s->dl_busy[0][2] = 0x3fff;
s->dl_busy[0][3] = 0x3fff;
s->dl_busy[1][1] = 0x3fff;
s->dl_busy[1][2] = 0x3fff;
s->dl_busy[1][3] = 0x3fff;
}
void lock_dl_buffer(shared_buffers *s, int subframe)
{
if (pthread_mutex_lock(&s->m_dl[subframe]) != 0) {
printf("%s: fatal: lock fails\n", __FUNCTION__);
exit(1);
}
}
void unlock_dl_buffer(shared_buffers *s, int subframe)
{
if (pthread_mutex_unlock(&s->m_dl[subframe]) != 0) {
printf("%s: fatal: unlock fails\n", __FUNCTION__);
exit(1);
}
}
void wait_dl_buffer(shared_buffers *s, int subframe)
{
if (pthread_cond_wait(&s->c_dl[subframe], &s->m_dl[subframe]) != 0) {
printf("%s: fatal: cond_wait fails\n", __FUNCTION__);
exit(1);
}
}
void signal_dl_buffer(shared_buffers *s, int subframe)
{
if (pthread_cond_broadcast(&s->c_dl[subframe]) != 0) {
printf("%s: fatal: cond_broadcast fails\n", __FUNCTION__);
exit(1);
}
}
void lock_ul_buffer(shared_buffers *s, int subframe)
{
if (pthread_mutex_lock(&s->m_ul[subframe]) != 0) {
printf("%s: fatal: lock fails\n", __FUNCTION__);
exit(1);
}
}
void unlock_ul_buffer(shared_buffers *s, int subframe)
{
if (pthread_mutex_unlock(&s->m_ul[subframe]) != 0) {
printf("%s: fatal: unlock fails\n", __FUNCTION__);
exit(1);
}
}
void wait_ul_buffer(shared_buffers *s, int subframe)
{
if (pthread_cond_wait(&s->c_ul[subframe], &s->m_ul[subframe]) != 0) {
printf("%s: fatal: cond_wait fails\n", __FUNCTION__);
exit(1);
}
}
void signal_ul_buffer(shared_buffers *s, int subframe)
{
if (pthread_cond_broadcast(&s->c_ul[subframe]) != 0) {
printf("%s: fatal: cond_broadcast fails\n", __FUNCTION__);
exit(1);
}
}
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <pthread.h> #include <pthread.h>
#include <stdint.h> #include <stdint.h>
#if 0
typedef struct { typedef struct {
unsigned char dl[10][14*1200*4]; unsigned char dl[10][14*1200*4];
unsigned char ul[10][14*1200*4]; unsigned char ul[10][14*1200*4];
...@@ -48,4 +49,76 @@ void unlock_buffers(shared_buffers *s, int subframe); ...@@ -48,4 +49,76 @@ void unlock_buffers(shared_buffers *s, int subframe);
void wait_buffers(shared_buffers *s, int subframe); void wait_buffers(shared_buffers *s, int subframe);
void signal_buffers(shared_buffers *s, int subframe); void signal_buffers(shared_buffers *s, int subframe);
typedef struct {
/* [2] is for two antennas */
unsigned char dl[2][10][14*1200*4];
unsigned char ul[2][10][14*1200*4];
uint16_t dl_busy[2][10];
uint16_t ul_busy[2][10];
pthread_mutex_t m_ul[10];
pthread_cond_t c_ul[10];
pthread_mutex_t m_dl[10];
pthread_cond_t c_dl[10];
unsigned char prach[10][849*4];
unsigned char prach_busy[10];
/* statistics/error counting */
int ul_overflow;
int dl_underflow;
} shared_buffers;
void init_buffers(shared_buffers *s);
void lock_dl_buffer(shared_buffers *s, int subframe);
void unlock_dl_buffer(shared_buffers *s, int subframe);
void wait_dl_buffer(shared_buffers *s, int subframe);
void signal_dl_buffer(shared_buffers *s, int subframe);
void lock_ul_buffer(shared_buffers *s, int subframe);
void unlock_ul_buffer(shared_buffers *s, int subframe);
void wait_ul_buffer(shared_buffers *s, int subframe);
void signal_ul_buffer(shared_buffers *s, int subframe);
#endif
typedef struct {
/* [2] is for two antennas */
unsigned char dl[2][10][14*1200*4];
unsigned char ul[2][10][14*1200*4];
uint16_t dl_busy[2][10];
uint16_t ul_busy[2][10];
pthread_mutex_t m_ul[10];
pthread_cond_t c_ul[10];
pthread_mutex_t m_dl[10];
pthread_cond_t c_dl[10];
unsigned char prach[10][849*4];
unsigned char prach_busy[10];
/* statistics/error counting */
int ul_overflow;
int dl_underflow;
} shared_buffers;
void init_buffers(shared_buffers *s);
void lock_dl_buffer(shared_buffers *s, int subframe);
void unlock_dl_buffer(shared_buffers *s, int subframe);
void wait_dl_buffer(shared_buffers *s, int subframe);
void signal_dl_buffer(shared_buffers *s, int subframe);
void lock_ul_buffer(shared_buffers *s, int subframe);
void unlock_ul_buffer(shared_buffers *s, int subframe);
void wait_ul_buffer(shared_buffers *s, int subframe);
void signal_ul_buffer(shared_buffers *s, int subframe);
#endif /* _SHARED_BUFFERS_H_ */ #endif /* _SHARED_BUFFERS_H_ */
...@@ -62,6 +62,10 @@ public: ...@@ -62,6 +62,10 @@ public:
XRANFTHRX_PRB_MAP_IN, XRANFTHRX_PRB_MAP_IN,
XRANFTHTX_SEC_DESC_IN, XRANFTHTX_SEC_DESC_IN,
XRANFTHRACH_IN, XRANFTHRACH_IN,
#if 1
// Sofia add this entry as in sample app
XRANSRS_IN,
#endif
MAX_SW_XRAN_INTERFACE_NUM MAX_SW_XRAN_INTERFACE_NUM
} SWXRANInterfaceTypeEnum; } SWXRANInterfaceTypeEnum;
...@@ -99,8 +103,8 @@ protected: ...@@ -99,8 +103,8 @@ protected:
void *m_xranhandle; void *m_xranhandle;
uint8_t m_du_mac[6] = { 0x00,0x11, 0x22, 0x33, 0x44, 0x66 }; uint8_t m_du_mac[6] = { 0x00,0x11, 0x22, 0x33, 0x44, 0x55 }; // Sofia: this is hard coded here and then it is read from the conf file
uint8_t m_ru_mac[6] = { 0x00,0x11, 0x22, 0x33, 0x44, 0x55 }; uint8_t m_ru_mac[6] = { 0x00,0x11, 0x22, 0x33, 0x44, 0x66 }; // Sofia: this is hard coded here and then it is read from the conf file
bool m_bSub6; bool m_bSub6;
uint32_t m_nSlots = 10; uint32_t m_nSlots = 10;
...@@ -118,6 +122,7 @@ protected: ...@@ -118,6 +122,7 @@ protected:
BbuIoBufCtrlStruct m_sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; BbuIoBufCtrlStruct m_sFrontHaulRxPrbMapBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
BbuIoBufCtrlStruct m_sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR]; BbuIoBufCtrlStruct m_sFHPrachRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANTENNA_NR];
/* Cat B */ /* Cat B */
BbuIoBufCtrlStruct m_sFHSrsRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR]; BbuIoBufCtrlStruct m_sFHSrsRxBbuIoBufCtrl[XRAN_N_FE_BUF_LEN][XRAN_MAX_SECTOR_NR][XRAN_MAX_ANT_ARRAY_ELM_NR];
...@@ -206,11 +211,15 @@ private: ...@@ -206,11 +211,15 @@ private:
std::cout << "Failed at XRAN front haul xran_mm_init" << std::endl; std::cout << "Failed at XRAN front haul xran_mm_init" << std::endl;
return (-1); return (-1);
} }
#if 0
// Sofia: define the sizes according to the specified parameters in the conf file not up to the maximim boudary
/* initialize maximum instances to have flexibility for the tests */ /* initialize maximum instances to have flexibility for the tests */
int nInstanceNum = XRAN_MAX_SECTOR_NR; int nInstanceNum = XRAN_MAX_SECTOR_NR;
/* initialize maximum supported CC to have flexibility on the test */ /* initialize maximum supported CC to have flexibility on the test */
int32_t nSectorNum = 6;//XRAN_MAX_SECTOR_NR; int32_t nSectorNum = 6; //XRAN_MAX_SECTOR_NR;
#endif
int32_t nSectorNum = get_num_cc();
int nInstanceNum = get_num_cc();
for(k = 0; k < XRAN_PORTS_NUM; k++) { for(k = 0; k < XRAN_PORTS_NUM; k++) {
status = xran_sector_get_instances(m_xranhandle, nInstanceNum, &m_nInstanceHandle[k][0]); status = xran_sector_get_instances(m_xranhandle, nInstanceNum, &m_nInstanceHandle[k][0]);
...@@ -224,8 +233,10 @@ private: ...@@ -224,8 +233,10 @@ private:
std::cout << "Sucess xran_mm_init" << std::endl; std::cout << "Sucess xran_mm_init" << std::endl;
/* Init Memory */ /* Init Memory */
printf("Sofia wrapper.hpp: Init memory *** XRANFTHTX_OUT ***\n");
for(i = 0; i<nSectorNum; i++) { for(i = 0; i<nSectorNum; i++) {
eInterfaceType = XRANFTHTX_OUT; eInterfaceType = XRANFTHTX_OUT;
printf("Call xran_bm_init %d\n",i);
status = xran_bm_init(m_nInstanceHandle[0][i], status = xran_bm_init(m_nInstanceHandle[0][i],
&m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType], &m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType],
XRAN_N_FE_BUF_LEN * xran_max_antenna_nr * XRAN_NUM_OF_SYMBOL_PER_SLOT, XRAN_N_FE_BUF_LEN * xran_max_antenna_nr * XRAN_NUM_OF_SYMBOL_PER_SLOT,
...@@ -265,6 +276,7 @@ private: ...@@ -265,6 +276,7 @@ private:
} }
/* C-plane DL */ /* C-plane DL */
printf("Sofia wrapper.hpp: Init memory *** XRANFTHTX_SEC_DESC_OUT ***\n");
eInterfaceType = XRANFTHTX_SEC_DESC_OUT; eInterfaceType = XRANFTHTX_SEC_DESC_OUT;
status = xran_bm_init(m_nInstanceHandle[0][i], status = xran_bm_init(m_nInstanceHandle[0][i],
&m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType], &m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType],
...@@ -273,6 +285,7 @@ private: ...@@ -273,6 +285,7 @@ private:
std::cout << __LINE__ << " Failed at xran_bm_init, status " << status << std::endl; std::cout << __LINE__ << " Failed at xran_bm_init, status " << status << std::endl;
return (-1); return (-1);
} }
printf("Sofia wrapper.hpp: Init memory *** XRANFTHTX_PRB_MAP_OUT ***\n");
eInterfaceType = XRANFTHTX_PRB_MAP_OUT; eInterfaceType = XRANFTHTX_PRB_MAP_OUT;
status = xran_bm_init(m_nInstanceHandle[0][i], status = xran_bm_init(m_nInstanceHandle[0][i],
&m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType], &m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType],
...@@ -322,6 +335,7 @@ private: ...@@ -322,6 +335,7 @@ private:
} }
for(i = 0; i<nSectorNum; i++) { for(i = 0; i<nSectorNum; i++) {
printf("Sofia wrapper.hpp: Init memory *** XRANFTHRX_IN ***\n");
eInterfaceType = XRANFTHRX_IN; eInterfaceType = XRANFTHRX_IN;
status = xran_bm_init(m_nInstanceHandle[0][i], status = xran_bm_init(m_nInstanceHandle[0][i],
&m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType], &m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType],
...@@ -359,7 +373,7 @@ private: ...@@ -359,7 +373,7 @@ private:
} }
} }
} }
printf("Sofia wrapper.hpp: Init memory *** XRANFTHTX_SEC_DESC_IN ***\n");
eInterfaceType = XRANFTHTX_SEC_DESC_IN; eInterfaceType = XRANFTHTX_SEC_DESC_IN;
status = xran_bm_init(m_nInstanceHandle[0][i], status = xran_bm_init(m_nInstanceHandle[0][i],
&m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType], &m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType],
...@@ -368,6 +382,7 @@ private: ...@@ -368,6 +382,7 @@ private:
std::cout << __LINE__ << " Failed at xran_bm_init, status " << status << std::endl; std::cout << __LINE__ << " Failed at xran_bm_init, status " << status << std::endl;
return (-1); return (-1);
} }
printf("Sofia wrapper.hpp: Init memory *** XRANFTHRX_PRB_MAP_IN ***\n");
eInterfaceType = XRANFTHRX_PRB_MAP_IN; eInterfaceType = XRANFTHRX_PRB_MAP_IN;
status = xran_bm_init(m_nInstanceHandle[0][i], status = xran_bm_init(m_nInstanceHandle[0][i],
&m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType], &m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType],
...@@ -418,6 +433,7 @@ private: ...@@ -418,6 +433,7 @@ private:
} }
for(i = 0; i<nSectorNum; i++) { for(i = 0; i<nSectorNum; i++) {
printf("Sofia wrapper.hpp: Init memory *** XRANFTHRACH_IN ***\n");
eInterfaceType = XRANFTHRACH_IN; eInterfaceType = XRANFTHRACH_IN;
status = xran_bm_init(m_nInstanceHandle[0][i], status = xran_bm_init(m_nInstanceHandle[0][i],
&m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType], &m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType],
...@@ -455,6 +471,56 @@ private: ...@@ -455,6 +471,56 @@ private:
} }
} }
#if 1
// Insert the allocation of srs buffers useful for xran_5g_srs_req()
// Code taken from sample app
//
/* add SRS rx buffer */
for(i = 0; i<nSectorNum && xran_max_ant_array_elm_nr; i++)
{
printf("Sofia wrapper.hpp: Init memory *** XRANSRS_IN ***\n");
eInterfaceType = XRANSRS_IN;
status = xran_bm_init(m_nInstanceHandle[0][i],&m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType],
XRAN_N_FE_BUF_LEN*xran_max_ant_array_elm_nr*XRAN_MAX_NUM_OF_SRS_SYMBOL_PER_SLOT, m_nSW_ToFpga_FTH_TxBufferLen);
if(XRAN_STATUS_SUCCESS != status) {
std::cout << __LINE__ << " Failed at xran_bm_init, status " << status << std::endl;
return (-1);
}
for(j = 0; j < XRAN_N_FE_BUF_LEN; j++)
{
for(z = 0; z < xran_max_ant_array_elm_nr; z++){
m_sFHSrsRxBbuIoBufCtrl[j][i][z].bValid = 0;
m_sFHSrsRxBbuIoBufCtrl[j][i][z].nSegGenerated = -1;
m_sFHSrsRxBbuIoBufCtrl[j][i][z].nSegToBeGen = -1;
m_sFHSrsRxBbuIoBufCtrl[j][i][z].nSegTransferred = 0;
m_sFHSrsRxBbuIoBufCtrl[j][i][z].sBufferList.nNumBuffers = xran_max_ant_array_elm_nr; /* ant number */
m_sFHSrsRxBbuIoBufCtrl[j][i][z].sBufferList.pBuffers = &m_sFHSrsRxBuffers[j][i][z][0];
for(k = 0; k < XRAN_MAX_NUM_OF_SRS_SYMBOL_PER_SLOT; k++)
{
m_sFHSrsRxBbuIoBufCtrl[j][i][z].sBufferList.pBuffers[k].nElementLenInBytes = m_nSW_ToFpga_FTH_TxBufferLen;
m_sFHSrsRxBbuIoBufCtrl[j][i][z].sBufferList.pBuffers[k].nNumberOfElements = 1;
m_sFHSrsRxBbuIoBufCtrl[j][i][z].sBufferList.pBuffers[k].nOffsetInBytes = 0;
status = xran_bm_allocate_buffer(m_nInstanceHandle[0][i], m_nBufPoolIndex[m_nSectorIndex[i]][eInterfaceType], &ptr, &mb);
if(XRAN_STATUS_SUCCESS != status) {
std::cout << __LINE__ << " Failed at xran_bm_allocate_buffer, status " << status << std::endl;
return (-1);
}
m_sFHSrsRxBbuIoBufCtrl[j][i][z].sBufferList.pBuffers[k].pData = (uint8_t *)ptr;
m_sFHSrsRxBbuIoBufCtrl[j][i][z].sBufferList.pBuffers[k].pCtrl = (void *)mb;
if(ptr){
u32dptr = (uint32_t*)(ptr);
memset(u32dptr, 0x0, m_nSW_ToFpga_FTH_TxBufferLen);
}
}
}
}
}
#endif
return (0); return (0);
} }
...@@ -476,8 +542,10 @@ public: ...@@ -476,8 +542,10 @@ public:
m_dpdk_dev_up = get_globalcfg<std::string>(XRAN_UT_KEY_GLOBALCFG_IO, "dpdk_dev_up"); m_dpdk_dev_up = get_globalcfg<std::string>(XRAN_UT_KEY_GLOBALCFG_IO, "dpdk_dev_up");
m_dpdk_dev_cp = get_globalcfg<std::string>(XRAN_UT_KEY_GLOBALCFG_IO, "dpdk_dev_cp"); m_dpdk_dev_cp = get_globalcfg<std::string>(XRAN_UT_KEY_GLOBALCFG_IO, "dpdk_dev_cp");
m_xranInit.io_cfg.num_vfs = 2; m_xranInit.io_cfg.num_vfs = 2;
m_xranInit.io_cfg.dpdk_dev[XRAN_UP_VF] = "0000:65:02.0"; m_xranInit.io_cfg.dpdk_dev[XRAN_UP_VF] = "0000:b3:02.0";
m_xranInit.io_cfg.dpdk_dev[XRAN_CP_VF] = "0000:65:02.1"; m_xranInit.io_cfg.dpdk_dev[XRAN_CP_VF] = "0000:b3:02.1";
printf("Sofia: m_xranInit.io_cfg.dpdk_dev[%d] =%s, m_xranInit.io_cfg.dpdk_dev[%d]=%s\n",XRAN_UP_VF,m_xranInit.io_cfg.dpdk_dev[XRAN_UP_VF],XRAN_CP_VF,m_xranInit.io_cfg.dpdk_dev[XRAN_CP_VF]);
m_xranInit.io_cfg.core = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_IO, "core"); m_xranInit.io_cfg.core = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_IO, "core");
m_xranInit.io_cfg.system_core = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_IO, "system_core"); m_xranInit.io_cfg.system_core = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_IO, "system_core");
...@@ -513,7 +581,7 @@ public: ...@@ -513,7 +581,7 @@ public:
&tmp_mac[3], &tmp_mac[4], &tmp_mac[5]); &tmp_mac[3], &tmp_mac[4], &tmp_mac[5]);
for(i=0; i<6; i++) for(i=0; i<6; i++)
m_du_mac[i] = (uint8_t)tmp_mac[i]; m_du_mac[i] = (uint8_t)tmp_mac[i];
std::sscanf(du_mac_str.c_str(), "%02x:%02x:%02x:%02x:%02x:%02x", std::sscanf(ru_mac_str.c_str(), "%02x:%02x:%02x:%02x:%02x:%02x",
&tmp_mac[0], &tmp_mac[1], &tmp_mac[2], &tmp_mac[0], &tmp_mac[1], &tmp_mac[2],
&tmp_mac[3], &tmp_mac[4], &tmp_mac[5]); &tmp_mac[3], &tmp_mac[4], &tmp_mac[5]);
for(i=0; i<6; i++) for(i=0; i<6; i++)
...@@ -529,14 +597,14 @@ public: ...@@ -529,14 +597,14 @@ public:
int bitnum_ccid = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_EAXCID, "bit_ccId"); int bitnum_ccid = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_EAXCID, "bit_ccId");
int bitnum_ruport = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_EAXCID, "bit_ruPortId"); int bitnum_ruport = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_EAXCID, "bit_ruPortId");
m_xranInit.eAxCId_conf.bit_cuPortId = bitnum_bandsec + bitnum_ccid + bitnum_ruport; m_xranInit.eAxCId_conf.bit_cuPortId = 12;//bitnum_bandsec + bitnum_ccid + bitnum_ruport;
m_xranInit.eAxCId_conf.bit_bandSectorId = bitnum_ccid + bitnum_ruport; m_xranInit.eAxCId_conf.bit_bandSectorId = 8; //bitnum_ccid + bitnum_ruport;
m_xranInit.eAxCId_conf.bit_ccId = bitnum_ruport; m_xranInit.eAxCId_conf.bit_ccId = 4; //bitnum_ruport;
m_xranInit.eAxCId_conf.bit_ruPortId = 0; m_xranInit.eAxCId_conf.bit_ruPortId = 0;
m_xranInit.eAxCId_conf.mask_cuPortId = get_eaxcid_mask(bitnum_cuport, m_xranInit.eAxCId_conf.bit_cuPortId); m_xranInit.eAxCId_conf.mask_cuPortId = 0xf000; //get_eaxcid_mask(bitnum_cuport, m_xranInit.eAxCId_conf.bit_cuPortId);
m_xranInit.eAxCId_conf.mask_bandSectorId = get_eaxcid_mask(bitnum_bandsec, m_xranInit.eAxCId_conf.bit_bandSectorId); m_xranInit.eAxCId_conf.mask_bandSectorId = 0x0f00; //get_eaxcid_mask(bitnum_bandsec, m_xranInit.eAxCId_conf.bit_bandSectorId);
m_xranInit.eAxCId_conf.mask_ccId = get_eaxcid_mask(bitnum_ccid, m_xranInit.eAxCId_conf.bit_ccId); m_xranInit.eAxCId_conf.mask_ccId = 0x00f0; //get_eaxcid_mask(bitnum_ccid, m_xranInit.eAxCId_conf.bit_ccId);
m_xranInit.eAxCId_conf.mask_ruPortId = get_eaxcid_mask(bitnum_ruport, m_xranInit.eAxCId_conf.bit_ruPortId); m_xranInit.eAxCId_conf.mask_ruPortId = 0x000f; //get_eaxcid_mask(bitnum_ruport, m_xranInit.eAxCId_conf.bit_ruPortId);
m_xranInit.totalBfWeights = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_RU, "totalBfWeights"); m_xranInit.totalBfWeights = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_RU, "totalBfWeights");
...@@ -559,12 +627,16 @@ public: ...@@ -559,12 +627,16 @@ public:
m_xranInit.Ta4_max = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_RU, "Ta4_max"); m_xranInit.Ta4_max = get_globalcfg<int>(XRAN_UT_KEY_GLOBALCFG_RU, "Ta4_max");
m_xranInit.enableCP = 1; m_xranInit.enableCP = 1;
m_xranInit.prachEnable = 1; //m_xranInit.enableCP = 0; // Sofia try to modify
m_xranInit.debugStop = 0; //m_xranInit.prachEnable = 1;
m_xranInit.prachEnable = 1; // Sofia modify according to sample app log
m_xranInit.debugStop = 0; // Sofia Modify according to sample app log
//m_xranInit.debugStop = 1; // Sofia Modify according to sample app log
m_xranInit.debugStopCount = 0; m_xranInit.debugStopCount = 0;
m_xranInit.DynamicSectionEna= 0; m_xranInit.DynamicSectionEna= 0;
m_xranInit.filePrefix = "wls"; m_xranInit.filePrefix = "wls"; //Sofia modifies
// m_xranInit.filePrefix = "wls_0"; // Sofia Modifies
m_bSub6 = get_globalcfg<bool>(XRAN_UT_KEY_GLOBALCFG_RU, "sub6"); m_bSub6 = get_globalcfg<bool>(XRAN_UT_KEY_GLOBALCFG_RU, "sub6");
...@@ -659,7 +731,9 @@ public: ...@@ -659,7 +731,9 @@ public:
m_xranConf.ru_conf.byteOrder = XRAN_NE_BE_BYTE_ORDER; m_xranConf.ru_conf.byteOrder = XRAN_NE_BE_BYTE_ORDER;
m_xranConf.ru_conf.iqOrder = XRAN_I_Q_ORDER; m_xranConf.ru_conf.iqOrder = XRAN_I_Q_ORDER;
m_xranConf.log_level = 0; //m_xranConf.log_level = 0; // Sofia modif
m_xranConf.log_level = 1; //Sofia modif
/* /*
m_xranConf.bbdev_enc = nullptr; m_xranConf.bbdev_enc = nullptr;
m_xranConf.bbdev_dec = nullptr; m_xranConf.bbdev_dec = nullptr;
...@@ -711,7 +785,16 @@ public: ...@@ -711,7 +785,16 @@ public:
/* set to maximum length to support multiple cases */ /* set to maximum length to support multiple cases */
m_nFpgaToSW_FTH_RxBufferLen = 13168; /* 273*12*4 + 64*/ m_nFpgaToSW_FTH_RxBufferLen = 13168; /* 273*12*4 + 64*/
#if 0
// Sofia: According to sample app this is not the max length. We should also include the spacce for ORAN and ETH Heaaders
m_nSW_ToFpga_FTH_TxBufferLen = 13168; /* 273*12*4 + 64*/ m_nSW_ToFpga_FTH_TxBufferLen = 13168; /* 273*12*4 + 64*/
#endif
m_nSW_ToFpga_FTH_TxBufferLen = 13168 + /* 273*12*4 + 64* + ETH AND ORAN HDRs */
XRAN_MAX_SECTIONS_PER_SYM* (RTE_PKTMBUF_HEADROOM + sizeof(struct rte_ether_hdr) +
sizeof(struct xran_ecpri_hdr) +
sizeof(struct radio_app_common_hdr) +
sizeof(struct data_section_hdr));
printf("Sofia wrapper.hpp: nFpgaToSW_FTH_RxBufferLen=%d , nSW_ToFpga_FTH_TxBufferLen=%d\n",m_nFpgaToSW_FTH_RxBufferLen,m_nSW_ToFpga_FTH_TxBufferLen);
if(init_memory() < 0) { if(init_memory() < 0) {
std::cout << "Fatal Error on Initialization !!!" << std::endl; std::cout << "Fatal Error on Initialization !!!" << std::endl;
...@@ -956,6 +1039,8 @@ public: ...@@ -956,6 +1039,8 @@ public:
xran_reg_physide_cb(xranHandle, physide_ul_half_slot_call_back, NULL, 10, XRAN_CB_HALF_SLOT_RX); xran_reg_physide_cb(xranHandle, physide_ul_half_slot_call_back, NULL, 10, XRAN_CB_HALF_SLOT_RX);
xran_reg_physide_cb(xranHandle, physide_ul_full_slot_call_back, NULL, 10, XRAN_CB_FULL_SLOT_RX); xran_reg_physide_cb(xranHandle, physide_ul_full_slot_call_back, NULL, 10, XRAN_CB_FULL_SLOT_RX);
#endif #endif
// Sofia, Roman enable xran_reg_physide_cb(xranHandle, physide_dl_tti_call_back, NULL, 10, XRAN_CB_TTI); for the CP --> In our wrapper
nSectorNum = get_num_cc(); nSectorNum = get_num_cc();
for(i=0; i<nSectorNum; i++) for(i=0; i<nSectorNum; i++)
...@@ -1002,18 +1087,20 @@ public: ...@@ -1002,18 +1087,20 @@ public:
} }
/* add SRS callback here */ /* add SRS callback here */
/*
for (i = 0; i<nSectorNum && xran_max_ant_array_elm_nr; i++) { for (i = 0; i<nSectorNum && xran_max_ant_array_elm_nr; i++) {
xran_5g_srs_req(m_nInstanceHandle[0][i], pFthRxSrsBuffer[i], xran_5g_srs_req(m_nInstanceHandle[0][i], pFthRxSrsBuffer[i],
(void (*)(void *, xran_status_t))fh_srs_callback,&pFthRxSrsBuffer[i][0]); (void (*)(void *, xran_status_t))fh_srs_callback,&pFthRxSrsBuffer[i][0]);
} }
*/
} }
xran_register_cb_mbuf2ring(send_cp, send_up); xran_register_cb_mbuf2ring(send_cp, send_up);
xran_open(m_xranhandle, &m_xranConf); //xran_open(m_xranhandle, &m_xranConf); // Sofia comment
} }
void Close() void Close()
...@@ -1163,6 +1250,10 @@ public: ...@@ -1163,6 +1250,10 @@ public:
bool is_prachenable() { return(m_xranInit.prachEnable); }; bool is_prachenable() { return(m_xranInit.prachEnable); };
bool is_dynamicsection() { return(m_xranInit.DynamicSectionEna?true:false); } bool is_dynamicsection() { return(m_xranInit.DynamicSectionEna?true:false); }
// --- Sofia defines useful functions
bool get_sub6() { return(m_bSub6);}
// ---------------------------------
void get_cfg_prach(struct xran_prach_config *pCfg) void get_cfg_prach(struct xran_prach_config *pCfg)
{ {
if(pCfg) if(pCfg)
......
...@@ -176,7 +176,7 @@ eNBs = ...@@ -176,7 +176,7 @@ eNBs =
////////// MME parameters: ////////// MME parameters:
mme_ip_address = ( { ipv4 = "192.168.18.99"; mme_ip_address = ( { ipv4 = "192.168.12.31";
ipv6 = "192:168:30::17"; ipv6 = "192:168:30::17";
active = "yes"; active = "yes";
preference = "ipv4"; preference = "ipv4";
...@@ -194,10 +194,10 @@ eNBs = ...@@ -194,10 +194,10 @@ eNBs =
NETWORK_INTERFACES : NETWORK_INTERFACES :
{ {
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; ENB_INTERFACE_NAME_FOR_S1_MME = "enp0s20f0u2";
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.18.196"; ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.22";
ENB_INTERFACE_NAME_FOR_S1U = "eth0"; ENB_INTERFACE_NAME_FOR_S1U = "enp0s20f0u2";
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.18.196"; ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.22";
ENB_PORT_FOR_S1U = 2152; # Spec 2152 ENB_PORT_FOR_S1U = 2152; # Spec 2152
ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.1"; ENB_IPV4_ADDRESS_FOR_X2C = "127.0.0.1";
ENB_PORT_FOR_X2C = 36422; # Spec 36422 ENB_PORT_FOR_X2C = 36422; # Spec 36422
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment