diff --git a/common/utils/T/.gitignore b/common/utils/T/.gitignore index 85ff166c1ab4a1c217d22a0d1038f9a9955092da..817780592428b38fd48b57f26be6b3a73868ae63 100644 --- a/common/utils/T/.gitignore +++ b/common/utils/T/.gitignore @@ -14,4 +14,5 @@ tracer/ue tracer/to_vcd tracer/extract_input_subframe tracer/extract_output_subframe +tracer/extract tracee/tracee diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h index 65f2430265574103ceaccd47970f84307f6bfaa6..24845b6b9eafb2241ad62e7cc9e9ad643f0ecbbb 100644 --- a/common/utils/T/T_defs.h +++ b/common/utils/T/T_defs.h @@ -29,10 +29,10 @@ typedef struct { #define T_SHM_FILENAME "/T_shm_segment" /* number of VCD functions (to be kept up to date! see in T_messages.txt) */ -#define VCD_NUM_FUNCTIONS 172 +#define VCD_NUM_FUNCTIONS 178 /* number of VCD variables (to be kept up to date! see in T_messages.txt) */ -#define VCD_NUM_VARIABLES 118 +#define VCD_NUM_VARIABLES 128 /* first VCD function (to be kept up to date! see in T_messages.txt) */ #define VCD_FIRST_FUNCTION ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP) diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt index 0eef56505a1e8484f24134d8779f0cfe8c96d19a..3e37b5ea150c7913d5c596001c03d364db13f828 100644 --- a/common/utils/T/T_messages.txt +++ b/common/utils/T/T_messages.txt @@ -958,6 +958,38 @@ ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_ENB DESC = VCD variable SUBFRAME_NUMBER_RX1_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_TX0_RU + DESC = VCD variable FRAME_NUMBER_TX0_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_TX1_RU + DESC = VCD variable FRAME_NUMBER_TX1_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_RX0_RU + DESC = VCD variable FRAME_NUMBER_RX0_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_FRAME_NUMBER_RX1_RU + DESC = VCD variable FRAME_NUMBER_RX1_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_RU + DESC = VCD variable SUBFRAME_NUMBER_TX0_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_RU + DESC = VCD variable SUBFRAME_NUMBER_TX1_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_RU + DESC = VCD variable SUBFRAME_NUMBER_RX0_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_RU + DESC = VCD variable SUBFRAME_NUMBER_RX1_RU + GROUP = ALL:VCD:ENB:VCD_VARIABLE + FORMAT = ulong,value ID = VCD_VARIABLE_RUNTIME_TX_ENB DESC = VCD variable RUNTIME_TX_ENB GROUP = ALL:VCD:ENB:VCD_VARIABLE @@ -1050,6 +1082,14 @@ ID = VCD_VARIABLE_TRX_TST DESC = VCD variable TRX_TST GROUP = ALL:VCD:ENB:VCD_VARIABLE FORMAT = ulong,value +ID = VCD_VARIABLE_TRX_TS_UE + DESC = VCD variable TRX_TS_UE + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value +ID = VCD_VARIABLE_TRX_TST_UE + DESC = VCD variable TRX_TST_UE + GROUP = ALL:VCD:UE:VCD_VARIABLE + FORMAT = ulong,value ID = VCD_VARIABLE_TRX_WRITE_FLAGS DESC = VCD variable TRX_WRITE_FLAGS GROUP = ALL:VCD:ENB:VCD_VARIABLE @@ -1413,6 +1453,14 @@ ID = VCD_FUNCTION_TRX_WRITE DESC = VCD function TRX_WRITE GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_TRX_READ_UE + DESC = VCD function TRX_READ_UE + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_TRX_WRITE_UE + DESC = VCD function TRX_WRITE_UE + GROUP = ALL:VCD:UE:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_TRX_READ_IF DESC = VCD function TRX_READ_IF GROUP = ALL:VCD:ENB:VCD_FUNCTION @@ -1565,12 +1613,28 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX1 DESC = VCD function PHY_PROCEDURES_ENB_TX1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value -ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_COMMON - DESC = VCD function PHY_PROCEDURES_ENB_RX_COMMON +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX + DESC = VCD function PHY_PROCEDURES_RU_FEPRX + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX1 + DESC = VCD function PHY_PROCEDURES_RU_FEPRX1 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM + DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM1 + DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM1 + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC + DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value -ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_COMMON1 - DESC = VCD function PHY_PROCEDURES_ENB_RX_COMMON1 +ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC1 + DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC @@ -1581,10 +1645,6 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1 DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1 GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value -ID = VCD_FUNCTION_ENB_SLOT_FEP - DESC = VCD function ENB_SLOT_FEP - GROUP = ALL:VCD:ENB:VCD_FUNCTION - FORMAT = int,value ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX DESC = VCD function PHY_PROCEDURES_UE_TX GROUP = ALL:VCD:UE:VCD_FUNCTION @@ -1781,6 +1841,10 @@ ID = VCD_FUNCTION_PHY_ENB_PRACH_RX DESC = VCD function PHY_ENB_PRACH_RX GROUP = ALL:VCD:ENB:VCD_FUNCTION FORMAT = int,value +ID = VCD_FUNCTION_PHY_RU_PRACH_RX + DESC = VCD function PHY_RU_PRACH_RX + GROUP = ALL:VCD:ENB:VCD_FUNCTION + FORMAT = int,value ID = VCD_FUNCTION_PHY_ENB_PDCCH_TX DESC = VCD function PHY_ENB_PDCCH_TX GROUP = ALL:VCD:ENB:VCD_FUNCTION diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile index c1b0c682a0601f65172269459d10edde32f10661..1c4a77587c3916c9140a9ef71465b08e8a9313aa 100644 --- a/common/utils/T/tracer/Makefile +++ b/common/utils/T/tracer/Makefile @@ -7,7 +7,7 @@ LIBS=-lm XLIBS=-lX11 -lpng -lXft all: record replay extract_config textlog enb ue vcd macpdu2wireshark \ - extract_input_subframe extract_output_subframe to_vcd + extract_input_subframe extract_output_subframe to_vcd extract record: utils.o record.o database.o config.o $(CC) $(CFLAGS) -o record $^ $(LIBS) @@ -26,6 +26,9 @@ extract_output_subframe: extract_output_subframe.o database.o event.o utils.o \ config.o $(CC) $(CFLAGS) -o $@ $^ $(LIBS) +extract: extract.o database.o event.o utils.o config.o + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) + textlog: utils.o textlog.o database.o event.o handler.o config.o \ event_selector.o view/view.a gui/gui.a logger/logger.a \ filter/filter.a @@ -74,7 +77,7 @@ filter/filter.a: clean: rm -f *.o core tracer_remote textlog enb ue vcd record replay rm -f extract_config macpdu2wireshark extract_input_subframe - rm -f extract_output_subframe to_vcd + rm -f extract_output_subframe to_vcd extract cd gui && make clean cd view && make clean cd logger && make clean diff --git a/common/utils/T/tracer/extract.c b/common/utils/T/tracer/extract.c new file mode 100644 index 0000000000000000000000000000000000000000..b9fca959eddf6a8428aee25b5aabf37cd51419b5 --- /dev/null +++ b/common/utils/T/tracer/extract.c @@ -0,0 +1,124 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include "database.h" +#include "event.h" +#include "config.h" + +void usage(void) +{ + printf( +"usage: [options] <file> <event> <buffer name>\n" +"options:\n" +" -d <database file> this option is mandatory\n" +" -o <output file> this option is mandatory\n" +" -f <name> <value> field 'name' of 'event' has to match 'value'\n" +" type of 'name' must be int\n" +" (you can use several -f options)\n" + ); + exit(1); +} + +int get_filter_arg(database_event_format *f, char *field, char *type) +{ + int i; + for (i = 0; i < f->count; i++) + if (!strcmp(f->name[i], field)) { + if (strcmp(f->type[i], type)) break; + return i; + } + printf("bad field %s, check that it exists and has type '%s'\n",field,type); + exit(1); +} + +int main(int n, char **v) +{ + char *database_filename = NULL; + void *database; + int i; + int input_event_id; + database_event_format f; + char *file = NULL; + char *output_file = NULL; + FILE *out; + int fd; + char *event_name = NULL; + char *buffer_name = NULL; + char *filter[n]; + int filter_arg[n]; + int filter_value[n]; + int filter_count = 0; + int buffer_arg; + int found; + + for (i = 1; i < n; i++) { + if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage(); + if (!strcmp(v[i], "-d")) + { if (i > n-2) usage(); database_filename = v[++i]; continue; } + if (!strcmp(v[i], "-o")) + { if (i > n-2) usage(); output_file = v[++i]; continue; } + if (!strcmp(v[i], "-f")) { if (i>n-3) usage(); + filter[filter_count] = v[++i]; + filter_value[filter_count++] = atoi(v[++i]); + continue; + } + if (file == NULL) { file = v[i]; continue; } + if (event_name == NULL) { event_name = v[i]; continue; } + if (buffer_name == NULL) { buffer_name = v[i]; continue; } + usage(); + } + if (file == NULL || event_name == NULL || buffer_name == NULL) usage(); + + if (database_filename == NULL) { + printf("ERROR: provide a database file (-d)\n"); + exit(1); + } + + if (output_file == NULL) { + printf("gimme -o <output file>, thanks\n"); + exit(1); + } + + out = fopen(output_file, "w"); if(out==NULL){perror(output_file);exit(1);} + + database = parse_database(database_filename); + + load_config_file(database_filename); + + input_event_id = event_id_from_name(database, event_name); + f = get_format(database, input_event_id); + + buffer_arg = get_filter_arg(&f, buffer_name, "buffer"); + + for (i = 0; i < filter_count; i++) + filter_arg[i] = get_filter_arg(&f, filter[i], "int"); + + fd = open(file, O_RDONLY); + if (fd == -1) { perror(file); exit(1); } + + found = 0; + + while (1) { + char v[T_BUFFER_MAX]; + event e; + e = get_event(fd, v, database); + if (e.type == -1) break; + if (e.type != input_event_id) continue; + for (i = 0; i < filter_count; i++) + if (filter_value[i] != e.e[filter_arg[i]].i) + break; + if (i != filter_count) + continue; + if (fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, out) != 1) + { perror(output_file); exit(1); } + found = 1; + break; + } + + if (found == 0) printf("ERROR: event not found\n"); + + fclose(out); + + return 0; +} diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 30538d8298bc0d9f17146a757e9bea36053e1dd1..cd032e688fab2ed984f6fc3e8415cb0699dab498 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -227,11 +227,8 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms, int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id) { - static int first_run=1; - static int max_pos_fil2=0; int temp, i, aa, max_pos=0, max_val=0; - short Re,Im,coef=24576; - short ncoef = 32768 - coef; + short Re,Im; LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; LTE_eNB_PUSCH *eNB_pusch_vars = eNB->pusch_vars[UE_id]; @@ -260,16 +257,9 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id) if (max_pos>frame_parms->ofdm_symbol_size/2) max_pos = max_pos-frame_parms->ofdm_symbol_size; - // filter position to reduce jitter - if (first_run == 1) { - first_run=0; - max_pos_fil2 = max_pos; - } else - max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15; - //#ifdef DEBUG_PHY - LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,max_pos_fil2,sync_pos); + LOG_D(PHY,"frame %d: max_pos = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,sync_pos); //#endif //DEBUG_PHY - return(max_pos_fil2-sync_pos); + return max_pos - sync_pos; } diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 5f315725133351fba190106d8fdadfe85b77fc8e..c99776e7e59da87f137106c746c436450c6b8bc2 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -663,7 +663,7 @@ void prach_procedures(PHY_VARS_eNB *eNB, { if ((eNB->prach_energy_counter == 100) && - (max_preamble_energy[0] > eNB->measurements.prach_I0+200)) { + (max_preamble_energy[0] > eNB->measurements.prach_I0+100)) { LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n", eNB->Mod_id, @@ -1524,7 +1524,7 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe) pdu->data = eNB->ulsch[UE_id]->harq_processes[harq_pid]->b; // estimate timing advance for MAC sync_pos = lte_est_timing_advance_pusch(eNB,UE_id); - timing_advance_update = sync_pos - eNB->frame_parms.nb_prefix_samples/4; //to check + timing_advance_update = sync_pos; // - eNB->frame_parms.nb_prefix_samples/4; //to check // if (timing_advance_update > 10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);} // if (timing_advance_update < -10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);} diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 96ffc8a76154350ad4aa7001f5ac458e03d2e610..1fcd07c1d3f889d80827c4da6a0afb4ada035dad 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -113,9 +113,13 @@ void rx_sdu(const module_id_t enb_mod_idP, UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer = 0; UE_list->UE_sched_ctrl[UE_id].ul_failure_timer = 0; UE_list->UE_sched_ctrl[UE_id].ul_scheduled &= (~(1<<harq_pid)); - /* don't take into account TA if timer is running */ - if (UE_list->UE_sched_ctrl[UE_id].ta_timer == 0) - UE_list->UE_sched_ctrl[UE_id].ta_update = timing_advance; + /* Update with smoothing: 3/4 of old value and 1/4 of new. + * This is the logic that was done in the function + * lte_est_timing_advance_pusch, maybe it's not necessary? + * maybe it's even not correct at all? + */ + UE_list->UE_sched_ctrl[UE_id].ta_update = + (UE_list->UE_sched_ctrl[UE_id].ta_update * 3 + timing_advance)/4; UE_list->UE_sched_ctrl[UE_id].pusch_snr[CC_idP] = ul_cqi; UE_list->UE_sched_ctrl[UE_id].ul_consecutive_errors = 0; first_rb = UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid]; diff --git a/openair2/PHY_INTERFACE/IF_Module.c b/openair2/PHY_INTERFACE/IF_Module.c index b1014e8bde4305bbda989435bd456e0bec63daeb..ab6551f61c1cfc4801883a43d963e77ce819877d 100644 --- a/openair2/PHY_INTERFACE/IF_Module.c +++ b/openair2/PHY_INTERFACE/IF_Module.c @@ -156,6 +156,9 @@ void handle_ulsch(UL_IND_t *UL_info) { #define C do { size = 0; put(0); } while (0) #define A(...) do { char t[4096]; sprintf(t, __VA_ARGS__); append_string(t); } while (0) +#if 0 + +/* eats lots of ms at startup, disrupts realtime */ static char *s; static int size; static int maxsize; @@ -169,6 +172,22 @@ static void put(char x) s[size++] = x; } +#else + +/* eats nothing at startup, but fixed size */ +#define SMAX 65536 +static char s[SMAX]; +static int size; +static int maxsize = SMAX; + +static void put(char x) +{ + if (size == maxsize) { printf("incrase SMAX\n"); exit(1); } + s[size++] = x; +} + +#endif + static void append_string(char *t) { size--;