Merge remote-tracking branch 'origin/enhance-rfsim' into develop-SA-CBRA
This commit is contained in:
@@ -331,9 +331,10 @@ void end_configmodule(void) {
|
|||||||
printf ("[CONFIG] free %u config value pointers\n",cfgptr->numptrs);
|
printf ("[CONFIG] free %u config value pointers\n",cfgptr->numptrs);
|
||||||
|
|
||||||
for(int i=0; i<cfgptr->numptrs ; i++) {
|
for(int i=0; i<cfgptr->numptrs ; i++) {
|
||||||
if (cfgptr->ptrs[i] != NULL) {
|
if (cfgptr->ptrs[i] != NULL && cfgptr->ptrsAllocated[i] == true) {
|
||||||
free(cfgptr->ptrs[i]);
|
free(cfgptr->ptrs[i]);
|
||||||
cfgptr->ptrs[i]=NULL;
|
cfgptr->ptrs[i]=NULL;
|
||||||
|
cfgptr->ptrsAllocated[i] = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,8 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
#include "common/config/config_paramdesc.h"
|
#include "common/config/config_paramdesc.h"
|
||||||
#include "common/utils/T/T.h"
|
#include "common/utils/T/T.h"
|
||||||
#define CONFIG_MAX_OOPT_PARAMS 10 // maximum number of parameters in the -O option (-O <cfgmode>:P1:P2...
|
#define CONFIG_MAX_OOPT_PARAMS 10 // maximum number of parameters in the -O option (-O <cfgmode>:P1:P2...
|
||||||
@@ -74,6 +76,7 @@ typedef struct configmodule_interface {
|
|||||||
uint32_t numptrs;
|
uint32_t numptrs;
|
||||||
uint32_t rtflags;
|
uint32_t rtflags;
|
||||||
char *ptrs[CONFIG_MAX_ALLOCATEDPTRS];
|
char *ptrs[CONFIG_MAX_ALLOCATEDPTRS];
|
||||||
|
bool ptrsAllocated[CONFIG_MAX_ALLOCATEDPTRS];
|
||||||
} configmodule_interface_t;
|
} configmodule_interface_t;
|
||||||
|
|
||||||
#ifdef CONFIG_LOADCONFIG_MAIN
|
#ifdef CONFIG_LOADCONFIG_MAIN
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) {
|
|||||||
|
|
||||||
if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) == 0) {
|
if ( (cfgoptions->paramflags & PARAMFLAG_NOFREE) == 0) {
|
||||||
config_get_if()->ptrs[config_get_if()->numptrs] = (char *)ptr;
|
config_get_if()->ptrs[config_get_if()->numptrs] = (char *)ptr;
|
||||||
|
config_get_if()->ptrsAllocated[config_get_if()->numptrs] = true;
|
||||||
config_get_if()->numptrs++;
|
config_get_if()->numptrs++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -82,7 +83,9 @@ char *config_check_valptr(paramdef_t *cfgoptions, char **ptr, int length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (*ptr == NULL) {
|
if (*ptr == NULL) {
|
||||||
*ptr = malloc(length>40?length:40); // LTS: dummy fix, waiting Francois full fix in 4G branch
|
*ptr = malloc(length>40?length:40);
|
||||||
|
// LTS: dummy fix, waiting Francois full fix in 4G branch
|
||||||
|
// the issue is we don't know at this point the size we will get
|
||||||
|
|
||||||
if ( *ptr != NULL) {
|
if ( *ptr != NULL) {
|
||||||
memset(*ptr,0,length);
|
memset(*ptr,0,length);
|
||||||
|
|||||||
@@ -346,6 +346,7 @@ int config_libconfig_init(char *cfgP[], int numP) {
|
|||||||
libconfig_privdata.configfile = strdup((char *)cfgP[0]);
|
libconfig_privdata.configfile = strdup((char *)cfgP[0]);
|
||||||
config_get_if()->numptrs=0;
|
config_get_if()->numptrs=0;
|
||||||
memset(config_get_if()->ptrs,0,sizeof(void *) * CONFIG_MAX_ALLOCATEDPTRS);
|
memset(config_get_if()->ptrs,0,sizeof(void *) * CONFIG_MAX_ALLOCATEDPTRS);
|
||||||
|
memset(config_get_if()->ptrsAllocated, 0, sizeof(config_get_if()->ptrsAllocated));
|
||||||
|
|
||||||
/* Read the file. If there is an error, report it and exit. */
|
/* Read the file. If there is an error, report it and exit. */
|
||||||
if(! config_read_file(&(libconfig_privdata.cfg), libconfig_privdata.configfile)) {
|
if(! config_read_file(&(libconfig_privdata.cfg), libconfig_privdata.configfile)) {
|
||||||
|
|||||||
+32
-1
@@ -88,16 +88,19 @@ int write_file_matlab(const char *fname,
|
|||||||
void *data,
|
void *data,
|
||||||
int length,
|
int length,
|
||||||
int dec,
|
int dec,
|
||||||
char format)
|
unsigned int format)
|
||||||
{
|
{
|
||||||
FILE *fp=NULL;
|
FILE *fp=NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
AssertFatal((format&~MATLAB_RAW) <16,"");
|
||||||
|
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
//printf("Writing %d elements of type %d to %s\n",length,format,fname);
|
//printf("Writing %d elements of type %d to %s\n",length,format,fname);
|
||||||
|
|
||||||
|
|
||||||
if (format == 10 || format ==11 || format == 12 || format == 13 || format == 14) {
|
if (format == 10 || format ==11 || format == 12 || format == 13 || format == 14) {
|
||||||
fp = fopen(fname,"a+");
|
fp = fopen(fname,"a+");
|
||||||
} else if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) {
|
} else if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14) {
|
||||||
@@ -109,6 +112,32 @@ int write_file_matlab(const char *fname,
|
|||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( (format&MATLAB_RAW) == MATLAB_RAW ) {
|
||||||
|
int sz[16]={sizeof(short), 2*sizeof(short),
|
||||||
|
sizeof(int), 2*sizeof(int),
|
||||||
|
sizeof(char), 2*sizeof(char),
|
||||||
|
sizeof(long long),
|
||||||
|
sizeof(double), 2*sizeof(double),
|
||||||
|
sizeof(unsigned char),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short),
|
||||||
|
sizeof(short)
|
||||||
|
};
|
||||||
|
int eltSz= sz[format&~MATLAB_RAW];
|
||||||
|
if (dec==1)
|
||||||
|
fwrite(data, eltSz, length, fp);
|
||||||
|
else
|
||||||
|
for (i=0; i<length; i+=dec)
|
||||||
|
fwrite(data+i*eltSz, eltSz, 1, fp);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14)
|
if (format != 10 && format !=11 && format != 12 && format != 13 && format != 14)
|
||||||
fprintf(fp,"%s = [",vname);
|
fprintf(fp,"%s = [",vname);
|
||||||
|
|
||||||
@@ -214,6 +243,8 @@ int write_file_matlab(const char *fname,
|
|||||||
case 12 : // case eren for log2_maxh real unsigned 8 bit
|
case 12 : // case eren for log2_maxh real unsigned 8 bit
|
||||||
fprintf(fp,"%d \n",((unsigned char *)&data)[0]);
|
fprintf(fp,"%d \n",((unsigned char *)&data)[0]);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
AssertFatal(false, "unknown dump format: %d\n", format);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (format != 10 && format !=11 && format !=12 && format != 13 && format != 15) {
|
if (format != 10 && format !=11 && format !=12 && format != 13 && format != 15) {
|
||||||
|
|||||||
+19
-1
@@ -336,7 +336,25 @@ typedef struct {
|
|||||||
@param dec decimation level
|
@param dec decimation level
|
||||||
@param format data format (0 = real 16-bit, 1 = complex 16-bit,2 real 32-bit, 3 complex 32-bit,4 = real 8-bit, 5 = complex 8-bit)
|
@param format data format (0 = real 16-bit, 1 = complex 16-bit,2 real 32-bit, 3 complex 32-bit,4 = real 8-bit, 5 = complex 8-bit)
|
||||||
*/
|
*/
|
||||||
int32_t write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, char format);
|
#define MATLAB_RAW (1<<31)
|
||||||
|
#define MATLAB_SHORT 0
|
||||||
|
#define MATLAB_CSHORT 1
|
||||||
|
#define MATLAB_INT 2
|
||||||
|
#define MATLAB_CINT 3
|
||||||
|
#define MATLAB_INT8 4
|
||||||
|
#define MATLAB_CINT8 5
|
||||||
|
#define MATLAB_LLONG 6
|
||||||
|
#define MATLAB_DOUBLE 7
|
||||||
|
#define MATLAB_CDOUBLE 8
|
||||||
|
#define MATLAB_UINT8 9
|
||||||
|
#define MATLEB_EREN1 10
|
||||||
|
#define MATLEB_EREN2 11
|
||||||
|
#define MATLEB_EREN3 12
|
||||||
|
#define MATLAB_CSHORT_BRACKET1 13
|
||||||
|
#define MATLAB_CSHORT_BRACKET2 14
|
||||||
|
#define MATLAB_CSHORT_BRACKET3 15
|
||||||
|
|
||||||
|
int32_t write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, unsigned int format);
|
||||||
|
|
||||||
/*----------------macro definitions for reading log configuration from the config module */
|
/*----------------macro definitions for reading log configuration from the config module */
|
||||||
#define CONFIG_STRING_LOG_PREFIX "log_config"
|
#define CONFIG_STRING_LOG_PREFIX "log_config"
|
||||||
|
|||||||
@@ -557,11 +557,14 @@ int main( int argc, char **argv ) {
|
|||||||
|
|
||||||
|
|
||||||
init_NR_UE_threads(1);
|
init_NR_UE_threads(1);
|
||||||
config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS);
|
|
||||||
printf("UE threads created by %ld\n", gettid());
|
printf("UE threads created by %ld\n", gettid());
|
||||||
|
|
||||||
// wait for end of program
|
// wait for end of program
|
||||||
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
printf("TYPE <CTRL-C> TO TERMINATE\n");
|
||||||
|
// Sleep a while before checking all parameters have been used
|
||||||
|
// Some are used directly in external threads, asynchronously
|
||||||
|
sleep(20);
|
||||||
|
config_check_unknown_cmdlineopt(CONFIG_CHECKALLSECTIONS);
|
||||||
|
|
||||||
while(true)
|
while(true)
|
||||||
sleep(3600);
|
sleep(3600);
|
||||||
|
|||||||
@@ -225,6 +225,8 @@ static void oai_xygraph(OAIgraph_t *graph, float *x, float *y, int len, int laye
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const int datasize, const int divisions, const char *label) {
|
static void genericWaterFall (OAIgraph_t *graph, scopeSample_t *values, const int datasize, const int divisions, const char *label) {
|
||||||
|
if ( values == NULL )
|
||||||
|
return;
|
||||||
fl_winset(FL_ObjWin(graph->graph));
|
fl_winset(FL_ObjWin(graph->graph));
|
||||||
const int samplesPerPixel=datasize/graph->w;
|
const int samplesPerPixel=datasize/graph->w;
|
||||||
int displayPart=graph->waterFallh-ScaleZone;
|
int displayPart=graph->waterFallh-ScaleZone;
|
||||||
|
|||||||
@@ -302,6 +302,7 @@ void ue_ip_change_rx_flags(struct net_device *dev_pP, int flagsP) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0)
|
||||||
void ue_ip_tx_timeout(struct net_device *dev_pP, unsigned int txqueue)
|
void ue_ip_tx_timeout(struct net_device *dev_pP, unsigned int txqueue)
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -105,9 +105,10 @@ typedef enum {
|
|||||||
ADRV9371_ZC706_DEV,
|
ADRV9371_ZC706_DEV,
|
||||||
/*!\brief device is UEDv2 */
|
/*!\brief device is UEDv2 */
|
||||||
UEDv2_DEV,
|
UEDv2_DEV,
|
||||||
|
RFSIMULATOR,
|
||||||
MAX_RF_DEV_TYPE
|
MAX_RF_DEV_TYPE
|
||||||
} dev_type_t;
|
} dev_type_t;
|
||||||
#define DEVTYPE_NAMES {"","EXMIMO","USRP B200","USRP X300","USRP N300","BLADERF","LMSSDR","IRIS","No HW","ADRV9371_ZC706","UEDv2"}
|
#define DEVTYPE_NAMES {"","EXMIMO","USRP B200","USRP X300","USRP N300","BLADERF","LMSSDR","IRIS","No HW","ADRV9371_ZC706","UEDv2", "RFSIMULATOR"}
|
||||||
/*!\brief transport protocol types
|
/*!\brief transport protocol types
|
||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@@ -491,15 +492,11 @@ struct openair0_device_t {
|
|||||||
typedef int(*oai_device_initfunc_t)(openair0_device *device, openair0_config_t *openair0_cfg);
|
typedef int(*oai_device_initfunc_t)(openair0_device *device, openair0_config_t *openair0_cfg);
|
||||||
/* type of transport init function, implemented in shared lib */
|
/* type of transport init function, implemented in shared lib */
|
||||||
typedef int(*oai_transport_initfunc_t)(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t *eth_params);
|
typedef int(*oai_transport_initfunc_t)(openair0_device *device, openair0_config_t *openair0_cfg, eth_params_t *eth_params);
|
||||||
#define UE_MAGICDL_FDD 0xA5A5A5A5A5A5A5A5 // UE DL FDD record
|
#define UE_MAGICDL 0xA5A5A5A5A5A5A5A5 // UE DL FDD record
|
||||||
#define UE_MAGICUL_FDD 0x5A5A5A5A5A5A5A5A // UE UL FDD record
|
#define UE_MAGICUL 0x5A5A5A5A5A5A5A5A // UE UL FDD record
|
||||||
#define UE_MAGICDL_TDD 0xA6A6A6A6A6A6A6A6 // UE DL TDD record
|
|
||||||
#define UE_MAGICUL_TDD 0x6A6A6A6A6A6A6A6A // UE UL TDD record
|
|
||||||
|
|
||||||
#define ENB_MAGICDL_FDD 0xB5B5B5B5B5B5B5B5 // eNB DL FDD record
|
#define ENB_MAGICDL 0xB5B5B5B5B5B5B5B5 // eNB DL FDD record
|
||||||
#define ENB_MAGICUL_FDD 0x5B5B5B5B5B5B5B5B // eNB UL FDD record
|
#define ENB_MAGICUL 0x5B5B5B5B5B5B5B5B // eNB UL FDD record
|
||||||
#define ENB_MAGICDL_TDD 0xB6B6B6B6B6B6B6B6 // eNB DL TDD record
|
|
||||||
#define ENB_MAGICUL_TDD 0x6B6B6B6B6B6B6B6B // eNB UL TDD record
|
|
||||||
|
|
||||||
#define OPTION_LZ4 0x00000001 // LZ4 compression (option_value is set to compressed size)
|
#define OPTION_LZ4 0x00000001 // LZ4 compression (option_value is set to compressed size)
|
||||||
|
|
||||||
@@ -516,19 +513,6 @@ typedef struct {
|
|||||||
uint32_t option_flag; // Option flag
|
uint32_t option_flag; // Option flag
|
||||||
} samplesBlockHeader_t;
|
} samplesBlockHeader_t;
|
||||||
|
|
||||||
#define UE_MAGICDL_FDD 0xA5A5A5A5A5A5A5A5 // UE DL FDD record
|
|
||||||
#define UE_MAGICUL_FDD 0x5A5A5A5A5A5A5A5A // UE UL FDD record
|
|
||||||
#define UE_MAGICDL_TDD 0xA6A6A6A6A6A6A6A6 // UE DL TDD record
|
|
||||||
#define UE_MAGICUL_TDD 0x6A6A6A6A6A6A6A6A // UE UL TDD record
|
|
||||||
|
|
||||||
#define ENB_MAGICDL_FDD 0xB5B5B5B5B5B5B5B5 // eNB DL FDD record
|
|
||||||
#define ENB_MAGICUL_FDD 0x5B5B5B5B5B5B5B5B // eNB UL FDD record
|
|
||||||
#define ENB_MAGICDL_TDD 0xB6B6B6B6B6B6B6B6 // eNB DL TDD record
|
|
||||||
#define ENB_MAGICUL_TDD 0x6B6B6B6B6B6B6B6B // eNB UL TDD record
|
|
||||||
|
|
||||||
#define OPTION_LZ4 0x00000001 // LZ4 compression (option_value is set to compressed size)
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -76,15 +76,16 @@ extern RAN_CONTEXT_t RC;
|
|||||||
/* configuration parameters for the rfsimulator device */
|
/* configuration parameters for the rfsimulator device */
|
||||||
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
/* optname helpstr paramflags XXXptr defXXXval type numelt */
|
||||||
/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
|
||||||
#define RFSIMULATOR_PARAMS_DESC {\
|
#define simOpt PARAMFLAG_NOFREE|PARAMFLAG_CMDLINE_NOPREFIXENABLED
|
||||||
{"serveraddr", "<ip address to connect to>\n", 0, strptr:&(rfsimulator->ip), defstrval:"127.0.0.1", TYPE_STRING, 0 },\
|
#define RFSIMULATOR_PARAMS_DESC { \
|
||||||
{"serverport", "<port to connect to>\n", 0, u16ptr:&(rfsimulator->port), defuintval:PORT, TYPE_UINT16, 0 },\
|
{"serveraddr", "<ip address to connect to>\n", simOpt , strptr:&(rfsimulator->ip), defstrval:"127.0.0.1", TYPE_STRING, 0 },\
|
||||||
{RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0 },\
|
{"serverport", "<port to connect to>\n", simOpt, u16ptr:&(rfsimulator->port), defuintval:PORT, TYPE_UINT16, 0 },\
|
||||||
{"IQfile", "<file path to use when saving IQs>\n", 0, strptr:&(saveF), defstrval:"/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\
|
{RFSIMU_OPTIONS_PARAMNAME, RFSIM_CONFIG_HELP_OPTIONS, 0, strlistptr:NULL, defstrlistval:NULL, TYPE_STRINGLIST,0 },\
|
||||||
{"modelname", "<channel model name>\n", 0, strptr:&(modelname), defstrval:"AWGN", TYPE_STRING, 0 },\
|
{"IQfile", "<file path to use when saving IQs>\n",simOpt, strptr:&(saveF), defstrval:"/tmp/rfsimulator.iqs",TYPE_STRING, 0 },\
|
||||||
{"ploss", "<channel path loss in dB>\n", 0, dblptr:&(rfsimulator->chan_pathloss), defdblval:0, TYPE_DOUBLE, 0 },\
|
{"modelname", "<channel model name>\n", simOpt, strptr:&(modelname), defstrval:"AWGN", TYPE_STRING, 0 },\
|
||||||
{"forgetfact", "<channel forget factor ((0 to 1)>\n", 0, dblptr:&(rfsimulator->chan_forgetfact), defdblval:0, TYPE_DOUBLE, 0 },\
|
{"ploss", "<channel path loss in dB>\n", simOpt, dblptr:&(rfsimulator->chan_pathloss), defdblval:0, TYPE_DOUBLE, 0 },\
|
||||||
{"offset", "<channel offset in samps>\n", 0, iptr:&(rfsimulator->chan_offset), defintval:0, TYPE_INT, 0 }\
|
{"forgetfact", "<channel forget factor ((0 to 1)>\n", simOpt, dblptr:&(rfsimulator->chan_forgetfact), defdblval:0, TYPE_DOUBLE, 0 },\
|
||||||
|
{"offset", "<channel offset in samps>\n", simOpt, iptr:&(rfsimulator->chan_offset), defintval:0, TYPE_INT, 0 }\
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -137,7 +138,7 @@ typedef struct {
|
|||||||
} rfsimulator_state_t;
|
} rfsimulator_state_t;
|
||||||
|
|
||||||
|
|
||||||
void allocCirBuf(rfsimulator_state_t *bridge, int sock) {
|
static void allocCirBuf(rfsimulator_state_t *bridge, int sock) {
|
||||||
buffer_t *ptr=&bridge->buf[sock];
|
buffer_t *ptr=&bridge->buf[sock];
|
||||||
AssertFatal ( (ptr->circularBuf=(sample_t *) malloc(sampleToByte(CirSize,1))) != NULL, "");
|
AssertFatal ( (ptr->circularBuf=(sample_t *) malloc(sampleToByte(CirSize,1))) != NULL, "");
|
||||||
ptr->circularBufEnd=((char *)ptr->circularBuf)+sampleToByte(CirSize,1);
|
ptr->circularBufEnd=((char *)ptr->circularBuf)+sampleToByte(CirSize,1);
|
||||||
@@ -195,7 +196,7 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeCirBuf(rfsimulator_state_t *bridge, int sock) {
|
static void removeCirBuf(rfsimulator_state_t *bridge, int sock) {
|
||||||
AssertFatal( epoll_ctl(bridge->epollfd, EPOLL_CTL_DEL, sock, NULL) != -1, "");
|
AssertFatal( epoll_ctl(bridge->epollfd, EPOLL_CTL_DEL, sock, NULL) != -1, "");
|
||||||
close(sock);
|
close(sock);
|
||||||
free(bridge->buf[sock].circularBuf);
|
free(bridge->buf[sock].circularBuf);
|
||||||
@@ -206,12 +207,12 @@ void removeCirBuf(rfsimulator_state_t *bridge, int sock) {
|
|||||||
bridge->buf[sock].conn_sock=-1;
|
bridge->buf[sock].conn_sock=-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void socketError(rfsimulator_state_t *bridge, int sock) {
|
static void socketError(rfsimulator_state_t *bridge, int sock) {
|
||||||
if (bridge->buf[sock].conn_sock!=-1) {
|
if (bridge->buf[sock].conn_sock!=-1) {
|
||||||
LOG_W(HW,"Lost socket \n");
|
LOG_W(HW,"Lost socket \n");
|
||||||
removeCirBuf(bridge, sock);
|
removeCirBuf(bridge, sock);
|
||||||
|
|
||||||
if (bridge->typeStamp==UE_MAGICDL_FDD)
|
if (bridge->typeStamp==UE_MAGICDL)
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -229,7 +230,7 @@ enum blocking_t {
|
|||||||
blocking
|
blocking
|
||||||
};
|
};
|
||||||
|
|
||||||
void setblocking(int sock, enum blocking_t active) {
|
static void setblocking(int sock, enum blocking_t active) {
|
||||||
int opts;
|
int opts;
|
||||||
AssertFatal( (opts = fcntl(sock, F_GETFL)) >= 0,"");
|
AssertFatal( (opts = fcntl(sock, F_GETFL)) >= 0,"");
|
||||||
|
|
||||||
@@ -243,7 +244,7 @@ void setblocking(int sock, enum blocking_t active) {
|
|||||||
|
|
||||||
static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps);
|
static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps);
|
||||||
|
|
||||||
void fullwrite(int fd, void *_buf, ssize_t count, rfsimulator_state_t *t) {
|
static void fullwrite(int fd, void *_buf, ssize_t count, rfsimulator_state_t *t) {
|
||||||
if (t->saveIQfile != -1) {
|
if (t->saveIQfile != -1) {
|
||||||
if (write(t->saveIQfile, _buf, count) != count )
|
if (write(t->saveIQfile, _buf, count) != count )
|
||||||
LOG_E(HW,"write in save iq file failed (%s)\n",strerror(errno));
|
LOG_E(HW,"write in save iq file failed (%s)\n",strerror(errno));
|
||||||
@@ -277,7 +278,7 @@ void fullwrite(int fd, void *_buf, ssize_t count, rfsimulator_state_t *t) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) {
|
static void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) {
|
||||||
char *saveF=NULL;
|
char *saveF=NULL;
|
||||||
char *modelname=NULL;
|
char *modelname=NULL;
|
||||||
paramdef_t rfsimu_params[] = RFSIMULATOR_PARAMS_DESC;
|
paramdef_t rfsimu_params[] = RFSIMULATOR_PARAMS_DESC;
|
||||||
@@ -312,9 +313,9 @@ void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) {
|
|||||||
|
|
||||||
if ( strncasecmp(rfsimulator->ip,"enb",3) == 0 ||
|
if ( strncasecmp(rfsimulator->ip,"enb",3) == 0 ||
|
||||||
strncasecmp(rfsimulator->ip,"server",3) == 0 )
|
strncasecmp(rfsimulator->ip,"server",3) == 0 )
|
||||||
rfsimulator->typeStamp = ENB_MAGICDL_FDD;
|
rfsimulator->typeStamp = ENB_MAGICDL;
|
||||||
else
|
else
|
||||||
rfsimulator->typeStamp = UE_MAGICDL_FDD;
|
rfsimulator->typeStamp = UE_MAGICDL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg) {
|
static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg) {
|
||||||
@@ -358,9 +359,9 @@ static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt,
|
|||||||
return CMDSTATUS_FOUND;
|
return CMDSTATUS_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
int server_start(openair0_device *device) {
|
static int startServer(openair0_device *device) {
|
||||||
rfsimulator_state_t *t = (rfsimulator_state_t *) device->priv;
|
rfsimulator_state_t *t = (rfsimulator_state_t *) device->priv;
|
||||||
t->typeStamp=ENB_MAGICDL_FDD;
|
t->typeStamp=ENB_MAGICDL;
|
||||||
AssertFatal((t->listen_sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0, "");
|
AssertFatal((t->listen_sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0, "");
|
||||||
int enable = 1;
|
int enable = 1;
|
||||||
AssertFatal(setsockopt(t->listen_sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) == 0, "");
|
AssertFatal(setsockopt(t->listen_sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) == 0, "");
|
||||||
@@ -381,9 +382,9 @@ sin_addr:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int start_ue(openair0_device *device) {
|
static int startClient(openair0_device *device) {
|
||||||
rfsimulator_state_t *t = device->priv;
|
rfsimulator_state_t *t = device->priv;
|
||||||
t->typeStamp=UE_MAGICDL_FDD;
|
t->typeStamp=UE_MAGICDL;
|
||||||
int sock;
|
int sock;
|
||||||
AssertFatal((sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0, "");
|
AssertFatal((sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0, "");
|
||||||
struct sockaddr_in addr = {
|
struct sockaddr_in addr = {
|
||||||
@@ -458,7 +459,7 @@ static int rfsimulator_write_internal(rfsimulator_state_t *t, openair0_timestamp
|
|||||||
return nsamps;
|
return nsamps;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rfsimulator_write(openair0_device *device, openair0_timestamp timestamp, void **samplesVoid, int nsamps, int nbAnt, int flags) {
|
static int rfsimulator_write(openair0_device *device, openair0_timestamp timestamp, void **samplesVoid, int nsamps, int nbAnt, int flags) {
|
||||||
return rfsimulator_write_internal(device->priv, timestamp, samplesVoid, nsamps, nbAnt, flags, false);
|
return rfsimulator_write_internal(device->priv, timestamp, samplesVoid, nsamps, nbAnt, flags, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -483,7 +484,7 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi
|
|||||||
AssertFatal( (conn_sock = accept(t->listen_sock,NULL,NULL)) != -1, "");
|
AssertFatal( (conn_sock = accept(t->listen_sock,NULL,NULL)) != -1, "");
|
||||||
setblocking(conn_sock, notBlocking);
|
setblocking(conn_sock, notBlocking);
|
||||||
allocCirBuf(t, conn_sock);
|
allocCirBuf(t, conn_sock);
|
||||||
LOG_I(HW,"A ue connected, sending the current time\n");
|
LOG_I(HW,"A client connected, sending the current time\n");
|
||||||
struct complex16 v= {0};
|
struct complex16 v= {0};
|
||||||
void *samplesVoid[t->tx_num_channels];
|
void *samplesVoid[t->tx_num_channels];
|
||||||
|
|
||||||
@@ -534,8 +535,8 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi
|
|||||||
|
|
||||||
// check the header and start block transfer
|
// check the header and start block transfer
|
||||||
if ( b->headerMode==true && b->remainToTransfer==0) {
|
if ( b->headerMode==true && b->remainToTransfer==0) {
|
||||||
AssertFatal( (t->typeStamp == UE_MAGICDL_FDD && b->th.magic==ENB_MAGICDL_FDD) ||
|
AssertFatal( (t->typeStamp == UE_MAGICDL && b->th.magic==ENB_MAGICDL) ||
|
||||||
(t->typeStamp == ENB_MAGICDL_FDD && b->th.magic==UE_MAGICDL_FDD), "Socket Error in protocol");
|
(t->typeStamp == ENB_MAGICDL && b->th.magic==UE_MAGICDL), "Socket Error in protocol");
|
||||||
b->headerMode=false;
|
b->headerMode=false;
|
||||||
|
|
||||||
if ( t->nextTimestamp == 0 ) { // First block in UE, resync with the eNB current TS
|
if ( t->nextTimestamp == 0 ) { // First block in UE, resync with the eNB current TS
|
||||||
@@ -606,7 +607,7 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi
|
|||||||
return nfds>0;
|
return nfds>0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, void **samplesVoid, int nsamps, int nbAnt) {
|
static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, void **samplesVoid, int nsamps, int nbAnt) {
|
||||||
if (nbAnt != 1) {
|
if (nbAnt != 1) {
|
||||||
LOG_W(HW, "rfsimulator: only 1 antenna tested\n");
|
LOG_W(HW, "rfsimulator: only 1 antenna tested\n");
|
||||||
}
|
}
|
||||||
@@ -748,31 +749,24 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo
|
|||||||
signal_energy(samplesVoid[0], nsamps));
|
signal_energy(samplesVoid[0], nsamps));
|
||||||
return nsamps;
|
return nsamps;
|
||||||
}
|
}
|
||||||
int rfsimulator_request(openair0_device *device, void *msg, ssize_t msg_len) {
|
|
||||||
abort();
|
static int rfsimulator_get_stats(openair0_device *device) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int rfsimulator_reply(openair0_device *device, void *msg, ssize_t msg_len) {
|
static int rfsimulator_reset_stats(openair0_device *device) {
|
||||||
abort();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int rfsimulator_get_stats(openair0_device *device) {
|
static void rfsimulator_end(openair0_device *device) {}
|
||||||
|
static int rfsimulator_stop(openair0_device *device) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int rfsimulator_reset_stats(openair0_device *device) {
|
static int rfsimulator_set_freq(openair0_device *device, openair0_config_t *openair0_cfg,int exmimo_dump_config) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
void rfsimulator_end(openair0_device *device) {}
|
static int rfsimulator_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||||
int rfsimulator_stop(openair0_device *device) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int rfsimulator_set_freq(openair0_device *device, openair0_config_t *openair0_cfg,int exmimo_dump_config) {
|
static int rfsimulator_write_init(openair0_device *device) {
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int rfsimulator_set_gains(openair0_device *device, openair0_config_t *openair0_cfg) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
int rfsimulator_write_init(openair0_device *device) {
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
__attribute__((__visibility__("default")))
|
__attribute__((__visibility__("default")))
|
||||||
@@ -782,10 +776,10 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
|
|||||||
rfsimulator_state_t *rfsimulator = (rfsimulator_state_t *)calloc(sizeof(rfsimulator_state_t),1);
|
rfsimulator_state_t *rfsimulator = (rfsimulator_state_t *)calloc(sizeof(rfsimulator_state_t),1);
|
||||||
rfsimulator_readconfig(rfsimulator);
|
rfsimulator_readconfig(rfsimulator);
|
||||||
pthread_mutex_init(&Sockmutex, NULL);
|
pthread_mutex_init(&Sockmutex, NULL);
|
||||||
LOG_I(HW,"rfsimulator: running as %s\n", rfsimulator-> typeStamp == ENB_MAGICDL_FDD ? "(eg)NB" : "UE");
|
LOG_I(HW,"rfsimulator: running as %s\n", rfsimulator-> typeStamp == ENB_MAGICDL ? "server waiting opposite rfsimulators to connect" : "client: will connect to a rfsimulator server side");
|
||||||
device->trx_start_func = rfsimulator->typeStamp == ENB_MAGICDL_FDD ?
|
device->trx_start_func = rfsimulator->typeStamp == ENB_MAGICDL ?
|
||||||
server_start :
|
startServer :
|
||||||
start_ue;
|
startClient;
|
||||||
device->trx_get_stats_func = rfsimulator_get_stats;
|
device->trx_get_stats_func = rfsimulator_get_stats;
|
||||||
device->trx_reset_stats_func = rfsimulator_reset_stats;
|
device->trx_reset_stats_func = rfsimulator_reset_stats;
|
||||||
device->trx_end_func = rfsimulator_end;
|
device->trx_end_func = rfsimulator_end;
|
||||||
@@ -795,7 +789,7 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
|
|||||||
device->trx_write_func = rfsimulator_write;
|
device->trx_write_func = rfsimulator_write;
|
||||||
device->trx_read_func = rfsimulator_read;
|
device->trx_read_func = rfsimulator_read;
|
||||||
/* let's pretend to be a b2x0 */
|
/* let's pretend to be a b2x0 */
|
||||||
device->type = USRP_B200_DEV;
|
device->type = RFSIMULATOR;
|
||||||
device->openair0_cfg=&openair0_cfg[0];
|
device->openair0_cfg=&openair0_cfg[0];
|
||||||
device->priv = rfsimulator;
|
device->priv = rfsimulator;
|
||||||
device->trx_write_init = rfsimulator_write_init;
|
device->trx_write_init = rfsimulator_write_init;
|
||||||
|
|||||||
Reference in New Issue
Block a user