config.c 26.2 KB
Newer Older
1
/*******************************************************************************
2 3
    OpenAirInterface
    Copyright(c) 1999 - 2014 Eurecom
4

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


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

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

28
*******************************************************************************/
29
/*! \file config.c
30
 * \brief UE and eNB configuration performed by RRC or as a consequence of RRC procedures
31 32
 * \author  Navid Nikaein and Raymond Knopp
 * \date 2010 - 2014
33 34 35
 * \version 0.1
 * \email: navid.nikaein@eurecom.fr
 * @ingroup _mac
36

37
 */
38

39 40 41 42 43 44 45 46 47
#include "COMMON/platform_types.h"
#include "COMMON/platform_constants.h"
#include "SystemInformationBlockType2.h"
//#include "RadioResourceConfigCommonSIB.h"
#include "RadioResourceConfigDedicated.h"
#include "MeasGapConfig.h"
#include "MeasObjectToAddModList.h"
#include "TDD-Config.h"
#include "defs.h"
48
#include "proto.h"
49 50 51 52 53 54 55 56 57
#include "extern.h"
#include "UTIL/LOG/log.h"
#include "UTIL/LOG/vcd_signal_dumper.h"
#ifdef Rel10
#include "MBSFN-AreaInfoList-r9.h"
#include "MBSFN-AreaInfo-r9.h"
#include "MBSFN-SubframeConfigList.h"
#include "PMCH-InfoList-r9.h"
#endif
58 59

/* sec 5.9, 36.321: MAC Reset Procedure */
60 61
void ue_mac_reset(module_id_t module_idP,uint8_t eNB_index)
{
62

63
  //Resetting Bj
64 65 66
  UE_mac_inst[module_idP].scheduling_info.Bj[0] = 0;
  UE_mac_inst[module_idP].scheduling_info.Bj[1] = 0;
  UE_mac_inst[module_idP].scheduling_info.Bj[2] = 0;
67

68
  //Stopping all timers
69

70
  //timeAlignmentTimer expires
71

72
  // PHY changes for UE MAC reset
73
  mac_xface->phy_reset_ue(module_idP,0,eNB_index);
74

75 76
  // notify RRC to relase PUCCH/SRS
  // cancel all pending SRs
77 78
  UE_mac_inst[module_idP].scheduling_info.SR_pending=0;
  UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0;
79

80
  // stop ongoing RACH procedure
81

82
  // discard explicitly signaled ra_PreambleIndex and ra_RACH_MaskIndex, if any
83 84 85
  UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex  = 0; // check!
  UE_mac_inst[module_idP].RA_prach_resources.ra_RACH_MaskIndex = 0;

Raymond Knopp's avatar
 
Raymond Knopp committed
86

87 88
  ue_init_mac(module_idP); //This will hopefully do the rest of the MAC reset procedure

89 90
}

91 92 93 94 95 96
int
rrc_mac_config_req(
  module_id_t                      Mod_id,
  eNB_flag_t                       eNB_flagP,
  rnti_t                           rntiP,
  uint8_t                          eNB_index,
97 98
                       RadioResourceConfigCommonSIB_t  *radioResourceConfigCommon,
                       struct PhysicalConfigDedicated  *physicalConfigDedicated,
99
#ifdef Rel10
100 101
                       SCellToAddMod_r10_t *sCellToAddMod_r10,
                       //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
Raymond Knopp's avatar
 
Raymond Knopp committed
102
#endif
103 104 105 106 107 108 109 110 111 112 113 114 115
                       MeasObjectToAddMod_t           **measObj,
                       MAC_MainConfig_t                *mac_MainConfig,
                       long                             logicalChannelIdentity,
                       LogicalChannelConfig_t          *logicalChannelConfig,
                       MeasGapConfig_t                 *measGapConfig,
                       TDD_Config_t                    *tdd_Config,
                       MobilityControlInfo_t           *mobilityControlInfo,
                       uint8_t                              *SIwindowsize,
                       uint16_t                             *SIperiod,
                       ARFCN_ValueEUTRA_t              *ul_CarrierFreq,
                       long                            *ul_Bandwidth,
                       AdditionalSpectrumEmission_t    *additionalSpectrumEmission,
                       struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList
Raymond Knopp's avatar
 
Raymond Knopp committed
116
#ifdef Rel10
117 118 119 120
                       ,uint8_t                              MBMS_Flag,
                       MBSFN_AreaInfoList_r9_t         *mbsfn_AreaInfoList,
                       PMCH_InfoList_r9_t              *pmch_InfoList
#endif
121
#ifdef CBA
122 123
                       ,uint8_t                              num_active_cba_groups,
                       uint16_t                              cba_rnti
124
#endif
125 126
                      )
{
127

128
  int i,CC_id=0;
129

130
  int UE_id = -1;
131 132
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_IN);

133
  if (eNB_flagP==0) {
134 135
    LOG_I(MAC,"[CONFIG][UE %d] Configuring MAC/PHY from eNB %d\n",Mod_id,eNB_index);

136
    if (tdd_Config != NULL) {
137
      UE_mac_inst[Mod_id].tdd_Config = tdd_Config;
138
    }
139
  } else {
140
    UE_id = find_UE_id(Mod_id, rntiP);
141 142 143 144 145
    if (physicalConfigDedicated == NULL) {
      LOG_I(MAC,"[CONFIG][eNB %d] Configuring MAC/PHY\n",Mod_id);
    } else {
      LOG_I(MAC,"[CONFIG][eNB %d] Configuring MAC/PHY for UE %d (%x)\n",Mod_id,UE_id,UE_RNTI(Mod_id,UE_id));
    }
146
  }
147

148
  if (tdd_Config && SIwindowsize && SIperiod) {
149
    if (eNB_flagP == ENB_FLAG_YES) {
150
      mac_xface->phy_config_sib1_eNB(Mod_id,0,tdd_Config,*SIwindowsize,*SIperiod);
151
    } else {
152
      mac_xface->phy_config_sib1_ue(Mod_id,0,eNB_index,tdd_Config,*SIwindowsize,*SIperiod);
153
    }
154
  }
155

156
  if (radioResourceConfigCommon!=NULL) {
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
    if (eNB_flagP==1) {
      LOG_I(MAC,"[CONFIG]SIB2/3 Contents (partial)\n");
      LOG_I(MAC,"[CONFIG]pusch_config_common.n_SB = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB);
      LOG_I(MAC,"[CONFIG]pusch_config_common.hoppingMode = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode);
      LOG_I(MAC,"[CONFIG]pusch_config_common.pusch_HoppingOffset = %ld\n",  radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset);
      LOG_I(MAC,"[CONFIG]pusch_config_common.enable64QAM = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM);
      LOG_I(MAC,"[CONFIG]pusch_config_common.groupHoppingEnabled = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled);
      LOG_I(MAC,"[CONFIG]pusch_config_common.groupAssignmentPUSCH = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH);
      LOG_I(MAC,"[CONFIG]pusch_config_common.sequenceHoppingEnabled = %d\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled);
      LOG_I(MAC,"[CONFIG]pusch_config_common.cyclicShift  = %ld\n",radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift);
      mac_xface->phy_config_sib2_eNB(Mod_id,0,radioResourceConfigCommon,ul_CarrierFreq,ul_Bandwidth,additionalSpectrumEmission,mbsfn_SubframeConfigList);
    } else {
      UE_mac_inst[Mod_id].radioResourceConfigCommon = radioResourceConfigCommon;
      mac_xface->phy_config_sib2_ue(Mod_id,0,eNB_index,radioResourceConfigCommon,ul_CarrierFreq,ul_Bandwidth,additionalSpectrumEmission,mbsfn_SubframeConfigList);
    }
172
  }
173

174 175
  // SRB2_lchan_config->choice.explicitValue.ul_SpecificParameters->logicalChannelGroup
  if (logicalChannelConfig!= NULL) {
176 177 178 179 180 181 182 183 184 185 186 187 188
    if (eNB_flagP==0) {
      LOG_I(MAC,"[CONFIG][UE %d] Applying RRC logicalChannelConfig from eNB%d\n",Mod_id,eNB_index);
      UE_mac_inst[Mod_id].logicalChannelConfig[logicalChannelIdentity]=logicalChannelConfig;
      UE_mac_inst[Mod_id].scheduling_info.Bj[logicalChannelIdentity]=0; // initilize the bucket for this lcid

      if (logicalChannelConfig->ul_SpecificParameters) {
        UE_mac_inst[Mod_id].scheduling_info.bucket_size[logicalChannelIdentity]=logicalChannelConfig->ul_SpecificParameters->prioritisedBitRate *
            logicalChannelConfig->ul_SpecificParameters->bucketSizeDuration; // set the max bucket size
        UE_mac_inst[Mod_id].scheduling_info.LCGID[logicalChannelIdentity]=*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup;
        LOG_D(MAC,"[CONFIG][UE %d] LCID %d is attached to the LCGID %d\n",Mod_id,logicalChannelIdentity,*logicalChannelConfig->ul_SpecificParameters->logicalChannelGroup);
      } else {
        LOG_E(MAC,"[CONFIG][UE %d] LCID %d NULL ul_SpecificParameters\n",Mod_id,logicalChannelIdentity);
        mac_xface->macphy_exit("NULL ul_SpecificParameters");
189
      }
190
    }
191 192
  }

193 194 195 196 197 198 199 200
  if (mac_MainConfig != NULL) {
    if (eNB_flagP==0) {
      LOG_I(MAC,"[CONFIG][UE%d] Applying RRC macMainConfig from eNB%d\n",Mod_id,eNB_index);
      UE_mac_inst[Mod_id].macConfig=mac_MainConfig;
      UE_mac_inst[Mod_id].measGapConfig=measGapConfig;

      if (mac_MainConfig->ul_SCH_Config) {

201
        if (mac_MainConfig->ul_SCH_Config->periodicBSR_Timer) {
202
          UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer = (uint16_t) *mac_MainConfig->ul_SCH_Config->periodicBSR_Timer;
203
        } else {
204
          UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer = (uint16_t) MAC_MainConfig__ul_SCH_Config__periodicBSR_Timer_infinity;
205
        }
206

207
        if (mac_MainConfig->ul_SCH_Config->maxHARQ_Tx) {
208
          UE_mac_inst[Mod_id].scheduling_info.maxHARQ_Tx     = (uint16_t) *mac_MainConfig->ul_SCH_Config->maxHARQ_Tx;
209
        } else {
210
          UE_mac_inst[Mod_id].scheduling_info.maxHARQ_Tx     = (uint16_t) MAC_MainConfig__ul_SCH_Config__maxHARQ_Tx_n5;
211
        }
212

213
        if (mac_MainConfig->ul_SCH_Config->retxBSR_Timer) {
214
          UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer     = (uint16_t) mac_MainConfig->ul_SCH_Config->retxBSR_Timer;
215
        } else {
216 217
          UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer     = (uint16_t)MAC_MainConfig__ul_SCH_Config__retxBSR_Timer_sf2560;
      }
218
      }
219 220 221

#ifdef Rel10

222
      if (mac_MainConfig->sr_ProhibitTimer_r9) {
223
        UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer  = (uint16_t) *mac_MainConfig->sr_ProhibitTimer_r9;
224
      } else {
225
        UE_mac_inst[Mod_id].scheduling_info.sr_ProhibitTimer  = (uint16_t) 0;
226
      }
227

228
#endif
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
      UE_mac_inst[Mod_id].scheduling_info.periodicBSR_SF  = get_sf_periodicBSRTimer(UE_mac_inst[Mod_id].scheduling_info.periodicBSR_Timer);
      UE_mac_inst[Mod_id].scheduling_info.retxBSR_SF     = get_sf_retxBSRTimer(UE_mac_inst[Mod_id].scheduling_info.retxBSR_Timer);

      UE_mac_inst[Mod_id].scheduling_info.drx_config     = mac_MainConfig->drx_Config;
      UE_mac_inst[Mod_id].scheduling_info.phr_config     = mac_MainConfig->phr_Config;

      if (mac_MainConfig->phr_Config) {
        UE_mac_inst[Mod_id].PHR_state = mac_MainConfig->phr_Config->present;
        UE_mac_inst[Mod_id].PHR_reconfigured = 1;
        UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer = mac_MainConfig->phr_Config->choice.setup.periodicPHR_Timer;
        UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer = mac_MainConfig->phr_Config->choice.setup.prohibitPHR_Timer;
        UE_mac_inst[Mod_id].scheduling_info.PathlossChange = mac_MainConfig->phr_Config->choice.setup.dl_PathlossChange;
      } else {
        UE_mac_inst[Mod_id].PHR_reconfigured = 0;
        UE_mac_inst[Mod_id].PHR_state = MAC_MainConfig__phr_Config_PR_setup;
        UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer = MAC_MainConfig__phr_Config__setup__periodicPHR_Timer_sf20;
        UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer = MAC_MainConfig__phr_Config__setup__prohibitPHR_Timer_sf20;
        UE_mac_inst[Mod_id].scheduling_info.PathlossChange = MAC_MainConfig__phr_Config__setup__dl_PathlossChange_dB1;
247
      }
248 249 250 251 252 253 254 255 256 257 258

      UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF =  get_sf_perioidicPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.periodicPHR_Timer);
      UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF =  get_sf_prohibitPHR_Timer(UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_Timer);
      UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db =  get_db_dl_PathlossChange(UE_mac_inst[Mod_id].scheduling_info.PathlossChange);
      LOG_D(MAC,"[UE %d] config PHR (%d): periodic %d (SF) prohibit %d (SF)  pathlosschange %d (db) \n",
            Mod_id,
            (mac_MainConfig->phr_Config)?mac_MainConfig->phr_Config->present:-1,
            UE_mac_inst[Mod_id].scheduling_info.periodicPHR_SF,
            UE_mac_inst[Mod_id].scheduling_info.prohibitPHR_SF,
            UE_mac_inst[Mod_id].scheduling_info.PathlossChange_db);
    }
259 260 261
  }

  if (physicalConfigDedicated != NULL) {
262 263 264 265 266 267
    if (eNB_flagP==1) {
      mac_xface->phy_config_dedicated_eNB(Mod_id,0,UE_RNTI(Mod_id,UE_id),physicalConfigDedicated);
    } else {
      mac_xface->phy_config_dedicated_ue(Mod_id,0,eNB_index,physicalConfigDedicated);
      UE_mac_inst[Mod_id].physicalConfigDedicated=physicalConfigDedicated; // for SR proc
    }
268
  }
269

Raymond Knopp's avatar
 
Raymond Knopp committed
270
#ifdef Rel10
271

Raymond Knopp's avatar
 
Raymond Knopp committed
272
  if (sCellToAddMod_r10 != NULL) {
273 274

    if (eNB_flagP==1) {
Raymond Knopp's avatar
 
Raymond Knopp committed
275
      mac_xface->phy_config_dedicated_scell_eNB(Mod_id,UE_RNTI(Mod_id,UE_id),sCellToAddMod_r10,1);
276
    } else {
277
#warning "phy_config_dedicated_scell_ue is empty"
Raymond Knopp's avatar
 
Raymond Knopp committed
278 279 280 281
      mac_xface->phy_config_dedicated_scell_ue(Mod_id,eNB_index,sCellToAddMod_r10,1);
      UE_mac_inst[Mod_id].physicalConfigDedicatedSCell_r10 = sCellToAddMod_r10->radioResourceConfigDedicatedSCell_r10->physicalConfigDedicatedSCell_r10; // using SCell index 0
    }
  }
282

Raymond Knopp's avatar
 
Raymond Knopp committed
283
#endif
284

285
  if (eNB_flagP == 0) {
286 287 288 289 290 291 292 293 294 295 296
    if (measObj!= NULL) {
      if (measObj[0]!= NULL) {
        UE_mac_inst[Mod_id].n_adj_cells = measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList->list.count;
        LOG_I(MAC,"Number of adjacent cells %d\n",UE_mac_inst[Mod_id].n_adj_cells);

        for (i=0; i<UE_mac_inst[Mod_id].n_adj_cells; i++) {
          UE_mac_inst[Mod_id].adj_cell_id[i] = measObj[0]->measObject.choice.measObjectEUTRA.cellsToAddModList->list.array[i]->physCellId;
          LOG_I(MAC,"Cell %d : Nid_cell %d\n",i,UE_mac_inst[Mod_id].adj_cell_id[i]);
        }

        mac_xface->phy_config_meas_ue(Mod_id,0,eNB_index,UE_mac_inst[Mod_id].n_adj_cells,UE_mac_inst[Mod_id].adj_cell_id);
297
      }
298 299 300 301 302 303 304 305 306 307 308

      /*
      if (quantityConfig != NULL) {
      if (quantityConfig[0] != NULL) {
      UE_mac_inst[Mod_id].quantityConfig = quantityConfig[0];
      LOG_I(MAC,"UE %d configured filterCoeff.",UE_mac_inst[Mod_id].crnti);
      mac_xface->phy_config_meas_ue
      }
      }
       */
    }
309
  }
310

311
  if (eNB_flagP==0) {
312 313 314 315 316 317 318 319 320 321 322 323 324 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 358 359 360 361 362 363 364 365 366 367 368 369
    if(mobilityControlInfo != NULL) {

      LOG_D(MAC,"[UE%d] MAC Reset procedure triggered by RRC eNB %d \n",Mod_id,eNB_index);
      ue_mac_reset(Mod_id,eNB_index);

      if(mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon) {
        memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->rach_ConfigCommon,
               (void *)mobilityControlInfo->radioResourceConfigCommon.rach_ConfigCommon,
               sizeof(RACH_ConfigCommon_t));
      }

      memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->prach_Config.prach_ConfigInfo,
             (void *)mobilityControlInfo->radioResourceConfigCommon.prach_Config.prach_ConfigInfo,
             sizeof(PRACH_ConfigInfo_t));
      UE_mac_inst[Mod_id].radioResourceConfigCommon->prach_Config.rootSequenceIndex = mobilityControlInfo->radioResourceConfigCommon.prach_Config.rootSequenceIndex;

      if(mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon) {
        memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pdsch_ConfigCommon,
               (void *)mobilityControlInfo->radioResourceConfigCommon.pdsch_ConfigCommon,
               sizeof(PDSCH_ConfigCommon_t));
      }

      // not a pointer: mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon
      memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pusch_ConfigCommon,
             (void *)&mobilityControlInfo->radioResourceConfigCommon.pusch_ConfigCommon,
             sizeof(PUSCH_ConfigCommon_t));

      if(mobilityControlInfo->radioResourceConfigCommon.phich_Config) {
        /* memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->phich_Config,
        (void *)mobilityControlInfo->radioResourceConfigCommon.phich_Config,
        sizeof(PHICH_Config_t)); */
      }

      if(mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon) {
        memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->pucch_ConfigCommon,
               (void *)mobilityControlInfo->radioResourceConfigCommon.pucch_ConfigCommon,
               sizeof(PUCCH_ConfigCommon_t));
      }

      if(mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon) {
        memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->soundingRS_UL_ConfigCommon,
               (void *)mobilityControlInfo->radioResourceConfigCommon.soundingRS_UL_ConfigCommon,
               sizeof(SoundingRS_UL_ConfigCommon_t));
      }

      if(mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon) {
        memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->uplinkPowerControlCommon,
               (void *)mobilityControlInfo->radioResourceConfigCommon.uplinkPowerControlCommon,
               sizeof(UplinkPowerControlCommon_t));
      }

      //configure antennaInfoCommon somewhere here..
      if(mobilityControlInfo->radioResourceConfigCommon.p_Max) {
        //to be configured
      }

      if(mobilityControlInfo->radioResourceConfigCommon.tdd_Config) {
        UE_mac_inst[Mod_id].tdd_Config = mobilityControlInfo->radioResourceConfigCommon.tdd_Config;
370
      }
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391

      if(mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength) {
        memcpy((void *)&UE_mac_inst[Mod_id].radioResourceConfigCommon->ul_CyclicPrefixLength,
               (void *)mobilityControlInfo->radioResourceConfigCommon.ul_CyclicPrefixLength,
               sizeof(UL_CyclicPrefixLength_t));
      }

      // store the previous rnti in case of failure, and set thenew rnti
      UE_mac_inst[Mod_id].crnti_before_ho = UE_mac_inst[Mod_id].crnti;
      UE_mac_inst[Mod_id].crnti = ((mobilityControlInfo->newUE_Identity.buf[0])|(mobilityControlInfo->newUE_Identity.buf[1]<<8));
      LOG_I(MAC,"[UE %d] Received new identity %x from %d\n", Mod_id, UE_mac_inst[Mod_id].crnti, eNB_index);
      UE_mac_inst[Mod_id].rach_ConfigDedicated = malloc(sizeof(*mobilityControlInfo->rach_ConfigDedicated));

      if (mobilityControlInfo->rach_ConfigDedicated) {
        memcpy((void*)UE_mac_inst[Mod_id].rach_ConfigDedicated,
               (void*)mobilityControlInfo->rach_ConfigDedicated,
               sizeof(*mobilityControlInfo->rach_ConfigDedicated));
      }

      mac_xface->phy_config_afterHO_ue(Mod_id,0,eNB_index,mobilityControlInfo,0);
    }
392
  }
393

394
  if (mbsfn_SubframeConfigList != NULL) {
395 396 397 398 399 400 401 402 403 404
    if (eNB_flagP == 1) {
      LOG_I(MAC,"[eNB %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_id, mbsfn_SubframeConfigList->list.count);
      eNB_mac_inst[Mod_id].common_channels[0].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count;

      for (i=0; i<mbsfn_SubframeConfigList->list.count; i++) {
        eNB_mac_inst[Mod_id].common_channels[0].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i];
        LOG_I(MAC, "[eNB %d][CONFIG] MBSFN_SubframeConfig[%d] pattern is  %x\n", Mod_id, i,
              eNB_mac_inst[Mod_id].common_channels[0].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]);
      }

405
#ifdef Rel10
406
      eNB_mac_inst[Mod_id].common_channels[0].MBMS_flag = MBMS_Flag;
407
#endif
408 409 410 411 412 413 414 415 416
    } else { // UE
      LOG_I(MAC,"[UE %d][CONFIG] Received %d subframe allocation pattern for MBSFN\n", Mod_id, mbsfn_SubframeConfigList->list.count);
      UE_mac_inst[Mod_id].num_sf_allocation_pattern= mbsfn_SubframeConfigList->list.count;

      for (i=0; i<mbsfn_SubframeConfigList->list.count; i++) {
        LOG_I(MAC, "[UE %d] Configuring MBSFN_SubframeConfig %d from received SIB2 \n", Mod_id, i);
        UE_mac_inst[Mod_id].mbsfn_SubframeConfig[i] = mbsfn_SubframeConfigList->list.array[i];
        //  LOG_I("[UE %d] MBSFN_SubframeConfig[%d] pattern is  %ld\n", Mod_id,
        //    UE_mac_inst[Mod_id].mbsfn_SubframeConfig[i]->subframeAllocation.choice.oneFrame.buf[0]);
417
      }
418
    }
419 420 421
  }

#ifdef Rel10
422

423
  if (mbsfn_AreaInfoList != NULL) {
424 425 426 427 428 429 430 431 432 433
    if (eNB_flagP == 1) {
      // One eNB could be part of multiple mbsfn syc area, this could change over time so reset each time
      LOG_I(MAC,"[eNB %d][CONFIG] Received %d MBSFN Area Info\n", Mod_id, mbsfn_AreaInfoList->list.count);
      eNB_mac_inst[Mod_id].common_channels[0].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count;

      for (i =0; i< mbsfn_AreaInfoList->list.count; i++) {
        eNB_mac_inst[Mod_id].common_channels[0].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i];
        LOG_I(MAC,"[eNB %d][CONFIG] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n", Mod_id,i,
              eNB_mac_inst[Mod_id].common_channels[0].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9);
        mac_xface->phy_config_sib13_eNB(Mod_id,0,i,eNB_mac_inst[Mod_id].common_channels[0].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9);
434
      }
435 436 437 438 439 440 441 442 443
    } else { // UE
      LOG_I(MAC,"[UE %d][CONFIG] Received %d MBSFN Area Info\n", Mod_id, mbsfn_AreaInfoList->list.count);
      UE_mac_inst[Mod_id].num_active_mbsfn_area = mbsfn_AreaInfoList->list.count;

      for (i =0; i< mbsfn_AreaInfoList->list.count; i++) {
        UE_mac_inst[Mod_id].mbsfn_AreaInfo[i] = mbsfn_AreaInfoList->list.array[i];
        LOG_I(MAC,"[UE %d] MBSFN_AreaInfo[%d]: MCCH Repetition Period = %ld\n",Mod_id, i,
              UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mcch_Config_r9.mcch_RepetitionPeriod_r9);
        mac_xface->phy_config_sib13_ue(Mod_id,0,eNB_index,i,UE_mac_inst[Mod_id].mbsfn_AreaInfo[i]->mbsfn_AreaId_r9);
444
      }
445
    }
446 447
  }

448

449
  if (pmch_InfoList != NULL) {
450

451
    //    LOG_I(MAC,"DUY: lcid when entering rrc_mac config_req is %02d\n",(pmch_InfoList->list.array[0]->mbms_SessionInfoList_r9.list.array[0]->logicalChannelIdentity_r9));
452

453
    if (eNB_flagP == 1) {
454

455
      LOG_I(MAC, "[CONFIG] Number of PMCH in this MBSFN Area %d\n", pmch_InfoList->list.count);
456

457 458
      for (i =0; i< pmch_InfoList->list.count; i++) {
        eNB_mac_inst[Mod_id].common_channels[0].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9;
459

460 461 462 463 464 465
        LOG_I(MAC, "[CONFIG] PMCH[%d]: This PMCH stop at subframe  %ldth\n", i,
              eNB_mac_inst[Mod_id].common_channels[0].pmch_Config[i]->sf_AllocEnd_r9);
        LOG_I(MAC, "[CONFIG] PMCH[%d]: mch_Scheduling_Period = %ld\n", i,
              eNB_mac_inst[Mod_id].common_channels[0].pmch_Config[i]->mch_SchedulingPeriod_r9);
        LOG_I(MAC, "[CONFIG] PMCH[%d]: dataMCS = %ld\n", i,
              eNB_mac_inst[Mod_id].common_channels[0].pmch_Config[i]->dataMCS_r9);
466

467 468 469
        // MBMS session info list in each MCH
        eNB_mac_inst[Mod_id].common_channels[0].mbms_SessionList[i] = &pmch_InfoList->list.array[i]->mbms_SessionInfoList_r9;
        LOG_I(MAC, "PMCH[%d] Number of session (MTCH) is: %d\n",i, eNB_mac_inst[Mod_id].common_channels[0].mbms_SessionList[i]->list.count);
470
      }
471 472 473 474 475 476 477
    } else { // UE
      LOG_I(MAC, "[UE %d] Configuring PMCH_config from MCCH MESSAGE \n",Mod_id);

      for (i =0; i< pmch_InfoList->list.count; i++) {
        UE_mac_inst[Mod_id].pmch_Config[i] = &pmch_InfoList->list.array[i]->pmch_Config_r9;
        LOG_I(MAC, "[UE %d] PMCH[%d]: MCH_Scheduling_Period = %ld\n", Mod_id, i,
              UE_mac_inst[Mod_id].pmch_Config[i]->mch_SchedulingPeriod_r9);
478
      }
479 480 481

      UE_mac_inst[Mod_id].mcch_status = 1;
    }
482
  }
483

484 485
#endif
#ifdef CBA
486 487 488 489 490 491 492 493 494 495 496 497 498 499 500

  if (eNB_flagP == 0) {
    if (cba_rnti) {
      UE_mac_inst[Mod_id].cba_rnti[num_active_cba_groups-1] = cba_rnti;
      LOG_D(MAC,"[UE %d] configure CBA group %d RNTI %x for eNB %d (total active cba group %d)\n",
            Mod_id,Mod_id%num_active_cba_groups, cba_rnti,eNB_index,num_active_cba_groups);
      mac_xface->phy_config_cba_rnti(Mod_id,CC_id,eNB_flagP,eNB_index,cba_rnti,num_active_cba_groups-1, num_active_cba_groups);
    }
  } else {
    if (cba_rnti) {
      LOG_D(MAC,"[eNB %d] configure CBA RNTI for UE  %d (total active cba groups %d)\n",
            Mod_id, UE_id, num_active_cba_groups);
      eNB_mac_inst[Mod_id].common_channels[CC_id].num_active_cba_groups=num_active_cba_groups;

      for (i=0; i < num_active_cba_groups; i ++) {
501
        if (eNB_mac_inst[Mod_id].common_channels[CC_id].cba_rnti[i] != cba_rnti + i) {
502
          eNB_mac_inst[Mod_id].common_channels[CC_id].cba_rnti[i] = cba_rnti + i;
503
        }
504 505 506 507 508 509 510 511

        //only configure UE ids up to num_active_cba_groups
        //we use them as candidates for the transmission of dci format0)
        if (UE_id%num_active_cba_groups == i) {
          mac_xface->phy_config_cba_rnti(Mod_id,CC_id,eNB_flagP,UE_id,cba_rnti + i,i,num_active_cba_groups );
          LOG_D(MAC,"[eNB %d] configure CBA groups %d with RNTI %x for UE  %d (total active cba groups %d)\n",
                Mod_id, i, eNB_mac_inst[Mod_id].common_channels[CC_id].cba_rnti[i],UE_id, num_active_cba_groups);
        }
512
      }
513
    }
514 515 516 517 518 519 520
  }

#endif
  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RRC_MAC_CONFIG, VCD_FUNCTION_OUT);

  return(0);
}
521
#ifdef LOCALIZATION
522
//------------------------------------------------------------------------------
523
double
524 525 526 527 528 529
rrc_get_estimated_ue_distance(
  const protocol_ctxt_t* const ctxt_pP,
  const int         CC_idP,
  const uint8_t     loc_typeP
)
//------------------------------------------------------------------------------
530 531 532 533 534
{
  // localization types:
  // 0: power based
  // 1: time based
  LTE_eNB_UE_stats     *eNB_UE_stats     = NULL;
535
  UE_list_t*            UE_list = &eNB_mac_inst[ctxt_pP->module_id].UE_list;
536
  int                   pCCid;
537
  int                   UE_id;
538

539
  if(ctxt_pP->rnti == NOT_A_RNTI) {
540
    return -1;
541
  }
542

543 544 545
  UE_id = find_UE_id(ctxt_pP->module_id,ctxt_pP->rnti);
  pCCid = UE_PCCID(ctxt_pP->module_id,UE_id);
  eNB_UE_stats = mac_xface->get_eNB_UE_stats(ctxt_pP->module_id,pCCid,ctxt_pP->rnti);
546

547
  switch (loc_typeP) {
548 549 550 551 552 553 554 555 556 557 558 559
  case 0:
    return eNB_UE_stats->distance.power_based;
    break;

  case 1:
    return eNB_UE_stats->distance.time_based;
    break;

  default:
    return  eNB_UE_stats->distance.power_based;
  }

560
  //    LOG_D(LOCALIZE, "DEBUG ME, dist = %d\n", &eNB_mac_inst[ctxt_pP->module_id].UE_list.UE_template[CC_id][UE_id].distance.power_based);
561

562 563
}

564
#endif