* merge/add handover procedure for the access stratum (enabled with the -H), status: experimental.
* fix a bug in BSR computation * add a python script to launch meld if the diff3 in subvsersion/config file is set to the targets/SCRIPTS/svn-merge-meld.py * pre-ci passed (100%) git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4309 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include "RadioResourceConfigDedicated.h"
|
||||
#include "TDD-Config.h"
|
||||
#include "MBSFN-SubframeConfigList.h"
|
||||
#include "MobilityControlInfo.h"
|
||||
#else
|
||||
|
||||
/**
|
||||
@@ -121,6 +122,17 @@ void phy_config_sib2_ue(u8 Mod_id,u8 CH_index,
|
||||
AdditionalSpectrumEmission_t *additionalSpectrumEmission,
|
||||
struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList);
|
||||
|
||||
|
||||
/*!
|
||||
\fn phy_config_afterHO_ue
|
||||
\brief Configure Common PHY parameters from mobilityControlInfo
|
||||
@param Mod_id
|
||||
@param eNB_index
|
||||
@param mobilityControlInfo pointer to the mobility control information for handover
|
||||
@param ho_failed flag to indicated whether the ho was successful or not
|
||||
*/
|
||||
void phy_config_afterHO_ue(u8 Mod_id,u8 eNB_index,
|
||||
MobilityControlInfo_t *mobilityControlInfo,u8 ho_failed);
|
||||
/*!
|
||||
\fn void phy_config_sib2_eNB(u8 Mod_id,
|
||||
RadioResourceConfigCommonSIB_t *radioResourceConfigCommon,
|
||||
|
||||
@@ -428,6 +428,118 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *phy_vars_eNB) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Configures UE MAC and PHY with radioResourceCommon received in mobilityControlInfo IE during Handover
|
||||
*/
|
||||
void phy_config_afterHO_ue(u8 Mod_id,u8 eNB_id, MobilityControlInfo_t *mobilityControlInfo, u8 ho_failed) {
|
||||
|
||||
if(mobilityControlInfo!=NULL) {
|
||||
RadioResourceConfigCommon_t *radioResourceConfigCommon = &mobilityControlInfo->radioResourceConfigCommon;
|
||||
LOG_I(PHY,"radioResourceConfigCommon %p\n", radioResourceConfigCommon);
|
||||
memcpy((void *)&PHY_vars_UE_g[Mod_id]->lte_frame_parms_before_ho,
|
||||
(void *)&PHY_vars_UE_g[Mod_id]->lte_frame_parms,
|
||||
sizeof(LTE_DL_FRAME_PARMS));
|
||||
PHY_vars_UE_g[Mod_id]->ho_triggered = 1;
|
||||
//PHY_vars_UE_g[UE_id]->UE_mode[0] = PRACH;
|
||||
|
||||
LTE_DL_FRAME_PARMS *lte_frame_parms = &PHY_vars_UE_g[Mod_id]->lte_frame_parms;
|
||||
int N_ZC;
|
||||
u8 prach_fmt;
|
||||
int u;
|
||||
|
||||
LOG_I(PHY,"[UE%d] Frame %d: Handover triggered: Applying radioResourceConfigCommon from eNB %d\n",
|
||||
Mod_id,PHY_vars_UE_g[Mod_id]->frame,eNB_id);
|
||||
|
||||
lte_frame_parms->prach_config_common.rootSequenceIndex =radioResourceConfigCommon->prach_Config.rootSequenceIndex;
|
||||
lte_frame_parms->prach_config_common.prach_Config_enabled=1;
|
||||
lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex;
|
||||
lte_frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->highSpeedFlag;
|
||||
lte_frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->zeroCorrelationZoneConfig;
|
||||
lte_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_FreqOffset;
|
||||
|
||||
prach_fmt = get_prach_fmt(radioResourceConfigCommon->prach_Config.prach_ConfigInfo->prach_ConfigIndex,lte_frame_parms->frame_type);
|
||||
N_ZC = (prach_fmt <4)?839:139;
|
||||
u = (prach_fmt < 4) ? prach_root_sequence_map0_3[lte_frame_parms->prach_config_common.rootSequenceIndex] :
|
||||
prach_root_sequence_map4[lte_frame_parms->prach_config_common.rootSequenceIndex];
|
||||
|
||||
//compute_prach_seq(u,N_ZC, PHY_vars_UE_g[Mod_id]->X_u);
|
||||
compute_prach_seq(&PHY_vars_UE_g[Mod_id]->lte_frame_parms.prach_config_common,
|
||||
lte_frame_parms->frame_type,
|
||||
PHY_vars_UE_g[Mod_id]->X_u);
|
||||
|
||||
|
||||
lte_frame_parms->pucch_config_common.deltaPUCCH_Shift = 1+radioResourceConfigCommon->pucch_ConfigCommon->deltaPUCCH_Shift;
|
||||
lte_frame_parms->pucch_config_common.nRB_CQI = radioResourceConfigCommon->pucch_ConfigCommon->nRB_CQI;
|
||||
lte_frame_parms->pucch_config_common.nCS_AN = radioResourceConfigCommon->pucch_ConfigCommon->nCS_AN;
|
||||
lte_frame_parms->pucch_config_common.n1PUCCH_AN = radioResourceConfigCommon->pucch_ConfigCommon->n1PUCCH_AN;
|
||||
lte_frame_parms->pdsch_config_common.referenceSignalPower = radioResourceConfigCommon->pdsch_ConfigCommon->referenceSignalPower;
|
||||
lte_frame_parms->pdsch_config_common.p_b = radioResourceConfigCommon->pdsch_ConfigCommon->p_b;
|
||||
|
||||
|
||||
lte_frame_parms->pusch_config_common.n_SB = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.n_SB;
|
||||
lte_frame_parms->pusch_config_common.hoppingMode = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode;
|
||||
lte_frame_parms->pusch_config_common.pusch_HoppingOffset = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset;
|
||||
lte_frame_parms->pusch_config_common.enable64QAM = radioResourceConfigCommon->pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM;
|
||||
lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled;
|
||||
lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH;
|
||||
lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled;
|
||||
lte_frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = radioResourceConfigCommon->pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift;
|
||||
|
||||
init_ul_hopping(lte_frame_parms);
|
||||
lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 0;
|
||||
if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->present==SoundingRS_UL_ConfigCommon_PR_setup) {
|
||||
lte_frame_parms->soundingrs_ul_config_common.enabled_flag = 1;
|
||||
lte_frame_parms->soundingrs_ul_config_common.srs_BandwidthConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_BandwidthConfig;
|
||||
lte_frame_parms->soundingrs_ul_config_common.srs_SubframeConfig = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_SubframeConfig;
|
||||
lte_frame_parms->soundingrs_ul_config_common.ackNackSRS_SimultaneousTransmission = radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.ackNackSRS_SimultaneousTransmission;
|
||||
if (radioResourceConfigCommon->soundingRS_UL_ConfigCommon->choice.setup.srs_MaxUpPts)
|
||||
lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 1;
|
||||
else
|
||||
lte_frame_parms->soundingrs_ul_config_common.srs_MaxUpPts = 0;
|
||||
}
|
||||
|
||||
lte_frame_parms->ul_power_control_config_common.p0_NominalPUSCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUSCH;
|
||||
lte_frame_parms->ul_power_control_config_common.alpha = radioResourceConfigCommon->uplinkPowerControlCommon->alpha;
|
||||
lte_frame_parms->ul_power_control_config_common.p0_NominalPUCCH = radioResourceConfigCommon->uplinkPowerControlCommon->p0_NominalPUCCH;
|
||||
lte_frame_parms->ul_power_control_config_common.deltaPreambleMsg3 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaPreambleMsg3;
|
||||
lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1;
|
||||
lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format1b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format1b;
|
||||
lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2 = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2;
|
||||
lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2a = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2a;
|
||||
lte_frame_parms->ul_power_control_config_common.deltaF_PUCCH_Format2b = radioResourceConfigCommon->uplinkPowerControlCommon->deltaFList_PUCCH.deltaF_PUCCH_Format2b;
|
||||
|
||||
lte_frame_parms->maxHARQ_Msg3Tx = radioResourceConfigCommon->rach_ConfigCommon->maxHARQ_Msg3Tx;
|
||||
|
||||
// Now configure some of the Physical Channels
|
||||
if (radioResourceConfigCommon->antennaInfoCommon)
|
||||
lte_frame_parms->nb_antennas_tx = (1<<radioResourceConfigCommon->antennaInfoCommon->antennaPortsCount);
|
||||
else
|
||||
lte_frame_parms->nb_antennas_tx = 1;
|
||||
//PHICH
|
||||
if (radioResourceConfigCommon->antennaInfoCommon) {
|
||||
lte_frame_parms->phich_config_common.phich_resource = radioResourceConfigCommon->phich_Config->phich_Resource;
|
||||
lte_frame_parms->phich_config_common.phich_duration = radioResourceConfigCommon->phich_Config->phich_Duration;
|
||||
}
|
||||
//Target CellId
|
||||
lte_frame_parms->Nid_cell = mobilityControlInfo->targetPhysCellId;
|
||||
lte_frame_parms->nushift = lte_frame_parms->Nid_cell%6;
|
||||
|
||||
// PUCCH
|
||||
init_ncs_cell(lte_frame_parms,PHY_vars_UE_g[Mod_id]->ncs_cell);
|
||||
|
||||
init_ul_hopping(lte_frame_parms);
|
||||
|
||||
// RNTI
|
||||
|
||||
PHY_vars_UE_g[Mod_id]->lte_ue_pdcch_vars[eNB_id]->crnti = mobilityControlInfo->newUE_Identity.buf[0]|(mobilityControlInfo->newUE_Identity.buf[1]<<8);
|
||||
|
||||
}
|
||||
if(ho_failed) {
|
||||
LOG_D(PHY,"[UE%d] Handover failed, triggering RACH procedure\n",Mod_id);
|
||||
memcpy((void *)&PHY_vars_UE_g[Mod_id]->lte_frame_parms,(void *)&PHY_vars_UE_g[Mod_id]->lte_frame_parms_before_ho, sizeof(LTE_DL_FRAME_PARMS));
|
||||
PHY_vars_UE_g[Mod_id]->UE_mode[eNB_id] = PRACH;
|
||||
}
|
||||
}
|
||||
|
||||
void phy_config_meas_ue(u8 Mod_id,u8 eNB_index,u8 n_adj_cells,unsigned int *adj_cell_id) {
|
||||
|
||||
|
||||
@@ -151,6 +151,13 @@ void lte_ue_measurements_emul(PHY_VARS_UE *phy_vars_ue,u8 last_slot,u8 eNB_id);
|
||||
@returns Path loss in dB
|
||||
*/
|
||||
s16 get_PL(u8 Mod_id,u8 eNB_index);
|
||||
u8 get_RSRP(u8 Mod_id,u8 eNB_index);
|
||||
u8 get_RSRQ(u8 Mod_id,u8 eNB_index);
|
||||
u8 get_n_adj_cells(u8 Mod_id);
|
||||
s8 get_rx_total_gain_dB(u8 Mod_id);
|
||||
s8 get_RSSI(u8 Mod_id);
|
||||
s8 set_RSRP_filtered(u8 Mod_id,u8 eNB_index,float rsrp);
|
||||
s8 set_RSRQ_filtered(u8 Mod_id,u8 eNB_index,float rstq);
|
||||
|
||||
//! Automatic gain control
|
||||
void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
|
||||
|
||||
@@ -68,6 +68,70 @@ s16 get_PL(u8 Mod_id,u8 eNB_index) {
|
||||
phy_vars_ue->lte_frame_parms.pdsch_config_common.referenceSignalPower));
|
||||
}
|
||||
|
||||
|
||||
u8 get_n_adj_cells (u8 Mod_id){
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id];
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->PHY_measurements.n_adj_cells;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
s8 get_rx_total_gain_dB (u8 Mod_id){
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id];
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->rx_total_gain_dB;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
s8 get_RSSI (u8 Mod_id){
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id];
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->PHY_measurements.rssi;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
u8 get_RSRP(u8 Mod_id,u8 eNB_index) {
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id];
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->PHY_measurements.rsrp[eNB_index];
|
||||
return 0;
|
||||
}
|
||||
|
||||
u8 get_RSRQ(u8 Mod_id,u8 eNB_index) {
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id];
|
||||
if (phy_vars_ue)
|
||||
return phy_vars_ue->PHY_measurements.rsrq[eNB_index];
|
||||
return 0;
|
||||
}
|
||||
|
||||
s8 set_RSRP_filtered(u8 Mod_id,u8 eNB_index,float rsrp) {
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id];
|
||||
if (phy_vars_ue){
|
||||
phy_vars_ue->PHY_measurements.rsrp_filtered[eNB_index]=rsrp;
|
||||
return 0;
|
||||
}
|
||||
LOG_W(PHY,"[UE%d] could not set the rsrp\n",Mod_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
s8 set_RSRQ_filtered(u8 Mod_id,u8 eNB_index,float rsrq) {
|
||||
|
||||
PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id];
|
||||
if (phy_vars_ue){
|
||||
phy_vars_ue->PHY_measurements.rsrq_filtered[eNB_index]=rsrq;
|
||||
return 0;
|
||||
}
|
||||
LOG_W(PHY,"[UE%d] could not set the rsrq\n",Mod_id);
|
||||
return -1;
|
||||
|
||||
}
|
||||
|
||||
void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
u8 slot,
|
||||
@@ -202,21 +266,24 @@ void ue_rrc_measurements(PHY_VARS_UE *phy_vars_ue,
|
||||
}
|
||||
else { // Do abstraction of RSRP and RSRQ
|
||||
phy_vars_ue->PHY_measurements.rssi = phy_vars_ue->PHY_measurements.rx_power_avg[0];
|
||||
// dummay value for the moment
|
||||
phy_vars_ue->PHY_measurements.rsrp[eNB_offset] = -93 ;
|
||||
phy_vars_ue->PHY_measurements.rsrq[eNB_offset] = 3;
|
||||
|
||||
}
|
||||
if (((phy_vars_ue->frame %10) == 0) && (slot == 1)) {
|
||||
#ifdef DEBUG_MEAS
|
||||
if (eNB_offset == 0)
|
||||
if (eNB_offset == 0)
|
||||
LOG_D(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB)\n",phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->frame,slot,10*log10(phy_vars_ue->PHY_measurements.rssi)-phy_vars_ue->rx_total_gain_dB,
|
||||
10*log10(phy_vars_ue->PHY_measurements.rssi));
|
||||
LOG_D(PHY,"[UE %d] Frame %d, slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f (%3.1f) dBm, rsrq: %3.1f dB\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->frame,slot,eNB_offset,
|
||||
(eNB_offset>0) ? phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1] : phy_vars_ue->lte_frame_parms.Nid_cell,
|
||||
(dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])/10.0)-phy_vars_ue->rx_total_gain_dB-dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12),
|
||||
(10*log10(phy_vars_ue->PHY_measurements.rx_power_avg[0])/10.0)-phy_vars_ue->rx_total_gain_dB-dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12),
|
||||
(10*log10(phy_vars_ue->PHY_measurements.rsrq[eNB_offset]))-20);
|
||||
LOG_D(PHY,"[UE %d] Frame %d, slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f (%3.1f) dBm, rsrq: %3.1f dB\n",
|
||||
phy_vars_ue->Mod_id,
|
||||
phy_vars_ue->frame,slot,eNB_offset,
|
||||
(eNB_offset>0) ? phy_vars_ue->PHY_measurements.adj_cell_id[eNB_offset-1] : phy_vars_ue->lte_frame_parms.Nid_cell,
|
||||
(dB_fixed_times10(phy_vars_ue->PHY_measurements.rsrp[eNB_offset])/10.0)-phy_vars_ue->rx_total_gain_dB-dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12),
|
||||
(10*log10(phy_vars_ue->PHY_measurements.rx_power_avg[0])/10.0)-phy_vars_ue->rx_total_gain_dB-dB_fixed(phy_vars_ue->lte_frame_parms.N_RB_DL*12),
|
||||
(10*log10(phy_vars_ue->PHY_measurements.rsrq[eNB_offset]))-20);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -331,8 +331,11 @@ typedef struct
|
||||
s8 tx_power_max_dBm;
|
||||
u32 frame;
|
||||
u8 n_connected_eNB;
|
||||
u8 ho_initiated;
|
||||
u8 ho_triggered;
|
||||
PHY_MEASUREMENTS PHY_measurements; /// Measurement variables
|
||||
LTE_DL_FRAME_PARMS lte_frame_parms;
|
||||
LTE_DL_FRAME_PARMS lte_frame_parms_before_ho; // frame parame before ho used to recover if ho fails
|
||||
LTE_UE_COMMON lte_ue_common_vars;
|
||||
|
||||
LTE_UE_PDSCH *lte_ue_pdsch_vars[NUMBER_OF_CONNECTED_eNB_MAX+1];
|
||||
|
||||
@@ -350,6 +350,8 @@ typedef struct
|
||||
unsigned int adj_cell_id[6];
|
||||
int rsrq[7];
|
||||
int rsrp[7];
|
||||
float rsrp_filtered[7]; // after layer 3 filtering
|
||||
float rsrq_filtered[7];
|
||||
// common measurements
|
||||
//! estimated noise power (linear)
|
||||
unsigned int n0_power[NB_ANTENNAS_RX];
|
||||
|
||||
Reference in New Issue
Block a user