From c4b7d4c1345c7ffc47169b297c8d76bd00b9fd8b Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Wed, 4 Dec 2013 21:11:02 +0000 Subject: [PATCH] updates to UL (DFTs for 10/20 MHz), Ndi toggling, DCI structures git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4600 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair1/PHY/CODING/lte_rate_matching.c | 13 +- openair1/PHY/LTE_TRANSPORT/dci.c | 86 +- openair1/PHY/LTE_TRANSPORT/dci.h | 29 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 1465 +++++++++-------- openair1/PHY/LTE_TRANSPORT/defs.h | 16 +- openair1/PHY/LTE_TRANSPORT/dlsch_coding.c | 9 +- openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 9 +- openair1/PHY/LTE_TRANSPORT/phich.c | 6 +- openair1/PHY/LTE_TRANSPORT/pilots.c | 10 - openair1/PHY/LTE_TRANSPORT/pmch.c | 4 +- openair1/PHY/LTE_TRANSPORT/rar_tools.c | 19 +- openair1/PHY/LTE_TRANSPORT/ulsch_coding.c | 10 +- openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c | 24 +- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 84 +- openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c | 85 +- openair1/PHY/TOOLS/defs.h | 16 + openair1/PHY/TOOLS/lte_dfts.c | 38 +- openair1/SCHED/phy_procedures_lte_common.c | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 24 +- openair1/SCHED/phy_procedures_lte_ue.c | 32 +- openair1/SCHED/pusch_pc.c | 22 +- openair1/SIMULATION/LTE_PHY/Makefile | 2 +- openair1/SIMULATION/LTE_PHY/dlsim.c | 6 +- .../SIMULATION/LTE_PHY/pdcch_eval_results.m | 68 +- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 189 +-- openair1/SIMULATION/LTE_PHY/ulsim.c | 8 +- openair2/LAYER2/MAC/defs.h | 5 +- openair2/LAYER2/MAC/eNB_scheduler.c | 102 +- 28 files changed, 1252 insertions(+), 1131 deletions(-) diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 5f3e988bce6..ab340982803 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -185,8 +185,9 @@ void sub_block_deinterleaving_turbo(uint32_t D,int16_t *d,int16_t *w) { k++;k2++;k2++; } } - if (ND>0) - d[2] = LTE_NULL;//d[(3*D)+2]; + + // if (ND>0) + // d[2] = LTE_NULL;//d[(3*D)+2]; } @@ -476,19 +477,19 @@ uint32_t lte_rate_matching_turbo(uint32_t RTC, k=0; for (;(ind<Ncb)&&(k<E);ind++) { - e2[k]=w[ind]; + // e2[k]=w[ind]; #ifdef RM_DEBUG_TX printf("RM_TX k%d Ind: %d (%d)\n",k,ind,w[ind]); #endif - if (w[ind] != LTE_NULL) k++; + if (w[ind] != LTE_NULL) e2[k++]=w[ind]; } while(k<E) { for (ind=0;(ind<Ncb)&&(k<E);ind++) { - e2[k] = w[ind]; + // e2[k] = w[ind]; #ifdef RM_DEBUG_TX printf("RM_TX k%d Ind: %d (%d)\n",k,ind,w[ind]); #endif - if (w[ind] != LTE_NULL) k++; + if (w[ind] != LTE_NULL) e2[k++]=w[ind]; } } /* diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 72b297df2a2..0152962f35d 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -1963,7 +1963,7 @@ u8 get_num_pdcch_symbols(u8 num_dci, // compute numCCE for (i=0;i<num_dci;i++) { - // printf("dci %d => %d\n",i,dci_alloc[i].L); + // printf("dci %d => %d\n",i,dci_alloc[i].L); numCCE += (1<<(dci_alloc[i].L)); } @@ -2017,11 +2017,6 @@ u8 generate_dci_top(u8 num_ue_spec_dci, mod_sym_t *y[2]; mod_sym_t *wbar[2]; -#ifdef IFFT_FPGA - u8 qpsk_table_offset = 0; - u8 qpsk_table_offset2 = 0; -#endif - int nushiftmod3 = frame_parms->nushift%3; int Msymb2; @@ -2129,7 +2124,7 @@ u8 generate_dci_top(u8 num_ue_spec_dci, e_ptr = e; if (frame_parms->mode1_flag) { //SISO -#ifndef IFFT_FPGA + for (i=0;i<Msymb2;i++) { //((s16*)(&(y[0][i])))[0] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; //((s16*)(&(y[1][i])))[0] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; @@ -2144,25 +2139,10 @@ u8 generate_dci_top(u8 num_ue_spec_dci, e_ptr++; } -#else - for (i=0;i<Msymb2;i++) { - qpsk_table_offset = MOD_TABLE_QPSK_OFFSET; - if (*e_ptr == 1) - qpsk_table_offset+=2; - e_ptr++; - if (*e_ptr == 1) - qpsk_table_offset+=1; - e_ptr++; - - y[0][i] = (mod_sym_t) qpsk_table_offset; - y[1][i] = (mod_sym_t) qpsk_table_offset; - } - -#endif } else { //ALAMOUTI -#ifndef IFFT_FPGA + for (i=0;i<Msymb2;i+=2) { #ifdef DEBUG_DCI_ENCODING @@ -2187,49 +2167,6 @@ u8 generate_dci_top(u8 num_ue_spec_dci, ((s16*)&y[1][i+1])[1] = -((s16*)&y[0][i])[1]; } -#else - for (i=0;i<Msymb2;i+=2) { -#ifdef DEBUG_DCI_ENCODING - LOG_I(PHY," PDCCH Modulation: Symbol %d : REG %d/%d\n",i,i>>2,Msymb2>>2); -#endif - qpsk_table_offset = MOD_TABLE_QPSK_OFFSET; //x0 - qpsk_table_offset2 = MOD_TABLE_QPSK_OFFSET; //x0* - - if (*e_ptr == 1) { //real - qpsk_table_offset+=2; - qpsk_table_offset2+=2; - } - e_ptr++; - - if (*e_ptr == 1) //imag - qpsk_table_offset+=1; - else - qpsk_table_offset2+=1; - e_ptr++; - - y[0][i] = (mod_sym_t) qpsk_table_offset; // x0 - y[1][i+1] = (mod_sym_t) qpsk_table_offset2; // x0* - - - qpsk_table_offset = MOD_TABLE_QPSK_OFFSET; //-x1* - qpsk_table_offset2 = MOD_TABLE_QPSK_OFFSET; //x1 - - if (*e_ptr == 1) // flipping bit for real part of symbol means taking -x1* - qpsk_table_offset2+=2; - else - qpsk_table_offset+=2; - e_ptr++; - - if (*e_ptr == 1) { - qpsk_table_offset+=1; - qpsk_table_offset2+=1; - } - e_ptr++; - - y[1][i] = (mod_sym_t) qpsk_table_offset; // -x1* - y[0][i+1] = (mod_sym_t) qpsk_table_offset2; // x1 - } -#endif } @@ -2243,23 +2180,14 @@ u8 generate_dci_top(u8 num_ue_spec_dci, mprime=0; nsymb = (frame_parms->Ncp==0) ? 14:12; -#ifdef IFFT_FPGA - re_offset = frame_parms->N_RB_DL*12/2; -#else re_offset = frame_parms->first_carrier_offset; -#endif // This is the REG allocation algorithm from 36-211, second part of Section 6.8.5 - // printf("DCI : txdataF %p (0 %p)\n",&txdataF[0][512*14*subframe],&txdataF[0][0]); + // printf("DCI (SF %d) : txdataF %p (0 %p)\n",subframe,&txdataF[0][512*14*subframe],&txdataF[0][0]); for (kprime=0;kprime<frame_parms->N_RB_DL*12;kprime++) { for (lprime=0;lprime<num_pdcch_symbols;lprime++) { -#ifdef IFFT_FPGA - symbol_offset = (u32)frame_parms->N_RB_DL*12*(lprime+(subframe*nsymb)); - -#else symbol_offset = (u32)frame_parms->ofdm_symbol_size*(lprime+(subframe*nsymb)); -#endif @@ -2353,14 +2281,8 @@ u8 generate_dci_top(u8 num_ue_spec_dci, } //lprime loop re_offset++; -#ifdef IFFT_FPGA - if (re_offset == (frame_parms->N_RB_DL*12)) - re_offset = 0; -#else if (re_offset == (frame_parms->ofdm_symbol_size)) re_offset = 1; -#endif - } // kprime loop return(num_pdcch_symbols); } diff --git a/openair1/PHY/LTE_TRANSPORT/dci.h b/openair1/PHY/LTE_TRANSPORT/dci.h index 8438081f06e..52299933bac 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.h +++ b/openair1/PHY/LTE_TRANSPORT/dci.h @@ -100,9 +100,7 @@ typedef struct DCI0_1_5MHz_TDD_1_6 DCI0_1_5MHz_TDD_1_6_t; /// DCI Format Type 1A (1.5 MHz, TDD, frame 1-6, 24 bits) struct DCI1A_1_5MHz_TDD_1_6 { /// padding - uint32_t padding:8; - /// SRS request bit - uint32_t srs_req:1; + uint32_t padding:9; /// Downlink Assignment Index uint32_t dai:2; /// Power Control @@ -212,9 +210,7 @@ typedef struct DCI0_10MHz_TDD_1_6 DCI0_10MHz_TDD_1_6_t; /// DCI Format Type 1A (10 MHz, TDD, frame 1-6, 30 bits) struct DCI1A_10MHz_TDD_1_6 { /// padding - uint32_t padding:2; - /// SRS request bit - uint32_t srs_req:1; + uint32_t padding:3; /// Downlink Assignment Index uint32_t dai:2; /// Power Control @@ -243,7 +239,7 @@ typedef struct DCI1A_10MHz_TDD_1_6 DCI1A_10MHz_TDD_1_6_t; struct DCI0_20MHz_TDD_1_6 { /// Padding uint32_t padding:2; - /// CQI Request + /// CQI request uint32_t cqi_req:1; /// DAI uint32_t dai:2; @@ -268,8 +264,7 @@ typedef struct DCI0_20MHz_TDD_1_6 DCI0_20MHz_TDD_1_6_t; /// DCI Format Type 1A (20 MHz, TDD, frame 1-6, 27 bits) struct DCI1A_20MHz_TDD_1_6 { - /// SRS request bit - uint32_t srs_req:1; + uint32_t padding:1; /// Downlink Assignment Index uint32_t dai:2; /// Power Control @@ -321,9 +316,7 @@ typedef struct DCI0_1_5MHz_FDD DCI0_1_5MHz_FDD_t; struct DCI1A_1_5MHz_FDD { /// padding - uint32_t padding:11; - /// Downlink Assignment Index - uint32_t srs_req:1; + uint32_t padding:12; /// Power Control uint32_t TPC:2; /// Redundancy version @@ -374,9 +367,7 @@ typedef struct DCI0_5MHz_FDD DCI0_5MHz_FDD_t; struct DCI1A_5MHz_FDD { /// padding - uint32_t padding:7; - /// Downlink Assignment Index - uint32_t srs_req:1; + uint32_t padding:8; /// Power Control uint32_t TPC:2; /// Redundancy version @@ -428,9 +419,7 @@ typedef struct DCI0_10MHz_FDD DCI0_10MHz_FDD_t; struct DCI1A_10MHz_FDD { /// padding - uint32_t padding:5; - /// Downlink Assignment Index - uint32_t srs_req:1; + uint32_t padding:6; /// Power Control uint32_t TPC:2; /// Redundancy version @@ -480,9 +469,7 @@ typedef struct DCI0_20MHz_FDD DCI0_20MHz_FDD_t; struct DCI1A_20MHz_FDD { /// padding - uint32_t padding:3; - /// Downlink Assignment Index - uint32_t srs_req:1; + uint32_t padding:4; /// Power Control uint32_t TPC:2; /// Redundancy version diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index 05f3e21b1a3..089cb705a6e 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -161,12 +161,12 @@ void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t if (ra_header == 0) {// Type 0 Allocation for (i=12;i>0;i--) { - if ((rb_alloc&(1<<i)) != 0) - rb_alloc2[0] |= (3<<((2*(12-i)))); - // printf("rb_alloc2 (type 0) %x\n",rb_alloc2); + if ((rb_alloc&(1<<i)) != 0) + rb_alloc2[0] |= (3<<((2*(12-i)))); + // printf("rb_alloc2 (type 0) %x\n",rb_alloc2); } if ((rb_alloc&1) != 0) - rb_alloc2[0] |= (1<<24); + rb_alloc2[0] |= (1<<24); } else { subset = rb_alloc&1; @@ -192,30 +192,30 @@ void conv_rballoc(uint8_t ra_header,uint32_t rb_alloc,uint32_t N_RB_DL,uint32_t rb_alloc2[(3*(16-i))>>5] |= (7<<((3*(16-i))%32)); } /* - for (i=1;i<=16;i++) { + for (i=1;i<=16;i++) { if ((rb_alloc&(1<<(16-i))) != 0) - rb_alloc2[(3*i)>>5] |= (7<<((3*i)%32)); - } + rb_alloc2[(3*i)>>5] |= (7<<((3*i)%32)); + } */ // bit mask across if ((rb_alloc2[0]>>31)==1) rb_alloc2[1] |= 1; if ((rb_alloc&1) != 0) - rb_alloc2[1] |= (3<<16); + rb_alloc2[1] |= (3<<16); /* - for (i=0;i<16;i++) { - if (((rb_alloc>>(16-i))&1) != 0) - rb_alloc2[(3*i)>>5] |= (7<<((3*i)%32)); - if ((i==10)&&((rb_alloc&(1<<6))!=0)) - rb_alloc2[1] = 1; - // printf("rb_alloc2[%d] (type 0) %x ((%x>>%d)&1=%d)\n",(3*i)>>5,rb_alloc2[(3*i)>>5],rb_alloc,i,(rb_alloc>>i)&1); + for (i=0;i<16;i++) { + if (((rb_alloc>>(16-i))&1) != 0) + rb_alloc2[(3*i)>>5] |= (7<<((3*i)%32)); + if ((i==10)&&((rb_alloc&(1<<6))!=0)) + rb_alloc2[1] = 1; + // printf("rb_alloc2[%d] (type 0) %x ((%x>>%d)&1=%d)\n",(3*i)>>5,rb_alloc2[(3*i)>>5],rb_alloc,i,(rb_alloc>>i)&1); - } - // fill in 2 from last bit instead of 3 - if ((rb_alloc&1) != 0) - rb_alloc2[1] |= (3<<i); - // printf("rb_alloc2[%d] (type 0) %x ((%x>>%d)&1=%d)\n",(3*i)>>5,rb_alloc2[(3*i)>>5],rb_alloc,i,(rb_alloc>>i)&1); - */ + } + // fill in 2 from last bit instead of 3 + if ((rb_alloc&1) != 0) + rb_alloc2[1] |= (3<<i); + // printf("rb_alloc2[%d] (type 0) %x ((%x>>%d)&1=%d)\n",(3*i)>>5,rb_alloc2[(3*i)>>5],rb_alloc,i,(rb_alloc>>i)&1); + */ // printf("rb_alloc[1]=%x,rb_alloc[0]=%x\n",rb_alloc2[1],rb_alloc2[0]); } else { @@ -292,12 +292,12 @@ uint32_t conv_nprb(uint8_t ra_header,uint32_t rb_alloc,int N_RB_DL) { case 25: if (ra_header == 0) {// Type 0 Allocation - for (i=12;i>0;i--) { - if ((rb_alloc&(1<<i)) != 0) - nprb += 2; - } - if ((rb_alloc&1) != 0) - nprb += 1; + for (i=12;i>0;i--) { + if ((rb_alloc&(1<<i)) != 0) + nprb += 2; + } + if ((rb_alloc&1) != 0) + nprb += 1; } else { for (i=0;i<11;i++) { @@ -351,14 +351,14 @@ uint32_t conv_nprb(uint8_t ra_header,uint32_t rb_alloc,int N_RB_DL) { uint16_t computeRIV(uint16_t N_RB_DL,uint16_t RBstart,uint16_t Lcrbs) { - uint16_t RIV; + uint16_t RIV; - if (Lcrbs<=(1+(N_RB_DL>>1))) - RIV = (N_RB_DL*(Lcrbs-1)) + RBstart; - else - RIV = (N_RB_DL*(N_RB_DL+1-Lcrbs)) + (N_RB_DL-1-RBstart); + if (Lcrbs<=(1+(N_RB_DL>>1))) + RIV = (N_RB_DL*(Lcrbs-1)) + RBstart; + else + RIV = (N_RB_DL*(N_RB_DL+1-Lcrbs)) + (N_RB_DL-1-RBstart); - return(RIV); + return(RIV); } int dist6[6]={0,2,3,5,1,4}; @@ -399,27 +399,27 @@ void generate_RIV_tables() { for (RBstart=0;RBstart<25;RBstart++) { - alloc0 = 0; - alloc_dist0 = 0; - for (Lcrbs=1;Lcrbs<=(25-RBstart);Lcrbs++) { - // printf("RBstart %d, len %d --> ",RBstart,Lcrbs); - alloc0 |= (1<<(RBstart+Lcrbs-1)); - // This is the RB<->VRB relationship for N_RB_DL=25 - distpos = ((RBstart+Lcrbs-1)*6)%23; - if (distpos == 0) - distpos = 23; - alloc_dist0 |= (1<<distpos); + alloc0 = 0; + alloc_dist0 = 0; + for (Lcrbs=1;Lcrbs<=(25-RBstart);Lcrbs++) { + // printf("RBstart %d, len %d --> ",RBstart,Lcrbs); + alloc0 |= (1<<(RBstart+Lcrbs-1)); + // This is the RB<->VRB relationship for N_RB_DL=25 + distpos = ((RBstart+Lcrbs-1)*6)%23; + if (distpos == 0) + distpos = 23; + alloc_dist0 |= (1<<distpos); - RIV=computeRIV(25,RBstart,Lcrbs); - if (RIV>RIV_max25) - RIV_max25 = RIV; + RIV=computeRIV(25,RBstart,Lcrbs); + if (RIV>RIV_max25) + RIV_max25 = RIV; - // printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs); - localRIV2alloc_LUT25[RIV] = alloc0; - distRIV2alloc_LUT25[RIV] = alloc_dist0; - RIV2nb_rb_LUT25[RIV] = Lcrbs; - RIV2first_rb_LUT25[RIV] = RBstart; - } + // printf("RIV %d (%d) : first_rb %d NBRB %d\n",RIV,localRIV2alloc_LUT25[RIV],RBstart,Lcrbs); + localRIV2alloc_LUT25[RIV] = alloc0; + distRIV2alloc_LUT25[RIV] = alloc_dist0; + RIV2nb_rb_LUT25[RIV] = Lcrbs; + RIV2first_rb_LUT25[RIV] = RBstart; + } } @@ -556,7 +556,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, uint8_t mcs=0; uint8_t I_mcs = 0; uint8_t rv=0; - uint8_t ndi=0; uint8_t rah=0; uint8_t TPC=0; // printf("Generate eNB DCI, format %d, rnti %x (pdu %p)\n",dci_format,rnti,dci_pdu); @@ -579,7 +578,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, mcs = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs; rballoc = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; rv = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi; TPC = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC; harq_pid = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; @@ -590,7 +588,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, mcs = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs; rballoc = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc; rv = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi; TPC = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC; harq_pid = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid; @@ -613,7 +610,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, mcs = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs; rballoc = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; rv = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi; TPC = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC; harq_pid = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; @@ -624,7 +620,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, mcs = ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs; rballoc = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc; rv = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi; TPC = ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC; harq_pid = ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid; @@ -645,7 +640,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, mcs = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs; rballoc = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc; rv = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi; TPC = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC; harq_pid = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid; @@ -656,7 +650,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, mcs = ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs; rballoc = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc; rv = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi; TPC = ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC; harq_pid = ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid; // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); @@ -679,7 +672,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, mcs = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs; rballoc = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc; rv = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi; TPC = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC; harq_pid = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid; // printf("TDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); @@ -689,7 +681,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, mcs = ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs; rballoc = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc; rv = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi; TPC = ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC; harq_pid = ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid; // printf("FDD 1A: mcs %d, rballoc %x,rv %d, NPRB %d\n",mcs,rballoc,rv,NPRB); @@ -722,7 +713,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, harq_pid=0; // see 36-212 V8.6.0 p. 45 NPRB = (TPC&1)+2; - ndi = 1; // 36-213 sec.7.1.7.2 p.26 I_mcs = mcs; } @@ -748,13 +738,28 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch[0]->harq_processes[harq_pid]->Nl = 1; dlsch[0]->layer_index = 0; dlsch[0]->harq_processes[harq_pid]->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; - dlsch[0]->harq_processes[harq_pid]->Ndi = ndi; - dlsch[0]->dl_power_off = 1; - if (dlsch[0]->harq_processes[harq_pid]->Ndi == 1) { - dlsch[0]->harq_processes[harq_pid]->status = ACTIVE; - // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); - } + /* + if ((rnti!=si_rnti)&&(rnti!=ra_rnti)&&(rnti!=p_rnti)) { //handle toggling for C-RNTI + if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) { + LOG_D(PHY,"First TX for TC-RNTI %x, clearing first_tx flag\n",rnti); + dlsch[0]->harq_processes[harq_pid]->first_tx=0; + dlsch[0]->harq_processes[harq_pid]->Ndi = 1; + } + else { + if (ndi == dlsch[0]->harq_processes[harq_pid]->DCINdi) + dlsch[0]->harq_processes[harq_pid]->Ndi = 0; + else + dlsch[0]->harq_processes[harq_pid]->Ndi = 1; + } + + dlsch[0]->harq_processes[harq_pid]->DCINdi=ndi; + } + else { + dlsch[0]->harq_processes[harq_pid]->Ndi = 1; + } + */ + dlsch[0]->dl_power_off = 1; @@ -770,7 +775,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch[0]->rnti = rnti; dlsch[0]->harq_ids[subframe] = harq_pid; - if (dlsch[0]->harq_processes[harq_pid]->Ndi == 1) + if (dlsch[0]->harq_processes[harq_pid]->round == 0) dlsch[0]->harq_processes[harq_pid]->status = ACTIVE; break; @@ -784,7 +789,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, rballoc = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rballoc; rah = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rah; rv = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->rv; - ndi = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->ndi; harq_pid = ((DCI1_1_5MHz_TDD_t *)dci_pdu)->harq_pid; } else { @@ -792,7 +796,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, rah = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rah; rballoc = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rballoc; rv = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->ndi; harq_pid = ((DCI1_1_5MHz_FDD_t *)dci_pdu)->harq_pid; } break; @@ -803,16 +806,17 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, rballoc = ((DCI1_5MHz_TDD_t *)dci_pdu)->rballoc; rah = ((DCI1_5MHz_TDD_t *)dci_pdu)->rah; rv = ((DCI1_5MHz_TDD_t *)dci_pdu)->rv; - ndi = ((DCI1_5MHz_TDD_t *)dci_pdu)->ndi; harq_pid = ((DCI1_5MHz_TDD_t *)dci_pdu)->harq_pid; + LOG_D(PHY,"eNB: subframe %d UE %x, Format1 DCI: ndi %d, harq_pid %d\n",subframe,rnti,((DCI1_5MHz_TDD_t *)dci_pdu)->ndi,harq_pid); } else { mcs = ((DCI1_5MHz_FDD_t *)dci_pdu)->mcs; rah = ((DCI1_5MHz_FDD_t *)dci_pdu)->rah; rballoc = ((DCI1_5MHz_FDD_t *)dci_pdu)->rballoc; rv = ((DCI1_5MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1_5MHz_FDD_t *)dci_pdu)->ndi; harq_pid = ((DCI1_5MHz_FDD_t *)dci_pdu)->harq_pid; + LOG_D(PHY,"eNB: subframe %d UE %x, Format1 DCI: ndi %d, harq_pid %d\n",subframe,rnti,((DCI1_5MHz_FDD_t *)dci_pdu)->ndi,harq_pid); + } break; case 50: @@ -821,7 +825,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, rballoc = ((DCI1_10MHz_TDD_t *)dci_pdu)->rballoc; rah = ((DCI1_10MHz_TDD_t *)dci_pdu)->rah; rv = ((DCI1_10MHz_TDD_t *)dci_pdu)->rv; - ndi = ((DCI1_10MHz_TDD_t *)dci_pdu)->ndi; harq_pid = ((DCI1_10MHz_TDD_t *)dci_pdu)->harq_pid; } else { @@ -829,7 +832,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, rah = ((DCI1_10MHz_FDD_t *)dci_pdu)->rah; rballoc = ((DCI1_10MHz_FDD_t *)dci_pdu)->rballoc; rv = ((DCI1_10MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1_10MHz_FDD_t *)dci_pdu)->ndi; harq_pid = ((DCI1_10MHz_FDD_t *)dci_pdu)->harq_pid; } break; @@ -840,7 +842,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, rballoc = ((DCI1_20MHz_TDD_t *)dci_pdu)->rballoc; rah = ((DCI1_20MHz_TDD_t *)dci_pdu)->rah; rv = ((DCI1_20MHz_TDD_t *)dci_pdu)->rv; - ndi = ((DCI1_20MHz_TDD_t *)dci_pdu)->ndi; harq_pid = ((DCI1_20MHz_TDD_t *)dci_pdu)->harq_pid; } else { @@ -848,7 +849,6 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, rah = ((DCI1_20MHz_FDD_t *)dci_pdu)->rah; rballoc = ((DCI1_20MHz_FDD_t *)dci_pdu)->rballoc; rv = ((DCI1_20MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1_20MHz_FDD_t *)dci_pdu)->ndi; harq_pid = ((DCI1_20MHz_FDD_t *)dci_pdu)->harq_pid; } break; @@ -884,16 +884,32 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, dlsch[0]->layer_index = 0; dlsch[0]->harq_processes[harq_pid]->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; dlsch[0]->dl_power_off = 1; - dlsch[0]->harq_processes[harq_pid]->Ndi = ndi; + /* + if (dlsch[0]->harq_processes[harq_pid]->first_tx == 1) { + LOG_D(PHY,"First TX for C-RNTI %x, clearing first_tx flag, shouldn't happen!\n",rnti); + dlsch[0]->harq_processes[harq_pid]->first_tx=0; + dlsch[0]->harq_processes[harq_pid]->Ndi = 1; + } + else { + LOG_D(PHY,"Checking for Toggled Ndi for C-RNTI %x, old value %d, DCINdi %d\n",rnti,dlsch[0]->harq_processes[harq_pid]->DCINdi,ndi); + if (ndi == dlsch[0]->harq_processes[harq_pid]->DCINdi) + dlsch[0]->harq_processes[harq_pid]->Ndi = 0; + else + dlsch[0]->harq_processes[harq_pid]->Ndi = 1; + } + dlsch[0]->harq_processes[harq_pid]->DCINdi=ndi; + */ dlsch[0]->active = 1; - if (dlsch[0]->harq_processes[harq_pid]->Ndi == 1) { + + + if (dlsch[0]->harq_processes[harq_pid]->round == 0) { dlsch[0]->harq_processes[harq_pid]->status = ACTIVE; // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); // MCS and TBS don't change across HARQ rounds - dlsch[0]->harq_processes[harq_pid]->mcs = mcs; - dlsch[0]->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch[0]->harq_processes[harq_pid]->mcs)][NPRB-1]; + dlsch[0]->harq_processes[harq_pid]->mcs = mcs; + dlsch[0]->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(dlsch[0]->harq_processes[harq_pid]->mcs)][NPRB-1]; } @@ -1009,8 +1025,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, if (frame_parms->mode1_flag == 1) dlsch0->harq_processes[harq_pid]->mimo_mode = SISO; - dlsch0->harq_processes[harq_pid]->Ndi = ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi1; - if (dlsch0->harq_processes[harq_pid]->Ndi == 1) { + // dlsch0->harq_processes[harq_pid]->Ndi = ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi1; + if (dlsch0->harq_processes[harq_pid]->round == 0) { dlsch0->harq_processes[harq_pid]->status = ACTIVE; // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); } @@ -1133,8 +1149,8 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, if (frame_parms->mode1_flag == 1) dlsch0->harq_processes[harq_pid]->mimo_mode = SISO; - dlsch0->harq_processes[harq_pid]->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; - if (dlsch0->harq_processes[harq_pid]->Ndi == 1) { + // dlsch0->harq_processes[harq_pid]->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; + if (dlsch0->harq_processes[harq_pid]->round == 0) { dlsch0->harq_processes[harq_pid]->status = ACTIVE; // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); } @@ -1174,7 +1190,7 @@ int generate_eNB_dlsch_params_from_dci(uint8_t subframe, msg("dlsch0 eNB: NBRB %d\n",dlsch0->nb_rb); msg("dlsch0 eNB: rballoc %x\n",dlsch0->rb_alloc[0]); msg("dlsch0 eNB: harq_pid %d\n",harq_pid); - msg("dlsch0 eNB: Ndi %d\n",dlsch0->harq_processes[harq_pid]->Ndi); + msg("dlsch0 eNB: round %d\n",dlsch0->harq_processes[harq_pid]->round); msg("dlsch0 eNB: rvidx %d\n",dlsch0->harq_processes[harq_pid]->rvidx); msg("dlsch0 eNB: TBS %d (NPRB %d)\n",dlsch0->harq_processes[harq_pid]->TBS,NPRB); msg("dlsch0 eNB: mcs %d\n",dlsch0->harq_processes[harq_pid]->mcs); @@ -1202,55 +1218,55 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) { switch(frame_parms->N_RB_DL) { case 6: LOG_D(PHY,"DCI format0 (TDD, 1.5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu[0])[0], - ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping, - ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc, - ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs, - ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi, - ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC, - ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift, - ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai, - ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req); + dci->rnti, + ((uint32_t*)&dci->dci_pdu[0])[0], + ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping, + ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc, + ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs, + ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi, + ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC, + ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift, + ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai, + ((DCI0_1_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req); break; case 25: LOG_D(PHY,"DCI format0 (TDD1-6, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu[0])[0], - ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping, - ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc, - ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs, - ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi, - ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC, - ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift, - ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai, - ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req); + dci->rnti, + ((uint32_t*)&dci->dci_pdu[0])[0], + ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping, + ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc, + ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs, + ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi, + ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC, + ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift, + ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai, + ((DCI0_5MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req); break; case 50: LOG_D(PHY,"DCI format0 (TDD1-6, 10MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu[0])[0], - ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping, - ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc, - ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs, - ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi, - ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC, - ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift, - ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai, - ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req); + dci->rnti, + ((uint32_t*)&dci->dci_pdu[0])[0], + ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping, + ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc, + ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs, + ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi, + ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC, + ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift, + ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai, + ((DCI0_10MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req); break; case 100: LOG_D(PHY,"DCI format0 (TDD1-6, 20MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, dai %d, cqi_req %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu[0])[0], - ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping, - ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc, - ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs, - ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi, - ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC, - ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift, - ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai, - ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req); + dci->rnti, + ((uint32_t*)&dci->dci_pdu[0])[0], + ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->hopping, + ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->rballoc, + ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->mcs, + ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->ndi, + ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->TPC, + ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cshift, + ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->dai, + ((DCI0_20MHz_TDD_1_6_t *)&dci->dci_pdu[0])->cqi_req); break; default: LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); @@ -1261,51 +1277,51 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) { switch(frame_parms->N_RB_DL) { case 6: LOG_D(PHY,"DCI format0 (FDD, 1.5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu[0])[0], - ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping, - ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC, - ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift, - ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req); + dci->rnti, + ((uint32_t*)&dci->dci_pdu[0])[0], + ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping, + ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift, + ((DCI0_1_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req); break; case 25: LOG_D(PHY,"DCI format0 (FDD, 5MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu[0])[0], - ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping, - ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC, - ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift, - ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req); + dci->rnti, + ((uint32_t*)&dci->dci_pdu[0])[0], + ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->hopping, + ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cshift, + ((DCI0_5MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req); break; case 50: LOG_D(PHY,"DCI format0 (FDD, 10MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu[0])[0], - ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->hopping, - ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC, - ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cshift, - ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req); + dci->rnti, + ((uint32_t*)&dci->dci_pdu[0])[0], + ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->hopping, + ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cshift, + ((DCI0_10MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req); break; case 100: LOG_D(PHY,"DCI format0 (FDD, 20MHz), rnti %x (%x): hopping %d, rb_alloc %x, mcs %d, ndi %d, TPC %d, cshift %d, cqi_req %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu[0])[0], - ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->hopping, - ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC, - ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cshift, - ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req); + dci->rnti, + ((uint32_t*)&dci->dci_pdu[0])[0], + ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->hopping, + ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cshift, + ((DCI0_20MHz_FDD_t *)&dci->dci_pdu[0])->cqi_req); break; default: LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); @@ -1323,55 +1339,55 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) { switch(frame_parms->N_RB_DL) { case 6: LOG_D(PHY,"DCI format1 (TDD 1.5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu)[0], - ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah, - ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid, - ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv, - ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC, - ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai); + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv, + ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI1_1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai); break; case 25: LOG_D(PHY,"DCI format1 (TDD 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu)[0], - ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah, - ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid, - ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv, - ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC, - ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai); + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->rv, + ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI1_5MHz_TDD_t *)&dci->dci_pdu[0])->dai); break; case 50: LOG_D(PHY,"DCI format1 (TDD 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu)[0], - ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rah, - ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid, - ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rv, - ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->TPC, - ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->dai); + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->rv, + ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI1_10MHz_TDD_t *)&dci->dci_pdu[0])->dai); break; case 100: LOG_D(PHY,"DCI format1 (TDD 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d, dai %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu)[0], - ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rah, - ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid, - ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rv, - ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->TPC, - ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->dai); + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rah, + ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->rv, + ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->TPC, + ((DCI1_20MHz_TDD_t *)&dci->dci_pdu[0])->dai); break; default: LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); @@ -1382,51 +1398,51 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) { switch(frame_parms->N_RB_DL) { case 6: LOG_D(PHY,"DCI format1 (FDD, 1.5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu)[0], - ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah, - ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid, - ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv, - ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC); + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv, + ((DCI1_1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC); break; case 25: LOG_D(PHY,"DCI format1 (FDD, 5 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu)[0], - ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah, - ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid, - ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv, - ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC); + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->rv, + ((DCI1_5MHz_FDD_t *)&dci->dci_pdu[0])->TPC); break; case 50: LOG_D(PHY,"DCI format1 (FDD, 10 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu)[0], - ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rah, - ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid, - ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rv, - ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC); + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->rv, + ((DCI1_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC); break; case 100: LOG_D(PHY,"DCI format1 (FDD, 20 MHz), rnti %x (%x): rah %d, rb_alloc %x, mcs %d, harq_pid %d, ndi %d, RV %d, TPC %d\n", - dci->rnti, - ((uint32_t*)&dci->dci_pdu)[0], - ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rah, - ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, - ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs, - ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid, - ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi, - ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rv, - ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC); + dci->rnti, + ((uint32_t*)&dci->dci_pdu)[0], + ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rah, + ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rballoc, + ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->mcs, + ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid, + ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->ndi, + ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->rv, + ((DCI1_20MHz_FDD_t *)&dci->dci_pdu[0])->TPC); break; default: LOG_E(PHY,"Invalid N_RB_DL %d\n", frame_parms->N_RB_DL); @@ -1601,262 +1617,273 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, uint16_t ra_rnti, uint16_t p_rnti) { - uint8_t harq_pid=0; - uint32_t rballoc=0,RIV_max; - uint8_t frame_type=frame_parms->frame_type; - uint8_t vrb_type=0; - uint8_t mcs=0; - uint8_t rv=0; - uint8_t ndi=0; - uint8_t rah=0; - uint8_t TPC=0; - uint8_t NPRB=0,tbswap=0,tpmi=0; - LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; + uint8_t harq_pid=0; + uint32_t rballoc=0,RIV_max; + uint8_t frame_type=frame_parms->frame_type; + uint8_t vrb_type=0; + uint8_t mcs=0; + uint8_t rv=0; + uint8_t ndi=0; + uint8_t rah=0; + uint8_t TPC=0; + uint8_t NPRB=0,tbswap=0,tpmi=0; + LTE_UE_DLSCH_t *dlsch0=NULL,*dlsch1=NULL; #ifdef DEBUG_DCI - msg("dci_tools.c: Filling ue dlsch params -> rnti %x, dci_format %d\n",rnti,dci_format); + msg("dci_tools.c: Filling ue dlsch params -> rnti %x, dci_format %d\n",rnti,dci_format); #endif - switch (dci_format) { + switch (dci_format) { - case format0: // This is an UL SACH allocation so nothing here, inform MAC - LOG_E(PHY,"format0 not possible\n"); - return(-1); - break; - case format1A: - - switch (frame_parms->N_RB_DL) { - case 6: - if (frame_type == TDD) { - vrb_type = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi; - TPC = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - else { - vrb_type = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi; - TPC = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid; - //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // - harq_pid = 0; - // see 36-212 V8.6.0 p. 45 - NPRB = (TPC&1) + 2; - ndi = 1; - } - else { + case format0: // This is an UL SACH allocation so nothing here, inform MAC + LOG_E(PHY,"format0 not possible\n"); + return(-1); + break; + case format1A: + + switch (frame_parms->N_RB_DL) { + case 6: + if (frame_type == TDD) { + vrb_type = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; + rv = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->rv; + ndi = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->ndi; + TPC = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_1_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + else { + vrb_type = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->rv; + ndi = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->ndi; + TPC = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_1_5MHz_FDD_t *)dci_pdu)->harq_pid; + //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // + harq_pid = 0; + // see 36-212 V8.6.0 p. 45 + NPRB = (TPC&1) + 2; + } + else { - if (harq_pid>1) { - LOG_E(PHY,"Format 1A: harq_pid > 1\n"); - return(-1); - } + if (harq_pid>1) { + LOG_E(PHY,"Format 1A: harq_pid > 1\n"); + return(-1); + } - NPRB = RIV2nb_rb_LUT6[rballoc]; - dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - } + NPRB = RIV2nb_rb_LUT6[rballoc]; + dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + } - if (vrb_type == 0) - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT6[rballoc]; - else - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT6[rballoc]; + if (vrb_type == 0) + dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT6[rballoc]; + else + dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT6[rballoc]; - dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB; - RIV_max = RIV_max6; + dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT6[rballoc];//NPRB; + RIV_max = RIV_max6; - break; - case 25: + break; + case 25: - if (frame_type == TDD) { - vrb_type = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi; - TPC = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - //printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - else { - vrb_type = ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi; - TPC = ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid; - //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // - harq_pid = 0; - // see 36-212 V8.6.0 p. 45 - NPRB = (TPC&1) + 2; - ndi = 1; // bit is reserved - } - else { + if (frame_type == TDD) { + vrb_type = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rballoc; + rv = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->rv; + ndi = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->ndi; + TPC = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_5MHz_TDD_1_6_t *)dci_pdu)->harq_pid; + //printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + else { + vrb_type = ((DCI1A_5MHz_FDD_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_5MHz_FDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1A_5MHz_FDD_t *)dci_pdu)->rv; + ndi = ((DCI1A_5MHz_FDD_t *)dci_pdu)->ndi; + TPC = ((DCI1A_5MHz_FDD_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_5MHz_FDD_t *)dci_pdu)->harq_pid; + //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // + harq_pid = 0; + // see 36-212 V8.6.0 p. 45 + NPRB = (TPC&1) + 2; + } + else { - if (harq_pid>1) { - LOG_E(PHY,"Format 1A: harq_pid > 1\n"); - return(-1); - } + if (harq_pid>1) { + LOG_E(PHY,"Format 1A: harq_pid > 1\n"); + return(-1); + } - NPRB = RIV2nb_rb_LUT25[rballoc]; - dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - } - - if (vrb_type == 0) - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT25[rballoc]; - else - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT25[rballoc]; + NPRB = RIV2nb_rb_LUT25[rballoc]; + dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + } + + if (vrb_type == 0) + dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT25[rballoc]; + else + dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT25[rballoc]; - dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB; - RIV_max = RIV_max25; + dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT25[rballoc];//NPRB; + RIV_max = RIV_max25; - break; - case 50: - if (frame_type == TDD) { - vrb_type = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi; - TPC = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - else { - vrb_type = ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi; - TPC = ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid; - //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } + break; + case 50: + if (frame_type == TDD) { + vrb_type = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rballoc; + rv = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->rv; + ndi = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->ndi; + TPC = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_10MHz_TDD_1_6_t *)dci_pdu)->harq_pid; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + else { + vrb_type = ((DCI1A_10MHz_FDD_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_10MHz_FDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1A_10MHz_FDD_t *)dci_pdu)->rv; + ndi = ((DCI1A_10MHz_FDD_t *)dci_pdu)->ndi; + TPC = ((DCI1A_10MHz_FDD_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_10MHz_FDD_t *)dci_pdu)->harq_pid; + //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // - harq_pid = 0; - // see 36-212 V8.6.0 p. 45 - NPRB = (TPC&1) + 2; - ndi = 1; - } - else { + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // + harq_pid = 0; + // see 36-212 V8.6.0 p. 45 + NPRB = (TPC&1) + 2; + } + else { - if (harq_pid>1) { - LOG_E(PHY,"Format 1A: harq_pid > 1\n"); - return(-1); - } + if (harq_pid>1) { + LOG_E(PHY,"Format 1A: harq_pid > 1\n"); + return(-1); + } - NPRB = RIV2nb_rb_LUT50[rballoc]; - dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - } - - if (vrb_type == 0) { - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc]; - } - else { - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT50_0[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = distRIV2alloc_LUT50_1[rballoc]; - } - dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB; - RIV_max = RIV_max50; - break; - case 100: - if (frame_type == TDD) { - vrb_type = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc; - rv = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv; - ndi = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi; - TPC = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid; - // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - else { - vrb_type = ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type; - mcs = ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs; - rballoc = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc; - rv = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv; - ndi = ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi; - TPC = ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC; - harq_pid = ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid; - //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); - } - - if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // - harq_pid = 0; - // see 36-212 V8.6.0 p. 45 - NPRB = (TPC&1) + 2; - ndi = 1; - } - else { + NPRB = RIV2nb_rb_LUT50[rballoc]; + dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + } + + if (vrb_type == 0) { + dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT50_0[rballoc]; + dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = localRIV2alloc_LUT50_1[rballoc]; + } + else { + dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT50_0[rballoc]; + dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = distRIV2alloc_LUT50_1[rballoc]; + } + dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT50[rballoc];//NPRB; + RIV_max = RIV_max50; + break; + case 100: + if (frame_type == TDD) { + vrb_type = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rballoc; + rv = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->rv; + ndi = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->ndi; + TPC = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_20MHz_TDD_1_6_t *)dci_pdu)->harq_pid; + // printf("TDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + else { + vrb_type = ((DCI1A_20MHz_FDD_t *)dci_pdu)->vrb_type; + mcs = ((DCI1A_20MHz_FDD_t *)dci_pdu)->mcs; + rballoc = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rballoc; + rv = ((DCI1A_20MHz_FDD_t *)dci_pdu)->rv; + ndi = ((DCI1A_20MHz_FDD_t *)dci_pdu)->ndi; + TPC = ((DCI1A_20MHz_FDD_t *)dci_pdu)->TPC; + harq_pid = ((DCI1A_20MHz_FDD_t *)dci_pdu)->harq_pid; + //printf("FDD 1A: mcs %d, rballoc %x,rv %d, TPC %d\n",mcs,rballoc,rv,TPC); + } + + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // + harq_pid = 0; + // see 36-212 V8.6.0 p. 45 + NPRB = (TPC&1) + 2; + // toggle the ndi + } + else { - if (harq_pid>1) { - LOG_E(PHY,"Format 1A: harq_pid > 1\n"); - return(-1); - } + if (harq_pid>1) { + LOG_E(PHY,"Format 1A: harq_pid > 1\n"); + return(-1); + } - NPRB = RIV2nb_rb_LUT100[rballoc]; - dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; - } - - if (vrb_type == 0) { - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc]; - } - else { - dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT100_0[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = distRIV2alloc_LUT100_1[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[2] = distRIV2alloc_LUT100_2[rballoc]; - dlsch[0]->harq_processes[harq_pid]->rb_alloc[3] = distRIV2alloc_LUT100_3[rballoc]; - } - dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB; - RIV_max = RIV_max100; - break; - } + NPRB = RIV2nb_rb_LUT100[rballoc]; + dlsch[0]->harq_processes[harq_pid]->delta_PUCCH = delta_PUCCH_lut[TPC&3]; + } + + if (vrb_type == 0) { + dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = localRIV2alloc_LUT100_0[rballoc]; + dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = localRIV2alloc_LUT100_1[rballoc]; + dlsch[0]->harq_processes[harq_pid]->rb_alloc[2] = localRIV2alloc_LUT100_2[rballoc]; + dlsch[0]->harq_processes[harq_pid]->rb_alloc[3] = localRIV2alloc_LUT100_3[rballoc]; + } + else { + dlsch[0]->harq_processes[harq_pid]->rb_alloc[0] = distRIV2alloc_LUT100_0[rballoc]; + dlsch[0]->harq_processes[harq_pid]->rb_alloc[1] = distRIV2alloc_LUT100_1[rballoc]; + dlsch[0]->harq_processes[harq_pid]->rb_alloc[2] = distRIV2alloc_LUT100_2[rballoc]; + dlsch[0]->harq_processes[harq_pid]->rb_alloc[3] = distRIV2alloc_LUT100_3[rballoc]; + } + dlsch[0]->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT100[rballoc];//NPRB; + RIV_max = RIV_max100; + break; + } - if (rballoc>RIV_max) { - LOG_E(PHY,"Format 1A: rb_alloc > RIV_max\n"); - return(-1); - } + if (rballoc>RIV_max) { + LOG_E(PHY,"Format 1A: rb_alloc > RIV_max\n"); + return(-1); + } - if (NPRB==0) { - LOG_E(PHY,"Format 1A: NPRB=0\n"); - return(-1); - } - // change the mcs limit from 7 to 8, supported by MAC - if (mcs > 8) { - LOG_E(PHY,"Format 1A: unlikely mcs for format 1A (%d)\n",mcs); - return(-1); - } - - dlsch[0]->current_harq_pid = harq_pid; - // msg("Format 1A: harq_pid %d\n",harq_pid); - dlsch[0]->harq_processes[harq_pid]->rvidx = rv; - dlsch[0]->harq_processes[harq_pid]->Nl = 1; - dlsch[0]->layer_index = 0; - dlsch[0]->harq_processes[harq_pid]->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI; - dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset - dlsch[0]->harq_processes[harq_pid]->Ndi = ndi; - dlsch[0]->harq_processes[harq_pid]->mcs = mcs; - dlsch[0]->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; - dlsch[0]->rnti = rnti; - dlsch0 = dlsch[0]; - break; + if (NPRB==0) { + LOG_E(PHY,"Format 1A: NPRB=0\n"); + return(-1); + } + // change the mcs limit from 7 to 8, supported by MAC + if (mcs > 8) { + LOG_E(PHY,"Format 1A: unlikely mcs for format 1A (%d)\n",mcs); + return(-1); + } + + if ((rnti==si_rnti) || (rnti==p_rnti) || (rnti==ra_rnti)){ // + // toggle the ndi, always toggled for si,p and ra + ndi = 1-dlsch[0]->harq_processes[harq_pid]->DCINdi; + } + + dlsch[0]->current_harq_pid = harq_pid; + // msg("Format 1A: harq_pid %d\n",harq_pid); + dlsch[0]->harq_processes[harq_pid]->rvidx = rv; + dlsch[0]->harq_processes[harq_pid]->Nl = 1; + dlsch[0]->layer_index = 0; + dlsch[0]->harq_processes[harq_pid]->mimo_mode = frame_parms->mode1_flag == 1 ?SISO : ALAMOUTI; + dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset + + if ((ndi!=dlsch[0]->harq_processes[harq_pid]->DCINdi)|| // DCI has been toggled or this is the first transmission + (dlsch[0]->harq_processes[harq_pid]->first_tx==1)) { + dlsch[0]->harq_processes[harq_pid]->round = 0; + if (dlsch[0]->harq_processes[harq_pid]->first_tx==1) + LOG_D(PHY,"[PDSCH %x/%d] Format 1A DCI First TX: Clearing flag\n"); + dlsch[0]->harq_processes[harq_pid]->first_tx = 0; + } + dlsch[0]->harq_processes[harq_pid]->DCINdi = ndi; + + dlsch[0]->harq_processes[harq_pid]->mcs = mcs; + dlsch[0]->harq_processes[harq_pid]->TBS = TBStable[get_I_TBS(mcs)][NPRB-1]; + dlsch[0]->rnti = rnti; + dlsch0 = dlsch[0]; + break; case format1: @@ -1944,8 +1971,8 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, conv_rballoc(rah,rballoc,frame_parms->N_RB_DL,dlsch[0]->harq_processes[harq_pid]->rb_alloc); dlsch[0]->harq_processes[harq_pid]->nb_rb = conv_nprb(rah, - rballoc, - frame_parms->N_RB_DL); + rballoc, + frame_parms->N_RB_DL); NPRB = dlsch[0]->harq_processes[harq_pid]->nb_rb; @@ -1965,11 +1992,19 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch[0]->layer_index = 0; dlsch[0]->harq_processes[harq_pid]->mimo_mode = (frame_parms->mode1_flag == 1) ? SISO : ALAMOUTI; dlsch[0]->harq_processes[harq_pid]->dl_power_off = 1; //no power offset - dlsch[0]->harq_processes[harq_pid]->Ndi = ndi; - if (dlsch[0]->harq_processes[harq_pid]->Ndi == 1) { + LOG_D(PHY,"Format1 DCI: ndi %d, old_ndi %d (first tx %d)\n",ndi,dlsch[0]->harq_processes[harq_pid]->DCINdi, + dlsch[0]->harq_processes[harq_pid]->first_tx); + + + if ((ndi!=dlsch[0]->harq_processes[harq_pid]->DCINdi)|| + (dlsch[0]->harq_processes[harq_pid]->first_tx==1)) { + dlsch[0]->harq_processes[harq_pid]->round=0; dlsch[0]->harq_processes[harq_pid]->status = ACTIVE; - // printf("Setting DLSCH process %d to ACTIVE\n",harq_pid); + dlsch[0]->harq_processes[harq_pid]->DCINdi = ndi; + if (dlsch[0]->harq_processes[harq_pid]->first_tx==1) + LOG_D(PHY,"[PDSCH %x/%d] Format 1 DCI First TX: Clearing flag\n"); + dlsch[0]->harq_processes[harq_pid]->first_tx = 0; } else if (dlsch[0]->harq_processes[harq_pid]->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, // this happens if either another harq process in the same @@ -2026,8 +2061,8 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch1->harq_processes[harq_pid]->rb_alloc[0] = dlsch0->harq_processes[harq_pid]->rb_alloc[0]; dlsch0->harq_processes[harq_pid]->nb_rb = conv_nprb(((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, - ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc, - frame_parms->N_RB_DL); + ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc, + frame_parms->N_RB_DL); dlsch1->harq_processes[harq_pid]->nb_rb = dlsch0->harq_processes[harq_pid]->nb_rb; dlsch0->harq_processes[harq_pid]->mcs = ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs1; @@ -2097,10 +2132,11 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if (frame_parms->mode1_flag == 1) dlsch0->harq_processes[harq_pid]->mimo_mode = SISO; - - dlsch0->harq_processes[harq_pid]->Ndi = ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi1; - if (dlsch0->harq_processes[harq_pid]->Ndi == 1) + if (((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi1!=dlsch0->harq_processes[harq_pid]->DCINdi) { + dlsch0->harq_processes[harq_pid]->round = 0; dlsch0->harq_processes[harq_pid]->status = ACTIVE; + dlsch0->harq_processes[harq_pid]->DCINdi = ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi1; + } else if (dlsch0->harq_processes[harq_pid]->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, // this happens if either another harq process in the same // is NAK or an ACK was not received @@ -2126,9 +2162,12 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if (dlsch0->harq_processes[harq_pid]->mcs > 18) printf("mcs %d, TBS %d\n",dlsch0->harq_processes[harq_pid]->mcs,dlsch0->harq_processes[harq_pid]->TBS); */ - dlsch1->harq_processes[harq_pid]->Ndi = ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi2; - if (dlsch1->harq_processes[harq_pid]->Ndi == 1) + + if (dlsch1->harq_processes[harq_pid]->DCINdi != ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi2) { + dlsch1->harq_processes[harq_pid]->round=0; dlsch1->harq_processes[harq_pid]->status = ACTIVE; + } + dlsch1->harq_processes[harq_pid]->DCINdi = ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi2; dlsch1->harq_processes[harq_pid]->mcs = ((DCI2_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs2; if (dlsch1->harq_processes[harq_pid]->nb_rb>1) { #ifdef TBS_FIX @@ -2180,8 +2219,8 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, //dlsch1->harq_processes[harq_pid]->rb_alloc[0] = dlsch0->harq_processes[harq_pid]->rb_alloc[0]; dlsch0->harq_processes[harq_pid]->nb_rb = conv_nprb(((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rah, - ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc, - frame_parms->N_RB_DL); + ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->rballoc, + frame_parms->N_RB_DL); //dlsch1->harq_processes[harq_pid]->nb_rb = dlsch0->harq_processes[harq_pid]->nb_rb; dlsch0->harq_processes[harq_pid]->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; @@ -2255,9 +2294,12 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, if (frame_parms->mode1_flag == 1) dlsch0->harq_processes[harq_pid]->mimo_mode = SISO; - dlsch0->harq_processes[harq_pid]->Ndi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; - if (dlsch0->harq_processes[harq_pid]->Ndi == 1) + + if (dlsch0->harq_processes[harq_pid]->DCINdi != ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi) { + + dlsch0->harq_processes[harq_pid]->round = 0; dlsch0->harq_processes[harq_pid]->status = ACTIVE; + } else if (dlsch0->harq_processes[harq_pid]->status == SCH_IDLE) { // we got an Ndi = 0 for a previously decoded process, // this happens if either another harq process in the same // is NAK or an ACK was not received @@ -2268,7 +2310,9 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, dlsch0->active = 0; return(0); } - dlsch0->harq_processes[harq_pid]->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; + + dlsch0->harq_processes[harq_pid]->DCINdi = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->ndi; + dlsch0->harq_processes[harq_pid]->mcs = ((DCI1E_5MHz_2A_M10PRB_TDD_t *)dci_pdu)->mcs; if (dlsch0->harq_processes[harq_pid]->nb_rb>1) { #ifdef TBS_FIX dlsch0->harq_processes[harq_pid]->TBS = 3*TBStable[get_I_TBS(dlsch0->harq_processes[harq_pid]->mcs)][dlsch0->harq_processes[harq_pid]->nb_rb-1]/4; @@ -2323,7 +2367,7 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, msg("PDSCH dlsch0 UE: NBRB %d\n",dlsch[0]->harq_processes[harq_pid]->nb_rb); msg("PDSCH dlsch0 UE: rballoc %x\n",dlsch[0]->harq_processes[harq_pid]->rb_alloc[0]); msg("PDSCH dlsch0 UE: harq_pid %d\n",harq_pid); - msg("PDSCH dlsch0 UE: Ndi %d\n",dlsch[0]->harq_processes[harq_pid]->Ndi); + msg("PDSCH dlsch0 UE: DCINdi %d\n",dlsch[0]->harq_processes[harq_pid]->DCINdi); msg("PDSCH dlsch0 UE: rvidx %d\n",dlsch[0]->harq_processes[harq_pid]->rvidx); msg("PDSCH dlsch0 UE: TBS %d\n",dlsch[0]->harq_processes[harq_pid]->TBS); msg("PDSCH dlsch0 UE: mcs %d\n",dlsch[0]->harq_processes[harq_pid]->mcs); @@ -2342,14 +2386,14 @@ int generate_ue_dlsch_params_from_dci(uint8_t subframe, uint8_t subframe2harq_pid(LTE_DL_FRAME_PARMS *frame_parms,uint32_t frame,uint8_t subframe) { - -#ifdef DEBUG_DCI - if (frame_parms->frame_type == TDD) + /* + #ifdef DEBUG_DCI + if (frame_parms->frame_type == TDD) msg("dci_tools.c: subframe2_harq_pid, subframe %d for TDD configuration %d\n",subframe,frame_parms->tdd_config); - else + else msg("dci_tools.c: subframe2_harq_pid, subframe %d for FDD \n",subframe); -#endif - + #endif + */ if (frame_parms->frame_type == FDD) { return(((frame<<1)+subframe)&7); } @@ -2596,54 +2640,54 @@ uint16_t quantize_wideband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id) { uint8_t sinr2cqi(int sinr,uint8_t trans_mode) { // int flag_LA=0; -if(flag_LA==0){ - // Ideal Channel Estimation - if (sinr<=-4.89) - return(0); - else if (sinr < -3.53) - return(3); - else if (sinr <= -1.93) - return(4); - else if (sinr <= -0.43) - return(5); - else if (sinr <= 1.11) - return(6); - else if (sinr <= 3.26) - return(7); - else if (sinr <= 5) - return(8); - else if (sinr <= 7) - return(9); - else if (sinr <= 9) - return(10); - else if (sinr <= 11) - return(11); - else if (sinr <= 13) - return(12); - else if (sinr <= 15.5) - return(13); - else if (sinr <= 17.5) - return(14); - else if (sinr > 19.5) - return(15); + if(flag_LA==0){ + // Ideal Channel Estimation + if (sinr<=-4.89) + return(0); + else if (sinr < -3.53) + return(3); + else if (sinr <= -1.93) + return(4); + else if (sinr <= -0.43) + return(5); + else if (sinr <= 1.11) + return(6); + else if (sinr <= 3.26) + return(7); + else if (sinr <= 5) + return(8); + else if (sinr <= 7) + return(9); + else if (sinr <= 9) + return(10); + else if (sinr <= 11) + return(11); + else if (sinr <= 13) + return(12); + else if (sinr <= 15.5) + return(13); + else if (sinr <= 17.5) + return(14); + else if (sinr > 19.5) + return(15); } - else{ - int h=0; - int trans_mode_tmp; - if (trans_mode ==5) - trans_mode_tmp=2; - else - if(trans_mode ==6) - trans_mode_tmp=3; - else - trans_mode_tmp = trans_mode-1; + else{ + int h=0; + int trans_mode_tmp; + if (trans_mode ==5) + trans_mode_tmp=2; + else + if(trans_mode ==6) + trans_mode_tmp=3; + else + trans_mode_tmp = trans_mode-1; - for(h=0;h<16;h++){ - if(sinr<=sinr_to_cqi[trans_mode_tmp][h]) - return(h); - } - } - return(0); + for(h=0;h<16;h++){ + if(sinr<=sinr_to_cqi[trans_mode_tmp][h]) + return(h); + } + } + return(0); } //uint32_t fill_subband_cqi(PHY_MEASUREMENTS *meas,uint8_t eNB_id) { // @@ -2818,7 +2862,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, */ if (harq_pid == 255) { LOG_E(PHY, "frame %d, subframe %d, rnti %x, format %d: illegal harq_pid!\n", - phy_vars_ue->frame, subframe, rnti, dci_format); + phy_vars_ue->frame, subframe, rnti, dci_format); return(-1); } @@ -2946,7 +2990,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, if (rballoc > RIV_max) { LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc > RIV_max\n", - phy_vars_ue->frame, subframe, rnti, dci_format); + phy_vars_ue->frame, subframe, rnti, dci_format); return(-1); } @@ -2977,8 +3021,19 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, */ ulsch->f_pusch = delta_PUSCH_abs[phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TPC]; } - ulsch->harq_processes[harq_pid]->Ndi = ndi; - + if (ulsch->harq_processes[harq_pid]->first_tx==1) { + // ulsch->harq_processes[harq_pid]->Ndi = 1; + ulsch->harq_processes[harq_pid]->first_tx=0; + } + else { + if (ulsch->harq_processes[harq_pid]->DCINdi!=ndi) { // new SDU opportunity + // ulsch->harq_processes[harq_pid]->Ndi = 1; + ulsch->harq_processes[harq_pid]->DCINdi= ndi; + } + else { + // ulsch->harq_processes[harq_pid]->Ndi = 0; + } + } ulsch->harq_processes[harq_pid]->n_DMRS = cshift; //printf("nb_rb %d, first_rb %d (RIV %d)\n",ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb,rballoc); @@ -3171,12 +3226,12 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, dlsch[0]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi; */ /* - if (frame_parms->frame_type == TDD) + if (frame_parms->frame_type == TDD) // 2bits if together with SR // 1 bit if ACK only? // check dai business ulsch->harq_processes[harq_pid]->O_ACK = 1; //(dai+1)&3; - else + else */ ulsch->harq_processes[harq_pid]->O_ACK = 1; @@ -3188,11 +3243,11 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, ulsch->srs_active = use_srs; ulsch->bundling = 1-AckNackFBMode; - if (ulsch->harq_processes[harq_pid]->Ndi == 1) { + if (ulsch->harq_processes[harq_pid]->round == 0) { if ((rnti >= cba_rnti) && (rnti < p_rnti)) - ulsch->harq_processes[harq_pid]->status = CBA_ACTIVE; + ulsch->harq_processes[harq_pid]->status = CBA_ACTIVE; else - ulsch->harq_processes[harq_pid]->status = ACTIVE; + ulsch->harq_processes[harq_pid]->status = ACTIVE; ulsch->harq_processes[harq_pid]->rvidx = 0; ulsch->harq_processes[harq_pid]->mcs = mcs; // ulsch->harq_processes[harq_pid]->calibration_flag =0; @@ -3225,7 +3280,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, msg("Format 0 DCI : ulsch (ue): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); msg("Format 0 DCI :ulsch (ue): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); msg("Format 0 DCI :ulsch (ue): harq_pid %d\n",harq_pid); - msg("Format 0 DCI :ulsch (ue): Ndi %d\n",ulsch->harq_processes[harq_pid]->Ndi); + msg("Format 0 DCI :ulsch (ue): round %d\n",ulsch->harq_processes[harq_pid]->round); msg("Format 0 DCI :ulsch (ue): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); msg("Format 0 DCI :ulsch (ue): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); msg("Format 0 DCI :ulsch (ue): O %d\n",ulsch->O); @@ -3243,7 +3298,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu, } else { LOG_E(PHY,"frame %d, subframe %d: FATAL ERROR, generate_ue_ulsch_params_from_dci, Illegal dci_format %d\n", - phy_vars_ue->frame, subframe,dci_format); + phy_vars_ue->frame, subframe,dci_format); return(-1); } @@ -3424,7 +3479,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, ulsch->harq_processes[harq_pid]->dci_alloc = 1; ulsch->harq_processes[harq_pid]->rar_alloc = 0; ulsch->harq_processes[harq_pid]->TPC = TPC; - ulsch->harq_processes[harq_pid]->Ndi = ndi; + // ulsch->harq_processes[harq_pid]->Ndi = ndi; ulsch->harq_processes[harq_pid]->n_DMRS = cshift; @@ -3558,11 +3613,11 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, - if (ulsch->harq_processes[harq_pid]->Ndi == 1) { + if (ulsch->harq_processes[harq_pid]->round == 0) { if ((rnti >= cba_rnti) && (rnti < p_rnti)) - ulsch->harq_processes[harq_pid]->status = CBA_ACTIVE; + ulsch->harq_processes[harq_pid]->status = CBA_ACTIVE; else - ulsch->harq_processes[harq_pid]->status = ACTIVE; + ulsch->harq_processes[harq_pid]->status = ACTIVE; ulsch->harq_processes[harq_pid]->rvidx = 0; ulsch->harq_processes[harq_pid]->mcs = mcs; // ulsch->harq_processes[harq_pid]->calibration_flag = 0; @@ -3600,7 +3655,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu, msg("ulsch (eNB): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); msg("ulsch (eNB): first_rb %d\n",ulsch->harq_processes[harq_pid]->first_rb); msg("ulsch (eNB): harq_pid %d\n",harq_pid); - msg("ulsch (eNB): Ndi %d\n",ulsch->harq_processes[harq_pid]->Ndi); + msg("ulsch (eNB): round %d\n",ulsch->harq_processes[harq_pid]->round); msg("ulsch (eNB): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); msg("ulsch (eNB): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); msg("ulsch (eNB): Or1 %d\n",ulsch->Or1); @@ -3649,173 +3704,173 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, u8 eNB_id){ } } } - break; - case 2: - for (count=0;count<frame_parms->N_RB_DL*12;count++) - {abs_channel=0; - for(a_tx=0;a_tx<frame_parms->nb_antennas_tx_eNB;a_tx++) - { - for (a_rx=0;a_rx<frame_parms->nb_antennas_rx;a_rx++) + break; + case 2: + for (count=0;count<frame_parms->N_RB_DL*12;count++) + {abs_channel=0; + for(a_tx=0;a_tx<frame_parms->nb_antennas_tx_eNB;a_tx++) + { + for (a_rx=0;a_rx<frame_parms->nb_antennas_rx;a_rx++) { abs_channel += (pow(((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2],2) + pow(((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2],2)); } - } - s_dB[count] = 10*log10(abs_channel/2) - meas->n0_power_avg_dB; - } - break; + } + s_dB[count] = 10*log10(abs_channel/2) - meas->n0_power_avg_dB; + } + break; case 5: for (count=0;count<frame_parms->N_RB_DL*12;count++){ - channelx=0; - channely=0; - channelx_i=0; - channely_i=0; - qq = (q>>(((count/12)>>2)<<1))&3; - //printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq); - for(a_tx=0;a_tx<frame_parms->nb_antennas_tx_eNB;a_tx++) - { - for (a_rx=0;a_rx<frame_parms->nb_antennas_rx;a_rx++) - { - switch(qq){ - case 0: - if (channelx==0 || channely==0){ - channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channelx_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channelx=0; + channely=0; + channelx_i=0; + channely_i=0; + qq = (q>>(((count/12)>>2)<<1))&3; + //printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq); + for(a_tx=0;a_tx<frame_parms->nb_antennas_tx_eNB;a_tx++) + { + for (a_rx=0;a_rx<frame_parms->nb_antennas_rx;a_rx++) + { + switch(qq){ + case 0: + if (channelx==0 || channely==0){ + channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channelx_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + } + else + { + channelx += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channelx_i -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely_i -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; } - else - { - channelx += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channelx_i -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely_i -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - } - break; - case 1: - if (channelx==0 || channely==0){ - channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channelx_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + break; + case 1: + if (channelx==0 || channely==0){ + channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channelx_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + } + else + { + channelx -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channelx_i += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely_i += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; } - else - { - channelx -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channelx_i += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely_i += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - } - break; - case 2: - if (channelx==0 || channely==0){ - channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channelx_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + break; + case 2: + if (channelx==0 || channely==0){ + channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channelx_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + } + else + { + channelx -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channely += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channelx_i += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channely_i -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; } - else - { - channelx -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channely += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channelx_i += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channely_i -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - } - break; - case 3: - if (channelx==0 || channely==0){ - channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channelx_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + break; + case 3: + if (channelx==0 || channely==0){ + channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channelx_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely_i = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + } + else + { + channelx += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channely -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channelx_i -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channely_i += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; } - else - { - channelx += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channely -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channelx_i -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channely_i += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - } - break; - default: - msg("Problem in SINR Calculation for TM5 \n"); - break; - }//switch(qq) - }//a_rx - }//a_tx + break; + default: + msg("Problem in SINR Calculation for TM5 \n"); + break; + }//switch(qq) + }//a_rx + }//a_tx - s_dB[count] = 10 * log10 ((pow(channelx,2) + pow(channely,2))/2) - 10 * log10 ((pow(channelx_i,2) + pow(channely_i,2))/2) - meas->n0_power_avg_dB; + s_dB[count] = 10 * log10 ((pow(channelx,2) + pow(channely,2))/2) - 10 * log10 ((pow(channelx_i,2) + pow(channely_i,2))/2) - meas->n0_power_avg_dB; }//count break; case 6: - for (count=0;count<frame_parms->N_RB_DL*12;count++){ - channelx=0; - channely=0; - qq = (q>>(((count/12)>>2)<<1))&3; - //printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq); - for(a_tx=0;a_tx<frame_parms->nb_antennas_tx_eNB;a_tx++) - { - for (a_rx=0;a_rx<frame_parms->nb_antennas_rx;a_rx++) - { - switch(qq){ - case 0: - if (channelx==0 || channely==0){ - channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + for (count=0;count<frame_parms->N_RB_DL*12;count++){ + channelx=0; + channely=0; + qq = (q>>(((count/12)>>2)<<1))&3; + //printf("pmi_alloc %d: rb %d, pmi %d\n",q,count/12,qq); + for(a_tx=0;a_tx<frame_parms->nb_antennas_tx_eNB;a_tx++) + { + for (a_rx=0;a_rx<frame_parms->nb_antennas_rx;a_rx++) + { + switch(qq){ + case 0: + if (channelx==0 || channely==0){ + channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + } + else + { + channelx += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; } - else - { - channelx += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - } - break; - case 1: - if (channelx==0 || channely==0){ - channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + break; + case 1: + if (channelx==0 || channely==0){ + channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + } + else + { + channelx -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; } - else - { - channelx -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - } - break; - case 2: - if (channelx==0 || channely==0){ - channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + break; + case 2: + if (channelx==0 || channely==0){ + channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + } + else + { + channelx -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channely += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; } - else - { - channelx -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channely += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - } - break; - case 3: - if (channelx==0 || channely==0){ - channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + break; + case 3: + if (channelx==0 || channely==0){ + channelx = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; + channely = ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + } + else + { + channelx += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; + channely -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; } - else - { - channelx += ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+1+(LTE_CE_FILTER_LENGTH)*2]; - channely -= ((s16 *) dl_channel_est[(a_tx<<1)+a_rx])[2*count+(LTE_CE_FILTER_LENGTH)*2]; - } - break; - default: - msg("Problem in SINR Calculation for TM6 \n"); - break; - }//switch(qq) - }//a_rx - }//a_tx + break; + default: + msg("Problem in SINR Calculation for TM6 \n"); + break; + }//switch(qq) + }//a_rx + }//a_tx - s_dB[count] = 10 * log10 ((pow(channelx,2) + pow(channely,2))/2) - meas->n0_power_avg_dB; + s_dB[count] = 10 * log10 ((pow(channelx,2) + pow(channely,2))/2) - meas->n0_power_avg_dB; }//count - break; - default: - msg("Problem in SINR Calculation for CQI \n"); - break; + break; + default: + msg("Problem in SINR Calculation for CQI \n"); + break; } - int ii; + int ii; double sinr_eff = 0; double sinr_eff_qpsk=0; double sinr_eff_qam16=0; @@ -3863,7 +3918,7 @@ double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue, u8 eNB_id){ } } - // averaging of accumulated MI + // averaging of accumulated MI I_qpsk_avg = I_qpsk/(12*frame_parms->N_RB_DL); I_qam16_avg = I_qam16/(12*frame_parms->N_RB_DL); I_qam64_avg = I_qam64/(12*frame_parms->N_RB_DL); diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h index 5e685a3824a..035a15e7720 100644 --- a/openair1/PHY/LTE_TRANSPORT/defs.h +++ b/openair1/PHY/LTE_TRANSPORT/defs.h @@ -88,8 +88,6 @@ typedef enum { typedef struct { - /// Flag indicating that this DLSCH is active (i.e. not the first round) - uint8_t Ndi; /// Status Flag indicating for this DLSCH (idle,active,disabled) SCH_status_t status; /// Transport block size @@ -131,8 +129,12 @@ typedef struct { } LTE_DL_eNB_HARQ_t; typedef struct { + /// Indicator of first transmission + uint8_t first_tx; + /// Last Ndi received for this process on DCI (used for C-RNTI only) + uint8_t DCINdi; /// Flag indicating that this ULSCH has a new packet (start of new round) - uint8_t Ndi; + // uint8_t Ndi; /// Status Flag indicating for this ULSCH (idle,active,disabled) SCH_status_t status; /// Subframe scheduling indicator (i.e. Transmission opportunity indicator) @@ -325,8 +327,6 @@ typedef struct { uint8_t dci_alloc; /// Flag indicating that this ULSCH has been allocated by a RAR (otherwise it is a retransmission based on PHICH NAK or DCI) uint8_t rar_alloc; - /// Flag indicating that this ULSCH has new data - uint8_t Ndi; /// Status Flag indicating for this ULSCH (idle,active,disabled) SCH_status_t status; /// Subframe scheduling indicator (i.e. Transmission opportunity indicator) @@ -463,8 +463,10 @@ typedef struct { } LTE_eNB_ULSCH_t; typedef struct { - /// Flag indicating that this DLSCH has a new transport block - uint8_t Ndi; + /// Indicator of first transmission + uint8_t first_tx; + /// Last Ndi received for this process on DCI (used for C-RNTI only) + uint8_t DCINdi; /// DLSCH status flag indicating SCH_status_t status; /// Transport block size diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c index 3fb09dabd5d..d495b7c2ca6 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c @@ -141,6 +141,7 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne MAX_DLSCH_PAYLOAD_BYTES/bw_scaling,bw_scaling, i,dlsch->harq_processes[i]); if (dlsch->harq_processes[i]) { bzero(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t)); + // dlsch->harq_processes[i]->first_tx=1; dlsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); if (dlsch->harq_processes[i]->b) { bzero(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); @@ -202,7 +203,7 @@ void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch, u8 abstraction_flag) { for (i=0;i<Mdlharq;i++) { if (dlsch->harq_processes[i]) { - dlsch->harq_processes[i]->Ndi = 0; + // dlsch->harq_processes[i]->Ndi = 0; dlsch->harq_processes[i]->status = 0; dlsch->harq_processes[i]->round = 0; if (abstraction_flag==0) { @@ -245,7 +246,8 @@ int dlsch_encoding(unsigned char *a, G = get_G(frame_parms,nb_rb,dlsch->rb_alloc,mod_order,num_pdcch_symbols,frame,subframe); - if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet + // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet + if (dlsch->harq_processes[harq_pid]->round == 0) { // this is a new packet /* int i; @@ -382,7 +384,8 @@ void dlsch_encoding_emul(PHY_VARS_eNB *phy_vars_eNB, unsigned char harq_pid = dlsch->current_harq_pid; unsigned short i; - if (dlsch->harq_processes[harq_pid]->Ndi == 1) { + // if (dlsch->harq_processes[harq_pid]->Ndi == 1) { + if (dlsch->harq_processes[harq_pid]->round == 0) { memcpy(dlsch->harq_processes[harq_pid]->b, DLSCH_pdu, dlsch->harq_processes[harq_pid]->TBS>>3); diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 2c21c747277..d9afadecca2 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -111,6 +111,7 @@ LTE_UE_DLSCH_t *new_ue_dlsch(uint8_t Kmimo,uint8_t Mdlharq,uint8_t max_turbo_ite dlsch->harq_processes[i] = (LTE_DL_UE_HARQ_t *)malloc16(sizeof(LTE_DL_UE_HARQ_t)); if (dlsch->harq_processes[i]) { memset(dlsch->harq_processes[i],0,sizeof(LTE_DL_UE_HARQ_t)); + dlsch->harq_processes[i]->first_tx=1; dlsch->harq_processes[i]->b = (uint8_t*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); if (dlsch->harq_processes[i]->b) memset(dlsch->harq_processes[i]->b,0,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling); @@ -235,7 +236,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, // msg("DLSCH Decoding, harq_pid %d Ndi %d\n",harq_pid,harq_process->Ndi); - if (harq_process->Ndi == 1) { + if (harq_process->round == 0) { // This is a new packet, so compute quantities regarding segmentation harq_process->B = A+24; lte_segmentation(NULL, @@ -309,7 +310,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, dlsch->Mdlharq, dlsch->Kmimo, harq_process->rvidx, - harq_process->Ndi, + (harq_process->round==0)?1:0, get_Qm(harq_process->mcs), harq_process->Nl, r, @@ -718,7 +719,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, dlsch_ue->harq_ack[subframe].ack = 1; dlsch_ue->harq_ack[subframe].harq_id = harq_pid; dlsch_ue->harq_ack[subframe].send_harq_status = 1; - if (dlsch_ue->harq_processes[harq_pid]->Ndi == 1) + if (dlsch_ue->harq_processes[harq_pid]->round == 0) memcpy(dlsch_ue->harq_processes[harq_pid]->b, dlsch_eNB->harq_processes[harq_pid]->b, dlsch_ue->harq_processes[harq_pid]->TBS>>3); @@ -746,7 +747,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, dlsch_ue->harq_ack[subframe].ack = 1; dlsch_ue->harq_ack[subframe].harq_id = harq_pid; dlsch_ue->harq_ack[subframe].send_harq_status = 1; - if (dlsch_ue->harq_processes[harq_pid]->Ndi == 1) + if (dlsch_ue->harq_processes[harq_pid]->round == 0) memcpy(dlsch_eNB->harq_processes[harq_pid]->b,dlsch_ue->harq_processes[harq_pid]->b,dlsch_ue->harq_processes[harq_pid]->TBS>>3); break; default: diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index 6dcf11ad2fe..674d40a3916 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -1258,7 +1258,7 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, &phy_vars_ue->ulsch_ue_Msg3_frame[eNB_id], &phy_vars_ue->ulsch_ue_Msg3_subframe[eNB_id]); ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - ulsch->harq_processes[harq_pid]->Ndi = 0; + // ulsch->harq_processes[harq_pid]->Ndi = 0; ulsch->harq_processes[harq_pid]->round++; ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3]; if (ulsch->harq_processes[harq_pid]->round>=phy_vars_ue->lte_frame_parms.maxHARQ_Msg3Tx) { @@ -1279,7 +1279,7 @@ void rx_phich(PHY_VARS_UE *phy_vars_ue, ngroup_PHICH); //#endif ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1; - ulsch->harq_processes[harq_pid]->Ndi = 0; + // ulsch->harq_processes[harq_pid]->Ndi = 0; ulsch->harq_processes[harq_pid]->round++; ulsch->harq_processes[harq_pid]->rvidx = rv_table[ulsch->harq_processes[harq_pid]->round&3]; } @@ -1400,7 +1400,7 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB, LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH ACK / (no format0 DCI) Setting subframe_scheduling_flag\n", phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->frame,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]->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]; } diff --git a/openair1/PHY/LTE_TRANSPORT/pilots.c b/openair1/PHY/LTE_TRANSPORT/pilots.c index 4acacc3efa9..cec6b46076a 100644 --- a/openair1/PHY/LTE_TRANSPORT/pilots.c +++ b/openair1/PHY/LTE_TRANSPORT/pilots.c @@ -62,13 +62,8 @@ void generate_pilots(PHY_VARS_eNB *phy_vars_eNB, -#ifdef IFFT_FPGA - tti_offset = tti*frame_parms->N_RB_DL*12*Nsymb; - samples_per_symbol = frame_parms->N_RB_DL*12; -#else tti_offset = tti*frame_parms->ofdm_symbol_size*Nsymb; samples_per_symbol = frame_parms->ofdm_symbol_size; -#endif slot_offset = (tti*2)%20; // printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset); @@ -191,13 +186,8 @@ int generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, second_pilot = (frame_parms->Ncp==0)?4:3; -#ifdef IFFT_FPGA - slot_offset = slot*frame_parms->N_RB_DL*12*Nsymb; - samples_per_symbol = frame_parms->N_RB_DL*12; -#else slot_offset = slot*frame_parms->ofdm_symbol_size*Nsymb; samples_per_symbol = frame_parms->ofdm_symbol_size; -#endif // printf("tti %d : offset %d (slot %d)\n",tti,tti_offset,slot_offset); //Generate Pilots diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c index 428d2565087..c4f9b2d68c8 100644 --- a/openair1/PHY/LTE_TRANSPORT/pmch.c +++ b/openair1/PHY/LTE_TRANSPORT/pmch.c @@ -149,7 +149,7 @@ void fill_eNB_dlsch_MCH(PHY_VARS_eNB *phy_vars_eNB,int mcs,int ndi,int rvidx) { LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms; dlsch->harq_processes[0]->mcs = mcs; - dlsch->harq_processes[0]->Ndi = ndi; + // dlsch->harq_processes[0]->Ndi = ndi; dlsch->harq_processes[0]->rvidx = rvidx; dlsch->harq_processes[0]->Nl = 1; dlsch->harq_processes[0]->TBS = TBStable[get_I_TBS(dlsch->harq_processes[0]->mcs)][frame_parms->N_RB_DL-1]; @@ -183,7 +183,7 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *phy_vars_ue,int mcs,int ndi,int rvidx,int eN dlsch->harq_processes[0]->mcs = mcs; dlsch->harq_processes[0]->rvidx = rvidx; - dlsch->harq_processes[0]->Ndi = ndi; + // dlsch->harq_processes[0]->Ndi = ndi; dlsch->harq_processes[0]->Nl = 1; dlsch->harq_processes[0]->TBS = TBStable[get_I_TBS(dlsch->harq_processes[0]->mcs)][frame_parms->N_RB_DL-1]; dlsch->current_harq_pid = 0; diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c index 0da4aca7d6a..2b52835669b 100644 --- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c @@ -111,7 +111,7 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu, ulsch->harq_processes[harq_pid]->rar_alloc = 1; ulsch->harq_processes[harq_pid]->first_rb = RIV2first_rb_LUT[rballoc]; ulsch->harq_processes[harq_pid]->nb_rb = RIV2nb_rb_LUT[rballoc]; - ulsch->harq_processes[harq_pid]->Ndi = 1; + // ulsch->harq_processes[harq_pid]->Ndi = 1; cqireq = rar[3]&1; if (cqireq==1){ @@ -133,7 +133,7 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu, ulsch->Nsymb_pusch = 12-(frame_parms->Ncp<<1); ulsch->rnti = (((uint16_t)rar[4])<<8)+rar[5]; - if (ulsch->harq_processes[harq_pid]->Ndi == 1) { + if (ulsch->harq_processes[harq_pid]->round == 0) { ulsch->harq_processes[harq_pid]->status = ACTIVE; ulsch->harq_processes[harq_pid]->rvidx = 0; ulsch->harq_processes[harq_pid]->mcs = ((rar[2]&1)<<3)|(rar[3]>>5); @@ -152,7 +152,7 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu, msg("ulsch ra (eNB): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); msg("ulsch ra (eNB): rballoc %x\n",ulsch->harq_processes[harq_pid]->first_rb); msg("ulsch ra (eNB): harq_pid %d\n",harq_pid); - msg("ulsch ra (eNB): Ndi %d\n",ulsch->harq_processes[harq_pid]->Ndi); + msg("ulsch ra (eNB): round %d\n",ulsch->harq_processes[harq_pid]->round); msg("ulsch ra (eNB): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); msg("ulsch ra (eNB): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); msg("ulsch ra (eNB): Or1 %d\n",ulsch->Or1); @@ -176,14 +176,14 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, // int current_dlsch_cqi = phy_vars_ue->current_dlsch_cqi[eNB_id]; uint8_t *rar = (uint8_t *)(rar_pdu+1); - uint8_t harq_pid = subframe2harq_pid(frame_parms,phy_vars_ue->frame,subframe); + uint8_t harq_pid = subframe2harq_pid(frame_parms,((subframe==0)?1:0) + phy_vars_ue->frame,subframe); uint16_t rballoc; uint8_t cqireq; double sinr_eff; uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT; uint16_t RIV_max; - LOG_D(PHY,"[eNB][RAPROC] generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",subframe,harq_pid); + LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",phy_vars_ue->frame,subframe,harq_pid); switch (frame_parms->N_RB_DL) { case 6: @@ -232,8 +232,8 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, return(-1); } - ulsch->harq_processes[harq_pid]->Ndi = 1; - if (ulsch->harq_processes[harq_pid]->Ndi == 1) + // ulsch->harq_processes[harq_pid]->Ndi = 1; + if (ulsch->harq_processes[harq_pid]->round == 0) ulsch->harq_processes[harq_pid]->status = ACTIVE; if (cqireq==1) { @@ -275,7 +275,7 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, ulsch->Nsymb_pusch = 12-(frame_parms->Ncp<<1); ulsch->rnti = (((uint16_t)rar[4])<<8)+rar[5]; //rar->t_crnti; - if (ulsch->harq_processes[harq_pid]->Ndi == 1) { + if (ulsch->harq_processes[harq_pid]->round == 0) { ulsch->harq_processes[harq_pid]->status = ACTIVE; ulsch->harq_processes[harq_pid]->rvidx = 0; ulsch->harq_processes[harq_pid]->mcs = ((rar[2]&1)<<3)|(rar[3]>>5); @@ -300,10 +300,11 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue, //#ifdef DEBUG_RAR + msg("ulsch ra (UE): harq_pid %d\n",harq_pid); msg("ulsch ra (UE): NBRB %d\n",ulsch->harq_processes[harq_pid]->nb_rb); msg("ulsch ra (UE): first_rb %x\n",ulsch->harq_processes[harq_pid]->first_rb); msg("ulsch ra (UE): nb_rb %d\n",ulsch->harq_processes[harq_pid]->nb_rb); - msg("ulsch ra (UE): Ndi %d\n",ulsch->harq_processes[harq_pid]->Ndi); + msg("ulsch ra (UE): round %d\n",ulsch->harq_processes[harq_pid]->round); msg("ulsch ra (UE): TBS %d\n",ulsch->harq_processes[harq_pid]->TBS); msg("ulsch ra (UE): mcs %d\n",ulsch->harq_processes[harq_pid]->mcs); msg("ulsch ra (UE): TPC %d\n",ulsch->harq_processes[harq_pid]->TPC); diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c index f8a9b18b3ec..78844a094b5 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c @@ -287,18 +287,18 @@ u32 ulsch_encoding(u8 *a, ulsch->harq_processes[harq_pid]->control_only = 0; #ifdef DEBUG_ULSCH_CODING - msg("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, Ndi %d, RV %d\n", + msg("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n", ulsch->harq_processes[harq_pid]->TBS, Q_m, ulsch->harq_processes[harq_pid]->mcs, harq_pid, - ulsch->harq_processes[harq_pid]->Ndi, + ulsch->harq_processes[harq_pid]->round, ulsch->harq_processes[harq_pid]->rvidx); for (i=0;i<ulsch->harq_processes[harq_pid]->O_ACK;i++) - msg("ulsch_coding: O_ACK[%d] %d\n",i,ulsch->o_ACK[i]); + msg("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]); for (i=0;i<ulsch->O_RI;i++) - msg("ulsch_coding: O_RI[%d] %d\n",i,ulsch->o_RI[i]); + msg("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]); msg("ulsch_coding: O=%d\n",ulsch->O); for (i=0;i<1+((8+ulsch->O)/8);i++) { @@ -311,7 +311,7 @@ u32 ulsch_encoding(u8 *a, print_CQI(ulsch->o,HLC_subband_cqi_rank1_2A,0); #endif - if (ulsch->harq_processes[harq_pid]->Ndi == 1) { // this is a new packet + if (ulsch->harq_processes[harq_pid]->round == 0) { // this is a new packet start_meas(seg_stats); // Add 24-bit crc (polynomial A) to payload diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c index 3e1ec7c9585..a1627684e17 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c @@ -174,7 +174,7 @@ void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch, uint8_t abstraction_flag) { ulsch->rnti = 0; for (i=0;i<Mdlharq;i++) { if (ulsch->harq_processes[i]) { - ulsch->harq_processes[i]->Ndi = 0; + // ulsch->harq_processes[i]->Ndi = 0; ulsch->harq_processes[i]->status = 0; ulsch->harq_processes[i]->subframe_scheduling_flag = 0; //ulsch->harq_processes[i]->phich_active = 0; //this will be done later after transmission of PHICH @@ -294,9 +294,9 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, #ifdef DEBUG_ULSCH_DECODING - LOG_D(PHY,"ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): Ndi %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", + LOG_D(PHY,"ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", frame_parms->Nid_cell,ulsch->rnti,x2, - ulsch->harq_processes[harq_pid]->Ndi, + ulsch->harq_processes[harq_pid]->round, ulsch->harq_processes[harq_pid]->rvidx, ulsch->harq_processes[harq_pid]->mcs, ulsch->O_RI, @@ -305,7 +305,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, subframe); #endif - if (ulsch->harq_processes[harq_pid]->Ndi == 1) { + if (ulsch->harq_processes[harq_pid]->round == 0) { // This is a new packet, so compute quantities regarding segmentation ulsch->harq_processes[harq_pid]->B = A+24; lte_segmentation(NULL, @@ -331,10 +331,10 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, } if (sumKr==0) { LOG_N(PHY,"[eNB %d] ulsch_decoding.c: FATAL sumKr is 0!\n",phy_vars_eNB->Mod_id); - LOG_D(PHY,"ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): harq_pid %d Ndi %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", + LOG_D(PHY,"ulsch_decoding (Nid_cell %d, rnti %x, x2 %x): harq_pid %d round %d, RV %d, mcs %d, O_RI %d, O_ACK %d, G %d, subframe %d\n", frame_parms->Nid_cell,ulsch->rnti,x2, harq_pid, - ulsch->harq_processes[harq_pid]->Ndi, + ulsch->harq_processes[harq_pid]->round, ulsch->harq_processes[harq_pid]->rvidx, ulsch->harq_processes[harq_pid]->mcs, ulsch->O_RI, @@ -407,7 +407,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, Q_CQI = Q_m * Qprime; #ifdef DEBUG_ULSCH_DECODING - printf("ulsch_decoding.c: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d)\n",G,Q_RI,Q_CQI,L,ulsch->Or1); + printf("ulsch_decoding.c: G %d, Q_RI %d, Q_CQI %d (L %d, Or1 %d) O_ACK %d\n",G,Q_RI,Q_CQI,L,ulsch->Or1,ulsch->harq_processes[harq_pid]->O_ACK); #endif Qprime_CQI = Qprime; @@ -768,7 +768,8 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, if (y[q+(Q_m*((r*Cmux) + columnset[j]))]!=0) ulsch->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->q_ACK[(q+(Q_m*i))%len_ACK],q+(Q_m*((r*Cmux) + columnset[j])),r,columnset[j]); + // LOG_D(PHY,"ACK %d => %d (%d,%d,%d)\n",(q+(Q_m*i))%len_ACK,ulsch->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->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 } @@ -874,6 +875,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, #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;) { @@ -1161,7 +1163,7 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, ulsch->Mdlharq, 1, ulsch->harq_processes[harq_pid]->rvidx, - ulsch->harq_processes[harq_pid]->Ndi, + (ulsch->harq_processes[harq_pid]->round==0)?1:0, // clear get_Qm_ul(ulsch->harq_processes[harq_pid]->mcs), 1, r, @@ -1181,14 +1183,14 @@ unsigned int ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB, &ulsch->harq_processes[harq_pid]->d[r][96], ulsch->harq_processes[harq_pid]->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_processes[harq_pid]->d[r][96+i]); msg("\n"); #endif - */ + } #ifdef OMP diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 2ce5751e1c9..808f5ba2802 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -247,14 +247,94 @@ void lte_idft(LTE_DL_FRAME_PARMS *frame_parms,uint32_t *z, uint16_t Msc_PUSCH) { break; case 288: dft288(idft_in0,idft_out0,1); - dft288(idft_in1,idft_out1,1); + dft288(idft_in1,idft_out1,1); dft288(idft_in2,idft_out2,1); break; - case 300: + case 300: dft300(idft_in0,idft_out0,1); dft300(idft_in1,idft_out1,1); dft300(idft_in2,idft_out2,1); break; + case 324: + dft324((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft324((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft324((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 360: + dft360((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft360((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft360((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 384: + dft384((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft384((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft384((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 432: + dft432((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft432((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft432((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 480: + dft480((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft480((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft480((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 540: + dft540((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft540((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft540((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 576: + dft576((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft576((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft576((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 600: + dft600((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft600((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft600((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 648: + dft648((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft648((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft648((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 720: + dft720((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft720((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft720((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 864: + dft864((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft864((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft864((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 900: + dft900((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft900((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft900((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 960: + dft960((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft960((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft960((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 972: + dft972((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft972((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft972((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 1080: + dft1080((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft1080((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft1080((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; + case 1152: + dft1152((int16_t*)idft_in0,(int16_t*)idft_out0,1); + dft1152((int16_t*)idft_in1,(int16_t*)idft_out1,1); + dft1152((int16_t*)idft_in2,(int16_t*)idft_out2,1); + break; case 1200: dft1200(idft_in0,idft_out0,1); dft1200(idft_in1,idft_out1,1); diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c index fb830d3ac04..6dfaf164682 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c @@ -202,6 +202,86 @@ void dft_lte(mod_sym_t *z,mod_sym_t *d, int32_t Msc_PUSCH, uint8_t Nsymb) { dft300((int16_t*)dft_in1,(int16_t*)dft_out1,1); dft300((int16_t*)dft_in2,(int16_t*)dft_out2,1); break; + case 324: + dft324((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft324((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft324((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 360: + dft360((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft360((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft360((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 384: + dft384((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft384((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft384((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 432: + dft432((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft432((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft432((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 480: + dft480((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft480((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft480((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 540: + dft540((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft540((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft540((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 576: + dft576((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft576((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft576((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 600: + dft600((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft600((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft600((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 648: + dft648((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft648((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft648((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 720: + dft720((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft720((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft720((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 864: + dft864((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft864((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft864((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 900: + dft900((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft900((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft900((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 960: + dft960((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft960((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft960((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 972: + dft972((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft972((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft972((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 1080: + dft1080((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft1080((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft1080((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; + case 1152: + dft1152((int16_t*)dft_in0,(int16_t*)dft_out0,1); + dft1152((int16_t*)dft_in1,(int16_t*)dft_out1,1); + dft1152((int16_t*)dft_in2,(int16_t*)dft_out2,1); + break; case 1200: dft1200((int16_t*)dft_in0,(int16_t*)dft_out0,1); dft1200((int16_t*)dft_in1,(int16_t*)dft_out1,1); @@ -344,6 +424,7 @@ void ulsch_modulation(mod_sym_t **txdataF, // Modulation Msymb = G/Q_m; + if(ulsch->cooperation_flag == 2) // For Distributed Alamouti Scheme in Collabrative Communication { @@ -491,8 +572,8 @@ void ulsch_modulation(mod_sym_t **txdataF, ((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1) ? (-gain_lin_QPSK) : gain_lin_QPSK; ((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK; - // if (i<Msc_PUSCH) - // msg("input %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); + // if (i<Msc_PUSCH) + // msg("input %d/%d Msc_PUSCH %d (%p): %d,%d\n", i,Msymb,Msc_PUSCH,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]); break; diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h index e42059c0aec..6e292f8fa82 100644 --- a/openair1/PHY/TOOLS/defs.h +++ b/openair1/PHY/TOOLS/defs.h @@ -555,6 +555,22 @@ void dft216(int16_t *x,int16_t *y,u8 scale_flag); void dft240(int16_t *x,int16_t *y,u8 scale_flag); void dft288(int16_t *x,int16_t *y,u8 scale_flag); void dft300(int16_t *x,int16_t *y,u8 scale_flag); +void dft324(int16_t *x,int16_t *y,u8 scale_flag); +void dft360(int16_t *x,int16_t *y,u8 scale_flag); +void dft384(int16_t *x,int16_t *y,u8 scale_flag); +void dft432(int16_t *x,int16_t *y,u8 scale_flag); +void dft480(int16_t *x,int16_t *y,u8 scale_flag); +void dft540(int16_t *x,int16_t *y,u8 scale_flag); +void dft576(int16_t *x,int16_t *y,u8 scale_flag); +void dft600(int16_t *x,int16_t *y,u8 scale_flag); +void dft648(int16_t *x,int16_t *y,u8 scale_flag); +void dft720(int16_t *x,int16_t *y,u8 scale_flag); +void dft864(int16_t *x,int16_t *y,u8 scale_flag); +void dft900(int16_t *x,int16_t *y,u8 scale_flag); +void dft960(int16_t *x,int16_t *y,u8 scale_flag); +void dft972(int16_t *x,int16_t *y,u8 scale_flag); +void dft1080(int16_t *x,int16_t *y,u8 scale_flag); +void dft1152(int16_t *x,int16_t *y,u8 scale_flag); void dft1200(int16_t *x,int16_t *y,u8 scale_flag); void dft64(int16_t *x,int16_t *y,int scale); diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index fa652f46ff1..5aa78c3ffcb 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -4139,7 +4139,7 @@ void dft192(int16_t *x,int16_t *y,unsigned char scale_flag){ if (scale_flag==1) { norm128 = _mm_set1_epi16(dft_norm_table[11]); - for (i=0;i<216;i++) { + for (i=0;i<192;i++) { y128[i] = _mm_slli_epi16(_mm_mulhi_epi16(y128[i],norm128),1); } } @@ -5379,12 +5379,12 @@ void dft324(int16_t *x,int16_t *y,unsigned char scale_flag){ // 108 x 3 x2128[i+216] = x128[j+2]; } - dft96((int16_t *)x2128,(int16_t *)ytmp128,1); - dft96((int16_t *)(x2128+108),(int16_t *)(ytmp128+108),1); - dft96((int16_t *)(x2128+216),(int16_t *)(ytmp128+216),1); + dft108((int16_t *)x2128,(int16_t *)ytmp128,1); + dft108((int16_t *)(x2128+108),(int16_t *)(ytmp128+108),1); + dft108((int16_t *)(x2128+216),(int16_t *)(ytmp128+216),1); bfly3_tw1(ytmp128,ytmp128+108,ytmp128+216,y128,y128+108,y128+216); - for (i=1,j=0;i<96;i++,j++) { + for (i=1,j=0;i<108;i++,j++) { bfly3(ytmp128+i, ytmp128+108+i, ytmp128+216+i, @@ -6905,11 +6905,11 @@ void dft480(int16_t *x,int16_t *y,unsigned char scale_flag){ // 120 x 4 - for (i=0,j=0;i<240;i++,j+=4) { + for (i=0,j=0;i<120;i++,j+=4) { x2128[i] = x128[j]; - x2128[i+240] = x128[j+1]; - x2128[i+480] = x128[j+2]; - x2128[i+720] = x128[j+3]; + x2128[i+120] = x128[j+1]; + x2128[i+240] = x128[j+2]; + x2128[i+360] = x128[j+3]; } dft120((int16_t *)x2128,(int16_t *)ytmp128,1); @@ -7401,7 +7401,7 @@ end i=i+2; fprintf(fd,"%d,%d,%d,%d,%d,%d,%d,%d};\n",twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1),twb2(i),twb2(i+1)); fclose(fd); -*/ +*/ static int16_t twa576[191*2*4] = {32765,-358,32765,-358,32765,-358,32765,-358, 32759,-715,32759,-715,32759,-715,32759,-715, 32749,-1073,32749,-1073,32749,-1073,32749,-1073, @@ -7801,12 +7801,14 @@ void dft576(int16_t *x,int16_t *y,unsigned char scale_flag){ // 192 x 3 x2128[i+192] = x128[j+1]; x2128[i+384] = x128[j+2]; } + dft192((int16_t *)x2128,(int16_t *)ytmp128,1); dft192((int16_t *)(x2128+192),(int16_t *)(ytmp128+192),1); dft192((int16_t *)(x2128+384),(int16_t *)(ytmp128+384),1); - + bfly3_tw1(ytmp128,ytmp128+192,ytmp128+384,y128,y128+192,y128+384); + for (i=1,j=0;i<192;i++,j++) { bfly3(ytmp128+i, ytmp128+192+i, @@ -7816,8 +7818,7 @@ void dft576(int16_t *x,int16_t *y,unsigned char scale_flag){ // 192 x 3 y128+384+i, twa128+j, twb128+j); - } - + } if (scale_flag==1) { norm128 = _mm_set1_epi16(dft_norm_table[14]); @@ -7828,7 +7829,6 @@ void dft576(int16_t *x,int16_t *y,unsigned char scale_flag){ // 192 x 3 _mm_empty(); _m_empty(); - }; /* Twiddles generated with @@ -8659,9 +8659,9 @@ void dft648(int16_t *x,int16_t *y,unsigned char scale_flag){ // 216 x 3 x2128[i+432] = x128[j+2]; } - dft96((int16_t *)x2128,(int16_t *)ytmp128,1); - dft96((int16_t *)(x2128+216),(int16_t *)(ytmp128+216),1); - dft96((int16_t *)(x2128+432),(int16_t *)(ytmp128+432),1); + dft216((int16_t *)x2128,(int16_t *)ytmp128,1); + dft216((int16_t *)(x2128+216),(int16_t *)(ytmp128+216),1); + dft216((int16_t *)(x2128+432),(int16_t *)(ytmp128+432),1); bfly3_tw1(ytmp128,ytmp128+216,ytmp128+432,y128,y128+216,y128+432); for (i=1,j=0;i<216;i++,j++) { @@ -9929,7 +9929,7 @@ void dft864(int16_t *x,int16_t *y,unsigned char scale_flag){ // 288 x 3 for (i=0,j=0;i<288;i++,j+=3) { x2128[i] = x128[j]; x2128[i+288] = x128[j+1]; - x2128[i+288] = x128[j+2]; + x2128[i+576] = x128[j+2]; } dft288((int16_t *)x2128,(int16_t *)ytmp128,1); @@ -12911,7 +12911,7 @@ void dft1080(int16_t *x,int16_t *y,unsigned char scale_flag){ // 360 x 3 for (i=0,j=0;i<360;i++,j+=3) { x2128[i] = x128[j]; x2128[i+360] = x128[j+1]; - x2128[i+360] = x128[j+2]; + x2128[i+720] = x128[j+2]; } dft360((int16_t *)x2128,(int16_t *)ytmp128,1); diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c index da810c64919..05143d23f88 100755 --- a/openair1/SCHED/phy_procedures_lte_common.c +++ b/openair1/SCHED/phy_procedures_lte_common.c @@ -152,7 +152,7 @@ u8 get_Msg3_harq_pid(LTE_DL_FRAME_PARMS *frame_parms, u32 ul_frame; if (frame_parms->frame_type ==FDD) { - ul_subframe = (current_subframe>4) ? (current_subframe-4) : (current_subframe+6); + ul_subframe = (current_subframe>3) ? (current_subframe-4) : (current_subframe+6); ul_frame = (current_subframe>3) ? (frame+1) : frame; } else { diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 137fabe619a..6cb132b4661 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -1054,9 +1054,9 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 if (next_slot == 0) { // First half of PSS/SSS (FDD) - if (phy_vars_eNB->lte_frame_parms.frame_type == 0) { + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - 4*AMP, + AMP, &phy_vars_eNB->lte_frame_parms, (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, next_slot); @@ -1169,10 +1169,10 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 if (abstraction_flag==0) { - if (phy_vars_eNB->lte_frame_parms.frame_type == 1) { + if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) { // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1); generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - 4*AMP, + AMP, &phy_vars_eNB->lte_frame_parms, 2, next_slot); @@ -1185,9 +1185,9 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 if (abstraction_flag==0) { - if (phy_vars_eNB->lte_frame_parms.frame_type == 0) { + if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - 4*AMP, + AMP, &phy_vars_eNB->lte_frame_parms, (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5, next_slot); @@ -1221,7 +1221,7 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 if (phy_vars_eNB->lte_frame_parms.frame_type == 1) { // printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1); generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id], - 4*AMP, + AMP, &phy_vars_eNB->lte_frame_parms, 2, next_slot); @@ -1818,7 +1818,7 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PDSCH %x/%d] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %d, G %d, nb_rb %d, mcs %d, pmi_alloc %x, Ndi %d, rv %d (round %d)\n", + LOG_I(PHY,"[eNB %d][PDSCH %x/%d] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %d, G %d, nb_rb %d, mcs %d, pmi_alloc %x, rv %d (round %d)\n", phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti,harq_pid, phy_vars_eNB->frame, next_slot>>1, input_buffer_length, get_G(&phy_vars_eNB->lte_frame_parms, @@ -1828,14 +1828,13 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1), phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb, phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs, - pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->pmi_alloc), - phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->Ndi, + pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->pmi_alloc), phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->rvidx, phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->round); #endif phy_vars_eNB->eNB_UE_stats[(u8)UE_id].dlsch_sliding_cnt++; - if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->harq_processes[harq_pid]->Ndi == 1) { + if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->harq_processes[harq_pid]->round == 0) { phy_vars_eNB->eNB_UE_stats[(u32)UE_id].dlsch_trials[0]++; @@ -2674,12 +2673,11 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 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; #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, Ndi %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", + LOG_I(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,last_slot>>1, 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]->Ndi, 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, diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 38341645d25..091afe622c9 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -270,7 +270,7 @@ void phy_reset_ue(u8 Mod_id,u8 eNB_index) { for(k=0;k<NUMBER_OF_HARQ_PID_MAX && phy_vars_ue->ulsch_ue[i]->harq_processes[k];k++) { phy_vars_ue->ulsch_ue[i]->harq_processes[k]->status = SCH_IDLE; //Set NDIs for all UL HARQs to 0 - phy_vars_ue->ulsch_ue[i]->harq_processes[k]->Ndi = 0; + // phy_vars_ue->ulsch_ue[i]->harq_processes[k]->Ndi = 0; } } @@ -300,8 +300,10 @@ void ra_succeeded(u8 Mod_id,u8 eNB_index) { PHY_vars_UE_g[Mod_id]->UE_mode[eNB_index] = PUSCH; for (i=0;i<8;i++) { - if (PHY_vars_UE_g[Mod_id]->ulsch_ue[eNB_index]->harq_processes[i]) + if (PHY_vars_UE_g[Mod_id]->ulsch_ue[eNB_index]->harq_processes[i]) { PHY_vars_UE_g[Mod_id]->ulsch_ue[eNB_index]->harq_processes[i]->status=IDLE; + PHY_vars_UE_g[Mod_id]->dlsch_ue[eNB_index][0]->harq_processes[i]->round=0; + } } @@ -702,7 +704,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs phy_vars_ue->tx_power_dBm = UE_TX_POWER; #endif LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d harq pid %d, Po_PUSCH : %d dBm\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame,next_slot>>1,harq_pid, phy_vars_ue->tx_power_dBm); + phy_vars_ue->Mod_id,harq_pid,(((next_slot>>1)==0)?1:0)+phy_vars_ue->frame,next_slot>>1,harq_pid, phy_vars_ue->tx_power_dBm); // deactivate service request phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0; @@ -723,11 +725,10 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs #ifdef DEBUG_PHY_PROC - LOG_I(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d Generating PUSCH : first_rb %d, nb_rb %d, round %d, Ndi %d, mcs %d, rv %d, cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame,next_slot>>1, + LOG_I(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d\n", + phy_vars_ue->Mod_id,harq_pid,(((next_slot>>1)==0)?1:0)+phy_vars_ue->frame,next_slot>>1, first_rb,nb_rb, phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->Ndi, phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->mcs, phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->rvidx, (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift+ @@ -765,10 +766,10 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs // debug_LOG_D(PHY,"[UE %d] Frame %d, Subframe %d ulsch harq_pid %d : O %d, O_ACK %d, O_RI %d, TBS %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,next_slot>>1,harq_pid,phy_vars_ue->ulsch_ue[eNB_id]->O,phy_vars_ue->ulsch_ue[eNB_id]->O_ACK,phy_vars_ue->ulsch_ue[eNB_id]->O_RI,phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->TBS); //#endif if (Msg3_flag == 1) { - LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d next slot %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, Ndi %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,next_slot>>1, next_slot, + LOG_I(PHY,"[UE %d][RAPROC] Frame %d, Subframe %d next slot %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, round %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",phy_vars_ue->Mod_id,(((next_slot>>1)==0)?1:0)+phy_vars_ue->frame,next_slot>>1, next_slot, phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->nb_rb, phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->first_rb, - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->Ndi, + phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round, phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->rvidx, phy_vars_ue->prach_resources[eNB_id]->Msg3[0], phy_vars_ue->prach_resources[eNB_id]->Msg3[1], @@ -810,7 +811,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs #ifdef OPENAIR2 // LOG_D(PHY,"[UE %d] ULSCH : Searching for MAC SDUs\n",phy_vars_ue->Mod_id); - if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->Ndi==1) { + if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round==0) { //if (phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) { access_mode=SCHEDULED_ACCESS; mac_xface->ue_get_sdu(phy_vars_ue->Mod_id, @@ -896,7 +897,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs phy_vars_ue->tx_power_dBm = UE_TX_POWER; #endif LOG_I(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm, amp %d\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame,next_slot>>1,phy_vars_ue->tx_power_dBm, + phy_vars_ue->Mod_id,harq_pid,(((next_slot>>1)==0)?1:0)+phy_vars_ue->frame,next_slot>>1,phy_vars_ue->tx_power_dBm, #ifdef EXMIMO get_tx_amp(phy_vars_ue->tx_power_dBm,phy_vars_ue->tx_power_max_dBm) #else @@ -1874,7 +1875,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0; phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->status = IDLE; phy_vars_ue->ulsch_ue_Msg3_active[eNB_id] = 0; - phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->Ndi = 1; + phy_vars_ue->ulsch_ue[eNB_id]->harq_processes[harq_pid]->round = 0; LOG_D(PHY,"Msg3 inactive\n"); /* Phich is not abstracted for the moment if (PHY_vars_eNB_g[i]->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->phich_ACK==0) { // NAK @@ -2013,6 +2014,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",phy_vars_ue->Mod_id,dci_alloc_rx[i].format); + dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); #endif // we received a CRNTI, so we're in PUSCH @@ -2411,7 +2413,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 phy_vars_ue->Mod_id, phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, harq_pid, - phy_vars_ue->frame,last_slot>>1); + phy_vars_ue->frame,((last_slot>>1)==0)?9:(last_slot>>1)-1); #endif if (phy_vars_ue->dlsch_ue[eNB_id][0]) { @@ -2456,7 +2458,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d)\n", phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - harq_pid,phy_vars_ue->frame,last_slot>>1, + harq_pid,phy_vars_ue->frame,((last_slot>>1)==0)?9:(last_slot>>1)-1, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs); @@ -2467,7 +2469,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 else { LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH (rv %d,mcs %d,TBS %d)\n", phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti, - harq_pid,phy_vars_ue->frame,last_slot>>1, + harq_pid,phy_vars_ue->frame,((last_slot>>1)==0)?9:(last_slot>>1)-1, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); @@ -2499,7 +2501,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8 LOG_I(PHY,"[UE %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n", phy_vars_ue->Mod_id, phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid, - phy_vars_ue->frame,last_slot>>1,ret, + phy_vars_ue->frame,((last_slot>>1)==0)?9:(last_slot>>1)-1,ret, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c index afc95160490..bc0b3d8e5f9 100644 --- a/openair1/SCHED/pusch_pc.c +++ b/openair1/SCHED/pusch_pc.c @@ -94,8 +94,8 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,u8 subframe,u8 eNB_id,u8 j, u8 ab phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH += (mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id) + PL); - LOG_I(PHY,"[UE %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,%d,%d,%d)\n", - phy_vars_ue->Mod_id,phy_vars_ue->frame,subframe,phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, + LOG_D(PHY,"[UE %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,%d,%d,%d)\n", + phy_vars_ue->Mod_id,((subframe==0)?1:0)+phy_vars_ue->frame,subframe,phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, 100*mac_xface->get_Po_NOMINAL_PUSCH(phy_vars_ue->Mod_id), hundred_times_log10_NPRB[nb_rb-1], 100*PL, @@ -116,15 +116,15 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,u8 subframe,u8 eNB_id,u8 j, u8 ab phy_vars_ue->ulsch_ue[eNB_id]->PHR = 40; LOG_D(PHY,"[UE %d][PUSCH %d] frame %d, subframe %d: Po_PUSCH %d dBm : Po_NOMINAL_PUSCH %d,log10(NPRB) %f,PHR %d, PL %d, alpha*PL %f,delta_IF %f,f_pusch %d\n", - phy_vars_ue->Mod_id,harq_pid,phy_vars_ue->frame,subframe, - phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, - phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH, - hundred_times_log10_NPRB[nb_rb-1]/100.0, - phy_vars_ue->ulsch_ue[eNB_id]->PHR, - PL, - alpha_lut[phy_vars_ue->lte_frame_parms.ul_power_control_config_common.alpha]*PL/100.0, - get_hundred_times_delta_IF(phy_vars_ue,eNB_id,harq_pid)/100.0, - phy_vars_ue->ulsch_ue[eNB_id]->f_pusch); + phy_vars_ue->Mod_id,harq_pid,((subframe==0)?1:0) + phy_vars_ue->frame,subframe, + phy_vars_ue->ulsch_ue[eNB_id]->Po_PUSCH, + phy_vars_ue->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH, + hundred_times_log10_NPRB[nb_rb-1]/100.0, + phy_vars_ue->ulsch_ue[eNB_id]->PHR, + PL, + alpha_lut[phy_vars_ue->lte_frame_parms.ul_power_control_config_common.alpha]*PL/100.0, + get_hundred_times_delta_IF(phy_vars_ue,eNB_id,harq_pid)/100.0, + phy_vars_ue->ulsch_ue[eNB_id]->f_pusch); } } diff --git a/openair1/SIMULATION/LTE_PHY/Makefile b/openair1/SIMULATION/LTE_PHY/Makefile index c8da213b4a4..f525d2dd1fd 100644 --- a/openair1/SIMULATION/LTE_PHY/Makefile +++ b/openair1/SIMULATION/LTE_PHY/Makefile @@ -10,7 +10,7 @@ OPENAIR1_TOP = $(OPENAIR1_DIR) OPENAIR2_TOP = $(OPENAIR2_DIR) OPENAIR3 = $(OPENAIR3_DIR) -CFLAGS = -g -O2 -Wno-strict-aliasing -rdynamic -Wall -DPHYSIM -DNODE_RG -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1 $(CPUFLAGS) -DMALLOC_CHECK_=1 # -Wno-packed-bitfield-compat +CFLAGS = -g -O2 -Wno-strict-aliasing -rdynamic -Wall -DPHYSIM -DNODE_RG -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 -DPHY_CONTEXT=1 $(CPUFLAGS) -DMALLOC_CHECK_=1 -DENABLE_VCD_FIFO # -Wno-packed-bitfield-compat # DCI Debug diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index c2a7235f1f0..a9e23cb21b0 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -1294,7 +1294,7 @@ int main(int argc, char **argv) { if (common_flag == 0) { if (round == 0) { // First round, set Ndi to 1 and rv to floor(round - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Ndi = 1; + //PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Ndi = 1; PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3; if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { @@ -1368,7 +1368,7 @@ int main(int argc, char **argv) { } } else { // set Ndi to 0 - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Ndi = 0; + //PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Ndi = 0; PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3; if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) { @@ -1481,7 +1481,7 @@ int main(int argc, char **argv) { tbs, get_Qm(PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->mcs), num_pdcch_symbols, - PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Ndi); + PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->round); // use the PMI from previous trial if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) { diff --git a/openair1/SIMULATION/LTE_PHY/pdcch_eval_results.m b/openair1/SIMULATION/LTE_PHY/pdcch_eval_results.m index 2b67e47032e..5a785dd6a3b 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcch_eval_results.m +++ b/openair1/SIMULATION/LTE_PHY/pdcch_eval_results.m @@ -1,33 +1,35 @@ -set(0, 'DefaultLineMarkerSize', 10); -set(0, 'Defaultaxesfontsize', 14); -set(0, 'DefaultLineLineWidth', 2); -plot_style = {'b-o';'r-x';'g-d';'y-*';'k-s'}; - -SNR = -5:0.2:2.8; -C = zeros(length(SNR),4); -filebase = 'pdcch_fdd_10_siso_awgn_ic_format0'; - -figure(1) -hold off -for L=0:3 - fid = fopen(sprintf('%s_L%d.txt',filebase,L),'r'); - [A,c]=fscanf(fid,'SNR %f : n_errors_ul = %d/%d (%f)\n'); - fclose(fid); - - B = reshape(A,4,40).'; - C(:,L+1) = B(:,4); - - semilogy(B(:,1),B(:,4),plot_style{L+1}) - hold on - - legend_str{L+1} = sprintf('L=%d',L); -end - -%% -h = legend(legend_str); -set(h,'Fontsize',14); -title(filebase,'Fontsize',16,'Interpreter','none') -xlabel('SNR','Fontsize',14) -ylabel('BLER','Fontsize',14) -grid on -saveas(gcf, filebase, 'eps'); \ No newline at end of file +set(0, 'DefaultLineMarkerSize', 10); +set(0, 'Defaultaxesfontsize', 14); +set(0, 'DefaultLineLineWidth', 2); +plot_style = {'b-o';'r-x';'g-d';'y-*';'k-s'}; + +SNR = -5:0.2:2.8; +C = zeros(length(SNR),4); +filebase = 'pdcch_fdd_5_siso_awgn_format0'; + +figure(1) +hold off +for L=0:3 + printf("Opening %s\n",sprintf('%s_L%d.txt',filebase,L)); + fid = fopen(sprintf('%s_L%d.txt',filebase,L),'r'); + printf("fid %d\n",fid); + [A,c]=fscanf(fid,'SNR %f : n_errors_ul = %d/%d (%f)\n'); + fclose(fid); + + B = reshape(A,4,40).'; + C(:,L+1) = B(:,4); + + semilogy(B(:,1),B(:,4),plot_style{L+1}) + hold on + + legend_str{L+1} = sprintf('L=%d',L); +end + +%% +h = legend(legend_str); +set(h,'Fontsize',14); +title(filebase,'Fontsize',16,'Interpreter','none') +xlabel('SNR','Fontsize',14) +ylabel('BLER','Fontsize',14) +grid on +saveas(gcf, filebase, 'eps'); diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 1f5f975a440..b8a7854c80c 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -7,9 +7,7 @@ #include "PHY/defs.h" #include "PHY/vars.h" #include "MAC_INTERFACE/vars.h" -#ifdef IFFT_FPGA -#include "PHY/LTE_REFSIG/mod_table.h" -#endif + #ifdef EMOS #include "SCHED/phy_procedures_emos.h" #endif @@ -24,7 +22,7 @@ #include "PHY/TOOLS/lte_phy_scope.h" #endif -#define BW 10.0 + #define N_TRIALS 100 PHY_VARS_eNB *PHY_vars_eNB,*PHY_vars_eNB1,*PHY_vars_eNB2; @@ -62,7 +60,7 @@ void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmi lte_frame_parms->nb_antennas_tx_eNB = N_tx; lte_frame_parms->nb_antennas_tx = N_tx; lte_frame_parms->nb_antennas_rx = N_rx; - lte_frame_parms->phich_config_common.phich_resource = oneSixth; //half + lte_frame_parms->phich_config_common.phich_resource = one;//oneSixth; //half lte_frame_parms->tdd_config = tdd_config; lte_frame_parms->frame_type = frame_type; @@ -426,7 +424,7 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,u8 log2L, u8 log2Lcommon, u break; } } - /* + // add common dci DCI_pdu.dci_alloc[0].dci_length = BCCH_pdu_size_bits; DCI_pdu.dci_alloc[0].L = log2Lcommon; @@ -444,13 +442,13 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,u8 log2L, u8 log2Lcommon, u DCI_pdu.dci_alloc[1].ra_flag = 0; memcpy((void*)&DCI_pdu.dci_alloc[1].dci_pdu[0], &DLSCH_alloc_pdu[0], dci_length_bytes); DCI_pdu.Num_ue_spec_dci++; - */ + - DCI_pdu.dci_alloc[0].dci_length = UL_pdu_size_bits; - DCI_pdu.dci_alloc[0].L = log2L; - DCI_pdu.dci_alloc[0].rnti = rnti; - DCI_pdu.dci_alloc[0].format = format0; - DCI_pdu.dci_alloc[0].ra_flag = 0; + DCI_pdu.dci_alloc[2].dci_length = UL_pdu_size_bits; + DCI_pdu.dci_alloc[2].L = log2L; + DCI_pdu.dci_alloc[2].rnti = rnti; + DCI_pdu.dci_alloc[2].format = format0; + DCI_pdu.dci_alloc[2].ra_flag = 0; memcpy((void*)&DCI_pdu.dci_alloc[0].dci_pdu[0], &UL_alloc_pdu[0], UL_pdu_size_bytes); DCI_pdu.Num_ue_spec_dci++; @@ -462,6 +460,8 @@ DCI_PDU *get_dci(LTE_DL_FRAME_PARMS *lte_frame_parms,u8 log2L, u8 log2Lcommon, u return(&DCI_pdu); } +extern int QPSK[4],QPSK2[4]; + int main(int argc, char **argv) { char c; @@ -469,9 +469,7 @@ int main(int argc, char **argv) { int i,l,aa; double sigma2, sigma2_dB=0,SNR,snr0=-2.0,snr1; //mod_sym_t **txdataF; -#ifdef IFFT_FPGA - int **txdataF2; -#endif + int **txdata; double **s_re,**s_im,**r_re,**r_im; double iqim=0.0; @@ -519,10 +517,13 @@ int main(int argc, char **argv) { u8 num_phich_interf = 0; lte_frame_type_t frame_type=TDD; - + int re_offset; + uint32_t *txptr; + int aarx; #ifdef PERFECT_CE - int k, aarx; + int k; #endif + double BW=5.0; number_of_cards = 1; openair_daq_vars.rx_rf_mode = 1; @@ -752,23 +753,7 @@ int main(int argc, char **argv) { frame_parms = &PHY_vars_eNB->lte_frame_parms; get_dci(frame_parms, log2L, log2Lcommon, format_selector, n_rnti); -#ifdef IFFT_FPGA - txdata = (int **)malloc16(2*sizeof(int*)); - txdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES); - txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES); - - bzero(txdata[0],FRAME_LENGTH_BYTES); - bzero(txdata[1],FRAME_LENGTH_BYTES); - - txdataF2 = (int **)malloc16(2*sizeof(int*)); - txdataF2[0] = (int *)malloc16(FRAME_LENGTH_BYTES_NO_PREFIX); - txdataF2[1] = (int *)malloc16(FRAME_LENGTH_BYTES_NO_PREFIX); - - bzero(txdataF2[0],FRAME_LENGTH_BYTES_NO_PREFIX); - bzero(txdataF2[1],FRAME_LENGTH_BYTES_NO_PREFIX); -#else txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[eNb_id]; -#endif s_re = malloc(2*sizeof(double*)); s_im = malloc(2*sizeof(double*)); @@ -781,6 +766,21 @@ int main(int argc, char **argv) { subframe,NUMBER_OF_OFDM_CARRIERS, PHY_vars_eNB->lte_frame_parms.Ncp,PHY_vars_eNB->lte_frame_parms.samples_per_tti,nsymb); + switch (N_RB_DL) { + case 6: + BW = 1.25; + break; + case 25: + BW = 5.00; + break; + case 50: + BW = 10.00; + break; + case 100: + BW = 20.00; + break; + } + eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB, PHY_vars_UE->lte_frame_parms.nb_antennas_rx, channel_model, @@ -855,15 +855,23 @@ int main(int argc, char **argv) { for (trial=0; trial<n_frames; trial++) { - - + // 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++) { -#ifdef IFFT_FPGA - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,NUMBER_OF_USEFUL_CARRIERS*NUMBER_OF_SYMBOLS_PER_FRAME*sizeof(mod_sym_t)); -#else - memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(mod_sym_t)); -#endif + memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(mod_sym_t)); + + + re_offset = PHY_vars_eNB->lte_frame_parms.first_carrier_offset; + txptr = (uint32_t*)&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti]; + for (i=0;i<PHY_vars_eNB->lte_frame_parms.N_RB_DL*6;i++) { + txptr[re_offset++] = QPSK[taus()&3]; + //printf("%i => %d,%d\n",re_offset-1,*(s16_t*)&txptr[re_offset-1],*(1+(s16_t*)&txptr[re_offset-1])); + } + re_offset=1; //skip DC + for (i=0;i<PHY_vars_eNB->lte_frame_parms.N_RB_DL*6;i++) + txptr[re_offset++] = QPSK[taus()&3]; } + + generate_pilots_slot(PHY_vars_eNB, PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id], 1024, @@ -874,12 +882,7 @@ int main(int argc, char **argv) { 1024, (subframe*2)+1, 0); - /* - generate_pilots(PHY_vars_eNB, - PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id], - 1024, - LTE_NUMBER_OF_SUBFRAMES_PER_FRAME); - */ + if (input_fd == NULL) { numCCE=0; @@ -924,8 +927,10 @@ int main(int argc, char **argv) { if (n_frames==1) printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i,DCI_pdu.dci_alloc[i].rnti, DCI_pdu.dci_alloc[i].format, DCI_pdu.dci_alloc[i].L, DCI_pdu.dci_alloc[i].nCCE, DCI_pdu.nCCE, DCI_pdu.dci_alloc[i].dci_length); + if (DCI_pdu.dci_alloc[i].nCCE==-1) + exit(-1); } - + num_pdcch_symbols = generate_dci_top(DCI_pdu.Num_ue_spec_dci, DCI_pdu.Num_common_dci, DCI_pdu.dci_alloc, @@ -934,7 +939,7 @@ int main(int argc, char **argv) { &PHY_vars_eNB->lte_frame_parms, PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id], subframe); - + if (n_frames==1) printf("num_pdcch_symbols at TX %d\n",num_pdcch_symbols); @@ -987,55 +992,11 @@ int main(int argc, char **argv) { } // write_output("pilotsF.m","rsF",txdataF[0],lte_PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); -#ifdef IFFT_FPGA - if (n_frames==1) { - write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][0],12*PHY_vars_UE->lte_frame_parms.N_RB_DL*120,1,4); - if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB > 1) - write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][1],12*PHY_vars_UE->lte_frame_parms.N_RB_DL*120,1,4); - } - // do talbe lookup and write results to txdataF2 - for (aa=0;aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB;aa++) { - l = 0; - for (i=0;i<FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX;i++) - if ((i%512>=1) && (i%512<=150)) - txdataF2[aa][i] = ((int*)mod_table)[PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][l++]]; - else if (i%512>=362) - txdataF2[aa][i] = ((int*)mod_table)[PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][l++]]; - else - txdataF2[aa][i] = 0; - //printf("l=%d\n",l); - } - if (n_frames==1) { - write_output("txsigF20.m","txsF20", txdataF2[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - //write_output("txsigF21.m","txsF21", txdataF2[1],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1); - } - - tx_lev=0; - - for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB; aa++) { - - if (PHY_vars_eNB->lte_frame_parms.Ncp == 1) - PHY_ofdm_mod(&txdataF2[aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], // input - &txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], // output - PHY_vars_eNB->lte_frame_parms.log2_symbol_size, // log2_fft_size - 2*nsymb, // number of symbols - PHY_vars_eNB->lte_frame_parms.nb_prefix_samples, // number of prefix samples - PHY_vars_eNB->lte_frame_parms.twiddle_ifft, // IFFT twiddle factors - PHY_vars_eNB->lte_frame_parms.rev, // bit-reversal permutation - CYCLIC_PREFIX); - else { - normal_prefix_mod(&txdataF2[aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], - &txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti],2*nsymb,frame_parms); - } - tx_lev += signal_energy(&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], - PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size); - } -#else if (n_frames==1) - write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][0],2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][0],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB > 1) - write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][1],2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); + write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][1],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1); tx_lev = 0; @@ -1061,8 +1022,6 @@ int main(int argc, char **argv) { tx_lev += signal_energy(&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti], PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size); } -#endif - tx_lev_dB = (unsigned int) dB_fixed(tx_lev); } @@ -1076,8 +1035,16 @@ int main(int argc, char **argv) { s_im[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); } else { - r_re[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); - r_im[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); + for (aarx=0;aarx<PHY_vars_UE->lte_frame_parms.nb_antennas_rx;aarx++) { + if (aa==0) { + r_re[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); + r_im[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); + } + else { + r_re[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]); + r_im[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]); + } + } } } } @@ -1101,7 +1068,7 @@ int main(int argc, char **argv) { sigma2 = pow(10,sigma2_dB/10); // printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB); for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) { - for (aa=0;aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx;aa++) { + for (aa=0;aa<PHY_vars_UE->lte_frame_parms.nb_antennas_rx;aa++) { ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i] = (short) (.667*(r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1] = (short) (.667*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0))); @@ -1180,7 +1147,7 @@ int main(int argc, char **argv) { if (is_phich_subframe(&PHY_vars_UE->lte_frame_parms,subframe)) { PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms,0,subframe)]->status = ACTIVE; - PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms,0,subframe)]->Ndi = 1; + //PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms,0,subframe)]->Ndi = 1; rx_phich(PHY_vars_UE, subframe, 0); @@ -1237,20 +1204,21 @@ int main(int argc, char **argv) { if (PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols) n_errors_cfi++; - + /* if (is_phich_subframe(&PHY_vars_UE->lte_frame_parms,subframe)) if (PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms, PHY_vars_UE->frame, subframe)]->Ndi != phich_ACK) n_errors_hi++; +*/ - if (n_errors_cfi > 0) + if (n_errors_cfi > 10) break; } } // symbol loop - if (n_errors_cfi > 0) + if (n_errors_cfi > 100) break; - if ((n_errors_ul>100) && (n_errors_dl>100) && (n_errors_common>100)) + if ((n_errors_ul>1000) && (n_errors_dl>1000) && (n_errors_common>1000)) break; #ifdef XFORMS @@ -1275,6 +1243,10 @@ int main(int argc, char **argv) { write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1); write_output("rxsig0.m","rxs0", PHY_vars_UE->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1); write_output("rxsigF0.m","rxsF0", PHY_vars_UE->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + if (n_rx>1) { + write_output("rxsig1.m","rxs1", PHY_vars_UE->lte_ue_common_vars.rxdata[1],10*frame_parms->samples_per_tti,1,1); + write_output("rxsigF1.m","rxsF1", PHY_vars_UE->lte_ue_common_vars.rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1); + } write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); if (n_tx==2) write_output("H10.m","h10",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1); @@ -1283,15 +1255,6 @@ int main(int argc, char **argv) { write_output("pdcch_rxF_llr.m","pdcch_llr",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->llr,2400,1,4); } -#ifdef IFFT_FPGA - free(txdataF2[0]); - free(txdataF2[1]); - free(txdataF2); - free(txdata[0]); - free(txdata[1]); - free(txdata); -#endif - for (i=0;i<2;i++) { free(s_re[i]); free(s_im[i]); diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c index a10cf010905..9c74b1b331e 100644 --- a/openair1/SIMULATION/LTE_PHY/ulsim.c +++ b/openair1/SIMULATION/LTE_PHY/ulsim.c @@ -798,15 +798,15 @@ int main(int argc, char **argv) { // printf("Trial %d : Round %d ",trials,round); round_trials[round]++; if (round == 0) { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 1; + //PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 1; PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->rvidx = round>>1; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 1; + //PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 1; PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->rvidx = round>>1; } else { - PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 0; + //PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 0; PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->rvidx = round>>1; - PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 0; + //PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 0; PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->rvidx = round>>1; } diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index 079f4d83ab0..a8b4a95a234 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -467,7 +467,10 @@ typedef struct{ typedef struct{ /// C-RNTI of UE u16 rnti; - + /// NDI from last scheduling + uint8_t oldNDI[8]; + /// NDI from last UL scheduling + uint8_t oldNDI_UL[8]; /// Flag to indicate UL has been scheduled at least once int ul_active; diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c index c5a60f077bf..47ca37dd41c 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler.c +++ b/openair2/LAYER2/MAC/eNB_scheduler.c @@ -385,11 +385,15 @@ u8 find_num_active_UEs_in_cbagroup(unsigned char Mod_id, unsigned char group_id) } #endif s8 add_new_ue(unsigned char Mod_id, u16 rnti) { - unsigned char i; + int i,j; for (i=0;i<NUMBER_OF_UE_MAX;i++) { if (eNB_mac_inst[Mod_id].UE_template[i].rnti==0) { eNB_mac_inst[Mod_id].UE_template[i].rnti=rnti; + for (j=0;j<8;j++) { + eNB_mac_inst[Mod_id].UE_template[i].oldNDI[j]=1; + eNB_mac_inst[Mod_id].UE_template[i].oldNDI_UL[j]=1; + } eNB_ulsch_info[Mod_id][i].status = S_UL_WAITING; eNB_dlsch_info[Mod_id][i].status = S_UL_WAITING; LOG_D(MAC,"[eNB] Add UE_id %d : rnti %x\n",i,eNB_mac_inst[Mod_id].UE_template[i].rnti); @@ -1629,6 +1633,7 @@ void schedule_RA(unsigned char Mod_id,u32 frame, unsigned char subframe,unsigned // Compute MCS for 3 PRB msg4_header = 1+6+1; // CR header, CR CE, SDU header + if (mac_xface->lte_frame_parms->frame_type == TDD) { switch (mac_xface->lte_frame_parms->N_RB_DL) { @@ -2206,23 +2211,14 @@ void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, u cqi_req = 1; if (round > 0) { - ndi = 0; // if round != 0, it means the data is not new. ndi:new data indicator + ndi = eNB_mac_inst[Mod_id].UE_template[UE_id].oldNDI_UL[harq_pid]; + mcs = (round&3) + 28; //not correct for round==4! } else { - ndi = 1; - } - //if ((frame&1)==0) { - - // choose this later based on Power Headroom - if (ndi == 1) {// set mcs for first round + ndi = 1-eNB_mac_inst[Mod_id].UE_template[UE_id].oldNDI_UL[harq_pid]; + eNB_mac_inst[Mod_id].UE_template[UE_id].oldNDI_UL[harq_pid]=ndi; mcs = openair_daq_vars.target_ue_ul_mcs; } - else { // increment RV - if ((round&3)==0) - mcs = openair_daq_vars.target_ue_ul_mcs; // same as inital transmission - else - mcs = (round&3) + 28; //not correct for round==4! - } LOG_D(MAC,"[eNB %d] ULSCH scheduler: Ndi %d, mcs %d\n",Mod_id,ndi,mcs); @@ -2232,7 +2228,7 @@ void schedule_ulsch_rnti(u8 Mod_id, unsigned char cooperation_flag, u32 frame, u ((next_ue-1)*4),//openair_daq_vars.ue_ul_nb_rb), 4);//openair_daq_vars.ue_ul_nb_rb); } - else if ((ndi==1) && (mcs < 29)) { + else if ((round==0) && (mcs < 29)) { rb_table_index = 1; TBS = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]); buffer_occupancy = ((eNB_mac_inst[Mod_id].UE_template[UE_id].bsr_info[LCGID0] == 0) && @@ -2680,6 +2676,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; rballoc |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); add_common_dci(DCI_pdu, BCCH_alloc_pdu, @@ -2697,6 +2694,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; rballoc |= mac_xface->get_rballoc(0,((DCI1A_5MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); add_common_dci(DCI_pdu, BCCH_alloc_pdu, @@ -2714,6 +2712,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; rballoc |= mac_xface->get_rballoc(0,((DCI1A_10MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); add_common_dci(DCI_pdu, BCCH_alloc_pdu, @@ -2731,6 +2730,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rv = 1; ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->harq_pid = 0; ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->padding = 0; rballoc |= mac_xface->get_rballoc(0,((DCI1A_20MHz_TDD_1_6_t*)BCCH_alloc_pdu)->rballoc); add_common_dci(DCI_pdu, BCCH_alloc_pdu, @@ -2752,6 +2752,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; rballoc |= mac_xface->get_rballoc(0,((DCI1A_1_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); add_common_dci(DCI_pdu, @@ -2770,6 +2771,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; rballoc |= mac_xface->get_rballoc(0,((DCI1A_5MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); add_common_dci(DCI_pdu, @@ -2788,6 +2790,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; rballoc |= mac_xface->get_rballoc(0,((DCI1A_10MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); add_common_dci(DCI_pdu, @@ -2806,6 +2809,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rv = 1; ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->harq_pid = 0; ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->TPC = 1; + ((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->padding = 0; rballoc |= mac_xface->get_rballoc(0,((DCI1A_20MHz_FDD_t*)BCCH_alloc_pdu)->rballoc); add_common_dci(DCI_pdu, @@ -2853,6 +2857,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, ((DCI1A_1_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); @@ -2865,7 +2870,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); @@ -2878,7 +2883,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - + ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, ((DCI1A_10MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); @@ -2891,7 +2896,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - + ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, ((DCI1A_20MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); @@ -2904,7 +2909,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; - + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); @@ -2921,6 +2926,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); rballoc |= mac_xface->get_rballoc(((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, ((DCI1A_1_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); @@ -2933,6 +2939,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_UL,first_rb,4); rballoc |= mac_xface->get_rballoc(((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); @@ -2945,6 +2952,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); rballoc |= mac_xface->get_rballoc(((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, ((DCI1A_10MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); @@ -2957,6 +2965,7 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->mcs=0; ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->harq_pid=0; ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->TPC=1; + ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->padding=0; ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc = mac_xface->computeRIV(mac_xface->lte_frame_parms->N_RB_DL,first_rb,4); rballoc |= mac_xface->get_rballoc(((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->vrb_type, ((DCI1A_20MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu1[0])->rballoc); @@ -3124,9 +3133,9 @@ void fill_DLSCH_dci(unsigned char Mod_id,u32 frame, unsigned char subframe,u32 R if (round>0) { // we have to schedule a retransmission if (mac_xface->lte_frame_parms->frame_type == TDD) - ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->ndi=0; + ((DCI1A_5MHz_TDD_1_6_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->ndi=1; else - ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->ndi=0; + ((DCI1A_5MHz_FDD_t*)&eNB_mac_inst[Mod_id].RA_template[i].RA_alloc_pdu2[0])->ndi=1; // randomize frequency allocation for RA while (1) { first_rb = (unsigned char)(taus()%(mac_xface->lte_frame_parms->N_RB_DL-4)); @@ -3628,14 +3637,14 @@ void schedule_ue_spec(unsigned char Mod_id, switch (mac_xface->lte_frame_parms->N_RB_DL) { case 6: if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; + // ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs); } else { - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; + // ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs); @@ -3644,14 +3653,14 @@ void schedule_ue_spec(unsigned char Mod_id, break; case 25: if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; + // ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 0; ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = round&3; ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs); } else { - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; + // ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 0; ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = round&3; LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs); @@ -3660,14 +3669,14 @@ void schedule_ue_spec(unsigned char Mod_id, break; case 50: if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 0; + // ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 0; ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = round&3; ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs); } else { - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 0; + // ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 0; ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = round&3; LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs); @@ -3676,14 +3685,14 @@ void schedule_ue_spec(unsigned char Mod_id, break; case 100: if (mac_xface->lte_frame_parms->frame_type == TDD) { - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 0; + // ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 0; ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = round&3; ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, dai %d, mcs %d\n",Mod_id,harq_pid,round,(eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1),((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs); } else { - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 0; + // ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 0; ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = round&3; LOG_D(MAC,"[eNB %d] Retransmission : harq_pid %d, round %d, mcs %d\n",Mod_id,harq_pid,round,((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs); @@ -4018,35 +4027,36 @@ void schedule_ue_spec(unsigned char Mod_id, case 6: ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; ((DCI1_1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; break; case 25: ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; + LOG_D(MAC,"Format1 DCI: harq_pid %d, ndi %d\n",harq_pid,((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi); break; case 50: ((DCI1_10MHz_TDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_10MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_10MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_10MHz_TDD_t*)DLSCH_dci)->rv = 0; ((DCI1_10MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; break; case 100: ((DCI1_20MHz_TDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_20MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_20MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_20MHz_TDD_t*)DLSCH_dci)->rv = 0; ((DCI1_20MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; break; default: ((DCI1_5MHz_TDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_5MHz_TDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_5MHz_TDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_5MHz_TDD_t*)DLSCH_dci)->rv = 0; ((DCI1_5MHz_TDD_t*)DLSCH_dci)->dai = (eNB_mac_inst[Mod_id].UE_template[next_ue].DAI-1)&3; break; @@ -4057,31 +4067,31 @@ void schedule_ue_spec(unsigned char Mod_id, case 6: ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; break; case 25: ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; break; case 50: ((DCI1_10MHz_FDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_10MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_10MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_10MHz_FDD_t*)DLSCH_dci)->rv = 0; break; case 100: ((DCI1_20MHz_FDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_20MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_20MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_20MHz_FDD_t*)DLSCH_dci)->rv = 0; break; default: ((DCI1_5MHz_FDD_t*)DLSCH_dci)->mcs = mcs; ((DCI1_5MHz_FDD_t*)DLSCH_dci)->harq_pid = harq_pid; - ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1; + ((DCI1_5MHz_FDD_t*)DLSCH_dci)->ndi = 1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; ((DCI1_5MHz_FDD_t*)DLSCH_dci)->rv = 0; break; } @@ -4127,9 +4137,10 @@ void schedule_ue_spec(unsigned char Mod_id, ((DCI1E_5MHz_2A_M10PRB_TDD_t*)DLSCH_dci)->tpmi = 5; break; } - - - + // Toggle NDI for next time + LOG_D(MAC,"Frame %d, subframe %d: Toggling Format1 NDI for UE %d (rnti %x/%d) oldNDI %d\n",frame,subframe,next_ue, + eNB_mac_inst[Mod_id].UE_template[next_ue].rnti,harq_pid,eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]); + eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]=1-eNB_mac_inst[Mod_id].UE_template[next_ue].oldNDI[harq_pid]; } else { // There is no data from RLC or MAC header, so don't schedule @@ -4414,9 +4425,10 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf } else { if (mac_xface->lte_frame_parms->frame_type == FDD) { //FDD + schedule_RA(Mod_id,frame,subframe,0,&nprb,&nCCE); // schedule_ulsch(Mod_id,cooperation_flag,subframe,&nCCE,calibration_flag); // schedule_ue_spec(Mod_id,subframe,nprb,&nCCE,mbsfn_status); - // fill_DLSCH_dci(Mod_id,subframe,RBalloc,0,mbsfn_status); + fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,1,mbsfn_status); } } break; @@ -4429,9 +4441,9 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf schedule_SI(Mod_id,frame,&nprb,&nCCE); //schedule_RA(Mod_id,frame,subframe,5,&nprb,&nCCE); if ((mac_xface->lte_frame_parms->frame_type == FDD) ) { - schedule_RA(Mod_id,frame,subframe,1,&nprb,&nCCE); + // schedule_RA(Mod_id,frame,subframe,1,&nprb,&nCCE); //schedule_ulsch(Mod_id,cooperation_flag,subframe,&nCCE); - fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,1,mbsfn_status); + fill_DLSCH_dci(Mod_id,frame,subframe,RBalloc,0,mbsfn_status); } else if ((mac_xface->lte_frame_parms->tdd_config == 0) || // TDD Config 0 -- GitLab