Pre-ci test passed git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4000 818b1a75-f10b-46b9-bf7c-635c3b92a50f
597 lines
26 KiB
C
Executable File
597 lines
26 KiB
C
Executable File
/***************************************************************************
|
|
rrc_rg_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 RG
|
|
***************************************************************************/
|
|
/********************
|
|
//OpenAir definitions
|
|
********************/
|
|
#include "LAYER2/MAC/extern.h"
|
|
#include "UTIL/MEM/mem_block.h"
|
|
|
|
/********************
|
|
// RRC definitions
|
|
********************/
|
|
#include "rrc_rg_vars.h"
|
|
#include "rrc_msg_class.h"
|
|
//-----------------------------------------------------------------------------
|
|
#include "rrc_proto_msg.h"
|
|
#include "rrc_proto_int.h"
|
|
#include "rrc_proto_fsm.h"
|
|
|
|
/**************************************************************/
|
|
/* Uplink CCCH messages - Decode */
|
|
/**************************************************************/
|
|
/* RRCConnectionRequest */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_connreq(int * pUE ,UL_CCCH_Message * ul_ccch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
int UE_Id;
|
|
|
|
if ((UE_Id = get_new_UE_Id(&(ul_ccch_msg->message.content.rrcConnectionRequest.imei))) == 999)
|
|
return FAILURE;
|
|
*pUE = UE_Id;
|
|
|
|
status = rrc_PERDec_RRCConnectionRequest(UE_Id,(RRCConnectionRequest*) &(ul_ccch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Connection Request Received - status : %d\n", status);
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
|
|
/* CellUpdate */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_cellUpdate(int* pUE ,UL_CCCH_Message * ul_ccch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
int UE_Id;
|
|
|
|
if (ul_ccch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_CellUpdate(pUE,(CellUpdate*) &(ul_ccch_msg->message.content));
|
|
if (status == SUCCESS)
|
|
UE_Id = *pUE ;
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Cell Update Received - status : %d\n", status);
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
|
|
/**************************************************************/
|
|
/* Uplink DCCH messages - Decode */
|
|
/**************************************************************/
|
|
/* RRCConnectionSetupComplete */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_connsucompl(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
status = rrc_PERDec_RRCConnectionSetupComplete(UE_Id,(RRCConnectionSetupComplete*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Connection Setup Complete Received - status : %d\n", status);
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
|
|
/* RRCConnectionRelease_UL */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_connrelUL(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (ul_dcch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_RRCConnectionRelease_UL(UE_Id,(RRCConnectionRelease_UL*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] RRC Connection Release UL Received - status : %d\n", status);
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
|
|
/* InitialDirectTransfer */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_initXfer(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (ul_dcch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_InitialDirectTransfer(UE_Id,(InitialDirectTransfer*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Initial Direct Transfer Received - status : %d\n", status);
|
|
//rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
/* UplinkDirectTransfer */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_ulXfer(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (ul_dcch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_UplinkDirectTransfer(UE_Id,(UplinkDirectTransfer*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Uplink Direct Transfer Received - status : %d\n", status);
|
|
//rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
|
|
/* RadioBearerSetupComplete */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_rbsetupcompl(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (ul_dcch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_RadioBearerSetupComplete(UE_Id,(RadioBearerSetupComplete*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Radio Bearer Setup Complete Received - status : %d\n", status);
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
/* RadioBearerSetupFailure */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_rbsetupfail(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (ul_dcch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_RadioBearerSetupFailure(UE_Id,(RadioBearerSetupFailure*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Radio Bearer Setup Failure Received - status : %d\n", status);
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
/* RadioBearerReleaseComplete */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_rbreleasecompl(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (ul_dcch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_RadioBearerReleaseComplete(UE_Id,(RadioBearerReleaseComplete*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Radio Bearer Release Complete Received - status : %d\n", status);
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
/* RadioBearerReleaseFailure */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_rbreleasefail(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (ul_dcch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_RadioBearerReleaseFailure(UE_Id,(RadioBearerReleaseFailure*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Radio Bearer Release Failure Received - status : %d\n", status);
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
|
|
/* Measurement Report */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_measrepr(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (ul_dcch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_MeasurementReport(UE_Id,(MeasurementReport*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Measurement Report Received - status : %d\n", status);
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
|
|
/* UE Capability Information */
|
|
//-----------------------------------------------------------------------------
|
|
int rrc_rg_msg_ueCapInfo(int UE_Id ,UL_DCCH_Message * ul_dcch_msg){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
|
|
if (ul_dcch_msg->integrityCheckInfo != 123)
|
|
return P_INVINTEGRITY;
|
|
|
|
status = rrc_PERDec_UECapabilityInformation(UE_Id,(UECapabilityInformation*) &(ul_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] UE Capability Information Received - status : %d\n", status);
|
|
msg("[RRC_MSG] UE_Id = %d, Kernel Release = %d, ", UE_Id, protocol_bs->rrc.Mobile_List[UE_Id].ind_eurecomKernelRelease);
|
|
msg("Access Stratum Release = ");
|
|
switch(protocol_bs->rrc.Mobile_List[UE_Id].ind_accessStratumRelease){
|
|
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("Unrecoginized!\n");
|
|
}
|
|
rrc_mt_list_print(UE_Id);
|
|
#endif
|
|
return status;
|
|
}
|
|
|
|
|
|
/**************************************************************/
|
|
/* Downlink CCCH messages - Encode */
|
|
/**************************************************************/
|
|
/* RRCConnectionSetup */
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_msg_connsetup(int UE_Id, int *Message_Id){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
DL_CCCH_Message * dl_ccch_msg;
|
|
mem_block_t *p;
|
|
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_CCCH_rrcConnectionSetup;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
|
|
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
|
|
//
|
|
// prepare encoding
|
|
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
|
|
*Message_Id = UE_Id;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
|
|
MSG_HEAD_LGTH + sizeof(RRCConnectionSetup);
|
|
// Temp - Test/Messages
|
|
// dl_ccch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
// memset (dl_ccch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
dl_ccch_msg = (struct DL_CCCH_Message *)p->data;
|
|
//
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_ccch_msg;
|
|
|
|
// Encode
|
|
dl_ccch_msg->integrityCheckInfo = 0; // No check with RRC Connection Setup
|
|
dl_ccch_msg->message.type = DL_CCCH_rrcConnectionSetup;
|
|
status = rrc_PEREnc_RRCConnectionSetup(UE_Id,(RRCConnectionSetup*) &(dl_ccch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] RRC Connection Setup - status : %d - length : %d\n",
|
|
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
#endif
|
|
}
|
|
|
|
/* RRCConnectionReject */
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_msg_connreject(int UE_Id, int *Message_Id){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
DL_CCCH_Message * dl_ccch_msg;
|
|
mem_block_t *p;
|
|
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_CCCH_rrcConnectionReject;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
|
|
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
|
|
//
|
|
// prepare encoding
|
|
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
|
|
*Message_Id = UE_Id;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(RRCConnectionReject);
|
|
// Temp - Test/Messages
|
|
// dl_ccch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
// memset (dl_ccch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
dl_ccch_msg = (struct DL_CCCH_Message *)p->data;
|
|
//
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_ccch_msg;
|
|
// Encode
|
|
dl_ccch_msg->integrityCheckInfo = 0; // No check with RRC Connection Reject
|
|
dl_ccch_msg->message.type = DL_CCCH_rrcConnectionReject;
|
|
status = rrc_PEREnc_RRCConnectionReject(UE_Id,(RRCConnectionReject*) &(dl_ccch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] RRC Connection Reject - status : %d - length : %d\n",
|
|
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
#endif
|
|
}
|
|
|
|
/* CellUpdateConfirm_CCCH */
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_msg_cellupdatecnfccch(int UE_Id, int *Message_Id){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
DL_CCCH_Message * dl_ccch_msg;
|
|
mem_block_t *p;
|
|
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_CCCH_cellUpdateConfirm;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
|
|
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
|
|
//
|
|
// prepare encoding
|
|
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
|
|
*Message_Id = UE_Id;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(CellUpdateConfirm_CCCH);
|
|
// Temp - Test/Messages
|
|
// dl_ccch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
// memset (dl_ccch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
dl_ccch_msg = (struct DL_CCCH_Message *)p->data;
|
|
//
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_ccch_msg;
|
|
|
|
// Encode
|
|
dl_ccch_msg->integrityCheckInfo = 123;
|
|
dl_ccch_msg->message.type = DL_CCCH_cellUpdateConfirm;
|
|
status = rrc_PEREnc_CellUpdateConfirm_CCCH(UE_Id,(CellUpdateConfirm_CCCH*) &(dl_ccch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Cell Update Confirm (CCCH) - status : %d - length : %d\n",
|
|
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
#endif
|
|
}
|
|
|
|
|
|
/**************************************************************/
|
|
/* Downlink DCCH messages - Encode */
|
|
/**************************************************************/
|
|
/* RadioBearerSetup */
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_msg_rbsetup(int UE_Id, int *Message_Id){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
DL_DCCH_Message * dl_dcch_msg;
|
|
mem_block_t *p;
|
|
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_radioBearerSetup;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
|
|
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
|
|
//
|
|
// prepare encoding
|
|
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
|
|
*Message_Id = UE_Id;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
|
|
MSG_HEAD_LGTH + sizeof(RadioBearerSetup);
|
|
// Temp - Test/Messages
|
|
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
|
|
//
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
|
|
|
|
// Encode
|
|
dl_dcch_msg->integrityCheckInfo = 123;
|
|
dl_dcch_msg->message.type = DL_DCCH_radioBearerSetup;
|
|
status = rrc_PEREnc_RadioBearerSetup(UE_Id,(RadioBearerSetup*) &(dl_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Radio Bearer Setup - status : %d - length : %d\n",
|
|
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
#endif
|
|
}
|
|
|
|
/* RadioBearerRelease */
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_msg_rbrelease(int UE_Id, int *Message_Id){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
DL_DCCH_Message * dl_dcch_msg;
|
|
mem_block_t *p;
|
|
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_radioBearerRelease;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
|
|
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
|
|
//
|
|
// prepare encoding
|
|
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
|
|
*Message_Id = UE_Id;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
|
|
MSG_HEAD_LGTH + sizeof(RadioBearerRelease);
|
|
// Temp - Test/Messages
|
|
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
|
|
//
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
|
|
|
|
// Encode
|
|
dl_dcch_msg->integrityCheckInfo = 123;
|
|
dl_dcch_msg->message.type = DL_DCCH_radioBearerRelease;
|
|
status = rrc_PEREnc_RadioBearerRelease(UE_Id,(RadioBearerRelease*) &(dl_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Radio Bearer Release - status : %d - length : %d\n",
|
|
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
#endif
|
|
}
|
|
|
|
/* DownlinkDirectTransfer */
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_msg_dlXfer(int UE_Id, int *Message_Id){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
DL_DCCH_Message * dl_dcch_msg;
|
|
mem_block_t *p;
|
|
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_downlinkDirectTransfer;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
|
|
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
|
|
//
|
|
// prepare encoding
|
|
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
|
|
*Message_Id = UE_Id;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
|
|
MSG_HEAD_LGTH + sizeof(DownlinkDirectTransfer);
|
|
// Temp - Test/Messages
|
|
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
|
|
//
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
|
|
|
|
// Encode
|
|
dl_dcch_msg->integrityCheckInfo = 123;
|
|
dl_dcch_msg->message.type = DL_DCCH_downlinkDirectTransfer;
|
|
status = rrc_PEREnc_DownlinkDirectTransfer(UE_Id,(DownlinkDirectTransfer*) &(dl_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Downlink Direct Transfer - status : %d - length : %d\n",
|
|
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
#endif
|
|
}
|
|
|
|
/* PagingType2 */
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_msg_pagingt2(int UE_Id, int *Message_Id){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
DL_DCCH_Message * dl_dcch_msg;
|
|
mem_block_t *p;
|
|
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_pagingType2;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
|
|
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
|
|
//
|
|
// prepare encoding
|
|
// *Message_Id = ++ protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_Id;
|
|
*Message_Id = UE_Id;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length =
|
|
MSG_HEAD_LGTH + sizeof(PagingType2);
|
|
// Temp - Test/Messages
|
|
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
|
|
//
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
|
|
|
|
// Encode
|
|
dl_dcch_msg->integrityCheckInfo = 123;
|
|
dl_dcch_msg->message.type = DL_DCCH_pagingType2;
|
|
status = rrc_PEREnc_PagingType2(UE_Id,(PagingType2*) &(dl_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Paging Type 2 - status : %d - length : %d\n",
|
|
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
#endif
|
|
}
|
|
|
|
/* Measurement Control */
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_msg_measctl(int UE_Id, int *Message_Id){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
DL_DCCH_Message * dl_dcch_msg;
|
|
mem_block_t *p;
|
|
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_measurementControl;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
|
|
(protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
|
|
//
|
|
// prepare encoding
|
|
*Message_Id = UE_Id;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(MeasurementControl);
|
|
// Temp - Test/Messages
|
|
// dl_dcch_msg = malloc (protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
// memset (dl_dcch_msg, 0, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
|
|
//
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
|
|
|
|
// Encode
|
|
dl_dcch_msg->integrityCheckInfo = 123;
|
|
dl_dcch_msg->message.type = DL_DCCH_measurementControl;
|
|
status = rrc_PEREnc_MeasurementControl(UE_Id,(MeasurementControl*) &(dl_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Measurement Control - status : %d - length : %d\n",
|
|
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
#endif
|
|
}
|
|
|
|
|
|
/* UE Capability Information Confirm */
|
|
//-----------------------------------------------------------------------------
|
|
void rrc_rg_msg_ueCapInfoCnf(int UE_Id, int *Message_Id){
|
|
//-----------------------------------------------------------------------------
|
|
int status = P_SUCCESS;
|
|
DL_DCCH_Message * dl_dcch_msg;
|
|
mem_block_t *p;
|
|
|
|
protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].msg_type = DL_DCCH_measurementControl;
|
|
// TODO
|
|
//protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id =
|
|
// (protocol_bs->rrc.Mobile_List[UE_Id].xmit_trans[0].transaction_Id +1) %4;
|
|
|
|
// prepare encoding
|
|
*Message_Id = UE_Id;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length = MSG_HEAD_LGTH + sizeof(UECapabilityInformationConfirm);
|
|
//Allocation
|
|
p = get_free_mem_block(protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
dl_dcch_msg = (struct DL_DCCH_Message *)p->data;
|
|
//
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.mem_block_ptr = p;
|
|
protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr = dl_dcch_msg;
|
|
|
|
// Encode
|
|
dl_dcch_msg->integrityCheckInfo = 123;
|
|
dl_dcch_msg->message.type = DL_DCCH_ueCapabilityInformationConfirm;
|
|
status = rrc_PEREnc_UECapabilityInformationConfirm(UE_Id, (UECapabilityInformationConfirm*) &(dl_dcch_msg->message.content));
|
|
|
|
#ifdef DEBUG_RRC_STATE
|
|
msg("\n[RRC_MSG] Measurement Control - status : %d - length : %d\n",
|
|
status, protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
rrc_print_buffer((char*)protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_ptr,protocol_bs->rrc.Mobile_List[UE_Id].rg_msg_infos.msg_length);
|
|
#endif
|
|
}
|
|
|