Commit d4bd2cdc authored by frtabu's avatar frtabu

implement modifying channel model algo while running, complete function freeing a model

parent f5d1dbb7
...@@ -508,7 +508,7 @@ int process_command(char *buf) { ...@@ -508,7 +508,7 @@ int process_command(char *buf) {
} }
rt= CMDSTATUS_FOUND; rt= CMDSTATUS_FOUND;
} else if (strncasecmp(cmd,"get",3) == 0 || strncasecmp(cmd,"set",3) == 0) { } else if (strcasecmp(cmd,"get") == 0 || strcasecmp(cmd,"set") == 0) {
rt= setgetvar(i,cmd[0],cmdb); rt= setgetvar(i,cmd[0],cmdb);
} else { } else {
for (k=0 ; telnetparams.CmdParsers[i].cmd[k].cmdfunc != NULL ; k++) { for (k=0 ; telnetparams.CmdParsers[i].cmd[k].cmdfunc != NULL ; k++) {
...@@ -516,7 +516,7 @@ int process_command(char *buf) { ...@@ -516,7 +516,7 @@ int process_command(char *buf) {
if (telnetparams.CmdParsers[i].cmd[k].qptr != NULL) { if (telnetparams.CmdParsers[i].cmd[k].qptr != NULL) {
notifiedFIFO_elt_t *msg =newNotifiedFIFO_elt(sizeof(telnetsrv_qmsg_t),0,NULL,NULL); notifiedFIFO_elt_t *msg =newNotifiedFIFO_elt(sizeof(telnetsrv_qmsg_t),0,NULL,NULL);
telnetsrv_qmsg_t *cmddata=NotifiedFifoData(msg); telnetsrv_qmsg_t *cmddata=NotifiedFifoData(msg);
cmddata->cmdfunc=telnetparams.CmdParsers[i].cmd[k].cmdfunc; cmddata->cmdfunc=(qcmdfunc_t)telnetparams.CmdParsers[i].cmd[k].cmdfunc;
cmddata->prnt=client_printf; cmddata->prnt=client_printf;
cmddata->debug=telnetparams.telnetdbg; cmddata->debug=telnetparams.telnetdbg;
cmddata->cmdbuff=strdup(cmdb); cmddata->cmdbuff=strdup(cmdb);
...@@ -684,12 +684,12 @@ void run_telnetsrv(void) { ...@@ -684,12 +684,12 @@ void run_telnetsrv(void) {
return; return;
} }
void poll_telnetcmdq(void *qid) { void poll_telnetcmdq(void *qid, void *arg) {
notifiedFIFO_elt_t *msg = pollNotifiedFIFO((notifiedFIFO_t *)qid); notifiedFIFO_elt_t *msg = pollNotifiedFIFO((notifiedFIFO_t *)qid);
if (msg != NULL) { if (msg != NULL) {
telnetsrv_qmsg_t *msgdata=NotifiedFifoData(msg); telnetsrv_qmsg_t *msgdata=NotifiedFifoData(msg);
msgdata->cmdfunc(msgdata->cmdbuff,msgdata->debug,msgdata->prnt); msgdata->cmdfunc(msgdata->cmdbuff,msgdata->debug,msgdata->prnt,arg);
free(msgdata->cmdbuff); free(msgdata->cmdbuff);
delNotifiedFIFO_elt(msg); delNotifiedFIFO_elt(msg);
} }
...@@ -826,8 +826,10 @@ int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildvers ...@@ -826,8 +826,10 @@ int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildvers
} }
int telnetsrv_getfarray(loader_shlibfunc_t **farray) { int telnetsrv_getfarray(loader_shlibfunc_t **farray) {
*farray=malloc(sizeof(loader_shlibfunc_t)); *farray=malloc(sizeof(loader_shlibfunc_t)*2);
(*farray)[0].fname=TELNET_ADDCMD_FNAME; (*farray)[0].fname=TELNET_ADDCMD_FNAME;
(*farray)[0].fptr=(int (*)(void) )add_telnetcmd; (*farray)[0].fptr=(int (*)(void) )add_telnetcmd;
return 1; (*farray)[1].fname=TELNET_POLLCMDQ_FNAME;
(*farray)[1].fptr=(int (*)(void) )poll_telnetcmdq;
return ( 2);
} }
...@@ -53,6 +53,7 @@ ...@@ -53,6 +53,7 @@
/* to add a set of new command to the telnet server shell */ /* to add a set of new command to the telnet server shell */
typedef void(*telnet_printfunc_t)(const char* format, ...); typedef void(*telnet_printfunc_t)(const char* format, ...);
typedef int(*cmdfunc_t)(char*, int, telnet_printfunc_t prnt); typedef int(*cmdfunc_t)(char*, int, telnet_printfunc_t prnt);
typedef int(*qcmdfunc_t)(char*, int, telnet_printfunc_t prnt,void *arg);
#define TELNETSRV_CMDFLAG_PUSHINTPOOLQ (1<<0) // ask the telnet server to push the command in a thread pool queue #define TELNETSRV_CMDFLAG_PUSHINTPOOLQ (1<<0) // ask the telnet server to push the command in a thread pool queue
typedef struct cmddef { typedef struct cmddef {
...@@ -67,7 +68,7 @@ typedef struct cmddef { ...@@ -67,7 +68,7 @@ typedef struct cmddef {
/* structure used to send a command via a message queue to enable */ /* structure used to send a command via a message queue to enable */
/* executing a command in a thread different from the telnet server thread */ /* executing a command in a thread different from the telnet server thread */
typedef struct telnetsrv_qmsg { typedef struct telnetsrv_qmsg {
cmdfunc_t cmdfunc; qcmdfunc_t cmdfunc;
telnet_printfunc_t prnt; telnet_printfunc_t prnt;
int debug; int debug;
char *cmdbuff; char *cmdbuff;
...@@ -144,7 +145,7 @@ VT escape sequence definition, for smarter display.... ...@@ -144,7 +145,7 @@ VT escape sequence definition, for smarter display....
#define TELNET_ADDCMD_FNAME "add_telnetcmd" #define TELNET_ADDCMD_FNAME "add_telnetcmd"
#define TELNET_POLLCMDQ_FNAME "poll_telnetcmdq" #define TELNET_POLLCMDQ_FNAME "poll_telnetcmdq"
typedef int(*add_telnetcmd_func_t)(char *, telnetshell_vardef_t *, telnetshell_cmddef_t *); typedef int(*add_telnetcmd_func_t)(char *, telnetshell_vardef_t *, telnetshell_cmddef_t *);
typedef void(*poll_telnetcmdq_func_t)(void *qid); typedef void(*poll_telnetcmdq_func_t)(void *qid,void *arg);
#ifdef TELNETSERVERCODE #ifdef TELNETSERVERCODE
int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd); int add_telnetcmd(char *modulename, telnetshell_vardef_t *var, telnetshell_cmddef_t *cmd);
void set_sched(pthread_t tid, int pid,int priority); void set_sched(pthread_t tid, int pid,int priority);
......
This diff is collapsed.
...@@ -40,6 +40,16 @@ The present clause specifies several numerical functions for testing of digital ...@@ -40,6 +40,16 @@ The present clause specifies several numerical functions for testing of digital
#define NB_SAMPLES_CHANNEL_OFFSET 4 #define NB_SAMPLES_CHANNEL_OFFSET 4
typedef enum {
UNSPECIFIED_MODID=0,
RFSIMU_MODULEID=1
} channelmod_moduleid_t;
#define MODULEID_STR_INIT {"","rfsimulator"}
#define CHANMODEL_FREE_DELAY 1<<0
#define CHANMODEL_FREE_RSQRT_6 1<<1
#define CHANMODEL_FREE_RSQRT_NTAPS 1<<2
#define CHANMODEL_FREE_AMPS 1<<3
typedef struct { typedef struct {
///Number of tx antennas ///Number of tx antennas
uint8_t nb_tx; uint8_t nb_tx;
...@@ -96,6 +106,10 @@ typedef struct { ...@@ -96,6 +106,10 @@ typedef struct {
unsigned int chan_idx; unsigned int chan_idx;
/// id of the channel modeling algorithm /// id of the channel modeling algorithm
int modelid; int modelid;
/// identifies channel descriptor owner (the module which created this descriptor)
channelmod_moduleid_t module_id;
/// flags to properly trigger memory free
unsigned int free_flags;
} channel_desc_t; } channel_desc_t;
typedef struct { typedef struct {
...@@ -278,9 +292,18 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx, ...@@ -278,9 +292,18 @@ channel_desc_t *new_channel_desc_scm(uint8_t nb_tx,
double forgetting_factor, double forgetting_factor,
int32_t channel_offset, int32_t channel_offset,
double path_loss_dB); double path_loss_dB);
/**
\brief free memory allocated for a model descriptor
\param ch points to the model, which cannot be used after calling this fuction
*/
void free_channel_desc_scm(channel_desc_t *ch);
/**
\brief This set the ownerid of a model descriptor, can be later used to check what module created a channel model
\param cdesc points to the model descriptor
\param module_id identifies the channel model. should be define as a macro in simu.h
*/
void set_channeldesc_owner(channel_desc_t *cdesc, channelmod_moduleid_t module_id);
/** \fn void random_channel(channel_desc_t *desc) /** \fn void random_channel(channel_desc_t *desc)
\brief This routine generates a random channel response (time domain) according to a tapped delay line model. \brief This routine generates a random channel response (time domain) according to a tapped delay line model.
\param desc Pointer to the channel descriptor \param desc Pointer to the channel descriptor
......
...@@ -89,9 +89,9 @@ extern RAN_CONTEXT_t RC; ...@@ -89,9 +89,9 @@ extern RAN_CONTEXT_t RC;
static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt); static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg);
static telnetshell_cmddef_t rfsimu_cmdarray[] = { static telnetshell_cmddef_t rfsimu_cmdarray[] = {
{"setmodel","<model name>",rfsimu_setchanmod_cmd,TELNETSRV_CMDFLAG_PUSHINTPOOLQ}, {"setmodel","<model name>",(cmdfunc_t)rfsimu_setchanmod_cmd,TELNETSRV_CMDFLAG_PUSHINTPOOLQ},
{"","",NULL}, {"","",NULL},
}; };
...@@ -185,6 +185,7 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) { ...@@ -185,6 +185,7 @@ void allocCirBuf(rfsimulator_state_t *bridge, int sock) {
bridge->chan_forgetfact, // forgetting_factor bridge->chan_forgetfact, // forgetting_factor
bridge->chan_offset, // maybe used for TA bridge->chan_offset, // maybe used for TA
bridge->chan_pathloss); // path_loss in dB bridge->chan_pathloss); // path_loss in dB
set_channeldesc_owner(ptr->channel_model, RFSIMU_MODULEID);
random_channel(ptr->channel_model,false); random_channel(ptr->channel_model,false);
} }
} }
...@@ -311,25 +312,38 @@ void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) { ...@@ -311,25 +312,38 @@ void rfsimulator_readconfig(rfsimulator_state_t *rfsimulator) {
rfsimulator->typeStamp = UE_MAGICDL_FDD; rfsimulator->typeStamp = UE_MAGICDL_FDD;
} }
static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt) { static int rfsimu_setchanmod_cmd(char *buff, int debug, telnet_printfunc_t prnt, void *arg) {
char *modelname=NULL; char *modelname=NULL;
int s = sscanf(buff,"%ms\n",&modelname); int s = sscanf(buff,"%ms\n",&modelname);
int channelmod=modelid_fromname(modelname); if (s == 1) {
for (int i=0; i<FD_SETSIZE; i++) { int channelmod=modelid_fromname(modelname);
/* if(rfsimulator->buf[i].conn_sock > 0) { if (channelmod<0)
channel_desc_t *cm = rfsimulator->buf[i].channel_model; prnt("ERROR: model %s unknown\n",modelname);
else {
rfsimulator->buf[i].channel_model=new_channel_desc_scm(cm->nb_tx,cm->nb_rx, rfsimulator_state_t *t = (rfsimulator_state_t *)arg;
channelmod, for (int i=0; i<FD_SETSIZE; i++) {
cm->sampling_rate, buffer_t *b=&t->buf[i];
cm->channel_bandwidth, if (b->conn_sock >= 0 ) {
cm->forgetting_factor, // forgetting_factor channel_desc_t *newmodel=new_channel_desc_scm(t->tx_num_channels,t->rx_num_channels,
cm->channel_offset, // maybe used for TA channelmod,
cm-> path_loss_dB); // path_loss in dB t->sample_rate,
free_channel_desc_scm(cm); t->tx_bw,
random_channel(ptr->channel_model,false); t->chan_forgetfact, // forgetting_factor
} */ t->chan_offset, // maybe used for TA
t->chan_pathloss); // path_loss in dB
set_channeldesc_owner(newmodel, RFSIMU_MODULEID);
random_channel(newmodel,false);
channel_desc_t *oldmodel=b->channel_model;
b->channel_model=newmodel;
free_channel_desc_scm(oldmodel);
prnt("New model %s applied to channel connected to sock %d\n",modelname,i);
}
}
}
} else {
prnt("ERROR: no model specified\n");
} }
free(modelname);
return CMDSTATUS_FOUND; return CMDSTATUS_FOUND;
} }
...@@ -683,7 +697,8 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo ...@@ -683,7 +697,8 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo
// it seems legacy behavior is: never in UL, each frame in DL // it seems legacy behavior is: never in UL, each frame in DL
if (reGenerateChannel) if (reGenerateChannel)
random_channel(ptr->channel_model,0); random_channel(ptr->channel_model,0);
t->poll_telnetcmdq(t->telnetcmd_qid); if (t->poll_telnetcmdq)
t->poll_telnetcmdq(t->telnetcmd_qid,t);
for (int a=0; a<nbAnt; a++) { for (int a=0; a<nbAnt; a++) {
if ( ptr->channel_model != NULL ) // apply a channel model if ( ptr->channel_model != NULL ) // apply a channel model
rxAddInput( ptr->circularBuf, (struct complex16 *) samplesVoid[a], rxAddInput( ptr->circularBuf, (struct complex16 *) samplesVoid[a],
......
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