diff --git a/executables/main-fs6.c b/executables/main-fs6.c index 15108b0e45..f4ea039073 100644 --- a/executables/main-fs6.c +++ b/executables/main-fs6.c @@ -615,7 +615,7 @@ void pusch_procedures_fromsplit(uint8_t *bufferZone, int bufSize, PHY_VARS_eNB * &ulsch_harq->Kplus, &ulsch_harq->Kminus, &ulsch_harq->F); - int ret = ulsch_decoding_data(eNB, proc, i, harq_pid, + ulsch_decoding_data(eNB, proc, i, harq_pid, ulsch_harq->nb_rb>20 ? 1 : 0); stop_meas(&eNB->ulsch_decoding_stats); } // if ((ulsch) && diff --git a/executables/main-ocp.c b/executables/main-ocp.c index 4e657e6d28..3fe1334228 100644 --- a/executables/main-ocp.c +++ b/executables/main-ocp.c @@ -623,8 +623,7 @@ void rx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { setAllfromTS(timestamp_rx, proc); } -int tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { - int ret=0; +void tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; void *txp[ru->nb_tx]; int i; @@ -672,7 +671,7 @@ int tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { /* add fail safe for late command end */ // prepare tx buffer pointers - ret=ru->rfdevice.trx_write_func(&ru->rfdevice, + ru->rfdevice.trx_write_func(&ru->rfdevice, proc->timestamp_tx+ru->ts_offset-ru->openair0_cfg.tx_sample_advance-sf_extension, txp, siglen+sf_extension, @@ -682,7 +681,7 @@ int tx_rf(RU_t *ru, L1_rxtx_proc_t *proc) { (long long unsigned int)proc->timestamp_tx,proc->frame_tx,proc->subframe_tx); } - return ret; + return; } static void *ru_thread( void *param ) { diff --git a/executables/split_headers.h b/executables/split_headers.h index b013617cfd..a0c540e42f 100644 --- a/executables/split_headers.h +++ b/executables/split_headers.h @@ -13,10 +13,9 @@ #define MTU 65536 #define UDP_TIMEOUT 900000L // in micro second (struct timeval, NOT struct timespec) // linux may timeout for a much longer time (up to 10ms) -#define MAX_BLOCKS 16 -#define blockAlign 32 //bytes - +#define blockAlign 32 //bytes to align memory for SIMD copy (256 bits vectors) +// FS6 transport configuration and handler typedef struct { char *sourceIP; char *sourcePort; @@ -29,6 +28,8 @@ typedef struct { #define CTsentCUv0 0xA500 #define CTsentDUv0 0x5A00 +// Main FS6 transport layer header +// All packets starts with this header typedef struct commonUDP_s { uint64_t timestamp; // id of the group (subframe for LTE) uint16_t nbBlocks; // total number of blocks for this timestamp @@ -37,14 +38,8 @@ typedef struct commonUDP_s { uint16_t contentBytes; // will be sent in a UDP packet, so must be < 2^16 bytes } commonUDP_t; -typedef struct frequency_s { - int frame; - int subframe; - int sampleSize; - int nbAnt; - int nbSamples; -} frequency_t; - +// FS6 UL common header (DU to CU) +// gives the RACH detection data and is always sent to inform the CU that a subframe arrived typedef struct { uint16_t max_preamble[4]; uint16_t max_preamble_energy[4]; @@ -52,6 +47,8 @@ typedef struct { uint16_t avg_preamble_energy[4]; } fs6_ul_t; +// FS6 DL common header (CU to DU) +// gives the DCI configuration from each subframe typedef struct { uint8_t pbch_pdu[4]; int num_pdcch_symbols; @@ -62,6 +59,9 @@ typedef struct { LTE_eNB_PHICH phich_vars; } fs6_dl_t; +// a value to type all sub packets, +// to detect errors, and to be able to extend to other versions +// the first byte of each sub structure should match one of these values enum pckType { fs6UlConfig=25, fs6DlConfig=26, @@ -72,6 +72,8 @@ enum pckType { fs6ULindicationSr=41, }; +// CU to DU definition of a future UL subframe decode +// defines a UE future data plane typedef struct { enum pckType type:8; uint16_t UE_id; @@ -136,6 +138,8 @@ typedef struct { uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP]; } fs6_dl_ulsched_t; +// CU to DU defintion of a DL packet for a given UE +// The data itself is padded at the end of this structure typedef struct { enum pckType type:8; int UE_id; @@ -150,24 +154,28 @@ typedef struct { uint8_t pdsch_start; uint8_t sib1_br_flag; uint16_t i0; - uint32_t rb_alloc[4];; + uint32_t rb_alloc[4]; int dataLen; } fs6_dl_uespec_t; +// CU to DU definition of CCH channel typedef struct { int16_t UE_id; LTE_eNB_UCI cch_vars; } fs6_dl_uespec_ulcch_element_t; +// header to group all UE CCH channels definitions in one UDP packet typedef struct { enum pckType type:8; int16_t nb_active_ue; } fs6_dl_uespec_ulcch_t; +// code internal, not transmitted as this typedef struct { int ta; } ul_propagation_t; +// One UE UL data, data plane, UE data appended after the header typedef struct { enum pckType type:8; short UE_id; @@ -184,6 +192,7 @@ typedef struct { uint8_t cqi_crc_status; } fs6_ul_uespec_t; +// UL UCI (control plane), per UE typedef struct { enum pckType type:8; int UEid; @@ -198,6 +207,7 @@ typedef struct { int32_t stat; } fs6_ul_uespec_uci_element_t; +// all segments UCI grouped in one UDP packet typedef struct { enum pckType type:8; int16_t nb_active_ue; @@ -239,7 +249,7 @@ void *du_fs6(void *arg); void fill_rf_config(RU_t *ru, char *rf_config_file); int init_rf(RU_t *ru); void rx_rf(RU_t *ru, L1_rxtx_proc_t *proc); -int tx_rf(RU_t *ru, L1_rxtx_proc_t *proc); +void tx_rf(RU_t *ru, L1_rxtx_proc_t *proc); void common_signal_procedures (PHY_VARS_eNB *eNB,int frame, int subframe); void pmch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc); bool dlsch_procedures(PHY_VARS_eNB *eNB, diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 2b032c208a..3036c383f2 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1187,11 +1187,9 @@ void postDecode(L1_rxtx_proc_t *proc, notifiedFIFO_elt_t *req) { } else { if ( rdata->nbSegments != ulsch_harq->processedSegments ) { int nb=abortTpool(&proc->threadPool, req->key); - printf("nb1:%d\n", nb); nb+=abortNotifiedFIFO(&proc->respDecode, req->key); - printf("nb2:%d\n", nb); proc->nbDecode-=nb; - LOG_I(PHY,"uplink segment error %d/%d, aborted %d segments",rdata->segment_r,rdata->nbSegments, nb); + LOG_I(PHY,"uplink segment error %d/%d, aborted %d segments\n",rdata->segment_r,rdata->nbSegments, nb); AssertFatal(ulsch_harq->processedSegments+nb == rdata->nbSegments,"processed: %d, aborted: %d, total %d\n", ulsch_harq->processedSegments, nb, rdata->nbSegments); ulsch_harq->processedSegments=rdata->nbSegments; @@ -1253,7 +1251,7 @@ void postDecode(L1_rxtx_proc_t *proc, notifiedFIFO_elt_t *req) { } void pusch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) { - uint32_t ret=0,i; + uint32_t i; uint32_t harq_pid; uint8_t nPRS; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; @@ -1262,7 +1260,6 @@ void pusch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) { const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; uint32_t harq_pid0 = subframe2harq_pid(&eNB->frame_parms,frame,subframe); - int rvidx_tab[4] = {0,2,3,1}; for (i = 0; i < NUMBER_OF_UE_MAX; i++) { ulsch = eNB->ulsch[i]; @@ -1316,7 +1313,7 @@ void pusch_procedures(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) { rx_ulsch(eNB,proc, i); stop_meas(&eNB->ulsch_demodulation_stats); start_meas(&eNB->ulsch_decoding_stats); - ret = ulsch_decoding(eNB,proc, + ulsch_decoding(eNB,proc, i, 0, // control_only_flag ulsch_harq->V_UL_DAI, diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 4aa09b59de..f41d866221 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -184,7 +184,7 @@ rx_sdu(const module_id_t enb_mod_idP, UE_template_ptr->scheduled_ul_bytes = 0; } } else { // sduP == NULL => error - LOG_W(MAC, "[eNB %d][PUSCH %d] CC_id %d %d.%d ULSCH in error in round %d, ul_cqi %d, UE_id %d, RNTI %x\n", + LOG_W(MAC, "[eNB %d][PUSCH %d] CC_id %d %d.%d ULSCH in error in round %d, ul_cqi %d, UE_id %d, RNTI %x (len %d)\n", enb_mod_idP, harq_pid, CC_idP, @@ -193,7 +193,8 @@ rx_sdu(const module_id_t enb_mod_idP, UE_scheduling_control->round_UL[CC_idP][harq_pid], ul_cqi, UE_id, - current_rnti); + current_rnti, + sdu_lenP); if (ul_cqi > 200) { // too high energy pattern UE_scheduling_control->pusch_snr[CC_idP] = ul_cqi;