phy_procedures_lte_eNb.c 140 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/*******************************************************************************

  Eurecom OpenAirInterface
  Copyright(c) 1999 - 2011 Eurecom

  This program is free software; you can redistribute it and/or modify it
  under the terms and conditions of the GNU General Public License,
  version 2, as published by the Free Software Foundation.

  This program is distributed in the hope 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.

  You should have received a copy of the GNU General Public License along with
  this program; if not, write to the Free Software Foundation, Inc.,
  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.

  The full GNU General Public License is included in this distribution in
  the file called "COPYING".

  Contact Information
  Openair Admin: openair_admin@eurecom.fr
  Openair Tech : openair_tech@eurecom.fr
  Forums       : http://forums.eurecom.fsr/openairinterface
  Address      : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France

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 62 63 64 65
//#define DEBUG_ULSCH

#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
#include "ARCH/CBMIMO1/DEVICE_DRIVER/defs.h"
#include "ARCH/CBMIMO1/DEVICE_DRIVER/from_grlib_softregs.h"

//#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

66 67
#include "assertions.h"

68
#if defined(ENABLE_ITTI)
Lionel Gauthier's avatar
Lionel Gauthier committed
69 70 71 72
#   include "intertask_interface.h"
#   if defined(ENABLE_RAL)
#     include "timer.h"
#   endif
73 74
#endif

75 76 77 78 79 80
//#define DIAG_PHY

#define NS_PER_SLOT 500000

#define PUCCH 1

81
#define PUCCH1_THRES 15
82
#define PUCCH1a_THRES 15
83 84 85

extern inline unsigned int taus(void);
extern int exit_openair;
86
//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);
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106


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};


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];
107
extern uint8_t smbv_frame_cnt;
108 109 110 111 112 113 114
#endif

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

115
uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t subframe) {
116
  
117
  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
118 119
	phy_vars_eNB->Mod_id,phy_vars_eNB->ulsch_eNB[UE_id]->rnti,phy_vars_eNB->proc[subframe].frame_rx,subframe,
	phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex);
120
  
121
  if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 4) {        // 5 ms SR period
122 123
    if ((subframe%5) == phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex)
      return(1);
124 125
  }
  else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 14) {  // 10 ms SR period
126 127
    if (subframe==(phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5))
      return(1);
128 129
  }
  else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 34) { // 20 ms SR period
Raymond Knopp's avatar
 
Raymond Knopp committed
130
    if ((10*(phy_vars_eNB->proc[subframe].frame_rx&1)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15))
131
      return(1);
132 133
  }
  else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 74) { // 40 ms SR period
Raymond Knopp's avatar
 
Raymond Knopp committed
134
    if ((10*(phy_vars_eNB->proc[subframe].frame_rx&3)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35))
135
      return(1);
136 137
  }
  else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 154) { // 80 ms SR period
Raymond Knopp's avatar
 
Raymond Knopp committed
138
    if ((10*(phy_vars_eNB->proc[subframe].frame_rx&7)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75))
139
      return(1);
140 141 142 143
  }

  return(0);
}
144
 
145 146
int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB) {
  uint8_t i;
147 148 149 150 151

  //#ifdef DEBUG_PHY_PROC
  LOG_I(PHY,"[eNB %d] Adding UE with rnti %x\n",phy_vars_eNB->Mod_id,rnti);
  //#endif
  for (i=0;i<NUMBER_OF_UE_MAX;i++) {
152 153 154 155 156 157 158 159 160 161 162
    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);
163
      }
164
    }
165 166 167 168
  }
  return(-1);
}

169 170
int32_t remove_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB, uint8_t abstraction_flag) {
  uint8_t i;
171 172 173 174 175

  //#ifdef DEBUG_PHY_PROC
  LOG_I(PHY,"eNB %d removing UE with rnti %x\n",phy_vars_eNB->Mod_id,rnti);
  //#endif
  for (i=0;i<NUMBER_OF_UE_MAX;i++) {
176 177 178 179 180 181 182 183 184 185 186
    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
187
	//	mac_exit_wrapper("Removing UE");	
188
	return(i);
189
      }
190
    }
191 192 193 194 195
  }

  return(-1);
}

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

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

211
int get_ue_active_harq_pid(uint8_t Mod_id,uint16_t rnti,uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag) {
212 213 214

  LTE_eNB_DLSCH_t *DLSCH_ptr;  
  LTE_eNB_ULSCH_t *ULSCH_ptr;  
215 216 217 218
  //  uint8_t subframe_m4;
  uint8_t ulsch_subframe,ulsch_frame; 
  uint8_t i;
  int8_t UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id]);
Raymond Knopp's avatar
 
Raymond Knopp committed
219 220 221 222
  int subframe_sched = (subframe == 9) ? 0 : (subframe+1);
  uint32_t frame;

  frame = PHY_vars_eNB_g[Mod_id]->proc[subframe_sched].frame_tx;
223 224

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

  if (ul_flag == 0)  {// this is a DL request
231
    DLSCH_ptr = PHY_vars_eNB_g[Mod_id]->dlsch_eNB[(uint32_t)UE_id][0];
Raymond Knopp's avatar
 
Raymond Knopp committed
232
    /*
233
#ifdef DEBUG_PHY_PROC
234 235 236
    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
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 265 266 267
    // 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);
	}
268
      }
269
    }
270 271 272
  }
  else {  // This is a UL request

273
    ULSCH_ptr = PHY_vars_eNB_g[Mod_id]->ulsch_eNB[(uint32_t)UE_id];
274 275 276 277 278 279 280 281
    ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,subframe);
    ulsch_frame    = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,frame,subframe);
    // Note this is for TDD configuration 3,4,5 only
    *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,
				  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);
282 283 284 285 286 287 288 289 290 291 292 293 294 295
  }
  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) {

296
  int search_space_free,m,nb_candidates = 0,l,i;
297 298 299 300 301 302
  unsigned int Yk;
  /*
    printf("CCE Allocation: ");
    for (i=0;i<nCCE;i++)
    printf("%d.",CCE_table[i]);
    printf("\n");
303
  */
304
  if (common_dci == 1) {
305 306 307 308 309 310 311 312 313
    // 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;
	}
314
      }
315 316 317 318 319 320 321
      if (search_space_free == 1) {
	for (l=0;l<L;l++)
	  CCE_table[(m*L)+l]=1;
	return(m*L);
      }
    }
    return(-1);
322 323 324

  }
  else {  // Find first available in ue specific search space
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
          // 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;
    }

    //        LOG_I(PHY,"rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n",rnti,Yk,nCCE,nCCE/L,nb_candidates);

    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;
	}
358
      }
359 360 361 362 363 364 365
      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);
366 367 368 369 370 371 372 373 374 375
  }
}

#ifdef EMOS
void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_eNB) {

}
#endif

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

  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
385
    
386 387 388 389
  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++) {
390 391
	  
	  
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
  #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);
408
	
409 410 411 412 413
  generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
  4*AMP,
  &phy_vars_eNB->lte_frame_parms,
  2,
  next_slot);
414
      
415 416 417 418 419 420 421 422 423
  }
  else {
  #ifdef PHY_ABSTRACTION
  generate_pss_emul(phy_vars_eNB,sect_id);
  #endif
  }
  }
  }
  }
424
*/ 
425

Raymond Knopp's avatar
 
Raymond Knopp committed
426
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) {
427

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

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

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

Raymond Knopp's avatar
 
Raymond Knopp committed
454 455


456
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
457
void phy_procedures_emos_eNB_RX(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB) {
458
  
459 460 461 462
  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;
463 464 465 466 467

  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
468
  if (subframe==3) 
469
    for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
470 471 472 473 474 475
      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));
476 477 478
    }
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
479
  if (subframe==4) {
480
    emos_dump_eNB.timestamp = rt_get_time_ns();
Raymond Knopp's avatar
 
Raymond Knopp committed
481
    emos_dump_eNB.frame_tx = phy_vars_eNB->proc[subframe].frame;
482 483 484 485 486 487 488 489 490 491
    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
492 493
      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));
494 495
    }
    else {
Raymond Knopp's avatar
 
Raymond Knopp committed
496 497 498
      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);
499
      }
500
    }
501 502 503 504 505
  }
}
#endif

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

  int i;
509 510
  uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
  uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
511

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

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

  switch (subframe) {
Raymond Knopp's avatar
 
Raymond Knopp committed
527 528 529 530 531 532 533
  case 5:
    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       = SI_RNTI;
    DCI_pdu->dci_alloc[0].format     = format1A;
    DCI_pdu->dci_alloc[0].ra_flag    = 0;
534

Raymond Knopp's avatar
 
Raymond Knopp committed
535 536 537 538 539 540 541 542 543 544
    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;
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563
  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));
564
    */
565
    break;
566 567
  case 7:
    DCI_pdu->Num_ue_spec_dci = 1;
568
    
Lionel Gauthier's avatar
Lionel Gauthier committed
569
    if (transmission_mode<3) {
570 571 572 573 574 575 576 577 578 579 580 581 582
      //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          = 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
583
      DLSCH_alloc_pdu.ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
584 585 586 587
      DLSCH_alloc_pdu.rv               = 0;
      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));

      /*
588 589 590 591 592 593 594 595 596 597 598
      //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
599
      //DLSCH_alloc_pdu.mcs              = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);      
600 601 602 603
      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));
604
      */
605
    }
606
    else if (transmission_mode==5) {
607 608 609 610 611 612 613 614 615 616
      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
617
      DLSCH_alloc_pdu1E.ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
618 619 620
      //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
621
      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);      
622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639
      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
640
      DLSCH_alloc_pdu1E.mcs            = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28);
641 642 643 644 645 646
      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
647
    }
648 649
    break;
    /*
Raymond Knopp's avatar
 
Raymond Knopp committed
650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668
      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;
669
    */
670
  case 9:
671
    DCI_pdu->Num_ue_spec_dci = 2;
672 673 674 675 676 677 678 679 680 681 682 683

    //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,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
684
    UL_alloc_pdu.ndi     = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
685 686 687
    UL_alloc_pdu.TPC     = 0;
    UL_alloc_pdu.cshift  = 0;
    UL_alloc_pdu.dai     = 0;
688
    UL_alloc_pdu.cqi_req = 1;
689
    memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
690
       
691 692 693 694 695 696 697 698 699 700 701 702 703
    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
704
    UL_alloc_pdu.ndi     = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
705 706 707 708 709 710
    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;
711
    UL_alloc_pdu.cqi_req = 1;
712 713 714 715 716 717 718 719 720 721
    memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));

    break;

  default:
    break;
  }

  DCI_pdu->nCCE = 0;
  for (i=0;i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci;i++) {
722
    DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
723 724 725 726 727
  }

}

#ifdef EMOS
728
void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eNB) {
729 730

  int i;
731 732
  uint8_t cooperation_flag = phy_vars_eNB->cooperation_flag;
  uint8_t transmission_mode = phy_vars_eNB->transmission_mode[0];
733

734 735
  //uint32_t rballoc = 0x00F0;
  //uint32_t rballoc2 = 0x000F;
736
  /*
Raymond Knopp's avatar
 
Raymond Knopp committed
737 738
    uint32_t rand = taus();
    if ((subframe==8) || (subframe==9) || (subframe==0))
739
    rand = (rand%5)+5;
Raymond Knopp's avatar
 
Raymond Knopp committed
740
    else
741
    rand = (rand%4)+5;
742
  */
743 744 745 746 747

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

  switch (subframe) {
Raymond Knopp's avatar
 
Raymond Knopp committed
748
  case 5:
749
    DCI_pdu->Num_ue_spec_dci = 1;
750
    
Lionel Gauthier's avatar
Lionel Gauthier committed
751
    if (transmission_mode<3) {
752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768
      //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));

      /*
769 770 771 772 773 774
      //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;
775
      
776 777 778 779 780 781 782 783
      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));
784
      */
785 786
    }
    else if (transmission_mode==5) {
787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
      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); 
818 819 820 821 822 823 824 825 826 827 828 829 830 831 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
    }
    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
873
    UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
874
    else 
Raymond Knopp's avatar
 
Raymond Knopp committed
875
    UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
876 877 878 879
    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
880
    UL_alloc_pdu.cshift  = 0;
881
    else
Raymond Knopp's avatar
 
Raymond Knopp committed
882
    UL_alloc_pdu.cshift  = 1;
883 884 885
    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));
886
    */
887
    break;
888
    
889 890 891 892 893 894
  default:
    break;
  }

  DCI_pdu->nCCE = 0;
  for (i=0;i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci;i++) {
895
    DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
896 897 898 899 900 901 902 903 904 905 906
  }

}
#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
907 908 909 910 911 912

#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
913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939
  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;
940
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
941 942
    itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p);
  }
Lionel Gauthier's avatar
Lionel Gauthier committed
943 944 945
}

void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP) {
Raymond Knopp's avatar
 
Raymond Knopp committed
946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967
  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
968
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002
    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
1003 1004 1005 1006
}
#   endif
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1007 1008


Raymond Knopp's avatar
 
Raymond Knopp committed
1009
void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,
1010
			   relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) {
1011
  uint8_t *pbch_pdu=&phy_vars_eNB->pbch_pdu[0];
1012
  //  unsigned int nb_dci_ue_spec = 0, nb_dci_common = 0;
1013
  uint16_t input_buffer_length, re_allocated=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
1014
  uint32_t i,aa;
1015
  uint8_t harq_pid;
1016
  DCI_PDU *DCI_pdu;
1017
  uint8_t *DLSCH_pdu=NULL;
1018 1019
#ifndef OPENAIR2
  DCI_PDU DCI_pdu_tmp;
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
  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;
1030
#ifdef Rel10
1031 1032
  MCH_PDU *mch_pduP;
  MCH_PDU  mch_pdu;
1033
  uint8_t sync_area=255;
1034 1035 1036 1037
#endif
#if defined(SMBV) && !defined(EXMIMO)
  // counts number of allocations in subframe
  // there is at least one allocation for PDCCH
1038
  uint8_t smbv_alloc_cnt = 1;
1039
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1040
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
1041

1042
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1);
1043
  start_meas(&phy_vars_eNB->phy_proc_tx);
Raymond Knopp's avatar
 
Raymond Knopp committed
1044
  
1045 1046
#ifdef DEBUG_PHY_PROC
  LOG_D(PHY,"[%s %d] Frame %d subframe %d : Doing phy_procedures_eNB_TX(%d)\n", 
1047
	(r_type == multicast_relay) ? "RN/eNB" : "eNB",
Raymond Knopp's avatar
 
Raymond Knopp committed
1048
	phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, subframe);
1049
#endif
1050 1051
#ifdef OPENAIR2
  // Get scheduling info for next subframe during odd slot of previous subframe (next_slot is even)
Raymond Knopp's avatar
 
Raymond Knopp committed
1052
  mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1);
1053
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1054
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1055
  //  for (sect_id = 0 ; sect_id < number_of_cards; sect_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1056
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1057

Raymond Knopp's avatar
 
Raymond Knopp committed
1058 1059
  if (abstraction_flag==0) {
    for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB;aa++) {
1060
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1061 1062 1063 1064
      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
1065 1066


Raymond Knopp's avatar
 
Raymond Knopp committed
1067
  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
1068

Raymond Knopp's avatar
 
Raymond Knopp committed
1069 1070 1071 1072 1073 1074 1075
    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
1076

1077
#ifdef Rel10
Raymond Knopp's avatar
 
Raymond Knopp committed
1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
    // 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 
    mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
    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
1115
	mch_pduP=NULL;
Raymond Knopp's avatar
 
Raymond Knopp committed
1116 1117 1118 1119 1120 1121 1122 1123 1124
      }
      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
1125
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1126 1127 1128
    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
1129
      generate_mch(phy_vars_eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag);
1130
#ifdef DEBUG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
1131 1132 1133
      for (i=0;i<mch_pduP->Pdu_size;i++)
	msg("%2x.",(uint8_t)mch_pduP->payload[i]);
      msg("\n");
1134
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
1135 1136
    } else {
      LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
1137
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1138 1139
#endif
  }
1140
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1141
  else {
Raymond Knopp's avatar
 
Raymond Knopp committed
1142
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1143
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154
    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);
1155
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168
      // 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
1169
	    
Raymond Knopp's avatar
 
Raymond Knopp committed
1170 1171
	}
      }    
Raymond Knopp's avatar
 
Raymond Knopp committed
1172
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1173
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1174

Raymond Knopp's avatar
 
Raymond Knopp committed
1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202
  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);
1203
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218
      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
1219
      }
1220
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233
      ((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
1234
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1235
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1236 1237 1238
      
      
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1239
    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
1240
      
1241
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1242 1243 1244 1245 1246 1247 1248 1249 1250
    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]);
1251
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1252
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1253
    if (abstraction_flag==0) {
1254
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1255 1256 1257 1258 1259 1260
      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
1261
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1262
    }
1263
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1264 1265 1266
    else {
      generate_pbch_emul(phy_vars_eNB,pbch_pdu); 
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1267
#endif
1268
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1269
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1270
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1271
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1272
  if (subframe == 1) {
1273
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1274
    if (abstraction_flag==0) {
1275
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1276 1277 1278 1279 1280 1281 1282
      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
1283
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1284 1285
    }
  } 
Raymond Knopp's avatar
 
Raymond Knopp committed
1286
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1287 1288
  // Second half of PSS/SSS (FDD)
  if (subframe == 5) {
1289
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1290
    if (abstraction_flag==0) {
1291
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
      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);
1303
	  
1304
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1305
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1306 1307 1308 1309
  }
  //  Second-half of SSS (TDD)
  if (subframe == 5) {
    if (abstraction_flag==0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1310
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1311 1312 1313 1314 1315 1316
      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);
1317
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1318
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1319 1320 1321
  }
  // Second half of PSS (TDD)
  if (subframe == 6) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1322
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1323
    if (abstraction_flag==0) {
1324
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1325 1326 1327 1328 1329 1330 1331
      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);
1332
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1333
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1334
  }
1335
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1336 1337
  
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1338
  //  sect_id=0;
1339
    
1340
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1341 1342 1343 1344 1345
  // 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++;
  }
1346
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1347
    
1348
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1349
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1350 1351 1352 1353 1354
  // 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,
				   phy_vars_eNB->proc[sched_subframe].frame_tx,
				   subframe);
1355
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1356
  DCI_pdu = &DCI_pdu_tmp;
1357
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369
  /*
    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");
    } 
  */     
1370
#endif
1371
#ifdef EMOS_CHANNEL
Raymond Knopp's avatar
 
Raymond Knopp committed
1372
  fill_dci_emos(DCI_pdu,subframe,phy_vars_eNB);
1373
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1374
  fill_dci(DCI_pdu,subframe,phy_vars_eNB);
1375 1376
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1377
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1378 1379 1380
  // 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);
  ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_rx,subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
1381
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1382 1383 1384 1385 1386 1387 1388 1389 1390
  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;
      }
  }
1391
  
1392
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
1393
  //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;
1394
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1395 1396 1397 1398
  // 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
1399
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1400
  init_nCCE_table();
Raymond Knopp's avatar
 
Raymond Knopp committed
1401
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1402 1403 1404 1405 1406 1407 1408 1409
  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));
  LOG_T(PHY,"num_pdcch_symbols %d, nCCE %d\n",num_pdcch_symbols,DCI_pdu->nCCE);
Raymond Knopp's avatar
 
Raymond Knopp committed
1410
  
1411
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1412 1413 1414 1415 1416 1417
  // 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);
  }
1418
#endif      
Raymond Knopp's avatar
 
Raymond Knopp committed
1419
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1420
  for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {
1421
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1422 1423 1424 1425
    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]);
    }
1426
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1427
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1428
    if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) {
1429
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442
      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
1443
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1444 1445 1446 1447 1448 1449 1450 1451 1452 1453
      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);
1454 1455

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1456 1457 1458 1459
	// 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);
1460
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1461
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1462
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1463 1464 1465 1466
      DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe];
	  
    }
    else if (DCI_pdu->dci_alloc[i].ra_flag == 1) {
1467
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
      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);
1481
	  
Raymond Knopp's avatar
 
Raymond Knopp committed
1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493
      //	  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 {
	LOG_I(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,
	      phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe],DCI_pdu->nCCE);
1494
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1495 1496 1497 1498
	// 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);
1499
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1500
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1501 1502

      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1503 1504 1505
      DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe];

    }
1506

Raymond Knopp's avatar
 
Raymond Knopp committed
1507
    else if (DCI_pdu->dci_alloc[i].format != format0){ // this is a normal DLSCH allocation
1508 1509 1510

#ifdef OPENAIR2
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1511
      LOG_D(PHY,"[eNB] Searching for RNTI %x\n",DCI_pdu->dci_alloc[i].rnti);
1512
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1513
      UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
1514
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1515
      UE_id = i;
1516
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1517 1518
      if (UE_id>=0) {
	//	  dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
1519
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1520 1521 1522 1523 1524
	// 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
1525
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549
	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);
1550 1551

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1552
	  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
1553 1554 1555 1556 1557
	  // 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
1558 1559
#endif
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572
	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)
	LOG_I(PHY,"[eNB %d][DCI][PDSCH %x] Frame %d subframe %d UE_id %d Generated DCI format %d, aggregation %d\n",
	      phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti,
	      phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,UE_id,
	      DCI_pdu->dci_alloc[i].format,
	      1<<DCI_pdu->dci_alloc[i].L);
#endif
      }
      else {
	LOG_D(PHY,"[eNB %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);
1573
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1574
    }
1575

Raymond Knopp's avatar
 
Raymond Knopp committed
1576
  }
1577

Raymond Knopp's avatar
 
Raymond Knopp committed
1578 1579
  // Apply physicalConfigDedicated if needed
  phy_config_dedicated_eNB_step2(phy_vars_eNB);
Raymond Knopp's avatar
 
Raymond Knopp committed
1580

Raymond Knopp's avatar
 
Raymond Knopp committed
1581 1582 1583 1584 1585 1586 1587 1588 1589 1590
  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");
      }
1591
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1592
      UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
1593
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1594
      UE_id = i;
1595
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1596 1597 1598 1599
      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");
      }
1600
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617
      if (phy_vars_eNB->proc[sched_subframe].frame_tx%100 == 0)
	LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generated format0 DCI (rnti %x, dci %x) (DCI pos %d/%d), aggregation %d\n",
	      phy_vars_eNB->Mod_id, 
	      subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
				pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((subframe)==0)?1:0)+phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
				pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)),
	      pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((subframe)==0)?1:0)+phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
	      subframe,DCI_pdu->dci_alloc[i].rnti,
	      *(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
1618
					 sched_subframe,
Raymond Knopp's avatar
 
Raymond Knopp committed
1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639
					 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);
1640 1641

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1642 1643 1644 1645 1646
	// 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);
	}
1647 1648
#endif

1649
      }
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1650 1651 1652 1653 1654 1655 1656 1657
      
#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
1658 1659 1660 1661 1662
      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;
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1663
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1664
  }
1665

1666
    
1667 1668


Lionel Gauthier's avatar
Lionel Gauthier committed
1669 1670


Raymond Knopp's avatar
 
Raymond Knopp committed
1671 1672
  // 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
1673

1674
 
Raymond Knopp's avatar
 
Raymond Knopp committed
1675 1676 1677 1678 1679
  }
  else {  // for emulation!!
    phy_vars_eNB->num_ue_spec_dci[(subframe)&1]=0;
    phy_vars_eNB->num_common_dci[(subframe)&1]=0;
  }
1680
 
Raymond Knopp's avatar
 
Raymond Knopp committed
1681
  if (abstraction_flag == 0) {
1682
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1683 1684
    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);
1685 1686
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1687 1688 1689 1690 1691 1692 1693 1694 1695
    //    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
1696 1697

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1698
    //	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
1699 1700

#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1701
  }
1702 1703

#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1704 1705 1706 1707
  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);
  }
1708 1709
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1710
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0);
1711 1712

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1713
  //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);
1714 1715
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1716
  // Check for SI activity
1717

Raymond Knopp's avatar
 
Raymond Knopp committed
1718 1719
  if (phy_vars_eNB->dlsch_eNB_SI->active == 1) {
    input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8;
1720 1721 1722


#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1723 1724 1725 1726
    DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
					 phy_vars_eNB->proc[sched_subframe].frame_tx,
					 SI_RNTI,
					 0);
1727
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1728 1729 1730
    DLSCH_pdu = DLSCH_pdu_tmp;
    for (i=0;i<input_buffer_length;i++)
      DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
1731
#endif      
1732
    
1733
#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1734 1735 1736 1737 1738
    // 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);
    }
1739 1740 1741 1742
#endif      

#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_DLSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
1743 1744 1745 1746 1747
    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");
1748 1749 1750
#endif
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1751
    if (abstraction_flag == 0) {
1752

Raymond Knopp's avatar
 
Raymond Knopp committed
1753 1754 1755 1756 1757 1758 1759 1760 1761 1762
      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);  
1763
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776
      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,
			     phy_vars_eNB->dlsch_eNB_SI->nb_rb,
			     phy_vars_eNB->dlsch_eNB_SI->rb_alloc,
			     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);	      
1777
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1778 1779 1780 1781 1782 1783 1784 1785 1786 1787
      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,
				      phy_vars_eNB->dlsch_eNB_SI);
      stop_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
    } 
1788
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1789 1790 1791 1792 1793 1794 1795
    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);	      
    }
1796
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1797
    phy_vars_eNB->dlsch_eNB_SI->active = 0;
1798
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1799
  }
Lionel Gauthier's avatar
Lionel Gauthier committed
1800

Raymond Knopp's avatar
 
Raymond Knopp committed
1801 1802
  // Check for RA activity
  if (phy_vars_eNB->dlsch_eNB_ra->active == 1) {
1803
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1804 1805
    LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, subframe %d, RA active, filling RAR:\n",
	  phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe);
1806 1807
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1808
    input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8;
1809 1810

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846
    crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id,
				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,
				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);
1847
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1848 1849
      for (i=0;i<input_buffer_length;i++)
	dlsch_input_buffer[i]= (unsigned char) i; //(taus()&0xff);
1850

Raymond Knopp's avatar
 
Raymond Knopp committed
1851 1852 1853
      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); 
1854 1855 1856
#endif

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1857 1858 1859 1860 1861
      // 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);
      }
1862 1863 1864
#endif      

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1865 1866 1867 1868 1869
      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);
1870 1871
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1872 1873 1874 1875 1876 1877 1878 1879 1880 1881
      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
1882

Raymond Knopp's avatar
 
Raymond Knopp committed
1883 1884 1885
	//	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
1886
			 phy_vars_eNB->dlsch_eNB_ra,
Raymond Knopp's avatar
 
Raymond Knopp committed
1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902
			 get_G(&phy_vars_eNB->lte_frame_parms,
			       phy_vars_eNB->dlsch_eNB_ra->nb_rb,
			       phy_vars_eNB->dlsch_eNB_ra->rb_alloc,
			       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,
					phy_vars_eNB->dlsch_eNB_ra);
      }
1903
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1904 1905 1906 1907 1908
      else {
	dlsch_encoding_emul(phy_vars_eNB,
			    dlsch_input_buffer,
			    phy_vars_eNB->dlsch_eNB_ra);
      }
1909
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1910 1911
      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);
1912
	
1913
#ifdef DEBUG_PHY_PROC    
Raymond Knopp's avatar
 
Raymond Knopp committed
1914 1915
      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);
1916 1917 1918
#endif

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1919
    } //max user count
1920
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1921 1922
    phy_vars_eNB->dlsch_eNB_ra->active = 0;
  }
1923

Raymond Knopp's avatar
 
Raymond Knopp committed
1924 1925 1926 1927 1928 1929 1930
  // 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;
1931
      
1932 1933

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953
      LOG_I(PHY,"[eNB %d][PDSCH %x/%d] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %d, G %d, nb_rb %d, mcs %d, pmi_alloc %x, rv %d (round %d)\n",
	    phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(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,
		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb,
		  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rb_alloc,
		  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),
	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb,
	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs,
	    pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->pmi_alloc),
	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx,
	    phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round);
#endif

      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) {

	phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[0]++;
1954
	  
1955
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1956 1957 1958 1959 1960
	DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
					     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;
1961
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1962 1963 1964
	DLSCH_pdu = DLSCH_pdu_tmp;
	for (i=0;i<input_buffer_length;i++)
	  DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
1965 1966 1967
#endif      

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1968 1969 1970 1971 1972
	// 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);
	}
1973 1974 1975 1976 1977
#endif      


#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_DLSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
1978 1979 1980 1981
	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");
1982 1983
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1984 1985 1986
      }
      else {
	phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round]++;	
1987 1988
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_DLSCH  
Raymond Knopp's avatar
 
Raymond Knopp committed
1989
	LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n");
1990 1991
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1992 1993
      }
      if (abstraction_flag==0) {
1994

Raymond Knopp's avatar
 
Raymond Knopp committed
1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
	// 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
2010
			 phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
Raymond Knopp's avatar
 
Raymond Knopp committed
2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
			 get_G(&phy_vars_eNB->lte_frame_parms,
			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nb_rb,
			       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rb_alloc,
			       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++) {
2022
	    
Raymond Knopp's avatar
 
Raymond Knopp committed
2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039
	  /*          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,
					phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]);
      
	stop_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
      }
2040
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
2041 2042 2043 2044 2045 2046 2047
      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);	      
      }
2048
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2049
      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0;
2050
	
Raymond Knopp's avatar
 
Raymond Knopp committed
2051 2052
      //mac_xface->macphy_exit("first dlsch transmitted\n");
    }
Lionel Gauthier's avatar
Lionel Gauthier committed
2053

Raymond Knopp's avatar
 
Raymond Knopp committed
2054 2055 2056
    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)) {
2057
      
Raymond Knopp's avatar
 
Raymond Knopp committed
2058 2059
      // 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;
2060
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2061
      //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,subframe,UE_id);
2062
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2063
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
2064
  }
2065
  
2066 2067


Raymond Knopp's avatar
 
Raymond Knopp committed
2068 2069 2070
  // 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)) {
2071
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2072
    //      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);
2073
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2074 2075
    //    for (sect_id=0;sect_id<number_of_cards;sect_id++) {
    generate_phich_top(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2076
		       sched_subframe,
Raymond Knopp's avatar
 
Raymond Knopp committed
2077 2078 2079 2080 2081
		       AMP,
		       0,
		       abstraction_flag);
  }
  
Raymond Knopp's avatar
 
Raymond Knopp committed
2082

Raymond Knopp's avatar
 
Raymond Knopp committed
2083
     
2084
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
2085
  phy_procedures_emos_eNB_TX(next_slot, phy_vars_eNB);
2086
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2087
  
2088
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0);
2089
  stop_meas(&phy_vars_eNB->phy_proc_tx);
Raymond Knopp's avatar
 
Raymond Knopp committed
2090 2091
  
  
2092 2093
}

Raymond Knopp's avatar
 
Raymond Knopp committed
2094
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
2095
  // this prepares the demodulation of the first PUSCH of a new user, containing Msg3
2096

Raymond Knopp's avatar
 
Raymond Knopp committed
2097
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2098
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2099

Raymond Knopp's avatar
 
Raymond Knopp committed
2100
  LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n",
2101
	phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2102
	frame,subframe,
2103 2104 2105 2106
	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;
2107
  
2108
  if ((phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) && 
Raymond Knopp's avatar
 
Raymond Knopp committed
2109
      (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) &&
2110
      (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == frame))   {
2111 2112 2113
    
    //    harq_pid = 0;
    
2114 2115 2116
    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
2117
    LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n",
2118
	  phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2119
	  frame,subframe,UE_id);
2120 2121 2122 2123 2124 2125 2126 2127 2128
  }
}


// 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

2129
void process_HARQ_feedback(uint8_t UE_id, 
Raymond Knopp's avatar
 
Raymond Knopp committed
2130
			   uint8_t sched_subframe, 
2131
			   PHY_VARS_eNB *phy_vars_eNB,
2132 2133 2134 2135 2136 2137 2138 2139
			   uint8_t pusch_flag, 
			   uint8_t *pucch_payload, 
			   uint8_t pucch_sel,
			   uint8_t SR_payload) {

  uint8_t dl_harq_pid[8],dlsch_ACK[8],j,dl_subframe;
  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];
2140
  LTE_DL_eNB_HARQ_t *dlsch_harq_proc;
2141
  uint8_t subframe_m4,M,m;
2142 2143
  int mp;
  int all_ACKed=1,nb_alloc=0,nb_ACK=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
2144 2145
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
2146 2147

  if (phy_vars_eNB->lte_frame_parms.frame_type == 0){ //FDD
2148
    subframe_m4 = (subframe<4) ? subframe+6 : subframe-4;
2149

2150 2151 2152
    dl_harq_pid[0] = dlsch->harq_ids[subframe_m4];
    M=1;
    if (pusch_flag == 1)
2153
      dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->o_ACK[0];
2154 2155 2156 2157
    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);
2158 2159
  }
  else {  // TDD Handle M=1,2 cases only
2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170
    
    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

2171 2172
      dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->o_ACK[0];
      dlsch_ACK[1] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->o_ACK[1];
2173 2174
      //      printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]);
    }
2175

2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214
    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;
	}
2215
      }
2216
    }
2217 2218 2219 2220
  }

  // handle case where positive SR was transmitted with multiplexing
  if ((SR_payload == 1)&&(pucch_sel!=2)&&(pusch_flag == 0)) {
2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233
    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;
2234

2235
    //    printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed);
2236 2237 2238 2239 2240
  }


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

2241 2242 2243
    dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
					       subframe,
					       m);
2244

2245 2246 2247 2248 2249
    if (dlsch->subframe_tx[dl_subframe]==1) {
      if (pusch_flag == 1)
	mp++;
      else
	mp = m;
2250

2251
      dl_harq_pid[m]     = dlsch->harq_ids[dl_subframe];
2252

2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277
      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	
	LOG_I(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id,
	      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 
2278
#ifdef DEBUG_PHY_PROC	
2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293
	    LOG_I(PHY,"[eNB %d][PDSCH %x/%d] NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id,
		  dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
#endif
	    
	    //	    if (dlsch_harq_proc->round == 0)
	    ue_stats->dlsch_NAK[dlsch_harq_proc->round]++;
	    
	    // 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]);
2294
#endif
2295 2296 2297 2298 2299 2300 2301
	      dlsch_harq_proc->round = 0;
	      ue_stats->dlsch_l2_errors++;
	      dlsch_harq_proc->status = SCH_IDLE;
	      dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
	    }
	  }
	  else {
2302
#ifdef DEBUG_PHY_PROC	
2303 2304
	    LOG_I(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id,
		  dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
2305
#endif
2306
	    ue_stats->dlsch_ACK[dlsch_harq_proc->round]++;
2307

2308 2309 2310 2311
	    // 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;
2312

2313
	    ue_stats->total_TBS = ue_stats->total_TBS + 
2314
	      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
2315
	    /*
Raymond Knopp's avatar
 
Raymond Knopp committed
2316
	      ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits +
2317
	      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
2318 2319 2320 2321 2322 2323 2324 2325 2326 2327
	    */
	  }
	  
	  // Do fine-grain rate-adaptation for DLSCH 
	  if (ue_stats->dlsch_NAK[0] > dlsch->error_threshold) {
	    if (ue_stats->dlsch_mcs_offset == 1)
	      ue_stats->dlsch_mcs_offset=0;
	    else
	      ue_stats->dlsch_mcs_offset=-1;
	  }
2328
#ifdef DEBUG_PHY_PROC	  
2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351
	  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) ) {
	    if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] < 2))
	      ue_stats->dlsch_mcs_offset = 1;
	    if ((ue_stats->dlsch_mcs_offset == 1) && (ue_stats->dlsch_NAK[0] > 2))
	      ue_stats->dlsch_mcs_offset = 0;
	    if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] > 2))
	      ue_stats->dlsch_mcs_offset = -1;
	    if ((ue_stats->dlsch_mcs_offset == -1) && (ue_stats->dlsch_NAK[0] < 2))
	      ue_stats->dlsch_mcs_offset = 0;
	    
	    for (j=0;j<phy_vars_eNB->dlsch_eNB[j][0]->Mdlharq;j++)
	      ue_stats->dlsch_NAK[j] = 0;
	    ue_stats->dlsch_sliding_cnt = 0;
	  }
	  
	  
	}
2352
      }
2353
    }
2354 2355 2356 2357
  }
}

void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
2358 2359 2360 2361 2362 2363
		      uint8_t UE_id,
		      uint8_t subframe,
		      int16_t *n1_pucch0,
		      int16_t *n1_pucch1,
		      int16_t *n1_pucch2,
		      int16_t *n1_pucch3) {
2364 2365

  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
2366
  uint8_t nCCE0,nCCE1;
2367
  int sf;
Raymond Knopp's avatar
 
Raymond Knopp committed
2368
  int frame = phy_vars_eNB->proc[subframe].frame_rx;
2369 2370

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

2374 2375
    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];
2376 2377 2378 2379 2380 2381
      *n1_pucch1 = -1;
    }
    else {
      *n1_pucch0 = -1;
      *n1_pucch1 = -1;
    }
2382 2383 2384
  }
  else {

2385 2386 2387
    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
2388 2389
	/*	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];
2390
		*n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
2391 2392
		}
		else
2393
		*n1_pucch1 = -1;*/
2394

2395 2396
	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];
2397 2398 2399 2400
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2401

2402 2403 2404 2405
	*n1_pucch1 = -1;	
      }
      else if (subframe == 3) {   // ACK subframe 9
	
2406 2407
	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];
2408 2409 2410 2411
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2412

2413 2414 2415 2416 2417 2418
	*n1_pucch1 = -1;
	
      }
      else if (subframe == 7) {  // ACK subframes 0 and 1
	//harq_ack[0].nCCE;  
	//harq_ack[1].nCCE;
2419 2420
	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];
2421 2422 2423 2424
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2425

2426 2427 2428 2429
	*n1_pucch1 = -1;
      }
      else if (subframe == 8) {   // ACK subframes 4
	//harq_ack[4].nCCE;
2430 2431
	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];
2432 2433 2434 2435
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2436

2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448
	*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)
2449 2450
	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];
2451 2452 2453 2454
	  *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch1 = -1;
2455

2456 2457
	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];
2458 2459 2460 2461 2462 2463 2464
	  *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",
2465
	      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]);
2466

2467 2468
	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];
2469 2470 2471 2472 2473
	  *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
2474

2475 2476
	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];
2477 2478 2479 2480 2481 2482 2483
	  *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
2484 2485
	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];
2486 2487 2488 2489
	  *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
2490

2491 2492
	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];
2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507
	  *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;
2508 2509 2510 2511
  }
}


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

2514 2515 2516 2517
  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
2518
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2519
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
2520

2521 2522
  memset(&preamble_energy_list[0],0,64*sizeof(uint16_t));
  memset(&preamble_delay_list[0],0,64*sizeof(uint16_t));
2523
  if (abstraction_flag == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2524
    LOG_I(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
2525
	  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
2526
    
2527
    //    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);
2528

2529 2530 2531 2532 2533 2534
    rx_prach(phy_vars_eNB,
	     subframe,
	     preamble_energy_list,
	     preamble_delay_list,
	     frame,
	     0);
2535 2536
  }
  else {
2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550
    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",
	    UE_id,PHY_vars_UE_g[UE_id],PHY_vars_UE_g[UE_id]->generate_prach,
	    PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex,
	    phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,
	    PHY_vars_UE_g[UE_id]->prach_PreambleIndex);
      
      if ((PHY_vars_UE_g[UE_id]->generate_prach==1) &&
	  (PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex ==
	   phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) {
	preamble_energy_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 80;
	preamble_delay_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 5;
	
2551
      }
2552
    }
2553 2554 2555 2556 2557
  }
  preamble_energy_max = preamble_energy_list[0];
  preamble_max = 0;

  for (i=1;i<64;i++) {
2558 2559 2560 2561
    if (preamble_energy_max < preamble_energy_list[i]) {
      preamble_energy_max = preamble_energy_list[i];
      preamble_max = i;
    }
2562 2563 2564
  }

#ifdef DEBUG_PHY_PROC
2565
  LOG_D(PHY,"[RAPROC] Most likely preamble %d, energy %d dB delay %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2566 2567 2568
	preamble_max,
	preamble_energy_list[preamble_max],
	preamble_delay_list[preamble_max]);
2569 2570 2571
#endif

  if (preamble_energy_list[preamble_max] > 60) {
2572 2573
    UE_id = find_next_ue_index(phy_vars_eNB);
    if (UE_id>=0) {
2574 2575 2576
      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;
2577 2578 2579 2580 2581
      LOG_I(PHY,"[eNB %d][RAPROC] Initiating RA procedure with preamble %d, energy %d, delay %d\n",
	    phy_vars_eNB->Mod_id,
	    preamble_max,
	    preamble_energy_max,
	    preamble_delay_list[preamble_max]);
2582
#ifdef OPENAIR2	  
2583 2584 2585 2586 2587
      mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id,
				  frame,
				  preamble_max,
				  preamble_delay_list[preamble_max],
				  0,subframe,0);
2588
#endif
2589 2590 2591 2592 2593
    }
    else {
      LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", 
	    phy_vars_eNB->Mod_id,frame, subframe);
    }
2594 2595 2596
  }
}

Raymond Knopp's avatar
 
Raymond Knopp committed
2597
void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag)
2598 2599 2600 2601 2602
{
  LOG_D(PHY,"ulsch_decoding_procedures not yet implemented. should not be called");
}


Raymond Knopp's avatar
 
Raymond Knopp committed
2603
void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) {
2604
  //RX processing
Raymond Knopp's avatar
 
Raymond Knopp committed
2605
  uint32_t l, ret=0,i,j;
2606 2607 2608 2609 2610 2611 2612
  uint32_t sect_id=0;
  uint32_t harq_pid, round;
  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;
2613 2614
  ANFBmode_t bundling_flag;
  PUCCH_FMT_t format;
2615 2616 2617
  uint8_t nPRS;
  //  uint8_t two_ues_connected = 0;
  uint8_t pusch_active = 0;
2618 2619
  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
  int sync_pos;
2620 2621
  uint16_t rnti=0;
  uint8_t access_mode;
2622
  int num_active_cba_groups;
Raymond Knopp's avatar
 
Raymond Knopp committed
2623
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2624
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
2625 2626

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
2627
  start_meas(&phy_vars_eNB->phy_proc_rx);
2628
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2629
  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe);
2630
#endif
2631 2632

  if (abstraction_flag == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2633 2634
    remove_7_5_kHz(phy_vars_eNB,subframe<<1);
    remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1);
2635 2636
  }
  // check if we have to detect PRACH first
Raymond Knopp's avatar
 
Raymond Knopp committed
2637 2638
  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
2639
    prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag);
Raymond Knopp's avatar
 
Raymond Knopp committed
2640
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
2641
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
2642
 
2643
  if (abstraction_flag == 0) {
2644 2645 2646
    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
2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661
      //      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
		  );
2662 2663
    }
    stop_meas(&phy_vars_eNB->ofdm_demod_stats);	      	      	  
2664 2665 2666 2667 2668
  }
  sect_id = 0;

  /*
    for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) {
2669
    
2670
    if ((phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode>PRACH) && (last_slot%2==1)) {
2671 2672 2673
    #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
2674
    phy_vars_eNB->proc[sched_subframe].frame_tx, last_slot, 
2675
    UE_id,phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode);
2676 2677
    #endif
    for (sect_id=0;sect_id<number_of_cards;sect_id++) {
2678
	
2679 2680
    lte_srs_channel_estimation(&phy_vars_eNB->lte_frame_parms,
    &phy_vars_eNB->lte_eNB_common_vars,
2681 2682
    &phy_vars_eNB->lte_eNB_srs_vars[(uint32_t)UE_id],
    &phy_vars_eNB->soundingrs_ul_config_dedicated[(uint32_t)UE_id],
2683 2684 2685 2686 2687 2688 2689 2690 2691
    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
2692
    phy_vars_eNB->proc[sched_subframe].frame_tx, last_slot, 
2693
    UE_id,sect_id,
2694
    phy_vars_eNB->PHY_measurements_eNB[sect_id].rx_rssi_dBm[(uint32_t)UE_id]);
2695 2696
    #endif
    }
2697
      
2698 2699 2700 2701 2702
    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
2703
      
2704 2705
    //msg("timing advance in\n");
    sync_pos = lte_est_timing_advance(&phy_vars_eNB->lte_frame_parms,
2706
    &phy_vars_eNB->lte_eNB_srs_vars[(uint32_t)UE_id],
2707
    &sect_id,
2708
    phy_vars_eNB->first_run_timing_advance[(uint32_t)UE_id],
2709 2710
    number_of_cards,
    24576);
2711
      
2712
    //msg("timing advance out\n");
2713
      
2714 2715 2716
    //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;
2717
    #ifdef DEBUG_PHY_PROC	
2718 2719
    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
2720
    phy_vars_eNB->proc[sched_subframe].frame_tx, last_slot, 
2721
    UE_id, sect_id,
2722
    phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset);
2723 2724 2725 2726
    #endif
    }
    }
    else {
2727
    
2728
    }
2729
  */
Raymond Knopp's avatar
 
Raymond Knopp committed
2730

2731 2732
  // Check for active processes in current subframe
  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
2733
			       frame,subframe);
2734
  pusch_active = 0;
2735
  // reset the cba flag used for collision detection 
2736
  for (i=0; i < NUM_MAX_CBA_GROUP; i++){
2737
    phy_vars_eNB->cba_last_reception[i]=0;
2738
  }
Raymond Knopp's avatar
Raymond Knopp committed
2739
  //  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]);
2740 2741 2742 2743
 
  for (i=0;i<NUMBER_OF_UE_MAX;i++) { 
  
    /*
2744 2745
      if ((i == 1) && (phy_vars_eNB->cooperation_flag > 0) && (two_ues_connected == 1))
      break;
2746
    */
2747
#ifdef OPENAIR2
2748
    if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE)
Raymond Knopp's avatar
 
Raymond Knopp committed
2749
      process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid);
2750 2751
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
2752
    /*
Raymond Knopp's avatar
Raymond Knopp committed
2753 2754
#ifdef DEBUG_PHY_PROC
    if (phy_vars_eNB->ulsch_eNB[i]) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2755
            
Raymond Knopp's avatar
 
Raymond Knopp committed
2756
      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
2757 2758 2759 2760 2761
	    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
2762 2763
    }
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2764 2765
    */

2766 2767
    if ((phy_vars_eNB->ulsch_eNB[i]) &&
	(phy_vars_eNB->ulsch_eNB[i]->rnti>0) &&
Raymond Knopp's avatar
 
Raymond Knopp committed
2768
	(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) {
2769 2770 2771
 
      pusch_active = 1;
      round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
2772 2773

#ifdef DEBUG_PHY_PROC
2774 2775
      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
2776
	    frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti);
2777
#endif
2778
  
2779
#ifdef DEBUG_PHY_PROC
2780
      if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1){
Raymond Knopp's avatar
 
Raymond Knopp committed
2781
	LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n",
2782 2783
	      phy_vars_eNB->Mod_id,
	      frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
2784
	      subframe,
2785 2786
	      phy_vars_eNB->eNB_UE_stats[i].sector);
      } else {
Raymond Knopp's avatar
 
Raymond Knopp committed
2787
	LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s sect_id %d\n",
2788 2789
	      phy_vars_eNB->Mod_id,
	      frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
2790
	      subframe,
2791 2792 2793 2794
	      i,
	      mode_string[phy_vars_eNB->eNB_UE_stats[i].mode],
	      phy_vars_eNB->eNB_UE_stats[i].sector);
      }
2795 2796
#endif

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

2799
      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;
2800

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

Raymond Knopp's avatar
 
Raymond Knopp committed
2804 2805 2806 2807 2808 2809
	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;
	}
2810
      }
Raymond Knopp's avatar
Raymond Knopp committed
2811

2812
#ifdef DEBUG_PHY_PROC
2813
      LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2814
	    phy_vars_eNB->Mod_id,harq_pid,frame,subframe,
2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831
	    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
2832
		 sched_subframe,
2833 2834 2835 2836 2837
		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		 i,
		 phy_vars_eNB->ulsch_eNB,
		 0);
      }
2838
#ifdef PHY_ABSTRACTION
2839 2840
      else {
	rx_ulsch_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2841
		      subframe,
2842 2843 2844
		      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		      i);
      }
2845
#endif
2846
      stop_meas(&phy_vars_eNB->ulsch_demodulation_stats);	      	      	  
2847 2848


2849 2850 2851 2852 2853 2854 2855
      for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++)
	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->rx_total_gain_eNB_dB;

      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
2856
			     sched_subframe,
2857 2858 2859 2860
			     0, // control_only_flag
			     0, //Nbundled, to be updated!!!!
			     0);  
      }
2861
#ifdef PHY_ABSTRACTION
2862 2863
      else {
	ret = ulsch_decoding_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2864
				  sched_subframe,
2865 2866 2867
				  i,
				  &rnti);
      }
2868
#endif
2869
      stop_meas(&phy_vars_eNB->ulsch_decoding_stats);
2870

Raymond Knopp's avatar
 
Raymond Knopp committed
2871
      //#ifdef DEBUG_PHY_PROC
2872
      LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883
	    phy_vars_eNB->Mod_id,harq_pid,
	    frame,subframe,
	    phy_vars_eNB->ulsch_eNB[i]->rnti,
	    dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
	    dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
	    phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
	    phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
	    phy_vars_eNB->ulsch_eNB[i]->o_ACK[0],
	    phy_vars_eNB->ulsch_eNB[i]->o_ACK[1],
	    ret);
      //#endif //DEBUG_PHY_PROC
2884
      /*
2885 2886
	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++) {
2887
	phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_0[j]) 
2888
	- phy_vars_eNB->rx_total_gain_eNB_dB;
2889
	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]) 
2890 2891 2892 2893
	- 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
2894
	phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,last_slot>>1,i,
2895 2896 2897 2898 2899 2900 2901
	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 {
2902 2903 2904 2905
      */
      for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++)
	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->rx_total_gain_eNB_dB;
2906
#ifdef DEBUG_PHY_PROC
2907
      LOG_I(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power (%d,%d) dB\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2908
	    phy_vars_eNB->Mod_id,frame,subframe,i,
2909 2910
	    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]));
2911 2912
#endif

2913 2914 2915 2916
      //      }
      
    
      phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
2917
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2918
      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
2919
	    phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid);
2920
#endif
2921
      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0;
2922

2923
      if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) {
2924
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2925
	//if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) 
2926
	print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0);
2927
#endif
2928 2929 2930 2931 2932 2933 2934 2935 2936 2937
	extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->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]->o_RI[0];
      }
    
      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++;

Raymond Knopp's avatar
 
Raymond Knopp committed
2938
	LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round);
Raymond Knopp's avatar
 
Raymond Knopp committed
2939
	//	dump_ulsch(phy_vars_eNB, sched_subframe, i);
2940 2941 2942
	//	exit(-1);

	if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2943
	  LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
2944
		phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2945
		frame,subframe, i,
2946 2947 2948 2949 2950 2951 2952 2953
		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
		phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1);

	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == 
	      phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) {
	    LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n",
		  phy_vars_eNB->Mod_id, i);
	    phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
2954
#ifdef OPENAIR2
2955 2956 2957 2958 2959
	    mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
				      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);
2960
	    phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
2961 2962 2963 2964 2965
	    //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)
2966
	    phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1;
2967 2968
	    
	    get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
2969
			       subframe,
2970 2971 2972
			       frame,
			       &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame,
			       &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
2973
	  }/*
Raymond Knopp's avatar
 
Raymond Knopp committed
2974
	  LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
2975 2976 2977 2978
		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
2979
	  dump_ulsch(phy_vars_eNB,sched_subframe,i);*/
Raymond Knopp's avatar
 
Raymond Knopp committed
2980
	  //#ifndef EXMIMO_IOT
Raymond Knopp's avatar
 
Raymond Knopp committed
2981
	  LOG_W(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error\n", frame,subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
2982 2983 2984
	  //#else 
	  //	  mac_exit_wrapper("Msg3 error");
	  //#endif 
2985 2986 2987 2988
	} // This is Msg3 error
	else { //normal ULSCH
	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n",
		phy_vars_eNB->Mod_id,harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
2989
		frame,subframe, i,
2990 2991 2992 2993 2994
		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
		phy_vars_eNB->ulsch_eNB[i]->Mdlharq,
		phy_vars_eNB->ulsch_eNB[i]->o_ACK[0],
		phy_vars_eNB->ulsch_eNB[i]->o_ACK[1]);
	  	  
Raymond Knopp's avatar
 
Raymond Knopp committed
2995
	  LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:\n",frame,subframe,
2996 2997 2998 2999 3000 3001 3002 3003
		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");	  
	  }
	  

Raymond Knopp's avatar
 
Raymond Knopp committed
3004
	  //	  dump_ulsch(phy_vars_eNB,sched_subframe,i);
3005 3006 3007 3008
	  
	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mdlharq) {
	    LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mdlharq %d reached\n",
		  phy_vars_eNB->Mod_id,harq_pid,
Raymond Knopp's avatar
 
Raymond Knopp committed
3009
		  frame,subframe, i,
3010 3011 3012 3013 3014 3015
		  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]++;
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]++;
Raymond Knopp's avatar
 
Raymond Knopp committed
3016
	    //dump_ulsch(phy_vars_eNB, sched_subframe, i);
3017 3018 3019
	  }
	
	  // If we've dropped the UE, go back to PRACH mode for this UE
Raymond Knopp's avatar
 
Raymond Knopp committed
3020 3021
	  //#if !defined(EXMIMO_IOT)
	  if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] == ULSCH_max_consecutive_errors) {
3022
	    LOG_I(PHY,"[eNB %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, removing UE\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
3023
		  phy_vars_eNB->Mod_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]);
3024
	    phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
3025
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
3026
	    /*	    mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
3027
				      frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
3028
				      phy_vars_eNB->eNB_UE_stats[i].crnti);*/
3029
#endif
3030 3031 3032
	    remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]=0;
	  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3033
	  //#endif
3034 3035 3036 3037 3038
	}
      }  // 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
3039
	      frame,subframe);	    
3040 3041 3042 3043 3044 3045 3046

	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
	phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0;

	if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
3047 3048
#ifdef OPENAIR2
#ifdef DEBUG_PHY_PROC
3049 3050 3051
	  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);
3052
#endif
3053 3054 3055 3056 3057 3058
	  mac_xface->rx_sdu(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);
	  /*
Raymond Knopp's avatar
 
Raymond Knopp committed
3059 3060 3061 3062 3063
	    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);
3064
	  */
3065 3066
#endif

3067 3068
	  phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH;
	  phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0;
3069 3070

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

3074 3075 3076 3077
	  for (j=0;j<phy_vars_eNB->dlsch_eNB[i][0]->Mdlharq;j++) {
	    phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[j]=0;
	    phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0;
	  }
3078

3079 3080 3081 3082
	  //mac_xface->macphy_exit("Mode PUSCH. Exiting.\n");
	}
	else {
	  
3083 3084
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_ULSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
3085
	  LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
3086 3087 3088 3089
		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");
3090 3091
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3092
	  //dump_ulsch(phy_vars_eNB,sched_subframe,i);
3093
 
3094 3095

#ifdef OPENAIR2
3096 3097 3098 3099 3100 3101 3102 3103
	  //	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) {
	  mac_xface->rx_sdu(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);
	  //}
	  /*
3104 3105
	    else {
	    // Retrieve calibration information and do whatever
Raymond Knopp's avatar
 
Raymond Knopp committed
3106
	    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);	    
3107
	    }
3108
	  */
3109
#endif
3110
	}
3111

3112 3113
	// estimate timing advance for MAC
	if (abstraction_flag == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3114
	  sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe);
3115 3116
	  phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8; //to check 
	}
3117

3118
#ifdef DEBUG_PHY_PROC	
Raymond Knopp's avatar
 
Raymond Knopp committed
3119
	LOG_I(PHY,"[eNB %d] frame %d, subframe %d: user %d in sector %d: timing advance = %d\n",
3120
	      phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3121
	      frame, subframe, 
3122 3123
	      i, sect_id,
	      phy_vars_eNB->eNB_UE_stats[i].timing_advance_update);
3124
#endif
3125
	
3126

3127 3128 3129
      }  // ulsch not in error
      
      // process HARQ feedback
3130
#ifdef DEBUG_PHY_PROC
3131 3132
      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
3133
	    frame,subframe,
3134 3135 3136
	    i);
#endif
      process_HARQ_feedback(i,
Raymond Knopp's avatar
 
Raymond Knopp committed
3137
			    sched_subframe,
3138 3139 3140 3141 3142 3143 3144 3145
			    phy_vars_eNB,
			    1, // pusch_flag
			    0,
			    0,
			    0);
      
      //#ifdef DEBUG_PHY_PROC
      LOG_I(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
3146
	    phy_vars_eNB->Mod_id,frame,subframe,
3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171
	    phy_vars_eNB->eNB_UE_stats[i].sector, 
	    harq_pid, 
	    i, 
	    ret, 
	    phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status, 
	    phy_vars_eNB->ulsch_eNB[i]->o_ACK[0],	
	    phy_vars_eNB->ulsch_eNB[i]->o_ACK[1], 
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid],
	    phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]);
      //#endif


      if (frame % 100 == 0) {
	if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] - 
	     phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]) != 0)
	  phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_pid][round] = 
	    (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round] - 
		  phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round]))/
	    (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] - 
	     phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]);

	phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round] = 
	  phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round];
	phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round] = 
	  phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round];
3172 3173
      }

3174 3175
    }
  
3176 3177

#ifdef PUCCH
3178
    else if ((phy_vars_eNB->dlsch_eNB[i][0]) &&
Raymond Knopp's avatar
 
Raymond Knopp committed
3179
	     (phy_vars_eNB->dlsch_eNB[i][0]->rnti>0)) { // check for PUCCH
3180 3181

      // check SR availability
Raymond Knopp's avatar
 
Raymond Knopp committed
3182
      do_SR = is_SR_subframe(phy_vars_eNB,i,subframe);
3183 3184 3185 3186 3187 3188
      //      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
3189
		       subframe,
3190 3191 3192 3193 3194 3195 3196
		       &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
3197
	    frame,subframe,
3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215
	    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
3216
			       subframe,
3217
			       PUCCH1_THRES);
3218
#ifdef PHY_ABSTRACTION
3219 3220 3221 3222 3223 3224
	  else {
	    metric0 = rx_pucch_emul(phy_vars_eNB,
				    i,
				    pucch_format1,
				    0,
				    &SR_payload,
Raymond Knopp's avatar
 
Raymond Knopp committed
3225
				    sched_subframe);
3226
	    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
3227
		  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex);
3228 3229 3230 3231 3232
	  }
#endif

	  if (SR_payload == 1) {
	    LOG_I(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
3233
		  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe);
3234 3235 3236 3237 3238 3239 3240
	    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
3241
		    phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe);
3242
	    }
3243
#ifdef OPENAIR2
3244 3245
	    mac_xface->SR_indication(phy_vars_eNB->Mod_id,
				     frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
3246
				     phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
3247
#endif
3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258
	  } 
	}// 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,
3259
			       (uint16_t)n1_pucch0,
3260 3261 3262
			       0, //n2_pucch
			       1, // shortened format
			       pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3263
			       subframe,
3264 3265
			       PUCCH1a_THRES);
	  else {
3266
#ifdef PHY_ABSTRACTION
3267 3268 3269 3270
	    metric0 = rx_pucch_emul(phy_vars_eNB,i,
				    pucch_format1a,
				    0,
				    pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3271
				    subframe);
3272
#endif
3273
	  }	
3274
#ifdef DEBUG_PHY_PROC	  
3275 3276 3277
	  LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n",
		phy_vars_eNB->Mod_id,
		phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3278
		frame,subframe,
3279 3280 3281
		pucch_payload0[0],metric0);
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
3282
	  process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296
				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
3297
	      ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) {
3298 3299 3300 3301 3302 3303 3304 3305 3306 3307
	    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) {
3308
#ifdef DEBUG_PHY_PROC	  
3309 3310
	    LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id,
		  phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3311
		  frame,subframe,
3312 3313 3314 3315 3316 3317 3318 3319 3320 3321
		  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
3322
				 subframe,
3323 3324
				 PUCCH1a_THRES);
	    else {
3325
#ifdef PHY_ABSTRACTION
3326 3327 3328 3329
	      metric0 = rx_pucch_emul(phy_vars_eNB,i,
				      format,
				      0,
				      pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3330
				      subframe);
3331 3332 3333 3334
#endif
	    } 
	  }
	  else {  //using n1_pucch0/n1_pucch1 resources
3335
#ifdef DEBUG_PHY_PROC	  
3336 3337
	    LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id,
		  phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3338
		  frame,subframe,
3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349
		  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,
3350
				   (uint16_t)n1_pucch0,
3351 3352 3353
				   0, // n2_pucch
				   1, // shortened format
				   pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3354
				   subframe,
3355 3356
				   PUCCH1a_THRES);
	      else {
3357
#ifdef PHY_ABSTRACTION
3358 3359 3360 3361
		metric0 = rx_pucch_emul(phy_vars_eNB,i,
					format,
					0,
					pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3362
					subframe);
3363
#endif
3364 3365
	      }
	    }
3366

3367 3368 3369 3370 3371 3372
	    // Check n1_pucch1 metric
	    if (n1_pucch1 != -1) {
	      if (abstraction_flag == 0)
		metric1 = rx_pucch(phy_vars_eNB,
				   format,
				   i,
3373
				   (uint16_t)n1_pucch1,
3374 3375 3376
				   0, //n2_pucch
				   1, // shortened format
				   pucch_payload1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3377
				   subframe,
3378 3379
				   PUCCH1a_THRES);
	      else {
3380
#ifdef PHY_ABSTRACTION
3381 3382 3383 3384
		metric1 = rx_pucch_emul(phy_vars_eNB,i,
					format,
					1,
					pucch_payload1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3385
					subframe);
3386

3387
		
3388
#endif
3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408
	      }
	    }
	  }

	  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  
	  }
3409
#ifdef DEBUG_PHY_PROC	  
3410 3411
	  LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id,
		phy_vars_eNB->dlsch_eNB[i][0]->rnti,
Raymond Knopp's avatar
 
Raymond Knopp committed
3412
		frame,subframe,
3413
		metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
3414
#endif	  
Raymond Knopp's avatar
 
Raymond Knopp committed
3415
	  process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
3416 3417 3418 3419 3420
				0,// pusch_flag
				pucch_payload,
				pucch_sel,
				SR_payload);
	}
Lionel Gauthier's avatar
Lionel Gauthier committed
3421
      }
3422 3423 3424 3425
    } // PUCCH processing
    
#endif //PUCCH
  
Raymond Knopp's avatar
 
Raymond Knopp committed
3426
    if ((frame % 10 == 0) && (subframe==4)) {
3427 3428 3429 3430 3431 3432 3433 3434
      phy_vars_eNB->eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS - 
						     phy_vars_eNB->eNB_UE_stats[i].total_TBS_last)*10;
      
      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
3435 3436 3437
      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 );
3438 3439 3440 3441
    */ 
    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
3442
	(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) {
3443
      rnti=0;
3444 3445

#ifdef DEBUG_PHY_PROC
3446 3447
      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
3448
	    frame,subframe,
3449
	    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]);
3450 3451 3452
#endif
      if (abstraction_flag==0) {
	rx_ulsch(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
3453
		 sched_subframe,
3454 3455 3456 3457 3458
		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		 i,
		 phy_vars_eNB->ulsch_eNB,
		 0);
      }
3459
#ifdef PHY_ABSTRACTION
3460 3461
      else {
	rx_ulsch_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
3462
		      subframe,
3463 3464 3465
		      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		      i);
      }
3466
#endif
3467 3468 3469 3470
      
      if (abstraction_flag == 0) {
	ret = ulsch_decoding(phy_vars_eNB,
			     i,
Raymond Knopp's avatar
 
Raymond Knopp committed
3471
			     sched_subframe,
3472 3473 3474 3475
			     0, // control_only_flag
			     0,  //Nbundled, to be updated!!!!
			     0);  
      }
3476
#ifdef PHY_ABSTRACTION
3477 3478
      else {
	ret = ulsch_decoding_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
3479
				  sched_subframe,
3480 3481 3482
				  i,
				  &rnti);
      }
3483
#endif
3484
      if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) {
3485
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
3486
	//if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) 
3487
	//	print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0);
3488
#endif
3489 3490 3491
	extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->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]->o_RI[0];
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
3492 3493 3494
      /*  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);
3495 3496 3497 3498 3499 3500 3501 3502 3503
      */
      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)) {
3504
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
3505
	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
3506
	      phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid,
3507
	      i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups);
3508
#endif
3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522
	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
3523
	      frame,subframe);	    
3524 3525 3526 3527 3528
	
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
	phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0;
3529 3530
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_ULSCH
3531
	LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",
Raymond Knopp's avatar
 
Raymond Knopp committed
3532
	      frame,subframe,
3533 3534 3535 3536 3537 3538 3539 3540
	      harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
	for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
	  LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
	LOG_T(PHY,"\n");
#endif
#endif
	if (access_mode > UNKNOWN_ACCESS){
	  LOG_I(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
3541
		phy_vars_eNB->Mod_id, frame,subframe,
3542 3543 3544 3545 3546 3547 3548 3549 3550
		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,
			      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);
Raymond Knopp's avatar
 
Raymond Knopp committed
3551
	    phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]=1;//(subframe);
3552 3553
	  } 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
3554
		  phy_vars_eNB->Mod_id,frame,subframe,
3555 3556 3557
		  i,i%num_active_cba_groups ); 
	    mac_xface->SR_indication(phy_vars_eNB->Mod_id,
				     frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
3558
				     phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
3559 3560 3561 3562 3563 3564
	  }
	  
	}
      } // ULSCH CBA not in error 
    }
       
3565 3566
  } // loop i=0 ... NUMBER_OF_UE_MAX-1

Raymond Knopp's avatar
 
Raymond Knopp committed
3567
  if (pusch_active == 0){
3568 3569
    if (abstraction_flag == 0) {
      //      LOG_D(PHY,"[eNB] Frame %d, subframe %d Doing I0_measurements\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
3570
      //	  (((subframe)==9)?-1:0) + phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
3571 3572 3573 3574
      lte_eNB_I0_measurements(phy_vars_eNB,
			      0,
			      phy_vars_eNB->first_run_I0_measurements);
    }
3575
#ifdef PHY_ABSTRACTION
3576 3577 3578 3579
    else {
      lte_eNB_I0_measurements_emul(phy_vars_eNB,
				   sect_id);
    }
3580
#endif
3581 3582 3583 3584
  
    
    if (I0_clear == 1)
      I0_clear = 0;
3585 3586 3587
  }

#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
3588
  phy_procedures_emos_eNB_RX(subframe,phy_vars_eNB);
3589 3590 3591
#endif

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,0);
3592 3593
  stop_meas(&phy_vars_eNB->phy_proc_rx);
   
3594 3595 3596 3597
}

#undef DEBUG_PHY_PROC

3598 3599
#ifdef Rel10  
int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type){
3600
  
3601 3602 3603 3604 3605 3606
  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:
3607
    if (((next_slot >>1) < 6) || ((next_slot >>1) > 8))
3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619
      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
3620
void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag, 
3621
			    relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) {
3622
#if defined(ENABLE_ITTI)
3623 3624 3625 3626 3627
  MessageDef   *msg_p;
  const char   *msg_name;
  instance_t    instance;
  unsigned int  Mod_id;
  int           result;
3628
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3629

3630
  /*
Raymond Knopp's avatar
 
Raymond Knopp committed
3631
    if (phy_vars_eNB->proc[sched_subframe].frame_tx >= 1000)
3632
    mac_xface->macphy_exit("Exiting after 1000 Frames\n");
3633
  */
Raymond Knopp's avatar
 
Raymond Knopp committed
3634 3635
  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_ENB, subframe*2);
  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_ENB, phy_vars_eNB->proc[subframe].frame_tx);
3636
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1);
3637
  start_meas(&phy_vars_eNB->phy_proc);
Lionel Gauthier's avatar
Lionel Gauthier committed
3638

3639 3640
#if defined(ENABLE_ITTI)
  do {
3641 3642
    // Checks if a message has been sent to PHY sub-task
    itti_poll_msg (TASK_PHY_ENB, &msg_p);
3643

3644 3645 3646 3647
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
      Mod_id = instance;
3648

3649
      switch (ITTI_MSG_ID(msg_p)) {
Lionel Gauthier's avatar
Lionel Gauthier committed
3650
#   if defined(ENABLE_RAL)
Raymond Knopp's avatar
 
Raymond Knopp committed
3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661
      case TIMER_HAS_EXPIRED:
	// check if it is a measurement timer
	{
	  hashtable_rc_t       hashtable_rc;

	  hashtable_rc = hashtable_is_key_exists(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id));
	  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
3662 3663


Raymond Knopp's avatar
 
Raymond Knopp committed
3664
      case PHY_MEAS_THRESHOLD_REQ:
Lionel Gauthier's avatar
Lionel Gauthier committed
3665
#warning "TO DO LIST OF THRESHOLDS"
Raymond Knopp's avatar
 
Raymond Knopp committed
3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753
	LOG_I(PHY, "[ENB %d] Received %s\n", Mod_id, msg_name);
	{
	  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(
				    &PHY_vars_eNB_g[Mod_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen],
				    threshold_phy_p,
				    ral_thresholds);
		  break;

		case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
		  SLIST_INSERT_HEAD(
				    &PHY_vars_eNB_g[Mod_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte],
				    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) {
		  hashtable_rc = hashtable_insert(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p);
		  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
3754
#   endif
3755

Raymond Knopp's avatar
 
Raymond Knopp committed
3756 3757 3758 3759
	/* Messages from eNB app */
      case PHY_CONFIGURATION_REQ:
	LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name);
	/* TODO */
3760

Raymond Knopp's avatar
 
Raymond Knopp committed
3761
	break;
3762

Raymond Knopp's avatar
 
Raymond Knopp committed
3763 3764 3765
      default:
	LOG_E(PHY, "[ENB %d] Received unexpected message %s\n", Mod_id, msg_name);
	break;
Lionel Gauthier's avatar
Lionel Gauthier committed
3766
      }
3767 3768 3769 3770

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

Raymond Knopp's avatar
 
Raymond Knopp committed
3774 3775
  if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD)&&
	(subframe_select(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[subframe].subframe_tx)==SF_DL))||
Raymond Knopp's avatar
 
Raymond Knopp committed
3776
       (phy_vars_eNB->lte_frame_parms.frame_type == FDD))) {
3777
#ifdef Rel10 
Raymond Knopp's avatar
 
Raymond Knopp committed
3778
    if (phy_procedures_RN_eNB_TX(phy_vars_eNB->proc[subframe].subframe_rx, phy_vars_eNB->proc[subframe].subframe_tx, r_type) != 0 ) 
3779
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
3780
      phy_procedures_eNB_TX(subframe,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
3781
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3782 3783
  if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD )&&
	(subframe_select(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[subframe].subframe_rx)==SF_UL)) ||
Raymond Knopp's avatar
 
Raymond Knopp committed
3784
       (phy_vars_eNB->lte_frame_parms.frame_type == FDD))){
Raymond Knopp's avatar
 
Raymond Knopp committed
3785
    phy_procedures_eNB_RX(subframe,phy_vars_eNB,abstraction_flag,r_type);
3786
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3787
  if (subframe_select(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[subframe].subframe_tx)==SF_S) {
3788
#ifdef Rel10 
Raymond Knopp's avatar
 
Raymond Knopp committed
3789
    if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 )
3790
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
3791
      phy_procedures_eNB_TX(subframe,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
3792
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3793 3794
  if ((subframe_select(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[subframe].subframe_rx)==SF_S)){
    phy_procedures_eNB_S_RX(subframe,phy_vars_eNB,abstraction_flag,r_type);
3795 3796 3797
  }


Raymond Knopp's avatar
 
Raymond Knopp committed
3798 3799 3800 3801 3802 3803 3804 3805
  phy_vars_eNB->proc[subframe].frame_tx++;
  phy_vars_eNB->proc[subframe].frame_rx++;
  if (phy_vars_eNB->proc[subframe].frame_tx==1024)
    phy_vars_eNB->proc[subframe].frame_tx=0;
  if (phy_vars_eNB->proc[subframe].frame_rx==1024)
    phy_vars_eNB->proc[subframe].frame_rx=0;

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0);
3806
  stop_meas(&phy_vars_eNB->phy_proc);
3807 3808
}