diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c index 831d6032c8d5803a78f732c02bc628c8ba4bf1e6..1a96a50b21a917364ad940823d2701e6f848c3a8 100644 --- a/common/utils/telnetsrv/telnetsrv.c +++ b/common/utils/telnetsrv/telnetsrv.c @@ -684,6 +684,16 @@ void run_telnetsrv(void) { return; } +void poll_telnetcmdq(void *qid) { + notifiedFIFO_elt_t *msg = pollNotifiedFIFO((notifiedFIFO_t *)qid); + + if (msg != NULL) { + telnetsrv_qmsg_t *msgdata=NotifiedFifoData(msg); + msgdata->cmdfunc(msgdata->cmdbuff,msgdata->debug,msgdata->prnt); + free(msgdata->cmdbuff); + delNotifiedFIFO_elt(msg); + } +} /*------------------------------------------------------------------------------------------------*/ /* load the commands delivered with the telnet server * diff --git a/common/utils/telnetsrv/telnetsrv.h b/common/utils/telnetsrv/telnetsrv.h index 32ec2b9666f067c17606f4911bd614c291a57694..4aceb640798ca4bf037c385544cd810f36fbcb10 100644 --- a/common/utils/telnetsrv/telnetsrv.h +++ b/common/utils/telnetsrv/telnetsrv.h @@ -142,8 +142,9 @@ VT escape sequence definition, for smarter display.... /*---------------------------------------------------------------------------------------------*/ #define TELNET_ADDCMD_FNAME "add_telnetcmd" -#define TELNET_ADDQUEUEDCMD_FNAME "add_telnetqueuedcmd" +#define TELNET_POLLCMDQ_FNAME "poll_telnetcmdq" typedef int(*add_telnetcmd_func_t)(char *, telnetshell_vardef_t *, telnetshell_cmddef_t *); +typedef void(*poll_telnetcmdq_func_t)(void *qid); #ifdef TELNETSERVERCODE int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd); void set_sched(pthread_t tid, int pid,int priority); diff --git a/targets/ARCH/rfsimulator/simulator.c b/targets/ARCH/rfsimulator/simulator.c index 4b0c0a35e4a78b4809b3c5a5b021bb5abe55c0f1..9ad05f3a883962f03d6ecac41bfc238d9b6ad909 100644 --- a/targets/ARCH/rfsimulator/simulator.c +++ b/targets/ARCH/rfsimulator/simulator.c @@ -44,6 +44,7 @@ #include <common/utils/assertions.h> #include <common/utils/LOG/log.h> #include <common/utils/load_module_shlib.h> +#include <common/utils/telnetsrv/telnetsrv.h> #include <common/config/config_userapi.h> #include "common_lib.h" #include <openair1/PHY/defs_eNB.h> @@ -86,6 +87,17 @@ extern RAN_CONTEXT_t RC; {"offset", "<channel offset in samps>\n", 0, iptr:&(rfsimulator->chan_offset), defintval:0, TYPE_INT, 0 }\ }; + + +static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt); +static telnetshell_cmddef_t rfsimu_cmdarray[] = { + {"setmodel","<model name>",rfsimu_setchanmod_cmd,TELNETSRV_CMDFLAG_PUSHINTPOOLQ}, + {"","",NULL}, +}; + +static telnetshell_vardef_t rfsimu_vardef[] = { + {"",0,NULL} +}; pthread_mutex_t Sockmutex; typedef struct complex16 sample_t; // 2*16 bits complex number @@ -120,6 +132,8 @@ typedef struct { double chan_pathloss; double chan_forgetfact; int chan_offset; + void *telnetcmd_qid; + poll_telnetcmdq_func_t poll_telnetcmdq; } rfsimulator_state_t; @@ -157,7 +171,8 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) { if (!init_done) { uint64_t rand; FILE *h=fopen("/dev/random","r"); - fread(&rand,sizeof(rand),1,h); + int st=fread(&rand,sizeof(rand),1,h); + AssertFatal(st != -1, "Error reading random int %s\n",strerror(errno)); fclose(h); randominit(rand); tableNor(rand); @@ -296,6 +311,28 @@ void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) { rfsimulator->typeStamp = UE_MAGICDL_FDD; } +static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt) { + char *modelname=NULL; + int s = sscanf(buff,"%ms\n",&modelname); + int channelmod=modelid_fromname(modelname); + for (int i=0; i<FD_SETSIZE; i++) { +/* if(rfsimulator->buf[i].conn_sock > 0) { + channel_desc_t *cm = rfsimulator->buf[i].channel_model; + + rfsimulator->buf[i].channel_model=new_channel_desc_scm(cm->nb_tx,cm->nb_rx, + channelmod, + cm->sampling_rate, + cm->channel_bandwidth, + cm->forgetting_factor, // forgetting_factor + cm->channel_offset, // maybe used for TA + cm-> path_loss_dB); // path_loss in dB + free_channel_desc_scm(cm); + random_channel(ptr->channel_model,false); + } */ + } + return CMDSTATUS_FOUND; +} + int server_start(openair0_device *device) { rfsimulator_state_t *t = (rfsimulator_state_t *) device->priv; t->typeStamp=ENB_MAGICDL_FDD; @@ -646,7 +683,7 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo // it seems legacy behavior is: never in UL, each frame in DL if (reGenerateChannel) random_channel(ptr->channel_model,0); - + t->poll_telnetcmdq(t->telnetcmd_qid); for (int a=0; a<nbAnt; a++) { if ( ptr->channel_model != NULL ) // apply a channel model rxAddInput( ptr->circularBuf, (struct complex16 *) samplesVoid[a], @@ -740,5 +777,18 @@ int device_init(openair0_device *device, openair0_config_t *openair0_cfg) { rfsimulator->tx_bw=openair0_cfg->tx_bw; //randominit(0); set_taus_seed(0); + /* look for telnet server, if it is loaded, add the channel modeling commands to it */ + add_telnetcmd_func_t addcmd = (add_telnetcmd_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_ADDCMD_FNAME); + + if (addcmd != NULL) { + rfsimulator->poll_telnetcmdq = (poll_telnetcmdq_func_t)get_shlibmodule_fptr("telnetsrv", TELNET_POLLCMDQ_FNAME); + addcmd("rfsimu",rfsimu_vardef,rfsimu_cmdarray); + for(int i=0; rfsimu_cmdarray[i].cmdfunc != NULL; i++) { + if ( rfsimu_cmdarray[i].qptr != NULL) { + rfsimulator->telnetcmd_qid = rfsimu_cmdarray[i].qptr; + break; + } + } + } return 0; }