phy_procedures_lte_eNb.c 146 KB
Newer Older
1
/*******************************************************************************
ghaddab's avatar
ghaddab committed
2 3
    OpenAirInterface 
    Copyright(c) 1999 - 2014 Eurecom
4

ghaddab's avatar
ghaddab committed
5 6 7 8
    OpenAirInterface is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
9 10


ghaddab's avatar
ghaddab committed
11 12 13 14
    OpenAirInterface is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
15

ghaddab's avatar
ghaddab committed
16 17 18 19
    You should have received a copy of the GNU General Public License
    along with OpenAirInterface.The full GNU General Public License is 
   included in this distribution in the file called "COPYING". If not, 
   see <http://www.gnu.org/licenses/>.
20 21

  Contact Information
ghaddab's avatar
ghaddab committed
22 23 24 25
  OpenAirInterface Admin: openair_admin@eurecom.fr
  OpenAirInterface Tech : openair_tech@eurecom.fr
  OpenAirInterface Dev  : openair4g-devel@eurecom.fr
  
ghaddab's avatar
ghaddab committed
26
  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
27

ghaddab's avatar
ghaddab committed
28
 *******************************************************************************/
29 30 31

/*! \file phy_procedures_lte_eNB.c
 * \brief Implementation of eNB procedures from 36.213 LTE specifications
32
 * \author R. Knopp, F. Kaltenberger, N. Nikaein
33 34 35
 * \date 2011
 * \version 0.1
 * \company Eurecom
36
 * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
 * \note
 * \warning
 */

#include "PHY/defs.h"
#include "PHY/extern.h"
#include "MAC_INTERFACE/defs.h"
#include "MAC_INTERFACE/extern.h"
#include "SCHED/defs.h"
#include "SCHED/extern.h"

#ifdef EMOS
#include "SCHED/phy_procedures_emos.h"
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
52
#define DEBUG_PHY_PROC
53 54 55 56 57 58 59 60 61
//#define DEBUG_ULSCH

//#ifdef OPENAIR2
#include "LAYER2/MAC/extern.h"
#include "LAYER2/MAC/defs.h"
#include "UTIL/LOG/log.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
//#endif

62 63
#include "assertions.h"

64
#if defined(ENABLE_ITTI)
Lionel Gauthier's avatar
Lionel Gauthier committed
65 66 67 68
#   include "intertask_interface.h"
#   if defined(ENABLE_RAL)
#     include "timer.h"
#   endif
69 70
#endif

71 72 73 74 75
//#define DIAG_PHY

#define NS_PER_SLOT 500000

#define PUCCH 1
76
#define PUCCH1_THRES 15
77
#define PUCCH1a_THRES 15
78 79 80

extern inline unsigned int taus(void);
extern int exit_openair;
81
//extern void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms);
82 83 84 85 86 87 88


unsigned char dlsch_input_buffer[2700] __attribute__ ((aligned(16)));
int eNB_sync_buffer0[640*6] __attribute__ ((aligned(16)));
int eNB_sync_buffer1[640*6] __attribute__ ((aligned(16)));
int *eNB_sync_buffer[2] = {eNB_sync_buffer0, eNB_sync_buffer1};

89
extern uint16_t hundred_times_log10_NPRB[100];
90 91 92 93 94 95 96 97 98 99 100 101 102

unsigned int max_peak_val; 
int max_sect_id, max_sync_pos;

//DCI_ALLOC_t dci_alloc[8];

#ifdef EMOS
fifo_dump_emos_eNB emos_dump_eNB;
#endif

#if defined(SMBV) && !defined(EXMIMO)
extern const char smbv_fname[];
extern unsigned short config_frames[4];
103
extern uint8_t smbv_frame_cnt;
104 105 106 107 108 109 110
#endif

#ifdef DIAG_PHY
extern int rx_sig_fifo;
#endif
static unsigned char I0_clear = 1;

Raymond Knopp's avatar
 
Raymond Knopp committed
111 112 113 114
uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t sched_subframe) {

  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
115
  
116
  LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking for SR TXOp(sr_ConfigIndex %d)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
117
	phy_vars_eNB->Mod_id,phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,
Raymond Knopp's avatar
 
Raymond Knopp committed
118
	phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex);
119
  
120
  if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 4) {        // 5 ms SR period
121 122
    if ((subframe%5) == phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex)
      return(1);
123 124
  }
  else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 14) {  // 10 ms SR period
125 126
    if (subframe==(phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5))
      return(1);
127 128
  }
  else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 34) { // 20 ms SR period
Raymond Knopp's avatar
 
Raymond Knopp committed
129
    if ((10*(frame&1)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15))
130
      return(1);
131 132
  }
  else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 74) { // 40 ms SR period
Raymond Knopp's avatar
 
Raymond Knopp committed
133
    if ((10*(frame&3)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35))
134
      return(1);
135 136
  }
  else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 154) { // 80 ms SR period
Raymond Knopp's avatar
 
Raymond Knopp committed
137
    if ((10*(frame&7)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75))
138
      return(1);
139 140 141 142
  }

  return(0);
}
143
 
144 145
int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB) {
  uint8_t i;
146

Raymond Knopp's avatar
 
Raymond Knopp committed
147
#ifdef DEBUG_PHY_PROC
148
  LOG_I(PHY,"[eNB %d] Adding UE with rnti %x\n",phy_vars_eNB->Mod_id,rnti);
Raymond Knopp's avatar
 
Raymond Knopp committed
149
#endif
150
  for (i=0;i<NUMBER_OF_UE_MAX;i++) {
151 152 153 154 155 156 157 158 159 160 161
    if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) {
      LOG_E(PHY,"Can't add UE, not enough memory allocated\n");
      return(-1);
    }
    else {
      if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) {
	LOG_I(PHY,"UE_id %d associated with rnti %x\n",i, rnti);
	phy_vars_eNB->dlsch_eNB[i][0]->rnti = rnti;
	phy_vars_eNB->ulsch_eNB[i]->rnti = rnti;
	phy_vars_eNB->eNB_UE_stats[i].crnti = rnti;
	return(i);
162
      }
163
    }
164 165 166 167
  }
  return(-1);
}

168 169
int32_t remove_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB, uint8_t abstraction_flag) {
  uint8_t i;
170

Raymond Knopp's avatar
 
Raymond Knopp committed
171
#ifdef DEBUG_PHY_PROC
172
  LOG_I(PHY,"eNB %d removing UE with rnti %x\n",phy_vars_eNB->Mod_id,rnti);
Raymond Knopp's avatar
 
Raymond Knopp committed
173
#endif
174
  for (i=0;i<NUMBER_OF_UE_MAX;i++) {
175 176 177 178 179 180 181 182 183 184 185
    if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) {
      LOG_E(PHY,"Can't remove UE, not enough memory allocated\n");
      return(-1);
    }
    else {
      if (phy_vars_eNB->eNB_UE_stats[i].crnti==rnti) {
	//msg("[PHY] UE_id %d\n",i);
	clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0], abstraction_flag);
	clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i],abstraction_flag);
	//phy_vars_eNB->eNB_UE_stats[i].crnti = 0;
	memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats));
Raymond Knopp's avatar
 
Raymond Knopp committed
186
	//	mac_exit_wrapper("Removing UE");	
187
	return(i);
188
      }
189
    }
190 191 192 193 194
  }

  return(-1);
}

195 196
int8_t find_next_ue_index(PHY_VARS_eNB *phy_vars_eNB) {
  uint8_t i;
197 198

  for (i=0;i<NUMBER_OF_UE_MAX;i++) {
199 200
    if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) {
      /*if ((phy_vars_eNB->dlsch_eNB[i]) && 
201 202
	(phy_vars_eNB->dlsch_eNB[i][0]) && 
	(phy_vars_eNB->dlsch_eNB[i][0]->rnti==0))*/ 
203 204 205
      LOG_D(PHY,"Next free UE id is %d\n",i);
      return(i);
    }
206 207 208 209
  }
  return(-1);
}

Raymond Knopp's avatar
 
Raymond Knopp committed
210
int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag) {
211 212 213

  LTE_eNB_DLSCH_t *DLSCH_ptr;  
  LTE_eNB_ULSCH_t *ULSCH_ptr;  
214 215 216
  //  uint8_t subframe_m4;
  uint8_t ulsch_subframe,ulsch_frame; 
  uint8_t i;
Raymond Knopp's avatar
 
Raymond Knopp committed
217
  int8_t UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id][CC_id]);
Raymond Knopp's avatar
 
Raymond Knopp committed
218 219
  //  int frame    = PHY_vars_eNB_g[Mod_id][CC_id]->proc[sched_subframe].frame_tx;
  //  int subframe = PHY_vars_eNB_g[Mod_id][CC_id]->proc[sched_subframe].subframe_tx;
220 221

  if (UE_id==-1) {
222 223 224
    LOG_E(PHY,"Cannot find UE with rnti %x\n",rnti);
    *round=0;
    return(-1);
225 226 227
  }

  if (ul_flag == 0)  {// this is a DL request
Raymond Knopp's avatar
 
Raymond Knopp committed
228
    DLSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->dlsch_eNB[(uint32_t)UE_id][0];
Raymond Knopp's avatar
 
Raymond Knopp committed
229
    /*
230
#ifdef DEBUG_PHY_PROC
231 232 233
    LOG_D(PHY,"[eNB %d] get_ue_active_harq_pid: Frame %d subframe %d, current harq_id %d\n",
	  Mod_id,frame,subframe,DLSCH_ptr->harq_ids[subframe]);
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
234
    */
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
    // switch on TDD or FDD configuration here later
    *harq_pid = DLSCH_ptr->harq_ids[subframe];
    if ((*harq_pid<DLSCH_ptr->Mdlharq) && 
	((DLSCH_ptr->harq_processes[*harq_pid]->round > 0))) {

      *round = DLSCH_ptr->harq_processes[*harq_pid]->round;
      LOG_D(PHY,"round %d\n",*round);
    
      //    else if ((subframe_m4==5) || (subframe_m4==6)) {
      //      *harq_pid = 0;//DLSCH_ptr->harq_ids[subframe_m4];//Ankit
      //     *round    = DLSCH_ptr->harq_processes[*harq_pid]->round;
      //    }
    }
    else {
      // get first free harq_pid (i.e. round 0)
      for (i=0;i<DLSCH_ptr->Mdlharq;i++) {
	if (DLSCH_ptr->harq_processes[i]!=NULL) {
	  if (DLSCH_ptr->harq_processes[i]->status != ACTIVE) {
	    *harq_pid = i;//0;//i; //(Ankit)
	    *round = 0;
	    return(0);
	  }
	  else {
	    LOG_D(PHY,"process %d is active\n",i);
	  }
	}
	else {
	  LOG_E(PHY,"[eNB %d] DLSCH process %d for rnti %x (UE_id %d) not allocated\n",Mod_id,i,rnti,UE_id);
	  return(-1);
	}
265
      }
266
    }
267 268 269
  }
  else {  // This is a UL request

Raymond Knopp's avatar
 
Raymond Knopp committed
270 271 272
    ULSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[(uint32_t)UE_id];
    ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,subframe);
    ulsch_frame    = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,frame,subframe);
273
    // Note this is for TDD configuration 3,4,5 only
Raymond Knopp's avatar
 
Raymond Knopp committed
274
    *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,
275 276 277 278
				  ulsch_frame,
				  ulsch_subframe);
    *round    = ULSCH_ptr->harq_processes[*harq_pid]->round;
    LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Checking HARQ, round %d\n",Mod_id,*harq_pid,frame,subframe,*round);
279 280 281 282 283 284 285 286 287 288 289 290 291 292
  }
  return(0);
}


int CCE_table[800];

void init_nCCE_table(void) {
  memset(CCE_table,0,800*sizeof(int));
}


int get_nCCE_offset(unsigned char L, int nCCE, int common_dci, unsigned short rnti, unsigned char subframe) {

293
  int search_space_free,m,nb_candidates = 0,l,i;
294 295 296 297 298 299
  unsigned int Yk;
  /*
    printf("CCE Allocation: ");
    for (i=0;i<nCCE;i++)
    printf("%d.",CCE_table[i]);
    printf("\n");
300
  */
301
  if (common_dci == 1) {
302 303 304 305 306 307 308 309 310
    // check CCE(0 ... L-1)
    nb_candidates = (L==4) ? 4 : 2;
    for (m = 0 ; m < nb_candidates ; m++) {
      search_space_free = 1;
      for (l=0;l<L;l++) {
	if (CCE_table[(m*L) + l] == 1) {
	  search_space_free = 0;
	  break;
	}
311
      }
312 313 314 315 316 317 318
      if (search_space_free == 1) {
	for (l=0;l<L;l++)
	  CCE_table[(m*L)+l]=1;
	return(m*L);
      }
    }
    return(-1);
319 320 321

  }
  else {  // Find first available in ue specific search space
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
          // according to procedure in Section 9.1.1 of 36.213 (v. 8.6)
    // compute Yk
    Yk = (unsigned int)rnti;

    for (i=0;i<=subframe;i++)
      Yk = (Yk*39827)%65537;

    Yk = Yk % (nCCE/L);


    switch (L) {
    case 1:
    case 2:
      nb_candidates = 6;
      break;
    case 4:
    case 8:
      nb_candidates = 2;
      break;
    default:
      DevParam(L, nCCE, rnti);
      break;
    }

Raymond Knopp's avatar
 
Raymond Knopp committed
346
    //    LOG_I(PHY,"rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n",rnti,Yk,nCCE,nCCE/L,nb_candidates);
347 348 349 350 351 352 353 354

    for (m = 0 ; m < nb_candidates ; m++) {
      search_space_free = 1;
      for (l=0;l<L;l++) {
	if (CCE_table[(((Yk+m)%(nCCE/L))*L) + l] == 1) {
	  search_space_free = 0;
	  break;
	}
355
      }
356 357 358 359 360 361 362
      if (search_space_free == 1) {
	for (l=0;l<L;l++)
	  CCE_table[(((Yk+m)%(nCCE/L))*L)+l]=1;
	return(((Yk+m)%(nCCE/L))*L);
      }
    }
    return(-1);
363 364 365
  }
}

366
int16_t get_target_ul_rx_power(module_id_t module_idP, uint8_t CC_id) {
367 368
  //return PHY_vars_eNB_g[module_idP][CC_id]->PHY_measurements_eNB[0].n0_power_tot_dBm;
  return PHY_vars_eNB_g[module_idP][CC_id]->lte_frame_parms.ul_power_control_config_common.p0_NominalPUSCH;
369 370
}

371 372 373 374 375 376 377
#ifdef EMOS
void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_eNB) {

}
#endif

/*
378
  void phy_procedures_eNB_S_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag) {
379 380 381 382 383 384 385 386

  int sect_id = 0, aa;

  if (next_slot%2==0) {
  #ifdef DEBUG_PHY_PROC
  msg("[PHY][eNB %d] Frame %d, slot %d: Generating pilots for DL-S\n",
  phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot);
  #endif
387
    
388 389 390 391
  for (sect_id=0;sect_id<number_of_cards;sect_id++) {
  if (abstraction_flag == 0) {

  for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
392 393
	  
	  
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
  #ifdef IFFT_FPGA
  memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)],
  0,(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)*sizeof(mod_sym_t));
  #else
  memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)],
  0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)*sizeof(mod_sym_t));
  #endif
  }

  generate_pilots_slot(phy_vars_eNB,
  phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
  AMP,
  next_slot);

  msg("[PHY][eNB] Frame %d, subframe %d Generating PSS\n",
  phy_vars_eNB->frame,next_slot>>1);
410
	
411 412 413 414 415
  generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
  4*AMP,
  &phy_vars_eNB->lte_frame_parms,
  2,
  next_slot);
416
      
417 418 419 420 421 422 423 424 425
  }
  else {
  #ifdef PHY_ABSTRACTION
  generate_pss_emul(phy_vars_eNB,sect_id);
  #endif
  }
  }
  }
  }
426
*/ 
427

Raymond Knopp's avatar
 
Raymond Knopp committed
428
void phy_procedures_eNB_S_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) {
429

Raymond Knopp's avatar
 
Raymond Knopp committed
430
  //  unsigned char sect_id=0; 
431
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
432
 
433
#ifdef DEBUG_PHY_PROC
434
  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_S_RX(%d)\n", phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_rx, subframe);
435
#endif    
436

Raymond Knopp's avatar
 
Raymond Knopp committed
437
  //  for (sect_id=0;sect_id<number_of_cards;sect_id++) {
438
    
Raymond Knopp's avatar
 
Raymond Knopp committed
439 440 441 442 443
  if (abstraction_flag == 0) {
    lte_eNB_I0_measurements(phy_vars_eNB,
			    0,
			    phy_vars_eNB->first_run_I0_measurements);
  }
444
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
445 446 447
  else {
    lte_eNB_I0_measurements_emul(phy_vars_eNB,
				 0);
448
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
449 450
#endif

451
  
Raymond Knopp's avatar
 
Raymond Knopp committed
452 453
  if (I0_clear == 1)
    I0_clear = 0;
454 455
}

Raymond Knopp's avatar
 
Raymond Knopp committed
456 457


458
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
459
void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB) {
460
  
461 462 463 464
  uint8_t aa;
  uint16_t last_subframe_emos;
  uint16_t pilot_pos1 = 3 - phy_vars_eNB->lte_frame_parms.Ncp, pilot_pos2 = 10 - 2*phy_vars_eNB->lte_frame_parms.Ncp;
  uint32_t bytes;
465 466 467 468 469

  last_subframe_emos=0;

#ifdef EMOS_CHANNEL
  //if (last_slot%2==1) // this is for all UL subframes
Raymond Knopp's avatar
 
Raymond Knopp committed
470
  if (subframe==3) 
471
    for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
472 473 474 475 476 477
      memcpy(&emos_dump_eNB.channel[aa][last_subframe_emos*2*phy_vars_eNB->lte_frame_parms.N_RB_UL*12],              
	     &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos1],
	     phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int));
      memcpy(&emos_dump_eNB.channel[aa][(last_subframe_emos*2+1)*phy_vars_eNB->lte_frame_parms.N_RB_UL*12],          
	     &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos2],
	     phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int));
478 479 480
    }
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
481
  if (subframe==4) {
482
    emos_dump_eNB.timestamp = rt_get_time_ns();
Raymond Knopp's avatar
 
Raymond Knopp committed
483
    emos_dump_eNB.frame_tx = phy_vars_eNB->proc[subframe].frame;
484 485 486 487 488 489 490 491 492 493
    emos_dump_eNB.rx_total_gain_dB = phy_vars_eNB->rx_total_gain_eNB_dB;
    emos_dump_eNB.mimo_mode = phy_vars_eNB->transmission_mode[0];
    memcpy(&emos_dump_eNB.PHY_measurements_eNB,
           &phy_vars_eNB->PHY_measurements_eNB[0],
           sizeof(PHY_MEASUREMENTS_eNB));
    memcpy(&emos_dump_eNB.eNB_UE_stats[0],&phy_vars_eNB->eNB_UE_stats[0],NUMBER_OF_UE_MAX*sizeof(LTE_eNB_UE_stats));

    bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_eNB, sizeof(fifo_dump_emos_eNB));
    //bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, "test", sizeof("test"));
    if (bytes!=sizeof(fifo_dump_emos_eNB)) {
Raymond Knopp's avatar
 
Raymond Knopp committed
494 495
      LOG_W(PHY,"[eNB %d] Frame %d, subframe %d, Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n",
            phy_vars_eNB->Mod_id,phy_vars_eNB->frame, subframe,bytes,sizeof(fifo_dump_emos_eNB));
496 497
    }
    else {
Raymond Knopp's avatar
 
Raymond Knopp committed
498 499 500
      if (phy_vars_eNB->proc[(subframe+1)%10].frame_tx%100==0) {
        LOG_I(PHY,"[eNB %d] Frame %d (%d), subframe %d, Writing %d bytes EMOS data to FIFO\n",
              phy_vars_eNB->Mod_id,phy_vars_eNB->proc[(subframe+1)%10]->frame_tx, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, subframe, bytes);
501
      }
502
    }
503 504 505 506 507
  }
}
#endif

#ifndef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
508
void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB) {
509 510

  int i;
511 512
  uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
  uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
513

514 515
  uint32_t rballoc = 0x7FFF;
  uint32_t rballoc2 = 0x000F;
Raymond Knopp's avatar
 
Raymond Knopp committed
516
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
517
  /*
518
    uint32_t rand = taus();
519 520 521 522
    if ((subframe==8) || (subframe==9) || (subframe==0))
    rand = (rand%5)+5;
    else
    rand = (rand%4)+5;
523
  */
524 525 526 527 528

  DCI_pdu->Num_common_dci = 0;
  DCI_pdu->Num_ue_spec_dci=0;

  switch (subframe) {
Raymond Knopp's avatar
 
Raymond Knopp committed
529 530
  case 5:
    DCI_pdu->Num_common_dci = 1;
531 532 533 534
    if (phy_vars_eNB->lte_frame_parms.frame_type == FDD)
      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_FDD_t;
    else
      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
Raymond Knopp's avatar
 
Raymond Knopp committed
535 536 537 538
    DCI_pdu->dci_alloc[0].L          = 2;
    DCI_pdu->dci_alloc[0].rnti       = SI_RNTI;
    DCI_pdu->dci_alloc[0].format     = format1A;
    DCI_pdu->dci_alloc[0].ra_flag    = 0;
539

Raymond Knopp's avatar
 
Raymond Knopp committed
540 541 542 543 544 545 546 547 548 549
    BCCH_alloc_pdu.type              = 1;
    BCCH_alloc_pdu.vrb_type          = 0;
    BCCH_alloc_pdu.rballoc           = computeRIV(25,10,3);
    BCCH_alloc_pdu.ndi               = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
    BCCH_alloc_pdu.rv                = 1;
    BCCH_alloc_pdu.mcs               = 1;
    BCCH_alloc_pdu.harq_pid          = 0;
    BCCH_alloc_pdu.TPC               = 1;      // set to 3 PRB
    memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&BCCH_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
    break;
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568
  case 6:
    /*
      DCI_pdu->Num_ue_spec_dci = 1;
      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI2_5MHz_2A_M10PRB_TDD_t;
      DCI_pdu->dci_alloc[0].L          = 2;
      DCI_pdu->dci_alloc[0].rnti       = 0x1236;
      DCI_pdu->dci_alloc[0].format     = format2_2A_M10PRB;
      DCI_pdu->dci_alloc[0].ra_flag    = 0;

      DLSCH_alloc_pdu1.rballoc          = 0x00ff;
      DLSCH_alloc_pdu1.TPC              = 0;
      DLSCH_alloc_pdu1.dai              = 0;
      DLSCH_alloc_pdu1.harq_pid         = 0;
      DLSCH_alloc_pdu1.tb_swap          = 0;
      DLSCH_alloc_pdu1.mcs1             = 0;
      DLSCH_alloc_pdu1.ndi1             = 1;
      DLSCH_alloc_pdu1.rv1              = 0;
      DLSCH_alloc_pdu1.tpmi             = 0;
      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1,sizeof(DCI2_5MHz_2A_M10PRB_TDD_t));
569
    */
570
    break;
571 572
  case 7:
    DCI_pdu->Num_ue_spec_dci = 1;
573
    
Lionel Gauthier's avatar
Lionel Gauthier committed
574
    if (transmission_mode<3) {
575
      //user 1
576 577 578 579 580
      if (phy_vars_eNB->lte_frame_parms.frame_type == FDD)
	DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_FDD_t; 
      else
	DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; 

581 582 583 584 585 586 587 588 589 590 591
      DCI_pdu->dci_alloc[0].L          = 2;
      DCI_pdu->dci_alloc[0].rnti       = 0x1235;
      DCI_pdu->dci_alloc[0].format     = format1;
      DCI_pdu->dci_alloc[0].ra_flag    = 0;
      
      DLSCH_alloc_pdu.rballoc          = rballoc;
      DLSCH_alloc_pdu.TPC              = 0;
      DLSCH_alloc_pdu.dai              = 0;
      DLSCH_alloc_pdu.harq_pid         = 0;
      DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
      //DLSCH_alloc_pdu.mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);      
Raymond Knopp's avatar
 
Raymond Knopp committed
592
      DLSCH_alloc_pdu.ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
593 594 595 596
      DLSCH_alloc_pdu.rv               = 0;
      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));

      /*
597 598 599 600 601 602 603 604 605 606 607
      //user2
      DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; 
      DCI_pdu->dci_alloc[1].L          = 2;
      DCI_pdu->dci_alloc[1].rnti       = 0x1236;
      DCI_pdu->dci_alloc[1].format     = format1;
      DCI_pdu->dci_alloc[1].ra_flag    = 0;

      DLSCH_alloc_pdu.rballoc          = rballoc2;
      DLSCH_alloc_pdu.TPC              = 0;
      DLSCH_alloc_pdu.dai              = 0;
      DLSCH_alloc_pdu.harq_pid         = 1;
Raymond Knopp's avatar
 
Raymond Knopp committed
608
      //DLSCH_alloc_pdu.mcs              = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);      
609 610 611 612
      DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
      DLSCH_alloc_pdu.ndi              = 1;
      DLSCH_alloc_pdu.rv               = 0;
      memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
613
      */
614
    }
615
    else if (transmission_mode==5) {
616 617 618 619 620 621 622 623 624 625
      DCI_pdu->Num_ue_spec_dci = 2;
      // user 1
      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
      DCI_pdu->dci_alloc[0].L          = 3;
      DCI_pdu->dci_alloc[0].rnti       = 0x1235;
      DCI_pdu->dci_alloc[0].format     = format1E_2A_M10PRB;
      DCI_pdu->dci_alloc[0].ra_flag    = 0;
      
      DLSCH_alloc_pdu1E.tpmi             = 5; //5=use feedback
      DLSCH_alloc_pdu1E.rv               = 0;
Raymond Knopp's avatar
 
Raymond Knopp committed
626
      DLSCH_alloc_pdu1E.ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
627 628 629
      //DLSCH_alloc_pdu1E.mcs            = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];
      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
      DLSCH_alloc_pdu1E.mcs              = openair_daq_vars.target_ue_dl_mcs;
Raymond Knopp's avatar
 
Raymond Knopp committed
630
      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);      
631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648
      phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
      DLSCH_alloc_pdu1E.harq_pid         = 0;
      DLSCH_alloc_pdu1E.dai              = 0;
      DLSCH_alloc_pdu1E.TPC              = 0;
      DLSCH_alloc_pdu1E.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
      DLSCH_alloc_pdu1E.rah              = 0;
      DLSCH_alloc_pdu1E.dl_power_off     = 0; //0=second user present
      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
      
      //user 2
      DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
      DCI_pdu->dci_alloc[1].L          = 0;
      DCI_pdu->dci_alloc[1].rnti       = 0x1236;
      DCI_pdu->dci_alloc[1].format     = format1E_2A_M10PRB;
      DCI_pdu->dci_alloc[1].ra_flag    = 0;
      //DLSCH_alloc_pdu1E.mcs            = openair_daq_vars.target_ue_dl_mcs; 
      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
Raymond Knopp's avatar
 
Raymond Knopp committed
649
      DLSCH_alloc_pdu1E.mcs            = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28);
650 651 652 653 654 655
      phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
      
      memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));

      // set the precoder of the second UE orthogonal to the first
      phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); 
Raymond Knopp's avatar
 
Raymond Knopp committed
656
    }
657 658
    break;
    /*
Raymond Knopp's avatar
 
Raymond Knopp committed
659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
      case 8:
      DCI_pdu->Num_common_dci = 1;
      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
      DCI_pdu->dci_alloc[0].L          = 2;
      DCI_pdu->dci_alloc[0].rnti       = 0xbeef;
      DCI_pdu->dci_alloc[0].format     = format1A;
      DCI_pdu->dci_alloc[0].ra_flag    = 1;

      RA_alloc_pdu.type                = 1;
      RA_alloc_pdu.vrb_type            = 0;
      RA_alloc_pdu.rballoc             = computeRIV(25,12,3);
      RA_alloc_pdu.ndi      = 1;
      RA_alloc_pdu.rv       = 1;
      RA_alloc_pdu.mcs      = 4;
      RA_alloc_pdu.harq_pid = 0;
      RA_alloc_pdu.TPC      = 1;

      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
      break;
678
    */
679
  case 9:
680
    DCI_pdu->Num_ue_spec_dci = 1;
681 682

    //user 1
683 684 685 686
    if (phy_vars_eNB->lte_frame_parms.frame_type == FDD)
      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_FDD_t ; 
    else
      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; 
687 688 689 690 691 692 693 694 695
    DCI_pdu->dci_alloc[0].L          = 2;
    DCI_pdu->dci_alloc[0].rnti       = 0x1235;
    DCI_pdu->dci_alloc[0].format     = format0;
    DCI_pdu->dci_alloc[0].ra_flag    = 0;

    UL_alloc_pdu.type    = 0;
    UL_alloc_pdu.hopping = 0;
    UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb);
    UL_alloc_pdu.mcs     = openair_daq_vars.target_ue_ul_mcs;
Raymond Knopp's avatar
 
Raymond Knopp committed
696
    UL_alloc_pdu.ndi     = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
697 698 699
    UL_alloc_pdu.TPC     = 0;
    UL_alloc_pdu.cshift  = 0;
    UL_alloc_pdu.dai     = 0;
700
    UL_alloc_pdu.cqi_req = 1;
701
    memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
702
       
703 704
    // user 2
    /*
705 706 707 708 709 710 711 712 713 714 715 716 717
    DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; 
    DCI_pdu->dci_alloc[1].L          = 2;
    DCI_pdu->dci_alloc[1].rnti       = 0x1236;
    DCI_pdu->dci_alloc[1].format     = format0;
    DCI_pdu->dci_alloc[1].ra_flag    = 0;

    UL_alloc_pdu.type    = 0;
    UL_alloc_pdu.hopping = 0;
    if (cooperation_flag==0)
      UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
    else 
      UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
    UL_alloc_pdu.mcs     = openair_daq_vars.target_ue_ul_mcs;
Raymond Knopp's avatar
 
Raymond Knopp committed
718
    UL_alloc_pdu.ndi     = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
719 720 721 722 723 724
    UL_alloc_pdu.TPC     = 0;
    if ((cooperation_flag==0) || (cooperation_flag==1))
      UL_alloc_pdu.cshift  = 0;
    else
      UL_alloc_pdu.cshift  = 1;
    UL_alloc_pdu.dai     = 0;
725
    UL_alloc_pdu.cqi_req = 1;
726
    memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
727
    */
728 729 730 731 732 733 734 735
    break;

  default:
    break;
  }

  DCI_pdu->nCCE = 0;
  for (i=0;i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci;i++) {
736
    DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
737 738 739 740 741
  }

}

#ifdef EMOS
742
void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB) {
743 744

  int i;
745 746
  uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
  uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
747

748 749
  //uint32_t rballoc = 0x00F0;
  //uint32_t rballoc2 = 0x000F;
750
  /*
Raymond Knopp's avatar
 
Raymond Knopp committed
751 752
    uint32_t rand = taus();
    if ((subframe==8) || (subframe==9) || (subframe==0))
753
    rand = (rand%5)+5;
Raymond Knopp's avatar
 
Raymond Knopp committed
754
    else
755
    rand = (rand%4)+5;
756
  */
757 758 759 760 761

  DCI_pdu->Num_common_dci = 0;
  DCI_pdu->Num_ue_spec_dci=0;

  switch (subframe) {
Raymond Knopp's avatar
 
Raymond Knopp committed
762
  case 5:
763
    DCI_pdu->Num_ue_spec_dci = 1;
764
    
Lionel Gauthier's avatar
Lionel Gauthier committed
765
    if (transmission_mode<3) {
766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782
      //user 1
      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; 
      DCI_pdu->dci_alloc[0].L          = 2;
      DCI_pdu->dci_alloc[0].rnti       = 0x1235;
      DCI_pdu->dci_alloc[0].format     = format1;
      DCI_pdu->dci_alloc[0].ra_flag    = 0;
      
      DLSCH_alloc_pdu.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
      DLSCH_alloc_pdu.TPC              = 0;
      DLSCH_alloc_pdu.dai              = 0;
      DLSCH_alloc_pdu.harq_pid         = 1;
      DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
      DLSCH_alloc_pdu.ndi              = 1;
      DLSCH_alloc_pdu.rv               = 0;
      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));

      /*
783 784 785 786 787 788
      //user2
      DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; 
      DCI_pdu->dci_alloc[1].L          = 2;
      DCI_pdu->dci_alloc[1].rnti       = 0x1236;
      DCI_pdu->dci_alloc[1].format     = format1;
      DCI_pdu->dci_alloc[1].ra_flag    = 0;
789
      
790 791 792 793 794 795 796 797
      DLSCH_alloc_pdu.rballoc          = rballoc2;
      DLSCH_alloc_pdu.TPC              = 0;
      DLSCH_alloc_pdu.dai              = 0;
      DLSCH_alloc_pdu.harq_pid         = 1;
      DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
      DLSCH_alloc_pdu.ndi              = 1;
      DLSCH_alloc_pdu.rv               = 0;
      memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
798
      */
799 800
    }
    else if (transmission_mode==5) {
801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
      DCI_pdu->Num_ue_spec_dci = 2;
      // user 1
      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
      DCI_pdu->dci_alloc[0].L          = 2;
      DCI_pdu->dci_alloc[0].rnti       = 0x1235;
      DCI_pdu->dci_alloc[0].format     = format1E_2A_M10PRB;
      DCI_pdu->dci_alloc[0].ra_flag    = 0;
      
      DLSCH_alloc_pdu1E.tpmi             = 5; //5=use feedback
      DLSCH_alloc_pdu1E.rv               = 0;
      DLSCH_alloc_pdu1E.ndi              = 1;
      DLSCH_alloc_pdu1E.mcs              = openair_daq_vars.target_ue_dl_mcs;
      DLSCH_alloc_pdu1E.harq_pid         = 1;
      DLSCH_alloc_pdu1E.dai              = 0;
      DLSCH_alloc_pdu1E.TPC              = 0;
      DLSCH_alloc_pdu1E.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
      DLSCH_alloc_pdu1E.rah              = 0;
      DLSCH_alloc_pdu1E.dl_power_off     = 0; //0=second user present
      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
      
      //user 2
      DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
      DCI_pdu->dci_alloc[1].L          = 2;
      DCI_pdu->dci_alloc[1].rnti       = 0x1236;
      DCI_pdu->dci_alloc[1].format     = format1E_2A_M10PRB;
      DCI_pdu->dci_alloc[1].ra_flag    = 0;
      
      memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));

      // set the precoder of the second UE orthogonal to the first
      phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); 
832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886
    }
    break;

  case 7:
    DCI_pdu->Num_common_dci = 1;
    DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
    DCI_pdu->dci_alloc[0].L          = 2;
    DCI_pdu->dci_alloc[0].rnti       = 0xbeef;
    DCI_pdu->dci_alloc[0].format     = format1A;
    DCI_pdu->dci_alloc[0].ra_flag    = 1;

    RA_alloc_pdu.type                = 1;
    RA_alloc_pdu.vrb_type            = 0;
    RA_alloc_pdu.rballoc             = computeRIV(25,12,3);
    RA_alloc_pdu.ndi      = 1;
    RA_alloc_pdu.rv       = 1;
    RA_alloc_pdu.mcs      = 4;
    RA_alloc_pdu.harq_pid = 0;
    RA_alloc_pdu.TPC      = 1;

    memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
    break;

  case 9:
    DCI_pdu->Num_ue_spec_dci = 1;

    //user 1
    DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; 
    DCI_pdu->dci_alloc[0].L          = 2;
    DCI_pdu->dci_alloc[0].rnti       = 0x1235;
    DCI_pdu->dci_alloc[0].format     = format0;
    DCI_pdu->dci_alloc[0].ra_flag    = 0;

    UL_alloc_pdu.type    = 0;
    UL_alloc_pdu.hopping = 0;
    UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
    UL_alloc_pdu.mcs     = openair_daq_vars.target_ue_ul_mcs;
    UL_alloc_pdu.ndi     = 1;
    UL_alloc_pdu.TPC     = 0;
    UL_alloc_pdu.cshift  = 0;
    UL_alloc_pdu.dai     = 0;
    UL_alloc_pdu.cqi_req = 1;
    memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));

    /*
    //user 2
    DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; 
    DCI_pdu->dci_alloc[1].L          = 2;
    DCI_pdu->dci_alloc[1].rnti       = 0x1236;
    DCI_pdu->dci_alloc[1].format     = format0;
    DCI_pdu->dci_alloc[1].ra_flag    = 0;

    UL_alloc_pdu.type    = 0;
    UL_alloc_pdu.hopping = 0;
    if (cooperation_flag==0)
Raymond Knopp's avatar
 
Raymond Knopp committed
887
    UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
888
    else 
Raymond Knopp's avatar
 
Raymond Knopp committed
889
    UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
890 891 892 893
    UL_alloc_pdu.mcs     = openair_daq_vars.target_ue_ul_mcs;
    UL_alloc_pdu.ndi     = 1;
    UL_alloc_pdu.TPC     = 0;
    if ((cooperation_flag==0) || (cooperation_flag==1))
Raymond Knopp's avatar
 
Raymond Knopp committed
894
    UL_alloc_pdu.cshift  = 0;
895
    else
Raymond Knopp's avatar
 
Raymond Knopp committed
896
    UL_alloc_pdu.cshift  = 1;
897 898 899
    UL_alloc_pdu.dai     = 0;
    UL_alloc_pdu.cqi_req = 1;
    memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
900
    */
901
    break;
902
    
903 904 905 906 907 908
  default:
    break;
  }

  DCI_pdu->nCCE = 0;
  for (i=0;i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci;i++) {
909
    DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
910 911 912 913 914 915 916 917 918 919 920
  }

}
#endif //EMOS
#endif //OPENAIR2

#define AMP_OVER_SQRT2 ((AMP*ONE_OVER_SQRT2_Q15)>>15)
#define AMP_OVER_2 (AMP>>1)
int QPSK[4]={AMP_OVER_SQRT2|(AMP_OVER_SQRT2<<16),AMP_OVER_SQRT2|((65536-AMP_OVER_SQRT2)<<16),((65536-AMP_OVER_SQRT2)<<16)|AMP_OVER_SQRT2,((65536-AMP_OVER_SQRT2)<<16)|(65536-AMP_OVER_SQRT2)};
int QPSK2[4]={AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),((65536-AMP_OVER_2)<<16)|AMP_OVER_2,((65536-AMP_OVER_2)<<16)|(65536-AMP_OVER_2)};

Lionel Gauthier's avatar
Lionel Gauthier committed
921 922 923 924 925 926

#if defined(ENABLE_ITTI)
#   if defined(ENABLE_RAL)
extern PHY_MEASUREMENTS PHY_measurements;

void phy_eNB_lte_measurement_thresholds_test_and_report(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP, uint16_t valP) {
Raymond Knopp's avatar
 
Raymond Knopp committed
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953
  MessageDef *message_p = NULL;
  if (
      (
       ((threshold_phy_pP->threshold.threshold_val <  valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) ||
       ((threshold_phy_pP->threshold.threshold_val >  valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD))
       )  ||
      (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD)
      ){
    message_p = itti_alloc_new_message(TASK_PHY_ENB , PHY_MEAS_REPORT_IND);
    memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p)));

    memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold,
	   &threshold_phy_pP->threshold,
	   sizeof(PHY_MEAS_REPORT_IND (message_p).threshold));

    memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param,
	   &threshold_phy_pP->link_param,
	   sizeof(PHY_MEAS_REPORT_IND (message_p).link_param));\

    switch (threshold_phy_pP->link_param.choice) {
    case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL:
      PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP;
      break;
    case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL:
      //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val.
      AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n");
      break;
954
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
955 956
    itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p);
  }
Lionel Gauthier's avatar
Lionel Gauthier committed
957 958 959
}

void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP) {
Raymond Knopp's avatar
 
Raymond Knopp committed
960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981
  unsigned int  mod_id;

  mod_id = instanceP;

  switch (threshold_phy_pP->link_param.link_param_type.choice) {

  case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
    switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) {
    case RAL_LINK_PARAM_GEN_DATA_RATE:
      phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
      break;
    case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH:
      phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
      break;
    case RAL_LINK_PARAM_GEN_SINR:
      phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
      break;
    case RAL_LINK_PARAM_GEN_THROUGHPUT:
      break;
    case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE:
      break;
    default:;
Lionel Gauthier's avatar
Lionel Gauthier committed
982
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
    break;

  case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
    switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) {
    case RAL_LINK_PARAM_LTE_UE_RSRP:
      break;
    case RAL_LINK_PARAM_LTE_UE_RSRQ:
      break;
    case RAL_LINK_PARAM_LTE_UE_CQI:
      break;
    case RAL_LINK_PARAM_LTE_AVAILABLE_BW:
      break;
    case RAL_LINK_PARAM_LTE_PACKET_DELAY:
      break;
    case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE:
      break;
    case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS:
      break;
    case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES:
      break;
    case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY:
      break;
    case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY:
      break;
    case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS:
      break;
    case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW:
      break;
    default:;
    }
    break;

  default:;
  }
Lionel Gauthier's avatar
Lionel Gauthier committed
1017 1018 1019 1020
}
#   endif
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1021 1022


Raymond Knopp's avatar
 
Raymond Knopp committed
1023
void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,
1024
			   relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) {
1025
  uint8_t *pbch_pdu=&phy_vars_eNB->pbch_pdu[0];
1026
  //  unsigned int nb_dci_ue_spec = 0, nb_dci_common = 0;
1027
  uint16_t input_buffer_length, re_allocated=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
1028
  uint32_t i,aa;
1029
  uint8_t harq_pid;
1030
  DCI_PDU *DCI_pdu;
1031
  uint8_t *DLSCH_pdu=NULL;
1032 1033
#ifndef OPENAIR2
  DCI_PDU DCI_pdu_tmp;
1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
  uint8_t DLSCH_pdu_tmp[768*8];
  uint8_t rar;
#endif
  int8_t UE_id;
  uint8_t num_pdcch_symbols=0;
  int16_t crnti;
  uint16_t frame_tx;
  //  int16_t amp;
  uint8_t ul_subframe;
  uint32_t ul_frame;
1044
#ifdef Rel10
1045 1046
  MCH_PDU *mch_pduP;
  MCH_PDU  mch_pdu;
1047
  uint8_t sync_area=255;
1048 1049 1050 1051
#endif
#if defined(SMBV) && !defined(EXMIMO)
  // counts number of allocations in subframe
  // there is at least one allocation for PDCCH
1052
  uint8_t smbv_alloc_cnt = 1;
1053
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1054
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
1055

1056
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1);
1057
  start_meas(&phy_vars_eNB->phy_proc_tx);
Raymond Knopp's avatar
 
Raymond Knopp committed
1058
  
1059 1060
#ifdef DEBUG_PHY_PROC
  LOG_D(PHY,"[%s %d] Frame %d subframe %d : Doing phy_procedures_eNB_TX(%d)\n", 
1061
	(r_type == multicast_relay) ? "RN/eNB" : "eNB",
Raymond Knopp's avatar
 
Raymond Knopp committed
1062
	phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, subframe);
1063
#endif
1064
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1065 1066 1067
  // Get scheduling info for next subframe 
  if (phy_vars_eNB->CC_id == 0)
    mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1);
1068
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1069
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1070
  //  for (sect_id = 0 ; sect_id < number_of_cards; sect_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1071
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1072

Raymond Knopp's avatar
 
Raymond Knopp committed
1073 1074
  if (abstraction_flag==0) {
    for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB;aa++) {
1075
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1076 1077 1078 1079
      memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][subframe*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)],
	     0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(mod_sym_t));
    }
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1080 1081


Raymond Knopp's avatar
 
Raymond Knopp committed
1082
  if (is_pmch_subframe(phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,&phy_vars_eNB->lte_frame_parms)) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1083

Raymond Knopp's avatar
 
Raymond Knopp committed
1084 1085 1086 1087 1088 1089 1090
    if (abstraction_flag==0){
      // This is DL-Cell spec pilots in Control region
      generate_pilots_slot(phy_vars_eNB,
			   phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
			   AMP,
			   subframe<<1,1);
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1091

1092
#ifdef Rel10
Raymond Knopp's avatar
 
Raymond Knopp committed
1093 1094
    // if mcch is active, send regardless of the node type: eNB or RN
    // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing 
Raymond Knopp's avatar
 
Raymond Knopp committed
1095 1096 1097 1098
    mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id,
				      phy_vars_eNB->CC_id,
				      phy_vars_eNB->proc[sched_subframe].frame_tx,
				      subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132
    switch (r_type){
    case no_relay:
      if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 
	//if ((mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 
	LOG_I(PHY,"[eNB%d] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %d, TBS %d) \n",
	      phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->mcs,
	      phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3);
      else {
	LOG_D(PHY,"[DeNB %d] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %d (%s)\n",
	      phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->sync_area,
	      (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment");
	mch_pduP = NULL;
      }
      break;
    case multicast_relay:
      if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){
	//if (((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){
	LOG_I(PHY,"[RN %d] Frame %d subframe %d: Got the MCH PDU for MBSFN  sync area %d (MCS %d, TBS %d)\n",
	      phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe,
	      mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);
      } else if (phy_vars_rn->mch_avtive[subframe%5] == 1){ // SF2 -> SF7, SF3 -> SF8
	mch_pduP= &mch_pdu;
	memcpy(&mch_pduP->payload, // could be a simple copy
	       phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->b,
	       phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
	mch_pduP->Pdu_size = (uint16_t) (phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
	mch_pduP->mcs = phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs;
	LOG_I(PHY,"[RN %d] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %d (MCS %d, TBS %d)\n",
	      phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe,subframe%5,
	      phy_vars_rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size);
      } else {
	/* LOG_I(PHY,"[RN %d] Frame %d subframe %d: do not forward MCH pdu for MBSFN  sync area %d (MCS %d, TBS %d)\n",
	   phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1,
	   mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);*/
Raymond Knopp's avatar
 
Raymond Knopp committed
1133
	mch_pduP=NULL;
Raymond Knopp's avatar
 
Raymond Knopp committed
1134 1135 1136 1137 1138 1139 1140 1141 1142
      }
      phy_vars_rn->mch_avtive[subframe]=0;
      break;
    default:
      LOG_W(PHY,"[eNB %d] Frame %d subframe %d: unknown relaying type %d \n",
	    phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,r_type);
      mch_pduP=NULL;
      break;
    }// switch 
Raymond Knopp's avatar
 
Raymond Knopp committed
1143
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1144 1145 1146
    if (mch_pduP){
      fill_eNB_dlsch_MCH(phy_vars_eNB,mch_pduP->mcs,1,0, abstraction_flag);
      // Generate PMCH
Raymond Knopp's avatar
 
Raymond Knopp committed
1147
      generate_mch(phy_vars_eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag);
1148
#ifdef DEBUG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
1149 1150 1151
      for (i=0;i<mch_pduP->Pdu_size;i++)
	msg("%2x.",(uint8_t)mch_pduP->payload[i]);
      msg("\n");
1152
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
1153 1154
    } else {
      LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
1155
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1156 1157
#endif
  }
1158
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1159
  else {
Raymond Knopp's avatar
 
Raymond Knopp committed
1160
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1161
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172
    if (abstraction_flag==0){
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1);
      generate_pilots_slot(phy_vars_eNB,
			   phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
			   AMP,
			   subframe<<1,0);
      generate_pilots_slot(phy_vars_eNB,
			   phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
			   AMP,
			   (subframe<<1)+1,0);
      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0);
1173
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186
      // First half of PSS/SSS (FDD)
      if (subframe == 0) {
	if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
	  generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		       AMP,
		       &phy_vars_eNB->lte_frame_parms,
		       (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
		       0);
	  generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		       AMP,
		       &phy_vars_eNB->lte_frame_parms,
		       (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
		       0);
Raymond Knopp's avatar
 
Raymond Knopp committed
1187
	    
Raymond Knopp's avatar
 
Raymond Knopp committed
1188 1189
	}
      }    
Raymond Knopp's avatar
 
Raymond Knopp committed
1190
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1191
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1192

Raymond Knopp's avatar
 
Raymond Knopp committed
1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220
  if (subframe == 0) {
    if ((phy_vars_eNB->proc[sched_subframe].frame_tx&3) == 0) {
      ((uint8_t*) pbch_pdu)[2] = 0;
      switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
      case 6:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0x1f) | (0<<5);
	break;
      case 15:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0x1f) | (1<<5);
	break;
      case 25:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0x1f) | (2<<5);
	break;
      case 50:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0x1f) | (3<<5);
	break;
      case 75:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0x1f) | (4<<5);
	break;
      case 100:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0x1f) | (5<<5);
	break;
      default:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0x1f) | (2<<5);
	break;
      }
      ((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0xef) | 
	((phy_vars_eNB->lte_frame_parms.phich_config_common.phich_duration << 4)&0x10);
1221
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236
      switch (phy_vars_eNB->lte_frame_parms.phich_config_common.phich_resource) {
      case oneSixth:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0xf3) | (0<<2);
	break;
      case half:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0xf3) | (1<<2);
	break;
      case one:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0xf3) | (2<<2);
	break;
      case two:
	((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0xf3) | (3<<2);
	break;
      default:
	break;
Raymond Knopp's avatar
 
Raymond Knopp committed
1237
      }
1238
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251
      ((uint8_t*) pbch_pdu)[2] = (((uint8_t*) pbch_pdu)[2]&0xfc) | ((phy_vars_eNB->proc[sched_subframe].frame_tx>>8)&0x3);
      ((uint8_t*) pbch_pdu)[1] = phy_vars_eNB->proc[sched_subframe].frame_tx&0xfc;
      ((uint8_t*) pbch_pdu)[0] = 0;
    }
    /// First half of SSS (TDD)
    if (abstraction_flag==0) {
	
      if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
	generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		     AMP,
		     &phy_vars_eNB->lte_frame_parms,
		     (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
		     1);
Raymond Knopp's avatar
 
Raymond Knopp committed
1252
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1253
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1254 1255 1256
      
      
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1257
    frame_tx = (((int) (pbch_pdu[2]&0x3))<<8) + ((int) (pbch_pdu[1]&0xfc)) + phy_vars_eNB->proc[sched_subframe].frame_tx%4;
Raymond Knopp's avatar
 
Raymond Knopp committed
1258
      
1259
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1260 1261 1262 1263 1264 1265 1266 1267 1268
    LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Generating PBCH, mode1_flag=%d, frame_tx=%d, pdu=%02x%02x%02x\n",
	  phy_vars_eNB->Mod_id,
	  phy_vars_eNB->proc[sched_subframe].frame_tx, 
	  subframe,
	  phy_vars_eNB->lte_frame_parms.mode1_flag,
	  frame_tx,
	  ((uint8_t*) pbch_pdu)[2],
	  ((uint8_t*) pbch_pdu)[1],
	  ((uint8_t*) pbch_pdu)[0]);
1269
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1270
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1271
    if (abstraction_flag==0) {
1272
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1273 1274 1275 1276 1277 1278
      generate_pbch(&phy_vars_eNB->lte_eNB_pbch,
		    phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		    AMP,
		    &phy_vars_eNB->lte_frame_parms,
		    pbch_pdu,
		    phy_vars_eNB->proc[sched_subframe].frame_tx&3);
Raymond Knopp's avatar
 
Raymond Knopp committed
1279
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1280
    }
1281
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1282 1283 1284
    else {
      generate_pbch_emul(phy_vars_eNB,pbch_pdu); 
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1285
#endif
1286
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1287
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1288
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1289
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1290
  if (subframe == 1) {
1291
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1292
    if (abstraction_flag==0) {
1293
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1294 1295 1296 1297 1298 1299 1300
      if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
	//	  printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->proc[sched_subframe].frame_tx,next_slot>>1);
	generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		     AMP,
		     &phy_vars_eNB->lte_frame_parms,
		     2,
		     2);
Raymond Knopp's avatar
 
Raymond Knopp committed
1301
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1302 1303
    }
  } 
Raymond Knopp's avatar
 
Raymond Knopp committed
1304
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1305 1306
  // Second half of PSS/SSS (FDD)
  if (subframe == 5) {
1307
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1308
    if (abstraction_flag==0) {
1309
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
      if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
	generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		     AMP,
		     &phy_vars_eNB->lte_frame_parms,
		     (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
		     10);
	generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		     AMP,
		     &phy_vars_eNB->lte_frame_parms,
		     (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
		     10);
1321
	  
1322
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1323
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1324 1325 1326 1327
  }
  //  Second-half of SSS (TDD)
  if (subframe == 5) {
    if (abstraction_flag==0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1328
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1329 1330 1331 1332 1333 1334
      if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
	generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		     AMP,
		     &phy_vars_eNB->lte_frame_parms,
		     (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
		     11);
1335
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1336
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1337 1338 1339
  }
  // Second half of PSS (TDD)
  if (subframe == 6) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1340
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1341
    if (abstraction_flag==0) {
1342
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1343 1344 1345 1346 1347 1348 1349
      if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
	//	    printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->proc[sched_subframe].frame_tx,next_slot>>1);
	generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		     AMP,
		     &phy_vars_eNB->lte_frame_parms,
		     2,
		     12);
1350
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1351
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1352
  }
1353
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1354 1355
  
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1356
  //  sect_id=0;
1357
    
1358
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1359 1360 1361 1362 1363
  // PBCH takes one allocation
  if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
    if (subframe==0) 
      smbv_alloc_cnt++;
  }
1364
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1365
    
1366
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1367
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1368 1369 1370
  // Parse DCI received from MAC
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1);
  DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1371
				   phy_vars_eNB->CC_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1372 1373
				   phy_vars_eNB->proc[sched_subframe].frame_tx,
				   subframe);
1374
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1375
  DCI_pdu = &DCI_pdu_tmp;
1376
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388
  /*
    if (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)%3 == 0) && (next_slot == 0)) {
    //openair_daq_vars.target_ue_dl_mcs = (openair_daq_vars.target_ue_dl_mcs+1)%28;
    openair_daq_vars.target_ue_dl_mcs = taus()%28;
    LOG_D(PHY,"[MYEMOS] frame %d, increasing MCS to %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,openair_daq_vars.target_ue_dl_mcs);
    }
  */
  /*
    if (phy_vars_eNB->proc[sched_subframe].frame_tx > 28000) {
    LOG_E(PHY,"More that 28000 frames reached! Exiting!\n");
    } 
  */     
1389
#endif
1390
#ifdef EMOS_CHANNEL
1391
  fill_dci_emos(DCI_pdu,sched_subframe,phy_vars_eNB);
1392
#else
1393
  fill_dci(DCI_pdu,sched_subframe,phy_vars_eNB);
1394 1395
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1396
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1397 1398
  // clear existing ulsch dci allocations before applying info from MAC  (this is table
  ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe);
1399
  ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
1400
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1401 1402 1403 1404 1405 1406 1407 1408 1409
  if ((subframe_select(&phy_vars_eNB->lte_frame_parms,ul_subframe)==SF_UL) ||
      (phy_vars_eNB->lte_frame_parms.frame_type == FDD)) {
    harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,ul_frame,ul_subframe);
    for (i=0;i<NUMBER_OF_UE_MAX;i++)
      if (phy_vars_eNB->ulsch_eNB[i]) {
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0;
      }
  }
1410
  
1411
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
1412
  //emos_dump_eNB.dci_cnt[next_slot>>1] = DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci; //nb_dci_common+nb_dci_ue_spec;
1413
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1414 1415 1416 1417
  // clear previous allocation information for all UEs
  for (i=0;i<NUMBER_OF_UE_MAX;i++) {
    phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[subframe] = 0;
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1418
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1419
  init_nCCE_table();
Raymond Knopp's avatar
 
Raymond Knopp committed
1420
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1421 1422 1423 1424 1425 1426 1427
  num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci,
					    DCI_pdu->dci_alloc,
					    &phy_vars_eNB->lte_frame_parms,
					    subframe);
  DCI_pdu->nCCE = get_nCCE(num_pdcch_symbols,
			   &phy_vars_eNB->lte_frame_parms,
			   get_mi(&phy_vars_eNB->lte_frame_parms,subframe));
Raymond Knopp's avatar
 
Raymond Knopp committed
1428 1429
  LOG_D(PHY,"num_pdcch_symbols %d, nCCE %d (dci commond %d, dci uespec %d\n",num_pdcch_symbols,DCI_pdu->nCCE,
	DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
Raymond Knopp's avatar
 
Raymond Knopp committed
1430
  
1431
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1432 1433 1434 1435 1436 1437
  // Sets up PDCCH and DCI table
  if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) {
    msg("[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
    dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[0]);
    smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (subframe),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
  }
1438
#endif      
Raymond Knopp's avatar
 
Raymond Knopp committed
1439
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1440
  for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {
1441
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1442 1443 1444 1445
    if (DCI_pdu->dci_alloc[i].rnti != SI_RNTI) {
      LOG_D(PHY,"[eNB] Subframe %d : Doing DCI index %d/%d\n",subframe,i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci);
      dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
    }
1446
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1447
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1448
    if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) {
1449
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462
      LOG_D(PHY,"[eNB %d] SI generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
#endif
      generate_eNB_dlsch_params_from_dci(subframe,
					 &DCI_pdu->dci_alloc[i].dci_pdu[0],
					 DCI_pdu->dci_alloc[i].rnti,
					 DCI_pdu->dci_alloc[i].format,
					 &phy_vars_eNB->dlsch_eNB_SI,
					 &phy_vars_eNB->lte_frame_parms,
					 phy_vars_eNB->pdsch_config_dedicated,
					 SI_RNTI,
					 0,
					 P_RNTI,
					 phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
Raymond Knopp's avatar
 
Raymond Knopp committed
1463
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1464 1465 1466 1467 1468 1469 1470 1471 1472 1473
      if ((phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
									DCI_pdu->nCCE,
									1,
									SI_RNTI,
									subframe)) == -1) {
	LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (SI)!!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
      } 
      else {
	LOG_T(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (SI)  => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
	      phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe],DCI_pdu->nCCE);
1474 1475

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1476 1477 1478 1479
	// configure SI DCI
	if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
	  msg("[SMBV] Frame %3d, SI in SF %d DCI %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i);
	  smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", &DCI_pdu->dci_alloc[i], i);
1480
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1481
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1482
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1483 1484 1485 1486
      DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe];
	  
    }
    else if (DCI_pdu->dci_alloc[i].ra_flag == 1) {
1487
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500
      LOG_D(PHY,"[eNB %d] RA generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
#endif
      generate_eNB_dlsch_params_from_dci(subframe,
					 &DCI_pdu->dci_alloc[i].dci_pdu[0],
					 DCI_pdu->dci_alloc[i].rnti,
					 DCI_pdu->dci_alloc[i].format,
					 &phy_vars_eNB->dlsch_eNB_ra,
					 &phy_vars_eNB->lte_frame_parms,
					 phy_vars_eNB->pdsch_config_dedicated,
					 SI_RNTI,
					 DCI_pdu->dci_alloc[i].rnti,
					 P_RNTI,
					 phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
1501
	  
Raymond Knopp's avatar
 
Raymond Knopp committed
1502 1503 1504 1505 1506 1507 1508 1509 1510 1511
      //	  mac_xface->macphy_exit("Transmitted RAR, exiting\n");

      if ((phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
									DCI_pdu->nCCE,
									1,
									DCI_pdu->dci_alloc[i].rnti,
									subframe)) == -1) {
	LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (RA) !!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
      }
      else {
Raymond Knopp's avatar
 
Raymond Knopp committed
1512
	LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (RA)  => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
Raymond Knopp's avatar
 
Raymond Knopp committed
1513
	      phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe],DCI_pdu->nCCE);
1514
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1515 1516 1517 1518
	// configure RA DCI
	if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
	  msg("[SMBV] Frame %3d, RA in SF %d DCI %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i);
	  smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", &DCI_pdu->dci_alloc[i], i);
1519
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1520
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1521 1522

      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1523 1524 1525
      DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe];

    }
1526

Raymond Knopp's avatar
 
Raymond Knopp committed
1527
    else if (DCI_pdu->dci_alloc[i].format != format0){ // this is a normal DLSCH allocation
1528 1529 1530

#ifdef OPENAIR2
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1531
      LOG_D(PHY,"[eNB] Searching for RNTI %x\n",DCI_pdu->dci_alloc[i].rnti);
1532
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1533
      UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
1534
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1535
      UE_id = i;
1536
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1537 1538
      if (UE_id>=0) {
	//	  dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
1539
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1540 1541 1542 1543 1544
	// Configure this user
	if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
	  msg("[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %d in TM%d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->transmission_mode[(uint8_t)UE_id]);
	  smbv_configure_user(smbv_fname,UE_id+1,phy_vars_eNB->transmission_mode[(uint8_t)UE_id],DCI_pdu->dci_alloc[i].rnti);
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1545
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569
	generate_eNB_dlsch_params_from_dci(subframe,
					   &DCI_pdu->dci_alloc[i].dci_pdu[0],
					   DCI_pdu->dci_alloc[i].rnti,
					   DCI_pdu->dci_alloc[i].format,
					   phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id],
					   &phy_vars_eNB->lte_frame_parms,
					   phy_vars_eNB->pdsch_config_dedicated,
					   SI_RNTI,
					   0,
					   P_RNTI,
					   phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].DL_pmi_single);
	LOG_D(PHY,"[eNB %d][PDSCH %x/%d] Frame %d subframe %d: Generated dlsch params\n",
	      phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
	if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
											  DCI_pdu->nCCE,
											  0,
											  DCI_pdu->dci_alloc[i].rnti,
											  subframe)) == -1) {
	  LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for UE spec DCI (PDSCH %x) !!!\n",
		phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->dci_alloc[i].rnti);
	}
	else {
	  LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %x)  => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
		DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe],DCI_pdu->nCCE);
1570 1571

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1572
	  DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe];
Raymond Knopp's avatar
 
Raymond Knopp committed
1573 1574 1575 1576 1577
	  // configure UE-spec DCI
	  if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
	    msg("[SMBV] Frame %3d, PDSCH in SF %d DCI %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i);
	    smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i);
	  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1578 1579
#endif
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1580 1581 1582
	DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe];
#ifdef DEBUG_PHY_PROC      
	//if (phy_vars_eNB->proc[sched_subframe].frame_tx%100 == 0)
Raymond Knopp's avatar
 
Raymond Knopp committed
1583
	LOG_D(PHY,"[eNB %d][DCI][PDSCH %x] Frame %d subframe %d UE_id %d Generated DCI format %d, aggregation %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1584 1585 1586 1587 1588 1589 1590 1591 1592
	      phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti,
	      phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,UE_id,
	      DCI_pdu->dci_alloc[i].format,
	      1<<DCI_pdu->dci_alloc[i].L);
#endif
      }
      else {
	LOG_D(PHY,"[eNB %d][PDSCH] Frame %d : No UE_id with corresponding rnti %x, dropping DLSCH\n",
	      phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,(int16_t)DCI_pdu->dci_alloc[i].rnti);
1593
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1594
    }
1595

Raymond Knopp's avatar
 
Raymond Knopp committed
1596
  }
1597

Raymond Knopp's avatar
 
Raymond Knopp committed
1598 1599
  // Apply physicalConfigDedicated if needed
  phy_config_dedicated_eNB_step2(phy_vars_eNB);
Raymond Knopp's avatar
 
Raymond Knopp committed
1600

Raymond Knopp's avatar
 
Raymond Knopp committed
1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
  for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {    
    if (DCI_pdu->dci_alloc[i].format == format0) {  // this is a ULSCH allocation

      harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
				   pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
				   pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe));
      if (harq_pid==255) {
	LOG_E(PHY,"[eNB %d] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx);
	mac_exit_wrapper("Invalid harq_pid (255) detected");
      }
1611
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1612
      UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
1613
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1614
      UE_id = i;
1615
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1616 1617 1618 1619
      if (UE_id<0) {
	LOG_E(PHY,"[eNB %d] Frame %d: Unknown UE_id for rnti %x\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,(int16_t)DCI_pdu->dci_alloc[i].rnti);
	mac_exit_wrapper("Invalid UE id (< 0) detected");
      }
1620
#ifdef DEBUG_PHY_PROC
Florian Kaltenberger's avatar
Florian Kaltenberger committed
1621
      //if (phy_vars_eNB->proc[sched_subframe].frame_tx%100 == 0)
Raymond Knopp's avatar
 
Raymond Knopp committed
1622
	LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d UL Frame %d, UL Subframe %d, Generated ULSCH (format0) DCI (rnti %x, dci %x) (DCI pos %d/%d), aggregation %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1623 1624
	      phy_vars_eNB->Mod_id, 
	      subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
1625
				pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
Raymond Knopp's avatar
 
Raymond Knopp committed
1626
				pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)),
Raymond Knopp's avatar
 
Raymond Knopp committed
1627 1628 1629 1630 1631
	      phy_vars_eNB->proc[sched_subframe].frame_tx,
	      subframe,
	      pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
	      pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe),
	      DCI_pdu->dci_alloc[i].rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
1632 1633 1634 1635 1636 1637 1638 1639 1640
	      *(unsigned int *)&DCI_pdu->dci_alloc[i].dci_pdu[0],
	      i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci,
	      1<<DCI_pdu->dci_alloc[i].L);
#endif

      //dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
      //LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti);
      generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0],
					 DCI_pdu->dci_alloc[i].rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
1641
					 sched_subframe,
Raymond Knopp's avatar
 
Raymond Knopp committed
1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662
					 format0,
					 UE_id,
					 phy_vars_eNB,
					 SI_RNTI,
					 0,
					 P_RNTI,
					 CBA_RNTI,
					 0);  // do_srs

      if ((DCI_pdu->dci_alloc[i].nCCE=get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
						      DCI_pdu->nCCE,
						      0,
						      DCI_pdu->dci_alloc[i].rnti,
						      subframe)) == -1) {
	LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources (%d) for UE spec DCI (PUSCH %x) !!!\n",
	      phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->nCCE,DCI_pdu->dci_alloc[i].rnti);
      }
      else {
	LOG_T(PHY,"[eNB %d] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %x) => %d/%d\n",
	      phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->dci_alloc[i].rnti,
	      DCI_pdu->dci_alloc[i].nCCE,DCI_pdu->nCCE);
1663 1664

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1665 1666 1667 1668 1669
	// configure UE-spec DCI for UL Grant
	if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
	  msg("[SMBV] Frame %3d, SF %d UL DCI %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i);
	  smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i);
	}
1670 1671
#endif

1672
      }
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1673 1674 1675 1676 1677 1678 1679 1680
      
#ifdef DEBUG_PHY_PROC
      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Setting subframe_scheduling_flag for UE %d harq_pid %d (ul subframe %d)\n",
	    phy_vars_eNB->Mod_id,harq_pid,
	    phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i,harq_pid,
	    pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe));
#endif
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1681 1682 1683 1684
      if ((DCI_pdu->dci_alloc[i].rnti  >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI))
	phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1;
      else 
	phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
1685

Raymond Knopp's avatar
 
Raymond Knopp committed
1686
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1687
  }
1688
   
1689 1690


Lionel Gauthier's avatar
Lionel Gauthier committed
1691 1692


Raymond Knopp's avatar
 
Raymond Knopp committed
1693 1694
  // if we have DCI to generate do it now
  if ((DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci)>0) {
Lionel Gauthier's avatar
Lionel Gauthier committed
1695

1696
 
Raymond Knopp's avatar
 
Raymond Knopp committed
1697 1698 1699 1700 1701
  }
  else {  // for emulation!!
    phy_vars_eNB->num_ue_spec_dci[(subframe)&1]=0;
    phy_vars_eNB->num_common_dci[(subframe)&1]=0;
  }
1702
 
Raymond Knopp's avatar
 
Raymond Knopp committed
1703
  if (abstraction_flag == 0) {
1704
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1705 1706
    if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0)
      LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %d,ue_spec %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
1707 1708
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1709 1710 1711 1712 1713 1714 1715 1716 1717
    //    for (sect_id=0;sect_id<number_of_cards;sect_id++) 
      num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci,
					   DCI_pdu->Num_common_dci,
					   DCI_pdu->dci_alloc,
					   0,
					   AMP,
					   &phy_vars_eNB->lte_frame_parms,
					   phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
					   subframe);
Raymond Knopp's avatar
Raymond Knopp committed
1718 1719

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1720
    //	LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: num_pdcch_symbols %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, next_slot>>1,num_pdcch_symbols);
Raymond Knopp's avatar
Raymond Knopp committed
1721 1722

#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1723
  }
1724 1725

#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1726 1727 1728 1729
  else {
    LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top_emul\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe);
    num_pdcch_symbols = generate_dci_top_emul(phy_vars_eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,subframe);
  }
1730 1731
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1732
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0);
1733 1734

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1735
  //LOG_D(PHY,"[eNB %d] Frame %d, slot %d: num_pdcch_symbols=%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, next_slot,num_pdcch_symbols);
1736 1737
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1738
  // Check for SI activity
1739

Raymond Knopp's avatar
 
Raymond Knopp committed
1740 1741
  if (phy_vars_eNB->dlsch_eNB_SI->active == 1) {
    input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8;
1742 1743 1744


#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1745
    DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1746
					 phy_vars_eNB->CC_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1747 1748 1749
					 phy_vars_eNB->proc[sched_subframe].frame_tx,
					 SI_RNTI,
					 0);
1750
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1751 1752 1753
    DLSCH_pdu = DLSCH_pdu_tmp;
    for (i=0;i<input_buffer_length;i++)
      DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
1754
#endif      
1755
    
1756
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1757 1758 1759 1760 1761
    // Configures the data source of allocation (allocation is configured by DCI)
    if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
      msg("[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
      smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), DLSCH_pdu, input_buffer_length);
    }
1762 1763 1764 1765
#endif      

#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_DLSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
1766 1767 1768 1769 1770
    LOG_D(PHY,"[eNB %d][SI] Frame %d, slot %d: Calling generate_dlsch (SI) with input size = %d, num_pdcch_symbols %d\n",
	  phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, next_slot, input_buffer_length,num_pdcch_symbols);
    for (i=0;i<input_buffer_length;i++)
      LOG_T(PHY,"%x.",i,DLSCH_pdu[i]);
    LOG_T(PHY,"\n");
1771 1772 1773
#endif
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1774
    if (abstraction_flag == 0) {
1775

Raymond Knopp's avatar
 
Raymond Knopp committed
1776 1777 1778 1779 1780 1781 1782 1783 1784 1785
      start_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
      dlsch_encoding(DLSCH_pdu,
		     &phy_vars_eNB->lte_frame_parms,
		     num_pdcch_symbols,
		     phy_vars_eNB->dlsch_eNB_SI,
		     phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
		     &phy_vars_eNB->dlsch_rate_matching_stats,
		     &phy_vars_eNB->dlsch_turbo_encoding_stats,
		     &phy_vars_eNB->dlsch_interleaving_stats);
      stop_meas(&phy_vars_eNB->dlsch_encoding_stats);  
1786
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1787 1788 1789 1790 1791
      start_meas(&phy_vars_eNB->dlsch_scrambling_stats);	      
      dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
		       0,
		       phy_vars_eNB->dlsch_eNB_SI,
		       get_G(&phy_vars_eNB->lte_frame_parms,
1792 1793
			     phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->nb_rb,
			     phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->rb_alloc,
Raymond Knopp's avatar
 
Raymond Knopp committed
1794 1795 1796 1797 1798 1799
			     get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs),
			     1,
			     num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
		       0,
		       subframe<<1);      
      stop_meas(&phy_vars_eNB->dlsch_scrambling_stats);	      
1800
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1801 1802 1803 1804 1805 1806 1807
      start_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
      //      for (sect_id=0;sect_id<number_of_cards;sect_id++) 
      re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
				      AMP,
				      subframe,
				      &phy_vars_eNB->lte_frame_parms,
				      num_pdcch_symbols,
1808 1809
				      phy_vars_eNB->dlsch_eNB_SI,
				      (LTE_eNB_DLSCH_t *)NULL);
Raymond Knopp's avatar
 
Raymond Knopp committed
1810 1811
      stop_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
    } 
1812
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1813 1814 1815 1816 1817 1818 1819
    else {
      start_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
      dlsch_encoding_emul(phy_vars_eNB,
			  DLSCH_pdu,
			  phy_vars_eNB->dlsch_eNB_SI);
      stop_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
    }
1820
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1821
    phy_vars_eNB->dlsch_eNB_SI->active = 0;
1822
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1823
  }
Lionel Gauthier's avatar
Lionel Gauthier committed
1824

Raymond Knopp's avatar
 
Raymond Knopp committed
1825 1826
  // Check for RA activity
  if (phy_vars_eNB->dlsch_eNB_ra->active == 1) {
1827
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1828
    LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, subframe %d, RA active, filling RAR:\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
1829
	  phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe);
1830 1831
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1832
    input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8;
1833 1834

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1835
    crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1836
				phy_vars_eNB->CC_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850
				phy_vars_eNB->proc[sched_subframe].frame_tx,
				dlsch_input_buffer,
				phy_vars_eNB->lte_frame_parms.N_RB_UL,
				input_buffer_length);
    /*
      for (i=0;i<input_buffer_length;i++)
      LOG_T(PHY,"%x.",dlsch_input_buffer[i]);
      LOG_T(PHY,"\n");
    */
    UE_id = add_ue(crnti,phy_vars_eNB);
    if (UE_id==-1) {
      LOG_W(PHY,"[eNB] Max user count reached.\n");
      //mac_xface->macphy_exit("[PHY][eNB] Max user count reached.\n");
      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1851
				phy_vars_eNB->CC_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872
				phy_vars_eNB->proc[sched_subframe].frame_tx,
				crnti);
    }
    else {
      phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE;
      // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged)
      phy_vars_eNB->first_sr[(uint32_t)UE_id] = 1;

      generate_eNB_ulsch_params_from_rar(dlsch_input_buffer,
					 phy_vars_eNB->proc[sched_subframe].frame_tx,
					 (subframe),
					 phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id],
					 &phy_vars_eNB->lte_frame_parms);

      phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 1;

      get_Msg3_alloc(&phy_vars_eNB->lte_frame_parms,
		     subframe,
		     phy_vars_eNB->proc[sched_subframe].frame_tx,
		     &phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
		     &phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
1873 1874 1875 1876 1877 1878 1879
      LOG_I(PHY,"[eNB][RAPROC] Frame %d subframe %d, Activated Msg3 demodulation for UE %d in frame %d, subframe %d\n",
	    phy_vars_eNB->proc[sched_subframe].frame_tx,
	    subframe,
	    UE_id,
	    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
	    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
	    
1880
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1881 1882
      for (i=0;i<input_buffer_length;i++)
	dlsch_input_buffer[i]= (unsigned char) i; //(taus()&0xff);
1883

Raymond Knopp's avatar
 
Raymond Knopp committed
1884 1885 1886
      dlsch_input_buffer[1] = (phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4
      dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0;  // 4 LSBs of timing advance + divide by 4
      //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset); 
1887 1888 1889
#endif

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1890 1891 1892 1893 1894
      // Configures the data source of allocation (allocation is configured by DCI)
      if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
	msg("[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
	smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), dlsch_input_buffer, input_buffer_length);
      }
1895 1896 1897
#endif      

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1898 1899 1900 1901 1902
      LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %d,Msg3 frame %d, Msg3 subframe %d\n",
	    phy_vars_eNB->Mod_id,
	    phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length, 
	    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
	    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
1903 1904
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1905 1906 1907 1908 1909 1910 1911 1912 1913 1914
      if (abstraction_flag == 0) {

	dlsch_encoding(dlsch_input_buffer,
		       &phy_vars_eNB->lte_frame_parms,
		       num_pdcch_symbols,
		       phy_vars_eNB->dlsch_eNB_ra,
		       phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
		       &phy_vars_eNB->dlsch_rate_matching_stats,
		       &phy_vars_eNB->dlsch_turbo_encoding_stats,
		       &phy_vars_eNB->dlsch_interleaving_stats);
Raymond Knopp's avatar
 
Raymond Knopp committed
1915

Raymond Knopp's avatar
 
Raymond Knopp committed
1916 1917 1918
	//	phy_vars_eNB->dlsch_eNB_ra->rnti = RA_RNTI;
	dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
			 0,
Raymond Knopp's avatar
 
Raymond Knopp committed
1919
			 phy_vars_eNB->dlsch_eNB_ra,
Raymond Knopp's avatar
 
Raymond Knopp committed
1920
			 get_G(&phy_vars_eNB->lte_frame_parms,
1921 1922
			       phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->nb_rb,
			       phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->rb_alloc,
Raymond Knopp's avatar
 
Raymond Knopp committed
1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933
			       get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs),
			       1,
			       num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
			 0,
			 subframe<<1);
	//	for (sect_id=0;sect_id<number_of_cards;sect_id++) 
	re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
					AMP,
					subframe,
					&phy_vars_eNB->lte_frame_parms,
					num_pdcch_symbols,
1934 1935
					phy_vars_eNB->dlsch_eNB_ra,
					(LTE_eNB_DLSCH_t *)NULL);
Raymond Knopp's avatar
 
Raymond Knopp committed
1936
      }
1937
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1938 1939 1940 1941 1942
      else {
	dlsch_encoding_emul(phy_vars_eNB,
			    dlsch_input_buffer,
			    phy_vars_eNB->dlsch_eNB_ra);
      }
1943
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1944 1945
      LOG_D(PHY,"[eNB %d][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id,
	    phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
1946
	
1947
#ifdef DEBUG_PHY_PROC    
Raymond Knopp's avatar
 
Raymond Knopp committed
1948 1949
      LOG_D(PHY,"[eNB %d] Frame %d, subframe %d, DLSCH (RA) re_allocated = %d\n",phy_vars_eNB->Mod_id,
	    phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, re_allocated);
1950 1951 1952
#endif

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1953
    } //max user count
1954
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1955 1956
    phy_vars_eNB->dlsch_eNB_ra->active = 0;
  }
1957

Raymond Knopp's avatar
 
Raymond Knopp committed
1958 1959 1960 1961 1962 1963 1964
  // Now scan UE specific DLSCH
  for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) {
    if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&&
	(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&&
	(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 1)) {
      harq_pid = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid;
      input_buffer_length = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS/8;
1965
      
1966 1967

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1968
      LOG_D(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",
Raymond Knopp's avatar
 
Raymond Knopp committed
1969 1970 1971
	    phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,harq_pid,
	    phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length,
	    get_G(&phy_vars_eNB->lte_frame_parms,
1972 1973
		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc,
Raymond Knopp's avatar
 
Raymond Knopp committed
1974 1975 1976
		  get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs),
		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl,
		  num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
1977
	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
Raymond Knopp's avatar
 
Raymond Knopp committed
1978
	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs,
1979
	    pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc),
Raymond Knopp's avatar
 
Raymond Knopp committed
1980 1981 1982 1983 1984 1985 1986
	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx,
	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round);
#endif

      phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].dlsch_sliding_cnt++;
      if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->harq_processes[harq_pid]->round == 0) {

Florian Kaltenberger's avatar
Florian Kaltenberger committed
1987
	phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][0]++;
1988
	  
1989
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1990
	DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1991
					     phy_vars_eNB->CC_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1992 1993 1994 1995
					     phy_vars_eNB->proc[sched_subframe].frame_tx,
					     phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,
					     0);
	phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS;
1996
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1997 1998 1999
	DLSCH_pdu = DLSCH_pdu_tmp;
	for (i=0;i<input_buffer_length;i++)
	  DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
2000 2001 2002
#endif      

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
2003 2004 2005 2006 2007
	// Configures the data source of allocation (allocation is configured by DCI)
	if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
	  msg("[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
	  smbv_configure_datalist_for_user(smbv_fname, UE_id+1, DLSCH_pdu, input_buffer_length);
	}
2008 2009 2010 2011 2012
#endif      


#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_DLSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
2013 2014 2015 2016
	LOG_T(PHY,"eNB DLSCH SDU: \n");
	for (i=0;i<phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS>>3;i++)
	  LOG_T(PHY,"%x.",(uint8_t)DLSCH_pdu[i]);
	LOG_T(PHY,"\n");
2017 2018
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2019 2020
      }
      else {
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2021
	phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round]++;	
2022 2023
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_DLSCH  
Raymond Knopp's avatar
 
Raymond Knopp committed
2024
	LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n");
2025 2026
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2027 2028
      }
      if (abstraction_flag==0) {
2029

Raymond Knopp's avatar
 
Raymond Knopp committed
2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044
	// 36-212
	start_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
	dlsch_encoding(DLSCH_pdu,
		       &phy_vars_eNB->lte_frame_parms,
		       num_pdcch_symbols,
		       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
		       phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
		       &phy_vars_eNB->dlsch_rate_matching_stats,
		       &phy_vars_eNB->dlsch_turbo_encoding_stats,
		       &phy_vars_eNB->dlsch_interleaving_stats);
	stop_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
	// 36-211
	start_meas(&phy_vars_eNB->dlsch_scrambling_stats);	      
	dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
			 0,
Raymond Knopp's avatar
 
Raymond Knopp committed
2045
			 phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
Raymond Knopp's avatar
 
Raymond Knopp committed
2046
			 get_G(&phy_vars_eNB->lte_frame_parms,
2047 2048
			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc,
Raymond Knopp's avatar
 
Raymond Knopp committed
2049 2050 2051 2052 2053 2054 2055 2056
			       get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs),
			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl,
			       num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
			 0,
			 subframe<<1);      
	stop_meas(&phy_vars_eNB->dlsch_scrambling_stats);	      
	start_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
	//for (sect_id=0;sect_id<number_of_cards;sect_id++) {
2057
	    
Raymond Knopp's avatar
 
Raymond Knopp committed
2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070
	  /*          if ((phy_vars_eNB->transmission_mode[(uint8_t)UE_id] == 5) &&
		      (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->dl_power_off == 0)) 
		      amp = (int16_t)(((int32_t)AMP*(int32_t)ONE_OVER_SQRT2_Q15)>>15);
		      else*/
	  //              amp = AMP;
	  //	    if (UE_id == 1)
	  //	    LOG_I(PHY,"[MYEMOS] MCS_i %d\n", phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs);

	re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
					AMP,
					subframe,
					&phy_vars_eNB->lte_frame_parms,
					num_pdcch_symbols,
2071 2072
					phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
					phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][1]);
Raymond Knopp's avatar
 
Raymond Knopp committed
2073 2074 2075
      
	stop_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
      }
2076
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
2077 2078 2079 2080 2081 2082 2083
      else {
	start_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
	dlsch_encoding_emul(phy_vars_eNB,
			    DLSCH_pdu,
			    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]);
	stop_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
      }
2084
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2085
      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0;
2086
	
Raymond Knopp's avatar
 
Raymond Knopp committed
2087 2088
      //mac_xface->macphy_exit("first dlsch transmitted\n");
    }
Lionel Gauthier's avatar
Lionel Gauthier committed
2089

Raymond Knopp's avatar
 
Raymond Knopp committed
2090 2091 2092
    else if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&&
	     (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&&
	     (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 0)) {
2093
      
Raymond Knopp's avatar
 
Raymond Knopp committed
2094 2095
      // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later)
      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0;
2096
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2097
      //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,subframe,UE_id);
2098
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2099
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
2100
  }
2101
  
2102 2103


Raymond Knopp's avatar
 
Raymond Knopp committed
2104 2105 2106
  // if we have PHICH to generate
  //    printf("[PHY][eNB] Frame %d subframe %d Checking for phich\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe); 
  if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,subframe)) {
2107
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2108
    //      LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_phich_top\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe);
2109
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2110 2111
    //    for (sect_id=0;sect_id<number_of_cards;sect_id++) {
    generate_phich_top(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2112
		       sched_subframe,
Raymond Knopp's avatar
 
Raymond Knopp committed
2113 2114 2115 2116 2117
		       AMP,
		       0,
		       abstraction_flag);
  }
  
Raymond Knopp's avatar
 
Raymond Knopp committed
2118

Raymond Knopp's avatar
 
Raymond Knopp committed
2119
     
2120
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
2121
  phy_procedures_emos_eNB_TX(next_slot, phy_vars_eNB);
2122
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139

#ifndef EXMIMO
#ifndef USRP
  if (abstraction_flag==0) {
    start_meas(&phy_vars_eNB->ofdm_mod_stats);
    do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		phy_vars_eNB->lte_eNB_common_vars.txdata[0],
		phy_vars_eNB->proc[sched_subframe].frame_tx,subframe<<1,
		&phy_vars_eNB->lte_frame_parms);
    do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		phy_vars_eNB->lte_eNB_common_vars.txdata[0],
		phy_vars_eNB->proc[sched_subframe].frame_tx,1+(subframe<<1),
		&phy_vars_eNB->lte_frame_parms);
    stop_meas(&phy_vars_eNB->ofdm_mod_stats);
  }
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2140
  
2141
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0);
2142
  stop_meas(&phy_vars_eNB->phy_proc_tx);
Raymond Knopp's avatar
 
Raymond Knopp committed
2143 2144
  
  
2145 2146
}

Raymond Knopp's avatar
 
Raymond Knopp committed
2147
void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2148
  // this prepares the demodulation of the first PUSCH of a new user, containing Msg3
2149

Raymond Knopp's avatar
 
Raymond Knopp committed
2150
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2151
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2152

Raymond Knopp's avatar
 
Raymond Knopp committed
2153
  LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n",
2154
	phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2155
	frame,subframe,
2156 2157 2158 2159
	UE_id,phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active,
	phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe,
	phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame);
  phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 0;
2160
  
2161
  if ((phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) && 
Raymond Knopp's avatar
 
Raymond Knopp committed
2162
      (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) &&
2163
      (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == frame))   {
2164 2165 2166
    
    //    harq_pid = 0;
    
2167 2168 2169
    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 0;
    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 1;
    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1;
Lionel Gauthier's avatar
 
Lionel Gauthier committed
2170
    LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n",
2171
	  phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2172
	  frame,subframe,UE_id);
2173 2174 2175 2176 2177 2178 2179 2180 2181
  }
}


// This function retrieves the harq_pid of the corresponding DLSCH process
// and updates the error statistics of the DLSCH based on the received ACK
// info from UE along with the round index.  It also performs the fine-grain
// rate-adaptation based on the error statistics derived from the ACK/NAK process

2182
void process_HARQ_feedback(uint8_t UE_id, 
Raymond Knopp's avatar
 
Raymond Knopp committed
2183
			   uint8_t sched_subframe, 
2184
			   PHY_VARS_eNB *phy_vars_eNB,
2185 2186 2187 2188 2189
			   uint8_t pusch_flag, 
			   uint8_t *pucch_payload, 
			   uint8_t pucch_sel,
			   uint8_t SR_payload) {

Florian Kaltenberger's avatar
Florian Kaltenberger committed
2190
  uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe;
2191 2192
  LTE_eNB_DLSCH_t *dlsch             =  phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0];
  LTE_eNB_UE_stats *ue_stats         =  &phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id];
2193
  LTE_DL_eNB_HARQ_t *dlsch_harq_proc;
2194
  uint8_t subframe_m4,M,m;
2195 2196
  int mp;
  int all_ACKed=1,nb_alloc=0,nb_ACK=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
2197 2198
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2199
  int harq_pid = subframe2harq_pid( &phy_vars_eNB->lte_frame_parms,frame,subframe);
2200

Raymond Knopp's avatar
 
Raymond Knopp committed
2201
  if (phy_vars_eNB->lte_frame_parms.frame_type == FDD){ //FDD
2202
    subframe_m4 = (subframe<4) ? subframe+6 : subframe-4;
2203

2204 2205 2206
    dl_harq_pid[0] = dlsch->harq_ids[subframe_m4];
    M=1;
    if (pusch_flag == 1)
Raymond Knopp's avatar
 
Raymond Knopp committed
2207
      dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0];
2208 2209 2210 2211
    else
      dlsch_ACK[0] = pucch_payload[0];
    LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d for subframe %d\n",phy_vars_eNB->Mod_id,
	  frame,dlsch_ACK[0],subframe_m4);
2212 2213
  }
  else {  // TDD Handle M=1,2 cases only
2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224
    
    M=ul_ACK_subframe2_M(&phy_vars_eNB->lte_frame_parms,
			 subframe);
    // Now derive ACK information for TDD
    if (pusch_flag == 1) { // Do PUSCH ACK/NAK first
      // detect missing DAI
      //FK: this code is just a guess
      //RK: not exactly, yes if scheduled from PHICH (i.e. no DCI format 0)
      //    otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this,
      //    but we have to adapt the code below.  For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used

Raymond Knopp's avatar
 
Raymond Knopp committed
2225 2226
      dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0];
      dlsch_ACK[1] = (phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling)?phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1];
2227 2228
      //      printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]);
    }
2229

2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268
    else {  // PUCCH ACK/NAK
      if ((SR_payload == 1)&&(pucch_sel!=2)) {  // decode Table 7.3 if multiplexing and SR=1 
	nb_ACK = 0;
	if (M == 2) {
	  if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) // b[0],b[1]
	    nb_ACK = 1;
	  else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0))
	    nb_ACK = 2;
	}
	else if (M == 3) {
	  if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) 
	    nb_ACK = 1;
	  else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0))
	    nb_ACK = 2;
	  else if ((pucch_payload[0] == 0) && (pucch_payload[1] == 1))
	    nb_ACK = 3;
	}
      }
      else if (pucch_sel == 2) {  // bundling or M=1
	//	printf("*** (%d,%d)\n",pucch_payload[0],pucch_payload[1]);
	dlsch_ACK[0] = pucch_payload[0];
	dlsch_ACK[1] = pucch_payload[0];
      }
      else {  // multiplexing with no SR, this is table 10.1
	if (M==1) 
	  dlsch_ACK[0] = pucch_payload[0];
	else if (M==2) {
	  if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) ||
	      ((pucch_sel == 0) && (pucch_payload[0] == 0) && (pucch_payload[1] == 1)))
	    dlsch_ACK[0] = 1;
	  else
	    dlsch_ACK[0] = 0;

	  if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) ||
	      ((pucch_sel == 1) && (pucch_payload[0] == 0) && (pucch_payload[1] == 0)))
	    dlsch_ACK[1] = 1;
	  else
	    dlsch_ACK[1] = 0;
	}
2269
      }
2270
    }
2271 2272 2273 2274
  }

  // handle case where positive SR was transmitted with multiplexing
  if ((SR_payload == 1)&&(pucch_sel!=2)&&(pusch_flag == 0)) {
2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287
    nb_alloc = 0;
    for (m=0;m<M;m++) {
      dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
						 subframe,
						 m);
      
      if (dlsch->subframe_tx[dl_subframe]==1) 
	nb_alloc++;
    }
    if (nb_alloc == nb_ACK)
      all_ACKed = 1;
    else 
      all_ACKed = 0;
2288

2289
    //    printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed);
2290 2291 2292 2293 2294
  }


  for (m=0,mp=-1;m<M;m++) {

2295 2296 2297
    dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
					       subframe,
					       m);
2298

2299 2300 2301 2302 2303
    if (dlsch->subframe_tx[dl_subframe]==1) {
      if (pusch_flag == 1)
	mp++;
      else
	mp = m;
2304

2305
      dl_harq_pid[m]     = dlsch->harq_ids[dl_subframe];
2306

2307 2308 2309 2310 2311 2312 2313 2314 2315
      if ((pucch_sel != 2)&&(pusch_flag == 0)) { // multiplexing
	if ((SR_payload == 1)&&(all_ACKed == 1))
	  dlsch_ACK[m] = 1;
	else	
	  dlsch_ACK[m] = 0;
      }
      if (dl_harq_pid[m]<dlsch->Mdlharq) {
	dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]];
#ifdef DEBUG_PHY_PROC	
Raymond Knopp's avatar
 
Raymond Knopp committed
2316
	LOG_D(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id,
2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331
	      dlsch->rnti,dl_harq_pid[m],dl_subframe,
	      dlsch_harq_proc->status,dlsch_harq_proc->round,
	      dlsch->harq_processes[dl_harq_pid[m]]->mcs,
	      dlsch->harq_processes[dl_harq_pid[m]]->rvidx,
	      dlsch->harq_processes[dl_harq_pid[m]]->TBS);
	if (dlsch_harq_proc->status==DISABLED)
	  LOG_E(PHY,"dlsch_harq_proc is disabled? \n");
#endif
	if ((dl_harq_pid[m]<dlsch->Mdlharq) &&
	    (dlsch_harq_proc->status == ACTIVE)) {
	  // dl_harq_pid of DLSCH is still active
	  
	  //	  msg("[PHY] eNB %d Process %d is active (%d)\n",phy_vars_eNB->Mod_id,dl_harq_pid[m],dlsch_ACK[m]);
	  if ( dlsch_ACK[mp]==0) {
	    // Received NAK 
2332
#ifdef DEBUG_PHY_PROC	
Raymond Knopp's avatar
 
Raymond Knopp committed
2333
	    LOG_D(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2334
		  dlsch->rnti,dl_harq_pid[m],M,m,mp,dlsch_harq_proc->round);
2335 2336
#endif
	    
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2337 2338 2339 2340
	    if (dlsch_harq_proc->round == 0) 
	      ue_stats->dlsch_NAK_round0++;
	    ue_stats->dlsch_NAK[dl_harq_pid[m]][dlsch_harq_proc->round]++;

2341 2342 2343 2344 2345 2346 2347 2348 2349
	    
	    // then Increment DLSCH round index 
	    dlsch_harq_proc->round++;
	    
	    if (dlsch_harq_proc->round == dlsch->Mdlharq) {
	      // This was the last round for DLSCH so reset round and increment l2_error counter
#ifdef DEBUG_PHY_PROC	
	      LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id,
		    dlsch->rnti,dl_harq_pid[m]);
2350
#endif
2351
	      dlsch_harq_proc->round = 0;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2352
	      ue_stats->dlsch_l2_errors[dl_harq_pid[m]]++;
2353 2354 2355 2356 2357
	      dlsch_harq_proc->status = SCH_IDLE;
	      dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
	    }
	  }
	  else {
2358
#ifdef DEBUG_PHY_PROC	
Raymond Knopp's avatar
 
Raymond Knopp committed
2359
	    LOG_D(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id,
2360
		  dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
2361
#endif
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2362
	    ue_stats->dlsch_ACK[dl_harq_pid[m]][dlsch_harq_proc->round]++;
2363

2364 2365 2366 2367
	    // Received ACK so set round to 0 and set dlsch_harq_pid IDLE
	    dlsch_harq_proc->round  = 0;
	    dlsch_harq_proc->status = SCH_IDLE; 
	    dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
2368

2369
	    ue_stats->total_TBS = ue_stats->total_TBS + 
2370
	      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
2371
	    /*
Raymond Knopp's avatar
 
Raymond Knopp committed
2372
	      ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits +
2373
	      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
2374 2375 2376 2377
	    */
	  }
	  
	  // Do fine-grain rate-adaptation for DLSCH 
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2378
	  if (ue_stats->dlsch_NAK_round0 > dlsch->error_threshold) {
2379 2380 2381 2382 2383
	    if (ue_stats->dlsch_mcs_offset == 1)
	      ue_stats->dlsch_mcs_offset=0;
	    else
	      ue_stats->dlsch_mcs_offset=-1;
	  }
2384
#ifdef DEBUG_PHY_PROC	  
2385 2386 2387 2388 2389 2390 2391
	  LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",frame,
		dlsch_harq_proc->round,dl_harq_pid[m],subframe);
#endif
	  
	  // Clear NAK stats and adjust mcs offset
	  // after measurement window timer expires
	  if ((ue_stats->dlsch_sliding_cnt == dlsch->ra_window_size) ) {
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2392
	    if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK_round0 < 2))
2393
	      ue_stats->dlsch_mcs_offset = 1;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2394
	    if ((ue_stats->dlsch_mcs_offset == 1) && (ue_stats->dlsch_NAK_round0 > 2))
2395
	      ue_stats->dlsch_mcs_offset = 0;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2396
	    if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK_round0 > 2))
2397
	      ue_stats->dlsch_mcs_offset = -1;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2398
	    if ((ue_stats->dlsch_mcs_offset == -1) && (ue_stats->dlsch_NAK_round0 < 2))
2399 2400
	      ue_stats->dlsch_mcs_offset = 0;
	    
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2401
	    ue_stats->dlsch_NAK_round0 = 0;
2402 2403 2404 2405 2406
	    ue_stats->dlsch_sliding_cnt = 0;
	  }
	  
	  
	}
2407
      }
2408
    }
2409 2410 2411 2412
  }
}

void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
2413
		      uint8_t UE_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2414
		      uint8_t sched_subframe,
2415 2416 2417 2418
		      int16_t *n1_pucch0,
		      int16_t *n1_pucch1,
		      int16_t *n1_pucch2,
		      int16_t *n1_pucch3) {
2419 2420

  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
2421
  uint8_t nCCE0,nCCE1;
2422
  int sf;
Raymond Knopp's avatar
 
Raymond Knopp committed
2423 2424
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
2425 2426

  if (frame_parms->frame_type == FDD ) {
2427
    sf = (subframe<4) ? (subframe+6) : (subframe-4); 
2428
    //    printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]);
2429

2430 2431
    if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[sf]>0) {
      *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf];
2432 2433 2434 2435 2436 2437
      *n1_pucch1 = -1;
    }
    else {
      *n1_pucch0 = -1;
      *n1_pucch1 = -1;
    }
2438 2439 2440
  }
  else {

2441 2442 2443
    switch (frame_parms->tdd_config) {
    case 1:  // DL:S:UL:UL:DL:DL:S:UL:UL:DL
      if (subframe == 2) {  // ACK subframes 5 and 6
2444 2445
	/*	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) {
		nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6];
2446
		*n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
2447 2448
		}
		else
2449
		*n1_pucch1 = -1;*/
2450

2451 2452
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) {
	  nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5];
2453 2454 2455 2456
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2457

2458 2459 2460 2461
	*n1_pucch1 = -1;	
      }
      else if (subframe == 3) {   // ACK subframe 9
	
2462 2463
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) {
	  nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9];
2464 2465 2466 2467
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2468

2469 2470 2471 2472 2473 2474
	*n1_pucch1 = -1;
	
      }
      else if (subframe == 7) {  // ACK subframes 0 and 1
	//harq_ack[0].nCCE;  
	//harq_ack[1].nCCE;
2475 2476
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) {
	  nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0];
2477 2478 2479 2480
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2481

2482 2483 2484 2485
	*n1_pucch1 = -1;
      }
      else if (subframe == 8) {   // ACK subframes 4
	//harq_ack[4].nCCE;
2486 2487
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[4]>0) {
	  nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[4];
2488 2489 2490 2491
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2492

2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504
	*n1_pucch1 = -1;
      }
      else {
	LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
	      phy_vars_eNB->Mod_id,
	      frame,
	      subframe,frame_parms->tdd_config);
	return;
      }
      break;
    case 3:  // DL:S:UL:UL:UL:DL:DL:DL:DL:DL
      if (subframe == 2) {  // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe)
2505 2506
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) {
	  nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6];
2507 2508 2509 2510
	  *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch1 = -1;
2511

2512 2513
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) {
	  nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5];
2514 2515 2516 2517 2518 2519 2520
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
      }
      else if (subframe == 3) {   // ACK subframes 7 and 8
	LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n",
2521
	      phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7],phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]);
2522

2523 2524
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]>0) {
	  nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[8];
2525 2526 2527 2528 2529
	  *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
	  LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1);
	}
	else
	  *n1_pucch1 = -1;
Lionel Gauthier's avatar
Lionel Gauthier committed
2530

2531 2532
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7]>0) {
	  nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[7];
2533 2534 2535 2536 2537 2538 2539
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; 
	  LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0);
	}
	else
	  *n1_pucch0 = -1;
      }
      else if (subframe == 4) {  // ACK subframes 9 and 0
2540 2541
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) {
	  nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0];
2542 2543 2544 2545
	  *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch1 = -1;
Lionel Gauthier's avatar
Lionel Gauthier committed
2546

2547 2548
	if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) {
	  nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9];
2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
      }
      else {
	LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
	      phy_vars_eNB->Mod_id,frame,subframe,frame_parms->tdd_config);
	return;
      }
      break;
    }  // switch tdd_config     
    // Don't handle the case M>2
    *n1_pucch2 = -1;
    *n1_pucch3 = -1;
2564 2565 2566 2567
  }
}


Raymond Knopp's avatar
 
Raymond Knopp committed
2568 2569
extern int16_t prach_ifft[4][1024*4];

Raymond Knopp's avatar
 
Raymond Knopp committed
2570
void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t abstraction_flag) {
2571

2572 2573 2574 2575
  uint16_t preamble_energy_list[64],preamble_delay_list[64];
  uint16_t preamble_max,preamble_energy_max;
  uint16_t i;
  int8_t UE_id;
Raymond Knopp's avatar
 
Raymond Knopp committed
2576
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2577
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2578
  uint8_t CC_id = phy_vars_eNB->CC_id;
2579

2580 2581
  memset(&preamble_energy_list[0],0,64*sizeof(uint16_t));
  memset(&preamble_delay_list[0],0,64*sizeof(uint16_t));
2582
  if (abstraction_flag == 0) {
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2583
    LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2584
	  frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB);        
Raymond Knopp's avatar
 
Raymond Knopp committed
2585
    
2586
    //    LOG_I(PHY,"[eNB %d][RAPROC] PRACH: rootSequenceIndex %d, prach_ConfigIndex %d, zeroCorrelationZoneConfig %d, highSpeedFlag %d, prach_FreqOffset %d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset);
2587

2588 2589 2590 2591 2592 2593
    rx_prach(phy_vars_eNB,
	     subframe,
	     preamble_energy_list,
	     preamble_delay_list,
	     frame,
	     0);
2594 2595
  }
  else {
2596 2597 2598
    for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
      
      LOG_D(PHY,"[RAPROC] UE_id %d (%p), generate_prach %d, UE RSI %d, eNB RSI %d preamble index %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2599 2600
	    UE_id,PHY_vars_UE_g[UE_id][CC_id],PHY_vars_UE_g[UE_id][CC_id]->generate_prach,
	    PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex,
2601
	    phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,
Raymond Knopp's avatar
 
Raymond Knopp committed
2602
	    PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex);
2603
      
Raymond Knopp's avatar
 
Raymond Knopp committed
2604 2605
      if ((PHY_vars_UE_g[UE_id][CC_id]->generate_prach==1) &&
	  (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex ==
2606
	   phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2607
	preamble_energy_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 800;
Raymond Knopp's avatar
 
Raymond Knopp committed
2608
	preamble_delay_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 5;
2609
	
2610
      }
2611
    }
2612 2613 2614 2615 2616
  }
  preamble_energy_max = preamble_energy_list[0];
  preamble_max = 0;

  for (i=1;i<64;i++) {
2617 2618 2619 2620
    if (preamble_energy_max < preamble_energy_list[i]) {
      preamble_energy_max = preamble_energy_list[i];
      preamble_max = i;
    }
2621 2622 2623
  }

#ifdef DEBUG_PHY_PROC
2624
  LOG_D(PHY,"[RAPROC] Most likely preamble %d, energy %d dB delay %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2625 2626 2627
	preamble_max,
	preamble_energy_list[preamble_max],
	preamble_delay_list[preamble_max]);
2628 2629
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
2630
  if (preamble_energy_list[preamble_max] > 580) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2631 2632 2633 2634 2635 2636 2637 2638
    /*
    write_output("prach_ifft0.m","prach_t0",prach_ifft[0],2048,1,1);
    write_output("prach_rx0.m","prach_rx0",&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],6144+792,1,1);
    write_output("prach_rxF0.m","prach_rxF0",phy_vars_eNB->lte_eNB_prach_vars.rxsigF[0],24576,1,1);

    mac_xface->macphy_exit("Exiting for PRACH debug\n");
    */

2639 2640
    UE_id = find_next_ue_index(phy_vars_eNB);
    if (UE_id>=0) {
2641 2642 2643
      phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits
      //phy_vars_eNb->eNB_UE_stats[(uint32_t)UE_id].mode = PRACH;
      phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0;
Raymond Knopp's avatar
 
Raymond Knopp committed
2644
      LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n",
2645
	    phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2646 2647
	    frame,
	    subframe,
2648
	    preamble_max,
Raymond Knopp's avatar
 
Raymond Knopp committed
2649 2650
	    preamble_energy_max/10,
	    preamble_energy_max%10,
2651
	    preamble_delay_list[preamble_max]);
2652
#ifdef OPENAIR2	  
2653
      mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2654
				  phy_vars_eNB->CC_id,
2655 2656 2657 2658
				  frame,
				  preamble_max,
				  preamble_delay_list[preamble_max],
				  0,subframe,0);
2659
#endif
2660 2661
    }
    else {
Raymond Knopp's avatar
 
Raymond Knopp committed
2662
      LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", 
2663 2664
	    phy_vars_eNB->Mod_id,frame, subframe);
    }
2665 2666 2667
  }
}

Raymond Knopp's avatar
 
Raymond Knopp committed
2668
void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag)
2669 2670 2671 2672 2673
{
  LOG_D(PHY,"ulsch_decoding_procedures not yet implemented. should not be called");
}


Raymond Knopp's avatar
 
Raymond Knopp committed
2674

Raymond Knopp's avatar
 
Raymond Knopp committed
2675
void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) {
2676
  //RX processing
Florian Kaltenberger's avatar
Florian Kaltenberger committed
2677
  uint32_t l, ret=0,i,j,k;
2678
  uint32_t sect_id=0;
2679
  uint32_t harq_pid, harq_idx, round;
2680 2681 2682 2683 2684
  uint8_t SR_payload,*pucch_payload=NULL,pucch_payload0[2]={0,0},pucch_payload1[2]={0,0};
  int16_t n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3;
  uint8_t do_SR = 0;
  uint8_t pucch_sel = 0;
  int16_t metric0=0,metric1=0;
2685 2686
  ANFBmode_t bundling_flag;
  PUCCH_FMT_t format;
2687 2688 2689
  uint8_t nPRS;
  //  uint8_t two_ues_connected = 0;
  uint8_t pusch_active = 0;
2690 2691
  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
  int sync_pos;
2692 2693
  uint16_t rnti=0;
  uint8_t access_mode;
2694
  int num_active_cba_groups;
Raymond Knopp's avatar
 
Raymond Knopp committed
2695
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2696
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
2697 2698

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
2699
  start_meas(&phy_vars_eNB->phy_proc_rx);
2700
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2701
  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe);
2702
#endif
2703 2704

  if (abstraction_flag == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2705 2706
    remove_7_5_kHz(phy_vars_eNB,subframe<<1);
    remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1);
2707 2708
  }
  // check if we have to detect PRACH first
Raymond Knopp's avatar
 
Raymond Knopp committed
2709 2710
  if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) {
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
Raymond Knopp's avatar
 
Raymond Knopp committed
2711
    prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag);
Raymond Knopp's avatar
 
Raymond Knopp committed
2712
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
2713
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
2714
 
2715
  if (abstraction_flag == 0) {
2716 2717 2718
    start_meas(&phy_vars_eNB->ofdm_demod_stats);	      	      	  
    for (l=0;l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2;l++) {
      
Raymond Knopp's avatar
 
Raymond Knopp committed
2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733
      //      for (sect_id=0;sect_id<number_of_cards;sect_id++) {
      slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
		  &phy_vars_eNB->lte_eNB_common_vars,
		  l,
		  subframe<<1,
		  0,
		  0
		  );
      slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
		  &phy_vars_eNB->lte_eNB_common_vars,
		  l,
		  (subframe<<1)+1,
		  0,
		  0
		  );
2734 2735
    }
    stop_meas(&phy_vars_eNB->ofdm_demod_stats);	      	      	  
2736 2737 2738 2739 2740
  }
  sect_id = 0;

  /*
    for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) {
2741
    
2742
    if ((phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode>PRACH) && (last_slot%2==1)) {
2743 2744 2745
    #ifdef DEBUG_PHY_PROC	
    LOG_D(PHY,"[eNB %d] frame %d, slot %d: Doing SRS estimation and measurements for UE_id %d (UE_mode %d)\n",
    phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2746
    phy_vars_eNB->proc[sched_subframe].frame_tx, last_slot, 
2747
    UE_id,phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode);
2748 2749
    #endif
    for (sect_id=0;sect_id<number_of_cards;sect_id++) {
2750
	
2751 2752
    lte_srs_channel_estimation(&phy_vars_eNB->lte_frame_parms,
    &phy_vars_eNB->lte_eNB_common_vars,
2753 2754
    &phy_vars_eNB->lte_eNB_srs_vars[(uint32_t)UE_id],
    &phy_vars_eNB->soundingrs_ul_config_dedicated[(uint32_t)UE_id],
2755 2756 2757 2758 2759 2760 2761 2762 2763
    last_slot>>1,
    sect_id);
    lte_eNB_srs_measurements(phy_vars_eNB,
    sect_id,
    UE_id,
    1);
    #ifdef DEBUG_PHY_PROC
    LOG_D(PHY,"[eNB %d] frame %d, slot %d: UE_id %d, sect_id %d: RX RSSI %d (from SRS)\n",
    phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2764
    phy_vars_eNB->proc[sched_subframe].frame_tx, last_slot, 
2765
    UE_id,sect_id,
2766
    phy_vars_eNB->PHY_measurements_eNB[sect_id].rx_rssi_dBm[(uint32_t)UE_id]);
2767 2768
    #endif
    }
2769
      
2770 2771 2772 2773 2774
    sect_id=0;
    #ifdef USER_MODE
    //write_output("srs_est0.m","srsest0",phy_vars_eNB->lte_eNB_common_vars.srs_ch_estimates[0][0],512,1,1);
    //write_output("srs_est1.m","srsest1",phy_vars_eNB->lte_eNB_common_vars.srs_ch_estimates[0][1],512,1,1);
    #endif
2775
      
2776 2777
    //msg("timing advance in\n");
    sync_pos = lte_est_timing_advance(&phy_vars_eNB->lte_frame_parms,
2778
    &phy_vars_eNB->lte_eNB_srs_vars[(uint32_t)UE_id],
2779
    &sect_id,
2780
    phy_vars_eNB->first_run_timing_advance[(uint32_t)UE_id],
2781 2782
    number_of_cards,
    24576);
2783
      
2784
    //msg("timing advance out\n");
2785
      
2786 2787 2788
    //phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8;
    phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = 0;
    phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].sector = sect_id;
2789
    #ifdef DEBUG_PHY_PROC	
2790 2791
    LOG_D(PHY,"[eNB %d] frame %d, slot %d: user %d in sector %d: timing_advance = %d\n",
    phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2792
    phy_vars_eNB->proc[sched_subframe].frame_tx, last_slot, 
2793
    UE_id, sect_id,
2794
    phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset);
2795 2796 2797 2798
    #endif
    }
    }
    else {
2799
    
2800
    }
2801
  */
Raymond Knopp's avatar
 
Raymond Knopp committed
2802

2803 2804
  // Check for active processes in current subframe
  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
2805
			       frame,subframe);
2806
  pusch_active = 0;
2807
  // reset the cba flag used for collision detection 
2808
  for (i=0; i < NUM_MAX_CBA_GROUP; i++){
2809
    phy_vars_eNB->cba_last_reception[i]=0;
2810
  }
Raymond Knopp's avatar
Raymond Knopp committed
2811
  //  LOG_I(PHY,"subframe %d: nPRS %d\n",last_slot>>1,phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[last_slot-1]);
2812 2813 2814 2815
 
  for (i=0;i<NUMBER_OF_UE_MAX;i++) { 
  
    /*
2816 2817
      if ((i == 1) && (phy_vars_eNB->cooperation_flag > 0) && (two_ues_connected == 1))
      break;
2818
    */
2819
#ifdef OPENAIR2
2820
    if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE)
Raymond Knopp's avatar
 
Raymond Knopp committed
2821
      process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid);
2822 2823
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
2824
    /*
Raymond Knopp's avatar
Raymond Knopp committed
2825 2826
#ifdef DEBUG_PHY_PROC
    if (phy_vars_eNB->ulsch_eNB[i]) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2827
            
Raymond Knopp's avatar
 
Raymond Knopp committed
2828
      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d rnti %x, alloc %d, Msg3 %d\n",phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2829 2830 2831 2832 2833
	    harq_pid,frame,subframe,
	    (phy_vars_eNB->ulsch_eNB[i]->rnti),
	    (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag),
	    (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag)
	    );
Raymond Knopp's avatar
Raymond Knopp committed
2834 2835
    }
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2836 2837
    */

2838 2839
    if ((phy_vars_eNB->ulsch_eNB[i]) &&
	(phy_vars_eNB->ulsch_eNB[i]->rnti>0) &&
Raymond Knopp's avatar
 
Raymond Knopp committed
2840
	(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) {
2841 2842 2843
 
      pusch_active = 1;
      round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
2844 2845

#ifdef DEBUG_PHY_PROC
2846 2847
      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x\n",
	    phy_vars_eNB->Mod_id,harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
2848
	    frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti);
2849
#endif
2850
  
2851
#ifdef DEBUG_PHY_PROC
2852
      if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1){
Raymond Knopp's avatar
 
Raymond Knopp committed
2853
	LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n",
2854 2855
	      phy_vars_eNB->Mod_id,
	      frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
2856
	      subframe,
2857 2858
	      phy_vars_eNB->eNB_UE_stats[i].sector);
      } else {
Raymond Knopp's avatar
 
Raymond Knopp committed
2859
	LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s sect_id %d\n",
2860 2861
	      phy_vars_eNB->Mod_id,
	      frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
2862
	      subframe,
2863 2864 2865 2866
	      i,
	      mode_string[phy_vars_eNB->eNB_UE_stats[i].mode],
	      phy_vars_eNB->eNB_UE_stats[i].sector);
      }
2867 2868
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
2869
      nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1];
2870

2871
      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;
2872

Raymond Knopp's avatar
 
Raymond Knopp committed
2873 2874
      if (frame_parms->frame_type == FDD ) {
	int sf = (subframe<4) ? (subframe+6) : (subframe-4); 
Raymond Knopp's avatar
Raymond Knopp committed
2875

Raymond Knopp's avatar
 
Raymond Knopp committed
2876 2877 2878 2879 2880 2881
	if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission
	  phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1;
	}
	else {
	  phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0;
	}
2882
      }
Raymond Knopp's avatar
Raymond Knopp committed
2883

2884
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2885
      LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2886
	    phy_vars_eNB->Mod_id,harq_pid,frame,subframe,
2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx,
	    phy_vars_eNB->ulsch_eNB[i]->cyclicShift,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2,
	    phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
	    nPRS,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK);
#endif
      start_meas(&phy_vars_eNB->ulsch_demodulation_stats);	      	      	  
      if (abstraction_flag==0) {
	rx_ulsch(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2904
		 sched_subframe,
2905 2906 2907 2908 2909
		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		 i,
		 phy_vars_eNB->ulsch_eNB,
		 0);
      }
2910
#ifdef PHY_ABSTRACTION
2911 2912
      else {
	rx_ulsch_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2913
		      subframe,
2914 2915 2916
		      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		      i);
      }
2917
#endif
2918
      stop_meas(&phy_vars_eNB->ulsch_demodulation_stats);	      	      	  
2919 2920


2921 2922 2923 2924
      start_meas(&phy_vars_eNB->ulsch_decoding_stats);
      if (abstraction_flag == 0) {
	ret = ulsch_decoding(phy_vars_eNB,
			     i,
Raymond Knopp's avatar
 
Raymond Knopp committed
2925
			     sched_subframe,
2926
			     0, // control_only_flag
Raymond Knopp's avatar
 
Raymond Knopp committed
2927
			     phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, 
2928 2929
			     0);  
      }
2930
#ifdef PHY_ABSTRACTION
2931 2932
      else {
	ret = ulsch_decoding_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2933
				  sched_subframe,
2934 2935 2936
				  i,
				  &rnti);
      }
2937
#endif
2938
      stop_meas(&phy_vars_eNB->ulsch_decoding_stats);
2939

Raymond Knopp's avatar
 
Raymond Knopp committed
2940 2941
#ifdef DEBUG_PHY_PROC
      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2942 2943 2944 2945 2946
	    phy_vars_eNB->Mod_id,harq_pid,
	    frame,subframe,
	    phy_vars_eNB->ulsch_eNB[i]->rnti,
	    dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
	    dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
2947 2948
	    phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
	    phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
Raymond Knopp's avatar
 
Raymond Knopp committed
2949 2950
	    phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
	    phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
Raymond Knopp's avatar
 
Raymond Knopp committed
2951 2952
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
Raymond Knopp's avatar
 
Raymond Knopp committed
2953
	    ret);
Raymond Knopp's avatar
 
Raymond Knopp committed
2954
#endif //DEBUG_PHY_PROC
2955
      /*
2956 2957
	if ((two_ues_connected==1) && (phy_vars_eNB->cooperation_flag==2)) {
	for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++) {
2958
	phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_0[j]) 
2959
	- phy_vars_eNB->rx_total_gain_eNB_dB;
2960
	phy_vars_eNB->eNB_UE_stats[i+1].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_1[j]) 
2961 2962 2963 2964
	- phy_vars_eNB->rx_total_gain_eNB_dB;
	}
	#ifdef DEBUG_PHY_PROC
	LOG_D(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power UE0 (%d,%d) dB RX power UE1 (%d,%d)\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2965
	phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,last_slot>>1,i,
2966 2967 2968 2969 2970 2971 2972
	dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_0[0]),
	dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_0[1]),
	dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_1[0]),
	dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_1[1]));
	#endif
	}
	else {
2973
      */
2974

2975 2976 2977
      //compute the expected ULSCH RX power (for the stats)
      phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF =
	get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid);
2978

2979
      //dump_ulsch(phy_vars_eNB, sched_subframe, i);
2980 2981
    
      phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
2982
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2983
      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2984
	    phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid);
2985
#endif
2986
      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0;
2987

Raymond Knopp's avatar
 
Raymond Knopp committed
2988
      if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) {
2989
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2990
	//if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) 
Raymond Knopp's avatar
 
Raymond Knopp committed
2991
	print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL);
2992
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2993 2994
	extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode);
	phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0];
2995 2996 2997
      }
    
      if (ret == (1+MAX_TURBO_ITERATIONS)) {
2998 2999 3000 3001 3002 3003 3004 3005

	/*
	if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round>0) {
	  dump_ulsch(phy_vars_eNB, sched_subframe, i);
	  mac_xface->macphy_exit("retransmission in error");
	}
	*/

3006 3007 3008 3009 3010
	phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;

Raymond Knopp's avatar
 
Raymond Knopp committed
3011
	LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round);
3012 3013

	if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3014
	  LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
3015
		phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3016
		frame,subframe, i,
3017 3018
		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
		phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1);
Raymond Knopp's avatar
 
Raymond Knopp committed
3019
	  
3020 3021
	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == 
	      phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3022
	    LOG_I(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n",
3023 3024
		  phy_vars_eNB->Mod_id, i);
	    phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
3025
#ifdef OPENAIR2
3026
	    mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3027
				      phy_vars_eNB->CC_id,
3028 3029 3030 3031
				      frame,
				      phy_vars_eNB->eNB_UE_stats[i].crnti);
#endif
	    remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
3032
	    phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
3033 3034 3035 3036 3037
	    //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0;

	  }
	  else {
	    // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI)
3038
	    phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1;
3039 3040
	    
	    get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
3041
			       subframe,
3042 3043 3044
			       frame,
			       &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame,
			       &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
3045
	  }/*
Raymond Knopp's avatar
 
Raymond Knopp committed
3046
	  LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
3047 3048 3049 3050
		harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
	  for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
	    printf("%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
	  printf("\n");
Raymond Knopp's avatar
 
Raymond Knopp committed
3051 3052
	   */
	  //	  dump_ulsch(phy_vars_eNB,sched_subframe,i);
Raymond Knopp's avatar
 
Raymond Knopp committed
3053
	  //#ifndef EXMIMO_IOT
Raymond Knopp's avatar
 
Raymond Knopp committed
3054
	  LOG_W(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error\n", frame,subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
3055
	  //#else 
Raymond Knopp's avatar
 
Raymond Knopp committed
3056
	  //mac_exit_wrapper("Msg3 error");
Raymond Knopp's avatar
 
Raymond Knopp committed
3057
	  //#endif 
3058 3059
	} // This is Msg3 error
	else { //normal ULSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
3060
	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n",
3061
		phy_vars_eNB->Mod_id,harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
3062
		frame,subframe, i,
3063 3064
		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
		phy_vars_eNB->ulsch_eNB[i]->Mdlharq,
Raymond Knopp's avatar
 
Raymond Knopp committed
3065 3066
		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]);
Florian Kaltenberger's avatar
Florian Kaltenberger committed
3067 3068 3069
	  
	  /*	  
	  LOG_T(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:\n",frame,subframe,
3070 3071 3072 3073 3074 3075
		harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0]!=NULL){
	    for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
	      LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
	    LOG_T(PHY,"\n");	  
	  }
Florian Kaltenberger's avatar
Florian Kaltenberger committed
3076
	  */
3077 3078
	  

Raymond Knopp's avatar
 
Raymond Knopp committed
3079
	  //	  dump_ulsch(phy_vars_eNB,sched_subframe,i);
Raymond Knopp's avatar
 
Raymond Knopp committed
3080
	  //mac_exit_wrapper("ULSCH error");
3081 3082
	  
	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mdlharq) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3083
	    LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mdlharq %d reached\n",
3084
		  phy_vars_eNB->Mod_id,harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
3085
		  frame,subframe, i,
3086 3087 3088 3089 3090
		  phy_vars_eNB->ulsch_eNB[i]->Mdlharq);
	    
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0;
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0;
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++;
3091
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors++;
Raymond Knopp's avatar
 
Raymond Knopp committed
3092
	    //dump_ulsch(phy_vars_eNB, sched_subframe, i);
3093 3094 3095
	  }
	
	  // If we've dropped the UE, go back to PRACH mode for this UE
Raymond Knopp's avatar
 
Raymond Knopp committed
3096
	  //#if !defined(EXMIMO_IOT)
3097 3098 3099
	  if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) {
	    LOG_I(PHY,"[eNB %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, removing UE\n",
		  phy_vars_eNB->Mod_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors);
3100

Raymond Knopp's avatar
 
Raymond Knopp committed
3101
	    //	    mac_xface->macphy_exit("Consecutive error count reached");
3102

3103
	    phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
3104
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
3105
	    /*	    mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
3106
				      frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
3107
				      phy_vars_eNB->eNB_UE_stats[i].crnti);*/
3108
#endif
3109
	    remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
3110
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
3111
	  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3112
	  //#endif
3113 3114 3115 3116 3117
	}
      }  // ulsch in error
      else {
	LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
	      phy_vars_eNB->Mod_id,harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
3118
	      frame,subframe);	    
3119

3120 3121 3122 3123 3124 3125 3126 3127 3128 3129
	for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++)
	  //this is the RSSI per RB
	  phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = 
	    dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]*
		     (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/
		     phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) -
	    phy_vars_eNB->rx_total_gain_eNB_dB -
	    hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 -
	    get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid)/100;

3130 3131 3132
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
3133
	phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0;
3134 3135

	if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
3136 3137
#ifdef OPENAIR2
#ifdef DEBUG_PHY_PROC
3138 3139 3140
	  LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n",
		phy_vars_eNB->Mod_id,
		frame,harq_pid,i);
3141
#endif
3142
	  mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3143
			    phy_vars_eNB->CC_id,
3144 3145 3146
			    frame,
			    phy_vars_eNB->ulsch_eNB[i]->rnti,
			    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
Raymond Knopp's avatar
 
Raymond Knopp committed
3147
			    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159
			    harq_pid,
			    &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag);
	  // false msg3 detection by MAC: empty PDU
	  if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 0 ) {
	    phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
	    mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
				      phy_vars_eNB->CC_id,
				      frame,
				      phy_vars_eNB->eNB_UE_stats[i].crnti);
	    remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
	    phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
	  }
3160
	  /*
Raymond Knopp's avatar
 
Raymond Knopp committed
3161 3162 3163 3164 3165
	    mac_xface->terminate_ra_proc(phy_vars_eNB->Mod_id,
	    frame,
	    phy_vars_eNB->ulsch_eNB[i]->rnti,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
3166
	  */
3167 3168
#endif

3169 3170
	  phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH;
	  phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0;
3171 3172

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
3173
	  LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,subframe,i);
3174 3175
#endif //DEBUG_PHY_PROC

Florian Kaltenberger's avatar
Florian Kaltenberger committed
3176 3177 3178 3179 3180 3181 3182 3183
	  for (k=0;k<8;k++) {//harq_processes
	    for (j=0;j<phy_vars_eNB->dlsch_eNB[i][0]->Mdlharq;j++) {
	      phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0;
	      phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0;
	      phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0;
	    }
	    phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0;
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0;
3184
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
Florian Kaltenberger's avatar
Florian Kaltenberger committed
3185 3186 3187 3188 3189 3190
	    for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->Mdlharq;j++) {
	      phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0;
	      phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0;
	      phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0;
	      phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0;
	    }
3191
	  }
Florian Kaltenberger's avatar
Florian Kaltenberger committed
3192 3193 3194
	  phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0;
	  phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0;
	  phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0;
3195

3196 3197 3198 3199
	  //mac_xface->macphy_exit("Mode PUSCH. Exiting.\n");
	}
	else {
	  
3200 3201
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_ULSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
3202
	  LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
3203 3204 3205 3206
		harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
	  for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
	    LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
	  LOG_T(PHY,"\n");
3207 3208
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3209
	  //dump_ulsch(phy_vars_eNB,sched_subframe,i);
3210
 
3211 3212

#ifdef OPENAIR2
3213 3214
	  //	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) {
	  mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3215
			    phy_vars_eNB->CC_id,
3216 3217 3218
			    frame,
			    phy_vars_eNB->ulsch_eNB[i]->rnti,
			    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
Raymond Knopp's avatar
 
Raymond Knopp committed
3219
			    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
3220 3221
			    harq_pid,
			    NULL);
3222 3223
	  //}
	  /*
3224 3225
	    else {
	    // Retrieve calibration information and do whatever
Raymond Knopp's avatar
 
Raymond Knopp committed
3226
	    LOG_D(PHY,"[eNB][Auto-Calibration] Frame %d, Subframe %d : ULSCH PDU (RX) %d bytes\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);	    
3227
	    }
3228
	  */
3229
#endif
3230
	}
3231

3232 3233
	// estimate timing advance for MAC
	if (abstraction_flag == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3234
	  sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe);
3235 3236
	  phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8; //to check 
	}
3237

3238
#ifdef DEBUG_PHY_PROC	
Raymond Knopp's avatar
 
Raymond Knopp committed
3239
	LOG_D(PHY,"[eNB %d] frame %d, subframe %d: user %d in sector %d: timing advance = %d\n",
3240
	      phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3241
	      frame, subframe, 
3242 3243
	      i, sect_id,
	      phy_vars_eNB->eNB_UE_stats[i].timing_advance_update);
3244
#endif
3245
	
3246

3247 3248 3249
      }  // ulsch not in error
      
      // process HARQ feedback
3250
#ifdef DEBUG_PHY_PROC
3251 3252
      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id,
	    phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3253
	    frame,subframe,
3254 3255 3256
	    i);
#endif
      process_HARQ_feedback(i,
Raymond Knopp's avatar
 
Raymond Knopp committed
3257
			    sched_subframe,
3258 3259 3260 3261 3262 3263
			    phy_vars_eNB,
			    1, // pusch_flag
			    0,
			    0,
			    0);
      
Raymond Knopp's avatar
 
Raymond Knopp committed
3264 3265
#ifdef DEBUG_PHY_PROC
      LOG_D(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", 
Raymond Knopp's avatar
 
Raymond Knopp committed
3266
	    phy_vars_eNB->Mod_id,frame,subframe,
3267 3268 3269 3270
	    phy_vars_eNB->eNB_UE_stats[i].sector, 
	    harq_pid, 
	    i, 
	    ret, 
Raymond Knopp's avatar
 
Raymond Knopp committed
3271 3272 3273
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status, 
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],	
	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1], 
3274 3275
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid],
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]);
Raymond Knopp's avatar
 
Raymond Knopp committed
3276
#endif
3277

Florian Kaltenberger's avatar
Florian Kaltenberger committed
3278
    }
3279

3280
#ifdef PUCCH
3281
    else if ((phy_vars_eNB->dlsch_eNB[i][0]) &&
Raymond Knopp's avatar
 
Raymond Knopp committed
3282
	     (phy_vars_eNB->dlsch_eNB[i][0]->rnti>0)) { // check for PUCCH
3283 3284

      // check SR availability
Raymond Knopp's avatar
 
Raymond Knopp committed
3285
      do_SR = is_SR_subframe(phy_vars_eNB,i,sched_subframe);
3286 3287 3288 3289 3290 3291
      //      do_SR = 0;
    
      // Now ACK/NAK
      // First check subframe_tx flag for earlier subframes
      get_n1_pucch_eNB(phy_vars_eNB,
		       i,
Raymond Knopp's avatar
 
Raymond Knopp committed
3292
		       sched_subframe,
3293 3294 3295 3296 3297 3298 3299
		       &n1_pucch0,
		       &n1_pucch1,
		       &n1_pucch2,
		       &n1_pucch3);

      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n",
	    phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3300
	    frame,subframe,
3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318
	    n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR);

      if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) {  // no TX PDSCH that have to be checked and no SR for this UE_id
      }
      else {
	// otherwise we have some PUCCH detection to do
      
	if (do_SR == 1) {
	  phy_vars_eNB->eNB_UE_stats[i].sr_total++;
	
	  if (abstraction_flag == 0)
	    metric0 = rx_pucch(phy_vars_eNB,
			       pucch_format1,
			       i,
			       phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
			       0, // n2_pucch
			       1, // shortened format
			       &SR_payload,
Raymond Knopp's avatar
 
Raymond Knopp committed
3319
			       subframe,
3320
			       PUCCH1_THRES);
3321
#ifdef PHY_ABSTRACTION
3322 3323 3324 3325 3326 3327
	  else {
	    metric0 = rx_pucch_emul(phy_vars_eNB,
				    i,
				    pucch_format1,
				    0,
				    &SR_payload,
Raymond Knopp's avatar
 
Raymond Knopp committed
3328
				    sched_subframe);
3329
	    LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3330
		  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex);
3331 3332 3333 3334
	  }
#endif

	  if (SR_payload == 1) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3335
	    LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3336
		  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe);
3337 3338 3339 3340 3341 3342 3343
	    phy_vars_eNB->eNB_UE_stats[i].sr_received++;
	    if (phy_vars_eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
	      phy_vars_eNB->first_sr[i] = 0;
	      phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->round=0;
	      phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status=SCH_IDLE;
	      LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n",
		    phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3344
		    phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe);
3345
	    }
3346
#ifdef OPENAIR2
3347
	    mac_xface->SR_indication(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3348
				     phy_vars_eNB->CC_id,
3349
				     frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
3350
				     phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
3351
#endif
3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362
	  } 
	}// do_SR==1
	if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR
	}
	else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD
	  // if SR was detected, use the n1_pucch from SR, else use n1_pucch0
	  n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex:n1_pucch0;
	  if (abstraction_flag == 0)
	    metric0 = rx_pucch(phy_vars_eNB,
			       pucch_format1a,
			       i,
3363
			       (uint16_t)n1_pucch0,
3364 3365 3366
			       0, //n2_pucch
			       1, // shortened format
			       pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3367
			       subframe,
3368 3369
			       PUCCH1a_THRES);
	  else {
3370
#ifdef PHY_ABSTRACTION
3371 3372 3373 3374
	    metric0 = rx_pucch_emul(phy_vars_eNB,i,
				    pucch_format1a,
				    0,
				    pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3375
				    subframe);
3376
#endif
3377
	  }	
3378
#ifdef DEBUG_PHY_PROC	  
Raymond Knopp's avatar
 
Raymond Knopp committed
3379
	  LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n",
3380 3381
		phy_vars_eNB->Mod_id,
		phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3382
		frame,subframe,
3383 3384 3385
		pucch_payload0[0],metric0);
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
3386
	  process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400
				0,// pusch_flag
				pucch_payload0,
				2,
				SR_payload);

	} // FDD
	else {  //TDD
	
	  bundling_flag = phy_vars_eNB->pucch_config_dedicated[i].tdd_AckNackFeedbackMode;
	
	  // fix later for 2 TB case and format1b

	  if ((frame_parms->frame_type==FDD) || 
	      (bundling_flag==bundling)    || 
Raymond Knopp's avatar
 
Raymond Knopp committed
3401
	      ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) {
3402 3403 3404 3405 3406 3407 3408 3409 3410 3411
	    format = pucch_format1a;
	    //	    msg("PUCCH 1a\n");
	  }
	  else {
	    format = pucch_format1b;
	    //	    msg("PUCCH 1b\n");
	  }
	
	  // if SR was detected, use the n1_pucch from SR
	  if (SR_payload==1) {
3412
#ifdef DEBUG_PHY_PROC	  
Raymond Knopp's avatar
 
Raymond Knopp committed
3413
	    LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id,
3414
		  phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3415
		  frame,subframe,
3416 3417 3418 3419 3420 3421 3422 3423 3424 3425
		  n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
#endif
	    if (abstraction_flag == 0) 
	      metric0 = rx_pucch(phy_vars_eNB,
				 format,
				 i,
				 phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
				 0, //n2_pucch
				 1, // shortened format
				 pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3426
				 subframe,
3427 3428
				 PUCCH1a_THRES);
	    else {
3429
#ifdef PHY_ABSTRACTION
3430 3431 3432 3433
	      metric0 = rx_pucch_emul(phy_vars_eNB,i,
				      format,
				      0,
				      pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3434
				      subframe);
3435 3436 3437 3438
#endif
	    } 
	  }
	  else {  //using n1_pucch0/n1_pucch1 resources
3439
#ifdef DEBUG_PHY_PROC	  
Raymond Knopp's avatar
 
Raymond Knopp committed
3440
	    LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id,
3441
		  phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3442
		  frame,subframe,
3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453
		  n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
#endif
	    metric0=0;
	    metric1=0;
	    
	    // Check n1_pucch0 metric
	    if (n1_pucch0 != -1) {
	      if (abstraction_flag == 0) 
		metric0 = rx_pucch(phy_vars_eNB,
				   format,
				   i,
3454
				   (uint16_t)n1_pucch0,
3455 3456 3457
				   0, // n2_pucch
				   1, // shortened format
				   pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3458
				   subframe,
3459 3460
				   PUCCH1a_THRES);
	      else {
3461
#ifdef PHY_ABSTRACTION
3462 3463 3464 3465
		metric0 = rx_pucch_emul(phy_vars_eNB,i,
					format,
					0,
					pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3466
					subframe);
3467
#endif
3468 3469
	      }
	    }
3470

3471 3472 3473 3474 3475 3476
	    // Check n1_pucch1 metric
	    if (n1_pucch1 != -1) {
	      if (abstraction_flag == 0)
		metric1 = rx_pucch(phy_vars_eNB,
				   format,
				   i,
3477
				   (uint16_t)n1_pucch1,
3478 3479 3480
				   0, //n2_pucch
				   1, // shortened format
				   pucch_payload1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3481
				   subframe,
3482 3483
				   PUCCH1a_THRES);
	      else {
3484
#ifdef PHY_ABSTRACTION
3485 3486 3487 3488
		metric1 = rx_pucch_emul(phy_vars_eNB,i,
					format,
					1,
					pucch_payload1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3489
					subframe);
3490

3491
		
3492
#endif
3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512
	      }
	    }
	  }

	  if (SR_payload == 1) {
	    pucch_payload = pucch_payload0;
	    if (bundling_flag == bundling)
	      pucch_sel = 2;
	  }
	  else if (bundling_flag == multiplexing) {  // multiplexing + no SR
	    pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0;
	    pucch_sel     = (metric1>metric0) ? 1 : 0;
	  }
	  else { // bundling + no SR
	    if (n1_pucch1 != -1)
	      pucch_payload = pucch_payload1;
	    else if (n1_pucch0 != -1)
	      pucch_payload = pucch_payload0;
	    pucch_sel = 2;  // indicate that this is a bundled ACK/NAK  
	  }
3513
#ifdef DEBUG_PHY_PROC	  
Raymond Knopp's avatar
 
Raymond Knopp committed
3514
	  LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id,
3515
		phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3516
		frame,subframe,
3517
		metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
3518
#endif	  
Raymond Knopp's avatar
 
Raymond Knopp committed
3519
	  process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
3520 3521 3522 3523 3524
				0,// pusch_flag
				pucch_payload,
				pucch_sel,
				SR_payload);
	}
Lionel Gauthier's avatar
Lionel Gauthier committed
3525
      }
3526 3527 3528 3529
    } // PUCCH processing
    
#endif //PUCCH
  
3530
    if ((frame % 100 == 0) && (subframe == 4)) {
3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548
      for (harq_idx=0;harq_idx<8;harq_idx++) {
	for (round=0;round<phy_vars_eNB->ulsch_eNB[i]->Mdlharq;round++) {
	  if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - 
	       phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) {
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 
	      (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round] - 
		    phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/
	      (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] - 
	       phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]);
	  }
	  else {
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 0;
	  }
	  phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] = 
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round];
	  phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round] = 
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round];
	}
3549 3550 3551
      }
    }
    
Florian Kaltenberger's avatar
Florian Kaltenberger committed
3552
    if ((frame % 100 == 0) && (subframe==4)) {
3553
      phy_vars_eNB->eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS - 
Florian Kaltenberger's avatar
Florian Kaltenberger committed
3554
						     phy_vars_eNB->eNB_UE_stats[i].total_TBS_last);
3555 3556 3557 3558 3559 3560
      
      phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS;
    }
    
    num_active_cba_groups = phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups;
    /*if (num_active_cba_groups > 0 )
Raymond Knopp's avatar
 
Raymond Knopp committed
3561 3562 3563
      LOG_D(PHY,"[eNB] last slot %d trying cba transmission decoding UE %d num_grps %d rnti %x flag %d\n",
      last_slot, i, num_active_cba_groups,phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],
      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag );
3564 3565 3566 3567
    */ 
    if ((phy_vars_eNB->ulsch_eNB[i]) &&
	(num_active_cba_groups > 0) &&
	(phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]>0) &&
Raymond Knopp's avatar
 
Raymond Knopp committed
3568
	(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) {
3569
      rnti=0;
3570 3571

#ifdef DEBUG_PHY_PROC
3572 3573
      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n",
	    phy_vars_eNB->Mod_id,harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
3574
	    frame,subframe,
3575
	    i, (uint16_t)phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]);
3576 3577 3578
#endif
      if (abstraction_flag==0) {
	rx_ulsch(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
3579
		 sched_subframe,
3580 3581 3582 3583 3584
		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		 i,
		 phy_vars_eNB->ulsch_eNB,
		 0);
      }
3585
#ifdef PHY_ABSTRACTION
3586 3587
      else {
	rx_ulsch_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
3588
		      subframe,
3589 3590 3591
		      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		      i);
      }
3592
#endif
3593 3594 3595 3596
      
      if (abstraction_flag == 0) {
	ret = ulsch_decoding(phy_vars_eNB,
			     i,
Raymond Knopp's avatar
 
Raymond Knopp committed
3597
			     sched_subframe,
3598
			     0, // control_only_flag
Raymond Knopp's avatar
 
Raymond Knopp committed
3599
			     phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI, 
3600 3601
			     0);  
      }
3602
#ifdef PHY_ABSTRACTION
3603 3604
      else {
	ret = ulsch_decoding_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
3605
				  sched_subframe,
3606 3607 3608
				  i,
				  &rnti);
      }
3609
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3610
      if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) {
3611
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
3612
	//if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) 
Raymond Knopp's avatar
 
Raymond Knopp committed
3613
	print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL);
3614
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3615 3616
	extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode);
	phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0];
3617
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
3618 3619 3620
      /*  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the sched_subframeuling_flag, total cba groups %d %d\n",
	  phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i,harq_pid,
	  phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups,num_active_cba_groups);
3621 3622 3623 3624 3625 3626 3627 3628 3629
      */
      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0;
      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->status= SCH_IDLE;
      
      if ((num_active_cba_groups > 0) &&
	  //  (i % num_active_cba_groups == 0) && // this ue is used a a template for the CBA
	  (i + num_active_cba_groups < NUMBER_OF_UE_MAX) &&
	  (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->cba_rnti[i%num_active_cba_groups] > 0 ) &&
	  (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->num_active_cba_groups> 0)) {
3630
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
3631
	LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
3632
	      phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid,
3633
	      i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups);
3634
#endif
3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648
	phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1;
	phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE;
	phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS;
      }
      
      if (ret == (1+MAX_TURBO_ITERATIONS)) {
	phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
      } // ulsch in error
      else {
	LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
	      phy_vars_eNB->Mod_id,harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
3649
	      frame,subframe);	    
3650 3651 3652 3653
	
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
3654
	phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0;
3655 3656
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_ULSCH
3657
	LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",
Raymond Knopp's avatar
 
Raymond Knopp committed
3658
	      frame,subframe,
3659 3660 3661 3662 3663 3664 3665
	      harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
	for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
	  LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
	LOG_T(PHY,"\n");
#endif
#endif
	if (access_mode > UNKNOWN_ACCESS){
Raymond Knopp's avatar
 
Raymond Knopp committed
3666
	  LOG_D(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", 
Raymond Knopp's avatar
 
Raymond Knopp committed
3667
		phy_vars_eNB->Mod_id, frame,subframe,
3668 3669 3670 3671 3672
		i, phy_vars_eNB->ulsch_eNB[i]->rnti,
		i % phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]);
	  // detect if there is a CBA collision 
	  if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 0 ) {
	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3673
			      phy_vars_eNB->CC_id,
3674 3675 3676
			      frame,
			      phy_vars_eNB->ulsch_eNB[i]->rnti,
			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
Raymond Knopp's avatar
 
Raymond Knopp committed
3677
			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
3678 3679 3680
			      harq_pid,
			      NULL);

Raymond Knopp's avatar
 
Raymond Knopp committed
3681
	    phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]=1;//(subframe);
3682 3683
	  } else {
	    LOG_N(PHY,"[eNB %d] Frame %d subframe %d : CBA collision detected for UE%d for group %d, set the SR for this UE \n ",
Raymond Knopp's avatar
 
Raymond Knopp committed
3684
		  phy_vars_eNB->Mod_id,frame,subframe,
3685 3686
		  i,i%num_active_cba_groups ); 
	    mac_xface->SR_indication(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3687
				     phy_vars_eNB->CC_id,
3688
				     frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
3689
				     phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
3690 3691 3692 3693 3694 3695
	  }
	  
	}
      } // ULSCH CBA not in error 
    }
       
3696 3697
  } // loop i=0 ... NUMBER_OF_UE_MAX-1

Raymond Knopp's avatar
 
Raymond Knopp committed
3698
  if (pusch_active == 0){
3699 3700
    if (abstraction_flag == 0) {
      //      LOG_D(PHY,"[eNB] Frame %d, subframe %d Doing I0_measurements\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
3701
      //	  (((subframe)==9)?-1:0) + phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
3702 3703 3704 3705
      lte_eNB_I0_measurements(phy_vars_eNB,
			      0,
			      phy_vars_eNB->first_run_I0_measurements);
    }
3706
#ifdef PHY_ABSTRACTION
3707 3708 3709 3710
    else {
      lte_eNB_I0_measurements_emul(phy_vars_eNB,
				   sect_id);
    }
3711
#endif
3712 3713 3714 3715
  
    
    if (I0_clear == 1)
      I0_clear = 0;
3716 3717 3718
  }

#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
3719
  phy_procedures_emos_eNB_RX(subframe,phy_vars_eNB);
3720 3721 3722
#endif

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,0);
3723 3724
  stop_meas(&phy_vars_eNB->phy_proc_rx);
   
3725 3726 3727 3728
}

#undef DEBUG_PHY_PROC

3729 3730
#ifdef Rel10  
int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type){
3731
  
3732 3733 3734 3735 3736 3737
  int do_proc=0;// do nothing
  switch(r_type){
  case no_relay:
    do_proc= no_relay; // perform the normal eNB operation 
    break;
  case multicast_relay:
3738
    if (((next_slot >>1) < 6) || ((next_slot >>1) > 8))
3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750
      do_proc = 0; // do nothing
    else // SF#6, SF#7 and SF#8 
      do_proc = multicast_relay; // do PHY procedures eNB TX 
    break;
  default: // should'not be here
    LOG_W(PHY,"Not supported relay type %d, do nothing\n", r_type);
    do_proc=0; 
    break;
  }
  return do_proc;
}
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
3751
void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t abstraction_flag, 
3752
			    relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) {
3753
#if defined(ENABLE_ITTI)
3754 3755 3756 3757 3758
  MessageDef   *msg_p;
  const char   *msg_name;
  instance_t    instance;
  unsigned int  Mod_id;
  int           result;
3759
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3760

Raymond Knopp's avatar
 
Raymond Knopp committed
3761 3762 3763

  int CC_id=0;

3764
  /*
Raymond Knopp's avatar
 
Raymond Knopp committed
3765
    if (phy_vars_eNB->proc[sched_subframe].frame_tx >= 1000)
3766
    mac_xface->macphy_exit("Exiting after 1000 Frames\n");
3767
  */
Raymond Knopp's avatar
 
Raymond Knopp committed
3768
  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, phy_vars_eNB[0]->proc[subframe].frame_tx);
3769
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1);
Raymond Knopp's avatar
 
Raymond Knopp committed
3770
  start_meas(&phy_vars_eNB[0]->phy_proc);
Lionel Gauthier's avatar
Lionel Gauthier committed
3771

3772 3773
#if defined(ENABLE_ITTI)
  do {
3774 3775
    // Checks if a message has been sent to PHY sub-task
    itti_poll_msg (TASK_PHY_ENB, &msg_p);
3776

3777 3778 3779 3780
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
      Mod_id = instance;
3781

3782
      switch (ITTI_MSG_ID(msg_p)) {
Lionel Gauthier's avatar
Lionel Gauthier committed
3783
#   if defined(ENABLE_RAL)
Raymond Knopp's avatar
 
Raymond Knopp committed
3784 3785 3786 3787 3788
      case TIMER_HAS_EXPIRED:
	// check if it is a measurement timer
	{
	  hashtable_rc_t       hashtable_rc;

Raymond Knopp's avatar
 
Raymond Knopp committed
3789
	  hashtable_rc = hashtable_is_key_exists(PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id));
Raymond Knopp's avatar
 
Raymond Knopp committed
3790 3791 3792 3793 3794
	  if (hashtable_rc == HASH_TABLE_OK) {
	    phy_eNB_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg);
	  }
	}
	break;
Lionel Gauthier's avatar
Lionel Gauthier committed
3795 3796


Raymond Knopp's avatar
 
Raymond Knopp committed
3797
      case PHY_MEAS_THRESHOLD_REQ:
Lionel Gauthier's avatar
Lionel Gauthier committed
3798
#warning "TO DO LIST OF THRESHOLDS"
Raymond Knopp's avatar
 
Raymond Knopp committed
3799
	LOG_D(PHY, "[ENB %d] Received %s\n", Mod_id, msg_name);
Raymond Knopp's avatar
 
Raymond Knopp committed
3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829
	{
	  ral_threshold_phy_t* threshold_phy_p  = NULL;
	  int                  index, res;
	  long                 timer_id;
	  hashtable_rc_t       hashtable_rc;

	  switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action) {

	  case RAL_TH_ACTION_CANCEL_THRESHOLD:
	    break;

	  case RAL_TH_ACTION_SET_NORMAL_THRESHOLD:
	  case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD:
	    for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) {
	      threshold_phy_p                  = calloc(1, sizeof(ral_threshold_phy_t));
	      threshold_phy_p->th_action       = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action;
	      memcpy(&threshold_phy_p->link_param.link_param_type,
		     &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type,
		     sizeof(ral_link_param_type_t));

	      memcpy(&threshold_phy_p->threshold,
		     &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index],
		     sizeof(ral_threshold_t));

	      switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) {

	      case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL:
		switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) {
		case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
		  SLIST_INSERT_HEAD(
Raymond Knopp's avatar
 
Raymond Knopp committed
3830
				    &PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen],
Raymond Knopp's avatar
 
Raymond Knopp committed
3831 3832 3833 3834 3835 3836
				    threshold_phy_p,
				    ral_thresholds);
		  break;

		case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
		  SLIST_INSERT_HEAD(
Raymond Knopp's avatar
 
Raymond Knopp committed
3837
				    &PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte],
Raymond Knopp's avatar
 
Raymond Knopp committed
3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858
				    threshold_phy_p,
				    ral_thresholds);
		  break;

		default:
		  LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n",
			Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name);
		}
		break;

	      case RAL_LINK_CFG_PARAM_CHOICE_TIMER:
		res = timer_setup(
				  (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t      interval_sec,
				  (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t      interval_us,
				  TASK_PHY_ENB,
				  instance,
				  TIMER_PERIODIC,
				  threshold_phy_p,
				  &timer_id);

		if (res == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3859
		  hashtable_rc = hashtable_insert(PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p);
Raymond Knopp's avatar
 
Raymond Knopp committed
3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886
		  if (hashtable_rc == HASH_TABLE_OK) {
		    threshold_phy_p->timer_id = timer_id;
		  } else {
		    LOG_E(PHY, "[ENB %d]  %s: Error in hashtable. Could not configure threshold index %d \n",
			  Mod_id, msg_name, index);
		  }

		} else {
		  LOG_E(PHY, "[ENB %d]  %s: Could not configure threshold index %d because of timer initialization failure\n",
			Mod_id, msg_name, index);
		}
		break;

	      default: // already checked in RRC, should not happen here
		LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.union_choice %d in %s\n",
		      Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name);
	      }
	    }
	    break;

	  default:
	    LOG_E(PHY, "[ENB %d] BAD PARAMETER th_action value %d in %s\n",
		  Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name);
	  }

	}
	break;
Lionel Gauthier's avatar
Lionel Gauthier committed
3887
#   endif
3888

Raymond Knopp's avatar
 
Raymond Knopp committed
3889 3890 3891 3892
	/* Messages from eNB app */
      case PHY_CONFIGURATION_REQ:
	LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name);
	/* TODO */
3893

Raymond Knopp's avatar
 
Raymond Knopp committed
3894
	break;
3895

Raymond Knopp's avatar
 
Raymond Knopp committed
3896 3897 3898
      default:
	LOG_E(PHY, "[ENB %d] Received unexpected message %s\n", Mod_id, msg_name);
	break;
Lionel Gauthier's avatar
Lionel Gauthier committed
3899
      }
3900 3901 3902 3903

      result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
      AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
    }
3904 3905 3906
  } while(msg_p != NULL);
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
3907 3908 3909 3910 3911

  for (CC_id=0;CC_id<MAX_NUM_CCs; CC_id++) {
    if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD)&&
	  (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))||
	 (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) {
3912
#ifdef Rel10 
Raymond Knopp's avatar
 
Raymond Knopp committed
3913
      if (phy_procedures_RN_eNB_TX(phy_vars_eNB[CC_id]->proc[subframe].subframe_rx, phy_vars_eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 ) 
3914
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
3915 3916 3917 3918 3919 3920 3921 3922
	phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn);
    }
    if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD )&&
	  (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) ||
	 (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))){
      phy_procedures_eNB_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type);
    }
    if (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) {
3923
#ifdef Rel10 
Raymond Knopp's avatar
 
Raymond Knopp committed
3924
      if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 )
3925
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
3926 3927 3928 3929 3930
	phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn);
    }
    if ((subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)){
      phy_procedures_eNB_S_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type);
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
3931

Raymond Knopp's avatar
 
Raymond Knopp committed
3932 3933 3934 3935 3936 3937 3938
    phy_vars_eNB[CC_id]->proc[subframe].frame_tx++;
    phy_vars_eNB[CC_id]->proc[subframe].frame_rx++;
    if (phy_vars_eNB[CC_id]->proc[subframe].frame_tx==1024)
      phy_vars_eNB[CC_id]->proc[subframe].frame_tx=0;
    if (phy_vars_eNB[CC_id]->proc[subframe].frame_rx==1024)
      phy_vars_eNB[CC_id]->proc[subframe].frame_rx=0;
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3939
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0);
Raymond Knopp's avatar
 
Raymond Knopp committed
3940
  stop_meas(&phy_vars_eNB[0]->phy_proc);
3941 3942
}