Commit 5ed848c7 authored by Laurent OpenCells's avatar Laurent OpenCells

more fixes on gcc warnings, misleading indentation and CPU mitigation when the...

more fixes on gcc warnings, misleading indentation and CPU mitigation when the traffic demand in 5G exeeds the available througput
parent 78da8436
...@@ -114,8 +114,7 @@ extern int numerology; ...@@ -114,8 +114,7 @@ extern int numerology;
extern void wait_gNBs(void); extern void wait_gNBs(void);
int attach_rru(RU_t *ru) int attach_rru(RU_t *ru) {
{
ssize_t msg_len,len; ssize_t msg_len,len;
RRU_CONFIG_msg_t rru_config_msg; RRU_CONFIG_msg_t rru_config_msg;
int received_capabilities=0; int received_capabilities=0;
...@@ -183,8 +182,7 @@ int attach_rru(RU_t *ru) ...@@ -183,8 +182,7 @@ int attach_rru(RU_t *ru)
return 0; return 0;
} }
int connect_rau(RU_t *ru) int connect_rau(RU_t *ru) {
{
RRU_CONFIG_msg_t rru_config_msg; RRU_CONFIG_msg_t rru_config_msg;
ssize_t msg_len; ssize_t msg_len;
int tick_received = 0; int tick_received = 0;
...@@ -281,22 +279,20 @@ int connect_rau(RU_t *ru) ...@@ -281,22 +279,20 @@ int connect_rau(RU_t *ru)
/* Southbound Fronthaul functions, RCC/RAU */ /* Southbound Fronthaul functions, RCC/RAU */
// southbound IF5 fronthaul for 16-bit OAI format // southbound IF5 fronthaul for 16-bit OAI format
void fh_if5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) void fh_if5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) {
{
if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff ); if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
send_IF5(ru, timestamp, slot, &ru->seqno, IF5_RRH_GW_DL); send_IF5(ru, timestamp, slot, &ru->seqno, IF5_RRH_GW_DL);
} }
// southbound IF4p5 fronthaul // southbound IF4p5 fronthaul
void fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) void fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) {
{
nfapi_nr_config_request_scf_t *cfg = &ru->config; nfapi_nr_config_request_scf_t *cfg = &ru->config;
if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff ); if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
LOG_D(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.tti_tx); LOG_D(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.tti_tx);
if ((nr_slot_select(cfg,ru->proc.frame_tx,ru->proc.tti_tx)&NR_DOWNLINK_SLOT) > 0) if ((nr_slot_select(cfg,ru->proc.frame_tx,ru->proc.tti_tx)&NR_DOWNLINK_SLOT) > 0)
send_IF4p5(ru,frame, slot, IF4p5_PDLFFT); send_IF4p5(ru,frame, slot, IF4p5_PDLFFT);
} }
...@@ -307,8 +303,7 @@ void fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp) ...@@ -307,8 +303,7 @@ void fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp)
// Synchronous if5 from south // Synchronous if5 from south
void fh_if5_south_in(RU_t *ru, void fh_if5_south_in(RU_t *ru,
int *frame, int *frame,
int *tti) int *tti) {
{
NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
RU_proc_t *proc = &ru->proc; RU_proc_t *proc = &ru->proc;
recv_IF5(ru, &proc->timestamp_rx, *tti, IF5_RRH_GW_UL); recv_IF5(ru, &proc->timestamp_rx, *tti, IF5_RRH_GW_UL);
...@@ -338,8 +333,7 @@ void fh_if5_south_in(RU_t *ru, ...@@ -338,8 +333,7 @@ void fh_if5_south_in(RU_t *ru,
// Synchronous if4p5 from south // Synchronous if4p5 from south
void fh_if4p5_south_in(RU_t *ru, void fh_if4p5_south_in(RU_t *ru,
int *frame, int *frame,
int *slot) int *slot) {
{
NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
RU_proc_t *proc = &ru->proc; RU_proc_t *proc = &ru->proc;
int f,sl; int f,sl;
...@@ -636,7 +630,6 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { ...@@ -636,7 +630,6 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
ru->nb_rx); ru->nb_rx);
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
proc->timestamp_rx = ts-ru->ts_offset; proc->timestamp_rx = ts-ru->ts_offset;
...@@ -649,6 +642,7 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { ...@@ -649,6 +642,7 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
proc->timestamp_rx = 0; proc->timestamp_rx = 0;
} else { } else {
samples_per_slot_prev = fp->get_samples_per_slot((*slot-1)%fp->slots_per_frame,fp); samples_per_slot_prev = fp->get_samples_per_slot((*slot-1)%fp->slots_per_frame,fp);
if (proc->timestamp_rx - old_ts != samples_per_slot_prev) { if (proc->timestamp_rx - old_ts != samples_per_slot_prev) {
LOG_D(PHY,"rx_rf: rfdevice timing drift of %"PRId64" samples (ts_off %"PRId64")\n",proc->timestamp_rx - old_ts - samples_per_slot_prev,ru->ts_offset); LOG_D(PHY,"rx_rf: rfdevice timing drift of %"PRId64" samples (ts_off %"PRId64")\n",proc->timestamp_rx - old_ts - samples_per_slot_prev,ru->ts_offset);
ru->ts_offset += (proc->timestamp_rx - old_ts - samples_per_slot_prev); ru->ts_offset += (proc->timestamp_rx - old_ts - samples_per_slot_prev);
...@@ -678,7 +672,8 @@ void rx_rf(RU_t *ru,int *frame,int *slot) { ...@@ -678,7 +672,8 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
} }
if (proc->frame_rx != *frame) { if (proc->frame_rx != *frame) {
LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d, proc->tti_rx %d, slot %d)\n",(long long unsigned int)proc->timestamp_rx,proc->frame_rx,*frame,proc->tti_rx,*slot); LOG_E(PHY,"Received Timestamp (%llu) doesn't correspond to the time we think it is (proc->frame_rx %d frame %d, proc->tti_rx %d, slot %d)\n",(long long unsigned int)proc->timestamp_rx,proc->frame_rx,
*frame,proc->tti_rx,*slot);
exit_fun("Exiting"); exit_fun("Exiting");
} }
} else { } else {
...@@ -706,7 +701,6 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { ...@@ -706,7 +701,6 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
int i,txsymb; int i,txsymb;
T(T_ENB_PHY_OUTPUT_SIGNAL, T_INT(0), T_INT(0), T_INT(frame), T_INT(slot), T(T_ENB_PHY_OUTPUT_SIGNAL, T_INT(0), T_INT(0), T_INT(frame), T_INT(slot),
T_INT(0), T_BUFFER(&ru->common.txdata[0][fp->get_samples_slot_timestamp(slot,fp,0)], fp->samples_per_subframe * 4)); T_INT(0), T_BUFFER(&ru->common.txdata[0][fp->get_samples_slot_timestamp(slot,fp,0)], fp->samples_per_subframe * 4));
int slot_type = nr_slot_select(cfg,frame,slot%fp->slots_per_frame); int slot_type = nr_slot_select(cfg,frame,slot%fp->slots_per_frame);
int prevslot_type = nr_slot_select(cfg,frame,(slot+(fp->slots_per_frame-1))%fp->slots_per_frame); int prevslot_type = nr_slot_select(cfg,frame,(slot+(fp->slots_per_frame-1))%fp->slots_per_frame);
int nextslot_type = nr_slot_select(cfg,frame,(slot+1)%fp->slots_per_frame); int nextslot_type = nr_slot_select(cfg,frame,(slot+1)%fp->slots_per_frame);
...@@ -716,20 +710,23 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { ...@@ -716,20 +710,23 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
//nr_subframe_t SF_type = nr_slot_select(cfg,slot%fp->slots_per_frame); //nr_subframe_t SF_type = nr_slot_select(cfg,slot%fp->slots_per_frame);
if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT || IS_SOFTMODEM_RFSIM) { if (slot_type == NR_DOWNLINK_SLOT || slot_type == NR_MIXED_SLOT || IS_SOFTMODEM_RFSIM) {
if (cfg->cell_config.frame_duplex_type.value == TDD) {
if (cfg->cell_config.frame_duplex_type.value == TDD){
if(slot_type == NR_MIXED_SLOT) { if(slot_type == NR_MIXED_SLOT) {
txsymb = 0; txsymb = 0;
for(int symbol_count = 0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) { for(int symbol_count = 0; symbol_count<NR_NUMBER_OF_SYMBOLS_PER_SLOT; symbol_count++) {
if (cfg->tdd_table.max_tdd_periodicity_list[slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value == 0) if (cfg->tdd_table.max_tdd_periodicity_list[slot].max_num_of_symbol_per_slot_list[symbol_count].slot_config.value == 0)
txsymb++; txsymb++;
} }
AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb); AssertFatal(txsymb>0,"illegal txsymb %d\n",txsymb);
if(slot%(fp->slots_per_subframe/2)) if(slot%(fp->slots_per_subframe/2))
siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples); siglen = txsymb * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
else else
siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples); siglen = (fp->ofdm_symbol_size + fp->nb_prefix_samples0) + (txsymb - 1) * (fp->ofdm_symbol_size + fp->nb_prefix_samples);
//+ ru->end_of_burst_delay;
//+ ru->end_of_burst_delay;
flags = 3; // end of burst flags = 3; // end of burst
} }
...@@ -745,11 +742,13 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { ...@@ -745,11 +742,13 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
// bit 11 enables the gpio programming // bit 11 enables the gpio programming
// currently we switch beams every 10 slots (should = 1 TDD period in FR2) and we take the beam index of the first symbol of the first slot of this period // currently we switch beams every 10 slots (should = 1 TDD period in FR2) and we take the beam index of the first symbol of the first slot of this period
int beam=0; int beam=0;
if (slot%10==0) { if (slot%10==0) {
if (ru->common.beam_id[0][slot*fp->symbols_per_slot] < 8) { if (ru->common.beam_id[0][slot*fp->symbols_per_slot] < 8) {
beam = ru->common.beam_id[0][slot*fp->symbols_per_slot] | 8; beam = ru->common.beam_id[0][slot*fp->symbols_per_slot] | 8;
} }
} }
/* /*
if (slot==0 || slot==40) beam=0|8; if (slot==0 || slot==40) beam=0|8;
if (slot==10 || slot==50) beam=1|8; if (slot==10 || slot==50) beam=1|8;
...@@ -757,30 +756,29 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { ...@@ -757,30 +756,29 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
if (slot==30 || slot==70) beam=3|8; if (slot==30 || slot==70) beam=3|8;
*/ */
flags |= beam<<8; flags |= beam<<8;
LOG_D(HW,"slot %d, beam %d\n",slot,ru->common.beam_id[0][slot*fp->symbols_per_slot]); LOG_D(HW,"slot %d, beam %d\n",slot,ru->common.beam_id[0][slot*fp->symbols_per_slot]);
} }
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS, flags ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS, flags );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, frame ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, frame );
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TTI_NUMBER_TX0_RU, slot ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TTI_NUMBER_TX0_RU, slot );
for (i=0; i<ru->nb_tx; i++) for (i=0; i<ru->nb_tx; i++)
txp[i] = (void *)&ru->common.txdata[i][fp->get_samples_slot_timestamp(slot,fp,0)-sf_extension]; txp[i] = (void *)&ru->common.txdata[i][fp->get_samples_slot_timestamp(slot,fp,0)-sf_extension];
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp-ru->openair0_cfg.tx_sample_advance)&0xffffffff ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp-ru->openair0_cfg.tx_sample_advance)&0xffffffff );
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
// prepare tx buffer pointers // prepare tx buffer pointers
txs = ru->rfdevice.trx_write_func(&ru->rfdevice, txs = ru->rfdevice.trx_write_func(&ru->rfdevice,
timestamp+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension, timestamp+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension,
txp, txp,
siglen+sf_extension, siglen+sf_extension,
ru->nb_tx, ru->nb_tx,
flags); flags);
LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, slot %di, returned %d\n",ru->idx, LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, slot %di, returned %d\n",ru->idx,
(long long unsigned int)timestamp,frame,proc->frame_tx_unwrap,slot, txs); (long long unsigned int)timestamp,frame,proc->frame_tx_unwrap,slot, txs);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
//AssertFatal(txs == 0,"trx write function error %d\n", txs); //AssertFatal(txs == 0,"trx write function error %d\n", txs);
} }
} }
...@@ -795,179 +793,194 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { ...@@ -795,179 +793,194 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
if (mu == NR_MU_0) { if (mu == NR_MU_0) {
switch(N_RB) { switch(N_RB) {
case 270: case 270:
if (fp->threequarter_fs) { if (fp->threequarter_fs) {
cfg->sample_rate=92.16e6; cfg->sample_rate=92.16e6;
cfg->samples_per_frame = 921600; cfg->samples_per_frame = 921600;
cfg->tx_bw = 50e6; cfg->tx_bw = 50e6;
cfg->rx_bw = 50e6; cfg->rx_bw = 50e6;
} else { } else {
cfg->sample_rate=61.44e6; cfg->sample_rate=61.44e6;
cfg->samples_per_frame = 614400; cfg->samples_per_frame = 614400;
cfg->tx_bw = 50e6; cfg->tx_bw = 50e6;
cfg->rx_bw = 50e6; cfg->rx_bw = 50e6;
} }
case 216:
if (fp->threequarter_fs) { case 216:
cfg->sample_rate=46.08e6; if (fp->threequarter_fs) {
cfg->samples_per_frame = 460800; cfg->sample_rate=46.08e6;
cfg->tx_bw = 40e6; cfg->samples_per_frame = 460800;
cfg->rx_bw = 40e6; cfg->tx_bw = 40e6;
} cfg->rx_bw = 40e6;
else { } else {
cfg->sample_rate=61.44e6; cfg->sample_rate=61.44e6;
cfg->samples_per_frame = 614400; cfg->samples_per_frame = 614400;
cfg->tx_bw = 40e6; cfg->tx_bw = 40e6;
cfg->rx_bw = 40e6; cfg->rx_bw = 40e6;
} }
break;
case 106: break;
if (fp->threequarter_fs) {
cfg->sample_rate=23.04e6; case 106:
cfg->samples_per_frame = 230400; if (fp->threequarter_fs) {
cfg->tx_bw = 20e6; cfg->sample_rate=23.04e6;
cfg->rx_bw = 20e6; cfg->samples_per_frame = 230400;
} cfg->tx_bw = 20e6;
else { cfg->rx_bw = 20e6;
cfg->sample_rate=30.72e6; } else {
cfg->samples_per_frame = 307200; cfg->sample_rate=30.72e6;
cfg->tx_bw = 20e6; cfg->samples_per_frame = 307200;
cfg->rx_bw = 20e6; cfg->tx_bw = 20e6;
} cfg->rx_bw = 20e6;
break; }
case 52:
if (fp->threequarter_fs) { break;
cfg->sample_rate=11.52e6;
cfg->samples_per_frame = 115200; case 52:
cfg->tx_bw = 10e6; if (fp->threequarter_fs) {
cfg->rx_bw = 10e6; cfg->sample_rate=11.52e6;
} cfg->samples_per_frame = 115200;
else { cfg->tx_bw = 10e6;
cfg->sample_rate=15.36e6; cfg->rx_bw = 10e6;
cfg->samples_per_frame = 153600; } else {
cfg->tx_bw = 10e6; cfg->sample_rate=15.36e6;
cfg->rx_bw = 10e6; cfg->samples_per_frame = 153600;
} cfg->tx_bw = 10e6;
case 25: cfg->rx_bw = 10e6;
if (fp->threequarter_fs) { }
cfg->sample_rate=5.76e6;
cfg->samples_per_frame = 57600; case 25:
cfg->tx_bw = 5e6; if (fp->threequarter_fs) {
cfg->rx_bw = 5e6; cfg->sample_rate=5.76e6;
} cfg->samples_per_frame = 57600;
else { cfg->tx_bw = 5e6;
cfg->sample_rate=7.68e6; cfg->rx_bw = 5e6;
cfg->samples_per_frame = 76800; } else {
cfg->tx_bw = 5e6; cfg->sample_rate=7.68e6;
cfg->rx_bw = 5e6; cfg->samples_per_frame = 76800;
} cfg->tx_bw = 5e6;
break; cfg->rx_bw = 5e6;
default: }
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
break;
default:
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
} }
} else if (mu == NR_MU_1) { } else if (mu == NR_MU_1) {
switch(N_RB) { switch(N_RB) {
case 273: case 273:
if (fp->threequarter_fs) { if (fp->threequarter_fs) {
cfg->sample_rate=184.32e6; cfg->sample_rate=184.32e6;
cfg->samples_per_frame = 1843200; cfg->samples_per_frame = 1843200;
cfg->tx_bw = 100e6; cfg->tx_bw = 100e6;
cfg->rx_bw = 100e6; cfg->rx_bw = 100e6;
} else { } else {
cfg->sample_rate=122.88e6; cfg->sample_rate=122.88e6;
cfg->samples_per_frame = 1228800; cfg->samples_per_frame = 1228800;
cfg->tx_bw = 100e6; cfg->tx_bw = 100e6;
cfg->rx_bw = 100e6; cfg->rx_bw = 100e6;
} }
break;
case 217: break;
if (fp->threequarter_fs) {
cfg->sample_rate=92.16e6; case 217:
cfg->samples_per_frame = 921600; if (fp->threequarter_fs) {
cfg->tx_bw = 80e6; cfg->sample_rate=92.16e6;
cfg->rx_bw = 80e6; cfg->samples_per_frame = 921600;
} else { cfg->tx_bw = 80e6;
cfg->sample_rate=122.88e6; cfg->rx_bw = 80e6;
cfg->samples_per_frame = 1228800; } else {
cfg->tx_bw = 80e6; cfg->sample_rate=122.88e6;
cfg->rx_bw = 80e6; cfg->samples_per_frame = 1228800;
} cfg->tx_bw = 80e6;
break; cfg->rx_bw = 80e6;
case 106: }
if (fp->threequarter_fs) {
cfg->sample_rate=46.08e6; break;
cfg->samples_per_frame = 460800;
cfg->tx_bw = 40e6; case 106:
cfg->rx_bw = 40e6; if (fp->threequarter_fs) {
} cfg->sample_rate=46.08e6;
else { cfg->samples_per_frame = 460800;
cfg->sample_rate=61.44e6; cfg->tx_bw = 40e6;
cfg->samples_per_frame = 614400; cfg->rx_bw = 40e6;
cfg->tx_bw = 40e6; } else {
cfg->rx_bw = 40e6; cfg->sample_rate=61.44e6;
} cfg->samples_per_frame = 614400;
break; cfg->tx_bw = 40e6;
case 51: cfg->rx_bw = 40e6;
if (fp->threequarter_fs) { }
cfg->sample_rate=23.04e6;
cfg->samples_per_frame = 230400; break;
cfg->tx_bw = 20e6;
cfg->rx_bw = 20e6; case 51:
} if (fp->threequarter_fs) {
else { cfg->sample_rate=23.04e6;
cfg->sample_rate=30.72e6; cfg->samples_per_frame = 230400;
cfg->samples_per_frame = 307200; cfg->tx_bw = 20e6;
cfg->tx_bw = 20e6; cfg->rx_bw = 20e6;
cfg->rx_bw = 20e6; } else {
} cfg->sample_rate=30.72e6;
break; cfg->samples_per_frame = 307200;
case 24: cfg->tx_bw = 20e6;
if (fp->threequarter_fs) { cfg->rx_bw = 20e6;
cfg->sample_rate=11.52e6; }
cfg->samples_per_frame = 115200;
cfg->tx_bw = 10e6; break;
cfg->rx_bw = 10e6;
} case 24:
else { if (fp->threequarter_fs) {
cfg->sample_rate=15.36e6; cfg->sample_rate=11.52e6;
cfg->samples_per_frame = 153600; cfg->samples_per_frame = 115200;
cfg->tx_bw = 10e6; cfg->tx_bw = 10e6;
cfg->rx_bw = 10e6; cfg->rx_bw = 10e6;
} } else {
break; cfg->sample_rate=15.36e6;
default: cfg->samples_per_frame = 153600;
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu); cfg->tx_bw = 10e6;
cfg->rx_bw = 10e6;
}
break;
default:
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
} }
} else if (mu == NR_MU_3) { } else if (mu == NR_MU_3) {
switch(N_RB) { switch(N_RB) {
case 66: case 66:
if (fp->threequarter_fs) { if (fp->threequarter_fs) {
cfg->sample_rate=184.32e6; cfg->sample_rate=184.32e6;
cfg->samples_per_frame = 1843200; cfg->samples_per_frame = 1843200;
cfg->tx_bw = 100e6; cfg->tx_bw = 100e6;
cfg->rx_bw = 100e6; cfg->rx_bw = 100e6;
} else { } else {
cfg->sample_rate = 122.88e6; cfg->sample_rate = 122.88e6;
cfg->samples_per_frame = 1228800; cfg->samples_per_frame = 1228800;
cfg->tx_bw = 100e6; cfg->tx_bw = 100e6;
cfg->rx_bw = 100e6; cfg->rx_bw = 100e6;
} }
break;
case 32: break;
if (fp->threequarter_fs) {
cfg->sample_rate=92.16e6; case 32:
cfg->samples_per_frame = 921600; if (fp->threequarter_fs) {
cfg->tx_bw = 50e6; cfg->sample_rate=92.16e6;
cfg->rx_bw = 50e6; cfg->samples_per_frame = 921600;
} else { cfg->tx_bw = 50e6;
cfg->sample_rate=61.44e6; cfg->rx_bw = 50e6;
cfg->samples_per_frame = 614400; } else {
cfg->tx_bw = 50e6; cfg->sample_rate=61.44e6;
cfg->rx_bw = 50e6; cfg->samples_per_frame = 614400;
} cfg->tx_bw = 50e6;
break; cfg->rx_bw = 50e6;
default: }
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
break;
default:
AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
} }
} else { } else {
AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu); AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu);
...@@ -987,7 +1000,7 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { ...@@ -987,7 +1000,7 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
if (ru->if_frequency == 0) { if (ru->if_frequency == 0) {
cfg->tx_freq[i] = (double)fp->dl_CarrierFreq; cfg->tx_freq[i] = (double)fp->dl_CarrierFreq;
cfg->rx_freq[i] = (double)fp->ul_CarrierFreq; cfg->rx_freq[i] = (double)fp->ul_CarrierFreq;
} else if (ru->if_freq_offset){ } else if (ru->if_freq_offset) {
cfg->tx_freq[i] = (double)(ru->if_frequency); cfg->tx_freq[i] = (double)(ru->if_frequency);
cfg->rx_freq[i] = (double)(ru->if_frequency + ru->if_freq_offset); cfg->rx_freq[i] = (double)(ru->if_frequency + ru->if_freq_offset);
LOG_I(PHY, "Setting IF TX frequency to %lu Hz with IF RX frequency offset %d Hz\n", ru->if_frequency, ru->if_freq_offset); LOG_I(PHY, "Setting IF TX frequency to %lu Hz with IF RX frequency offset %d Hz\n", ru->if_frequency, ru->if_freq_offset);
...@@ -995,14 +1008,15 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) { ...@@ -995,14 +1008,15 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
cfg->tx_freq[i] = (double)ru->if_frequency; cfg->tx_freq[i] = (double)ru->if_frequency;
cfg->rx_freq[i] = (double)(ru->if_frequency+fp->ul_CarrierFreq-fp->dl_CarrierFreq); cfg->rx_freq[i] = (double)(ru->if_frequency+fp->ul_CarrierFreq-fp->dl_CarrierFreq);
} }
cfg->tx_gain[i] = ru->att_tx; cfg->tx_gain[i] = ru->att_tx;
cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx; cfg->rx_gain[i] = ru->max_rxgain-ru->att_rx;
cfg->configFilename = rf_config_file; cfg->configFilename = rf_config_file;
LOG_I(PHY, "Channel %d: setting tx_gain offset %f, rx_gain offset %f, tx_freq %lu Hz, rx_freq %lu Hz\n", LOG_I(PHY, "Channel %d: setting tx_gain offset %f, rx_gain offset %f, tx_freq %lu Hz, rx_freq %lu Hz\n",
i, cfg->tx_gain[i], i, cfg->tx_gain[i],
cfg->rx_gain[i], cfg->rx_gain[i],
(unsigned long)cfg->tx_freq[i], (unsigned long)cfg->tx_freq[i],
(unsigned long)cfg->rx_freq[i]); (unsigned long)cfg->rx_freq[i]);
} }
} }
...@@ -1030,40 +1044,42 @@ int setup_RU_buffers(RU_t *ru) { ...@@ -1030,40 +1044,42 @@ int setup_RU_buffers(RU_t *ru) {
if (config->cell_config.frame_duplex_type.value == TDD) { if (config->cell_config.frame_duplex_type.value == TDD) {
int N_TA_offset = config->carrier_config.uplink_frequency.value < 6000000 ? 400 : 431; // reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2 int N_TA_offset = config->carrier_config.uplink_frequency.value < 6000000 ? 400 : 431; // reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2
double factor=1; double factor=1;
switch (mu) { switch (mu) {
case 0: //15 kHz scs case 0: //15 kHz scs
AssertFatal(N_TA_offset == 400, "scs_common 15kHz only for FR1\n"); AssertFatal(N_TA_offset == 400, "scs_common 15kHz only for FR1\n");
factor = fp->samples_per_subframe / 30720.0; factor = fp->samples_per_subframe / 30720.0;
break; break;
case 1: //30 kHz sc case 1: //30 kHz sc
AssertFatal(N_TA_offset == 400, "scs_common 30kHz only for FR1\n"); AssertFatal(N_TA_offset == 400, "scs_common 30kHz only for FR1\n");
factor = fp->samples_per_subframe / 30720.0; factor = fp->samples_per_subframe / 30720.0;
break; break;
case 2: //60 kHz scs case 2: //60 kHz scs
AssertFatal(1==0, "scs_common should not be 60 kHz\n"); AssertFatal(1==0, "scs_common should not be 60 kHz\n");
break; break;
case 3: //120 kHz scs case 3: //120 kHz scs
AssertFatal(N_TA_offset == 431, "scs_common 120kHz only for FR2\n"); AssertFatal(N_TA_offset == 431, "scs_common 120kHz only for FR2\n");
factor = fp->samples_per_subframe / 61440.0; factor = fp->samples_per_subframe / 61440.0;
break; break;
case 4: //240 kHz scs case 4: //240 kHz scs
AssertFatal(N_TA_offset == 431, "scs_common 240kHz only for FR2\n"); AssertFatal(N_TA_offset == 431, "scs_common 240kHz only for FR2\n");
factor = fp->samples_per_subframe / 61440.0; factor = fp->samples_per_subframe / 61440.0;
break; break;
default: default:
AssertFatal(1==0, "Invalid scs_common!\n"); AssertFatal(1==0, "Invalid scs_common!\n");
} }
ru->N_TA_offset = (int)(N_TA_offset * factor); ru->N_TA_offset = (int)(N_TA_offset * factor);
LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d, mu %d)\n",ru->idx,ru->N_TA_offset,factor, LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d, mu %d)\n",ru->idx,ru->N_TA_offset,factor,
config->carrier_config.uplink_frequency.value, N_RB, mu); config->carrier_config.uplink_frequency.value, N_RB, mu);
} } else ru->N_TA_offset = 0;
else ru->N_TA_offset = 0;
if (ru->openair0_cfg.mmapped_dma == 1) { if (ru->openair0_cfg.mmapped_dma == 1) {
// replace RX signal buffers with mmaped HW versions // replace RX signal buffers with mmaped HW versions
for (i=0; i<ru->nb_rx; i++) { for (i=0; i<ru->nb_rx; i++) {
...@@ -1108,7 +1124,6 @@ void *ru_stats_thread(void *param) { ...@@ -1108,7 +1124,6 @@ void *ru_stats_thread(void *param) {
sleep(1); sleep(1);
if (opp_enabled == 1) { if (opp_enabled == 1) {
if (ru->feprx) print_meas(&ru->ofdm_demod_stats,"feprx",NULL,NULL); if (ru->feprx) print_meas(&ru->ofdm_demod_stats,"feprx",NULL,NULL);
if (ru->feptx_ofdm) { if (ru->feptx_ofdm) {
...@@ -1121,6 +1136,7 @@ void *ru_stats_thread(void *param) { ...@@ -1121,6 +1136,7 @@ void *ru_stats_thread(void *param) {
if (ru->fh_north_asynch_in) print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL); if (ru->fh_north_asynch_in) print_meas(&ru->rx_fhaul,"rx_fhaul",NULL,NULL);
print_meas(&ru->tx_fhaul,"tx_fhaul",NULL,NULL); print_meas(&ru->tx_fhaul,"tx_fhaul",NULL,NULL);
if (ru->fh_north_out) { if (ru->fh_north_out) {
print_meas(&ru->compression,"compression",NULL,NULL); print_meas(&ru->compression,"compression",NULL,NULL);
print_meas(&ru->transport,"transport",NULL,NULL); print_meas(&ru->transport,"transport",NULL,NULL);
...@@ -1132,7 +1148,6 @@ void *ru_stats_thread(void *param) { ...@@ -1132,7 +1148,6 @@ void *ru_stats_thread(void *param) {
} }
void ru_tx_func(void *param) { void ru_tx_func(void *param) {
processingData_RU_t *info = (processingData_RU_t *) param; processingData_RU_t *info = (processingData_RU_t *) param;
RU_t *ru = info->ru; RU_t *ru = info->ru;
NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms; NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
...@@ -1155,14 +1170,11 @@ void ru_tx_func(void *param) { ...@@ -1155,14 +1170,11 @@ void ru_tx_func(void *param) {
} else { } else {
if(frame_tx == print_frame) { if(frame_tx == print_frame) {
for (int i=0; i<ru->nb_tx; i++) { for (int i=0; i<ru->nb_tx; i++) {
if(slot_tx == 0) { if(slot_tx == 0) {
sprintf(filename,"gNBdataF_frame%d_sl%d.m", print_frame, slot_tx); sprintf(filename,"gNBdataF_frame%d_sl%d.m", print_frame, slot_tx);
LOG_M(filename,"txdataF_frame",&ru->gNB_list[0]->common_vars.txdataF[i][0],fp->samples_per_frame_wCP, 1, 1); LOG_M(filename,"txdataF_frame",&ru->gNB_list[0]->common_vars.txdataF[i][0],fp->samples_per_frame_wCP, 1, 1);
sprintf(filename,"tx%ddataF_frame%d_sl%d.m", i, print_frame, slot_tx); sprintf(filename,"tx%ddataF_frame%d_sl%d.m", i, print_frame, slot_tx);
LOG_M(filename,"txdataF_frame",&ru->common.txdataF[i][0],fp->samples_per_frame_wCP, 1, 1); LOG_M(filename,"txdataF_frame",&ru->common.txdataF[i][0],fp->samples_per_frame_wCP, 1, 1);
sprintf(filename,"tx%ddataF_BF_frame%d_sl%d.m", i, print_frame, slot_tx); sprintf(filename,"tx%ddataF_BF_frame%d_sl%d.m", i, print_frame, slot_tx);
LOG_M(filename,"txdataF_BF_frame",&ru->common.txdataF_BF[i][0],fp->samples_per_subframe_wCP, 1, 1); LOG_M(filename,"txdataF_BF_frame",&ru->common.txdataF_BF[i][0],fp->samples_per_subframe_wCP, 1, 1);
} }
...@@ -1199,18 +1211,13 @@ void *ru_thread( void *param ) { ...@@ -1199,18 +1211,13 @@ void *ru_thread( void *param ) {
int frame = 1023; int frame = 1023;
char threadname[40]; char threadname[40];
int aa; int aa;
nfapi_nr_config_request_scf_t *cfg = &ru->config; nfapi_nr_config_request_scf_t *cfg = &ru->config;
// set default return value // set default return value
ru_thread_status = 0; ru_thread_status = 0;
// set default return value // set default return value
sprintf(threadname,"ru_thread %u",ru->idx); sprintf(threadname,"ru_thread %u",ru->idx);
LOG_I(PHY,"Starting RU %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]); LOG_I(PHY,"Starting RU %d (%s,%s),\n",ru->idx,NB_functions[ru->function],NB_timing[ru->if_timing]);
memcpy((void *)&ru->config,(void *)&RC.gNB[0]->gNB_config,sizeof(ru->config));
memcpy((void*)&ru->config,(void*)&RC.gNB[0]->gNB_config,sizeof(ru->config));
if(emulate_rf) { if(emulate_rf) {
fill_rf_config(ru,ru->rf_config_file); fill_rf_config(ru,ru->rf_config_file);
...@@ -1256,12 +1263,11 @@ void *ru_thread( void *param ) { ...@@ -1256,12 +1263,11 @@ void *ru_thread( void *param ) {
pthread_cond_signal(&RC.ru_cond); pthread_cond_signal(&RC.ru_cond);
pthread_mutex_unlock(&RC.ru_mutex); pthread_mutex_unlock(&RC.ru_mutex);
wait_sync("ru_thread"); wait_sync("ru_thread");
notifiedFIFO_elt_t *msg = newNotifiedFIFO_elt(sizeof(processingData_L1_t),0,gNB->resp_L1,rx_func); notifiedFIFO_elt_t *msg = newNotifiedFIFO_elt(sizeof(processingData_L1_t),0,gNB->resp_L1,rx_func);
notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1_t),0,gNB->resp_L1_tx,tx_func); notifiedFIFO_elt_t *msgL1Tx = newNotifiedFIFO_elt(sizeof(processingData_L1_t),0,gNB->resp_L1_tx,tx_func);
notifiedFIFO_elt_t *msgRUTx = newNotifiedFIFO_elt(sizeof(processingData_L1_t),0,gNB->resp_RU_tx,ru_tx_func); notifiedFIFO_elt_t *msgRUTx = newNotifiedFIFO_elt(sizeof(processingData_L1_t),0,gNB->resp_RU_tx,ru_tx_func);
processingData_L1_t *syncMsg; processingData_L1_t *syncMsg;
notifiedFIFO_elt_t *res; notifiedFIFO_elt_t *res;
pushNotifiedFIFO(gNB->resp_L1,msg); // to unblock the process in the beginning pushNotifiedFIFO(gNB->resp_L1,msg); // to unblock the process in the beginning
pushNotifiedFIFO(gNB->resp_L1_tx,msgL1Tx); // to unblock the process in the beginning pushNotifiedFIFO(gNB->resp_L1_tx,msgL1Tx); // to unblock the process in the beginning
pushNotifiedFIFO(gNB->resp_RU_tx,msgRUTx); // to unblock the process in the beginning pushNotifiedFIFO(gNB->resp_RU_tx,msgRUTx); // to unblock the process in the beginning
...@@ -1275,12 +1281,11 @@ void *ru_thread( void *param ) { ...@@ -1275,12 +1281,11 @@ void *ru_thread( void *param ) {
} else LOG_I(PHY,"RU %d no rf device\n",ru->idx); } else LOG_I(PHY,"RU %d no rf device\n",ru->idx);
// start trx write thread // start trx write thread
if(usrp_tx_thread == 1){ if(usrp_tx_thread == 1) {
if (ru->start_write_thread){ if (ru->start_write_thread) {
if(ru->start_write_thread(ru) != 0){ if(ru->start_write_thread(ru) != 0) {
LOG_E(HW,"Could not start tx write thread\n"); LOG_E(HW,"Could not start tx write thread\n");
} } else {
else{
LOG_I(PHY,"tx write thread ready\n"); LOG_I(PHY,"tx write thread ready\n");
} }
} }
...@@ -1301,76 +1306,75 @@ void *ru_thread( void *param ) { ...@@ -1301,76 +1306,75 @@ void *ru_thread( void *param ) {
// synchronization on input FH interface, acquire signals/data and block // synchronization on input FH interface, acquire signals/data and block
LOG_D(PHY,"[RU_thread] read data: frame_rx = %d, tti_rx = %d\n", frame, slot); LOG_D(PHY,"[RU_thread] read data: frame_rx = %d, tti_rx = %d\n", frame, slot);
if (ru->fh_south_in) ru->fh_south_in(ru,&frame,&slot); if (ru->fh_south_in) ru->fh_south_in(ru,&frame,&slot);
else AssertFatal(1==0, "No fronthaul interface at south port"); else AssertFatal(1==0, "No fronthaul interface at south port");
proc->timestamp_tx = proc->timestamp_rx + (sf_ahead*fp->samples_per_subframe); proc->timestamp_tx = proc->timestamp_rx + (sf_ahead*fp->samples_per_subframe);
proc->frame_tx = (proc->tti_rx > (fp->slots_per_frame-1-(fp->slots_per_subframe*sf_ahead))) ? (proc->frame_rx+1)&1023 : proc->frame_rx; proc->frame_tx = (proc->tti_rx > (fp->slots_per_frame-1-(fp->slots_per_subframe*sf_ahead))) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
proc->tti_tx = (proc->tti_rx + (fp->slots_per_subframe*sf_ahead))%fp->slots_per_frame; proc->tti_tx = (proc->tti_rx + (fp->slots_per_subframe*sf_ahead))%fp->slots_per_frame;
LOG_D(PHY,"AFTER fh_south_in - SFN/SL:%d%d RU->proc[RX:%d.%d TX:%d.%d] RC.gNB[0]:[RX:%d%d TX(SFN):%d]\n", LOG_D(PHY,"AFTER fh_south_in - SFN/SL:%d%d RU->proc[RX:%d.%d TX:%d.%d] RC.gNB[0]:[RX:%d%d TX(SFN):%d]\n",
frame,slot, frame,slot,
proc->frame_rx,proc->tti_rx, proc->frame_rx,proc->tti_rx,
proc->frame_tx,proc->tti_tx, proc->frame_tx,proc->tti_tx,
RC.gNB[0]->proc.frame_rx,RC.gNB[0]->proc.slot_rx, RC.gNB[0]->proc.frame_rx,RC.gNB[0]->proc.slot_rx,
RC.gNB[0]->proc.frame_tx); RC.gNB[0]->proc.frame_tx);
if (ru->idx!=0) proc->frame_tx = (proc->frame_tx+proc->frame_offset)&1023; if (ru->idx!=0) proc->frame_tx = (proc->frame_tx+proc->frame_offset)&1023;
// do RX front-end processing (frequency-shift, dft) if needed // do RX front-end processing (frequency-shift, dft) if needed
int slot_type = nr_slot_select(cfg,proc->frame_rx,proc->tti_rx); int slot_type = nr_slot_select(cfg,proc->frame_rx,proc->tti_rx);
if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
if (slot_type == NR_UPLINK_SLOT || slot_type == NR_MIXED_SLOT) {
if (ru->feprx) { if (ru->feprx) {
ru->feprx(ru,proc->tti_rx); ru->feprx(ru,proc->tti_rx);
//LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1); //LOG_M("rxdata.m","rxs",ru->common.rxdata[0],1228800,1,1);
LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx);
LOG_D(PHY,"RU proc: frame_rx = %d, tti_rx = %d\n", proc->frame_rx, proc->tti_rx); LOG_D(PHY,"Copying rxdataF from RU to gNB\n");
LOG_D(PHY,"Copying rxdataF from RU to gNB\n");
for (aa=0; aa<ru->nb_rx; aa++)
for (aa=0;aa<ru->nb_rx;aa++) memcpy((void *)RC.gNB[0]->common_vars.rxdataF[aa],
memcpy((void*)RC.gNB[0]->common_vars.rxdataF[aa], (void *)ru->common.rxdataF[aa], fp->symbols_per_slot*fp->ofdm_symbol_size*sizeof(int32_t));
(void*)ru->common.rxdataF[aa], fp->symbols_per_slot*fp->ofdm_symbol_size*sizeof(int32_t));
if (IS_SOFTMODEM_DOSCOPE && RC.gNB[0]->scopeData) if (IS_SOFTMODEM_DOSCOPE && RC.gNB[0]->scopeData)
((scopeData_t*)RC.gNB[0]->scopeData)->slotFunc(ru->common.rxdataF[0],proc->tti_rx, RC.gNB[0]->scopeData); ((scopeData_t *)RC.gNB[0]->scopeData)->slotFunc(ru->common.rxdataF[0],proc->tti_rx, RC.gNB[0]->scopeData);
// Do PRACH RU processing
// Do PRACH RU processing
int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST); int prach_id=find_nr_prach_ru(ru,proc->frame_rx,proc->tti_rx,SEARCH_EXIST);
uint8_t prachStartSymbol,N_dur; uint8_t prachStartSymbol,N_dur;
if (prach_id>=0) {
if (prach_id>=0) {
T(T_GNB_PHY_PRACH_INPUT_SIGNAL, T_INT(proc->frame_rx), T_INT(proc->tti_rx), T_INT(0), T(T_GNB_PHY_PRACH_INPUT_SIGNAL, T_INT(proc->frame_rx), T_INT(proc->tti_rx), T_INT(0),
T_BUFFER(&ru->common.rxdata[0][fp->get_samples_slot_timestamp(proc->tti_rx-1,fp,0)]/*-ru->N_TA_offset*/, fp->get_samples_per_slot(proc->tti_rx,fp)*4*2)); T_BUFFER(&ru->common.rxdata[0][fp->get_samples_slot_timestamp(proc->tti_rx-1,fp,0)]/*-ru->N_TA_offset*/, fp->get_samples_per_slot(proc->tti_rx,fp)*4*2));
N_dur = get_nr_prach_duration(ru->prach_list[prach_id].fmt);
N_dur = get_nr_prach_duration(ru->prach_list[prach_id].fmt);
/* /*
get_nr_prach_info_from_index(ru->config.prach_config.prach_ConfigurationIndex.value, get_nr_prach_info_from_index(ru->config.prach_config.prach_ConfigurationIndex.value,
proc->frame_rx,proc->tti_rx, proc->frame_rx,proc->tti_rx,
ru->config.carrier_config.dl_frequency.value, ru->config.carrier_config.dl_frequency.value,
fp->numerology_index, fp->numerology_index,
fp->frame_type, fp->frame_type,
&format, &format,
&start_symbol, &start_symbol,
&N_t_slot, &N_t_slot,
&N_dur, &N_dur,
&RA_sfn_index, &RA_sfn_index,
&N_RA_slot, &N_RA_slot,
&config_period); &config_period);
*/ */
for (int prach_oc = 0; prach_oc<ru->prach_list[prach_id].num_prach_ocas; prach_oc++) { for (int prach_oc = 0; prach_oc<ru->prach_list[prach_id].num_prach_ocas; prach_oc++) {
prachStartSymbol = ru->prach_list[prach_id].prachStartSymbol+prach_oc*N_dur; prachStartSymbol = ru->prach_list[prach_id].prachStartSymbol+prach_oc*N_dur;
//comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}. //comment FK: the standard 38.211 section 5.3.2 has one extra term +14*N_RA_slot. This is because there prachStartSymbol is given wrt to start of the 15kHz slot or 60kHz slot. Here we work slot based, so this function is anyway only called in slots where there is PRACH. Its up to the MAC to schedule another PRACH PDU in the case there are there N_RA_slot \in {0,1}.
rx_nr_prach_ru(ru,
rx_nr_prach_ru(ru, ru->prach_list[prach_id].fmt, //could also use format
ru->prach_list[prach_id].fmt, //could also use format ru->prach_list[prach_id].numRA,
ru->prach_list[prach_id].numRA, prachStartSymbol,
prachStartSymbol, prach_oc,
prach_oc, proc->frame_rx,proc->tti_rx);
proc->frame_rx,proc->tti_rx); }
}
free_nr_ru_prach_entry(ru,prach_id); free_nr_ru_prach_entry(ru,prach_id);
} }
} }
} }
...@@ -1385,7 +1389,6 @@ void *ru_thread( void *param ) { ...@@ -1385,7 +1389,6 @@ void *ru_thread( void *param ) {
syncMsg->timestamp_tx = proc->timestamp_tx; syncMsg->timestamp_tx = proc->timestamp_tx;
res->key = proc->tti_rx; res->key = proc->tti_rx;
pushTpool(gNB->threadPool, res); pushTpool(gNB->threadPool, res);
} }
printf( "Exiting ru_thread \n"); printf( "Exiting ru_thread \n");
...@@ -1399,7 +1402,6 @@ void *ru_thread( void *param ) { ...@@ -1399,7 +1402,6 @@ void *ru_thread( void *param ) {
delNotifiedFIFO_elt(msg); delNotifiedFIFO_elt(msg);
delNotifiedFIFO_elt(msgL1Tx); delNotifiedFIFO_elt(msgL1Tx);
delNotifiedFIFO_elt(msgRUTx); delNotifiedFIFO_elt(msgRUTx);
ru_thread_status = 0; ru_thread_status = 0;
return &ru_thread_status; return &ru_thread_status;
} }
...@@ -1490,8 +1492,7 @@ void kill_NR_RU_proc(int inst) { ...@@ -1490,8 +1492,7 @@ void kill_NR_RU_proc(int inst) {
} }
} }
int check_capabilities(RU_t *ru,RRU_capabilities_t *cap) int check_capabilities(RU_t *ru,RRU_capabilities_t *cap) {
{
FH_fmt_options_t fmt = cap->FH_fmt; FH_fmt_options_t fmt = cap->FH_fmt;
int i; int i;
int found_band=0; int found_band=0;
...@@ -1547,8 +1548,7 @@ char rru_formats[3][20] = {"OAI_IF5","MBP_IF5","OAI_IF4p5"}; ...@@ -1547,8 +1548,7 @@ char rru_formats[3][20] = {"OAI_IF5","MBP_IF5","OAI_IF4p5"};
char ru_if_formats[4][20] = {"LOCAL_RF","REMOTE_OAI_IF5","REMOTE_MBP_IF5","REMOTE_OAI_IF4p5"}; char ru_if_formats[4][20] = {"LOCAL_RF","REMOTE_OAI_IF5","REMOTE_MBP_IF5","REMOTE_OAI_IF4p5"};
void configure_ru(int idx, void configure_ru(int idx,
void *arg) void *arg) {
{
RU_t *ru = RC.ru[idx]; RU_t *ru = RC.ru[idx];
RRU_config_t *config = (RRU_config_t *)arg; RRU_config_t *config = (RRU_config_t *)arg;
RRU_capabilities_t *capabilities = (RRU_capabilities_t *)arg; RRU_capabilities_t *capabilities = (RRU_capabilities_t *)arg;
...@@ -1721,26 +1721,25 @@ void set_function_spec_param(RU_t *ru) { ...@@ -1721,26 +1721,25 @@ void set_function_spec_param(RU_t *ru) {
ru->fh_north_out = NULL; // no outgoing fronthaul to north ru->fh_north_out = NULL; // no outgoing fronthaul to north
ru->nr_start_if = NULL; // no if interface ru->nr_start_if = NULL; // no if interface
ru->rfdevice.host_type = RAU_HOST; ru->rfdevice.host_type = RAU_HOST;
ru->fh_south_in = rx_rf; // local synchronous RF RX
ru->fh_south_in = rx_rf; // local synchronous RF RX ru->fh_south_out = tx_rf; // local synchronous RF TX
ru->fh_south_out = tx_rf; // local synchronous RF TX ru->start_rf = start_rf; // need to start the local RF interface
ru->start_rf = start_rf; // need to start the local RF interface ru->stop_rf = stop_rf;
ru->stop_rf = stop_rf; ru->start_write_thread = start_write_thread; // starting RF TX in different thread
ru->start_write_thread = start_write_thread; // starting RF TX in different thread printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
} }
/* /*
printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf); printf("configuring ru_id %u (start_rf %p)\n", ru->idx, start_rf);
fill_rf_config(ru,rf_config_file); fill_rf_config(ru,rf_config_file);
init_frame_parms(&ru->frame_parms,1); init_frame_parms(&ru->frame_parms,1);
nr_phy_init_RU(ru); nr_phy_init_RU(ru);
ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg); ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
if (setup_RU_buffers(ru)!=0) { if (setup_RU_buffers(ru)!=0) {
printf("Exiting, cannot initialize RU Buffers\n"); printf("Exiting, cannot initialize RU Buffers\n");
exit(-1); exit(-1);
} }
*/ */
break; break;
...@@ -1796,9 +1795,12 @@ void set_function_spec_param(RU_t *ru) { ...@@ -1796,9 +1795,12 @@ void set_function_spec_param(RU_t *ru) {
if (ru->ifdevice.get_internal_parameter != NULL) { if (ru->ifdevice.get_internal_parameter != NULL) {
void *t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_in"); void *t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_in");
if (t != NULL) if (t != NULL)
ru->fh_south_in = t; ru->fh_south_in = t;
t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_out"); t = ru->ifdevice.get_internal_parameter("fh_if4p5_south_out");
if (t != NULL) if (t != NULL)
ru->fh_south_out = t; ru->fh_south_out = t;
} }
...@@ -1812,8 +1814,7 @@ void set_function_spec_param(RU_t *ru) { ...@@ -1812,8 +1814,7 @@ void set_function_spec_param(RU_t *ru) {
} // switch on interface type } // switch on interface type
} }
void init_NR_RU(char *rf_config_file) void init_NR_RU(char *rf_config_file) {
{
int ru_id; int ru_id;
RU_t *ru; RU_t *ru;
PHY_VARS_gNB *gNB_RC; PHY_VARS_gNB *gNB_RC;
...@@ -1828,7 +1829,6 @@ void init_NR_RU(char *rf_config_file) ...@@ -1828,7 +1829,6 @@ void init_NR_RU(char *rf_config_file)
printf("configuring RU from file\n"); printf("configuring RU from file\n");
NRRCconfig_RU(); NRRCconfig_RU();
LOG_I(PHY,"number of L1 instances %d, number of RU %d, number of CPU cores %d\n",RC.nb_nr_L1_inst,RC.nb_RU,get_nprocs()); LOG_I(PHY,"number of L1 instances %d, number of RU %d, number of CPU cores %d\n",RC.nb_nr_L1_inst,RC.nb_RU,get_nprocs());
LOG_D(PHY,"Process RUs RC.nb_RU:%d\n",RC.nb_RU); LOG_D(PHY,"Process RUs RC.nb_RU:%d\n",RC.nb_RU);
for (ru_id=0; ru_id<RC.nb_RU; ru_id++) { for (ru_id=0; ru_id<RC.nb_RU; ru_id++) {
...@@ -1890,8 +1890,7 @@ void init_NR_RU(char *rf_config_file) ...@@ -1890,8 +1890,7 @@ void init_NR_RU(char *rf_config_file)
} }
void stop_RU(int nb_ru) void stop_RU(int nb_ru) {
{
for (int inst = 0; inst < nb_ru; inst++) { for (int inst = 0; inst < nb_ru; inst++) {
LOG_I(PHY, "Stopping RU %d processing threads\n", inst); LOG_I(PHY, "Stopping RU %d processing threads\n", inst);
kill_NR_RU_proc(inst); kill_NR_RU_proc(inst);
...@@ -1901,8 +1900,7 @@ void stop_RU(int nb_ru) ...@@ -1901,8 +1900,7 @@ void stop_RU(int nb_ru)
/* --------------------------------------------------------*/ /* --------------------------------------------------------*/
/* from here function to use configuration module */ /* from here function to use configuration module */
static void NRRCconfig_RU(void) static void NRRCconfig_RU(void) {
{
int i = 0, j = 0; int i = 0, j = 0;
paramdef_t RUParams[] = RUPARAMS_DESC; paramdef_t RUParams[] = RUPARAMS_DESC;
paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0}; paramlist_def_t RUParamList = {CONFIG_STRING_RU_LIST,NULL,0};
...@@ -1946,8 +1944,7 @@ static void NRRCconfig_RU(void) ...@@ -1946,8 +1944,7 @@ static void NRRCconfig_RU(void)
} else { } else {
LOG_E(PHY, "Erroneous RU clock source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr)); LOG_E(PHY, "Erroneous RU clock source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr));
} }
} } else {
else {
LOG_I(PHY,"Setting clock source to internal\n"); LOG_I(PHY,"Setting clock source to internal\n");
RC.ru[j]->openair0_cfg.clock_source = internal; RC.ru[j]->openair0_cfg.clock_source = internal;
} }
...@@ -1965,10 +1962,9 @@ static void NRRCconfig_RU(void) ...@@ -1965,10 +1962,9 @@ static void NRRCconfig_RU(void)
} else { } else {
LOG_E(PHY, "Erroneous RU time source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr)); LOG_E(PHY, "Erroneous RU time source in the provided configuration file: '%s'\n", *(RUParamList.paramarray[j][RU_SDR_CLK_SRC].strptr));
} }
} } else {
else {
LOG_I(PHY,"Setting time source to internal\n"); LOG_I(PHY,"Setting time source to internal\n");
RC.ru[j]->openair0_cfg.time_source = internal; RC.ru[j]->openair0_cfg.time_source = internal;
} }
if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) { if (strcmp(*(RUParamList.paramarray[j][RU_LOCAL_RF_IDX].strptr), "yes") == 0) {
...@@ -2052,8 +2048,10 @@ static void NRRCconfig_RU(void) ...@@ -2052,8 +2048,10 @@ static void NRRCconfig_RU(void)
if (config_isparamset(RUParamList.paramarray[j], RU_BF_WEIGHTS_LIST_IDX)) { if (config_isparamset(RUParamList.paramarray[j], RU_BF_WEIGHTS_LIST_IDX)) {
RC.ru[j]->nb_bfw = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].numelt; RC.ru[j]->nb_bfw = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].numelt;
for (i=0; i<RC.ru[j]->num_gNB; i++) { for (i=0; i<RC.ru[j]->num_gNB; i++) {
RC.ru[j]->bw_list[i] = (int32_t *)malloc16_clear((RC.ru[j]->nb_bfw)*sizeof(int32_t)); RC.ru[j]->bw_list[i] = (int32_t *)malloc16_clear((RC.ru[j]->nb_bfw)*sizeof(int32_t));
for (int b=0; b<RC.ru[j]->nb_bfw; b++) RC.ru[j]->bw_list[i][b] = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].iptr[b]; for (int b=0; b<RC.ru[j]->nb_bfw; b++) RC.ru[j]->bw_list[i][b] = RUParamList.paramarray[j][RU_BF_WEIGHTS_LIST_IDX].iptr[b];
} }
} }
......
...@@ -170,8 +170,9 @@ int split73=0; ...@@ -170,8 +170,9 @@ int split73=0;
void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) { void sendFs6Ul(PHY_VARS_eNB *eNB, int UE_id, int harq_pid, int segmentID, int16_t *data, int dataLen, int r_offset) {
AssertFatal(false, "Must not be called in this context\n"); AssertFatal(false, "Must not be called in this context\n");
} }
void sendFs6Ulharq(enum pckType type, int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask, uint16_t rnti, int32_t stat) { void sendFs6Ulharq(enum pckType type, int UEid, PHY_VARS_eNB *eNB, LTE_eNB_UCI *uci, int frame, int subframe, uint8_t *harq_ack, uint8_t tdd_mapping_mode, uint16_t tdd_multiplexing_mask,
AssertFatal(false, "Must not be called in this context\n"); uint16_t rnti, int32_t stat) {
AssertFatal(false, "Must not be called in this context\n");
} }
...@@ -307,44 +308,40 @@ int create_gNB_tasks(uint32_t gnb_nb) { ...@@ -307,44 +308,40 @@ int create_gNB_tasks(uint32_t gnb_nb) {
LOG_D(GNB_APP, "%s(gnb_nb:%d)\n", __FUNCTION__, gnb_nb); LOG_D(GNB_APP, "%s(gnb_nb:%d)\n", __FUNCTION__, gnb_nb);
itti_wait_ready(1); itti_wait_ready(1);
if (gnb_nb > 0) { if (gnb_nb > 0) {
/* Last task to create, others task must be ready before its start */ /* Last task to create, others task must be ready before its start */
/*if (itti_create_task (TASK_GNB_APP, gNB_app_task, NULL) < 0) { /*if (itti_create_task (TASK_GNB_APP, gNB_app_task, NULL) < 0) {
LOG_E(GNB_APP, "Create task for gNB APP failed\n"); LOG_E(GNB_APP, "Create task for gNB APP failed\n");
return -1; return -1;
}*/ }*/
if(itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0){ if(itti_create_task(TASK_SCTP, sctp_eNB_task, NULL) < 0) {
LOG_E(SCTP, "Create task for SCTP failed\n"); LOG_E(SCTP, "Create task for SCTP failed\n");
return -1; return -1;
} }
if (is_x2ap_enabled()) { if (is_x2ap_enabled()) {
if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0){ if(itti_create_task(TASK_X2AP, x2ap_task, NULL) < 0) {
LOG_E(X2AP, "Create task for X2AP failed\n"); LOG_E(X2AP, "Create task for X2AP failed\n");
} }
} } else {
else {
LOG_I(X2AP, "X2AP is disabled.\n"); LOG_I(X2AP, "X2AP is disabled.\n");
} }
} }
paramdef_t NETParams[] = GNBNETPARAMS_DESC; paramdef_t NETParams[] = GNBNETPARAMS_DESC;
char aprefix[MAX_OPTNAME_SIZE*2 + 8]; char aprefix[MAX_OPTNAME_SIZE*2 + 8];
sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG); sprintf(aprefix,"%s.[%i].%s",GNB_CONFIG_STRING_GNB_LIST,0,GNB_CONFIG_STRING_NETWORK_INTERFACES_CONFIG);
config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix); config_get( NETParams,sizeof(NETParams)/sizeof(paramdef_t),aprefix);
for(int i = GNB_INTERFACE_NAME_FOR_NG_AMF_IDX; i <= GNB_IPV4_ADDRESS_FOR_NG_AMF_IDX; i++){ for(int i = GNB_INTERFACE_NAME_FOR_NG_AMF_IDX; i <= GNB_IPV4_ADDRESS_FOR_NG_AMF_IDX; i++) {
if( NETParams[i].strptr == NULL){ if( NETParams[i].strptr == NULL) {
LOG_E(NGAP, "No configuration in the file.\n"); LOG_E(NGAP, "No configuration in the file.\n");
NGAP_CONF_MODE = 0; NGAP_CONF_MODE = 0;
} } else {
else {
LOG_D(NGAP, "Configuration in the file: %s.\n",*NETParams[i].strptr); LOG_D(NGAP, "Configuration in the file: %s.\n",*NETParams[i].strptr);
} }
} }
if (AMF_MODE_ENABLED) { if (AMF_MODE_ENABLED) {
if (gnb_nb > 0) { if (gnb_nb > 0) {
/* /*
...@@ -353,17 +350,16 @@ int create_gNB_tasks(uint32_t gnb_nb) { ...@@ -353,17 +350,16 @@ int create_gNB_tasks(uint32_t gnb_nb) {
return -1; return -1;
} }
*/ */
if(NGAP_CONF_MODE){ if(NGAP_CONF_MODE) {
if (itti_create_task (TASK_NGAP, ngap_gNB_task, NULL) < 0) { if (itti_create_task (TASK_NGAP, ngap_gNB_task, NULL) < 0) {
LOG_E(NGAP, "Create task for NGAP failed\n"); LOG_E(NGAP, "Create task for NGAP failed\n");
return -1; return -1;
} }
} else { } else {
LOG_E(NGAP, "Ngap task not created\n"); LOG_E(NGAP, "Ngap task not created\n");
} }
if(!emulate_rf) {
if(!emulate_rf){
if (itti_create_task (TASK_UDP, udp_eNB_task, NULL) < 0) { if (itti_create_task (TASK_UDP, udp_eNB_task, NULL) < 0) {
LOG_E(UDP_, "Create task for UDP failed\n"); LOG_E(UDP_, "Create task for UDP failed\n");
return -1; return -1;
...@@ -384,12 +380,14 @@ int create_gNB_tasks(uint32_t gnb_nb) { ...@@ -384,12 +380,14 @@ int create_gNB_tasks(uint32_t gnb_nb) {
} }
LOG_I(NR_RRC,"Creating NR RRC gNB Task\n"); LOG_I(NR_RRC,"Creating NR RRC gNB Task\n");
if (itti_create_task (TASK_RRC_GNB, rrc_gnb_task, NULL) < 0) { if (itti_create_task (TASK_RRC_GNB, rrc_gnb_task, NULL) < 0) {
LOG_E(NR_RRC, "Create task for NR RRC gNB failed\n"); LOG_E(NR_RRC, "Create task for NR RRC gNB failed\n");
return -1; return -1;
} }
//Use check on x2ap to consider the NSA scenario and check on AMF_MODE_ENABLED for the SA scenario
if(is_x2ap_enabled() || AMF_MODE_ENABLED){ //Use check on x2ap to consider the NSA scenario and check on AMF_MODE_ENABLED for the SA scenario
if(is_x2ap_enabled() || AMF_MODE_ENABLED) {
if (itti_create_task (TASK_GTPV1_U, &nr_gtpv1u_gNB_task, NULL) < 0) { if (itti_create_task (TASK_GTPV1_U, &nr_gtpv1u_gNB_task, NULL) < 0) {
LOG_E(GTPU, "Create task for GTPV1U failed\n"); LOG_E(GTPU, "Create task for GTPV1U failed\n");
return -1; return -1;
...@@ -402,18 +400,12 @@ int create_gNB_tasks(uint32_t gnb_nb) { ...@@ -402,18 +400,12 @@ int create_gNB_tasks(uint32_t gnb_nb) {
static void get_options(void) { static void get_options(void) {
paramdef_t cmdline_params[] = CMDLINE_PARAMS_DESC_GNB ; paramdef_t cmdline_params[] = CMDLINE_PARAMS_DESC_GNB ;
CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP); CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
get_common_options(SOFTMODEM_GNB_BIT ); get_common_options(SOFTMODEM_GNB_BIT );
config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL); config_process_cmdline( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP); CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) { if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) {
memset((void *)&RC,0,sizeof(RC)); memset((void *)&RC,0,sizeof(RC));
/* Read RC configuration file */ /* Read RC configuration file */
...@@ -426,13 +418,11 @@ static void get_options(void) { ...@@ -426,13 +418,11 @@ static void get_options(void) {
if(parallel_config != NULL) set_parallel_conf(parallel_config); if(parallel_config != NULL) set_parallel_conf(parallel_config);
if(worker_config != NULL) set_worker_conf(worker_config); if(worker_config != NULL) set_worker_conf(worker_config);
} }
void set_default_frame_parms(nfapi_nr_config_request_scf_t *config[MAX_NUM_CCs], void set_default_frame_parms(nfapi_nr_config_request_scf_t *config[MAX_NUM_CCs],
NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) NR_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) {
{
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
frame_parms[CC_id] = (NR_DL_FRAME_PARMS *) malloc(sizeof(NR_DL_FRAME_PARMS)); frame_parms[CC_id] = (NR_DL_FRAME_PARMS *) malloc(sizeof(NR_DL_FRAME_PARMS));
config[CC_id] = (nfapi_nr_config_request_scf_t *) malloc(sizeof(nfapi_nr_config_request_scf_t)); config[CC_id] = (nfapi_nr_config_request_scf_t *) malloc(sizeof(nfapi_nr_config_request_scf_t));
...@@ -507,10 +497,9 @@ void wait_gNBs(void) { ...@@ -507,10 +497,9 @@ void wait_gNBs(void) {
waiting=0; waiting=0;
for (i=0; i<RC.nb_nr_L1_inst; i++) { for (i=0; i<RC.nb_nr_L1_inst; i++) {
if (RC.gNB[i]->configured==0) { if (RC.gNB[i]->configured==0) {
waiting=1; waiting=1;
break; break;
} }
} }
} }
...@@ -567,11 +556,8 @@ int stop_L1L2(module_id_t gnb_id) { ...@@ -567,11 +556,8 @@ int stop_L1L2(module_id_t gnb_id) {
LOG_I(GNB_APP, "calling kill_NR_RU_proc() for instance %d\n", gnb_id); LOG_I(GNB_APP, "calling kill_NR_RU_proc() for instance %d\n", gnb_id);
kill_NR_RU_proc(gnb_id); kill_NR_RU_proc(gnb_id);
oai_exit = 0; oai_exit = 0;
//free_transport(RC.gNB[gnb_id]);
//free_transport(RC.gNB[gnb_id]);
phy_free_nr_gNB(RC.gNB[gnb_id]); phy_free_nr_gNB(RC.gNB[gnb_id]);
nr_phy_free_RU(RC.ru[gnb_id]); nr_phy_free_RU(RC.ru[gnb_id]);
free_lte_top(); free_lte_top();
return 0; return 0;
...@@ -586,17 +572,13 @@ int restart_L1L2(module_id_t gnb_id) { ...@@ -586,17 +572,13 @@ int restart_L1L2(module_id_t gnb_id) {
LOG_W(GNB_APP, "restarting nr-softmodem\n"); LOG_W(GNB_APP, "restarting nr-softmodem\n");
/* block threads */ /* block threads */
sync_var = -1; sync_var = -1;
RC.gNB[gnb_id]->configured = 0; RC.gNB[gnb_id]->configured = 0;
RC.ru_mask |= (1 << ru->idx); RC.ru_mask |= (1 << ru->idx);
set_function_spec_param(RC.ru[gnb_id]); set_function_spec_param(RC.ru[gnb_id]);
LOG_I(GNB_APP, "attempting to create ITTI tasks\n"); LOG_I(GNB_APP, "attempting to create ITTI tasks\n");
// No more rrc thread, as many race conditions are hidden behind // No more rrc thread, as many race conditions are hidden behind
rrc_enb_init(); rrc_enb_init();
itti_mark_task_ready(TASK_RRC_ENB); itti_mark_task_ready(TASK_RRC_ENB);
/* pass a reconfiguration request which will configure everything down to /* pass a reconfiguration request which will configure everything down to
* RC.eNB[i][j]->frame_parms, too */ * RC.eNB[i][j]->frame_parms, too */
msg_p = itti_alloc_new_message(TASK_ENB_APP, 0, RRC_CONFIGURATION_REQ); msg_p = itti_alloc_new_message(TASK_ENB_APP, 0, RRC_CONFIGURATION_REQ);
...@@ -633,7 +615,8 @@ void init_pdcp(void) { ...@@ -633,7 +615,8 @@ void init_pdcp(void) {
if (!NODE_IS_DU(RC.nrrrc[0]->node_type)) { if (!NODE_IS_DU(RC.nrrrc[0]->node_type)) {
// pdcp_layer_init(); // pdcp_layer_init();
uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ? uint32_t pdcp_initmask = (IS_SOFTMODEM_NOS1) ?
(PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT; (PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT;
if (IS_SOFTMODEM_NOS1) { if (IS_SOFTMODEM_NOS1) {
printf("IS_SOFTMODEM_NOS1 option enabled \n"); printf("IS_SOFTMODEM_NOS1 option enabled \n");
pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT; pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT;
...@@ -656,16 +639,15 @@ void init_pdcp(void) { ...@@ -656,16 +639,15 @@ void init_pdcp(void) {
} }
int main( int argc, char **argv ) int main( int argc, char **argv ) {
{
int ru_id, CC_id = 0; int ru_id, CC_id = 0;
start_background_system(); start_background_system();
///static configuration for NR at the moment ///static configuration for NR at the moment
if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == NULL) { if ( load_configmodule(argc,argv,CONFIG_ENABLECMDLINEONLY) == NULL) {
exit_fun("[SOFTMODEM] Error, configuration module init failed\n"); exit_fun("[SOFTMODEM] Error, configuration module init failed\n");
} }
set_softmodem_sighandler(); set_softmodem_sighandler();
#ifdef DEBUG_CONSOLE #ifdef DEBUG_CONSOLE
setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0);
...@@ -709,19 +691,16 @@ int main( int argc, char **argv ) ...@@ -709,19 +691,16 @@ int main( int argc, char **argv )
itti_init(TASK_MAX, tasks_info); itti_init(TASK_MAX, tasks_info);
// initialize mscgen log after ITTI // initialize mscgen log after ITTI
MSC_INIT(MSC_E_UTRAN, ADDED_QUEUES_MAX+TASK_MAX); MSC_INIT(MSC_E_UTRAN, ADDED_QUEUES_MAX+TASK_MAX);
init_opt(); init_opt();
#ifdef PDCP_USE_NETLINK
if(!IS_SOFTMODEM_NOS1)
netlink_init();
#ifdef PDCP_USE_NETLINK
if(!IS_SOFTMODEM_NOS1)
netlink_init();
#if defined(PDCP_USE_NETLINK_QUEUES) #if defined(PDCP_USE_NETLINK_QUEUES)
pdcp_netlink_init(); pdcp_netlink_init();
#endif #endif
#endif #endif
#ifndef PACKAGE_VERSION #ifndef PACKAGE_VERSION
# define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL" # define PACKAGE_VERSION "UNKNOWN-EXPERIMENTAL"
#endif #endif
...@@ -730,9 +709,8 @@ if(!IS_SOFTMODEM_NOS1) ...@@ -730,9 +709,8 @@ if(!IS_SOFTMODEM_NOS1)
if (RC.nb_nr_L1_inst > 0) if (RC.nb_nr_L1_inst > 0)
RCconfig_NR_L1(); RCconfig_NR_L1();
// don't create if node doesn't connect to RRC/S1/GTP // don't create if node doesn't connect to RRC/S1/GTP
AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n"); AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n");
/* Start the agent. If it is turned off in the configuration, it won't start */ /* Start the agent. If it is turned off in the configuration, it won't start */
/* /*
RCconfig_nr_flexran(); RCconfig_nr_flexran();
...@@ -740,15 +718,13 @@ if(!IS_SOFTMODEM_NOS1) ...@@ -740,15 +718,13 @@ if(!IS_SOFTMODEM_NOS1)
for (i = 0; i < RC.nb_nr_L1_inst; i++) { for (i = 0; i < RC.nb_nr_L1_inst; i++) {
flexran_agent_start(i); flexran_agent_start(i);
} }
*/ */
// init UE_PF_PO and mutex lock // init UE_PF_PO and mutex lock
pthread_mutex_init(&ue_pf_po_mutex, NULL); pthread_mutex_init(&ue_pf_po_mutex, NULL);
memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs); memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs);
mlockall(MCL_CURRENT | MCL_FUTURE); mlockall(MCL_CURRENT | MCL_FUTURE);
pthread_cond_init(&sync_cond,NULL); pthread_cond_init(&sync_cond,NULL);
pthread_mutex_init(&sync_mutex, NULL); pthread_mutex_init(&sync_mutex, NULL);
usleep(1000); usleep(1000);
if (NFAPI_MODE) { if (NFAPI_MODE) {
...@@ -819,6 +795,7 @@ if(!IS_SOFTMODEM_NOS1) ...@@ -819,6 +795,7 @@ if(!IS_SOFTMODEM_NOS1)
printf("RC.nb_RU:%d\n", RC.nb_RU); printf("RC.nb_RU:%d\n", RC.nb_RU);
// once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration) // once all RUs are ready initialize the rest of the gNBs ((dependence on final RU parameters after configuration)
printf("ALL RUs ready - init gNBs\n"); printf("ALL RUs ready - init gNBs\n");
if(IS_SOFTMODEM_DOSCOPE) { if(IS_SOFTMODEM_DOSCOPE) {
sleep(1); sleep(1);
scopeParms_t p; scopeParms_t p;
...@@ -844,6 +821,7 @@ if(!IS_SOFTMODEM_NOS1) ...@@ -844,6 +821,7 @@ if(!IS_SOFTMODEM_NOS1)
pthread_cond_broadcast(&sync_cond); pthread_cond_broadcast(&sync_cond);
pthread_mutex_unlock(&sync_mutex); pthread_mutex_unlock(&sync_mutex);
} }
printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
end_configmodule(); end_configmodule();
printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__);
...@@ -855,7 +833,6 @@ if(!IS_SOFTMODEM_NOS1) ...@@ -855,7 +833,6 @@ if(!IS_SOFTMODEM_NOS1)
printf("Returned from ITTI signal handler\n"); printf("Returned from ITTI signal handler\n");
oai_exit=1; oai_exit=1;
printf("oai_exit=%d\n",oai_exit); printf("oai_exit=%d\n",oai_exit);
// stop threads // stop threads
/*#ifdef XFORMS /*#ifdef XFORMS
...@@ -889,8 +866,8 @@ if(!IS_SOFTMODEM_NOS1) ...@@ -889,8 +866,8 @@ if(!IS_SOFTMODEM_NOS1)
/* release memory used by the RU/gNB threads (incomplete), after all /* release memory used by the RU/gNB threads (incomplete), after all
* 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_gNB_INST; inst++) { for (int inst = 0; inst < NB_gNB_INST; inst++) {
//free_transport(RC.gNB[inst]); //free_transport(RC.gNB[inst]);
phy_free_nr_gNB(RC.gNB[inst]); phy_free_nr_gNB(RC.gNB[inst]);
} }
for (int inst = 0; inst < NB_RU; inst++) { for (int inst = 0; inst < NB_RU; inst++) {
...@@ -914,7 +891,6 @@ if(!IS_SOFTMODEM_NOS1) ...@@ -914,7 +891,6 @@ if(!IS_SOFTMODEM_NOS1)
RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice); RC.ru[ru_id]->ifdevice.trx_end_func(&RC.ru[ru_id]->ifdevice);
} }
logClean(); logClean();
printf("Bye.\n"); printf("Bye.\n");
return 0; return 0;
......
...@@ -2727,7 +2727,7 @@ typedef struct { ...@@ -2727,7 +2727,7 @@ typedef struct {
} nfapi_cqi_indication_rel8_t; } nfapi_cqi_indication_rel8_t;
#define NFAPI_CQI_INDICATION_REL8_TAG 0x202f #define NFAPI_CQI_INDICATION_REL8_TAG 0x202f
#define NFAPI_CC_MAX 4 #define NFAPI_CC_MAX MAX_NUM_CCs
typedef struct { typedef struct {
nfapi_tl_t tl; nfapi_tl_t tl;
uint16_t length; uint16_t length;
......
/* /*
* Copyright (c) 2001-2016, Cisco Systems, Inc. * Copyright (c) 2001-2016, Cisco Systems, Inc.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* *
* Redistributions of source code must retain the above copyright * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* *
* Redistributions in binary form must reproduce the above * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following * copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided * disclaimer in the documentation and/or other materials provided
* with the distribution. * with the distribution.
* *
* Neither the name of the Cisco Systems, Inc. nor the names of its * Neither the name of the Cisco Systems, Inc. nor the names of its
* contributors may be used to endorse or promote products derived * contributors may be used to endorse or promote products derived
* from this software without specific prior written permission. * from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE. * OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include <signal.h> #include <signal.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <sched.h> #include <sched.h>
#include <time.h> #include <time.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <pthread.h> #include <pthread.h>
#include <nfapi_interface.h> #include <nfapi_interface.h>
#include <nfapi.h> #include <nfapi.h>
#include <debug.h> #include <debug.h>
// Fundamental routines // Fundamental routines
uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end) uint8_t push8(uint8_t in, uint8_t **out, uint8_t *end) {
{ uint8_t *pOut = *out;
uint8_t *pOut = *out;
if((end - pOut) >= 1) {
if((end - pOut) >= 1) pOut[0] = in;
{ (*out)+=1;
pOut[0] = in; return 1;
} else {
(*out)+=1; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0;
return 1; }
} }
else
{ uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end) {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); uint8_t *pOut = *out;
return 0;
} if((end - pOut) >= 1) {
pOut[0] = in;
} (*out)+=1;
return 1;
uint8_t pushs8(int8_t in, uint8_t **out, uint8_t *end) } else {
{ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
uint8_t *pOut = *out; return 0;
}
if((end - pOut) >= 1) }
{
pOut[0] = in; uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end) {
uint8_t *pOut = *out;
(*out)+=1;
if((end - pOut) >= 2) {
return 1; pOut[0] = (in & 0xFF00) >> 8;
} pOut[1] = (in & 0xFF);
else (*out)+=2;
{ return 2;
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); } else {
return 0; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
} return 0;
} }
}
uint8_t push16(uint16_t in, uint8_t **out, uint8_t *end)
{ uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end) {
uint8_t *pOut = *out; uint8_t *pOut = *out;
if((end - pOut) >= 2) if((end - pOut) >= 2) {
{ pOut[0] = (in & 0xFF00) >> 8;
pOut[0] = (in & 0xFF00) >> 8; pOut[1] = (in & 0xFF);
pOut[1] = (in & 0xFF); (*out)+=2;
return 2;
(*out)+=2; } else {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 2; return 0;
} }
else }
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end) {
return 0; uint8_t *pOut = *out;
}
} if((end - pOut) >= 4) {
pOut[0] = (in & 0xFF000000) >> 24;
uint8_t pushs16(int16_t in, uint8_t **out, uint8_t *end) pOut[1] = (in & 0xFF0000) >> 16;
{ pOut[2] = (in & 0xFF00) >> 8;
uint8_t *pOut = *out; pOut[3] = (in & 0xFF);
(*out)+=4;
if((end - pOut) >= 2) return 4;
{ } else {
pOut[0] = (in & 0xFF00) >> 8; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
pOut[1] = (in & 0xFF); return 0;
}
(*out)+=2; }
return 2; uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end) {
} uint8_t *pOut = *out;
else
{ if((end - pOut) >= 4) {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); pOut[0] = (in & 0xFF000000) >> 24;
return 0; pOut[1] = (in & 0xFF0000) >> 16;
} pOut[2] = (in & 0xFF00) >> 8;
} pOut[3] = (in & 0xFF);
(*out)+=4;
uint8_t push32(uint32_t in, uint8_t **out, uint8_t *end) return 4;
{ } else {
uint8_t *pOut = *out; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
if((end - pOut) >= 4) return 0;
{ }
pOut[0] = (in & 0xFF000000) >> 24; }
pOut[1] = (in & 0xFF0000) >> 16;
pOut[2] = (in & 0xFF00) >> 8; uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end) {
pOut[3] = (in & 0xFF); uint8_t *pIn = *in;
(*out)+=4; if((end - pIn) >= 1 ) {
*out = *pIn;
return 4; (*in)+=1;
} return 1;
else } else {
{ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); return 0;
return 0; }
} }
}
uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end) {
uint8_t pushs32(int32_t in, uint8_t **out, uint8_t *end) uint8_t *pIn = *in;
{
uint8_t *pOut = *out; if((end - pIn) >= 1 ) {
*out = *pIn;
if((end - pOut) >= 4) (*in)+=1;
{ return 1;
pOut[0] = (in & 0xFF000000) >> 24; } else {
pOut[1] = (in & 0xFF0000) >> 16; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
pOut[2] = (in & 0xFF00) >> 8; return 0;
pOut[3] = (in & 0xFF); }
}
(*out)+=4;
uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end) {
return 4; uint8_t *pIn = *in;
}
else if((end - pIn) >=2 ) {
{ *out = ((pIn[0]) << 8) | pIn[1];
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); (*in)+=2;
return 0; return 2;
} } else {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0;
uint8_t pull8(uint8_t **in, uint8_t *out, uint8_t *end) }
{ }
uint8_t *pIn = *in;
uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end) {
if((end - pIn) >= 1 ) uint8_t *pIn = *in;
{
*out = *pIn; if((end - pIn) >=2 ) {
*out = ((pIn[0]) << 8) | pIn[1];
(*in)+=1; (*in)+=2;
return 2;
return 1; } else {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
else return 0;
{ }
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); }
return 0;
} uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end) {
} uint8_t *pIn = *in;
uint8_t pulls8(uint8_t **in, int8_t *out, uint8_t *end) if((end - pIn) >=4 ) {
{ *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
uint8_t *pIn = *in; (*in)+=4;
return 4;
if((end - pIn) >= 1 ) } else {
{ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
*out = *pIn; return 0;
}
(*in)+=1; }
return 1; uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end) {
} uint8_t *pIn = *in;
else
{ if((end - pIn) >=4 ) {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); *out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3];
return 0; (*in)+=4;
} return 4;
} } else {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
uint8_t pull16(uint8_t **in, uint16_t *out, uint8_t *end) return 0;
{ }
uint8_t *pIn = *in; }
if((end - pIn) >=2 ) /*
{ inline void pusharray16(uint8_t **, uint16_t, uint32_t len)
*out = ((pIn[0]) << 8) | pIn[1]; {
(*in)+=2; }
*/
return 2;
} uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
else if(len == 0)
{ return 1;
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0; if(len > max_len) {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
} return 0;
}
uint8_t pulls16(uint8_t **in, int16_t *out, uint8_t *end)
{ if((end - (*in)) >= sizeof(uint16_t) * len) {
uint8_t *pIn = *in; uint32_t idx;
if((end - pIn) >=2 ) for(idx = 0; idx < len; ++idx) {
{ if(!pull16(in, &out[idx], end))
*out = ((pIn[0]) << 8) | pIn[1]; return 0;
}
(*in)+=2;
return sizeof(uint16_t) * len;
return 2; } else {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
else return 0;
{ }
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); }
return 0;
} uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
} if(len == 0)
return 1;
uint8_t pull32(uint8_t **in, uint32_t *out, uint8_t *end)
{ if(len > max_len) {
uint8_t *pIn = *in; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
return 0;
if((end - pIn) >=4 ) }
{
*out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3]; if((end - (*in)) >= sizeof(uint16_t) * len) {
uint32_t idx;
(*in)+=4;
for(idx = 0; idx < len; ++idx) {
return 4; if(!pulls16(in, &out[idx], end))
} return 0;
else }
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); return sizeof(uint16_t) * len;
return 0; } else {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
} return 0;
}
uint8_t pulls32(uint8_t **in, int32_t *out, uint8_t *end) }
{ uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
uint8_t *pIn = *in; if(len == 0)
return 1;
if((end - pIn) >=4 )
{ if(len > max_len) {
*out = (pIn[0] << 24) | (pIn[1] << 16) | (pIn[2] << 8) | pIn[3]; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
return 0;
(*in)+=4; }
return 4; if((end - (*out)) >= sizeof(uint16_t) * len) {
} uint32_t idx;
else
{ for(idx = 0; idx < len; ++idx) {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); if(!push16(in[idx], out, end))
return 0; return 0;
} }
}
return sizeof(uint16_t) * len;
/* } else {
inline void pusharray16(uint8_t **, uint16_t, uint32_t len) NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
{ return 0;
} }
*/ }
uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
uint32_t pullarray16(uint8_t **in, uint16_t out[], uint32_t max_len, uint32_t len, uint8_t *end) if(len == 0)
{ return 1;
if(len == 0)
return 1; if(len > max_len) {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
if(len > max_len) return 0;
{ }
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
return 0; if((end - (*out)) >= sizeof(uint16_t) * len) {
} uint32_t idx;
if((end - (*in)) >= sizeof(uint16_t) * len) for(idx = 0; idx < len; ++idx) {
{ pushs16(in[idx], out, end);
uint32_t idx; }
for(idx = 0; idx < len; ++idx)
{ return sizeof(uint16_t) * len;
if(!pull16(in, &out[idx], end)) } else {
return 0; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
} return 0;
}
return sizeof(uint16_t) * len; }
} uint32_t pullarray32(uint8_t **in, uint32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
else if(len == 0)
{ return 1;
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0; if(len > max_len) {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
} return 0;
}
uint32_t pullarrays16(uint8_t **in, int16_t out[], uint32_t max_len, uint32_t len, uint8_t *end)
{ if((end - (*in)) >= sizeof(uint32_t) * len) {
if(len == 0) uint32_t idx;
return 1;
for(idx = 0; idx < len; ++idx) {
if(len > max_len) if(!pull32(in, &out[idx], end))
{ return 0;
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); }
return 0;
} return sizeof(uint32_t) * len;
} else {
if((end - (*in)) >= sizeof(uint16_t) * len) NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
{ return 0;
uint32_t idx; }
for(idx = 0; idx < len; ++idx) }
{
if(!pulls16(in, &out[idx], end)) uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
return 0; if(len == 0)
} return 1;
return sizeof(uint16_t) * len; if(len > max_len) {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
else return 0;
{ }
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0; if((end - (*in)) >= sizeof(uint32_t) * len) {
} uint32_t idx;
}
uint32_t pusharray16(uint16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) for(idx = 0; idx < len; ++idx) {
{ if(!pulls32(in, &out[idx], end))
if(len == 0) return 0;
return 1; }
if(len > max_len) return sizeof(uint32_t) * len;
{ } else {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0; return 0;
} }
}
if((end - (*out)) >= sizeof(uint16_t) * len) uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
{ if(len == 0)
uint32_t idx; return 1;
for(idx = 0; idx < len; ++idx)
{ if(len > max_len) {
if(!push16(in[idx], out, end)) NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
return 0; return 0;
} }
return sizeof(uint16_t) * len;
} if((end - (*out)) >= sizeof(uint32_t) * len) {
else uint32_t idx;
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); for(idx = 0; idx < len; ++idx) {
return 0; if(!push32(in[idx], out, end))
} return 0;
} }
uint32_t pusharrays16(int16_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end)
{ return sizeof(uint32_t) * len;
if(len == 0) } else {
return 1; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0;
if(len > max_len) }
{ }
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
return 0; if(len == 0)
} return 1;
if((end - (*out)) >= sizeof(uint16_t) * len) if(len > max_len) {
{ NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
uint32_t idx; return 0;
for(idx = 0; idx < len; ++idx) }
{
pushs16(in[idx], out, end); if((end - (*out)) >= sizeof(uint32_t) * len) {
} uint32_t idx;
return sizeof(uint16_t) * len;
} for(idx = 0; idx < len; ++idx) {
else pushs32(in[idx], out, end);
{ }
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0; return sizeof(uint32_t) * len;
} } else {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
uint32_t pullarray32(uint8_t **in, uint32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) return 0;
{ }
if(len == 0) }
return 1; uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end) {
if(len == 0)
if(len > max_len) return 1;
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); if(len > max_len) {
return 0; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
} return 0;
}
if((end - (*in)) >= sizeof(uint32_t) * len)
{ if((end - (*in)) >= sizeof(uint8_t) * len) {
uint32_t idx; memcpy(out, (*in), len);
for(idx = 0; idx < len; ++idx) (*in)+=len;
{ return sizeof(uint8_t) * len;
if(!pull32(in, &out[idx], end)) } else {
return 0; NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
} return 0;
}
return sizeof(uint32_t) * len; }
}
else uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) {
{ if(len == 0)
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); return 1;
return 0;
} if(len > max_len) {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
return 0;
uint32_t pullarrays32(uint8_t **in, int32_t out[], uint32_t max_len, uint32_t len, uint8_t *end) }
{
if(len == 0) if((end - (*out)) >= sizeof(uint8_t) * len) {
return 1; memcpy((*out), in, len);
(*out)+=len;
if(len > max_len) return sizeof(uint8_t) * len;
{ } else {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0; return 0;
} }
}
if((end - (*in)) >= sizeof(uint32_t) * len)
{ uint8_t packarray(void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t **ppwritepackedmsg, uint8_t *end, pack_array_elem_fn fn) {
uint32_t idx; if(count > max_count) {
for(idx = 0; idx < len; ++idx) NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
{ return 0;
if(!pulls32(in, &out[idx], end)) }
return 0;
} uint16_t i = 0;
return sizeof(uint32_t) * len; for(i = 0; i < count; ++i) {
} if((fn)(array, ppwritepackedmsg, end) == 0)
else return 0;
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); array += array_element_size;
return 0; }
}
} return 1;
uint32_t pusharray32(uint32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) }
{
if(len == 0) uint8_t unpackarray(uint8_t **ppReadPackedMsg, void *array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn) {
return 1; if(count > max_count) {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
if(len > max_len) return 0;
{ }
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
return 0; uint16_t i = 0;
}
for(i = 0; i < count; ++i) {
if((end - (*out)) >= sizeof(uint32_t) * len) if((fn)(array, ppReadPackedMsg, end) == 0)
{ return 0;
uint32_t idx;
for(idx = 0; idx < len; ++idx) array += array_element_size;
{ }
if(!push32(in[idx], out, end))
return 0; return 1;
} }
return sizeof(uint32_t) * len;
}
else uint32_t pack_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config) {
{ if(ve != 0 && config != 0) {
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); if(config->pack_vendor_extension_tlv) {
return 0; uint8_t *pStartOfTlv = *ppWritePackedMsg;
}
} if(pack_tl(ve, ppWritePackedMsg, end) == 0)
uint32_t pusharrays32(int32_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) return 0;
{
if(len == 0) uint8_t *pStartOfValue = *ppWritePackedMsg;
return 1;
if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
if(len > max_len) return 0;
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len); ve->length = (*ppWritePackedMsg) - pStartOfValue;
return 0; pack_tl(ve, &pStartOfTlv, end);
} return 1;
}
if((end - (*out)) >= sizeof(uint32_t) * len) }
{
uint32_t idx; return 1;
for(idx = 0; idx < len; ++idx) }
{
pushs32(in[idx], out, end); uint32_t unpack_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve_tlv) {
} if(ve_tlv != 0 && config != 0) {
return sizeof(uint32_t) * len; if(config->unpack_vendor_extension_tlv) {
} return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config);
else }
{ }
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__);
return 0; return 1;
} }
}
uint32_t pullarray8(uint8_t **in, uint8_t out[], uint32_t max_len, uint32_t len, uint8_t *end) uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end,nfapi_p7_codec_config_t *config) {
{ if(ve != 0 && config != 0) {
if(len == 0) if(config->pack_vendor_extension_tlv) {
return 1; uint8_t *pStartOfTlv = *ppWritePackedMsg;
if(len > max_len) if(pack_tl(ve, ppWritePackedMsg, end) == 0)
{ return 0;
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
return 0; uint8_t *pStartOfValue = *ppWritePackedMsg;
}
if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
if((end - (*in)) >= sizeof(uint8_t) * len) return 0;
{
memcpy(out, (*in), len); ve->length = (*ppWritePackedMsg) - pStartOfValue;
(*in)+=len; pack_tl(ve, &pStartOfTlv, end);
return 1;
return sizeof(uint8_t) * len; }
} }
else
{ return 1;
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); }
return 0;
} int unpack_p7_vendor_extension_tlv(nfapi_tl_t *tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve_tlv) {
} if(ve_tlv != 0 && config != 0) {
if(config->unpack_vendor_extension_tlv) {
uint32_t pusharray8(uint8_t in[], uint32_t max_len, uint32_t len, uint8_t **out, uint8_t *end) return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void **)ve_tlv, config);
{ }
if(len == 0) }
return 1;
return 1;
if(len > max_len) }
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, len, max_len);
return 0; uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end) {
} return (push16(tl->tag, ppWritePackedMsg, end) &&
push16(tl->length, ppWritePackedMsg, end));
if((end - (*out)) >= sizeof(uint8_t) * len) }
{
memcpy((*out), in, len); uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end) {
(*out)+=len; return (pull16(ppReadPackedMsg, &tl->tag, end) &&
pull16(ppReadPackedMsg, &tl->length, end));
return sizeof(uint8_t) * len; }
}
else int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t *config, nfapi_tl_t **ve) {
{ nfapi_tl_t generic_tl;
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s no space in buffer\n", __FUNCTION__); uint8_t numBadTags = 0;
return 0; uint16_t idx = 0;
}
} while ((uint8_t *)(*ppReadPackedMsg) < end) {
// unpack the tl and process the values accordingly
uint8_t packarray(void* array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t **ppwritepackedmsg, uint8_t *end, pack_array_elem_fn fn) if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
{ return 0;
if(count > max_count)
{ uint8_t tagMatch = 0;
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count); uint8_t *pStartOfValue = *ppReadPackedMsg;
return 0;
} for(idx = 0; idx < size; ++idx) {
if(unpack_fns[idx].tag == generic_tl.tag) { // match the extracted tag value with all the tags in unpack_fn list
uint16_t i = 0; tagMatch = 1;
for(i = 0; i < count; ++i) nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
{ tl->tag = generic_tl.tag;
if((fn)(array, ppwritepackedmsg, end) == 0) tl->length = generic_tl.length;
return 0; int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end);
array += array_element_size; if(result == 0) {
} return 0;
}
return 1;
} // check if the length was right;
if(tl->length != (*ppReadPackedMsg - pStartOfValue)) {
uint8_t unpackarray(uint8_t **ppReadPackedMsg, void* array, uint16_t array_element_size, uint16_t max_count, uint16_t count, uint8_t *end, unpack_array_elem_fn fn) NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
{ }
if(count > max_count) }
{ }
NFAPI_TRACE(NFAPI_TRACE_ERROR, "%s exceed array size (%d > %d)\n", __FUNCTION__, count, max_count);
return 0; if(tagMatch == 0) {
} if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE &&
generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) {
uint16_t i = 0; int result = unpack_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
for(i = 0; i < count; ++i)
{ if(result == 0) {
if((fn)(array, ppReadPackedMsg, end) == 0) // got tot the end.
return 0; return 0;
} else if(result < 0) {
array += array_element_size; NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown VE TAG value: 0x%04x\n", generic_tl.tag);
}
if (++numBadTags > MAX_BAD_TAG) {
return 1; NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
} return 0;
}
uint32_t pack_vendor_extension_tlv(nfapi_tl_t* ve, uint8_t **ppWritePackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config) if((end - *ppReadPackedMsg) >= generic_tl.length) {
{ // Advance past the unknown TLV
if(ve != 0 && config != 0) (*ppReadPackedMsg) += generic_tl.length;
{ } else {
if(config->pack_vendor_extension_tlv) // go to the end
{ return 0;
}
uint8_t* pStartOfTlv = *ppWritePackedMsg; }
if(pack_tl(ve, ppWritePackedMsg, end) == 0) } else {
return 0; NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
uint8_t* pStartOfValue = *ppWritePackedMsg; if (++numBadTags > MAX_BAD_TAG) {
if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0) NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
return 0; return 0;
}
ve->length = (*ppWritePackedMsg) - pStartOfValue;
if((end - *ppReadPackedMsg) >= generic_tl.length) {
pack_tl(ve, &pStartOfTlv, end); // Advance past the unknown TLV
(*ppReadPackedMsg) += generic_tl.length;
return 1; } else {
// go to the end
} return 0;
} }
return 1; }
} }
}
uint32_t unpack_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p4_p5_codec_config_t* config, nfapi_tl_t** ve_tlv)
{ return 1;
if(ve_tlv != 0 && config != 0) }
{ int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t *config, nfapi_tl_t **ve) {
if(config->unpack_vendor_extension_tlv) nfapi_tl_t generic_tl;
{ uint8_t numBadTags = 0;
return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void**)ve_tlv, config); uint16_t idx = 0;
}
} while ((uint8_t *)(*ppReadPackedMsg) < end) {
return 1; // unpack the tl and process the values accordingly
} if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
return 0;
uint32_t pack_p7_vendor_extension_tlv(nfapi_tl_t *ve, uint8_t **ppWritePackedMsg, uint8_t *end ,nfapi_p7_codec_config_t* config)
{ uint8_t tagMatch = 0;
if(ve != 0 && config != 0) uint8_t *pStartOfValue = *ppReadPackedMsg;
{
if(config->pack_vendor_extension_tlv) for(idx = 0; idx < size; ++idx) {
{ if(unpack_fns[idx].tag == generic_tl.tag) {
uint8_t* pStartOfTlv = *ppWritePackedMsg; tagMatch = 1;
if(pack_tl(ve, ppWritePackedMsg, end) == 0) nfapi_tl_t *tl = (nfapi_tl_t *)(unpack_fns[idx].tlv);
return 0; tl->tag = generic_tl.tag;
tl->length = generic_tl.length;
uint8_t* pStartOfValue = *ppWritePackedMsg; int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end, config);
if((config->pack_vendor_extension_tlv)(ve, ppWritePackedMsg, end, config) == 0)
return 0; if(result == 0) {
return 0;
ve->length = (*ppWritePackedMsg) - pStartOfValue; }
pack_tl(ve, &pStartOfTlv, end); // check if the length was right;
if(tl->length != (*ppReadPackedMsg - pStartOfValue)) {
return 1; NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
}
} }
} }
return 1;
} if(tagMatch == 0) {
if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE &&
int unpack_p7_vendor_extension_tlv(nfapi_tl_t* tl, uint8_t **ppReadPackedMsg, uint8_t *end, nfapi_p7_codec_config_t* config, nfapi_tl_t** ve_tlv) generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) {
{ int result = unpack_p7_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
if(ve_tlv != 0 && config != 0)
{ if(result == 0) {
if(config->unpack_vendor_extension_tlv) // got to end
{ return 0;
return (config->unpack_vendor_extension_tlv)(tl, ppReadPackedMsg, end, (void**)ve_tlv, config); } else if(result < 0) {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
}
return 1; if (++numBadTags > MAX_BAD_TAG) {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
return -1;
}
uint8_t pack_tl(nfapi_tl_t *tl, uint8_t **ppWritePackedMsg, uint8_t *end)
{ if((end - *ppReadPackedMsg) >= generic_tl.length) {
return (push16(tl->tag, ppWritePackedMsg, end) && // Advance past the unknown TLV
push16(tl->length, ppWritePackedMsg, end)); (*ppReadPackedMsg) += generic_tl.length;
} } else {
// got ot the dn
uint8_t unpack_tl(uint8_t **ppReadPackedMsg, nfapi_tl_t *tl, uint8_t *end) return 0;
{ }
return (pull16(ppReadPackedMsg, &tl->tag, end) && }
pull16(ppReadPackedMsg, &tl->length, end)); } else {
} NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
int unpack_tlv_list(unpack_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t* end, nfapi_p4_p5_codec_config_t* config, nfapi_tl_t** ve) if (++numBadTags > MAX_BAD_TAG) {
{ NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
nfapi_tl_t generic_tl; return -1;
uint8_t numBadTags = 0; }
uint16_t idx = 0;
if((end - *ppReadPackedMsg) >= generic_tl.length) {
while ((uint8_t*)(*ppReadPackedMsg) < end) // Advance past the unknown TLV
{ (*ppReadPackedMsg) += generic_tl.length;
// unpack the tl and process the values accordingly } else {
if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0) // got ot the dn
return 0; return 0;
}
uint8_t tagMatch = 0; }
}
uint8_t* pStartOfValue = *ppReadPackedMsg; }
for(idx = 0; idx < size; ++idx) return 1;
{ }
if(unpack_fns[idx].tag == generic_tl.tag) // match the extracted tag value with all the tags in unpack_fn list
{ // This intermediate function deals with calculating the length of the value
tagMatch = 1; // and writing into the tlv header.
nfapi_tl_t* tl = (nfapi_tl_t*)(unpack_fns[idx].tlv); uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn) {
tl->tag = generic_tl.tag; nfapi_tl_t *tl = (nfapi_tl_t *)tlv;
tl->length = generic_tl.length;
// If the tag is defined
int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end); if(tl->tag == tag) {
uint8_t *pStartOfTlv = *ppWritePackedMsg;
if(result == 0)
{ // write a dumy tlv header
return 0; if(pack_tl(tl, ppWritePackedMsg, end) == 0)
} return 0;
// check if the length was right; // Record the start of the value
if(tl->length != (*ppReadPackedMsg - pStartOfValue)) uint8_t *pStartOfValue = *ppWritePackedMsg;
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue)); // pack the tlv value
} if(fn(tlv, ppWritePackedMsg, end) == 0)
} return 0;
}
// calculate the length of the value and rewrite the tl header
if(tagMatch == 0) tl->length = (*ppWritePackedMsg) - pStartOfValue;
{ // rewrite the header with the correct length
pack_tl(tl, &pStartOfTlv, end);
if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE && } else {
generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE) if(tl->tag != 0) {
{ NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag);
int result = unpack_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve); } else {
if(result == 0) //NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag);
{ }
// got tot the end. }
return 0;
} return 1;
else if(result < 0) }
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown VE TAG value: 0x%04x\n", generic_tl.tag); const char *nfapi_error_code_to_str(nfapi_error_code_e value) {
switch(value) {
if (++numBadTags > MAX_BAD_TAG) case NFAPI_MSG_OK:
{ return "NFAPI_MSG_OK";
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
return 0; case NFAPI_MSG_INVALID_STATE:
} return "NFAPI_MSG_INVALID_STATE";
if((end - *ppReadPackedMsg) >= generic_tl.length) case NFAPI_MSG_INVALID_CONFIG:
{ return "NFAPI_MSG_INVALID_CONFIG";
// Advance past the unknown TLV
(*ppReadPackedMsg) += generic_tl.length; case NFAPI_SFN_OUT_OF_SYNC:
} return "NFAPI_SFN_OUT_OF_SYNC";
else
{ case NFAPI_MSG_SUBFRAME_ERR:
// go to the end return "NFAPI_MSG_SUBFRAME_ERR";
return 0;
} case NFAPI_MSG_BCH_MISSING:
} return "NFAPI_MSG_BCH_MISSING";
}
else case NFAPI_MSG_INVALID_SFN:
{ return "NFAPI_MSG_INVALID_SFN";
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
case NFAPI_MSG_HI_ERR:
if (++numBadTags > MAX_BAD_TAG) return "NFAPI_MSG_HI_ERR";
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n"); case NFAPI_MSG_TX_ERR:
return 0; return "NFAPI_MSG_TX_ERR";
}
default:
if((end - *ppReadPackedMsg) >= generic_tl.length) return "UNKNOWN";
{ }
// Advance past the unknown TLV }
(*ppReadPackedMsg) += generic_tl.length;
}
else
{
// go to the end
return 0;
}
}
}
}
return 1;
}
int unpack_p7_tlv_list(unpack_p7_tlv_t unpack_fns[], uint16_t size, uint8_t **ppReadPackedMsg, uint8_t* end, nfapi_p7_codec_config_t* config, nfapi_tl_t** ve)
{
nfapi_tl_t generic_tl;
uint8_t numBadTags = 0;
uint16_t idx = 0;
while ((uint8_t*)(*ppReadPackedMsg) < end)
{
// unpack the tl and process the values accordingly
if(unpack_tl(ppReadPackedMsg, &generic_tl, end) == 0)
return 0;
uint8_t tagMatch = 0;
uint8_t* pStartOfValue = *ppReadPackedMsg;
for(idx = 0; idx < size; ++idx)
{
if(unpack_fns[idx].tag == generic_tl.tag)
{
tagMatch = 1;
nfapi_tl_t* tl = (nfapi_tl_t*)(unpack_fns[idx].tlv);
tl->tag = generic_tl.tag;
tl->length = generic_tl.length;
int result = (*unpack_fns[idx].unpack_func)(tl, ppReadPackedMsg, end , config);
if(result == 0)
{
return 0;
}
// check if the length was right;
if(tl->length != (*ppReadPackedMsg - pStartOfValue))
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning tlv tag 0x%x length %d not equal to unpack %d\n", tl->tag, tl->length, (*ppReadPackedMsg - pStartOfValue));
}
}
}
if(tagMatch == 0)
{
if(generic_tl.tag >= NFAPI_VENDOR_EXTENSION_MIN_TAG_VALUE &&
generic_tl.tag <= NFAPI_VENDOR_EXTENSION_MAX_TAG_VALUE)
{
int result = unpack_p7_vendor_extension_tlv(&generic_tl, ppReadPackedMsg, end, config, ve);
if(result == 0)
{
// got to end
return 0;
}
else if(result < 0)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
if (++numBadTags > MAX_BAD_TAG)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
return -1;
}
if((end - *ppReadPackedMsg) >= generic_tl.length)
{
// Advance past the unknown TLV
(*ppReadPackedMsg) += generic_tl.length;
}
else
{
// got ot the dn
return 0;
}
}
}
else
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Unknown TAG value: 0x%04x\n", generic_tl.tag);
if (++numBadTags > MAX_BAD_TAG)
{
NFAPI_TRACE(NFAPI_TRACE_ERROR, "Supplied message has had too many bad tags\n");
return -1;
}
if((end - *ppReadPackedMsg) >= generic_tl.length)
{
// Advance past the unknown TLV
(*ppReadPackedMsg) += generic_tl.length;
}
else
{
// got ot the dn
return 0;
}
}
}
}
return 1;
}
// This intermediate function deals with calculating the length of the value
// and writing into the tlv header.
uint8_t pack_tlv(uint16_t tag, void *tlv, uint8_t **ppWritePackedMsg, uint8_t *end, pack_tlv_fn fn)
{
nfapi_tl_t* tl = (nfapi_tl_t*)tlv;
// If the tag is defined
if(tl->tag == tag)
{
uint8_t* pStartOfTlv = *ppWritePackedMsg;
// write a dumy tlv header
if(pack_tl(tl, ppWritePackedMsg, end) == 0)
return 0;
// Record the start of the value
uint8_t* pStartOfValue = *ppWritePackedMsg;
// pack the tlv value
if(fn(tlv, ppWritePackedMsg, end) == 0)
return 0;
// calculate the length of the value and rewrite the tl header
tl->length = (*ppWritePackedMsg) - pStartOfValue;
// rewrite the header with the correct length
pack_tl(tl, &pStartOfTlv, end);
}
else
{
if(tl->tag != 0)
{
NFAPI_TRACE(NFAPI_TRACE_WARN, "Warning pack_tlv tag 0x%x does not match expected 0x%x\n", tl->tag, tag);
}
else
{
//NFAPI_TRACE(NFAPI_TRACE_ERROR, "Warning pack_tlv tag 0x%x ZERO does not match expected 0x%x\n", tl->tag, tag);
}
}
return 1;
}
const char* nfapi_error_code_to_str(nfapi_error_code_e value)
{
switch(value)
{
case NFAPI_MSG_OK:
return "NFAPI_MSG_OK";
case NFAPI_MSG_INVALID_STATE:
return "NFAPI_MSG_INVALID_STATE";
case NFAPI_MSG_INVALID_CONFIG:
return "NFAPI_MSG_INVALID_CONFIG";
case NFAPI_SFN_OUT_OF_SYNC:
return "NFAPI_SFN_OUT_OF_SYNC";
case NFAPI_MSG_SUBFRAME_ERR:
return "NFAPI_MSG_SUBFRAME_ERR";
case NFAPI_MSG_BCH_MISSING:
return "NFAPI_MSG_BCH_MISSING";
case NFAPI_MSG_INVALID_SFN:
return "NFAPI_MSG_INVALID_SFN";
case NFAPI_MSG_HI_ERR:
return "NFAPI_MSG_HI_ERR";
case NFAPI_MSG_TX_ERR:
return "NFAPI_MSG_TX_ERR";
default:
return "UNKNOWN";
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -373,10 +373,10 @@ char interleave_compact_byte(short *base_interleaver,unsigned char *input, unsig ...@@ -373,10 +373,10 @@ char interleave_compact_byte(short *base_interleaver,unsigned char *input, unsig
short *ptr_intl=base_interleaver; short *ptr_intl=base_interleaver;
#if defined(__x86_64) || defined(__i386__) #if defined(__x86_64) || defined(__i386__)
#ifndef __AVX2__ #ifndef __AVX2__
__m128i tmp; __m128i tmp={0};
uint16_t *systematic2_ptr=(uint16_t *) output; uint16_t *systematic2_ptr=(uint16_t *) output;
#else #else
__m256i tmp; __m256i tmp={0};
uint32_t *systematic2_ptr=(uint32_t *) output; uint32_t *systematic2_ptr=(uint32_t *) output;
#endif #endif
#elif defined(__arm__) #elif defined(__arm__)
......
...@@ -1105,7 +1105,7 @@ uint8_t phy_threegpplte_turbo_decoder16(int16_t *y, ...@@ -1105,7 +1105,7 @@ uint8_t phy_threegpplte_turbo_decoder16(int16_t *y,
uint8_t temp; uint8_t temp;
#if defined(__x86_64__) || defined(__i386__) #if defined(__x86_64__) || defined(__i386__)
__m128i *yp128; __m128i *yp128;
__m128i tmp, zeros=_mm_setzero_si128(); __m128i tmp={0}, zeros=_mm_setzero_si128();
__m128i tmpe; __m128i tmpe;
#elif defined(__arm__) #elif defined(__arm__)
int16x8_t *yp128; int16x8_t *yp128;
......
...@@ -819,7 +819,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y, ...@@ -819,7 +819,7 @@ uint8_t phy_threegpplte_turbo_decoder8(int16_t *y,
#if defined(__x86_64__) || defined(__i386__) #if defined(__x86_64__) || defined(__i386__)
__m128i *yp128; __m128i *yp128;
__m128i tmp128[(n+8)>>3]; __m128i tmp128[(n+8)>>3];
__m128i tmp, zeros=_mm_setzero_si128(); __m128i tmp={0}, zeros=_mm_setzero_si128();
#elif defined(__arm__) #elif defined(__arm__)
int8x16_t *yp128; int8x16_t *yp128;
int8x16_t tmp128[(n+8)>>3]; int8x16_t tmp128[(n+8)>>3];
......
...@@ -35,7 +35,6 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32 ...@@ -35,7 +35,6 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32
#define SCALE 0x3FFF #define SCALE 0x3FFF
static const short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1}; static const short conjugate[8]__attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1};
//static const short conjugate2[8]__attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1};
extern unsigned short dftsizes[34]; extern unsigned short dftsizes[34];
extern int16_t *ul_ref_sigs_rx[30][2][34]; extern int16_t *ul_ref_sigs_rx[30][2][34];
......
...@@ -1234,7 +1234,7 @@ void dlsch_channel_compensation(int **rxdataF_ext, ...@@ -1234,7 +1234,7 @@ void dlsch_channel_compensation(int **rxdataF_ext,
unsigned short rb; unsigned short rb;
unsigned char aatx,aarx,symbol_mod,pilots=0; unsigned char aatx,aarx,symbol_mod,pilots=0;
__m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128; __m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128; __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0};
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) { if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) {
...@@ -1657,11 +1657,11 @@ void dlsch_channel_compensation_core(int **rxdataF_ext, ...@@ -1657,11 +1657,11 @@ void dlsch_channel_compensation_core(int **rxdataF_ext,
int length_mod8 = 0; int length_mod8 = 0;
int length2; int length2;
__m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b, *dl_ch128_2, *rxdataF128,*rxdataF_comp128,*rho128; __m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b, *dl_ch128_2, *rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128; __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0};
int aatx = 0, aarx = 0; int aatx = 0, aarx = 0;
for (aatx=0; aatx<n_tx; aatx++) { for (aatx=0; aatx<n_tx; aatx++) {
__m128i QAM_amp128b; __m128i QAM_amp128b={0};
if (mod_order == 4) { if (mod_order == 4) {
QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10) QAM_amp128 = _mm_set1_epi16(QAM16_n1); // 2/sqrt(10)
...@@ -2411,7 +2411,7 @@ void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms, ...@@ -2411,7 +2411,7 @@ void dlsch_channel_compensation_TM34(LTE_DL_FRAME_PARMS *frame_parms,
int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0; int **rxdataF_comp0 = pdsch_vars->rxdataF_comp0;
int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round]; int **rxdataF_comp1 = pdsch_vars->rxdataF_comp1[harq_pid][round];
unsigned char *pmi_ext = pdsch_vars->pmi_ext; unsigned char *pmi_ext = pdsch_vars->pmi_ext;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128,QAM_amp1_128; __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp0_128={0},QAM_amp1_128={0};
symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol;
if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp))) if ((symbol_mod == 0) || (symbol_mod == (4-frame_parms->Ncp)))
......
...@@ -328,7 +328,7 @@ void mch_channel_compensation(int **rxdataF_ext, ...@@ -328,7 +328,7 @@ void mch_channel_compensation(int **rxdataF_ext,
int aarx,nre,i; int aarx,nre,i;
#if defined(__x86_64__) || defined(__i386__) #if defined(__x86_64__) || defined(__i386__)
__m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128; __m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b; __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
#elif defined(__arm__) #elif defined(__arm__)
#endif #endif
...@@ -455,7 +455,7 @@ void mch_channel_compensation_khz_1dot25(int **rxdataF_ext, ...@@ -455,7 +455,7 @@ void mch_channel_compensation_khz_1dot25(int **rxdataF_ext,
int aarx,nre,i; int aarx,nre,i;
#if defined(__x86_64__) || defined(__i386__) #if defined(__x86_64__) || defined(__i386__)
__m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128; __m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b,*rxdataF128,*rxdataF_comp128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b; __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
#elif defined(__arm__) #elif defined(__arm__)
#endif #endif
/*if ((symbol == 2) || (symbol == 6) || (symbol == 10)) /*if ((symbol == 2) || (symbol == 6) || (symbol == 10))
......
...@@ -52,8 +52,7 @@ ...@@ -52,8 +52,7 @@
void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) {
{
int i; int i;
int r; int r;
...@@ -68,6 +67,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) ...@@ -68,6 +67,7 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch)
free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES); free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES);
ulsch->harq_processes[i]->b = NULL; ulsch->harq_processes[i]->b = NULL;
} }
for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) { for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
if (ulsch->harq_processes[i]->c[r]) { if (ulsch->harq_processes[i]->c[r]) {
free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768); free16(ulsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
...@@ -79,51 +79,47 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch) ...@@ -79,51 +79,47 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch)
ulsch->harq_processes[i] = NULL; ulsch->harq_processes[i] = NULL;
} }
} }
free16(ulsch,sizeof(LTE_UE_ULSCH_t)); free16(ulsch,sizeof(LTE_UE_ULSCH_t));
} }
} }
LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) {
{
LTE_UE_ULSCH_t *ulsch; LTE_UE_ULSCH_t *ulsch;
unsigned char exit_flag = 0,i,j,r; unsigned char exit_flag = 0,i,j,r;
unsigned char bw_scaling =1; unsigned char bw_scaling =1;
switch (N_RB_UL) { switch (N_RB_UL) {
case 6: case 6:
bw_scaling =16; bw_scaling =16;
break; break;
case 25: case 25:
bw_scaling =4; bw_scaling =4;
break; break;
case 50: case 50:
bw_scaling =2; bw_scaling =2;
break; break;
default: default:
bw_scaling =1; bw_scaling =1;
break; break;
} }
ulsch = (LTE_UE_ULSCH_t *)malloc16(sizeof(LTE_UE_ULSCH_t)); ulsch = (LTE_UE_ULSCH_t *)malloc16(sizeof(LTE_UE_ULSCH_t));
if (ulsch) { if (ulsch) {
memset(ulsch,0,sizeof(LTE_UE_ULSCH_t)); memset(ulsch,0,sizeof(LTE_UE_ULSCH_t));
ulsch->Mlimit = 4; ulsch->Mlimit = 4;
for (i=0; i<8; i++) { for (i=0; i<8; i++) {
ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t)); ulsch->harq_processes[i] = (LTE_UL_UE_HARQ_t *)malloc16(sizeof(LTE_UL_UE_HARQ_t));
// printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]); // printf("ulsch->harq_processes[%d] %p\n",i,ulsch->harq_processes[i]);
if (ulsch->harq_processes[i]) { if (ulsch->harq_processes[i]) {
memset(ulsch->harq_processes[i], 0, sizeof(LTE_UL_UE_HARQ_t)); memset(ulsch->harq_processes[i], 0, sizeof(LTE_UL_UE_HARQ_t));
ulsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_ULSCH_PAYLOAD_BYTES/bw_scaling); ulsch->harq_processes[i]->b = (unsigned char *)malloc16(MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
if (ulsch->harq_processes[i]->b) if (ulsch->harq_processes[i]->b)
memset(ulsch->harq_processes[i]->b,0,MAX_ULSCH_PAYLOAD_BYTES/bw_scaling); memset(ulsch->harq_processes[i]->b,0,MAX_ULSCH_PAYLOAD_BYTES/bw_scaling);
...@@ -134,7 +130,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) ...@@ -134,7 +130,7 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag)
if (abstraction_flag==0) { if (abstraction_flag==0) {
for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) { for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
ulsch->harq_processes[i]->c[r] = (unsigned char*)malloc16(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case ulsch->harq_processes[i]->c[r] = (unsigned char *)malloc16(((r==0)?8:0) + 3+768); // account for filler in first segment and CRCs for multiple segment case
if (ulsch->harq_processes[i]->c[r]) if (ulsch->harq_processes[i]->c[r])
memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768); memset(ulsch->harq_processes[i]->c[r],0,((r==0)?8:0) + 3+768);
...@@ -167,8 +163,6 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag) ...@@ -167,8 +163,6 @@ LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag)
LOG_E(PHY,"new_ue_ulsch exit flag, size of %d , %zu\n",exit_flag, sizeof(LTE_UE_ULSCH_t)); LOG_E(PHY,"new_ue_ulsch exit flag, size of %d , %zu\n",exit_flag, sizeof(LTE_UE_ULSCH_t));
free_ue_ulsch(ulsch); free_ue_ulsch(ulsch);
return(NULL); return(NULL);
} }
...@@ -179,15 +173,12 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -179,15 +173,12 @@ uint32_t ulsch_encoding(uint8_t *a,
uint8_t subframe_rx, uint8_t subframe_rx,
uint8_t tmode, uint8_t tmode,
uint8_t control_only_flag, uint8_t control_only_flag,
uint8_t Nbundled) uint8_t Nbundled) {
{
time_stats_t *seg_stats=&ue->ulsch_segmentation_stats; time_stats_t *seg_stats=&ue->ulsch_segmentation_stats;
time_stats_t *rm_stats=&ue->ulsch_rate_matching_stats; time_stats_t *rm_stats=&ue->ulsch_rate_matching_stats;
time_stats_t *te_stats=&ue->ulsch_turbo_encoding_stats; time_stats_t *te_stats=&ue->ulsch_turbo_encoding_stats;
time_stats_t *i_stats=&ue->ulsch_interleaving_stats; time_stats_t *i_stats=&ue->ulsch_interleaving_stats;
time_stats_t *m_stats=&ue->ulsch_multiplexing_stats; time_stats_t *m_stats=&ue->ulsch_multiplexing_stats;
// uint16_t offset; // uint16_t offset;
uint32_t crc=1; uint32_t crc=1;
uint32_t A; uint32_t A;
...@@ -237,7 +228,6 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -237,7 +228,6 @@ uint32_t ulsch_encoding(uint8_t *a,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_IN);
rnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti; rnti = ue->pdcch_vars[ue->current_thread_id[subframe_rx]][eNB_id]->crnti;
fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff); fill_CQI(ulsch,meas,0,harq_pid,ue->frame_parms.N_RB_DL,rnti, tmode,ue->sinr_eff);
LOG_D(PHY,"ULSCH Encoding rnti %x \n", rnti); LOG_D(PHY,"ULSCH Encoding rnti %x \n", rnti);
print_CQI(ulsch->o,ulsch->uci_format,0,ue->frame_parms.N_RB_DL); print_CQI(ulsch->o,ulsch->uci_format,0,ue->frame_parms.N_RB_DL);
...@@ -246,6 +236,7 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -246,6 +236,7 @@ uint32_t ulsch_encoding(uint8_t *a,
//LOG_I(PHY,"XXX saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi)); //LOG_I(PHY,"XXX saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi));
dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi;
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ULSCH_ENCODING_FILL_CQI, VCD_FUNCTION_OUT);
} }
...@@ -268,17 +259,15 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -268,17 +259,15 @@ uint32_t ulsch_encoding(uint8_t *a,
if (control_only_flag == 0) { if (control_only_flag == 0) {
A=ulsch->harq_processes[harq_pid]->TBS; A=ulsch->harq_processes[harq_pid]->TBS;
Q_m = get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs); Q_m = get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs);
ulsch->harq_processes[harq_pid]->control_only = 0; ulsch->harq_processes[harq_pid]->control_only = 0;
#ifdef DEBUG_ULSCH_CODING #ifdef DEBUG_ULSCH_CODING
printf("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n", printf("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n",
ulsch->harq_processes[harq_pid]->TBS, ulsch->harq_processes[harq_pid]->TBS,
Q_m, Q_m,
ulsch->harq_processes[harq_pid]->mcs, ulsch->harq_processes[harq_pid]->mcs,
harq_pid, harq_pid,
ulsch->harq_processes[harq_pid]->round, ulsch->harq_processes[harq_pid]->round,
ulsch->harq_processes[harq_pid]->rvidx); ulsch->harq_processes[harq_pid]->rvidx);
for (i=0; i<ulsch->harq_processes[harq_pid]->O_ACK; i++) for (i=0; i<ulsch->harq_processes[harq_pid]->O_ACK; i++)
printf("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]); printf("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]);
...@@ -301,16 +290,13 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -301,16 +290,13 @@ uint32_t ulsch_encoding(uint8_t *a,
#endif #endif
if (ulsch->harq_processes[harq_pid]->round == 0) { // this is a new packet if (ulsch->harq_processes[harq_pid]->round == 0) { // this is a new packet
start_meas(seg_stats); start_meas(seg_stats);
// Add 24-bit crc (polynomial A) to payload // Add 24-bit crc (polynomial A) to payload
crc = crc24a(a, crc = crc24a(a,
A)>>8; A)>>8;
a[A>>3] = ((uint8_t *)&crc)[2];
a[A>>3] = ((uint8_t*)&crc)[2]; a[1+(A>>3)] = ((uint8_t *)&crc)[1];
a[1+(A>>3)] = ((uint8_t*)&crc)[1]; a[2+(A>>3)] = ((uint8_t *)&crc)[0];
a[2+(A>>3)] = ((uint8_t*)&crc)[0];
ulsch->harq_processes[harq_pid]->B = A+24; ulsch->harq_processes[harq_pid]->B = A+24;
ulsch->harq_processes[harq_pid]->b = a; ulsch->harq_processes[harq_pid]->b = a;
lte_segmentation(ulsch->harq_processes[harq_pid]->b, lte_segmentation(ulsch->harq_processes[harq_pid]->b,
...@@ -322,7 +308,6 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -322,7 +308,6 @@ uint32_t ulsch_encoding(uint8_t *a,
&ulsch->harq_processes[harq_pid]->Kplus, &ulsch->harq_processes[harq_pid]->Kplus,
&ulsch->harq_processes[harq_pid]->Kminus, &ulsch->harq_processes[harq_pid]->Kminus,
&ulsch->harq_processes[harq_pid]->F); &ulsch->harq_processes[harq_pid]->F);
stop_meas(seg_stats); stop_meas(seg_stats);
for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) { for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) {
...@@ -332,25 +317,20 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -332,25 +317,20 @@ uint32_t ulsch_encoding(uint8_t *a,
Kr = ulsch->harq_processes[harq_pid]->Kplus; Kr = ulsch->harq_processes[harq_pid]->Kplus;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
#ifdef DEBUG_ULSCH_CODING #ifdef DEBUG_ULSCH_CODING
printf("Generating Code Segment %d (%d bits)\n",r,Kr); printf("Generating Code Segment %d (%d bits)\n",r,Kr);
// generate codewords // generate codewords
printf("bits_per_codeword (Kr)= %d\n",Kr); printf("bits_per_codeword (Kr)= %d\n",Kr);
printf("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb); printf("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
printf("Ncp %d\n",frame_parms->Ncp); printf("Ncp %d\n",frame_parms->Ncp);
printf("Qm %d\n",Q_m); printf("Qm %d\n",Q_m);
#endif #endif
// offset=0; // offset=0;
start_meas(te_stats); start_meas(te_stats);
encoder(ulsch->harq_processes[harq_pid]->c[r], encoder(ulsch->harq_processes[harq_pid]->c[r],
Kr>>3, Kr>>3,
&ulsch->harq_processes[harq_pid]->d[r][96], &ulsch->harq_processes[harq_pid]->d[r][96],
(r==0) ? ulsch->harq_processes[harq_pid]->F : 0 (r==0) ? ulsch->harq_processes[harq_pid]->F : 0
); );
stop_meas(te_stats); stop_meas(te_stats);
#ifdef DEBUG_ULSCH_CODING #ifdef DEBUG_ULSCH_CODING
...@@ -366,7 +346,6 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -366,7 +346,6 @@ uint32_t ulsch_encoding(uint8_t *a,
ulsch->harq_processes[harq_pid]->w[r]); ulsch->harq_processes[harq_pid]->w[r]);
stop_meas(i_stats); stop_meas(i_stats);
} }
} }
if (ulsch->harq_processes[harq_pid]->C == 0) { if (ulsch->harq_processes[harq_pid]->C == 0) {
...@@ -392,7 +371,6 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -392,7 +371,6 @@ uint32_t ulsch_encoding(uint8_t *a,
ulsch->harq_processes[harq_pid]->sumKr = sumKr; ulsch->harq_processes[harq_pid]->sumKr = sumKr;
// Compute Q_ri (p. 23 36-212) // Compute Q_ri (p. 23 36-212)
Qprime = ulsch->O_RI*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_ri_times8; Qprime = ulsch->O_RI*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_ri_times8;
if (Qprime > 0) { if (Qprime > 0) {
...@@ -407,7 +385,6 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -407,7 +385,6 @@ uint32_t ulsch_encoding(uint8_t *a,
Q_RI = Q_m*Qprime; Q_RI = Q_m*Qprime;
Qprime_RI = Qprime; Qprime_RI = Qprime;
// Compute Q_ack (p. 23 36-212) // Compute Q_ack (p. 23 36-212)
Qprime = ulsch->harq_processes[harq_pid]->O_ACK*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_harqack_times8; Qprime = ulsch->harq_processes[harq_pid]->O_ACK*ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_harqack_times8;
...@@ -423,20 +400,18 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -423,20 +400,18 @@ uint32_t ulsch_encoding(uint8_t *a,
Q_ACK = Qprime * Q_m; Q_ACK = Qprime * Q_m;
Qprime_ACK = Qprime; Qprime_ACK = Qprime;
LOG_D(PHY,"UE (%x/%d) O_ACK %d, Mcs_initial %d, Nsymb_initial %d, beta_offset_harqack*8 %d, sum Kr %d, Qprime_ACK %d, Q_ACK %d\n", LOG_D(PHY,"UE (%x/%d) O_ACK %d, Mcs_initial %d, Nsymb_initial %d, beta_offset_harqack*8 %d, sum Kr %d, Qprime_ACK %d, Q_ACK %d\n",
rnti, harq_pid, rnti, harq_pid,
ulsch->harq_processes[harq_pid]->O_ACK, ulsch->harq_processes[harq_pid]->O_ACK,
ulsch->harq_processes[harq_pid]->Msc_initial, ulsch->harq_processes[harq_pid]->Msc_initial,
ulsch->harq_processes[harq_pid]->Nsymb_initial, ulsch->harq_processes[harq_pid]->Nsymb_initial,
ulsch->beta_offset_harqack_times8, ulsch->beta_offset_harqack_times8,
sumKr, sumKr,
Qprime_ACK, Qprime_ACK,
Q_ACK); Q_ACK);
// Compute Q_cqi, assume O>11, p. 26 36-212 // Compute Q_cqi, assume O>11, p. 26 36-212
if (control_only_flag == 0) { if (control_only_flag == 0) {
if (ulsch->O < 12) if (ulsch->O < 12)
L=0; L=0;
else else
...@@ -446,13 +421,13 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -446,13 +421,13 @@ uint32_t ulsch_encoding(uint8_t *a,
Qprime = (ulsch->O + L) * ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_cqi_times8; Qprime = (ulsch->O + L) * ulsch->harq_processes[harq_pid]->Msc_initial*ulsch->harq_processes[harq_pid]->Nsymb_initial * ulsch->beta_offset_cqi_times8;
else else
Qprime = 0; Qprime = 0;
LOG_D(PHY,"Qprime %d, O_RI %d + %d, Msc %d, Nym %d beta %d\n",
Qprime,
ulsch->O, L,
ulsch->harq_processes[harq_pid]->Msc_initial,
ulsch->harq_processes[harq_pid]->Nsymb_initial,
ulsch->beta_offset_cqi_times8);
LOG_D(PHY,"Qprime %d, O_RI %d + %d, Msc %d, Nym %d beta %d\n",
Qprime,
ulsch->O, L,
ulsch->harq_processes[harq_pid]->Msc_initial,
ulsch->harq_processes[harq_pid]->Nsymb_initial,
ulsch->beta_offset_cqi_times8);
if (Qprime > 0) { if (Qprime > 0) {
if ((Qprime % (8*sumKr)) > 0) if ((Qprime % (8*sumKr)) > 0)
...@@ -463,31 +438,29 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -463,31 +438,29 @@ uint32_t ulsch_encoding(uint8_t *a,
G = ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch); G = ulsch->harq_processes[harq_pid]->nb_rb * (12 * Q_m) * (ulsch->Nsymb_pusch);
LOG_D(PHY,"G: rb %d * ( 12 * Qm %d ) * nsymb %d, Qprime %d, O_RI %d\n", ulsch->harq_processes[harq_pid]->nb_rb, Q_m, ulsch->Nsymb_pusch, Qprime, ulsch->O_RI); LOG_D(PHY,"G: rb %d * ( 12 * Qm %d ) * nsymb %d, Qprime %d, O_RI %d\n", ulsch->harq_processes[harq_pid]->nb_rb, Q_m, ulsch->Nsymb_pusch, Qprime, ulsch->O_RI);
if (Qprime > (G - ulsch->O_RI)) if (Qprime > (G - ulsch->O_RI))
Qprime = G - ulsch->O_RI; Qprime = G - ulsch->O_RI;
Q_CQI = Q_m * Qprime; Q_CQI = Q_m * Qprime;
Qprime_CQI = Qprime; Qprime_CQI = Qprime;
G = G - Q_RI - Q_CQI; G = G - Q_RI - Q_CQI;
LOG_D(PHY,"new G: %d, Q_RI %d Q_CQI %d\n", G , Q_RI , Q_CQI); LOG_D(PHY,"new G: %d, Q_RI %d Q_CQI %d\n", G, Q_RI, Q_CQI);
ulsch->harq_processes[harq_pid]->G = G; ulsch->harq_processes[harq_pid]->G = G;
/* /*
LOG_I(PHY,"ULSCH Encoding G %d, Q_RI %d (O_RI%d, Msc_initial %d, Nsymb_initial%d, beta_offset_ri_times8 %d), Q_CQI %d, Q_ACK %d \n",G,Q_RI,ulsch->O_RI,ulsch->harq_processes[harq_pid]->Msc_initial,ulsch->harq_processes[harq_pid]->Nsymb_initial,ulsch->beta_offset_ri_times8,Q_CQI,Q_ACK); LOG_I(PHY,"ULSCH Encoding G %d, Q_RI %d (O_RI%d, Msc_initial %d, Nsymb_initial%d, beta_offset_ri_times8 %d), Q_CQI %d, Q_ACK %d \n",G,Q_RI,ulsch->O_RI,ulsch->harq_processes[harq_pid]->Msc_initial,ulsch->harq_processes[harq_pid]->Nsymb_initial,ulsch->beta_offset_ri_times8,Q_CQI,Q_ACK);
LOG_I(PHY,"ULSCH Encoding (Nid_cell %d, rnti %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d\n", LOG_I(PHY,"ULSCH Encoding (Nid_cell %d, rnti %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d\n",
frame_parms->Nid_cell,ulsch->rnti, frame_parms->Nid_cell,ulsch->rnti,
harq_pid, harq_pid,
ulsch->harq_processes[harq_pid]->round, ulsch->harq_processes[harq_pid]->round,
ulsch->harq_processes[harq_pid]->rvidx, ulsch->harq_processes[harq_pid]->rvidx,
ulsch->harq_processes[harq_pid]->mcs, ulsch->harq_processes[harq_pid]->mcs,
ulsch->O_RI, ulsch->O_RI,
ulsch->harq_processes[harq_pid]->O_ACK, ulsch->harq_processes[harq_pid]->O_ACK,
G); G);
*/ */
if ((int)G < 0) { if ((int)G < 0) {
LOG_E(PHY,"FATAL: ulsch_coding.c G < 0 (%d) : Q_RI %d, Q_CQI %d, O %d, betaCQI_times8 %d)\n",G,Q_RI,Q_CQI,ulsch->O,ulsch->beta_offset_cqi_times8); LOG_E(PHY,"FATAL: ulsch_coding.c G < 0 (%d) : Q_RI %d, Q_CQI %d, O %d, betaCQI_times8 %d)\n",G,Q_RI,Q_CQI,ulsch->O,ulsch->beta_offset_cqi_times8);
...@@ -495,26 +468,21 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -495,26 +468,21 @@ uint32_t ulsch_encoding(uint8_t *a,
return(-1); return(-1);
} }
// Data and control multiplexing (5.2.2.7 36-212) // Data and control multiplexing (5.2.2.7 36-212)
H = G + Q_CQI; H = G + Q_CQI;
Hprime = H/Q_m; Hprime = H/Q_m;
// Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the // Fill in the "e"-sequence from 36-212, V8.6 2009-03, p. 16-17 (for each "e") and concatenate the
// outputs for each code segment, see Section 5.1.5 p.20 // outputs for each code segment, see Section 5.1.5 p.20
for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) { for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) {
#ifdef DEBUG_ULSCH_CODING #ifdef DEBUG_ULSCH_CODING
printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n", printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
r, r,
G, G,
Kr*3, Kr*3,
Q_m,ulsch->harq_processes[harq_pid]->nb_rb); Q_m,ulsch->harq_processes[harq_pid]->nb_rb);
#endif #endif
start_meas(rm_stats); start_meas(rm_stats);
r_offset += lte_rate_matching_turbo(ulsch->harq_processes[harq_pid]->RTC[r], r_offset += lte_rate_matching_turbo(ulsch->harq_processes[harq_pid]->RTC[r],
G, G,
...@@ -529,7 +497,7 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -529,7 +497,7 @@ uint32_t ulsch_encoding(uint8_t *a,
1, 1,
r, r,
ulsch->harq_processes[harq_pid]->nb_rb); ulsch->harq_processes[harq_pid]->nb_rb);
//ulsch->harq_processes[harq_pid]->mcs); // r //ulsch->harq_processes[harq_pid]->mcs); // r
stop_meas(rm_stats); stop_meas(rm_stats);
#ifdef DEBUG_ULSCH_CODING #ifdef DEBUG_ULSCH_CODING
...@@ -544,7 +512,6 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -544,7 +512,6 @@ uint32_t ulsch_encoding(uint8_t *a,
Hprime = H/Q_m; Hprime = H/Q_m;
} }
// Do CQI coding // Do CQI coding
if ((ulsch->O>1) && (ulsch->O < 12)) { if ((ulsch->O>1) && (ulsch->O < 12)) {
LOG_E(PHY,"short CQI sizes not supported yet\n"); LOG_E(PHY,"short CQI sizes not supported yet\n");
...@@ -558,23 +525,18 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -558,23 +525,18 @@ uint32_t ulsch_encoding(uint8_t *a,
printf("crc(cqi) tx : %x\n",crc); printf("crc(cqi) tx : %x\n",crc);
#endif #endif
memset((void *)&ulsch->o_d[0],LTE_NULL,96); memset((void *)&ulsch->o_d[0],LTE_NULL,96);
ccodelte_encode(ulsch->O, ccodelte_encode(ulsch->O,
1, 1,
o_flip, o_flip,
&ulsch->o_d[96], &ulsch->o_d[96],
0); 0);
o_RCC = sub_block_interleaving_cc(8+ulsch->O, o_RCC = sub_block_interleaving_cc(8+ulsch->O,
&ulsch->o_d[96], &ulsch->o_d[96],
ulsch->o_w); ulsch->o_w);
lte_rate_matching_cc(o_RCC, lte_rate_matching_cc(o_RCC,
Q_CQI, Q_CQI,
ulsch->o_w, ulsch->o_w,
ulsch->q); ulsch->q);
} }
i=0; i=0;
...@@ -582,29 +544,29 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -582,29 +544,29 @@ uint32_t ulsch_encoding(uint8_t *a,
// Do RI coding // Do RI coding
if (ulsch->O_RI == 1) { if (ulsch->O_RI == 1) {
switch (Q_m) { switch (Q_m) {
case 2: case 2:
ulsch->q_RI[0] = ulsch->o_RI[0]; ulsch->q_RI[0] = ulsch->o_RI[0];
ulsch->q_RI[1] = PUSCH_y;//ulsch->o_RI[0]; ulsch->q_RI[1] = PUSCH_y;//ulsch->o_RI[0];
len_RI=2; len_RI=2;
break; break;
case 4: case 4:
ulsch->q_RI[0] = ulsch->o_RI[0]; ulsch->q_RI[0] = ulsch->o_RI[0];
ulsch->q_RI[1] = PUSCH_y;//1; ulsch->q_RI[1] = PUSCH_y;//1;
ulsch->q_RI[2] = PUSCH_x;//ulsch->o_RI[0]; ulsch->q_RI[2] = PUSCH_x;//ulsch->o_RI[0];
ulsch->q_RI[3] = PUSCH_x;//1; ulsch->q_RI[3] = PUSCH_x;//1;
len_RI=4; len_RI=4;
break; break;
case 6: case 6:
ulsch->q_RI[0] = ulsch->o_RI[0]; ulsch->q_RI[0] = ulsch->o_RI[0];
ulsch->q_RI[1] = PUSCH_y;//1; ulsch->q_RI[1] = PUSCH_y;//1;
ulsch->q_RI[2] = PUSCH_x;//1; ulsch->q_RI[2] = PUSCH_x;//1;
ulsch->q_RI[3] = PUSCH_x;//ulsch->o_RI[0]; ulsch->q_RI[3] = PUSCH_x;//ulsch->o_RI[0];
ulsch->q_RI[4] = PUSCH_x;//1; ulsch->q_RI[4] = PUSCH_x;//1;
ulsch->q_RI[5] = PUSCH_x;//1; ulsch->q_RI[5] = PUSCH_x;//1;
len_RI=6; len_RI=6;
break; break;
} }
} else if (ulsch->O_RI>1) { } else if (ulsch->O_RI>1) {
LOG_E(PHY,"RI cannot be more than 1 bit yet\n"); LOG_E(PHY,"RI cannot be more than 1 bit yet\n");
...@@ -616,35 +578,35 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -616,35 +578,35 @@ uint32_t ulsch_encoding(uint8_t *a,
wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3); wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3);
#ifdef DEBUG_ULSCH_CODING #ifdef DEBUG_ULSCH_CODING
printf("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n", printf("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n",
ulsch->bundling,Nbundled,wACK_idx); ulsch->bundling,Nbundled,wACK_idx);
#endif #endif
// 1-bit ACK/NAK // 1-bit ACK/NAK
if (ulsch->harq_processes[harq_pid]->O_ACK == 1) { if (ulsch->harq_processes[harq_pid]->O_ACK == 1) {
switch (Q_m) { switch (Q_m) {
case 2: case 2:
ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);//ulsch->o_ACK[0]; ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);//ulsch->o_ACK[0];
len_ACK = 2; len_ACK = 2;
break; break;
case 4: case 4:
ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1); ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);
ulsch->q_ACK[2] = PUSCH_x; ulsch->q_ACK[2] = PUSCH_x;
ulsch->q_ACK[3] = PUSCH_x; ulsch->q_ACK[3] = PUSCH_x;
len_ACK = 4; len_ACK = 4;
break; break;
case 6: case 6:
ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1); ulsch->q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : ((ulsch->o_ACK[0]+wACK[wACK_idx][1])&1);
ulsch->q_ACK[2] = PUSCH_x; ulsch->q_ACK[2] = PUSCH_x;
ulsch->q_ACK[3] = PUSCH_x; ulsch->q_ACK[3] = PUSCH_x;
ulsch->q_ACK[4] = PUSCH_x; ulsch->q_ACK[4] = PUSCH_x;
ulsch->q_ACK[6] = PUSCH_x; ulsch->q_ACK[6] = PUSCH_x;
len_ACK = 6; len_ACK = 6;
break; break;
} }
} }
...@@ -653,56 +615,53 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -653,56 +615,53 @@ uint32_t ulsch_encoding(uint8_t *a,
ack_parity = (ulsch->o_ACK[0]+ulsch->o_ACK[1])&1; ack_parity = (ulsch->o_ACK[0]+ulsch->o_ACK[1])&1;
switch (Q_m) { switch (Q_m) {
case 2: case 2:
ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1; ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
ulsch->q_ACK[2] = (ack_parity+wACK[wACK_idx][0])&1; ulsch->q_ACK[2] = (ack_parity+wACK[wACK_idx][0])&1;
ulsch->q_ACK[3] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1; ulsch->q_ACK[3] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
ulsch->q_ACK[4] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1; ulsch->q_ACK[4] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
ulsch->q_ACK[5] = (ack_parity+wACK[wACK_idx][1])&1; ulsch->q_ACK[5] = (ack_parity+wACK[wACK_idx][1])&1;
len_ACK = 6; len_ACK = 6;
break; break;
case 4: case 4:
ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1; ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
ulsch->q_ACK[2] = PUSCH_x; ulsch->q_ACK[2] = PUSCH_x;
ulsch->q_ACK[3] = PUSCH_x;//1; ulsch->q_ACK[3] = PUSCH_x;//1;
ulsch->q_ACK[4] = (ack_parity+wACK[wACK_idx][0])&1; ulsch->q_ACK[4] = (ack_parity+wACK[wACK_idx][0])&1;
ulsch->q_ACK[5] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1; ulsch->q_ACK[5] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
ulsch->q_ACK[6] = PUSCH_x; ulsch->q_ACK[6] = PUSCH_x;
ulsch->q_ACK[7] = PUSCH_x;//1; ulsch->q_ACK[7] = PUSCH_x;//1;
ulsch->q_ACK[8] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1; ulsch->q_ACK[8] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
ulsch->q_ACK[9] = (ack_parity+wACK[wACK_idx][1])&1; ulsch->q_ACK[9] = (ack_parity+wACK[wACK_idx][1])&1;
ulsch->q_ACK[10] = PUSCH_x; ulsch->q_ACK[10] = PUSCH_x;
ulsch->q_ACK[11] = PUSCH_x;//1; ulsch->q_ACK[11] = PUSCH_x;//1;
len_ACK = 12; len_ACK = 12;
break; break;
case 6: case 6:
ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1; ulsch->q_ACK[0] = (ulsch->o_ACK[0]+wACK[wACK_idx][0])&1;
ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1; ulsch->q_ACK[1] = (ulsch->o_ACK[1]+wACK[wACK_idx][0])&1;
ulsch->q_ACK[2] = PUSCH_x; ulsch->q_ACK[2] = PUSCH_x;
ulsch->q_ACK[3] = PUSCH_x; ulsch->q_ACK[3] = PUSCH_x;
ulsch->q_ACK[4] = PUSCH_x; ulsch->q_ACK[4] = PUSCH_x;
ulsch->q_ACK[5] = PUSCH_x; ulsch->q_ACK[5] = PUSCH_x;
ulsch->q_ACK[6] = (ack_parity+wACK[wACK_idx][0])&1;
ulsch->q_ACK[6] = (ack_parity+wACK[wACK_idx][0])&1; ulsch->q_ACK[7] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1;
ulsch->q_ACK[7] = (ulsch->o_ACK[0]+wACK[wACK_idx][1])&1; ulsch->q_ACK[8] = PUSCH_x;
ulsch->q_ACK[8] = PUSCH_x; ulsch->q_ACK[9] = PUSCH_x;
ulsch->q_ACK[9] = PUSCH_x; ulsch->q_ACK[10] = PUSCH_x;
ulsch->q_ACK[10] = PUSCH_x; ulsch->q_ACK[11] = PUSCH_x;
ulsch->q_ACK[11] = PUSCH_x; ulsch->q_ACK[12] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1;
ulsch->q_ACK[13] = (ack_parity+wACK[wACK_idx][1])&1;
ulsch->q_ACK[12] = (ulsch->o_ACK[1]+wACK[wACK_idx][1])&1; ulsch->q_ACK[14] = PUSCH_x;
ulsch->q_ACK[13] = (ack_parity+wACK[wACK_idx][1])&1; ulsch->q_ACK[15] = PUSCH_x;
ulsch->q_ACK[14] = PUSCH_x; ulsch->q_ACK[16] = PUSCH_x;
ulsch->q_ACK[15] = PUSCH_x; ulsch->q_ACK[17] = PUSCH_x;
ulsch->q_ACK[16] = PUSCH_x; len_ACK = 18;
ulsch->q_ACK[17] = PUSCH_x; break;
len_ACK = 18;
break;
} }
} }
...@@ -712,23 +671,17 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -712,23 +671,17 @@ uint32_t ulsch_encoding(uint8_t *a,
return(-1); return(-1);
} }
// channel multiplexing/interleaving // channel multiplexing/interleaving
start_meas(m_stats); start_meas(m_stats);
Hpp = Hprime + Q_RI; Hpp = Hprime + Q_RI;
Cmux = ulsch->Nsymb_pusch; Cmux = ulsch->Nsymb_pusch;
Rmux = Hpp*Q_m/Cmux; Rmux = Hpp*Q_m/Cmux;
Rmux_prime = Rmux/Q_m; Rmux_prime = Rmux/Q_m;
Qprime_RI = Q_RI / Q_m; Qprime_RI = Q_RI / Q_m;
Qprime_ACK = Q_ACK / Q_m; Qprime_ACK = Q_ACK / Q_m;
Qprime_CQI = Q_CQI / Q_m; Qprime_CQI = Q_CQI / Q_m;
// printf("Qprime_CQI = %d\n",Qprime_CQI); // printf("Qprime_CQI = %d\n",Qprime_CQI);
// RI BITS // RI BITS
memset(y,LTE_NULL,Q_m*Hpp); memset(y,LTE_NULL,Q_m*Hpp);
if (frame_parms->Ncp == 0) if (frame_parms->Ncp == 0)
...@@ -747,10 +700,8 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -747,10 +700,8 @@ uint32_t ulsch_encoding(uint8_t *a,
} }
j=(j+3)&3; j=(j+3)&3;
} }
// CQI and Data bits // CQI and Data bits
j=0; j=0;
/* /*
...@@ -775,7 +726,6 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -775,7 +726,6 @@ uint32_t ulsch_encoding(uint8_t *a,
*/ */
for (i=0; i<Qprime_CQI; i++) { for (i=0; i<Qprime_CQI; i++) {
while (y[Q_m*j] != LTE_NULL) j++; while (y[Q_m*j] != LTE_NULL) j++;
for (q=0; q<Q_m; q++) { for (q=0; q<Q_m; q++) {
...@@ -789,47 +739,44 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -789,47 +739,44 @@ uint32_t ulsch_encoding(uint8_t *a,
j2 = j*Q_m; j2 = j*Q_m;
switch (Q_m) { switch (Q_m) {
case 2:
for (iprime=0; iprime<(Hprime-Qprime_CQI)<<1; iprime+=2) {
while (y[j2] != LTE_NULL) j2+=2;
case 2: y[j2] = ulsch->e[iprime];
y[1+j2] = ulsch->e[1+iprime];
for (iprime=0; iprime<(Hprime-Qprime_CQI)<<1; iprime+=2) { j2+=2;
while (y[j2] != LTE_NULL) j2+=2; }
y[j2] = ulsch->e[iprime];
y[1+j2] = ulsch->e[1+iprime];
j2+=2;
}
break;
case 4:
for (iprime=0; iprime<(Hprime-Qprime_CQI)<<2; iprime+=4) {
while (y[j2] != LTE_NULL) j2+=4;
y[j2] = ulsch->e[iprime];
y[1+j2] = ulsch->e[1+iprime];
y[2+j2] = ulsch->e[2+iprime];
y[3+j2] = ulsch->e[3+iprime];
j2+=4;
}
break; break;
case 6: case 4:
for (iprime=0; iprime<(Hprime-Qprime_CQI)*6; iprime+=6) { for (iprime=0; iprime<(Hprime-Qprime_CQI)<<2; iprime+=4) {
while (y[j2] != LTE_NULL) j2+=6; while (y[j2] != LTE_NULL) j2+=4;
y[j2] = ulsch->e[iprime];
y[1+j2] = ulsch->e[1+iprime];
y[2+j2] = ulsch->e[2+iprime];
y[3+j2] = ulsch->e[3+iprime];
j2+=4;
}
y[j2] = ulsch->e[iprime]; break;
y[1+j2] = ulsch->e[1+iprime];
y[2+j2] = ulsch->e[2+iprime];
y[3+j2] = ulsch->e[3+iprime];
y[4+j2] = ulsch->e[4+iprime];
y[5+j2] = ulsch->e[5+iprime];
j2+=6;
}
break; case 6:
for (iprime=0; iprime<(Hprime-Qprime_CQI)*6; iprime+=6) {
while (y[j2] != LTE_NULL) j2+=6;
y[j2] = ulsch->e[iprime];
y[1+j2] = ulsch->e[1+iprime];
y[2+j2] = ulsch->e[2+iprime];
y[3+j2] = ulsch->e[3+iprime];
y[4+j2] = ulsch->e[4+iprime];
y[5+j2] = ulsch->e[5+iprime];
j2+=6;
}
break;
} }
// HARQ-ACK Bits (Note these overwrite some bits) // HARQ-ACK Bits (Note these overwrite some bits)
...@@ -848,57 +795,56 @@ uint32_t ulsch_encoding(uint8_t *a, ...@@ -848,57 +795,56 @@ uint32_t ulsch_encoding(uint8_t *a,
y[q+(Q_m*((r*Cmux) + columnset[j]))] = ulsch->q_ACK[(q+(Q_m*i))%len_ACK]; y[q+(Q_m*((r*Cmux) + columnset[j]))] = ulsch->q_ACK[(q+(Q_m*i))%len_ACK];
#ifdef DEBUG_ULSCH_CODING #ifdef DEBUG_ULSCH_CODING
printf("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i), printf("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i),
q+(Q_m*((r*Cmux) + columnset[j])),ulsch->q_ACK[(q+(Q_m*i))%len_ACK], q+(Q_m*((r*Cmux) + columnset[j])),ulsch->q_ACK[(q+(Q_m*i))%len_ACK],
i,r*Cmux,columnset[j]); i,r*Cmux,columnset[j]);
#endif #endif
} }
j=(j+3)&3; j=(j+3)&3;
} }
// write out buffer // write out buffer
j=0; j=0;
switch (Q_m) { switch (Q_m) {
case 2: case 2:
for (i=0; i<Cmux; i++) for (i=0; i<Cmux; i++)
for (r=0; r<Rmux_prime; r++) { for (r=0; r<Rmux_prime; r++) {
yptr=&y[((r*Cmux)+i)<<1]; yptr=&y[((r*Cmux)+i)<<1];
ulsch->h[j++] = *yptr++; ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++; ulsch->h[j++] = *yptr++;
} }
break; break;
case 4: case 4:
for (i=0; i<Cmux; i++) for (i=0; i<Cmux; i++)
for (r=0; r<Rmux_prime; r++) { for (r=0; r<Rmux_prime; r++) {
yptr = &y[((r*Cmux)+i)<<2]; yptr = &y[((r*Cmux)+i)<<2];
ulsch->h[j++] = *yptr++; ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++; ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++; ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++; ulsch->h[j++] = *yptr++;
} }
break; break;
case 6:
for (i=0; i<Cmux; i++)
for (r=0; r<Rmux_prime; r++) {
yptr = &y[((r*Cmux)+i)*6];
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
}
break; case 6:
for (i=0; i<Cmux; i++)
for (r=0; r<Rmux_prime; r++) {
yptr = &y[((r*Cmux)+i)*6];
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
ulsch->h[j++] = *yptr++;
}
default: break;
break;
default:
break;
} }
stop_meas(m_stats); stop_meas(m_stats);
......
...@@ -629,7 +629,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext, ...@@ -629,7 +629,7 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
unsigned char aatx,aarx; unsigned char aatx,aarx;
char nb_antennas_ue_tx = 1; char nb_antennas_ue_tx = 1;
__m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128; __m128i *ul_ch128,*ul_ch128_2,*ul_ch_mag128,*ul_ch_mag128b,*rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b; __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
QAM_amp128b = _mm_setzero_si128(); QAM_amp128b = _mm_setzero_si128();
for (aatx=0; aatx<nb_antennas_ue_tx; aatx++) { for (aatx=0; aatx<nb_antennas_ue_tx; aatx++) {
......
...@@ -60,23 +60,22 @@ int nbDlProcessing =0; ...@@ -60,23 +60,22 @@ int nbDlProcessing =0;
static tpool_t pool_dl; static tpool_t pool_dl;
//extern double cpuf; //extern double cpuf;
void init_dlsch_tpool(uint8_t num_dlsch_threads) void init_dlsch_tpool(uint8_t num_dlsch_threads) {
{ if( num_dlsch_threads==0)
if( num_dlsch_threads==0) return;
return;
char *params=calloc(1,(num_dlsch_threads*3)+1); char *params=calloc(1,(num_dlsch_threads*3)+1);
for (int i=0; i<num_dlsch_threads; i++) { for (int i=0; i<num_dlsch_threads; i++) {
memcpy(params+(i*3),"-1,",3); memcpy(params+(i*3),"-1,",3);
} }
initNamedTpool(params, &pool_dl, false,"dlsch"); initNamedTpool(params, &pool_dl, false,"dlsch");
free(params); free(params);
} }
void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) {
{
int i,r; int i,r;
uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated
NR_UE_DLSCH_t *dlsch=*dlschptr; NR_UE_DLSCH_t *dlsch=*dlschptr;
...@@ -85,8 +84,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) ...@@ -85,8 +84,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
if (N_RB_DL != 273) { if (N_RB_DL != 273) {
a_segments = a_segments*N_RB_DL; a_segments = a_segments*N_RB_DL;
a_segments = a_segments/273 +1; a_segments = a_segments/273 +1;
} }
for (i=0; i<dlsch->Mdlharq; i++) { for (i=0; i<dlsch->Mdlharq; i++) {
if (dlsch->harq_processes[i]) { if (dlsch->harq_processes[i]) {
...@@ -105,7 +103,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) ...@@ -105,7 +103,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
free16(dlsch->harq_processes[i]->d[r],(5*8448)*sizeof(short)); free16(dlsch->harq_processes[i]->d[r],(5*8448)*sizeof(short));
dlsch->harq_processes[i]->d[r] = NULL; dlsch->harq_processes[i]->d[r] = NULL;
} }
for (r=0; r<a_segments; r++) for (r=0; r<a_segments; r++)
if (dlsch->harq_processes[i]->w[r]) { if (dlsch->harq_processes[i]->w[r]) {
free16(dlsch->harq_processes[i]->w[r],(5*8448)*sizeof(short)); free16(dlsch->harq_processes[i]->w[r],(5*8448)*sizeof(short));
...@@ -113,7 +111,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) ...@@ -113,7 +111,7 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
} }
for (r=0; r<a_segments; r++) { for (r=0; r<a_segments; r++) {
if (dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]){ if (dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]) {
nrLDPC_free_mem(dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]); nrLDPC_free_mem(dlsch->harq_processes[i]->p_nrLDPC_procBuf[r]);
dlsch->harq_processes[i]->p_nrLDPC_procBuf[r] = NULL; dlsch->harq_processes[i]->p_nrLDPC_procBuf[r] = NULL;
} }
...@@ -123,27 +121,23 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL) ...@@ -123,27 +121,23 @@ void free_nr_ue_dlsch(NR_UE_DLSCH_t **dlschptr,uint8_t N_RB_DL)
dlsch->harq_processes[i] = NULL; dlsch->harq_processes[i] = NULL;
} }
} }
free16(dlsch,sizeof(NR_UE_DLSCH_t)); free16(dlsch,sizeof(NR_UE_DLSCH_t));
dlsch = NULL; dlsch = NULL;
} }
} }
NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_ldpc_iterations,uint16_t N_RB_DL, uint8_t abstraction_flag) NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint8_t max_ldpc_iterations,uint16_t N_RB_DL, uint8_t abstraction_flag) {
{
NR_UE_DLSCH_t *dlsch; NR_UE_DLSCH_t *dlsch;
uint8_t exit_flag = 0,i,r; uint8_t exit_flag = 0,i,r;
uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated
if (N_RB_DL != 273) { if (N_RB_DL != 273) {
a_segments = a_segments*N_RB_DL; a_segments = a_segments*N_RB_DL;
a_segments = (a_segments/273)+1; a_segments = (a_segments/273)+1;
} }
uint16_t dlsch_bytes = a_segments*1056; // allocated bytes per segment uint16_t dlsch_bytes = a_segments*1056; // allocated bytes per segment
dlsch = (NR_UE_DLSCH_t *)malloc16(sizeof(NR_UE_DLSCH_t)); dlsch = (NR_UE_DLSCH_t *)malloc16(sizeof(NR_UE_DLSCH_t));
if (dlsch) { if (dlsch) {
...@@ -154,7 +148,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint ...@@ -154,7 +148,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
dlsch->Nsoft = Nsoft; dlsch->Nsoft = Nsoft;
dlsch->Mlimit = 4; dlsch->Mlimit = 4;
dlsch->max_ldpc_iterations = max_ldpc_iterations; dlsch->max_ldpc_iterations = max_ldpc_iterations;
for (i=0; i<Mdlharq; i++) { for (i=0; i<Mdlharq; i++) {
dlsch->harq_processes[i] = (NR_DL_UE_HARQ_t *)malloc16(sizeof(NR_DL_UE_HARQ_t)); dlsch->harq_processes[i] = (NR_DL_UE_HARQ_t *)malloc16(sizeof(NR_DL_UE_HARQ_t));
...@@ -162,7 +156,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint ...@@ -162,7 +156,7 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
memset(dlsch->harq_processes[i],0,sizeof(NR_DL_UE_HARQ_t)); memset(dlsch->harq_processes[i],0,sizeof(NR_DL_UE_HARQ_t));
init_downlink_harq_status(dlsch->harq_processes[i]); init_downlink_harq_status(dlsch->harq_processes[i]);
dlsch->harq_processes[i]->first_tx=1; dlsch->harq_processes[i]->first_tx=1;
dlsch->harq_processes[i]->b = (uint8_t*)malloc16(dlsch_bytes); dlsch->harq_processes[i]->b = (uint8_t *)malloc16(dlsch_bytes);
if (dlsch->harq_processes[i]->b) if (dlsch->harq_processes[i]->b)
memset(dlsch->harq_processes[i]->b,0,dlsch_bytes); memset(dlsch->harq_processes[i]->b,0,dlsch_bytes);
...@@ -170,23 +164,23 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint ...@@ -170,23 +164,23 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
exit_flag=3; exit_flag=3;
if (abstraction_flag == 0) { if (abstraction_flag == 0) {
for (r=0; r<a_segments; r++) { for (r=0; r<a_segments; r++) {
dlsch->harq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem(); dlsch->harq_processes[i]->p_nrLDPC_procBuf[r] = nrLDPC_init_mem();
dlsch->harq_processes[i]->c[r] = (uint8_t*)malloc16(1056); dlsch->harq_processes[i]->c[r] = (uint8_t *)malloc16(1056);
if (dlsch->harq_processes[i]->c[r]) if (dlsch->harq_processes[i]->c[r])
memset(dlsch->harq_processes[i]->c[r],0,1056); memset(dlsch->harq_processes[i]->c[r],0,1056);
else else
exit_flag=2; exit_flag=2;
dlsch->harq_processes[i]->d[r] = (short*)malloc16((5*8448)*sizeof(short)); dlsch->harq_processes[i]->d[r] = (short *)malloc16((5*8448)*sizeof(short));
if (dlsch->harq_processes[i]->d[r]) if (dlsch->harq_processes[i]->d[r])
memset(dlsch->harq_processes[i]->d[r],0,(5*8448)*sizeof(short)); memset(dlsch->harq_processes[i]->d[r],0,(5*8448)*sizeof(short));
else else
exit_flag=2; exit_flag=2;
dlsch->harq_processes[i]->w[r] = (short*)malloc16((5*8448)*sizeof(short)); dlsch->harq_processes[i]->w[r] = (short *)malloc16((5*8448)*sizeof(short));
if (dlsch->harq_processes[i]->w[r]) if (dlsch->harq_processes[i]->w[r])
memset(dlsch->harq_processes[i]->w[r],0,(5*8448)*sizeof(short)); memset(dlsch->harq_processes[i]->w[r],0,(5*8448)*sizeof(short));
...@@ -205,19 +199,16 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint ...@@ -205,19 +199,16 @@ NR_UE_DLSCH_t *new_nr_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint32_t Nsoft,uint
LOG_D(PHY,"new_ue_dlsch with size %zu: exit_flag = %u\n",sizeof(NR_DL_UE_HARQ_t), exit_flag); LOG_D(PHY,"new_ue_dlsch with size %zu: exit_flag = %u\n",sizeof(NR_DL_UE_HARQ_t), exit_flag);
free_nr_ue_dlsch(&dlsch,N_RB_DL); free_nr_ue_dlsch(&dlsch,N_RB_DL);
return(NULL); return(NULL);
} }
void nr_dlsch_unscrambling(int16_t* llr, void nr_dlsch_unscrambling(int16_t *llr,
uint32_t size, uint32_t size,
uint8_t q, uint8_t q,
uint32_t Nid, uint32_t Nid,
uint32_t n_RNTI) { uint32_t n_RNTI) {
uint8_t reset; uint8_t reset;
uint32_t x1, x2, s=0; uint32_t x1, x2, s=0;
reset = 1; reset = 1;
x2 = (n_RNTI<<15) + (q<<14) + Nid; x2 = (n_RNTI<<15) + (q<<14) + Nid;
...@@ -226,10 +217,10 @@ void nr_dlsch_unscrambling(int16_t* llr, ...@@ -226,10 +217,10 @@ void nr_dlsch_unscrambling(int16_t* llr,
s = lte_gold_generic(&x1, &x2, reset); s = lte_gold_generic(&x1, &x2, reset);
reset = 0; reset = 0;
} }
if (((s>>(i&0x1f))&1)==1) if (((s>>(i&0x1f))&1)==1)
llr[i] = -llr[i]; llr[i] = -llr[i];
} }
} }
uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
...@@ -244,9 +235,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -244,9 +235,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
uint8_t nr_slot_rx, uint8_t nr_slot_rx,
uint8_t harq_pid, uint8_t harq_pid,
uint8_t is_crnti, uint8_t is_crnti,
uint8_t llr8_flag) uint8_t llr8_flag) {
{
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats; time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats; time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
...@@ -260,48 +249,43 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -260,48 +249,43 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
uint8_t crc_type; uint8_t crc_type;
int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))); int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
t_nrLDPC_dec_params decParams; t_nrLDPC_dec_params decParams;
t_nrLDPC_dec_params* p_decParams = &decParams; t_nrLDPC_dec_params *p_decParams = &decParams;
t_nrLDPC_time_stats procTime = {0}; t_nrLDPC_time_stats procTime = {0};
t_nrLDPC_time_stats* p_procTime =&procTime ; t_nrLDPC_time_stats *p_procTime =&procTime ;
if (!harq_process) { if (!harq_process) {
LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n"); LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n");
return(dlsch->max_ldpc_iterations + 1); return(dlsch->max_ldpc_iterations + 1);
} }
t_nrLDPC_procBuf** p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf;
t_nrLDPC_procBuf **p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf;
// HARQ stats // HARQ stats
phy_vars_ue->dl_stats[harq_process->round]++; phy_vars_ue->dl_stats[harq_process->round]++;
int16_t z [68*384]; int16_t z [68*384];
int8_t l [68*384]; int8_t l [68*384];
//__m128i l; //__m128i l;
//int16_t inv_d [68*384]; //int16_t inv_d [68*384];
uint8_t kc; uint8_t kc;
uint8_t Ilbrm = 1; uint8_t Ilbrm = 1;
uint32_t Tbslbrm;// = 950984; uint32_t Tbslbrm;// = 950984;
uint16_t nb_rb;// = 30; uint16_t nb_rb;// = 30;
double Coderate;// = 0.0; double Coderate;// = 0.0;
uint8_t dmrs_Type = harq_process->dmrsConfigType; uint8_t dmrs_Type = harq_process->dmrsConfigType;
AssertFatal(dmrs_Type == 0 || dmrs_Type == 1, "Illegal dmrs_type %d\n", dmrs_Type); AssertFatal(dmrs_Type == 0 || dmrs_Type == 1, "Illegal dmrs_type %d\n", dmrs_Type);
uint8_t nb_re_dmrs; uint8_t nb_re_dmrs;
if (dmrs_Type==NFAPI_NR_DMRS_TYPE1) { if (dmrs_Type==NFAPI_NR_DMRS_TYPE1) {
nb_re_dmrs = 6*harq_process->n_dmrs_cdm_groups; nb_re_dmrs = 6*harq_process->n_dmrs_cdm_groups;
} } else {
else {
nb_re_dmrs = 4*harq_process->n_dmrs_cdm_groups; nb_re_dmrs = 4*harq_process->n_dmrs_cdm_groups;
} }
uint16_t dmrs_length = get_num_dmrs(harq_process->dlDmrsSymbPos);
uint16_t dmrs_length = get_num_dmrs(harq_process->dlDmrsSymbPos);
uint32_t i,j; uint32_t i,j;
__m128i *pv = (__m128i *)&z;
__m128i *pl = (__m128i *)&l;
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
__m128i *pv = (__m128i*)&z;
__m128i *pl = (__m128i*)&l;
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
//NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[0]; //NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[0];
if (!dlsch_llr) { if (!dlsch_llr) {
...@@ -318,42 +302,31 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -318,42 +302,31 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx); printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
return(dlsch->max_ldpc_iterations + 1); return(dlsch->max_ldpc_iterations + 1);
}*/ }*/
/*if (harq_process->harq_ack.ack != 2) { /*if (harq_process->harq_ack.ack != 2) {
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n", LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
phy_vars_ue->Mod_id, nr_slot_rx, harq_process->harq_ack.ack); phy_vars_ue->Mod_id, nr_slot_rx, harq_process->harq_ack.ack);
}*/ }*/
// nb_rb = dlsch->nb_rb; // nb_rb = dlsch->nb_rb;
/* /*
if (nb_rb > frame_parms->N_RB_DL) { if (nb_rb > frame_parms->N_RB_DL) {
printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb); printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
return(max_ldpc_iterations + 1); return(max_ldpc_iterations + 1);
}*/ }*/
/*harq_pid = dlsch->current_harq_pid[proc->thread_id]; /*harq_pid = dlsch->current_harq_pid[proc->thread_id];
if (harq_pid >= 8) { if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid); printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_ldpc_iterations + 1); return(max_ldpc_iterations + 1);
} }
*/ */
nb_rb = harq_process->nb_rb; nb_rb = harq_process->nb_rb;
harq_process->trials[harq_process->round]++; harq_process->trials[harq_process->round]++;
uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*dmrs_length, nb_rb_oh, 0, harq_process->Nl); harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*dmrs_length, nb_rb_oh, 0, harq_process->Nl);
A = harq_process->TBS; A = harq_process->TBS;
ret = dlsch->max_ldpc_iterations + 1; ret = dlsch->max_ldpc_iterations + 1;
dlsch->last_iteration_cnt = ret; dlsch->last_iteration_cnt = ret;
harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, dmrs_length, harq_process->Qm,harq_process->Nl); harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, dmrs_length, harq_process->Qm,harq_process->Nl);
G = harq_process->G; G = harq_process->G;
LOG_D(PHY,"DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,A/8,G, nb_re_dmrs,harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb); LOG_D(PHY,"DLSCH Decoding, harq_pid %d TBS %d (%d) G %d nb_re_dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,A/8,G, nb_re_dmrs,harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
if ((harq_process->R)<1024) if ((harq_process->R)<1024)
...@@ -361,41 +334,36 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -361,41 +334,36 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
else else
Coderate = (float) (harq_process->R) /(float) 2048; Coderate = (float) (harq_process->R) /(float) 2048;
if ((A <=292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) if ((A <=292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
{
p_decParams->BG = 2; p_decParams->BG = 2;
kc = 52; kc = 52;
if (Coderate < 0.3333){
if (Coderate < 0.3333) {
p_decParams->R = 15; p_decParams->R = 15;
} } else if (Coderate <0.6667) {
else if (Coderate <0.6667){
p_decParams->R = 13; p_decParams->R = 13;
} } else {
else {
p_decParams->R = 23; p_decParams->R = 23;
} }
} } else {
else{
p_decParams->BG = 1; p_decParams->BG = 1;
kc = 68; kc = 68;
if (Coderate < 0.6667){
if (Coderate < 0.6667) {
p_decParams->R = 13; p_decParams->R = 13;
} } else if (Coderate <0.8889) {
else if (Coderate <0.8889){
p_decParams->R = 23; p_decParams->R = 23;
} } else {
else {
p_decParams->R = 89; p_decParams->R = 89;
} }
} }
if (harq_process->round == 0) { if (harq_process->round == 0) {
// This is a new packet, so compute quantities regarding segmentation // This is a new packet, so compute quantities regarding segmentation
if (A > NR_MAX_PDSCH_TBS) if (A > NR_MAX_PDSCH_TBS)
harq_process->B = A+24; harq_process->B = A+24;
else else
harq_process->B = A+16; harq_process->B = A+16;
nr_segmentation(NULL, nr_segmentation(NULL,
NULL, NULL,
...@@ -406,29 +374,24 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -406,29 +374,24 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
&harq_process->F, &harq_process->F,
p_decParams->BG); p_decParams->BG);
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD) && (!frame%100))
LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl); LOG_I(PHY,"K %d C %d Z %d nl %d \n", harq_process->K, harq_process->C, p_decParams->Z, harq_process->Nl);
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
p_decParams->Z = harq_process->Z; p_decParams->Z = harq_process->Z;
//printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z); //printf("dlsch decoding nr segmentation Z %d\n", p_decParams->Z);
//printf("coderate %f kc %d \n", Coderate, kc); //printf("coderate %f kc %d \n", Coderate, kc);
p_decParams->numMaxIter = dlsch->max_ldpc_iterations; p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
p_decParams->outMode= 0; p_decParams->outMode= 0;
err_flag = 0; err_flag = 0;
r_offset = 0; r_offset = 0;
uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated
if (nb_rb != 273) { if (nb_rb != 273) {
a_segments = a_segments*nb_rb; a_segments = a_segments*nb_rb;
a_segments = a_segments/273 +1; a_segments = a_segments/273 +1;
} }
if (harq_process->C > a_segments) { if (harq_process->C > a_segments) {
LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments); LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments);
...@@ -438,41 +401,29 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -438,41 +401,29 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
LOG_I(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K); LOG_I(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
opp_enabled=1; opp_enabled=1;
Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb" Kr = harq_process->K; // [hna] overwrites this line "Kr = p_decParams->Z*kb"
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
K_bits_F = Kr-harq_process->F; K_bits_F = Kr-harq_process->F;
for (r=0; r<harq_process->C; r++) { for (r=0; r<harq_process->C; r++) {
//printf("start rx segment %d\n",r); //printf("start rx segment %d\n",r);
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r); E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_deinterleaving_stats); start_meas(dlsch_deinterleaving_stats);
#endif #endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_IN);
nr_deinterleaving_ldpc(E, nr_deinterleaving_ldpc(E,
harq_process->Qm, harq_process->Qm,
harq_process->w[r], // [hna] w is e harq_process->w[r], // [hna] w is e
dlsch_llr+r_offset); dlsch_llr+r_offset);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_DEINTERLEAVING, VCD_FUNCTION_OUT);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_deinterleaving_stats); stop_meas(dlsch_deinterleaving_stats);
#endif #endif
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_rate_unmatching_stats); start_meas(dlsch_rate_unmatching_stats);
#endif #endif
LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,E %d, F %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n", LOG_D(PHY,"HARQ_PID %d Rate Matching Segment %d (coded bits %d,E %d, F %d,unpunctured/repeated bits %d, TBS %d, mod_order %d, nb_rb %d, Nl %d, rv %d, round %d)...\n",
harq_pid,r, G,E,harq_process->F, harq_pid,r, G,E,harq_process->F,
Kr*3, Kr*3,
...@@ -482,8 +433,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -482,8 +433,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
harq_process->Nl, harq_process->Nl,
harq_process->rvidx, harq_process->rvidx,
harq_process->round); harq_process->round);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_IN);
if ((harq_process->Nl)<4) if ((harq_process->Nl)<4)
...@@ -491,7 +440,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -491,7 +440,6 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
else else
Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4); Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
if (nr_rate_matching_ldpc_rx(Ilbrm, if (nr_rate_matching_ldpc_rx(Ilbrm,
Tbslbrm, Tbslbrm,
p_decParams->BG, p_decParams->BG,
...@@ -504,14 +452,13 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -504,14 +452,13 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
E, E,
harq_process->F, harq_process->F,
Kr-harq_process->F-2*(p_decParams->Z))==-1) { Kr-harq_process->F-2*(p_decParams->Z))==-1) {
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_RATE_MATCHING, VCD_FUNCTION_OUT);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats); stop_meas(dlsch_rate_unmatching_stats);
#endif #endif
LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n"); LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
return(dlsch->max_ldpc_iterations + 1); return(dlsch->max_ldpc_iterations + 1);
} else { } else {
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats); stop_meas(dlsch_rate_unmatching_stats);
#endif #endif
...@@ -519,38 +466,33 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -519,38 +466,33 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
r_offset += E; r_offset += E;
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
{ LOG_I(PHY,"decoder input(segment %u) :",r);
LOG_I(PHY,"decoder input(segment %u) :",r);
for (int i=0;i<E;i++)
LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
LOG_D(PHY,"\n");
}
memset(harq_process->c[r],0,Kr_bytes); for (int i=0; i<E; i++)
LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
LOG_D(PHY,"\n");
}
memset(harq_process->c[r],0,Kr_bytes);
if (harq_process->C == 1){ if (harq_process->C == 1) {
if (A > NR_MAX_PDSCH_TBS) if (A > NR_MAX_PDSCH_TBS)
crc_type = CRC24_A; crc_type = CRC24_A;
else else
crc_type = CRC16; crc_type = CRC16;
length_dec = harq_process->B;
} length_dec = harq_process->B;
else{ } else {
crc_type = CRC24_B; crc_type = CRC24_B;
length_dec = (harq_process->B+24*harq_process->C)/harq_process->C; length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
} }
if (err_flag == 0) { if (err_flag == 0) {
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats); start_meas(dlsch_turbo_decoding_stats);
#endif #endif
//set first 2*Z_c bits to zeros //set first 2*Z_c bits to zeros
memset(&z[0],0,2*harq_process->Z*sizeof(int16_t)); memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
//set Filler bits //set Filler bits
...@@ -559,61 +501,56 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -559,61 +501,56 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
//skip filler bits //skip filler bits
memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t)); memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
//Saturate coded bits before decoding into 8 bits values //Saturate coded bits before decoding into 8 bits values
for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) {
{
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_IN);
no_iteration_ldpc = nrLDPC_decoder(p_decParams, no_iteration_ldpc = nrLDPC_decoder(p_decParams,
(int8_t*)&pl[0], (int8_t *)&pl[0],
llrProcBuf, llrProcBuf,
p_nrLDPC_procBuf[r], p_nrLDPC_procBuf[r],
p_procTime); p_procTime);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_LDPC, VCD_FUNCTION_OUT);
// Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) { if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r); LOG_D(PHY,"Segment %u CRC OK\n\033[0m",r);
if (r==0) { if (r==0) {
for (int i=0;i<10;i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t*)llrProcBuf)[i]); for (int i=0; i<10; i++) LOG_D(PHY,"byte %d : %x\n",i,((uint8_t *)llrProcBuf)[i]);
} }
//Temporary hack //Temporary hack
no_iteration_ldpc = dlsch->max_ldpc_iterations; no_iteration_ldpc = dlsch->max_ldpc_iterations;
ret = no_iteration_ldpc; ret = no_iteration_ldpc;
} } else {
else {
LOG_D(PHY,"CRC NOT OK\n\033[0m"); LOG_D(PHY,"CRC NOT OK\n\033[0m");
} }
nb_total_decod++; nb_total_decod++;
if (no_iteration_ldpc > dlsch->max_ldpc_iterations){
if (no_iteration_ldpc > dlsch->max_ldpc_iterations) {
nb_error_decod++; nb_error_decod++;
} }
for (int m=0; m < Kr>>3; m ++) for (int m=0; m < Kr>>3; m ++) {
{
harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
} }
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
{ for (int k=0; k<A>>3; k++)
for (int k=0;k<A>>3;k++)
LOG_D(PHY,"output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); LOG_D(PHY,"output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]);
LOG_D(PHY,"no_iterations_ldpc %d (ret %u)\n",no_iteration_ldpc,ret);
}
LOG_D(PHY,"no_iterations_ldpc %d (ret %u)\n",no_iteration_ldpc,ret);
}
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats); stop_meas(dlsch_turbo_decoding_stats);
#endif #endif
} }
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break; if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1); LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
...@@ -623,8 +560,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -623,8 +560,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
if (err_flag == 1) { if (err_flag == 1) {
LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n", LOG_D(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round); phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
harq_process->harq_ack.ack = 0; harq_process->harq_ack.ack = 0;
harq_process->harq_ack.harq_id = harq_pid; harq_process->harq_ack.harq_id = harq_pid;
harq_process->harq_ack.send_harq_status = 1; harq_process->harq_ack.send_harq_status = 1;
...@@ -636,72 +572,64 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -636,72 +572,64 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
phy_vars_ue->dl_stats[4]++; phy_vars_ue->dl_stats[4]++;
} }
if(is_crnti) if(is_crnti) {
{ LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n", phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mdlharq,harq_process->TBS);
} }
return((1 + dlsch->max_ldpc_iterations)); return((1 + dlsch->max_ldpc_iterations));
} else { } else {
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n", LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d harq_process->round %d\n",
phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round); phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb, harq_process->round);
harq_process->status = SCH_IDLE; harq_process->status = SCH_IDLE;
harq_process->round = 0; harq_process->round = 0;
harq_process->harq_ack.ack = 1; harq_process->harq_ack.ack = 1;
harq_process->harq_ack.harq_id = harq_pid; harq_process->harq_ack.harq_id = harq_pid;
harq_process->harq_ack.send_harq_status = 1; harq_process->harq_ack.send_harq_status = 1;
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n", //LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
// phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs); // phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
if(is_crnti) if(is_crnti) {
{ LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
} }
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
} }
// Reassembly of Transport block here // Reassembly of Transport block here
offset = 0; offset = 0;
Kr = harq_process->K; Kr = harq_process->K;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_IN);
for (r=0; r<harq_process->C; r++) { for (r=0; r<harq_process->C; r++) {
memcpy(harq_process->b+offset, memcpy(harq_process->b+offset,
harq_process->c[r], harq_process->c[r],
Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0)); Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0)); offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
{
LOG_D(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes); LOG_D(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes);
LOG_D(PHY,"copied %d bytes to b sequence (harq_pid %d)\n", LOG_D(PHY,"copied %d bytes to b sequence (harq_pid %d)\n",
(Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid); (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
LOG_D(PHY,"b[0] = %p,c[%d] = %p\n", LOG_D(PHY,"b[0] = %p,c[%d] = %p\n",
(void *)(uint64_t)(harq_process->b[offset]), (void *)(uint64_t)(harq_process->b[offset]),
harq_process->F>>3, harq_process->F>>3,
(void *)(uint64_t)(harq_process->c[r]) ); (void *)(uint64_t)(harq_process->c[r]) );
if (frame%100 == 0){
LOG_D (PHY, "Printing 60 first payload bytes at frame: %d ", frame); if (frame%100 == 0) {
for (int i = 0; i <60 ; i++){ //Kr_bytes LOG_D (PHY, "Printing 60 first payload bytes at frame: %d ", frame);
LOG_D(PHY, "[%d] : %x ", i, harq_process->b[i]);
} for (int i = 0; i <60 ; i++) { //Kr_bytes
LOG_D(PHY, "[%d] : %x ", i, harq_process->b[i]);
} }
} }
}
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_COMBINE_SEG, VCD_FUNCTION_OUT);
dlsch->last_iteration_cnt = ret; dlsch->last_iteration_cnt = ret;
return(ret); return(ret);
} }
...@@ -718,9 +646,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -718,9 +646,7 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
uint8_t nr_slot_rx, uint8_t nr_slot_rx,
uint8_t harq_pid, uint8_t harq_pid,
uint8_t is_crnti, uint8_t is_crnti,
uint8_t llr8_flag) uint8_t llr8_flag) {
{
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats; time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats; time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
...@@ -738,15 +664,17 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -738,15 +664,17 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
uint8_t r_thread; uint8_t r_thread;
uint32_t Er, Gp,GpmodC;*/ uint32_t Er, Gp,GpmodC;*/
t_nrLDPC_dec_params decParams; t_nrLDPC_dec_params decParams;
t_nrLDPC_dec_params* p_decParams = &decParams; t_nrLDPC_dec_params *p_decParams = &decParams;
t_nrLDPC_time_stats procTime; t_nrLDPC_time_stats procTime;
t_nrLDPC_time_stats* p_procTime =&procTime ; t_nrLDPC_time_stats *p_procTime =&procTime ;
int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))); int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
if (!harq_process) {
if (!harq_process) {
LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n"); LOG_E(PHY,"dlsch_decoding.c: NULL harq_process pointer\n");
return(dlsch->max_ldpc_iterations); return(dlsch->max_ldpc_iterations);
} }
t_nrLDPC_procBuf* p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[0];
t_nrLDPC_procBuf *p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[0];
uint8_t Nl=4; uint8_t Nl=4;
int16_t z [68*384]; int16_t z [68*384];
int8_t l [68*384]; int8_t l [68*384];
...@@ -756,22 +684,19 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -756,22 +684,19 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
uint16_t nb_rb = 30; uint16_t nb_rb = 30;
double Coderate = 0.0; double Coderate = 0.0;
uint8_t dmrs_type = harq_process->dmrsConfigType; uint8_t dmrs_type = harq_process->dmrsConfigType;
uint8_t nb_re_dmrs; uint8_t nb_re_dmrs;
if (dmrs_type == NFAPI_NR_DMRS_TYPE1) if (dmrs_type == NFAPI_NR_DMRS_TYPE1)
nb_re_dmrs = 6*harq_process->n_dmrs_cdm_groups; nb_re_dmrs = 6*harq_process->n_dmrs_cdm_groups;
else else
nb_re_dmrs = 4*harq_process->n_dmrs_cdm_groups; nb_re_dmrs = 4*harq_process->n_dmrs_cdm_groups;
uint16_t length_dmrs = get_num_dmrs(harq_process->dlDmrsSymbPos); uint16_t length_dmrs = get_num_dmrs(harq_process->dlDmrsSymbPos);
uint32_t i,j; uint32_t i,j;
__m128i *pv = (__m128i *)&z;
__m128i *pv = (__m128i*)&z; __m128i *pl = (__m128i *)&l;
__m128i *pl = (__m128i*)&l;
notifiedFIFO_t nf; notifiedFIFO_t nf;
initNotifiedFIFO(&nf); initNotifiedFIFO(&nf);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_IN);
if (!dlsch_llr) { if (!dlsch_llr) {
...@@ -779,217 +704,188 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -779,217 +704,188 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
return(dlsch->max_ldpc_iterations); return(dlsch->max_ldpc_iterations);
} }
if (!frame_parms) { if (!frame_parms) {
LOG_E(PHY,"dlsch_decoding.c: NULL frame_parms pointer\n"); LOG_E(PHY,"dlsch_decoding.c: NULL frame_parms pointer\n");
return(dlsch->max_ldpc_iterations); return(dlsch->max_ldpc_iterations);
} }
/* if (nr_slot_rx> (frame_parms->slots_per_frame-1)) { /* if (nr_slot_rx> (frame_parms->slots_per_frame-1)) {
printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx); printf("dlsch_decoding.c: Illegal slot index %d\n",nr_slot_rx);
return(dlsch->max_ldpc_iterations); return(dlsch->max_ldpc_iterations);
} }
if (dlsch->harq_ack[nr_slot_rx].ack != 2) {
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
phy_vars_ue->Mod_id, nr_slot_rx, dlsch->harq_ack[nr_slot_rx].ack);
}*/
if (dlsch->harq_ack[nr_slot_rx].ack != 2) {
LOG_D(PHY, "[UE %d] DLSCH @ SF%d : ACK bit is %d instead of DTX even before PDSCH is decoded!\n",
phy_vars_ue->Mod_id, nr_slot_rx, dlsch->harq_ack[nr_slot_rx].ack);
}*/
/* /*
if (nb_rb > frame_parms->N_RB_DL) { if (nb_rb > frame_parms->N_RB_DL) {
printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb); printf("dlsch_decoding.c: Illegal nb_rb %d\n",nb_rb);
return(max_ldpc_iterations); return(max_ldpc_iterations);
}*/ }*/
/*harq_pid = dlsch->current_harq_pid[proc->thread_id]; /*harq_pid = dlsch->current_harq_pid[proc->thread_id];
if (harq_pid >= 8) { if (harq_pid >= 8) {
printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid); printf("dlsch_decoding.c: Illegal harq_pid %d\n",harq_pid);
return(max_ldpc_iterations); return(max_ldpc_iterations);
} }
*/ */
nb_rb = harq_process->nb_rb; nb_rb = harq_process->nb_rb;
harq_process->trials[harq_process->round]++; harq_process->trials[harq_process->round]++;
// HARQ stats // HARQ stats
phy_vars_ue->dl_stats[harq_process->round]++; phy_vars_ue->dl_stats[harq_process->round]++;
uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*length_dmrs, nb_rb_oh, 0, harq_process->Nl); harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*length_dmrs, nb_rb_oh, 0, harq_process->Nl);
A = harq_process->TBS; A = harq_process->TBS;
ret = dlsch->max_ldpc_iterations + 1; ret = dlsch->max_ldpc_iterations + 1;
dlsch->last_iteration_cnt = ret; dlsch->last_iteration_cnt = ret;
harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl);
G = harq_process->G; G = harq_process->G;
LOG_D(PHY,"DLSCH Decoding main, harq_pid %d TBS %d G %d, nb_re_dmrs %d, length_dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, nb_re_dmrs, length_dmrs, harq_process->mcs,
LOG_D(PHY,"DLSCH Decoding main, harq_pid %d TBS %d G %d, nb_re_dmrs %d, length_dmrs %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, nb_re_dmrs, length_dmrs, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb); harq_process->Nl, nb_symb_sch,nb_rb);
proc->decoder_main_available = 1; proc->decoder_main_available = 1;
proc->decoder_thread_available = 0; proc->decoder_thread_available = 0;
proc->decoder_thread_available1 = 0; proc->decoder_thread_available1 = 0;
if ((harq_process->R)<1024) if ((harq_process->R)<1024)
Coderate = (float) (harq_process->R) /(float) 1024; Coderate = (float) (harq_process->R) /(float) 1024;
else else
Coderate = (float) (harq_process->R) /(float) 2048; Coderate = (float) (harq_process->R) /(float) 2048;
if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
{
p_decParams->BG = 2; p_decParams->BG = 2;
kc = 52; kc = 52;
if (Coderate < 0.3333){
if (Coderate < 0.3333) {
p_decParams->R = 15; p_decParams->R = 15;
} } else if (Coderate <0.6667) {
else if (Coderate <0.6667){
p_decParams->R = 13; p_decParams->R = 13;
} } else {
else {
p_decParams->R = 23; p_decParams->R = 23;
} }
} } else {
else{
p_decParams->BG = 1; p_decParams->BG = 1;
kc = 68; kc = 68;
if (Coderate < 0.6667){
if (Coderate < 0.6667) {
p_decParams->R = 13; p_decParams->R = 13;
} } else if (Coderate <0.8889) {
else if (Coderate <0.8889){
p_decParams->R = 23; p_decParams->R = 23;
} } else {
else {
p_decParams->R = 89; p_decParams->R = 89;
} }
} }
if (harq_process->round == 0) { if (harq_process->round == 0) {
// This is a new packet, so compute quantities regarding segmentation // This is a new packet, so compute quantities regarding segmentation
if (A > NR_MAX_PDSCH_TBS) if (A > NR_MAX_PDSCH_TBS)
harq_process->B = A+24; harq_process->B = A+24;
else else
harq_process->B = A+16; harq_process->B = A+16;
nr_segmentation(NULL,
NULL,
harq_process->B,
&harq_process->C,
&harq_process->K,
&harq_process->Z,
&harq_process->F,
p_decParams->BG);
} nr_segmentation(NULL,
NULL,
p_decParams->Z = harq_process->Z; harq_process->B,
&harq_process->C,
&harq_process->K,
&harq_process->Z,
&harq_process->F,
p_decParams->BG);
}
p_decParams->Z = harq_process->Z;
p_decParams->numMaxIter = dlsch->max_ldpc_iterations; p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
p_decParams->outMode= 0; p_decParams->outMode= 0;
err_flag = 0; err_flag = 0;
r_offset = 0; r_offset = 0;
uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated
if (nb_rb != 273) { if (nb_rb != 273) {
a_segments = a_segments*nb_rb; a_segments = a_segments*nb_rb;
a_segments = a_segments/273 +1; a_segments = a_segments/273 +1;
} }
if (harq_process->C > a_segments) { if (harq_process->C > a_segments) {
LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments); LOG_E(PHY,"Illegal harq_process->C %d > %d\n",harq_process->C,a_segments);
return((1+dlsch->max_ldpc_iterations)); return((1+dlsch->max_ldpc_iterations));
} }
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
LOG_D(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K); LOG_D(PHY,"Segmentation: C %d, K %d\n",harq_process->C,harq_process->K);
notifiedFIFO_elt_t *res_dl; notifiedFIFO_elt_t *res_dl;
opp_enabled=1; opp_enabled=1;
if (harq_process->C>1) {
for (int nb_seg =1 ; nb_seg<harq_process->C; nb_seg++){
if ( (res_dl=tryPullTpool(&nf, &pool_dl)) != NULL ) {
pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
}
AssertFatal((msgToPush_dl=pullNotifiedFIFO_nothreadSafe(&freeBlocks_dl)) != NULL,"chained list failure");
nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(msgToPush_dl);
curMsg->UE=phy_vars_ue;
nbDlProcessing++;
memset(&curMsg->proc, 0, sizeof(curMsg->proc));
curMsg->proc.frame_rx = proc->frame_rx;
curMsg->proc.nr_slot_rx = proc->nr_slot_rx;
curMsg->proc.thread_id = proc->thread_id;
curMsg->proc.num_seg = nb_seg;
curMsg->proc.eNB_id= eNB_id;
curMsg->proc.harq_pid=harq_pid;
curMsg->proc.llr8_flag = llr8_flag;
msgToPush_dl->key= (nr_slot_rx%2) ? (nb_seg+30): nb_seg;
pushTpool(&pool_dl, msgToPush_dl);
/*Qm= harq_process->Qm;
Nl=harq_process->Nl;
r_thread = harq_process->C/2-1;
C= harq_process->C;
Gp = G/Nl/Qm; if (harq_process->C>1) {
GpmodC = Gp%C; for (int nb_seg =1 ; nb_seg<harq_process->C; nb_seg++) {
if ( (res_dl=tryPullTpool(&nf, &pool_dl)) != NULL ) {
pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
}
AssertFatal((msgToPush_dl=pullNotifiedFIFO_nothreadSafe(&freeBlocks_dl)) != NULL,"chained list failure");
nr_rxtx_thread_data_t *curMsg=(nr_rxtx_thread_data_t *)NotifiedFifoData(msgToPush_dl);
curMsg->UE=phy_vars_ue;
nbDlProcessing++;
memset(&curMsg->proc, 0, sizeof(curMsg->proc));
curMsg->proc.frame_rx = proc->frame_rx;
curMsg->proc.nr_slot_rx = proc->nr_slot_rx;
curMsg->proc.thread_id = proc->thread_id;
curMsg->proc.num_seg = nb_seg;
curMsg->proc.eNB_id= eNB_id;
curMsg->proc.harq_pid=harq_pid;
curMsg->proc.llr8_flag = llr8_flag;
msgToPush_dl->key= (nr_slot_rx%2) ? (nb_seg+30): nb_seg;
pushTpool(&pool_dl, msgToPush_dl);
/*Qm= harq_process->Qm;
Nl=harq_process->Nl;
r_thread = harq_process->C/2-1;
C= harq_process->C;
Gp = G/Nl/Qm;
GpmodC = Gp%C;
if (r_thread < (C-(GpmodC)))
Er = Nl*Qm * (Gp/C);
else
Er = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C));
printf("mthread Er %d\n", Er);
if (r_thread < (C-(GpmodC))) printf("mthread instance_cnt_dlsch_td %d\n", proc->instance_cnt_dlsch_td);*/
Er = Nl*Qm * (Gp/C); }
else
Er = Nl*Qm * ((GpmodC==0?0:1) + (Gp/C));
printf("mthread Er %d\n", Er);
printf("mthread instance_cnt_dlsch_td %d\n", proc->instance_cnt_dlsch_td);*/ //proc->decoder_main_available = 1;
}
//proc->decoder_main_available = 1;
} }
r = 0; r = 0;
if (r==0) r_offset =0;
Kr = harq_process->K;
Kr_bytes = Kr>>3;
K_bits_F = Kr-harq_process->F;
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r); if (r==0) r_offset =0;
/* Kr = harq_process->K;
printf("Subblock deinterleaving, dlsch_llr %p, w %p\n", Kr_bytes = Kr>>3;
dlsch_llr+r_offset, K_bits_F = Kr-harq_process->F;
&harq_process->w[r]); E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
*/ /*
printf("Subblock deinterleaving, dlsch_llr %p, w %p\n",
dlsch_llr+r_offset,
&harq_process->w[r]);
*/
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_deinterleaving_stats); start_meas(dlsch_deinterleaving_stats);
#endif #endif
nr_deinterleaving_ldpc(E, nr_deinterleaving_ldpc(E,
harq_process->Qm, harq_process->Qm,
harq_process->w[r], harq_process->w[r],
dlsch_llr+r_offset); dlsch_llr+r_offset);
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
for (int i =0; i<16; i++) for (int i =0; i<16; i++)
LOG_D(PHY,"rx output deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset); LOG_D(PHY,"rx output deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_deinterleaving_stats); stop_meas(dlsch_deinterleaving_stats);
#endif #endif
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_rate_unmatching_stats); start_meas(dlsch_rate_unmatching_stats);
#endif #endif
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
...@@ -1002,136 +898,126 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -1002,136 +898,126 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
harq_process->Nl, harq_process->Nl,
harq_process->rvidx, harq_process->rvidx,
harq_process->round); harq_process->round);
// for tbslbrm calculation according to 5.4.2.1 of 38.212
if (harq_process->Nl < Nl)
Nl = harq_process->Nl;
Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,harq_process->Nl); // for tbslbrm calculation according to 5.4.2.1 of 38.212
if (harq_process->Nl < Nl)
if (nr_rate_matching_ldpc_rx(Ilbrm, Nl = harq_process->Nl;
Tbslbrm,
p_decParams->BG, Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,harq_process->Nl);
p_decParams->Z,
harq_process->d[r], if (nr_rate_matching_ldpc_rx(Ilbrm,
harq_process->w[r], Tbslbrm,
harq_process->C, p_decParams->BG,
harq_process->rvidx, p_decParams->Z,
(harq_process->round==0)?1:0, harq_process->d[r],
E, harq_process->w[r],
harq_process->F, harq_process->C,
Kr-harq_process->F-2*(p_decParams->Z))==-1) { harq_process->rvidx,
(harq_process->round==0)?1:0,
E,
harq_process->F,
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats); stop_meas(dlsch_rate_unmatching_stats);
#endif #endif
LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n"); LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
return(dlsch->max_ldpc_iterations); return(dlsch->max_ldpc_iterations);
} else } else {
{
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats); stop_meas(dlsch_rate_unmatching_stats);
#endif #endif
} }
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
for (int i =0; i<16; i++) for (int i =0; i<16; i++)
LOG_I(PHY,"rx output ratematching d[%d]= %d r_offset %u\n", i,harq_process->d[r][i], r_offset); LOG_I(PHY,"rx output ratematching d[%d]= %d r_offset %u\n", i,harq_process->d[r][i], r_offset);
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
{
if (r==0) { if (r==0) {
LOG_M("decoder_llr.m","decllr",dlsch_llr,G,1,0); LOG_M("decoder_llr.m","decllr",dlsch_llr,G,1,0);
LOG_M("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0); LOG_M("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0);
} }
LOG_D(PHY,"decoder input(segment %u) :",r); LOG_D(PHY,"decoder input(segment %u) :",r);
for (int i=0;i<(3*8*Kr_bytes);i++)
for (int i=0; i<(3*8*Kr_bytes); i++)
LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]); LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
LOG_D(PHY,"\n");
}
memset(harq_process->c[r],0,Kr_bytes); LOG_D(PHY,"\n");
}
if (harq_process->C == 1){ memset(harq_process->c[r],0,Kr_bytes);
if (A > NR_MAX_PDSCH_TBS)
crc_type = CRC24_A;
else
crc_type = CRC16;
length_dec = harq_process->B; if (harq_process->C == 1) {
} if (A > NR_MAX_PDSCH_TBS)
else{ crc_type = CRC24_A;
crc_type = CRC24_B; else
length_dec = (harq_process->B+24*harq_process->C)/harq_process->C; crc_type = CRC16;
}
//#ifndef __AVX2__ length_dec = harq_process->B;
} else {
crc_type = CRC24_B;
length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
}
if (err_flag == 0) { //#ifndef __AVX2__
/*
LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
*/
if (err_flag == 0) {
/*
LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
*/
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats); start_meas(dlsch_turbo_decoding_stats);
#endif #endif
LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1); LOG_D(PHY,"mthread AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
/*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
/*for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){ inv_d[cnt] = (1)*harq_process->d[r][cnt];
inv_d[cnt] = (1)*harq_process->d[r][cnt]; }*/
}*/ //set first 2*Z_c bits to zeros
memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
//set first 2*Z_c bits to zeros //set Filler bits
memset(&z[0],0,2*harq_process->Z*sizeof(int16_t)); memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
//set Filler bits //Move coded bits before filler bits
memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t)); memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
//Move coded bits before filler bits //skip filler bits
memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
//skip filler bits
memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t)); //Saturate coded bits before decoding into 8 bits values
//Saturate coded bits before decoding into 8 bits values for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) {
for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
{ }
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
}
no_iteration_ldpc = nrLDPC_decoder(p_decParams, no_iteration_ldpc = nrLDPC_decoder(p_decParams,
(int8_t*)&pl[0], (int8_t *)&pl[0],
llrProcBuf, llrProcBuf,
p_nrLDPC_procBuf, p_nrLDPC_procBuf,
p_procTime); p_procTime);
nb_total_decod++;
nb_total_decod++; if (no_iteration_ldpc > 10) {
if (no_iteration_ldpc > 10){ nb_error_decod++;
nb_error_decod++; ret = 1+dlsch->max_ldpc_iterations;
ret = 1+dlsch->max_ldpc_iterations; } else {
} ret=2;
else { }
ret=2;
}
if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) { if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
LOG_D(PHY,"Segment %u CRC OK\n",r); LOG_D(PHY,"Segment %u CRC OK\n",r);
ret = 2; ret = 2;
} } else {
else { ret = 1+dlsch->max_ldpc_iterations;
ret = 1+dlsch->max_ldpc_iterations; }
}
if (!nb_total_decod%10000){ if (!nb_total_decod%10000) {
printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);fflush(stdout); printf("Error number of iteration LPDC %d %ld/%ld \n", no_iteration_ldpc, nb_error_decod,nb_total_decod);
fflush(stdout);
} }
for (int m=0; m < Kr>>3; m ++) for (int m=0; m < Kr>>3; m ++) {
{ harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
harq_process->c[r][m]= (uint8_t) llrProcBuf[m]; }
}
/*for (int u=0; u < Kr>>3; u ++) /*for (int u=0; u < Kr>>3; u ++)
{ {
...@@ -1149,27 +1035,27 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -1149,27 +1035,27 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
//printf("output channel decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); //printf("output channel decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
//printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]); //printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
for (int k=0;k<32;k++) for (int k=0; k<32; k++)
LOG_D(PHY,"output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); LOG_D(PHY,"output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats); stop_meas(dlsch_turbo_decoding_stats);
#endif #endif
} }
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
err_flag = 1;
}
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,nr_slot_rx,r,harq_process->C-1);
err_flag = 1;
}
//} //loop r //} //loop r
if (err_flag == 1) { if (err_flag == 1) {
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n", LOG_I(PHY,"[UE %d] DLSCH: Setting NAK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d) Kr %d r %d harq_process->round %d\n",
phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round); phy_vars_ue->Mod_id, frame, nr_slot_rx, harq_pid,harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs,Kr,r,harq_process->round);
harq_process->harq_ack.ack = 0; harq_process->harq_ack.ack = 0;
harq_process->harq_ack.harq_id = harq_pid; harq_process->harq_ack.harq_id = harq_pid;
harq_process->harq_ack.send_harq_status = 1; harq_process->harq_ack.send_harq_status = 1;
...@@ -1180,17 +1066,17 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -1180,17 +1066,17 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
harq_process->status = SCH_IDLE; harq_process->status = SCH_IDLE;
harq_process->round = 0; harq_process->round = 0;
} }
if(is_crnti)
{ if(is_crnti) {
LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n", LOG_D(PHY,"[UE %d] DLSCH: Setting NACK for nr_slot_rx %d (pid %d, pid status %d, round %d/Max %d, TBS %d)\n",
phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS); phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->status,harq_process->round,dlsch->Mlimit,harq_process->TBS);
} }
return((1+dlsch->max_ldpc_iterations)); return((1+dlsch->max_ldpc_iterations));
} else { } else {
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d\n", LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d TBS %d mcs %d nb_rb %d\n",
phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb); phy_vars_ue->Mod_id,nr_slot_rx,harq_process->TBS,harq_process->mcs,harq_process->nb_rb);
harq_process->status = SCH_IDLE; harq_process->status = SCH_IDLE;
harq_process->round = 0; harq_process->round = 0;
...@@ -1198,112 +1084,96 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -1198,112 +1084,96 @@ uint32_t nr_dlsch_decoding_mthread(PHY_VARS_NR_UE *phy_vars_ue,
harq_process->harq_ack.harq_id = harq_pid; harq_process->harq_ack.harq_id = harq_pid;
harq_process->harq_ack.send_harq_status = 1; harq_process->harq_ack.send_harq_status = 1;
//LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n", //LOG_I(PHY,"[UE %d] DLSCH: Setting ACK for SFN/SF %d/%d (pid %d, status %d, round %d, TBS %d, mcs %d)\n",
// phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs); // phy_vars_ue->Mod_id, frame, subframe, harq_pid, harq_process->status, harq_process->round,harq_process->TBS,harq_process->mcs);
if(is_crnti) if(is_crnti) {
{ LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for nr_slot_rx %d (pid %d, round %d, TBS %d)\n",phy_vars_ue->Mod_id,nr_slot_rx,harq_pid,harq_process->round,harq_process->TBS);
} }
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
//LOG_D(PHY,"[UE %d] DLSCH: Setting ACK for subframe %d (pid %d, round %d)\n",phy_vars_ue->Mod_id,subframe,harq_pid,harq_process->round);
} }
// Reassembly of Transport block here // Reassembly of Transport block here
offset = 0; offset = 0;
/* /*
printf("harq_pid %d\n",harq_pid); printf("harq_pid %d\n",harq_pid);
printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3); printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3);
printf("C %d\n",harq_process->C); printf("C %d\n",harq_process->C);
*/ */
//uint32_t wait = 0; //uint32_t wait = 0;
/* while((proc->decoder_thread_available == 0) ) /* while((proc->decoder_thread_available == 0) )
{ {
usleep(1); usleep(1);
} }
proc->decoder_thread_available == 0;*/ proc->decoder_thread_available == 0;*/
/*notifiedFIFO_elt_t *res1=tryPullTpool(&nf, Tpool); /*notifiedFIFO_elt_t *res1=tryPullTpool(&nf, Tpool);
if (!res1) { if (!res1) {
printf("mthread trypull null\n"); printf("mthread trypull null\n");
usleep(1); usleep(1);
wait++; wait++;
}*/ }*/
//usleep(50); //usleep(50);
proc->decoder_main_available = 0; proc->decoder_main_available = 0;
Kr = harq_process->K; //to check if same K in all segments Kr = harq_process->K; //to check if same K in all segments
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
for (r=0; r<harq_process->C; r++) {
memcpy(harq_process->b+offset, for (r=0; r<harq_process->C; r++) {
harq_process->c[r], memcpy(harq_process->b+offset,
Kr_bytes- - (harq_process->F>>3) -((harq_process->C>1)?3:0)); harq_process->c[r],
offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0)); Kr_bytes- - (harq_process->F>>3) -((harq_process->C>1)?3:0));
offset += (Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0));
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
{ LOG_I(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes);
LOG_I(PHY,"Segment %u : Kr= %u bytes\n",r,Kr_bytes); LOG_I(PHY,"copied %d bytes to b sequence (harq_pid %d)\n",
LOG_I(PHY,"copied %d bytes to b sequence (harq_pid %d)\n", (Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid);
(Kr_bytes - (harq_process->F>>3)-((harq_process->C>1)?3:0)),harq_pid); LOG_I(PHY,"b[0] = %p,c[%d] = %p\n",
LOG_I(PHY,"b[0] = %p,c[%d] = %p\n", (void *)(uint64_t)(harq_process->b[offset]),
(void *)(uint64_t)(harq_process->b[offset]), harq_process->F>>3,
harq_process->F>>3, (void *)(uint64_t)(harq_process->c[r]));
(void *)(uint64_t)(harq_process->c[r]));
} }
} }
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_SEGMENTATION, VCD_FUNCTION_OUT);
dlsch->last_iteration_cnt = ret; dlsch->last_iteration_cnt = ret;
//proc->decoder_thread_available = 0; //proc->decoder_thread_available = 0;
//proc->decoder_main_available = 0; //proc->decoder_main_available = 0;
return(ret); return(ret);
} }
void nr_dlsch_decoding_process(void *arg) void nr_dlsch_decoding_process(void *arg) {
{ nr_rxtx_thread_data_t *rxtxD= (nr_rxtx_thread_data_t *)arg;
nr_rxtx_thread_data_t *rxtxD= (nr_rxtx_thread_data_t *)arg; UE_nr_rxtx_proc_t *proc = &rxtxD->proc;
UE_nr_rxtx_proc_t *proc = &rxtxD->proc; PHY_VARS_NR_UE *phy_vars_ue = rxtxD->UE;
PHY_VARS_NR_UE *phy_vars_ue = rxtxD->UE; int llr8_flag1;
int llr8_flag1; int32_t no_iteration_ldpc,length_dec;
int32_t no_iteration_ldpc,length_dec; t_nrLDPC_dec_params decParams;
t_nrLDPC_dec_params decParams; t_nrLDPC_dec_params *p_decParams = &decParams;
t_nrLDPC_dec_params* p_decParams = &decParams; t_nrLDPC_time_stats procTime;
t_nrLDPC_time_stats procTime; t_nrLDPC_time_stats *p_procTime =&procTime ;
t_nrLDPC_time_stats* p_procTime =&procTime ; int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32)));
int8_t llrProcBuf[NR_LDPC_MAX_NUM_LLR] __attribute__ ((aligned(32))); t_nrLDPC_procBuf *p_nrLDPC_procBuf;
t_nrLDPC_procBuf* p_nrLDPC_procBuf; int16_t z [68*384];
int16_t z [68*384]; int8_t l [68*384];
int8_t l [68*384]; //__m128i l;
//__m128i l; //int16_t inv_d [68*384];
//int16_t inv_d [68*384]; //int16_t *p_invd =&inv_d;
//int16_t *p_invd =&inv_d; uint8_t kc;
uint8_t kc; uint8_t Ilbrm = 1;
uint8_t Ilbrm = 1; uint32_t Tbslbrm = 950984;
uint32_t Tbslbrm = 950984; uint16_t nb_rb = 30; //to update
uint16_t nb_rb = 30; //to update double Coderate = 0.0;
double Coderate = 0.0; uint16_t nb_symb_sch = 12;
uint16_t nb_symb_sch = 12; uint8_t nb_re_dmrs = 6;
uint8_t nb_re_dmrs = 6; uint16_t length_dmrs = 1;
uint16_t length_dmrs = 1; uint32_t i,j;
__m128i *pv = (__m128i *)&z;
uint32_t i,j; __m128i *pl = (__m128i *)&l;
__m128i *pv = (__m128i*)&z; proc->instance_cnt_dlsch_td=-1;
__m128i *pl = (__m128i*)&l; //proc->nr_slot_rx = proc->sub_frame_start * frame_parms->slots_per_subframe;
proc->decoder_thread_available = 1;
proc->instance_cnt_dlsch_td=-1;
//proc->nr_slot_rx = proc->sub_frame_start * frame_parms->slots_per_subframe;
proc->decoder_thread_available = 1;
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats; time_stats_t *dlsch_rate_unmatching_stats=&phy_vars_ue->dlsch_rate_unmatching_stats;
time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats; time_stats_t *dlsch_turbo_decoding_stats=&phy_vars_ue->dlsch_turbo_decoding_stats;
...@@ -1311,47 +1181,32 @@ void nr_dlsch_decoding_process(void *arg) ...@@ -1311,47 +1181,32 @@ void nr_dlsch_decoding_process(void *arg)
#endif #endif
uint32_t A,E; uint32_t A,E;
uint32_t G; uint32_t G;
uint32_t ret; uint32_t ret;
uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bits_F; uint32_t r,r_offset=0,Kr,Kr_bytes,err_flag=0,K_bits_F;
uint8_t crc_type; uint8_t crc_type;
uint8_t C,Cprime; uint8_t C,Cprime;
uint8_t Qm; uint8_t Qm;
uint8_t Nl; uint8_t Nl;
//uint32_t Er; //uint32_t Er;
int eNB_id = proc->eNB_id; int eNB_id = proc->eNB_id;
int harq_pid = proc->harq_pid; int harq_pid = proc->harq_pid;
llr8_flag1 = proc->llr8_flag; llr8_flag1 = proc->llr8_flag;
int frame = proc->frame_rx; int frame = proc->frame_rx;
r = proc->num_seg; r = proc->num_seg;
NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[proc->thread_id][eNB_id][0]; NR_UE_DLSCH_t *dlsch = phy_vars_ue->dlsch[proc->thread_id][eNB_id][0];
NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid]; NR_DL_UE_HARQ_t *harq_process = dlsch->harq_processes[harq_pid];
short *dlsch_llr = phy_vars_ue->pdsch_vars[proc->thread_id][eNB_id]->llr[0]; short *dlsch_llr = phy_vars_ue->pdsch_vars[proc->thread_id][eNB_id]->llr[0];
p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[r]; p_nrLDPC_procBuf = harq_process->p_nrLDPC_procBuf[r];
nb_symb_sch = harq_process->nb_symbols; nb_symb_sch = harq_process->nb_symbols;
LOG_D(PHY,"dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_slot_rx, proc->num_seg, r, harq_process->nb_symbols); LOG_D(PHY,"dlsch decoding process frame %d slot %d segment %d r %u nb symb %d \n", frame, proc->nr_slot_rx, proc->num_seg, r, harq_process->nb_symbols);
nb_rb = harq_process->nb_rb; nb_rb = harq_process->nb_rb;
harq_process->trials[harq_process->round]++; harq_process->trials[harq_process->round]++;
uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs uint16_t nb_rb_oh = 0; // it was not computed at UE side even before and set to 0 in nr_compute_tbs
harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*length_dmrs, nb_rb_oh, 0, harq_process->Nl); harq_process->TBS = nr_compute_tbs(harq_process->Qm,harq_process->R,nb_rb,nb_symb_sch,nb_re_dmrs*length_dmrs, nb_rb_oh, 0, harq_process->Nl);
A = harq_process->TBS; //2072 for QPSK 1/3 A = harq_process->TBS; //2072 for QPSK 1/3
ret = dlsch->max_ldpc_iterations; ret = dlsch->max_ldpc_iterations;
harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl); harq_process->G = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, harq_process->Qm,harq_process->Nl);
G = harq_process->G; G = harq_process->G;
LOG_D(PHY,"DLSCH Decoding process, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb); LOG_D(PHY,"DLSCH Decoding process, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d nb_rb %d\n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch,nb_rb);
if ((harq_process->R)<1024) if ((harq_process->R)<1024)
...@@ -1359,107 +1214,89 @@ void nr_dlsch_decoding_process(void *arg) ...@@ -1359,107 +1214,89 @@ void nr_dlsch_decoding_process(void *arg)
else else
Coderate = (float) (harq_process->R) /(float) 2048; Coderate = (float) (harq_process->R) /(float) 2048;
if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) if ((A <= 292) || ((A <= NR_MAX_PDSCH_TBS) && (Coderate <= 0.6667)) || Coderate <= 0.25) {
{
p_decParams->BG = 2; p_decParams->BG = 2;
kc = 52; kc = 52;
if (Coderate < 0.3333){
if (Coderate < 0.3333) {
p_decParams->R = 15; p_decParams->R = 15;
} } else if (Coderate <0.6667) {
else if (Coderate <0.6667){
p_decParams->R = 13; p_decParams->R = 13;
} } else {
else {
p_decParams->R = 23; p_decParams->R = 23;
} }
} } else {
else{
p_decParams->BG = 1; p_decParams->BG = 1;
kc = 68; kc = 68;
if (Coderate < 0.6667){
if (Coderate < 0.6667) {
p_decParams->R = 13; p_decParams->R = 13;
} } else if (Coderate <0.8889) {
else if (Coderate <0.8889){
p_decParams->R = 23; p_decParams->R = 23;
} } else {
else {
p_decParams->R = 89; p_decParams->R = 89;
} }
} }
harq_process->round =0; harq_process->round =0;
// if (harq_process->round == 0) {
// This is a new packet, so compute quantities regarding segmentation
if (A > NR_MAX_PDSCH_TBS)
harq_process->B = A+24;
else
harq_process->B = A+16;
nr_segmentation(NULL,
NULL,
harq_process->B,
&harq_process->C,
&harq_process->K,
&harq_process->Z,
&harq_process->F,
p_decParams->BG);
p_decParams->Z = harq_process->Z;
// }
LOG_D(PHY,"round %d Z %d K %d BG %d\n", harq_process->round, p_decParams->Z, harq_process->K, p_decParams->BG);
// if (harq_process->round == 0) {
// This is a new packet, so compute quantities regarding segmentation
if (A > NR_MAX_PDSCH_TBS)
harq_process->B = A+24;
else
harq_process->B = A+16;
nr_segmentation(NULL,
NULL,
harq_process->B,
&harq_process->C,
&harq_process->K,
&harq_process->Z,
&harq_process->F,
p_decParams->BG);
p_decParams->Z = harq_process->Z;
// }
LOG_D(PHY,"round %d Z %d K %d BG %d\n", harq_process->round, p_decParams->Z, harq_process->K, p_decParams->BG);
p_decParams->numMaxIter = dlsch->max_ldpc_iterations; p_decParams->numMaxIter = dlsch->max_ldpc_iterations;
p_decParams->outMode= 0; p_decParams->outMode= 0;
err_flag = 0; err_flag = 0;
opp_enabled=1; opp_enabled=1;
Qm= harq_process->Qm; Qm= harq_process->Qm;
Nl=harq_process->Nl; Nl=harq_process->Nl;
//r_thread = harq_process->C/2-1; //r_thread = harq_process->C/2-1;
C= harq_process->C; C= harq_process->C;
Cprime = C; //assume CBGTI not present Cprime = C; //assume CBGTI not present
if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1) if (r <= Cprime - ((G/(Nl*Qm))%Cprime) - 1)
r_offset = Nl*Qm*(G/(Nl*Qm*Cprime)); r_offset = Nl*Qm*(G/(Nl*Qm*Cprime));
else else
r_offset = Nl*Qm*((G/(Nl*Qm*Cprime))+1); r_offset = Nl*Qm*((G/(Nl*Qm*Cprime))+1);
//for (r=(harq_process->C/2); r<harq_process->C; r++) {
// r=1; //(harq_process->C/2);
//for (r=(harq_process->C/2); r<harq_process->C; r++) {
// r=1; //(harq_process->C/2);
r_offset = r*r_offset; r_offset = r*r_offset;
Kr = harq_process->K; Kr = harq_process->K;
Kr_bytes = Kr>>3; Kr_bytes = Kr>>3;
K_bits_F = Kr-harq_process->F; K_bits_F = Kr-harq_process->F;
E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r); E = nr_get_E(G, harq_process->C, harq_process->Qm, harq_process->Nl, r);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_deinterleaving_stats); start_meas(dlsch_deinterleaving_stats);
#endif #endif
nr_deinterleaving_ldpc(E, nr_deinterleaving_ldpc(E,
harq_process->Qm, harq_process->Qm,
harq_process->w[r], harq_process->w[r],
dlsch_llr+r_offset); dlsch_llr+r_offset);
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
for (int i =0; i<16; i++) for (int i =0; i<16; i++)
LOG_D(PHY,"rx output thread 0 deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset); LOG_D(PHY,"rx output thread 0 deinterleaving w[%d]= %d r_offset %u\n", i,harq_process->w[r][i], r_offset);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_deinterleaving_stats); stop_meas(dlsch_deinterleaving_stats);
#endif #endif
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_rate_unmatching_stats); start_meas(dlsch_rate_unmatching_stats);
#endif #endif
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
...@@ -1473,134 +1310,128 @@ void nr_dlsch_decoding_process(void *arg) ...@@ -1473,134 +1310,128 @@ void nr_dlsch_decoding_process(void *arg)
harq_process->rvidx, harq_process->rvidx,
harq_process->round); harq_process->round);
if (Nl<4)
if (Nl<4) Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,Nl);
Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,Nl); else
else Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
Tbslbrm = nr_compute_tbslbrm(harq_process->mcs_table,nb_rb,4);
if (nr_rate_matching_ldpc_rx(Ilbrm,
if (nr_rate_matching_ldpc_rx(Ilbrm, Tbslbrm,
Tbslbrm, p_decParams->BG,
p_decParams->BG, p_decParams->Z,
p_decParams->Z, harq_process->d[r],
harq_process->d[r], harq_process->w[r],
harq_process->w[r], harq_process->C,
harq_process->C, harq_process->rvidx,
harq_process->rvidx, (harq_process->round==0)?1:0,
(harq_process->round==0)?1:0, E,
E, harq_process->F,
harq_process->F, Kr-harq_process->F-2*(p_decParams->Z))==-1) {
Kr-harq_process->F-2*(p_decParams->Z))==-1) {
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats); stop_meas(dlsch_rate_unmatching_stats);
#endif #endif
LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n"); LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n");
//return(dlsch->max_ldpc_iterations); //return(dlsch->max_ldpc_iterations);
} else } else {
{
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_rate_unmatching_stats); stop_meas(dlsch_rate_unmatching_stats);
#endif #endif
} }
if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) { if (LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD)) {
LOG_D(PHY,"decoder input(segment %u) :",r); LOG_D(PHY,"decoder input(segment %u) :",r);
for (int i=0;i<(3*8*Kr_bytes)+12;i++)
LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
LOG_D(PHY,"\n");
}
for (int i=0; i<(3*8*Kr_bytes)+12; i++)
LOG_D(PHY,"%d : %d\n",i,harq_process->d[r][i]);
memset(harq_process->c[r],0,Kr_bytes); LOG_D(PHY,"\n");
}
if (harq_process->C == 1){ memset(harq_process->c[r],0,Kr_bytes);
if (A > NR_MAX_PDSCH_TBS)
crc_type = CRC24_A;
else
crc_type = CRC16;
length_dec = harq_process->B; if (harq_process->C == 1) {
} if (A > NR_MAX_PDSCH_TBS)
else{ crc_type = CRC24_A;
crc_type = CRC24_B; else
length_dec = (harq_process->B+24*harq_process->C)/harq_process->C; crc_type = CRC16;
length_dec = harq_process->B;
} else {
crc_type = CRC24_B;
length_dec = (harq_process->B+24*harq_process->C)/harq_process->C;
}
if (err_flag == 0) {
/*
LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
*/
if (llr8_flag1) {
AssertFatal (Kr >= 256, "LDPC algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
} }
if (err_flag == 0) {
/*
LOG_D(PHY, "LDPC algo Kr=%d cb_cnt=%d C=%d nbRB=%d crc_type %d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d maxIter %d\n",
Kr,r,harq_process->C,harq_process->nb_rb,crc_type,A,harq_process->TBS,
harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round,dlsch->max_ldpc_iterations);
*/
if (llr8_flag1) {
AssertFatal (Kr >= 256, "LDPC algo issue Kr=%d cb_cnt=%d C=%d nbRB=%d TBSInput=%d TBSHarq=%d TBSplus24=%d mcs=%d Qm=%d RIV=%d round=%d\n",
Kr,r,harq_process->C,harq_process->nb_rb,A,harq_process->TBS,harq_process->B,harq_process->mcs,harq_process->Qm,harq_process->rvidx,harq_process->round);
}
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
start_meas(dlsch_turbo_decoding_stats); start_meas(dlsch_turbo_decoding_stats);
#endif #endif
// LOG_D(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1); // LOG_D(PHY,"AbsSubframe %d.%d Start LDPC segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
/* /*
for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){ for (int cnt =0; cnt < (kc-2)*p_decParams->Z; cnt++){
inv_d[cnt] = (1)*harq_process->d[r][cnt]; inv_d[cnt] = (1)*harq_process->d[r][cnt];
} }
*/ */
//set first 2*Z_c bits to zeros
//set first 2*Z_c bits to zeros memset(&z[0],0,2*harq_process->Z*sizeof(int16_t));
memset(&z[0],0,2*harq_process->Z*sizeof(int16_t)); //set Filler bits
//set Filler bits memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t));
memset((&z[0]+K_bits_F),127,harq_process->F*sizeof(int16_t)); //Move coded bits before filler bits
//Move coded bits before filler bits memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t));
memcpy((&z[0]+2*harq_process->Z),harq_process->d[r],(K_bits_F-2*harq_process->Z)*sizeof(int16_t)); //skip filler bits
//skip filler bits memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
memcpy((&z[0]+Kr),harq_process->d[r]+(Kr-2*harq_process->Z),(kc*harq_process->Z-Kr)*sizeof(int16_t));
//Saturate coded bits before decoding into 8 bits values //Saturate coded bits before decoding into 8 bits values
for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) for (i=0, j=0; j < ((kc*harq_process->Z)>>4)+1; i+=2, j++) {
{ pl[j] = _mm_packs_epi16(pv[i],pv[i+1]);
pl[j] = _mm_packs_epi16(pv[i],pv[i+1]); }
}
no_iteration_ldpc = nrLDPC_decoder(p_decParams, no_iteration_ldpc = nrLDPC_decoder(p_decParams,
(int8_t*)&pl[0], (int8_t *)&pl[0],
llrProcBuf, llrProcBuf,
p_nrLDPC_procBuf, p_nrLDPC_procBuf,
p_procTime); p_procTime);
// Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int // Fixme: correct type is unsigned, but nrLDPC_decoder and all called behind use signed int
if (check_crc((uint8_t*)llrProcBuf,length_dec,harq_process->F,crc_type)) { if (check_crc((uint8_t *)llrProcBuf,length_dec,harq_process->F,crc_type)) {
LOG_D(PHY,"Segment %u CRC OK\n",r); LOG_D(PHY,"Segment %u CRC OK\n",r);
ret = 2; ret = 2;
} } else {
else { LOG_D(PHY,"Segment %u CRC NOK\n",r);
LOG_D(PHY,"Segment %u CRC NOK\n",r); ret = 1+dlsch->max_ldpc_iterations;
ret = 1+dlsch->max_ldpc_iterations; }
}
if (no_iteration_ldpc > 10) if (no_iteration_ldpc > 10)
LOG_D(PHY,"Error number of iteration LPDC %d\n", no_iteration_ldpc); LOG_D(PHY,"Error number of iteration LPDC %d\n", no_iteration_ldpc);
for (int m=0; m < Kr>>3; m ++) {
harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
}
for (int m=0; m < Kr>>3; m ++) if ( LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
{ for (int k=0; k<2; k++)
harq_process->c[r][m]= (uint8_t) llrProcBuf[m];
}
if ( LOG_DEBUGFLAG(DEBUG_DLSCH_DECOD))
for (int k=0;k<2;k++)
LOG_D(PHY,"segment 1 output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]); LOG_D(PHY,"segment 1 output decoder [%d] = 0x%02x \n", k, harq_process->c[r][k]);
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
stop_meas(dlsch_turbo_decoding_stats); stop_meas(dlsch_turbo_decoding_stats);
#endif #endif
} }
if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break; if ((err_flag == 0) && (ret>=(1+dlsch->max_ldpc_iterations))) {// a Code segment is in error so break;
// LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1); // LOG_D(PHY,"AbsSubframe %d.%d CRC failed, segment %d/%d \n",frame%1024,subframe,r,harq_process->C-1);
err_flag = 1; err_flag = 1;
} }
//}
//}
proc->decoder_thread_available = 1; proc->decoder_thread_available = 1;
//proc->decoder_main_available = 0; //proc->decoder_main_available = 0;
} }
...@@ -1612,12 +1443,12 @@ void *dlsch_thread(void *arg) { ...@@ -1612,12 +1443,12 @@ void *dlsch_thread(void *arg) {
notifiedFIFO_elt_t *res_dl; notifiedFIFO_elt_t *res_dl;
initNotifiedFIFO_nothreadSafe(&freeBlocks_dl); initNotifiedFIFO_nothreadSafe(&freeBlocks_dl);
for (int i=0; i<tpool_nbthreads(pool_dl)+1; i++){ for (int i=0; i<tpool_nbthreads(pool_dl)+1; i++) {
pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl, pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,
newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), 0,&nf,nr_dlsch_decoding_process));} newNotifiedFIFO_elt(sizeof(nr_rxtx_thread_data_t), 0,&nf,nr_dlsch_decoding_process));
}
while (!oai_exit) { while (!oai_exit) {
notifiedFIFO_elt_t *res; notifiedFIFO_elt_t *res;
while (nbDlProcessing >= tpool_nbthreads(pool_dl)) { while (nbDlProcessing >= tpool_nbthreads(pool_dl)) {
...@@ -1628,15 +1459,12 @@ void *dlsch_thread(void *arg) { ...@@ -1628,15 +1459,12 @@ void *dlsch_thread(void *arg) {
usleep(200); usleep(200);
} }
res_dl=pullTpool(&nf, &pool_dl); res_dl=pullTpool(&nf, &pool_dl);
nbDlProcessing--; nbDlProcessing--;
pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl); pushNotifiedFIFO_nothreadSafe(&freeBlocks_dl,res_dl);
//msgToPush->key=0; //msgToPush->key=0;
//pushTpool(Tpool, msgToPush); //pushTpool(Tpool, msgToPush);
} // while !oai_exit } // while !oai_exit
return NULL; return NULL;
......
...@@ -793,7 +793,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext, ...@@ -793,7 +793,7 @@ void nr_dlsch_channel_compensation(int **rxdataF_ext,
unsigned short rb; unsigned short rb;
unsigned char aatx,aarx,atx; unsigned char aatx,aarx,atx;
__m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*dl_ch_mag128r,*rxdataF128,*rxdataF_comp128,*rho128; __m128i *dl_ch128,*dl_ch128_2,*dl_ch_mag128,*dl_ch_mag128b,*dl_ch_mag128r,*rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b,QAM_amp128r; __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0},QAM_amp128r={0};
QAM_amp128b = _mm_setzero_si128(); QAM_amp128b = _mm_setzero_si128();
for (aatx=0; aatx<nb_aatx; aatx++) { for (aatx=0; aatx<nb_aatx; aatx++) {
...@@ -1314,7 +1314,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext, ...@@ -1314,7 +1314,7 @@ void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
int length_mod8 = 0; int length_mod8 = 0;
int length2; int length2;
__m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b, *dl_ch128_2, *rxdataF128,*rxdataF_comp128,*rho128; __m128i *dl_ch128,*dl_ch_mag128,*dl_ch_mag128b, *dl_ch128_2, *rxdataF128,*rxdataF_comp128,*rho128;
__m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128,QAM_amp128b; __m128i mmtmpD0,mmtmpD1,mmtmpD2,mmtmpD3,QAM_amp128={0},QAM_amp128b={0};
int aatx = 0, aarx = 0; int aatx = 0, aarx = 0;
for (aatx=0; aatx<n_tx; aatx++) { for (aatx=0; aatx<n_tx; aatx++) {
...@@ -2823,7 +2823,7 @@ uint8_t nr_zero_forcing_rx_2layers(int **rxdataF_comp, ...@@ -2823,7 +2823,7 @@ uint8_t nr_zero_forcing_rx_2layers(int **rxdataF_comp,
* *
**************************************************************************/ **************************************************************************/
__m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*dl_ch_mag128_0,*dl_ch_mag128b_0,*dl_ch_mag128_1,*dl_ch_mag128b_1,*determ_fin_128; __m128i *rxdataF_comp128_0,*rxdataF_comp128_1,*dl_ch_mag128_0,*dl_ch_mag128b_0,*dl_ch_mag128_1,*dl_ch_mag128b_1,*determ_fin_128;
__m128i mmtmpD2,mmtmpD3,mmtmpD0,mmtmpD1,QAM_amp128,QAM_amp128b; __m128i mmtmpD2,mmtmpD3,mmtmpD0,mmtmpD1,QAM_amp128={0},QAM_amp128b={0};
__m128i *after_mf_a_128,*after_mf_b_128, *after_mf_c_128, *after_mf_d_128; __m128i *after_mf_a_128,*after_mf_b_128, *after_mf_c_128, *after_mf_d_128;
determ_fin_128 = (__m128i *)&determ_fin[0]; determ_fin_128 = (__m128i *)&determ_fin[0];
......
...@@ -894,7 +894,7 @@ void phy_scope_nrUE(OAI_phy_scope_t *form, ...@@ -894,7 +894,7 @@ void phy_scope_nrUE(OAI_phy_scope_t *form,
static void *nrUEscopeThread(void *arg) { static void *nrUEscopeThread(void *arg) {
PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg; PHY_VARS_NR_UE *ue=(PHY_VARS_NR_UE *)arg;
size_t stksize; size_t stksize;
pthread_attr_t atr; pthread_attr_t atr={0};
pthread_attr_getstacksize(&atr, &stksize); pthread_attr_getstacksize(&atr, &stksize);
pthread_attr_setstacksize(&atr,32*1024*1024 ); pthread_attr_setstacksize(&atr,32*1024*1024 );
int fl_argc=1; int fl_argc=1;
......
...@@ -216,7 +216,7 @@ int main(int argc, char **argv){ ...@@ -216,7 +216,7 @@ int main(int argc, char **argv){
char c; char c;
double sigma2, sigma2_dB = 0, SNR, snr0 = -2.0, snr1 = 0.0, ue_speed0 = 0.0, ue_speed1 = 0.0; double sigma2, sigma2_dB = 0, SNR, snr0 = -2.0, snr1 = 0.0, ue_speed0 = 0.0, ue_speed1 = 0.0;
double **s_re, **s_im, **r_re, **r_im, iqim = 0.0, delay_avg = 0, ue_speed = 0, fs, bw; double **s_re, **s_im, **r_re, **r_im, iqim = 0.0, delay_avg = 0, ue_speed = 0, fs=-1, bw;
int i, l, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1; int i, l, aa, aarx, **txdata, trial, n_frames = 1, prach_start, rx_prach_start; //, ntrials=1;
int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0; int N_RB_UL = 106, delay = 0, NCS_config = 13, rootSequenceIndex = 1, threequarter_fs = 0, mu = 1, fd_occasion = 0, loglvl = OAILOG_INFO, numRA = 0, prachStartSymbol = 0;
uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0; uint8_t snr1set = 0, ue_speed1set = 0, transmission_mode = 1, n_tx = 1, n_rx = 1, awgn_flag = 0, msg1_frequencystart = 0, num_prach_fd_occasions = 1, prach_format=0;
......
...@@ -285,7 +285,7 @@ int main(int argc, char **argv) ...@@ -285,7 +285,7 @@ int main(int argc, char **argv)
int gNB_id = 0; int gNB_id = 0;
int ap; int ap;
int tx_offset; int tx_offset;
int32_t txlev; int32_t txlev=0;
int start_rb = 0; int start_rb = 0;
int UE_id =0; // [hna] only works for UE_id = 0 because NUMBER_OF_NR_UE_MAX is set to 1 (phy_init_nr_gNB causes segmentation fault) int UE_id =0; // [hna] only works for UE_id = 0 because NUMBER_OF_NR_UE_MAX is set to 1 (phy_init_nr_gNB causes segmentation fault)
float target_error_rate = 0.01; float target_error_rate = 0.01;
......
...@@ -1529,7 +1529,7 @@ static int tx_list_size(nr_rlc_entity_am_t *entity, ...@@ -1529,7 +1529,7 @@ static int tx_list_size(nr_rlc_entity_am_t *entity,
{ {
int ret = 0; int ret = 0;
while (l != NULL) { while (l != NULL && ret < maxsize) {
ret += compute_pdu_header_size(entity, l) + l->size; ret += compute_pdu_header_size(entity, l) + l->size;
l = l->next; l = l->next;
} }
......
...@@ -78,7 +78,7 @@ static int tx_list_size(nr_rlc_entity_tm_t *entity, ...@@ -78,7 +78,7 @@ static int tx_list_size(nr_rlc_entity_tm_t *entity,
{ {
int ret = 0; int ret = 0;
while (l != NULL) { while (l != NULL && ret < maxsize) {
ret += l->size; ret += l->size;
l = l->next; l = l->next;
} }
......
...@@ -497,7 +497,7 @@ static int tx_list_size(nr_rlc_entity_um_t *entity, ...@@ -497,7 +497,7 @@ static int tx_list_size(nr_rlc_entity_um_t *entity,
{ {
int ret = 0; int ret = 0;
while (l != NULL) { while (l != NULL && ret < maxsize) {
ret += compute_pdu_header_size(entity, l) + l->size; ret += compute_pdu_header_size(entity, l) + l->size;
l = l->next; l = l->next;
} }
......
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