diff --git a/executables/dl_fs6.c b/executables/dl_fs6.c index 6b803698950f7c981923118ae137c8d4899730a7..5cdb6a04449ccb1220886cc1d8a2f7b843617b42 100644 --- a/executables/dl_fs6.c +++ b/executables/dl_fs6.c @@ -6,6 +6,23 @@ #define FS6_BUF_SIZE 100*1000 static UDPsock_t sockFS6; +typedef struct { + int frame; + int subframe; +} fs6_ul_t; + + +typedef struct { + int frame; + int subframe; + int num_pdcch_symbols; + int num_dci; + int amp; + bool UE_active[NUMBER_OF_UE_MAX]; + LTE_eNB_PHICH phich_vars; +} fs6_dl_t; + + #if 0 void pdsch_procedures(PHY_VARS_eNB *eNB, @@ -90,17 +107,11 @@ void phy_procedures_eNB_uespec_RX_extract(PHY_VARS_eNB *phy_vars_eNB,L1_rxtx_pro void phy_procedures_eNB_uespec_RX_process(PHY_VARS_eNB *phy_vars_eNB,L1_rxtx_proc_t *proc) { } -typedef struct { - int frame; - int subframe; - int num_pdcch_symbols; - int num_dci; - int amp; - bool UE_active[NUMBER_OF_UE_MAX]; - LTE_eNB_PHICH phich_vars; -} fs6_dl_t; - void phy_procedures_eNB_TX_process(uint8_t *bufferZone, int bufSize, PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int do_meas ) { + commonUDP_t *UDPheader=(commonUDP_t *) bufferZone; + UDPheader->contentBytes=1000; + UDPheader->nbBlocks=1; + fs6_dl_t *header=(fs6_dl_t *) commonUDPdata(bufferZone); // TBD: read frame&subframe from received data int frame=proc->frame_tx; int subframe=proc->subframe_tx; @@ -113,6 +124,7 @@ void phy_procedures_eNB_TX_process(uint8_t *bufferZone, int bufSize, PHY_VARS_eN uint32_t ul_frame; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; LTE_UL_eNB_HARQ_t *ulsch_harq; + if (do_meas==1) { start_meas(&eNB->phy_proc_tx); @@ -149,7 +161,7 @@ void phy_procedures_eNB_TX_process(uint8_t *bufferZone, int bufSize, PHY_VARS_eN header->num_dci, &eNB->pdcch_vars[subframe&1].dci_alloc[0], 0, - headerAMP, + header->amp, fp, eNB->common_vars.txdataF, header->subframe); @@ -162,9 +174,9 @@ void phy_procedures_eNB_TX_process(uint8_t *bufferZone, int bufSize, PHY_VARS_eN } for (int UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) { - if (header.UE_active[UE_id]) { // if we generate dlsch, we must generate pdsch - dlsch0 = eNB->dlsch[UE_id][0]; - dlsch1 = eNB->dlsch[UE_id][1]; + if (header->UE_active[UE_id]) { // if we generate dlsch, we must generate pdsch + LTE_eNB_DLSCH_t *dlsch0 = eNB->dlsch[UE_id][0]; + LTE_eNB_DLSCH_t *dlsch1 = eNB->dlsch[UE_id][1]; pdsch_procedures(eNB, proc, harq_pid, @@ -173,13 +185,14 @@ void phy_procedures_eNB_TX_process(uint8_t *bufferZone, int bufSize, PHY_VARS_eN } } - eNB->phich_vars[subframe&1]=header.phich_vars; + eNB->phich_vars[subframe&1]=header->phich_vars; generate_phich_top(eNB, proc, AMP); } -void phy_procedures_eNB_TX_extract(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int do_meas, uint8_t *buf, int bufSize) { +void phy_procedures_eNB_TX_extract(uint8_t bufferZone, PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int do_meas, uint8_t *buf, int bufSize) { + fs6_dl_t *header=(fs6_dl_t *) commonUDPdata(bufferZone); int frame=proc->frame_tx; int subframe=proc->subframe_tx; uint32_t i,aa; @@ -195,8 +208,8 @@ void phy_procedures_eNB_TX_extract(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int if ((fp->frame_type == TDD) && (subframe_select (fp, subframe) == SF_UL)) return; - header.frame=frame; - header.subframe=subframe; + header->frame=frame; + header->subframe=subframe; // clear existing ulsch dci allocations before applying info from MAC (this is table ul_subframe = pdcch_alloc2ul_subframe (fp, subframe); ul_frame = pdcch_alloc2ul_frame (fp, frame, subframe); @@ -247,9 +260,9 @@ void phy_procedures_eNB_TX_extract(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int LOG_D(PHY,"num_pdcch_symbols %"PRIu8",number dci %"PRIu8"\n",num_pdcch_symbols, num_dci); if (NFAPI_MODE==NFAPI_MONOLITHIC || NFAPI_MODE==NFAPI_MODE_PNF) { - header.num_pdcch_symbols=num_pdcch_symbols; - header.num_dci=num_dci; - header.amp=AMP; + header->num_pdcch_symbols=num_pdcch_symbols; + header->num_dci=num_dci; + header->amp=AMP; } if (do_meas==1) stop_meas(&eNB->dlsch_common_and_dci); @@ -286,7 +299,7 @@ void phy_procedures_eNB_TX_extract(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int dlsch0->harq_ids[frame%2][6], dlsch0->harq_ids[frame%2][7]); } else { - header.UE_active[UE_id]=true; + header->UE_active[UE_id]=true; if (dlsch_procedures(eNB, proc, @@ -308,15 +321,12 @@ void phy_procedures_eNB_TX_extract(PHY_VARS_eNB *eNB, L1_rxtx_proc_t *proc, int } } - header.phich_vars=eNB->phich_vars[subframe&1]; + header->phich_vars=eNB->phich_vars[subframe&1]; if (do_meas==1) stop_meas(&eNB->dlsch_ue_specific); if (do_meas==1) stop_meas(&eNB->phy_proc_tx); - commonUDP_t *header=(commonUDP_t *) buf; - header->contentBytes=1000; - header->nbBlocks=1; return; } @@ -385,7 +395,7 @@ void DL_cu_fs6(RU_t *ru,int frame, int subframe) { eNB->if_inst->UL_indication(&eNB->UL_INFO); pthread_mutex_unlock(&eNB->UL_INFO_mutex); uint8_t bufferZone[FS6_BUF_SIZE]; - phy_procedures_eNB_TX_extract(eNB, &proc->L1_proc, 1, bufferZone, FS6_BUF_SIZE); + phy_procedures_eNB_TX_extract(bufferZone, eNB, &proc->L1_proc, 1, bufferZone, FS6_BUF_SIZE); sendSubFrame(&sockFS6, bufferZone ); } diff --git a/executables/split_headers.h b/executables/split_headers.h index 064615284f862ef5d7b33cf299abcea899272ac8..6480680693defade7db32790f0fc2f62e79b3ebd 100644 --- a/executables/split_headers.h +++ b/executables/split_headers.h @@ -37,11 +37,16 @@ typedef struct frequency_s { bool createUDPsock (char *sourceIP, char *sourcePort, char *destIP, char *destPort, UDPsock_t *result); int receiveSubFrame(UDPsock_t *sock, uint64_t expectedTS, void *bufferZone, int bufferSize); int sendSubFrame(UDPsock_t *sock, void *bufferZone); + inline size_t alignedSize(void *ptr) { commonUDP_t *header=(commonUDP_t *) ptr; return ((header->contentBytes+sizeof(commonUDP_t)+blockAlign-1)/blockAlign)*blockAlign; } +inline void * commonUDPdata(void* ptr) { + return (void*) (((commonUDP_t*)ptr)+1); +} + void *cu_fs6(void *arg); void *du_fs6(void *arg); void fill_rf_config(RU_t *ru, char *rf_config_file);