diff --git a/radio/rfsimulator/README.md b/radio/rfsimulator/README.md index dac8b155ad..ae46034cec 100644 --- a/radio/rfsimulator/README.md +++ b/radio/rfsimulator/README.md @@ -69,16 +69,17 @@ the corresponding section in the configuration file. The RF simulator is using the configuration module, and its parameters are defined in a specific section called "rfsimulator". Add the following options to the command line in order to enable different RFSim features: -| CL option | usage | default | -|:--------------------- |:-------------------------------------------------------------------------------|----: | -|`--rfsimulator.serveraddr `| IPv4v6 address or DNS name to connect to, or `server` to behave as a IPv4v6 TCP server | 127.0.0.1 | -|`--rfsimulator.serverport `| port number to connect to or to listen on (eNB, which behaves as a tcp server) | 4043 | -|`--rfsimulator.options` | list of comma separated run-time options, two are supported: `chanmod`, `saviq`| all options disabled | -|`--rfsimulator.options saviq` | store IQs to a file for future replay | disabled | -|`--rfsimulator.options chanmod` | enable the channel model | disabled | -|`--rfsimulator.IQfile ` | path to a file to store the IQ samples to (only with `saviq`) | `/tmp/rfsimulator.iqs` | -|`--rfsimulator.prop_delay` | simulated receive-path (gNB: UL, UE: DL) propagation delay in ms | 0 | -|`--rfsimulator.wait_timeout` | wait timeout when no UE is connected | 1 | +| CL option | usage | default | +|:--------------------- |:-------------------------------------------------------------------------------|----: | +|`--rfsimulator.serveraddr ` | IPv4v6 address or DNS name to connect to, or `server` to behave as a IPv4v6 TCP server | 127.0.0.1 | +|`--rfsimulator.serverport ` | port number to connect to or to listen on (eNB, which behaves as a tcp server) | 4043 | +|`--rfsimulator.options` | list of comma separated run-time options, two are supported: `chanmod`, `saviq`| all options disabled | +|`--rfsimulator.options saviq` | store IQs to a file for future replay | disabled | +|`--rfsimulator.options chanmod` | enable the channel model | disabled | +|`--rfsimulator.IQfile ` | path to a file to store the IQ samples to (only with `saviq`) | `/tmp/rfsimulator.iqs` | +|`--rfsimulator.prop_delay` | simulated receive-path (gNB: UL, UE: DL) propagation delay in ms | 0 | +|`--rfsimulator.wait_timeout` | wait timeout when no UE is connected | 1 | +|`--rfismulator.hanging-workaround`| Enable workaround to de-block potentially hanging server on new client connection. | 0 | Please refer to this document [`SIMULATION/TOOLS/DOC/channel_simulation.md`](../../openair1/SIMULATION/TOOLS/DOC/channel_simulation.md) for information about using the RFSimulator options to run the simulator with a channel model. diff --git a/radio/rfsimulator/simulator.c b/radio/rfsimulator/simulator.c index c733f4c8a2..8cf4324dd7 100644 --- a/radio/rfsimulator/simulator.c +++ b/radio/rfsimulator/simulator.c @@ -101,6 +101,8 @@ typedef enum { SIMU_ROLE_SERVER = 1, SIMU_ROLE_CLIENT } simuRole; #define RFSIM_CONFIG_HELP_OPTIONS " list of comma separated options to enable rf simulator functionalities. Available options: \n"\ " chanmod: enable channel modelisation\n"\ " saviq: enable saving written iqs to a file\n" +#define CONFIG_HELP_HANG_WORKAROUND "Enable workaroud for server mode hanging on new client connection.\n" + /*-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/ /* configuration parameters for the rfsimulator device */ /* optname helpstr paramflags XXXptr defXXXval type numelt */ @@ -117,6 +119,7 @@ typedef enum { SIMU_ROLE_SERVER = 1, SIMU_ROLE_CLIENT } simuRole; {"offset", "\n", simOpt, .u64ptr=&(rfsimulator->chan_offset), .defint64val=0, TYPE_UINT64, 0 },\ {"prop_delay", "\n", simOpt, .dblptr=&(rfsimulator->prop_delay_ms), .defdblval=0.0, TYPE_DOUBLE, 0 },\ {"wait_timeout", "\n", simOpt, .iptr=&(rfsimulator->wait_timeout), .defintval=1, TYPE_INT, 0 },\ + {"hanging-workaround", CONFIG_HELP_HANG_WORKAROUND, simOpt, .iptr=&rfsimulator->hanging_workaround, .defintval=0, TYPE_INT, 0 },\ }; static void getset_currentchannels_type(char *buf, int debug, webdatadef_t *tdata, telnet_printfunc_t prnt); @@ -181,6 +184,7 @@ typedef struct { poll_telnetcmdq_func_t poll_telnetcmdq; int wait_timeout; double prop_delay_ms; + int hanging_workaround; } rfsimulator_state_t; @@ -994,7 +998,7 @@ static int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimest t->nextRxTstamp + nsamps); flushInput(t, 3, nsamps); } - if (loops++ > 10 && t->role == SIMU_ROLE_SERVER) { + if (t->hanging_workaround && loops++ > 10 && t->role == SIMU_ROLE_SERVER) { // Just start producing samples. The clients will catch up. have_to_wait = false; LOG_W(HW,