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

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


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

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

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

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

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

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

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

Raymond Knopp's avatar
 
Raymond Knopp committed
52
#define DEBUG_PHY_PROC
53 54 55 56 57 58 59 60 61 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
//#define DIAG_PHY

#define NS_PER_SLOT 500000

#define PUCCH 1
80
#define PUCCH1_THRES 15
81
#define PUCCH1a_THRES 15
82 83 84

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


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

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

Raymond Knopp's avatar
 
Raymond Knopp committed
114 115 116 117
uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t sched_subframe) {

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

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

  //#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++) {
154 155 156 157 158 159 160 161 162 163 164
    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);
165
      }
166
    }
167 168 169 170
  }
  return(-1);
}

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

  //#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++) {
178 179 180 181 182 183 184 185 186 187 188
    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
189
	//	mac_exit_wrapper("Removing UE");	
190
	return(i);
191
      }
192
    }
193 194 195 196 197
  }

  return(-1);
}

198 199
int8_t find_next_ue_index(PHY_VARS_eNB *phy_vars_eNB) {
  uint8_t i;
200 201

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

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

  LTE_eNB_DLSCH_t *DLSCH_ptr;  
  LTE_eNB_ULSCH_t *ULSCH_ptr;  
217 218 219
  //  uint8_t subframe_m4;
  uint8_t ulsch_subframe,ulsch_frame; 
  uint8_t i;
Raymond Knopp's avatar
 
Raymond Knopp committed
220
  int8_t UE_id = find_ue(rnti,PHY_vars_eNB_g[Mod_id][CC_id]);
Raymond Knopp's avatar
 
Raymond Knopp committed
221 222
  //  int frame    = PHY_vars_eNB_g[Mod_id][CC_id]->proc[sched_subframe].frame_tx;
  //  int subframe = PHY_vars_eNB_g[Mod_id][CC_id]->proc[sched_subframe].subframe_tx;
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
Raymond Knopp's avatar
 
Raymond Knopp committed
231
    DLSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_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

Raymond Knopp's avatar
 
Raymond Knopp committed
273 274 275
    ULSCH_ptr = PHY_vars_eNB_g[Mod_id][CC_id]->ulsch_eNB[(uint32_t)UE_id];
    ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,subframe);
    ulsch_frame    = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,frame,subframe);
276
    // Note this is for TDD configuration 3,4,5 only
Raymond Knopp's avatar
 
Raymond Knopp committed
277
    *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id][CC_id]->lte_frame_parms,
278 279 280 281
				  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; 
429
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
430
 
431
#ifdef DEBUG_PHY_PROC
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[sched_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
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1051 1052 1053
  // Get scheduling info for next subframe 
  if (phy_vars_eNB->CC_id == 0)
    mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1);
1054
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1055
  
Raymond Knopp's avatar
 
Raymond Knopp committed
1056
  //  for (sect_id = 0 ; sect_id < number_of_cards; sect_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
1057
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1058

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


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

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

1078
#ifdef Rel10
Raymond Knopp's avatar
 
Raymond Knopp committed
1079 1080
    // if mcch is active, send regardless of the node type: eNB or RN
    // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing 
Raymond Knopp's avatar
 
Raymond Knopp committed
1081 1082 1083 1084
    mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id,
				      phy_vars_eNB->CC_id,
				      phy_vars_eNB->proc[sched_subframe].frame_tx,
				      subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
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 1115 1116 1117 1118
    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
1119
	mch_pduP=NULL;
Raymond Knopp's avatar
 
Raymond Knopp committed
1120 1121 1122 1123 1124 1125 1126 1127 1128
      }
      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
1129
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1130 1131 1132
    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
1133
      generate_mch(phy_vars_eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag);
1134
#ifdef DEBUG_PHY
Raymond Knopp's avatar
 
Raymond Knopp committed
1135 1136 1137
      for (i=0;i<mch_pduP->Pdu_size;i++)
	msg("%2x.",(uint8_t)mch_pduP->payload[i]);
      msg("\n");
1138
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
1139 1140
    } else {
      LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
1141
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1142 1143
#endif
  }
1144
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1145
  else {
Raymond Knopp's avatar
 
Raymond Knopp committed
1146
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1147
    
Raymond Knopp's avatar
 
Raymond Knopp committed
1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158
    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);
1159
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172
      // 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
1173
	    
Raymond Knopp's avatar
 
Raymond Knopp committed
1174 1175
	}
      }    
Raymond Knopp's avatar
 
Raymond Knopp committed
1176
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1177
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
1178

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

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

      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1509 1510 1511
      DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe];

    }
1512

Raymond Knopp's avatar
 
Raymond Knopp committed
1513
    else if (DCI_pdu->dci_alloc[i].format != format0){ // this is a normal DLSCH allocation
1514 1515 1516

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

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1558
	  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
1559 1560 1561 1562 1563
	  // 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
1564 1565
#endif
	}
Raymond Knopp's avatar
 
Raymond Knopp committed
1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578
	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);
1579
      }
Raymond Knopp's avatar
 
Raymond Knopp committed
1580
    }
1581

Raymond Knopp's avatar
 
Raymond Knopp committed
1582
  }
1583

Raymond Knopp's avatar
 
Raymond Knopp committed
1584 1585
  // Apply physicalConfigDedicated if needed
  phy_config_dedicated_eNB_step2(phy_vars_eNB);
Raymond Knopp's avatar
 
Raymond Knopp committed
1586

Raymond Knopp's avatar
 
Raymond Knopp committed
1587 1588 1589 1590 1591 1592 1593 1594 1595 1596
  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");
      }
1597
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1598
      UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
1599
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1600
      UE_id = i;
1601
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1602 1603 1604 1605
      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");
      }
1606
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623
      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
1624
					 sched_subframe,
Raymond Knopp's avatar
 
Raymond Knopp committed
1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645
					 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);
1646 1647

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1648 1649 1650 1651 1652
	// 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);
	}
1653 1654
#endif

1655
      }
Lionel Gauthier's avatar
 
Lionel Gauthier committed
1656 1657 1658 1659 1660 1661 1662 1663
      
#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
1664 1665 1666 1667 1668
      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
1669
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
1670
  }
1671

1672
    
1673 1674


Lionel Gauthier's avatar
Lionel Gauthier committed
1675 1676


Raymond Knopp's avatar
 
Raymond Knopp committed
1677 1678
  // 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
1679

1680
 
Raymond Knopp's avatar
 
Raymond Knopp committed
1681 1682 1683 1684 1685
  }
  else {  // for emulation!!
    phy_vars_eNB->num_ue_spec_dci[(subframe)&1]=0;
    phy_vars_eNB->num_common_dci[(subframe)&1]=0;
  }
1686
 
Raymond Knopp's avatar
 
Raymond Knopp committed
1687
  if (abstraction_flag == 0) {
1688
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1689 1690
    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);
1691 1692
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1693 1694 1695 1696 1697 1698 1699 1700 1701
    //    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
1702 1703

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1704
    //	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
1705 1706

#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1707
  }
1708 1709

#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1710 1711 1712 1713
  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);
  }
1714 1715
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1716
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0);
1717 1718

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1719
  //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);
1720 1721
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1722
  // Check for SI activity
1723

Raymond Knopp's avatar
 
Raymond Knopp committed
1724 1725
  if (phy_vars_eNB->dlsch_eNB_SI->active == 1) {
    input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8;
1726 1727 1728


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

#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_DLSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
1750 1751 1752 1753 1754
    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");
1755 1756 1757
#endif
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1758
    if (abstraction_flag == 0) {
1759

Raymond Knopp's avatar
 
Raymond Knopp committed
1760 1761 1762 1763 1764 1765 1766 1767 1768 1769
      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);  
1770
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783
      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);	      
1784
	
Raymond Knopp's avatar
 
Raymond Knopp committed
1785 1786 1787 1788 1789 1790 1791 1792 1793 1794
      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);	      
    } 
1795
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1796 1797 1798 1799 1800 1801 1802
    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);	      
    }
1803
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1804
    phy_vars_eNB->dlsch_eNB_SI->active = 0;
1805
      
Raymond Knopp's avatar
 
Raymond Knopp committed
1806
  }
Lionel Gauthier's avatar
Lionel Gauthier committed
1807

Raymond Knopp's avatar
 
Raymond Knopp committed
1808 1809
  // Check for RA activity
  if (phy_vars_eNB->dlsch_eNB_ra->active == 1) {
1810
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1811 1812
    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);
1813 1814
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1815
    input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8;
1816 1817

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1818
    crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1819
				phy_vars_eNB->CC_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833
				phy_vars_eNB->proc[sched_subframe].frame_tx,
				dlsch_input_buffer,
				phy_vars_eNB->lte_frame_parms.N_RB_UL,
				input_buffer_length);
    /*
      for (i=0;i<input_buffer_length;i++)
      LOG_T(PHY,"%x.",dlsch_input_buffer[i]);
      LOG_T(PHY,"\n");
    */
    UE_id = add_ue(crnti,phy_vars_eNB);
    if (UE_id==-1) {
      LOG_W(PHY,"[eNB] Max user count reached.\n");
      //mac_xface->macphy_exit("[PHY][eNB] Max user count reached.\n");
      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1834
				phy_vars_eNB->CC_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855
				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);
1856
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1857 1858
      for (i=0;i<input_buffer_length;i++)
	dlsch_input_buffer[i]= (unsigned char) i; //(taus()&0xff);
1859

Raymond Knopp's avatar
 
Raymond Knopp committed
1860 1861 1862
      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); 
1863 1864 1865
#endif

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1866 1867 1868 1869 1870
      // 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);
      }
1871 1872 1873
#endif      

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1874 1875 1876 1877 1878
      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);
1879 1880
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
1881 1882 1883 1884 1885 1886 1887 1888 1889 1890
      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
1891

Raymond Knopp's avatar
 
Raymond Knopp committed
1892 1893 1894
	//	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
1895
			 phy_vars_eNB->dlsch_eNB_ra,
Raymond Knopp's avatar
 
Raymond Knopp committed
1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911
			 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);
      }
1912
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
1913 1914 1915 1916 1917
      else {
	dlsch_encoding_emul(phy_vars_eNB,
			    dlsch_input_buffer,
			    phy_vars_eNB->dlsch_eNB_ra);
      }
1918
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1919 1920
      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);
1921
	
1922
#ifdef DEBUG_PHY_PROC    
Raymond Knopp's avatar
 
Raymond Knopp committed
1923 1924
      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);
1925 1926 1927
#endif

#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1928
    } //max user count
1929
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1930 1931
    phy_vars_eNB->dlsch_eNB_ra->active = 0;
  }
1932

Raymond Knopp's avatar
 
Raymond Knopp committed
1933 1934 1935 1936 1937 1938 1939
  // 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;
1940
      
1941 1942

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962
      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]++;
1963
	  
1964
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
1965
	DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1966
					     phy_vars_eNB->CC_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
1967 1968 1969 1970
					     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;
1971
#else
Raymond Knopp's avatar
 
Raymond Knopp committed
1972 1973 1974
	DLSCH_pdu = DLSCH_pdu_tmp;
	for (i=0;i<input_buffer_length;i++)
	  DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
1975 1976 1977
#endif      

#if defined(SMBV) && !defined(EXMIMO)
Raymond Knopp's avatar
 
Raymond Knopp committed
1978 1979 1980 1981 1982
	// 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);
	}
1983 1984 1985 1986 1987
#endif      


#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_DLSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
1988 1989 1990 1991
	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");
1992 1993
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
1994 1995 1996
      }
      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]++;	
1997 1998
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_DLSCH  
Raymond Knopp's avatar
 
Raymond Knopp committed
1999
	LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n");
2000 2001
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2002 2003
      }
      if (abstraction_flag==0) {
2004

Raymond Knopp's avatar
 
Raymond Knopp committed
2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
	// 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
2020
			 phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
Raymond Knopp's avatar
 
Raymond Knopp committed
2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031
			 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++) {
2032
	    
Raymond Knopp's avatar
 
Raymond Knopp committed
2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049
	  /*          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);	      
      }
2050
#ifdef PHY_ABSTRACTION
Raymond Knopp's avatar
 
Raymond Knopp committed
2051 2052 2053 2054 2055 2056 2057
      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);	      
      }
2058
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2059
      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0;
2060
	
Raymond Knopp's avatar
 
Raymond Knopp committed
2061 2062
      //mac_xface->macphy_exit("first dlsch transmitted\n");
    }
Lionel Gauthier's avatar
Lionel Gauthier committed
2063

Raymond Knopp's avatar
 
Raymond Knopp committed
2064 2065 2066
    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)) {
2067
      
Raymond Knopp's avatar
 
Raymond Knopp committed
2068 2069
      // 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;
2070
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2071
      //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,subframe,UE_id);
2072
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2073
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
2074
  }
2075
  
2076 2077


Raymond Knopp's avatar
 
Raymond Knopp committed
2078 2079 2080
  // 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)) {
2081
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2082
    //      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);
2083
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2084 2085
    //    for (sect_id=0;sect_id<number_of_cards;sect_id++) {
    generate_phich_top(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2086
		       sched_subframe,
Raymond Knopp's avatar
 
Raymond Knopp committed
2087 2088 2089 2090 2091
		       AMP,
		       0,
		       abstraction_flag);
  }
  
Raymond Knopp's avatar
 
Raymond Knopp committed
2092

Raymond Knopp's avatar
 
Raymond Knopp committed
2093
     
2094
#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
2095
  phy_procedures_emos_eNB_TX(next_slot, phy_vars_eNB);
2096
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113

#ifndef EXMIMO
#ifndef USRP
  if (abstraction_flag==0) {
    start_meas(&phy_vars_eNB->ofdm_mod_stats);
    do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		phy_vars_eNB->lte_eNB_common_vars.txdata[0],
		phy_vars_eNB->proc[sched_subframe].frame_tx,subframe<<1,
		&phy_vars_eNB->lte_frame_parms);
    do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
		phy_vars_eNB->lte_eNB_common_vars.txdata[0],
		phy_vars_eNB->proc[sched_subframe].frame_tx,1+(subframe<<1),
		&phy_vars_eNB->lte_frame_parms);
    stop_meas(&phy_vars_eNB->ofdm_mod_stats);
  }
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2114
  
2115
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0);
2116
  stop_meas(&phy_vars_eNB->phy_proc_tx);
Raymond Knopp's avatar
 
Raymond Knopp committed
2117 2118
  
  
2119 2120
}

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

Raymond Knopp's avatar
 
Raymond Knopp committed
2124
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2125
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2126

Raymond Knopp's avatar
 
Raymond Knopp committed
2127
  LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n",
2128
	phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2129
	frame,subframe,
2130 2131 2132 2133
	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;
2134
  
2135
  if ((phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) && 
Raymond Knopp's avatar
 
Raymond Knopp committed
2136
      (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) &&
2137
      (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == frame))   {
2138 2139 2140
    
    //    harq_pid = 0;
    
2141 2142 2143
    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
2144
    LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n",
2145
	  phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2146
	  frame,subframe,UE_id);
2147 2148 2149 2150 2151 2152 2153 2154 2155
  }
}


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

2156
void process_HARQ_feedback(uint8_t UE_id, 
Raymond Knopp's avatar
 
Raymond Knopp committed
2157
			   uint8_t sched_subframe, 
2158
			   PHY_VARS_eNB *phy_vars_eNB,
2159 2160 2161 2162 2163 2164 2165 2166
			   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];
2167
  LTE_DL_eNB_HARQ_t *dlsch_harq_proc;
2168
  uint8_t subframe_m4,M,m;
2169 2170
  int mp;
  int all_ACKed=1,nb_alloc=0,nb_ACK=0;
Raymond Knopp's avatar
 
Raymond Knopp committed
2171 2172
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
2173 2174

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

2177 2178 2179
    dl_harq_pid[0] = dlsch->harq_ids[subframe_m4];
    M=1;
    if (pusch_flag == 1)
2180
      dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->o_ACK[0];
2181 2182 2183 2184
    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);
2185 2186
  }
  else {  // TDD Handle M=1,2 cases only
2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197
    
    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

2198 2199
      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];
2200 2201
      //      printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]);
    }
2202

2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241
    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;
	}
2242
      }
2243
    }
2244 2245 2246 2247
  }

  // handle case where positive SR was transmitted with multiplexing
  if ((SR_payload == 1)&&(pucch_sel!=2)&&(pusch_flag == 0)) {
2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260
    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;
2261

2262
    //    printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed);
2263 2264 2265 2266 2267
  }


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

2268 2269 2270
    dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
					       subframe,
					       m);
2271

2272 2273 2274 2275 2276
    if (dlsch->subframe_tx[dl_subframe]==1) {
      if (pusch_flag == 1)
	mp++;
      else
	mp = m;
2277

2278
      dl_harq_pid[m]     = dlsch->harq_ids[dl_subframe];
2279

2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304
      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 
2305
#ifdef DEBUG_PHY_PROC	
2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320
	    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]);
2321
#endif
2322 2323 2324 2325 2326 2327 2328
	      dlsch_harq_proc->round = 0;
	      ue_stats->dlsch_l2_errors++;
	      dlsch_harq_proc->status = SCH_IDLE;
	      dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
	    }
	  }
	  else {
2329
#ifdef DEBUG_PHY_PROC	
2330 2331
	    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);
2332
#endif
2333
	    ue_stats->dlsch_ACK[dlsch_harq_proc->round]++;
2334

2335 2336 2337 2338
	    // 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;
2339

2340
	    ue_stats->total_TBS = ue_stats->total_TBS + 
2341
	      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
2342
	    /*
Raymond Knopp's avatar
 
Raymond Knopp committed
2343
	      ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits +
2344
	      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
2345 2346 2347 2348 2349 2350 2351 2352 2353 2354
	    */
	  }
	  
	  // 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;
	  }
2355
#ifdef DEBUG_PHY_PROC	  
2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378
	  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;
	  }
	  
	  
	}
2379
      }
2380
    }
2381 2382 2383 2384
  }
}

void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
2385
		      uint8_t UE_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2386
		      uint8_t sched_subframe,
2387 2388 2389 2390
		      int16_t *n1_pucch0,
		      int16_t *n1_pucch1,
		      int16_t *n1_pucch2,
		      int16_t *n1_pucch3) {
2391 2392

  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
2393
  uint8_t nCCE0,nCCE1;
2394
  int sf;
Raymond Knopp's avatar
 
Raymond Knopp committed
2395 2396
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
2397 2398

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

2402 2403
    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];
2404 2405 2406 2407 2408 2409
      *n1_pucch1 = -1;
    }
    else {
      *n1_pucch0 = -1;
      *n1_pucch1 = -1;
    }
2410 2411 2412
  }
  else {

2413 2414 2415
    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
2416 2417
	/*	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];
2418
		*n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
2419 2420
		}
		else
2421
		*n1_pucch1 = -1;*/
2422

2423 2424
	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];
2425 2426 2427 2428
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2429

2430 2431 2432 2433
	*n1_pucch1 = -1;	
      }
      else if (subframe == 3) {   // ACK subframe 9
	
2434 2435
	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];
2436 2437 2438 2439
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2440

2441 2442 2443 2444 2445 2446
	*n1_pucch1 = -1;
	
      }
      else if (subframe == 7) {  // ACK subframes 0 and 1
	//harq_ack[0].nCCE;  
	//harq_ack[1].nCCE;
2447 2448
	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];
2449 2450 2451 2452
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2453

2454 2455 2456 2457
	*n1_pucch1 = -1;
      }
      else if (subframe == 8) {   // ACK subframes 4
	//harq_ack[4].nCCE;
2458 2459
	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];
2460 2461 2462 2463
	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch0 = -1;
2464

2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476
	*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)
2477 2478
	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];
2479 2480 2481 2482
	  *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
	}
	else
	  *n1_pucch1 = -1;
2483

2484 2485
	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];
2486 2487 2488 2489 2490 2491 2492
	  *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",
2493
	      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]);
2494

2495 2496
	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];
2497 2498 2499 2500 2501
	  *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
2502

2503 2504
	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];
2505 2506 2507 2508 2509 2510 2511
	  *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
2512 2513
	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];
2514 2515 2516 2517
	  *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
2518

2519 2520
	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];
2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535
	  *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;
2536 2537 2538 2539
  }
}


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

2542 2543 2544 2545
  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
2546
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2547
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2548
  uint8_t CC_id = phy_vars_eNB->CC_id;
2549

2550 2551
  memset(&preamble_energy_list[0],0,64*sizeof(uint16_t));
  memset(&preamble_delay_list[0],0,64*sizeof(uint16_t));
2552
  if (abstraction_flag == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2553
    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
2554
	  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
2555
    
2556
    //    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);
2557

2558 2559 2560 2561 2562 2563
    rx_prach(phy_vars_eNB,
	     subframe,
	     preamble_energy_list,
	     preamble_delay_list,
	     frame,
	     0);
2564 2565
  }
  else {
2566 2567 2568
    for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
      
      LOG_D(PHY,"[RAPROC] UE_id %d (%p), generate_prach %d, UE RSI %d, eNB RSI %d preamble index %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2569 2570
	    UE_id,PHY_vars_UE_g[UE_id][CC_id],PHY_vars_UE_g[UE_id][CC_id]->generate_prach,
	    PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex,
2571
	    phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,
Raymond Knopp's avatar
 
Raymond Knopp committed
2572
	    PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex);
2573
      
Raymond Knopp's avatar
 
Raymond Knopp committed
2574 2575
      if ((PHY_vars_UE_g[UE_id][CC_id]->generate_prach==1) &&
	  (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex ==
2576
	   phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2577 2578
	preamble_energy_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 80;
	preamble_delay_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 5;
2579
	
2580
      }
2581
    }
2582 2583 2584 2585 2586
  }
  preamble_energy_max = preamble_energy_list[0];
  preamble_max = 0;

  for (i=1;i<64;i++) {
2587 2588 2589 2590
    if (preamble_energy_max < preamble_energy_list[i]) {
      preamble_energy_max = preamble_energy_list[i];
      preamble_max = i;
    }
2591 2592 2593
  }

#ifdef DEBUG_PHY_PROC
2594
  LOG_D(PHY,"[RAPROC] Most likely preamble %d, energy %d dB delay %d\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2595 2596 2597
	preamble_max,
	preamble_energy_list[preamble_max],
	preamble_delay_list[preamble_max]);
2598 2599 2600
#endif

  if (preamble_energy_list[preamble_max] > 60) {
2601 2602
    UE_id = find_next_ue_index(phy_vars_eNB);
    if (UE_id>=0) {
2603 2604 2605
      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;
2606 2607 2608 2609 2610
      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]);
2611
#ifdef OPENAIR2	  
2612
      mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2613
				  phy_vars_eNB->CC_id,
2614 2615 2616 2617
				  frame,
				  preamble_max,
				  preamble_delay_list[preamble_max],
				  0,subframe,0);
2618
#endif
2619 2620 2621 2622 2623
    }
    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);
    }
2624 2625 2626
  }
}

Raymond Knopp's avatar
 
Raymond Knopp committed
2627
void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag)
2628 2629 2630 2631 2632
{
  LOG_D(PHY,"ulsch_decoding_procedures not yet implemented. should not be called");
}


Raymond Knopp's avatar
 
Raymond Knopp committed
2633
void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type) {
2634
  //RX processing
Raymond Knopp's avatar
 
Raymond Knopp committed
2635
  uint32_t l, ret=0,i,j;
2636 2637 2638 2639 2640 2641 2642
  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;
2643 2644
  ANFBmode_t bundling_flag;
  PUCCH_FMT_t format;
2645 2646 2647
  uint8_t nPRS;
  //  uint8_t two_ues_connected = 0;
  uint8_t pusch_active = 0;
2648 2649
  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
  int sync_pos;
2650 2651
  uint16_t rnti=0;
  uint8_t access_mode;
2652
  int num_active_cba_groups;
Raymond Knopp's avatar
 
Raymond Knopp committed
2653
  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
Raymond Knopp's avatar
 
Raymond Knopp committed
2654
  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
2655 2656

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
2657
  start_meas(&phy_vars_eNB->phy_proc_rx);
2658
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2659
  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe);
2660
#endif
2661 2662

  if (abstraction_flag == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2663 2664
    remove_7_5_kHz(phy_vars_eNB,subframe<<1);
    remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1);
2665 2666
  }
  // check if we have to detect PRACH first
Raymond Knopp's avatar
 
Raymond Knopp committed
2667 2668
  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
2669
    prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag);
Raymond Knopp's avatar
 
Raymond Knopp committed
2670
    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
2671
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
2672
 
2673
  if (abstraction_flag == 0) {
2674 2675 2676
    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
2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691
      //      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
		  );
2692 2693
    }
    stop_meas(&phy_vars_eNB->ofdm_demod_stats);	      	      	  
2694 2695 2696 2697 2698
  }
  sect_id = 0;

  /*
    for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) {
2699
    
2700
    if ((phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode>PRACH) && (last_slot%2==1)) {
2701 2702 2703
    #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
2704
    phy_vars_eNB->proc[sched_subframe].frame_tx, last_slot, 
2705
    UE_id,phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode);
2706 2707
    #endif
    for (sect_id=0;sect_id<number_of_cards;sect_id++) {
2708
	
2709 2710
    lte_srs_channel_estimation(&phy_vars_eNB->lte_frame_parms,
    &phy_vars_eNB->lte_eNB_common_vars,
2711 2712
    &phy_vars_eNB->lte_eNB_srs_vars[(uint32_t)UE_id],
    &phy_vars_eNB->soundingrs_ul_config_dedicated[(uint32_t)UE_id],
2713 2714 2715 2716 2717 2718 2719 2720 2721
    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
2722
    phy_vars_eNB->proc[sched_subframe].frame_tx, last_slot, 
2723
    UE_id,sect_id,
2724
    phy_vars_eNB->PHY_measurements_eNB[sect_id].rx_rssi_dBm[(uint32_t)UE_id]);
2725 2726
    #endif
    }
2727
      
2728 2729 2730 2731 2732
    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
2733
      
2734 2735
    //msg("timing advance in\n");
    sync_pos = lte_est_timing_advance(&phy_vars_eNB->lte_frame_parms,
2736
    &phy_vars_eNB->lte_eNB_srs_vars[(uint32_t)UE_id],
2737
    &sect_id,
2738
    phy_vars_eNB->first_run_timing_advance[(uint32_t)UE_id],
2739 2740
    number_of_cards,
    24576);
2741
      
2742
    //msg("timing advance out\n");
2743
      
2744 2745 2746
    //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;
2747
    #ifdef DEBUG_PHY_PROC	
2748 2749
    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
2750
    phy_vars_eNB->proc[sched_subframe].frame_tx, last_slot, 
2751
    UE_id, sect_id,
2752
    phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset);
2753 2754 2755 2756
    #endif
    }
    }
    else {
2757
    
2758
    }
2759
  */
Raymond Knopp's avatar
 
Raymond Knopp committed
2760

2761 2762
  // Check for active processes in current subframe
  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
2763
			       frame,subframe);
2764
  pusch_active = 0;
2765
  // reset the cba flag used for collision detection 
2766
  for (i=0; i < NUM_MAX_CBA_GROUP; i++){
2767
    phy_vars_eNB->cba_last_reception[i]=0;
2768
  }
Raymond Knopp's avatar
Raymond Knopp committed
2769
  //  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]);
2770 2771 2772 2773
 
  for (i=0;i<NUMBER_OF_UE_MAX;i++) { 
  
    /*
2774 2775
      if ((i == 1) && (phy_vars_eNB->cooperation_flag > 0) && (two_ues_connected == 1))
      break;
2776
    */
2777
#ifdef OPENAIR2
2778
    if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE)
Raymond Knopp's avatar
 
Raymond Knopp committed
2779
      process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid);
2780 2781
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
2782
    /*
Raymond Knopp's avatar
Raymond Knopp committed
2783 2784
#ifdef DEBUG_PHY_PROC
    if (phy_vars_eNB->ulsch_eNB[i]) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2785
            
Raymond Knopp's avatar
 
Raymond Knopp committed
2786
      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
2787 2788 2789 2790 2791
	    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
2792 2793
    }
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
2794 2795
    */

2796 2797
    if ((phy_vars_eNB->ulsch_eNB[i]) &&
	(phy_vars_eNB->ulsch_eNB[i]->rnti>0) &&
Raymond Knopp's avatar
 
Raymond Knopp committed
2798
	(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) {
2799 2800 2801
 
      pusch_active = 1;
      round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
2802 2803

#ifdef DEBUG_PHY_PROC
2804 2805
      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
2806
	    frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti);
2807
#endif
2808
  
2809
#ifdef DEBUG_PHY_PROC
2810
      if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1){
Raymond Knopp's avatar
 
Raymond Knopp committed
2811
	LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n",
2812 2813
	      phy_vars_eNB->Mod_id,
	      frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
2814
	      subframe,
2815 2816
	      phy_vars_eNB->eNB_UE_stats[i].sector);
      } else {
Raymond Knopp's avatar
 
Raymond Knopp committed
2817
	LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s sect_id %d\n",
2818 2819
	      phy_vars_eNB->Mod_id,
	      frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
2820
	      subframe,
2821 2822 2823 2824
	      i,
	      mode_string[phy_vars_eNB->eNB_UE_stats[i].mode],
	      phy_vars_eNB->eNB_UE_stats[i].sector);
      }
2825 2826
#endif

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

2829
      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;
2830

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

Raymond Knopp's avatar
 
Raymond Knopp committed
2834 2835 2836 2837 2838 2839
	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;
	}
2840
      }
Raymond Knopp's avatar
Raymond Knopp committed
2841

2842
#ifdef DEBUG_PHY_PROC
2843
      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
2844
	    phy_vars_eNB->Mod_id,harq_pid,frame,subframe,
2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861
	    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
2862
		 sched_subframe,
2863 2864 2865 2866 2867
		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		 i,
		 phy_vars_eNB->ulsch_eNB,
		 0);
      }
2868
#ifdef PHY_ABSTRACTION
2869 2870
      else {
	rx_ulsch_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2871
		      subframe,
2872 2873 2874
		      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		      i);
      }
2875
#endif
2876
      stop_meas(&phy_vars_eNB->ulsch_demodulation_stats);	      	      	  
2877 2878


2879 2880 2881 2882 2883 2884 2885
      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
2886
			     sched_subframe,
2887 2888 2889 2890
			     0, // control_only_flag
			     0, //Nbundled, to be updated!!!!
			     0);  
      }
2891
#ifdef PHY_ABSTRACTION
2892 2893
      else {
	ret = ulsch_decoding_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
2894
				  sched_subframe,
2895 2896 2897
				  i,
				  &rnti);
      }
2898
#endif
2899
      stop_meas(&phy_vars_eNB->ulsch_decoding_stats);
2900

Raymond Knopp's avatar
 
Raymond Knopp committed
2901
      //#ifdef DEBUG_PHY_PROC
2902
      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
2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913
	    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
2914
      /*
2915 2916
	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++) {
2917
	phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_0[j]) 
2918
	- phy_vars_eNB->rx_total_gain_eNB_dB;
2919
	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]) 
2920 2921 2922 2923
	- 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
2924
	phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,last_slot>>1,i,
2925 2926 2927 2928 2929 2930 2931
	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 {
2932 2933 2934 2935
      */
      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;
2936
#ifdef DEBUG_PHY_PROC
2937
      LOG_I(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power (%d,%d) dB\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
2938
	    phy_vars_eNB->Mod_id,frame,subframe,i,
2939 2940
	    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]));
2941 2942
#endif

2943 2944 2945 2946
      //      }
      
    
      phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
2947
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2948
      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
2949
	    phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid);
2950
#endif
2951
      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0;
2952

2953
      if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) {
2954
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
2955
	//if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) 
2956
	print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0);
2957
#endif
2958 2959 2960 2961 2962 2963 2964 2965 2966 2967
	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
2968
	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
2969
	//	dump_ulsch(phy_vars_eNB, sched_subframe, i);
2970 2971 2972
	//	exit(-1);

	if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
Raymond Knopp's avatar
 
Raymond Knopp committed
2973
	  LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
2974
		phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2975
		frame,subframe, i,
2976 2977
		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
		phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1);
Raymond Knopp's avatar
 
Raymond Knopp committed
2978
	  
2979 2980 2981 2982 2983
	  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;
2984
#ifdef OPENAIR2
2985
	    mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
2986
				      phy_vars_eNB->CC_id,
2987 2988 2989 2990
				      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);
2991
	    phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
2992 2993 2994 2995 2996
	    //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)
2997
	    phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1;
2998 2999
	    
	    get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms,
Raymond Knopp's avatar
 
Raymond Knopp committed
3000
			       subframe,
3001 3002 3003
			       frame,
			       &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame,
			       &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
3004
	  }/*
Raymond Knopp's avatar
 
Raymond Knopp committed
3005
	  LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
3006 3007 3008 3009
		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
3010 3011
	   */
	  //	  dump_ulsch(phy_vars_eNB,sched_subframe,i);
Raymond Knopp's avatar
 
Raymond Knopp committed
3012
	  //#ifndef EXMIMO_IOT
Raymond Knopp's avatar
 
Raymond Knopp committed
3013
	  LOG_W(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error\n", frame,subframe);
Raymond Knopp's avatar
 
Raymond Knopp committed
3014
	  //#else 
Raymond Knopp's avatar
 
Raymond Knopp committed
3015
	  //mac_exit_wrapper("Msg3 error");
Raymond Knopp's avatar
 
Raymond Knopp committed
3016
	  //#endif 
3017 3018 3019 3020
	} // 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
3021
		frame,subframe, i,
3022 3023 3024 3025 3026
		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
3027
	  LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:\n",frame,subframe,
3028 3029 3030 3031 3032 3033 3034 3035
		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
3036
	  //	  dump_ulsch(phy_vars_eNB,sched_subframe,i);
Raymond Knopp's avatar
 
Raymond Knopp committed
3037
	  //mac_exit_wrapper("ULSCH error");
3038 3039 3040 3041
	  
	  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
3042
		  frame,subframe, i,
3043 3044 3045 3046 3047 3048
		  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
3049
	    //dump_ulsch(phy_vars_eNB, sched_subframe, i);
3050 3051 3052
	  }
	
	  // If we've dropped the UE, go back to PRACH mode for this UE
Raymond Knopp's avatar
 
Raymond Knopp committed
3053 3054
	  //#if !defined(EXMIMO_IOT)
	  if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] == ULSCH_max_consecutive_errors) {
3055
	    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
3056
		  phy_vars_eNB->Mod_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]);
3057
	    phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
3058
#ifdef OPENAIR2
Raymond Knopp's avatar
 
Raymond Knopp committed
3059
	    /*	    mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
3060
				      frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
3061
				      phy_vars_eNB->eNB_UE_stats[i].crnti);*/
3062
#endif
3063 3064 3065
	    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
3066
	  //#endif
3067 3068 3069 3070 3071
	}
      }  // 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
3072
	      frame,subframe);	    
3073 3074 3075 3076 3077 3078 3079

	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) {
3080 3081
#ifdef OPENAIR2
#ifdef DEBUG_PHY_PROC
3082 3083 3084
	  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);
3085
#endif
3086
	  mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3087
			    phy_vars_eNB->CC_id,
3088 3089 3090 3091 3092
			    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
3093 3094 3095 3096 3097
	    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);
3098
	  */
3099 3100
#endif

3101 3102
	  phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH;
	  phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0;
3103 3104

#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
3105
	  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);
3106 3107
#endif //DEBUG_PHY_PROC

3108 3109 3110 3111
	  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;
	  }
3112

3113 3114 3115 3116
	  //mac_xface->macphy_exit("Mode PUSCH. Exiting.\n");
	}
	else {
	  
3117 3118
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_ULSCH
Raymond Knopp's avatar
 
Raymond Knopp committed
3119
	  LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
3120 3121 3122 3123
		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");
3124 3125
#endif
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3126
	  //dump_ulsch(phy_vars_eNB,sched_subframe,i);
3127
 
3128 3129

#ifdef OPENAIR2
3130 3131
	  //	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) {
	  mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3132
			    phy_vars_eNB->CC_id,
3133 3134 3135 3136 3137 3138
			    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);
	  //}
	  /*
3139 3140
	    else {
	    // Retrieve calibration information and do whatever
Raymond Knopp's avatar
 
Raymond Knopp committed
3141
	    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);	    
3142
	    }
3143
	  */
3144
#endif
3145
	}
3146

3147 3148
	// estimate timing advance for MAC
	if (abstraction_flag == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3149
	  sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe);
3150 3151
	  phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8; //to check 
	}
3152

3153
#ifdef DEBUG_PHY_PROC	
Raymond Knopp's avatar
 
Raymond Knopp committed
3154
	LOG_I(PHY,"[eNB %d] frame %d, subframe %d: user %d in sector %d: timing advance = %d\n",
3155
	      phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3156
	      frame, subframe, 
3157 3158
	      i, sect_id,
	      phy_vars_eNB->eNB_UE_stats[i].timing_advance_update);
3159
#endif
3160
	
3161

3162 3163 3164
      }  // ulsch not in error
      
      // process HARQ feedback
3165
#ifdef DEBUG_PHY_PROC
3166 3167
      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
3168
	    frame,subframe,
3169 3170 3171
	    i);
#endif
      process_HARQ_feedback(i,
Raymond Knopp's avatar
 
Raymond Knopp committed
3172
			    sched_subframe,
3173 3174 3175 3176 3177 3178 3179 3180
			    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
3181
	    phy_vars_eNB->Mod_id,frame,subframe,
3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206
	    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];
3207 3208
      }

3209 3210
    }
  
3211 3212

#ifdef PUCCH
3213
    else if ((phy_vars_eNB->dlsch_eNB[i][0]) &&
Raymond Knopp's avatar
 
Raymond Knopp committed
3214
	     (phy_vars_eNB->dlsch_eNB[i][0]->rnti>0)) { // check for PUCCH
3215 3216

      // check SR availability
Raymond Knopp's avatar
 
Raymond Knopp committed
3217
      do_SR = is_SR_subframe(phy_vars_eNB,i,sched_subframe);
3218 3219 3220 3221 3222 3223
      //      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
3224
		       sched_subframe,
3225 3226 3227 3228 3229 3230 3231
		       &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
3232
	    frame,subframe,
3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250
	    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
3251
			       subframe,
3252
			       PUCCH1_THRES);
3253
#ifdef PHY_ABSTRACTION
3254 3255 3256 3257 3258 3259
	  else {
	    metric0 = rx_pucch_emul(phy_vars_eNB,
				    i,
				    pucch_format1,
				    0,
				    &SR_payload,
Raymond Knopp's avatar
 
Raymond Knopp committed
3260
				    sched_subframe);
3261
	    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
3262
		  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex);
3263 3264 3265 3266 3267
	  }
#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
3268
		  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe);
3269 3270 3271 3272 3273 3274 3275
	    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
3276
		    phy_vars_eNB->ulsch_eNB[i]->rnti,frame,subframe);
3277
	    }
3278
#ifdef OPENAIR2
3279
	    mac_xface->SR_indication(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3280
				     phy_vars_eNB->CC_id,
3281
				     frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
3282
				     phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
3283
#endif
3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294
	  } 
	}// 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,
3295
			       (uint16_t)n1_pucch0,
3296 3297 3298
			       0, //n2_pucch
			       1, // shortened format
			       pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3299
			       subframe,
3300 3301
			       PUCCH1a_THRES);
	  else {
3302
#ifdef PHY_ABSTRACTION
3303 3304 3305 3306
	    metric0 = rx_pucch_emul(phy_vars_eNB,i,
				    pucch_format1a,
				    0,
				    pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3307
				    subframe);
3308
#endif
3309
	  }	
3310
#ifdef DEBUG_PHY_PROC	  
3311 3312 3313
	  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
3314
		frame,subframe,
3315 3316 3317
		pucch_payload0[0],metric0);
#endif

Raymond Knopp's avatar
 
Raymond Knopp committed
3318
	  process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332
				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
3333
	      ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) {
3334 3335 3336 3337 3338 3339 3340 3341 3342 3343
	    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) {
3344
#ifdef DEBUG_PHY_PROC	  
3345 3346
	    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
3347
		  frame,subframe,
3348 3349 3350 3351 3352 3353 3354 3355 3356 3357
		  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
3358
				 subframe,
3359 3360
				 PUCCH1a_THRES);
	    else {
3361
#ifdef PHY_ABSTRACTION
3362 3363 3364 3365
	      metric0 = rx_pucch_emul(phy_vars_eNB,i,
				      format,
				      0,
				      pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3366
				      subframe);
3367 3368 3369 3370
#endif
	    } 
	  }
	  else {  //using n1_pucch0/n1_pucch1 resources
3371
#ifdef DEBUG_PHY_PROC	  
3372 3373
	    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
3374
		  frame,subframe,
3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385
		  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,
3386
				   (uint16_t)n1_pucch0,
3387 3388 3389
				   0, // n2_pucch
				   1, // shortened format
				   pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3390
				   subframe,
3391 3392
				   PUCCH1a_THRES);
	      else {
3393
#ifdef PHY_ABSTRACTION
3394 3395 3396 3397
		metric0 = rx_pucch_emul(phy_vars_eNB,i,
					format,
					0,
					pucch_payload0,
Raymond Knopp's avatar
 
Raymond Knopp committed
3398
					subframe);
3399
#endif
3400 3401
	      }
	    }
3402

3403 3404 3405 3406 3407 3408
	    // Check n1_pucch1 metric
	    if (n1_pucch1 != -1) {
	      if (abstraction_flag == 0)
		metric1 = rx_pucch(phy_vars_eNB,
				   format,
				   i,
3409
				   (uint16_t)n1_pucch1,
3410 3411 3412
				   0, //n2_pucch
				   1, // shortened format
				   pucch_payload1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3413
				   subframe,
3414 3415
				   PUCCH1a_THRES);
	      else {
3416
#ifdef PHY_ABSTRACTION
3417 3418 3419 3420
		metric1 = rx_pucch_emul(phy_vars_eNB,i,
					format,
					1,
					pucch_payload1,
Raymond Knopp's avatar
 
Raymond Knopp committed
3421
					subframe);
3422

3423
		
3424
#endif
3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444
	      }
	    }
	  }

	  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  
	  }
3445
#ifdef DEBUG_PHY_PROC	  
3446 3447
	  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
3448
		frame,subframe,
3449
		metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
3450
#endif	  
Raymond Knopp's avatar
 
Raymond Knopp committed
3451
	  process_HARQ_feedback(i,sched_subframe,phy_vars_eNB,
3452 3453 3454 3455 3456
				0,// pusch_flag
				pucch_payload,
				pucch_sel,
				SR_payload);
	}
Lionel Gauthier's avatar
Lionel Gauthier committed
3457
      }
3458 3459 3460 3461
    } // PUCCH processing
    
#endif //PUCCH
  
Raymond Knopp's avatar
 
Raymond Knopp committed
3462
    if ((frame % 10 == 0) && (subframe==4)) {
3463 3464 3465 3466 3467 3468 3469 3470
      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
3471 3472 3473
      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 );
3474 3475 3476 3477
    */ 
    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
3478
	(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) {
3479
      rnti=0;
3480 3481

#ifdef DEBUG_PHY_PROC
3482 3483
      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
3484
	    frame,subframe,
3485
	    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]);
3486 3487 3488
#endif
      if (abstraction_flag==0) {
	rx_ulsch(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
3489
		 sched_subframe,
3490 3491 3492 3493 3494
		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		 i,
		 phy_vars_eNB->ulsch_eNB,
		 0);
      }
3495
#ifdef PHY_ABSTRACTION
3496 3497
      else {
	rx_ulsch_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
3498
		      subframe,
3499 3500 3501
		      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
		      i);
      }
3502
#endif
3503 3504 3505 3506
      
      if (abstraction_flag == 0) {
	ret = ulsch_decoding(phy_vars_eNB,
			     i,
Raymond Knopp's avatar
 
Raymond Knopp committed
3507
			     sched_subframe,
3508 3509 3510 3511
			     0, // control_only_flag
			     0,  //Nbundled, to be updated!!!!
			     0);  
      }
3512
#ifdef PHY_ABSTRACTION
3513 3514
      else {
	ret = ulsch_decoding_emul(phy_vars_eNB,
Raymond Knopp's avatar
 
Raymond Knopp committed
3515
				  sched_subframe,
3516 3517 3518
				  i,
				  &rnti);
      }
3519
#endif
3520
      if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) {
3521
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
3522
	//if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50)) 
3523
	//	print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0);
3524
#endif
3525 3526 3527
	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
3528 3529 3530
      /*  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);
3531 3532 3533 3534 3535 3536 3537 3538 3539
      */
      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)) {
3540
#ifdef DEBUG_PHY_PROC
Raymond Knopp's avatar
 
Raymond Knopp committed
3541
	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
3542
	      phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid,
3543
	      i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups);
3544
#endif
3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558
	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
3559
	      frame,subframe);	    
3560 3561 3562 3563 3564
	
	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;
3565 3566
#ifdef DEBUG_PHY_PROC
#ifdef DEBUG_ULSCH
3567
	LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",
Raymond Knopp's avatar
 
Raymond Knopp committed
3568
	      frame,subframe,
3569 3570 3571 3572 3573 3574 3575 3576
	      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
3577
		phy_vars_eNB->Mod_id, frame,subframe,
3578 3579 3580 3581 3582
		i, phy_vars_eNB->ulsch_eNB[i]->rnti,
		i % phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]);
	  // detect if there is a CBA collision 
	  if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 0 ) {
	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3583
			      phy_vars_eNB->CC_id,
3584 3585 3586 3587
			      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
3588
	    phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]=1;//(subframe);
3589 3590
	  } 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
3591
		  phy_vars_eNB->Mod_id,frame,subframe,
3592 3593
		  i,i%num_active_cba_groups ); 
	    mac_xface->SR_indication(phy_vars_eNB->Mod_id,
Raymond Knopp's avatar
 
Raymond Knopp committed
3594
				     phy_vars_eNB->CC_id,
3595
				     frame,
Raymond Knopp's avatar
 
Raymond Knopp committed
3596
				     phy_vars_eNB->dlsch_eNB[i][0]->rnti,subframe);
3597 3598 3599 3600 3601 3602
	  }
	  
	}
      } // ULSCH CBA not in error 
    }
       
3603 3604
  } // loop i=0 ... NUMBER_OF_UE_MAX-1

Raymond Knopp's avatar
 
Raymond Knopp committed
3605
  if (pusch_active == 0){
3606 3607
    if (abstraction_flag == 0) {
      //      LOG_D(PHY,"[eNB] Frame %d, subframe %d Doing I0_measurements\n",
Raymond Knopp's avatar
 
Raymond Knopp committed
3608
      //	  (((subframe)==9)?-1:0) + phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
3609 3610 3611 3612
      lte_eNB_I0_measurements(phy_vars_eNB,
			      0,
			      phy_vars_eNB->first_run_I0_measurements);
    }
3613
#ifdef PHY_ABSTRACTION
3614 3615 3616 3617
    else {
      lte_eNB_I0_measurements_emul(phy_vars_eNB,
				   sect_id);
    }
3618
#endif
3619 3620 3621 3622
  
    
    if (I0_clear == 1)
      I0_clear = 0;
3623 3624 3625
  }

#ifdef EMOS
Raymond Knopp's avatar
 
Raymond Knopp committed
3626
  phy_procedures_emos_eNB_RX(subframe,phy_vars_eNB);
3627 3628 3629
#endif

  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,0);
3630 3631
  stop_meas(&phy_vars_eNB->phy_proc_rx);
   
3632 3633 3634 3635
}

#undef DEBUG_PHY_PROC

3636 3637
#ifdef Rel10  
int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type){
3638
  
3639 3640 3641 3642 3643 3644
  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:
3645
    if (((next_slot >>1) < 6) || ((next_slot >>1) > 8))
3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657
      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
3658
void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t abstraction_flag, 
3659
			    relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) {
3660
#if defined(ENABLE_ITTI)
3661 3662 3663 3664 3665
  MessageDef   *msg_p;
  const char   *msg_name;
  instance_t    instance;
  unsigned int  Mod_id;
  int           result;
3666
#endif
Raymond Knopp's avatar
 
Raymond Knopp committed
3667

Raymond Knopp's avatar
 
Raymond Knopp committed
3668 3669 3670

  int CC_id=0;

3671
  /*
Raymond Knopp's avatar
 
Raymond Knopp committed
3672
    if (phy_vars_eNB->proc[sched_subframe].frame_tx >= 1000)
3673
    mac_xface->macphy_exit("Exiting after 1000 Frames\n");
3674
  */
Raymond Knopp's avatar
 
Raymond Knopp committed
3675
  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_ENB, subframe*2);
Raymond Knopp's avatar
 
Raymond Knopp committed
3676
  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_ENB, phy_vars_eNB[0]->proc[subframe].frame_tx);
3677
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1);
Raymond Knopp's avatar
 
Raymond Knopp committed
3678
  start_meas(&phy_vars_eNB[0]->phy_proc);
Lionel Gauthier's avatar
Lionel Gauthier committed
3679

3680 3681
#if defined(ENABLE_ITTI)
  do {
3682 3683
    // Checks if a message has been sent to PHY sub-task
    itti_poll_msg (TASK_PHY_ENB, &msg_p);
3684

3685 3686 3687 3688
    if (msg_p != NULL) {
      msg_name = ITTI_MSG_NAME (msg_p);
      instance = ITTI_MSG_INSTANCE (msg_p);
      Mod_id = instance;
3689

3690
      switch (ITTI_MSG_ID(msg_p)) {
Lionel Gauthier's avatar
Lionel Gauthier committed
3691
#   if defined(ENABLE_RAL)
Raymond Knopp's avatar
 
Raymond Knopp committed
3692 3693 3694 3695 3696
      case TIMER_HAS_EXPIRED:
	// check if it is a measurement timer
	{
	  hashtable_rc_t       hashtable_rc;

Raymond Knopp's avatar
 
Raymond Knopp committed
3697
	  hashtable_rc = hashtable_is_key_exists(PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id));
Raymond Knopp's avatar
 
Raymond Knopp committed
3698 3699 3700 3701 3702
	  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
3703 3704


Raymond Knopp's avatar
 
Raymond Knopp committed
3705
      case PHY_MEAS_THRESHOLD_REQ:
Lionel Gauthier's avatar
Lionel Gauthier committed
3706
#warning "TO DO LIST OF THRESHOLDS"
Raymond Knopp's avatar
 
Raymond Knopp committed
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
	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(
Raymond Knopp's avatar
 
Raymond Knopp committed
3738
				    &PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen],
Raymond Knopp's avatar
 
Raymond Knopp committed
3739 3740 3741 3742 3743 3744
				    threshold_phy_p,
				    ral_thresholds);
		  break;

		case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
		  SLIST_INSERT_HEAD(
Raymond Knopp's avatar
 
Raymond Knopp committed
3745
				    &PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte],
Raymond Knopp's avatar
 
Raymond Knopp committed
3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766
				    threshold_phy_p,
				    ral_thresholds);
		  break;

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

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

		if (res == 0) {
Raymond Knopp's avatar
 
Raymond Knopp committed
3767
		  hashtable_rc = hashtable_insert(PHY_vars_eNB_g[Mod_id][0]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p);
Raymond Knopp's avatar
 
Raymond Knopp committed
3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794
		  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
3795
#   endif
3796

Raymond Knopp's avatar
 
Raymond Knopp committed
3797 3798 3799 3800
	/* Messages from eNB app */
      case PHY_CONFIGURATION_REQ:
	LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name);
	/* TODO */
3801

Raymond Knopp's avatar
 
Raymond Knopp committed
3802
	break;
3803

Raymond Knopp's avatar
 
Raymond Knopp committed
3804 3805 3806
      default:
	LOG_E(PHY, "[ENB %d] Received unexpected message %s\n", Mod_id, msg_name);
	break;
Lionel Gauthier's avatar
Lionel Gauthier committed
3807
      }
3808 3809 3810 3811

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

Raymond Knopp's avatar
 
Raymond Knopp committed
3815 3816 3817 3818 3819

  for (CC_id=0;CC_id<MAX_NUM_CCs; CC_id++) {
    if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD)&&
	  (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))||
	 (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) {
3820
#ifdef Rel10 
Raymond Knopp's avatar
 
Raymond Knopp committed
3821
      if (phy_procedures_RN_eNB_TX(phy_vars_eNB[CC_id]->proc[subframe].subframe_rx, phy_vars_eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 ) 
3822
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
3823 3824 3825 3826 3827 3828 3829 3830
	phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn);
    }
    if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD )&&
	  (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) ||
	 (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))){
      phy_procedures_eNB_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type);
    }
    if (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) {
3831
#ifdef Rel10 
Raymond Knopp's avatar
 
Raymond Knopp committed
3832
      if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 )
3833
#endif 
Raymond Knopp's avatar
 
Raymond Knopp committed
3834 3835 3836 3837 3838
	phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn);
    }
    if ((subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)){
      phy_procedures_eNB_S_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type);
    }
Raymond Knopp's avatar
 
Raymond Knopp committed
3839

Raymond Knopp's avatar
 
Raymond Knopp committed
3840 3841 3842 3843 3844 3845 3846
    phy_vars_eNB[CC_id]->proc[subframe].frame_tx++;
    phy_vars_eNB[CC_id]->proc[subframe].frame_rx++;
    if (phy_vars_eNB[CC_id]->proc[subframe].frame_tx==1024)
      phy_vars_eNB[CC_id]->proc[subframe].frame_tx=0;
    if (phy_vars_eNB[CC_id]->proc[subframe].frame_rx==1024)
      phy_vars_eNB[CC_id]->proc[subframe].frame_rx=0;
  }
Raymond Knopp's avatar
 
Raymond Knopp committed
3847
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0);
Raymond Knopp's avatar
 
Raymond Knopp committed
3848
  stop_meas(&phy_vars_eNB[0]->phy_proc);
3849 3850
}