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

514 lines
24 KiB
C
Executable File

/***************************************************************************
rrc_rg_bch_init.c - description
-------------------
begin : Aug 30, 2002
copyright : (C) 2002, 2010 by Eurecom
email : Michelle.Wetterwald@eurecom.fr
**************************************************************************
Procedures to call initial encoding of SIBs
***************************************************************************/
/********************
//OpenAir definitions
********************/
#include "LAYER2/MAC/extern.h"
#include "UTIL/MEM/mem_block.h"
/********************
// RRC definitions
********************/
#include "rrc_rg_vars.h"
#include "rrc_bch_mib.h"
//-----------------------------------------------------------------------------
#include "rrc_proto_int.h"
#include "rrc_proto_intf.h"
#include "rrc_proto_bch.h"
//-----------------------------------------------------------------------------
void rrc_rg_init_bch (void){
//-----------------------------------------------------------------------------
protocol_bs->rrc.rg_bch_blocks.sib_list[0] = systemInformationBlockType1;
protocol_bs->rrc.rg_bch_blocks.sib_list[1] = systemInformationBlockType2;
protocol_bs->rrc.rg_bch_blocks.sib_list[2] = systemInformationBlockType5;
protocol_bs->rrc.rg_bch_blocks.sib_list[3] = systemInformationBlockType11;
protocol_bs->rrc.rg_bch_blocks.sib_list[4] = systemInformationBlockType14;
protocol_bs->rrc.rg_bch_blocks.sib_list[5] = systemInformationBlockType18;
protocol_bs->rrc.rg_bch_blocks.SIB1_oneTimeShot = FALSE;
protocol_bs->rrc.rg_bch_blocks.SIB14_timeout = (2 << SIB14_REP) * SIB14_TFACTOR;
}
//-----------------------------------------------------------------------------
void rrc_fill_mib (void){
//-----------------------------------------------------------------------------
MasterInformationBlock *pmib;
pmib = &(protocol_bs->rrc.rg_bch_blocks.currMIB);
pmib->mib_ValueTag = 0;
// hard coded in first step
pmib->plmn_Identity.mcc.numDigits = 3;
pmib->plmn_Identity.mcc.elem[0] = 1;
pmib->plmn_Identity.mcc.elem[1] = 4;
pmib->plmn_Identity.mcc.elem[2] = 9;
pmib->plmn_Identity.mnc = protocol_bs->rrc.rg_cell_id;
// pmib->plmn_Identity.mnc.numDigits=2;
// pmib->plmn_Identity.mnc.elem[0]=5;
// pmib->plmn_Identity.mnc.elem[1]=8;
// initialize with default value
pmib->sibSb_ReferenceList.numSIB = supportedSIBs; // number SIBs supported
pmib->sibSb_ReferenceList.sib_ref[0].sibSb_Type.type = SIBSb_sysInfoType1;
pmib->sibSb_ReferenceList.sib_ref[0].sibSb_Type.type_tag.sysInfoType1 = 0;
pmib->sibSb_ReferenceList.sib_ref[0].scheduling.scheduling_sib_rep.sib_Rep = SIB1_REP;
pmib->sibSb_ReferenceList.sib_ref[0].scheduling.scheduling_sib_rep.sib_Pos = SIB1_POS;
pmib->sibSb_ReferenceList.sib_ref[1].sibSb_Type.type = SIBSb_sysInfoType2;
pmib->sibSb_ReferenceList.sib_ref[1].sibSb_Type.type_tag.sysInfoType2 = 0;
pmib->sibSb_ReferenceList.sib_ref[1].scheduling.scheduling_sib_rep.sib_Rep = SIB2_REP;
pmib->sibSb_ReferenceList.sib_ref[1].scheduling.scheduling_sib_rep.sib_Pos = SIB2_POS;
pmib->sibSb_ReferenceList.sib_ref[2].sibSb_Type.type = SIBSb_sysInfoType5;
pmib->sibSb_ReferenceList.sib_ref[2].sibSb_Type.type_tag.sysInfoType5 = 0;
pmib->sibSb_ReferenceList.sib_ref[2].scheduling.scheduling_sib_rep.sib_Rep = SIB5_REP;
pmib->sibSb_ReferenceList.sib_ref[2].scheduling.scheduling_sib_rep.sib_Pos = SIB5_POS;
pmib->sibSb_ReferenceList.sib_ref[3].sibSb_Type.type = SIBSb_sysInfoType11;
pmib->sibSb_ReferenceList.sib_ref[3].sibSb_Type.type_tag.sysInfoType11 = 0;
pmib->sibSb_ReferenceList.sib_ref[3].scheduling.scheduling_sib_rep.sib_Rep = SIB11_REP;
pmib->sibSb_ReferenceList.sib_ref[3].scheduling.scheduling_sib_rep.sib_Pos = SIB11_POS;
pmib->sibSb_ReferenceList.sib_ref[4].sibSb_Type.type = SIBSb_sysInfoType14;
//no value_tag for SIB14
pmib->sibSb_ReferenceList.sib_ref[4].scheduling.scheduling_sib_rep.sib_Rep = SIB14_REP;
pmib->sibSb_ReferenceList.sib_ref[4].scheduling.scheduling_sib_rep.sib_Pos = SIB14_POS;
pmib->sibSb_ReferenceList.sib_ref[5].sibSb_Type.type = SIBSb_sysInfoType18;
pmib->sibSb_ReferenceList.sib_ref[5].sibSb_Type.type_tag.sysInfoType18 = 0;
pmib->sibSb_ReferenceList.sib_ref[5].scheduling.scheduling_sib_rep.sib_Rep = SIB18_REP;
pmib->sibSb_ReferenceList.sib_ref[5].scheduling.scheduling_sib_rep.sib_Pos = SIB18_POS;
}
//-----------------------------------------------------------------------------
void rrc_init_mib (void){
//-----------------------------------------------------------------------------
int value_tag;
// Prepare
int status = P_SUCCESS;
MasterInformationBlock *pMIB = &(protocol_bs->rrc.rg_bch_blocks.currMIB);
PERParms *pParms = &(protocol_bs->rrc.rg_bch_blocks.perParms);
char *pBuffer = (char *) &(protocol_bs->rrc.rg_bch_blocks.encoded_currMIB);
rrc_new_per_parms (pParms, pBuffer);
// Update value_tag
value_tag = protocol_bs->rrc.rg_bch_blocks.currMIB.mib_ValueTag;
value_tag = (++value_tag) % 8;
protocol_bs->rrc.rg_bch_blocks.currMIB.mib_ValueTag = value_tag;
// Encode MIB
status = rrc_PEREnc_MasterInformationBlock (pParms, pMIB);
#ifdef DEBUG_RRC_BROADCAST
msg ("\n[RRC_BCH] Init MIB result - status : %d\n", status);
rrc_print_per_parms (pParms);
#endif
}
//-----------------------------------------------------------------------------
void rrc_fill_sib1 (void){
//-----------------------------------------------------------------------------
// hard coded in first step
char bufferNAS[] = "NoData in SIB1";
char bufferTimer[] = "KLMNOPQR";
protocol_bs->rrc.rg_bch_blocks.currSIB1.subnet_NAS_SysInfo.numocts = strlen (bufferNAS);
memcpy (protocol_bs->rrc.rg_bch_blocks.currSIB1.subnet_NAS_SysInfo.data, bufferNAS, strlen (bufferNAS));
// protocol_bs->rrc.rg_bch_blocks.currSIB1.subnet_NAS_SysInfo.data[1]= "a";
protocol_bs->rrc.rg_bch_blocks.currSIB1.ue_TimersAndConstants.numocts = 8;
memcpy (protocol_bs->rrc.rg_bch_blocks.currSIB1.ue_TimersAndConstants.data, bufferTimer, 8);
}
//-----------------------------------------------------------------------------
void rrc_update_SIB1_period (int period){
//-----------------------------------------------------------------------------
MasterInformationBlock *pmib = &(protocol_bs->rrc.rg_bch_blocks.currMIB);
if (period == 0) {
protocol_bs->rrc.rg_bch_blocks.SIB1_oneTimeShot = TRUE;
} else {
if (period < 192) {
pmib->sibSb_ReferenceList.sib_ref[0].scheduling.scheduling_sib_rep.sib_Rep = SchedulingInformation_scheduling_rep128;
} else {
if (period < 320) {
pmib->sibSb_ReferenceList.sib_ref[0].scheduling.scheduling_sib_rep.sib_Rep = SchedulingInformation_scheduling_rep256;
} else {
pmib->sibSb_ReferenceList.sib_ref[0].scheduling.scheduling_sib_rep.sib_Rep = SchedulingInformation_scheduling_rep512;
}
}
}
}
//-----------------------------------------------------------------------------
void rrc_init_sib1 (void){
//-----------------------------------------------------------------------------
int value_tag;
// Prepare
int status = P_SUCCESS;
SysInfoType1 *pSIB1 = &(protocol_bs->rrc.rg_bch_blocks.currSIB1);
PERParms *pParms = &(protocol_bs->rrc.rg_bch_blocks.perParms);
char *pBuffer = (char *) &(protocol_bs->rrc.rg_bch_blocks.encoded_currSIB1);
rrc_new_per_parms (pParms, pBuffer);
// Encode
status = rrc_PEREnc_SysInfoType1 (pParms, pSIB1);
#ifdef DEBUG_RRC_BROADCAST
msg ("[RRC_BCH] Init SIB1 result - status : %d\n", status);
rrc_print_per_parms (pParms);
#endif
// Update value_tag and MIB
value_tag = protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[0].sibSb_Type.type_tag.sysInfoType1;
value_tag = (++value_tag) % 256;
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[0].sibSb_Type.type_tag.sysInfoType1 = value_tag;
protocol_bs->rrc.rg_bch_blocks.encodedSIB1_lgth = pParms->buff_size;
if ((protocol_bs->rrc.rg_bch_blocks.encodedSIB1_lgth % LSIBfixed) == 0)
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[0].scheduling.segCount = (protocol_bs->rrc.rg_bch_blocks.encodedSIB1_lgth / LSIBfixed);
else
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[0].scheduling.segCount = (protocol_bs->rrc.rg_bch_blocks.encodedSIB1_lgth / LSIBfixed) + 1;
rrc_init_mib ();
}
//-----------------------------------------------------------------------------
void rrc_fill_sib2 (void){
//-----------------------------------------------------------------------------
// // hard coded in first step
// int i;
// char IPAddr[] = "1234123412341234";
// char a;
//
// for (i=0;i<16;i++){
// a= IPAddr[i];
// protocol_bs->rrc.rg_bch_blocks.currSIB2.net_IP_addr.data[i]= a;
// }
}
//-----------------------------------------------------------------------------
void rrc_init_sib2 (void){
//-----------------------------------------------------------------------------
// int value_tag;
// // Prepare
int status = P_SUCCESS;
// SysInfoType2* pSIB2 = &(protocol_bs->rrc.rg_bch_blocks.currSIB2);
// PERParms* pParms = &(protocol_bs->rrc.rg_bch_blocks.perParms);
// char * pBuffer = (char *) & (protocol_bs->rrc.rg_bch_blocks.encoded_currSIB2);
// rrc_new_per_parms (pParms, pBuffer);
// // Encode
// status = rrc_PEREnc_SysInfoType2 (pParms, pSIB2);
//
#ifdef DEBUG_RRC_BROADCAST
msg ("[RRC_BCH] Init SIB2 result (removed) - status : %d\n\n", status);
// rrc_print_per_parms(pParms);
#endif
// // Update value_tag and MIB
// value_tag = protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[1].sibSb_Type.type_tag.sysInfoType2;
// value_tag = (++ value_tag)%4;
// protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[1].sibSb_Type.type_tag.sysInfoType2
// = value_tag;
// protocol_bs->rrc.rg_bch_blocks.encodedSIB2_lgth = pParms->buff_size;
// if ((protocol_bs->rrc.rg_bch_blocks.encodedSIB2_lgth % LSIBfixed) ==0)
// protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[1].scheduling.segCount
// = (protocol_bs->rrc.rg_bch_blocks.encodedSIB2_lgth / LSIBfixed);
// else
// protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[1].scheduling.segCount
// = (protocol_bs->rrc.rg_bch_blocks.encodedSIB2_lgth / LSIBfixed) + 1;
// rrc_init_mib();
}
//-----------------------------------------------------------------------------
void rrc_fill_sib5 (void){
//-----------------------------------------------------------------------------
/*
u8 rachfach_conf[]="I'm not thinking about retiring at this point, so my focus is on coming back and figuring out how to get back here. \
I don't think anybody's going to question why I'm coming back next year.";
//size 195
*/
// u8 rachfach_conf[]="I'm not thinking about retiring at this point.";
//size 45 - TEMP : SIB5 content to be revised
int config_length;
char* config_ptr=NULL;
u8 error_message[] = "ERROR-SIB5";
// Fill SCCPCH-PRACH config
//protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts=strlen(rachfach_conf);
//protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts = sizeof (SCCPCH_SYSTEM_INFO) + sizeof (PRACH_SYSTEM_INFO);
rrc_rg_get_common_config_SIB(&config_length, &config_ptr);
#ifdef DEBUG_RRC_DETAILS
//msg ("\n[RRC-RG] rrc_fill_sib5 config pointer %p \n", config_ptr);
#endif
protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts = config_length;
#ifdef DEBUG_RRC_STATE
msg ("[RRC] Fill SIB5 : config length = %d\n", protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts);
#endif
if (protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts <= maxBlock - 8) {
// For test only
// memcpy(protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.data,rachfach_conf,
// protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts);
//memcpy (protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.data, (char *) &(rrm_config->sccpch), sizeof (SCCPCH_SYSTEM_INFO) + sizeof (PRACH_SYSTEM_INFO));
memcpy(protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.data, config_ptr, config_length);
} else {
msg ("[RRC] Fill SIB5 : config length too long \n\n");
protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts = strlen (error_message);
memcpy (protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.data, error_message, protocol_bs->rrc.rg_bch_blocks.currSIB5.prach_sCCPCH_SIList.numocts);
}
// Fill OpenLoopPowerControl_TDD with initial values
protocol_bs->rrc.rg_bch_blocks.currSIB5.openLoopPowerControl_TDD.primaryCCPCH_TX_Power
// = rrm_config->outer_loop_vars.PCCPCH_POWER;
= 25;
protocol_bs->rrc.rg_bch_blocks.currSIB5.openLoopPowerControl_TDD.alpha
// = rrm_config->outer_loop_vars.alpha;
= 4;
protocol_bs->rrc.rg_bch_blocks.currSIB5.openLoopPowerControl_TDD.prach_ConstantValue
// = rrm_config->outer_loop_vars.PRACH_CNST;
= -13;
protocol_bs->rrc.rg_bch_blocks.currSIB5.openLoopPowerControl_TDD.dpch_ConstantValue
// = rrm_config->outer_loop_vars.DPCH_CNST;
= 5;
}
//-----------------------------------------------------------------------------
void rrc_init_sib5 (void){
//-----------------------------------------------------------------------------
int value_tag;
// Prepare
int status = P_SUCCESS;
SysInfoType5 *pSIB5 = &(protocol_bs->rrc.rg_bch_blocks.currSIB5);
PERParms *pParms = &(protocol_bs->rrc.rg_bch_blocks.perParms);
char *pBuffer = (char *) &(protocol_bs->rrc.rg_bch_blocks.encoded_currSIB5);
rrc_new_per_parms (pParms, pBuffer);
// Encode
status = rrc_PEREnc_SysInfoType5 (pParms, pSIB5);
#ifdef DEBUG_RRC_BROADCAST
msg ("[RRC_BCH] Init SIB5 result - status : %d\n", status);
rrc_print_per_parms (pParms);
#endif
if (status != 0){
msg ("\n\n[RRC_BCH] Init SIB5 result - WCDMA_ERROR_RRC_NASTY_BCH_CONFIG : %d\n\n", status);
//wcdma_handle_error (WCDMA_ERROR_RRC_NASTY_BCH_CONFIG);
}
// Update value_tag and MIB
value_tag = protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[2].sibSb_Type.type_tag.sysInfoType5;
value_tag = (++value_tag) % 4;
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[2].sibSb_Type.type_tag.sysInfoType5 = value_tag;
protocol_bs->rrc.rg_bch_blocks.encodedSIB5_lgth = pParms->buff_size;
if ((protocol_bs->rrc.rg_bch_blocks.encodedSIB5_lgth % LSIBfixed) == 0)
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[2].scheduling.segCount = (protocol_bs->rrc.rg_bch_blocks.encodedSIB5_lgth / LSIBfixed);
else
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[2].scheduling.segCount = (protocol_bs->rrc.rg_bch_blocks.encodedSIB5_lgth / LSIBfixed) + 1;
rrc_init_mib ();
}
//-----------------------------------------------------------------------------
void rrc_fill_sib11 (void){
//-----------------------------------------------------------------------------
// // hard coded in first step
// u8 rachfach_conf[]= "6666666666777777777700000000008888888888999999999912121212121212121212343434343434343434345555555555";
//
// protocol_bs->rrc.rg_bch_blocks.currSIB11.prach_sCCPCH_SIList.numocts=98;
//// for (i=0;i<35;i++)
//// protocol_bs->rrc.rg_bch_blocks.currSIB11.ue_TimersAndConstants.data[i]=bufferTimer[i];
// memcpy(protocol_bs->rrc.rg_bch_blocks.currSIB11.prach_sCCPCH_SIList.data,rachfach_conf,
// protocol_bs->rrc.rg_bch_blocks.currSIB11.prach_sCCPCH_SIList.numocts);
}
//-----------------------------------------------------------------------------
void rrc_init_sib11 (void){
//-----------------------------------------------------------------------------
// int value_tag;
// Prepare
int status = P_SUCCESS;
// SysInfoType11* pSIB11 = &(protocol_bs->rrc.rg_bch_blocks.currSIB11);
// PERParms* pParms = &(protocol_bs->rrc.rg_bch_blocks.perParms);
// char * pBuffer = (char *) & (protocol_bs->rrc.rg_bch_blocks.encoded_currSIB11);
// rrc_new_per_parms (pParms, pBuffer);
// // Encode
// status = rrc_PEREnc_SysInfoType11 (pParms, pSIB11);
#ifdef DEBUG_RRC_BROADCAST
msg ("[RRC_BCH] Init SIB11 result (not implemented yet)- status : %d\n\n", status);
//rrc_print_per_parms(pParms);
#endif
// Update value_tag and MIB
// value_tag = protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[3].sibSb_Type.type_tag.sysInfoType11;
// value_tag = (++ value_tag)%4;
// protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[3].sibSb_Type.type_tag.sysInfoType11
// = value_tag;
// protocol_bs->rrc.rg_bch_blocks.encodedSIB11_lgth = pParms->buff_size;
// if ((protocol_bs->rrc.rg_bch_blocks.encodedSIB11_lgth % LSIBfixed) ==0)
// protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[3].scheduling.segCount
// = (protocol_bs->rrc.rg_bch_blocks.encodedSIB11_lgth / LSIBfixed);
// else
// protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[3].scheduling.segCount
// = (protocol_bs->rrc.rg_bch_blocks.encodedSIB11_lgth / LSIBfixed) + 1;
// rrc_init_mib();
}
//-----------------------------------------------------------------------------
void rrc_fill_sib14 (void){
//-----------------------------------------------------------------------------
int i = 0;
SysInfoType14 *psib14 = &(protocol_bs->rrc.rg_bch_blocks.currSIB14);
psib14->expirationTimeFactor = SIB14_TFACTOR;
psib14->individualTS_InterferenceList.numSlots = 15;
for (i = 0; i < psib14->individualTS_InterferenceList.numSlots; i++) {
psib14->individualTS_InterferenceList.data[i].timeslot = i;
}
/* **** REMOVED FOR OPENAIR ****
for (i = 0; i < psib14->individualTS_InterferenceList.numSlots; i++) {
// psib14->individualTS_InterferenceList.data[i].ul_TimeslotInterference = rrm_config->outer_loop_vars.IBTS[i];
psib14->individualTS_InterferenceList.data[i].ul_TimeslotInterference = (5*i)-110;
}
//msg(" *****Trace fill sib14 rrm_config->outer_loop_vars.IBTS[1]= %d; \n",rrm_config->outer_loop_vars.IBTS[1]);
*/
//For test
psib14->individualTS_InterferenceList.data[0].ul_TimeslotInterference=-110;
psib14->individualTS_InterferenceList.data[1].ul_TimeslotInterference=-105;
psib14->individualTS_InterferenceList.data[2].ul_TimeslotInterference=-100;
psib14->individualTS_InterferenceList.data[3].ul_TimeslotInterference=-95;
psib14->individualTS_InterferenceList.data[4].ul_TimeslotInterference=-90;
psib14->individualTS_InterferenceList.data[5].ul_TimeslotInterference=-85;
psib14->individualTS_InterferenceList.data[6].ul_TimeslotInterference=-80;
psib14->individualTS_InterferenceList.data[7].ul_TimeslotInterference=-75;
psib14->individualTS_InterferenceList.data[8].ul_TimeslotInterference=-70;
psib14->individualTS_InterferenceList.data[9].ul_TimeslotInterference=-65;
psib14->individualTS_InterferenceList.data[10].ul_TimeslotInterference=-60;
psib14->individualTS_InterferenceList.data[11].ul_TimeslotInterference=-55;
psib14->individualTS_InterferenceList.data[12].ul_TimeslotInterference=-100;
psib14->individualTS_InterferenceList.data[13].ul_TimeslotInterference=-75;
psib14->individualTS_InterferenceList.data[14].ul_TimeslotInterference=-52;
}
//-----------------------------------------------------------------------------
void rrc_init_sib14 (void){
//-----------------------------------------------------------------------------
// Prepare
int status = P_SUCCESS;
SysInfoType14 *pSIB14 = &(protocol_bs->rrc.rg_bch_blocks.currSIB14);
PERParms *pParms = &(protocol_bs->rrc.rg_bch_blocks.perParms);
char *pBuffer = (char *) &(protocol_bs->rrc.rg_bch_blocks.encoded_currSIB14);
rrc_new_per_parms (pParms, pBuffer);
// Encode
status = rrc_PEREnc_SysInfoType14 (pParms, pSIB14);
#ifdef DEBUG_RRC_BROADCAST
msg ("[RRC_BCH] Init SIB14 result - status : %d\n", status);
rrc_print_per_parms (pParms);
#endif
// value_tag not updated - controlled by time-out
protocol_bs->rrc.rg_bch_blocks.encodedSIB14_lgth = pParms->buff_size;
if ((protocol_bs->rrc.rg_bch_blocks.encodedSIB14_lgth % LSIBfixed) == 0)
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[4].scheduling.segCount = (protocol_bs->rrc.rg_bch_blocks.encodedSIB14_lgth / LSIBfixed);
else
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[4].scheduling.segCount = (protocol_bs->rrc.rg_bch_blocks.encodedSIB14_lgth / LSIBfixed) + 1;
rrc_init_mib ();
}
//-----------------------------------------------------------------------------
void rrc_fill_sib18 (void){
//-----------------------------------------------------------------------------
// warning SIB18 currently a short SIB ==> length < 110 bytes
/*
u8 cells_list[]="This is the initial setting of cell list = dummy.";
//size 48
*/
u8 cells_list[] = "NoData in SIB18";
u8 error_message[] = "ERROR-SIB18";
protocol_bs->rrc.rg_bch_blocks.currSIB18.cellIdentities.numocts = strlen (cells_list);
if (protocol_bs->rrc.rg_bch_blocks.currSIB18.cellIdentities.numocts <= 110) {
memcpy (protocol_bs->rrc.rg_bch_blocks.currSIB18.cellIdentities.data, cells_list, protocol_bs->rrc.rg_bch_blocks.currSIB18.cellIdentities.numocts);
} else {
protocol_bs->rrc.rg_bch_blocks.currSIB18.cellIdentities.numocts = strlen (error_message);
memcpy (protocol_bs->rrc.rg_bch_blocks.currSIB18.cellIdentities.data, error_message, protocol_bs->rrc.rg_bch_blocks.currSIB18.cellIdentities.numocts);
}
//CodeGroups currently hard-coded for 2 cells
protocol_bs->rrc.rg_bch_blocks.currSIB18.cellCodegroups.data[0] = 0;
protocol_bs->rrc.rg_bch_blocks.currSIB18.cellCodegroups.data[1] = 14;
}
//-----------------------------------------------------------------------------
void rrc_init_sib18 (void){
//-----------------------------------------------------------------------------
int value_tag;
// Prepare
int status = P_SUCCESS;
SysInfoType18 *pSIB18 = &(protocol_bs->rrc.rg_bch_blocks.currSIB18);
PERParms *pParms = &(protocol_bs->rrc.rg_bch_blocks.perParms);
char *pBuffer = (char *) &(protocol_bs->rrc.rg_bch_blocks.encoded_currSIB18);
rrc_new_per_parms (pParms, pBuffer);
// Encode
status = rrc_PEREnc_SysInfoType18 (pParms, pSIB18);
#ifdef DEBUG_RRC_BROADCAST
msg ("[RRC_BCH] Init SIB18 result - status : %d\n", status);
rrc_print_per_parms (pParms);
#endif
// Update value_tag and MIB
value_tag = protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[5].sibSb_Type.type_tag.sysInfoType18;
value_tag = (++value_tag) % 4;
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[5].sibSb_Type.type_tag.sysInfoType18 = value_tag;
protocol_bs->rrc.rg_bch_blocks.encodedSIB18_lgth = pParms->buff_size;
if ((protocol_bs->rrc.rg_bch_blocks.encodedSIB18_lgth % LSIBfixed) == 0)
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[5].scheduling.segCount = (protocol_bs->rrc.rg_bch_blocks.encodedSIB18_lgth / LSIBfixed);
else
protocol_bs->rrc.rg_bch_blocks.currMIB.sibSb_ReferenceList.sib_ref[5].scheduling.segCount = (protocol_bs->rrc.rg_bch_blocks.encodedSIB18_lgth / LSIBfixed) + 1;
rrc_init_mib ();
}
//-----------------------------------------------------------------------------
void rrc_update_SIB18_period (int period){
//-----------------------------------------------------------------------------
MasterInformationBlock *pmib = &(protocol_bs->rrc.rg_bch_blocks.currMIB);
if (period < 150) {
pmib->sibSb_ReferenceList.sib_ref[5].scheduling.scheduling_sib_rep.sib_Rep = SchedulingInformation_scheduling_rep128;
} else {
if (period < 320) {
pmib->sibSb_ReferenceList.sib_ref[5].scheduling.scheduling_sib_rep.sib_Rep = SchedulingInformation_scheduling_rep256;
} else {
pmib->sibSb_ReferenceList.sib_ref[5].scheduling.scheduling_sib_rep.sib_Rep = SchedulingInformation_scheduling_rep512;
}
}
}
//-----------------------------------------------------------------------------
void rrc_init_blocks (void){
//-----------------------------------------------------------------------------
// read configuration file and create MIB/SIBs data
rrc_fill_mib ();
rrc_fill_sib1 ();
rrc_fill_sib2 ();
rrc_fill_sib5 ();
rrc_fill_sib11 ();
rrc_fill_sib14 ();
rrc_fill_sib18 ();
// encode MIB/SIBs
rrc_init_sib1 ();
rrc_init_sib2 ();
rrc_init_sib5 ();
rrc_init_sib11 ();
rrc_init_sib14 ();
rrc_init_sib18 ();
// rrc_init_mib();
protocol_bs->rrc.rg_bch_blocks.curr_block_type = NO_BLOCK;
protocol_bs->rrc.rg_bch_blocks.next_block_type = NO_BLOCK;
}