init_lte.c 10.5 KB
Newer Older
1 2 3 4 5
/*
 * 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
6
 * the OAI Public License, Version 1.1  (the "License"); you may not use this file
7 8 9 10 11 12 13 14 15 16 17 18 19 20
 * 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
 */
21

22 23 24 25 26 27
#include <string.h>
#include <math.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#include <time.h>
28
#include <sys/time.h>
29 30 31

#include "init_lte.h"

32
#include "PHY/phy_extern.h"
33

34 35
#include "LAYER2/MAC/mac.h"
#include "LAYER2/MAC/mac_extern.h"
36
#include "UTIL/LOG/log_if.h"
37
#include "PHY_INTERFACE/phy_interface.h"
38 39


40
/*
41 42 43
PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms,
                           uint8_t eNB_id,
                           uint8_t Nid_cell,
44
			   node_function_t node_function,
45 46
                           uint8_t abstraction_flag)
{
47

48
  int i,j;
49 50 51
  PHY_VARS_eNB* PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
  memset(PHY_vars_eNB,0,sizeof(PHY_VARS_eNB));
  PHY_vars_eNB->Mod_id=eNB_id;
52 53 54
  memcpy(&(PHY_vars_eNB->frame_parms), frame_parms, sizeof(LTE_DL_FRAME_PARMS));
  PHY_vars_eNB->frame_parms.Nid_cell = ((Nid_cell/3)*3)+((eNB_id+Nid_cell)%3);
  PHY_vars_eNB->frame_parms.nushift = PHY_vars_eNB->frame_parms.Nid_cell%6;
55
  phy_init_lte_eNB(PHY_vars_eNB,0,abstraction_flag);
56

57
  LOG_I(PHY,"init eNB: Node Function %d\n",node_function);
58 59
  LOG_I(PHY,"init eNB: Nid_cell %d\n", frame_parms->Nid_cell);
  LOG_I(PHY,"init eNB: frame_type %d,tdd_config %d\n", frame_parms->frame_type,frame_parms->tdd_config);
60 61
  LOG_I(PHY,"init eNB: number of ue max %d number of enb max %d number of harq pid max %d\n",
        NUMBER_OF_UE_MAX, NUMBER_OF_eNB_MAX, NUMBER_OF_HARQ_PID_MAX);
Raymond Knopp's avatar
 
Raymond Knopp committed
62
  LOG_I(PHY,"init eNB: N_RB_DL %d\n", frame_parms->N_RB_DL);
Raymond Knopp's avatar
Raymond Knopp committed
63
  LOG_I(PHY,"init eNB: prach_config_index %d\n", frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex);
64

65 66 67 68
  if (node_function >= NGFI_RRU_IF5)
    // For RRU, don't allocate DLSCH/ULSCH Transport channel buffers
    return (PHY_vars_eNB);

69

70
  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
71
    LOG_I(PHY,"Allocating Transport Channel Buffers for DLSCH, UE %d\n",i);
72
    for (j=0; j<2; j++) {
73
      PHY_vars_eNB->dlsch[i][j] = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL,abstraction_flag,frame_parms);
74
      if (!PHY_vars_eNB->dlsch[i][j]) {
75 76
	LOG_E(PHY,"Can't get eNB dlsch structures for UE %d \n", i);
	exit(-1);
77
      } else {
78 79
	LOG_D(PHY,"dlsch[%d][%d] => %p\n",i,j,PHY_vars_eNB->dlsch[i][j]);
	PHY_vars_eNB->dlsch[i][j]->rnti=0;
80 81
      }
    }
82
    
83

84
    LOG_I(PHY,"Allocating Transport Channel Buffer for ULSCH, UE %d\n",i);
85
    PHY_vars_eNB->ulsch[1+i] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,frame_parms->N_RB_UL, abstraction_flag);
86
    
87
    if (!PHY_vars_eNB->ulsch[1+i]) {
88 89 90
      LOG_E(PHY,"Can't get eNB ulsch structures\n");
      exit(-1);
    }
91
    
92
    // this is the transmission mode for the signalling channels
93
    // this will be overwritten with the real transmission mode by the RRC once the UE is connected
94
    PHY_vars_eNB->transmission_mode[i] = frame_parms->nb_antenna_ports_eNB==1 ? 1 : 2;
95
#ifdef LOCALIZATION
96
    PHY_vars_eNB->ulsch[1+i]->aggregation_period_ms = 5000; // 5000 milliseconds // could be given as an argument (TBD))
97 98
    struct timeval ts;
    gettimeofday(&ts, NULL);
99
    PHY_vars_eNB->ulsch[1+i]->reference_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000;
100
    int j;
101
    
102
    for (j=0; j<10; j++) {
103 104 105 106 107
      initialize(&PHY_vars_eNB->ulsch[1+i]->loc_rss_list[j]);
      initialize(&PHY_vars_eNB->ulsch[1+i]->loc_rssi_list[j]);
      initialize(&PHY_vars_eNB->ulsch[1+i]->loc_subcarrier_rss_list[j]);
      initialize(&PHY_vars_eNB->ulsch[1+i]->loc_timing_advance_list[j]);
      initialize(&PHY_vars_eNB->ulsch[1+i]->loc_timing_update_list[j]);
108
    }
109
    
110 111 112 113 114
    initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_rss_list);
    initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_rssi_list);
    initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_subcarrier_rss_list);
    initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_timing_advance_list);
    initialize(&PHY_vars_eNB->ulsch[1+i]->tot_loc_timing_update_list);
115
#endif
116
  }
117
  
118
  // ULSCH for RA
119
  PHY_vars_eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS, frame_parms->N_RB_UL, abstraction_flag);
120
  
121
  if (!PHY_vars_eNB->ulsch[0]) {
122 123 124
    LOG_E(PHY,"Can't get eNB ulsch structures\n");
    exit(-1);
  }
125
  PHY_vars_eNB->dlsch_SI  = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag, frame_parms);
126
  LOG_D(PHY,"eNB %d : SI %p\n",eNB_id,PHY_vars_eNB->dlsch_SI);
127
  PHY_vars_eNB->dlsch_ra  = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, abstraction_flag, frame_parms);
128
  LOG_D(PHY,"eNB %d : RA %p\n",eNB_id,PHY_vars_eNB->dlsch_ra);
129
  PHY_vars_eNB->dlsch_MCH = new_eNB_dlsch(1,8,NSOFT,frame_parms->N_RB_DL, 0, frame_parms);
130
  LOG_D(PHY,"eNB %d : MCH %p\n",eNB_id,PHY_vars_eNB->dlsch_MCH);
131 132
  
  
133
  PHY_vars_eNB->rx_total_gain_dB=130;
134
  
135
  for(i=0; i<NUMBER_OF_UE_MAX; i++)
136
    PHY_vars_eNB->mu_mimo_mode[i].dl_pow_off = 2;
137
  
138
  PHY_vars_eNB->check_for_total_transmissions = 0;
139
  
140
  PHY_vars_eNB->check_for_MUMIMO_transmissions = 0;
141
  
142
  PHY_vars_eNB->FULL_MUMIMO_transmissions = 0;
143
  
144
  PHY_vars_eNB->check_for_SUMIMO_transmissions = 0;
145 146
  
    PHY_vars_eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
147

148 149
  return (PHY_vars_eNB);
}
150
*/
151 152


153
/*
154

155 156 157 158
PHY_VARS_RN* init_lte_RN(LTE_DL_FRAME_PARMS *frame_parms,
                         uint8_t RN_id,
                         uint8_t eMBMS_active_state)
{
159 160 161 162 163

  int i;
  PHY_VARS_RN* PHY_vars_RN = malloc(sizeof(PHY_VARS_RN));
  memset(PHY_vars_RN,0,sizeof(PHY_VARS_RN));
  PHY_vars_RN->Mod_id=RN_id;
164

165
  if (eMBMS_active_state == multicast_relay) {
166
    for (i=0; i < 10 ; i++) { // num SF in a frame
Cedric Roux's avatar
Cedric Roux committed
167
      PHY_vars_RN->dlsch_rn_MCH[i] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS_MBSFN,frame_parms->N_RB_DL, 0);
168 169 170
      LOG_D(PHY,"eNB %d : MCH[%d] %p\n",RN_id,i,PHY_vars_RN->dlsch_rn_MCH[i]);
    }
  } else {
Cedric Roux's avatar
Cedric Roux committed
171
    PHY_vars_RN->dlsch_rn_MCH[0] = new_ue_dlsch(1,1,NSOFT,MAX_TURBO_ITERATIONS,frame_parms->N_RB_DL, 0);
172 173
    LOG_D(PHY,"eNB %d : MCH[0] %p\n",RN_id,PHY_vars_RN->dlsch_rn_MCH[0]);
  }
174

175 176
  return (PHY_vars_RN);
}
177

Raymond Knopp's avatar
 
Raymond Knopp committed
178
void init_lte_vars(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs],
179 180 181 182 183 184
                   uint8_t frame_type,
                   uint8_t tdd_config,
                   uint8_t tdd_config_S,
                   uint8_t extended_prefix_flag,
                   uint8_t N_RB_DL,
                   uint16_t Nid_cell,
185 186 187 188 189
                   uint8_t cooperation_flag,
		   uint8_t nb_antenna_ports,
		   uint8_t abstraction_flag,
                   int nb_antennas_rx, 
		   int nb_antennas_tx, 
190
		   int nb_antennas_rx_ue,
191
		   uint8_t eMBMS_active_state)
192
{
193

194 195 196
  uint8_t eNB_id,UE_id,CC_id;
  int i;

197 198 199

  mac_xface = malloc(sizeof(MAC_xface));

200 201
  memset(mac_xface, 0, sizeof(MAC_xface));

202 203
  LOG_I(PHY,"init lte parms: Nid_cell %d, Frame type %d, N_RB_DL %d\n",Nid_cell,frame_type,N_RB_DL);

204
  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
205 206 207 208 209 210 211 212 213
    frame_parms[CC_id] = calloc(1, sizeof(LTE_DL_FRAME_PARMS));
    (frame_parms[CC_id])->frame_type         = frame_type;
    (frame_parms[CC_id])->tdd_config         = tdd_config;
    (frame_parms[CC_id])->tdd_config_S       = tdd_config_S;
    (frame_parms[CC_id])->N_RB_DL            = N_RB_DL;
    (frame_parms[CC_id])->N_RB_UL            = (frame_parms[CC_id])->N_RB_DL;
    (frame_parms[CC_id])->phich_config_common.phich_resource = oneSixth;
    (frame_parms[CC_id])->phich_config_common.phich_duration = normal;
    (frame_parms[CC_id])->Ncp                = extended_prefix_flag;
214
    (frame_parms[CC_id])->Ncp_UL             = extended_prefix_flag; 
Raymond Knopp's avatar
 
Raymond Knopp committed
215 216
    (frame_parms[CC_id])->Nid_cell           = Nid_cell;
    (frame_parms[CC_id])->nushift            = (Nid_cell%6);
217 218
    (frame_parms[CC_id])->nb_antennas_tx     = nb_antennas_tx;
    (frame_parms[CC_id])->nb_antennas_rx     = nb_antennas_rx;
219
    (frame_parms[CC_id])->nb_antenna_ports_eNB = nb_antenna_ports;
220
    (frame_parms[CC_id])->mode1_flag           = (frame_parms[CC_id])->nb_antenna_ports_eNB==1 ? 1 : 0;
221

Raymond Knopp's avatar
 
Raymond Knopp committed
222
    init_frame_parms(frame_parms[CC_id],1);
223

Raymond Knopp's avatar
 
Raymond Knopp committed
224 225 226 227 228
    (frame_parms[CC_id])->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 0;//n_DMRS1 set to 0
    (frame_parms[CC_id])->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
    (frame_parms[CC_id])->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
    (frame_parms[CC_id])->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
    init_ul_hopping(frame_parms[CC_id]);
229 230
  }

Raymond Knopp's avatar
 
Raymond Knopp committed
231

232
  //  phy_init_top(frame_parms[0]);
233

Raymond Knopp's avatar
 
Raymond Knopp committed
234
  phy_init_lte_top(frame_parms[0]);
235

236 237 238 239 240 241
  RC.nb_inst = NB_eNB_INST;
  RC.nb_CC = (int *)malloc(MAX_NUM_CCs*sizeof(int));
  RC.nb_RU = NB_RU;
  for (i=0;i<NB_eNB_INST;i++) RC.nb_CC[i] = MAX_NUM_CCs;

  RC.eNB = (PHY_VARS_eNB***)malloc(NB_eNB_INST*sizeof(PHY_VARS_eNB**));
242 243

  for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
244 245
    
    RC.eNB[eNB_id] = (PHY_VARS_eNB**) malloc(MAX_NUM_CCs*sizeof(PHY_VARS_eNB*));
246

Raymond Knopp's avatar
 
Raymond Knopp committed
247
    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
248 249 250
      RC.eNB[eNB_id][CC_id] = init_lte_eNB(frame_parms[CC_id],eNB_id,Nid_cell,eNodeB_3GPP,abstraction_flag);
      RC.eNB[eNB_id][CC_id]->Mod_id=eNB_id;
      RC.eNB[eNB_id][CC_id]->CC_id=CC_id;
Raymond Knopp's avatar
 
Raymond Knopp committed
251
    }
252 253 254
  }


Raymond Knopp's avatar
 
Raymond Knopp committed
255
  PHY_vars_UE_g = (PHY_VARS_UE***)malloc(NB_UE_INST*sizeof(PHY_VARS_UE**));
256 257

  for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
258
    PHY_vars_UE_g[UE_id] = (PHY_VARS_UE**) malloc(MAX_NUM_CCs*sizeof(PHY_VARS_UE*));
259

Raymond Knopp's avatar
 
Raymond Knopp committed
260
    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
Raymond Knopp's avatar
 
Raymond Knopp committed
261
      (frame_parms[CC_id])->nb_antennas_tx     = 1;
262
      (frame_parms[CC_id])->nb_antennas_rx     = nb_antennas_rx_ue;
263
      PHY_vars_UE_g[UE_id][CC_id] = init_lte_UE(frame_parms[CC_id], UE_id,abstraction_flag);
Raymond Knopp's avatar
 
Raymond Knopp committed
264 265 266
      PHY_vars_UE_g[UE_id][CC_id]->Mod_id=UE_id;
      PHY_vars_UE_g[UE_id][CC_id]->CC_id=CC_id;
    }
267
  }
268 269 270
  
//  if (NB_RN_INST > 0) {
//    PHY_vars_RN_g = malloc(NB_RN_INST*sizeof(PHY_VARS_RN*));
271

272 273 274 275 276
//    for (RN_id=0; RN_id<NB_RN_INST; RN_id++) {
//      PHY_vars_RN_g[RN_id] = init_lte_RN(*frame_parms,RN_id,eMBMS_active_state);
//    }
//  }
  
277
}
278
*/