rar_tools.c 13 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
 * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The OpenAirInterface Software Alliance licenses this file to You under
 * the OAI Public License, Version 1.0  (the "License"); you may not use this file
 * except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.openairinterface.org/?page_id=698
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *-------------------------------------------------------------------------------
 * For more information about the OpenAirInterface (OAI) Software Alliance:
 *      contact@openairinterface.org
 */

22
23
24
25
26
27
28
29
30
31
32
33
/*! \file PHY/LTE_TRANSPORT/rar_tools.c
* \brief Routine for filling the PUSCH/ULSCH data structures based on a random-access response (RAR) SDU from MAC.  Note this is both for UE and eNB. V8.6 2009-03
* \author R. Knopp
* \date 2011
* \version 0.1
* \company Eurecom
* \email: knopp@eurecom.fr
* \note
* \warning
*/
#include "PHY/defs.h"
#include "PHY/extern.h"
34
#include "SCHED/defs.h"
35
36
37
#include "SCHED/extern.h"
#include "LAYER2/MAC/defs.h"
#include "SCHED/defs.h"
38
#include "UTIL/LOG/vcd_signal_dumper.h"
39

40
41
#include "assertions.h"

42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
extern uint16_t RIV2nb_rb_LUT6[32];
extern uint16_t RIV2first_rb_LUT6[32];
extern uint16_t RIV2nb_rb_LUT25[512];
extern uint16_t RIV2first_rb_LUT25[512];
extern uint16_t RIV2nb_rb_LUT50[1600];
extern uint16_t RIV2first_rb_LUT50[1600];
extern uint16_t RIV2nb_rb_LUT100[6000];
extern uint16_t RIV2first_rb_LUT100[600];

extern uint16_t RIV_max6,RIV_max25,RIV_max50,RIV_max100;

//#define DEBUG_RAR

#ifdef OPENAIR2
int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu,
57
58
59
60
61
62
                                       uint32_t frame,
                                       unsigned char subframe,
                                       LTE_eNB_ULSCH_t *ulsch,
                                       LTE_DL_FRAME_PARMS *frame_parms)
{

63
64
65
66
67
68
69
70
71
72


  //  RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)rar_pdu;
  //  RAR_PDU *rar = (RAR_PDU *)(rar_pdu+1);
  uint8_t *rar = (uint8_t *)(rar_pdu+1);
  uint8_t harq_pid = get_Msg3_harq_pid(frame_parms,frame,subframe);
  uint16_t rballoc;
  uint8_t cqireq;
  uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT;
  uint16_t RIV_max;
73
  uint16_t use_srs=0;
74

75
  LOG_D(PHY,"[eNB][RAPROC] generate_eNB_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",subframe,harq_pid);
76

77
  switch (frame_parms->N_RB_DL) {
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
  case 6:
    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT6[0];
    RIV2first_rb_LUT  = &RIV2first_rb_LUT6[0];
    RIV_max           = RIV_max6;
    break;

  case 25:
    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT25[0];
    RIV2first_rb_LUT  = &RIV2first_rb_LUT25[0];
    RIV_max           = RIV_max25;
    break;

  case 50:
    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT50[0];
    RIV2first_rb_LUT  = &RIV2first_rb_LUT50[0];
    RIV_max           = RIV_max50;
    break;

  case 100:
    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT100[0];
    RIV2first_rb_LUT  = &RIV2first_rb_LUT100[0];
    RIV_max           = RIV_max100;
    break;

  default:
    DevParam(frame_parms->N_RB_DL, harq_pid, 0);
    break;
105
106
107
108
  }

  ulsch->harq_processes[harq_pid]->TPC                = (rar[3]>>2)&7;//rar->TPC;
  rballoc = (((uint16_t)(rar[1]&7))<<7)|(rar[2]>>1);
109

110
111
112
113
  if (rballoc>RIV_max) {
    LOG_E(PHY,"[eNB]dci_tools.c: ERROR: rb_alloc (%x)> RIV_max\n",rballoc);
    return(-1);
  }
114

115
116
117
  ulsch->harq_processes[harq_pid]->rar_alloc          = 1;
  ulsch->harq_processes[harq_pid]->first_rb           = RIV2first_rb_LUT[rballoc];
  ulsch->harq_processes[harq_pid]->nb_rb              = RIV2nb_rb_LUT[rballoc];
118
  //  ulsch->harq_processes[harq_pid]->Ndi                = 1;
119
120

  cqireq = rar[3]&1;
121
122

  if (cqireq==1) {
knopp's avatar
   
knopp committed
123
124
125
    ulsch->harq_processes[harq_pid]->Or2                                   = sizeof_wideband_cqi_rank2_2A_5MHz;
    ulsch->harq_processes[harq_pid]->Or1                                   = sizeof_wideband_cqi_rank1_2A_5MHz;
    ulsch->harq_processes[harq_pid]->O_RI                                  = 1;
126
  } else {
knopp's avatar
   
knopp committed
127
128
129
    ulsch->harq_processes[harq_pid]->O_RI                                  = 0;//1;
    ulsch->harq_processes[harq_pid]->Or2                                   = 0;
    ulsch->harq_processes[harq_pid]->Or1                                   = 0;
130

131
  }
132

133
134
135
136
137
  ulsch->harq_processes[harq_pid]->O_ACK                                 = 0;//2;
  ulsch->beta_offset_cqi_times8                = 18;
  ulsch->beta_offset_ri_times8                 = 10;
  ulsch->beta_offset_harqack_times8            = 16;

138
139
  ulsch->rnti = (((uint16_t)rar[4])<<8)+rar[5];

140
  if (ulsch->harq_processes[harq_pid]->round == 0) {
141
142
143
144
    ulsch->harq_processes[harq_pid]->status = ACTIVE;
    ulsch->harq_processes[harq_pid]->rvidx = 0;
    ulsch->harq_processes[harq_pid]->mcs         = ((rar[2]&1)<<3)|(rar[3]>>5);
    //ulsch->harq_processes[harq_pid]->TBS         = dlsch_tbs25[ulsch->harq_processes[harq_pid]->mcs][ulsch->harq_processes[harq_pid]->nb_rb-1];
xuhl's avatar
xuhl committed
145
    ulsch->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1];
146
147
148
    ulsch->harq_processes[harq_pid]->Msc_initial   = 12*ulsch->harq_processes[harq_pid]->nb_rb;
    ulsch->harq_processes[harq_pid]->Nsymb_initial = 9;
    ulsch->harq_processes[harq_pid]->round = 0;
149
  } else {
150
151
152
    ulsch->harq_processes[harq_pid]->rvidx = 0;
    ulsch->harq_processes[harq_pid]->round++;
  }
153

154
155
156
157
158
159
160
161
162
163
164
165
166

  ulsch->Msg3_active = 1;
	      
  get_Msg3_alloc(frame_parms,
		 subframe,
		 frame,
		 &ulsch->Msg3_frame,
		 &ulsch->Msg3_subframe);

  use_srs = is_srs_occasion_common(frame_parms,ulsch->Msg3_frame,ulsch->Msg3_subframe);
  ulsch->harq_processes[harq_pid]->Nsymb_pusch = 12-(frame_parms->Ncp<<1)-(use_srs==0?0:1);
  ulsch->harq_processes[harq_pid]->srs_active                            = use_srs;

167
#ifdef DEBUG_RAR
168
169
170
171
  msg("ulsch ra (eNB): harq_pid %d\n",harq_pid);
  msg("ulsch ra (eNB): NBRB     %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
  msg("ulsch ra (eNB): rballoc  %x\n",ulsch->harq_processes[harq_pid]->first_rb);
  msg("ulsch ra (eNB): harq_pid %d\n",harq_pid);
172
  msg("ulsch ra (eNB): round    %d\n",ulsch->harq_processes[harq_pid]->round);
173
174
  msg("ulsch ra (eNB): TBS      %d\n",ulsch->harq_processes[harq_pid]->TBS);
  msg("ulsch ra (eNB): mcs      %d\n",ulsch->harq_processes[harq_pid]->mcs);
knopp's avatar
   
knopp committed
175
176
  msg("ulsch ra (eNB): Or1      %d\n",ulsch->harq_processes[harq_pid]->Or1);
  msg("ulsch ra (eNB): ORI      %d\n",ulsch->harq_processes[harq_pid]->O_RI);
177
#endif
178
179
180
  return(0);
}

gauthier's avatar
gauthier committed
181
int8_t delta_PUSCH_msg2[8] = {-6,-4,-2,0,2,4,6,8};
182

183
int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
184
				      UE_rxtx_proc_t *proc,
185
186
187
                                      unsigned char eNB_id )
{

188
189
  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_IN);

190
  //  RA_HEADER_RAPID *rarh = (RA_HEADER_RAPID *)rar_pdu;
191
192
193
194
195
196
197
198
  uint8_t transmission_mode = ue->transmission_mode[eNB_id];
  unsigned char *rar_pdu = ue->dlsch_ra[eNB_id]->harq_processes[0]->b;
  unsigned char subframe = ue->ulsch_Msg3_subframe[eNB_id];
  LTE_UE_ULSCH_t *ulsch  = ue->ulsch[eNB_id];
  PHY_MEASUREMENTS *meas = &ue->measurements;

  LTE_DL_FRAME_PARMS *frame_parms =  &ue->frame_parms;
  //  int current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
199
200

  uint8_t *rar = (uint8_t *)(rar_pdu+1);
201
  uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe);
202
203
204
  uint16_t rballoc;
  uint8_t cqireq;
  uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT;
205
  uint16_t RIV_max = 0;
206

207
  LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",proc->frame_tx,subframe,harq_pid);
208
209

  switch (frame_parms->N_RB_DL) {
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
  case 6:
    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT6[0];
    RIV2first_rb_LUT  = &RIV2first_rb_LUT6[0];
    RIV_max           = RIV_max6;
    break;

  case 25:
    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT25[0];
    RIV2first_rb_LUT  = &RIV2first_rb_LUT25[0];
    RIV_max           = RIV_max25;
    break;

  case 50:
    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT50[0];
    RIV2first_rb_LUT  = &RIV2first_rb_LUT50[0];
    RIV_max           = RIV_max50;
    break;

  case 100:
    RIV2nb_rb_LUT     = &RIV2nb_rb_LUT100[0];
    RIV2first_rb_LUT  = &RIV2first_rb_LUT100[0];
    RIV_max           = RIV_max100;
    break;

  default:
    DevParam(frame_parms->N_RB_DL, eNB_id, harq_pid);
    break;
237
238
239
  }


240

Gabriel's avatar
Gabriel committed
241
  ulsch->harq_processes[harq_pid]->TPC                                   = (rar[3]>>2)&7;//rar->TPC;
242

243
244
245
246
247
248
249
250
251
252
  rballoc = (((uint16_t)(rar[1]&7))<<7)|(rar[2]>>1);
  cqireq=rar[3]&1;

  if (rballoc>RIV_max) {
    msg("rar_tools.c: ERROR: rb_alloc (%x) > RIV_max\n",rballoc);
    return(-1);
  }

  ulsch->harq_processes[harq_pid]->first_rb                              = RIV2first_rb_LUT[rballoc];
  ulsch->harq_processes[harq_pid]->nb_rb                                 = RIV2nb_rb_LUT[rballoc];
253

254
255
256
257
258
259
260
  if (ulsch->harq_processes[harq_pid]->nb_rb ==0)
    return(-1);

  ulsch->power_offset = ue_power_offsets[ulsch->harq_processes[harq_pid]->nb_rb];

  if (ulsch->harq_processes[harq_pid]->nb_rb > 4) {
    msg("rar_tools.c: unlikely rb count for RAR grant : nb_rb > 3\n");
261
	// return(-1);
262
263
  }

264
265
  //  ulsch->harq_processes[harq_pid]->Ndi                                   = 1;
  if (ulsch->harq_processes[harq_pid]->round == 0)
266
267
268
269
    ulsch->harq_processes[harq_pid]->status = ACTIVE;

  if (cqireq==1) {
    ulsch->O_RI                                  = 1;
270

271
272
273
274
    if (meas->rank[eNB_id] == 1) {
      ulsch->uci_format                          = wideband_cqi_rank2_2A;
      ulsch->O                                   = sizeof_wideband_cqi_rank2_2A_5MHz;
      ulsch->o_RI[0]                             = 1;
275
    } else {
276
277
278
279
      ulsch->uci_format                          = wideband_cqi_rank1_2A;
      ulsch->O                                   = sizeof_wideband_cqi_rank1_2A_5MHz;
      ulsch->o_RI[0]                             = 0;
    }
280

281
    ulsch->uci_format = HLC_subband_cqi_nopmi;
282
    fill_CQI(ulsch,meas,eNB_id,0,ue->frame_parms.N_RB_DL,0, transmission_mode,ue->sinr_eff);
283

284
    if (((proc->frame_tx % 100) == 0) || (proc->frame_tx < 10))
285
      print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL);
286
  } else {
287
288
289
    ulsch->O_RI                                = 0;
    ulsch->O                                   = 0;
  }
290

291
  ulsch->harq_processes[harq_pid]->O_ACK                                  = 0;//2;
292

293
294
295
  ulsch->beta_offset_cqi_times8                  = 18;
  ulsch->beta_offset_ri_times8                   = 10;
  ulsch->beta_offset_harqack_times8              = 16;
296

297
298
  ulsch->Nsymb_pusch                             = 12-(frame_parms->Ncp<<1);
  ulsch->rnti = (((uint16_t)rar[4])<<8)+rar[5];  //rar->t_crnti;
299

300
  if (ulsch->harq_processes[harq_pid]->round == 0) {
301
302
303
304
305
    ulsch->harq_processes[harq_pid]->status = ACTIVE;
    ulsch->harq_processes[harq_pid]->rvidx = 0;
    ulsch->harq_processes[harq_pid]->mcs         = ((rar[2]&1)<<3)|(rar[3]>>5);
    ulsch->harq_processes[harq_pid]->TPC         = (rar[3]>>2)&7;
    //ulsch->harq_processes[harq_pid]->TBS         = dlsch_tbs25[ulsch->harq_processes[harq_pid]->mcs][ulsch->harq_processes[harq_pid]->nb_rb-1];
xuhl's avatar
xuhl committed
306
    ulsch->harq_processes[harq_pid]->TBS         = TBStable[get_I_TBS_UL(ulsch->harq_processes[harq_pid]->mcs)][ulsch->harq_processes[harq_pid]->nb_rb-1];
307
308
309
    ulsch->harq_processes[harq_pid]->Msc_initial   = 12*ulsch->harq_processes[harq_pid]->nb_rb;
    ulsch->harq_processes[harq_pid]->Nsymb_initial = 9;
    ulsch->harq_processes[harq_pid]->round = 0;
310
311
312
313
  } else {
    ulsch->harq_processes[harq_pid]->rvidx = 0;
    ulsch->harq_processes[harq_pid]->round++;
  }
314

315
  // initialize power control based on PRACH power
knopp's avatar
   
knopp committed
316
  ulsch->f_pusch = delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC] +
317
                   mac_xface->get_deltaP_rampup(ue->Mod_id,ue->CC_id);
knopp's avatar
   
knopp committed
318
  LOG_D(PHY,"[UE %d][PUSCH PC] Initializing f_pusch to %d dB, TPC %d (delta_PUSCH_msg2 %d dB), deltaP_rampup %d dB\n",
319
320
        ue->Mod_id,ulsch->f_pusch,ulsch->harq_processes[harq_pid]->TPC,delta_PUSCH_msg2[ulsch->harq_processes[harq_pid]->TPC],
        mac_xface->get_deltaP_rampup(ue->Mod_id,ue->CC_id));
321
322
323
324
325
326
327
328
329
330
331
332
333


  //#ifdef DEBUG_RAR
  msg("ulsch ra (UE): harq_pid %d\n",harq_pid);
  msg("ulsch ra (UE): NBRB     %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
  msg("ulsch ra (UE): first_rb %x\n",ulsch->harq_processes[harq_pid]->first_rb);
  msg("ulsch ra (UE): nb_rb    %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
  msg("ulsch ra (UE): round    %d\n",ulsch->harq_processes[harq_pid]->round);
  msg("ulsch ra (UE): TBS      %d\n",ulsch->harq_processes[harq_pid]->TBS);
  msg("ulsch ra (UE): mcs      %d\n",ulsch->harq_processes[harq_pid]->mcs);
  msg("ulsch ra (UE): TPC      %d\n",ulsch->harq_processes[harq_pid]->TPC);
  msg("ulsch ra (UE): O        %d\n",ulsch->O);
  msg("ulsch ra (UE): ORI      %d\n",ulsch->O_RI);
334
335
336

  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_RAR,VCD_FUNCTION_OUT);

337
338
  //#endif
  return(0);
339
340
}
#endif