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

655 lines
28 KiB
C
Executable File

/***************************************************************************
rrc_ue_msg_peer.c - description
-------------------
begin : Jan 6, 2003
copyright : (C) 2003, 2010 by Eurecom
email : Michelle.Wetterwald@eurecom.fr
**************************************************************************
Procedures to perform encoding/decoding of RRC messages in UE
***************************************************************************/
/********************
//OpenAir definitions
********************/
#include "LAYER2/MAC/extern.h"
#include "UTIL/MEM/mem_block.h"
/********************
// RRC definitions
********************/
#include "rrc_ue_vars.h"
#include "rrc_msg_class.h"
// A verifier
// #include "rrc_msg_pdus.h"
// #include "rrc_msg_constant.h"
//-----------------------------------------------------------------------------
#include "rrc_proto_msg.h"
#include "rrc_proto_int.h"
/**************************************************************/
/* Uplink CCCH messages - Encode */
/**************************************************************/
//-----------------------------------------------------------------------------
/* RRC Connection Request */
void rrc_ue_msg_connreq(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_CCCH_Message * ul_ccch_msg;
mem_block_t *p;
if (!protocol_ms->rrc.establishment_cause)
protocol_ms->rrc.establishment_cause = registration;
else
protocol_ms->rrc.establishment_cause = callRe_establishment;
protocol_ms->rrc.prot_error_indicator = noError;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(RRCConnectionRequest);
// Temp - Test/Messages
// ul_ccch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_ccch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
// //
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_ccch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_ccch_msg = (struct UL_CCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_ccch_msg;
// Encode
ul_ccch_msg->integrityCheckInfo = 0; // No check with RRC Connection Request
ul_ccch_msg->message.type = UL_CCCH_rrcConnectionRequest;
status = rrc_PEREnc_RRCConnectionRequest((RRCConnectionRequest*) &(ul_ccch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Connection Request - status : %d\n", status);
msg("\n[RRC_MSG] Connection Request - length : %d\n", protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
//-----------------------------------------------------------------------------
/* Cell Update */
void rrc_ue_msg_cellUpdate(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_CCCH_Message * ul_ccch_msg;
mem_block_t *p;
// Temp : Hard coded values
protocol_ms->rrc.am_RLC_ErrorIndicationRb2_3or4 = FALSE;
protocol_ms->rrc.am_RLC_ErrorIndicationRb5orAbove = FALSE;
protocol_ms->rrc.cellUpdateCause = re_enteredServiceArea;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(CellUpdate);
// Temp - Test/Messages
//ul_ccch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
//memset (ul_ccch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
//
//protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_ccch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_ccch_msg = (struct UL_CCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_ccch_msg;
// Encode
ul_ccch_msg->integrityCheckInfo = 123;
ul_ccch_msg->message.type = UL_CCCH_cellUpdate;
status = rrc_PEREnc_CellUpdate ((CellUpdate*) &(ul_ccch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Cell Update - status : %d\n", status);
msg("\n[RRC_MSG] Cell Update - length : %d\n", protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
/**************************************************************/
/* Uplink DCCH messages - Encode */
/**************************************************************/
//-----------------------------------------------------------------------------
/* RRC Connection Setup Complete */
void rrc_ue_msg_connsucompl(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(RRCConnectionSetupComplete);
// Temp - Test/Messages
// ul_dcch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_dcch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
// //
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 0; // No check with RRC Connection Setup Complete
ul_dcch_msg->message.type = UL_DCCH_rrcConnectionSetupComplete;
status = rrc_PEREnc_RRCConnectionSetupComplete((RRCConnectionSetupComplete*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Connection Setup Compl - status : %d - length : %d\n", status, protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
//-----------------------------------------------------------------------------
/* RRC Connection Release MD */
void rrc_ue_msg_connrelUL(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(RRCConnectionRelease_UL);
// Temp - Test/Messages
// ul_dcch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_dcch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
// //
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 123;
ul_dcch_msg->message.type = UL_DCCH_rrcConnectionReleaseUL;
status = rrc_PEREnc_RRCConnectionRelease_UL((RRCConnectionRelease_UL*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Connection Release Uplink - status : %d - length : %d\n", status, protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
//-----------------------------------------------------------------------------
/* InitialDirectTransfer */
void rrc_ue_msg_initXfer(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(InitialDirectTransfer);
// Temp - Test/Messages
// ul_dcch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_dcch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
// //
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 123;
ul_dcch_msg->message.type = UL_DCCH_initialDirectTransfer;
status = rrc_PEREnc_InitialDirectTransfer((InitialDirectTransfer*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Initial Direct Transfer - status : %d - length : %d\n", status, protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
//-----------------------------------------------------------------------------
/* Uplink Direct Transfer */
void rrc_ue_msg_ulXfer(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(UplinkDirectTransfer);
// Temp - Test/Messages
// ul_dcch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_dcch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
// //
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 123;
ul_dcch_msg->message.type = UL_DCCH_uplinkDirectTransfer;
status = rrc_PEREnc_UplinkDirectTransfer((UplinkDirectTransfer*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Uplink Direct Transfer - status : %d - length : %d\n", status, protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
//-----------------------------------------------------------------------------
/* Radio Bearer Setup Complete */
void rrc_ue_msg_rbsetupcompl(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(RadioBearerSetupComplete);
// Temp - Test/Messages
// ul_dcch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_dcch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
// //
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 123;
ul_dcch_msg->message.type = UL_DCCH_radioBearerSetupComplete;
status = rrc_PEREnc_RadioBearerSetupComplete((RadioBearerSetupComplete*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Setup Complete - status : %d - length : %d\n", status, protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
//-----------------------------------------------------------------------------
/* Radio Bearer Setup Failure */
void rrc_ue_msg_rbsetupfail(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(RadioBearerSetupFailure);
// Temp - Test/Messages
// ul_dcch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_dcch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
// //
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 123;
ul_dcch_msg->message.type = UL_DCCH_radioBearerSetupFailure;
status = rrc_PEREnc_RadioBearerSetupFailure((RadioBearerSetupFailure*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Setup Failure - status : %d - length : %d\n", status, protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
//-----------------------------------------------------------------------------
/* Radio Bearer Release Complete */
void rrc_ue_msg_rbreleasecompl(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(RadioBearerReleaseComplete);
// Temp - Test/Messages
// ul_dcch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_dcch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
// //
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 123;
ul_dcch_msg->message.type = UL_DCCH_radioBearerReleaseComplete;
status = rrc_PEREnc_RadioBearerReleaseComplete((RadioBearerReleaseComplete*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Release Complete - status : %d - length : %d\n", status, protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
//-----------------------------------------------------------------------------
/* Radio Bearer Release Failure */
void rrc_ue_msg_rbreleasefail(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(RadioBearerReleaseFailure);
// Temp - Test/Messages
// ul_dcch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_dcch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
// //
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 123;
ul_dcch_msg->message.type = UL_DCCH_radioBearerReleaseFailure;
status = rrc_PEREnc_RadioBearerReleaseFailure((RadioBearerReleaseFailure*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Release Failure - status : %d - length : %d\n", status, protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
/* Measurement Report */
//-----------------------------------------------------------------------------
void rrc_ue_msg_measrep(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(MeasurementReport);
// Temp - Test/Messages
// ul_dcch_msg = malloc (protocol_ms->rrc.ue_msg_infos.msg_length);
// memset (ul_dcch_msg, 0, protocol_ms->rrc.ue_msg_infos.msg_length);
//
// protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 123;
ul_dcch_msg->message.type = UL_DCCH_measurementReport;
status = rrc_PEREnc_MeasurementReport((MeasurementReport*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Measurement Report - status : %d - length : %d\n", status, protocol_ms->rrc.ue_msg_infos.msg_length);
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
/**************************************************************/
/* Downlink CCCH messages - Decode */
/**************************************************************/
/* RRC Connection Setup */
//-----------------------------------------------------------------------------
int rrc_ue_msg_connsetup(DL_CCCH_Message * dl_ccch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
status = rrc_PERDec_RRCConnectionSetup((RRCConnectionSetup*) &(dl_ccch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] RRC Connection Setup Received - status : %d\n", status);
msg("\n[RRC_MSG] Transaction Identifier %d, Activation Time %d\n",
protocol_ms->rrc.rcved_trans.transaction_Id,
protocol_ms->rrc.nextActivationTime );
msg("[RRC_MSG] U-RNTI %d, New_State %d\n",
protocol_ms->rrc.u_rnti,
protocol_ms->rrc.next_state );
#endif
return status;
}
/* RRCConnectionReject */
//-----------------------------------------------------------------------------
int rrc_ue_msg_connreject(DL_CCCH_Message * dl_ccch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
status = rrc_PERDec_RRCConnectionReject((RRCConnectionReject*) &(dl_ccch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] RRC Connection Reject Received - status : %d\n", status);
msg("\n[RRC_MSG] Transaction Identifier %d, Wait Time %d\n",
protocol_ms->rrc.rcved_trans.transaction_Id,
protocol_ms->rrc.rejectWaitTime );
#endif
return status;
}
/* CellUpdateConfirm_CCCH */
//-----------------------------------------------------------------------------
int rrc_ue_msg_cellupdatecnfccch(DL_CCCH_Message * dl_ccch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (dl_ccch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_CellUpdateConfirm_CCCH((CellUpdateConfirm_CCCH*) &(dl_ccch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] CellUpdateConfirm_CCCH Received - status : %d\n", status);
msg("\n[RRC_MSG] Transaction Identifier %d, Activation Time %d\n",
protocol_ms->rrc.rcved_trans.transaction_Id,
protocol_ms->rrc.nextActivationTime );
msg("[RRC_MSG] U-RNTI %d, New_State %d\n",
protocol_ms->rrc.u_rnti,
protocol_ms->rrc.next_state );
msg("[RRC_MSG] SRB2-3-4 %d, RB5+ %d\n",
protocol_ms->rrc.rlc_Re_establishIndicatorRb2_3or4,
protocol_ms->rrc.rlc_Re_establishIndicatorRb5orAbove );
#endif
return status;
}
/* UE Capability Information */
//-----------------------------------------------------------------------------
void rrc_ue_msg_ueCapInfo(int *Message_Id){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
UL_DCCH_Message * ul_dcch_msg;
mem_block_t *p;
// prepare encoding
*Message_Id = ++ protocol_ms->rrc.ue_msg_infos.msg_Id;
protocol_ms->rrc.ue_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(UECapabilityInformation);
p = get_free_mem_block(protocol_ms->rrc.ue_msg_infos.msg_length);
ul_dcch_msg = (struct UL_DCCH_Message *)p->data;
//Reference to the memory block
protocol_ms->rrc.ue_msg_infos.mem_block_ptr = p;
protocol_ms->rrc.ue_msg_infos.msg_ptr = ul_dcch_msg;
// Encode
ul_dcch_msg->integrityCheckInfo = 123;
ul_dcch_msg->message.type = UL_DCCH_ueCapabilityInformation;
status = rrc_PEREnc_UECapabilityInformation ((UECapabilityInformation*) &(ul_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] UE Capability Information - status : %d - length : %d\n",
status, protocol_ms->rrc.ue_msg_infos.msg_length);
msg("[RRC_MSG] Kernel Release = %d, ", EURECOM_KERNEL_RELEASE_INDICATOR_DEFAULT);
msg("Access Stratum Release = ");
switch(ACCESS_STRATUM_RELEASE_INDICATOR_DEFAULT){
case ACCESS_STRATUM_RELEASE_INDICATOR_REL_4: msg("REL-4\n"); break;
case ACCESS_STRATUM_RELEASE_INDICATOR_REL_5: msg("REL-5\n"); break;
case ACCESS_STRATUM_RELEASE_INDICATOR_REL_6: msg("REL-6\n"); break;
default: msg("Unrecognized!\n");
}
rrc_print_buffer((char*)protocol_ms->rrc.ue_msg_infos.msg_ptr,protocol_ms->rrc.ue_msg_infos.msg_length);
#endif
}
/**************************************************************/
/* Downlink DCCH messages - Decode */
/**************************************************************/
/* RadioBearerSetup */
//-----------------------------------------------------------------------------
int rrc_ue_msg_rbsetup(DL_DCCH_Message * dl_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (dl_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_RadioBearerSetup((RadioBearerSetup*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Setup Received - status : %d\n", status);
msg("\n[RRC_MSG] Transaction Identifier %d, Activation Time %d,",
protocol_ms->rrc.rcved_trans.transaction_Id,
protocol_ms->rrc.nextActivationTime );
msg(" U-RNTI %d, New_State %d\n",
protocol_ms->rrc.u_rnti,
protocol_ms->rrc.next_state );
msg("[RRC_MSG] RB information: ");
msg("RB_Id: %d, Radio QoS: %d, IP DSCP: %d, SAP Id: %d. \n",
protocol_ms->rrc.requested_rbId, protocol_ms->rrc.requested_QoSclass,
protocol_ms->rrc.requested_dscp, protocol_ms->rrc.requested_sapid);
#endif
return status;
}
/* RadioBearerRelease */
//-----------------------------------------------------------------------------
int rrc_ue_msg_rbrelease(DL_DCCH_Message * dl_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (dl_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_RadioBearerRelease((RadioBearerRelease*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Radio Bearer Release Received - status : %d\n", status);
msg("\n[RRC_MSG] Transaction Identifier %d, Activation Time %d, U-RNTI %d, New_State %d\n",
protocol_ms->rrc.rcved_trans.transaction_Id,
protocol_ms->rrc.nextActivationTime,
protocol_ms->rrc.u_rnti,
protocol_ms->rrc.next_state);
msg("[RRC_MSG] RB information : RB_Id : %d\n", protocol_ms->rrc.requested_rbId);
#endif
return status;
}
/* DownlinkDirectTransfer */
//-----------------------------------------------------------------------------
int rrc_ue_msg_dlXfer(DL_DCCH_Message * dl_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (dl_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_DownlinkDirectTransfer((DownlinkDirectTransfer*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Downlink Direct Transfer Received - status : %d\n", status);
msg("\n[RRC_MSG] Transaction Identifier %d\n",
protocol_ms->rrc.rcved_trans.transaction_Id);
#endif
return status;
}
/* PagingType2 */
//-----------------------------------------------------------------------------
int rrc_ue_msg_pagingt2(DL_DCCH_Message * dl_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (dl_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_PagingType2((PagingType2*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Paging Type 2 Received - status : %d\n", status);
msg("\n[RRC_MSG] Transaction Identifier %d\n",
protocol_ms->rrc.rcved_trans.transaction_Id);
#endif
return status;
}
/* MeasurementControl */
//-----------------------------------------------------------------------------
int rrc_ue_msg_measctl(DL_DCCH_Message * dl_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (dl_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_MeasurementControl((MeasurementControl *) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] Measurement Control message Received - status : %d\n", status);
msg("\n[RRC_MSG] Transaction Identifier %d\n",
protocol_ms->rrc.rcved_trans.transaction_Id);
#endif
return (status);
}
// /* Uplink Physical Channel Control */
// //-----------------------------------------------------------------------------
// int rrc_ue_msg_ULPCHctl(DL_DCCH_Message * dl_dcch_msg){
// //-----------------------------------------------------------------------------
//
// int status = P_SUCCESS;
//
// if (dl_dcch_msg->integrityCheckInfo != 123)
// return P_INVINTEGRITY;
//
// status = rrc_PERDec_ULPCHControl((MeasurementControl *) &(dl_dcch_msg->message.content));
//
// #ifdef DEBUG_RRC_STATE
// msg("\n[RRC_MSG] Uplink Physical Channel Control message Received - status : %d\n", status);
// msg("\n[RRC_MSG] Transaction Identifier %d\n",
// protocol_ms->rrc.rcved_trans.transaction_Id);
// #endif
// return (status);
// }
/* UE Capability Information Confirm*/
//-----------------------------------------------------------------------------
int rrc_ue_msg_ueCapInfoCnf(DL_DCCH_Message * dl_dcch_msg){
//-----------------------------------------------------------------------------
int status = P_SUCCESS;
if (dl_dcch_msg->integrityCheckInfo != 123)
return P_INVINTEGRITY;
status = rrc_PERDec_UECapabilityInformationConfirm((UECapabilityInformationConfirm*) &(dl_dcch_msg->message.content));
#ifdef DEBUG_RRC_STATE
msg("\n[RRC_MSG] UE Capability Information Confirm Received - status : %d\n", status);
#endif
return status;
}