Files
openairinterface5g/openair2/RRC/CELLULAR/rrc_ue_bch_process.c
T
2013-06-25 09:05:02 +00:00

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