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

  Eurecom OpenAirInterface
  Copyright(c) 1999 - 2010 Eurecom

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

  This program is distributed in the hope it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  more details.

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

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

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

gauthier's avatar
gauthier committed
28
 *******************************************************************************/
29
/*! \file rar_tools.c
gauthier's avatar
gauthier committed
30 31 32 33 34
 * \brief random access tools
 * \author Raymond Knopp
 * \date 2011
 * \version 0.5
 * @ingroup _mac
35

gauthier's avatar
gauthier committed
36
 */
37 38 39 40 41 42 43 44 45

#include "defs.h"
#include "extern.h"
#include "MAC_INTERFACE/defs.h"
#include "MAC_INTERFACE/extern.h"
#include "SIMULATION/TOOLS/defs.h"
#include "UTIL/LOG/log.h"
#include "OCG.h"
#include "OCG_extern.h"
46
#include "UTIL/OPT/opt.h"
47 48 49 50 51 52 53 54 55 56

#define DEBUG_RAR

extern unsigned int  localRIV2alloc_LUT25[512];
extern unsigned int  distRIV2alloc_LUT25[512];
extern unsigned short RIV2nb_rb_LUT25[512];
extern unsigned short RIV2first_rb_LUT25[512];

extern inline unsigned int taus(void);

gauthier's avatar
gauthier committed
57 58 59 60 61
unsigned short fill_rar(module_id_t module_idP,
                        frame_t frameP,
                        u8 *dlsch_buffer,
                        u16 N_RB_UL,
                        u8 input_buffer_length) {
62 63 64 65

  RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)dlsch_buffer;
  //  RAR_PDU *rar = (RAR_PDU *)(dlsch_buffer+1);
  uint8_t *rar = (uint8_t *)(dlsch_buffer+1);
66
  int i,ra_idx = -1;
67
  uint16_t rballoc;
68
  uint8_t mcs,TPC,ULdelay,cqireq;
69 70

  for (i=0;i<NB_RA_PROC_MAX;i++) {
gauthier's avatar
gauthier committed
71 72 73 74 75
      if (eNB_mac_inst[module_idP].RA_template[i].generate_rar == 1) {
          ra_idx=i;
          eNB_mac_inst[module_idP].RA_template[i].generate_rar = 0;
          break;
      }
76 77 78 79 80
  }

  // subheader fixed 
  rarh->E                     = 0; // First and last RAR
  rarh->T                     = 1; // 0 for E/T/R/R/BI subheader, 1 for E/T/RAPID subheader
gauthier's avatar
gauthier committed
81
  rarh->RAPID                 = eNB_mac_inst[module_idP].RA_template[ra_idx].preamble_index; // Respond to Preamble 0 only for the moment
82 83
  /*
  rar->R                      = 0;
gauthier's avatar
gauthier committed
84
  rar->Timing_Advance_Command = eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset/4;
85 86 87 88 89 90
  rar->hopping_flag           = 0;
  rar->rb_alloc               = mac_xface->computeRIV(N_RB_UL,12,2);  // 2 RB
  rar->mcs                    = 2;                                   // mcs 2
  rar->TPC                    = 4;   // 2 dB power adjustment
  rar->UL_delay               = 0;
  rar->cqi_req                = 1;
gauthier's avatar
gauthier committed
91 92 93 94 95 96 97 98
  rar->t_crnti                = eNB_mac_inst[module_idP].RA_template[ra_idx].rnti;
   */
  rar[4] = (uint8_t)(eNB_mac_inst[module_idP].RA_template[ra_idx].rnti>>8);
  rar[5] = (uint8_t)(eNB_mac_inst[module_idP].RA_template[ra_idx].rnti&0xff);
  eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset = 0;
  //eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset /= 16;
  rar[0] = (uint8_t)(eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset>>(2+4)); // 7 MSBs of timing advance + divide by 4
  rar[1] = (uint8_t)(eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset<<(4-2))&0xf0; // 4 LSBs of timing advance + divide by 4
99 100 101
  rballoc = mac_xface->computeRIV(N_RB_UL,1,1); // first PRB only for UL Grant
  rar[1] |= (rballoc>>7)&7; // Hopping = 0 (bit 3), 3 MSBs of rballoc
  rar[2] = ((uint8_t)(rballoc&0xff))<<1; // 7 LSBs of rballoc
knopp's avatar
knopp committed
102 103
  mcs = 10;
  TPC = 3;
104 105
  ULdelay = 0;
  cqireq = 0;
knopp's avatar
knopp committed
106 107
  rar[2] |= ((mcs&0x8)>>3);  // mcs 10
  rar[3] = (((mcs&0x7)<<5)) | ((TPC&7)<<2) | ((ULdelay&1)<<1) | (cqireq&1); 
108

gauthier's avatar
gauthier committed
109 110 111 112 113 114
  LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",module_idP,frame,
      *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5],
      ra_idx,
      eNB_mac_inst[module_idP].RA_template[ra_idx].rnti,
      rarh->RAPID,eNB_mac_inst[module_idP].RA_template[0].preamble_index,
      eNB_mac_inst[module_idP].RA_template[ra_idx].timing_offset);
115 116 117

#if defined(USER_MODE) && defined(OAI_EMU)
  if (oai_emulation.info.opt_enabled){
gauthier's avatar
gauthier committed
118 119 120 121
      trace_pdu(1, dlsch_buffer, input_buffer_length, module_idP, 2, 1,
          eNB_mac_inst[module_idP].subframe, 0, 0);
      LOG_I(OPT,"[eNB %d][RAPROC] RAR Frame %d trace pdu for rnti %x and  rapid %d size %d\n",
          module_idP, frame, eNB_mac_inst[module_idP].RA_template[ra_idx].rnti,
122 123 124
          rarh->RAPID, input_buffer_length);
  } 
#endif 
gauthier's avatar
gauthier committed
125
  return(eNB_mac_inst[module_idP].RA_template[ra_idx].rnti);
126 127
}

gauthier's avatar
gauthier committed
128
uint16_t ue_process_rar(module_id_t module_idP, frame_t frameP, u8 *dlsch_buffer,rnti_t *t_crnti,u8 preamble_index) {
129 130 131 132

  RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)dlsch_buffer;
  //  RAR_PDU *rar = (RAR_PDU *)(dlsch_buffer+1);
  uint8_t *rar = (uint8_t *)(dlsch_buffer+1);
gauthier's avatar
gauthier committed
133 134 135 136

  LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n",module_idP,frame,
      *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5],
      rarh->RAPID,preamble_index);
137
#ifdef DEBUG_RAR
gauthier's avatar
gauthier committed
138 139 140 141 142 143 144 145 146 147 148 149 150
  LOG_D(MAC,"[UE %d][RAPROC] rarh->E %d\n",module_idP,rarh->E);
  LOG_D(MAC,"[UE %d][RAPROC] rarh->T %d\n",module_idP,rarh->T);
  LOG_D(MAC,"[UE %d][RAPROC] rarh->RAPID %d\n",module_idP,rarh->RAPID);

  //  LOG_I(MAC,"[UE %d][RAPROC] rar->R %d\n",module_idP,rar->R);
  LOG_I(MAC,"[UE %d][RAPROC] rar->Timing_Advance_Command %d\n",module_idP,(((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
  //  LOG_I(MAC,"[UE %d][RAPROC] rar->hopping_flag %d\n",module_idP,rar->hopping_flag);
  //  LOG_I(MAC,"[UE %d][RAPROC] rar->rb_alloc %d\n",module_idP,rar->rb_alloc);
  //  LOG_I(MAC,"[UE %d][RAPROC] rar->mcs %d\n",module_idP,rar->mcs);
  //  LOG_I(MAC,"[UE %d][RAPROC] rar->TPC %d\n",module_idP,rar->TPC);
  //  LOG_I(MAC,"[UE %d][RAPROC] rar->UL_delay %d\n",module_idP,rar->UL_delay);
  //  LOG_I(MAC,"[UE %d][RAPROC] rar->cqi_req %d\n",module_idP,rar->cqi_req);
  LOG_I(MAC,"[UE %d][RAPROC] rar->t_crnti %x\n",module_idP,(uint16_t)rar[5]+(rar[4]<<8));
151 152
#endif

gauthier's avatar
gauthier committed
153

154
  if (preamble_index == rarh->RAPID) {
gauthier's avatar
gauthier committed
155 156 157 158
      *t_crnti = (uint16_t)rar[5]+(rar[4]<<8);//rar->t_crnti;
      UE_mac_inst[module_idP].crnti = *t_crnti;//rar->t_crnti;
      //return(rar->Timing_Advance_Command);
      return((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
159 160
  }
  else {
gauthier's avatar
gauthier committed
161 162
      UE_mac_inst[module_idP].crnti=0;
      return(0xffff);
163 164
  }
}