Commit ab78ae18 authored by Laurent THOMAS's avatar Laurent THOMAS

remove-tab-character-from-source

parent 6debc5dd
...@@ -220,9 +220,7 @@ int config_cmdlineonly_get(configmodule_interface_t *cfg, paramdef_t *cfgoptions ...@@ -220,9 +220,7 @@ int config_cmdlineonly_get(configmodule_interface_t *cfg, paramdef_t *cfgoptions
return numdefvals; return numdefvals;
} }
configmodule_interface_t *load_configmodule(int argc, configmodule_interface_t *load_configmodule(int argc, char **argv, uint32_t initflags)
char **argv,
uint32_t initflags)
{ {
char *cfgparam=NULL; char *cfgparam=NULL;
char *modeparams=NULL; char *modeparams=NULL;
...@@ -242,7 +240,7 @@ configmodule_interface_t *load_configmodule(int argc, ...@@ -242,7 +240,7 @@ configmodule_interface_t *load_configmodule(int argc,
/* first parse the command line to look for the -O option */ /* first parse the command line to look for the -O option */
for (i = 0; i<argc; i++) { for (i = 0; i<argc; i++) {
if (strlen(argv[i]) < 2) if (strlen(argv[i]) < 2)
continue; continue;
if ( argv[i][1] == 'O' && i < (argc -1)) { if ( argv[i][1] == 'O' && i < (argc -1)) {
cfgparam = argv[i+1]; cfgparam = argv[i+1];
......
...@@ -559,15 +559,15 @@ int config_libconfig_init(configmodule_interface_t *cfg) ...@@ -559,15 +559,15 @@ int config_libconfig_init(configmodule_interface_t *cfg)
memset(cfg->oneBlock, 0, sizeof(cfg->oneBlock)); memset(cfg->oneBlock, 0, sizeof(cfg->oneBlock));
/* search for include path parameter and set config file include path accordingly */ /* search for include path parameter and set config file include path accordingly */
for (int i=0; i<numP; i++) { for (int i=0; i<numP; i++) {
if (strncmp(cfgP[i],"incp",4) == 0) { if (strncmp(cfgP[i], "incp", 4) == 0) {
config_set_include_dir (&(libconfig_privdata.cfg),cfgP[i]+4); config_set_include_dir(&(libconfig_privdata.cfg), cfgP[i] + 4);
break; break;
} }
} }
/* dirname may modify the input path and returned ptr may points to part of input path */ /* dirname may modify the input path and returned ptr may points to part of input path */
char *tmppath = strdup(libconfig_privdata.configfile); char *tmppath = strdup(libconfig_privdata.configfile);
if ( config_get_include_dir (&(libconfig_privdata.cfg)) == NULL) { if ( config_get_include_dir (&(libconfig_privdata.cfg)) == NULL) {
config_set_include_dir (&(libconfig_privdata.cfg),dirname( tmppath )); config_set_include_dir(&(libconfig_privdata.cfg), dirname(tmppath));
} }
const char *incp = config_get_include_dir (&(libconfig_privdata.cfg)) ; const char *incp = config_get_include_dir (&(libconfig_privdata.cfg)) ;
...@@ -589,7 +589,7 @@ int config_libconfig_init(configmodule_interface_t *cfg) ...@@ -589,7 +589,7 @@ int config_libconfig_init(configmodule_interface_t *cfg)
/* possibly init a libconfig struct for saving really used params */ /* possibly init a libconfig struct for saving really used params */
if (cfg->rtflags & CONFIG_SAVERUNCFG) { if (cfg->rtflags & CONFIG_SAVERUNCFG) {
config_init(&(libconfig_privdata.runtcfg)); config_init(&(libconfig_privdata.runtcfg));
// config_set_options (&(libconfig_privdata.runtcfg), CONFIG_OPTION_ALLOW_OVERRIDES, CONFIG_TRUE); // config_set_options (&(libconfig_privdata.runtcfg), CONFIG_OPTION_ALLOW_OVERRIDES, CONFIG_TRUE);
} }
free(tmppath); free(tmppath);
return 0; return 0;
......
...@@ -97,14 +97,7 @@ static const char *const log_level_highlight_end[] = ...@@ -97,14 +97,7 @@ static const char *const log_level_highlight_end[] =
{LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */ {LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET}; /*!< \brief Optional end-format strings for highlighting */
static void log_output_memory(log_component_t *c, const char *file, const char *func, int line, int comp, int level, const char* format,va_list args); static void log_output_memory(log_component_t *c, const char *file, const char *func, int line, int comp, int level, const char* format,va_list args);
int write_file_matlab(const char *fname, const char *vname, void *data, int length, int dec, unsigned int format, int multiVec)
int write_file_matlab(const char *fname,
const char *vname,
void *data,
int length,
int dec,
unsigned int format,
int multiVec)
{ {
FILE *fp=NULL; FILE *fp=NULL;
int i; int i;
...@@ -128,28 +121,31 @@ int write_file_matlab(const char *fname, ...@@ -128,28 +121,31 @@ int write_file_matlab(const char *fname,
} }
if ( (format&MATLAB_RAW) == MATLAB_RAW ) { if ( (format&MATLAB_RAW) == MATLAB_RAW ) {
int sz[16]={sizeof(short), 2*sizeof(short), int sz[16] = {sizeof(short),
sizeof(int), 2*sizeof(int), 2 * sizeof(short),
sizeof(char), 2*sizeof(char), sizeof(int),
sizeof(long long), 2 * sizeof(int),
sizeof(double), 2*sizeof(double), sizeof(char),
sizeof(unsigned char), 2 * sizeof(char),
sizeof(short), sizeof(long long),
sizeof(short), sizeof(double),
sizeof(short), 2 * sizeof(double),
sizeof(short), sizeof(unsigned char),
sizeof(short), sizeof(short),
sizeof(short) sizeof(short),
}; sizeof(short),
sizeof(short),
sizeof(short),
sizeof(short)};
int eltSz= sz[format&~MATLAB_RAW]; int eltSz= sz[format&~MATLAB_RAW];
if (dec==1) if (dec==1)
fwrite(data, eltSz, length, fp); fwrite(data, eltSz, length, fp);
else else
for (i=0; i<length; i+=dec) for (i=0; i<length; i+=dec)
fwrite(data+i*eltSz, eltSz, 1, fp); fwrite(data + i * eltSz, eltSz, 1, fp);
fclose(fp); fclose(fp);
return(0); return (0);
} }
if ((format != 10 && format !=11 && format != 12 && format != 13 && format != 14) || multiVec) if ((format != 10 && format !=11 && format != 12 && format != 13 && format != 14) || multiVec)
...@@ -514,7 +510,7 @@ int logInit (void) ...@@ -514,7 +510,7 @@ int logInit (void)
} }
AssertFatal(!((g_log->flag & FLAG_TIME) && (g_log->flag & FLAG_REAL_TIME)), AssertFatal(!((g_log->flag & FLAG_TIME) && (g_log->flag & FLAG_REAL_TIME)),
"Invalid log options: time and wall_clock both set but are mutually exclusive\n"); "Invalid log options: time and wall_clock both set but are mutually exclusive\n");
g_log->flag = g_log->flag | FLAG_INITIALIZED; g_log->flag = g_log->flag | FLAG_INITIALIZED;
printf("log init done\n"); printf("log init done\n");
...@@ -528,13 +524,8 @@ void logTerm(void) ...@@ -528,13 +524,8 @@ void logTerm(void)
} }
#include <sys/syscall.h> #include <sys/syscall.h>
static inline int log_header(log_component_t *c, static inline int
char *log_buffer, log_header(log_component_t *c, char *log_buffer, int buffsize, const char *file, const char *func, int line, int level)
int buffsize,
const char *file,
const char *func,
int line,
int level)
{ {
int flag= g_log->flag | c->flag; int flag= g_log->flag | c->flag;
...@@ -578,24 +569,19 @@ static inline int log_header(log_component_t *c, ...@@ -578,24 +569,19 @@ static inline int log_header(log_component_t *c,
} else { } else {
threadIdString[0] = 0; threadIdString[0] = 0;
} }
return snprintf(log_buffer, buffsize, "%s%s%s[%s] %c %s%s", return snprintf(log_buffer,
flag & FLAG_NOCOLOR ? "" : log_level_highlight_start[level], buffsize,
timeString, "%s%s%s[%s] %c %s%s",
threadIdString, flag & FLAG_NOCOLOR ? "" : log_level_highlight_start[level],
c->name, timeString,
flag & FLAG_LEVEL ? g_log->level2string[level] : ' ', threadIdString,
l, c->name,
threadname flag & FLAG_LEVEL ? g_log->level2string[level] : ' ',
); l,
threadname);
} }
void logRecord_mt(const char *file, void logRecord_mt(const char *file, const char *func, int line, int comp, int level, const char *format, ...)
const char *func,
int line,
int comp,
int level,
const char *format,
... )
{ {
log_component_t *c = &g_log->log_component[comp]; log_component_t *c = &g_log->log_component[comp];
va_list args; va_list args;
...@@ -604,24 +590,13 @@ void logRecord_mt(const char *file, ...@@ -604,24 +590,13 @@ void logRecord_mt(const char *file,
va_end(args); va_end(args);
} }
void vlogRecord_mt(const char *file, void vlogRecord_mt(const char *file, const char *func, int line, int comp, int level, const char *format, va_list args)
const char *func,
int line,
int comp,
int level,
const char *format,
va_list args )
{ {
log_component_t *c = &g_log->log_component[comp]; log_component_t *c = &g_log->log_component[comp];
log_output_memory(c, file,func,line,comp,level, format,args); log_output_memory(c, file,func,line,comp,level, format,args);
} }
void log_dump(int component, void log_dump(int component, void *buffer, int buffsize, int datatype, const char *format, ...)
void *buffer,
int buffsize,
int datatype,
const char *format,
... )
{ {
va_list args; va_list args;
char *wbuf; char *wbuf;
...@@ -666,8 +641,7 @@ void log_dump(int component, ...@@ -666,8 +641,7 @@ void log_dump(int component,
} }
} }
int set_log(int component, int set_log(int component, int level)
int level)
{ {
/* Checking parameters */ /* Checking parameters */
DevCheck((component >= MIN_LOG_COMPONENTS) && (component < MAX_LOG_COMPONENTS), DevCheck((component >= MIN_LOG_COMPONENTS) && (component < MAX_LOG_COMPONENTS),
...@@ -788,8 +762,7 @@ char *map_int_to_str(const mapping *map, const int val) ...@@ -788,8 +762,7 @@ char *map_int_to_str(const mapping *map, const int val)
} }
} }
int is_newline(char *str, int is_newline(char *str, int size)
int size)
{ {
int i; int i;
......
...@@ -32,27 +32,32 @@ ...@@ -32,27 +32,32 @@
#define OAI_EXIT_NORMAL 0 #define OAI_EXIT_NORMAL 0
#define OAI_EXIT_ASSERT 1 #define OAI_EXIT_ASSERT 1
#define _Assert_Exit_ \ #define _Assert_Exit_ \
if (getenv("OAI_GDBSTACKS")) { \ if (getenv("OAI_GDBSTACKS")) { \
char tmp [1000]; \ char tmp[1000]; \
sprintf(tmp,"gdb -ex='set confirm off' -ex 'thread apply all bt' -ex q -p %d < /dev/null", getpid()); \ sprintf(tmp, "gdb -ex='set confirm off' -ex 'thread apply all bt' -ex q -p %d < /dev/null", getpid()); \
__attribute__((unused)) int dummy=system(tmp); \ __attribute__((unused)) int dummy = system(tmp); \
} \ } \
fprintf(stderr, "\nExiting execution\n"); \ fprintf(stderr, "\nExiting execution\n"); \
fflush(stdout); \ fflush(stdout); \
fflush(stderr); \ fflush(stderr); \
exit_function(__FILE__, __FUNCTION__, __LINE__, "_Assert_Exit_", OAI_EXIT_ASSERT); \ exit_function(__FILE__, __FUNCTION__, __LINE__, "_Assert_Exit_", OAI_EXIT_ASSERT); \
abort(); // to avoid gcc warnings - never executed unless app-specific exit_function() does not exit() nor abort() abort(); // to avoid gcc warnings - never executed unless app-specific exit_function() does not exit() nor abort()
#define _Assert_(cOND, aCTION, fORMAT, aRGS...) \ #define _Assert_(cOND, aCTION, fORMAT, aRGS...) \
do { \ do { \
if (!(cOND)) { \ if (!(cOND)) { \
fprintf(stderr, "\nAssertion (%s) failed!\n" \ fprintf(stderr, \
"In %s() %s:%d\n" fORMAT, \ "\nAssertion (%s) failed!\n" \
#cOND, __FUNCTION__, __FILE__, __LINE__, ##aRGS); \ "In %s() %s:%d\n" fORMAT, \
aCTION; \ #cOND, \
} \ __FUNCTION__, \
} while(0) __FILE__, \
__LINE__, \
##aRGS); \
aCTION; \
} \
} while (0)
#define AssertFatal(cOND, fORMAT, aRGS...) _Assert_(cOND, _Assert_Exit_, fORMAT, ##aRGS) #define AssertFatal(cOND, fORMAT, aRGS...) _Assert_(cOND, _Assert_Exit_, fORMAT, ##aRGS)
......
This diff is collapsed.
This diff is collapsed.
...@@ -76,7 +76,8 @@ loader_data_t loader_data; ...@@ -76,7 +76,8 @@ loader_data_t loader_data;
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
/* LOADER parameters */ /* LOADER parameters */
/* optname helpstr paramflags XXXptr defXXXval type numelt check func*/ /* optname helpstr paramflags XXXptr defXXXval type numelt
* check func*/
/*----------------------------------------------------------------------------------------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------------------------------------------------------------------------------------*/
// clang-format off // clang-format off
#define LOADER_PARAMS_DESC { \ #define LOADER_PARAMS_DESC { \
......
...@@ -468,11 +468,13 @@ uint8_t get_prach_fmt(int prach_ConfigIndex,int frame_type) { ...@@ -468,11 +468,13 @@ uint8_t get_prach_fmt(int prach_ConfigIndex,int frame_type) {
} }
uint8_t get_prach_prb_offset(int frame_type, uint8_t get_prach_prb_offset(int frame_type,
int tdd_config, int tdd_config,
int N_RB_UL, int N_RB_UL,
uint8_t prach_ConfigIndex, uint8_t prach_ConfigIndex,
uint8_t n_ra_prboffset, uint8_t n_ra_prboffset,
uint8_t tdd_mapindex, uint16_t Nf) { uint8_t tdd_mapindex,
uint16_t Nf)
{
uint8_t n_ra_prb; uint8_t n_ra_prb;
uint8_t f_ra,t1_ra; uint8_t f_ra,t1_ra;
uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type); uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type);
......
...@@ -459,11 +459,11 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index) { ...@@ -459,11 +459,11 @@ int get_nr_table_idx(int nr_bandP, uint8_t scs_index) {
int get_subband_size(int NPRB,int size) { int get_subband_size(int NPRB,int size) {
// implements table 5.2.1.4-2 from 36.214 // implements table 5.2.1.4-2 from 36.214
// //
//Bandwidth part (PRBs) Subband size (PRBs) // Bandwidth part (PRBs) Subband size (PRBs)
// < 24 N/A // < 24 N/A
//24 – 72 4, 8 // 24 – 72 4, 8
//73 – 144 8, 16 // 73 – 144 8, 16
//145 – 275 16, 32 // 145 – 275 16, 32
if (NPRB<24) return(1); if (NPRB<24) return(1);
if (NPRB<72) return (size==0 ? 4 : 8); if (NPRB<72) return (size==0 ? 4 : 8);
...@@ -611,7 +611,7 @@ void get_samplerate_and_bw(int mu, ...@@ -611,7 +611,7 @@ void get_samplerate_and_bw(int mu,
case 133 : case 133 :
if (threequarter_fs) { if (threequarter_fs) {
AssertFatal(1==0,"N_RB %d cannot use 3/4 sampling\n",n_rb); AssertFatal(1 == 0, "N_RB %d cannot use 3/4 sampling\n", n_rb);
} }
else { else {
*sample_rate=61.44e6; *sample_rate=61.44e6;
......
...@@ -245,10 +245,11 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, ...@@ -245,10 +245,11 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name,
ret=pthread_attr_setschedpolicy(&attr, SCHED_OAI); ret=pthread_attr_setschedpolicy(&attr, SCHED_OAI);
AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno); AssertFatal(ret==0,"ret: %d, errno: %d\n",ret, errno);
if(priority<sched_get_priority_min(SCHED_OAI) || priority>sched_get_priority_max(SCHED_OAI)) { if(priority<sched_get_priority_min(SCHED_OAI) || priority>sched_get_priority_max(SCHED_OAI)) {
LOG_E(UTIL,"Prio not possible: %d, min is %d, max: %d, forced in the range\n", LOG_E(UTIL,
priority, "Prio not possible: %d, min is %d, max: %d, forced in the range\n",
sched_get_priority_min(SCHED_OAI), priority,
sched_get_priority_max(SCHED_OAI)); sched_get_priority_min(SCHED_OAI),
sched_get_priority_max(SCHED_OAI));
if(priority<sched_get_priority_min(SCHED_OAI)) if(priority<sched_get_priority_min(SCHED_OAI))
priority=sched_get_priority_min(SCHED_OAI); priority=sched_get_priority_min(SCHED_OAI);
if(priority>sched_get_priority_max(SCHED_OAI)) if(priority>sched_get_priority_max(SCHED_OAI))
...@@ -276,12 +277,8 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name, ...@@ -276,12 +277,8 @@ void threadCreate(pthread_t* t, void * (*func)(void*), void * param, char* name,
// Legacy, pthread_create + thread_top_init() should be replaced by threadCreate // Legacy, pthread_create + thread_top_init() should be replaced by threadCreate
// threadCreate encapsulates the posix pthread api // threadCreate encapsulates the posix pthread api
void thread_top_init(char *thread_name, void thread_top_init(char *thread_name, int affinity, uint64_t runtime, uint64_t deadline, uint64_t period)
int affinity, {
uint64_t runtime,
uint64_t deadline,
uint64_t period) {
int policy, s, j; int policy, s, j;
struct sched_param sparam; struct sched_param sparam;
char cpu_affinity[1024]; char cpu_affinity[1024];
...@@ -345,7 +342,6 @@ void thread_top_init(char *thread_name, ...@@ -345,7 +342,6 @@ void thread_top_init(char *thread_name,
} }
} }
// Block CPU C-states deep sleep // Block CPU C-states deep sleep
void set_latency_target(void) { void set_latency_target(void) {
int ret; int ret;
...@@ -355,10 +351,10 @@ void set_latency_target(void) { ...@@ -355,10 +351,10 @@ void set_latency_target(void) {
if ( (latency_target_fd = open("/dev/cpu_dma_latency", O_RDWR)) != -1 ) { if ( (latency_target_fd = open("/dev/cpu_dma_latency", O_RDWR)) != -1 ) {
ret = write(latency_target_fd, &latency_target_value, sizeof(latency_target_value)); ret = write(latency_target_fd, &latency_target_value, sizeof(latency_target_value));
if (ret == 0) { if (ret == 0) {
printf("# error setting cpu_dma_latency to %u!: %s\n", latency_target_value, strerror(errno)); printf("# error setting cpu_dma_latency to %u!: %s\n", latency_target_value, strerror(errno));
close(latency_target_fd); close(latency_target_fd);
latency_target_fd=-1; latency_target_fd = -1;
return; return;
} }
} }
} }
......
...@@ -778,24 +778,22 @@ void run_telnetclt(void) { ...@@ -778,24 +778,22 @@ void run_telnetclt(void) {
memset(inbuf,0,sizeof(inbuf)); memset(inbuf,0,sizeof(inbuf));
rv = recv(sock , inbuf , sizeof(inbuf)-1 , 0); rv = recv(sock , inbuf , sizeof(inbuf)-1 , 0);
if (rv > 0) { if (rv > 0) {
printf("%s",inbuf); printf("%s", inbuf);
} } else if (rv == 0) {
else if (rv == 0) { printf("Connection closed by the remote end\n\r");
printf("Connection closed by the remote end\n\r"); break;
break; } else {
} perror("recv error");
else { break;
perror("recv error");
break;
} }
} }
else if (FD_ISSET(STDIN_FILENO , &fds)) { else if (FD_ISSET(STDIN_FILENO , &fds)) {
char *inbuf=NULL; char *inbuf = NULL;
size_t inlen=0; size_t inlen = 0;
inlen = getline( &inbuf,&inlen, stdin); inlen = getline(&inbuf, &inlen, stdin);
if ( inlen > 0 ) { if (inlen > 0) {
if ( send(sock, inbuf,inlen, 0) < 0) if (send(sock, inbuf, inlen, 0) < 0)
break; break;
} }
free(inbuf); free(inbuf);
} }
...@@ -806,14 +804,14 @@ void run_telnetclt(void) { ...@@ -806,14 +804,14 @@ void run_telnetclt(void) {
} /* run_telnetclt */ } /* run_telnetclt */
void poll_telnetcmdq(void *qid, void *arg) { 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,arg); msgdata->cmdfunc(msgdata->cmdbuff, msgdata->debug, msgdata->prnt, arg);
free(msgdata->cmdbuff); free(msgdata->cmdbuff);
delNotifiedFIFO_elt(msg); delNotifiedFIFO_elt(msg);
} }
} }
/*------------------------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------------------------*/
/* load the commands delivered with the telnet server /* load the commands delivered with the telnet server
...@@ -952,7 +950,7 @@ int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildvers ...@@ -952,7 +950,7 @@ int telnetsrv_checkbuildver(char *mainexec_buildversion, char **shlib_buildvers
} }
int telnetsrv_getfarray(loader_shlibfunc_t **farray) { int telnetsrv_getfarray(loader_shlibfunc_t **farray) {
int const num_func_tln_srv = 3; int const num_func_tln_srv = 3;
*farray = malloc(sizeof(loader_shlibfunc_t) * num_func_tln_srv); *farray = malloc(sizeof(loader_shlibfunc_t) * num_func_tln_srv);
(*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;
......
...@@ -35,54 +35,42 @@ ...@@ -35,54 +35,42 @@
#ifndef __TELNETSRV_CPUMEASUR_DEF__H__ #ifndef __TELNETSRV_CPUMEASUR_DEF__H__
#define __TELNETSRV_CPUMEASUR_DEF__H__ #define __TELNETSRV_CPUMEASUR_DEF__H__
#define CPU_PHYENB_MEASURE \ #define CPU_PHYENB_MEASURE \
{ \ { \
{"phy_proc_tx", &(phyvars->phy_proc_tx),0,1},\ {"phy_proc_tx", &(phyvars->phy_proc_tx), 0, 1}, {"phy_proc_rx", &(phyvars->phy_proc_rx), 0, 1}, \
{"phy_proc_rx", &(phyvars->phy_proc_rx),0,1},\ {"rx_prach", &(phyvars->rx_prach), 0, 1}, {"ofdm_mod", &(phyvars->ofdm_mod_stats), 0, 1}, \
{"rx_prach", &(phyvars->rx_prach),0,1},\ {"dlsch_common_and_dci", &(phyvars->dlsch_common_and_dci), 0, 1}, \
{"ofdm_mod", &(phyvars->ofdm_mod_stats),0,1},\ {"dlsch_ue_specific", &(phyvars->dlsch_ue_specific), 0, 1}, {"dlsch_encoding", &(phyvars->dlsch_encoding_stats), 0, 1}, \
{"dlsch_common_and_dci", &(phyvars->dlsch_common_and_dci),0,1},\ {"dlsch_modulation", &(phyvars->dlsch_modulation_stats), 0, 1}, \
{"dlsch_ue_specific", &(phyvars->dlsch_ue_specific),0,1},\ {"dlsch_scrambling", &(phyvars->dlsch_scrambling_stats), 0, 1}, \
{"dlsch_encoding", &(phyvars->dlsch_encoding_stats),0,1},\ {"dlsch_rate_matching", &(phyvars->dlsch_rate_matching_stats), 0, 1}, \
{"dlsch_modulation", &(phyvars->dlsch_modulation_stats),0,1},\ {"dlsch_turbo_encod_prep", &(phyvars->dlsch_turbo_encoding_preperation_stats), 0, 1}, \
{"dlsch_scrambling", &(phyvars->dlsch_scrambling_stats),0,1},\ {"dlsch_turbo_encod_segm", &(phyvars->dlsch_turbo_encoding_segmentation_stats), 0, 1}, \
{"dlsch_rate_matching", &(phyvars->dlsch_rate_matching_stats),0,1},\ {"dlsch_turbo_encod", &(phyvars->dlsch_turbo_encoding_stats), 0, 1}, \
{"dlsch_turbo_encod_prep", &(phyvars->dlsch_turbo_encoding_preperation_stats),0,1},\ {"dlsch_interleaving", &(phyvars->dlsch_interleaving_stats), 0, 1}, {"rx_dft", &(phyvars->rx_dft_stats), 0, 1}, \
{"dlsch_turbo_encod_segm", &(phyvars->dlsch_turbo_encoding_segmentation_stats),0,1},\ {"ulsch_channel_estimation", &(phyvars->ulsch_channel_estimation_stats), 0, 1}, \
{"dlsch_turbo_encod", &(phyvars->dlsch_turbo_encoding_stats),0,1},\ {"ulsch_freq_offset_estimation", &(phyvars->ulsch_freq_offset_estimation_stats), 0, 1}, \
{"dlsch_interleaving", &(phyvars->dlsch_interleaving_stats),0,1},\ {"ulsch_decoding", &(phyvars->ulsch_decoding_stats), 0, 1}, \
{"rx_dft", &(phyvars->rx_dft_stats),0,1},\ {"ulsch_demodulation", &(phyvars->ulsch_demodulation_stats), 0, 1}, \
{"ulsch_channel_estimation", &(phyvars->ulsch_channel_estimation_stats),0,1},\ {"ulsch_rate_unmatching", &(phyvars->ulsch_rate_unmatching_stats), 0, 1}, \
{"ulsch_freq_offset_estimation", &(phyvars->ulsch_freq_offset_estimation_stats),0,1},\ {"ulsch_turbo_decoding", &(phyvars->ulsch_turbo_decoding_stats), 0, 1}, \
{"ulsch_decoding", &(phyvars->ulsch_decoding_stats),0,1},\ {"ulsch_deinterleaving", &(phyvars->ulsch_deinterleaving_stats), 0, 1}, \
{"ulsch_demodulation", &(phyvars->ulsch_demodulation_stats),0,1},\ {"ulsch_demultiplexing", &(phyvars->ulsch_demultiplexing_stats), 0, 1}, {"ulsch_llr", &(phyvars->ulsch_llr_stats), 0, 1}, \
{"ulsch_rate_unmatching", &(phyvars->ulsch_rate_unmatching_stats),0,1},\ {"ulsch_tc_init", &(phyvars->ulsch_tc_init_stats), 0, 1}, {"ulsch_tc_alpha", &(phyvars->ulsch_tc_alpha_stats), 0, 1}, \
{"ulsch_turbo_decoding", &(phyvars->ulsch_turbo_decoding_stats),0,1},\ {"ulsch_tc_beta", &(phyvars->ulsch_tc_beta_stats), 0, 1}, {"ulsch_tc_gamma", &(phyvars->ulsch_tc_gamma_stats), 0, 1}, \
{"ulsch_deinterleaving", &(phyvars->ulsch_deinterleaving_stats),0,1},\ {"ulsch_tc_ext", &(phyvars->ulsch_tc_ext_stats), 0, 1}, {"ulsch_tc_intl1", &(phyvars->ulsch_tc_intl1_stats), 0, 1}, \
{"ulsch_demultiplexing", &(phyvars->ulsch_demultiplexing_stats),0,1},\ {"ulsch_tc_intl2", &(phyvars->ulsch_tc_intl2_stats), 0, 1}, \
{"ulsch_llr", &(phyvars->ulsch_llr_stats),0,1},\ }
{"ulsch_tc_init", &(phyvars->ulsch_tc_init_stats),0,1},\
{"ulsch_tc_alpha", &(phyvars->ulsch_tc_alpha_stats),0,1},\
{"ulsch_tc_beta", &(phyvars->ulsch_tc_beta_stats),0,1},\
{"ulsch_tc_gamma", &(phyvars->ulsch_tc_gamma_stats),0,1},\
{"ulsch_tc_ext", &(phyvars->ulsch_tc_ext_stats),0,1},\
{"ulsch_tc_intl1", &(phyvars->ulsch_tc_intl1_stats),0,1},\
{"ulsch_tc_intl2", &(phyvars->ulsch_tc_intl2_stats),0,1},\
}
#define CPU_MACENB_MEASURE \ #define CPU_MACENB_MEASURE \
{ \ { \
{"eNB_scheduler", &(macvars->eNB_scheduler),0,1},\ {"eNB_scheduler", &(macvars->eNB_scheduler), 0, 1}, {"schedule_si", &(macvars->schedule_si), 0, 1}, \
{"schedule_si", &(macvars->schedule_si),0,1},\ {"schedule_ra", &(macvars->schedule_ra), 0, 1}, {"schedule_ulsch", &(macvars->schedule_ulsch), 0, 1}, \
{"schedule_ra", &(macvars->schedule_ra),0,1},\ {"fill_DLSCH_dci", &(macvars->fill_DLSCH_dci), 0, 1}, \
{"schedule_ulsch", &(macvars->schedule_ulsch),0,1},\ {"schedule_dlsch_pre", &(macvars->schedule_dlsch_preprocessor), 0, 1}, \
{"fill_DLSCH_dci", &(macvars->fill_DLSCH_dci),0,1},\ {"schedule_dlsch", &(macvars->schedule_dlsch), 0, 1}, {"schedule_mch", &(macvars->schedule_mch), 0, 1}, \
{"schedule_dlsch_pre", &(macvars->schedule_dlsch_preprocessor),0,1},\ {"rx_ulsch_sdu", &(macvars->rx_ulsch_sdu), 0, 1}, {"schedule_pch", &(macvars->schedule_pch), 0, 1}, \
{"schedule_dlsch", &(macvars->schedule_dlsch),0,1},\ }
{"schedule_mch", &(macvars->schedule_mch),0,1},\
{"rx_ulsch_sdu", &(macvars->rx_ulsch_sdu),0,1},\
{"schedule_pch", &(macvars->schedule_pch),0,1},\
}
#define CPU_PDCPENB_MEASURE \ #define CPU_PDCPENB_MEASURE \
{ \ { \
......
...@@ -237,8 +237,8 @@ int measurcmd_async(char *buf, int debug, telnet_printfunc_t prnt) { ...@@ -237,8 +237,8 @@ int measurcmd_async(char *buf, int debug, telnet_printfunc_t prnt) {
int okcmd=0; int okcmd=0;
if (buf == NULL) { if (buf == NULL) {
measurcmd_async_help(prnt); measurcmd_async_help(prnt);
return CMDSTATUS_FOUND; return CMDSTATUS_FOUND;
} }
if (debug > 0) if (debug > 0)
prnt(" measurcmd_async received %s\n",buf); prnt(" measurcmd_async received %s\n",buf);
...@@ -255,7 +255,7 @@ int measurcmd_async(char *buf, int debug, telnet_printfunc_t prnt) { ...@@ -255,7 +255,7 @@ int measurcmd_async(char *buf, int debug, telnet_printfunc_t prnt) {
okcmd=1; okcmd=1;
} }
} else if ( s == 3 ) { } else if ( s == 3 ) {
int msgid; int msgid;
if ( strcmp(subcmd,"enable") == 0) { if ( strcmp(subcmd,"enable") == 0) {
msgid = TIMESTAT_MSGID_ENABLE; msgid = TIMESTAT_MSGID_ENABLE;
okcmd=1; okcmd=1;
...@@ -268,14 +268,14 @@ int measurcmd_async(char *buf, int debug, telnet_printfunc_t prnt) { ...@@ -268,14 +268,14 @@ int measurcmd_async(char *buf, int debug, telnet_printfunc_t prnt) {
} }
if (okcmd) { if (okcmd) {
notifiedFIFO_elt_t *nfe = newNotifiedFIFO_elt(sizeof(time_stats_msg_t),0,NULL,NULL); notifiedFIFO_elt_t *nfe = newNotifiedFIFO_elt(sizeof(time_stats_msg_t),0,NULL,NULL);
time_stats_msg_t *msg = (time_stats_msg_t *)NotifiedFifoData(nfe); time_stats_msg_t *msg = (time_stats_msg_t *)NotifiedFifoData(nfe);
msg->msgid = msgid ; msg->msgid = msgid ;
msg->displayFunc = prnt; msg->displayFunc = prnt;
for(int i=idx1; i<idx2; i++) { for (int i = idx1; i < idx2; i++) {
msg->timestat_id =i; msg->timestat_id = i;
pushNotifiedFIFO(&measur_fifo, nfe); pushNotifiedFIFO(&measur_fifo, nfe);
} }
} }
} }
if (!(okcmd)) { if (!(okcmd)) {
......
...@@ -101,7 +101,7 @@ while (procfile_fields != NULL && fieldcnt < 42) { ...@@ -101,7 +101,7 @@ while (procfile_fields != NULL && fieldcnt < 42) {
break; break;
case 18: // priority column index 2 in tdata, -2 to -100 (1, min to 99, highest prio) case 18: // priority column index 2 in tdata, -2 to -100 (1, min to 99, highest prio)
priority = strtol(procfile_fields, NULL, 0); priority = strtol(procfile_fields, NULL, 0);
case 19: // nice column index 3 in tdata 0 to 39 (-20, highest prio, to 19) case 19: // nice column index 3 in tdata 0 to 39 (-20, highest prio, to 19)
if (tdata != NULL) { if (tdata != NULL) {
tdata->lines[tdata->numlines].val[fieldcnt - 16] = strdup(procfile_fields); tdata->lines[tdata->numlines].val[fieldcnt - 16] = strdup(procfile_fields);
} }
...@@ -397,10 +397,14 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt) ...@@ -397,10 +397,14 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
prnt("\n component level enabled output\n"); prnt("\n component level enabled output\n");
for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) { for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
if (g_log->log_component[i].name != NULL) { if (g_log->log_component[i].name != NULL) {
prnt("%02i %17.17s:%10.10s %s %s\n",i ,g_log->log_component[i].name, prnt("%02i %17.17s:%10.10s %s %s\n",
map_int_to_str(log_level_names,(g_log->log_component[i].level>=0)?g_log->log_component[i].level:g_log->log_component[i].savedlevel), i,
((g_log->log_component[i].level>=0)?"Y":"N"), g_log->log_component[i].name,
((g_log->log_component[i].filelog>0)?g_log->log_component[i].filelog_name:"stdout")); map_int_to_str(
log_level_names,
(g_log->log_component[i].level >= 0) ? g_log->log_component[i].level : g_log->log_component[i].savedlevel),
((g_log->log_component[i].level >= 0) ? "Y" : "N"),
((g_log->log_component[i].filelog > 0) ? g_log->log_component[i].filelog_name : "stdout"));
} }
} }
} }
...@@ -414,9 +418,11 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt) ...@@ -414,9 +418,11 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
if (strcasestr(buf,"dbgopt") != NULL) { if (strcasestr(buf,"dbgopt") != NULL) {
prnt("\n module debug dumpfile\n"); prnt("\n module debug dumpfile\n");
for (int i=0; log_maskmap[i].name != NULL ; i++) { for (int i=0; log_maskmap[i].name != NULL ; i++) {
prnt("%02i %17.17s %5.5s %5.5s\n",i ,log_maskmap[i].name, prnt("%02i %17.17s %5.5s %5.5s\n",
((g_log->debug_mask & log_maskmap[i].value)?"Y":"N"), i,
((g_log->dump_mask & log_maskmap[i].value)?"Y":"N") ); log_maskmap[i].name,
((g_log->debug_mask & log_maskmap[i].value) ? "Y" : "N"),
((g_log->dump_mask & log_maskmap[i].value) ? "Y" : "N"));
} }
} }
if (strcasestr(buf,"config") != NULL) { if (strcasestr(buf,"config") != NULL) {
...@@ -442,7 +448,7 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt) ...@@ -442,7 +448,7 @@ int proccmd_show(char *buf, int debug, telnet_printfunc_t prnt)
prnt(" %02i Ru(s)\n", RC.nb_RU); prnt(" %02i Ru(s)\n", RC.nb_RU);
prnt(" %02i lte RRc(s), %02i NbIoT RRC(s)\n", RC.nb_inst, RC.nb_nb_iot_rrc_inst); prnt(" %02i lte RRc(s), %02i NbIoT RRC(s)\n", RC.nb_inst, RC.nb_nb_iot_rrc_inst);
prnt(" %02i lte MACRLC(s), %02i NbIoT MACRLC(s)\n", RC.nb_macrlc_inst, RC.nb_nb_iot_macrlc_inst); prnt(" %02i lte MACRLC(s), %02i NbIoT MACRLC(s)\n", RC.nb_macrlc_inst, RC.nb_nb_iot_macrlc_inst);
prnt(" %02i lte L1, %02i NbIoT L1\n", RC.nb_L1_inst, RC.nb_nb_iot_L1_inst); prnt(" %02i lte L1, %02i NbIoT L1\n", RC.nb_L1_inst, RC.nb_nb_iot_L1_inst);
for(int i=0; i<RC.nb_inst; i++) { for(int i=0; i<RC.nb_inst; i++) {
prnt(" lte RRC %i: %02i CC(s) \n",i,((RC.nb_CC == NULL)?0:RC.nb_CC[i])); prnt(" lte RRC %i: %02i CC(s) \n",i,((RC.nb_CC == NULL)?0:RC.nb_CC[i]));
...@@ -532,11 +538,11 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2); ...@@ -532,11 +538,11 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
if (s == 1 && logsubcmd != NULL) { if (s == 1 && logsubcmd != NULL) {
if (strcasestr(logsubcmd,"online") != NULL) { if (strcasestr(logsubcmd,"online") != NULL) {
if (strcasestr(buf,"noonline") != NULL) { if (strcasestr(buf,"noonline") != NULL) {
set_glog_onlinelog(0); set_glog_onlinelog(0);
prnt("online logging disabled\n",buf); prnt("online logging disabled\n", buf);
} else { } else {
set_glog_onlinelog(1); set_glog_onlinelog(1);
prnt("online logging enabled\n",buf); prnt("online logging enabled\n", buf);
} }
} }
else if (strcasestr(logsubcmd,"show") != NULL) { else if (strcasestr(logsubcmd,"show") != NULL) {
...@@ -552,9 +558,9 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2); ...@@ -552,9 +558,9 @@ int s = sscanf(buf,"%ms %i-%i\n",&logsubcmd, &idx1,&idx2);
for (int i=0; log_maskmap[i].name != NULL; i++) for (int i=0; log_maskmap[i].name != NULL; i++)
prnt("%s ",log_maskmap[i].name); prnt("%s ",log_maskmap[i].name);
prnt("\n\n"); prnt("\n\n");
proccmd_show("loglvl",debug,prnt); proccmd_show("loglvl", debug, prnt);
proccmd_show("logopt",debug,prnt); proccmd_show("logopt", debug, prnt);
proccmd_show("dbgopt",debug,prnt); proccmd_show("dbgopt", debug, prnt);
} }
else if (strcasestr(logsubcmd,"help") != NULL) { else if (strcasestr(logsubcmd,"help") != NULL) {
prnt(PROCCMD_LOG_HELP_STRING); prnt(PROCCMD_LOG_HELP_STRING);
......
...@@ -50,8 +50,8 @@ extern int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_p ...@@ -50,8 +50,8 @@ extern int proccmd_websrv_getdata(char *cmdbuff, int debug, void *data, telnet_p
telnetshell_vardef_t proc_vardef[] = {{"", 0, 0, NULL}}; telnetshell_vardef_t proc_vardef[] = {{"", 0, 0, NULL}};
#define PROCCMD_LOG_HELP_STRING \ #define PROCCMD_LOG_HELP_STRING \
" log sub commands: \n\ " log sub commands: \n\
show: display current log configuration \n\ show: display current log configuration \n\
online, noonline: enable or disable console logs \n\ online, noonline: enable or disable console logs \n\
enable, disable id1-id2: enable or disable logs for components index id1 to id2 \n\ enable, disable id1-id2: enable or disable logs for components index id1 to id2 \n\
file, nofile id1-id2: enable or disable redirecting logs to file for components index id1 to id2 \n\ file, nofile id1-id2: enable or disable redirecting logs to file for components index id1 to id2 \n\
logfile name depends on component name and is printed in the show command \n\ logfile name depends on component name and is printed in the show command \n\
......
...@@ -254,11 +254,11 @@ int main() { ...@@ -254,11 +254,11 @@ int main() {
while (parall) { while (parall) {
tmp=pullTpool(&worker_back,&pool); tmp=pullTpool(&worker_back,&pool);
if (tmp) { if (tmp) {
parall--; parall--;
struct testData *dd=NotifiedFifoData(tmp); struct testData *dd = NotifiedFifoData(tmp);
if (dd->sleepTime > sleepmax) if (dd->sleepTime > sleepmax)
sleepmax=dd->sleepTime; sleepmax = dd->sleepTime;
delNotifiedFIFO_elt(tmp); delNotifiedFIFO_elt(tmp);
} }
} }
cumulProcessTime+=sleepmax; cumulProcessTime+=sleepmax;
...@@ -266,29 +266,32 @@ int main() { ...@@ -266,29 +266,32 @@ int main() {
clock_gettime(CLOCK_MONOTONIC, &end); clock_gettime(CLOCK_MONOTONIC, &end);
long long dur=(end.tv_sec-st.tv_sec)*1000*1000+(end.tv_nsec-st.tv_nsec)/1000; long long dur=(end.tv_sec-st.tv_sec)*1000*1000+(end.tv_nsec-st.tv_nsec)/1000;
printf("In µs, Total time per group of %d job:%lld, work time per job %d, overhead per job %lld\n", printf("In µs, Total time per group of %d job:%lld, work time per job %d, overhead per job %lld\n",
nb_jobs, dur/1000, cumulProcessTime/1000, (dur-cumulProcessTime)/(1000*nb_jobs)); nb_jobs,
dur / 1000,
/* cumulProcessTime / 1000,
for (int i=0; i <1000 ; i++) { (dur - cumulProcessTime) / (1000 * nb_jobs));
notifiedFIFO_elt_t *work=newNotifiedFIFO_elt(sizeof(struct testData), i, &worker_back, processing);
struct testData *x=(struct testData *)NotifiedFifoData(work); /*
x->id=i; for (int i=0; i <1000 ; i++) {
pushTpool(&pool, work); notifiedFIFO_elt_t *work=newNotifiedFIFO_elt(sizeof(struct testData), i, &worker_back, processing);
} struct testData *x=(struct testData *)NotifiedFifoData(work);
x->id=i;
pushTpool(&pool, work);
}
do { do {
tmp=pullTpool(&worker_back,&pool); tmp=pullTpool(&worker_back,&pool);
if (tmp) { if (tmp) {
struct testData *dd=NotifiedFifoData(tmp); struct testData *dd=NotifiedFifoData(tmp);
printf("Result: %s\n",dd->txt); printf("Result: %s\n",dd->txt);
delNotifiedFIFO_elt(tmp); delNotifiedFIFO_elt(tmp);
} else } else
printf("Empty list \n"); printf("Empty list \n");
abortTpoolJob(&pool,510); abortTpoolJob(&pool,510);
} while(tmp); } while(tmp);
*/ */
return 0; return 0;
} }
#endif #endif
...@@ -210,9 +210,9 @@ time_stats_t *register_meas(char *name) ...@@ -210,9 +210,9 @@ time_stats_t *register_meas(char *name)
void free_measurtbl(void) { void free_measurtbl(void) {
for (int i=0; i<max_cpumeasur; i++) { for (int i=0; i<max_cpumeasur; i++) {
if (measur_table[i] != NULL) { if (measur_table[i] != NULL) {
free(measur_table[i]->meas_name); free(measur_table[i]->meas_name);
delNotifiedFIFO_elt(measur_table[i]->tpoolmsg); delNotifiedFIFO_elt(measur_table[i]->tpoolmsg);
free(measur_table[i]); free(measur_table[i]);
} }
} }
//free the fifo... //free the fifo...
...@@ -298,7 +298,7 @@ void send_meas(time_stats_t *ts, int msgid) { ...@@ -298,7 +298,7 @@ void send_meas(time_stats_t *ts, int msgid) {
void end_meas(void) { void end_meas(void) {
notifiedFIFO_elt_t *nfe = newNotifiedFIFO_elt(sizeof(time_stats_msg_t),0,NULL,NULL); notifiedFIFO_elt_t *nfe = newNotifiedFIFO_elt(sizeof(time_stats_msg_t),0,NULL,NULL);
time_stats_msg_t *msg = (time_stats_msg_t *)NotifiedFifoData(nfe); time_stats_msg_t *msg = (time_stats_msg_t *)NotifiedFifoData(nfe);
msg->msgid = TIMESTAT_MSGID_END ; msg->msgid = TIMESTAT_MSGID_END ;
pushNotifiedFIFO(&measur_fifo, nfe); pushNotifiedFIFO(&measur_fifo, nfe);
} }
...@@ -110,9 +110,9 @@ static inline unsigned long long rdtsc_oai(void) { ...@@ -110,9 +110,9 @@ static inline unsigned long long rdtsc_oai(void) {
static inline uint64_t rdtsc_oai(void) __attribute__((always_inline)); static inline uint64_t rdtsc_oai(void) __attribute__((always_inline));
static inline uint64_t rdtsc_oai(void) static inline uint64_t rdtsc_oai(void)
{ {
uint64_t r = 0; uint64_t r = 0;
asm volatile("mrs %0, cntvct_el0" : "=r"(r)); asm volatile("mrs %0, cntvct_el0" : "=r"(r));
return r; return r;
} }
#elif defined(__arm__) #elif defined(__arm__)
......
...@@ -250,7 +250,7 @@ int websrv_callback_set_moduleparams(const struct _u_request *request, struct _u ...@@ -250,7 +250,7 @@ int websrv_callback_set_moduleparams(const struct _u_request *request, struct _u
} }
break; break;
} }
} // for *cmd } // for *cmd
} // json_unpack_ex(jsbody OK } // json_unpack_ex(jsbody OK
} // user_data } // user_data
} // jsbody not null } // jsbody not null
...@@ -433,8 +433,8 @@ int websrv_processwebfunc(struct _u_response *response, cmdparser_t *modulestruc ...@@ -433,8 +433,8 @@ int websrv_processwebfunc(struct _u_response *response, cmdparser_t *modulestruc
{ {
LOG_I(UTIL, "[websrv] : executing command %s %s\n", modulestruct->module, cmd->cmdname); LOG_I(UTIL, "[websrv] : executing command %s %s\n", modulestruct->module, cmd->cmdname);
if ((cmd->cmdflags & TELNETSRV_CMDFLAG_NEEDPARAM) && jparams == NULL) { if ((cmd->cmdflags & TELNETSRV_CMDFLAG_NEEDPARAM) && jparams == NULL) {
LOG_W(UTIL, "No parameters sent by frontend for %s %s\n", modulestruct->module, cmd->cmdname); LOG_W(UTIL, "No parameters sent by frontend for %s %s\n", modulestruct->module, cmd->cmdname);
return 500; return 500;
} }
int http_status = 200; int http_status = 200;
char *pname[2], *pvalue[2]; char *pname[2], *pvalue[2];
...@@ -446,25 +446,53 @@ int websrv_processwebfunc(struct _u_response *response, cmdparser_t *modulestruc ...@@ -446,25 +446,53 @@ int websrv_processwebfunc(struct _u_response *response, cmdparser_t *modulestruc
np = json_array_size(jparams); np = json_array_size(jparams);
int jrt; int jrt;
switch(np) { switch(np) {
case 1: case 1:
jrt=json_unpack_ex(jparams, &jerror, 0, "[{s:s,s:s,s:s,s,b}]", "name", &pname[0], "value", &pvalue[0], "type", &ptype[0], "modifiable", &b); jrt = json_unpack_ex(jparams,
break; &jerror,
case 2: 0,
jrt=json_unpack_ex(jparams, &jerror, 0, "[{s:s,s:s,s:s,s,b},{s:s,s:s,s:s,s,b}]", "[{s:s,s:s,s:s,s,b}]",
"name", &pname[0], "value", &pvalue[0], "type", &ptype[0], "modifiable", &b[0], "name",
"name", &pname[1], "value", &pvalue[1], "type", &ptype[1], "modifiable", &b[1]); &pname[0],
break; "value",
default: &pvalue[0],
http_status=500; "type",
break; &ptype[0],
// json_unpack_ex(jparams, &jerror, 0, "[{s:s,s:s,s:s,s,b}]", "name", &pname, "value", &pvalue, "type", &ptype, "modifiable", &b); "modifiable",
&b);
} break;
case 2:
jrt = json_unpack_ex(jparams,
&jerror,
0,
"[{s:s,s:s,s:s,s,b},{s:s,s:s,s:s,s,b}]",
"name",
&pname[0],
"value",
&pvalue[0],
"type",
&ptype[0],
"modifiable",
&b[0],
"name",
&pname[1],
"value",
&pvalue[1],
"type",
&ptype[1],
"modifiable",
&b[1]);
break;
default:
http_status = 500;
break;
// json_unpack_ex(jparams, &jerror, 0, "[{s:s,s:s,s:s,s,b}]", "name", &pname, "value", &pvalue, "type", &ptype,
// "modifiable", &b);
}
if (jrt <0 || http_status != 200) { if (jrt <0 || http_status != 200) {
LOG_I(UTIL, "[websrv], couldn't unpack jparams, module %s, command %s: %s\n", modulestruct->module, cmd->cmdname, jerror.text); LOG_I(UTIL, "[websrv], couldn't unpack jparams, module %s, command %s: %s\n", modulestruct->module, cmd->cmdname, jerror.text);
websrv_printjson((char *)__FUNCTION__, jparams, websrvparams.dbglvl); websrv_printjson((char *)__FUNCTION__, jparams, websrvparams.dbglvl);
return 500; return 500;
} }
} }
if (cmd->cmdflags & TELNETSRV_CMDFLAG_GETWEBTBLDATA) { if (cmd->cmdflags & TELNETSRV_CMDFLAG_GETWEBTBLDATA) {
...@@ -628,15 +656,15 @@ int websrv_callback_get_softmodemcmd(const struct _u_request *request, struct _u ...@@ -628,15 +656,15 @@ int websrv_callback_get_softmodemcmd(const struct _u_request *request, struct _u
helpcp = strdup(modulestruct->cmd[j].helpstr); helpcp = strdup(modulestruct->cmd[j].helpstr);
int ns=sscanf(helpcp,"<%m[^<>]> <%m[^<>]>",&question[0],&question[1]); int ns=sscanf(helpcp,"<%m[^<>]> <%m[^<>]>",&question[0],&question[1]);
if (ns == 0) { if (ns == 0) {
LOG_W(UTIL, "[websrv] Cannot find parameters for command %s %s\n", modulestruct->module, modulestruct->cmd[j].cmdname); LOG_W(UTIL, "[websrv] Cannot find parameters for command %s %s\n", modulestruct->module, modulestruct->cmd[j].cmdname);
continue; continue;
} }
jQ1=json_pack("{s:s,s:s,s:s}", "display",question[0], "pname", "P0", "type", "string"); jQ1=json_pack("{s:s,s:s,s:s}", "display",question[0], "pname", "P0", "type", "string");
json_array_append_new(jQs, jQ1); json_array_append_new(jQs, jQ1);
if (ns >1) { if (ns >1) {
jQ2=json_pack("{s:s,s:s,s:s}","display", (question[1] == NULL) ? "" : question[1], "pname", "P1" , "type", "string"); jQ2=json_pack("{s:s,s:s,s:s}","display", (question[1] == NULL) ? "" : question[1], "pname", "P1" , "type", "string");
json_array_append_new(jQs, jQ2); json_array_append_new(jQs, jQ2);
} }
} }
acmd = json_pack("{s:s,s:o}", "name", modulestruct->cmd[j].cmdname, "question", jQs); acmd = json_pack("{s:s,s:o}", "name", modulestruct->cmd[j].cmdname, "question", jQs);
free(helpcp); free(helpcp);
...@@ -646,9 +674,9 @@ int websrv_callback_get_softmodemcmd(const struct _u_request *request, struct _u ...@@ -646,9 +674,9 @@ int websrv_callback_get_softmodemcmd(const struct _u_request *request, struct _u
acmd = json_pack("{s:s}", "name", modulestruct->cmd[j].cmdname); acmd = json_pack("{s:s}", "name", modulestruct->cmd[j].cmdname);
} }
if ( acmd == NULL) { if ( acmd == NULL) {
LOG_W(UTIL, "[websrv] interface for command %s %s cannot be built\n", modulestruct->module, modulestruct->cmd[j].cmdname); LOG_W(UTIL, "[websrv] interface for command %s %s cannot be built\n", modulestruct->module, modulestruct->cmd[j].cmdname);
continue; continue;
} }
json_t *jopts = json_array(); json_t *jopts = json_array();
if (modulestruct->cmd[j].cmdflags & TELNETSRV_CMDFLAG_AUTOUPDATE) { if (modulestruct->cmd[j].cmdflags & TELNETSRV_CMDFLAG_AUTOUPDATE) {
json_array_append_new(jopts, json_string("update")); json_array_append_new(jopts, json_string("update"));
......
...@@ -63,8 +63,8 @@ int create_tasks_mbms(uint32_t enb_nb) { ...@@ -63,8 +63,8 @@ int create_tasks_mbms(uint32_t enb_nb) {
AssertFatal(rc >= 0, "Create task for MME APP failed\n"); AssertFatal(rc >= 0, "Create task for MME APP failed\n");
if (is_m3ap_MME_enabled()) { if (is_m3ap_MME_enabled()) {
rc = itti_create_task(TASK_M3AP_MME, m3ap_MME_task, NULL); rc = itti_create_task(TASK_M3AP_MME, m3ap_MME_task, NULL);
AssertFatal(rc >= 0, "Create task for M3AP MME failed\n"); AssertFatal(rc >= 0, "Create task for M3AP MME failed\n");
} }
LOG_I(MCE_APP, "Creating MCE_APP eNB Task\n"); LOG_I(MCE_APP, "Creating MCE_APP eNB Task\n");
......
...@@ -130,17 +130,11 @@ static inline void fh_if5_south_out(RU_t *ru,int frame, int subframe, uint64_t t ...@@ -130,17 +130,11 @@ static inline void fh_if5_south_out(RU_t *ru,int frame, int subframe, uint64_t t
ru->south_out_cnt++; ru->south_out_cnt++;
int offset = subframe*ru->frame_parms->samples_per_tti; int offset = subframe*ru->frame_parms->samples_per_tti;
void *buffs[ru->nb_tx]; void *buffs[ru->nb_tx];
for (int aid=0;aid<ru->nb_tx;aid++) buffs[aid] = (void*)&ru->common.txdata[aid][offset]; for (int aid = 0; aid < ru->nb_tx; aid++)
buffs[aid] = (void *)&ru->common.txdata[aid][offset];
ru->ifdevice.trx_write_func2(&ru->ifdevice,
timestamp,
buffs,
0,
ru->frame_parms->samples_per_tti,
0,
ru->nb_tx);
ru->ifdevice.trx_write_func2(&ru->ifdevice, timestamp, buffs, 0, ru->frame_parms->samples_per_tti, 0, ru->nb_tx);
} }
...@@ -1660,7 +1654,7 @@ static void *ru_thread( void *param ) { ...@@ -1660,7 +1654,7 @@ static void *ru_thread( void *param ) {
if (setup_RU_buffers(ru)!=0) { if (setup_RU_buffers(ru)!=0) {
LOG_I(PHY,"Exiting, cannot initialize RU Buffers\n"); LOG_I(PHY,"Exiting, cannot initialize RU Buffers\n");
exit(-1); exit(-1);
} }
AssertFatal((ret=pthread_mutex_lock(ru->ru_mutex))==0,"mutex_lock returns %d\n",ret); AssertFatal((ret=pthread_mutex_lock(ru->ru_mutex))==0,"mutex_lock returns %d\n",ret);
...@@ -1708,9 +1702,10 @@ static void *ru_thread( void *param ) { ...@@ -1708,9 +1702,10 @@ static void *ru_thread( void *param ) {
// Start RF device if any // Start RF device if any
if (ru->start_rf) { if (ru->start_rf) {
if (ru->start_rf(ru) != 0) if (ru->start_rf(ru) != 0)
AssertFatal(1==0,"Could not start the RF device\n"); AssertFatal(1 == 0, "Could not start the RF device\n");
else LOG_I(PHY,"RU %d rf device ready\n",ru->idx); else
LOG_I(PHY, "RU %d rf device ready\n", ru->idx);
} else LOG_D(PHY,"RU %d no rf device\n",ru->idx); } else LOG_D(PHY,"RU %d no rf device\n",ru->idx);
} }
...@@ -1848,19 +1843,20 @@ static void *ru_thread( void *param ) { ...@@ -1848,19 +1843,20 @@ static void *ru_thread( void *param ) {
AssertFatal((ret=pthread_mutex_unlock(&ru->proc.mutex_pre_scd))==0,"[eNB] error unlocking mutex_pre_scd mutex for eNB pre scd\n"); AssertFatal((ret=pthread_mutex_unlock(&ru->proc.mutex_pre_scd))==0,"[eNB] error unlocking mutex_pre_scd mutex for eNB pre scd\n");
#endif #endif
// wakeup all eNB processes waiting for this RU // wakeup all eNB processes waiting for this RU
if (ru->num_eNB>0) wakeup_L1s(ru); if (ru->num_eNB > 0)
wakeup_L1s(ru);
#ifdef MBMS_EXPERIMENTAL #ifdef MBMS_EXPERIMENTAL
//Workaround ... this must be properly handled // Workaround ... this must be properly handled
if(ru->if_south==LOCAL_RF && ru->function==eNodeB_3GPP && ru->eNB_list[0]!=NULL){ if (ru->if_south == LOCAL_RF && ru->function == eNodeB_3GPP && ru->eNB_list[0] != NULL) {
if(ru->frame_parms->num_MBSFN_config!=ru->eNB_list[0]->frame_parms.num_MBSFN_config){ if (ru->frame_parms->num_MBSFN_config != ru->eNB_list[0]->frame_parms.num_MBSFN_config) {
ru->frame_parms = &ru->eNB_list[0]->frame_parms;//->frame_parms; ru->frame_parms = &ru->eNB_list[0]->frame_parms; //->frame_parms;
LOG_W(PHY,"RU MBSFN SF PARAMS Updated\n"); LOG_W(PHY, "RU MBSFN SF PARAMS Updated\n");
} }
} }
#endif #endif
#ifndef PHY_TX_THREAD #ifndef PHY_TX_THREAD
if(get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD || ru->num_eNB==0) { if(get_thread_parallel_conf() == PARALLEL_SINGLE_THREAD || ru->num_eNB==0) {
...@@ -2701,8 +2697,8 @@ void init_RU(RU_t **rup,int nb_RU,PHY_VARS_eNB ***eNBp,int nb_L1,int *nb_CC,char ...@@ -2701,8 +2697,8 @@ void init_RU(RU_t **rup,int nb_RU,PHY_VARS_eNB ***eNBp,int nb_L1,int *nb_CC,char
LOG_D(PHY, "%s() ru[%d].num_eNB:%d ru->eNB_list[0]:%p eNB[0][0]:%p rf_config_file:%s\n", __FUNCTION__, ru_id, ru->num_eNB, ru->eNB_list[0], eNBp[0][0], ru->rf_config_file); LOG_D(PHY, "%s() ru[%d].num_eNB:%d ru->eNB_list[0]:%p eNB[0][0]:%p rf_config_file:%s\n", __FUNCTION__, ru_id, ru->num_eNB, ru->eNB_list[0], eNBp[0][0], ru->rf_config_file);
if (ru->eNB_list[0] == 0) { if (ru->eNB_list[0] == 0) {
LOG_E(PHY,"%s() DJP - ru->eNB_list ru->num_eNB are not initialized - so do it manually\n", __FUNCTION__); LOG_E(PHY, "%s() DJP - ru->eNB_list ru->num_eNB are not initialized - so do it manually\n", __FUNCTION__);
ru->eNB_list[0] = eNBp[0][0]; ru->eNB_list[0] = eNBp[0][0];
ru->num_eNB=1; ru->num_eNB=1;
// //
// DJP - feptx_prec() / feptx_ofdm() parses the eNB_list (based on num_eNB) and copies the txdata_F to txdata in RU // DJP - feptx_prec() / feptx_ofdm() parses the eNB_list (based on num_eNB) and copies the txdata_F to txdata in RU
...@@ -2932,7 +2928,7 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas ...@@ -2932,7 +2928,7 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas
} }
} }
else { else {
ru[j]->openair0_cfg.clock_source = unset; ru[j]->openair0_cfg.clock_source = unset;
} }
if (config_isparamset(RUParamList.paramarray[j], RU_SDR_TME_SRC)) { if (config_isparamset(RUParamList.paramarray[j], RU_SDR_TME_SRC)) {
...@@ -2950,7 +2946,7 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas ...@@ -2950,7 +2946,7 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas
} }
} }
else { else {
ru[j]->openair0_cfg.time_source = unset; ru[j]->openair0_cfg.time_source = unset;
} }
ru[j]->openair0_cfg.tune_offset = get_softmodem_params()->tune_offset; ru[j]->openair0_cfg.tune_offset = get_softmodem_params()->tune_offset;
...@@ -3032,28 +3028,28 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas ...@@ -3032,28 +3028,28 @@ RU_t **RCconfig_RU(int nb_RU,int nb_L1_inst,PHY_VARS_eNB ***eNB,uint64_t *ru_mas
ru[j]->eth_params.remote_portd = *(RUParamList.paramarray[j][RU_REMOTE_PORTD_IDX].uptr); ru[j]->eth_params.remote_portd = *(RUParamList.paramarray[j][RU_REMOTE_PORTD_IDX].uptr);
if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp") == 0) { if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp") == 0) {
ru[j]->if_south = REMOTE_IF5; ru[j]->if_south = REMOTE_IF5;
ru[j]->function = NGFI_RAU_IF5; ru[j]->function = NGFI_RAU_IF5;
ru[j]->eth_params.transp_preference = ETH_UDP_MODE; ru[j]->eth_params.transp_preference = ETH_UDP_MODE;
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp_ecpri_if5") == 0) { } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp_ecpri_if5") == 0) {
ru[j]->if_south = REMOTE_IF5; ru[j]->if_south = REMOTE_IF5;
ru[j]->function = NGFI_RAU_IF5; ru[j]->function = NGFI_RAU_IF5;
ru[j]->eth_params.transp_preference = ETH_UDP_IF5_ECPRI_MODE; ru[j]->eth_params.transp_preference = ETH_UDP_IF5_ECPRI_MODE;
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw") == 0) { } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw") == 0) {
ru[j]->if_south = REMOTE_IF5; ru[j]->if_south = REMOTE_IF5;
ru[j]->function = NGFI_RAU_IF5; ru[j]->function = NGFI_RAU_IF5;
ru[j]->eth_params.transp_preference = ETH_RAW_MODE; ru[j]->eth_params.transp_preference = ETH_RAW_MODE;
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp_if4p5") == 0) { } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp_if4p5") == 0) {
ru[j]->if_south = REMOTE_IF4p5; ru[j]->if_south = REMOTE_IF4p5;
ru[j]->function = NGFI_RAU_IF4p5; ru[j]->function = NGFI_RAU_IF4p5;
ru[j]->eth_params.transp_preference = ETH_UDP_IF4p5_MODE; ru[j]->eth_params.transp_preference = ETH_UDP_IF4p5_MODE;
ru[j]->has_ctrl_prt = 1; ru[j]->has_ctrl_prt = 1;
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw_if4p5") == 0) { } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw_if4p5") == 0) {
ru[j]->if_south = REMOTE_IF4p5; ru[j]->if_south = REMOTE_IF4p5;
ru[j]->function = NGFI_RAU_IF4p5; ru[j]->function = NGFI_RAU_IF4p5;
ru[j]->eth_params.transp_preference = ETH_RAW_IF4p5_MODE; ru[j]->eth_params.transp_preference = ETH_RAW_IF4p5_MODE;
ru[j]->has_ctrl_prt = 1; ru[j]->has_ctrl_prt = 1;
if (strcmp(*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr), "yes") == 0) ru[j]->is_slave=1; if (strcmp(*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr), "yes") == 0) ru[j]->is_slave=1;
else ru[j]->is_slave=0; else ru[j]->is_slave=0;
} }
......
...@@ -650,7 +650,7 @@ int main ( int argc, char **argv ) ...@@ -650,7 +650,7 @@ int main ( int argc, char **argv )
* threads have been stopped (they partially use the same memory) */ * threads have been stopped (they partially use the same memory) */
for (int inst = 0; inst < NB_eNB_INST; inst++) { for (int inst = 0; inst < NB_eNB_INST; inst++) {
for (int cc_id = 0; cc_id < RC.nb_CC[inst]; cc_id++) { for (int cc_id = 0; cc_id < RC.nb_CC[inst]; cc_id++) {
free_transport(RC.eNB[inst][cc_id]); free_transport(RC.eNB[inst][cc_id]);
phy_free_lte_eNB(RC.eNB[inst][cc_id]); phy_free_lte_eNB(RC.eNB[inst][cc_id]);
} }
} }
......
...@@ -514,7 +514,7 @@ static void init_pdcp(int ue_id) { ...@@ -514,7 +514,7 @@ static void init_pdcp(int ue_id) {
// Stupid function addition because UE itti messages queues definition is common with eNB // Stupid function addition because UE itti messages queues definition is common with eNB
void *rrc_enb_process_msg(void *notUsed) { void *rrc_enb_process_msg(void *notUsed) {
AssertFatal(false,""); AssertFatal(false,"");
return NULL; return NULL;
} }
int NB_UE_INST = 1; int NB_UE_INST = 1;
......
...@@ -241,34 +241,34 @@ int main ( int argc, char **argv ) ...@@ -241,34 +241,34 @@ int main ( int argc, char **argv )
// Check if control port set // Check if control port set
if (!(config_isparamset(RUParamList.paramarray[j],RU_REMOTE_PORTC_IDX)) ) { if (!(config_isparamset(RUParamList.paramarray[j],RU_REMOTE_PORTC_IDX)) ) {
printf("Removing control port for RU %d\n",j); printf("Removing control port for RU %d\n", j);
ru->has_ctrl_prt = 0; ru->has_ctrl_prt = 0;
} else { } else {
ru->eth_params.my_portc = *(RUParamList.paramarray[j][RU_LOCAL_PORTC_IDX].uptr); ru->eth_params.my_portc = *(RUParamList.paramarray[j][RU_LOCAL_PORTC_IDX].uptr);
ru->eth_params.remote_portc = *(RUParamList.paramarray[j][RU_REMOTE_PORTC_IDX].uptr); ru->eth_params.remote_portc = *(RUParamList.paramarray[j][RU_REMOTE_PORTC_IDX].uptr);
printf(" Control port %u \n",ru->eth_params.my_portc); printf(" Control port %u \n", ru->eth_params.my_portc);
} }
if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp") == 0) { if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp") == 0) {
ru->if_south = LOCAL_RF; ru->if_south = LOCAL_RF;
ru->function = NGFI_RRU_IF5; ru->function = NGFI_RRU_IF5;
ru->eth_params.transp_preference = ETH_UDP_MODE; ru->eth_params.transp_preference = ETH_UDP_MODE;
printf("Setting function for RU %d to NGFI_RRU_IF5 (udp)\n",j); printf("Setting function for RU %d to NGFI_RRU_IF5 (udp)\n", j);
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw") == 0) { } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw") == 0) {
ru->if_south = LOCAL_RF; ru->if_south = LOCAL_RF;
ru->function = NGFI_RRU_IF5; ru->function = NGFI_RRU_IF5;
ru->eth_params.transp_preference = ETH_RAW_MODE; ru->eth_params.transp_preference = ETH_RAW_MODE;
printf("Setting function for RU %d to NGFI_RRU_IF5 (raw)\n",j); printf("Setting function for RU %d to NGFI_RRU_IF5 (raw)\n", j);
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp_if4p5") == 0) { } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "udp_if4p5") == 0) {
ru->if_south = LOCAL_RF; ru->if_south = LOCAL_RF;
ru->function = NGFI_RRU_IF4p5; ru->function = NGFI_RRU_IF4p5;
ru->eth_params.transp_preference = ETH_UDP_IF4p5_MODE; ru->eth_params.transp_preference = ETH_UDP_IF4p5_MODE;
printf("Setting function for RU %d to NGFI_RRU_IF4p5 (udp)\n",j); printf("Setting function for RU %d to NGFI_RRU_IF4p5 (udp)\n", j);
} else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw_if4p5") == 0) { } else if (strcmp(*(RUParamList.paramarray[j][RU_TRANSPORT_PREFERENCE_IDX].strptr), "raw_if4p5") == 0) {
ru->if_south = LOCAL_RF; ru->if_south = LOCAL_RF;
ru->function = NGFI_RRU_IF4p5; ru->function = NGFI_RRU_IF4p5;
ru->eth_params.transp_preference = ETH_RAW_IF4p5_MODE; ru->eth_params.transp_preference = ETH_RAW_IF4p5_MODE;
printf("Setting function for RU %d to NGFI_RRU_IF4p5 (raw)\n",j); printf("Setting function for RU %d to NGFI_RRU_IF4p5 (raw)\n", j);
} }
printf("RU %d is_slave=%s\n",j,*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr)); printf("RU %d is_slave=%s\n",j,*(RUParamList.paramarray[j][RU_IS_SLAVE_IDX].strptr));
......
...@@ -493,7 +493,7 @@ void init_gNB_Tpool(int inst) { ...@@ -493,7 +493,7 @@ void init_gNB_Tpool(int inst) {
initNotifiedFIFO(&gNB->L1_tx_out); initNotifiedFIFO(&gNB->L1_tx_out);
if (get_softmodem_params()->reorder_thread_disable) { if (get_softmodem_params()->reorder_thread_disable) {
// create the RX thread responsible for triggering RX processing and then TX processing if a single thread is used // create the RX thread responsible for triggering RX processing and then TX processing if a single thread is used
threadCreate(&gNB->L1_rx_thread, L1_rx_thread, (void *)gNB, "L1_rx_thread", threadCreate(&gNB->L1_rx_thread, L1_rx_thread, (void *)gNB, "L1_rx_thread",
gNB->L1_rx_thread_core, OAI_PRIORITY_RT_MAX); gNB->L1_rx_thread_core, OAI_PRIORITY_RT_MAX);
// if separate threads are used for RX and TX, create the TX thread // if separate threads are used for RX and TX, create the TX thread
...@@ -605,13 +605,9 @@ void init_eNB_afterRU(void) { ...@@ -605,13 +605,9 @@ void init_eNB_afterRU(void) {
LOG_I(PHY,"gNB->num_RU:%d\n", gNB->num_RU); LOG_I(PHY,"gNB->num_RU:%d\n", gNB->num_RU);
for (ru_id=0,aa=0; ru_id<gNB->num_RU; ru_id++) { for (ru_id=0,aa=0; ru_id<gNB->num_RU; ru_id++) {
AssertFatal(gNB->RU_list[ru_id]->common.rxdataF!=NULL, AssertFatal(gNB->RU_list[ru_id]->common.rxdataF != NULL, "RU %d : common.rxdataF is NULL\n", gNB->RU_list[ru_id]->idx);
"RU %d : common.rxdataF is NULL\n", AssertFatal(gNB->RU_list[ru_id]->prach_rxsigF != NULL, "RU %d : prach_rxsigF is NULL\n", gNB->RU_list[ru_id]->idx);
gNB->RU_list[ru_id]->idx);
AssertFatal(gNB->RU_list[ru_id]->prach_rxsigF!=NULL,
"RU %d : prach_rxsigF is NULL\n",
gNB->RU_list[ru_id]->idx);
for (i=0; i<gNB->RU_list[ru_id]->nb_rx; aa++,i++) { for (i=0; i<gNB->RU_list[ru_id]->nb_rx; aa++,i++) {
LOG_I(PHY,"Attaching RU %d antenna %d to gNB antenna %d\n",gNB->RU_list[ru_id]->idx,i,aa); LOG_I(PHY,"Attaching RU %d antenna %d to gNB antenna %d\n",gNB->RU_list[ru_id]->idx,i,aa);
gNB->prach_vars.rxsigF[aa] = gNB->RU_list[ru_id]->prach_rxsigF[0][i]; gNB->prach_vars.rxsigF[aa] = gNB->RU_list[ru_id]->prach_rxsigF[0][i];
......
...@@ -286,13 +286,12 @@ void fh_if5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) { ...@@ -286,13 +286,12 @@ void fh_if5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) {
LOG_D(PHY,"IF5 TX %d.%d, TS %llu, buffs[0] %p, buffs[1] %p ener0 %f dB, tx start %d\n",frame,slot,(unsigned long long)timestamp,buffs[0],buffs[1], LOG_D(PHY,"IF5 TX %d.%d, TS %llu, buffs[0] %p, buffs[1] %p ener0 %f dB, tx start %d\n",frame,slot,(unsigned long long)timestamp,buffs[0],buffs[1],
10*log10((double)signal_energy(buffs[0],ru->nr_frame_parms->get_samples_per_slot(slot,ru->nr_frame_parms))),(int)txmeas.tv_nsec); 10*log10((double)signal_energy(buffs[0],ru->nr_frame_parms->get_samples_per_slot(slot,ru->nr_frame_parms))),(int)txmeas.tv_nsec);
ru->ifdevice.trx_write_func2(&ru->ifdevice, ru->ifdevice.trx_write_func2(&ru->ifdevice,
timestamp, timestamp,
buffs, buffs,
0, 0,
ru->nr_frame_parms->get_samples_per_slot(slot,ru->nr_frame_parms), ru->nr_frame_parms->get_samples_per_slot(slot, ru->nr_frame_parms),
0, 0,
ru->nb_tx); ru->nb_tx);
} }
// southbound IF4p5 fronthaul // southbound IF4p5 fronthaul
...@@ -684,13 +683,17 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { ...@@ -684,13 +683,17 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_subframe*10))&1023; proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_subframe*10))&1023;
proc->tti_rx = fp->get_slot_from_timestamp(proc->timestamp_rx,fp); proc->tti_rx = fp->get_slot_from_timestamp(proc->timestamp_rx,fp);
// synchronize first reception to frame 0 subframe 0 // synchronize first reception to frame 0 subframe 0
LOG_D(PHY,"RU %d/%d TS %ld, GPS %f, SR %f, frame %d, slot %d.%d / %d\n", LOG_D(PHY,
"RU %d/%d TS %ld, GPS %f, SR %f, frame %d, slot %d.%d / %d\n",
ru->idx, ru->idx,
0, 0,
ts, //(unsigned long long int)(proc->timestamp_rx+ru->ts_offset), ts, //(unsigned long long int)(proc->timestamp_rx+ru->ts_offset),
gps_sec, gps_sec,
cfg->sample_rate, cfg->sample_rate,
proc->frame_rx,proc->tti_rx,proc->tti_tx,fp->slots_per_frame); proc->frame_rx,
proc->tti_rx,
proc->tti_tx,
fp->slots_per_frame);
// dump VCD output for first RU in list // dump VCD output for first RU in list
if (ru == RC.ru[0]) { if (ru == RC.ru[0]) {
...@@ -1215,14 +1218,12 @@ void *ru_thread( void *param ) { ...@@ -1215,14 +1218,12 @@ void *ru_thread( void *param ) {
// This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices // This is a forever while loop, it loops over subframes which are scheduled by incoming samples from HW devices
struct timespec slot_start; struct timespec slot_start;
clock_gettime(CLOCK_MONOTONIC, &slot_start); clock_gettime(CLOCK_MONOTONIC, &slot_start);
struct timespec slot_duration;
slot_duration.tv_sec = 0;
//slot_duration.tv_nsec = 0.5e6;
slot_duration.tv_nsec = 0.5e6;
struct timespec slot_duration;
slot_duration.tv_sec = 0;
// slot_duration.tv_nsec = 0.5e6;
slot_duration.tv_nsec = 0.5e6;
while (!oai_exit) { while (!oai_exit) {
...@@ -1235,9 +1236,9 @@ void *ru_thread( void *param ) { ...@@ -1235,9 +1236,9 @@ void *ru_thread( void *param ) {
struct timespec sleep_time; struct timespec sleep_time;
if((slot_start.tv_sec > curr_time.tv_sec) || (slot_start.tv_sec == curr_time.tv_sec && slot_start.tv_nsec > curr_time.tv_nsec)){ if((slot_start.tv_sec > curr_time.tv_sec) || (slot_start.tv_sec == curr_time.tv_sec && slot_start.tv_nsec > curr_time.tv_nsec)){
sleep_time = timespec_sub(slot_start,curr_time); sleep_time = timespec_sub(slot_start, curr_time);
usleep(sleep_time.tv_nsec * 1e-3); usleep(sleep_time.tv_nsec * 1e-3);
} }
} }
......
...@@ -330,8 +330,8 @@ static int create_gNB_tasks(ngran_node_t node_type, configmodule_interface_t *cf ...@@ -330,8 +330,8 @@ static int create_gNB_tasks(ngran_node_t node_type, configmodule_interface_t *cf
} }
if (is_x2ap_enabled() ) { //&& !NODE_IS_DU(node_type) if (is_x2ap_enabled() ) { //&& !NODE_IS_DU(node_type)
LOG_I(X2AP, "X2AP enabled \n"); LOG_I(X2AP, "X2AP enabled \n");
__attribute__((unused)) uint32_t x2_register_gnb_pending = gNB_app_register_x2 (gnb_id_start, gnb_id_end); __attribute__((unused)) uint32_t x2_register_gnb_pending = gNB_app_register_x2(gnb_id_start, gnb_id_end);
} }
/* For the CU case the gNB registration with the AMF might have to take place after the F1 setup, as the PLMN info /* For the CU case the gNB registration with the AMF might have to take place after the F1 setup, as the PLMN info
...@@ -680,7 +680,8 @@ int main( int argc, char **argv ) { ...@@ -680,7 +680,8 @@ int main( int argc, char **argv ) {
for (ru_id=0; ru_id<RC.nb_RU; ru_id++) { for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
RC.ru[ru_id]->rf_map.card=0; RC.ru[ru_id]->rf_map.card=0;
RC.ru[ru_id]->rf_map.chain=CC_id+chain_offset; RC.ru[ru_id]->rf_map.chain=CC_id+chain_offset;
if (ru_id==0) sl_ahead = RC.ru[ru_id]->sl_ahead; if (ru_id == 0)
sl_ahead = RC.ru[ru_id]->sl_ahead;
else AssertFatal(RC.ru[ru_id]->sl_ahead != RC.ru[0]->sl_ahead,"RU %d has different sl_ahead %d than RU 0 %d\n",ru_id,RC.ru[ru_id]->sl_ahead,RC.ru[0]->sl_ahead); else AssertFatal(RC.ru[ru_id]->sl_ahead != RC.ru[0]->sl_ahead,"RU %d has different sl_ahead %d than RU 0 %d\n",ru_id,RC.ru[ru_id]->sl_ahead,RC.ru[0]->sl_ahead);
} }
......
...@@ -691,28 +691,31 @@ void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) { ...@@ -691,28 +691,31 @@ void syncInFrame(PHY_VARS_NR_UE *UE, openair0_timestamp *timestamp) {
if (IS_SOFTMODEM_IQPLAYER || IS_SOFTMODEM_IQRECORDER) { if (IS_SOFTMODEM_IQPLAYER || IS_SOFTMODEM_IQRECORDER) {
// Resynchonize by slot (will work with numerology 1 only) // Resynchonize by slot (will work with numerology 1 only)
for ( int size=UE->rx_offset ; size > 0 ; size -= UE->frame_parms.samples_per_subframe/2 ) { for ( int size=UE->rx_offset ; size > 0 ; size -= UE->frame_parms.samples_per_subframe/2 ) {
int unitTransfer=size>UE->frame_parms.samples_per_subframe/2 ? UE->frame_parms.samples_per_subframe/2 : size ; int unitTransfer = size > UE->frame_parms.samples_per_subframe / 2 ? UE->frame_parms.samples_per_subframe / 2 : size;
AssertFatal(unitTransfer == AssertFatal(unitTransfer
UE->rfdevice.trx_read_func(&UE->rfdevice, == UE->rfdevice.trx_read_func(&UE->rfdevice,
timestamp, timestamp,
(void **)UE->common_vars.rxdata, (void **)UE->common_vars.rxdata,
unitTransfer, unitTransfer,
UE->frame_parms.nb_antennas_rx),""); UE->frame_parms.nb_antennas_rx),
"");
} }
} else { } else {
*timestamp += UE->frame_parms.get_samples_per_slot(1,&UE->frame_parms); *timestamp += UE->frame_parms.get_samples_per_slot(1,&UE->frame_parms);
for ( int size=UE->rx_offset ; size > 0 ; size -= UE->frame_parms.samples_per_subframe ) { for ( int size=UE->rx_offset ; size > 0 ; size -= UE->frame_parms.samples_per_subframe ) {
int unitTransfer=size>UE->frame_parms.samples_per_subframe ? UE->frame_parms.samples_per_subframe : size ; int unitTransfer = size > UE->frame_parms.samples_per_subframe ? UE->frame_parms.samples_per_subframe : size;
// we write before read because gNB waits for UE to write and both executions halt // we write before read because gNB waits for UE to write and both executions halt
// this happens here as the read size is samples_per_subframe which is very much larger than samp_per_slot // this happens here as the read size is samples_per_subframe which is very much larger than samp_per_slot
if (IS_SOFTMODEM_RFSIM) dummyWrite(UE,*timestamp, unitTransfer); if (IS_SOFTMODEM_RFSIM)
AssertFatal(unitTransfer == dummyWrite(UE, *timestamp, unitTransfer);
UE->rfdevice.trx_read_func(&UE->rfdevice, AssertFatal(unitTransfer
timestamp, == UE->rfdevice.trx_read_func(&UE->rfdevice,
(void **)UE->common_vars.rxdata, timestamp,
unitTransfer, (void **)UE->common_vars.rxdata,
UE->frame_parms.nb_antennas_rx),""); unitTransfer,
*timestamp += unitTransfer; // this does not affect the read but needed for RFSIM write UE->frame_parms.nb_antennas_rx),
"");
*timestamp += unitTransfer; // this does not affect the read but needed for RFSIM write
} }
} }
} }
...@@ -791,16 +794,16 @@ void *UE_thread(void *arg) ...@@ -791,16 +794,16 @@ void *UE_thread(void *arg)
delNotifiedFIFO_elt(res); delNotifiedFIFO_elt(res);
start_rx_stream=0; start_rx_stream=0;
} else { } else {
if (IS_SOFTMODEM_IQPLAYER || IS_SOFTMODEM_IQRECORDER) { if (IS_SOFTMODEM_IQPLAYER || IS_SOFTMODEM_IQRECORDER) {
// For IQ recorder/player we force synchronization to happen in 280 ms // For IQ recorder/player we force synchronization to happen in 280 ms
while (trashed_frames != 28) { while (trashed_frames != 28) {
readFrame(UE, &timestamp, true); readFrame(UE, &timestamp, true);
trashed_frames+=2; trashed_frames += 2;
} }
} else { } else {
readFrame(UE, &timestamp, true); readFrame(UE, &timestamp, true);
trashed_frames+=2; trashed_frames += 2;
} }
continue; continue;
} }
} }
......
...@@ -423,7 +423,7 @@ void update_ocm(double snr_dB,double sinr_dB) { ...@@ -423,7 +423,7 @@ void update_ocm(double snr_dB,double sinr_dB) {
sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms->pdsch_config_common.referenceSignalPower; sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms->pdsch_config_common.referenceSignalPower;
sim.UE2RU[UE_id][ru_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms->pdsch_config_common.referenceSignalPower; sim.UE2RU[UE_id][ru_id][CC_id]->path_loss_dB = -132.24 + sinr_dB - RC.ru[ru_id]->frame_parms->pdsch_config_common.referenceSignalPower;
} }
LOG_D(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d, SNR %f)\n",ru_id,UE_id,CC_id, LOG_D(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d, SNR %f)\n",ru_id,UE_id,CC_id,
sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB, sim.RU2UE[ru_id][UE_id][CC_id]->path_loss_dB,
RC.ru[ru_id]->frame_parms->pdsch_config_common.referenceSignalPower, RC.ru[ru_id]->frame_parms->pdsch_config_common.referenceSignalPower,
......
This diff is collapsed.
...@@ -75,8 +75,8 @@ softmodem_params_t *get_softmodem_params(void) { ...@@ -75,8 +75,8 @@ softmodem_params_t *get_softmodem_params(void) {
int32_t check_execmask(uint64_t execmask) { int32_t check_execmask(uint64_t execmask) {
char *softmodemfunc=map_int_to_str(softmodem_funcs, execmask); char *softmodemfunc=map_int_to_str(softmodem_funcs, execmask);
if (softmodemfunc != NULL) { if (softmodemfunc != NULL) {
set_softmodem_optmask(execmask); set_softmodem_optmask(execmask);
return 0; return 0;
} }
return -1; return -1;
} }
...@@ -84,9 +84,9 @@ char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr) { ...@@ -84,9 +84,9 @@ char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr) {
uint64_t fmask=(get_softmodem_optmask()&SOFTMODEM_FUNC_BITS); uint64_t fmask=(get_softmodem_optmask()&SOFTMODEM_FUNC_BITS);
char *softmodemfunc=map_int_to_str(softmodem_funcs, fmask); char *softmodemfunc=map_int_to_str(softmodem_funcs, fmask);
if (sofmodemfunc_mask_ptr != NULL) if (sofmodemfunc_mask_ptr != NULL)
*sofmodemfunc_mask_ptr=fmask; *sofmodemfunc_mask_ptr = fmask;
if (softmodemfunc != NULL) { if (softmodemfunc != NULL) {
return softmodemfunc; return softmodemfunc;
} }
return "???"; return "???";
} }
......
This diff is collapsed.
This diff is collapsed.
...@@ -29,15 +29,14 @@ ...@@ -29,15 +29,14 @@
#define NFAPI_MAX_NUM_UL_PDU 255 #define NFAPI_MAX_NUM_UL_PDU 255
/* /*
typedef unsigned int uint32_t; typedef unsigned int uint32_t;
typedef unsigned short uint16_t; typedef unsigned short uint16_t;
typedef unsigned char uint8_t; typedef unsigned char uint8_t;
typedef signed int int32_t; typedef signed int int32_t;
typedef signed short int16_t; typedef signed short int16_t;
typedef signed char int8_t; typedef signed char int8_t;
*/ */
typedef struct { typedef struct {
uint8_t uci_format; uint8_t uci_format;
uint8_t uci_channel; uint8_t uci_channel;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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