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

173 lines
6.3 KiB
C
Executable File

/***************************************************************************
rrc_ue_mbms_process.c - description
-------------------
begin : May 30, 2005
copyright : (C) 2005, 2010 by Eurecom
created by : Huu-Nghia.Nguyen@eurecom.fr
modified by : Michelle.Wetterwald@eurecom.fr
**************************************************************************
This file implements Interface procedures for UE
**************************************************************************/
/********************
//OpenAir definitions
********************/
#include "LAYER2/MAC/extern.h"
#include "UTIL/MEM/mem_block.h"
/********************
// RRC definitions
********************/
#include "rrc_ue_vars.h"
#include "rrc_mbms_pdus.h"
#include "rrc_msg_class.h"
#include "rrc_ue_mbms_variables.h"
//-----------------------------------------------------------------------------
#include "rrc_proto_mbms.h"
rrc_ue_mbms_variables * volatile p_ue_mbms; /** pointer reference to protocol_ms->rrc.mbms */
/**
* @brief Init the UE side mbms variables
* @date May 27, 2005 6:45:24 PM
*/
//-----------------------------------------------------------------------------
void rrc_ue_mbms_init(void){
//-----------------------------------------------------------------------------
#ifdef DEBUG_RRC_STATE
msg("[RRC-UE][MBMS] START OF MBMS INITIALISATION.......................\n");
#endif
p_ue_mbms = &protocol_ms->rrc.mbms;
memset(p_ue_mbms, 0, sizeof(rrc_ue_mbms_variables));
#ifdef DEBUG_RRC_STATE
msg("[RRC-UE][MBMS] Allow the procedure MBMS PTM RB Configuration\n");
#endif
p_ue_mbms->initialised = FALSE;
p_ue_mbms->mustAcquireRBInfo = TRUE;
p_ue_mbms->modifPeriodCoef = MODIF_PERIOD_COEF_DEFAULT;
rrc_ue_mbms_fsm_reset();
rrc_ue_mbms_fsm(); //Enter the state machine.
#ifdef DEBUG_RRC_STATE
msg("[RRC-UE][MBMS] END OF MBMS INITIALISATION\n\n");
#endif
}
/**
* @brief Reset all flags and signals for a new modification period
* @date May 31, 2005 4:52:48 PM
* @see rrc_ue_mbms_advance_time()
*/
//-----------------------------------------------------------------------------
void rrc_ue_mbms_activate_modification_period(void){
//-----------------------------------------------------------------------------
int i;
#ifdef DEBUG_RRC_MBMS
msg("\033[31m\n**************************************************\033[0m\n");
msg("[RRC-UE][MBMS] START A NEW MODIFICATION PERIOD at frame %d \n", protocol_ms->rrc.current_SFN);
#endif
//If this is the first time, we didn't have the RB info, we must acquire it. Otherwise we reset it to FALSE
p_ue_mbms->mustAcquireRBInfo = !p_ue_mbms->initialised;
memset(&p_ue_mbms->flags, 0, sizeof(p_ue_mbms->flags)); //Clear flags
RRC_UE_MBMS_I_MODIF_PERIOD_ENDED();
rrc_ue_mbms_fsm();
//Print a list of MBMS Activated Services:
#ifdef DEBUG_RRC_MBMS
msg("[RRC-UE][MBMS] MBMS Activated Services: { ");
for (i = 0; i<p_ue_mbms->act_numService; i++){
msg(" service%d/", p_ue_mbms->act_serviceIdentity[i]);
if (p_ue_mbms->act_activated[i])
msg("active");
else
msg("standby");
}
msg(" }\n");
#endif
}
/**
* @brief check for the modification period
* @warning the counter p_ue_mbms->curr_modif_counter will be synchronize with RG when
* decoding the MBMS Modified Services Information message.
* @date May 31, 2005 11:24:19 AM
*/
//-----------------------------------------------------------------------------
void rrc_ue_mbms_scheduling_check(void){
//-----------------------------------------------------------------------------
if (protocol_ms->rrc.current_SFN % (1 << p_ue_mbms->modifPeriodCoef) == 0)
rrc_ue_mbms_activate_modification_period();
}
/**
* @brief Local function, used to print out the list of modified services
* @date Jul 29, 2005 10:24:11 AM
*/
//-----------------------------------------------------------------------------
void rrc_ue_mbms_modif_services_print(void){
//-----------------------------------------------------------------------------
int i;
msg("[RRC-UE][MBMS] MBMS Modified Services: \n");
for (i = 0; i< p_ue_mbms->mod_numService; i++){
msg("[RRC-UE][MBMS]\t\t service id = %d, required action = ", p_ue_mbms->mod_serviceIdentity[i]);
switch (p_ue_mbms->mod_requiredUEAction[i]){
case Mod_none: msg("None\n"); break;
case Mod_acquirePTM_RBInfo: msg("Acquire PTM RB Info\n"); break;
case Mod_releasePTM_RB: msg("Release PTM RB Info\n"); break;
}
}
}
/**
* @brief Local function, used to print out the status of activated services
* @date Sept 06, 2006
*/
//-----------------------------------------------------------------------------
void rrc_ue_mbms_status_services_print(void){
//-----------------------------------------------------------------------------
#ifdef DEBUG_RRC_MBMS_STATUS
int i;
//Print the list of MBMS broadcasted services
msg("[RRC-UE][MBMS] MBMS Started Services: \n");
for (i = 0; i< maxMBMSServices; i++){
msg("[RRC-UE][MBMS]\t\t service id = %d, activated = ", i+1);
switch (p_ue_mbms->act_activated[i]){
case TRUE : msg("YES\n"); break;
case FALSE : msg("NO\n"); break;
default: msg("UNDEFINED\n"); break;
}
}
//Print a list of MBMS Activated Services:
msg("[RRC-UE][MBMS] MBMS Activated Services: { ");
for (i = 0; i<p_ue_mbms->act_numService; i++){
msg(" service%d/", p_ue_mbms->act_serviceIdentity[i]);
if (p_ue_mbms->act_activated[i]) msg("active");
else msg("standby");
}
msg(" }\n");
#endif
}
//-----------------------------------------------------------------------------
const char * rrc_mbms_message_getName(int channelID, char* pmsg, int msgtype){
//-----------------------------------------------------------------------------
const char * mcch_message_name[8] = {"", "AccessInfomation", "CommonPTMRBInformation", "CurrentCellPTMRBInformation", "GeneralInformation", "ModifiedServicesInformation", "NeighbouringCellPTMRBInformation", "UnmodifiedServicesInformation" };
switch (channelID){
case DCCH_ID:
return "ModifiedServicesInformation";
case MCCH_ID:
if (pmsg != NULL) return mcch_message_name[((MCCH_Message*) pmsg)->message.type];
else return mcch_message_name[msgtype];
case MSCH_ID:
return "SchedulingInformation";
default:
return "Unrecognized";
}
}