Pre-ci test passed git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
295 lines
16 KiB
C
Executable File
295 lines
16 KiB
C
Executable File
/***************************************************************************
|
|
rrc_ue_bch_process.c - description
|
|
-------------------
|
|
begin : Aug 30, 2002
|
|
copyright : (C) 2002, 2010 by Eurecom
|
|
email : Michelle.Wetterwald@eurecom.fr
|
|
**************************************************************************
|
|
Procedures to perform de-scheduling of SIBs
|
|
***************************************************************************/
|
|
/********************
|
|
//OpenAir definitions
|
|
********************/
|
|
#include "LAYER2/MAC/extern.h"
|
|
#include "UTIL/MEM/mem_block.h"
|
|
|
|
/********************
|
|
// RRC definitions
|
|
********************/
|
|
#include "rrc_ue_vars.h"
|
|
#include "rrc_bch_mib.h"
|
|
//-----------------------------------------------------------------------------
|
|
#include "rrc_proto_bch.h"
|
|
#include "rrc_proto_int.h"
|
|
#include "rrc_proto_intf.h"
|
|
|
|
//#define DEBUG_RRC_BROADCAST
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_ue_bch_init (void){
|
|
//-----------------------------------------------------------------------------
|
|
MasterInformationBlock *pmib = &(protocol_ms->rrc.ue_bch_blocks.currMIB);
|
|
pmib->sibSb_ReferenceList.sib_ref[0].sibSb_Type.type = SIBSb_sysInfoType1;
|
|
pmib->sibSb_ReferenceList.sib_ref[1].sibSb_Type.type = SIBSb_sysInfoType2;
|
|
pmib->sibSb_ReferenceList.sib_ref[2].sibSb_Type.type = SIBSb_sysInfoType5;
|
|
pmib->sibSb_ReferenceList.sib_ref[3].sibSb_Type.type = SIBSb_sysInfoType11;
|
|
pmib->sibSb_ReferenceList.sib_ref[4].sibSb_Type.type = SIBSb_sysInfoType14;
|
|
pmib->sibSb_ReferenceList.sib_ref[5].sibSb_Type.type = SIBSb_sysInfoType18;
|
|
|
|
protocol_ms->rrc.ue_bch_blocks.SIB14_timeout = TRUE;
|
|
protocol_ms->rrc.ue_bch_blocks.SIB14_timeout_value = (2 << SIB14_REP) * SIB14_TFACTOR;
|
|
protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.mib_vt = 15; //0x0f >8
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_ue_bch_process_MIB (PERParms * pParms){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
//Temp - test MIB value tag directly in MIB - TBD later 8.1.1.7.3 [25.331]
|
|
if ((int) protocol_ms->rrc.ue_bch_blocks.encoded_currMIB[1] != protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.mib_vt) {
|
|
// skip segment decoding, 1st step works on bytes only
|
|
status = rrc_PERDec_MasterInformationBlock (pParms, &(protocol_ms->rrc.ue_bch_blocks.currMIB));
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Decode MIB status %d.\n", status);
|
|
#endif
|
|
if (status == P_SUCCESS) {
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Process information from MIB.\n");
|
|
msg ("[RRC_BCH-UE] MIB value tag: %d\n", protocol_ms->rrc.ue_bch_blocks.currMIB.mib_ValueTag);
|
|
msg ("[RRC_BCH-UE] PLMN Identity: MCC %d%d%d , MNC %d\n",
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mcc.elem[0],
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mcc.elem[1],
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mcc.elem[2],
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mnc);
|
|
// protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mnc.elem[0],
|
|
// protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mnc.elem[1],
|
|
// protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mnc.elem[2]);
|
|
msg ("[RRC_BCH-UE] Value tags: SIB1 %d , SIB2 %d , SIB5 %d, SIB11 %d, SIB18 %d.\n",
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[0].sibSb_Type.type_tag.sysInfoType1,
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[1].sibSb_Type.type_tag.sysInfoType2,
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[2].sibSb_Type.type_tag.sysInfoType5,
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[3].sibSb_Type.type_tag.sysInfoType11,
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[5].sibSb_Type.type_tag.sysInfoType18);
|
|
#endif
|
|
protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.mib_vt = protocol_ms->rrc.ue_bch_blocks.currMIB.mib_ValueTag;
|
|
// if first base, store cell_id from RG - Otherwise, check this is the right cell (PLMN)
|
|
if (protocol_ms->rrc.cell_id == 0)
|
|
protocol_ms->rrc.cell_id = protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mnc;
|
|
else if (protocol_ms->rrc.cell_id != protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mnc)
|
|
msg ("\n\n[RRC_BCH-UE] Decode MIB Error - Broadcast received from another RG - cell %d.\n\n", protocol_ms->rrc.ue_bch_blocks.currMIB.plmn_Identity.mnc);
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Decode MIB status - Cell_id %d.\n", protocol_ms->rrc.cell_id);
|
|
#endif
|
|
// check sib_ref information
|
|
}
|
|
} else {
|
|
#ifdef DEBUG_RRC_BROADCAST_DETAILS
|
|
msg ("[RRC_BCH-UE] Ignore information from MIB %d , %d.\n", (int) protocol_ms->rrc.ue_bch_blocks.encoded_currMIB[1], protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.mib_vt);
|
|
// rrc_print_buffer (protocol_ms->rrc.ue_bch_blocks.encoded_currMIB,20);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_ue_bch_process_SIB1 (PERParms * pParms){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
//if (protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[0].sibSb_Type.type_tag.sysInfoType1
|
|
// != protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib1_vt){
|
|
//skip segment decoding, 1st step works on bytes only
|
|
status = rrc_PERDec_SysInfoType1 (pParms, &(protocol_ms->rrc.ue_bch_blocks.currSIB1));
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Decode SIB1 status %d.\n", status);
|
|
#endif
|
|
if (status == P_SUCCESS) {
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Process information from System Information Block 1.\n");
|
|
msg ("[RRC_BCH-UE] NAS System Information.\n");
|
|
rrc_print_buffer ((char *) &protocol_ms->rrc.ue_bch_blocks.currSIB1.subnet_NAS_SysInfo.data, protocol_ms->rrc.ue_bch_blocks.currSIB1.subnet_NAS_SysInfo.numocts);
|
|
msg ("[RRC_BCH-UE] UE timers and counters.\n");
|
|
rrc_print_buffer ((char *) &protocol_ms->rrc.ue_bch_blocks.currSIB1.ue_TimersAndConstants.data, protocol_ms->rrc.ue_bch_blocks.currSIB1.ue_TimersAndConstants.numocts);
|
|
#endif
|
|
// save values of timers and counters
|
|
// send NAS data to NAS
|
|
if (protocol_ms->rrc.ue_wait_establish_req == 1) {
|
|
rrc_ue_broadcast_encode_nas_sib1 ();
|
|
rrc_ue_write_FIFO (protocol_ms->rrc.NASMessageToXmit);
|
|
} else {
|
|
protocol_ms->rrc.ue_wait_establish_req = 2;
|
|
}
|
|
protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib1_vt = protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[0].sibSb_Type.type_tag.sysInfoType1;
|
|
}
|
|
// }
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_ue_bch_process_SIB2 (PERParms * pParms){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[1].sibSb_Type.type_tag.sysInfoType2 != protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib2_vt) {
|
|
// skip segment decoding, 1st step works on bytes only
|
|
status = rrc_PERDec_SysInfoType2 (pParms, &(protocol_ms->rrc.ue_bch_blocks.currSIB2));
|
|
if (status != P_SUCCESS) {
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Decode SIB2 status %d.\n", status);
|
|
#endif
|
|
} else {
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Process information from System Information Block 2.\n");
|
|
msg ("[RRC_BCH-UE] IP address.\n");
|
|
rrc_print_buffer ((char *) &protocol_ms->rrc.ue_bch_blocks.currSIB2.net_IP_addr.data, 16);
|
|
#endif
|
|
// save IP address of RG
|
|
protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib2_vt = protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[1].sibSb_Type.type_tag.sysInfoType2;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_ue_bch_process_SIB5 (PERParms * pParms){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[2].sibSb_Type.type_tag.sysInfoType5 != protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib5_vt) {
|
|
// skip segment decoding, 1st step works on bytes only
|
|
status = rrc_PERDec_SysInfoType5 (pParms, &(protocol_ms->rrc.ue_bch_blocks.currSIB5));
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg ("[RRC_BCH-UE] Decode SIB5 status %d.\n", status);
|
|
#endif
|
|
if (status == P_SUCCESS) {
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Process information from System Information Block 5.\n");
|
|
msg ("[RRC_BCH-UE] FACH RACH configuration Information.");
|
|
rrc_print_buffer ((char *) &protocol_ms->rrc.ue_bch_blocks.currSIB5.prach_sCCPCH_SIList.data, protocol_ms->rrc.ue_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts);
|
|
msg ("[RRC_BCH-UE] Config data: %s \n", (char *) &protocol_ms->rrc.ue_bch_blocks.currSIB5.prach_sCCPCH_SIList.data);
|
|
#endif
|
|
/* **** REMOVED FOR OPENAIR ****
|
|
// save configuration
|
|
memcpy ((char *) &(rrm_config->sccpch), (char *) protocol_ms->rrc.ue_bch_blocks.currSIB5.prach_sCCPCH_SIList.data, protocol_ms->rrc.ue_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts);
|
|
if ((rrm_config->prach.rach_trch.tf[0].bs == 0) || (rrm_config->sccpch.fach_trch.tf[0].bs == 0)) // bad config DN april 05
|
|
wcdma_handle_error (WCDMA_ERROR_RRC_NASTY_BCH_CONFIG);
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] config RACH-FACH BS RACH= %d FACH=%d \n ", rrm_config->prach.rach_trch.tf[0].bs, rrm_config->sccpch.fach_trch.tf[0].bs);
|
|
msg ("[RRC_BCH-UE] OpenLoopPowerControl: BCH Tx power %d, alpha %d, prach %d, dpch %d .\n",
|
|
protocol_ms->rrc.ue_bch_blocks.currSIB5.openLoopPowerControl_TDD.primaryCCPCH_TX_Power,
|
|
protocol_ms->rrc.ue_bch_blocks.currSIB5.openLoopPowerControl_TDD.alpha,
|
|
protocol_ms->rrc.ue_bch_blocks.currSIB5.openLoopPowerControl_TDD.prach_ConstantValue, protocol_ms->rrc.ue_bch_blocks.currSIB5.openLoopPowerControl_TDD.dpch_ConstantValue);
|
|
#endif
|
|
// save outer loop power control parameters
|
|
rrm_config->outer_loop_vars.PCCPCH_POWER = protocol_ms->rrc.ue_bch_blocks.currSIB5.openLoopPowerControl_TDD.primaryCCPCH_TX_Power;
|
|
rrm_config->pccpch.bch_cctrch.BCH_Power = rrm_config->outer_loop_vars.PCCPCH_POWER;
|
|
rrm_config->outer_loop_vars.alpha = protocol_ms->rrc.ue_bch_blocks.currSIB5.openLoopPowerControl_TDD.alpha;
|
|
rrm_config->outer_loop_vars.PRACH_CNST = protocol_ms->rrc.ue_bch_blocks.currSIB5.openLoopPowerControl_TDD.prach_ConstantValue;
|
|
rrm_config->outer_loop_vars.DPCH_CNST = protocol_ms->rrc.ue_bch_blocks.currSIB5.openLoopPowerControl_TDD.dpch_ConstantValue;
|
|
*/
|
|
|
|
// w NAS : Forward broadcast to NAS -
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg ("[RRC_BCH-UE] DEBUG SIB5 ue_wait_establish_req = %d.\n", protocol_ms->rrc.ue_wait_establish_req );
|
|
#endif
|
|
if (protocol_ms->rrc.ue_wait_establish_req == 0) {
|
|
msg ("\n\n [RRC]-FSM can start - SIB5 with Common Configuration received - \n\n");
|
|
protocol_ms->rrc.ue_wait_establish_req = 1;
|
|
protocol_ms->rrc.ue_broadcast_counter = 1;
|
|
} else {
|
|
if (protocol_ms->rrc.ue_wait_establish_req == 2) {
|
|
rrc_ue_broadcast_encode_nas_sib1 ();
|
|
rrc_ue_write_FIFO (protocol_ms->rrc.NASMessageToXmit);
|
|
protocol_ms->rrc.ue_wait_establish_req = 1;
|
|
}
|
|
}
|
|
protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib5_vt = protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[2].sibSb_Type.type_tag.sysInfoType5;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_ue_bch_process_SIB11 (PERParms * pParms){
|
|
//-----------------------------------------------------------------------------
|
|
/*
|
|
int status = P_SUCCESS;
|
|
if (protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[3].sibSb_Type.type_tag.sysInfoType11
|
|
!= protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib11_vt){
|
|
// skip segment decoding, 1st step works on bytes only
|
|
status = rrc_PERDec_SysInfoType11 (pParms, &(protocol_ms->rrc.ue_bch_blocks.currSIB11));
|
|
if (status != P_SUCCESS){
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg("[RRC_BCH-UE] Decode SIB11 status %d.\n", status);
|
|
#endif
|
|
}else{
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg("[RRC_BCH-UE] Process information from System Information Block 11.\n");
|
|
#endif
|
|
// save data
|
|
// update value tag
|
|
protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib11_vt =
|
|
protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[3].sibSb_Type.type_tag.sysInfoType11;
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_ue_bch_process_SIB14 (PERParms * pParms){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
int i, numslots;
|
|
|
|
// skip segment decoding, 1st step works on bytes only
|
|
status = rrc_PERDec_SysInfoType14 (pParms, &(protocol_ms->rrc.ue_bch_blocks.currSIB14));
|
|
#ifdef DEBUG_RRC_BROADCAST_DETAILS
|
|
msg ("[RRC_BCH-UE] Decode SIB14 status %d.\n", status);
|
|
#endif
|
|
if (status == P_SUCCESS) {
|
|
if (protocol_ms->rrc.ue_bch_blocks.SIB14_timeout == TRUE) {
|
|
numslots = protocol_ms->rrc.ue_bch_blocks.currSIB14.individualTS_InterferenceList.numSlots;
|
|
#ifdef DEBUG_RRC_BROADCAST_DETAILS
|
|
msg ("[RRC_BCH-UE] Process information from System Information Block 14.\n");
|
|
msg ("[RRC_BCH-UE] Expiration Time factor : %d, Number of slots: %d \n", protocol_ms->rrc.ue_bch_blocks.currSIB14.expirationTimeFactor, numslots);
|
|
for (i = 0; i < numslots; i++) {
|
|
msg ("[RRC_BCH-UE] Slot : %d, Interference: %d \n",
|
|
protocol_ms->rrc.ue_bch_blocks.currSIB14.individualTS_InterferenceList.data[i].timeslot,
|
|
protocol_ms->rrc.ue_bch_blocks.currSIB14.individualTS_InterferenceList.data[i].ul_TimeslotInterference);
|
|
}
|
|
#endif
|
|
/* **** REMOVED FOR OPENAIR ****
|
|
// save data
|
|
for (i = 0; i < numslots; i++) {
|
|
rrm_config->outer_loop_vars.IBTS[i] = protocol_ms->rrc.ue_bch_blocks.currSIB14.individualTS_InterferenceList.data[i].ul_TimeslotInterference;
|
|
}
|
|
*/
|
|
// no update of value tag for SIB14
|
|
protocol_ms->rrc.ue_bch_blocks.SIB14_timeout = FALSE;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_ue_bch_process_SIB18 (PERParms * pParms){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
if (protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[5].sibSb_Type.type_tag.sysInfoType18 != protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib18_vt) {
|
|
// skip segment decoding, 1st step works on bytes only
|
|
status = rrc_PERDec_SysInfoType18 (pParms, &(protocol_ms->rrc.ue_bch_blocks.currSIB18));
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Decode SIB18 status %d.\n", status);
|
|
#endif
|
|
if (status == P_SUCCESS) {
|
|
#ifdef DEBUG_RRC_BROADCAST
|
|
msg ("[RRC_BCH-UE] Process information from System Information Block 18.\n");
|
|
msg ("[RRC_BCH-UE] Neighbour cells list.");
|
|
rrc_print_buffer ((char *) &protocol_ms->rrc.ue_bch_blocks.currSIB18.cellIdentities.data, protocol_ms->rrc.ue_bch_blocks.currSIB18.cellIdentities.numocts);
|
|
msg ("[RRC_BCH-UE] data <<%s>>\n", (char *) &protocol_ms->rrc.ue_bch_blocks.currSIB18.cellIdentities.data);
|
|
msg ("[RRC_BCH-UE] Code groups, cell 1 %d, cell 2 %d. \n",
|
|
protocol_ms->rrc.ue_bch_blocks.currSIB18.cellCodegroups.data[0], protocol_ms->rrc.ue_bch_blocks.currSIB18.cellCodegroups.data[1]);
|
|
#endif
|
|
rrc_ue_read_neighboring_cells_info ();
|
|
rrc_ue_broadcast_encode_nas_sib18 ();
|
|
rrc_ue_write_FIFO (protocol_ms->rrc.NASMessageToXmit);
|
|
// update value tag
|
|
protocol_ms->rrc.ue_bch_blocks.bch_ue_vts.sib18_vt = protocol_ms->rrc.ue_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[5].sibSb_Type.type_tag.sysInfoType18;
|
|
}
|
|
}
|
|
}
|