From 75665ad0fc1247b598eb4b6db98b78920baa5cd2 Mon Sep 17 00:00:00 2001 From: laurent Date: Thu, 1 Aug 2019 10:45:25 +0200 Subject: [PATCH] Create DL sub header --- SystemX-tutorial-design.odt | Bin 54430 -> 55501 bytes cmake_targets/CMakeLists.txt | 2 +- executables/{dl_fs6.c => main-fs6.c} | 99 +++++++++++++++------ executables/split_headers.h | 8 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 12 +-- openair1/PHY/LTE_TRANSPORT/transport_eNB.h | 6 +- openair1/SCHED/phy_procedures_lte_eNb.c | 6 +- 7 files changed, 90 insertions(+), 43 deletions(-) rename executables/{dl_fs6.c => main-fs6.c} (92%) diff --git a/SystemX-tutorial-design.odt b/SystemX-tutorial-design.odt index 788f9de955d3891f294a4efd08686925c6834e61..42e195ac112b370ff7d48cfbb5e083d9cfaecf6e 100644 GIT binary patch delta 21677 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�e+QF_zHp1N4uo9b0i5eK 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 delta 20589 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

)QR!~2=}W7u<&nt14zsWr3);Rp^>DYefC0$* zaidVpUyerMa)9giJ=CB>Uc@8W-6Udtf9{vbLJG*x$Wtrrdih-S zMVF0+?+eU__^P5liMa|D723)0yL}CY`~s={+x>mMU90arYfYfV+P?Q?lpN=eVFsD+ zw+)25K2Vj?N}yDq(HD*Sd+Y-9fB7VBYuHk``uJd>rz^m!VaLiMfAVd;x^HzSCYqlb zLA;Ly*)3X)D_?H6oCbG4-r?@mT)HlRY@Rjq*K)=u;;}^kMt* z5C?PebD?a_jXeT*tL8r$F*tw2*Bo9XvOx`nHhT(wywg%lyw@UAU)xQlC-YCs?M6q# zC2iTX=%bwz_TFz2blD47ZRCrq+l3}x&u0xidN2xX#z3`bW^+D`DrMUtPiOjzV$j=> z?A%xs)(vrRuX9{;ql2m1ZSfg03@OD)`UZ$=_9n6qY(+wxB3RsXJx@U@{oOpcL0S@J ziiaI?y=xcRH6`x~uec25v#0cSH^_xo>qA{$Z2%wop`NtyR3c#=gma>JE8c-SgJ4Gv zB484|Rpmydfe+i6Vy{I z>JZ5&P%3P+FVjekJPAWw-lSKffus=|q-6(Nmtv^c>DXkJrEglksM8RoE7N8TzFGi( zI9sPad>?_y^@eRKI!UcRP*ySxpyo+WDL?sO=}6kYg->569#v zLCe<};LP$@R_MfNuJ3&QbF>H60vrrBeAcd@MVmv4pV$_tYOv5&CW(YkZ9tq$EPSUi zDU0KQDU<_Sy0!MkGGmR1l+Tq2*ZA`2(m{c&or}H&@ON33mW~KbD;L6d1oio_D#o+~ z@WR?x`Fbdb-BCq_K73^)Lnr0!zZ7`dn>kdFF~t1waDW;@kD!tpRmKadlru~ucwUQ!vI@ zDj-2en|rOi*jP(8y||qy+9odCrk6)C(d2e2Mz75uLUX>e~$wC28mhweQ8ZQUo8TuRrZ9_6Dm_GpBX- z5xfTn^MB3qC^aR_7?OOj2zMJRJ6_zFIY``jqXg;AC1Wd7YyB#{R$gbi--~~n=3%)k zl38#qdGJBr-J~ye&M{7YSJ?^o~ zAKh8`ZLQHQX5!s#ja;WQ8ke@8P|KMg39vL?19n-@3CFI=CnDxE`l%=QlW+XpP^cA~ zRbS9+4g#Go@iUsC<7DfFhQJ6d&f5jiG<7xLADjMqP6mST9Q2p>kHKJ3l;;>fqi>(- z^eaXXXp@lOta%YkKn40|ejMucnCR7W67$ahIn=i?N!Ig|-&-EfY0WROKp1bDulsch[i]; - if (ulsch->ue_type > 0) + if (ulsch->ue_type > NOCE) harq_pid = 0; else harq_pid= subframe2harq_pid(&eNB->frame_parms,frame,subframe); @@ -232,14 +232,12 @@ void pusch_procedures_extract(uint8_t *bufferZone, int bufSize, PHY_VARS_eNB *eN } } -void phy_procedures_eNB_uespec_RX_extract(uint8_t *buf, int bufSize, PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) { +void phy_procedures_eNB_uespec_RX_extract(uint8_t *bufferZone, int bufSize, PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc) { //RX processing for ue-specific resources (i LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; const int subframe = proc->subframe_rx; const int frame = proc->frame_rx; /* TODO: use correct rxdata */ - T (T_ENB_PHY_INPUT_SIGNAL, T_INT (eNB->Mod_id), T_INT (frame), T_INT (subframe), T_INT (0), - T_BUFFER (&eNB->RU_list[0]->common.rxdata[0][subframe * eNB->frame_parms.samples_per_tti], eNB->frame_parms.samples_per_tti * 4)); if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) return; @@ -257,7 +255,7 @@ void phy_procedures_eNB_uespec_RX_extract(uint8_t *buf, int bufSize, PHY_VARS_eN uci_procedures (eNB, proc); if (NFAPI_MODE==NFAPI_MONOLITHIC || NFAPI_MODE==NFAPI_MODE_PNF) { // If PNF or monolithic - pusch_procedures_extract(buf, bufSize, eNB,proc); + pusch_procedures_extract(bufferZone, bufSize, eNB,proc); } lte_eNB_I0_measurements (eNB, subframe, 0, eNB->first_run_I0_measurements); @@ -277,9 +275,6 @@ void phy_procedures_eNB_uespec_RX_extract(uint8_t *buf, int bufSize, PHY_VARS_eN LOG_I (PHY, "max_I0 %d, min_I0 %d\n", max_I0, min_I0); } - commonUDP_t *header=(commonUDP_t *) buf; - header->contentBytes=1000; - header->nbBlocks=1; return; } @@ -293,7 +288,7 @@ void pusch_procedures_process(uint8_t *bufferZone, int bufSize, PHY_VARS_eNB *eN for (int i = 0; i < NUMBER_OF_UE_MAX; i++) { LTE_eNB_ULSCH_t *ulsch = eNB->ulsch[i]; - if (ulsch->ue_type > 0) harq_pid = 0; + if (ulsch->ue_type > NOCE) harq_pid = 0; else harq_pid=harq_pid0; LTE_UL_eNB_HARQ_t *ulsch_harq = ulsch->harq_processes[harq_pid]; @@ -454,6 +449,35 @@ void phy_procedures_eNB_TX_process(uint8_t *bufferZone, int nbBlocks, PHY_VARS_e eNB->pdcch_vars[subframe&1].num_dci=header->num_dci; uint8_t num_mdci = eNB->mpdcch_vars[subframe&1].num_dci = header->num_mdci; + // Remove all scheduled DL, we will populate from the CU sending + for (int UE_id=0; UE_iddlsch[UE_id][0]; + + if ( dlsch0 && dlsch0->rnti>0 ) { +#ifdef PHY_TX_THREAD + dlsch0->active[subframe] = 0; +#else + dlsch0->active = 0; +#endif + } + } + + void *bufPtr=bufferZone; + + for (int i=0; i < nbBlocks; i++) { //nbBlocks is the actual received blocks + fs6_dl_uespec_t *dlPtr=(fs6_dl_uespec_t *)(commonUDPdata(bufPtr)+sizeof(fs6_dl_t)); +#ifdef PHY_TX_THREAD + eNB->dlsch[dlPtr->UE_id][0]->active[subframe] = 1; +#else + eNB->dlsch[dlPtr->UE_id][0]->active = 1; +#endif + eNB->dlsch[dlPtr->UE_id][0]->harq_ids[frame%2][subframe]=dlPtr->harq_pid; + eNB->dlsch[dlPtr->UE_id][0]->rnti=dlPtr->rnti; + memcpy(eNB->dlsch[dlPtr->UE_id][0]->harq_processes[dlPtr->harq_pid]->e, + commonUDPdata(((uint8_t *)dlPtr)+sizeof(fs6_dl_t)), dlPtr->dataLen); + bufPtr+=alignedSize(bufPtr); + } + if (do_meas==1) { start_meas(&eNB->phy_proc_tx); start_meas(&eNB->dlsch_common_and_dci); @@ -476,8 +500,8 @@ void phy_procedures_eNB_TX_process(uint8_t *bufferZone, int nbBlocks, PHY_VARS_e // clear previous allocation information for all UEs for (int i = 0; i < NUMBER_OF_UE_MAX; i++) { - if (eNB->dlsch[i][0]) - eNB->dlsch[i][0]->subframe_tx[subframe] = 0; + //if (eNB->dlsch[i][0]) + //eNB->dlsch[i][0]->subframe_tx[subframe] = 0; } if (NFAPI_MODE==NFAPI_MONOLITHIC || NFAPI_MODE==NFAPI_MODE_PNF) { @@ -500,10 +524,17 @@ void phy_procedures_eNB_TX_process(uint8_t *bufferZone, int nbBlocks, PHY_VARS_e } for (int UE_id=0; UE_idUE_dl_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]; - int harq_pid=dlsch0->harq_ids[frame%2][subframe]=header->UE_dl_active[UE_id]; + LTE_eNB_DLSCH_t *dlsch0 = eNB->dlsch[UE_id][0]; + LTE_eNB_DLSCH_t *dlsch1 = eNB->dlsch[UE_id][1]; + + if ((dlsch0)&&(dlsch0->rnti>0)&& +#ifdef PHY_TX_THREAD + (dlsch0->active[subframe] == 1) +#else + (dlsch0->active == 1) +#endif + ) { + int harq_pid=dlsch0->harq_ids[frame%2][subframe]; pdsch_procedures(eNB, proc, harq_pid, @@ -518,7 +549,7 @@ void phy_procedures_eNB_TX_process(uint8_t *bufferZone, int nbBlocks, PHY_VARS_e AMP); } -void appendFs6DLUE(uint8_t *bufferZone, uint8_t *UEdata, int UEdataLen) { +void appendFs6DLUE(uint8_t *bufferZone, int UE_id, int8_t harq_pid, uint16_t rnti, uint8_t *UEdata, int UEdataLen) { commonUDP_t *FirstUDPheader=(commonUDP_t *) bufferZone; // move to the end uint8_t *firstFreeByte=bufferZone; @@ -534,10 +565,14 @@ void appendFs6DLUE(uint8_t *bufferZone, uint8_t *UEdata, int UEdataLen) { commonUDP_t *newUDPheader=(commonUDP_t *) firstFreeByte; FirstUDPheader->nbBlocks++; newUDPheader->blockID=curBlock; - newUDPheader->contentBytes=sizeof(fs6_dl_t)+UEdataLen; + newUDPheader->contentBytes=sizeof(fs6_dl_t)+sizeof(fs6_dl_uespec_t) + UEdataLen; // We skip the fs6 DL header, that is populated by caller // This header will be duplicated during sending - memcpy(commonUDPdata(firstFreeByte+sizeof(fs6_dl_t)), UEdata, UEdataLen); + fs6_dl_uespec_t *tmp=(fs6_dl_uespec_t *) firstFreeByte+sizeof(fs6_dl_t); + tmp->UE_id=UE_id; + tmp->harq_pid=harq_pid; + tmp->rnti=rnti; + memcpy(commonUDPdata(((uint8_t *)tmp)+sizeof(fs6_dl_uespec_t)), UEdata, UEdataLen); } 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) { @@ -558,8 +593,8 @@ void phy_procedures_eNB_TX_extract(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx // clear previous allocation information for all UEs for (int i = 0; i < NUMBER_OF_UE_MAX; i++) { - if (eNB->dlsch[i][0]) - eNB->dlsch[i][0]->subframe_tx[subframe] = 0; + //if (eNB->dlsch[i][0]) + //eNB->dlsch[i][0]->subframe_tx[subframe] = 0; } /* TODO: check the following test - in the meantime it is put back as it was before */ @@ -569,7 +604,8 @@ void phy_procedures_eNB_TX_extract(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx for (int i=0; iulsch[i] && eNB->ulsch[i]->ue_type >0) + if (eNB->ulsch[i] && eNB->ulsch[i]->ue_type > NOCE) + // LTE-M case harq_pid = 0; else header->UE_ul_active[i] = harq_pid = subframe2harq_pid(fp,header->ul_frame,header->ul_subframe); @@ -608,7 +644,7 @@ void phy_procedures_eNB_TX_extract(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx uint8_t num_pdcch_symbols = eNB->pdcch_vars[subframe&1].num_pdcch_symbols; uint8_t num_dci = eNB->pdcch_vars[subframe&1].num_dci; - uint8_t num_mdci = eNB->mpdcch_vars[subframe&1].num_dci; + uint8_t num_mdci = eNB->mpdcch_vars[subframe&1].num_dci; 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) { @@ -626,8 +662,7 @@ void phy_procedures_eNB_TX_extract(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx LTE_eNB_DLSCH_t *dlsch0; for (int UE_id=0; UE_iddlsch[UE_id][0]; - header->UE_dl_active[UE_id]=-1; + LTE_eNB_DLSCH_t *dlsch0 = eNB->dlsch[UE_id][0]; if ((dlsch0)&&(dlsch0->rnti>0)&& #ifdef PHY_TX_THREAD @@ -641,7 +676,7 @@ void phy_procedures_eNB_TX_extract(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx AssertFatal(harq_pid>=0,"harq_pid is negative\n"); if (harq_pid>=8) { - if (dlsch0->ue_type==0) + if (dlsch0->ue_type == NOCE) LOG_E(PHY,"harq_pid:%d corrupt must be 0-7 UE_id:%d frame:%d subframe:%d rnti:%x [ %1d.%1d.%1d.%1d.%1d.%1d.%1d.%1d\n", harq_pid,UE_id,frame,subframe,dlsch0->rnti, dlsch0->harq_ids[frame%2][0], dlsch0->harq_ids[frame%2][1], @@ -652,8 +687,6 @@ void phy_procedures_eNB_TX_extract(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx dlsch0->harq_ids[frame%2][6], dlsch0->harq_ids[frame%2][7]); } else { - header->UE_dl_active[UE_id]=harq_pid; - if (dlsch_procedures(eNB, proc, harq_pid, @@ -673,6 +706,9 @@ void phy_procedures_eNB_TX_extract(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx */ LTE_DL_eNB_HARQ_t *dlsch_harq=dlsch0->harq_processes[harq_pid]; appendFs6DLUE(bufferZone, + UE_id, + harq_pid, + dlsch0->rnti, dlsch0->harq_processes[harq_pid]->e, get_G(fp, dlsch_harq->nb_rb, @@ -693,7 +729,7 @@ void phy_procedures_eNB_TX_extract(uint8_t *bufferZone, PHY_VARS_eNB *eNB, L1_rx #endif ) { // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later) - dlsch0->subframe_tx[subframe]=0; + //dlsch0->subframe_tx[subframe]=0; } } @@ -791,12 +827,17 @@ void UL_cu_fs6(RU_t *ru,int frame, int subframe, uint64_t TS) { commonUDP_t *UDPheader=(commonUDP_t *) bufferZone; int nb_blocks=receiveSubFrame(&sockFS6, TS, bufferZone, sizeof(bufferZone) ); + if (nb_blocks ==0) { + LOG_W(PHY, "CU lost a subframe\n"); + return; + } + if (nb_blocks != UDPheader->nbBlocks ) LOG_W(PHY, "received %d blocks for %d expected\n", nb_blocks, UDPheader->nbBlocks); // Fixme: datamodel issue PHY_VARS_eNB *eNB = RC.eNB[0][0]; - L1_proc_t *proc = &eNB->proc; + L1_proc_t *proc = &eNB->proc; prach_eNB_process(bufferZone, sizeof(bufferZone), eNB,NULL,proc->frame_rx,proc->subframe_rx); release_UE_in_freeList(eNB->Mod_id); diff --git a/executables/split_headers.h b/executables/split_headers.h index 4cb2f4a5c4..35e2e78d3a 100644 --- a/executables/split_headers.h +++ b/executables/split_headers.h @@ -53,13 +53,19 @@ typedef struct { DCI_ALLOC_t dci_alloc[32]; int num_mdci; int amp; - int8_t UE_dl_active[NUMBER_OF_UE_MAX]; // the HARQ id for this UE (-1: disabled) int8_t UE_ul_active[NUMBER_OF_UE_MAX]; int8_t UE_ul_first_rb[NUMBER_OF_UE_MAX]; // int8_t UE_ul_last_rb[NUMBER_OF_UE_MAX]; // LTE_eNB_PHICH phich_vars; } fs6_dl_t; +typedef struct { + int UE_id; + int8_t harq_pid; + uint16_t rnti; + int dataLen; +} fs6_dl_uespec_t; + 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, ssize_t secondHeaderSize); diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 29bbd774a1..476e255fef 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -307,7 +307,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t dlsch0_harq->codeword = 0; dlsch1_harq = dlsch1->harq_processes[rel8->harq_process]; dlsch1_harq->codeword = 1; - dlsch0->subframe_tx[subframe] = 1; + //dlsch0->subframe_tx[subframe] = 1; LOG_D(PHY,"NFAPI: SFN/SF:%04d%d proc:TX:SFN/SF:%04d%d dlsch0[rnti:%x harq_mask:%04x] dci_pdu[rnti:%x rnti_type:%d harq_process:%d ndi1:%d] dlsch0_harq[round:%d harq_mask:%x ndi:%d]\n", frame,subframe, @@ -658,7 +658,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t dlsch0_harq->codeword = 0; // printf("DCI: Setting subframe_tx for subframe %d\n",subframe); - dlsch0->subframe_tx[subframe] = 1; + //dlsch0->subframe_tx[subframe] = 1; conv_rballoc (rel8->resource_allocation_type, rel8->resource_block_coding, fp->N_RB_DL, dlsch0_harq->rb_alloc); @@ -868,7 +868,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t dlsch0_harq = dlsch0->harq_processes[rel8->harq_process]; dlsch1_harq = dlsch1->harq_processes[rel8->harq_process]; - dlsch0->subframe_tx[subframe] = 1; + //dlsch0->subframe_tx[subframe] = 1; dlsch0->harq_ids[frame%2][subframe] = rel8->harq_process; dlsch1->harq_ids[frame%2][subframe] = rel8->harq_process; @@ -1316,7 +1316,7 @@ void fill_dci_and_dlsch(PHY_VARS_eNB *eNB,int frame,int subframe,L1_rxtx_proc_t } if (dlsch0 != NULL) { - dlsch0->subframe_tx[subframe] = 1; + //dlsch0->subframe_tx[subframe] = 1; dlsch0->harq_ids[frame%2][subframe] = rel8->harq_process; } @@ -1723,7 +1723,7 @@ void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,mDCI_ALLOC_t *dc dlsch0_harq->codeword = 0; // printf("DCI: Setting subframe_tx for subframe %d\n",subframe); - dlsch0->subframe_tx[(subframe + 2) % 10] = 1; + //dlsch0->subframe_tx[(subframe + 2) % 10] = 1; LOG_D(PHY,"PDSCH : resource_block_coding %x\n",rel13->resource_block_coding); conv_eMTC_rballoc (rel13->resource_block_coding, @@ -1746,7 +1746,7 @@ void fill_mdci_and_dlsch(PHY_VARS_eNB *eNB,L1_rxtx_proc_t *proc,mDCI_ALLOC_t *dc dlsch0_harq->dl_power_off = 1; - dlsch0->subframe_tx[subframe] = 1; + //dlsch0->subframe_tx[subframe] = 1; if (dlsch0->rnti != rel13->rnti) { // if rnti of dlsch is not the same as in the config, this is a new entry dlsch0_harq->round = 0; dlsch0->harq_mask =0; diff --git a/openair1/PHY/LTE_TRANSPORT/transport_eNB.h b/openair1/PHY/LTE_TRANSPORT/transport_eNB.h index 9e8685732f..196bfcaafb 100644 --- a/openair1/PHY/LTE_TRANSPORT/transport_eNB.h +++ b/openair1/PHY/LTE_TRANSPORT/transport_eNB.h @@ -154,11 +154,11 @@ typedef struct { uint8_t active; #endif /// indicator of UE type (0 = LTE, 1,2 = Cat-M) - int ue_type; + UE_type_t ue_type; /// HARQ process mask, indicates which processes are currently active uint16_t harq_mask; /// Indicator of TX activation per subframe. Used during PUCCH detection for ACK/NAK. - uint8_t subframe_tx[10]; + //uint8_t subframe_tx[10]; /// First CCE of last PDSCH scheduling per subframe. Again used during PUCCH detection for ACK/NAK. uint8_t nCCE[10]; /// Process ID's per subframe. Used to associate received ACKs on PUSCH/PUCCH to DLSCH harq process ids @@ -450,7 +450,7 @@ typedef struct { typedef struct { #if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) /// UE type (normal, CEModeA, CEModeB) - uint8_t ue_type; + UE_type_t ue_type; #endif /// HARQ process mask, indicates which processes are currently active uint16_t harq_mask; diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index c4e162ec66..261e092737 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -410,8 +410,8 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, // clear previous allocation information for all UEs for (i = 0; i < NUMBER_OF_UE_MAX; i++) { - if (eNB->dlsch[i][0]) - eNB->dlsch[i][0]->subframe_tx[subframe] = 0; + //if (eNB->dlsch[i][0]) + //eNB->dlsch[i][0]->subframe_tx[subframe] = 0; } /* TODO: check the following test - in the meantime it is put back as it was before */ @@ -548,7 +548,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, #endif ) { // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later) - dlsch0->subframe_tx[subframe]=0; + //dlsch0->subframe_tx[subframe]=0; } VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0);