diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 852e61043585e46afb9cade7fde35b3a3c13539f..a163225f03c77dac72e1d808221c577e6bc53dbe 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -7127,10 +7127,10 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, harq_pid = subframe2harq_pid(frame_parms, pdcch_alloc2ul_frame(frame_parms, - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe), + phy_vars_eNB->proc[sched_subframe].frame_tx, + subframe), pdcch_alloc2ul_subframe(frame_parms,subframe)); - + // printf("eNB: sched_subframe %d, subframe %d, frame_tx %d\n",sched_subframe,subframe,phy_vars_eNB->proc[sched_subframe].frame_tx); switch (frame_parms->N_RB_DL) { @@ -7598,9 +7598,9 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, break; } } else { - ulsch->harq_processes[harq_pid]->O_RI = 0;//1; + ulsch->harq_processes[harq_pid]->O_RI = 0; ulsch->harq_processes[harq_pid]->Or2 = 0; - ulsch->harq_processes[harq_pid]->Or1 = 0;//sizeof_HLC_subband_cqi_nopmi_5MHz; + ulsch->harq_processes[harq_pid]->Or1 = 0; ulsch->harq_processes[harq_pid]->uci_format = HLC_subband_cqi_nopmi; } diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 4c9986bf16f4630b44902173dd9b37e12e6980df..8b3a6c875884ae2c617af166dc7a6b09d502d1fc 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1466,7 +1466,6 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, nseq_PHICH = ((ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) + ulsch_eNB[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH); - //#ifdef DEBUG_PHICH LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n", phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH, @@ -1474,7 +1473,6 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, ulsch_eNB[UE_id]->harq_processes[harq_pid]->first_rb, ulsch_eNB[UE_id]->harq_processes[harq_pid]->dci_alloc); - //#endif if (ulsch_eNB[UE_id]->Msg3_active == 1) { LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n", phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe, @@ -1509,12 +1507,10 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n", phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - // ulsch_eNB[UE_id]->harq_processes[harq_pid]->Ndi = 0; - // ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; //this is already done in phy_procedures ulsch_eNB[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch_eNB[UE_id]->harq_processes[harq_pid]->round&3]; ulsch_eNB[UE_id]->harq_processes[harq_pid]->O_RI = 0; ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or2 = 0; - ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or1 = 0;//sizeof_HLC_subband_cqi_nopmi_5MHz; + ulsch_eNB[UE_id]->harq_processes[harq_pid]->Or1 = 0; ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format = HLC_subband_cqi_nopmi; } else { diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 8173f35f6785c01af39db0d6b53c8be27afc275b..b93519d393ba58673ea3ed0d8993f99ff6663edd 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1058,21 +1058,24 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra } //__m128i mmtmpX0,mmtmpX1,mmtmpX2,mmtmpX3; -void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, uint8_t tdd_mapindex) +void rx_prach(PHY_VARS_eNB *phy_vars_eNB, + uint8_t subframe, + uint16_t *preamble_energy_list, + uint16_t *preamble_delay_list, + uint16_t Nf, + uint8_t tdd_mapindex) { int i; - lte_frame_type_t frame_type = phy_vars_eNB->lte_frame_parms.frame_type; - - //uint8_t tdd_config = phy_vars_eNB->lte_frame_parms.tdd_config; - uint16_t rootSequenceIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex; - uint8_t prach_ConfigIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; - uint8_t Ncs_config = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; - uint8_t restricted_set = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag; - //uint8_t n_ra_prboffset = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset; - int16_t *prachF = phy_vars_eNB->lte_eNB_prach_vars.prachF; - int16_t **rxsigF = phy_vars_eNB->lte_eNB_prach_vars.rxsigF; - int16_t **prach_ifft = phy_vars_eNB->lte_eNB_prach_vars.prach_ifft; + lte_frame_type_t frame_type = phy_vars_eNB->lte_frame_parms.frame_type; + + uint16_t rootSequenceIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex; + uint8_t prach_ConfigIndex = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex; + uint8_t Ncs_config = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; + uint8_t restricted_set = phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag; + int16_t *prachF = phy_vars_eNB->lte_eNB_prach_vars.prachF; + int16_t **rxsigF = phy_vars_eNB->lte_eNB_prach_vars.rxsigF; + int16_t **prach_ifft = phy_vars_eNB->lte_eNB_prach_vars.prach_ifft; int16_t *prach[4]; int16_t *prach2; uint8_t n_ra_prb; @@ -1086,12 +1089,8 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_ene uint16_t numshift=0; uint16_t *prach_root_sequence_map; uint8_t prach_fmt = get_prach_fmt(prach_ConfigIndex,frame_type); - //uint8_t Nsp=2; - //uint8_t f_ra,t1_ra; uint16_t N_ZC = (prach_fmt <4)?839:139; uint8_t not_found; - // LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; - // uint16_t subframe_offset; int k; uint16_t u; int16_t *Xu; @@ -1107,7 +1106,6 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_ene for (aa=0; aa<nb_ant_rx; aa++) { prach[aa] = (int16_t*)&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti-phy_vars_eNB->N_TA_offset]; - // remove_625_Hz(phy_vars_eNB,prach[aa]); } // First compute physical root sequence @@ -1134,37 +1132,6 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_ene n_ra_prb = get_prach_prb_offset(&(phy_vars_eNB->lte_frame_parms),tdd_mapindex,Nf); prach_root_sequence_map = (prach_fmt < 4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4; - /* - // this code is now part of get_prach_prb_offset - if (frame_type == TDD) { // TDD - // adjust n_ra_prboffset for frequency multiplexing (p.36 36.211) - - f_ra = tdd_preamble_map[prach_ConfigIndex][tdd_config].map[tdd_mapindex].f_ra; - - if (prach_fmt < 4) { - if ((f_ra&1) == 0) { - n_ra_prb = n_ra_prboffset + 6*(f_ra>>1); - } else { - n_ra_prb = phy_vars_eNB->lte_frame_parms.N_RB_UL - 6 - n_ra_prboffset + 6*(f_ra>>1); - } - - } else { - if ((tdd_config >2) && (tdd_config<6)) - Nsp = 2; - - t1_ra = tdd_preamble_map[prach_ConfigIndex][tdd_config].map[0].t1_ra; - - if ((((Nf&1)*(2-Nsp)+t1_ra)&1) == 0) { - n_ra_prb = 6*f_ra; - } else { - n_ra_prb = phy_vars_eNB->lte_frame_parms.N_RB_UL - 6*(f_ra+1); - } - - } - } - */ - - // printf("NCS %d\n",NCS); // PDP is oversampled, e.g. 1024 sample instead of 839 // Adapt the NCS (zero-correlation zones) with oversampling factor e.g. 1024/839 NCS2 = (N_ZC==839) ? ((NCS<<10)/839) : ((NCS<<8)/139); @@ -1217,9 +1184,6 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_ene break; } - // nsymb = (frame_parms->Ncp==0) ? 14:12; - // subframe_offset = (unsigned int)frame_parms->ofdm_symbol_size*subframe*nsymb; - preamble_offset_old = 99; for (preamble_index=0 ; preamble_index<64 ; preamble_index++) { diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 0b63541555ff465540fc698698b57eba5ad5fa88..60838c44b73f576abd542510c3eae6f980604b2b 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -246,7 +246,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, uint8_t *columnset; unsigned int sumKr=0; unsigned int Qprime,L,G,Q_CQI,Q_RI,H,Hprime,Hpp,Cmux,Rmux_prime,O_RCC; - unsigned int Qprime_ACK,Qprime_CQI,Qprime_RI,len_ACK=0,len_RI=0; + unsigned int Qprime_ACK,Qprime_RI,len_ACK=0,len_RI=0; // uint8_t q_ACK[MAX_ACK_PAYLOAD],q_RI[MAX_RI_PAYLOAD]; int metric,metric_new; uint8_t o_flip[8]; @@ -410,12 +410,13 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, else L=8; + // NOTE: we have to handle the case where we have a very small number of bits (condition on pg. 26 36.212) if (ulsch_harq->Or1 > 0) Qprime = (ulsch_harq->Or1 + L) * ulsch_harq->Msc_initial*ulsch_harq->Nsymb_initial * ulsch->beta_offset_cqi_times8; else Qprime=0; - if (Qprime > 0) { + if (Qprime > 0) { // check if ceiling is larger than floor in Q' expression if ((Qprime % (8*sumKr)) > 0) Qprime = 1+(Qprime/(8*sumKr)); else @@ -426,14 +427,10 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, - if (Qprime > (G - ulsch_harq->O_RI)) - Qprime = G - ulsch_harq->O_RI; - Q_CQI = Q_m * Qprime; #ifdef DEBUG_ULSCH_DECODING msg("ulsch_decoding: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d) O_ACK %d\n",G,Q_RI,Q_CQI,L,ulsch_harq->Or1,ulsch_harq->O_ACK); #endif - Qprime_CQI = Qprime; G = G - Q_RI - Q_CQI; @@ -452,9 +449,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, // Rmux = Hpp*Q_m/Cmux; Rmux_prime = Hpp/Cmux; -#ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: G raw %d (%d symb), Hpp %d, Cmux %d, Rmux_prime %d\n",G,ulsch_harq->Nsymb_pusch,Hpp,Cmux,Rmux_prime); -#endif // Clear "tag" interleaving matrix to allow for CQI/DATA identification memset(ytag,0,Cmux*Rmux_prime); @@ -462,128 +456,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, i=0; memset(y,LTE_NULL,Q_m*Hpp); - /* - // Do RI coding - if (ulsch->O_RI == 1) { - switch (Q_m) { - case 2: - q_RI[0] = 0; - q_RI[1] = PUSCH_y; - len_RI=2; - break; - case 4: - q_RI[0] = 0; - q_RI[1] = PUSCH_y;//1; - q_RI[2] = PUSCH_x;//o_RI[0]; - q_RI[3] = PUSCH_x;//1; - len_RI=4; - break; - case 6: - q_RI[0] = 0; - q_RI[1] = PUSCH_y;//1; - q_RI[2] = PUSCH_x;//1; - q_RI[3] = PUSCH_x;//ulsch->o_RI[0]; - q_RI[4] = PUSCH_x;//1; - q_RI[5] = PUSCH_x;//1; - len_RI=6; - break; - } - } - else if (ulsch->O_RI > 1){ - LOG_E(PHY,"ulsch_decoding: FATAL, RI cannot be more than 1 bit yet\n"); - return(-1); - } - - // 1-bit ACK/NAK - if (ulsch_harq->O_ACK == 1) { - switch (Q_m) { - case 2: - q_ACK[0] = 0; - q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : 0; - len_ACK = 2; - break; - case 4: - q_ACK[0] = 0; - q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : 0; - q_ACK[2] = PUSCH_x; - q_ACK[3] = PUSCH_x; - len_ACK = 4; - break; - case 6: - q_ACK[0] = 0; - q_ACK[1] = (ulsch->bundling==0)? PUSCH_y : 0; - q_ACK[2] = PUSCH_x; - q_ACK[3] = PUSCH_x; - q_ACK[4] = PUSCH_x; - q_ACK[6] = PUSCH_x; - len_ACK = 6; - break; - } - } - // two-bit ACK/NAK - if (ulsch_harq->O_ACK == 2) { - switch (Q_m) { - case 2: - q_ACK[0] = 0; - q_ACK[1] = 0; - q_ACK[2] = 0; - q_ACK[3] = 0; - q_ACK[4] = 0; - q_ACK[5] = 0; - len_ACK = 6; - break; - case 4: - q_ACK[0] = 0; - q_ACK[1] = 0; - q_ACK[2] = PUSCH_x; - q_ACK[3] = PUSCH_x;//1; - q_ACK[4] = 0; - q_ACK[5] = 0; - q_ACK[6] = PUSCH_x; - q_ACK[7] = PUSCH_x;//1; - q_ACK[8] = 0; - q_ACK[9] = 0; - q_ACK[10] = PUSCH_x; - q_ACK[11] = PUSCH_x;//1; - len_ACK = 12; - break; - case 6: - q_ACK[0] = 0; - q_ACK[1] = 0; - q_ACK[2] = PUSCH_x; - q_ACK[3] = PUSCH_x; - q_ACK[4] = PUSCH_x; - q_ACK[5] = PUSCH_x; - - q_ACK[6] = 0; - q_ACK[7] = 0; - q_ACK[8] = PUSCH_x; - q_ACK[9] = PUSCH_x; - q_ACK[10] = PUSCH_x; - q_ACK[11] = PUSCH_x; - - q_ACK[12] = 0; - q_ACK[13] = 0; - q_ACK[14] = PUSCH_x; - q_ACK[15] = PUSCH_x; - q_ACK[16] = PUSCH_x; - q_ACK[17] = PUSCH_x; - len_ACK = 18; - - break; - } - } - if (ulsch_harq->O_ACK > 2) { - LOG_E(PHY,"ulsch_decoding: FATAL, ACK cannot be more than 2 bits yet\n"); - return(-1); - } - - // RI BITS - - // memset(ytag2,0,Q_m*Hpp); - - */ // read in buffer and unscramble llrs for everything but placeholder bits // llrs stored per symbol correspond to columns of interleaving matrix @@ -724,40 +597,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, } - // for (q=0;q<Q_m;q++) { - /* - if ((i&0x1f)==0) { - s = lte_gold_generic(&x1, &x2, reset); - // msg("lte_gold[%d]=%x\n",i,s); - reset = 0; - } - c = (uint8_t)((s>>(i&0x1f))&1); - - - - // if bits are tagged as placeholders (RI,ACK) - - if (ytag2[q+(Q_m*((r*Cmux)+j))] == PUSCH_y) { - - c=c_prev; - } - else if (ytag2[q+(Q_m*((r*Cmux)+j))] == PUSCH_x) { - c = 0; - #ifdef DEBUG_ULSCH_DECODING - // msg("ulsch_decoding.c: PUSCH_x in row %d, col %d: llr %d\n",r,j,ulsch_llr[i]); - #endif - } - c_prev = c; - #ifdef DEBUG_ULSCH_DECODING - // msg("llr[%d] = %d (c %d, ytag2 %d) ==> ",i,ulsch_llr[i],c,ytag2[q+(Q_m*((r*Cmux)+j))]); - #endif - // note flipped here for reverse polarity in 3GPP bit mapping - y[q+(Q_m*((r*Cmux)+j))] = (c==0) ? -ulsch_llr[i] : ulsch_llr[i]; - i++; - #ifdef DEBUG_ULSCH_DECODING - // msg("%d\n",y[q+(Q_m*((r*Cmux)+j))]); - #endif - */ stop_meas(&phy_vars_eNB->ulsch_demultiplexing_stats); if (i!=(H+Q_RI)) @@ -819,11 +658,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, for (q=0; q<Q_m; q++) { if (y[q+(Q_m*((r*Cmux) + columnset[j]))]!=0) ulsch_harq->q_ACK[(q+(Q_m*i))%len_ACK] += y[q+(Q_m*((r*Cmux) + columnset[j]))]; - -#ifdef DEBUG_ULSCH_DECODING - // LOG_D(PHY,"ACK %d => %d (%d,%d,%d)\n",(q+(Q_m*i))%len_ACK,ulsch_harq->q_ACK[(q+(Q_m*i))%len_ACK],q+(Q_m*((r*Cmux) + columnset[j])),r,columnset[j]); - printf("ACK %d => %d (%d,%d,%d)\n",(q+(Q_m*i))%len_ACK,ulsch_harq->q_ACK[(q+(Q_m*i))%len_ACK],q+(Q_m*((r*Cmux) + columnset[j])),r,columnset[j]); -#endif y[q+(Q_m*((r*Cmux) + columnset[j]))]=0; // NULL LLRs in ACK positions } @@ -879,173 +713,129 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, j2=0; // r=0; - for (i=0; i<Qprime_CQI; i++) { - - /* - while (ytag[(r*Cmux)+j]==LTE_NULL) { - #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: r %d, j %d: LTE_NULL\n",r,j); - #endif - j++; - if (j==Cmux) { - j=0; - r++; + if (Q_RI>0) { + for (i=0; i<(Q_CQI/Q_m); i++) { + + while (ytag[j]==LTE_NULL) { + j++; + j2+=Q_m; } - } - for (q=0;q<Q_m;q++) { - ys = y[q+(Q_m*((r*Cmux)+j))]; - if (ys>127) - ulsch_harq->q[q+(Q_m*i)] = 127; - else if (ys<-128) - ulsch_harq->q[q+(Q_m*i)] = -128; - else - ulsch_harq->q[q+(Q_m*i)] = ys; - #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: CQI %d, r %d, j %d, y[%d] %d\n",q+(Q_m*i),r,j, q+(Q_m*((r*Cmux) + j)),ys); - #endif - } - */ - while (ytag[j]==LTE_NULL) { - j++; + + for (q=0; q<Q_m; q++) { + // ys = y[q+(Q_m*((r*Cmux)+j))]; + ys = y[q+j2]; + + if (ys>127) + ulsch_harq->q[q+(Q_m*i)] = 127; + else if (ys<-128) + ulsch_harq->q[q+(Q_m*i)] = -128; + else + ulsch_harq->q[q+(Q_m*i)] = ys; + } + j2+=Q_m; } - - for (q=0; q<Q_m; q++) { - // ys = y[q+(Q_m*((r*Cmux)+j))]; - ys = y[q+j2]; - - if (ys>127) - ulsch_harq->q[q+(Q_m*i)] = 127; - else if (ys<-128) - ulsch_harq->q[q+(Q_m*i)] = -128; - else - ulsch_harq->q[q+(Q_m*i)] = ys; - -#ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: CQI %d, q %d, y[%d] %d\n",q+(Q_m*i),q,j2, q+j2,ys); -#endif - } - - j2+=Q_m; - } - - // j2=j*Q_m; - - switch (Q_m) { - case 2: - for (iprime=0; iprime<(Hprime-Qprime_CQI)<<1;) { - while (ytag[j]==LTE_NULL) { - j++; - j2+=2; + + + switch (Q_m) { + case 2: + for (iprime=0; iprime<G<<1;) { + while (ytag[j]==LTE_NULL) { + j++; + j2+=2; + } + + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + } - - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; -#ifdef DEBUG_ULSCH_DECODING - // msg("ulsch_decoding.c: e %d, r %d, j %d, y[%d] %d\n",g,r,j,q+(Q_m*((r*Cmux) + j)),y[q+(Q_m*((r*Cmux)+j))]); -#endif - - } - - // write_output("/tmp/ulsch_e.m","ulsch_e",ulsch->e,iprime,1,0); - break; - - case 4: - for (iprime=0; iprime<(Hprime-Qprime_CQI)<<2;) { - while (ytag[j]==LTE_NULL) { - j++; - j2+=4; + + + break; + + case 4: + for (iprime=0; iprime<G<<2;) { + while (ytag[j]==LTE_NULL) { + j++; + j2+=4; + } + + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + } - - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; -#ifdef DEBUG_ULSCH_DECODING - // msg("ulsch_decoding.c: e %d, r %d, j %d, y[%d] %d\n",g,r,j,q+(Q_m*((r*Cmux) + j)),y[q+(Q_m*((r*Cmux)+j))]); -#endif - - } - - break; - - case 6: - for (iprime=0; iprime<(Hprime-Qprime_CQI)*6;) { - while (ytag[j]==LTE_NULL) { - j++; - j2+=6; + + break; + + case 6: + for (iprime=0; iprime<G*6;) { + while (ytag[j]==LTE_NULL) { + j++; + j2+=6; + } + + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + } - - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; - ulsch_harq->e[iprime++] = y[j2++]; -#ifdef DEBUG_ULSCH_DECODING - // msg("ulsch_decoding.c: e %d, r %d, j %d, y[%d] %d\n",g,r,j,q+(Q_m*((r*Cmux) + j)),y[q+(Q_m*((r*Cmux)+j))]); -#endif + + break; } - - break; - } - - /* - for (i=0,iprime=-Qprime_CQI;i<Hprime;i++,iprime++) { - - while (ytag[(r*Cmux)+j]==LTE_NULL) { - #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: r %d, j %d: LTE_NULL\n",r,j); - #endif - j++; - if (j==Cmux) { - j=0; - r++; + else { + for (i=0; i<(Q_CQI/Q_m); i++) { + + for (q=0; q<Q_m; q++) { + ys = y[q+j2]; + if (ys>127) + ulsch_harq->q[q+(Q_m*i)] = 127; + else if (ys<-128) + ulsch_harq->q[q+(Q_m*i)] = -128; + else + ulsch_harq->q[q+(Q_m*i)] = ys; } + + j2+=Q_m; } - - if (i<Qprime_CQI) { - - for (q=0;q<Q_m;q++) { - ys = y[q+(Q_m*((r*Cmux)+j))]; - if (ys>127) - ulsch_harq->q[q+(Q_m*i)] = 127; - else if (ys<-128) - ulsch_harq->q[q+(Q_m*i)] = -128; - else - ulsch_harq->q[q+(Q_m*i)] = ys; - #ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: CQI %d, r %d, j %d, y[%d] %d\n",q+(Q_m*i),r,j, q+(Q_m*((r*Cmux) + j)),ys); - #endif + + switch (Q_m) { + case 2: + for (iprime=0; iprime<G<<1;) { + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; } - } - else { - for (q=0;q<Q_m;q++) { - g = q+(Q_m*iprime); - ulsch->e[g] = y[q+(Q_m*((r*Cmux)+j))]; - #ifdef DEBUG_ULSCH_DECODING - // msg("ulsch_decoding.c: e %d, r %d, j %d, y[%d] %d\n",g,r,j,q+(Q_m*((r*Cmux) + j)),y[q+(Q_m*((r*Cmux)+j))]); - #endif + break; + case 4: + for (iprime=0; iprime<G<<2;) { + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; } - } - j++; - if (j==Cmux) { - j=0; - r++; + break; + case 6: + for (iprime=0; iprime<G*6;) { + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + ulsch_harq->e[iprime++] = y[j2++]; + } + break; } } - */ - // Do CQI/RI/HARQ-ACK Decoding first and pass to MAC // HARQ-ACK wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3); -#ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: Bundling %d, Nbundled %d, wACK_idx %d\n", - ulsch->bundling,Nbundled,wACK_idx); -#endif if (ulsch_harq->O_ACK == 1) { ulsch_harq->q_ACK[0] *= wACK_RX[wACK_idx][0]; @@ -1055,10 +845,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, ulsch_harq->o_ACK[0] = 0; else ulsch_harq->o_ACK[0] = 1; - -#ifdef DEBUG_ULSCH_DECODING - msg("ulsch_decoding.c: ulsch_q_ACK[0] %d (%d,%d)\n",ulsch_harq->q_ACK[0],wACK_RX[wACK_idx][0],wACK_RX[wACK_idx][1]); -#endif } if (ulsch_harq->O_ACK == 2) { @@ -1068,16 +854,12 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, ulsch_harq->q_ACK[0] = ulsch_harq->q_ACK[0]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[3]*wACK_RX[wACK_idx][1]; ulsch_harq->q_ACK[1] = ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[4]*wACK_RX[wACK_idx][1]; ulsch_harq->q_ACK[2] = ulsch_harq->q_ACK[2]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[5]*wACK_RX[wACK_idx][1]; - break; - case 4: ulsch_harq->q_ACK[0] = ulsch_harq->q_ACK[0]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[5]*wACK_RX[wACK_idx][1]; ulsch_harq->q_ACK[1] = ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[8]*wACK_RX[wACK_idx][1]; ulsch_harq->q_ACK[2] = ulsch_harq->q_ACK[4]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[9]*wACK_RX[wACK_idx][1]; - break; - case 6: ulsch_harq->q_ACK[0] = ulsch_harq->q_ACK[0]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[7]*wACK_RX[wACK_idx][1]; ulsch_harq->q_ACK[1] = ulsch_harq->q_ACK[1]*wACK_RX[wACK_idx][0] + ulsch_harq->q_ACK[12]*wACK_RX[wACK_idx][1]; @@ -1114,37 +896,15 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, } } -#ifdef DEBUG_ULSCH_DECODING - - for (i=0; i<ulsch_harq->O_ACK; i++) - msg("ulsch_decoding: O_ACK[%d] %d, q_ACK => (%d,%d,%d)\n",i,ulsch_harq->o_ACK[i],ulsch_harq->q_ACK[0],ulsch_harq->q_ACK[1],ulsch_harq->q_ACK[2]); - -#endif - // RI if ((ulsch_harq->O_RI == 1) && (Qprime_RI > 0)) { ulsch_harq->o_RI[0] = ((ulsch_harq->q_RI[0] + ulsch_harq->q_RI[Q_m/2]) > 0) ? 0 : 1; } -#ifdef DEBUG_ULSCH_DECODING - - if (Qprime_RI > 0) { - for (i=0; i<2*ulsch_harq->O_RI; i++) - msg("ulsch_decoding: q_RI[%d] %d\n",i,ulsch_harq->q_RI[i]); - } - - if (Qprime_CQI > 0) { - for (i=0; i<ulsch_harq->O_RI; i++) - LOG_D(PHY,"ulsch_decoding: O_RI[%d] %d\n",i,ulsch_harq->o_RI[i]); - } - -#endif - - // CQI - if (Qprime_CQI>0) { + if (Q_CQI>0) { memset((void *)&dummy_w_cc[0],0,3*(ulsch_harq->Or1+8+32)); O_RCC = generate_dummy_w_cc(ulsch_harq->Or1+8, @@ -1169,7 +929,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, else ulsch_harq->cqi_crc_status = 0; - //printf("crc(cqi) rx: %x\n",(crc8(o_flip,ulsch->Or1)>>24)); if (ulsch->harq_processes[harq_pid]->Or1<=32) { ulsch_harq->o[3] = o_flip[0] ; @@ -1274,44 +1033,21 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, stop_meas(&phy_vars_eNB->ulsch_rate_unmatching_stats); r_offset += E; - /* - msg("Subblock deinterleaving, d %p w %p\n", - ulsch_harq->d[r], - ulsch_harq->w); - */ + start_meas(&phy_vars_eNB->ulsch_deinterleaving_stats); sub_block_deinterleaving_turbo(4+Kr, &ulsch_harq->d[r][96], ulsch_harq->w[r]); stop_meas(&phy_vars_eNB->ulsch_deinterleaving_stats); - /* - #ifdef DEBUG_ULSCH_DECODING - msg("decoder input(segment %d) :",r); - for (i=0;i<(3*8*Kr_bytes)+12;i++) - msg("%d : %d\n",i,ulsch_harq->d[r][96+i]); - msg("\n"); - #endif - */ } for (r=0; r<ulsch_harq->C; r++) { - // msg("Clearing c, %p\n",ulsch_harq->c[r]); - // memset(ulsch_harq->c[r],0,16);//block_length); - // msg("done\n"); + if (ulsch_harq->C == 1) crc_type = CRC24_A; else crc_type = CRC24_B; - /* - msg("decoder input(segment %d)\n",r); - for (i=0;i<(3*8*Kr_bytes)+12;i++) - if ((ulsch_harq->d[r][96+i]>7) || - (ulsch_harq->d[r][96+i] < -8)) - msg("%d : %d\n",i,ulsch_harq->d[r][96+i]); - msg("\n"); - */ - start_meas(&phy_vars_eNB->ulsch_turbo_decoding_stats); ret = tc(&ulsch_harq->d[r][96], @@ -1334,28 +1070,10 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, status[r] = ret; - if (ret==(1+ulsch->max_turbo_iterations)) {// a Code segment is in error so break; -#ifdef DEBUG_ULSCH_DECODING - msg("ULSCH harq_pid %d CRC failed\n",harq_pid); -#endif - /* - for (i=0;i<Kr_bytes;i++) - printf("segment %d : byte %d => %d\n",r,i,ulsch_harq->c[r][i]); - return(ret); - */ - } - -#ifdef DEBUG_ULSCH_DECODING - else - msg("ULSCH harq_pid %d CRC OK : %d iterations\n",harq_pid, ret); - -#endif - } // Reassembly of Transport block here offset = 0; - // msg("F %d, Fbytes %d\n",ulsch_harq->F,ulsch_harq->F>>3); ret = 1; @@ -1373,8 +1091,6 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, &ulsch_harq->c[0][(ulsch_harq->F>>3)], Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0)); offset = Kr_bytes - (ulsch_harq->F>>3) - ((ulsch_harq->C>1)?3:0); - // msg("copied %d bytes to b sequence\n", - // Kr_bytes - (ulsch_harq->F>>3)); } else { memcpy(ulsch_harq->b+offset, ulsch_harq->c[r], diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 43d2120639e4affaa385f6bb2f8148515baa787e..18d20f6372a66e304e696861a22a70690d871933 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -594,22 +594,12 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1); start_meas(&phy_vars_eNB->phy_proc_tx); -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[%s %"PRIu8"] Frame %d subframe %d : Doing phy_procedures_eNB_TX\n", - (r_type == multicast_relay) ? "RN/eNB" : "eNB", - phy_vars_eNB->Mod_id, frame, subframe); -#endif - for (i=0; i<NUMBER_OF_UE_MAX; i++) { // If we've dropped the UE, go back to PRACH mode for this UE - //#if !defined(EXMIMO_IOT) + if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) { LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n", phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors); - /* - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; - remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); - */ phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; mac_xface->UL_failure_indication(phy_vars_eNB->Mod_id, phy_vars_eNB->CC_id, @@ -619,7 +609,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } - //#endif + } @@ -689,9 +679,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe,subframe%5, phy_vars_rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size); } else { - /* LOG_I(PHY,"[RN %d] Frame %d subframe %d: do not forward MCH pdu for MBSFN sync area %d (MCS %d, TBS %d)\n", - phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1, - mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);*/ mch_pduP=NULL; } @@ -841,20 +828,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e -#ifdef DEBUG_PHY_PROC - uint16_t frame_tx = (((int) (pbch_pdu[2]&0x3))<<8) + ((int) (pbch_pdu[1]&0xfc)) + phy_vars_eNB->proc[sched_subframe].frame_tx%4; - - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Generating PBCH, mode1_flag=%"PRIu8", frame_tx=%"PRIu16", pdu=%02"PRIx8"%02"PRIx8"%02"PRIx8"\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, - subframe, - phy_vars_eNB->lte_frame_parms.mode1_flag, - frame_tx, - pbch_pdu[2], - pbch_pdu[1], - pbch_pdu[0]); -#endif - if (abstraction_flag==0) { generate_pbch(&phy_vars_eNB->lte_eNB_pbch, @@ -881,7 +854,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e if (abstraction_flag==0) { if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->proc[sched_subframe].frame_tx,next_slot>>1); generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], AMP, &phy_vars_eNB->lte_frame_parms, @@ -932,7 +904,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e if (abstraction_flag==0) { if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { - // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->proc[sched_subframe].frame_tx,next_slot>>1); generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0], AMP, &phy_vars_eNB->lte_frame_parms, @@ -986,10 +957,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } } -#ifdef EMOS - //emos_dump_eNB.dci_cnt[next_slot>>1] = DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci; //nb_dci_common+nb_dci_ue_spec; -#endif - // clear previous allocation information for all UEs for (i=0; i<NUMBER_OF_UE_MAX; i++) { phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[subframe] = 0; @@ -1012,21 +979,17 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e #endif - for (i=0; i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { - LOG_D(PHY,"[eNB] Subframe %d: DCI %d/%d : rnti %x, CCEind %d\n",subframe,i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,DCI_pdu->dci_alloc[i].rnti,DCI_pdu->dci_alloc[i].firstCCE); -#ifdef DEBUG_PHY_PROC - if (DCI_pdu->dci_alloc[i].rnti != SI_RNTI) { - LOG_D(PHY,"[eNB] Subframe %d : Doing DCI index %"PRIu32"/%d\n",subframe,i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci); - dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); - } -#endif + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->num_pdcch_symbols); + + for (i=0; i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) { + LOG_D(PHY,"[eNB] Subframe %d: DCI %d/%d : rnti %x, CCEind %d\n",subframe,i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,DCI_pdu->dci_alloc[i].rnti,DCI_pdu->dci_alloc[i].firstCCE); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].rnti); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].format); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].firstCCE); if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %"PRIu8"] SI generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id); -#endif generate_eNB_dlsch_params_from_dci(frame, subframe, @@ -1059,9 +1022,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } else if (DCI_pdu->dci_alloc[i].ra_flag == 1) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %"PRIu8"] RA generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id); -#endif generate_eNB_dlsch_params_from_dci(frame, subframe, @@ -1076,8 +1036,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e P_RNTI, phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single); - // mac_xface->macphy_exit("Transmitted RAR, exiting\n"); - phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE; @@ -1097,10 +1055,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e else if (DCI_pdu->dci_alloc[i].format != format0) { // this is a normal DLSCH allocation -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB] Searching for RNTI %"PRIx16"\n",DCI_pdu->dci_alloc[i].rnti); -#endif - if (phy_vars_eNB->mac_enabled==1) UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB); else @@ -1152,14 +1106,11 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e #endif -#ifdef DEBUG_PHY_PROC - //if (phy_vars_eNB->proc[sched_subframe].frame_tx%100 == 0) LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n", phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti, phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,UE_id, DCI_pdu->dci_alloc[i].format, 1<<DCI_pdu->dci_alloc[i].L); -#endif } else { LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n", phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti); @@ -1168,6 +1119,8 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,(frame*10)+subframe); + // Apply physicalConfigDedicated if needed phy_config_dedicated_eNB_step2(phy_vars_eNB); @@ -1180,7 +1133,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e if (harq_pid==255) { LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx); - //mac_exit_wrapper("Invalid harq_pid (255) detected"); return; } @@ -1195,8 +1147,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e return; // not reached } - //#ifdef DEBUG_PHY_PROC - //if (phy_vars_eNB->proc[sched_subframe].frame_tx%100 == 0) LOG_D(PHY, "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8") (DCI pos %"PRIu32"/%d), aggregation %d\n", phy_vars_eNB->Mod_id, @@ -1212,10 +1162,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e i, DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci, 1<<DCI_pdu->dci_alloc[i].L); - //#endif - - //dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]); - //LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti); generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0], DCI_pdu->dci_alloc[i].rnti, @@ -1245,13 +1191,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %"PRIu8"][PUSCH %"PRIu8"] frame %d subframe %d Setting subframe_scheduling_flag for UE %"PRIu32" harq_pid %"PRIu8" (ul subframe %"PRIu8")\n", - phy_vars_eNB->Mod_id,harq_pid, - phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i,harq_pid, - pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)); -#endif - if ((DCI_pdu->dci_alloc[i].rnti >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI)) phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1; else @@ -1274,13 +1213,11 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e } if (abstraction_flag == 0) { - //#ifdef DEBUG_PHY_PROC if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci); - //#endif num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci, DCI_pdu->Num_common_dci, @@ -1291,10 +1228,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e phy_vars_eNB->lte_eNB_common_vars.txdataF[0], subframe); -#ifdef DEBUG_PHY_PROC - // LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: num_pdcch_symbols %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, next_slot>>1,num_pdcch_symbols); - -#endif } #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious @@ -1307,10 +1240,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0); -#ifdef DEBUG_PHY_PROC - //LOG_D(PHY,"[eNB %d] Frame %d, slot %d: num_pdcch_symbols=%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, next_slot,num_pdcch_symbols); -#endif - // Check for SI activity if (phy_vars_eNB->dlsch_eNB_SI->active == 1) { @@ -1339,21 +1268,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), DLSCH_pdu, input_buffer_length); } -#endif - -#ifdef DEBUG_PHY_PROC -#ifdef DEBUG_DLSCH - //FIXME: The code below is commented as next_slot is not defined which results in failed compilation - /* - LOG_D(PHY,"[eNB %"PRIu8"][SI] Frame %d, slot %d: Calling generate_dlsch (SI) with input size = %"PRIu16", num_pdcch_symbols %"PRIu8"\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, next_slot, input_buffer_length,num_pdcch_symbols); // FIXME this code is broken (next_slot?) - - for (i=0; i<input_buffer_length; i++) - LOG_T(PHY,"%x.",i,DLSCH_pdu[i]);// FIXME this code is broken (number of arguments) - - LOG_T(PHY,"\n"); - */ -#endif #endif if (abstraction_flag == 0) { @@ -1412,10 +1326,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e // Check for RA activity if (phy_vars_eNB->dlsch_eNB_ra->active == 1) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d, RA active, filling RAR:\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe); -#endif input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8; @@ -1425,11 +1335,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e dlsch_input_buffer, phy_vars_eNB->lte_frame_parms.N_RB_UL, input_buffer_length); - /* - for (i=0;i<input_buffer_length;i++) - LOG_T(PHY,"%x.",dlsch_input_buffer[i]); - LOG_T(PHY,"\n"); - */ if (crnti!=0) UE_id = add_ue(crnti,phy_vars_eNB); else @@ -1437,7 +1342,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e if (UE_id==-1) { LOG_W(PHY,"[eNB] Max user count reached.\n"); - //mac_xface->macphy_exit("[PHY][eNB] Max user count reached.\n"); mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, phy_vars_eNB->CC_id, phy_vars_eNB->proc[sched_subframe].frame_tx, @@ -1467,15 +1371,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); - /* - for (i=0; i<input_buffer_length; i++) - dlsch_input_buffer[i]= (unsigned char) i; //(taus()&0xff); - - dlsch_input_buffer[1] = (phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4 - dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4 - //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset); - */ - #if defined(SMBV) && !defined(EXMIMO) // Configures the data source of allocation (allocation is configured by DCI) @@ -1486,13 +1381,13 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e #endif -#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n", phy_vars_eNB->Mod_id, phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length, phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame, phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe); -#endif + if (abstraction_flag == 0) { @@ -1538,11 +1433,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id, phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d, DLSCH (RA) re_allocated = %"PRIu16"\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, re_allocated); -#endif - } //max user count phy_vars_eNB->dlsch_eNB_ra->active = 0; @@ -1558,7 +1448,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e input_buffer_length = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS/8; - //#ifdef DEBUG_PHY_PROC + LOG_D(PHY, "[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n", phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,harq_pid, @@ -1574,7 +1464,7 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc), phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round); - //#endif + #if defined(MESSAGE_CHART_GENERATOR_PHY) MSC_LOG_TX_MESSAGE( MSC_PHY_ENB,MSC_PHY_UE, @@ -1699,7 +1589,6 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e #endif phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0; - //mac_xface->macphy_exit("first dlsch transmitted\n"); } else if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&& @@ -1708,16 +1597,13 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later) phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0; -#ifdef DEBUG_PHY_PROC - //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,subframe,UE_id); -#endif } } // if we have PHICH to generate - // printf("[PHY][eNB] Frame %d subframe %d Checking for phich\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); + if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,subframe)) { generate_phich_top(phy_vars_eNB, @@ -2226,7 +2112,6 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id, frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB); - // LOG_I(PHY,"[eNB %d][RAPROC] PRACH: rootSequenceIndex %d, prach_ConfigIndex %d, zeroCorrelationZoneConfig %d, highSpeedFlag %d, prach_FreqOffset %d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset); rx_prach(phy_vars_eNB, subframe, @@ -2271,20 +2156,12 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t #endif if (preamble_energy_list[preamble_max] > 580) { - /* - write_output("prach_ifft0.m","prach_t0",prach_ifft[0],2048,1,1); - write_output("prach_rx0.m","prach_rx0",&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],6144+792,1,1); - write_output("prach_rxF0.m","prach_rxF0",phy_vars_eNB->lte_eNB_prach_vars.rxsigF[0],24576,1,1); - - mac_xface->macphy_exit("Exiting for PRACH debug\n"); - */ - UE_id = find_next_ue_index(phy_vars_eNB); if (UE_id>=0) { phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits - //phy_vars_eNb->eNB_UE_stats[(uint32_t)UE_id].mode = PRACH; + phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0; LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n", phy_vars_eNB->Mod_id, @@ -2344,13 +2221,9 @@ void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_ } +void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { -void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) -{ - //RX processing - UNUSED(r_type); - uint32_t l, ret=0,i,j,k; - uint32_t harq_pid, harq_idx, round; + LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0}; int16_t n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3; uint8_t do_SR = 0; @@ -2358,887 +2231,1028 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ int32_t metric0=0,metric1=0,metric0_SR=0; ANFBmode_t bundling_flag; PUCCH_FMT_t format; - uint8_t nPRS; - LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; - int sync_pos; - uint16_t rnti=0; - uint8_t access_mode; - int num_active_cba_groups; + const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - AssertFatal(sched_subframe < NUM_ENB_THREADS, "Bad sched_subframe %d", sched_subframe); + if ((phy_vars_eNB->dlsch_eNB[UE_id][0]) && + (phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti>0) && + (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); - start_meas(&phy_vars_eNB->phy_proc_rx); -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe); -#endif + // check SR availability + do_SR = is_SR_subframe(phy_vars_eNB,UE_id,sched_subframe); + // do_SR = 0; + // Now ACK/NAK + // First check subframe_tx flag for earlier subframes + get_n1_pucch_eNB(phy_vars_eNB, + UE_id, + sched_subframe, + &n1_pucch0, + &n1_pucch1, + &n1_pucch2, + &n1_pucch3); - phy_vars_eNB->rb_mask_ul[0]=0; - phy_vars_eNB->rb_mask_ul[1]=0; - phy_vars_eNB->rb_mask_ul[2]=0; - phy_vars_eNB->rb_mask_ul[3]=0; + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", + phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + frame,subframe, + n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); - if (abstraction_flag == 0) { - remove_7_5_kHz(phy_vars_eNB,subframe<<1); - remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1); - } + if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id + } else { + // otherwise we have some PUCCH detection to do - // check if we have to detect PRACH first - if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); - prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); - } + // Null out PUCCH PRBs for noise measurement + switch(phy_vars_eNB->lte_frame_parms.N_RB_UL) { + case 6: + phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 + break; + case 15: + phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 + break; + case 25: + phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 + break; + case 50: + phy_vars_eNB->rb_mask_ul[0] |= 0x1; + phy_vars_eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) + break; + case 75: + phy_vars_eNB->rb_mask_ul[0] |= 0x1; + phy_vars_eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) + break; + case 100: + phy_vars_eNB->rb_mask_ul[0] |= 0x1; + phy_vars_eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) + break; + default: + LOG_E(PHY,"Unknown number for N_RB_UL %d\n",phy_vars_eNB->lte_frame_parms.N_RB_UL); + break; + } - if (abstraction_flag == 0) { - start_meas(&phy_vars_eNB->ofdm_demod_stats); + if (do_SR == 1) { + phy_vars_eNB->eNB_UE_stats[UE_id].sr_total++; - for (l=0; l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2; l++) { + if (abstraction_flag == 0) + metric0_SR = rx_pucch(phy_vars_eNB, + pucch_format1, + UE_id, + phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + 0, // n2_pucch + 0, // shortened format, should be use_srs flag, later + &SR_payload, + subframe, + PUCCH1_THRES); - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, - l, - subframe<<1, - 0, - 0 - ); - slot_fep_ul(&phy_vars_eNB->lte_frame_parms, - &phy_vars_eNB->lte_eNB_common_vars, - l, - (subframe<<1)+1, - 0, - 0 - ); - } +#ifdef PHY_ABSTRACTION + else { + metric0_SR = rx_pucch_emul(phy_vars_eNB, + UE_id, + pucch_format1, + 0, + &SR_payload, + sched_subframe); + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex); + } - stop_meas(&phy_vars_eNB->ofdm_demod_stats); - } +#endif - // Check for active processes in current subframe - harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, - frame,subframe); - // reset the cba flag used for collision detection - for (i=0; i < NUM_MAX_CBA_GROUP; i++) { - phy_vars_eNB->cba_last_reception[i]=0; - } + if (SR_payload == 1) { + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); + phy_vars_eNB->eNB_UE_stats[UE_id].sr_received++; - for (i=0; i<NUMBER_OF_UE_MAX; i++) { + if (phy_vars_eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 + /* is this test necessary? */ + if (phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE) + put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[UE_id][0], 0); + phy_vars_eNB->first_sr[UE_id] = 0; + phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0; + phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE; + LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", + phy_vars_eNB->Mod_id, + phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe); + } - if (phy_vars_eNB->mac_enabled==1) { - if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) { - process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid); - } - } + if (phy_vars_eNB->mac_enabled==1) { + mac_xface->SR_indication(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame, + phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe); + } + } + }// do_SR==1 + if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR + } else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD + // if SR was detected, use the n1_pucch from SR, else use n1_pucch0 + // n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0; - phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63; - phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = 0; - phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63; + LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload); - if ((phy_vars_eNB->ulsch_eNB[i]) && - (phy_vars_eNB->ulsch_eNB[i]->rnti>0) && - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) { + if (abstraction_flag == 0) { - round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; - for (int rb=0; - rb<=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; - rb++) { - int rb2 = rb+phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb; - phy_vars_eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); - } -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti,i); -#endif -#ifdef DEBUG_PHY_PROC + metric0 = rx_pucch(phy_vars_eNB, + pucch_format1a, + UE_id, + (uint16_t)n1_pucch0, + 0, //n2_pucch + 0, // shortened format + pucch_payload0, + subframe, + PUCCH1a_THRES); - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", - phy_vars_eNB->Mod_id, - frame, - subframe, - phy_vars_eNB->eNB_UE_stats[i].sector); - } else { - LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n", - phy_vars_eNB->Mod_id, - frame, - subframe, - i, - mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]); - } + if (metric0 < metric0_SR) + metric0=rx_pucch(phy_vars_eNB, + pucch_format1a, + UE_id, + phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + 0, //n2_pucch + 0, // shortened format + pucch_payload0, + subframe, + PUCCH1a_THRES); + } + else { +#ifdef PHY_ABSTRACTION + metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, + pucch_format1a, + 0, + pucch_payload0, + subframe); +#endif + } +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", + phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + frame,subframe, + pucch_payload0[0],metric0); #endif - nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]; + process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB, + 0,// pusch_flag + pucch_payload0, + 2, + SR_payload); - phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + - nPRS)%12; + } // FDD + else { //TDD - if (frame_parms->frame_type == FDD ) { - int sf = (subframe<4) ? (subframe+6) : (subframe-4); + bundling_flag = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode; - if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1; - } else { - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0; - } - } + // fix later for 2 TB case and format1b - LOG_D(PHY, - "[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n", - phy_vars_eNB->Mod_id,harq_pid,frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx, - phy_vars_eNB->ulsch_eNB[i]->cyclicShift, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2, - phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, - nPRS, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); - phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; - phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; - phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs; - start_meas(&phy_vars_eNB->ulsch_demodulation_stats); + if ((frame_parms->frame_type==FDD) || + (bundling_flag==bundling) || + ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) { + format = pucch_format1a; + // msg("PUCCH 1a\n"); + } else { + format = pucch_format1b; + // msg("PUCCH 1b\n"); + } - if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, - sched_subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i, - phy_vars_eNB->ulsch_eNB, - 0); - } + // if SR was detected, use the n1_pucch from SR + if (SR_payload==1) { +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + frame,subframe, + n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); +#endif + if (abstraction_flag == 0) + metric0_SR = rx_pucch(phy_vars_eNB, + format, + UE_id, + phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex, + 0, //n2_pucch + 0, // shortened format + pucch_payload0, + subframe, + PUCCH1a_THRES); + else { #ifdef PHY_ABSTRACTION - else { - rx_ulsch_emul(phy_vars_eNB, - subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i); - } - + metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, + format, + 0, + pucch_payload0, + subframe); #endif - stop_meas(&phy_vars_eNB->ulsch_demodulation_stats); - - - start_meas(&phy_vars_eNB->ulsch_decoding_stats); - - if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, - i, - sched_subframe, - 0, // control_only_flag - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); - } + } + } else { //using n1_pucch0/n1_pucch1 resources +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + frame,subframe, + n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); +#endif + metric0=0; + metric1=0; + // Check n1_pucch0 metric + if (n1_pucch0 != -1) { + if (abstraction_flag == 0) + metric0 = rx_pucch(phy_vars_eNB, + format, + UE_id, + (uint16_t)n1_pucch0, + 0, // n2_pucch + 0, // shortened format + pucch_payload0, + subframe, + PUCCH1a_THRES); + else { #ifdef PHY_ABSTRACTION - else { - ret = ulsch_decoding_emul(phy_vars_eNB, - sched_subframe, - i, - &rnti); - } - + metric0 = rx_pucch_emul(phy_vars_eNB,UE_id, + format, + 0, + pucch_payload0, + subframe); #endif - stop_meas(&phy_vars_eNB->ulsch_decoding_stats); + } + } - //#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - ret); + // Check n1_pucch1 metric + if (n1_pucch1 != -1) { + if (abstraction_flag == 0) + metric1 = rx_pucch(phy_vars_eNB, + format, + UE_id, + (uint16_t)n1_pucch1, + 0, //n2_pucch + 0, // shortened format + pucch_payload1, + subframe, + PUCCH1a_THRES); + else { +#ifdef PHY_ABSTRACTION + metric1 = rx_pucch_emul(phy_vars_eNB,UE_id, + format, + 1, + pucch_payload1, + subframe); - //compute the expected ULSCH RX power (for the stats) - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0); // 0 means bw_factor is not considered +#endif + } + } + } - //dump_ulsch(phy_vars_eNB, sched_subframe, i); + if (SR_payload == 1) { + pucch_payload = pucch_payload0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n", - phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid); -#endif - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; + if (bundling_flag == bundling) + pucch_sel = 2; + } else if (bundling_flag == multiplexing) { // multiplexing + no SR + pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0; + pucch_sel = (metric1>metric0) ? 1 : 0; + } else { // bundling + no SR + if (n1_pucch1 != -1) + pucch_payload = pucch_payload1; + else if (n1_pucch0 != -1) + pucch_payload = pucch_payload0; + + pucch_sel = 2; // indicate that this is a bundled ACK/NAK + } - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { #ifdef DEBUG_PHY_PROC - //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) - print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti, + frame,subframe, + metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); #endif - extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format, - &phy_vars_eNB->eNB_UE_stats[i], - phy_vars_eNB->lte_frame_parms.N_RB_DL, - &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0]; + process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB, + 0,// pusch_flag + pucch_payload, + pucch_sel, + SR_payload); + } } - if (ret == (1+MAX_TURBO_ITERATIONS)) { - - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; + } +} - LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); +void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) { - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1); + uint8_t access_mode; + int num_active_cba_groups; + const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; + const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; + uint16_t rnti=0; + int ret=0; - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - ret); + num_active_cba_groups = phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups; + + if ((phy_vars_eNB->ulsch_eNB[UE_id]) && + (num_active_cba_groups > 0) && + (phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) && + (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) { + rnti=0; + +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,subframe, + UE_id, (uint16_t)phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[UE_id].mode]); +#endif + + if (abstraction_flag==0) { + rx_ulsch(phy_vars_eNB, + sched_subframe, + phy_vars_eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id + UE_id, + phy_vars_eNB->ulsch_eNB, + 0); + } + +#ifdef PHY_ABSTRACTION + else { + rx_ulsch_emul(phy_vars_eNB, + subframe, + phy_vars_eNB->eNB_UE_stats[UE_id].sector, // this is the effective sector id + i); + } + +#endif + + if (abstraction_flag == 0) { + ret = ulsch_decoding(phy_vars_eNB, + UE_id, + sched_subframe, + 0, // control_only_flag + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI, + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); + } + +#ifdef PHY_ABSTRACTION + else { + ret = ulsch_decoding_emul(phy_vars_eNB, + sched_subframe, + UE_id, + &rnti); + } + +#endif + + if (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) { +#ifdef DEBUG_PHY_PROC + + print_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); +#endif + access_mode = UNKNOWN_ACCESS; + extract_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o, + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format, + &phy_vars_eNB->eNB_UE_stats[UE_id], + phy_vars_eNB->lte_frame_parms.N_RB_DL, + &rnti, &access_mode); + phy_vars_eNB->eNB_UE_stats[UE_id].rank = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0]; + } + + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE; + + if ((num_active_cba_groups > 0) && + (UE_id + num_active_cba_groups < NUMBER_OF_UE_MAX) && + (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) && + (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) { +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n", + phy_vars_eNB->Mod_id,harq_pid,frame,subframe,UE_id,harq_pid, + UE_id+num_active_cba_groups, UE_id%phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups); +#endif + phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; + phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; + phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS; + } - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == - phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) { - LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n", - phy_vars_eNB->Mod_id, i); - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; - if (phy_vars_eNB->mac_enabled==1) { - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); - } - mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); + if (ret == (1+MAX_TURBO_ITERATIONS)) { + phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++; + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0; + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++; + } // ulsch in error + else { + LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,subframe); - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; - //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1; + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1; + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0; + phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 0; +#ifdef DEBUG_PHY_PROC +#ifdef DEBUG_ULSCH + LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:", + frame,subframe, + harq_pid,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3); + + for (j=0; j<phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]); + + LOG_T(PHY,"\n"); +#endif +#endif + + if (access_mode > UNKNOWN_ACCESS) { + LOG_D(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", + phy_vars_eNB->Mod_id, frame,subframe, + UE_id, phy_vars_eNB->ulsch_eNB[UE_id]->rnti, + UE_id % phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]); + // detect if there is a CBA collision + if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) { + mac_xface->rx_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame,subframe, + phy_vars_eNB->ulsch_eNB[UE_id]->rnti, + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b, + phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3, + harq_pid, + NULL); + + phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;//(subframe); } else { - // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI) - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1; + if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 1 ) + LOG_N(PHY,"[eNB%d] Frame %d subframe %d : first CBA collision detected \n ", + phy_vars_eNB->Mod_id,frame,subframe); - get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms, - subframe, - frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe); - }/* - - LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) - printf("%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]); - printf("\n"); - */ - // dump_ulsch(phy_vars_eNB,sched_subframe,i); - //#ifndef EXMIMO_IOT - LOG_D(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i); - //#else - //mac_exit_wrapper("Msg3 error"); - //#endif - } // This is Msg3 error - else { //normal ULSCH - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, - phy_vars_eNB->ulsch_eNB[i]->Mlimit, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]); + LOG_N(PHY,"[eNB%d] Frame %d subframe %d : CBA collision set SR for UE %d in group %d \n ", + phy_vars_eNB->Mod_id,frame,subframe, + phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups],UE_id%num_active_cba_groups ); -#if defined(MESSAGE_CHART_GENERATOR_PHY) - MSC_LOG_RX_DISCARDED_MESSAGE( - MSC_PHY_ENB,MSC_PHY_UE, - NULL,0, - "%05u:%02u ULSCH received rnti %x harq id %u round %d", - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1 - ); -#endif - /* - LOG_T(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:\n",frame,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0]!=NULL){ - for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]); - LOG_T(PHY,"\n"); + phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1; + + mac_xface->SR_indication(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame, + phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe); } - */ + } // UNKNOWN_ACCESS + } // ULSCH CBA not in error + } +} - // dump_ulsch(phy_vars_eNB,sched_subframe,i); - //mac_exit_wrapper("ULSCH error"); +void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,const uint8_t abstraction_flag,const relaying_type_t r_type) +{ + //RX processing + UNUSED(r_type); + uint32_t l, ret=0,i,j,k; + uint32_t harq_pid, harq_idx, round; + uint8_t nPRS; + LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; + int sync_pos; + uint16_t rnti=0; + uint8_t access_mode; - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mlimit) { - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mlimit %d reached\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, i, - phy_vars_eNB->ulsch_eNB[i]->Mlimit); + const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx; + const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors++; - //dump_ulsch(phy_vars_eNB, sched_subframe, i); - // indicate error to MAC - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - NULL, - 0, - harq_pid, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); - } - } - } // ulsch in error - else { - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe); - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], - phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - ret); - } -#if defined(MESSAGE_CHART_GENERATOR_PHY) - MSC_LOG_RX_MESSAGE( - MSC_PHY_ENB,MSC_PHY_UE, - NULL,0, - "%05u:%02u ULSCH received rnti %x harq id %u", - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid - ); + AssertFatal(sched_subframe < NUM_ENB_THREADS, "Bad sched_subframe %d", sched_subframe); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1); + start_meas(&phy_vars_eNB->phy_proc_rx); +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe); #endif - for (j=0; j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; j++) - //this is the RSSI per RB - phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = - - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]* - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/ - phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) - - phy_vars_eNB->rx_total_gain_eNB_dB - - hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 - - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100; - - /* - dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]*phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb) - - phy_vars_eNB->rx_total_gain_eNB_dB - - hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 - - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100;*/ - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0; - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { - if (phy_vars_eNB->mac_enabled==1) { - //#ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", - phy_vars_eNB->Mod_id, - frame,harq_pid,i); - //#endif - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, - harq_pid, - &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); - - // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI) - if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 0 ) { - phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; - mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->eNB_UE_stats[i].crnti); - mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); - phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; - } - /* - mac_xface->terminate_ra_proc(phy_vars_eNB->Mod_id, - frame, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - */ - } + phy_vars_eNB->rb_mask_ul[0]=0; + phy_vars_eNB->rb_mask_ul[1]=0; + phy_vars_eNB->rb_mask_ul[2]=0; + phy_vars_eNB->rb_mask_ul[3]=0; - phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH; - phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0; + if (abstraction_flag == 0) { + remove_7_5_kHz(phy_vars_eNB,subframe<<1); + remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1); + } - //#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,subframe,i); - //#endif //DEBUG_PHY_PROC + // check if we have to detect PRACH first + if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1); + prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0); + } - for (k=0; k<8; k++) { //harq_processes - for (j=0; j<phy_vars_eNB->dlsch_eNB[i][0]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; - } + if (abstraction_flag == 0) { + start_meas(&phy_vars_eNB->ofdm_demod_stats); + + for (l=0; l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2; l++) { + + slot_fep_ul(&phy_vars_eNB->lte_frame_parms, + &phy_vars_eNB->lte_eNB_common_vars, + l, + subframe<<1, + 0, + 0 + ); + slot_fep_ul(&phy_vars_eNB->lte_frame_parms, + &phy_vars_eNB->lte_eNB_common_vars, + l, + (subframe<<1)+1, + 0, + 0 + ); + } + + stop_meas(&phy_vars_eNB->ofdm_demod_stats); + } + + // Check for active processes in current subframe + harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms, + frame,subframe); + + // reset the cba flag used for collision detection + for (i=0; i < NUM_MAX_CBA_GROUP; i++) { + phy_vars_eNB->cba_last_reception[i]=0; + } + + // Do PUCCH processing first + + for (i=0; i<NUMBER_OF_UE_MAX; i++) { + pucch_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag); + } - phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; + for (i=0; i<NUMBER_OF_UE_MAX; i++) { - for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->Mlimit; j++) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; - } - } + // check for Msg3 + if (phy_vars_eNB->mac_enabled==1) { + if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) { + process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid); + } + } - phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; - phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; - //mac_xface->macphy_exit("Mode PUSCH. Exiting.\n"); - } else { + phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63; + phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = 0; + phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63; + if ((phy_vars_eNB->ulsch_eNB[i]) && + (phy_vars_eNB->ulsch_eNB[i]->rnti>0) && + (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) { + // UE is has ULSCH scheduling + round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; + + for (int rb=0; + rb<=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; + rb++) { + int rb2 = rb+phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb; + phy_vars_eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31)); + } #ifdef DEBUG_PHY_PROC -#ifdef DEBUG_ULSCH - LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti,i); +#endif - for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); + if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n", + phy_vars_eNB->Mod_id, + frame, + subframe, + phy_vars_eNB->eNB_UE_stats[i].sector); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,1); + } else { + LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n", + phy_vars_eNB->Mod_id, + frame, + subframe, + i, + mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]); + } - LOG_T(PHY,"\n"); -#endif -#endif - //dump_ulsch(phy_vars_eNB,sched_subframe,i); + nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1]; - if (phy_vars_eNB->mac_enabled==1) { - // if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) { - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, - harq_pid, - NULL); - //} - /* - else { - // Retrieve calibration information and do whatever - LOG_D(PHY,"[eNB][Auto-Calibration] Frame %d, Subframe %d : ULSCH PDU (RX) %d bytes\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - } - */ -#ifdef LOCALIZATION - start_meas(&phy_vars_eNB->localization_stats); - aggregate_eNB_UE_localization_stats(phy_vars_eNB, - i, - frame, - subframe, - get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 1)/100); - stop_meas(&phy_vars_eNB->localization_stats); -#endif + phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + + nPRS)%12; - } - } + if (frame_parms->frame_type == FDD ) { + int sf = (subframe<4) ? (subframe+6) : (subframe-4); - // estimate timing advance for MAC - if (abstraction_flag == 0) { - sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe); - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/4; //to check + if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1; + } else { + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0; } + } -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] frame %d, subframe %d: user %d: timing advance = %d\n", - phy_vars_eNB->Mod_id, - frame, subframe, - i, - phy_vars_eNB->eNB_UE_stats[i].timing_advance_update); -#endif + LOG_D(PHY, + "[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n", + phy_vars_eNB->Mod_id,harq_pid,frame,subframe, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx, + phy_vars_eNB->ulsch_eNB[i]->cyclicShift, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2, + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift, + nPRS, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK); + phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb; + phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round; + phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs; + start_meas(&phy_vars_eNB->ulsch_demodulation_stats); + if (abstraction_flag==0) { + rx_ulsch(phy_vars_eNB, + sched_subframe, + phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + i, + phy_vars_eNB->ulsch_eNB, + 0); + } - } // ulsch not in error +#ifdef PHY_ABSTRACTION + else { + rx_ulsch_emul(phy_vars_eNB, + subframe, + phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id + i); + } - // process HARQ feedback -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,subframe, - i); #endif - process_HARQ_feedback(i, - sched_subframe, - phy_vars_eNB, - 1, // pusch_flag - 0, - 0, - 0); + stop_meas(&phy_vars_eNB->ulsch_demodulation_stats); -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", - phy_vars_eNB->Mod_id,frame,subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, - harq_pid, - i, - ret, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], - phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid], - phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); -#endif - - // dump stats to VCD - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,phy_vars_eNB->pusch_stats_mcs[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,phy_vars_eNB->pusch_stats_rb[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,phy_vars_eNB->pusch_stats_round[0][(frame*10)+subframe]); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0])); - } // ulsch_eNB[0] && ulsch_eNB[0]->rnti>0 && ulsch_eNB[0]->subframe_scheduling_flag == 1 - else if ((phy_vars_eNB->dlsch_eNB[i][0]) && - (phy_vars_eNB->dlsch_eNB[i][0]->rnti>0)) { // check for PUCCH + start_meas(&phy_vars_eNB->ulsch_decoding_stats); - // check SR availability - do_SR = is_SR_subframe(phy_vars_eNB,i,sched_subframe); - // do_SR = 0; + if (abstraction_flag == 0) { + ret = ulsch_decoding(phy_vars_eNB, + i, + sched_subframe, + 0, // control_only_flag + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); + } - // Now ACK/NAK - // First check subframe_tx flag for earlier subframes - get_n1_pucch_eNB(phy_vars_eNB, - i, - sched_subframe, - &n1_pucch0, - &n1_pucch1, - &n1_pucch2, - &n1_pucch3); +#ifdef PHY_ABSTRACTION + else { + ret = ulsch_decoding_emul(phy_vars_eNB, + sched_subframe, + i, + &rnti); + } - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n", - phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,subframe, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR); +#endif + stop_meas(&phy_vars_eNB->ulsch_decoding_stats); - if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) { // no TX PDSCH that have to be checked and no SR for this UE_id - } else { - // otherwise we have some PUCCH detection to do + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,subframe, + phy_vars_eNB->ulsch_eNB[i]->rnti, + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], + phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], + phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + ret); - // Null out PUCCH PRBs for noise measurement - switch(phy_vars_eNB->lte_frame_parms.N_RB_UL) { - case 6: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5 - break; - case 15: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14 - break; - case 25: - phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24 - break; - case 50: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32) - break; - case 75: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64) - break; - case 100: - phy_vars_eNB->rb_mask_ul[0] |= 0x1; - phy_vars_eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96) - break; - default: - LOG_E(PHY,"Unknown number for N_RB_UL %d\n",phy_vars_eNB->lte_frame_parms.N_RB_UL); - break; - } - if (do_SR == 1) { - phy_vars_eNB->eNB_UE_stats[i].sr_total++; + //compute the expected ULSCH RX power (for the stats) + phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF = + get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0); // 0 means bw_factor is not considered - if (abstraction_flag == 0) - metric0_SR = rx_pucch(phy_vars_eNB, - pucch_format1, - i, - phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex, - 0, // n2_pucch - 0, // shortened format, should be use_srs flag, later - &SR_payload, - subframe, - PUCCH1_THRES); + //dump_ulsch(phy_vars_eNB, sched_subframe, i); -#ifdef PHY_ABSTRACTION - else { - metric0_SR = rx_pucch_emul(phy_vars_eNB, - i, - pucch_format1, - 0, - &SR_payload, - sched_subframe); - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex); - } + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n", + phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid); +#endif + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0; + if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { +#ifdef DEBUG_PHY_PROC + //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) + print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); #endif + extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format, + &phy_vars_eNB->eNB_UE_stats[i], + phy_vars_eNB->lte_frame_parms.N_RB_DL, + &rnti, &access_mode); + phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0]; - if (SR_payload == 1) { - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe); - phy_vars_eNB->eNB_UE_stats[i].sr_received++; + } - if (phy_vars_eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4 - /* is this test necessary? */ - if (phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status != SCH_IDLE) - put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[i][0], 0); - phy_vars_eNB->first_sr[i] = 0; - phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->round=0; - phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status=SCH_IDLE; - LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe); - } + if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,0); - if (phy_vars_eNB->mac_enabled==1) { - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe); - } - } - }// do_SR==1 + if (ret == (1+MAX_TURBO_ITERATIONS)) { - if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR - } else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD - // if SR was detected, use the n1_pucch from SR, else use n1_pucch0 - // n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex:n1_pucch0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; - LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,SR_payload); + LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round); - if (abstraction_flag == 0) { + if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", + phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame,subframe, i, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, + phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1); + + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,subframe, + phy_vars_eNB->ulsch_eNB[i]->rnti, + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], + phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], + phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + ret); + + if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == + phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) { + LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n", + phy_vars_eNB->Mod_id, i); + phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; + if (phy_vars_eNB->mac_enabled==1) { + mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame, + phy_vars_eNB->eNB_UE_stats[i].crnti); + } + mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); + phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; + //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0; + } else { + // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI) + phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1; - metric0 = rx_pucch(phy_vars_eNB, - pucch_format1a, - i, - (uint16_t)n1_pucch0, - 0, //n2_pucch - 0, // shortened format - pucch_payload0, + get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms, subframe, - PUCCH1a_THRES); + frame, + &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame, + &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe); + } + LOG_D(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i); + } // This is Msg3 error - if (metric0 < metric0_SR) - metric0=rx_pucch(phy_vars_eNB, - pucch_format1a, - i, - phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex, - 0, //n2_pucch - 0, // shortened format - pucch_payload0, - subframe, - PUCCH1a_THRES); - } - else { -#ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,i, - pucch_format1a, - 0, - pucch_payload0, - subframe); + else { //normal ULSCH + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,subframe, i, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1, + phy_vars_eNB->ulsch_eNB[i]->Mlimit, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]); + +#if defined(MESSAGE_CHART_GENERATOR_PHY) + MSC_LOG_RX_DISCARDED_MESSAGE( + MSC_PHY_ENB,MSC_PHY_UE, + NULL,0, + "%05u:%02u ULSCH received rnti %x harq id %u round %d", + frame,subframe, + phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1 + ); #endif - } -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n", - phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,subframe, - pucch_payload0[0],metric0); + if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mlimit) { + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mlimit %d reached\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,subframe, i, + phy_vars_eNB->ulsch_eNB[i]->Mlimit); + + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++; + phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors++; + + // indicate error to MAC + mac_xface->rx_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame,subframe, + phy_vars_eNB->ulsch_eNB[i]->rnti, + NULL, + 0, + harq_pid, + &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); + } + } + } // ulsch in error + else { + if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,subframe); + LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", + phy_vars_eNB->Mod_id,harq_pid, + frame,subframe, + phy_vars_eNB->ulsch_eNB[i]->rnti, + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]), + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0], + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1], + phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0], + phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1], + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + ret); + } +#if defined(MESSAGE_CHART_GENERATOR_PHY) + MSC_LOG_RX_MESSAGE( + MSC_PHY_ENB,MSC_PHY_UE, + NULL,0, + "%05u:%02u ULSCH received rnti %x harq id %u", + frame,subframe, + phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid + ); #endif + for (j=0; j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; j++) + //this is the RSSI per RB + phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = + + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]* + (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/ + phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) - + phy_vars_eNB->rx_total_gain_eNB_dB - + hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 - + get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100; + + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0; - process_HARQ_feedback(i,sched_subframe,phy_vars_eNB, - 0,// pusch_flag - pucch_payload0, - 2, - SR_payload); + if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) { + if (phy_vars_eNB->mac_enabled==1) { - } // FDD - else { //TDD + LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n", + phy_vars_eNB->Mod_id, + frame,harq_pid,i); + + mac_xface->rx_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame,subframe, + phy_vars_eNB->ulsch_eNB[i]->rnti, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, + harq_pid, + &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag); + + // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI) + if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 0 ) { + phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; + mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame, + phy_vars_eNB->eNB_UE_stats[i].crnti); + mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti); + phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0; + } // Msg3_flag == 0 + + } // mac_enabled==1 - bundling_flag = phy_vars_eNB->pucch_config_dedicated[i].tdd_AckNackFeedbackMode; + phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH; + phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0; - // fix later for 2 TB case and format1b + LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,subframe,i); - if ((frame_parms->frame_type==FDD) || - (bundling_flag==bundling) || - ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) { - format = pucch_format1a; - // msg("PUCCH 1a\n"); - } else { - format = pucch_format1b; - // msg("PUCCH 1b\n"); - } + for (k=0; k<8; k++) { //harq_processes + for (j=0; j<phy_vars_eNB->dlsch_eNB[i][0]->Mlimit; j++) { + phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0; + phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0; + phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0; + } - // if SR was detected, use the n1_pucch from SR - if (SR_payload==1) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,subframe, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); -#endif + phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0; - if (abstraction_flag == 0) - metric0_SR = rx_pucch(phy_vars_eNB, - format, - i, - phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex, - 0, //n2_pucch - 0, // shortened format - pucch_payload0, - subframe, - PUCCH1a_THRES); - else { -#ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,i, - format, - 0, - pucch_payload0, - subframe); -#endif + for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->Mlimit; j++) { + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0; + phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0; } - } else { //using n1_pucch0/n1_pucch1 resources + } + + phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0; + phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0; + phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0; + } // Msg3_flag==1 + else { // Msg3_flag == 0 + #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,subframe, - n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format); -#endif - metric0=0; - metric1=0; +#ifdef DEBUG_ULSCH + LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe, + harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - // Check n1_pucch0 metric - if (n1_pucch0 != -1) { - if (abstraction_flag == 0) - metric0 = rx_pucch(phy_vars_eNB, - format, - i, - (uint16_t)n1_pucch0, - 0, // n2_pucch - 0, // shortened format - pucch_payload0, - subframe, - PUCCH1a_THRES); - else { -#ifdef PHY_ABSTRACTION - metric0 = rx_pucch_emul(phy_vars_eNB,i, - format, - 0, - pucch_payload0, - subframe); + for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++) + LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); + + LOG_T(PHY,"\n"); +#endif #endif - } - } - // Check n1_pucch1 metric - if (n1_pucch1 != -1) { - if (abstraction_flag == 0) - metric1 = rx_pucch(phy_vars_eNB, - format, - i, - (uint16_t)n1_pucch1, - 0, //n2_pucch - 0, // shortened format - pucch_payload1, - subframe, - PUCCH1a_THRES); - else { -#ifdef PHY_ABSTRACTION - metric1 = rx_pucch_emul(phy_vars_eNB,i, - format, - 1, - pucch_payload1, - subframe); + if (phy_vars_eNB->mac_enabled==1) { + mac_xface->rx_sdu(phy_vars_eNB->Mod_id, + phy_vars_eNB->CC_id, + frame,subframe, + phy_vars_eNB->ulsch_eNB[i]->rnti, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, + harq_pid, + NULL); +#ifdef LOCALIZATION + start_meas(&phy_vars_eNB->localization_stats); + aggregate_eNB_UE_localization_stats(phy_vars_eNB, + i, + frame, + subframe, + get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 1)/100); + stop_meas(&phy_vars_eNB->localization_stats); #endif - } - } - } + + } // mac_enabled==1 + } // Msg3_flag == 0 - if (SR_payload == 1) { - pucch_payload = pucch_payload0; + // estimate timing advance for MAC + if (abstraction_flag == 0) { + sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe); + phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/4; //to check + } - if (bundling_flag == bundling) - pucch_sel = 2; - } else if (bundling_flag == multiplexing) { // multiplexing + no SR - pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0; - pucch_sel = (metric1>metric0) ? 1 : 0; - } else { // bundling + no SR - if (n1_pucch1 != -1) - pucch_payload = pucch_payload1; - else if (n1_pucch0 != -1) - pucch_payload = pucch_payload0; +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d] frame %d, subframe %d: user %d: timing advance = %d\n", + phy_vars_eNB->Mod_id, + frame, subframe, + i, + phy_vars_eNB->eNB_UE_stats[i].timing_advance_update); +#endif - pucch_sel = 2; // indicate that this is a bundled ACK/NAK - } + } // ulsch not in error + + // process HARQ feedback #ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id, - phy_vars_eNB->dlsch_eNB[i][0]->rnti, - frame,subframe, - metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]); + LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id, + phy_vars_eNB->dlsch_eNB[i][0]->rnti, + frame,subframe, + i); #endif - process_HARQ_feedback(i,sched_subframe,phy_vars_eNB, - 0,// pusch_flag - pucch_payload, - pucch_sel, - SR_payload); - } + process_HARQ_feedback(i, + sched_subframe, + phy_vars_eNB, + 1, // pusch_flag + 0, + 0, + 0); + +#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", + phy_vars_eNB->Mod_id,frame,subframe, + phy_vars_eNB->eNB_UE_stats[i].sector, + harq_pid, + i, + ret, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status, + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0], + phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], + phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid], + phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]); +#endif + + // dump stats to VCD + if (i==0) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,phy_vars_eNB->pusch_stats_mcs[0][(frame*10)+subframe]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,phy_vars_eNB->pusch_stats_rb[0][(frame*10)+subframe]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,phy_vars_eNB->pusch_stats_round[0][(frame*10)+subframe]); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0])); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0+harq_pid,ret); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0+harq_pid,(frame*10)+subframe); } + } // ulsch_eNB[0] && ulsch_eNB[0]->rnti>0 && ulsch_eNB[0]->subframe_scheduling_flag == 1 - } + // update ULSCH statistics for tracing if ((frame % 100 == 0) && (subframe == 4)) { for (harq_idx=0; harq_idx<8; harq_idx++) { for (round=0; round<phy_vars_eNB->ulsch_eNB[i]->Mlimit; round++) { @@ -3268,166 +3282,8 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_ phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS; } - num_active_cba_groups = phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups; - - /*if (num_active_cba_groups > 0 ) - LOG_D(PHY,"[eNB] last slot %d trying cba transmission decoding UE %d num_grps %d rnti %x flag %d\n", - last_slot, i, num_active_cba_groups,phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups], - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag ); - */ - if ((phy_vars_eNB->ulsch_eNB[i]) && - (num_active_cba_groups > 0) && - (phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]>0) && - (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) { - rnti=0; - -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe, - i, (uint16_t)phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]); -#endif - - if (abstraction_flag==0) { - rx_ulsch(phy_vars_eNB, - sched_subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i, - phy_vars_eNB->ulsch_eNB, - 0); - } - -#ifdef PHY_ABSTRACTION - else { - rx_ulsch_emul(phy_vars_eNB, - subframe, - phy_vars_eNB->eNB_UE_stats[i].sector, // this is the effective sector id - i); - } - -#endif - - if (abstraction_flag == 0) { - ret = ulsch_decoding(phy_vars_eNB, - i, - sched_subframe, - 0, // control_only_flag - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0); - } - -#ifdef PHY_ABSTRACTION - else { - ret = ulsch_decoding_emul(phy_vars_eNB, - sched_subframe, - i, - &rnti); - } - -#endif - - if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) { -#ifdef DEBUG_PHY_PROC - //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) - print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL); -#endif - access_mode = UNKNOWN_ACCESS; - extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format, - &phy_vars_eNB->eNB_UE_stats[i], - phy_vars_eNB->lte_frame_parms.N_RB_DL, - &rnti, &access_mode); - phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0]; - } - - /* LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the sched_subframeuling_flag, total cba groups %d %d\n", - phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i,harq_pid, - phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups,num_active_cba_groups); - */ - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->status= SCH_IDLE; - - if ((num_active_cba_groups > 0) && - // (i % num_active_cba_groups == 0) && // this ue is used a a template for the CBA - (i + num_active_cba_groups < NUMBER_OF_UE_MAX) && - (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->cba_rnti[i%num_active_cba_groups] > 0 ) && - (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->num_active_cba_groups> 0)) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n", - phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid, - i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups); -#endif - phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1; - phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE; - phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS; - } - - if (ret == (1+MAX_TURBO_ITERATIONS)) { - phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++; - } // ulsch in error - else { - LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n", - phy_vars_eNB->Mod_id,harq_pid, - frame,subframe); - - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1; - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0; - phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0; -#ifdef DEBUG_PHY_PROC -#ifdef DEBUG_ULSCH - LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:", - frame,subframe, - harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3); - - for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++) - LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]); - - LOG_T(PHY,"\n"); -#endif -#endif - - if (access_mode > UNKNOWN_ACCESS) { - LOG_D(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", - phy_vars_eNB->Mod_id, frame,subframe, - i, phy_vars_eNB->ulsch_eNB[i]->rnti, - i % phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]); - - // detect if there is a CBA collision - if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 0 ) { - mac_xface->rx_sdu(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame,subframe, - phy_vars_eNB->ulsch_eNB[i]->rnti, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b, - phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3, - harq_pid, - NULL); - - phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]+=1;//(subframe); - } else { - if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 1 ) - LOG_N(PHY,"[eNB%d] Frame %d subframe %d : first CBA collision detected \n ", - phy_vars_eNB->Mod_id,frame,subframe); - - LOG_N(PHY,"[eNB%d] Frame %d subframe %d : CBA collision set SR for UE %d in group %d \n ", - phy_vars_eNB->Mod_id,frame,subframe, - phy_vars_eNB->cba_last_reception[i%num_active_cba_groups],i%num_active_cba_groups ); - - phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]+=1; - - mac_xface->SR_indication(phy_vars_eNB->Mod_id, - phy_vars_eNB->CC_id, - frame, - phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe); - } - } - } // ULSCH CBA not in error - } - + // CBA (non-LTE) + cba_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag); } // loop i=0 ... NUMBER_OF_UE_MAX-1 if (abstraction_flag == 0) { diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 50afd8bcefe2477b8ae2311c8c2b767b0113a7ea..02fe3f1d29b388a396ea551c64e7e5094809a36a 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -99,7 +99,7 @@ uint64_t DLSCH_alloc_pdu_1[2]; #define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2) //#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 //#define DLSCH_RB_ALLOC 0x0001 -void do_OFDM_mod_l(mod_sym_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms) +void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms) { int aa, slot_offset, slot_offset_F; @@ -2111,7 +2111,7 @@ PMI_FEEDBACK: // printf("Trial %d : Round %d, pmi_feedback %d \n",trials,round,pmi_feedback); for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) { - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(mod_sym_t)); + memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); } if (input_fd==NULL) { diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index 8b6e4f937e64f59c2ad0f029a372d08f1cdc837e..9f0994460932d7baf013f71f87026be44ba1c6bc 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -131,7 +131,6 @@ int main(int argc, char **argv) double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1=0.0; uint8_t snr1set=0; double snr_step=1,input_snr_step=1; - //mod_sym_t **txdataF; int **txdata; double **s_re,**s_im,**r_re,**r_im; double iqim = 0.0; @@ -451,7 +450,7 @@ int main(int argc, char **argv) //if (trials%100==0) //eNB2UE[0]->first_run = 1; eNB2UE->first_run = 1; - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(mod_sym_t)); + memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); generate_mch(PHY_vars_eNB,sched_subframe,input_buffer,0); diff --git a/openair1/SIMULATION/LTE_PHY/pbchsim.c b/openair1/SIMULATION/LTE_PHY/pbchsim.c index e99da5041bbcbfbfa5ba39381f5c38475a966f6b..4a2b3f935120036e29ed1405f4a865720123e98d 100644 --- a/openair1/SIMULATION/LTE_PHY/pbchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pbchsim.c @@ -57,11 +57,11 @@ PHY_VARS_UE *PHY_vars_UE; #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13 -mod_sym_t *dummybuf[4]; -mod_sym_t dummy0[2048*14]; -mod_sym_t dummy1[2048*14]; -mod_sym_t dummy2[2048*14]; -mod_sym_t dummy3[2048*14]; +int32_t *dummybuf[4]; +int32_t dummy0[2048*14]; +int32_t dummy1[2048*14]; +int32_t dummy2[2048*14]; +int32_t dummy3[2048*14]; int main(int argc, char **argv) @@ -72,7 +72,6 @@ int main(int argc, char **argv) int i,l,aa; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1; uint8_t snr1set=0; - //mod_sym_t **txdataF; int **txdata,**txdata1,**txdata2; double **s_re,**s_im,**s_re1,**s_im1,**s_re2,**s_im2,**r_re,**r_im,**r_re1,**r_im1,**r_re2,**r_im2; double iqim = 0.0; @@ -603,7 +602,7 @@ int main(int argc, char **argv) dummybuf[2] = dummy2; dummybuf[3] = dummy3; generate_pbch(&PHY_vars_eNB->lte_eNB_pbch, - (mod_sym_t**)dummybuf, + (int32_t**)dummybuf, AMP, &PHY_vars_eNB->lte_frame_parms, pbch_pdu, diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index b87711348fc9973017ecea704ac18dad20816529..94bbbfaec3f91320a24fc76d95ec71208826c239 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -410,7 +410,6 @@ int main(int argc, char **argv) int i,l,aa; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1; - //mod_sym_t **txdataF; int **txdata; double **s_re,**s_im,**r_re,**r_im; @@ -773,8 +772,8 @@ int main(int argc, char **argv) - PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(8,MAX_TURBO_ITERATIONS,N_RB_DL,0); - PHY_vars_UE->ulsch_ue[0] = new_ue_ulsch(8,N_RB_DL,0); + PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0); + PHY_vars_UE->ulsch_ue[0] = new_ue_ulsch(N_RB_DL,0); PHY_vars_eNB->proc[subframe].frame_tx = 0; @@ -838,7 +837,7 @@ int main(int argc, char **argv) // printf("DCI (SF %d): txdataF %p (0 %p)\n",subframe,&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][512*14*subframe],&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0]); for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB; aa++) { - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(mod_sym_t)); + memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t)); /* re_offset = PHY_vars_eNB->lte_frame_parms.first_carrier_offset; diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index 440a5ec5679f755eb17e7b81de76b837647bee9d..4d0de016a28d1e8f0d89f3c1a9071d474917d8b7 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -635,8 +635,8 @@ int main(int argc, char **argv) UE2eNB->max_Doppler = maxDoppler; // NN: N_RB_UL has to be defined in ulsim - PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(8,max_turbo_iterations,N_RB_DL,0); - PHY_vars_UE->ulsch_ue[0] = new_ue_ulsch(8,N_RB_DL,0); + PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0); + PHY_vars_UE->ulsch_ue[0] = new_ue_ulsch(N_RB_DL,0); // Create transport channel structures for 2 transport blocks (MIMO) for (i=0; i<2; i++) { diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index 80190fe1729a0eb99f743bd1e304efb43938e76a..30272346f5f893df5675cc6a0236c47bf752cec0 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -184,6 +184,12 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, size_bytes = sizeof(DCI1A_1_5MHz_FDD_t); size_bits = sizeof_DCI1A_1_5MHz_FDD_t; break; + case 15:/* + ((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->type = 1; + ((DCI1A_2_5MHz_FDD_t*)DLSCH_dci)->rballoc = 31; + size_bytes = sizeof(DCI1A_1_5MHz_FDD_t); + size_bits = sizeof_DCI1A_1_5MHz_FDD_t;*/ + break; case 25: ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->type = 1; ((DCI1A_5MHz_FDD_t*)DLSCH_dci)->rballoc = 511; @@ -196,6 +202,12 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag, size_bytes = sizeof(DCI1A_10MHz_FDD_t); size_bits = sizeof_DCI1A_10MHz_FDD_t; break; + case 75: + /* ((DCI1A_15MHz_FDD_t*)DLSCH_dci)->type = 1; + ((DCI1A_15MHz_FDD_t*)DLSCH_dci)->rballoc = 2047; + size_bytes = sizeof(DCI1A_10MHz_FDD_t); + size_bits = sizeof_DCI1A_10MHz_FDD_t;*/ + break; case 100: ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->type = 1; ((DCI1A_20MHz_FDD_t*)DLSCH_dci)->rballoc = 8191; diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index d68f26370b04cfb6273f4e696ffd95a605338d6b..2973bedd00ee8432bdd255f4e1e66dfad5384604 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -183,21 +183,10 @@ void rx_sdu( UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid] = (payload_ptr[0] & 0x3f); // update buffer info - // old_buffer_info = UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]; UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]=BSR_TABLE[UE_list->UE_template[CC_idP][UE_id].bsr_info[lcgid]]; - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer+= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]; - - /* - if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= old_buffer_info) - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer -= old_buffer_info; - else - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 0; - */ - - if (UE_list->UE_template[CC_idP][UE_id].ul_total_buffer >= 300000) - UE_list->UE_template[CC_idP][UE_id].ul_total_buffer = 300000; + UE_list->UE_template[CC_idP][UE_id].ul_total_buffer= UE_list->UE_template[CC_idP][UE_id].ul_buffer_info[lcgid]; PHY_vars_eNB_g[enb_mod_idP][CC_idP]->pusch_stats_bsr[UE_id][(frameP*10)+subframeP] = (payload_ptr[0] & 0x3f); if (UE_id == UE_list->head) @@ -784,7 +773,7 @@ void schedule_ulsch_rnti(module_id_t module_idP, UE_sched_ctrl->ul_failure_timer); // reset the scheduling request UE_template->ul_SR = 0; - aggregation = process_ue_cqi(module_idP,UE_id); // =2 by default!! + aggregation = process_ue_cqi(module_idP,UE_id); status = mac_eNB_get_rrc_status(module_idP,rnti); if (status < RRC_CONNECTED) cqi_req = 0; @@ -838,7 +827,7 @@ void schedule_ulsch_rnti(module_id_t module_idP, UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power; UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul; mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS - if ((cqi_req==1) && (mcs==20)) { + if ((cqi_req==1) && (mcs>19)) { mcs=19; } if (UE_template->pre_allocated_rb_table_index_ul >=0) { diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 4038c33bda3e14e8816dd41b24d500ef8179aedd..78e481f3d6c43a7be089b4245342229990d3d082 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -119,6 +119,7 @@ const char* eurecomVariablesNames[] = { "mp_free", "ue_inst_cnt_rx", "ue_inst_cnt_tx", + "dci_info", "ue0_BSR", "ue0_BO", "ue0_scheduled", @@ -133,6 +134,14 @@ const char* eurecomVariablesNames[] = { "ue0_rssi5", "ue0_rssi6", "ue0_rssi7", + "ue0_res0", + "ue0_res1", + "ue0_res2", + "ue0_res3", + "ue0_res4", + "ue0_res5", + "ue0_res6", + "ue0_res7", "ue0_MCS0", "ue0_MCS1", "ue0_MCS2", @@ -157,6 +166,14 @@ const char* eurecomVariablesNames[] = { "ue0_ROUND5", "ue0_ROUND6", "ue0_ROUND7", + "ue0_SFN0", + "ue0_SFN1", + "ue0_SFN2", + "ue0_SFN3", + "ue0_SFN4", + "ue0_SFN5", + "ue0_SFN6", + "ue0_SFN7", }; const char* eurecomFunctionsNames[] = { @@ -238,6 +255,7 @@ const char* eurecomFunctionsNames[] = { "macxface_phy_config_sib2_eNB", "macxface_phy_config_dedicated_eNB", "phy_ue_compute_prach", + "phy_enb_ulsch_msg3", "phy_enb_ulsch_decoding0", "phy_enb_ulsch_decoding1", "phy_enb_ulsch_decoding2", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 24a0efee2794ba260a7d5e8fd1f7fa78b3d00372..a9e433936872a721559e82b04c2ad76c22d28277 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -91,6 +91,7 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLE_MP_FREE, VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, + VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO, VCD_SIGNAL_DUMPER_VARIABLES_UE0_BSR, VCD_SIGNAL_DUMPER_VARIABLES_UE0_BO, VCD_SIGNAL_DUMPER_VARIABLES_UE0_SCHEDULED, @@ -105,6 +106,14 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI5, VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI6, VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI7, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES1, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES2, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES3, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES4, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES5, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES6, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES7, VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0, VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS1, VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS2, @@ -129,6 +138,14 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND5, VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND6, VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND7, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN1, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN2, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN3, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN4, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN5, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN6, + VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN7, VCD_SIGNAL_DUMPER_VARIABLES_LAST, VCD_SIGNAL_DUMPER_VARIABLES_END = VCD_SIGNAL_DUMPER_VARIABLES_LAST, } vcd_signal_dump_variables; @@ -212,6 +229,7 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_SIB2_ENB, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_CONFIG_DEDICATED_ENB, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_COMPUTE_PRACH, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING1, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING2, diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf index e083ea0f4ef8d4a6d545cb15334d227c3ab3f583..7d34889f6787782594f69f2398c58c0f39f39633 100644 --- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf +++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf @@ -36,7 +36,7 @@ eNBs = nb_antennas_tx = 1; nb_antennas_rx = 1; tx_gain = 90; - rx_gain = 127; + rx_gain = 125; prach_root = 0; prach_config_index = 0; prach_high_speed = "DISABLE"; @@ -66,7 +66,7 @@ eNBs = pusch_p0_Nominal = -90; pusch_alpha = "AL1"; - pucch_p0_Nominal = -108; + pucch_p0_Nominal = -100; msg3_delta_Preamble = 6; pucch_deltaF_Format1 = "deltaF2"; pucch_deltaF_Format1b = "deltaF3"; @@ -140,10 +140,10 @@ eNBs = NETWORK_INTERFACES : { ENB_INTERFACE_NAME_FOR_S1_MME = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.213/24"; + ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24"; ENB_INTERFACE_NAME_FOR_S1U = "eth0"; - ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.213/24"; + ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24"; ENB_PORT_FOR_S1U = 2152; # Spec 2152 }; diff --git a/targets/RT/USER/eNB_usrp.gtkw b/targets/RT/USER/eNB_usrp.gtkw index b7810896d576763a51ac8f5ad3fd00e3c3d62924..935bf68b2eb49084c0e2738d758b106215bc7571 100644 --- a/targets/RT/USER/eNB_usrp.gtkw +++ b/targets/RT/USER/eNB_usrp.gtkw @@ -1,15 +1,15 @@ [*] [*] GTKWave Analyzer v3.3.58 (w)1999-2014 BSI -[*] Thu Mar 17 23:50:10 2016 +[*] Sun Apr 10 20:34:38 2016 [*] [dumpfile] "/tmp/openair_dump_eNB.vcd" -[dumpfile_mtime] "Thu Mar 17 23:49:36 2016" -[dumpfile_size] 236045612 +[dumpfile_mtime] "Sun Apr 10 20:26:57 2016" +[dumpfile_size] 181182776 [savefile] "/home/papillon/openairinterface5g/targets/RT/USER/eNB_usrp.gtkw" -[timestart] 10372000000 +[timestart] 19787100000 [size] 1535 876 [pos] -1 -1 -*-29.793451 12619679774 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 +*-21.793451 19795882832 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 [sst_width] 284 [signals_width] 238 [sst_expanded] 1 @@ -51,82 +51,110 @@ functions.eNB_thread_tx9 functions.phy_procedures_eNb_tx functions.phy_procedures_eNb_rx @24 +variables.dci_info[63:0] variables.ue0_BO[63:0] @420 variables.ue0_BSR[63:0] -@421 variables.ue0_timing_advance[63:0] @28 functions.macxface_initiate_ra_proc functions.macxface_terminate_ra_proc +functions.phy_enb_ulsch_msg3 functions.macxface_SR_indication @420 variables.ue0_SR_ENERGY[63:0] variables.ue0_SR_THRES[63:0] +@25 +variables.dci_info[63:0] @28 functions.phy_enb_ulsch_decoding0 +@24 +variables.ue0_res0[63:0] @420 variables.ue0_rssi0[63:0] variables.ue0_MCS0[63:0] variables.ue0_RB0[63:0] @24 variables.ue0_ROUND0[63:0] +variables.ue0_SFN0[63:0] @28 functions.phy_enb_ulsch_decoding1 +@24 +variables.ue0_res1[63:0] @420 variables.ue0_rssi1[63:0] variables.ue0_MCS1[63:0] variables.ue0_RB1[63:0] @24 variables.ue0_ROUND1[63:0] +variables.ue0_SFN1[63:0] @28 functions.phy_enb_ulsch_decoding2 +@24 +variables.ue0_res2[63:0] @420 variables.ue0_rssi2[63:0] variables.ue0_MCS2[63:0] variables.ue0_RB2[63:0] @24 variables.ue0_ROUND2[63:0] +variables.ue0_SFN2[63:0] @28 functions.phy_enb_ulsch_decoding3 +@24 +variables.ue0_res3[63:0] @420 variables.ue0_rssi3[63:0] variables.ue0_MCS3[63:0] variables.ue0_RB3[63:0] @24 variables.ue0_ROUND3[63:0] +variables.ue0_SFN3[63:0] @28 functions.phy_enb_ulsch_decoding4 @420 variables.ue0_rssi4[63:0] +@24 +variables.ue0_res4[63:0] +@420 variables.ue0_MCS4[63:0] variables.ue0_RB4[63:0] @24 variables.ue0_ROUND4[63:0] +variables.ue0_SFN4[63:0] @28 functions.phy_enb_ulsch_decoding5 +@24 +variables.ue0_res5[63:0] @420 variables.ue0_rssi5[63:0] variables.ue0_MCS5[63:0] variables.ue0_RB5[63:0] @24 variables.ue0_ROUND5[63:0] +variables.ue0_SFN5[63:0] @28 functions.phy_enb_ulsch_decoding6 +@24 +variables.ue0_res6[63:0] @420 variables.ue0_rssi6[63:0] variables.ue0_MCS6[63:0] variables.ue0_RB6[63:0] @24 variables.ue0_ROUND6[63:0] +variables.ue0_SFN6[63:0] @28 functions.phy_enb_ulsch_decoding7 +@24 +variables.ue0_res7[63:0] @420 variables.ue0_rssi7[63:0] variables.ue0_MCS7[63:0] variables.ue0_RB7[63:0] @24 variables.ue0_ROUND7[63:0] +variables.ue0_SFN7[63:0] @28 functions.phy_enb_prach_rx functions.phy_eNB_dlsch_encoding